From e7c8d9176fd3525eca8c679a2790947f6395dbaf Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 2 Jan 2024 20:37:12 +0800 Subject: [PATCH] fix: fill vartype tag with integer when create table --- source/libs/parser/src/parTranslater.c | 9 +++-- tests/system-test/2-query/tagFilter.py | 51 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c9345dd00e..2f206c1ae7 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1508,14 +1508,15 @@ static EDealRes translateNormalValue(STranslateContext* pCxt, SValueNode* pVal, } case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_GEOMETRY: { - if (strict && (pVal->node.resType.bytes > targetDt.bytes - VARSTR_HEADER_SIZE)) { - return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal); + int32_t vlen = IS_VAR_DATA_TYPE(pVal->node.resType.type) ? pVal->node.resType.bytes : strlen(pVal->literal); + if (strict && (vlen > targetDt.bytes - VARSTR_HEADER_SIZE)) { + return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_VALUE_TOO_LONG, pVal->literal); } - pVal->datum.p = taosMemoryCalloc(1, targetDt.bytes + 1); + int32_t len = TMIN(targetDt.bytes - VARSTR_HEADER_SIZE, vlen); + pVal->datum.p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE + 1); if (NULL == pVal->datum.p) { return generateDealNodeErrMsg(pCxt, TSDB_CODE_OUT_OF_MEMORY); } - int32_t len = TMIN(targetDt.bytes - VARSTR_HEADER_SIZE, pVal->node.resType.bytes); varDataSetLen(pVal->datum.p, len); strncpy(varDataVal(pVal->datum.p), pVal->literal, len); break; diff --git a/tests/system-test/2-query/tagFilter.py b/tests/system-test/2-query/tagFilter.py index b03776c31b..09ee148bb2 100644 --- a/tests/system-test/2-query/tagFilter.py +++ b/tests/system-test/2-query/tagFilter.py @@ -52,6 +52,54 @@ class TDTestCase: ) tdSql.checkRows(0) + def __ts4421(self, dbname="db", stbname='stb4421', ctbname='ctb4421'): + TAG_TYPE = ['varchar', 'nchar'] + TAG_LEN = [2, 8, 200] + TAG_VAL = [200, 123456789] + TAG_RESULT = [False, False, True, False, True, True, False, False, True, False, True, True] + + nTagCtb = 0 + for tagType in TAG_TYPE: + for tagLen in TAG_LEN: + tdSql.execute(f'create stable {dbname}.{stbname}(ts timestamp, f1 int) tags(t1 %s(%d))'%(tagType, tagLen)) + for tagVal in TAG_VAL: + if TAG_RESULT[nTagCtb] == False: + tdSql.error(f'create table {dbname}.{ctbname} using {dbname}.{stbname} tags(%d)'%(tagVal)) + tdSql.error(f'insert into {dbname}.{ctbname} using {dbname}.{stbname} tags(%d) values(now,1)'%(tagVal)) + tdSql.error(f'create table {dbname}.{ctbname} using {dbname}.{stbname} tags("%d")'%(tagVal)) + tdSql.error(f'insert into {dbname}.{ctbname} using {dbname}.{stbname} tags("%d") values(now,1)'%(tagVal)) + tdSql.error(f"create table {dbname}.{ctbname} using {dbname}.{stbname} tags('%d')"%(tagVal)) + tdSql.error(f"insert into {dbname}.{ctbname} using {dbname}.{stbname} tags('%d') values(now,1)"%(tagVal)) + else: + # integer as tag value + tdSql.execute(f'create table {dbname}.{ctbname} using {dbname}.stb4421 tags(%d)'%(tagVal)) + tdSql.execute(f'insert into {dbname}.{ctbname} values(now,1)') + tdSql.query(f'select * from {dbname}.{ctbname} where t1="%s"'%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f'drop table {dbname}.{ctbname}') + tdSql.execute(f'insert into {dbname}.{ctbname} using {dbname}.{stbname} tags(%d) values(now,1)'%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f'drop table {dbname}.{ctbname}') + # string as tag value + tdSql.execute(f'create table {dbname}.{ctbname} using {dbname}.stb4421 tags("%d")'%(tagVal)) + tdSql.execute(f'insert into {dbname}.{ctbname} values(now,1)') + tdSql.query(f'select * from {dbname}.{ctbname} where t1="%s"'%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f'drop table {dbname}.{ctbname}') + tdSql.execute(f'insert into {dbname}.{ctbname} using {dbname}.{stbname} tags("%d") values(now,1)'%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f'drop table {dbname}.{ctbname}') + tdSql.execute(f"create table {dbname}.{ctbname} using {dbname}.stb4421 tags('%d')"%(tagVal)) + tdSql.execute(f"insert into {dbname}.{ctbname} values(now,1)") + tdSql.query(f"select * from {dbname}.{ctbname} where t1='%s'"%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f"drop table {dbname}.{ctbname}") + tdSql.execute(f"insert into {dbname}.{ctbname} using {dbname}.{stbname} tags('%d') values(now,1)"%(tagVal)) + tdSql.checkRows(1) + tdSql.execute(f"drop table {dbname}.{ctbname}") + nTagCtb += 1 + tdSql.execute(f'drop table {dbname}.{stbname}') + def run(self): tdLog.printNoPrefix("==========step1:create table") self.__create_tb() @@ -59,6 +107,9 @@ class TDTestCase: tdLog.printNoPrefix("==========step2:query data") self.__query_data(10) + tdLog.printNoPrefix("==========step3:check ts4421") + self.__ts4421() + def stop(self): tdSql.close() tdLog.success(f"{__file__} successfully executed")