diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 0296b1cde9..a7577c4e4b 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -30,7 +30,6 @@ #include "tmsgtype.h" #include "ttoken.h" #include "ttokendef.h" -//#include "tutil.h" #include "tvariant.h" } @@ -784,10 +783,8 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) ADD COLUMN columnlist(A). { cmd ::= ALTER TABLE ids(X) cpxName(F) DROP COLUMN ids(A). { X.n += F.n; - toTSDBType(A.type); SArray* K = tListItemAppendToken(NULL, &A, -1); - SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&X, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN, -1); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); } diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index 545f2dd838..7fbc7e2782 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -2017,12 +2017,18 @@ int32_t extractFunctionParameterInfo(SQueryStmtInfo* pQueryInfo, int32_t tokenId static int32_t checkForkParam(tSqlExpr* pSqlExpr, size_t k, SMsgBuf* pMsgBuf) { const char* msg1 = "invalid parameters"; + SArray* pParamList = pSqlExpr->Expr.paramList; + if (k == 0) { - if (pSqlExpr->Expr.paramList != NULL && taosArrayGetSize(pSqlExpr->Expr.paramList) != 0) { + if (pParamList != NULL && taosArrayGetSize(pParamList) != 0) { return buildInvalidOperationMsg(pMsgBuf, msg1); } + } else if (k == 1) { + if (!(pParamList == NULL || taosArrayGetSize(pParamList) == k)) { + return buildInvalidOperationMsg(pMsgBuf, msg1);; + } } else { - if (pSqlExpr->Expr.paramList == NULL || taosArrayGetSize(pSqlExpr->Expr.paramList) != k) { + if (pParamList != NULL && taosArrayGetSize(pParamList) != k) { return buildInvalidOperationMsg(pMsgBuf, msg1); } } diff --git a/source/libs/parser/test/parserTests.cpp b/source/libs/parser/test/parserTests.cpp index 45b8a3627b..932613301b 100644 --- a/source/libs/parser/test/parserTests.cpp +++ b/source/libs/parser/test/parserTests.cpp @@ -406,8 +406,10 @@ TEST(testCase, function_Test10) { sqlCheck("select cov(a, b) from `t.1abc`", true); sqlCheck("select sum(length(a) + count(b)) from `t.1abc`", false); - sqlCheck("select concat(concat(a,b), concat(a,b)) from `t.1abc`", true); - sqlCheck("select length(length(length(a))) from `t.1abc`", true); + sqlCheck("select concat(concat(a,b), concat(a,b)) from `t.1abc`", true); + sqlCheck("select length(length(length(a))) from `t.1abc`", true); + sqlCheck("select count() from `t.1abc`", false); + sqlCheck("select block_dist() from `t.1abc`", true); } TEST(testCase, function_Test6) { diff --git a/source/libs/parser/test/plannerTest.cpp b/source/libs/parser/test/plannerTest.cpp index 7eb45e92d2..5d3a6a42a6 100644 --- a/source/libs/parser/test/plannerTest.cpp +++ b/source/libs/parser/test/plannerTest.cpp @@ -64,6 +64,44 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) { setSchema(&pSchema[2], TSDB_DATA_TYPE_DOUBLE, 8, "b", 2); setSchema(&pSchema[3], TSDB_DATA_TYPE_DOUBLE, 8, "col", 3); +} + +void generateLogicplan(const char* sql) { + SSqlInfo info1 = doGenerateAST(sql); + ASSERT_EQ(info1.valid, true); + + char msg[128] = {0}; + SMsgBuf buf; + buf.len = 128; + buf.buf = msg; + + SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0); + int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &buf); + ASSERT_EQ(code, 0); + + SMetaReq req = {0}; + int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128); + ASSERT_EQ(ret, 0); + ASSERT_EQ(taosArrayGetSize(req.pTableName), 1); + + SQueryStmtInfo* pQueryInfo = createQueryInfo(); + setTableMetaInfo(pQueryInfo, &req); + + SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0); + ret = validateSqlNode(pSqlNode, pQueryInfo, &buf); + ASSERT_EQ(ret, 0); + + struct SQueryPlanNode* n = nullptr; + code = qCreateQueryPlan(pQueryInfo, &n); + + char* str = NULL; + qQueryPlanToString(n, &str); + printf("%s\n", str); + + destroyQueryInfo(pQueryInfo); + qParserClearupMetaRequestInfo(&req); + destroySqlInfo(&info1); + } } @@ -123,4 +161,11 @@ TEST(testCase, planner_test) { destroyQueryInfo(pQueryInfo); qParserClearupMetaRequestInfo(&req); destroySqlInfo(&info1); +} + +TEST(testCase, displayPlan) { + generateLogicplan("select count(*) from `t.1abc`"); + generateLogicplan("select count(*) from `t.1abc` group by a"); + generateLogicplan("select count(*) from `t.1abc` interval(10s, 5s) sliding(7s)"); + generateLogicplan("select count(*),sum(a),avg(b),min(a+b) from `t.1abc`"); } \ No newline at end of file