diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 57dfcaedddcff22135d575dfa728d85cfe6a9852..763ccbf7a02a9fd3649c3e0466304aa4ccc46db0 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 ad1dca68579111b9494a41255537f604dd76f5d8..250e7910d69847a130fa4f0b2132b3dcb99da8e7 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 821f480b2003e7752599812f22fb664eb7f33493..47424d313840a78427cf908f9f929cc7994be383 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 edac2a879fa9c8d6ec10cf532872ef70c82dfba8..e38c180ac6cd852dc46d6a3e2e954e76831e2480 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 1266e8ae4ba1062d74cf7a113c445046070298b1..54bc24e8bb1233ab5adb9bdafad14568d83bdd7c 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 b70cb4d19ae99de436914d95e4192cf297b2435d..67c09d706e34ea44ab0c4070d9bbb665a15dded1 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 83c9621916a3a080d578d29cf1a1abd6f0dc94d9..9ff035e1480c5ccbf17c7ab889976c4a739d951f 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 11e5e980526c2129d2bd5a2676a47edcb619e32e..6a7cb91bb931fc5d0d22e7cefd5c2156fcf4c74a 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 fff6bfcca437887b28e70d59327a6873de13730d..e5c30030b38a9cf2444a640b9aedf940e4dd5337 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'"); }