diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index f3c84c11bc..e14a43b1c2 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 73f5569a7c..ec85c704d5 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -7342,7 +7342,13 @@ static EDealRes pushDownBindSelectFunc(SNode** pNode, void* pContext) { if (nodesIsExprNode(*pNode)) { ((SExprNode*)*pNode)->bindTupleFuncIdx = pCxt->bindTupleFuncIdx; int32_t len = strlen(((SExprNode*)*pNode)->aliasName); - tsnprintf(((SExprNode*)*pNode)->aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", pCxt->bindTupleFuncIdx); + if (len + TSDB_COL_NAME_EXLEN >= TSDB_COL_NAME_LEN) { + parserWarn("The alias name is too long, the extra part will be truncated"); + tsnprintf(((SExprNode*)*pNode)->aliasName + TSDB_COL_NAME_EXLEN - TSDB_COL_NAME_EXLEN, TSDB_COL_NAME_EXLEN, ".%d", + pCxt->bindTupleFuncIdx); + } else { + tsnprintf(((SExprNode*)*pNode)->aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", pCxt->bindTupleFuncIdx); + } SFunctionNode* pFunc = (SFunctionNode*)*pNode; } return DEAL_RES_CONTINUE; @@ -7450,7 +7456,7 @@ static EDealRes rewriteSingleColsFunc(SNode** pNode, void* pContext) { return DEAL_RES_ERROR; } else { ((SExprNode*)pExpr)->asAlias = true; - tstrncpy(((SExprNode*)pExpr)->userAlias, pFunc->node.userAlias, TSDB_COL_NAME_LEN + TSDB_COL_NAME_EXLEN); + tstrncpy(((SExprNode*)pExpr)->userAlias, pFunc->node.userAlias, TSDB_COL_NAME_LEN); } } if(*pCxt->selectFuncList == NULL) { diff --git a/tests/system-test/2-query/cols_function.py b/tests/system-test/2-query/cols_function.py index fd41c3a1a1..2f46051bb7 100644 --- a/tests/system-test/2-query/cols_function.py +++ b/tests/system-test/2-query/cols_function.py @@ -180,6 +180,11 @@ class TDTestCase: tdSql.checkCols(2) tdSql.checkData(0, 0, 1734574929004) tdSql.checkData(0, 1, 4) + tdSql.query(f'select cols(last(ts), ts as t123456789t123456789t123456789t123456789t123456789t123456789t123456789, c0 cc) from {from_table}') + tdSql.checkRows(1) + tdSql.checkCols(2) + tdSql.checkData(0, 0, 1734574929004) + tdSql.checkData(0, 1, 4) tdSql.query(f'select cols(last(ts), c0, c1, c2, c3) from {from_table}') tdSql.checkRows(1) tdSql.checkCols(4) @@ -362,6 +367,24 @@ class TDTestCase: tdSql.checkData(0, 2, 1734574929000) tdSql.checkData(0, 3, 1) tdSql.checkData(0, 4, 5) + tdSql.query(f'select cols(max(c0), ts as t123456789t123456789t123456789t123456789t123456789t123456789t123456789, c1 as c11), cols(first(c0), \ + ts as t123456789t123456789t123456789t123456789t123456789t123456789t123456789, c1 c21), count(1) from {self.dbname}.meters') + 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) + tdSql.query(f'select cols(max(c0), ts as t123456789t123456789t123456789t123456789t123456789t123456789t123456789, c1 as c11), cols(first(c0), \ + ts as t123456789t123456789t123456789t123456789t123456789t123456789t123456789, c1 c21), count(1) from {self.dbname}.meters where c0 < 4') + tdSql.checkRows(1) + tdSql.checkCols(5) + tdSql.checkData(0, 0, 1734574929003) + tdSql.checkData(0, 1, 3) + tdSql.checkData(0, 2, 1734574929000) + tdSql.checkData(0, 3, 1) + tdSql.checkData(0, 4, 5) tdSql.query(f'select cols(max(c0), ts as t1, c1 as c11), cols(first(c0), ts as t2, c1 c21), count(1) from test.meters where c0 < 4 group by tbname order by t1') tdSql.checkRows(2) tdSql.checkCols(5)