fix:[TS-5761] error for in operator

This commit is contained in:
wangmm0220 2024-12-16 19:22:25 +08:00
parent 1727e4fd3e
commit e4447e7bdc
10 changed files with 190 additions and 50 deletions

View File

@ -288,6 +288,7 @@ struct SScalarParam {
bool colAlloced;
SColumnInfoData *columnData;
SHashObj *pHashFilter;
SHashObj *pHashFilterVar;
int32_t hashValueType;
void *param; // other parameter, such as meta handle from vnode, to extract table name/tag value
int32_t numOfRows;

View File

@ -40,7 +40,7 @@ pDst need to freed in caller
int32_t scalarCalculate(SNode *pNode, SArray *pBlockList, SScalarParam *pDst);
int32_t scalarGetOperatorParamNum(EOperatorType type);
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type, int8_t processType);
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, int32_t *overflow, int32_t startIndex, int32_t numOfRows);

View File

@ -326,7 +326,7 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
indexError("invalid length for node:%p, length: %d", node, LIST_LENGTH(nl->pNodeList));
SIF_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
SIF_ERR_RET(scalarGenerateSetFromList((void **)&param->pFilter, node, nl->node.resType.type));
SIF_ERR_RET(scalarGenerateSetFromList((void **)&param->pFilter, node, nl->node.resType.type, 0));
if (taosHashPut(ctx->pRes, &node, POINTER_BYTES, param, sizeof(*param))) {
taosHashCleanup(param->pFilter);
param->pFilter = NULL;

View File

@ -141,7 +141,7 @@ int32_t sclConvertToTsValueNode(int8_t precision, SValueNode* valueNode);
#define GET_PARAM_PRECISON(_c) ((_c)->columnData->info.precision)
void sclFreeParam(SScalarParam* param);
int32_t doVectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t startIndex, int32_t numOfRows,
int32_t doVectorCompare(SScalarParam* pLeft, SScalarParam *pLeftVar, SScalarParam* pRight, SScalarParam *pOut, int32_t startIndex, int32_t numOfRows,
int32_t _ord, int32_t optr);
int32_t vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t startIndex, int32_t numOfRows,
int32_t _ord, int32_t optr);

View File

@ -2210,7 +2210,7 @@ int32_t fltInitValFieldData(SFilterInfo *info) {
}
if (unit->compare.optr == OP_TYPE_IN) {
FLT_ERR_RET(scalarGenerateSetFromList((void **)&fi->data, fi->desc, type));
FLT_ERR_RET(scalarGenerateSetFromList((void **)&fi->data, fi->desc, type, 0));
if (fi->data == NULL) {
fltError("failed to convert in param");
FLT_ERR_RET(TSDB_CODE_APP_ERROR);
@ -4767,7 +4767,7 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
return DEAL_RES_CONTINUE;
}
if (node->opType == OP_TYPE_NOT_IN || node->opType == OP_TYPE_NOT_LIKE || node->opType > OP_TYPE_IS_NOT_NULL ||
if (node->opType == OP_TYPE_NOT_LIKE || node->opType > OP_TYPE_IS_NOT_NULL ||
node->opType == OP_TYPE_NOT_EQUAL) {
stat->scalarMode = true;
return DEAL_RES_CONTINUE;
@ -4841,7 +4841,7 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
}
}
if (OP_TYPE_IN == node->opType && QUERY_NODE_NODE_LIST != nodeType(node->pRight)) {
if ((OP_TYPE_IN == node->opType || OP_TYPE_NOT_IN == node->opType) && QUERY_NODE_NODE_LIST != nodeType(node->pRight)) {
fltError("invalid IN operator node, rightType:%d", nodeType(node->pRight));
stat->code = TSDB_CODE_APP_ERROR;
return DEAL_RES_ERROR;
@ -4850,7 +4850,7 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
SColumnNode *refNode = (SColumnNode *)node->pLeft;
int32_t type = refNode->node.resType.type;
SExprNode *exprNode = NULL;
if (OP_TYPE_IN != node->opType) {
if (OP_TYPE_IN != node->opType && OP_TYPE_NOT_IN != node->opType) {
SValueNode *valueNode = (SValueNode *)node->pRight;
if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) &&
TSDB_DATA_TYPE_UBIGINT == valueNode->node.resType.type && valueNode->datum.u <= INT64_MAX) {
@ -4869,16 +4869,14 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
SValueNode *valueNode = (SValueNode *)cell->pNode;
cell = cell->pNext;
if (IS_NUMERIC_TYPE(valueNode->node.resType.type) && IS_NUMERIC_TYPE(type)) {
int32_t tmp = vectorGetConvertType(type, valueNode->node.resType.type);
if (tmp != 0){
type = tmp;
}
int32_t tmp = vectorGetConvertType(type, valueNode->node.resType.type);
if (tmp != 0){
type = tmp;
}
}
exprNode->resType.type = type;
}
if (0 != type && type != refNode->node.resType.type) {
if ((0 != type && type != refNode->node.resType.type) || OP_TYPE_NOT_IN == node->opType) {
stat->scalarMode = true;
return DEAL_RES_CONTINUE;
}

View File

@ -116,7 +116,8 @@ _return:
SCL_RET(code);
}
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
// processType = 0 means all type. 1 means number, 2 means var
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type, int8_t processType) {
SHashObj *pObj = taosHashInit(256, taosGetDefaultHashFunction(type), true, false);
if (NULL == pObj) {
sclError("taosHashInit failed, size:%d", 256);
@ -138,6 +139,19 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
for (int32_t i = 0; i < nodeList->pNodeList->length; ++i) {
SValueNode *valueNode = (SValueNode *)cell->pNode;
if (IS_VAR_DATA_TYPE(valueNode->node.resType.type)){
if (processType == 1) {
cell = cell->pNext;
continue;
}
} else{
if (processType == 2)
{
cell = cell->pNext;
continue;
}
}
if (valueNode->node.resType.type != type) {
out.columnData->info.type = type;
if (IS_VAR_DATA_TYPE(type)) {
@ -187,6 +201,9 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
cell = cell->pNext;
}
if (taosHashGetSize(pObj) == 0) {
goto _return;
}
*data = pObj;
colDataDestroy(out.columnData);
@ -369,12 +386,14 @@ int32_t sclInitParam(SNode *node, SScalarParam *param, SScalarCtx *ctx, int32_t
SCL_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
int32_t type = vectorGetConvertType(ctx->type.selfType, ctx->type.peerType);
if (type == 0) {
type = nodeList->node.resType.type;
int32_t type = ctx->type.peerType;
if (IS_VAR_DATA_TYPE(ctx->type.selfType) && IS_NUMERIC_TYPE(ctx->type.peerType)){
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 1));
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilterVar, node, ctx->type.selfType, 2));
} else {
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 0));
}
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type));
param->hashValueType = type;
param->colAlloced = true;
if (taosHashPut(ctx->pRes, &node, POINTER_BYTES, param, sizeof(*param))) {
@ -587,7 +606,6 @@ int32_t sclInitOperatorParams(SScalarParam **pParams, SOperatorNode *node, SScal
SCL_ERR_JRET(sclInitParam(node->pLeft, &paramList[0], ctx, rowNum));
if (paramNum > 1) {
TSWAP(ctx->type.selfType, ctx->type.peerType);
SCL_ERR_JRET(sclInitParam(node->pRight, &paramList[1], ctx, rowNum));
}

View File

@ -1069,6 +1069,9 @@ int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
int32_t vectorConvertSingleCol(SScalarParam *input, SScalarParam *output, int32_t type, int32_t startIndex,
int32_t numOfRows) {
if (input->columnData == NULL && input->pHashFilterVar != NULL){
return TSDB_CODE_SUCCESS;
}
output->numOfRows = input->numOfRows;
SDataType t = {.type = type};
@ -1099,36 +1102,18 @@ int32_t vectorConvertCols(SScalarParam *pLeft, SScalarParam *pRight, SScalarPara
int8_t type = 0;
int32_t code = 0;
SScalarParam *param1 = NULL, *paramOut1 = NULL;
SScalarParam *param2 = NULL, *paramOut2 = NULL;
SScalarParam *param1 = pLeft, *paramOut1 = pLeftOut;
SScalarParam *param2 = pRight, *paramOut2 = pRightOut;
// always convert least data
if (IS_VAR_DATA_TYPE(leftType) && IS_VAR_DATA_TYPE(rightType) && (pLeft->numOfRows != pRight->numOfRows) &&
leftType != TSDB_DATA_TYPE_JSON && rightType != TSDB_DATA_TYPE_JSON) {
param1 = pLeft;
param2 = pRight;
paramOut1 = pLeftOut;
paramOut2 = pRightOut;
if (pLeft->numOfRows > pRight->numOfRows) {
type = leftType;
} else {
type = rightType;
}
} else {
// we only define half value in the convert-matrix, so make sure param1 always less equal than param2
if (leftType < rightType) {
param1 = pLeft;
param2 = pRight;
paramOut1 = pLeftOut;
paramOut2 = pRightOut;
} else {
param1 = pRight;
param2 = pLeft;
paramOut1 = pRightOut;
paramOut2 = pLeftOut;
}
type = vectorGetConvertType(GET_PARAM_TYPE(param1), GET_PARAM_TYPE(param2));
if (0 == type) {
return TSDB_CODE_SUCCESS;
@ -1991,13 +1976,14 @@ int32_t doVectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarPa
return code;
}
int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pLeftVar, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
int32_t numOfRows, int32_t _ord, int32_t optr) {
int32_t i = 0;
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
int32_t lType = GET_PARAM_TYPE(pLeft);
int32_t rType = GET_PARAM_TYPE(pRight);
__compar_fn_t fp = NULL;
__compar_fn_t fpVar = NULL;
int32_t compRows = 0;
if (lType == rType) {
SCL_ERR_RET(filterGetCompFunc(&fp, lType, optr));
@ -2005,6 +1991,9 @@ int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam
fp = filterGetCompFuncEx(lType, rType, optr);
}
if (pLeftVar != NULL) {
SCL_ERR_RET(filterGetCompFunc(&fpVar, GET_PARAM_TYPE(pLeftVar), optr));
}
if (startIndex < 0) {
i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
@ -2024,6 +2013,10 @@ int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam
char *pLeftData = colDataGetData(pLeft->columnData, i);
bool res = filterDoCompare(fp, optr, pLeftData, pRight->pHashFilter);
if (pLeftVar != NULL && !res){
pLeftData = colDataGetData(pLeftVar->columnData, i);
res = res || filterDoCompare(fpVar, optr, pLeftData, pRight->pHashFilterVar);
}
colDataSetInt8(pOut->columnData, i, (int8_t *)&res);
if (res) {
pOut->numOfQualified++;
@ -2041,6 +2034,7 @@ int32_t vectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarPara
SScalarParam pRightOut = {0};
SScalarParam *param1 = NULL;
SScalarParam *param2 = NULL;
SScalarParam *param3 = NULL;
int32_t code = TSDB_CODE_SUCCESS;
if (noConvertBeforeCompare(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) {
param1 = pLeft;
@ -2049,9 +2043,12 @@ int32_t vectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarPara
SCL_ERR_JRET(vectorConvertCols(pLeft, pRight, &pLeftOut, &pRightOut, startIndex, numOfRows));
param1 = (pLeftOut.columnData != NULL) ? &pLeftOut : pLeft;
param2 = (pRightOut.columnData != NULL) ? &pRightOut : pRight;
if (pRight->pHashFilterVar != NULL){
param3 = pLeft;
}
}
SCL_ERR_JRET(doVectorCompare(param1, param2, pOut, startIndex, numOfRows, _ord, optr));
SCL_ERR_JRET(doVectorCompare(param1, param3, param2, pOut, startIndex, numOfRows, _ord, optr));
_return:
sclFreeParam(&pLeftOut);

View File

@ -705,7 +705,7 @@
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/systable_func.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4382.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4403.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_td28163.py
,,n,system-test,./pytest.sh python3 ./test.py -f 2-query/test_td28163.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py

View File

@ -24,25 +24,88 @@ class TDTestCase:
tdSql.execute("CREATE TABLE t1( time TIMESTAMP, c1 BIGINT, c2 smallint, c3 double, c4 int UNSIGNED, c5 bool, c6 binary(32), c7 nchar(32));")
# create index for all tags
tdSql.execute("INSERT INTO t1 VALUES (1641024000000, 1, 1, 1, 1, 1, '1', '1')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000000, 1, 1, 1, 1, 1, '1', '1.7')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000001, 0, 0, 1.7, 0, 0, '0', '')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000002, 1, 1, 1, 1, 1, '1', 'er')")
def check(self):
tdSql.query(f"SELECT * FROM t1 WHERE c1 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c1 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c1 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c2 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c2 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c2 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c3 = 1.7")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c3 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c3 not in (1.7, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c4 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c4 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c4 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c5 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (1, 2)")
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 1")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (1, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (1, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 0")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (0, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (0, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = 1.7")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in (1.7, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = 0")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (0, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in (0, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = ''")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in ('', 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in ('', 2)")
tdSql.checkRows(2)
def run(self):
self.prepareData()
self.check()

View File

@ -23,25 +23,88 @@ class TDTestCase:
tdSql.execute("CREATE TABLE t1( time TIMESTAMP, c1 BIGINT, c2 smallint, c3 double, c4 int UNSIGNED, c5 bool, c6 binary(32), c7 nchar(32));")
# create index for all tags
tdSql.execute("INSERT INTO t1 VALUES (1641024000000, 1, 1, 1, 1, 1, '1', '1')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000000, 1, 1, 1, 1, 1, '1', '1.7')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000001, 0, 0, 1.7, 0, 0, '0', '')")
tdSql.execute("INSERT INTO t1 VALUES (1641024000002, 1, 1, 1, 1, 1, '1', 'er')")
def check(self):
tdSql.query(f"SELECT * FROM t1 WHERE c1 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c1 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c1 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c2 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c2 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c2 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c3 = 1.7")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c3 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c3 not in (1.7, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c4 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c4 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c4 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c5 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c5 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 1.7")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (1.7, 2)")
tdSql.checkRows(0)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (1, 2)")
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (1.7, 2)")
tdSql.checkRows(3)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 1")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (1, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (1, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 = 0")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 in (0, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c6 not in (0, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = 1.7")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (1.7, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in (1.7, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = 0")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in (0, 2)")
tdSql.checkRows(2)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in (0, 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 = ''")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 in ('', 2)")
tdSql.checkRows(1)
tdSql.query(f"SELECT * FROM t1 WHERE c7 not in ('', 2)")
tdSql.checkRows(2)
def run(self):
self.prepareData()
self.check()