fix: timerange

This commit is contained in:
factosea 2024-12-13 09:50:39 +08:00
parent 13ccfdc314
commit 99c352f175
2 changed files with 159 additions and 2 deletions

View File

@ -13,6 +13,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <tlog.h>
#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;

View File

@ -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()