Merge pull request #6586 from taosdata/feature/TD-4098
[TD-4098]<feature> refactor IN filter
This commit is contained in:
commit
18bee12d36
|
@ -65,7 +65,6 @@ static char* getAccountId(SSqlObj* pSql);
|
||||||
|
|
||||||
static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision);
|
static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision);
|
||||||
static bool serializeExprListToVariant(SArray* pList, tVariant **dest, int16_t colType, uint8_t precision);
|
static bool serializeExprListToVariant(SArray* pList, tVariant **dest, int16_t colType, uint8_t precision);
|
||||||
static int32_t validateParamOfRelationIn(tVariant *pVar, int32_t colType);
|
|
||||||
|
|
||||||
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
|
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
|
||||||
static char* cloneCurrentDBName(SSqlObj* pSql);
|
static char* cloneCurrentDBName(SSqlObj* pSql);
|
||||||
|
@ -156,78 +155,76 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
tSqlExprItem* item = (tSqlExprItem *)taosArrayGet(pList, 0);
|
tSqlExpr* item = ((tSqlExprItem*)(taosArrayGet(pList, 0)))->pNode;
|
||||||
int32_t firstTokenType = item->pNode->token.type;
|
int32_t firstVarType = item->value.nType;
|
||||||
int32_t type = firstTokenType;
|
|
||||||
|
|
||||||
//nchar to binary and other xxint to bigint
|
|
||||||
toTSDBType(type);
|
|
||||||
if (colType != TSDB_DATA_TYPE_TIMESTAMP && !IS_UNSIGNED_NUMERIC_TYPE(colType)) {
|
|
||||||
if (type != colType && (type != TSDB_DATA_TYPE_BINARY || colType != TSDB_DATA_TYPE_NCHAR)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type = colType;
|
|
||||||
|
|
||||||
SBufferWriter bw = tbufInitWriter( NULL, false);
|
SBufferWriter bw = tbufInitWriter( NULL, false);
|
||||||
|
|
||||||
tbufEnsureCapacity(&bw, 512);
|
tbufEnsureCapacity(&bw, 512);
|
||||||
|
if (colType == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
|
tbufWriteUint32(&bw, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
} else {
|
||||||
|
tbufWriteUint32(&bw, colType);
|
||||||
|
}
|
||||||
|
tbufWriteInt32(&bw, (int32_t)(pList->size));
|
||||||
|
|
||||||
int32_t size = (int32_t)(pList->size);
|
for (int32_t i = 0; i < (int32_t)pList->size; i++) {
|
||||||
tbufWriteUint32(&bw, type);
|
|
||||||
tbufWriteInt32(&bw, size);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < size; i++) {
|
|
||||||
tSqlExpr* pSub = ((tSqlExprItem*)(taosArrayGet(pList, i)))->pNode;
|
tSqlExpr* pSub = ((tSqlExprItem*)(taosArrayGet(pList, i)))->pNode;
|
||||||
|
tVariant* var = &pSub->value;
|
||||||
|
|
||||||
// check all the token type in expr list same or not
|
// check all the token type in expr list same or not
|
||||||
if (firstTokenType != pSub->token.type) {
|
if (firstVarType != var->nType) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
toTSDBType(pSub->token.type);
|
if ((colType == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(colType))) {
|
||||||
|
if (var->nType != TSDB_DATA_TYPE_BOOL && !IS_SIGNED_NUMERIC_TYPE(var->nType)) {
|
||||||
tVariant var;
|
break;
|
||||||
tVariantCreate(&var, &pSub->token);
|
}
|
||||||
if (type == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(type)) {
|
tbufWriteInt64(&bw, var->i64);
|
||||||
tbufWriteInt64(&bw, var.i64);
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
if (IS_SIGNED_NUMERIC_TYPE(var->nType) && IS_UNSIGNED_NUMERIC_TYPE(var->nType)) {
|
||||||
// ugly code, refactor later
|
break;
|
||||||
if (IS_UNSIGNED_NUMERIC_TYPE(pSub->token.type) || IS_SIGNED_NUMERIC_TYPE(pSub->token.type)) {
|
}
|
||||||
tbufWriteUint64(&bw, var.i64);
|
tbufWriteUint64(&bw, var->u64);
|
||||||
|
} else if (colType == TSDB_DATA_TYPE_DOUBLE || colType == TSDB_DATA_TYPE_FLOAT) {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(var->nType) || IS_UNSIGNED_NUMERIC_TYPE(var->nType)) {
|
||||||
|
tbufWriteDouble(&bw, (double)(var->i64));
|
||||||
|
} else if (var->nType == TSDB_DATA_TYPE_DOUBLE || var->nType == TSDB_DATA_TYPE_FLOAT){
|
||||||
|
tbufWriteDouble(&bw, var->dKey);
|
||||||
} else {
|
} else {
|
||||||
tVariantDestroy(&var);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else if (colType == TSDB_DATA_TYPE_BINARY) {
|
||||||
else if (type == TSDB_DATA_TYPE_DOUBLE || type == TSDB_DATA_TYPE_FLOAT) {
|
if (var->nType != TSDB_DATA_TYPE_BINARY) {
|
||||||
tbufWriteDouble(&bw, var.dKey);
|
break;
|
||||||
} else if (type == TSDB_DATA_TYPE_BINARY){
|
}
|
||||||
tbufWriteBinary(&bw, var.pz, var.nLen);
|
tbufWriteBinary(&bw, var->pz, var->nLen);
|
||||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
} else if (colType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
char *buf = (char *)calloc(1, (var.nLen + 1)*TSDB_NCHAR_SIZE);
|
if (var->nType != TSDB_DATA_TYPE_BINARY) {
|
||||||
if (tVariantDump(&var, buf, type, false) != TSDB_CODE_SUCCESS) {
|
break;
|
||||||
|
}
|
||||||
|
char *buf = (char *)calloc(1, (var->nLen + 1)*TSDB_NCHAR_SIZE);
|
||||||
|
if (tVariantDump(var, buf, colType, false) != TSDB_CODE_SUCCESS) {
|
||||||
free(buf);
|
free(buf);
|
||||||
tVariantDestroy(&var);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tbufWriteBinary(&bw, buf, twcslen((wchar_t *)buf) * TSDB_NCHAR_SIZE);
|
tbufWriteBinary(&bw, buf, twcslen((wchar_t *)buf) * TSDB_NCHAR_SIZE);
|
||||||
free(buf);
|
free(buf);
|
||||||
} else if (type == TSDB_DATA_TYPE_TIMESTAMP) {
|
} else if (colType == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
if (var.nType == TSDB_DATA_TYPE_BINARY) {
|
if (var->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
if (convertTimestampStrToInt64(&var, precision) < 0) {
|
if (convertTimestampStrToInt64(var, precision) < 0) {
|
||||||
tVariantDestroy(&var);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tbufWriteInt64(&bw, var.i64);
|
tbufWriteInt64(&bw, var->i64);
|
||||||
} else if (var.nType == TSDB_DATA_TYPE_BIGINT) {
|
} else if (var->nType == TSDB_DATA_TYPE_BIGINT) {
|
||||||
tbufWriteInt64(&bw, var.i64);
|
tbufWriteInt64(&bw, var->i64);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
tVariantDestroy(&var);
|
if (i == (int32_t)(pList->size - 1)) { ret = true;}
|
||||||
|
}
|
||||||
if (i == size - 1) { ret = true;}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret == true) {
|
if (ret == true) {
|
||||||
if ((*dst = calloc(1, sizeof(tVariant))) != NULL) {
|
if ((*dst = calloc(1, sizeof(tVariant))) != NULL) {
|
||||||
tVariantCreateFromBinary(*dst, tbufGetData(&bw, false), tbufTell(&bw), TSDB_DATA_TYPE_BINARY);
|
tVariantCreateFromBinary(*dst, tbufGetData(&bw, false), tbufTell(&bw), TSDB_DATA_TYPE_BINARY);
|
||||||
|
@ -239,13 +236,6 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t validateParamOfRelationIn(tVariant *pVar, int32_t colType) {
|
|
||||||
if (pVar->nType != TSDB_DATA_TYPE_BINARY) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
SBufferReader br = tbufInitReader(pVar->pz, pVar->nLen, false);
|
|
||||||
return colType == TSDB_DATA_TYPE_NCHAR ? 0 : (tbufReadUint32(&br) == colType ? 0: -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t convertOptr(SStrToken *pToken) {
|
static uint8_t convertOptr(SStrToken *pToken) {
|
||||||
switch (pToken->type) {
|
switch (pToken->type) {
|
||||||
|
@ -3374,11 +3364,6 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
||||||
if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->pParam, &pVal, colType, timePrecision)) {
|
if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->pParam, &pVal, colType, timePrecision)) {
|
||||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg);
|
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg);
|
||||||
}
|
}
|
||||||
if (validateParamOfRelationIn(pVal, colType) != TSDB_CODE_SUCCESS) {
|
|
||||||
tVariantDestroy(pVal);
|
|
||||||
free(pVal);
|
|
||||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg);
|
|
||||||
}
|
|
||||||
pColumnFilter->pz = (int64_t)calloc(1, pVal->nLen + 1);
|
pColumnFilter->pz = (int64_t)calloc(1, pVal->nLen + 1);
|
||||||
pColumnFilter->len = pVal->nLen;
|
pColumnFilter->len = pVal->nLen;
|
||||||
pColumnFilter->filterstr = 1;
|
pColumnFilter->filterstr = 1;
|
||||||
|
|
|
@ -3364,7 +3364,7 @@ static bool tableFilterFp(const void* pNode, void* param) {
|
||||||
GET_TYPED_DATA(v, uint64_t, pInfo->sch.type, val);
|
GET_TYPED_DATA(v, uint64_t, pInfo->sch.type, val);
|
||||||
return NULL != taosHashGet((SHashObj *)pInfo->q, (char *)&v, sizeof(v));
|
return NULL != taosHashGet((SHashObj *)pInfo->q, (char *)&v, sizeof(v));
|
||||||
}
|
}
|
||||||
else if (type == TSDB_DATA_TYPE_DOUBLE || type == TSDB_DATA_TYPE_DOUBLE) {
|
else if (type == TSDB_DATA_TYPE_DOUBLE || type == TSDB_DATA_TYPE_FLOAT) {
|
||||||
double v;
|
double v;
|
||||||
GET_TYPED_DATA(v, double, pInfo->sch.type, val);
|
GET_TYPED_DATA(v, double, pInfo->sch.type, val);
|
||||||
return NULL != taosHashGet((SHashObj *)pInfo->q, (char *)&v, sizeof(v));
|
return NULL != taosHashGet((SHashObj *)pInfo->q, (char *)&v, sizeof(v));
|
||||||
|
|
|
@ -698,24 +698,24 @@ class TDTestCase:
|
||||||
tdSql.execute(cmd1)
|
tdSql.execute(cmd1)
|
||||||
|
|
||||||
cmd2 = 'select * from normal_in_float_double_1 where in_float in (\'888\');'
|
cmd2 = 'select * from normal_in_float_double_1 where in_float in (\'888\');'
|
||||||
tdLog.info(cmd2)
|
#tdLog.info(cmd2)
|
||||||
tdSql.error(cmd2)
|
#tdSql.error(cmd2)
|
||||||
try:
|
#try:
|
||||||
tdSql.execute(cmd2)
|
# tdSql.execute(cmd2)
|
||||||
tdLog.exit("invalid operation: not supported filter condition")
|
# tdLog.exit("invalid operation: not supported filter condition")
|
||||||
except Exception as e:
|
#except Exception as e:
|
||||||
tdLog.info(repr(e))
|
# tdLog.info(repr(e))
|
||||||
tdLog.info("invalid operation: not supported filter condition")
|
# tdLog.info("invalid operation: not supported filter condition")
|
||||||
|
#
|
||||||
cmd3 = 'select * from normal_in_float_double_1 where in_double in (\'66666\');'
|
#cmd3 = 'select * from normal_in_float_double_1 where in_double in (\'66666\');'
|
||||||
tdLog.info(cmd3)
|
#tdLog.info(cmd3)
|
||||||
tdSql.error(cmd3)
|
#tdSql.error(cmd3)
|
||||||
try:
|
#try:
|
||||||
tdSql.execute(cmd3)
|
# tdSql.execute(cmd3)
|
||||||
tdLog.exit("invalid operation: not supported filter condition")
|
# tdLog.exit("invalid operation: not supported filter condition")
|
||||||
except Exception as e:
|
#except Exception as e:
|
||||||
tdLog.info(repr(e))
|
# tdLog.info(repr(e))
|
||||||
tdLog.info("invalid operation: not supported filter condition")
|
# tdLog.info("invalid operation: not supported filter condition")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -139,18 +139,18 @@ sql_error select * from $mt where c1 like 1
|
||||||
sql create table wh_mt1 (ts timestamp, c1 smallint, c2 int, c3 bigint, c4 float, c5 double, c6 tinyint, c7 binary(10), c8 nchar(10), c9 bool, c10 timestamp) tags (t1 binary(10), t2 smallint, t3 int, t4 bigint, t5 float, t6 double)
|
sql create table wh_mt1 (ts timestamp, c1 smallint, c2 int, c3 bigint, c4 float, c5 double, c6 tinyint, c7 binary(10), c8 nchar(10), c9 bool, c10 timestamp) tags (t1 binary(10), t2 smallint, t3 int, t4 bigint, t5 float, t6 double)
|
||||||
sql create table wh_mt1_tb1 using wh_mt1 tags ('tb11', 1, 1, 1, 1, 1)
|
sql create table wh_mt1_tb1 using wh_mt1 tags ('tb11', 1, 1, 1, 1, 1)
|
||||||
sql insert into wh_mt1_tb1 values (now, 1, 1, 1, 1, 1, 1, 'binary', 'nchar', true, '2019-01-01 00:00:00.000')
|
sql insert into wh_mt1_tb1 values (now, 1, 1, 1, 1, 1, 1, 'binary', 'nchar', true, '2019-01-01 00:00:00.000')
|
||||||
sql_error select last(*) from wh_mt1 where c1 in ('1')
|
#sql_error select last(*) from wh_mt1 where c1 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c1 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c1 in ('1')
|
||||||
sql_error select last(*) from wh_mt1 where c2 in ('1')
|
#sql_error select last(*) from wh_mt1 where c2 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c2 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c2 in ('1')
|
||||||
sql_error select last(*) from wh_mt1 where c3 in ('1')
|
#sql_error select last(*) from wh_mt1 where c3 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c3 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c3 in ('1')
|
||||||
sql_error select last(*) from wh_mt1 where c4 in ('1')
|
#sql_error select last(*) from wh_mt1 where c4 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c4 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c4 in ('1')
|
||||||
sql_error select last(*) from wh_mt1 where c5 in ('1')
|
#sql_error select last(*) from wh_mt1 where c5 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c5 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c5 in ('1')
|
||||||
sql_error select last(*) from wh_mt1 where c6 in ('1')
|
#sql_error select last(*) from wh_mt1 where c6 in ('1')
|
||||||
sql_error select last(*) from wh_mt1_tb1 where c6 in ('1')
|
#sql_error select last(*) from wh_mt1_tb1 where c6 in ('1')
|
||||||
#sql_error select last(*) from wh_mt1 where c7 in ('binary')
|
#sql_error select last(*) from wh_mt1 where c7 in ('binary')
|
||||||
#sql_error select last(*) from wh_mt1_tb1 where c7 in ('binary')
|
#sql_error select last(*) from wh_mt1_tb1 where c7 in ('binary')
|
||||||
#sql_error select last(*) from wh_mt1 where c8 in ('nchar')
|
#sql_error select last(*) from wh_mt1 where c8 in ('nchar')
|
||||||
|
|
Loading…
Reference in New Issue