diff --git a/teradata/api.py b/teradata/api.py index 37ba01f..62d4be1 100644 --- a/teradata/api.py +++ b/teradata/api.py @@ -168,6 +168,21 @@ def __init__(self, code, msg): DateFromTicks = datetime.date.fromtimestamp +class Interval(str): + """String representation of the Interval dataType.""" + pass + + +class JSON(str): + """String representation of the JSON dataType.""" + pass + + +class Period(str): + """String representation of the Period dataType.""" + pass + + def TimeFromTicks(x): return datetime.datetime.fromtimestamp(x).time() diff --git a/teradata/datatypes.py b/teradata/datatypes.py index 702178a..098f10d 100644 --- a/teradata/datatypes.py +++ b/teradata/datatypes.py @@ -47,15 +47,15 @@ periodRegEx1 = re.compile("\('(.*)',\s*'(.*)'\)") periodRegEx2 = re.compile("ResultStruct:PERIOD\(.*\)\[(.*),\s*(.*)\]") -NUMBER_TYPES = ("BYTEINT", "BIGINT", "DECIMAL", "DOUBLE", "DOUBLE PRECISION", +NUMBER_TYPES = {"BYTEINT", "BIGINT", "DECIMAL", "DOUBLE", "DOUBLE PRECISION", "INTEGER", "NUMBER", "SMALLINT", "FLOAT", "INT", "NUMERIC", - "REAL") + "REAL"} -INT_TYPES = ("BYTEINT", "BIGINT", "INTEGER", "SMALLINT", "INT") +INT_TYPES = {"BYTEINT", "BIGINT", "INTEGER", "SMALLINT", "INT"} -FLOAT_TYPES = ("FLOAT", "DOUBLE", "DOUBLE PRECISION", "REAL") +FLOAT_TYPES = {"FLOAT", "DOUBLE", "DOUBLE PRECISION", "REAL"} -BINARY_TYPES = ("BLOB", "BYTE", "VARBYTE") +BINARY_TYPES = {"BLOB", "BYTE", "VARBYTE"} def _getMs(m, num): @@ -230,7 +230,9 @@ def convertValue(self, dbType, dataType, typeCode, value): logger.trace( "Converting \"%s\" to (%s, %s).", value, dataType, typeCode) if value is not None: - if typeCode == NUMBER: + if typeCode == STRING: + return value + elif typeCode == NUMBER: try: return NUMBER(value) except: @@ -270,12 +272,12 @@ def convertValue(self, dbType, dataType, typeCode, value): elif typeCode == BINARY: if util.isString(value): return bytearray.fromhex(value) - elif dataType.startswith("INTERVAL"): + elif typeCode == Interval: return convertInterval(dataType, value) - elif dataType.startswith("JSON") and util.isString(value): + elif typeCode == JSON and util.isString(value): return json.loads(value, parse_int=decimal.Decimal, parse_float=decimal.Decimal) - elif dataType.startswith("PERIOD"): + elif typeCode == Period: return convertPeriod(dataType, value) return value @@ -294,6 +296,12 @@ def convertType(self, dbType, dataType): typeCode = Timestamp elif dataType.startswith("TIME"): typeCode = Time + elif dataType.startswith("INTERVAL"): + typeCode = Interval + elif dataType.startswith("JSON"): + typeCode = JSON + elif dataType.startswith("PERIOD"): + typeCode = Period return typeCode