fix: oper on time type

This commit is contained in:
factosea 2024-12-13 15:10:25 +08:00
parent b5fb388fec
commit bc4bd8d059
3 changed files with 81 additions and 8 deletions

View File

@ -1688,8 +1688,8 @@ static int32_t sclGetMathOperatorResType(SOperatorNode *pOp) {
if ((TSDB_DATA_TYPE_TIMESTAMP == ldt.type && TSDB_DATA_TYPE_TIMESTAMP == rdt.type) ||
TSDB_DATA_TYPE_VARBINARY == ldt.type || TSDB_DATA_TYPE_VARBINARY == rdt.type ||
(TSDB_DATA_TYPE_TIMESTAMP == ldt.type && (IS_VAR_DATA_TYPE(rdt.type) || IS_FLOAT_TYPE(rdt.type))) ||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && (IS_VAR_DATA_TYPE(ldt.type) || IS_FLOAT_TYPE(ldt.type)))) {
(TSDB_DATA_TYPE_TIMESTAMP == ldt.type && (IS_VAR_DATA_TYPE(rdt.type))) ||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && (IS_VAR_DATA_TYPE(ldt.type)))) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}

View File

@ -1398,9 +1398,11 @@ int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BIGINT) ||
if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pRight))) ||
(GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pLeft))) ||
(GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BOOL) ||
(GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BIGINT)) { // timestamp minus duration
GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BOOL)) { // timestamp minus duration
int64_t *output = (int64_t *)pOutputCol->pData;
_getBigintValue_fn_t getVectorBigintValueFnLeft;
_getBigintValue_fn_t getVectorBigintValueFnRight;

View File

@ -218,16 +218,87 @@ class TDTestCase:
tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
tdSql.checkRows(2)
def operOnTime(self):
tdSql.execute(f"create database if not exists {self.dbname}")
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
tdSql.execute(f"CREATE TABLE {self.dbname}.t1( ts TIMESTAMP, c0 INT, c1 INT UNSIGNED, \
c2 BIGINT, c3 BIGINT UNSIGNED, c4 SMALLINT, c5 SMALLINT UNSIGNED, c6 TINYINT, c7 TINYINT UNSIGNED);")
tdSql.execute(f"INSERT INTO {self.dbname}.t1 VALUES (1641024000001, 1, 1, 1, 1, 1, 1, 1, 1);")
columns = ["c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7"]
for col in columns:
tdLog.debug(f"oper on time test, {col} start ...")
tdSql.query(f"SELECT ts, ts+1, ts+{col}, ts+(-{col}) FROM {self.dbname}.t1")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000002)
tdSql.checkData(0, 3, 1641024000000)
tdSql.query(f"SELECT ts, ts+1, ts+{col}, ts+(-{col}) FROM {self.dbname}.t1 where (ts-(-{col})) > 0")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000002)
tdSql.checkData(0, 3, 1641024000000)
tdSql.query(f"SELECT ts, ts-1, ts-{col}, ts-(-{col}) FROM {self.dbname}.t1")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000000)
tdSql.checkData(0, 2, 1641024000000)
tdSql.checkData(0, 3, 1641024000002)
tdSql.query(f"SELECT ts, ts+true, ts-true, ts-false, ts+false FROM {self.dbname}.t1")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000000)
tdSql.checkData(0, 3, 1641024000001)
tdSql.checkData(0, 4, 1641024000001)
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t2;")
tdSql.execute(f"CREATE TABLE {self.dbname}.t2( ts TIMESTAMP, c1 float, c2 double);")
tdSql.execute(f"INSERT INTO {self.dbname}.t2(ts, c1, c2) VALUES (1641024000001, 1.0, 1.0);")
columns = ["c1", "c2"]
for col in columns:
tdSql.query(f"SELECT ts, ts+{col}, ts+(-{col}), ts-{col}, ts-(-{col}) FROM {self.dbname}.t2")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000000)
tdSql.checkData(0, 3, 1641024000000)
tdSql.checkData(0, 4, 1641024000002)
tdSql.query(f"SELECT ts, ts+{col}, ts+(-{col}), ts-{col}, ts-(-{col}) FROM {self.dbname}.t2 where (ts-(-{col})) > 0")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000000)
tdSql.checkData(0, 3, 1641024000000)
tdSql.checkData(0, 4, 1641024000002)
tdSql.query(f"SELECT ts, cast(ts+{col} as bigint), cast(ts+(-{col}) as bigint), cast(ts-{col} as bigint),\
cast(ts-(-{col}) as bigint) FROM {self.dbname}.t2")
tdSql.checkRows(1)
tdSql.checkData(0, 0, 1641024000001)
tdSql.checkData(0, 1, 1641024000002)
tdSql.checkData(0, 2, 1641024000000)
tdSql.checkData(0, 3, 1641024000000)
tdSql.checkData(0, 4, 1641024000002)
def run(self):
dbname = "db"
tdSql.prepare()
tdSql.execute(f"create database if not exists {self.dbname}")
self.ts5757()
# self.ts5760()
self.ts5758()
self.ts5759()
#self.ts5757()
#self.ts5760()
#self.ts5758()
#self.ts5759()
self.operOnTime()