diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index 2a0d02dc91..5d1ff936dd 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -2652,14 +2652,12 @@ static int32_t validateScalarFunctionParamNum(tSqlExpr* pSqlExpr, int32_t functi return code; } +// todo merge with the addScalarExprAndResColumn int32_t doAddOneProjectCol(SQueryStmtInfo* pQueryInfo, int32_t outputColIndex, SSchema* pSchema, const char* aliasName, int32_t colId, SMsgBuf* pMsgBuf) { const char* name = (aliasName == NULL)? pSchema->name:aliasName; SSchema s = createSchema(pSchema->type, pSchema->bytes, colId, name); - tExprNode *pNode = NULL; - bool keepTableCols = true; - SArray* pColumnList = taosArrayInit(4, sizeof(SColumn)); SToken colNameToken = {.z = pSchema->name, .n = strlen(pSchema->name)}; @@ -2667,7 +2665,9 @@ int32_t doAddOneProjectCol(SQueryStmtInfo* pQueryInfo, int32_t outputColIndex, S sqlNode.type = SQL_NODE_TABLE_COLUMN; sqlNode.columnName = colNameToken; - int32_t ret = sqlExprToExprNode(&pNode, &sqlNode, pQueryInfo, pColumnList, &keepTableCols, pMsgBuf); + tExprNode* pNode = NULL; + bool keepTableCols = true; + int32_t ret = sqlExprToExprNode(&pNode, &sqlNode, pQueryInfo, pColumnList, &keepTableCols, pMsgBuf); if (ret != TSDB_CODE_SUCCESS) { tExprTreeDestroy(pNode, NULL); return buildInvalidOperationMsg(pMsgBuf, "invalid expression in select clause"); @@ -2689,6 +2689,12 @@ int32_t doAddOneProjectCol(SQueryStmtInfo* pQueryInfo, int32_t outputColIndex, S } pExpr->base.numOfCols = num; + + if (pQueryInfo->exprListLevelIndex == 0) { + int32_t exists = getNumOfFields(&pQueryInfo->fieldsInfo); + addResColumnInfo(pQueryInfo, exists, &pExpr->base.resSchema, pExpr); + } + return TSDB_CODE_SUCCESS; } @@ -2923,17 +2929,29 @@ static tExprNode* doCreateColumnNode(SQueryStmtInfo* pQueryInfo, SColumnIndex* p pExpr->nodeType = TEXPR_COL_NODE; pExpr->pSchema = calloc(1, sizeof(SSchema)); - SSchema* pSchema = getOneColumnSchema(pTableMeta, pIndex->columnIndex); + + SSchema* pSchema = NULL; + if (pIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX) { + pSchema = getTbnameColumnSchema(); + } else { + pSchema = getOneColumnSchema(pTableMeta, pIndex->columnIndex); + } + *(SSchema*)(pExpr->pSchema) = *pSchema; - if (keepTableCols) { + if (keepTableCols && TSDB_COL_IS_NORMAL_COL(pIndex->type)) { SColumn c = createColumn(pTableMeta->uid, pTableMetaInfo->aliasName, pIndex->type, pExpr->pSchema); taosArrayPush(pCols, &c); } - columnListInsert(pQueryInfo->colList, pTableMeta->uid, pSchema, TSDB_COL_NORMAL); - SSchema* pTsSchema = getOneColumnSchema(pTableMeta, 0); - insertPrimaryTsColumn(pQueryInfo->colList, pTsSchema->name, pTableMeta->uid); + if (TSDB_COL_IS_NORMAL_COL(pIndex->type)) { + columnListInsert(pQueryInfo->colList, pTableMeta->uid, pSchema, TSDB_COL_NORMAL); + SSchema* pTsSchema = getOneColumnSchema(pTableMeta, 0); + insertPrimaryTsColumn(pQueryInfo->colList, pTsSchema->name, pTableMeta->uid); + } else { + columnListInsert(pTableMetaInfo->tagColList, pTableMeta->uid, pSchema, TSDB_COL_TAG); + } + return pExpr; } @@ -3231,26 +3249,6 @@ int32_t sqlExprToExprNode(tExprNode **pExpr, const tSqlExpr* pSqlExpr, SQueryStm return TSDB_CODE_SUCCESS; } -static int32_t multiColumnListInsert(SQueryStmtInfo* pQueryInfo, SArray* pColumnList, SMsgBuf* pMsgBuf) { - const char* msg1 = "tag can not be used in expression"; - - SColumn* p1 = taosArrayGet(pColumnList, 0); - - size_t numOfNode = taosArrayGetSize(pColumnList); - for(int32_t k = 0; k < numOfNode; ++k) { - SColumn* p = taosArrayGet(pColumnList, k); - if (TSDB_COL_IS_TAG(p->flag)) { - return buildInvalidOperationMsg(pMsgBuf, msg1); - } - - SSchema s = createSchema(p->info.type, p->info.bytes, p->info.colId, p->name); - columnListInsert(pQueryInfo->colList, p->uid, &s, p->flag); - } - - insertPrimaryTsColumn(pQueryInfo->colList, NULL, p1->uid); - return TSDB_CODE_SUCCESS; -} - static int32_t addScalarExprAndResColumn(SQueryStmtInfo* pQueryInfo, int32_t exprIndex, tSqlExprItem* pItem, SMsgBuf* pMsgBuf) { SArray* pColumnList = taosArrayInit(4, sizeof(SColumn)); SSchema s = createSchema(TSDB_DATA_TYPE_DOUBLE, sizeof(double), getNewResColId(), "");