From 2136157eb8425d61277e58f767d35d9652642457 Mon Sep 17 00:00:00 2001 From: wpan Date: Fri, 27 Aug 2021 15:39:13 +0800 Subject: [PATCH] fix DERIVATIVE query from nested stable query issue --- src/client/src/tscSQLParser.c | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 0864095a21..52924401fc 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -3491,6 +3491,27 @@ static bool groupbyTagsOrNull(SQueryInfo* pQueryInfo) { return true; } +bool groupbyTbname(SQueryInfo* pQueryInfo) { + if (pQueryInfo->groupbyExpr.columnInfo == NULL || + taosArrayGetSize(pQueryInfo->groupbyExpr.columnInfo) == 0) { + return false; + } + + size_t s = taosArrayGetSize(pQueryInfo->groupbyExpr.columnInfo); + for (int32_t i = 0; i < s; i++) { + SColIndex* colIndex = taosArrayGet(pQueryInfo->groupbyExpr.columnInfo, i); + if (colIndex->colIndex == TSDB_TBNAME_COLUMN_INDEX) { + return true; + } + } + + return false; +} + + + + + static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool twQuery) { int32_t startIdx = 0; int32_t aggUdf = 0; @@ -7118,6 +7139,33 @@ int32_t doFunctionsCompatibleCheck(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, char* } } + +int32_t validateFunctionFromUpstream(SQueryInfo* pQueryInfo, char* msg) { + const char* msg1 = "TWA/Diff/Derivative/Irate are not allowed to apply to super table without group by tbname"; + + int32_t numOfExprs = (int32_t)tscNumOfExprs(pQueryInfo); + size_t upNum = taosArrayGetSize(pQueryInfo->pUpstream); + + for (int32_t i = 0; i < numOfExprs; ++i) { + SExprInfo* pExpr = tscExprGet(pQueryInfo, i); + + int32_t f = pExpr->base.functionId; + if (f == TSDB_FUNC_DERIVATIVE || f == TSDB_FUNC_TWA || f == TSDB_FUNC_IRATE || f == TSDB_FUNC_DIFF) { + for (int32_t j = 0; j < upNum; ++j) { + SQueryInfo* pUp = taosArrayGetP(pQueryInfo->pUpstream, j); + if (groupbyTbname(pUp)) { + return TSDB_CODE_SUCCESS; + } + } + + return invalidOperationMsg(msg, msg1); + } + } + + return TSDB_CODE_SUCCESS; +} + + int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode) { const char* msg1 = "only one expression allowed"; const char* msg2 = "invalid expression in select clause"; @@ -8664,6 +8712,10 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf return code; } + if ((code = validateFunctionFromUpstream(pQueryInfo, tscGetErrorMsgPayload(pCmd))) != TSDB_CODE_SUCCESS) { + return code; + } + // updateFunctionInterBuf(pQueryInfo, false); updateLastScanOrderIfNeeded(pQueryInfo); -- GitLab