From 99c352f175f2ed3cc1b754315e1ec449578a5369 Mon Sep 17 00:00:00 2001
From: factosea <285808407@qq.com>
Date: Fri, 13 Dec 2024 09:50:39 +0800
Subject: [PATCH] fix: timerange
---
source/libs/scalar/src/filter.c | 34 ++++++-
tests/system-test/2-query/operator.py | 127 ++++++++++++++++++++++++++
2 files changed, 159 insertions(+), 2 deletions(-)
diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c
index 10850aab9a..aaf05618ca 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"
@@ -4551,6 +4552,29 @@ static int32_t fltSclGetTimeStampDatum(SFltSclPoint *point, SFltSclDatum *d) {
return TSDB_CODE_SUCCESS;
}
+typedef struct SRewriteGetInOperContext {
+ bool hasInOper;
+} SRewriteGetInOperContext;
+
+static EDealRes rewriteInOperForTimerange(SNode **ppNode, void *pContext) {
+ SRewriteGetInOperContext *pCxt = pContext;
+ if (nodeType(*ppNode) == QUERY_NODE_OPERATOR && ((SOperatorNode *)(*ppNode))->opType == OP_TYPE_BIT_OR) {
+ return DEAL_RES_IGNORE_CHILD;
+ }
+ if (nodeType(*ppNode) == QUERY_NODE_OPERATOR && ((SOperatorNode *)(*ppNode))->opType == OP_TYPE_IN) {
+ pCxt->hasInOper = true;
+ return DEAL_RES_END;
+ }
+ return DEAL_RES_CONTINUE;
+}
+
+bool hasAndTypeInOperator(SNode *pNode) {
+ SRewriteGetInOperContext cxt = {.hasInOper = false};
+ nodesRewriteExpr(&pNode, rewriteInOperForTimerange, &cxt);
+
+ return cxt.hasInOper;
+}
+
int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
SFilterInfo *info = NULL;
int32_t code = 0;
@@ -4581,8 +4605,11 @@ 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;
+ if (optNode->opType == OP_TYPE_IN || hasAndTypeInOperator(info->sclCtx.node)) {
+ *isStrict = false;
+ } else {
+ *isStrict = true;
+ }
goto _return;
} else if (taosArrayGetSize(points) == 0) {
*win = TSWINDOW_DESC_INITIALIZER;
@@ -5105,6 +5132,9 @@ int32_t fltSclProcessCNF(SArray *sclOpListCNF, SArray *colRangeList) {
taosArrayDestroy(colRange->points);
taosArrayDestroy(points);
colRange->points = merged;
+ if(merged->size == 0) {
+ break;
+ }
} else {
taosArrayDestroy(colRange->points);
colRange->points = points;
diff --git a/tests/system-test/2-query/operator.py b/tests/system-test/2-query/operator.py
index edfd023b7c..c0235d081d 100644
--- a/tests/system-test/2-query/operator.py
+++ b/tests/system-test/2-query/operator.py
@@ -95,12 +95,139 @@ class TDTestCase:
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 t1 WHERE (time - c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (time + c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (-(- c0)) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE -(- c0) > 0;")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE -(- c0) < 0;")
+ tdSql.checkRows(0)
+
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE -(- c0) = 0;")
+ tdSql.checkRows(0)
+
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (- c0) > 0;")
+ tdSql.checkRows(0)
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (- c0) < 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (time + (- c0)) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (time + (- c0)) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM t1 WHERE (time - (- (- c0)) ) > 0;")
+ tdSql.checkRows(1)
+
+ tdSql.query(f"SELECT time, c0 FROM 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 t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (3 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
+ tdSql.checkRows(1)
+ tdSql.query(f"SELECT c1 FROM 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 t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
+ tdSql.checkRows(3)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
+ tdSql.checkRows(2)
+ tdSql.query(f"SELECT c1 FROM t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
+ tdSql.checkRows(2)
+
+
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()