fix: timerange
This commit is contained in:
parent
13ccfdc314
commit
99c352f175
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue