diff --git a/source/libs/scalar/inc/filterInt.h b/source/libs/scalar/inc/filterInt.h
index 9adc9ee99c..34f100a2bd 100644
--- a/source/libs/scalar/inc/filterInt.h
+++ b/source/libs/scalar/inc/filterInt.h
@@ -236,6 +236,7 @@ typedef struct SFltBuildGroupCtx {
SFilterInfo *info;
SArray *group;
int32_t code;
+ bool ignore;
} SFltBuildGroupCtx;
typedef struct {
@@ -266,6 +267,7 @@ struct SFilterInfo {
int8_t *blkUnitRes;
void *pTable;
SArray *blkList;
+ bool isStrict;
SFilterPCtx pctx;
};
diff --git a/source/libs/scalar/inc/sclInt.h b/source/libs/scalar/inc/sclInt.h
index 34fd5dc8b0..b04e26ac5d 100644
--- a/source/libs/scalar/inc/sclInt.h
+++ b/source/libs/scalar/inc/sclInt.h
@@ -21,6 +21,8 @@ extern "C" {
#include "query.h"
#include "tcommon.h"
#include "thash.h"
+#include "querynodes.h"
+#include "function.h"
typedef struct SOperatorValueType {
int32_t opResType;
@@ -147,6 +149,8 @@ int32_t vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarPara
int32_t _ord, int32_t optr);
int32_t vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr);
+bool checkOperatorRestypeIsTimestamp(EOperatorType opType, int32_t ldt, int32_t rdt);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c
index f0325dd174..a149384163 100644
--- a/source/libs/scalar/src/filter.c
+++ b/source/libs/scalar/src/filter.c
@@ -13,6 +13,7 @@
* along with this program. If not, see .
*/
#include
+#include "nodes.h"
#include "os.h"
#include "tglobal.h"
#include "thash.h"
@@ -1284,7 +1285,8 @@ static void filterFreeGroup(void *pItem) {
taosMemoryFreeClear(p->unitFlags);
}
-int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
+int32_t fltAddGroupUnitFromNode(void *pContext, SFilterInfo *info, SNode *tree, SArray *group) {
+ SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
SOperatorNode *node = (SOperatorNode *)tree;
int32_t ret = TSDB_CODE_SUCCESS;
SFilterFieldId left = {0}, right = {0};
@@ -1305,6 +1307,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
out.columnData->info.type = type;
out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; // reserved space for simple_copy
+ int32_t overflowCount = 0;
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
SValueNode *valueNode = (SValueNode *)cell->pNode;
if (valueNode->node.resType.type != type) {
@@ -1317,6 +1320,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
if (overflow) {
cell = cell->pNext;
+ ++overflowCount;
continue;
}
@@ -1357,6 +1361,9 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
cell = cell->pNext;
}
+ if(overflowCount == listNode->pNodeList->length) {
+ ctx->ignore = true;
+ }
colDataDestroy(out.columnData);
taosMemoryFree(out.columnData);
FLT_ERR_RET(code);
@@ -1692,10 +1699,17 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
FLT_ERR_RET(terrno);
}
- SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup};
+ SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup, .ignore = false};
nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)&tctx);
FLT_ERR_JRET(tctx.code);
-
+ if(tctx.ignore) {
+ ctx->ignore = true;
+ taosArrayDestroyEx(newGroup, filterFreeGroup);
+ newGroup = NULL;
+ taosArrayDestroyEx(resGroup, filterFreeGroup);
+ resGroup = NULL;
+ break;
+ }
FLT_ERR_JRET(filterDetachCnfGroups(resGroup, preGroup, newGroup));
taosArrayDestroyEx(newGroup, filterFreeGroup);
@@ -1707,9 +1721,10 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
cell = cell->pNext;
}
-
- if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
- FLT_ERR_JRET(terrno);
+ if (!ctx->ignore) {
+ if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
+ FLT_ERR_JRET(terrno);
+ }
}
taosArrayDestroy(preGroup);
@@ -1721,6 +1736,9 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
SListCell *cell = node->pParameterList->pHead;
for (int32_t i = 0; i < node->pParameterList->length; ++i) {
nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)pContext);
+ if(ctx->ignore) {
+ ctx->ignore = false;
+ }
FLT_ERR_JRET(ctx->code);
cell = cell->pNext;
@@ -1735,7 +1753,7 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
}
if (QUERY_NODE_OPERATOR == nType) {
- FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx->info, pNode, ctx->group));
+ FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx, ctx->info, pNode, ctx->group));
return DEAL_RES_IGNORE_CHILD;
}
@@ -3831,13 +3849,21 @@ int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
goto _return;
}
- SFltBuildGroupCtx tctx = {.info = info, .group = group};
+ SFltBuildGroupCtx tctx = {.info = info, .group = group, .ignore = false};
nodesWalkExpr(tree, fltTreeToGroup, (void *)&tctx);
if (TSDB_CODE_SUCCESS != tctx.code) {
taosArrayDestroyEx(group, filterFreeGroup);
code = tctx.code;
goto _return;
}
+ if (tctx.ignore) {
+ FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
+ }
+ if (FILTER_EMPTY_RES(info)) {
+ info->func = filterExecuteImplEmpty;
+ taosArrayDestroyEx(group, filterFreeGroup);
+ return TSDB_CODE_SUCCESS;
+ }
code = filterConvertGroupFromArray(info, group);
if (TSDB_CODE_SUCCESS != code) {
taosArrayDestroyEx(group, filterFreeGroup);
@@ -3871,7 +3897,7 @@ int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
_return:
if (code) {
- qInfo("init from node failed, code:%d", code);
+ qInfo("init from node failed, code:%d, %s", code, tstrerror(code));
}
return code;
}
@@ -4561,8 +4587,7 @@ int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
FLT_ERR_JRET(fltSclGetTimeStampDatum(endPt, &end));
win->skey = start.i;
win->ekey = end.i;
- if(optNode->opType == OP_TYPE_IN) *isStrict = false;
- else *isStrict = true;
+ *isStrict = info->isStrict;
goto _return;
} else if (taosArrayGetSize(points) == 0) {
*win = TSWINDOW_DESC_INITIALIZER;
@@ -5026,7 +5051,8 @@ int32_t fltSclBuildRangePoints(SFltSclOperator *oper, SArray *points) {
}
// TODO: process DNF composed of CNF
-int32_t fltSclProcessCNF(SArray *sclOpListCNF, SArray *colRangeList) {
+static int32_t fltSclProcessCNF(SFilterInfo *pInfo, SArray *sclOpListCNF, SArray *colRangeList) {
+ pInfo->isStrict = true;
size_t sz = taosArrayGetSize(sclOpListCNF);
for (int32_t i = 0; i < sz; ++i) {
SFltSclOperator *sclOper = taosArrayGet(sclOpListCNF, i);
@@ -5049,10 +5075,16 @@ int32_t fltSclProcessCNF(SArray *sclOpListCNF, SArray *colRangeList) {
taosArrayDestroy(colRange->points);
taosArrayDestroy(points);
colRange->points = merged;
+ if(merged->size == 0) {
+ return TSDB_CODE_SUCCESS;
+ }
} else {
taosArrayDestroy(colRange->points);
colRange->points = points;
}
+ if (sclOper->type == OP_TYPE_IN) {
+ pInfo->isStrict = false;
+ }
}
return TSDB_CODE_SUCCESS;
}
@@ -5154,7 +5186,7 @@ int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat)
if (NULL == colRangeList) {
FLT_ERR_JRET(terrno);
}
- FLT_ERR_JRET(fltSclProcessCNF(sclOpList, colRangeList));
+ FLT_ERR_JRET(fltSclProcessCNF(pInfo, sclOpList, colRangeList));
pInfo->sclCtx.fltSclRange = colRangeList;
for (int32_t i = 0; i < taosArrayGetSize(sclOpList); ++i) {
diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c
index 9a369cd4c4..6bd08f9ed2 100644
--- a/source/libs/scalar/src/scalar.c
+++ b/source/libs/scalar/src/scalar.c
@@ -1695,15 +1695,12 @@ 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;
}
- if ((TSDB_DATA_TYPE_TIMESTAMP == ldt.type && IS_INTEGER_TYPE(rdt.type)) ||
- (TSDB_DATA_TYPE_TIMESTAMP == rdt.type && IS_INTEGER_TYPE(ldt.type)) ||
- (TSDB_DATA_TYPE_TIMESTAMP == ldt.type && TSDB_DATA_TYPE_BOOL == rdt.type) ||
- (TSDB_DATA_TYPE_TIMESTAMP == rdt.type && TSDB_DATA_TYPE_BOOL == ldt.type)) {
+ if (checkOperatorRestypeIsTimestamp(pOp->opType, ldt.type, rdt.type)) {
pOp->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP;
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes;
} else {
diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c
index fd1bd927b0..81ce23cb10 100644
--- a/source/libs/scalar/src/sclvector.c
+++ b/source/libs/scalar/src/sclvector.c
@@ -24,6 +24,7 @@
#include "tcompare.h"
#include "tdatablock.h"
#include "tdataformat.h"
+#include "tdef.h"
#include "ttime.h"
#include "ttypes.h"
#include "geosWrapper.h"
@@ -1262,12 +1263,7 @@ int32_t vectorMathAdd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
SColumnInfoData *pRightCol = NULL;
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
-
- 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_BOOL)) { // timestamp plus duration
+ if(checkOperatorRestypeIsTimestamp(OP_TYPE_ADD, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight))) { // timestamp plus duration
int64_t *output = (int64_t *)pOutputCol->pData;
_getBigintValue_fn_t getVectorBigintValueFnLeft;
_getBigintValue_fn_t getVectorBigintValueFnRight;
@@ -1399,9 +1395,7 @@ 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) ||
- (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
- GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BIGINT)) { // timestamp minus duration
+ if (checkOperatorRestypeIsTimestamp(OP_TYPE_SUB, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight))) { // timestamp minus duration
int64_t *output = (int64_t *)pOutputCol->pData;
_getBigintValue_fn_t getVectorBigintValueFnLeft;
_getBigintValue_fn_t getVectorBigintValueFnRight;
@@ -2306,3 +2300,16 @@ _bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
return NULL;
}
}
+
+bool checkOperatorRestypeIsTimestamp(EOperatorType opType, int32_t lType, int32_t rType) {
+ if (opType != OP_TYPE_ADD && opType != OP_TYPE_SUB && opType != OP_TYPE_MINUS) {
+ return false;
+ }
+ if ((TSDB_DATA_TYPE_TIMESTAMP == lType && IS_INTEGER_TYPE(rType) && rType != TSDB_DATA_TYPE_UBIGINT) ||
+ (TSDB_DATA_TYPE_TIMESTAMP == rType && IS_INTEGER_TYPE(lType) && lType != TSDB_DATA_TYPE_UBIGINT) ||
+ (TSDB_DATA_TYPE_TIMESTAMP == lType && TSDB_DATA_TYPE_BOOL == rType) ||
+ (TSDB_DATA_TYPE_TIMESTAMP == rType && TSDB_DATA_TYPE_BOOL == lType)) {
+ return true;
+ }
+ return false;
+}
diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task
index 4aedc0991e..74274ab1ba 100644
--- a/tests/parallel_test/cases.task
+++ b/tests/parallel_test/cases.task
@@ -1089,6 +1089,10 @@
,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insertMix.py -N 3
,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/stt.py -N 3
,,n,system-test,python3 ./test.py -f eco-system/meta/database/keep_time_offset.py
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 2
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 3
+,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 4
,,y,system-test,./pytest.sh python3 ./test.py -f eco-system/manager/schema_change.py -N 3 -M 3
#tsim test
diff --git a/tests/system-test/2-query/Now.py b/tests/system-test/2-query/Now.py
index 21ff1f4e06..9e7d240c0a 100644
--- a/tests/system-test/2-query/Now.py
+++ b/tests/system-test/2-query/Now.py
@@ -41,8 +41,9 @@ class TDTestCase:
]
self.time_unit = ['b','u','a','s','m','h','d','w']
self.symbol = ['+','-','*','/']
- self.error_values = [1.5,'abc','"abc"','!@','today()']
+ self.error_values = ['abc','"abc"','!@','today()']
self.db_percision = ['ms','us','ns']
+ self.test_values = [1.5, 10]
def tbtype_check(self,tb_type):
if tb_type == 'normal table' or tb_type == 'child table':
tdSql.checkRows(len(self.values_list))
@@ -71,6 +72,9 @@ class TDTestCase:
self.tbtype_check(tb_type)
for i in range(len(self.values_list)):
tdSql.checkData(i,0,None)
+ for param in self.test_values:
+ tdSql.query(f'select now() {symbol}{param} from {tbname}')
+ tdSql.query(f'select 1 {symbol}{param} from {tbname}')
def now_check_ntb(self):
for time_unit in self.db_percision:
diff --git a/tests/system-test/2-query/Today.py b/tests/system-test/2-query/Today.py
index 77e6bd8cb6..745ed31c2c 100644
--- a/tests/system-test/2-query/Today.py
+++ b/tests/system-test/2-query/Today.py
@@ -18,7 +18,7 @@ class TDTestCase:
self.today_ts = datetime.datetime.strptime(datetime.datetime.now().strftime("%Y-%m-%d"), "%Y-%m-%d").timestamp()
self.today_ts_ns = 0
self.time_unit = ['b','u','a','s','m','h','d','w']
- self.error_param = ['1.5','abc','!@#','"abc"','today()']
+ self.error_param = ['abc','!@#','"abc"','today()']
self.arithmetic_operators = ['+','-','*','/']
self.relational_operator = ['<','<=','=','>=','>']
# prepare data
diff --git a/tests/system-test/2-query/operator.py b/tests/system-test/2-query/operator.py
new file mode 100644
index 0000000000..2e2f0af802
--- /dev/null
+++ b/tests/system-test/2-query/operator.py
@@ -0,0 +1,347 @@
+from wsgiref.headers import tspecials
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import tdCom
+import numpy as np
+
+
+class TDTestCase:
+ def init(self, conn, logSql, replicaVar=1):
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+
+ self.dbname = "db"
+ self.rowNum = 10
+ self.ts = 1537146000000
+
+ # test in/not in contidion with invalid value
+ def ts5757(self):
+
+ tdSql.execute(f"create database if not exists {self.dbname}")
+
+ tdSql.execute(f"DROP STABLE IF EXISTS {self.dbname}.super_t1;")
+ tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
+ tdSql.execute(f"CREATE STABLE IF NOT EXISTS {self.dbname}.super_t1(time TIMESTAMP, c0 BIGINT UNSIGNED) TAGS (location BINARY(64))")
+ tdSql.execute(f"CREATE TABLE {self.dbname}.t1 USING {self.dbname}.super_t1 TAGS ('ek')")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024000000, 1);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024005000, 2);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024010000, NULL);")
+
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 IN (-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 IN (-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 IN (-1, 1);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 IN (2, -1, 1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 NOT IN (-1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (3);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 NOT IN (-1, 1);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (2, -1, 1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE (c0 IS NULL AND c0 IN (-1)) or c0 in(1)")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 IN (-1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 IN (-1);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 IN (-1, 1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 IN (2, -1, 1);")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (-1);")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (3);")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1, 1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (2, -1, 1);")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 is NULL) AND (c0 in (-1)) )")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 in (-1)) AND (c0 is NULL) )")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 in (-1)) AND (c0 is NULL) ) OR c0 in(1)")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL;")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) or c0 in(1);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (1) or c0 in(-1);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) or c0 in(-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) and c0 in(1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (1) and c0 in(-1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) and c0 in(-1);")
+ tdSql.checkRows(0)
+
+ def ts5760(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( time TIMESTAMP, c0 INT);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024000000, 1);")
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time - c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (-(- c0)) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) < 0;")
+ tdSql.checkRows(0)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) = 0;")
+ tdSql.checkRows(0)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (- c0) > 0;")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (- c0) < 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (- c0)) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (- c0)) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time - (- (- c0)) ) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (-(- c0))) > 0;")
+ tdSql.checkRows(1)
+
+ def ts5758(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( time TIMESTAMP, c1 BIGINT);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000000, 0);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000001, 1);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000002, 2);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000003, 3);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000004, 4);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000005, 5);")
+
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) AND time BETWEEN (1741024000000) AND (1741024000000);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) and time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000000) and time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) AND time BETWEEN (1641024000000) AND (1741024000000);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001) AND time BETWEEN (1641024000000) AND (1741024000000);")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002, 1641024000003) AND time BETWEEN (1641024000000) AND (1741024000000);")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002, 1641024000005) AND time BETWEEN (1641024000000) AND (1641024000004);")
+ tdSql.checkRows(2)
+
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) OR time = 1741024000000;")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1741024000000 OR time IN (1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1, 2, 3) OR time BETWEEN (1641024000000) and (1741024000000);")
+ tdSql.checkRows(6)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1, 2, 3) OR time = 1641024000000;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000001 OR time BETWEEN (1641024000000) and (1641024000002);")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002);")
+ tdSql.checkRows(4)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000001 OR time = 1741024000000;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002) OR time = 1741024000000;")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002) OR time BETWEEN (1641024000000) and (1741024000000);")
+ tdSql.checkRows(6)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) and time in(1);")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) and time in(1641024000004, 1641024000002);")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) or time in(1);")
+ tdSql.checkRows(4)
+
+
+ def ts5759(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( time TIMESTAMP, c1 BIGINT);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000000, 0);")
+
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (3 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 > 2)")
+ tdSql.checkRows(0)
+
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000001, 1);")
+ tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000002, 2);")
+
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT c1 FROM {self.dbname}.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)
+
+ tdSql.query(f"SELECT sum(ts + c1), sum(ts+c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 1641024000002)
+ tdSql.checkData(0, 1, 1641024000002)
+ tdSql.query(f"SELECT sum(ts * c1), sum(ts*c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 1641024000001)
+ tdSql.checkData(0, 1, 1641024000001)
+ tdSql.query(f"SELECT sum(ts / c1), sum(ts/c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 1641024000001)
+ tdSql.checkData(0, 1, 1641024000001)
+ tdSql.execute(f"INSERT INTO {self.dbname}.t2(ts, c1, c2) VALUES (1641024000002, 2.0, 2.0);")
+ tdSql.query(f"SELECT sum(ts + c1), sum(ts+c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 3282048000006)
+ tdSql.checkData(0, 1, 3282048000006)
+ tdSql.query(f"SELECT sum(ts - c1), sum(ts-c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 3282048000000)
+ tdSql.checkData(0, 1, 3282048000000)
+ tdSql.query(f"SELECT sum(ts * c1), sum(ts*c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 4923072000005)
+ tdSql.checkData(0, 1, 4923072000005)
+ tdSql.query(f"SELECT ts / c1, ts/c2 from {self.dbname}.t2 order by ts")
+ tdSql.checkData(0, 0, 1641024000001)
+ tdSql.checkData(0, 1, 1641024000001)
+ tdSql.checkData(1, 0, 820512000001)
+ tdSql.checkData(1, 1, 820512000001)
+ tdSql.query(f"SELECT sum(ts / c1), sum(ts/c2) from {self.dbname}.t2")
+ tdSql.checkData(0, 0, 2461536000002)
+ tdSql.checkData(0, 1, 2461536000002)
+
+ # data overflow
+ tdSql.query(f"SELECT ts + 9223372036854775807 from {self.dbname}.t2 order by ts")
+ tdSql.query(f"SELECT ts - 9223372036854775808 from {self.dbname}.t2 order by ts")
+
+ tdSql.query(f"SELECT ts + 8223372036854775807 from {self.dbname}.t2 order by ts")
+ tdSql.query(f"SELECT ts - 8223372036854775808 from {self.dbname}.t2 order by ts")
+
+ 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.operOnTime()
+
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+tdCases.addWindows(__file__, TDTestCase())
+
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/system-test/2-query/sum.py b/tests/system-test/2-query/sum.py
index 5abd58d3f9..88f2a37aec 100644
--- a/tests/system-test/2-query/sum.py
+++ b/tests/system-test/2-query/sum.py
@@ -78,7 +78,7 @@ class TDTestCase:
)
# sqls.extend( f"select sum( {un_num_col} + {un_num_col_2} ) from {tbanme} " for un_num_col_2 in UN_NUM_COL )
- sqls.extend( f"select sum( {num_col} + {ts_col} ) from {DBNAME}.{tbanme} " for num_col in NUM_COL for ts_col in TS_TYPE_COL)
+ #sqls.extend( f"select sum( {num_col} + {ts_col} ) from {DBNAME}.{tbanme} " for num_col in NUM_COL for ts_col in TS_TYPE_COL)
sqls.extend(
(
f"select sum() from {DBNAME}.{tbanme} ",