Merge pull request #12531 from taosdata/feature/3.0_wxy
fix: some problems of planner
This commit is contained in:
commit
f199ce48e4
|
@ -584,6 +584,37 @@ static int32_t jsonToLogicProjectNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
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* jkFillLogicPlanMode = "Mode";
|
||||||
static const char* jkFillLogicPlanWStartTs = "WStartTs";
|
static const char* jkFillLogicPlanWStartTs = "WStartTs";
|
||||||
static const char* jkFillLogicPlanValues = "Values";
|
static const char* jkFillLogicPlanValues = "Values";
|
||||||
|
@ -2987,6 +3018,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return logicProjectNodeToJson(pObj, pJson);
|
return logicProjectNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF:
|
case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF:
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
|
||||||
|
return logicExchangeNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_FILL:
|
case QUERY_NODE_LOGIC_PLAN_FILL:
|
||||||
return logicFillNodeToJson(pObj, pJson);
|
return logicFillNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_LOGIC_PLAN_SORT:
|
case QUERY_NODE_LOGIC_PLAN_SORT:
|
||||||
|
@ -3083,6 +3116,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToLogicScanNode(pJson, pObj);
|
return jsonToLogicScanNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
||||||
return jsonToLogicProjectNode(pJson, pObj);
|
return jsonToLogicProjectNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
|
||||||
|
return jsonToLogicExchangeNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_FILL:
|
case QUERY_NODE_LOGIC_PLAN_FILL:
|
||||||
return jsonToLogicFillNode(pJson, pObj);
|
return jsonToLogicFillNode(pJson, pObj);
|
||||||
case QUERY_NODE_LOGIC_PLAN_SORT:
|
case QUERY_NODE_LOGIC_PLAN_SORT:
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
|
#include "cmdnodes.h"
|
||||||
#include "parInt.h"
|
#include "parInt.h"
|
||||||
|
|
||||||
typedef struct SAuthCxt {
|
typedef struct SAuthCxt {
|
||||||
|
@ -65,8 +66,8 @@ static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserReq* pStmt) {
|
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
|
||||||
if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->user, TSDB_DEFAULT_USER)) {
|
if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->useName, TSDB_DEFAULT_USER)) {
|
||||||
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -92,7 +93,7 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
|
||||||
case QUERY_NODE_ALTER_USER_STMT:
|
case QUERY_NODE_ALTER_USER_STMT:
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_DROP_USER_STMT: {
|
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_USE_DATABASE_STMT:
|
||||||
case QUERY_NODE_CREATE_DNODE_STMT:
|
case QUERY_NODE_CREATE_DNODE_STMT:
|
||||||
|
|
|
@ -235,11 +235,17 @@ TEST_F(ParserSelectTest, semanticError) {
|
||||||
TEST_F(ParserSelectTest, setOperator) {
|
TEST_F(ParserSelectTest, setOperator) {
|
||||||
useDb("root", "test");
|
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)");
|
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
|
} // namespace ParserTest
|
||||||
|
|
|
@ -392,7 +392,8 @@ static int32_t cpdCalcTimeRange(SScanLogicNode* pScan, SNode** pPrimaryKeyCond,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t cpdOptimizeScanCondition(SOptimizeContext* pCxt, SScanLogicNode* pScan) {
|
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;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -303,7 +303,7 @@ static SLogicNode* unMatchByNode(SLogicNode* pNode) {
|
||||||
}
|
}
|
||||||
SNode* pChild;
|
SNode* pChild;
|
||||||
FOREACH(pChild, pNode->pChildren) {
|
FOREACH(pChild, pNode->pChildren) {
|
||||||
SLogicNode* pSplitNode = uaMatchByNode((SLogicNode*)pChild);
|
SLogicNode* pSplitNode = unMatchByNode((SLogicNode*)pChild);
|
||||||
if (NULL != pSplitNode) {
|
if (NULL != pSplitNode) {
|
||||||
return pSplitNode;
|
return pSplitNode;
|
||||||
}
|
}
|
||||||
|
@ -318,7 +318,7 @@ static int32_t unCreateExchangeNode(SSplitContext* pCxt, SLogicSubplan* pSubplan
|
||||||
}
|
}
|
||||||
pExchange->srcGroupId = pCxt->groupId;
|
pExchange->srcGroupId = pCxt->groupId;
|
||||||
// pExchange->precision = pScan->pMeta->tableInfo.precision;
|
// pExchange->precision = pScan->pMeta->tableInfo.precision;
|
||||||
pExchange->node.pTargets = nodesCloneList(pAgg->node.pTargets);
|
pExchange->node.pTargets = nodesCloneList(pAgg->pGroupKeys);
|
||||||
if (NULL == pExchange->node.pTargets) {
|
if (NULL == pExchange->node.pTargets) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,10 @@ TEST_F(PlanOtherTest, explain) {
|
||||||
run("explain analyze SELECT * FROM t1");
|
run("explain analyze SELECT * FROM t1");
|
||||||
|
|
||||||
run("explain analyze verbose true ratio 0.01 SELECT * FROM t1");
|
run("explain analyze verbose true ratio 0.01 SELECT * FROM t1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PlanOtherTest, show) {
|
||||||
|
useDb("root", "test");
|
||||||
|
|
||||||
|
run("SHOW DATABASES");
|
||||||
|
}
|
||||||
|
|
|
@ -23,13 +23,13 @@ class PlanStateTest : public PlannerTestBase {};
|
||||||
TEST_F(PlanStateTest, basic) {
|
TEST_F(PlanStateTest, basic) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("select count(*) from t1 state_window(c1)");
|
run("SELECT COUNT(*) FROM t1 STATE_WINDOW(c1)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PlanStateTest, stateExpr) {
|
TEST_F(PlanStateTest, stateExpr) {
|
||||||
useDb("root", "test");
|
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) {
|
TEST_F(PlanStateTest, selectFunc) {
|
||||||
|
|
|
@ -25,11 +25,9 @@ TEST_F(PlanSubqeuryTest, basic) {
|
||||||
|
|
||||||
if (0 == g_skipSql) {
|
if (0 == g_skipSql) {
|
||||||
run("SELECT * FROM (SELECT * FROM t1)");
|
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) {
|
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) "
|
"SELECT c1 + c3 a, c1 + COUNT(*) b FROM t1 WHERE c2 = 'abc' GROUP BY c1, c3) "
|
||||||
"WHERE a > 100 GROUP BY b");
|
"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)");
|
||||||
|
}
|
||||||
|
|
|
@ -27,8 +27,8 @@ TEST_F(PlanSysTableTest, show) {
|
||||||
run("show stables");
|
run("show stables");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PlanSysTableTest, information) {
|
TEST_F(PlanSysTableTest, informationSchema) {
|
||||||
useDb("root", "information_schema");
|
useDb("root", "information_schema");
|
||||||
|
|
||||||
run("show tables");
|
run("SELECT * FROM information_schema.user_databases WHERE name = 'information_schema'");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue