未验证 提交 bb0207ef 编写于 作者: S shenglian-zhou 提交者: GitHub

Merge pull request #9830 from taosdata/fix/TD-12909

Fix/td 12909  for illegal SQL such as "select * from st where tag1 >sum(1)"
......@@ -5661,6 +5661,15 @@ static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
if (!p->_node.pLeft || !p->_node.pRight) {
break;
}
int32_t retVal = TSDB_CODE_SUCCESS;
if (p->_node.pLeft && (retVal = validateTagCondExpr(pCmd, p->_node.pLeft)) != TSDB_CODE_SUCCESS) {
return retVal;
}
if (p->_node.pRight && (retVal = validateTagCondExpr(pCmd, p->_node.pRight)) != TSDB_CODE_SUCCESS) {
return retVal;
}
if (IS_ARITHMETIC_OPTR(p->_node.optr)) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
......@@ -5696,8 +5705,6 @@ static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
} else if (schemaType == TSDB_DATA_TYPE_FLOAT || schemaType == TSDB_DATA_TYPE_DOUBLE) {
schemaType = TSDB_DATA_TYPE_DOUBLE;
}
int32_t retVal = TSDB_CODE_SUCCESS;
int32_t bufLen = 0;
if (IS_NUMERIC_TYPE(vVariant->nType)) {
......
......@@ -927,7 +927,9 @@ int32_t filterAddUnit(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFi
SFilterField *val = FILTER_UNIT_RIGHT_FIELD(info, u);
assert(FILTER_GET_FLAG(val->flag, FLD_TYPE_VALUE));
} else {
assert(optr == TSDB_RELATION_ISNULL || optr == TSDB_RELATION_NOTNULL || optr == FILTER_DUMMY_EMPTY_OPTR);
if(optr != TSDB_RELATION_ISNULL && optr != TSDB_RELATION_NOTNULL && optr != FILTER_DUMMY_EMPTY_OPTR){
return -1;
}
}
SFilterField *col = FILTER_UNIT_LEFT_FIELD(info, u);
......@@ -1257,7 +1259,8 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
} else {
filterAddFieldFromNode(info, tree->_node.pRight, &right);
filterAddUnit(info, tree->_node.optr, &left, &right, &uidx);
ret = filterAddUnit(info, tree->_node.optr, &left, &right, &uidx);
CHK_LRET(ret != TSDB_CODE_SUCCESS, TSDB_CODE_QRY_APP_ERROR, "invalid where condition");
SFilterGroup fgroup = {0};
filterAddUnitToGroup(&fgroup, uidx);
......@@ -1574,7 +1577,9 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
SFilterField *left = FILTER_UNIT_LEFT_FIELD(info, unit);
SSchema *sch = left->desc;
len = sprintf(str, "UNIT[%d] => [%d][%s] %s [", i, sch->colId, sch->name, gOptrStr[unit->compare.optr].str);
if (unit->compare.optr >= TSDB_RELATION_INVALID && unit->compare.optr <= TSDB_RELATION_CONTAINS){
len = sprintf(str, "UNIT[%d] => [%d][%s] %s [", i, sch->colId, sch->name, gOptrStr[unit->compare.optr].str);
}
if (unit->right.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != TSDB_RELATION_IN) {
SFilterField *right = FILTER_UNIT_RIGHT_FIELD(info, unit);
......@@ -1591,7 +1596,9 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
if (unit->compare.optr2) {
strcat(str, " && ");
sprintf(str + strlen(str), "[%d][%s] %s [", sch->colId, sch->name, gOptrStr[unit->compare.optr2].str);
if (unit->compare.optr2 >= TSDB_RELATION_INVALID && unit->compare.optr2 <= TSDB_RELATION_CONTAINS){
sprintf(str + strlen(str), "[%d][%s] %s [", sch->colId, sch->name, gOptrStr[unit->compare.optr2].str);
}
if (unit->right2.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != TSDB_RELATION_IN) {
SFilterField *right = FILTER_UNIT_RIGHT2_FIELD(info, unit);
......
......@@ -86,17 +86,21 @@ class TDTestCase:
tdSql.query("select count(*) from st where hostname between 'abc' and 'def'")
tdSql.error("select count(*) from st where hostname between 1 and 2 or sum(1)")
tdSql.execute("select count(*) from st where hostname < max(123)")
tdSql.error("select count(*) from st where hostname < max(123)")
tdSql.execute("select count(*) from st where hostname < max('abc')")
tdSql.execute("select count(*) from st where hostname < max(min(123))")
tdSql.error("select count(*) from st where hostname < max('abc')")
tdSql.error("select count(*) from st where hostname < max(min(123))")
tdSql.execute("select count(*) from st where hostname < sum('abc')")
tdSql.execute("select count(*) from st where hostname < sum(min(123))")
tdSql.error("select count(*) from st where hostname < sum('abc')")
tdSql.error("select count(*) from st where hostname < sum(min(123))")
tdSql.execute("select count(*) from st where hostname < diff('abc')")
tdSql.execute("select count(*) from st where hostname < diff(min(123))")
tdSql.error("select count(*) from st where hostname < diff('abc')")
tdSql.error("select count(*) from st where hostname < diff(min(123))")
tdSql.error("select count(*) from st where hostname < tbname")
tdSql.error("select count(*) from st where ts > 0 and tbname in ('d1', 'd2') and tbname-2")
tdSql.query("select count(*) from st where id > 10000000000000")
def stop(self):
tdSql.close()
......
......@@ -20,6 +20,7 @@ python3 ./test.py -f 2-query/TD-12344.py
#python3 ./test.py -f 2-query/TD-12594.py
python3 ./test.py -f 2-query/TD-12614.py
python3 ./test.py -f 2-query/function_elapsed.py
python3 ./test.py -f 2-query/TD-12909.py
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册