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