diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 6224345a39..5fae336d22 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -55,8 +55,8 @@ typedef struct SDataType { typedef struct SExprNode { ENodeType type; SDataType resType; - char aliasName[TSDB_COL_NAME_LEN + TSDB_COL_NAME_EXLEN]; - char userAlias[TSDB_COL_NAME_LEN + TSDB_COL_NAME_EXLEN]; + char aliasName[TSDB_COL_NAME_LEN]; + char userAlias[TSDB_COL_NAME_LEN]; SArray* pAssociation; bool asAlias; bool asParam; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 27688d7366..716f16f6c6 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3572,6 +3572,23 @@ static int32_t getGroupByErrorCode(STranslateContext* pCxt) { return TSDB_CODE_PAR_INVALID_OPTR_USAGE; } +static void rewriteAliasNameWithRelate(SFunctionNode* pFunc, SExprNode* pExpr) { + if (isRelatedToOtherExpr(pExpr)) { + int len = strlen(pExpr->aliasName); + if (len + TSDB_COL_NAME_EXLEN >= TSDB_COL_NAME_LEN) { + char buffer[TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1] = {0}; + tsnprintf(buffer, sizeof(buffer), "%s.%d", pExpr->aliasName, pExpr->relatedTo); + uint64_t hashVal = MurmurHash3_64(buffer, TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1); + tsnprintf(pFunc->node.aliasName, TSDB_COL_NAME_EXLEN, "%" PRIu64, hashVal); + } else { + tstrncpy(pFunc->node.aliasName, pExpr->aliasName, TSDB_COL_NAME_LEN); + tsnprintf(pFunc->node.aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", pExpr->relatedTo); + } + } else { + tstrncpy(pFunc->node.aliasName, pExpr->aliasName, TSDB_COL_NAME_LEN); + } +} + static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode) { SFunctionNode* pFunc = NULL; int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); @@ -3580,15 +3597,9 @@ static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode return DEAL_RES_ERROR; } tstrncpy(pFunc->functionName, "_select_value", TSDB_FUNC_NAME_LEN); - tstrncpy(pFunc->node.aliasName, ((SExprNode*)*pNode)->aliasName, TSDB_COL_NAME_LEN); tstrncpy(pFunc->node.userAlias, ((SExprNode*)*pNode)->userAlias, TSDB_COL_NAME_LEN); - if (isRelatedToOtherExpr((SExprNode*)*pNode)) { - int len = strlen(((SExprNode*)*pNode)->aliasName); - if (len + TSDB_COL_NAME_EXLEN >= TSDB_COL_NAME_LEN) { - parserWarn("%s The alias name is too long, the extra part will be truncated", __func__); - } - tsnprintf(pFunc->node.aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", ((SExprNode*)*pNode)->relatedTo); - } + rewriteAliasNameWithRelate(pFunc, (SExprNode*)*pNode); + pFunc->node.relatedTo = ((SExprNode*)*pNode)->relatedTo; pFunc->node.bindExprID = ((SExprNode*)*pNode)->bindExprID; pCxt->errCode = nodesListMakeAppend(&pFunc->pParameterList, *pNode); diff --git a/tests/script/tsim/stream/basic1.sim b/tests/script/tsim/stream/basic1.sim index 0d89f528d1..9d31b1e073 100644 --- a/tests/script/tsim/stream/basic1.sim +++ b/tests/script/tsim/stream/basic1.sim @@ -809,7 +809,6 @@ sql create stable st(ts timestamp, a int, b int , c int) tags(ta int,tb int,tc i sql create table ts1 using st tags(1,1,1); sql create stream streams5 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt5 as select count(*), _wstart, _wend, max(a) from ts1 interval(10s) ; sql create stream streams6 trigger at_once IGNORE EXPIRED 0 IGNORE UPDATE 0 into streamt6 as select count(*), _wstart, _wend, max(a), _wstart as ts from ts1 interval(10s) ; - run tsim/stream/checkTaskStatus.sim sql_error create stream streams7 trigger at_once into streamt7 as select _wstart, count(*), _wstart, _wend, max(a) from ts1 interval(10s) ; @@ -833,14 +832,14 @@ if $loop_count == 10 then endi if $rows != 1 then - print =====rows=$rows + print ===== streamt5: rows=$rows goto loop170 endi sql select * from streamt6; if $rows != 1 then - print =====rows=$rows + print ===== streamt6: rows=$rows goto loop170 endi diff --git a/tests/system-test/2-query/cols_function.py b/tests/system-test/2-query/cols_function.py index 29ca667e3a..1dd0fec40a 100644 --- a/tests/system-test/2-query/cols_function.py +++ b/tests/system-test/2-query/cols_function.py @@ -530,6 +530,29 @@ class TDTestCase: tdSql.checkData(0, 4, 1) tdSql.error(f'select c1 from (select cols(last_row(c0), ts as t1, c1), cols(first(c0), ts as t2, c1), first(c0) from test.meters where c0 < 4)') + tdSql.query(f'select c11, _rowts from (select cols(last_row(c0), ts as t1, c1 as c11), cols(first(c0), ts as t2, c1 c21), first(c0) from test.meters where c0 < 4)') + tdSql.checkRows(1) + tdSql.checkCols(2) + tdSql.checkData(0, 0, 3) + tdSql.query(f'select c11, c21, _rowts from (select cols(last_row(c0), ts as t1, c1 as c11), cols(first(c0), ts as t2, c1 c21), first(c0) from test.meters where c0 < 4)') + tdSql.checkRows(1) + tdSql.checkCols(3) + tdSql.checkData(0, 0, 3) + tdSql.checkData(0, 1, 1) + tdSql.query(f'select c1, c21, _rowts from (select cols(last_row(c0), ts as t1, c1), cols(first(c0), ts as t2, c1 c21), first(c0) from test.meters where c0 < 4)') + tdSql.checkRows(1) + tdSql.checkCols(3) + tdSql.checkData(0, 0, 3) + tdSql.checkData(0, 1, 1) + tdSql.query(f'select *, _rowts from (select cols(last_row(c0), ts as t1, c1), cols(first(c0), ts as t2, c1 c21), first(c0) from test.meters where c0 < 4)') + tdSql.checkRows(1) + tdSql.checkCols(6) + tdSql.checkData(0, 1, 3) + tdSql.checkData(0, 3, 1) + tdSql.checkData(0, 4, 1) + tdSql.error(f'select c1, _rowts from (select cols(last_row(c0), ts as t1, c1), cols(first(c0), ts as t2, c1), first(c0) from test.meters where c0 < 4)') + + # cols on system table tdSql.query(f'select cols(max(vgroup_id), uid) from information_schema.ins_tables') tdSql.checkRows(1) @@ -680,25 +703,25 @@ class TDTestCase: tdSql.checkData(0, 2, 1734574929000) tdSql.checkData(0, 3, 6) - def orderby_test(self, from_table = 'test.meters', isTmpTable = False): + def orderby_test(self, from_table = 'test.meters', col_name='c0', isTmpTable = False): select_t1 = ["", ", t1", ", t1 as tag1"] for t1 in select_t1: if t1 != "" and isTmpTable: # Not a GROUP BY expression - tdSql.error(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') - tdSql.error(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') - tdSql.error(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') - tdSql.error(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') - tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') - tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') - tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') - tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') - tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') - tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') - tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') - tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') + tdSql.error(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') + tdSql.error(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') + tdSql.error(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') + tdSql.error(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') + tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') + tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') + tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') + tdSql.error(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') + tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') + tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') + tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') + tdSql.error(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') continue - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') tdSql.checkRows(2) tags_count = 0 if t1 == "" else 1 tdLog.debug(f'tags_count: {tags_count}') @@ -710,7 +733,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st2') - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -720,7 +743,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -730,7 +753,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by 1') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by 1') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -740,7 +763,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by 2') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by 2') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 5) @@ -750,7 +773,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st2') - tdSql.query(f'select count(1), cols(last(c0),c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') + tdSql.query(f'select count(1), cols(last({col_name}),c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -760,7 +783,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') + tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 5) @@ -770,7 +793,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st2') - tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') + tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -780,7 +803,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') + tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -790,7 +813,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') + tdSql.query(f'select count(1), last(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -800,7 +823,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'bbbbbbbbb2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2)') + tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2)') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 5) @@ -810,7 +833,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st2') - tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c2) desc') + tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), c2) desc') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -820,7 +843,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0)') + tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name})') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -830,7 +853,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'c2') self.condition_check(t1 != "", 1, 2, 'st1') - tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last(c0), c0), cols(last(c0), c1)') + tdSql.query(f'select count(1), max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') tdSql.checkRows(2) tdSql.checkCols(2 + tags_count) tdSql.checkData(0, 0, 1) @@ -838,7 +861,15 @@ class TDTestCase: self.condition_check(t1 != "", 0, 2, 'st2') tdSql.checkData(1, 0, 5) tdSql.checkData(1, 1, 'c2') - self.condition_check(t1 != "", 1, 2, 'st1') + self.condition_check(t1 != "", 1, 2, 'st1') + + tdSql.query(f'select _rowts, max(c2) {t1} from {from_table} group by tbname order by cols(last({col_name}), {col_name}), cols(last({col_name}), c1)') + tdSql.checkRows(2) + tdSql.checkCols(2 + tags_count) + tdSql.checkData(0, 1, 'c2') + self.condition_check(t1 != "", 0, 2, 'st2') + tdSql.checkData(1, 1, 'c2') + self.condition_check(t1 != "", 1, 2, 'st1') def parse_test(self): tdLog.info("parse test") @@ -883,9 +914,9 @@ class TDTestCase: tdSql.query(f'select count(1), cols(last(c0),c0) from (select *, tbname from test.meters) group by tbname') tdLog.info("subquery_test: orderby_test from meters") - self.orderby_test("test.meters", False) + self.orderby_test("test.meters", "c0", False) tdLog.info("subquery_test: orderby_test from (select *, tbname from meters)") - self.orderby_test("(select *, tbname from test.meters)", True) + self.orderby_test("(select *, tbname from test.meters)", "c0", True) tdLog.info("subquery_test: one_cols_multi_output_with_group_test from meters") self.one_cols_multi_output_with_group_test("test.meters", False) tdLog.info("subquery_test: one_cols_multi_output_with_group_test from (select *, tbname from meters)") @@ -893,8 +924,7 @@ class TDTestCase: self.one_cols_multi_output_test("test.meters") self.one_cols_multi_output_test("(select *, tbname from test.meters)") - - + def window_test(self): tdSql.query(f'select tbname, _wstart,_wend, max(c0), max(c1), cols( max(c0), c1) from test.meters partition \ by tbname count_window(2) order by tbname') @@ -962,7 +992,35 @@ class TDTestCase: tdSql.checkData(0, 1, 1734574929011) tdSql.checkData(0, 2, 1734574929012) tdSql.checkData(0, 3, 1734574929013) + + def long_column_name_test(self): + tdSql.execute(f'use {self.dbname}') + tdSql.execute(f'create table {self.dbname}.long_col_test (ts timestamp, longcolumntestlongcolumntestlongcolumntestlongcolumntest88888888 int, c1 float, c2 nchar(30), c3 bool) tags (t1 nchar(30))') + tdSql.execute(f'create table {self.dbname}.dl0 using {self.dbname}.long_col_test tags("st1")') + tdSql.execute(f'create table {self.dbname}.dl1 using {self.dbname}.long_col_test tags("st2")') + tdSql.execute(f'insert into {self.dbname}.dl0 values(1734574929000, 1, 1, "c2", true)') + tdSql.execute(f'insert into {self.dbname}.dl0 values(1734574929001, 2, 2, "bbbbbbbbb1", false)') + tdSql.execute(f'insert into {self.dbname}.dl0 values(1734574929002, 2, 2, "bbbbbbbbb1", false)') + tdSql.execute(f'insert into {self.dbname}.dl0 values(1734574929003, 3, 3, "a2", true)') + tdSql.execute(f'insert into {self.dbname}.dl0 values(1734574929004, 4, 4, "bbbbbbbbb2", false)') + tdSql.execute(f'insert into {self.dbname}.dl1 values(1734574929000, 1, 1, "c2", true)') + + tdSql.query(f'select cols(last(longcolumntestlongcolumntestlongcolumntestlongcolumntest88888888),ts lts, c1 lc1), cols(first(longcolumntestlongcolumntestlongcolumntestlongcolumntest88888888), ts fts, c1 as fc1), count(1) from test.long_col_test') + tdSql.checkResColNameList(['lts', 'lc1', 'fts', 'fc1', 'count(1)']) + tdSql.checkRows(1) + tdSql.checkCols(5) + tdSql.checkData(0, 0, 1734574929004) + tdSql.checkData(0, 1, 4) + tdSql.checkData(0, 2, 1734574929000) + tdSql.checkData(0, 3, 1) + tdSql.checkData(0, 4, 6) + + tdLog.info("long_column_name_test subquery_test: orderby_test from meters") + self.orderby_test("test.long_col_test", "longcolumntestlongcolumntestlongcolumntestlongcolumntest88888888", False) + tdLog.info("long_column_name_test subquery_test: orderby_test from (select *, tbname from meters)") + self.orderby_test("(select *, tbname from test.long_col_test)", "longcolumntestlongcolumntestlongcolumntestlongcolumntest88888888", True) + tdLog.info("long_column_name_test subquery_test: one_cols_multi_output_with_group_test from meters") def run(self): self.funcNestTest() @@ -976,6 +1034,7 @@ class TDTestCase: self.join_test() self.stream_cols_test() self.include_null_test() + self.long_column_name_test() def stop(self):