diff --git a/include/libs/function/function.h b/include/libs/function/function.h
index 599b0572a0163e327ef731131deda2d2e5946671..1d1480606e593840c92e9ccc6cf6dbb096ed5413 100644
--- a/include/libs/function/function.h
+++ b/include/libs/function/function.h
@@ -186,7 +186,6 @@ typedef struct SResultDataInfo {
int32_t intermediateBytes;
} SResultDataInfo;
-
typedef struct SMultiFunctionsDesc {
bool stableQuery;
bool groupbyColumn;
@@ -224,6 +223,8 @@ const char* qGetFunctionName(int32_t functionId);
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
+tExprNode* exprdup(tExprNode* pTree);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/libs/planner/planner.h b/include/libs/planner/planner.h
index be2179d76054a45add0d4d33cf6627657ad6d330..3ccc4bf4cd038a54430d633b48aec27ffbd41ecf 100644
--- a/include/libs/planner/planner.h
+++ b/include/libs/planner/planner.h
@@ -56,7 +56,7 @@ int32_t qOptimizeQueryPlan(struct SQueryPlanNode* pQueryNode);
* @param pQueryNode
* @return
*/
-int32_t qCreateQueryPlan(const struct SQueryStmtInfo* pQueryInfo, struct SQueryPlanNode* pQueryNode);
+int32_t qCreateQueryPlan(const struct SQueryStmtInfo* pQueryInfo, struct SQueryPlanNode** pQueryNode);
/**
* Convert the query plan to string, in order to display it in the shell.
diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c
index 21d46090e561dc5457cf3cd16f70d76b706b3665..08e2172adbff44f8cb2dfc6201f06855578c37e6 100644
--- a/source/libs/catalog/src/catalog.c
+++ b/source/libs/catalog/src/catalog.c
@@ -16,7 +16,7 @@
#include "catalogInt.h"
struct SCatalog* getCatalogHandle(const SEpSet* pMgmtEps) {
- return NULL;
+ return (struct SCatalog*) 0x1;
}
int32_t catalogGetMetaData(struct SCatalog* pCatalog, const SMetaReq* pMetaReq, SMetaData* pMetaData) {
diff --git a/source/libs/function/inc/texpr.h b/source/libs/function/inc/texpr.h
index fb4ddd476c17d87a02665c5e179751414317ccdd..33190954701c92e7d9fc646c7f300f9dd5de902e 100644
--- a/source/libs/function/inc/texpr.h
+++ b/source/libs/function/inc/texpr.h
@@ -62,7 +62,6 @@ typedef struct SExprTraverseSupp {
tExprNode* exprTreeFromBinary(const void* data, size_t size);
tExprNode* exprTreeFromTableName(const char* tbnameCond);
-tExprNode* exprdup(tExprNode* pTree);
bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
diff --git a/source/libs/function/inc/tscalarfunction.h b/source/libs/function/inc/tscalarfunction.h
index 6959bc883d216d9eba2c435d72b707224a412b1f..9c87a42cfcf536d5ae77c53d3ff6cb3c17e5fcb3 100644
--- a/source/libs/function/inc/tscalarfunction.h
+++ b/source/libs/function/inc/tscalarfunction.h
@@ -28,6 +28,7 @@ extern struct SScalarFunctionInfo scalarFunc[1];
#define FUNCTION_ROUND 40
#define FUNCTION_MAVG 41
#define FUNCTION_CSUM 42
+#define FUNCCTION_CONCAT 43
#ifdef __cplusplus
}
diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c
index b8d6dd58a38ae835fc3753961a6f799750942444..372ca1bffbaba1d10863e71743f53a38da4eeac5 100644
--- a/source/libs/parser/src/astValidate.c
+++ b/source/libs/parser/src/astValidate.c
@@ -486,6 +486,12 @@ int32_t validateGroupbyNode(SQueryStmtInfo* pQueryInfo, SArray* pList, SMsgBuf*
const char* msg7 = "normal column and tags can not be mixed up in group by clause";
const char* msg8 = "normal column can only locate at the end of group by clause";
+ SGroupbyExpr* pGroupExpr = &(pQueryInfo->groupbyExpr);
+ pGroupExpr->columnInfo = taosArrayInit(4, sizeof(SColIndex));
+ if (pGroupExpr->columnInfo == NULL) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+
// todo : handle two tables situation
STableMetaInfo* pTableMetaInfo = NULL;
if (pList == NULL) {
@@ -496,12 +502,6 @@ int32_t validateGroupbyNode(SQueryStmtInfo* pQueryInfo, SArray* pList, SMsgBuf*
return buildInvalidOperationMsg(pMsgBuf, msg4);
}
- SGroupbyExpr* pGroupExpr = &(pQueryInfo->groupbyExpr);
- pGroupExpr->columnInfo = taosArrayInit(4, sizeof(SColIndex));
- if (pGroupExpr->columnInfo == NULL) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
-
size_t num = taosArrayGetSize(pList);
if (num > TSDB_MAX_TAGS) {
return buildInvalidOperationMsg(pMsgBuf, msg1);
@@ -1856,9 +1856,6 @@ static int32_t doAddAllColumnExprInSelectClause(SQueryStmtInfo *pQueryInfo, STab
}
}
-static int32_t extractFunctionParameterInfo(SQueryStmtInfo* pQueryInfo, int32_t tokenId, STableMetaInfo** pTableMetaInfo, SSchema* columnSchema,
- tExprNode** pNode, SColumnIndex* pIndex, tSqlExprItem* pParamElem, SMsgBuf* pMsgBuf);
-
static int32_t doHandleOneParam(SQueryStmtInfo *pQueryInfo, tSqlExprItem* pItem, tSqlExprItem* pParamElem, int32_t functionId,
int32_t* outputIndex, bool finalResult, SMsgBuf* pMsgBuf) {
const char* msg3 = "illegal column name";
diff --git a/source/libs/parser/src/queryInfoUtil.c b/source/libs/parser/src/queryInfoUtil.c
index 8abbb14e78c035987231b12bd83ba9b313ab93d5..21ab193157f18968d38e1d0169d44151db691dd8 100644
--- a/source/libs/parser/src/queryInfoUtil.c
+++ b/source/libs/parser/src/queryInfoUtil.c
@@ -212,7 +212,7 @@ void assignExprInfo(SExprInfo* dst, const SExprInfo* src) {
}
#endif
-// dst->pExpr = exprdup(src->pExpr);
+ dst->pExpr = exprdup(src->pExpr);
memset(dst->base.param, 0, sizeof(SVariant) * tListLen(dst->base.param));
for (int32_t j = 0; j < src->base.numOfParams; ++j) {
taosVariantAssign(&dst->base.param[j], &src->base.param[j]);
diff --git a/source/libs/parser/test/CMakeLists.txt b/source/libs/parser/test/CMakeLists.txt
index 7c90cab6d92dac7365f3944321cd49b6955a3e5b..f7d71132434eeeb4cfb375eb959a694b43162b69 100644
--- a/source/libs/parser/test/CMakeLists.txt
+++ b/source/libs/parser/test/CMakeLists.txt
@@ -8,7 +8,7 @@ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
ADD_EXECUTABLE(parserTest ${SOURCE_LIST})
TARGET_LINK_LIBRARIES(
parserTest
- PUBLIC os util common parser catalog transport gtest function
+ PUBLIC os util common parser catalog transport gtest function planner
)
TARGET_INCLUDE_DIRECTORIES(
diff --git a/source/libs/parser/test/parserTests.cpp b/source/libs/parser/test/parserTests.cpp
index 9f3683cc429be81ec7a8a18c998b1af2c12b2801..9fb50e1006e950df54521cd0fe4f9d13686d87ab 100644
--- a/source/libs/parser/test/parserTests.cpp
+++ b/source/libs/parser/test/parserTests.cpp
@@ -13,7 +13,6 @@
* along with this program. If not, see .
*/
-#include
#include
#include
#pragma GCC diagnostic ignored "-Wwrite-strings"
diff --git a/source/libs/planner/CMakeLists.txt b/source/libs/planner/CMakeLists.txt
index 0cdc018e3959ba63b175cb1e61ffaef2137881b0..23efce38f44aeee2151a985e2351c54b1b164e7b 100644
--- a/source/libs/planner/CMakeLists.txt
+++ b/source/libs/planner/CMakeLists.txt
@@ -9,4 +9,6 @@ target_include_directories(
target_link_libraries(
planner
PRIVATE os util common catalog parser transport function
-)
\ No newline at end of file
+)
+
+ADD_SUBDIRECTORY(test)
\ No newline at end of file
diff --git a/source/libs/planner/src/planner.c b/source/libs/planner/src/planner.c
index 6153db4575c48b3161fc4305b9ef7801d4d4ded2..18e63904dedeb5d14635a55d0ba343b16b6326a1 100644
--- a/source/libs/planner/src/planner.c
+++ b/source/libs/planner/src/planner.c
@@ -46,23 +46,20 @@ typedef struct SJoinCond {
static SArray* createQueryPlanImpl(SQueryStmtInfo* pQueryInfo);
static void doDestroyQueryNode(SQueryPlanNode* pQueryNode);
- int32_t qOptimizeQueryPlan(struct SQueryPlanNode* pQueryNode) {
+int32_t qOptimizeQueryPlan(struct SQueryPlanNode* pQueryNode) {
return 0;
}
-int32_t qCreateQueryPlan(const struct SQueryStmtInfo* pQueryInfo, struct SQueryPlanNode* pQueryNode) {
+int32_t qCreateQueryPlan(const struct SQueryStmtInfo* pQueryInfo, struct SQueryPlanNode** pQueryNode) {
SArray* upstream = createQueryPlanImpl((struct SQueryStmtInfo*) pQueryInfo);
assert(taosArrayGetSize(upstream) == 1);
- /*SQueryPlanNode* p = */taosArrayGetP(upstream, 0);
+ *pQueryNode = taosArrayGetP(upstream, 0);
+
taosArrayDestroy(upstream);
return TSDB_CODE_SUCCESS;
}
-int32_t qQueryPlanToString(struct SQueryPlanNode* pQueryNode, char** str) {
- return 0;
-}
-
int32_t qQueryPlanToSql(struct SQueryPlanNode* pQueryNode, char** sql) {
return 0;
}
@@ -108,10 +105,12 @@ static SQueryPlanNode* createQueryNode(int32_t type, const char* name, SQueryPla
}
pNode->numOfOutput = numOfOutput;
- pNode->pExpr = calloc(numOfOutput, sizeof(SExprInfo));
+ pNode->pExpr = taosArrayInit(numOfOutput, POINTER_BYTES);
+
for(int32_t i = 0; i < numOfOutput; ++i) {
- SExprInfo* pExprInfo = taosArrayGet(pNode->pExpr, i);
- assignExprInfo(pExprInfo, pExpr[i]);
+ SExprInfo* p = calloc(1, sizeof(SExprInfo));
+ assignExprInfo(p, pExpr[i]);
+ taosArrayPush(pNode->pExpr, &p);
}
pNode->pPrevNodes = taosArrayInit(4, POINTER_BYTES);
@@ -199,7 +198,6 @@ static SQueryPlanNode* doAddTableColumnNode(SQueryStmtInfo* pQueryInfo, STableMe
}
pNode = createQueryNode(QNODE_PROJECT, "Projection", &pNode, 1, pExpr, numOfCols, info, NULL);
-// dropAllExprInfo(pExpr);
tfree(pExpr);
}
@@ -568,14 +566,15 @@ int32_t queryPlanToStringImpl(char* buf, SQueryPlanNode* pQueryNode, int32_t lev
return len;
}
-char* queryPlanToString(SQueryPlanNode* pQueryNode) {
+int32_t qQueryPlanToString(struct SQueryPlanNode* pQueryNode, char** str) {
assert(pQueryNode);
- char* buf = calloc(1, 4096);
+ *str = calloc(1, 4096);
- int32_t len = sprintf(buf, "===== logic plan =====\n");
- queryPlanToStringImpl(buf, pQueryNode, 0, len);
- return buf;
+ int32_t len = sprintf(*str, "===== logic plan =====\n");
+ queryPlanToStringImpl(*str, pQueryNode, 0, len);
+
+ return TSDB_CODE_SUCCESS;
}
SQueryPlanNode* queryPlanFromString() {
diff --git a/source/libs/planner/test/plannerTests.cpp b/source/libs/planner/test/plannerTests.cpp
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5ede8dd15578b353953488a3104460bfd63d6cd8 100644
--- a/source/libs/planner/test/plannerTests.cpp
+++ b/source/libs/planner/test/plannerTests.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+
+#include "os.h"
+
+#include "taos.h"
+#include "parser.h"
+
+#pragma GCC diagnostic ignored "-Wwrite-strings"
+
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+
+TEST(testCase, planner_test) {
+ char msg[128] = {0};
+ const char* sql = "select top(a*b / 99, 20) from `t.1abc` interval(10s, 1s)";
+
+ SQueryStmtInfo* pQueryInfo = nullptr;
+// int32_t code = qParseQuerySql(sql, strlen(sql), &pQueryInfo, 0, msg, sizeof(msg));
+// ASSERT_EQ(code, 0);
+
+// 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);
+//
+// SArray* pExprList = pQueryInfo->exprList;
+// ASSERT_EQ(taosArrayGetSize(pExprList), 2);
+//
+// SExprInfo* p1 = (SExprInfo*)taosArrayGetP(pExprList, 1);
+// ASSERT_EQ(p1->base.uid, 110);
+// ASSERT_EQ(p1->base.numOfParams, 1);
+// ASSERT_EQ(p1->base.resSchema.type, TSDB_DATA_TYPE_DOUBLE);
+// ASSERT_STRCASEEQ(p1->base.resSchema.name, "top(a*b / 99, 20)");
+// ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
+// ASSERT_STRCASEEQ(p1->base.token, "top(a*b / 99, 20)");
+// ASSERT_EQ(p1->base.interBytes, 16);
+//
+// ASSERT_EQ(p1->pExpr->nodeType, TEXPR_UNARYEXPR_NODE);
+// ASSERT_EQ(p1->pExpr->_node.functionId, FUNCTION_TOP);
+// ASSERT_TRUE(p1->pExpr->_node.pRight == NULL);
+//
+// tExprNode* pParam = p1->pExpr->_node.pLeft;
+//
+// ASSERT_EQ(pParam->nodeType, TEXPR_BINARYEXPR_NODE);
+// ASSERT_EQ(pParam->_node.optr, TSDB_BINARY_OP_DIVIDE);
+// ASSERT_EQ(pParam->_node.pLeft->nodeType, TEXPR_BINARYEXPR_NODE);
+// ASSERT_EQ(pParam->_node.pRight->nodeType, TEXPR_VALUE_NODE);
+//
+// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
+// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 2);
+//
+// destroyQueryInfo(pQueryInfo);
+// qParserClearupMetaRequestInfo(&req);
+// destroySqlInfo(&info1);
+}
\ No newline at end of file