From a47228aadd425dfdb480ab2b6765e45a8304db23 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Mon, 16 May 2022 14:24:25 +0800 Subject: [PATCH] fix: some problems of planner --- source/libs/nodes/src/nodesCodeFuncs.c | 35 +++++++++++++++++++ source/libs/parser/src/parAuthenticator.c | 7 ++-- source/libs/parser/test/parSelectTest.cpp | 10 ++++-- source/libs/planner/src/planOptimizer.c | 3 +- source/libs/planner/src/planSpliter.c | 4 +-- source/libs/planner/test/planOtherTest.cpp | 8 ++++- source/libs/planner/test/planStateTest.cpp | 4 +-- source/libs/planner/test/planSubqueryTest.cpp | 12 +++++-- source/libs/planner/test/planSysTbTest.cpp | 4 +-- 9 files changed, 71 insertions(+), 16 deletions(-) diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 57dfcaeddd..763ccbf7a0 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -584,6 +584,37 @@ static int32_t jsonToLogicProjectNode(const SJson* pJson, void* pObj) { return code; } +static const char* jkExchangeLogicPlanSrcGroupId = "SrcGroupId"; +static const char* jkExchangeLogicPlanSrcPrecision = "Precision"; + +static int32_t logicExchangeNodeToJson(const void* pObj, SJson* pJson) { + const SExchangeLogicNode* pNode = (const SExchangeLogicNode*)pObj; + + int32_t code = logicPlanNodeToJson(pObj, pJson); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkExchangeLogicPlanSrcGroupId, pNode->srcGroupId); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkExchangeLogicPlanSrcPrecision, pNode->precision); + } + + return code; +} + +static int32_t jsonToLogicExchangeNode(const SJson* pJson, void* pObj) { + SExchangeLogicNode* pNode = (SExchangeLogicNode*)pObj; + + int32_t code = jsonToLogicPlanNode(pJson, pObj); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetIntValue(pJson, jkExchangeLogicPlanSrcGroupId, &pNode->srcGroupId); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetUTinyIntValue(pJson, jkExchangeLogicPlanSrcPrecision, &pNode->precision); + } + + return code; +} + static const char* jkFillLogicPlanMode = "Mode"; static const char* jkFillLogicPlanWStartTs = "WStartTs"; static const char* jkFillLogicPlanValues = "Values"; @@ -2987,6 +3018,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { return logicProjectNodeToJson(pObj, pJson); case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF: break; + case QUERY_NODE_LOGIC_PLAN_EXCHANGE: + return logicExchangeNodeToJson(pObj, pJson); case QUERY_NODE_LOGIC_PLAN_FILL: return logicFillNodeToJson(pObj, pJson); case QUERY_NODE_LOGIC_PLAN_SORT: @@ -3083,6 +3116,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { return jsonToLogicScanNode(pJson, pObj); case QUERY_NODE_LOGIC_PLAN_PROJECT: return jsonToLogicProjectNode(pJson, pObj); + case QUERY_NODE_LOGIC_PLAN_EXCHANGE: + return jsonToLogicExchangeNode(pJson, pObj); case QUERY_NODE_LOGIC_PLAN_FILL: return jsonToLogicFillNode(pJson, pObj); case QUERY_NODE_LOGIC_PLAN_SORT: diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index ad1dca6857..250e7910d6 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -14,6 +14,7 @@ */ #include "catalog.h" +#include "cmdnodes.h" #include "parInt.h" typedef struct SAuthCxt { @@ -65,8 +66,8 @@ static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) { return code; } -static int32_t authDropUser(SAuthCxt* pCxt, SDropUserReq* pStmt) { - if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->user, TSDB_DEFAULT_USER)) { +static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) { + if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->useName, TSDB_DEFAULT_USER)) { return TSDB_CODE_PAR_PERMISSION_DENIED; } return TSDB_CODE_SUCCESS; @@ -92,7 +93,7 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { case QUERY_NODE_ALTER_USER_STMT: break; case QUERY_NODE_DROP_USER_STMT: { - return authDropUser(pCxt, (SDropUserReq*)pStmt); + return authDropUser(pCxt, (SDropUserStmt*)pStmt); } case QUERY_NODE_USE_DATABASE_STMT: case QUERY_NODE_CREATE_DNODE_STMT: diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp index 821f480b20..47424d3138 100644 --- a/source/libs/parser/test/parSelectTest.cpp +++ b/source/libs/parser/test/parSelectTest.cpp @@ -235,11 +235,17 @@ TEST_F(ParserSelectTest, semanticError) { TEST_F(ParserSelectTest, setOperator) { useDb("root", "test"); - // run("SELECT * FROM t1 UNION ALL SELECT * FROM t1"); + run("SELECT * FROM t1 UNION ALL SELECT * FROM t1"); - // run("(SELECT * FROM t1) UNION ALL (SELECT * FROM t1)"); + run("(SELECT * FROM t1) UNION ALL (SELECT * FROM t1)"); run("SELECT c1 FROM (SELECT c1 FROM t1 UNION ALL SELECT c1 FROM t1)"); } +TEST_F(ParserSelectTest, informationSchema) { + useDb("root", "test"); + + run("SELECT * FROM information_schema.user_databases WHERE name = 'information_schema'"); +} + } // namespace ParserTest diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index edac2a879f..e38c180ac6 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -392,7 +392,8 @@ static int32_t cpdCalcTimeRange(SScanLogicNode* pScan, SNode** pPrimaryKeyCond, } static int32_t cpdOptimizeScanCondition(SOptimizeContext* pCxt, SScanLogicNode* pScan) { - if (NULL == pScan->node.pConditions || OPTIMIZE_FLAG_TEST_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_CPD)) { + if (NULL == pScan->node.pConditions || OPTIMIZE_FLAG_TEST_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_CPD) || + TSDB_SYSTEM_TABLE == pScan->pMeta->tableType) { return TSDB_CODE_SUCCESS; } diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c index 1266e8ae4b..54bc24e8bb 100644 --- a/source/libs/planner/src/planSpliter.c +++ b/source/libs/planner/src/planSpliter.c @@ -303,7 +303,7 @@ static SLogicNode* unMatchByNode(SLogicNode* pNode) { } SNode* pChild; FOREACH(pChild, pNode->pChildren) { - SLogicNode* pSplitNode = uaMatchByNode((SLogicNode*)pChild); + SLogicNode* pSplitNode = unMatchByNode((SLogicNode*)pChild); if (NULL != pSplitNode) { return pSplitNode; } @@ -318,7 +318,7 @@ static int32_t unCreateExchangeNode(SSplitContext* pCxt, SLogicSubplan* pSubplan } pExchange->srcGroupId = pCxt->groupId; // pExchange->precision = pScan->pMeta->tableInfo.precision; - pExchange->node.pTargets = nodesCloneList(pAgg->node.pTargets); + pExchange->node.pTargets = nodesCloneList(pAgg->pGroupKeys); if (NULL == pExchange->node.pTargets) { return TSDB_CODE_OUT_OF_MEMORY; } diff --git a/source/libs/planner/test/planOtherTest.cpp b/source/libs/planner/test/planOtherTest.cpp index b70cb4d19a..67c09d706e 100644 --- a/source/libs/planner/test/planOtherTest.cpp +++ b/source/libs/planner/test/planOtherTest.cpp @@ -47,4 +47,10 @@ TEST_F(PlanOtherTest, explain) { run("explain analyze SELECT * FROM t1"); run("explain analyze verbose true ratio 0.01 SELECT * FROM t1"); -} \ No newline at end of file +} + +TEST_F(PlanOtherTest, show) { + useDb("root", "test"); + + run("SHOW DATABASES"); +} diff --git a/source/libs/planner/test/planStateTest.cpp b/source/libs/planner/test/planStateTest.cpp index 83c9621916..9ff035e148 100644 --- a/source/libs/planner/test/planStateTest.cpp +++ b/source/libs/planner/test/planStateTest.cpp @@ -23,13 +23,13 @@ class PlanStateTest : public PlannerTestBase {}; TEST_F(PlanStateTest, basic) { useDb("root", "test"); - run("select count(*) from t1 state_window(c1)"); + run("SELECT COUNT(*) FROM t1 STATE_WINDOW(c1)"); } TEST_F(PlanStateTest, stateExpr) { useDb("root", "test"); - run("select count(*) from t1 state_window(c1 + 10)"); + run("SELECT COUNT(*) FROM t1 STATE_WINDOW(c1 + 10)"); } TEST_F(PlanStateTest, selectFunc) { diff --git a/source/libs/planner/test/planSubqueryTest.cpp b/source/libs/planner/test/planSubqueryTest.cpp index 11e5e98052..6a7cb91bb9 100644 --- a/source/libs/planner/test/planSubqueryTest.cpp +++ b/source/libs/planner/test/planSubqueryTest.cpp @@ -25,11 +25,9 @@ TEST_F(PlanSubqeuryTest, basic) { if (0 == g_skipSql) { run("SELECT * FROM (SELECT * FROM t1)"); - - run("SELECT LAST(c1) FROM (SELECT * FROM t1)"); } - run("SELECT c1 FROM (SELECT c1 FROM t1 UNION ALL SELECT c1 FROM t1)"); + run("SELECT LAST(c1) FROM (SELECT * FROM t1)"); } TEST_F(PlanSubqeuryTest, doubleGroupBy) { @@ -39,3 +37,11 @@ TEST_F(PlanSubqeuryTest, doubleGroupBy) { "SELECT c1 + c3 a, c1 + COUNT(*) b FROM t1 WHERE c2 = 'abc' GROUP BY c1, c3) " "WHERE a > 100 GROUP BY b"); } + +TEST_F(PlanSubqeuryTest, withSetOperator) { + useDb("root", "test"); + + run("SELECT c1 FROM (SELECT c1 FROM t1 UNION ALL SELECT c1 FROM t1)"); + + run("SELECT c1 FROM (SELECT c1 FROM t1 UNION SELECT c1 FROM t1)"); +} diff --git a/source/libs/planner/test/planSysTbTest.cpp b/source/libs/planner/test/planSysTbTest.cpp index fff6bfcca4..e5c30030b3 100644 --- a/source/libs/planner/test/planSysTbTest.cpp +++ b/source/libs/planner/test/planSysTbTest.cpp @@ -27,8 +27,8 @@ TEST_F(PlanSysTableTest, show) { run("show stables"); } -TEST_F(PlanSysTableTest, information) { +TEST_F(PlanSysTableTest, informationSchema) { useDb("root", "information_schema"); - run("show tables"); + run("SELECT * FROM information_schema.user_databases WHERE name = 'information_schema'"); }