From df277167c8f175d301cb828af3608e079652d6d4 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 20 Jan 2022 16:41:42 -0500 Subject: [PATCH 01/37] TD-13120 SELECT statement data structure definition --- include/nodes/nodes.h | 18 ++++++------ source/libs/parser/inc/new_sql.y | 0 source/libs/parser/src/astTranslate.c | 18 ++++++++++++ .../src/{nodesClone.c => nodesCloneFuncs.c} | 2 +- .../src/{nodesCode.c => nodesCodeFuncs.c} | 4 +-- .../src/{nodesEqual.c => nodesEqualFuncs.c} | 6 ++-- .../{nodesTraverse.c => nodesTraverseFuncs.c} | 28 +++++++++---------- .../src/{nodesUtil.c => nodesUtilFuncs.c} | 4 +-- src/connector/go | 1 + src/connector/grafanaplugin | 1 + src/connector/hivemq-tdengine-extension | 1 + 11 files changed, 52 insertions(+), 31 deletions(-) create mode 100644 source/libs/parser/inc/new_sql.y create mode 100644 source/libs/parser/src/astTranslate.c rename source/nodes/src/{nodesClone.c => nodesCloneFuncs.c} (93%) rename source/nodes/src/{nodesCode.c => nodesCodeFuncs.c} (82%) rename source/nodes/src/{nodesEqual.c => nodesEqualFuncs.c} (95%) rename source/nodes/src/{nodesTraverse.c => nodesTraverseFuncs.c} (61%) rename source/nodes/src/{nodesUtil.c => nodesUtilFuncs.c} (86%) create mode 160000 src/connector/go create mode 160000 src/connector/grafanaplugin create mode 160000 src/connector/hivemq-tdengine-extension diff --git a/include/nodes/nodes.h b/include/nodes/nodes.h index e6b41adf14..a9ca769042 100644 --- a/include/nodes/nodes.h +++ b/include/nodes/nodes.h @@ -249,20 +249,20 @@ typedef struct SSetOperator { typedef bool (*FQueryNodeWalker)(SNode* pNode, void* pContext); -bool nodeArrayWalker(SArray* pArray, FQueryNodeWalker walker, void* pContext); -bool nodeTreeWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext); +bool nodesWalkArray(SArray* pArray, FQueryNodeWalker walker, void* pContext); +bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext); -bool stmtWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext); +bool nodesWalkStmt(SNode* pNode, FQueryNodeWalker walker, void* pContext); -bool nodeEqual(const SNode* a, const SNode* b); +bool nodesEqualNode(const SNode* a, const SNode* b); -void cloneNode(const SNode* pNode); +void nodesCloneNode(const SNode* pNode); -int32_t nodeToString(const SNode* pNode, char** pStr, int32_t* pLen); -int32_t stringToNode(const char* pStr, SNode** pNode); +int32_t nodesNodeToString(const SNode* pNode, char** pStr, int32_t* pLen); +int32_t nodesStringToNode(const char* pStr, SNode** pNode); -bool isTimeorderQuery(const SNode* pQuery); -bool isTimelineQuery(const SNode* pQuery); +bool nodesIsTimeorderQuery(const SNode* pQuery); +bool nodesIsTimelineQuery(const SNode* pQuery); #ifdef __cplusplus } diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y new file mode 100644 index 0000000000..e69de29bb2 diff --git a/source/libs/parser/src/astTranslate.c b/source/libs/parser/src/astTranslate.c new file mode 100644 index 0000000000..4c649e0ecc --- /dev/null +++ b/source/libs/parser/src/astTranslate.c @@ -0,0 +1,18 @@ +/* + * 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 . + */ + +int32_t doTranslate() { + +} diff --git a/source/nodes/src/nodesClone.c b/source/nodes/src/nodesCloneFuncs.c similarity index 93% rename from source/nodes/src/nodesClone.c rename to source/nodes/src/nodesCloneFuncs.c index 04f6df5623..2d0a6483ae 100644 --- a/source/nodes/src/nodesClone.c +++ b/source/nodes/src/nodesCloneFuncs.c @@ -15,6 +15,6 @@ #include "nodes.h" -void cloneNode(const SNode* pNode) { +void nodesCloneNode(const SNode* pNode) { } diff --git a/source/nodes/src/nodesCode.c b/source/nodes/src/nodesCodeFuncs.c similarity index 82% rename from source/nodes/src/nodesCode.c rename to source/nodes/src/nodesCodeFuncs.c index 7fe919ffe8..b31980d150 100644 --- a/source/nodes/src/nodesCode.c +++ b/source/nodes/src/nodesCodeFuncs.c @@ -15,10 +15,10 @@ #include "nodes.h" -int32_t nodeToString(const SNode* pNode, char** pStr, int32_t* pLen) { +int32_t nodesNodeToString(const SNode* pNode, char** pStr, int32_t* pLen) { } -int32_t stringToNode(const char* pStr, SNode** pNode) { +int32_t nodesStringToNode(const char* pStr, SNode** pNode) { } diff --git a/source/nodes/src/nodesEqual.c b/source/nodes/src/nodesEqualFuncs.c similarity index 95% rename from source/nodes/src/nodesEqual.c rename to source/nodes/src/nodesEqualFuncs.c index bef025fbea..236326524e 100644 --- a/source/nodes/src/nodesEqual.c +++ b/source/nodes/src/nodesEqualFuncs.c @@ -32,7 +32,7 @@ #define COMPARE_NODE_FIELD(fldname) \ do { \ - if (!nodeEqual(a->fldname, b->fldname)) \ + if (!nodesEqualNode(a->fldname, b->fldname)) \ return false; \ } while (0) @@ -57,7 +57,7 @@ static bool nodeArrayEqual(const SArray* a, const SArray* b) { size_t size = taosArrayGetSize(a); for (size_t i = 0; i < size; ++i) { - if (!nodeEqual((SNode*)taosArrayGetP(a, i), (SNode*)taosArrayGetP(b, i))) { + if (!nodesEqualNode((SNode*)taosArrayGetP(a, i), (SNode*)taosArrayGetP(b, i))) { return false; } } @@ -101,7 +101,7 @@ static bool functionNodeEqual(const SFunctionNode* a, const SFunctionNode* b) { return true; } -bool nodeEqual(const SNode* a, const SNode* b) { +bool nodesEqualNode(const SNode* a, const SNode* b) { if (a == b) { return true; } diff --git a/source/nodes/src/nodesTraverse.c b/source/nodes/src/nodesTraverseFuncs.c similarity index 61% rename from source/nodes/src/nodesTraverse.c rename to source/nodes/src/nodesTraverseFuncs.c index eac8288099..d096bbcc0d 100644 --- a/source/nodes/src/nodesTraverse.c +++ b/source/nodes/src/nodesTraverseFuncs.c @@ -17,17 +17,17 @@ typedef bool (*FQueryNodeWalker)(SNode* pNode, void* pContext); -bool nodeArrayWalker(SArray* pArray, FQueryNodeWalker walker, void* pContext) { +bool nodesWalkArray(SArray* pArray, FQueryNodeWalker walker, void* pContext) { size_t size = taosArrayGetSize(pArray); for (size_t i = 0; i < size; ++i) { - if (!nodeTreeWalker((SNode*)taosArrayGetP(pArray, i), walker, pContext)) { + if (!nodesWalkNode((SNode*)taosArrayGetP(pArray, i), walker, pContext)) { return false; } } return true; } -bool nodeTreeWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext) { +bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext) { if (NULL == pNode) { return true; } @@ -43,34 +43,34 @@ bool nodeTreeWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext) { return true; case QUERY_NODE_OPERATOR: { SOperatorNode* pOpNode = (SOperatorNode*)pNode; - if (!nodeTreeWalker(pOpNode->pLeft, walker, pContext)) { + if (!nodesWalkNode(pOpNode->pLeft, walker, pContext)) { return false; } - return nodeTreeWalker(pOpNode->pRight, walker, pContext); + return nodesWalkNode(pOpNode->pRight, walker, pContext); } case QUERY_NODE_LOGIC_CONDITION: - return nodeArrayWalker(((SLogicConditionNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkArray(((SLogicConditionNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_IS_NULL_CONDITION: - return nodeTreeWalker(((SIsNullCondNode*)pNode)->pExpr, walker, pContext); + return nodesWalkNode(((SIsNullCondNode*)pNode)->pExpr, walker, pContext); case QUERY_NODE_FUNCTION: - return nodeArrayWalker(((SFunctionNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkArray(((SFunctionNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_REAL_TABLE: case QUERY_NODE_TEMP_TABLE: return true; // todo case QUERY_NODE_JOIN_TABLE: { SJoinTableNode* pJoinTableNode = (SJoinTableNode*)pNode; - if (!nodeTreeWalker(pJoinTableNode->pLeft, walker, pContext)) { + if (!nodesWalkNode(pJoinTableNode->pLeft, walker, pContext)) { return false; } - if (!nodeTreeWalker(pJoinTableNode->pRight, walker, pContext)) { + if (!nodesWalkNode(pJoinTableNode->pRight, walker, pContext)) { return false; } - return nodeTreeWalker(pJoinTableNode->pOnCond, walker, pContext); + return nodesWalkNode(pJoinTableNode->pOnCond, walker, pContext); } case QUERY_NODE_GROUPING_SET: - return nodeArrayWalker(((SGroupingSetNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkArray(((SGroupingSetNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_ORDER_BY_EXPR: - return nodeTreeWalker(((SOrderByExprNode*)pNode)->pExpr, walker, pContext); + return nodesWalkNode(((SOrderByExprNode*)pNode)->pExpr, walker, pContext); default: break; } @@ -78,6 +78,6 @@ bool nodeTreeWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext) { return false; } -bool stmtWalker(SNode* pNode, FQueryNodeWalker walker, void* pContext) { +bool nodesWalkStmt(SNode* pNode, FQueryNodeWalker walker, void* pContext) { } diff --git a/source/nodes/src/nodesUtil.c b/source/nodes/src/nodesUtilFuncs.c similarity index 86% rename from source/nodes/src/nodesUtil.c rename to source/nodes/src/nodesUtilFuncs.c index fe5883d809..5c524d2749 100644 --- a/source/nodes/src/nodesUtil.c +++ b/source/nodes/src/nodesUtilFuncs.c @@ -15,10 +15,10 @@ #include "nodes.h" -bool isTimeorderQuery(const SNode* pQuery) { +bool nodesIsTimeorderQuery(const SNode* pQuery) { } -bool isTimelineQuery(const SNode* pQuery) { +bool nodesIsTimelineQuery(const SNode* pQuery) { } diff --git a/src/connector/go b/src/connector/go new file mode 160000 index 0000000000..b8f76da4a7 --- /dev/null +++ b/src/connector/go @@ -0,0 +1 @@ +Subproject commit b8f76da4a708d158ec3cc4b844571dc4414e36b4 diff --git a/src/connector/grafanaplugin b/src/connector/grafanaplugin new file mode 160000 index 0000000000..4a4d79099b --- /dev/null +++ b/src/connector/grafanaplugin @@ -0,0 +1 @@ +Subproject commit 4a4d79099b076b8ff12d5b4fdbcba54049a6866d diff --git a/src/connector/hivemq-tdengine-extension b/src/connector/hivemq-tdengine-extension new file mode 160000 index 0000000000..ce52010141 --- /dev/null +++ b/src/connector/hivemq-tdengine-extension @@ -0,0 +1 @@ +Subproject commit ce5201014136503d34fecbd56494b67b4961056c From 573cbff2cabc57d6d15fce2537f2a8b2f63ba796 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Sun, 23 Jan 2022 07:34:16 -0500 Subject: [PATCH 02/37] TD-13120 SELECT statement syntax definition --- .gitignore | 3 +- include/common/ttokendef.h | 46 + include/libs/parser/parsenodes.h | 2 +- include/nodes/nodes.h | 23 +- include/nodes/nodesShowStmts.h | 38 + source/libs/parser/CMakeLists.txt | 2 +- source/libs/parser/inc/CMakeCache.txt | 381 ++++ .../3.18.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 17280 bytes .../3.18.2/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 17296 bytes .../3.18.2/CompilerIdC/CMakeCCompilerId.c | 674 +++++++ .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 663 +++++++ source/libs/parser/inc/CMakeFiles/Makefile2 | 125 ++ source/libs/parser/inc/CMakeFiles/Progress/1 | 1 + .../parser/inc/CMakeFiles/Progress/count.txt | 1 + .../inc/CMakeFiles/TargetDirectories.txt | 3 + .../parser/inc/CMakeFiles/cmake.check_cache | 1 + source/libs/parser/inc/astCreateFuncs.h | 39 + source/libs/parser/inc/astGenerator.h | 8 +- source/libs/parser/inc/new_sql.y | 176 ++ source/libs/parser/src/astCreater.c | 105 + source/libs/parser/src/astTranslate.c | 4 +- source/libs/parser/src/new_sql.c | 1683 +++++++++++++++++ source/libs/parser/src/parser.c | 2 +- source/libs/planner/src/logicPlan.c | 2 +- source/nodes/src/nodesUtilFuncs.c | 12 + 25 files changed, 3981 insertions(+), 13 deletions(-) create mode 100644 include/nodes/nodesShowStmts.h create mode 100644 source/libs/parser/inc/CMakeCache.txt create mode 100755 source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin create mode 100755 source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c create mode 100644 source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 source/libs/parser/inc/CMakeFiles/Makefile2 create mode 100644 source/libs/parser/inc/CMakeFiles/Progress/1 create mode 100644 source/libs/parser/inc/CMakeFiles/Progress/count.txt create mode 100644 source/libs/parser/inc/CMakeFiles/TargetDirectories.txt create mode 100644 source/libs/parser/inc/CMakeFiles/cmake.check_cache create mode 100644 source/libs/parser/inc/astCreateFuncs.h create mode 100644 source/libs/parser/src/astCreater.c create mode 100644 source/libs/parser/src/new_sql.c diff --git a/.gitignore b/.gitignore index 2308ea7896..f0067d26ba 100644 --- a/.gitignore +++ b/.gitignore @@ -86,6 +86,7 @@ tests/comparisonTest/opentsdb/opentsdbtest/.settings/ tests/examples/JDBC/JDBCDemo/.classpath tests/examples/JDBC/JDBCDemo/.project tests/examples/JDBC/JDBCDemo/.settings/ +source/libs/parser/inc/new_sql.* # Emacs # -*- mode: gitignore; -*- @@ -101,4 +102,4 @@ TAGS contrib/* !contrib/CMakeLists.txt -!contrib/test \ No newline at end of file +!contrib/test diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 90926da120..557d5029ed 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -207,6 +207,52 @@ #define TK_INTO 189 #define TK_VALUES 190 +#define NEW_TK_OR 1 +#define NEW_TK_AND 2 +#define NEW_TK_NOT 3 +#define NEW_TK_EQ 4 +#define NEW_TK_NE 5 +#define NEW_TK_ISNULL 6 +#define NEW_TK_NOTNULL 7 +#define NEW_TK_IS 8 +#define NEW_TK_LIKE 9 +#define NEW_TK_MATCH 10 +#define NEW_TK_NMATCH 11 +#define NEW_TK_GLOB 12 +#define NEW_TK_BETWEEN 13 +#define NEW_TK_IN 14 +#define NEW_TK_GT 15 +#define NEW_TK_GE 16 +#define NEW_TK_LT 17 +#define NEW_TK_LE 18 +#define NEW_TK_BITAND 19 +#define NEW_TK_BITOR 20 +#define NEW_TK_LSHIFT 21 +#define NEW_TK_RSHIFT 22 +#define NEW_TK_NK_PLUS 23 +#define NEW_TK_NK_MINUS 24 +#define NEW_TK_DIVIDE 25 +#define NEW_TK_TIMES 26 +#define NEW_TK_NK_STAR 27 +#define NEW_TK_NK_SLASH 28 +#define NEW_TK_REM 29 +#define NEW_TK_CONCAT 30 +#define NEW_TK_UMINUS 31 +#define NEW_TK_UPLUS 32 +#define NEW_TK_BITNOT 33 +#define NEW_TK_SHOW 34 +#define NEW_TK_DATABASES 35 +#define NEW_TK_NK_ID 36 +#define NEW_TK_NK_LP 37 +#define NEW_TK_NK_RP 38 +#define NEW_TK_NK_COMMA 39 +#define NEW_TK_NK_LITERAL 40 +#define NEW_TK_NK_DOT 41 +#define NEW_TK_SELECT 42 +#define NEW_TK_DISTINCT 43 +#define NEW_TK_ALL 44 +#define NEW_TK_AS 45 +#define NEW_TK_FROM 46 #define TK_SPACE 300 #define TK_COMMENT 301 diff --git a/include/libs/parser/parsenodes.h b/include/libs/parser/parsenodes.h index 374ae02e4a..d245d04166 100644 --- a/include/libs/parser/parsenodes.h +++ b/include/libs/parser/parsenodes.h @@ -35,7 +35,7 @@ typedef struct SQueryNode { int16_t type; } SQueryNode; -#define nodeType(nodeptr) (((const SQueryNode*)(nodeptr))->type) +#define queryNodeType(nodeptr) (((const SQueryNode*)(nodeptr))->type) typedef struct SField { char name[TSDB_COL_NAME_LEN]; diff --git a/include/nodes/nodes.h b/include/nodes/nodes.h index a9ca769042..0234abf88d 100644 --- a/include/nodes/nodes.h +++ b/include/nodes/nodes.h @@ -40,7 +40,8 @@ typedef enum ENodeType { QUERY_NODE_INTERVAL_WINDOW, QUERY_NODE_SET_OPERATOR, - QUERY_NODE_SELECT_STMT + QUERY_NODE_SELECT_STMT, + QUERY_NODE_SHOW_STMT } ENodeType; /** @@ -53,6 +54,19 @@ typedef struct SNode { #define nodeType(nodeptr) (((const SNode*)(nodeptr))->type) +typedef struct SListCell { + SNode* pNode; + struct SListCell* pNext; +} SListCell; + +typedef struct SNodeList { + int16_t length; + SListCell* pHeader; +} SNodeList; + +#define foreach(node, list) \ + for (SListCell* cell = (NULL != list ? list->pHeader : NULL); (NULL != cell && ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext) + typedef struct SDataType { uint8_t type; uint8_t precision; @@ -188,7 +202,8 @@ typedef enum EOrder { } EOrder; typedef enum ENullOrder { - NULL_ORDER_FIRST = 1, + NULL_ORDER_DEFAULT = 1, + NULL_ORDER_FIRST, NULL_ORDER_LAST } ENullOrder; @@ -264,6 +279,10 @@ int32_t nodesStringToNode(const char* pStr, SNode** pNode); bool nodesIsTimeorderQuery(const SNode* pQuery); bool nodesIsTimelineQuery(const SNode* pQuery); +SNode* nodesMakeNode(ENodeType type); +void nodesDestroyNode(SNode* pNode); +void nodesDestroyNodeList(SNodeList* pList); + #ifdef __cplusplus } #endif diff --git a/include/nodes/nodesShowStmts.h b/include/nodes/nodesShowStmts.h new file mode 100644 index 0000000000..312fbbc4f4 --- /dev/null +++ b/include/nodes/nodesShowStmts.h @@ -0,0 +1,38 @@ +/* + * 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 . + */ + +#ifndef _TD_NODES_SHOW_STMTS_H_ +#define _TD_NODES_SHOW_STMTS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nodes.h" + +typedef enum EShowStmtType { + SHOW_TYPE_DATABASE = 1 +} EShowStmtType; + +typedef struct SShowStmt { + ENodeType type; // QUERY_NODE_SHOW_STMT + EShowStmtType showType; +} SShowStmt; + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_NODES_SHOW_STMTS_H_*/ diff --git a/source/libs/parser/CMakeLists.txt b/source/libs/parser/CMakeLists.txt index 7f77876c4c..417c56aba1 100644 --- a/source/libs/parser/CMakeLists.txt +++ b/source/libs/parser/CMakeLists.txt @@ -8,7 +8,7 @@ target_include_directories( target_link_libraries( parser - PRIVATE os util catalog function transport qcom + PRIVATE os util nodes catalog function transport qcom ) if(${BUILD_TEST}) diff --git a/source/libs/parser/inc/CMakeCache.txt b/source/libs/parser/inc/CMakeCache.txt new file mode 100644 index 0000000000..e4e333b923 --- /dev/null +++ b/source/libs/parser/inc/CMakeCache.txt @@ -0,0 +1,381 @@ +# This is the CMakeCache file. +# For build in directory: /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//For backwards compatibility, what version of CMake commands and +// syntax should this version of CMake try to support. +CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O2 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Single output directory for building all executables. +EXECUTABLE_OUTPUT_PATH:PATH= + +//Single output directory for building all libraries. +LIBRARY_OUTPUT_PATH:PATH= + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=/home/wangxiaoyu/work/code/TDengine/source/libs/parser + +//Dependencies for the target +parser_LIB_DEPENDS:STATIC=general;os;general;util;general;nodes;general;catalog;general;function;general;transport;general;qcom; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=18 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/wangxiaoyu/work/code/TDengine/source/libs/parser +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin b/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..106875da1bfa2afef444079ee551343c0ae0861c GIT binary patch literal 17280 zcmeHO4{RIN8Gp8$Kc%e`pk*B`)M!O&%W_Gxq)VY?b`mF-Elo6Gp!{v0n%&pn?RdCEN_^uHeo2kOk6{xRfL%&OgWP-PytMZ z2uVKbVO_&PnFTr|ZOC-B=G)Bjm!cK%NwRGCM=k;-VLCK^*q;9Pl7wBJglYtv9zOBPAHQ_->fLvJ^Nyv@QcMVF+=l&=fk~#Um})>Cc<^d zV;Y4Y;-Wf?Sd z$0ng^c(3J*Sk}lxUlCG@O5n#>t`c3@jaDwEa+V#6t2B-0}q zEtlM@XGXNdgpn1Ro`@MSuz|$13YpRIOqz<&z+OMxCz5F`pVJf8;-EAGETj<}&gEDg z%XclkySJykLu*!=l~%K1=A8DyJT3o+5+;g$Yo`3=$;J4WaGdgUbwlzF=eUnBB=Z)W z|85Xpu;BPN!s(0!=Q)79f7M<2mb&j$t$I(D@1l@UzcOR^3s0&0ep)*#Rgu5(m7eLR zZ&RmVQ1`vGuzjHC_zaG!di)qp9`*Qf9Q(qGA1)4w*AJom?1)mgX1`QFq#oS*Ct#=t ztA2}Q^BH3W6m;=jM)f_ZK7H0$ z4h9CvKy6`eq;5@TNgvCf+8P74$X~ikojy6gw@@fNS=A4SZ*cYylmpVG3ZneWccb9+ zou}04{M_;AJ6NB4qNmiubx%y;Jgxijj4%2QBl8yIok2@mrDe1ixv6LR*~pDO)2Ac5 zBGd0i26_)({d#ps>{1UlAl=!!{v`JK{9R`Y1@+jw0b|X^6V(3R>9=~PPj^ng8YwJ) zPTe=_Q#U`K{|Ao8t%H#-L^z31vM}W=&#e~moOuoH4 zgm1Fmw`yrkEv|hyzj3WT`fi~hpDCR+^@ugW?^l3fIhare21ul#4EZdH1nUp@JC;@7 z4u*(_bvO)s9jNFE*5Buk23LM95DkV7E{X=%-CLywn+{Z~!M1%h-NA4=*cJ&kMS|3IH9IbHob z270<~5d~Dc%%*#dd{?;nW-YRFXB4FR`*s4~QJ)(0;fwx>tm9R3iaBg$#*>CNl8ue) z+C(OqhL@spTh;i!dNKTDGHsb{%j&UIaui=(%g1TV94CGsWa{ku$~b+<;}oxq6TW+& z_kT~h$~avR4F$1@*|qak7y-YS)a^hp8Svx+>by%2>m_$bkrT$VDp2VV}-s< zN!Hyja_XR;Zu2KAe#(X6PgeYt3uBxre#(V0P8C1pyc{QdNw=*}v5lo~s^p`%$?!f1 zQ#Tp*ahSTv@P689%f6JeKD@_vl=j-(?1ZVV{C&4<-DUraY&=Z#!}h;$-{k+Wk0bYo z9D6V4H2+ZXgWSjQ@V{jJ@v|+a`-z^D|K-qmFZ*nl=fb(zcj}bQv-8xy`>4;evT-_3 z{kzIIIo6}|)W55YlVhCDQ~&OxK2C1F60dhm|63XM+1`E+-;I5?$7x-b3%bW80GmK< z{%{#L0B3^+T=9S~T=7N4@2FN|0q|_*UFEBb-&yVQHNx%tW&l2*@pno<>w%x}z~At|mtupVUCw%5O*rpEqB^Fn zg!8+Yi3)Lxhn>6!e!mC)ga>}Y1Ap5CUxS{%OS`ss;Ddxa+q<7|XL}z3+-;sb&UPHn zsb3Jz&r0sMzY^~3|2IAG6}S+&w5!CKlRlxml4m(^OX48^>mhcG&K1ldc2c84mXF2DM(+Sg;C0_m>sMa{waU{7r+jBT+Zin zJ;?juG{?^!^Y#j92hPn`hf%TkPTwl!%b(}h1CI8c>%t8ZFJE60($0#q^ZgSNFMs}D z2?s{}aB9Q34juq`JeU7aO&BXstmgxOha_UZye#qZ_<_d&cRQ~?3%Fa{!Y=`Li;MU> z$vfi{P6O^%pDJjVTin8Oz}?~&24JFMe1bDB;#FCn((}BLn!Oh6xWzLxk$v9pl4p=X zrxkFwdWyz;E{nk~jc`J#5u#kQO)U*sJuwzD%*dCu+bYe-v zFass-%*(g~hm10oG2G89K(GU?)x_b+am^e)kf?_!T`h(jcccV3nXXGK8BQ8qOOqwwchYcZ~DTgsj8ErI`8IGm2gptYSv{-&p#53a)Dc#T$%BPz* zx3~+*I4Lcb&BpdXGmY#XVIB@lxvC7VYcQAacsCjbT!WTt*vB=qtal+MkzO%&MU+DBt%;#;V%|* zV|ZFsN$g33J(EHxoaEfDXLER1)tb?O2M^^KDhLIqzEBK(60S1dPRV9u44tBn(aaf3 zfClGG4RZ>a8hj7tV&h3z*hX>Hf{QYdf*aEq#M21{Ci6HPlel~sHS24)o zT8k{+I`umNI}K;Tx%|WaFd%rIT@ta~Bt`!Y_nfS$4>EZ6ne};}W}bj4>>Nno-pIDI zKA%^=5penHfTW;!=@-1eAv-p@*6E119}L4R(;;TI)alD5`KrXCK{F^^Z?wUKDU3SCM+^e_N-vl!hqf_sp6PD@!=Yk*-ml|$e~#;=B8K;EBogW?784aMRDwi)Ecd!I2gJ0ZQuRegFUf literal 0 HcmV?d00001 diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin b/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..a9be1ade778eb7e6c45137fd39b934766f7fbbdb GIT binary patch literal 17296 zcmeHOeQaCR6~DHdFKC?rEeo`xMgyrI%gYC8mlnF&Nu0cFX;YdM${>Al?3cvUu`~M_ z(vAtV7PP<$(ImENe=wNFR5bqRq`@CdZ0QPglVE~r8%zZ$d=zD)uuN=F7&JTQzH{vN zp5LpgX@geyw$8ctcRuc?{m#Abp4+3nU4EZWaPo^U3t6fROUV2y#Pl^RAw*cTi5mF3 zLM#`R055_M%Y`Y&^dy;PT1{pGq}S#*fi{0wW|*!pVW`7Q+(M)kgqb8vC6mrm1x$qq zNj~afTkC?d2y{qhm@cMv)DdMpETUeB^g^V^bcPznl>3Kcf}a7hH{cIL3Cm$5qEr4Y zQk2EC^|+D1{K+a=1R9nZrmZF{n6lorpoi@|(^N--+o(RTaha$7F{PqtOeKfcw>G8{ z4XI>0KiM$Zw!UF~tCGtoEwbNeA7#6@Y?n3ReDly^o0q}|G31Aze6!+%U(AQ{le_ER zf9TaM$LDXq1bH~mXaoE8oog?z2=k}JpiJfX(ez%F5FuIyU+#4euZ4{t3B{3!0W^^ zv7&Csru8Gj>mB%`62Dl49QZ?khro_gej4x##1b(>>x9?CKEN*&=ZiNh!;ljK+lT34 z_#iF_Z3lO*3n_H~kfj_?NwuOM8&y2u%c_}aC&7S;<*8y(N2wVV;l z8k#1wo`KC;LeJ`>$(*5Q2R3)4GHHDvHk{H;o+}4zj+^EnHyV#?IV?3}U2(1k^Hj}v zESVOXo`@MSFxm%bBAM3mIXwZ*LDZB3ku)O1xf}zUv=YzdwPZSJ0IyIU0YG&3_Oy3s zElP{B&g`zaqJ6MR-TsY(5P#3|mnLiQ8}JH^(`@aK%;DPh5r$;Wg7fzU@p%i5-wjSD zEjZ6T^4_hz>_c_$iE8zpikkC6LcMdw@Gm^C?tQBI2&+npa?Nk|OuevEoqA2(`^Nm% zfu5r?IIHT>!#L^c(WAJA7M49x6B7TNM)@NnO6|&hQhi$8zv(Z)Q1@5-0m+7w#xkh# zF3dxfH4C$~EAK$bBSb;|5h=g!$4FM6QV*XBs8jRm;kmDb?g$4ES#{pwy^D*jw@6?CAQ}1<7{XMd<^ksGL5udu@ zmHgjuUTz$W+!Ps%?2KqfM(pj!8N+(zd^%>(SNK)MUJ22&rK@jaF1bg~jA)4oBYR_0 z+h75Y4JU7e=RE?x<$sf44FD_G}Zr z$vWTi#Z}eQuz+!$IINK zV5mJ<-yW=M4_3?eJPPVFV2A5QbLCVXf$|8HN1!|c?jtZ;8J3JgMA$GFFfBHTc&Q>Rb4#dvu*xi7LS^2EEvGU*3ou=35>X!lmU&#}sl1W+r2eT9-p9H%pu3}EV`vrZ&{l`qlvbrV)Y8<_)U=_cEwpNzo(QQi z!^9h!SIcq5=RG>J-H|JNS50hKhtK{-T1QNAza^6?SCP%9)5-K`2)uenB|YjtraY8Tsd*UH_(jvZR0zds66eOvm0?`TgI?{lT9Y~$r} zi8*X##*>CNl8ue)+C(OqhOJYntxDXlULXy@AJdlEx2zsZB}dc9!u4;Pr!jM$ct6P0 zIrimwD*m?6*nYC}6fe&c?!M3Z?^CWkPv^uu>E(GkC+3O#h$iwQ))6f~pYUl8$@FVJ zaX$k6AoL^f)lqk3jm-~o&K3GHMOk;h$f;BIQ_fL;vh1gv8-9P;PdPW{sqCkmmGgv~ zKifV!)?9q2N z*TR|Dcj}a^v$OOZ>a)JiO6KV-_3z5_cYW9{4d2 z{Cy96F?JaGUV_mZzYf0tAsnp{{s(v89szE+%Y`F(b)_wyi+RylqGOPHFd-rrKaCJK^pLBkKXmYmO#O(2is&)*km z7L;C-cS(gP2T9B~AqkxeD-*rOerO4_q|nb6E^_X@na}jS%Ict#56}>WQ(K zVMe|*wlykB@jpmHSWG-?G%FdQ(2XS-O`yb`Wf_0qkWt1mhMSxluH@6HdWg84tUF zG*CJ&cA?VovGb)7fU<^l4DB+f9TsW8KA>76We!@*&@mPT2XP{)n@uT>yO$WovFNFh z1`JwJGW|sb087?h5yOVK$=c_@F7L&28GDCf>9`jKO2@p&b06;_-!axjhTAw71A63G z$!RPOfhFEYvTfsIVPY^)$=no8OE&7l&p^(|Lo`QR6l0z=V;n9ULex_ZqmeS&Xeu)t zOKAxslg(+d{G^Cy#wSv`p(m6twQOj07t*i}Etbv3c0)If>~3LR4ou|7$9IE@r6d=C zO|)ZkY?lrV?p4bCIo2_L-k&h_&-&_;61E+b*~(^!t_F5u%GdM@*M z(GF4wk-oG21dBb8!KSkQB%QHMlKv10a{bQ!?*l##5!%PZ?^)3=#l-OmW~p@k?goZc zpZ#Pu_%Mw>>&thxTmU-l(C2-~L0puO@V%Th(X^w-N$@sG29 z43@U)pCtX0q~BUpl{shq7;|UU=X10s8t55^K94`ck3$CcfVc)R@xF)S)1C5MX8Ie@ z!S}+f&*yUWw6SD4w2g_&On(m;&OPh%{w+lMGc(@kP)@5!UB(zFB%%9Ri*; zu|Ct6foat*oCi_`{5@qGtjF}YL!b9!^`!5dFX|4P6K_EdZE^cKZhgfW>d#aCO$Cc) zhV{Sbz`1^=9{``0nv~@8N|ov#a(n^Z`onAATGhd|W@(ZFb}+8!die0T@wg(J`)+EO fe?#j`dJ|7PF}d9=i}4q3`nO$eO4K?O97XXTD?#WD literal 0 HcmV?d00001 diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000000..6c0aa93cbf --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,674 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if !defined(__STDC__) +# if (defined(_MSC_VER) && !defined(__clang__)) \ + || (defined(__ibmxl__) || defined(__IBMC__)) +# define C_DIALECT "90" +# else +# define C_DIALECT +# endif +#elif __STDC_VERSION__ >= 201000L +# define C_DIALECT "11" +#elif __STDC_VERSION__ >= 199901L +# define C_DIALECT "99" +#else +# define C_DIALECT "90" +#endif +const char* info_language_dialect_default = + "INFO" ":" "dialect_default[" C_DIALECT "]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000000..37c21cafe9 --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,663 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/source/libs/parser/inc/CMakeFiles/Makefile2 b/source/libs/parser/inc/CMakeFiles/Makefile2 new file mode 100644 index 0000000000..e945db3bae --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/Makefile2 @@ -0,0 +1,125 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.18 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Disable VCS-based implicit rules. +% : %,v + + +# Disable VCS-based implicit rules. +% : RCS/% + + +# Disable VCS-based implicit rules. +% : RCS/%,v + + +# Disable VCS-based implicit rules. +% : SCCS/s.% + + +# Disable VCS-based implicit rules. +% : s.% + + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/wangxiaoyu/work/code/TDengine/source/libs/parser + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/parser.dir/all + +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: + +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/parser.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/parser.dir + +# All Build rule for target. +CMakeFiles/parser.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 "Built target parser" +.PHONY : CMakeFiles/parser.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/parser.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles 16 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/parser.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles 0 +.PHONY : CMakeFiles/parser.dir/rule + +# Convenience name for target. +parser: CMakeFiles/parser.dir/rule + +.PHONY : parser + +# clean rule for target. +CMakeFiles/parser.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/clean +.PHONY : CMakeFiles/parser.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/source/libs/parser/inc/CMakeFiles/Progress/1 b/source/libs/parser/inc/CMakeFiles/Progress/1 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/Progress/1 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/source/libs/parser/inc/CMakeFiles/Progress/count.txt b/source/libs/parser/inc/CMakeFiles/Progress/count.txt new file mode 100644 index 0000000000..b6a7d89c68 --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/Progress/count.txt @@ -0,0 +1 @@ +16 diff --git a/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt b/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000000..f803c4fe95 --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/rebuild_cache.dir +/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/parser.dir +/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/edit_cache.dir diff --git a/source/libs/parser/inc/CMakeFiles/cmake.check_cache b/source/libs/parser/inc/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000000..3dccd73172 --- /dev/null +++ b/source/libs/parser/inc/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/source/libs/parser/inc/astCreateFuncs.h b/source/libs/parser/inc/astCreateFuncs.h new file mode 100644 index 0000000000..056c24c17e --- /dev/null +++ b/source/libs/parser/inc/astCreateFuncs.h @@ -0,0 +1,39 @@ +/* + * 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 "nodes.h" +#include "nodesShowStmts.h" +#include "parser.h" + +typedef void* (*FMalloc)(size_t); +typedef void (*FFree)(void*); + +typedef struct SAstCreaterContext { + SParseContext* pQueryCxt; + bool notSupport; + bool valid; + SNode* pRootNode; + FMalloc mallocFunc; + FFree freeFunc; +} SAstCreaterContext; + +SNodeList* addNodeToList(SAstCreaterContext* pCxt, SNodeList* pList, SNode* pNode); +SNode* createColumnNode(SAstCreaterContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pColumnName); +SNodeList* createNodeList(SAstCreaterContext* pCxt, SNode* pNode); +SNode* createOrderByExprNode(SAstCreaterContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder); +SNode* createSelectStmt(SAstCreaterContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable); +SNode* createSetOperator(SAstCreaterContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight); +SNode* createShowStmt(SAstCreaterContext* pCxt, EShowStmtType type); +SNode* setProjectionAlias(SAstCreaterContext* pCxt, SNode* pNode, SToken* pAlias); diff --git a/source/libs/parser/inc/astGenerator.h b/source/libs/parser/inc/astGenerator.h index c601c4e3e3..0133668971 100644 --- a/source/libs/parser/inc/astGenerator.h +++ b/source/libs/parser/inc/astGenerator.h @@ -24,7 +24,7 @@ extern "C" { #include "tvariant.h" #include "parser.h" -#define ParseTOKENTYPE SToken +// #define ParseTOKENTYPE SToken #define NON_ARITHMEIC_EXPR 0 #define NORMAL_ARITHMETIC 1 @@ -338,21 +338,21 @@ void tSetColumnType(struct SField *pField, SToken *type); * @param yymajor The major token code number * @param yyminor The value for the token */ -void Parse(void *yyp, int yymajor, ParseTOKENTYPE yyminor, SSqlInfo *); +// void Parse(void *yyp, int yymajor, ParseTOKENTYPE yyminor, SSqlInfo *); /** * Free the allocated resources in case of failure. * @param p The parser to be deleted * @param freeProc Function used to reclaim memory */ -void ParseFree(void *p, void (*freeProc)(void *)); +// void ParseFree(void *p, void (*freeProc)(void *)); /** * Allocated callback function. * @param mallocProc The parser allocator * @return */ -void *ParseAlloc(void *(*mallocProc)(size_t)); +// void *ParseAlloc(void *(*mallocProc)(size_t)); /** * diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y index e69de29bb2..8f316d9ee3 100644 --- a/source/libs/parser/inc/new_sql.y +++ b/source/libs/parser/inc/new_sql.y @@ -0,0 +1,176 @@ +//lemon parser file to generate sql parse by using finite-state-machine code used to parse sql +//usage: lemon sql.y + +%name NewParse + +%token_prefix NEW_TK_ +%token_type { SToken* } +%default_type { SNode* } +%default_destructor { nodesDestroyNode($$); } + +%extra_argument { SAstCreaterContext* pCxt } + +%include { +#include +#include +#include +#include +#include + +#include "nodes.h" +#include "ttoken.h" +#include "ttokendef.h" +#include "astCreateFuncs.h" +} + +%syntax_error { + if(TOKEN->z) { + char msg[] = "syntax error near \"%s\""; + int32_t sqlLen = strlen(&TOKEN->z[0]); + + if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > pCxt->pQueryCxt->msgLen) { + char tmpstr[128] = {0}; + memcpy(tmpstr, &TOKEN->z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); + sprintf(pCxt->pQueryCxt->pMsg, msg, tmpstr); + } else { + sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN->z[0]); + } + } else { + sprintf(pCxt->pQueryCxt->pMsg, "Incomplete SQL statement"); + } + pCxt->valid = false; +} + +%parse_accept { printf("parsing complete!\n" );} + +//%left OR. +//%left AND. +//%right NOT. +%left UNION ALL MINUS EXCEPT INTERSECT. +//%left EQ NE ISNULL NOTNULL IS LIKE MATCH NMATCH GLOB BETWEEN IN. +//%left GT GE LT LE. +//%left BITAND BITOR LSHIFT RSHIFT. +%left NK_PLUS NK_MINUS. +//%left DIVIDE TIMES. +%left NK_STAR NK_SLASH. //REM. +//%left CONCAT. +//%right UMINUS UPLUS BITNOT. + +cmd ::= SHOW DATABASES. { createShowStmt(pCxt, SHOW_TYPE_DATABASE); } + +cmd ::= query_expression(A). { pCxt->pRootNode = A; } + +//////////////////////// value_function ///////////////////////////////// +value_function ::= NK_ID NK_LP value_expression NK_RP. +value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP. + +//////////////////////// value_expression_primary ///////////////////////////////// +value_expression_primary ::= NK_LP value_expression NK_RP. +value_expression_primary ::= nonparenthesized_value_expression_primary. + +nonparenthesized_value_expression_primary ::= literal. +// ? +nonparenthesized_value_expression_primary ::= column_reference. + +literal ::= NK_LITERAL. + +column_reference(A) ::= NK_ID(B). { A = createColumnNode(pCxt, NULL, NULL, B); } +column_reference(A) ::= NK_ID(B) NK_DOT NK_ID(C). { A = createColumnNode(pCxt, NULL, B, C); } +column_reference(A) ::= NK_ID(B) NK_DOT NK_ID(C) NK_DOT NK_ID(D). { A = createColumnNode(pCxt, B, C, D); } + +//////////////////////// value_expression ///////////////////////////////// +value_expression ::= common_value_expression. + +common_value_expression ::= numeric_value_expression. + +numeric_value_expression ::= numeric_primary. +numeric_value_expression ::= NK_PLUS numeric_primary. +numeric_value_expression ::= NK_MINUS numeric_primary. +numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression. +numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression. +numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression. +numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression. + +numeric_primary ::= value_expression_primary. +numeric_primary ::= value_function. + +//////////////////////// query_specification ///////////////////////////////// +query_specification(A) ::= SELECT set_quantifier_opt(B) select_list(C) from_clause(D). { A = createSelectStmt(pCxt, B, C, D); } + +%type set_quantifier_opt { bool } +%destructor set_quantifier_opt {} +set_quantifier_opt(A) ::= . { A = false; } +set_quantifier_opt(A) ::= DISTINCT. { A = true; } +set_quantifier_opt(A) ::= ALL. { A = false; } + +%type select_list { SNodeList* } +%destructor select_list { nodesDestroyNodeList($$); } +select_list(A) ::= NK_STAR. { A = NULL; } +select_list(A) ::= select_sublist(B). { A = B; } + +%type select_sublist { SNodeList* } +%destructor select_sublist { nodesDestroyNodeList($$); } +select_sublist(A) ::= select_item(B). { A = createNodeList(pCxt, B); } +select_sublist(A) ::= select_sublist(B) NK_COMMA select_item(C). { A = addNodeToList(pCxt, B, C); } + +select_item(A) ::= value_expression(B). { A = B; } +select_item(A) ::= value_expression(B) AS NK_ID(C). { A = setProjectionAlias(pCxt, B, C); } +select_item(A) ::= NK_ID(B) NK_DOT NK_STAR(C). { A = createColumnNode(pCxt, NULL, B, C); } +select_item(A) ::= NK_ID(B) NK_DOT NK_ID(C) NK_DOT NK_STAR(D). { A = createColumnNode(pCxt, B, C, D); } + +from_clause ::= FROM table_reference_list. + +table_reference_list ::= table_reference. +table_reference_list ::= table_reference_list NK_COMMA table_reference. + +table_reference ::= NK_ID. +//table_reference ::= joined_table. + +//////////////////////// query_expression ///////////////////////////////// +query_expression(A) ::= with_clause_opt query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt. { A = B; } + +with_clause_opt ::= . {} +with_clause_opt ::= WITH with_list. { pCxt->notSupport = true; pCxt->valid = false; } +with_clause_opt ::= WITH RECURSIVE with_list. { pCxt->notSupport = true; pCxt->valid = false; } + +with_list ::= with_list_element. {} +with_list ::= with_list NK_COMMA with_list_element. {} + +with_list_element ::= NK_ID AS table_subquery. {} + +table_subquery ::= . {} + +query_expression_body(A) ::= query_primary(B). { A = B; } +query_expression_body(A) ::= query_expression_body(B) UNION ALL query_expression_body(C). { A = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, B, C); } + +query_primary(A) ::= query_specification(B). { A = B; } +query_primary(A) ::= NK_LP query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP. { A = B;} + +%type order_by_clause_opt { SNodeList* } +%destructor order_by_clause_opt { nodesDestroyNodeList($$); } +order_by_clause_opt(A) ::= . { A = NULL; } +order_by_clause_opt(A) ::= ORDER BY sort_specification_list(B). { A = B; } + +limit_clause_opt ::= . + +slimit_clause_opt ::= . + +//////////////////////// sort_specification_list ///////////////////////////////// +%type sort_specification_list { SNodeList* } +%destructor sort_specification_list { nodesDestroyNodeList($$); } +sort_specification_list(A) ::= sort_specification(B). { A = createNodeList(pCxt, B); } +sort_specification_list(A) ::= sort_specification_list(B) NK_COMMA sort_specification(C). { A = addNodeToList(pCxt, B, C); } + +sort_specification(A) ::= value_expression(B) ordering_specification_opt(C) null_ordering_opt(D). { A = createOrderByExprNode(pCxt, B, C, D); } + +%type ordering_specification_opt EOrder +%destructor ordering_specification_opt {} +ordering_specification_opt(A) ::= . { A = ORDER_ASC; } +ordering_specification_opt(A) ::= ASC. { A = ORDER_ASC; } +ordering_specification_opt(A) ::= DESC. { A = ORDER_DESC; } + +%type null_ordering_opt ENullOrder +%destructor null_ordering_opt {} +null_ordering_opt(A) ::= . { A = NULL_ORDER_DEFAULT; } +null_ordering_opt(A) ::= NULLS FIRST. { A = NULL_ORDER_FIRST; } +null_ordering_opt(A) ::= NULLS LAST. { A = NULL_ORDER_LAST; } diff --git a/source/libs/parser/src/astCreater.c b/source/libs/parser/src/astCreater.c new file mode 100644 index 0000000000..fb21dc2ba9 --- /dev/null +++ b/source/libs/parser/src/astCreater.c @@ -0,0 +1,105 @@ +/* + * 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 "ttoken.h" +#include "astCreateFuncs.h" + +extern void* NewParseAlloc(FMalloc); +extern void NewParse(void*, int, SToken*, void*); +extern void NewParseFree(void*, FFree); + +SNodeList* addNodeToList(SAstCreaterContext* pCxt, SNodeList* pList, SNode* pNode) { + +} + +SNode* createColumnNode(SAstCreaterContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pColumnName) { + +} + +SNodeList* createNodeList(SAstCreaterContext* pCxt, SNode* pNode) { + +} + +SNode* createOrderByExprNode(SAstCreaterContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { + +} + +SNode* createSelectStmt(SAstCreaterContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { + +} + +SNode* createSetOperator(SAstCreaterContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { + +} + +SNode* createShowStmt(SAstCreaterContext* pCxt, EShowStmtType type) { + +} + +SNode* setProjectionAlias(SAstCreaterContext* pCxt, SNode* pNode, SToken* pAlias) { + +} + +SNode* doParse(SParseContext* pParseCxt) { + SAstCreaterContext cxt = { .pQueryCxt = pParseCxt, .valid = true, .pRootNode = NULL, .mallocFunc = malloc, .freeFunc = free}; + void *pParser = NewParseAlloc(cxt.mallocFunc); + int32_t i = 0; + while (1) { + SToken t0 = {0}; + + if (cxt.pQueryCxt->pSql[i] == 0) { + NewParse(pParser, 0, &t0, &cxt); + goto abort_parse; + } + + t0.n = tGetToken((char *)&cxt.pQueryCxt->pSql[i], &t0.type); + t0.z = (char *)(cxt.pQueryCxt->pSql + i); + i += t0.n; + + switch (t0.type) { + case TK_SPACE: + case TK_COMMENT: { + break; + } + case TK_SEMI: { + NewParse(pParser, 0, &t0, &cxt); + goto abort_parse; + } + + case TK_QUESTION: + case TK_ILLEGAL: { + snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unrecognized token: \"%s\"", t0.z); + goto abort_parse; + } + + case TK_HEX: + case TK_OCT: + case TK_BIN: { + snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unsupported token: \"%s\"", t0.z); + goto abort_parse; + } + + default: + NewParse(pParser, t0.type, &t0, &cxt); + if (!cxt.valid) { + goto abort_parse; + } + } + } + +abort_parse: + NewParseFree(pParser, cxt.freeFunc); + return cxt.pRootNode; +} diff --git a/source/libs/parser/src/astTranslate.c b/source/libs/parser/src/astTranslate.c index 4c649e0ecc..ff68c4b22c 100644 --- a/source/libs/parser/src/astTranslate.c +++ b/source/libs/parser/src/astTranslate.c @@ -13,6 +13,6 @@ * along with this program. If not, see . */ -int32_t doTranslate() { +// int32_t doTranslate() { -} +// } diff --git a/source/libs/parser/src/new_sql.c b/source/libs/parser/src/new_sql.c new file mode 100644 index 0000000000..baebc3235a --- /dev/null +++ b/source/libs/parser/src/new_sql.c @@ -0,0 +1,1683 @@ +/* +** 2000-05-29 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Driver template for the LEMON parser generator. +** +** The "lemon" program processes an LALR(1) input grammar file, then uses +** this template to construct a parser. The "lemon" program inserts text +** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the +** interstitial "-" characters) contained in this template is changed into +** the value of the %name directive from the grammar. Otherwise, the content +** of this template is copied straight through into the generate parser +** source file. +** +** The following is the concatenation of all %include directives from the +** input grammar file: +*/ +#include +#include +/************ Begin %include sections from the grammar ************************/ + +#include +#include +#include +#include +#include + +#include "nodes.h" +#include "ttoken.h" +#include "ttokendef.h" +#include "astCreateFuncs.h" +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ + +/* The next sections is a series of control #defines. +** various aspects of the generated parser. +** YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** YYNOCODE is a number of type YYCODETYPE that is not used for +** any terminal or nonterminal symbol. +** YYFALLBACK If defined, this indicates that one or more tokens +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** NewParseTOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** YYMINORTYPE is the data type used for all minor types. +** This is typically a union of many types, one of +** which is NewParseTOKENTYPE. The entry in the union +** for terminal symbols is called "yy0". +** YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** NewParseARG_SDECL A static variable declaration for the %extra_argument +** NewParseARG_PDECL A parameter declaration for the %extra_argument +** NewParseARG_PARAM Code to pass %extra_argument as a subroutine parameter +** NewParseARG_STORE Code to store %extra_argument into yypParser +** NewParseARG_FETCH Code to extract %extra_argument from yypParser +** NewParseCTX_* As NewParseARG_ except for %extra_context +** YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YYNTOKEN Number of terminal symbols +** YY_MAX_SHIFT Maximum value for shift actions +** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** YY_ERROR_ACTION The yy_action[] code for syntax error +** YY_ACCEPT_ACTION The yy_action[] code for accept +** YY_NO_ACTION The yy_action[] code for no-op +** YY_MIN_REDUCE Minimum value for reduce actions +** YY_MAX_REDUCE Maximum value for reduce actions +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ +#define YYCODETYPE unsigned char +#define YYNOCODE 63 +#define YYACTIONTYPE unsigned char +#define NewParseTOKENTYPE SToken* +typedef union { + int yyinit; + NewParseTOKENTYPE yy0; + bool yy47; + SNode* yy56; + SNodeList* yy82; + EOrder yy92; + ENullOrder yy109; +} YYMINORTYPE; +#ifndef YYSTACKDEPTH +#define YYSTACKDEPTH 100 +#endif +#define NewParseARG_SDECL SAstCreaterContext* pCxt ; +#define NewParseARG_PDECL , SAstCreaterContext* pCxt +#define NewParseARG_PARAM ,pCxt +#define NewParseARG_FETCH SAstCreaterContext* pCxt =yypParser->pCxt ; +#define NewParseARG_STORE yypParser->pCxt =pCxt ; +#define NewParseCTX_SDECL +#define NewParseCTX_PDECL +#define NewParseCTX_PARAM +#define NewParseCTX_FETCH +#define NewParseCTX_STORE +#define YYNSTATE 62 +#define YYNRULE 64 +#define YYNTOKEN 31 +#define YY_MAX_SHIFT 61 +#define YY_MIN_SHIFTREDUCE 105 +#define YY_MAX_SHIFTREDUCE 168 +#define YY_ERROR_ACTION 169 +#define YY_ACCEPT_ACTION 170 +#define YY_NO_ACTION 171 +#define YY_MIN_REDUCE 172 +#define YY_MAX_REDUCE 235 +/************* End control #defines *******************************************/ +#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) + +/* Define the yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef yytestcase +# define yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. +** +** N == YY_ERROR_ACTION A syntax error has occurred. +** +** N == YY_ACCEPT_ACTION The parser accepts its input. +** +** N == YY_NO_ACTION No such action. Denotes unused +** slots in the yy_action[] table. +** +** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE +** and YY_MAX_REDUCE +** +** The action table is constructed as a single large table named yy_action[]. +** Given state S and lookahead X, the action is computed as either: +** +** (A) N = yy_action[ yy_shift_ofst[S] + X ] +** (B) N = yy_default[S] +** +** The (A) formula is preferred. The B formula is used instead if +** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X. +** +** The formulas above are for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the yy_reduce_ofst[] array is used in place of +** the yy_shift_ofst[] array. +** +** The following are the tables generated in this section: +** +** yy_action[] A single table containing all actions. +** yy_lookahead[] A table containing the lookahead for each entry in +** yy_action. Used to detect hash collisions. +** yy_shift_ofst[] For each state, the offset into yy_action for +** shifting terminals. +** yy_reduce_ofst[] For each state, the offset into yy_action for +** shifting non-terminals after a reduce. +** yy_default[] Default action for each state. +** +*********** Begin parsing tables **********************************************/ +#define YY_ACTTAB_COUNT (213) +static const YYACTIONTYPE yy_action[] = { + /* 0 */ 33, 50, 33, 33, 33, 33, 50, 33, 33, 44, + /* 10 */ 193, 27, 43, 51, 183, 33, 20, 33, 33, 33, + /* 20 */ 33, 20, 33, 33, 33, 20, 33, 33, 33, 33, + /* 30 */ 20, 33, 33, 13, 12, 114, 42, 193, 61, 41, + /* 40 */ 5, 45, 203, 151, 52, 52, 11, 10, 9, 8, + /* 50 */ 17, 204, 33, 50, 33, 33, 33, 33, 50, 33, + /* 60 */ 33, 140, 141, 43, 25, 227, 184, 227, 227, 227, + /* 70 */ 227, 166, 227, 227, 18, 33, 54, 33, 33, 33, + /* 80 */ 33, 54, 33, 33, 1, 33, 55, 33, 33, 33, + /* 90 */ 33, 55, 33, 33, 33, 39, 33, 33, 33, 33, + /* 100 */ 39, 33, 33, 226, 14, 226, 226, 226, 226, 23, + /* 110 */ 226, 226, 37, 194, 37, 37, 37, 37, 121, 37, + /* 120 */ 37, 38, 109, 38, 38, 38, 38, 120, 38, 38, + /* 130 */ 223, 53, 223, 223, 223, 223, 30, 222, 223, 222, + /* 140 */ 222, 222, 222, 170, 59, 222, 13, 12, 13, 12, + /* 150 */ 32, 48, 40, 5, 41, 5, 151, 199, 151, 40, + /* 160 */ 5, 113, 16, 151, 143, 144, 21, 199, 199, 9, + /* 170 */ 8, 145, 6, 197, 46, 7, 198, 22, 112, 58, + /* 180 */ 34, 7, 205, 197, 197, 36, 232, 19, 177, 195, + /* 190 */ 47, 29, 24, 189, 31, 28, 3, 2, 133, 15, + /* 200 */ 119, 4, 49, 173, 26, 147, 146, 35, 109, 172, + /* 210 */ 56, 57, 60, +}; +static const YYCODETYPE yy_lookahead[] = { + /* 0 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 55, + /* 10 */ 56, 44, 12, 46, 47, 33, 34, 35, 36, 37, + /* 20 */ 38, 39, 40, 41, 33, 34, 35, 36, 37, 38, + /* 30 */ 39, 40, 41, 6, 7, 8, 55, 56, 10, 12, + /* 40 */ 13, 59, 60, 16, 48, 49, 6, 7, 8, 9, + /* 50 */ 22, 60, 33, 34, 35, 36, 37, 38, 39, 40, + /* 60 */ 41, 26, 27, 12, 61, 33, 47, 35, 36, 37, + /* 70 */ 38, 12, 40, 41, 23, 33, 34, 35, 36, 37, + /* 80 */ 38, 39, 40, 41, 43, 33, 34, 35, 36, 37, + /* 90 */ 38, 39, 40, 41, 33, 34, 35, 36, 37, 38, + /* 100 */ 39, 40, 41, 33, 13, 35, 36, 37, 38, 18, + /* 110 */ 40, 41, 33, 56, 35, 36, 37, 38, 8, 40, + /* 120 */ 41, 33, 12, 35, 36, 37, 38, 8, 40, 41, + /* 130 */ 33, 12, 35, 36, 37, 38, 52, 33, 41, 35, + /* 140 */ 36, 37, 38, 31, 32, 41, 6, 7, 6, 7, + /* 150 */ 52, 1, 12, 13, 12, 13, 16, 42, 16, 12, + /* 160 */ 13, 2, 50, 16, 29, 30, 51, 42, 42, 8, + /* 170 */ 9, 14, 15, 58, 24, 13, 51, 51, 19, 17, + /* 180 */ 28, 13, 62, 58, 58, 17, 49, 21, 45, 57, + /* 190 */ 54, 53, 15, 54, 53, 20, 15, 25, 14, 2, + /* 200 */ 12, 15, 20, 0, 15, 14, 14, 17, 12, 0, + /* 210 */ 17, 12, 11, 63, 63, 63, 63, 63, 63, 63, + /* 220 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + /* 230 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + /* 240 */ 63, 63, 63, 63, +}; +#define YY_SHIFT_COUNT (61) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (209) +static const unsigned char yy_shift_ofst[] = { + /* 0 */ 28, 27, 140, 140, 142, 140, 140, 140, 140, 140, + /* 10 */ 140, 140, 147, 147, 91, 91, 91, 51, 0, 59, + /* 20 */ 35, 150, 150, 159, 0, 152, 59, 166, 213, 213, + /* 30 */ 213, 213, 213, 40, 135, 110, 119, 161, 161, 157, + /* 40 */ 162, 168, 177, 175, 177, 181, 172, 184, 197, 188, + /* 50 */ 182, 186, 189, 190, 191, 192, 196, 193, 199, 203, + /* 60 */ 209, 201, +}; +#define YY_REDUCE_COUNT (32) +#define YY_REDUCE_MIN (-46) +#define YY_REDUCE_MAX (143) +static const short yy_reduce_ofst[] = { + /* 0 */ 112, -33, -18, -9, 19, 42, 52, 61, 32, 70, + /* 10 */ 79, 88, 97, 104, 115, 125, 126, -46, -19, -4, + /* 20 */ 3, 84, 98, 41, 57, 120, 137, 143, 132, 136, + /* 30 */ 138, 139, 141, +}; +static const YYACTIONTYPE yy_default[] = { + /* 0 */ 190, 169, 169, 169, 169, 169, 169, 169, 169, 169, + /* 10 */ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + /* 20 */ 206, 201, 201, 178, 169, 209, 169, 169, 196, 235, + /* 30 */ 234, 235, 234, 220, 169, 169, 169, 225, 224, 169, + /* 40 */ 174, 174, 192, 169, 191, 202, 169, 169, 169, 169, + /* 50 */ 185, 182, 230, 175, 169, 169, 169, 175, 169, 169, + /* 60 */ 169, 169, +}; +/********** End of lemon-generated parsing tables *****************************/ + +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. +*/ +#ifdef YYFALLBACK +static const YYCODETYPE yyFallback[] = { +}; +#endif /* YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. +*/ +struct yyStackEntry { + YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ + YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct yyStackEntry yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct yyParser { + yyStackEntry *yytos; /* Pointer to top element of the stack */ +#ifdef YYTRACKMAXSTACKDEPTH + int yyhwm; /* High-water mark of the stack */ +#endif +#ifndef YYNOERRORRECOVERY + int yyerrcnt; /* Shifts left before out of the error */ +#endif + NewParseARG_SDECL /* A place to hold %extra_argument */ + NewParseCTX_SDECL /* A place to hold %extra_context */ +#if YYSTACKDEPTH<=0 + int yystksz; /* Current side of the stack */ + yyStackEntry *yystack; /* The parser's stack */ + yyStackEntry yystk0; /* First stack entry */ +#else + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ + yyStackEntry *yystackEnd; /* Last entry in the stack */ +#endif +}; +typedef struct yyParser yyParser; + +#ifndef NDEBUG +#include +static FILE *yyTraceFILE = 0; +static char *yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +**
    +**
  • A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +**
  • A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +**
+** +** Outputs: +** None. +*/ +void NewParseTrace(FILE *TraceFILE, char *zTracePrompt){ + yyTraceFILE = TraceFILE; + yyTracePrompt = zTracePrompt; + if( yyTraceFILE==0 ) yyTracePrompt = 0; + else if( yyTracePrompt==0 ) yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#if defined(YYCOVERAGE) || !defined(NDEBUG) +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const yyTokenName[] = { + /* 0 */ "$", + /* 1 */ "UNION", + /* 2 */ "ALL", + /* 3 */ "MINUS", + /* 4 */ "EXCEPT", + /* 5 */ "INTERSECT", + /* 6 */ "NK_PLUS", + /* 7 */ "NK_MINUS", + /* 8 */ "NK_STAR", + /* 9 */ "NK_SLASH", + /* 10 */ "SHOW", + /* 11 */ "DATABASES", + /* 12 */ "NK_ID", + /* 13 */ "NK_LP", + /* 14 */ "NK_RP", + /* 15 */ "NK_COMMA", + /* 16 */ "NK_LITERAL", + /* 17 */ "NK_DOT", + /* 18 */ "SELECT", + /* 19 */ "DISTINCT", + /* 20 */ "AS", + /* 21 */ "FROM", + /* 22 */ "WITH", + /* 23 */ "RECURSIVE", + /* 24 */ "ORDER", + /* 25 */ "BY", + /* 26 */ "ASC", + /* 27 */ "DESC", + /* 28 */ "NULLS", + /* 29 */ "FIRST", + /* 30 */ "LAST", + /* 31 */ "cmd", + /* 32 */ "query_expression", + /* 33 */ "value_function", + /* 34 */ "value_expression", + /* 35 */ "value_expression_primary", + /* 36 */ "nonparenthesized_value_expression_primary", + /* 37 */ "literal", + /* 38 */ "column_reference", + /* 39 */ "common_value_expression", + /* 40 */ "numeric_value_expression", + /* 41 */ "numeric_primary", + /* 42 */ "query_specification", + /* 43 */ "set_quantifier_opt", + /* 44 */ "select_list", + /* 45 */ "from_clause", + /* 46 */ "select_sublist", + /* 47 */ "select_item", + /* 48 */ "table_reference_list", + /* 49 */ "table_reference", + /* 50 */ "with_clause_opt", + /* 51 */ "query_expression_body", + /* 52 */ "order_by_clause_opt", + /* 53 */ "limit_clause_opt", + /* 54 */ "slimit_clause_opt", + /* 55 */ "with_list", + /* 56 */ "with_list_element", + /* 57 */ "table_subquery", + /* 58 */ "query_primary", + /* 59 */ "sort_specification_list", + /* 60 */ "sort_specification", + /* 61 */ "ordering_specification_opt", + /* 62 */ "null_ordering_opt", +}; +#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const yyRuleName[] = { + /* 0 */ "cmd ::= SHOW DATABASES", + /* 1 */ "cmd ::= query_expression", + /* 2 */ "column_reference ::= NK_ID", + /* 3 */ "column_reference ::= NK_ID NK_DOT NK_ID", + /* 4 */ "column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID", + /* 5 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause", + /* 6 */ "set_quantifier_opt ::=", + /* 7 */ "set_quantifier_opt ::= DISTINCT", + /* 8 */ "set_quantifier_opt ::= ALL", + /* 9 */ "select_list ::= NK_STAR", + /* 10 */ "select_list ::= select_sublist", + /* 11 */ "select_sublist ::= select_item", + /* 12 */ "select_sublist ::= select_sublist NK_COMMA select_item", + /* 13 */ "select_item ::= value_expression", + /* 14 */ "select_item ::= value_expression AS NK_ID", + /* 15 */ "select_item ::= NK_ID NK_DOT NK_STAR", + /* 16 */ "select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR", + /* 17 */ "query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt", + /* 18 */ "with_clause_opt ::=", + /* 19 */ "with_clause_opt ::= WITH with_list", + /* 20 */ "with_clause_opt ::= WITH RECURSIVE with_list", + /* 21 */ "with_list ::= with_list_element", + /* 22 */ "with_list ::= with_list NK_COMMA with_list_element", + /* 23 */ "with_list_element ::= NK_ID AS table_subquery", + /* 24 */ "table_subquery ::=", + /* 25 */ "query_expression_body ::= query_primary", + /* 26 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 27 */ "query_primary ::= query_specification", + /* 28 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP", + /* 29 */ "order_by_clause_opt ::=", + /* 30 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 31 */ "sort_specification_list ::= sort_specification", + /* 32 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 33 */ "sort_specification ::= value_expression ordering_specification_opt null_ordering_opt", + /* 34 */ "ordering_specification_opt ::=", + /* 35 */ "ordering_specification_opt ::= ASC", + /* 36 */ "ordering_specification_opt ::= DESC", + /* 37 */ "null_ordering_opt ::=", + /* 38 */ "null_ordering_opt ::= NULLS FIRST", + /* 39 */ "null_ordering_opt ::= NULLS LAST", + /* 40 */ "value_function ::= NK_ID NK_LP value_expression NK_RP", + /* 41 */ "value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP", + /* 42 */ "value_expression_primary ::= NK_LP value_expression NK_RP", + /* 43 */ "value_expression_primary ::= nonparenthesized_value_expression_primary", + /* 44 */ "nonparenthesized_value_expression_primary ::= literal", + /* 45 */ "nonparenthesized_value_expression_primary ::= column_reference", + /* 46 */ "literal ::= NK_LITERAL", + /* 47 */ "value_expression ::= common_value_expression", + /* 48 */ "common_value_expression ::= numeric_value_expression", + /* 49 */ "numeric_value_expression ::= numeric_primary", + /* 50 */ "numeric_value_expression ::= NK_PLUS numeric_primary", + /* 51 */ "numeric_value_expression ::= NK_MINUS numeric_primary", + /* 52 */ "numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression", + /* 53 */ "numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression", + /* 54 */ "numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression", + /* 55 */ "numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression", + /* 56 */ "numeric_primary ::= value_expression_primary", + /* 57 */ "numeric_primary ::= value_function", + /* 58 */ "from_clause ::= FROM table_reference_list", + /* 59 */ "table_reference_list ::= table_reference", + /* 60 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 61 */ "table_reference ::= NK_ID", + /* 62 */ "limit_clause_opt ::=", + /* 63 */ "slimit_clause_opt ::=", +}; +#endif /* NDEBUG */ + + +#if YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. +*/ +static int yyGrowStack(yyParser *p){ + int newSize; + int idx; + yyStackEntry *pNew; + + newSize = p->yystksz*2 + 100; + idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; + if( p->yystack==&p->yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->yystk0; + }else{ + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + } + if( pNew ){ + p->yystack = pNew; + p->yytos = &p->yystack[idx]; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, p->yystksz, newSize); + } +#endif + p->yystksz = newSize; + } + return pNew==0; +} +#endif + +/* Datatype of the argument to the memory allocated passed as the +** second argument to NewParseAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef YYMALLOCARGTYPE +# define YYMALLOCARGTYPE size_t +#endif + +/* Initialize a new parser that has already been allocated. +*/ +void NewParseInit(void *yypRawParser NewParseCTX_PDECL){ + yyParser *yypParser = (yyParser*)yypRawParser; + NewParseCTX_STORE +#ifdef YYTRACKMAXSTACKDEPTH + yypParser->yyhwm = 0; +#endif +#if YYSTACKDEPTH<=0 + yypParser->yytos = NULL; + yypParser->yystack = NULL; + yypParser->yystksz = 0; + if( yyGrowStack(yypParser) ){ + yypParser->yystack = &yypParser->yystk0; + yypParser->yystksz = 1; + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yypParser->yytos = yypParser->yystack; + yypParser->yystack[0].stateno = 0; + yypParser->yystack[0].major = 0; +#if YYSTACKDEPTH>0 + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; +#endif +} + +#ifndef NewParse_ENGINEALWAYSONSTACK +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to NewParse and NewParseFree. +*/ +void *NewParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) NewParseCTX_PDECL){ + yyParser *yypParser; + yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); + if( yypParser ){ + NewParseCTX_STORE + NewParseInit(yypParser NewParseCTX_PARAM); + } + return (void*)yypParser; +} +#endif /* NewParse_ENGINEALWAYSONSTACK */ + + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "yymajor" is the symbol code, and "yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. +*/ +static void yy_destructor( + yyParser *yypParser, /* The parser */ + YYCODETYPE yymajor, /* Type code for object to destroy */ + YYMINORTYPE *yypminor /* The object to be destroyed */ +){ + NewParseARG_FETCH + NewParseCTX_FETCH + switch( yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are *not* used + ** inside the C code. + */ +/********* Begin destructor definitions ***************************************/ + /* Default NON-TERMINAL Destructor */ + case 31: /* cmd */ + case 32: /* query_expression */ + case 33: /* value_function */ + case 34: /* value_expression */ + case 35: /* value_expression_primary */ + case 36: /* nonparenthesized_value_expression_primary */ + case 37: /* literal */ + case 38: /* column_reference */ + case 39: /* common_value_expression */ + case 40: /* numeric_value_expression */ + case 41: /* numeric_primary */ + case 42: /* query_specification */ + case 45: /* from_clause */ + case 47: /* select_item */ + case 48: /* table_reference_list */ + case 49: /* table_reference */ + case 50: /* with_clause_opt */ + case 51: /* query_expression_body */ + case 53: /* limit_clause_opt */ + case 54: /* slimit_clause_opt */ + case 55: /* with_list */ + case 56: /* with_list_element */ + case 57: /* table_subquery */ + case 58: /* query_primary */ + case 60: /* sort_specification */ +{ + nodesDestroyNode((yypminor->yy56)); +} + break; + case 43: /* set_quantifier_opt */ +{ + +} + break; + case 44: /* select_list */ + case 46: /* select_sublist */ + case 52: /* order_by_clause_opt */ + case 59: /* sort_specification_list */ +{ + nodesDestroyNodeList((yypminor->yy82)); +} + break; + case 61: /* ordering_specification_opt */ +{ + +} + break; + case 62: /* null_ordering_opt */ +{ + +} + break; +/********* End destructor definitions *****************************************/ + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +*/ +static void yy_pop_parser_stack(yyParser *pParser){ + yyStackEntry *yytos; + assert( pParser->yytos!=0 ); + assert( pParser->yytos > pParser->yystack ); + yytos = pParser->yytos--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + yy_destructor(pParser, yytos->major, &yytos->minor); +} + +/* +** Clear all secondary memory allocations from the parser +*/ +void NewParseFinalize(void *p){ + yyParser *pParser = (yyParser*)p; + while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); +#endif +} + +#ifndef NewParse_ENGINEALWAYSONSTACK +/* +** Deallocate and destroy a parser. Destructors are called for +** all stack elements before shutting the parser down. +** +** If the YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. +*/ +void NewParseFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ +#ifndef YYPARSEFREENEVERNULL + if( p==0 ) return; +#endif + NewParseFinalize(p); + (*freeProc)(p); +} +#endif /* NewParse_ENGINEALWAYSONSTACK */ + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef YYTRACKMAXSTACKDEPTH +int NewParseStackPeak(void *p){ + yyParser *pParser = (yyParser*)p; + return pParser->yyhwm; +} +#endif + +/* This array of booleans keeps track of the parser statement +** coverage. The element yycoverage[X][Y] is set when the parser +** is in state X and has a lookahead token Y. In a well-tested +** systems, every element of this matrix should end up being set. +*/ +#if defined(YYCOVERAGE) +static unsigned char yycoverage[YYNSTATE][YYNTOKEN]; +#endif + +/* +** Write into out a description of every state/lookahead combination that +** +** (1) has not been used by the parser, and +** (2) is not a syntax error. +** +** Return the number of missed state/lookahead combinations. +*/ +#if defined(YYCOVERAGE) +int NewParseCoverage(FILE *out){ + int stateno, iLookAhead, i; + int nMissed = 0; + for(stateno=0; statenoYY_MAX_SHIFT ) return stateno; + assert( stateno <= YY_SHIFT_COUNT ); +#if defined(YYCOVERAGE) + yycoverage[stateno][iLookAhead] = 1; +#endif + do{ + i = yy_shift_ofst[stateno]; + assert( i>=0 ); + /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */ + assert( iLookAhead!=YYNOCODE ); + assert( iLookAhead < YYNTOKEN ); + i += iLookAhead; + if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){ +#ifdef YYFALLBACK + YYCODETYPE iFallback; /* Fallback token */ + if( iLookAhead %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); + } +#endif + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; + } +#endif +#ifdef YYWILDCARD + { + int j = i - iLookAhead + YYWILDCARD; + if( +#if YY_SHIFT_MIN+YYWILDCARD<0 + j>=0 && +#endif +#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT + j0 + ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", + yyTracePrompt, yyTokenName[iLookAhead], + yyTokenName[YYWILDCARD]); + } +#endif /* NDEBUG */ + return yy_action[j]; + } + } +#endif /* YYWILDCARD */ + return yy_default[stateno]; + }else{ + return yy_action[i]; + } + }while(1); +} + +/* +** Find the appropriate action for a parser given the non-terminal +** look-ahead token iLookAhead. +*/ +static YYACTIONTYPE yy_find_reduce_action( + YYACTIONTYPE stateno, /* Current state number */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; +#ifdef YYERRORSYMBOL + if( stateno>YY_REDUCE_COUNT ){ + return yy_default[stateno]; + } +#else + assert( stateno<=YY_REDUCE_COUNT ); +#endif + i = yy_reduce_ofst[stateno]; + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; +#ifdef YYERRORSYMBOL + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + return yy_default[stateno]; + } +#else + assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ +/******** End %stack_overflow code ********************************************/ + NewParseARG_STORE /* Suppress warning about unused %extra_argument var */ + NewParseCTX_STORE +} + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){ + if( yyTraceFILE ){ + if( yyNewStateyytos->major], + yyNewState); + }else{ + fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n", + yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState - YY_MIN_REDUCE); + } + } +} +#else +# define yyTraceShift(X,Y,Z) +#endif + +/* +** Perform a shift action. +*/ +static void yy_shift( + yyParser *yypParser, /* The parser to be shifted */ + YYACTIONTYPE yyNewState, /* The new state to shift in */ + YYCODETYPE yyMajor, /* The major token to shift in */ + NewParseTOKENTYPE yyMinor /* The minor token to shift in */ +){ + yyStackEntry *yytos; + yypParser->yytos++; +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>yypParser->yystackEnd ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + if( yyGrowStack(yypParser) ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } + } +#endif + if( yyNewState > YY_MAX_SHIFT ){ + yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + } + yytos = yypParser->yytos; + yytos->stateno = yyNewState; + yytos->major = yyMajor; + yytos->minor.yy0 = yyMinor; + yyTraceShift(yypParser, yyNewState, "Shift"); +} + +/* The following table contains information about every rule that +** is used during the reduce. +*/ +static const struct { + YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ + signed char nrhs; /* Negative of the number of RHS symbols in the rule */ +} yyRuleInfo[] = { + { 31, -2 }, /* (0) cmd ::= SHOW DATABASES */ + { 31, -1 }, /* (1) cmd ::= query_expression */ + { 38, -1 }, /* (2) column_reference ::= NK_ID */ + { 38, -3 }, /* (3) column_reference ::= NK_ID NK_DOT NK_ID */ + { 38, -5 }, /* (4) column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID */ + { 42, -4 }, /* (5) query_specification ::= SELECT set_quantifier_opt select_list from_clause */ + { 43, 0 }, /* (6) set_quantifier_opt ::= */ + { 43, -1 }, /* (7) set_quantifier_opt ::= DISTINCT */ + { 43, -1 }, /* (8) set_quantifier_opt ::= ALL */ + { 44, -1 }, /* (9) select_list ::= NK_STAR */ + { 44, -1 }, /* (10) select_list ::= select_sublist */ + { 46, -1 }, /* (11) select_sublist ::= select_item */ + { 46, -3 }, /* (12) select_sublist ::= select_sublist NK_COMMA select_item */ + { 47, -1 }, /* (13) select_item ::= value_expression */ + { 47, -3 }, /* (14) select_item ::= value_expression AS NK_ID */ + { 47, -3 }, /* (15) select_item ::= NK_ID NK_DOT NK_STAR */ + { 47, -5 }, /* (16) select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR */ + { 32, -5 }, /* (17) query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ + { 50, 0 }, /* (18) with_clause_opt ::= */ + { 50, -2 }, /* (19) with_clause_opt ::= WITH with_list */ + { 50, -3 }, /* (20) with_clause_opt ::= WITH RECURSIVE with_list */ + { 55, -1 }, /* (21) with_list ::= with_list_element */ + { 55, -3 }, /* (22) with_list ::= with_list NK_COMMA with_list_element */ + { 56, -3 }, /* (23) with_list_element ::= NK_ID AS table_subquery */ + { 57, 0 }, /* (24) table_subquery ::= */ + { 51, -1 }, /* (25) query_expression_body ::= query_primary */ + { 51, -4 }, /* (26) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 58, -1 }, /* (27) query_primary ::= query_specification */ + { 58, -6 }, /* (28) query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ + { 52, 0 }, /* (29) order_by_clause_opt ::= */ + { 52, -3 }, /* (30) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 59, -1 }, /* (31) sort_specification_list ::= sort_specification */ + { 59, -3 }, /* (32) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 60, -3 }, /* (33) sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ + { 61, 0 }, /* (34) ordering_specification_opt ::= */ + { 61, -1 }, /* (35) ordering_specification_opt ::= ASC */ + { 61, -1 }, /* (36) ordering_specification_opt ::= DESC */ + { 62, 0 }, /* (37) null_ordering_opt ::= */ + { 62, -2 }, /* (38) null_ordering_opt ::= NULLS FIRST */ + { 62, -2 }, /* (39) null_ordering_opt ::= NULLS LAST */ + { 33, -4 }, /* (40) value_function ::= NK_ID NK_LP value_expression NK_RP */ + { 33, -6 }, /* (41) value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ + { 35, -3 }, /* (42) value_expression_primary ::= NK_LP value_expression NK_RP */ + { 35, -1 }, /* (43) value_expression_primary ::= nonparenthesized_value_expression_primary */ + { 36, -1 }, /* (44) nonparenthesized_value_expression_primary ::= literal */ + { 36, -1 }, /* (45) nonparenthesized_value_expression_primary ::= column_reference */ + { 37, -1 }, /* (46) literal ::= NK_LITERAL */ + { 34, -1 }, /* (47) value_expression ::= common_value_expression */ + { 39, -1 }, /* (48) common_value_expression ::= numeric_value_expression */ + { 40, -1 }, /* (49) numeric_value_expression ::= numeric_primary */ + { 40, -2 }, /* (50) numeric_value_expression ::= NK_PLUS numeric_primary */ + { 40, -2 }, /* (51) numeric_value_expression ::= NK_MINUS numeric_primary */ + { 40, -3 }, /* (52) numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ + { 40, -3 }, /* (53) numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ + { 40, -3 }, /* (54) numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ + { 40, -3 }, /* (55) numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ + { 41, -1 }, /* (56) numeric_primary ::= value_expression_primary */ + { 41, -1 }, /* (57) numeric_primary ::= value_function */ + { 45, -2 }, /* (58) from_clause ::= FROM table_reference_list */ + { 48, -1 }, /* (59) table_reference_list ::= table_reference */ + { 48, -3 }, /* (60) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 49, -1 }, /* (61) table_reference ::= NK_ID */ + { 53, 0 }, /* (62) limit_clause_opt ::= */ + { 54, 0 }, /* (63) slimit_clause_opt ::= */ +}; + +static void yy_accept(yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +** +** The yyLookahead and yyLookaheadToken parameters provide reduce actions +** access to the lookahead token (if any). The yyLookahead will be YYNOCODE +** if the lookahead token has already been consumed. As this procedure is +** only called from one place, optimizing compilers will in-line it, which +** means that the extra parameters have no performance impact. +*/ +static YYACTIONTYPE yy_reduce( + yyParser *yypParser, /* The parser */ + unsigned int yyruleno, /* Number of the rule by which to reduce */ + int yyLookahead, /* Lookahead token, or YYNOCODE if none */ + NewParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ + NewParseCTX_PDECL /* %extra_context */ +){ + int yygoto; /* The next state */ + YYACTIONTYPE yyact; /* The next action */ + yyStackEntry *yymsp; /* The top of the parser's stack */ + int yysize; /* Amount to pop the stack */ + NewParseARG_FETCH + (void)yyLookahead; + (void)yyLookaheadToken; + yymsp = yypParser->yytos; +#ifndef NDEBUG + if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ + yysize = yyRuleInfo[yyruleno].nrhs; + if( yysize ){ + fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", + yyTracePrompt, + yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno); + }else{ + fprintf(yyTraceFILE, "%sReduce %d [%s].\n", + yyTracePrompt, yyruleno, yyRuleName[yyruleno]); + } + } +#endif /* NDEBUG */ + + /* Check that the stack is large enough to grow by a single entry + ** if the RHS of the rule is empty. This ensures that there is room + ** enough on the stack to push the LHS value */ + if( yyRuleInfo[yyruleno].nrhs==0 ){ +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=yypParser->yystackEnd ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } + yymsp = yypParser->yytos; + } +#endif + } + + switch( yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line + ** { ... } // User supplied code + ** #line + ** break; + */ +/********** Begin reduce actions **********************************************/ + YYMINORTYPE yylhsminor; + case 0: /* cmd ::= SHOW DATABASES */ +{ createShowStmt(pCxt, SHOW_TYPE_DATABASE); } + break; + case 1: /* cmd ::= query_expression */ +{ pCxt->pRootNode = yymsp[0].minor.yy56; } + break; + case 2: /* column_reference ::= NK_ID */ +{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, NULL, yymsp[0].minor.yy0); } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 3: /* column_reference ::= NK_ID NK_DOT NK_ID */ + case 15: /* select_item ::= NK_ID NK_DOT NK_STAR */ yytestcase(yyruleno==15); +{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, yymsp[-2].minor.yy0, yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 4: /* column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID */ + case 16: /* select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR */ yytestcase(yyruleno==16); +{ yylhsminor.yy56 = createColumnNode(pCxt, yymsp[-4].minor.yy0, yymsp[-2].minor.yy0, yymsp[0].minor.yy0); } + yymsp[-4].minor.yy56 = yylhsminor.yy56; + break; + case 5: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause */ +{ yymsp[-3].minor.yy56 = createSelectStmt(pCxt, yymsp[-2].minor.yy47, yymsp[-1].minor.yy82, yymsp[0].minor.yy56); } + break; + case 6: /* set_quantifier_opt ::= */ +{ yymsp[1].minor.yy47 = false; } + break; + case 7: /* set_quantifier_opt ::= DISTINCT */ +{ yymsp[0].minor.yy47 = true; } + break; + case 8: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy47 = false; } + break; + case 9: /* select_list ::= NK_STAR */ +{ yymsp[0].minor.yy82 = NULL; } + break; + case 10: /* select_list ::= select_sublist */ +{ yylhsminor.yy82 = yymsp[0].minor.yy82; } + yymsp[0].minor.yy82 = yylhsminor.yy82; + break; + case 11: /* select_sublist ::= select_item */ + case 31: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==31); +{ yylhsminor.yy82 = createNodeList(pCxt, yymsp[0].minor.yy56); } + yymsp[0].minor.yy82 = yylhsminor.yy82; + break; + case 12: /* select_sublist ::= select_sublist NK_COMMA select_item */ + case 32: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==32); +{ yylhsminor.yy82 = addNodeToList(pCxt, yymsp[-2].minor.yy82, yymsp[0].minor.yy56); } + yymsp[-2].minor.yy82 = yylhsminor.yy82; + break; + case 13: /* select_item ::= value_expression */ + case 25: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==25); + case 27: /* query_primary ::= query_specification */ yytestcase(yyruleno==27); +{ yylhsminor.yy56 = yymsp[0].minor.yy56; } + yymsp[0].minor.yy56 = yylhsminor.yy56; + break; + case 14: /* select_item ::= value_expression AS NK_ID */ +{ yylhsminor.yy56 = setProjectionAlias(pCxt, yymsp[-2].minor.yy56, yymsp[0].minor.yy0); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 17: /* query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ +{ yy_destructor(yypParser,50,&yymsp[-4].minor); +{ yymsp[-4].minor.yy56 = yymsp[-3].minor.yy56; } + yy_destructor(yypParser,52,&yymsp[-2].minor); + yy_destructor(yypParser,53,&yymsp[-1].minor); + yy_destructor(yypParser,54,&yymsp[0].minor); +} + break; + case 18: /* with_clause_opt ::= */ + case 24: /* table_subquery ::= */ yytestcase(yyruleno==24); +{} + break; + case 19: /* with_clause_opt ::= WITH with_list */ + case 20: /* with_clause_opt ::= WITH RECURSIVE with_list */ yytestcase(yyruleno==20); +{ pCxt->notSupport = true; pCxt->valid = false; } + yy_destructor(yypParser,55,&yymsp[0].minor); + break; + case 21: /* with_list ::= with_list_element */ +{ yy_destructor(yypParser,56,&yymsp[0].minor); +{} +} + break; + case 22: /* with_list ::= with_list NK_COMMA with_list_element */ +{ yy_destructor(yypParser,55,&yymsp[-2].minor); +{} + yy_destructor(yypParser,56,&yymsp[0].minor); +} + break; + case 23: /* with_list_element ::= NK_ID AS table_subquery */ +{} + yy_destructor(yypParser,57,&yymsp[0].minor); + break; + case 26: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy56 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy56, yymsp[0].minor.yy56); } + yymsp[-3].minor.yy56 = yylhsminor.yy56; + break; + case 28: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ +{ yymsp[-5].minor.yy56 = yymsp[-4].minor.yy56;} + yy_destructor(yypParser,52,&yymsp[-3].minor); + yy_destructor(yypParser,53,&yymsp[-2].minor); + yy_destructor(yypParser,54,&yymsp[-1].minor); + break; + case 29: /* order_by_clause_opt ::= */ +{ yymsp[1].minor.yy82 = NULL; } + break; + case 30: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ +{ yymsp[-2].minor.yy82 = yymsp[0].minor.yy82; } + break; + case 33: /* sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy56 = createOrderByExprNode(pCxt, yymsp[-2].minor.yy56, yymsp[-1].minor.yy92, yymsp[0].minor.yy109); } + yymsp[-2].minor.yy56 = yylhsminor.yy56; + break; + case 34: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy92 = ORDER_ASC; } + break; + case 35: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy92 = ORDER_ASC; } + break; + case 36: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy92 = ORDER_DESC; } + break; + case 37: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy109 = NULL_ORDER_DEFAULT; } + break; + case 38: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy109 = NULL_ORDER_FIRST; } + break; + case 39: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy109 = NULL_ORDER_LAST; } + break; + case 40: /* value_function ::= NK_ID NK_LP value_expression NK_RP */ + case 42: /* value_expression_primary ::= NK_LP value_expression NK_RP */ yytestcase(yyruleno==42); +{ +} + yy_destructor(yypParser,34,&yymsp[-1].minor); + break; + case 41: /* value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ +{ +} + yy_destructor(yypParser,34,&yymsp[-3].minor); + yy_destructor(yypParser,34,&yymsp[-1].minor); + break; + case 43: /* value_expression_primary ::= nonparenthesized_value_expression_primary */ +{ yy_destructor(yypParser,36,&yymsp[0].minor); +{ +} +} + break; + case 44: /* nonparenthesized_value_expression_primary ::= literal */ +{ yy_destructor(yypParser,37,&yymsp[0].minor); +{ +} +} + break; + case 45: /* nonparenthesized_value_expression_primary ::= column_reference */ +{ yy_destructor(yypParser,38,&yymsp[0].minor); +{ +} +} + break; + case 47: /* value_expression ::= common_value_expression */ +{ yy_destructor(yypParser,39,&yymsp[0].minor); +{ +} +} + break; + case 48: /* common_value_expression ::= numeric_value_expression */ +{ yy_destructor(yypParser,40,&yymsp[0].minor); +{ +} +} + break; + case 49: /* numeric_value_expression ::= numeric_primary */ +{ yy_destructor(yypParser,41,&yymsp[0].minor); +{ +} +} + break; + case 50: /* numeric_value_expression ::= NK_PLUS numeric_primary */ + case 51: /* numeric_value_expression ::= NK_MINUS numeric_primary */ yytestcase(yyruleno==51); +{ +} + yy_destructor(yypParser,41,&yymsp[0].minor); + break; + case 52: /* numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ + case 53: /* numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ yytestcase(yyruleno==53); + case 54: /* numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ yytestcase(yyruleno==54); + case 55: /* numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ yytestcase(yyruleno==55); +{ yy_destructor(yypParser,40,&yymsp[-2].minor); +{ +} + yy_destructor(yypParser,40,&yymsp[0].minor); +} + break; + case 56: /* numeric_primary ::= value_expression_primary */ +{ yy_destructor(yypParser,35,&yymsp[0].minor); +{ +} +} + break; + case 57: /* numeric_primary ::= value_function */ +{ yy_destructor(yypParser,33,&yymsp[0].minor); +{ +} +} + break; + case 58: /* from_clause ::= FROM table_reference_list */ +{ +} + yy_destructor(yypParser,48,&yymsp[0].minor); + break; + case 59: /* table_reference_list ::= table_reference */ +{ yy_destructor(yypParser,49,&yymsp[0].minor); +{ +} +} + break; + case 60: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yy_destructor(yypParser,48,&yymsp[-2].minor); +{ +} + yy_destructor(yypParser,49,&yymsp[0].minor); +} + break; + default: + /* (46) literal ::= NK_LITERAL */ yytestcase(yyruleno==46); + /* (61) table_reference ::= NK_ID */ yytestcase(yyruleno==61); + /* (62) limit_clause_opt ::= */ yytestcase(yyruleno==62); + /* (63) slimit_clause_opt ::= */ yytestcase(yyruleno==63); + break; +/********** End reduce actions ************************************************/ + }; + assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); + + /* It is not possible for a REDUCE to be followed by an error */ + assert( yyact!=YY_ERROR_ACTION ); + + yymsp += yysize+1; + yypParser->yytos = yymsp; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yyTraceShift(yypParser, yyact, "... then shift"); + return yyact; +} + +/* +** The following code executes when the parse fails +*/ +#ifndef YYNOERRORRECOVERY +static void yy_parse_failed( + yyParser *yypParser /* The parser */ +){ + NewParseARG_FETCH + NewParseCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + } +#endif + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + NewParseARG_STORE /* Suppress warning about unused %extra_argument variable */ + NewParseCTX_STORE +} +#endif /* YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void yy_syntax_error( + yyParser *yypParser, /* The parser */ + int yymajor, /* The major type of the error token */ + NewParseTOKENTYPE yyminor /* The minor type of the error token */ +){ + NewParseARG_FETCH + NewParseCTX_FETCH +#define TOKEN yyminor +/************ Begin %syntax_error code ****************************************/ + + if(TOKEN->z) { + char msg[] = "syntax error near \"%s\""; + int32_t sqlLen = strlen(&TOKEN->z[0]); + + if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > pCxt->pQueryCxt->msgLen) { + char tmpstr[128] = {0}; + memcpy(tmpstr, &TOKEN->z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); + sprintf(pCxt->pQueryCxt->pMsg, msg, tmpstr); + } else { + sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN->z[0]); + } + } else { + sprintf(pCxt->pQueryCxt->pMsg, "Incomplete SQL statement"); + } + pCxt->valid = false; +/************ End %syntax_error code ******************************************/ + NewParseARG_STORE /* Suppress warning about unused %extra_argument variable */ + NewParseCTX_STORE +} + +/* +** The following is executed when the parser accepts +*/ +static void yy_accept( + yyParser *yypParser /* The parser */ +){ + NewParseARG_FETCH + NewParseCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + assert( yypParser->yytos==yypParser->yystack ); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +/*********** Begin %parse_accept code *****************************************/ + printf("parsing complete!\n" ); +/*********** End %parse_accept code *******************************************/ + NewParseARG_STORE /* Suppress warning about unused %extra_argument variable */ + NewParseCTX_STORE +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "NewParseAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +**
    +**
  • A pointer to the parser (an opaque structure.) +**
  • The major token number. +**
  • The minor token number. +**
  • An option argument of a grammar-specified type. +**
+** +** Outputs: +** None. +*/ +void NewParse( + void *yyp, /* The parser */ + int yymajor, /* The major token code number */ + NewParseTOKENTYPE yyminor /* The value for the token */ + NewParseARG_PDECL /* Optional %extra_argument parameter */ +){ + YYMINORTYPE yyminorunion; + YYACTIONTYPE yyact; /* The parser action. */ +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + int yyendofinput; /* True if we are at the end of input */ +#endif +#ifdef YYERRORSYMBOL + int yyerrorhit = 0; /* True if yymajor has invoked an error */ +#endif + yyParser *yypParser = (yyParser*)yyp; /* The parser */ + NewParseCTX_FETCH + NewParseARG_STORE + + assert( yypParser->yytos!=0 ); +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + yyendofinput = (yymajor==0); +#endif + + yyact = yypParser->yytos->stateno; +#ifndef NDEBUG + if( yyTraceFILE ){ + if( yyact < YY_MIN_REDUCE ){ + fprintf(yyTraceFILE,"%sInput '%s' in state %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact); + }else{ + fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE); + } + } +#endif + + do{ + assert( yyact==yypParser->yytos->stateno ); + yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact); + if( yyact >= YY_MIN_REDUCE ){ + yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor, + yyminor NewParseCTX_PARAM); + }else if( yyact <= YY_MAX_SHIFTREDUCE ){ + yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt--; +#endif + break; + }else if( yyact==YY_ACCEPT_ACTION ){ + yypParser->yytos--; + yy_accept(yypParser); + return; + }else{ + assert( yyact == YY_ERROR_ACTION ); + yyminorunion.yy0 = yyminor; +#ifdef YYERRORSYMBOL + int yymx; +#endif +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + } +#endif +#ifdef YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( yypParser->yyerrcnt<0 ){ + yy_syntax_error(yypParser,yymajor,yyminor); + } + yymx = yypParser->yytos->major; + if( yymx==YYERRORSYMBOL || yyerrorhit ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sDiscard input token %s\n", + yyTracePrompt,yyTokenName[yymajor]); + } +#endif + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); + yymajor = YYNOCODE; + }else{ + while( yypParser->yytos >= yypParser->yystack + && (yyact = yy_find_reduce_action( + yypParser->yytos->stateno, + YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE + ){ + yy_pop_parser_stack(yypParser); + } + if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yymajor = YYNOCODE; + }else if( yymx!=YYERRORSYMBOL ){ + yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); + } + } + yypParser->yyerrcnt = 3; + yyerrorhit = 1; + if( yymajor==YYNOCODE ) break; + yyact = yypParser->yytos->stateno; +#elif defined(YYNOERRORRECOVERY) + /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + yy_syntax_error(yypParser,yymajor, yyminor); + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + break; +#else /* YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( yypParser->yyerrcnt<=0 ){ + yy_syntax_error(yypParser,yymajor, yyminor); + } + yypParser->yyerrcnt = 3; + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + if( yyendofinput ){ + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + } + break; +#endif + } + }while( yypParser->yytos>yypParser->yystack ); +#ifndef NDEBUG + if( yyTraceFILE ){ + yyStackEntry *i; + char cDiv = '['; + fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); + for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ + fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(yyTraceFILE,"]\n"); + } +#endif + return; +} + +/* +** Return the fallback token corresponding to canonical token iToken, or +** 0 if iToken has no fallback. +*/ +int NewParseFallback(int iToken){ +#ifdef YYFALLBACK + if( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ){ + return yyFallback[iToken]; + } +#else + (void)iToken; +#endif + return 0; +} diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 58e368aa0d..5435e12705 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -243,7 +243,7 @@ void qDestroyQuery(SQueryNode* pQueryNode) { if (NULL == pQueryNode) { return; } - if (nodeType(pQueryNode) == TSDB_SQL_INSERT || nodeType(pQueryNode) == TSDB_SQL_CREATE_TABLE) { + if (queryNodeType(pQueryNode) == TSDB_SQL_INSERT || queryNodeType(pQueryNode) == TSDB_SQL_CREATE_TABLE) { SVnodeModifOpStmtInfo* pModifInfo = (SVnodeModifOpStmtInfo*)pQueryNode; taosArrayDestroy(pModifInfo->pDataBlocks); } diff --git a/source/libs/planner/src/logicPlan.c b/source/libs/planner/src/logicPlan.c index e817b764d5..456137e5c0 100644 --- a/source/libs/planner/src/logicPlan.c +++ b/source/libs/planner/src/logicPlan.c @@ -74,7 +74,7 @@ int32_t createSelectPlan(const SQueryStmtInfo* pSelect, SQueryPlanNode** pQueryP } int32_t createQueryPlan(const SQueryNode* pNode, SQueryPlanNode** pQueryPlan) { - switch (nodeType(pNode)) { + switch (queryNodeType(pNode)) { case TSDB_SQL_SELECT: { return createSelectPlan((const SQueryStmtInfo*)pNode, pQueryPlan); } diff --git a/source/nodes/src/nodesUtilFuncs.c b/source/nodes/src/nodesUtilFuncs.c index 5c524d2749..646d86ab87 100644 --- a/source/nodes/src/nodesUtilFuncs.c +++ b/source/nodes/src/nodesUtilFuncs.c @@ -22,3 +22,15 @@ bool nodesIsTimeorderQuery(const SNode* pQuery) { bool nodesIsTimelineQuery(const SNode* pQuery) { } + +SNode* nodesMakeNode(ENodeType type) { + +} + +void nodesDestroyNode(SNode* pNode) { + +} + +void nodesDestroyNodeList(SNodeList* pList) { + +} From 71caca1138180b94d8291d31e9ac884e518e1233 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Sun, 23 Jan 2022 07:35:21 -0500 Subject: [PATCH 03/37] TD-13120 SELECT statement syntax definition --- source/libs/parser/inc/CMakeCache.txt | 381 ---------- .../3.18.2/CMakeDetermineCompilerABI_C.bin | Bin 17280 -> 0 bytes .../3.18.2/CMakeDetermineCompilerABI_CXX.bin | Bin 17296 -> 0 bytes .../3.18.2/CompilerIdC/CMakeCCompilerId.c | 674 ------------------ .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 663 ----------------- source/libs/parser/inc/CMakeFiles/Makefile2 | 125 ---- source/libs/parser/inc/CMakeFiles/Progress/1 | 1 - .../parser/inc/CMakeFiles/Progress/count.txt | 1 - .../inc/CMakeFiles/TargetDirectories.txt | 3 - .../parser/inc/CMakeFiles/cmake.check_cache | 1 - 10 files changed, 1849 deletions(-) delete mode 100644 source/libs/parser/inc/CMakeCache.txt delete mode 100755 source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin delete mode 100755 source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c delete mode 100644 source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 source/libs/parser/inc/CMakeFiles/Makefile2 delete mode 100644 source/libs/parser/inc/CMakeFiles/Progress/1 delete mode 100644 source/libs/parser/inc/CMakeFiles/Progress/count.txt delete mode 100644 source/libs/parser/inc/CMakeFiles/TargetDirectories.txt delete mode 100644 source/libs/parser/inc/CMakeFiles/cmake.check_cache diff --git a/source/libs/parser/inc/CMakeCache.txt b/source/libs/parser/inc/CMakeCache.txt deleted file mode 100644 index e4e333b923..0000000000 --- a/source/libs/parser/inc/CMakeCache.txt +++ /dev/null @@ -1,381 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc -# It was generated by CMake: /usr/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//For backwards compatibility, what version of CMake commands and -// syntax should this version of CMake try to support. -CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING= - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler -CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib - -//Flags used by the CXX compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the CXX compiler during DEBUG builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the CXX compiler during RELEASE builds. -CMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -DNDEBUG - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib - -//Flags used by the C compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the C compiler during DEBUG builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the C compiler during RELEASE builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O2 -DNDEBUG - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker during all build types. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake - -//Flags used by the linker during the creation of modules during -// all build types. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Path to a program. -CMAKE_READELF:FILEPATH=/usr/bin/readelf - -//Flags used by the linker during the creation of shared libraries -// during all build types. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Single output directory for building all executables. -EXECUTABLE_OUTPUT_PATH:PATH= - -//Single output directory for building all libraries. -LIBRARY_OUTPUT_PATH:PATH= - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=/home/wangxiaoyu/work/code/TDengine/source/libs/parser - -//Dependencies for the target -parser_LIB_DEPENDS:STATIC=general;os;general;util;general;nodes;general;catalog;general;function;general;transport;general;qcom; - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=18 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/home/wangxiaoyu/work/code/TDengine/source/libs/parser -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/share/cmake -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/usr/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 - diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin b/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_C.bin deleted file mode 100755 index 106875da1bfa2afef444079ee551343c0ae0861c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17280 zcmeHO4{RIN8Gp8$Kc%e`pk*B`)M!O&%W_Gxq)VY?b`mF-Elo6Gp!{v0n%&pn?RdCEN_^uHeo2kOk6{xRfL%&OgWP-PytMZ z2uVKbVO_&PnFTr|ZOC-B=G)Bjm!cK%NwRGCM=k;-VLCK^*q;9Pl7wBJglYtv9zOBPAHQ_->fLvJ^Nyv@QcMVF+=l&=fk~#Um})>Cc<^d zV;Y4Y;-Wf?Sd z$0ng^c(3J*Sk}lxUlCG@O5n#>t`c3@jaDwEa+V#6t2B-0}q zEtlM@XGXNdgpn1Ro`@MSuz|$13YpRIOqz<&z+OMxCz5F`pVJf8;-EAGETj<}&gEDg z%XclkySJykLu*!=l~%K1=A8DyJT3o+5+;g$Yo`3=$;J4WaGdgUbwlzF=eUnBB=Z)W z|85Xpu;BPN!s(0!=Q)79f7M<2mb&j$t$I(D@1l@UzcOR^3s0&0ep)*#Rgu5(m7eLR zZ&RmVQ1`vGuzjHC_zaG!di)qp9`*Qf9Q(qGA1)4w*AJom?1)mgX1`QFq#oS*Ct#=t ztA2}Q^BH3W6m;=jM)f_ZK7H0$ z4h9CvKy6`eq;5@TNgvCf+8P74$X~ikojy6gw@@fNS=A4SZ*cYylmpVG3ZneWccb9+ zou}04{M_;AJ6NB4qNmiubx%y;Jgxijj4%2QBl8yIok2@mrDe1ixv6LR*~pDO)2Ac5 zBGd0i26_)({d#ps>{1UlAl=!!{v`JK{9R`Y1@+jw0b|X^6V(3R>9=~PPj^ng8YwJ) zPTe=_Q#U`K{|Ao8t%H#-L^z31vM}W=&#e~moOuoH4 zgm1Fmw`yrkEv|hyzj3WT`fi~hpDCR+^@ugW?^l3fIhare21ul#4EZdH1nUp@JC;@7 z4u*(_bvO)s9jNFE*5Buk23LM95DkV7E{X=%-CLywn+{Z~!M1%h-NA4=*cJ&kMS|3IH9IbHob z270<~5d~Dc%%*#dd{?;nW-YRFXB4FR`*s4~QJ)(0;fwx>tm9R3iaBg$#*>CNl8ue) z+C(OqhL@spTh;i!dNKTDGHsb{%j&UIaui=(%g1TV94CGsWa{ku$~b+<;}oxq6TW+& z_kT~h$~avR4F$1@*|qak7y-YS)a^hp8Svx+>by%2>m_$bkrT$VDp2VV}-s< zN!Hyja_XR;Zu2KAe#(X6PgeYt3uBxre#(V0P8C1pyc{QdNw=*}v5lo~s^p`%$?!f1 zQ#Tp*ahSTv@P689%f6JeKD@_vl=j-(?1ZVV{C&4<-DUraY&=Z#!}h;$-{k+Wk0bYo z9D6V4H2+ZXgWSjQ@V{jJ@v|+a`-z^D|K-qmFZ*nl=fb(zcj}bQv-8xy`>4;evT-_3 z{kzIIIo6}|)W55YlVhCDQ~&OxK2C1F60dhm|63XM+1`E+-;I5?$7x-b3%bW80GmK< z{%{#L0B3^+T=9S~T=7N4@2FN|0q|_*UFEBb-&yVQHNx%tW&l2*@pno<>w%x}z~At|mtupVUCw%5O*rpEqB^Fn zg!8+Yi3)Lxhn>6!e!mC)ga>}Y1Ap5CUxS{%OS`ss;Ddxa+q<7|XL}z3+-;sb&UPHn zsb3Jz&r0sMzY^~3|2IAG6}S+&w5!CKlRlxml4m(^OX48^>mhcG&K1ldc2c84mXF2DM(+Sg;C0_m>sMa{waU{7r+jBT+Zin zJ;?juG{?^!^Y#j92hPn`hf%TkPTwl!%b(}h1CI8c>%t8ZFJE60($0#q^ZgSNFMs}D z2?s{}aB9Q34juq`JeU7aO&BXstmgxOha_UZye#qZ_<_d&cRQ~?3%Fa{!Y=`Li;MU> z$vfi{P6O^%pDJjVTin8Oz}?~&24JFMe1bDB;#FCn((}BLn!Oh6xWzLxk$v9pl4p=X zrxkFwdWyz;E{nk~jc`J#5u#kQO)U*sJuwzD%*dCu+bYe-v zFass-%*(g~hm10oG2G89K(GU?)x_b+am^e)kf?_!T`h(jcccV3nXXGK8BQ8qOOqwwchYcZ~DTgsj8ErI`8IGm2gptYSv{-&p#53a)Dc#T$%BPz* zx3~+*I4Lcb&BpdXGmY#XVIB@lxvC7VYcQAacsCjbT!WTt*vB=qtal+MkzO%&MU+DBt%;#;V%|* zV|ZFsN$g33J(EHxoaEfDXLER1)tb?O2M^^KDhLIqzEBK(60S1dPRV9u44tBn(aaf3 zfClGG4RZ>a8hj7tV&h3z*hX>Hf{QYdf*aEq#M21{Ci6HPlel~sHS24)o zT8k{+I`umNI}K;Tx%|WaFd%rIT@ta~Bt`!Y_nfS$4>EZ6ne};}W}bj4>>Nno-pIDI zKA%^=5penHfTW;!=@-1eAv-p@*6E119}L4R(;;TI)alD5`KrXCK{F^^Z?wUKDU3SCM+^e_N-vl!hqf_sp6PD@!=Yk*-ml|$e~#;=B8K;EBogW?784aMRDwi)Ecd!I2gJ0ZQuRegFUf diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin b/source/libs/parser/inc/CMakeFiles/3.18.2/CMakeDetermineCompilerABI_CXX.bin deleted file mode 100755 index a9be1ade778eb7e6c45137fd39b934766f7fbbdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17296 zcmeHOeQaCR6~DHdFKC?rEeo`xMgyrI%gYC8mlnF&Nu0cFX;YdM${>Al?3cvUu`~M_ z(vAtV7PP<$(ImENe=wNFR5bqRq`@CdZ0QPglVE~r8%zZ$d=zD)uuN=F7&JTQzH{vN zp5LpgX@geyw$8ctcRuc?{m#Abp4+3nU4EZWaPo^U3t6fROUV2y#Pl^RAw*cTi5mF3 zLM#`R055_M%Y`Y&^dy;PT1{pGq}S#*fi{0wW|*!pVW`7Q+(M)kgqb8vC6mrm1x$qq zNj~afTkC?d2y{qhm@cMv)DdMpETUeB^g^V^bcPznl>3Kcf}a7hH{cIL3Cm$5qEr4Y zQk2EC^|+D1{K+a=1R9nZrmZF{n6lorpoi@|(^N--+o(RTaha$7F{PqtOeKfcw>G8{ z4XI>0KiM$Zw!UF~tCGtoEwbNeA7#6@Y?n3ReDly^o0q}|G31Aze6!+%U(AQ{le_ER zf9TaM$LDXq1bH~mXaoE8oog?z2=k}JpiJfX(ez%F5FuIyU+#4euZ4{t3B{3!0W^^ zv7&Csru8Gj>mB%`62Dl49QZ?khro_gej4x##1b(>>x9?CKEN*&=ZiNh!;ljK+lT34 z_#iF_Z3lO*3n_H~kfj_?NwuOM8&y2u%c_}aC&7S;<*8y(N2wVV;l z8k#1wo`KC;LeJ`>$(*5Q2R3)4GHHDvHk{H;o+}4zj+^EnHyV#?IV?3}U2(1k^Hj}v zESVOXo`@MSFxm%bBAM3mIXwZ*LDZB3ku)O1xf}zUv=YzdwPZSJ0IyIU0YG&3_Oy3s zElP{B&g`zaqJ6MR-TsY(5P#3|mnLiQ8}JH^(`@aK%;DPh5r$;Wg7fzU@p%i5-wjSD zEjZ6T^4_hz>_c_$iE8zpikkC6LcMdw@Gm^C?tQBI2&+npa?Nk|OuevEoqA2(`^Nm% zfu5r?IIHT>!#L^c(WAJA7M49x6B7TNM)@NnO6|&hQhi$8zv(Z)Q1@5-0m+7w#xkh# zF3dxfH4C$~EAK$bBSb;|5h=g!$4FM6QV*XBs8jRm;kmDb?g$4ES#{pwy^D*jw@6?CAQ}1<7{XMd<^ksGL5udu@ zmHgjuUTz$W+!Ps%?2KqfM(pj!8N+(zd^%>(SNK)MUJ22&rK@jaF1bg~jA)4oBYR_0 z+h75Y4JU7e=RE?x<$sf44FD_G}Zr z$vWTi#Z}eQuz+!$IINK zV5mJ<-yW=M4_3?eJPPVFV2A5QbLCVXf$|8HN1!|c?jtZ;8J3JgMA$GFFfBHTc&Q>Rb4#dvu*xi7LS^2EEvGU*3ou=35>X!lmU&#}sl1W+r2eT9-p9H%pu3}EV`vrZ&{l`qlvbrV)Y8<_)U=_cEwpNzo(QQi z!^9h!SIcq5=RG>J-H|JNS50hKhtK{-T1QNAza^6?SCP%9)5-K`2)uenB|YjtraY8Tsd*UH_(jvZR0zds66eOvm0?`TgI?{lT9Y~$r} zi8*X##*>CNl8ue)+C(OqhOJYntxDXlULXy@AJdlEx2zsZB}dc9!u4;Pr!jM$ct6P0 zIrimwD*m?6*nYC}6fe&c?!M3Z?^CWkPv^uu>E(GkC+3O#h$iwQ))6f~pYUl8$@FVJ zaX$k6AoL^f)lqk3jm-~o&K3GHMOk;h$f;BIQ_fL;vh1gv8-9P;PdPW{sqCkmmGgv~ zKifV!)?9q2N z*TR|Dcj}a^v$OOZ>a)JiO6KV-_3z5_cYW9{4d2 z{Cy96F?JaGUV_mZzYf0tAsnp{{s(v89szE+%Y`F(b)_wyi+RylqGOPHFd-rrKaCJK^pLBkKXmYmO#O(2is&)*km z7L;C-cS(gP2T9B~AqkxeD-*rOerO4_q|nb6E^_X@na}jS%Ict#56}>WQ(K zVMe|*wlykB@jpmHSWG-?G%FdQ(2XS-O`yb`Wf_0qkWt1mhMSxluH@6HdWg84tUF zG*CJ&cA?VovGb)7fU<^l4DB+f9TsW8KA>76We!@*&@mPT2XP{)n@uT>yO$WovFNFh z1`JwJGW|sb087?h5yOVK$=c_@F7L&28GDCf>9`jKO2@p&b06;_-!axjhTAw71A63G z$!RPOfhFEYvTfsIVPY^)$=no8OE&7l&p^(|Lo`QR6l0z=V;n9ULex_ZqmeS&Xeu)t zOKAxslg(+d{G^Cy#wSv`p(m6twQOj07t*i}Etbv3c0)If>~3LR4ou|7$9IE@r6d=C zO|)ZkY?lrV?p4bCIo2_L-k&h_&-&_;61E+b*~(^!t_F5u%GdM@*M z(GF4wk-oG21dBb8!KSkQB%QHMlKv10a{bQ!?*l##5!%PZ?^)3=#l-OmW~p@k?goZc zpZ#Pu_%Mw>>&thxTmU-l(C2-~L0puO@V%Th(X^w-N$@sG29 z43@U)pCtX0q~BUpl{shq7;|UU=X10s8t55^K94`ck3$CcfVc)R@xF)S)1C5MX8Ie@ z!S}+f&*yUWw6SD4w2g_&On(m;&OPh%{w+lMGc(@kP)@5!UB(zFB%%9Ri*; zu|Ct6foat*oCi_`{5@qGtjF}YL!b9!^`!5dFX|4P6K_EdZE^cKZhgfW>d#aCO$Cc) zhV{Sbz`1^=9{``0nv~@8N|ov#a(n^Z`onAATGhd|W@(ZFb}+8!die0T@wg(J`)+EO fe?#j`dJ|7PF}d9=i}4q3`nO$eO4K?O97XXTD?#WD diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 6c0aa93cbf..0000000000 --- a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,674 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if !defined(__STDC__) -# if (defined(_MSC_VER) && !defined(__clang__)) \ - || (defined(__ibmxl__) || defined(__IBMC__)) -# define C_DIALECT "90" -# else -# define C_DIALECT -# endif -#elif __STDC_VERSION__ >= 201000L -# define C_DIALECT "11" -#elif __STDC_VERSION__ >= 199901L -# define C_DIALECT "99" -#else -# define C_DIALECT "90" -#endif -const char* info_language_dialect_default = - "INFO" ":" "dialect_default[" C_DIALECT "]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index 37c21cafe9..0000000000 --- a/source/libs/parser/inc/CMakeFiles/3.18.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,663 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__COMO__) -# define COMPILER_ID "Comeau" - /* __COMO_VERSION__ = VRR */ -# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) -# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) - -#elif defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_dialect_default = "INFO" ":" "dialect_default[" -#if CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} diff --git a/source/libs/parser/inc/CMakeFiles/Makefile2 b/source/libs/parser/inc/CMakeFiles/Makefile2 deleted file mode 100644 index e945db3bae..0000000000 --- a/source/libs/parser/inc/CMakeFiles/Makefile2 +++ /dev/null @@ -1,125 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.18 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Disable VCS-based implicit rules. -% : %,v - - -# Disable VCS-based implicit rules. -% : RCS/% - - -# Disable VCS-based implicit rules. -% : RCS/%,v - - -# Disable VCS-based implicit rules. -% : SCCS/s.% - - -# Disable VCS-based implicit rules. -% : s.% - - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/wangxiaoyu/work/code/TDengine/source/libs/parser - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc - -#============================================================================= -# Directory level rules for the build root directory - -# The main recursive "all" target. -all: CMakeFiles/parser.dir/all - -.PHONY : all - -# The main recursive "preinstall" target. -preinstall: - -.PHONY : preinstall - -# The main recursive "clean" target. -clean: CMakeFiles/parser.dir/clean - -.PHONY : clean - -#============================================================================= -# Target rules for target CMakeFiles/parser.dir - -# All Build rule for target. -CMakeFiles/parser.dir/all: - $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/depend - $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 "Built target parser" -.PHONY : CMakeFiles/parser.dir/all - -# Build rule for subdir invocation for target. -CMakeFiles/parser.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles 16 - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/parser.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles 0 -.PHONY : CMakeFiles/parser.dir/rule - -# Convenience name for target. -parser: CMakeFiles/parser.dir/rule - -.PHONY : parser - -# clean rule for target. -CMakeFiles/parser.dir/clean: - $(MAKE) $(MAKESILENT) -f CMakeFiles/parser.dir/build.make CMakeFiles/parser.dir/clean -.PHONY : CMakeFiles/parser.dir/clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/source/libs/parser/inc/CMakeFiles/Progress/1 b/source/libs/parser/inc/CMakeFiles/Progress/1 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/source/libs/parser/inc/CMakeFiles/Progress/1 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/source/libs/parser/inc/CMakeFiles/Progress/count.txt b/source/libs/parser/inc/CMakeFiles/Progress/count.txt deleted file mode 100644 index b6a7d89c68..0000000000 --- a/source/libs/parser/inc/CMakeFiles/Progress/count.txt +++ /dev/null @@ -1 +0,0 @@ -16 diff --git a/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt b/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index f803c4fe95..0000000000 --- a/source/libs/parser/inc/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,3 +0,0 @@ -/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/rebuild_cache.dir -/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/parser.dir -/home/wangxiaoyu/work/code/TDengine/source/libs/parser/inc/CMakeFiles/edit_cache.dir diff --git a/source/libs/parser/inc/CMakeFiles/cmake.check_cache b/source/libs/parser/inc/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73172..0000000000 --- a/source/libs/parser/inc/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file From d5107df7ed418a0ba8cbee0c63cd3ee23b37f1e9 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Sun, 23 Jan 2022 22:29:46 -0500 Subject: [PATCH 04/37] TD-13120 SELECT statement syntax definition --- include/common/ttokendef.h | 76 +- include/nodes/nodes.h | 46 +- source/libs/parser/inc/astCreateFuncs.h | 42 +- source/libs/parser/inc/astCreater.h | 36 + source/libs/parser/inc/new_sql.y | 112 +-- source/libs/parser/src/astCreater.c | 148 +++- source/libs/parser/src/new_sql.c | 922 ++++++++++++---------- source/libs/parser/test/CMakeLists.txt | 2 +- source/libs/parser/test/newParserTest.cpp | 143 ++++ source/nodes/src/nodesCodeFuncs.c | 23 +- source/nodes/src/nodesEqualFuncs.c | 19 +- source/nodes/src/nodesTraverseFuncs.c | 21 +- source/nodes/src/nodesUtilFuncs.c | 49 +- 13 files changed, 1038 insertions(+), 601 deletions(-) create mode 100644 source/libs/parser/inc/astCreater.h create mode 100644 source/libs/parser/test/newParserTest.cpp diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 557d5029ed..cbc8c0e87c 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -207,52 +207,36 @@ #define TK_INTO 189 #define TK_VALUES 190 -#define NEW_TK_OR 1 -#define NEW_TK_AND 2 -#define NEW_TK_NOT 3 -#define NEW_TK_EQ 4 -#define NEW_TK_NE 5 -#define NEW_TK_ISNULL 6 -#define NEW_TK_NOTNULL 7 -#define NEW_TK_IS 8 -#define NEW_TK_LIKE 9 -#define NEW_TK_MATCH 10 -#define NEW_TK_NMATCH 11 -#define NEW_TK_GLOB 12 -#define NEW_TK_BETWEEN 13 -#define NEW_TK_IN 14 -#define NEW_TK_GT 15 -#define NEW_TK_GE 16 -#define NEW_TK_LT 17 -#define NEW_TK_LE 18 -#define NEW_TK_BITAND 19 -#define NEW_TK_BITOR 20 -#define NEW_TK_LSHIFT 21 -#define NEW_TK_RSHIFT 22 -#define NEW_TK_NK_PLUS 23 -#define NEW_TK_NK_MINUS 24 -#define NEW_TK_DIVIDE 25 -#define NEW_TK_TIMES 26 -#define NEW_TK_NK_STAR 27 -#define NEW_TK_NK_SLASH 28 -#define NEW_TK_REM 29 -#define NEW_TK_CONCAT 30 -#define NEW_TK_UMINUS 31 -#define NEW_TK_UPLUS 32 -#define NEW_TK_BITNOT 33 -#define NEW_TK_SHOW 34 -#define NEW_TK_DATABASES 35 -#define NEW_TK_NK_ID 36 -#define NEW_TK_NK_LP 37 -#define NEW_TK_NK_RP 38 -#define NEW_TK_NK_COMMA 39 -#define NEW_TK_NK_LITERAL 40 -#define NEW_TK_NK_DOT 41 -#define NEW_TK_SELECT 42 -#define NEW_TK_DISTINCT 43 -#define NEW_TK_ALL 44 -#define NEW_TK_AS 45 -#define NEW_TK_FROM 46 +#define NEW_TK_UNION 1 +#define NEW_TK_ALL 2 +#define NEW_TK_MINUS 3 +#define NEW_TK_EXCEPT 4 +#define NEW_TK_INTERSECT 5 +#define NEW_TK_NK_PLUS 6 +#define NEW_TK_NK_MINUS 7 +#define NEW_TK_NK_STAR 8 +#define NEW_TK_NK_SLASH 9 +#define NEW_TK_SHOW 10 +#define NEW_TK_DATABASES 11 +#define NEW_TK_NK_ID 12 +#define NEW_TK_NK_LP 13 +#define NEW_TK_NK_RP 14 +#define NEW_TK_NK_COMMA 15 +#define NEW_TK_NK_LITERAL 16 +#define NEW_TK_NK_DOT 17 +#define NEW_TK_SELECT 18 +#define NEW_TK_DISTINCT 19 +#define NEW_TK_AS 20 +#define NEW_TK_FROM 21 +#define NEW_TK_WITH 22 +#define NEW_TK_RECURSIVE 23 +#define NEW_TK_ORDER 24 +#define NEW_TK_BY 25 +#define NEW_TK_ASC 26 +#define NEW_TK_DESC 27 +#define NEW_TK_NULLS 28 +#define NEW_TK_FIRST 29 +#define NEW_TK_LAST 30 #define TK_SPACE 300 #define TK_COMMENT 301 diff --git a/include/nodes/nodes.h b/include/nodes/nodes.h index 0234abf88d..e297059bc8 100644 --- a/include/nodes/nodes.h +++ b/include/nodes/nodes.h @@ -20,7 +20,6 @@ extern "C" { #endif -#include "tarray.h" #include "tdef.h" typedef enum ENodeType { @@ -35,6 +34,7 @@ typedef enum ENodeType { QUERY_NODE_JOIN_TABLE, QUERY_NODE_GROUPING_SET, QUERY_NODE_ORDER_BY_EXPR, + QUERY_NODE_LIMIT, QUERY_NODE_STATE_WINDOW, QUERY_NODE_SESSION_WINDOW, QUERY_NODE_INTERVAL_WINDOW, @@ -53,6 +53,7 @@ typedef struct SNode { } SNode; #define nodeType(nodeptr) (((const SNode*)(nodeptr))->type) +#define setNodeType(nodeptr, type) (((SNode*)(nodeptr))->type = (type)) typedef struct SListCell { SNode* pNode; @@ -64,8 +65,15 @@ typedef struct SNodeList { SListCell* pHeader; } SNodeList; -#define foreach(node, list) \ - for (SListCell* cell = (NULL != list ? list->pHeader : NULL); (NULL != cell && ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext) +#define LIST_LENGTH(l) (NULL != (l) ? (l)->length : 0) + +#define FOREACH(node, list) \ + for (SListCell* cell = (NULL != (list) ? (list)->pHeader : NULL); (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext) + +#define FORBOTH(node1, list1, node2, list2) \ + for (SListCell* cell1 = (NULL != (list1) ? (list1)->pHeader : NULL), *cell2 = (NULL != (list2) ? (list2)->pHeader : NULL); \ + (NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)), (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), (node1 != NULL && node2 != NULL); \ + cell1 = cell1->pNext, cell2 = cell2->pNext) typedef struct SDataType { uint8_t type; @@ -142,7 +150,7 @@ typedef enum ELogicConditionType { typedef struct SLogicConditionNode { ENodeType type; // QUERY_NODE_LOGIC_CONDITION ELogicConditionType condType; - SArray* pParameterList; + SNodeList* pParameterList; } SLogicConditionNode; typedef struct SIsNullCondNode { @@ -155,7 +163,7 @@ typedef struct SFunctionNode { SExprNode type; // QUERY_NODE_FUNCTION char functionName[TSDB_FUNC_NAME_LEN]; int32_t funcId; - SArray* pParameterList; // SNode + SNodeList* pParameterList; // SNode } SFunctionNode; typedef struct STableNode { @@ -165,12 +173,12 @@ typedef struct STableNode { } STableNode; typedef struct SRealTableNode { - STableNode type; // QUERY_NODE_REAL_TABLE + STableNode table; // QUERY_NODE_REAL_TABLE char dbName[TSDB_DB_NAME_LEN]; } SRealTableNode; typedef struct STempTableNode { - STableNode type; // QUERY_NODE_TEMP_TABLE + STableNode table; // QUERY_NODE_TEMP_TABLE SNode* pSubquery; } STempTableNode; @@ -179,7 +187,7 @@ typedef enum EJoinType { } EJoinType; typedef struct SJoinTableNode { - STableNode type; // QUERY_NODE_JOIN_TABLE + STableNode table; // QUERY_NODE_JOIN_TABLE EJoinType joinType; SNode* pLeft; SNode* pRight; @@ -193,7 +201,7 @@ typedef enum EGroupingSetType { typedef struct SGroupingSetNode { ENodeType type; // QUERY_NODE_GROUPING_SET EGroupingSetType groupingSetType; - SArray* pParameterList; + SNodeList* pParameterList; } SGroupingSetNode; typedef enum EOrder { @@ -214,10 +222,11 @@ typedef struct SOrderByExprNode { ENullOrder nullOrder; } SOrderByExprNode; -typedef struct SLimitInfo { +typedef struct SLimitNode { + ENodeType type; // QUERY_NODE_LIMIT uint64_t limit; uint64_t offset; -} SLimitInfo; +} SLimitNode; typedef struct SStateWindowNode { ENodeType type; // QUERY_NODE_STATE_WINDOW @@ -240,15 +249,16 @@ typedef struct SIntervalWindowNode { typedef struct SSelectStmt { ENodeType type; // QUERY_NODE_SELECT_STMT bool isDistinct; - SArray* pProjectionList; // SNode + bool isStar; + SNodeList* pProjectionList; // SNode SNode* pFromTable; SNode* pWhereCond; - SArray* pPartitionByList; // SNode + SNodeList* pPartitionByList; // SNode SNode* pWindowClause; - SArray* pGroupByList; // SGroupingSetNode - SArray* pOrderByList; // SOrderByExprNode - SLimitInfo limit; - SLimitInfo slimit; + SNodeList* pGroupByList; // SGroupingSetNode + SNodeList* pOrderByList; // SOrderByExprNode + SLimitNode limit; + SLimitNode slimit; } SSelectStmt; typedef enum ESetOperatorType { @@ -264,8 +274,8 @@ typedef struct SSetOperator { typedef bool (*FQueryNodeWalker)(SNode* pNode, void* pContext); -bool nodesWalkArray(SArray* pArray, FQueryNodeWalker walker, void* pContext); bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext); +bool nodesWalkNodeList(SNodeList* pNodeList, FQueryNodeWalker walker, void* pContext); bool nodesWalkStmt(SNode* pNode, FQueryNodeWalker walker, void* pContext); diff --git a/source/libs/parser/inc/astCreateFuncs.h b/source/libs/parser/inc/astCreateFuncs.h index 056c24c17e..5cb5587001 100644 --- a/source/libs/parser/inc/astCreateFuncs.h +++ b/source/libs/parser/inc/astCreateFuncs.h @@ -17,23 +17,37 @@ #include "nodesShowStmts.h" #include "parser.h" -typedef void* (*FMalloc)(size_t); -typedef void (*FFree)(void*); +#ifndef _TD_AST_CREATE_FUNCS_H_ +#define _TD_AST_CREATE_FUNCS_H_ -typedef struct SAstCreaterContext { +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SAstCreateContext { SParseContext* pQueryCxt; bool notSupport; bool valid; SNode* pRootNode; - FMalloc mallocFunc; - FFree freeFunc; -} SAstCreaterContext; +} SAstCreateContext; -SNodeList* addNodeToList(SAstCreaterContext* pCxt, SNodeList* pList, SNode* pNode); -SNode* createColumnNode(SAstCreaterContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pColumnName); -SNodeList* createNodeList(SAstCreaterContext* pCxt, SNode* pNode); -SNode* createOrderByExprNode(SAstCreaterContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder); -SNode* createSelectStmt(SAstCreaterContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable); -SNode* createSetOperator(SAstCreaterContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight); -SNode* createShowStmt(SAstCreaterContext* pCxt, EShowStmtType type); -SNode* setProjectionAlias(SAstCreaterContext* pCxt, SNode* pNode, SToken* pAlias); +int32_t createAstCreater(const SParseContext* pQueryCxt, SAstCreateContext* pCxt); +int32_t destroyAstCreater(SAstCreateContext* pCxt); + +bool checkTableName(const SToken* pTableName); + +SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode); +SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableName, const SToken* pColumnName); +SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode); +SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder); +SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName); +SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable); +SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight); +SNode* createShowStmt(SAstCreateContext* pCxt, EShowStmtType type); +SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_AST_CREATE_FUNCS_H_*/ diff --git a/source/libs/parser/inc/astCreater.h b/source/libs/parser/inc/astCreater.h new file mode 100644 index 0000000000..df674ca425 --- /dev/null +++ b/source/libs/parser/inc/astCreater.h @@ -0,0 +1,36 @@ +/* + * 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 . + */ + +#ifndef _TD_AST_CREATER_H_ +#define _TD_AST_CREATER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nodes.h" +#include "parser.h" + +typedef struct SQuery { + SNode* pRoot; +} SQuery; + +int32_t doParse(SParseContext* pParseCxt, SQuery* pQuery); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_AST_CREATER_H_*/ diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y index 8f316d9ee3..d18cfbbebd 100644 --- a/source/libs/parser/inc/new_sql.y +++ b/source/libs/parser/inc/new_sql.y @@ -4,11 +4,11 @@ %name NewParse %token_prefix NEW_TK_ -%token_type { SToken* } +%token_type { SToken } %default_type { SNode* } %default_destructor { nodesDestroyNode($$); } -%extra_argument { SAstCreaterContext* pCxt } +%extra_argument { SAstCreateContext* pCxt } %include { #include @@ -21,19 +21,21 @@ #include "ttoken.h" #include "ttokendef.h" #include "astCreateFuncs.h" + +#define PARSER_TRACE printf("rule = %s\n", yyRuleName[yyruleno]) } %syntax_error { - if(TOKEN->z) { + if(TOKEN.z) { char msg[] = "syntax error near \"%s\""; - int32_t sqlLen = strlen(&TOKEN->z[0]); + int32_t sqlLen = strlen(&TOKEN.z[0]); if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > pCxt->pQueryCxt->msgLen) { char tmpstr[128] = {0}; - memcpy(tmpstr, &TOKEN->z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); + memcpy(tmpstr, &TOKEN.z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); sprintf(pCxt->pQueryCxt->pMsg, msg, tmpstr); } else { - sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN->z[0]); + sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN.z[0]); } } else { sprintf(pCxt->pQueryCxt->pMsg, "Incomplete SQL statement"); @@ -56,9 +58,9 @@ //%left CONCAT. //%right UMINUS UPLUS BITNOT. -cmd ::= SHOW DATABASES. { createShowStmt(pCxt, SHOW_TYPE_DATABASE); } +cmd ::= SHOW DATABASES. { PARSER_TRACE; createShowStmt(pCxt, SHOW_TYPE_DATABASE); } -cmd ::= query_expression(A). { pCxt->pRootNode = A; } +cmd ::= query_expression(A). { PARSER_TRACE; pCxt->pRootNode = A; } //////////////////////// value_function ///////////////////////////////// value_function ::= NK_ID NK_LP value_expression NK_RP. @@ -74,9 +76,8 @@ nonparenthesized_value_expression_primary ::= column_reference. literal ::= NK_LITERAL. -column_reference(A) ::= NK_ID(B). { A = createColumnNode(pCxt, NULL, NULL, B); } -column_reference(A) ::= NK_ID(B) NK_DOT NK_ID(C). { A = createColumnNode(pCxt, NULL, B, C); } -column_reference(A) ::= NK_ID(B) NK_DOT NK_ID(C) NK_DOT NK_ID(D). { A = createColumnNode(pCxt, B, C, D); } +column_reference(A) ::= NK_ID(B). { PARSER_TRACE; A = createColumnNode(pCxt, NULL, &B); } +column_reference(A) ::= table_name(B) NK_DOT NK_ID(C). { PARSER_TRACE; A = createColumnNode(pCxt, &B, &C); } //////////////////////// value_expression ///////////////////////////////// value_expression ::= common_value_expression. @@ -95,43 +96,64 @@ numeric_primary ::= value_expression_primary. numeric_primary ::= value_function. //////////////////////// query_specification ///////////////////////////////// -query_specification(A) ::= SELECT set_quantifier_opt(B) select_list(C) from_clause(D). { A = createSelectStmt(pCxt, B, C, D); } +query_specification(A) ::= SELECT set_quantifier_opt(B) select_list(C) from_clause(D). { PARSER_TRACE; A = createSelectStmt(pCxt, B, C, D); } %type set_quantifier_opt { bool } %destructor set_quantifier_opt {} -set_quantifier_opt(A) ::= . { A = false; } -set_quantifier_opt(A) ::= DISTINCT. { A = true; } -set_quantifier_opt(A) ::= ALL. { A = false; } +set_quantifier_opt(A) ::= . { PARSER_TRACE; A = false; } +set_quantifier_opt(A) ::= DISTINCT. { PARSER_TRACE; A = true; } +set_quantifier_opt(A) ::= ALL. { PARSER_TRACE; A = false; } %type select_list { SNodeList* } %destructor select_list { nodesDestroyNodeList($$); } -select_list(A) ::= NK_STAR. { A = NULL; } -select_list(A) ::= select_sublist(B). { A = B; } +select_list(A) ::= NK_STAR. { PARSER_TRACE; A = NULL; } +select_list(A) ::= select_sublist(B). { PARSER_TRACE; A = B; } %type select_sublist { SNodeList* } %destructor select_sublist { nodesDestroyNodeList($$); } -select_sublist(A) ::= select_item(B). { A = createNodeList(pCxt, B); } -select_sublist(A) ::= select_sublist(B) NK_COMMA select_item(C). { A = addNodeToList(pCxt, B, C); } +select_sublist(A) ::= select_item(B). { PARSER_TRACE; A = createNodeList(pCxt, B); } +select_sublist(A) ::= select_sublist(B) NK_COMMA select_item(C). { PARSER_TRACE; A = addNodeToList(pCxt, B, C); } -select_item(A) ::= value_expression(B). { A = B; } -select_item(A) ::= value_expression(B) AS NK_ID(C). { A = setProjectionAlias(pCxt, B, C); } -select_item(A) ::= NK_ID(B) NK_DOT NK_STAR(C). { A = createColumnNode(pCxt, NULL, B, C); } -select_item(A) ::= NK_ID(B) NK_DOT NK_ID(C) NK_DOT NK_STAR(D). { A = createColumnNode(pCxt, B, C, D); } +select_item(A) ::= value_expression(B). { PARSER_TRACE; A = B; } +select_item(A) ::= value_expression(B) AS NK_ID(C). { PARSER_TRACE; A = setProjectionAlias(pCxt, B, &C); } +select_item(A) ::= table_name(B) NK_DOT NK_STAR(C). { PARSER_TRACE; A = createColumnNode(pCxt, &B, &C); } -from_clause ::= FROM table_reference_list. +from_clause(A) ::= FROM table_reference_list(B). { PARSER_TRACE; A = B; } -table_reference_list ::= table_reference. -table_reference_list ::= table_reference_list NK_COMMA table_reference. +//%type table_reference_list { SNodeList* } +//%destructor table_reference_list { nodesDestroyNodeList($$); } +table_reference_list(A) ::= table_reference(B). { PARSER_TRACE; A = B; } +//table_reference_list(A) ::= table_reference_list(B) NK_COMMA table_reference(C). { PARSER_TRACE; A = createJoinTableNode(pCxt, B, C); } -table_reference ::= NK_ID. +//table_reference(A) ::= NK_ID(B). { PARSER_TRACE; A = createRealTableNode(pCxt, ); } +table_reference(A) ::= table_factor(B). { PARSER_TRACE; A = B; } //table_reference ::= joined_table. +table_factor(A) ::= table_primary(B). { PARSER_TRACE; A = B; } + +table_primary(A) ::= table_name(B). { PARSER_TRACE; A = createRealTableNode(pCxt, NULL, &B); } +table_primary(A) ::= db_name(B) NK_DOT table_name(C). { PARSER_TRACE; A = createRealTableNode(pCxt, &B, &C); } +table_primary ::= derived_table. + +derived_table ::= table_subquery. + +%type db_name { SToken } +db_name(A) ::= NK_ID(B). { PARSER_TRACE; A = B; } +%type table_name { SToken } +table_name(A) ::= NK_ID(B). { PARSER_TRACE; A = B; } + +//////////////////////// subquery ///////////////////////////////// +subquery ::= NK_LR query_expression NK_RP. + +table_subquery ::= subquery. + + //////////////////////// query_expression ///////////////////////////////// -query_expression(A) ::= with_clause_opt query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt. { A = B; } +query_expression(A) ::= with_clause_opt query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt. { PARSER_TRACE; A = B; } with_clause_opt ::= . {} -with_clause_opt ::= WITH with_list. { pCxt->notSupport = true; pCxt->valid = false; } -with_clause_opt ::= WITH RECURSIVE with_list. { pCxt->notSupport = true; pCxt->valid = false; } +with_clause_opt ::= WITH with_list. { PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } +with_clause_opt ::= WITH RECURSIVE with_list. { PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } with_list ::= with_list_element. {} with_list ::= with_list NK_COMMA with_list_element. {} @@ -140,16 +162,16 @@ with_list_element ::= NK_ID AS table_subquery. {} table_subquery ::= . {} -query_expression_body(A) ::= query_primary(B). { A = B; } -query_expression_body(A) ::= query_expression_body(B) UNION ALL query_expression_body(C). { A = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, B, C); } +query_expression_body(A) ::= query_primary(B). { PARSER_TRACE; A = B; } +query_expression_body(A) ::= query_expression_body(B) UNION ALL query_expression_body(C). { PARSER_TRACE; A = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, B, C); } -query_primary(A) ::= query_specification(B). { A = B; } -query_primary(A) ::= NK_LP query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP. { A = B;} +query_primary(A) ::= query_specification(B). { PARSER_TRACE; A = B; } +query_primary(A) ::= NK_LP query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP. { PARSER_TRACE; A = B;} %type order_by_clause_opt { SNodeList* } %destructor order_by_clause_opt { nodesDestroyNodeList($$); } -order_by_clause_opt(A) ::= . { A = NULL; } -order_by_clause_opt(A) ::= ORDER BY sort_specification_list(B). { A = B; } +order_by_clause_opt(A) ::= . { PARSER_TRACE; A = NULL; } +order_by_clause_opt(A) ::= ORDER BY sort_specification_list(B). { PARSER_TRACE; A = B; } limit_clause_opt ::= . @@ -158,19 +180,19 @@ slimit_clause_opt ::= . //////////////////////// sort_specification_list ///////////////////////////////// %type sort_specification_list { SNodeList* } %destructor sort_specification_list { nodesDestroyNodeList($$); } -sort_specification_list(A) ::= sort_specification(B). { A = createNodeList(pCxt, B); } -sort_specification_list(A) ::= sort_specification_list(B) NK_COMMA sort_specification(C). { A = addNodeToList(pCxt, B, C); } +sort_specification_list(A) ::= sort_specification(B). { PARSER_TRACE; A = createNodeList(pCxt, B); } +sort_specification_list(A) ::= sort_specification_list(B) NK_COMMA sort_specification(C). { PARSER_TRACE; A = addNodeToList(pCxt, B, C); } -sort_specification(A) ::= value_expression(B) ordering_specification_opt(C) null_ordering_opt(D). { A = createOrderByExprNode(pCxt, B, C, D); } +sort_specification(A) ::= value_expression(B) ordering_specification_opt(C) null_ordering_opt(D). { PARSER_TRACE; A = createOrderByExprNode(pCxt, B, C, D); } %type ordering_specification_opt EOrder %destructor ordering_specification_opt {} -ordering_specification_opt(A) ::= . { A = ORDER_ASC; } -ordering_specification_opt(A) ::= ASC. { A = ORDER_ASC; } -ordering_specification_opt(A) ::= DESC. { A = ORDER_DESC; } +ordering_specification_opt(A) ::= . { PARSER_TRACE; A = ORDER_ASC; } +ordering_specification_opt(A) ::= ASC. { PARSER_TRACE; A = ORDER_ASC; } +ordering_specification_opt(A) ::= DESC. { PARSER_TRACE; A = ORDER_DESC; } %type null_ordering_opt ENullOrder %destructor null_ordering_opt {} -null_ordering_opt(A) ::= . { A = NULL_ORDER_DEFAULT; } -null_ordering_opt(A) ::= NULLS FIRST. { A = NULL_ORDER_FIRST; } -null_ordering_opt(A) ::= NULLS LAST. { A = NULL_ORDER_LAST; } +null_ordering_opt(A) ::= . { PARSER_TRACE; A = NULL_ORDER_DEFAULT; } +null_ordering_opt(A) ::= NULLS FIRST. { PARSER_TRACE; A = NULL_ORDER_FIRST; } +null_ordering_opt(A) ::= NULLS LAST. { PARSER_TRACE; A = NULL_ORDER_LAST; } diff --git a/source/libs/parser/src/astCreater.c b/source/libs/parser/src/astCreater.c index fb21dc2ba9..00a921ab73 100644 --- a/source/libs/parser/src/astCreater.c +++ b/source/libs/parser/src/astCreater.c @@ -15,57 +15,162 @@ #include "ttoken.h" #include "astCreateFuncs.h" +#include "astCreater.h" + +typedef void* (*FMalloc)(size_t); +typedef void (*FFree)(void*); extern void* NewParseAlloc(FMalloc); -extern void NewParse(void*, int, SToken*, void*); +extern void NewParse(void*, int, SToken, void*); extern void NewParseFree(void*, FFree); -SNodeList* addNodeToList(SAstCreaterContext* pCxt, SNodeList* pList, SNode* pNode) { +static void* acquireRaii(SAstCreateContext* pCxt, void* p) { + if (NULL == p) { + return NULL; + } + return p; +} + +static void* releaseRaii(SAstCreateContext* pCxt, void* p) { + if (NULL == p) { + return NULL; + } + return p; +} + +int32_t createAstCreater(const SParseContext* pQueryCxt, SAstCreateContext* pCxt) { } -SNode* createColumnNode(SAstCreaterContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pColumnName) { +int32_t destroyAstCreater(SAstCreateContext* pCxt) { } -SNodeList* createNodeList(SAstCreaterContext* pCxt, SNode* pNode) { +bool checkTableName(const SToken* pTableName) { + printf("%p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); + return pTableName->n < TSDB_TABLE_NAME_LEN ? true : false; +} + +SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode) { } -SNode* createOrderByExprNode(SAstCreaterContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { +SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableName, const SToken* pColumnName) { } -SNode* createSelectStmt(SAstCreaterContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { +SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) { } -SNode* createSetOperator(SAstCreaterContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { +SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { } -SNode* createShowStmt(SAstCreaterContext* pCxt, EShowStmtType type) { +SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName) { + SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); + if (NULL != pDbName) { + printf("DbName %p : %d, %d, %s\n", pDbName, pDbName->type, pDbName->n, pDbName->z); + strncpy(realTable->dbName, pDbName->z, pDbName->n); + } + printf("TableName %p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); + strncpy(realTable->table.tableName, pTableName->z, pTableName->n); + return acquireRaii(pCxt, realTable); +} + +SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { + SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + select->isDistinct = isDistinct; + if (NULL == pProjectionList) { + select->isStar = true; + } + select->pProjectionList = releaseRaii(pCxt, pProjectionList); + printf("pTable = %p, name = %s\n", pTable, ((SRealTableNode*)pTable)->table.tableName); + select->pFromTable = releaseRaii(pCxt, pTable); + return acquireRaii(pCxt, select); +} + +SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { } -SNode* setProjectionAlias(SAstCreaterContext* pCxt, SNode* pNode, SToken* pAlias) { +SNode* createShowStmt(SAstCreateContext* pCxt, EShowStmtType type) { } -SNode* doParse(SParseContext* pParseCxt) { - SAstCreaterContext cxt = { .pQueryCxt = pParseCxt, .valid = true, .pRootNode = NULL, .mallocFunc = malloc, .freeFunc = free}; - void *pParser = NewParseAlloc(cxt.mallocFunc); +SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias) { + +} + +uint32_t toNewTokenId(uint32_t tokenId) { + switch (tokenId) { + case TK_UNION: + return NEW_TK_UNION; + case TK_ALL: + return NEW_TK_ALL; + case TK_MINUS: + return NEW_TK_NK_MINUS; + case TK_PLUS: + return NEW_TK_NK_PLUS; + case TK_STAR: + return NEW_TK_NK_STAR; + case TK_SLASH: + return NEW_TK_NK_SLASH; + case TK_SHOW: + return NEW_TK_SHOW; + case TK_DATABASES: + return NEW_TK_DATABASES; + case TK_ID: + return NEW_TK_NK_ID; + case TK_LP: + return NEW_TK_NK_LP; + case TK_RP: + return NEW_TK_NK_RP; + case TK_COMMA: + return NEW_TK_NK_COMMA; + case TK_DOT: + return NEW_TK_NK_DOT; + case TK_SELECT: + return NEW_TK_SELECT; + case TK_DISTINCT: + return NEW_TK_DISTINCT; + case TK_AS: + return NEW_TK_AS; + case TK_FROM: + return NEW_TK_FROM; + case TK_ORDER: + return NEW_TK_ORDER; + case TK_BY: + return NEW_TK_BY; + case TK_ASC: + return NEW_TK_ASC; + case TK_DESC: + return NEW_TK_DESC; + } + return tokenId; +} + +uint32_t getToken(const char* z, uint32_t* tokenId) { + uint32_t n = tGetToken(z, tokenId); + *tokenId = toNewTokenId(*tokenId); + return n; +} + +int32_t doParse(SParseContext* pParseCxt, SQuery* pQuery) { + SAstCreateContext cxt = { .pQueryCxt = pParseCxt, .valid = true, .pRootNode = NULL }; + void *pParser = NewParseAlloc(malloc); int32_t i = 0; while (1) { SToken t0 = {0}; - + printf("===========================\n"); if (cxt.pQueryCxt->pSql[i] == 0) { - NewParse(pParser, 0, &t0, &cxt); + NewParse(pParser, 0, t0, &cxt); goto abort_parse; } - - t0.n = tGetToken((char *)&cxt.pQueryCxt->pSql[i], &t0.type); + printf("input: [%s]\n", cxt.pQueryCxt->pSql + i); + t0.n = getToken((char *)&cxt.pQueryCxt->pSql[i], &t0.type); t0.z = (char *)(cxt.pQueryCxt->pSql + i); + printf("token %p : %d %d [%s]\n", &t0, t0.type, t0.n, t0.z); i += t0.n; switch (t0.type) { @@ -74,13 +179,14 @@ SNode* doParse(SParseContext* pParseCxt) { break; } case TK_SEMI: { - NewParse(pParser, 0, &t0, &cxt); + NewParse(pParser, 0, t0, &cxt); goto abort_parse; } case TK_QUESTION: case TK_ILLEGAL: { snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unrecognized token: \"%s\"", t0.z); + cxt.valid = false; goto abort_parse; } @@ -88,11 +194,12 @@ SNode* doParse(SParseContext* pParseCxt) { case TK_OCT: case TK_BIN: { snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unsupported token: \"%s\"", t0.z); + cxt.valid = false; goto abort_parse; } default: - NewParse(pParser, t0.type, &t0, &cxt); + NewParse(pParser, t0.type, t0, &cxt); if (!cxt.valid) { goto abort_parse; } @@ -100,6 +207,7 @@ SNode* doParse(SParseContext* pParseCxt) { } abort_parse: - NewParseFree(pParser, cxt.freeFunc); - return cxt.pRootNode; + NewParseFree(pParser, free); + pQuery->pRoot = cxt.pRootNode; + return cxt.valid ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED; } diff --git a/source/libs/parser/src/new_sql.c b/source/libs/parser/src/new_sql.c index baebc3235a..8f02806897 100644 --- a/source/libs/parser/src/new_sql.c +++ b/source/libs/parser/src/new_sql.c @@ -36,6 +36,8 @@ #include "ttoken.h" #include "ttokendef.h" #include "astCreateFuncs.h" + +#define PARSER_TRACE printf("rule = %s\n", yyRuleName[yyruleno]) /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols ** in a format understandable to "makeheaders". This section is blank unless @@ -99,25 +101,26 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 63 +#define YYNOCODE 70 #define YYACTIONTYPE unsigned char -#define NewParseTOKENTYPE SToken* +#define NewParseTOKENTYPE SToken typedef union { int yyinit; NewParseTOKENTYPE yy0; - bool yy47; - SNode* yy56; - SNodeList* yy82; - EOrder yy92; - ENullOrder yy109; + SToken yy29; + EOrder yy78; + SNode* yy112; + bool yy117; + SNodeList* yy124; + ENullOrder yy137; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 #endif -#define NewParseARG_SDECL SAstCreaterContext* pCxt ; -#define NewParseARG_PDECL , SAstCreaterContext* pCxt +#define NewParseARG_SDECL SAstCreateContext* pCxt ; +#define NewParseARG_PDECL , SAstCreateContext* pCxt #define NewParseARG_PARAM ,pCxt -#define NewParseARG_FETCH SAstCreaterContext* pCxt =yypParser->pCxt ; +#define NewParseARG_FETCH SAstCreateContext* pCxt =yypParser->pCxt ; #define NewParseARG_STORE yypParser->pCxt =pCxt ; #define NewParseCTX_SDECL #define NewParseCTX_PDECL @@ -125,16 +128,16 @@ typedef union { #define NewParseCTX_FETCH #define NewParseCTX_STORE #define YYNSTATE 62 -#define YYNRULE 64 -#define YYNTOKEN 31 +#define YYNRULE 70 +#define YYNTOKEN 32 #define YY_MAX_SHIFT 61 -#define YY_MIN_SHIFTREDUCE 105 -#define YY_MAX_SHIFTREDUCE 168 -#define YY_ERROR_ACTION 169 -#define YY_ACCEPT_ACTION 170 -#define YY_NO_ACTION 171 -#define YY_MIN_REDUCE 172 -#define YY_MAX_REDUCE 235 +#define YY_MIN_SHIFTREDUCE 112 +#define YY_MAX_SHIFTREDUCE 181 +#define YY_ERROR_ACTION 182 +#define YY_ACCEPT_ACTION 183 +#define YY_NO_ACTION 184 +#define YY_MIN_REDUCE 185 +#define YY_MAX_REDUCE 254 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -201,87 +204,91 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (213) +#define YY_ACTTAB_COUNT (232) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 33, 50, 33, 33, 33, 33, 50, 33, 33, 44, - /* 10 */ 193, 27, 43, 51, 183, 33, 20, 33, 33, 33, - /* 20 */ 33, 20, 33, 33, 33, 20, 33, 33, 33, 33, - /* 30 */ 20, 33, 33, 13, 12, 114, 42, 193, 61, 41, - /* 40 */ 5, 45, 203, 151, 52, 52, 11, 10, 9, 8, - /* 50 */ 17, 204, 33, 50, 33, 33, 33, 33, 50, 33, - /* 60 */ 33, 140, 141, 43, 25, 227, 184, 227, 227, 227, - /* 70 */ 227, 166, 227, 227, 18, 33, 54, 33, 33, 33, - /* 80 */ 33, 54, 33, 33, 1, 33, 55, 33, 33, 33, - /* 90 */ 33, 55, 33, 33, 33, 39, 33, 33, 33, 33, - /* 100 */ 39, 33, 33, 226, 14, 226, 226, 226, 226, 23, - /* 110 */ 226, 226, 37, 194, 37, 37, 37, 37, 121, 37, - /* 120 */ 37, 38, 109, 38, 38, 38, 38, 120, 38, 38, - /* 130 */ 223, 53, 223, 223, 223, 223, 30, 222, 223, 222, - /* 140 */ 222, 222, 222, 170, 59, 222, 13, 12, 13, 12, - /* 150 */ 32, 48, 40, 5, 41, 5, 151, 199, 151, 40, - /* 160 */ 5, 113, 16, 151, 143, 144, 21, 199, 199, 9, - /* 170 */ 8, 145, 6, 197, 46, 7, 198, 22, 112, 58, - /* 180 */ 34, 7, 205, 197, 197, 36, 232, 19, 177, 195, - /* 190 */ 47, 29, 24, 189, 31, 28, 3, 2, 133, 15, - /* 200 */ 119, 4, 49, 173, 26, 147, 146, 35, 109, 172, - /* 210 */ 56, 57, 60, + /* 0 */ 34, 46, 34, 34, 34, 34, 54, 46, 34, 34, + /* 10 */ 50, 212, 29, 49, 47, 195, 34, 22, 34, 34, + /* 20 */ 34, 34, 56, 22, 34, 34, 34, 22, 34, 34, + /* 30 */ 34, 34, 56, 22, 34, 34, 34, 46, 34, 34, + /* 40 */ 34, 34, 54, 46, 34, 34, 14, 13, 41, 222, + /* 50 */ 21, 196, 40, 5, 40, 5, 164, 26, 164, 223, + /* 60 */ 34, 57, 34, 34, 34, 34, 56, 57, 34, 34, + /* 70 */ 34, 58, 34, 34, 34, 34, 56, 58, 34, 34, + /* 80 */ 34, 39, 34, 34, 34, 34, 56, 39, 34, 34, + /* 90 */ 204, 12, 11, 10, 9, 7, 61, 48, 212, 207, + /* 100 */ 200, 201, 202, 203, 53, 203, 203, 203, 246, 18, + /* 110 */ 246, 246, 246, 246, 56, 218, 246, 246, 245, 52, + /* 120 */ 245, 245, 245, 245, 56, 18, 245, 245, 15, 21, + /* 130 */ 23, 218, 44, 25, 1, 37, 216, 37, 37, 37, + /* 140 */ 37, 56, 51, 37, 37, 38, 217, 38, 38, 38, + /* 150 */ 38, 56, 216, 38, 38, 242, 42, 242, 242, 242, + /* 160 */ 242, 56, 214, 214, 242, 153, 154, 17, 218, 35, + /* 170 */ 241, 119, 241, 241, 241, 241, 56, 183, 59, 241, + /* 180 */ 14, 13, 120, 24, 213, 49, 40, 5, 118, 216, + /* 190 */ 164, 156, 157, 31, 126, 10, 9, 19, 115, 33, + /* 200 */ 134, 224, 205, 17, 158, 6, 8, 189, 43, 30, + /* 210 */ 3, 208, 32, 146, 16, 2, 125, 45, 4, 206, + /* 220 */ 27, 20, 178, 28, 36, 115, 55, 186, 160, 159, + /* 230 */ 185, 60, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 55, - /* 10 */ 56, 44, 12, 46, 47, 33, 34, 35, 36, 37, - /* 20 */ 38, 39, 40, 41, 33, 34, 35, 36, 37, 38, - /* 30 */ 39, 40, 41, 6, 7, 8, 55, 56, 10, 12, - /* 40 */ 13, 59, 60, 16, 48, 49, 6, 7, 8, 9, - /* 50 */ 22, 60, 33, 34, 35, 36, 37, 38, 39, 40, - /* 60 */ 41, 26, 27, 12, 61, 33, 47, 35, 36, 37, - /* 70 */ 38, 12, 40, 41, 23, 33, 34, 35, 36, 37, - /* 80 */ 38, 39, 40, 41, 43, 33, 34, 35, 36, 37, - /* 90 */ 38, 39, 40, 41, 33, 34, 35, 36, 37, 38, - /* 100 */ 39, 40, 41, 33, 13, 35, 36, 37, 38, 18, - /* 110 */ 40, 41, 33, 56, 35, 36, 37, 38, 8, 40, - /* 120 */ 41, 33, 12, 35, 36, 37, 38, 8, 40, 41, - /* 130 */ 33, 12, 35, 36, 37, 38, 52, 33, 41, 35, - /* 140 */ 36, 37, 38, 31, 32, 41, 6, 7, 6, 7, - /* 150 */ 52, 1, 12, 13, 12, 13, 16, 42, 16, 12, - /* 160 */ 13, 2, 50, 16, 29, 30, 51, 42, 42, 8, - /* 170 */ 9, 14, 15, 58, 24, 13, 51, 51, 19, 17, - /* 180 */ 28, 13, 62, 58, 58, 17, 49, 21, 45, 57, - /* 190 */ 54, 53, 15, 54, 53, 20, 15, 25, 14, 2, - /* 200 */ 12, 15, 20, 0, 15, 14, 14, 17, 12, 0, - /* 210 */ 17, 12, 11, 63, 63, 63, 63, 63, 63, 63, - /* 220 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - /* 230 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - /* 240 */ 63, 63, 63, 63, + /* 0 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + /* 10 */ 63, 64, 46, 12, 48, 49, 34, 35, 36, 37, + /* 20 */ 38, 39, 40, 41, 42, 43, 34, 35, 36, 37, + /* 30 */ 38, 39, 40, 41, 42, 43, 34, 35, 36, 37, + /* 40 */ 38, 39, 40, 41, 42, 43, 6, 7, 66, 67, + /* 50 */ 22, 49, 12, 13, 12, 13, 16, 68, 16, 67, + /* 60 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + /* 70 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + /* 80 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + /* 90 */ 40, 6, 7, 8, 9, 13, 10, 63, 64, 17, + /* 100 */ 50, 51, 52, 53, 54, 55, 56, 57, 34, 23, + /* 110 */ 36, 37, 38, 39, 40, 44, 42, 43, 34, 12, + /* 120 */ 36, 37, 38, 39, 40, 23, 42, 43, 13, 22, + /* 130 */ 59, 44, 1, 18, 45, 34, 65, 36, 37, 38, + /* 140 */ 39, 40, 33, 42, 43, 34, 59, 36, 37, 38, + /* 150 */ 39, 40, 65, 42, 43, 34, 25, 36, 37, 38, + /* 160 */ 39, 40, 56, 57, 43, 27, 28, 58, 44, 29, + /* 170 */ 34, 2, 36, 37, 38, 39, 40, 32, 33, 43, + /* 180 */ 6, 7, 8, 59, 64, 12, 12, 13, 19, 65, + /* 190 */ 16, 30, 31, 60, 8, 8, 9, 24, 12, 60, + /* 200 */ 12, 69, 40, 58, 14, 15, 21, 47, 62, 61, + /* 210 */ 15, 62, 61, 14, 2, 26, 12, 20, 15, 17, + /* 220 */ 15, 20, 14, 17, 17, 12, 17, 0, 14, 14, + /* 230 */ 0, 11, 70, 70, 70, 70, 70, 70, 70, 70, + /* 240 */ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + /* 250 */ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + /* 260 */ 70, 70, 70, 70, }; #define YY_SHIFT_COUNT (61) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (209) -static const unsigned char yy_shift_ofst[] = { - /* 0 */ 28, 27, 140, 140, 142, 140, 140, 140, 140, 140, - /* 10 */ 140, 140, 147, 147, 91, 91, 91, 51, 0, 59, - /* 20 */ 35, 150, 150, 159, 0, 152, 59, 166, 213, 213, - /* 30 */ 213, 213, 213, 40, 135, 110, 119, 161, 161, 157, - /* 40 */ 162, 168, 177, 175, 177, 181, 172, 184, 197, 188, - /* 50 */ 182, 186, 189, 190, 191, 192, 196, 193, 199, 203, - /* 60 */ 209, 201, +#define YY_SHIFT_MAX (230) +static const unsigned short int yy_shift_ofst[] = { + /* 0 */ 86, 174, 40, 40, 40, 40, 40, 40, 107, 40, + /* 10 */ 40, 40, 40, 42, 42, 115, 115, 115, 173, 1, + /* 20 */ 28, 102, 138, 131, 131, 169, 140, 1, 188, 185, + /* 30 */ 232, 232, 232, 232, 85, 161, 186, 187, 187, 190, + /* 40 */ 82, 195, 189, 199, 212, 204, 197, 203, 205, 201, + /* 50 */ 205, 208, 202, 206, 207, 213, 209, 214, 215, 227, + /* 60 */ 230, 220, }; -#define YY_REDUCE_COUNT (32) -#define YY_REDUCE_MIN (-46) -#define YY_REDUCE_MAX (143) +#define YY_REDUCE_COUNT (33) +#define YY_REDUCE_MIN (-53) +#define YY_REDUCE_MAX (162) static const short yy_reduce_ofst[] = { - /* 0 */ 112, -33, -18, -9, 19, 42, 52, 61, 32, 70, - /* 10 */ 79, 88, 97, 104, 115, 125, 126, -46, -19, -4, - /* 20 */ 3, 84, 98, 41, 57, 120, 137, 143, 132, 136, - /* 30 */ 138, 139, 141, + /* 0 */ 145, -34, -18, -8, 2, 26, 36, 46, 50, 74, + /* 10 */ 84, 101, 111, 121, 136, 71, 87, 124, -53, 34, + /* 20 */ 106, 109, -11, 133, 139, 89, 132, 120, 162, 160, + /* 30 */ 146, 148, 149, 151, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 190, 169, 169, 169, 169, 169, 169, 169, 169, 169, - /* 10 */ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - /* 20 */ 206, 201, 201, 178, 169, 209, 169, 169, 196, 235, - /* 30 */ 234, 235, 234, 220, 169, 169, 169, 225, 224, 169, - /* 40 */ 174, 174, 192, 169, 191, 202, 169, 169, 169, 169, - /* 50 */ 185, 182, 230, 175, 169, 169, 169, 175, 169, 169, - /* 60 */ 169, 169, + /* 0 */ 209, 182, 182, 182, 182, 182, 182, 182, 215, 182, + /* 10 */ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + /* 20 */ 215, 209, 225, 220, 220, 190, 228, 182, 182, 182, + /* 30 */ 254, 253, 254, 253, 239, 182, 182, 244, 243, 182, + /* 40 */ 187, 221, 182, 182, 182, 182, 197, 194, 211, 182, + /* 50 */ 210, 182, 207, 182, 182, 182, 182, 182, 182, 182, + /* 60 */ 182, 182, }; /********** End of lemon-generated parsing tables *****************************/ @@ -410,47 +417,54 @@ static const char *const yyTokenName[] = { /* 19 */ "DISTINCT", /* 20 */ "AS", /* 21 */ "FROM", - /* 22 */ "WITH", - /* 23 */ "RECURSIVE", - /* 24 */ "ORDER", - /* 25 */ "BY", - /* 26 */ "ASC", - /* 27 */ "DESC", - /* 28 */ "NULLS", - /* 29 */ "FIRST", - /* 30 */ "LAST", - /* 31 */ "cmd", - /* 32 */ "query_expression", - /* 33 */ "value_function", - /* 34 */ "value_expression", - /* 35 */ "value_expression_primary", - /* 36 */ "nonparenthesized_value_expression_primary", - /* 37 */ "literal", - /* 38 */ "column_reference", - /* 39 */ "common_value_expression", - /* 40 */ "numeric_value_expression", - /* 41 */ "numeric_primary", - /* 42 */ "query_specification", - /* 43 */ "set_quantifier_opt", - /* 44 */ "select_list", - /* 45 */ "from_clause", - /* 46 */ "select_sublist", - /* 47 */ "select_item", - /* 48 */ "table_reference_list", - /* 49 */ "table_reference", - /* 50 */ "with_clause_opt", - /* 51 */ "query_expression_body", - /* 52 */ "order_by_clause_opt", - /* 53 */ "limit_clause_opt", - /* 54 */ "slimit_clause_opt", - /* 55 */ "with_list", - /* 56 */ "with_list_element", - /* 57 */ "table_subquery", - /* 58 */ "query_primary", - /* 59 */ "sort_specification_list", - /* 60 */ "sort_specification", - /* 61 */ "ordering_specification_opt", - /* 62 */ "null_ordering_opt", + /* 22 */ "NK_LR", + /* 23 */ "WITH", + /* 24 */ "RECURSIVE", + /* 25 */ "ORDER", + /* 26 */ "BY", + /* 27 */ "ASC", + /* 28 */ "DESC", + /* 29 */ "NULLS", + /* 30 */ "FIRST", + /* 31 */ "LAST", + /* 32 */ "cmd", + /* 33 */ "query_expression", + /* 34 */ "value_function", + /* 35 */ "value_expression", + /* 36 */ "value_expression_primary", + /* 37 */ "nonparenthesized_value_expression_primary", + /* 38 */ "literal", + /* 39 */ "column_reference", + /* 40 */ "table_name", + /* 41 */ "common_value_expression", + /* 42 */ "numeric_value_expression", + /* 43 */ "numeric_primary", + /* 44 */ "query_specification", + /* 45 */ "set_quantifier_opt", + /* 46 */ "select_list", + /* 47 */ "from_clause", + /* 48 */ "select_sublist", + /* 49 */ "select_item", + /* 50 */ "table_reference_list", + /* 51 */ "table_reference", + /* 52 */ "table_factor", + /* 53 */ "table_primary", + /* 54 */ "db_name", + /* 55 */ "derived_table", + /* 56 */ "table_subquery", + /* 57 */ "subquery", + /* 58 */ "with_clause_opt", + /* 59 */ "query_expression_body", + /* 60 */ "order_by_clause_opt", + /* 61 */ "limit_clause_opt", + /* 62 */ "slimit_clause_opt", + /* 63 */ "with_list", + /* 64 */ "with_list_element", + /* 65 */ "query_primary", + /* 66 */ "sort_specification_list", + /* 67 */ "sort_specification", + /* 68 */ "ordering_specification_opt", + /* 69 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -461,67 +475,73 @@ static const char *const yyRuleName[] = { /* 0 */ "cmd ::= SHOW DATABASES", /* 1 */ "cmd ::= query_expression", /* 2 */ "column_reference ::= NK_ID", - /* 3 */ "column_reference ::= NK_ID NK_DOT NK_ID", - /* 4 */ "column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID", - /* 5 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause", - /* 6 */ "set_quantifier_opt ::=", - /* 7 */ "set_quantifier_opt ::= DISTINCT", - /* 8 */ "set_quantifier_opt ::= ALL", - /* 9 */ "select_list ::= NK_STAR", - /* 10 */ "select_list ::= select_sublist", - /* 11 */ "select_sublist ::= select_item", - /* 12 */ "select_sublist ::= select_sublist NK_COMMA select_item", - /* 13 */ "select_item ::= value_expression", - /* 14 */ "select_item ::= value_expression AS NK_ID", - /* 15 */ "select_item ::= NK_ID NK_DOT NK_STAR", - /* 16 */ "select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR", - /* 17 */ "query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt", - /* 18 */ "with_clause_opt ::=", - /* 19 */ "with_clause_opt ::= WITH with_list", - /* 20 */ "with_clause_opt ::= WITH RECURSIVE with_list", - /* 21 */ "with_list ::= with_list_element", - /* 22 */ "with_list ::= with_list NK_COMMA with_list_element", - /* 23 */ "with_list_element ::= NK_ID AS table_subquery", - /* 24 */ "table_subquery ::=", - /* 25 */ "query_expression_body ::= query_primary", - /* 26 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 27 */ "query_primary ::= query_specification", - /* 28 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP", - /* 29 */ "order_by_clause_opt ::=", - /* 30 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 31 */ "sort_specification_list ::= sort_specification", - /* 32 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 33 */ "sort_specification ::= value_expression ordering_specification_opt null_ordering_opt", - /* 34 */ "ordering_specification_opt ::=", - /* 35 */ "ordering_specification_opt ::= ASC", - /* 36 */ "ordering_specification_opt ::= DESC", - /* 37 */ "null_ordering_opt ::=", - /* 38 */ "null_ordering_opt ::= NULLS FIRST", - /* 39 */ "null_ordering_opt ::= NULLS LAST", - /* 40 */ "value_function ::= NK_ID NK_LP value_expression NK_RP", - /* 41 */ "value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP", - /* 42 */ "value_expression_primary ::= NK_LP value_expression NK_RP", - /* 43 */ "value_expression_primary ::= nonparenthesized_value_expression_primary", - /* 44 */ "nonparenthesized_value_expression_primary ::= literal", - /* 45 */ "nonparenthesized_value_expression_primary ::= column_reference", - /* 46 */ "literal ::= NK_LITERAL", - /* 47 */ "value_expression ::= common_value_expression", - /* 48 */ "common_value_expression ::= numeric_value_expression", - /* 49 */ "numeric_value_expression ::= numeric_primary", - /* 50 */ "numeric_value_expression ::= NK_PLUS numeric_primary", - /* 51 */ "numeric_value_expression ::= NK_MINUS numeric_primary", - /* 52 */ "numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression", - /* 53 */ "numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression", - /* 54 */ "numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression", - /* 55 */ "numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression", - /* 56 */ "numeric_primary ::= value_expression_primary", - /* 57 */ "numeric_primary ::= value_function", - /* 58 */ "from_clause ::= FROM table_reference_list", - /* 59 */ "table_reference_list ::= table_reference", - /* 60 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 61 */ "table_reference ::= NK_ID", - /* 62 */ "limit_clause_opt ::=", - /* 63 */ "slimit_clause_opt ::=", + /* 3 */ "column_reference ::= table_name NK_DOT NK_ID", + /* 4 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause", + /* 5 */ "set_quantifier_opt ::=", + /* 6 */ "set_quantifier_opt ::= DISTINCT", + /* 7 */ "set_quantifier_opt ::= ALL", + /* 8 */ "select_list ::= NK_STAR", + /* 9 */ "select_list ::= select_sublist", + /* 10 */ "select_sublist ::= select_item", + /* 11 */ "select_sublist ::= select_sublist NK_COMMA select_item", + /* 12 */ "select_item ::= value_expression", + /* 13 */ "select_item ::= value_expression AS NK_ID", + /* 14 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 15 */ "from_clause ::= FROM table_reference_list", + /* 16 */ "table_reference_list ::= table_reference", + /* 17 */ "table_reference ::= table_factor", + /* 18 */ "table_factor ::= table_primary", + /* 19 */ "table_primary ::= table_name", + /* 20 */ "table_primary ::= db_name NK_DOT table_name", + /* 21 */ "db_name ::= NK_ID", + /* 22 */ "table_name ::= NK_ID", + /* 23 */ "query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt", + /* 24 */ "with_clause_opt ::=", + /* 25 */ "with_clause_opt ::= WITH with_list", + /* 26 */ "with_clause_opt ::= WITH RECURSIVE with_list", + /* 27 */ "with_list ::= with_list_element", + /* 28 */ "with_list ::= with_list NK_COMMA with_list_element", + /* 29 */ "with_list_element ::= NK_ID AS table_subquery", + /* 30 */ "table_subquery ::=", + /* 31 */ "query_expression_body ::= query_primary", + /* 32 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 33 */ "query_primary ::= query_specification", + /* 34 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP", + /* 35 */ "order_by_clause_opt ::=", + /* 36 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 37 */ "sort_specification_list ::= sort_specification", + /* 38 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 39 */ "sort_specification ::= value_expression ordering_specification_opt null_ordering_opt", + /* 40 */ "ordering_specification_opt ::=", + /* 41 */ "ordering_specification_opt ::= ASC", + /* 42 */ "ordering_specification_opt ::= DESC", + /* 43 */ "null_ordering_opt ::=", + /* 44 */ "null_ordering_opt ::= NULLS FIRST", + /* 45 */ "null_ordering_opt ::= NULLS LAST", + /* 46 */ "value_function ::= NK_ID NK_LP value_expression NK_RP", + /* 47 */ "value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP", + /* 48 */ "value_expression_primary ::= NK_LP value_expression NK_RP", + /* 49 */ "value_expression_primary ::= nonparenthesized_value_expression_primary", + /* 50 */ "nonparenthesized_value_expression_primary ::= literal", + /* 51 */ "nonparenthesized_value_expression_primary ::= column_reference", + /* 52 */ "literal ::= NK_LITERAL", + /* 53 */ "value_expression ::= common_value_expression", + /* 54 */ "common_value_expression ::= numeric_value_expression", + /* 55 */ "numeric_value_expression ::= numeric_primary", + /* 56 */ "numeric_value_expression ::= NK_PLUS numeric_primary", + /* 57 */ "numeric_value_expression ::= NK_MINUS numeric_primary", + /* 58 */ "numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression", + /* 59 */ "numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression", + /* 60 */ "numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression", + /* 61 */ "numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression", + /* 62 */ "numeric_primary ::= value_expression_primary", + /* 63 */ "numeric_primary ::= value_function", + /* 64 */ "table_primary ::= derived_table", + /* 65 */ "derived_table ::= table_subquery", + /* 66 */ "subquery ::= NK_LR query_expression NK_RP", + /* 67 */ "table_subquery ::= subquery", + /* 68 */ "limit_clause_opt ::=", + /* 69 */ "slimit_clause_opt ::=", }; #endif /* NDEBUG */ @@ -648,54 +668,60 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 31: /* cmd */ - case 32: /* query_expression */ - case 33: /* value_function */ - case 34: /* value_expression */ - case 35: /* value_expression_primary */ - case 36: /* nonparenthesized_value_expression_primary */ - case 37: /* literal */ - case 38: /* column_reference */ - case 39: /* common_value_expression */ - case 40: /* numeric_value_expression */ - case 41: /* numeric_primary */ - case 42: /* query_specification */ - case 45: /* from_clause */ - case 47: /* select_item */ - case 48: /* table_reference_list */ - case 49: /* table_reference */ - case 50: /* with_clause_opt */ - case 51: /* query_expression_body */ - case 53: /* limit_clause_opt */ - case 54: /* slimit_clause_opt */ - case 55: /* with_list */ - case 56: /* with_list_element */ - case 57: /* table_subquery */ - case 58: /* query_primary */ - case 60: /* sort_specification */ + case 32: /* cmd */ + case 33: /* query_expression */ + case 34: /* value_function */ + case 35: /* value_expression */ + case 36: /* value_expression_primary */ + case 37: /* nonparenthesized_value_expression_primary */ + case 38: /* literal */ + case 39: /* column_reference */ + case 40: /* table_name */ + case 41: /* common_value_expression */ + case 42: /* numeric_value_expression */ + case 43: /* numeric_primary */ + case 44: /* query_specification */ + case 47: /* from_clause */ + case 49: /* select_item */ + case 50: /* table_reference_list */ + case 51: /* table_reference */ + case 52: /* table_factor */ + case 53: /* table_primary */ + case 54: /* db_name */ + case 55: /* derived_table */ + case 56: /* table_subquery */ + case 57: /* subquery */ + case 58: /* with_clause_opt */ + case 59: /* query_expression_body */ + case 61: /* limit_clause_opt */ + case 62: /* slimit_clause_opt */ + case 63: /* with_list */ + case 64: /* with_list_element */ + case 65: /* query_primary */ + case 67: /* sort_specification */ { - nodesDestroyNode((yypminor->yy56)); + nodesDestroyNode((yypminor->yy112)); } break; - case 43: /* set_quantifier_opt */ + case 45: /* set_quantifier_opt */ { } break; - case 44: /* select_list */ - case 46: /* select_sublist */ - case 52: /* order_by_clause_opt */ - case 59: /* sort_specification_list */ + case 46: /* select_list */ + case 48: /* select_sublist */ + case 60: /* order_by_clause_opt */ + case 66: /* sort_specification_list */ { - nodesDestroyNodeList((yypminor->yy82)); + nodesDestroyNodeList((yypminor->yy124)); } break; - case 61: /* ordering_specification_opt */ + case 68: /* ordering_specification_opt */ { } break; - case 62: /* null_ordering_opt */ + case 69: /* null_ordering_opt */ { } @@ -994,70 +1020,76 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 31, -2 }, /* (0) cmd ::= SHOW DATABASES */ - { 31, -1 }, /* (1) cmd ::= query_expression */ - { 38, -1 }, /* (2) column_reference ::= NK_ID */ - { 38, -3 }, /* (3) column_reference ::= NK_ID NK_DOT NK_ID */ - { 38, -5 }, /* (4) column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID */ - { 42, -4 }, /* (5) query_specification ::= SELECT set_quantifier_opt select_list from_clause */ - { 43, 0 }, /* (6) set_quantifier_opt ::= */ - { 43, -1 }, /* (7) set_quantifier_opt ::= DISTINCT */ - { 43, -1 }, /* (8) set_quantifier_opt ::= ALL */ - { 44, -1 }, /* (9) select_list ::= NK_STAR */ - { 44, -1 }, /* (10) select_list ::= select_sublist */ - { 46, -1 }, /* (11) select_sublist ::= select_item */ - { 46, -3 }, /* (12) select_sublist ::= select_sublist NK_COMMA select_item */ - { 47, -1 }, /* (13) select_item ::= value_expression */ - { 47, -3 }, /* (14) select_item ::= value_expression AS NK_ID */ - { 47, -3 }, /* (15) select_item ::= NK_ID NK_DOT NK_STAR */ - { 47, -5 }, /* (16) select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR */ - { 32, -5 }, /* (17) query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ - { 50, 0 }, /* (18) with_clause_opt ::= */ - { 50, -2 }, /* (19) with_clause_opt ::= WITH with_list */ - { 50, -3 }, /* (20) with_clause_opt ::= WITH RECURSIVE with_list */ - { 55, -1 }, /* (21) with_list ::= with_list_element */ - { 55, -3 }, /* (22) with_list ::= with_list NK_COMMA with_list_element */ - { 56, -3 }, /* (23) with_list_element ::= NK_ID AS table_subquery */ - { 57, 0 }, /* (24) table_subquery ::= */ - { 51, -1 }, /* (25) query_expression_body ::= query_primary */ - { 51, -4 }, /* (26) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 58, -1 }, /* (27) query_primary ::= query_specification */ - { 58, -6 }, /* (28) query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ - { 52, 0 }, /* (29) order_by_clause_opt ::= */ - { 52, -3 }, /* (30) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 59, -1 }, /* (31) sort_specification_list ::= sort_specification */ - { 59, -3 }, /* (32) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 60, -3 }, /* (33) sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ - { 61, 0 }, /* (34) ordering_specification_opt ::= */ - { 61, -1 }, /* (35) ordering_specification_opt ::= ASC */ - { 61, -1 }, /* (36) ordering_specification_opt ::= DESC */ - { 62, 0 }, /* (37) null_ordering_opt ::= */ - { 62, -2 }, /* (38) null_ordering_opt ::= NULLS FIRST */ - { 62, -2 }, /* (39) null_ordering_opt ::= NULLS LAST */ - { 33, -4 }, /* (40) value_function ::= NK_ID NK_LP value_expression NK_RP */ - { 33, -6 }, /* (41) value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ - { 35, -3 }, /* (42) value_expression_primary ::= NK_LP value_expression NK_RP */ - { 35, -1 }, /* (43) value_expression_primary ::= nonparenthesized_value_expression_primary */ - { 36, -1 }, /* (44) nonparenthesized_value_expression_primary ::= literal */ - { 36, -1 }, /* (45) nonparenthesized_value_expression_primary ::= column_reference */ - { 37, -1 }, /* (46) literal ::= NK_LITERAL */ - { 34, -1 }, /* (47) value_expression ::= common_value_expression */ - { 39, -1 }, /* (48) common_value_expression ::= numeric_value_expression */ - { 40, -1 }, /* (49) numeric_value_expression ::= numeric_primary */ - { 40, -2 }, /* (50) numeric_value_expression ::= NK_PLUS numeric_primary */ - { 40, -2 }, /* (51) numeric_value_expression ::= NK_MINUS numeric_primary */ - { 40, -3 }, /* (52) numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ - { 40, -3 }, /* (53) numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ - { 40, -3 }, /* (54) numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ - { 40, -3 }, /* (55) numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ - { 41, -1 }, /* (56) numeric_primary ::= value_expression_primary */ - { 41, -1 }, /* (57) numeric_primary ::= value_function */ - { 45, -2 }, /* (58) from_clause ::= FROM table_reference_list */ - { 48, -1 }, /* (59) table_reference_list ::= table_reference */ - { 48, -3 }, /* (60) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 49, -1 }, /* (61) table_reference ::= NK_ID */ - { 53, 0 }, /* (62) limit_clause_opt ::= */ - { 54, 0 }, /* (63) slimit_clause_opt ::= */ + { 32, -2 }, /* (0) cmd ::= SHOW DATABASES */ + { 32, -1 }, /* (1) cmd ::= query_expression */ + { 39, -1 }, /* (2) column_reference ::= NK_ID */ + { 39, -3 }, /* (3) column_reference ::= table_name NK_DOT NK_ID */ + { 44, -4 }, /* (4) query_specification ::= SELECT set_quantifier_opt select_list from_clause */ + { 45, 0 }, /* (5) set_quantifier_opt ::= */ + { 45, -1 }, /* (6) set_quantifier_opt ::= DISTINCT */ + { 45, -1 }, /* (7) set_quantifier_opt ::= ALL */ + { 46, -1 }, /* (8) select_list ::= NK_STAR */ + { 46, -1 }, /* (9) select_list ::= select_sublist */ + { 48, -1 }, /* (10) select_sublist ::= select_item */ + { 48, -3 }, /* (11) select_sublist ::= select_sublist NK_COMMA select_item */ + { 49, -1 }, /* (12) select_item ::= value_expression */ + { 49, -3 }, /* (13) select_item ::= value_expression AS NK_ID */ + { 49, -3 }, /* (14) select_item ::= table_name NK_DOT NK_STAR */ + { 47, -2 }, /* (15) from_clause ::= FROM table_reference_list */ + { 50, -1 }, /* (16) table_reference_list ::= table_reference */ + { 51, -1 }, /* (17) table_reference ::= table_factor */ + { 52, -1 }, /* (18) table_factor ::= table_primary */ + { 53, -1 }, /* (19) table_primary ::= table_name */ + { 53, -3 }, /* (20) table_primary ::= db_name NK_DOT table_name */ + { 54, -1 }, /* (21) db_name ::= NK_ID */ + { 40, -1 }, /* (22) table_name ::= NK_ID */ + { 33, -5 }, /* (23) query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ + { 58, 0 }, /* (24) with_clause_opt ::= */ + { 58, -2 }, /* (25) with_clause_opt ::= WITH with_list */ + { 58, -3 }, /* (26) with_clause_opt ::= WITH RECURSIVE with_list */ + { 63, -1 }, /* (27) with_list ::= with_list_element */ + { 63, -3 }, /* (28) with_list ::= with_list NK_COMMA with_list_element */ + { 64, -3 }, /* (29) with_list_element ::= NK_ID AS table_subquery */ + { 56, 0 }, /* (30) table_subquery ::= */ + { 59, -1 }, /* (31) query_expression_body ::= query_primary */ + { 59, -4 }, /* (32) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 65, -1 }, /* (33) query_primary ::= query_specification */ + { 65, -6 }, /* (34) query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ + { 60, 0 }, /* (35) order_by_clause_opt ::= */ + { 60, -3 }, /* (36) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 66, -1 }, /* (37) sort_specification_list ::= sort_specification */ + { 66, -3 }, /* (38) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 67, -3 }, /* (39) sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ + { 68, 0 }, /* (40) ordering_specification_opt ::= */ + { 68, -1 }, /* (41) ordering_specification_opt ::= ASC */ + { 68, -1 }, /* (42) ordering_specification_opt ::= DESC */ + { 69, 0 }, /* (43) null_ordering_opt ::= */ + { 69, -2 }, /* (44) null_ordering_opt ::= NULLS FIRST */ + { 69, -2 }, /* (45) null_ordering_opt ::= NULLS LAST */ + { 34, -4 }, /* (46) value_function ::= NK_ID NK_LP value_expression NK_RP */ + { 34, -6 }, /* (47) value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ + { 36, -3 }, /* (48) value_expression_primary ::= NK_LP value_expression NK_RP */ + { 36, -1 }, /* (49) value_expression_primary ::= nonparenthesized_value_expression_primary */ + { 37, -1 }, /* (50) nonparenthesized_value_expression_primary ::= literal */ + { 37, -1 }, /* (51) nonparenthesized_value_expression_primary ::= column_reference */ + { 38, -1 }, /* (52) literal ::= NK_LITERAL */ + { 35, -1 }, /* (53) value_expression ::= common_value_expression */ + { 41, -1 }, /* (54) common_value_expression ::= numeric_value_expression */ + { 42, -1 }, /* (55) numeric_value_expression ::= numeric_primary */ + { 42, -2 }, /* (56) numeric_value_expression ::= NK_PLUS numeric_primary */ + { 42, -2 }, /* (57) numeric_value_expression ::= NK_MINUS numeric_primary */ + { 42, -3 }, /* (58) numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ + { 42, -3 }, /* (59) numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ + { 42, -3 }, /* (60) numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ + { 42, -3 }, /* (61) numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ + { 43, -1 }, /* (62) numeric_primary ::= value_expression_primary */ + { 43, -1 }, /* (63) numeric_primary ::= value_function */ + { 53, -1 }, /* (64) table_primary ::= derived_table */ + { 55, -1 }, /* (65) derived_table ::= table_subquery */ + { 57, -3 }, /* (66) subquery ::= NK_LR query_expression NK_RP */ + { 56, -1 }, /* (67) table_subquery ::= subquery */ + { 61, 0 }, /* (68) limit_clause_opt ::= */ + { 62, 0 }, /* (69) slimit_clause_opt ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1145,233 +1177,251 @@ static YYACTIONTYPE yy_reduce( /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; case 0: /* cmd ::= SHOW DATABASES */ -{ createShowStmt(pCxt, SHOW_TYPE_DATABASE); } +{ PARSER_TRACE; createShowStmt(pCxt, SHOW_TYPE_DATABASE); } break; case 1: /* cmd ::= query_expression */ -{ pCxt->pRootNode = yymsp[0].minor.yy56; } +{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy112; } break; case 2: /* column_reference ::= NK_ID */ -{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, NULL, yymsp[0].minor.yy0); } - yymsp[0].minor.yy56 = yylhsminor.yy56; +{ PARSER_TRACE; yylhsminor.yy112 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy112 = yylhsminor.yy112; break; - case 3: /* column_reference ::= NK_ID NK_DOT NK_ID */ - case 15: /* select_item ::= NK_ID NK_DOT NK_STAR */ yytestcase(yyruleno==15); -{ yylhsminor.yy56 = createColumnNode(pCxt, NULL, yymsp[-2].minor.yy0, yymsp[0].minor.yy0); } - yymsp[-2].minor.yy56 = yylhsminor.yy56; + case 3: /* column_reference ::= table_name NK_DOT NK_ID */ + case 14: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==14); +{ PARSER_TRACE; yylhsminor.yy112 = createColumnNode(pCxt, &yymsp[-2].minor.yy29, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy112 = yylhsminor.yy112; break; - case 4: /* column_reference ::= NK_ID NK_DOT NK_ID NK_DOT NK_ID */ - case 16: /* select_item ::= NK_ID NK_DOT NK_ID NK_DOT NK_STAR */ yytestcase(yyruleno==16); -{ yylhsminor.yy56 = createColumnNode(pCxt, yymsp[-4].minor.yy0, yymsp[-2].minor.yy0, yymsp[0].minor.yy0); } - yymsp[-4].minor.yy56 = yylhsminor.yy56; + case 4: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause */ +{ PARSER_TRACE; yymsp[-3].minor.yy112 = createSelectStmt(pCxt, yymsp[-2].minor.yy117, yymsp[-1].minor.yy124, yymsp[0].minor.yy112); } break; - case 5: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause */ -{ yymsp[-3].minor.yy56 = createSelectStmt(pCxt, yymsp[-2].minor.yy47, yymsp[-1].minor.yy82, yymsp[0].minor.yy56); } + case 5: /* set_quantifier_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy117 = false; } break; - case 6: /* set_quantifier_opt ::= */ -{ yymsp[1].minor.yy47 = false; } + case 6: /* set_quantifier_opt ::= DISTINCT */ +{ PARSER_TRACE; yymsp[0].minor.yy117 = true; } break; - case 7: /* set_quantifier_opt ::= DISTINCT */ -{ yymsp[0].minor.yy47 = true; } + case 7: /* set_quantifier_opt ::= ALL */ +{ PARSER_TRACE; yymsp[0].minor.yy117 = false; } break; - case 8: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy47 = false; } + case 8: /* select_list ::= NK_STAR */ +{ PARSER_TRACE; yymsp[0].minor.yy124 = NULL; } break; - case 9: /* select_list ::= NK_STAR */ -{ yymsp[0].minor.yy82 = NULL; } + case 9: /* select_list ::= select_sublist */ +{ PARSER_TRACE; yylhsminor.yy124 = yymsp[0].minor.yy124; } + yymsp[0].minor.yy124 = yylhsminor.yy124; break; - case 10: /* select_list ::= select_sublist */ -{ yylhsminor.yy82 = yymsp[0].minor.yy82; } - yymsp[0].minor.yy82 = yylhsminor.yy82; + case 10: /* select_sublist ::= select_item */ + case 37: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==37); +{ PARSER_TRACE; yylhsminor.yy124 = createNodeList(pCxt, yymsp[0].minor.yy112); } + yymsp[0].minor.yy124 = yylhsminor.yy124; break; - case 11: /* select_sublist ::= select_item */ - case 31: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==31); -{ yylhsminor.yy82 = createNodeList(pCxt, yymsp[0].minor.yy56); } - yymsp[0].minor.yy82 = yylhsminor.yy82; + case 11: /* select_sublist ::= select_sublist NK_COMMA select_item */ + case 38: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==38); +{ PARSER_TRACE; yylhsminor.yy124 = addNodeToList(pCxt, yymsp[-2].minor.yy124, yymsp[0].minor.yy112); } + yymsp[-2].minor.yy124 = yylhsminor.yy124; break; - case 12: /* select_sublist ::= select_sublist NK_COMMA select_item */ - case 32: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==32); -{ yylhsminor.yy82 = addNodeToList(pCxt, yymsp[-2].minor.yy82, yymsp[0].minor.yy56); } - yymsp[-2].minor.yy82 = yylhsminor.yy82; + case 12: /* select_item ::= value_expression */ + case 16: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==16); + case 17: /* table_reference ::= table_factor */ yytestcase(yyruleno==17); + case 18: /* table_factor ::= table_primary */ yytestcase(yyruleno==18); + case 31: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==31); + case 33: /* query_primary ::= query_specification */ yytestcase(yyruleno==33); +{ PARSER_TRACE; yylhsminor.yy112 = yymsp[0].minor.yy112; } + yymsp[0].minor.yy112 = yylhsminor.yy112; break; - case 13: /* select_item ::= value_expression */ - case 25: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==25); - case 27: /* query_primary ::= query_specification */ yytestcase(yyruleno==27); -{ yylhsminor.yy56 = yymsp[0].minor.yy56; } - yymsp[0].minor.yy56 = yylhsminor.yy56; + case 13: /* select_item ::= value_expression AS NK_ID */ +{ PARSER_TRACE; yylhsminor.yy112 = setProjectionAlias(pCxt, yymsp[-2].minor.yy112, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy112 = yylhsminor.yy112; break; - case 14: /* select_item ::= value_expression AS NK_ID */ -{ yylhsminor.yy56 = setProjectionAlias(pCxt, yymsp[-2].minor.yy56, yymsp[0].minor.yy0); } - yymsp[-2].minor.yy56 = yylhsminor.yy56; + case 15: /* from_clause ::= FROM table_reference_list */ +{ PARSER_TRACE; yymsp[-1].minor.yy112 = yymsp[0].minor.yy112; } break; - case 17: /* query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ -{ yy_destructor(yypParser,50,&yymsp[-4].minor); -{ yymsp[-4].minor.yy56 = yymsp[-3].minor.yy56; } - yy_destructor(yypParser,52,&yymsp[-2].minor); - yy_destructor(yypParser,53,&yymsp[-1].minor); - yy_destructor(yypParser,54,&yymsp[0].minor); + case 19: /* table_primary ::= table_name */ +{ PARSER_TRACE; yylhsminor.yy112 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy29); } + yymsp[0].minor.yy112 = yylhsminor.yy112; + break; + case 20: /* table_primary ::= db_name NK_DOT table_name */ +{ PARSER_TRACE; yylhsminor.yy112 = createRealTableNode(pCxt, &yymsp[-2].minor.yy29, &yymsp[0].minor.yy29); } + yymsp[-2].minor.yy112 = yylhsminor.yy112; + break; + case 21: /* db_name ::= NK_ID */ + case 22: /* table_name ::= NK_ID */ yytestcase(yyruleno==22); +{ PARSER_TRACE; yylhsminor.yy29 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy29 = yylhsminor.yy29; + break; + case 23: /* query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ +{ yy_destructor(yypParser,58,&yymsp[-4].minor); +{ PARSER_TRACE; yymsp[-4].minor.yy112 = yymsp[-3].minor.yy112; } + yy_destructor(yypParser,60,&yymsp[-2].minor); + yy_destructor(yypParser,61,&yymsp[-1].minor); + yy_destructor(yypParser,62,&yymsp[0].minor); } break; - case 18: /* with_clause_opt ::= */ - case 24: /* table_subquery ::= */ yytestcase(yyruleno==24); + case 24: /* with_clause_opt ::= */ + case 30: /* table_subquery ::= */ yytestcase(yyruleno==30); {} break; - case 19: /* with_clause_opt ::= WITH with_list */ - case 20: /* with_clause_opt ::= WITH RECURSIVE with_list */ yytestcase(yyruleno==20); -{ pCxt->notSupport = true; pCxt->valid = false; } - yy_destructor(yypParser,55,&yymsp[0].minor); + case 25: /* with_clause_opt ::= WITH with_list */ + case 26: /* with_clause_opt ::= WITH RECURSIVE with_list */ yytestcase(yyruleno==26); +{ PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } + yy_destructor(yypParser,63,&yymsp[0].minor); break; - case 21: /* with_list ::= with_list_element */ -{ yy_destructor(yypParser,56,&yymsp[0].minor); + case 27: /* with_list ::= with_list_element */ +{ yy_destructor(yypParser,64,&yymsp[0].minor); {} } break; - case 22: /* with_list ::= with_list NK_COMMA with_list_element */ -{ yy_destructor(yypParser,55,&yymsp[-2].minor); + case 28: /* with_list ::= with_list NK_COMMA with_list_element */ +{ yy_destructor(yypParser,63,&yymsp[-2].minor); +{} + yy_destructor(yypParser,64,&yymsp[0].minor); +} + break; + case 29: /* with_list_element ::= NK_ID AS table_subquery */ {} yy_destructor(yypParser,56,&yymsp[0].minor); -} break; - case 23: /* with_list_element ::= NK_ID AS table_subquery */ -{} - yy_destructor(yypParser,57,&yymsp[0].minor); + case 32: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ PARSER_TRACE; yylhsminor.yy112 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy112, yymsp[0].minor.yy112); } + yymsp[-3].minor.yy112 = yylhsminor.yy112; break; - case 26: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy56 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy56, yymsp[0].minor.yy56); } - yymsp[-3].minor.yy56 = yylhsminor.yy56; + case 34: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy112 = yymsp[-4].minor.yy112;} + yy_destructor(yypParser,60,&yymsp[-3].minor); + yy_destructor(yypParser,61,&yymsp[-2].minor); + yy_destructor(yypParser,62,&yymsp[-1].minor); break; - case 28: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ -{ yymsp[-5].minor.yy56 = yymsp[-4].minor.yy56;} - yy_destructor(yypParser,52,&yymsp[-3].minor); - yy_destructor(yypParser,53,&yymsp[-2].minor); - yy_destructor(yypParser,54,&yymsp[-1].minor); + case 35: /* order_by_clause_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy124 = NULL; } break; - case 29: /* order_by_clause_opt ::= */ -{ yymsp[1].minor.yy82 = NULL; } + case 36: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ +{ PARSER_TRACE; yymsp[-2].minor.yy124 = yymsp[0].minor.yy124; } break; - case 30: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ -{ yymsp[-2].minor.yy82 = yymsp[0].minor.yy82; } + case 39: /* sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ +{ PARSER_TRACE; yylhsminor.yy112 = createOrderByExprNode(pCxt, yymsp[-2].minor.yy112, yymsp[-1].minor.yy78, yymsp[0].minor.yy137); } + yymsp[-2].minor.yy112 = yylhsminor.yy112; break; - case 33: /* sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy56 = createOrderByExprNode(pCxt, yymsp[-2].minor.yy56, yymsp[-1].minor.yy92, yymsp[0].minor.yy109); } - yymsp[-2].minor.yy56 = yylhsminor.yy56; + case 40: /* ordering_specification_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy78 = ORDER_ASC; } break; - case 34: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy92 = ORDER_ASC; } + case 41: /* ordering_specification_opt ::= ASC */ +{ PARSER_TRACE; yymsp[0].minor.yy78 = ORDER_ASC; } break; - case 35: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy92 = ORDER_ASC; } + case 42: /* ordering_specification_opt ::= DESC */ +{ PARSER_TRACE; yymsp[0].minor.yy78 = ORDER_DESC; } break; - case 36: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy92 = ORDER_DESC; } + case 43: /* null_ordering_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy137 = NULL_ORDER_DEFAULT; } break; - case 37: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy109 = NULL_ORDER_DEFAULT; } + case 44: /* null_ordering_opt ::= NULLS FIRST */ +{ PARSER_TRACE; yymsp[-1].minor.yy137 = NULL_ORDER_FIRST; } break; - case 38: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy109 = NULL_ORDER_FIRST; } + case 45: /* null_ordering_opt ::= NULLS LAST */ +{ PARSER_TRACE; yymsp[-1].minor.yy137 = NULL_ORDER_LAST; } break; - case 39: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy109 = NULL_ORDER_LAST; } - break; - case 40: /* value_function ::= NK_ID NK_LP value_expression NK_RP */ - case 42: /* value_expression_primary ::= NK_LP value_expression NK_RP */ yytestcase(yyruleno==42); + case 46: /* value_function ::= NK_ID NK_LP value_expression NK_RP */ + case 48: /* value_expression_primary ::= NK_LP value_expression NK_RP */ yytestcase(yyruleno==48); { } - yy_destructor(yypParser,34,&yymsp[-1].minor); + yy_destructor(yypParser,35,&yymsp[-1].minor); break; - case 41: /* value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ + case 47: /* value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ { } - yy_destructor(yypParser,34,&yymsp[-3].minor); - yy_destructor(yypParser,34,&yymsp[-1].minor); + yy_destructor(yypParser,35,&yymsp[-3].minor); + yy_destructor(yypParser,35,&yymsp[-1].minor); break; - case 43: /* value_expression_primary ::= nonparenthesized_value_expression_primary */ -{ yy_destructor(yypParser,36,&yymsp[0].minor); -{ -} -} - break; - case 44: /* nonparenthesized_value_expression_primary ::= literal */ + case 49: /* value_expression_primary ::= nonparenthesized_value_expression_primary */ { yy_destructor(yypParser,37,&yymsp[0].minor); { } } break; - case 45: /* nonparenthesized_value_expression_primary ::= column_reference */ + case 50: /* nonparenthesized_value_expression_primary ::= literal */ { yy_destructor(yypParser,38,&yymsp[0].minor); { } } break; - case 47: /* value_expression ::= common_value_expression */ + case 51: /* nonparenthesized_value_expression_primary ::= column_reference */ { yy_destructor(yypParser,39,&yymsp[0].minor); { } } break; - case 48: /* common_value_expression ::= numeric_value_expression */ -{ yy_destructor(yypParser,40,&yymsp[0].minor); -{ -} -} - break; - case 49: /* numeric_value_expression ::= numeric_primary */ + case 53: /* value_expression ::= common_value_expression */ { yy_destructor(yypParser,41,&yymsp[0].minor); { } } break; - case 50: /* numeric_value_expression ::= NK_PLUS numeric_primary */ - case 51: /* numeric_value_expression ::= NK_MINUS numeric_primary */ yytestcase(yyruleno==51); -{ -} - yy_destructor(yypParser,41,&yymsp[0].minor); - break; - case 52: /* numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ - case 53: /* numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ yytestcase(yyruleno==53); - case 54: /* numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ yytestcase(yyruleno==54); - case 55: /* numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ yytestcase(yyruleno==55); -{ yy_destructor(yypParser,40,&yymsp[-2].minor); -{ -} - yy_destructor(yypParser,40,&yymsp[0].minor); -} - break; - case 56: /* numeric_primary ::= value_expression_primary */ -{ yy_destructor(yypParser,35,&yymsp[0].minor); + case 54: /* common_value_expression ::= numeric_value_expression */ +{ yy_destructor(yypParser,42,&yymsp[0].minor); { } } break; - case 57: /* numeric_primary ::= value_function */ -{ yy_destructor(yypParser,33,&yymsp[0].minor); + case 55: /* numeric_value_expression ::= numeric_primary */ +{ yy_destructor(yypParser,43,&yymsp[0].minor); { } } break; - case 58: /* from_clause ::= FROM table_reference_list */ + case 56: /* numeric_value_expression ::= NK_PLUS numeric_primary */ + case 57: /* numeric_value_expression ::= NK_MINUS numeric_primary */ yytestcase(yyruleno==57); { } - yy_destructor(yypParser,48,&yymsp[0].minor); + yy_destructor(yypParser,43,&yymsp[0].minor); break; - case 59: /* table_reference_list ::= table_reference */ -{ yy_destructor(yypParser,49,&yymsp[0].minor); + case 58: /* numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ + case 59: /* numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ yytestcase(yyruleno==59); + case 60: /* numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ yytestcase(yyruleno==60); + case 61: /* numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ yytestcase(yyruleno==61); +{ yy_destructor(yypParser,42,&yymsp[-2].minor); +{ +} + yy_destructor(yypParser,42,&yymsp[0].minor); +} + break; + case 62: /* numeric_primary ::= value_expression_primary */ +{ yy_destructor(yypParser,36,&yymsp[0].minor); { } } break; - case 60: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yy_destructor(yypParser,48,&yymsp[-2].minor); + case 63: /* numeric_primary ::= value_function */ +{ yy_destructor(yypParser,34,&yymsp[0].minor); +{ +} +} + break; + case 64: /* table_primary ::= derived_table */ +{ yy_destructor(yypParser,55,&yymsp[0].minor); +{ +} +} + break; + case 65: /* derived_table ::= table_subquery */ +{ yy_destructor(yypParser,56,&yymsp[0].minor); +{ +} +} + break; + case 66: /* subquery ::= NK_LR query_expression NK_RP */ +{ +} + yy_destructor(yypParser,33,&yymsp[-1].minor); + break; + case 67: /* table_subquery ::= subquery */ +{ yy_destructor(yypParser,57,&yymsp[0].minor); { } - yy_destructor(yypParser,49,&yymsp[0].minor); } break; default: - /* (46) literal ::= NK_LITERAL */ yytestcase(yyruleno==46); - /* (61) table_reference ::= NK_ID */ yytestcase(yyruleno==61); - /* (62) limit_clause_opt ::= */ yytestcase(yyruleno==62); - /* (63) slimit_clause_opt ::= */ yytestcase(yyruleno==63); + /* (52) literal ::= NK_LITERAL */ yytestcase(yyruleno==52); + /* (68) limit_clause_opt ::= */ yytestcase(yyruleno==68); + /* (69) slimit_clause_opt ::= */ yytestcase(yyruleno==69); break; /********** End reduce actions ************************************************/ }; @@ -1432,16 +1482,16 @@ static void yy_syntax_error( #define TOKEN yyminor /************ Begin %syntax_error code ****************************************/ - if(TOKEN->z) { + if(TOKEN.z) { char msg[] = "syntax error near \"%s\""; - int32_t sqlLen = strlen(&TOKEN->z[0]); + int32_t sqlLen = strlen(&TOKEN.z[0]); if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > pCxt->pQueryCxt->msgLen) { char tmpstr[128] = {0}; - memcpy(tmpstr, &TOKEN->z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); + memcpy(tmpstr, &TOKEN.z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1); sprintf(pCxt->pQueryCxt->pMsg, msg, tmpstr); } else { - sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN->z[0]); + sprintf(pCxt->pQueryCxt->pMsg, msg, &TOKEN.z[0]); } } else { sprintf(pCxt->pQueryCxt->pMsg, "Incomplete SQL statement"); diff --git a/source/libs/parser/test/CMakeLists.txt b/source/libs/parser/test/CMakeLists.txt index e722b873b6..84164c8c76 100644 --- a/source/libs/parser/test/CMakeLists.txt +++ b/source/libs/parser/test/CMakeLists.txt @@ -15,5 +15,5 @@ TARGET_INCLUDE_DIRECTORIES( TARGET_LINK_LIBRARIES( parserTest - PUBLIC os util common parser catalog transport gtest function planner qcom + PUBLIC os util common nodes parser catalog transport gtest function planner qcom ) diff --git a/source/libs/parser/test/newParserTest.cpp b/source/libs/parser/test/newParserTest.cpp new file mode 100644 index 0000000000..36db2b3dcc --- /dev/null +++ b/source/libs/parser/test/newParserTest.cpp @@ -0,0 +1,143 @@ +/* + * 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 "astCreater.h" + +using namespace std; +using namespace testing; + +class NewParserTest : public Test { +protected: + void setDatabase(const string& acctId, const string& db) { + acctId_ = acctId; + db_ = db; + } + + void bind(const char* sql) { + reset(); + cxt_.acctId = atoi(acctId_.c_str()); + cxt_.db = (char*) db_.c_str(); + strcpy(sqlBuf_, sql); + cxt_.sqlLen = strlen(sql); + sqlBuf_[cxt_.sqlLen] = '\0'; + cxt_.pSql = sqlBuf_; + + } + + int32_t run() { + int32_t code = doParse(&cxt_, &query_); + if (code != TSDB_CODE_SUCCESS) { + cout << "code:" << tstrerror(code) << ", msg:" << errMagBuf_ << endl; + return code; + } + cout << nodeType(query_.pRoot) << endl; + if (NULL != query_.pRoot && QUERY_NODE_SELECT_STMT == nodeType(query_.pRoot)) { + // SNode* pWhereCond; + // SNodeList* pPartitionByList; // SNode + // SNode* pWindowClause; + // SNodeList* pGroupByList; // SGroupingSetNode + // SNodeList* pOrderByList; // SOrderByExprNode + // SLimitNode limit; + // SLimitNode slimit; + + SSelectStmt* select = (SSelectStmt*)query_.pRoot; + string sql("SELECT "); + if (select->isDistinct) { + sql.append("DISTINCT "); + } + if (nullptr == select->pProjectionList) { + sql.append("* "); + } else { + nodeListToSql(select->pProjectionList, sql); + } + sql.append("FROM "); + tableToSql(select->pFromTable, sql); + cout << sql << endl; + } + // char* pStr = NULL; + // int32_t len = 0; + // code = nodesNodeToString(query_.pRoot, &pStr, &len); + // if (code != TSDB_CODE_SUCCESS) { + // cout << "code:" << tstrerror(code) << ", msg:" << errMagBuf_ << endl; + // return code; + // } + // cout << "node tree:\n" << pStr << endl; + return TSDB_CODE_SUCCESS; + } + +private: + static const int max_err_len = 1024; + static const int max_sql_len = 1024 * 1024; + + void tableToSql(const SNode* node, string& sql) { + const STableNode* table = (const STableNode*)node; + cout << "node : " << nodeType(node) << endl; + switch (nodeType(node)) { + case QUERY_NODE_REAL_TABLE: { + SRealTableNode* realTable = (SRealTableNode*)table; + if ('\0' != realTable->dbName[0]) { + sql.append(realTable->dbName); + sql.append("."); + } + sql.append(realTable->table.tableName); + break; + } + default: + break; + } + } + + void nodeListToSql(const SNodeList* nodelist, string& sql, const string& seq = ",") { + SNode* node = nullptr; + bool firstNode = true; + FOREACH(node, nodelist) { + if (!firstNode) { + sql.append(", "); + } + switch (nodeType(node)) { + case QUERY_NODE_COLUMN: + sql.append(((SColumnNode*)node)->colName); + break; + } + } + } + + void reset() { + memset(&cxt_, 0, sizeof(cxt_)); + memset(errMagBuf_, 0, max_err_len); + cxt_.pMsg = errMagBuf_; + cxt_.msgLen = max_err_len; + } + + string acctId_; + string db_; + char errMagBuf_[max_err_len]; + char sqlBuf_[max_sql_len]; + SParseContext cxt_; + SQuery query_; +}; + +// SELECT * FROM t1 +TEST_F(NewParserTest, selectStar) { + setDatabase("root", "test"); + + bind("SELECT * FROM t1"); + ASSERT_EQ(run(), TSDB_CODE_SUCCESS); + + bind("SELECT * FROM test.t1"); + ASSERT_EQ(run(), TSDB_CODE_SUCCESS); +} diff --git a/source/nodes/src/nodesCodeFuncs.c b/source/nodes/src/nodesCodeFuncs.c index b31980d150..959e10fb82 100644 --- a/source/nodes/src/nodesCodeFuncs.c +++ b/source/nodes/src/nodesCodeFuncs.c @@ -16,7 +16,28 @@ #include "nodes.h" int32_t nodesNodeToString(const SNode* pNode, char** pStr, int32_t* pLen) { - + switch (nodeType(pNode)) { + case QUERY_NODE_COLUMN: + case QUERY_NODE_VALUE: + case QUERY_NODE_OPERATOR: + case QUERY_NODE_LOGIC_CONDITION: + case QUERY_NODE_IS_NULL_CONDITION: + case QUERY_NODE_FUNCTION: + case QUERY_NODE_REAL_TABLE: + case QUERY_NODE_TEMP_TABLE: + case QUERY_NODE_JOIN_TABLE: + case QUERY_NODE_GROUPING_SET: + case QUERY_NODE_ORDER_BY_EXPR: + case QUERY_NODE_LIMIT: + case QUERY_NODE_STATE_WINDOW: + case QUERY_NODE_SESSION_WINDOW: + case QUERY_NODE_INTERVAL_WINDOW: + case QUERY_NODE_SET_OPERATOR: + case QUERY_NODE_SELECT_STMT: + case QUERY_NODE_SHOW_STMT: + default: + break; + } } int32_t nodesStringToNode(const char* pStr, SNode** pNode) { diff --git a/source/nodes/src/nodesEqualFuncs.c b/source/nodes/src/nodesEqualFuncs.c index 236326524e..f2752fe7f9 100644 --- a/source/nodes/src/nodesEqualFuncs.c +++ b/source/nodes/src/nodesEqualFuncs.c @@ -36,13 +36,13 @@ return false; \ } while (0) -#define COMPARE_ARRAY_FIELD(fldname) \ +#define COMPARE_NODE_LIST_FIELD(fldname) \ do { \ - if (!nodeArrayEqual(a->fldname, b->fldname)) \ + if (!nodeNodeListEqual(a->fldname, b->fldname)) \ return false; \ } while (0) -static bool nodeArrayEqual(const SArray* a, const SArray* b) { +static bool nodeNodeListEqual(const SNodeList* a, const SNodeList* b) { if (a == b) { return true; } @@ -51,13 +51,13 @@ static bool nodeArrayEqual(const SArray* a, const SArray* b) { return false; } - if (taosArrayGetSize(a) != taosArrayGetSize(b)) { + if (LIST_LENGTH(a) != LIST_LENGTH(b)) { return false; } - size_t size = taosArrayGetSize(a); - for (size_t i = 0; i < size; ++i) { - if (!nodesEqualNode((SNode*)taosArrayGetP(a, i), (SNode*)taosArrayGetP(b, i))) { + SNode* na, *nb; + FORBOTH(na, a, nb, b) { + if (!nodesEqualNode(na, nb)) { return false; } } @@ -85,7 +85,7 @@ static bool operatorNodeEqual(const SOperatorNode* a, const SOperatorNode* b) { static bool logicConditionNodeEqual(const SLogicConditionNode* a, const SLogicConditionNode* b) { COMPARE_SCALAR_FIELD(condType); - COMPARE_ARRAY_FIELD(pParameterList); + COMPARE_NODE_LIST_FIELD(pParameterList); return true; } @@ -97,7 +97,7 @@ static bool isNullConditionNodeEqual(const SIsNullCondNode* a, const SIsNullCond static bool functionNodeEqual(const SFunctionNode* a, const SFunctionNode* b) { COMPARE_SCALAR_FIELD(funcId); - COMPARE_ARRAY_FIELD(pParameterList); + COMPARE_NODE_LIST_FIELD(pParameterList); return true; } @@ -132,6 +132,7 @@ bool nodesEqualNode(const SNode* a, const SNode* b) { case QUERY_NODE_JOIN_TABLE: case QUERY_NODE_GROUPING_SET: case QUERY_NODE_ORDER_BY_EXPR: + case QUERY_NODE_LIMIT: return false; // todo default: break; diff --git a/source/nodes/src/nodesTraverseFuncs.c b/source/nodes/src/nodesTraverseFuncs.c index d096bbcc0d..ffe40073e6 100644 --- a/source/nodes/src/nodesTraverseFuncs.c +++ b/source/nodes/src/nodesTraverseFuncs.c @@ -17,14 +17,14 @@ typedef bool (*FQueryNodeWalker)(SNode* pNode, void* pContext); -bool nodesWalkArray(SArray* pArray, FQueryNodeWalker walker, void* pContext) { - size_t size = taosArrayGetSize(pArray); - for (size_t i = 0; i < size; ++i) { - if (!nodesWalkNode((SNode*)taosArrayGetP(pArray, i), walker, pContext)) { - return false; - } +bool nodesWalkNodeList(SNodeList* pNodeList, FQueryNodeWalker walker, void* pContext) { + SNode* node; + FOREACH(node, pNodeList) { + if (!nodesWalkNode(node, walker, pContext)) { + return false; } - return true; + } + return true; } bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext) { @@ -39,6 +39,7 @@ bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext) { switch (nodeType(pNode)) { case QUERY_NODE_COLUMN: case QUERY_NODE_VALUE: + case QUERY_NODE_LIMIT: // these node types with no subnodes return true; case QUERY_NODE_OPERATOR: { @@ -49,11 +50,11 @@ bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext) { return nodesWalkNode(pOpNode->pRight, walker, pContext); } case QUERY_NODE_LOGIC_CONDITION: - return nodesWalkArray(((SLogicConditionNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkNodeList(((SLogicConditionNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_IS_NULL_CONDITION: return nodesWalkNode(((SIsNullCondNode*)pNode)->pExpr, walker, pContext); case QUERY_NODE_FUNCTION: - return nodesWalkArray(((SFunctionNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkNodeList(((SFunctionNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_REAL_TABLE: case QUERY_NODE_TEMP_TABLE: return true; // todo @@ -68,7 +69,7 @@ bool nodesWalkNode(SNode* pNode, FQueryNodeWalker walker, void* pContext) { return nodesWalkNode(pJoinTableNode->pOnCond, walker, pContext); } case QUERY_NODE_GROUPING_SET: - return nodesWalkArray(((SGroupingSetNode*)pNode)->pParameterList, walker, pContext); + return nodesWalkNodeList(((SGroupingSetNode*)pNode)->pParameterList, walker, pContext); case QUERY_NODE_ORDER_BY_EXPR: return nodesWalkNode(((SOrderByExprNode*)pNode)->pExpr, walker, pContext); default: diff --git a/source/nodes/src/nodesUtilFuncs.c b/source/nodes/src/nodesUtilFuncs.c index 646d86ab87..535bd8e171 100644 --- a/source/nodes/src/nodesUtilFuncs.c +++ b/source/nodes/src/nodesUtilFuncs.c @@ -14,6 +14,7 @@ */ #include "nodes.h" +#include "nodesShowStmts.h" bool nodesIsTimeorderQuery(const SNode* pQuery) { @@ -23,8 +24,54 @@ bool nodesIsTimelineQuery(const SNode* pQuery) { } -SNode* nodesMakeNode(ENodeType type) { +static SNode* makeNode(ENodeType type, size_t size) { + SNode* p = calloc(1, size); + setNodeType(p, type); + return p; +} +SNode* nodesMakeNode(ENodeType type) { + switch (type) { + case QUERY_NODE_COLUMN: + return makeNode(type, sizeof(SColumnNode)); + case QUERY_NODE_VALUE: + return makeNode(type, sizeof(SValueNode)); + case QUERY_NODE_OPERATOR: + return makeNode(type, sizeof(SOperatorNode)); + case QUERY_NODE_LOGIC_CONDITION: + return makeNode(type, sizeof(SLogicConditionNode)); + case QUERY_NODE_IS_NULL_CONDITION: + return makeNode(type, sizeof(SIsNullCondNode)); + case QUERY_NODE_FUNCTION: + return makeNode(type, sizeof(SFunctionNode)); + case QUERY_NODE_REAL_TABLE: + return makeNode(type, sizeof(SRealTableNode)); + case QUERY_NODE_TEMP_TABLE: + return makeNode(type, sizeof(STempTableNode)); + case QUERY_NODE_JOIN_TABLE: + return makeNode(type, sizeof(SJoinTableNode)); + case QUERY_NODE_GROUPING_SET: + return makeNode(type, sizeof(SGroupingSetNode)); + case QUERY_NODE_ORDER_BY_EXPR: + return makeNode(type, sizeof(SOrderByExprNode)); + case QUERY_NODE_LIMIT: + return makeNode(type, sizeof(SLimitNode)); + case QUERY_NODE_STATE_WINDOW: + return makeNode(type, sizeof(SStateWindowNode)); + case QUERY_NODE_SESSION_WINDOW: + return makeNode(type, sizeof(SSessionWindowNode)); + case QUERY_NODE_INTERVAL_WINDOW: + return makeNode(type, sizeof(SIntervalWindowNode)); + case QUERY_NODE_SET_OPERATOR: + return makeNode(type, sizeof(SSetOperator)); + case QUERY_NODE_SELECT_STMT: + return makeNode(type, sizeof(SSelectStmt)); + case QUERY_NODE_SHOW_STMT: + return makeNode(type, sizeof(SShowStmt)); + default: + break; + } + return NULL; } void nodesDestroyNode(SNode* pNode) { From 4d1ba65c46da4749a804ea86c052189fdc5a4b03 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Jan 2022 14:31:57 +0800 Subject: [PATCH 05/37] catalog remove db vgroup info --- include/common/tmsg.h | 4 +- include/libs/catalog/catalog.h | 1 + include/libs/qcom/query.h | 2 +- source/libs/catalog/src/catalog.c | 104 ++++++++++++++++++---- source/libs/catalog/test/catalogTests.cpp | 2 +- 5 files changed, 94 insertions(+), 19 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 7630c5f5e5..75e8195215 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -147,7 +147,7 @@ typedef struct { } SBuildTableMetaInput; typedef struct { - char db[TSDB_TABLE_FNAME_LEN]; + char db[TSDB_DB_FNAME_LEN]; int32_t vgVersion; } SBuildUseDBInput; @@ -746,7 +746,7 @@ typedef struct { typedef struct { char db[TSDB_DB_FNAME_LEN]; - int64_t uid; + uint64_t uid; int32_t vgVersion; int32_t vgNum; int8_t hashMethod; diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 70cff7ed1a..9c9e370dca 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -59,6 +59,7 @@ typedef struct SSTableMetaVersion { } SSTableMetaVersion; typedef struct SDbVgVersion { + char dbName[TSDB_DB_FNAME_LEN]; int64_t dbId; int32_t vgVersion; } SDbVgVersion; diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index 1925f0e3bd..53ef6f4f9b 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -82,7 +82,7 @@ typedef struct STableMeta { typedef struct SDBVgroupInfo { SRWLatch lock; - int64_t dbId; + uint64_t dbId; int32_t vgVersion; int8_t hashMethod; SHashObj *vgInfo; //key:vgId, value:SVgroupInfo diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index 2197fdfd62..d052e04552 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -737,7 +737,7 @@ int32_t ctgGetDBVgroup(struct SCatalog* pCatalog, void *pRpc, const SEpSet* pMgm } -int32_t ctgValidateAndRemoveDb(struct SCatalog* pCatalog, const char* dbName, SDBVgroupInfo* dbInfo) { +int32_t ctgValidateAndFreeDbInfo(struct SCatalog* pCatalog, const char* dbName, SDBVgroupInfo* dbInfo) { SDBVgroupInfo *oldInfo = (SDBVgroupInfo *)taosHashAcquire(pCatalog->dbCache.cache, dbName, strlen(dbName)); if (oldInfo) { CTG_LOCK(CTG_WRITE, &oldInfo->lock); @@ -763,6 +763,48 @@ int32_t ctgValidateAndRemoveDb(struct SCatalog* pCatalog, const char* dbName, SD return TSDB_CODE_SUCCESS; } +int32_t ctgValidateAndRemoveDbInfo(struct SCatalog* pCatalog, SDbVgVersion* target) { + SDBVgroupInfo *info = (SDBVgroupInfo *)taosHashAcquire(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName)); + if (info) { + CTG_LOCK(CTG_WRITE, &info->lock); + if (info->dbId != target->dbId) { + ctgInfo("db id already updated, db:%s, dbId:%"PRIx64 ", targetId:%"PRIx64, target->dbName, info->dbId, target->dbId); + CTG_UNLOCK(CTG_WRITE, &info->lock); + taosHashRelease(pCatalog->dbCache.cache, info); + + return TSDB_CODE_SUCCESS; + } + + if (info->vgVersion > target->vgVersion) { + ctgInfo("db vgVersion already updated, db:%s, version:%d, targetVer:%d", target->dbName, info->vgVersion, target->vgVersion); + CTG_UNLOCK(CTG_WRITE, &info->lock); + taosHashRelease(pCatalog->dbCache.cache, info); + + return TSDB_CODE_SUCCESS; + } + + if (info->vgInfo) { + ctgInfo("cleanup db vgInfo, db:%s", target->dbName); + taosHashCleanup(info->vgInfo); + info->vgInfo = NULL; + } + + if (taosHashRemove(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName))) { + ctgError("taosHashRemove from dbCache failed, db:%s", target->dbName); + CTG_UNLOCK(CTG_WRITE, &info->lock); + taosHashRelease(pCatalog->dbCache.cache, info); + CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR); + } + + CTG_UNLOCK(CTG_WRITE, &info->lock); + + taosHashRelease(pCatalog->dbCache.cache, info); + } + + return TSDB_CODE_SUCCESS; +} + + int32_t ctgRenewTableMetaImpl(struct SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, int32_t isSTable) { if (NULL == pCatalog || NULL == pTransporter || NULL == pMgmtEps || NULL == pTableName) { CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT); @@ -1134,19 +1176,6 @@ int32_t catalogUpdateDBVgroup(struct SCatalog* pCatalog, const char* dbName, SDB CTG_ERR_JRET(TSDB_CODE_CTG_MEM_ERROR); } - if (dbInfo->vgVersion < 0) { - ctgWarn("db vgVersion less than 0, dbName:%s, vgVersion:%d", dbName, dbInfo->vgVersion); - - if (pCatalog->dbCache.cache) { - CTG_ERR_JRET(ctgValidateAndRemoveDb(pCatalog, dbName, dbInfo)); - - CTG_ERR_JRET(taosHashRemove(pCatalog->dbCache.cache, dbName, strlen(dbName))); - } - - ctgWarn("db removed from cache, db:%s", dbName); - goto _return; - } - if (NULL == pCatalog->dbCache.cache) { SHashObj *cache = taosHashInit(ctgMgmt.cfg.maxDBCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); if (NULL == cache) { @@ -1158,7 +1187,7 @@ int32_t catalogUpdateDBVgroup(struct SCatalog* pCatalog, const char* dbName, SDB taosHashCleanup(cache); } } else { - CTG_ERR_JRET(ctgValidateAndRemoveDb(pCatalog, dbName, dbInfo)); + CTG_ERR_JRET(ctgValidateAndFreeDbInfo(pCatalog, dbName, dbInfo)); } bool newAdded = false; @@ -1189,6 +1218,51 @@ _return: CTG_RET(code); } + +int32_t catalogRemoveDBVgroup(struct SCatalog* pCatalog, SDbVgVersion* dbInfo) { + int32_t code = 0; + + if (NULL == pCatalog || NULL == dbInfo) { + CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT); + } + + if (pCatalog->dbCache.cache) { + CTG_ERR_JRET(ctgValidateAndRemoveDbInfo(pCatalog, dbInfo)); + + CTG_ERR_JRET(taosHashRemove(pCatalog->dbCache.cache, dbName, strlen(dbName))); + } + + ctgWarn("db removed from cache, db:%s", dbName); + + bool newAdded = false; + if (taosHashPutExt(pCatalog->dbCache.cache, dbName, strlen(dbName), dbInfo, sizeof(*dbInfo), &newAdded) != 0) { + ctgError("taosHashPutExt db vgroup to cache failed, db:%s", dbName); + CTG_ERR_JRET(TSDB_CODE_CTG_MEM_ERROR); + } + + dbInfo->vgInfo = NULL; + + SDbVgVersion vgVersion = {.dbId = dbInfo->dbId, .vgVersion = dbInfo->vgVersion}; + if (newAdded) { + CTG_ERR_JRET(ctgMetaRentAdd(&pCatalog->dbRent, &vgVersion, dbInfo->dbId, sizeof(SDbVgVersion))); + } else { + CTG_ERR_JRET(ctgMetaRentUpdate(&pCatalog->dbRent, &vgVersion, dbInfo->dbId, sizeof(SDbVgVersion), ctgDbVgVersionCompare)); + } + + ctgDebug("dbName:%s vgroup updated, vgVersion:%d", dbName, dbInfo->vgVersion); + + +_return: + + if (dbInfo && dbInfo->vgInfo) { + taosHashCleanup(dbInfo->vgInfo); + dbInfo->vgInfo = NULL; + } + + CTG_RET(code); +} + + int32_t catalogGetTableMeta(struct SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, STableMeta** pTableMeta) { return ctgGetTableMeta(pCatalog, pTransporter, pMgmtEps, pTableName, false, pTableMeta, -1); } diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp index a01c3bcf5d..35272c0dce 100644 --- a/source/libs/catalog/test/catalogTests.cpp +++ b/source/libs/catalog/test/catalogTests.cpp @@ -59,7 +59,7 @@ int32_t ctgTestTagNum = 1; int32_t ctgTestSVersion = 1; int32_t ctgTestTVersion = 1; int32_t ctgTestSuid = 2; -int64_t ctgTestDbId = 33; +uint64_t ctgTestDbId = 33; uint64_t ctgTestClusterId = 0x1; char *ctgTestDbname = "1.db1"; From 03a366fa40325206bd31552dca901517e6252d55 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Tue, 25 Jan 2022 18:29:26 +0800 Subject: [PATCH 06/37] hb process --- include/common/tmsg.h | 18 +- include/libs/qcom/query.h | 4 +- source/client/inc/clientInt.h | 16 +- source/client/src/clientHb.c | 203 ++++++++++++++++++++--- source/client/src/clientImpl.c | 2 +- source/client/src/clientMsgHandler.c | 3 +- source/common/src/tmsg.c | 30 ++-- source/dnode/mnode/impl/src/mndDb.c | 141 ++++++++++++---- source/dnode/mnode/impl/src/mndProfile.c | 47 ++++++ source/libs/catalog/inc/catalogInt.h | 2 +- source/libs/catalog/src/catalog.c | 167 +++++++++++-------- 11 files changed, 479 insertions(+), 154 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 75e8195215..97ba56bd76 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -76,6 +76,12 @@ typedef enum { HEARTBEAT_TYPE_MAX } EHbType; +typedef enum { + HEARTBEAT_KEY_DBINFO = 1, + HEARTBEAT_KEY_STBINFO, +}; + + typedef enum _mgmt_table { TSDB_MGMT_TABLE_START, TSDB_MGMT_TABLE_ACCT, @@ -1335,9 +1341,8 @@ static FORCE_INLINE void* taosDecodeSMqHbBatchRsp(void* buf, SMqHbBatchRsp* pBat } typedef struct { - int32_t keyLen; + int32_t key; int32_t valueLen; - void* key; void* value; } SKv; @@ -1359,8 +1364,7 @@ typedef struct { typedef struct { SClientHbKey connKey; int32_t status; - int32_t bodyLen; - void* body; + SArray* info; // Array } SClientHbRsp; typedef struct { @@ -1402,17 +1406,15 @@ void* tDeserializeSClientHbBatchRsp(void* buf, SClientHbBatchRsp* pBatchRsp); static FORCE_INLINE int taosEncodeSKv(void** buf, const SKv* pKv) { int tlen = 0; - tlen += taosEncodeFixedI32(buf, pKv->keyLen); + tlen += taosEncodeFixedI32(buf, pKv->key); tlen += taosEncodeFixedI32(buf, pKv->valueLen); - tlen += taosEncodeBinary(buf, pKv->key, pKv->keyLen); tlen += taosEncodeBinary(buf, pKv->value, pKv->valueLen); return tlen; } static FORCE_INLINE void* taosDecodeSKv(void* buf, SKv* pKv) { - buf = taosDecodeFixedI32(buf, &pKv->keyLen); + buf = taosDecodeFixedI32(buf, &pKv->key); buf = taosDecodeFixedI32(buf, &pKv->valueLen); - buf = taosDecodeBinary(buf, &pKv->key, pKv->keyLen); buf = taosDecodeBinary(buf, &pKv->value, pKv->valueLen); return buf; } diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index 53ef6f4f9b..6498abb7fc 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -94,7 +94,7 @@ typedef struct SUseDbOutput { } SUseDbOutput; enum { - META_TYPE_NON_TABLE = 1, + META_TYPE_NULL_TABLE = 1, META_TYPE_CTABLE, META_TYPE_TABLE, META_TYPE_BOTH_TABLE @@ -174,7 +174,7 @@ extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char **msg, int32_t msgSi extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char *msg, int32_t msgSize); -#define SET_META_TYPE_NONE(t) (t) = META_TYPE_NON_TABLE +#define SET_META_TYPE_NULL(t) (t) = META_TYPE_NULL_TABLE #define SET_META_TYPE_CTABLE(t) (t) = META_TYPE_CTABLE #define SET_META_TYPE_TABLE(t) (t) = META_TYPE_TABLE #define SET_META_TYPE_BOTH_TABLE(t) (t) = META_TYPE_BOTH_TABLE diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index c61f3da6bd..a25d79bf30 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -37,7 +37,15 @@ typedef struct SAppInstInfo SAppInstInfo; typedef int32_t (*FHbRspHandle)(SClientHbRsp* pReq); +typedef int32_t (*FHbReqHandle)(SClientHbKey *connKey, void* param, SClientHbReq *req); + +typedef struct SHbConnInfo { + void *param; + SClientHbReq *req; +} SHbConnInfo; + typedef struct SAppHbMgr { + char *key; // statistics int32_t reportCnt; int32_t connKeyCnt; @@ -49,7 +57,7 @@ typedef struct SAppHbMgr { SAppInstInfo* pAppInstInfo; // info SHashObj* activeInfo; // hash - SHashObj* getInfoFuncs; // hash + SHashObj* connInfo; // hash } SAppHbMgr; typedef struct SClientHbMgr { @@ -59,12 +67,10 @@ typedef struct SClientHbMgr { pthread_t thread; pthread_mutex_t lock; // used when app init and cleanup SArray* appHbMgrs; // SArray one for each cluster - FHbRspHandle handle[HEARTBEAT_TYPE_MAX]; + FHbReqHandle reqHandle[HEARTBEAT_TYPE_MAX]; + FHbRspHandle rspHandle[HEARTBEAT_TYPE_MAX]; } SClientHbMgr; -// TODO: embed param into function -// return type: SArray -typedef SArray* (*FGetConnInfo)(SClientHbKey connKey, void* param); typedef struct SQueryExecMetric { int64_t start; // start timestamp diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index 0f4ff6f725..8fc9fd086c 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -21,27 +21,136 @@ static SClientHbMgr clientHbMgr = {0}; static int32_t hbCreateThread(); static void hbStopThread(); -static int32_t hbMqHbRspHandle(SClientHbRsp* pRsp) { +static int32_t hbMqHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRsp) { return 0; } +static int32_t hbQueryHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRsp) { + SHbConnInfo * info = taosHashGet(pAppHbMgr->connInfo, &pRsp->connKey, sizeof(SClientHbKey)); + if (NULL == info) { + tscWarn("fail to get connInfo, may be dropped, connId:%d, type:%d", pRsp->connKey.connId, pRsp->connKey.hbType); + return TSDB_CODE_SUCCESS; + } + + int32_t kvNum = pRsp->info ? taosArrayGetSize(pRsp->info) : 0; + for (int32_t i = 0; i < kvNum; ++i) { + SKv *kv = taosArrayGet(pRsp->info, i); + switch (kv->key) { + case HEARTBEAT_KEY_DBINFO: + + break; + case HEARTBEAT_KEY_STBINFO: + + break; + default: + tscError("invalid hb key type:%d", kv->key); + break; + } + } + + return TSDB_CODE_SUCCESS; +} + static int32_t hbMqAsyncCallBack(void* param, const SDataBuf* pMsg, int32_t code) { if (code != 0) { return -1; } - SClientHbRsp* pRsp = (SClientHbRsp*) pMsg->pData; - return hbMqHbRspHandle(pRsp); + char *key = (char *)param; + SClientHbBatchRsp* pRsp = (SClientHbBatchRsp*) pMsg->pData; + int32_t reqNum = taosArrayGetSize(pRsp->rsps); + + SAppInstInfo** pInst = taosHashGet(appInfo.pInstMap, key, strlen(key)); + if (pInst == NULL || NULL == *pInst) { + tscError("cluster not exist, key:%s", key); + return -1; + } + + for (int32_t i = 0; i < reqNum; ++i) { + SClientHbRsp* rsp = taosArrayGet(pRsp->rsps, i); + code = (*clientHbMgr.rspHandle[rsp->connKey.hbType])((*pInst)->pAppHbMgr, rsp); + if (code) { + break; + } + } + + return code; } -void hbMgrInitMqHbRspHandle() { - clientHbMgr.handle[HEARTBEAT_TYPE_MQ] = hbMqHbRspHandle; +int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SClientHbReq *req) { + SDbVgVersion *dbs = NULL; + uint32_t dbNum = 0; + int32_t code = 0; + + code = catalogGetExpiredDBs(pCatalog, &dbs, &dbNum); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + + for (int32_t i = 0; i < dbNum; ++i) { + SDbVgVersion *db = &dbs[i]; + db->dbId = htobe64(db->dbId); + db->vgVersion = htonl(db->vgVersion); + } + + SKv kv = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = sizeof(SDbVgVersion) * dbNum, .value = dbs}; + taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + + return TSDB_CODE_SUCCESS; +} + +int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void* param, SClientHbReq *req) { + int64_t *clusterId = (int64_t *)param; + struct SCatalog *pCatalog = NULL; + + int32_t code = catalogGetHandle(*clusterId, &pCatalog); + if (code != TSDB_CODE_SUCCESS) { + tscWarn("catalogGetHandle failed, clusterId:%"PRIx64", error:%s", *clusterId, tstrerror(code)); + return code; + } + + code = hbGetExpiredDBInfo(connKey, pCatalog, req); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + + + return TSDB_CODE_SUCCESS; +} + +int32_t hbMqHbReqHandle(SClientHbKey *connKey, void* param, SClientHbReq *req) { + +} + +void hbMgrInitMqHbHandle() { + clientHbMgr.reqHandle[HEARTBEAT_TYPE_QUERY] = hbQueryHbReqHandle; + clientHbMgr.reqHandle[HEARTBEAT_TYPE_MQ] = hbMqHbReqHandle; + clientHbMgr.rspHandle[HEARTBEAT_TYPE_QUERY] = hbQueryHbRspHandle; + clientHbMgr.rspHandle[HEARTBEAT_TYPE_MQ] = hbMqHbRspHandle; } static FORCE_INLINE void hbMgrInitHandle() { // init all handle - hbMgrInitMqHbRspHandle(); + hbMgrInitMqHbHandle(); } + +void hbFreeReqKvHash(SHashObj* info) { + void *pIter = taosHashIterate(info, NULL); + while (pIter != NULL) { + SKv* kv = pIter; + + tfree(kv->value); + + pIter = taosHashIterate(info, pIter); + } +} + +void hbFreeReq(SClientHbReq *req) { + hbFreeReqKvHash(req->info); +} + + + SClientHbBatchReq* hbGatherAllInfo(SAppHbMgr *pAppHbMgr) { SClientHbBatchReq* pBatchReq = malloc(sizeof(SClientHbBatchReq)); if (pBatchReq == NULL) { @@ -51,30 +160,48 @@ SClientHbBatchReq* hbGatherAllInfo(SAppHbMgr *pAppHbMgr) { int32_t connKeyCnt = atomic_load_32(&pAppHbMgr->connKeyCnt); pBatchReq->reqs = taosArrayInit(connKeyCnt, sizeof(SClientHbReq)); + int32_t code = 0; void *pIter = taosHashIterate(pAppHbMgr->activeInfo, NULL); while (pIter != NULL) { SClientHbReq* pOneReq = pIter; + + SHbConnInfo * info = taosHashGet(pAppHbMgr->connInfo, &pOneReq->connKey, sizeof(SClientHbKey)); + if (info) { + code = (*clientHbMgr.reqHandle[pOneReq->connKey.hbType])(&pOneReq->connKey, info->param, pOneReq); + if (code) { + taosHashCancelIterate(pAppHbMgr->activeInfo, pIter); + break; + } + } + taosArrayPush(pBatchReq->reqs, pOneReq); - taosHashClear(pOneReq->info); pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter); } -#if 0 - pIter = taosHashIterate(pAppHbMgr->getInfoFuncs, NULL); - while (pIter != NULL) { - FGetConnInfo getConnInfoFp = (FGetConnInfo)pIter; - SClientHbKey connKey; - taosHashCopyKey(pIter, &connKey); - SArray* pArray = getConnInfoFp(connKey, NULL); - - pIter = taosHashIterate(pAppHbMgr->getInfoFuncs, pIter); + if (code) { + taosArrayDestroyEx(pBatchReq->reqs, hbFreeReq); + tfree(pBatchReq); } -#endif return pBatchReq; } + +void hbClearReqInfo(SAppHbMgr *pAppHbMgr) { + void *pIter = taosHashIterate(pAppHbMgr->activeInfo, NULL); + while (pIter != NULL) { + SClientHbReq* pOneReq = pIter; + + hbFreeReqKvHash(pOneReq->info); + taosHashClear(pOneReq->info); + + pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter); + } +} + + + static void* hbThreadFunc(void* param) { setThreadName("hb"); while (1) { @@ -98,7 +225,9 @@ static void* hbThreadFunc(void* param) { int tlen = tSerializeSClientHbBatchReq(NULL, pReq); void *buf = malloc(tlen); if (buf == NULL) { - //TODO: error handling + terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; + tFreeClientHbBatchReq(pReq, false); + hbClearReqInfo(pAppHbMgr); break; } void *abuf = buf; @@ -107,6 +236,7 @@ static void* hbThreadFunc(void* param) { if (pInfo == NULL) { terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; tFreeClientHbBatchReq(pReq, false); + hbClearReqInfo(pAppHbMgr); free(buf); break; } @@ -114,7 +244,7 @@ static void* hbThreadFunc(void* param) { pInfo->msgInfo.pData = buf; pInfo->msgInfo.len = tlen; pInfo->msgType = TDMT_MND_HEARTBEAT; - pInfo->param = NULL; + pInfo->param = strdup(pAppHbMgr->key); pInfo->requestId = generateRequestId(); pInfo->requestObjRefId = 0; @@ -148,7 +278,7 @@ static void hbStopThread() { atomic_store_8(&clientHbMgr.threadStop, 1); } -SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo) { +SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo, char *key) { hbMgrInit(); SAppHbMgr* pAppHbMgr = malloc(sizeof(SAppHbMgr)); if (pAppHbMgr == NULL) { @@ -160,6 +290,7 @@ SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo) { pAppHbMgr->connKeyCnt = 0; pAppHbMgr->reportCnt = 0; pAppHbMgr->reportBytes = 0; + pAppHbMgr->key = strdup(key); // init app info pAppHbMgr->pAppInstInfo = pAppInstInfo; @@ -243,7 +374,7 @@ int hbHandleRsp(SClientHbBatchRsp* hbRsp) { return 0; } -int hbRegisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, FGetConnInfo func) { +int hbRegisterConnImpl(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, SHbConnInfo *info) { // init hash in activeinfo void* data = taosHashGet(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); if (data != NULL) { @@ -252,16 +383,42 @@ int hbRegisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, FGetConnInfo func SClientHbReq hbReq; hbReq.connKey = connKey; hbReq.info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + taosHashPut(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey), &hbReq, sizeof(SClientHbReq)); + // init hash - if (func != NULL) { - taosHashPut(pAppHbMgr->getInfoFuncs, &connKey, sizeof(SClientHbKey), func, sizeof(FGetConnInfo)); + if (info != NULL) { + SClientHbReq * pReq = taosHashGet(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); + info->req = pReq; + taosHashPut(pAppHbMgr->connInfo, &connKey, sizeof(SClientHbKey), info, sizeof(SHbConnInfo)); } atomic_add_fetch_32(&pAppHbMgr->connKeyCnt, 1); return 0; } +int hbRegisterConn(SAppHbMgr* pAppHbMgr, int32_t connId, int64_t clusterId, int32_t hbType) { + SClientHbKey connKey = {.connId = connId, .hbType = HEARTBEAT_TYPE_QUERY}; + SHbConnInfo info = {0}; + + switch (hbType) { + case HEARTBEAT_TYPE_QUERY: { + int64_t *pClusterId = malloc(sizeof(int64_t)); + *pClusterId = clusterId; + + info.param = pClusterId; + break; + } + case HEARTBEAT_TYPE_MQ: { + break; + } + default: + break; + } + + return hbRegisterConnImpl(pAppHbMgr, connKey, &info); +} + void hbDeregisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey) { taosHashRemove(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); taosHashRemove(pAppHbMgr->getInfoFuncs, &connKey, sizeof(SClientHbKey)); diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 6014042e11..a39a0d637b 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -119,7 +119,7 @@ TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, SAppInstInfo* p = calloc(1, sizeof(struct SAppInstInfo)); p->mgmtEp = epSet; p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores); - p->pAppHbMgr = appHbMgrInit(p); + p->pAppHbMgr = appHbMgrInit(p, key); taosHashPut(appInfo.pInstMap, key, strlen(key), &p, POINTER_BYTES); pInst = &p; diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index ec088eb073..831006ac89 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -71,8 +71,7 @@ int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) { pTscObj->pAppInfo->clusterId = pConnect->clusterId; atomic_add_fetch_64(&pTscObj->pAppInfo->numOfConns, 1); - SClientHbKey connKey = {.connId = pConnect->connId, .hbType = HEARTBEAT_TYPE_QUERY}; - hbRegisterConn(pTscObj->pAppInfo->pAppHbMgr, connKey, NULL); + hbRegisterConn(pTscObj->pAppInfo->pAppHbMgr, pConnect->connId, pConnect->clusterId, HEARTBEAT_TYPE_QUERY); // pRequest->body.resInfo.pRspMsg = pMsg->pData; tscDebug("0x%" PRIx64 " clusterId:%" PRId64 ", totalConn:%" PRId64, pRequest->requestId, pConnect->clusterId, diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 48e9dce3c1..1e9131c800 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -91,13 +91,11 @@ int tSerializeSClientHbReq(void **buf, const SClientHbReq *pReq) { int32_t kvNum = taosHashGetSize(pReq->info); tlen += taosEncodeFixedI32(buf, kvNum); - SKv kv; + SKv *kv; void* pIter = taosHashIterate(pReq->info, NULL); while (pIter != NULL) { - taosHashGetKey(pIter, &kv.key, (size_t *)&kv.keyLen); - kv.valueLen = taosHashGetDataLen(pIter); - kv.value = pIter; - tlen += taosEncodeSKv(buf, &kv); + kv = pIter; + tlen += taosEncodeSKv(buf, kv); pIter = taosHashIterate(pReq->info, pIter); } @@ -116,7 +114,7 @@ void *tDeserializeSClientHbReq(void *buf, SClientHbReq *pReq) { for(int i = 0; i < kvNum; i++) { SKv kv; buf = taosDecodeSKv(buf, &kv); - taosHashPut(pReq->info, kv.key, kv.keyLen, kv.value, kv.valueLen); + taosHashPut(pReq->info, kv.key, sizeof(kv.key), kv.value, kv.valueLen); } return buf; @@ -124,17 +122,28 @@ void *tDeserializeSClientHbReq(void *buf, SClientHbReq *pReq) { int tSerializeSClientHbRsp(void** buf, const SClientHbRsp* pRsp) { int tlen = 0; + int32_t kvNum = taosArrayGetSize(pRsp->info); tlen += taosEncodeSClientHbKey(buf, &pRsp->connKey); tlen += taosEncodeFixedI32(buf, pRsp->status); - tlen += taosEncodeFixedI32(buf, pRsp->bodyLen); - tlen += taosEncodeBinary(buf, pRsp->body, pRsp->bodyLen); + tlen += taosEncodeFixedI32(buf, kvNum); + for (int i = 0; i < kvNum; i++) { + SKv *kv = (SKv *)taosArrayGet(pRsp->info, i); + tlen += taosEncodeSKv(buf, kv); + } return tlen; } void* tDeserializeSClientHbRsp(void* buf, SClientHbRsp* pRsp) { + int32_t kvNum = 0; buf = taosDecodeSClientHbKey(buf, &pRsp->connKey); buf = taosDecodeFixedI32(buf, &pRsp->status); - buf = taosDecodeFixedI32(buf, &pRsp->bodyLen); - buf = taosDecodeBinary(buf, &pRsp->body, pRsp->bodyLen); + buf = taosDecodeFixedI32(buf, &kvNum); + pRsp->info = taosArrayInit(kvNum, sizeof(SKv)); + for (int i = 0; i < kvNum; i++) { + SKv kv = {0}; + buf = taosDecodeSKv(buf, &kv); + taosArrayPush(pRsp->info, &kv); + } + return buf; } @@ -155,6 +164,7 @@ void* tDeserializeSClientHbBatchReq(void* buf, SClientHbBatchReq* pBatchReq) { if (pBatchReq->reqs == NULL) { pBatchReq->reqs = taosArrayInit(0, sizeof(SClientHbReq)); } + int32_t reqNum; buf = taosDecodeFixedI32(buf, &reqNum); for (int i = 0; i < reqNum; i++) { diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 39be41a4e5..5917093c7b 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -805,6 +805,44 @@ static int32_t mndProcessDropDbReq(SMnodeMsg *pReq) { return TSDB_CODE_MND_ACTION_IN_PROGRESS; } +static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SVgroupInfo *vgList, int32_t *vgNum) { + int32_t vindex = 0; + SSdb *pSdb = pMnode->pSdb; + + void *pIter = NULL; + while (vindex < pDb->cfg.numOfVgroups) { + SVgObj *pVgroup = NULL; + pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup); + if (pIter == NULL) break; + + if (pVgroup->dbUid == pDb->uid) { + SVgroupInfo *pInfo = &vgList[vindex]; + pInfo->vgId = htonl(pVgroup->vgId); + pInfo->hashBegin = htonl(pVgroup->hashBegin); + pInfo->hashEnd = htonl(pVgroup->hashEnd); + pInfo->numOfEps = pVgroup->replica; + for (int32_t gid = 0; gid < pVgroup->replica; ++gid) { + SVnodeGid *pVgid = &pVgroup->vnodeGid[gid]; + SEpAddr *pEpArrr = &pInfo->epAddr[gid]; + SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId); + if (pDnode != NULL) { + memcpy(pEpArrr->fqdn, pDnode->fqdn, TSDB_FQDN_LEN); + pEpArrr->port = htons(pDnode->port); + } + mndReleaseDnode(pMnode, pDnode); + if (pVgid->role == TAOS_SYNC_STATE_LEADER) { + pInfo->inUse = gid; + } + } + vindex++; + } + + sdbRelease(pSdb, pVgroup); + } + + *vgNum = vindex; +} + static int32_t mndProcessUseDbReq(SMnodeMsg *pReq) { SMnode *pMnode = pReq->pMnode; SSdb *pSdb = pMnode->pSdb; @@ -826,45 +864,16 @@ static int32_t mndProcessUseDbReq(SMnodeMsg *pReq) { return -1; } - int32_t vindex = 0; + int32_t vgNum = 0; if (pUse->vgVersion < pDb->vgVersion) { - void *pIter = NULL; - while (vindex < pDb->cfg.numOfVgroups) { - SVgObj *pVgroup = NULL; - pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup); - if (pIter == NULL) break; - - if (pVgroup->dbUid == pDb->uid) { - SVgroupInfo *pInfo = &pRsp->vgroupInfo[vindex]; - pInfo->vgId = htonl(pVgroup->vgId); - pInfo->hashBegin = htonl(pVgroup->hashBegin); - pInfo->hashEnd = htonl(pVgroup->hashEnd); - pInfo->numOfEps = pVgroup->replica; - for (int32_t gid = 0; gid < pVgroup->replica; ++gid) { - SVnodeGid *pVgid = &pVgroup->vnodeGid[gid]; - SEpAddr *pEpArrr = &pInfo->epAddr[gid]; - SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId); - if (pDnode != NULL) { - memcpy(pEpArrr->fqdn, pDnode->fqdn, TSDB_FQDN_LEN); - pEpArrr->port = htons(pDnode->port); - } - mndReleaseDnode(pMnode, pDnode); - if (pVgid->role == TAOS_SYNC_STATE_LEADER) { - pInfo->inUse = gid; - } - } - vindex++; - } - - sdbRelease(pSdb, pVgroup); - } + mndBuildDBVgroupInfo(pDb, pMnode, pRsp->vgroupInfo, &vgNum); } memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN); pRsp->uid = htobe64(pDb->uid); pRsp->vgVersion = htonl(pDb->vgVersion); - pRsp->vgNum = htonl(vindex); + pRsp->vgNum = htonl(vgNum); pRsp->hashMethod = pDb->hashMethod; pReq->pCont = pRsp; @@ -874,6 +883,72 @@ static int32_t mndProcessUseDbReq(SMnodeMsg *pReq) { return 0; } +int32_t mndValidateDBInfo(SMnode *pMnode, SDbVgVersion *dbs, int32_t num, void **rsp, int32_t *rspLen) { + SSdb *pSdb = pMnode->pSdb; + int32_t bufSize = num * (sizeof(SUseDbRsp) + TSDB_DEFAULT_VN_PER_DB * sizeof(SVgroupInfo)); + void *buf = malloc(bufSize); + int32_t len = 0; + int32_t contLen = 0; + int32_t bufOffset = 0; + SUseDbRsp *pRsp = NULL; + + for (int32_t i = 0; i < num; ++i) { + SDbVgVersion *db = &dbs[i]; + + len = 0; + + SDbObj *pDb = mndAcquireDb(pMnode, db->dbName); + if (pDb == NULL) { + mInfo("db %s not exist", db->dbName); + + len = sizeof(SUseDbRsp); + } else if (pDb->uid != db->dbId || db->vgVersion < pDb->vgVersion) { + len = sizeof(SUseDbRsp) + pDb->cfg.numOfVgroups * sizeof(SVgroupInfo); + } + + if (0 == len) { + mndReleaseDb(pMnode, pDb); + + continue; + } + + contLen += len; + + if (contLen > bufSize) { + buf = realloc(buf, contLen); + } + + pRsp = (SUseDbRsp *)((char *)buf + bufOffset); + memcpy(pRsp->db, db->dbName, TSDB_DB_FNAME_LEN); + if (pDb) { + int32_t vgNum = 0; + mndBuildDBVgroupInfo(pDb, pMnode, pRsp->vgroupInfo, &vgNum); + + pRsp->uid = htobe64(pDb->uid); + pRsp->vgVersion = htonl(pDb->vgVersion); + pRsp->vgNum = htonl(vgNum); + pRsp->hashMethod = pDb->hashMethod; + } else { + pRsp->vgVersion = htonl(-1); + } + + bufOffset += len; + + mndReleaseDb(pMnode, pDb); + } + + if (contLen > 0) { + *rsp = buf; + *rspLen = contLen; + } else { + *rsp = NULL; + tfree(buf); + *rspLen = 0; + } + + return 0; +} + static int32_t mndProcessSyncDbReq(SMnodeMsg *pReq) { SMnode *pMnode = pReq->pMnode; SSyncDbReq *pSync = pReq->rpcMsg.pCont; @@ -1166,4 +1241,4 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3 static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetch(pSdb, pIter); -} \ No newline at end of file +} diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index 76fabc96ce..8296cd2c6c 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -346,12 +346,46 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { int sz = taosArrayGetSize(pArray); SClientHbBatchRsp batchRsp = {0}; + batchRsp.key = batchReq.key; + batchRsp.keyLen = batchReq.keyLen; batchRsp.rsps = taosArrayInit(0, sizeof(SClientHbRsp)); for (int i = 0; i < sz; i++) { SClientHbReq* pHbReq = taosArrayGet(pArray, i); if (pHbReq->connKey.hbType == HEARTBEAT_TYPE_QUERY) { + int32_t kvNum = taosHashGetSize(pHbReq->info); + if (NULL == pHbReq->info || kvNum <= 0) { + continue; + } + SClientHbRsp hbRsp = {.connKey = pHbReq->connKey, .status = 0, .info = taosArrayInit(kvNum, sizeof(SKv))}; + + void *pIter = taosHashIterate(pHbReq->info, NULL); + while (pIter != NULL) { + SKv* kv = pIter; + + switch (kv->key) { + case HEARTBEAT_KEY_DBINFO: + void *rspMsg = NULL; + int32_t rspLen = 0; + mndValidateDBInfo(pMnode, (SDbVgVersion *)kv->value, kv->valueLen/sizeof(SDbVgVersion), &rspMsg, &rspLen); + if (rspMsg && rspLen > 0) { + SKv kv = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = rspLen, .value = rspMsg}; + taosArrayPush(hbRsp->info, &kv); + + taosArrayPush(batchRsp.rsps, &hbRsp); + } + break; + case HEARTBEAT_KEY_STBINFO: + + break; + default: + mError("invalid kv key:%d", kv->key); + break; + } + + pIter = taosHashIterate(pHbReq->info, pIter); + } } else if (pHbReq->connKey.hbType == HEARTBEAT_TYPE_MQ) { SClientHbRsp *pRsp = mndMqHbBuildRsp(pMnode, pHbReq); if (pRsp != NULL) { @@ -366,6 +400,19 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { void* buf = rpcMallocCont(tlen); void* abuf = buf; tSerializeSClientHbBatchRsp(&abuf, &batchRsp); + + int32_t rspNum = (int32_t)taosArrayGetSize(batchRsp.rsps); + for (int32_t i = 0; i < rspNum; ++i) { + SClientHbRsp *rsp = taosArrayGet(batchRsp.rsps, i); + int32_t kvNum = (rsp->info) ? taosArrayGetSize(rsp->info): 0; + for (int32_t n = 0; n < kvNum; ++n) { + SKv *kv = taosArrayGet(rsp->info, n); + tfree(kv->value); + } + taosArrayDestroy(rsp->info); + } + + tfree(batchRsp.key); taosArrayDestroy(batchRsp.rsps); pReq->contLen = tlen; pReq->pCont = buf; diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 9f1ea754c2..a96b12f597 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -115,7 +115,7 @@ typedef struct SCatalogMgmt { typedef uint32_t (*tableNameHashFp)(const char *, uint32_t); -#define CTG_IS_META_NONE(type) ((type) == META_TYPE_NON_TABLE) +#define CTG_IS_META_NULL(type) ((type) == META_TYPE_NULL_TABLE) #define CTG_IS_META_CTABLE(type) ((type) == META_TYPE_CTABLE) #define CTG_IS_META_TABLE(type) ((type) == META_TYPE_TABLE) #define CTG_IS_META_BOTH(type) ((type) == META_TYPE_BOTH_TABLE) diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index d052e04552..3ce71ccb44 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -253,7 +253,7 @@ int32_t ctgGetTableMetaFromMnodeImpl(struct SCatalog* pCatalog, void *pTransport if (TSDB_CODE_SUCCESS != rpcRsp.code) { if (CTG_TABLE_NOT_EXIST(rpcRsp.code)) { - SET_META_TYPE_NONE(output->metaType); + SET_META_TYPE_NULL(output->metaType); ctgDebug("stablemeta not exist in mnode, tbName:%s", tbFullName); return TSDB_CODE_SUCCESS; } @@ -315,7 +315,7 @@ int32_t ctgGetTableMetaFromVnode(struct SCatalog* pCatalog, void *pTransporter, if (TSDB_CODE_SUCCESS != rpcRsp.code) { if (CTG_TABLE_NOT_EXIST(rpcRsp.code)) { - SET_META_TYPE_NONE(output->metaType); + SET_META_TYPE_NULL(output->metaType); ctgDebug("tablemeta not exist in vnode, tbName:%s", tNameGetTableName(pTableName)); return TSDB_CODE_SUCCESS; } @@ -510,14 +510,14 @@ int32_t ctgMetaRentUpdate(SMetaRentMgmt *mgmt, void *meta, int64_t id, int32_t s CTG_LOCK(CTG_WRITE, &slot->lock); if (NULL == slot->meta) { - qError("meta in slot is empty, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type); - CTG_ERR_JRET(TSDB_CODE_CTG_MEM_ERROR); + qError("empty meta slot, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type); + CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR); } if (slot->needSort) { taosArraySort(slot->meta, compare); slot->needSort = false; - qDebug("slot meta sorted, slot idx:%d, type:%d", widx, mgmt->type); + qDebug("meta slot sorted, slot idx:%d, type:%d", widx, mgmt->type); } void *orig = taosArraySearch(slot->meta, &id, compare, TD_EQ); @@ -542,6 +542,42 @@ _return: CTG_RET(code); } +int32_t ctgMetaRentRemove(SMetaRentMgmt *mgmt, int64_t id, __compar_fn_t compare) { + int16_t widx = abs(id % mgmt->slotNum); + + SRentSlotInfo *slot = &mgmt->slots[widx]; + int32_t code = 0; + + CTG_LOCK(CTG_WRITE, &slot->lock); + if (NULL == slot->meta) { + qError("empty meta slot, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type); + CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR); + } + + if (slot->needSort) { + taosArraySort(slot->meta, compare); + slot->needSort = false; + qDebug("meta slot sorted, slot idx:%d, type:%d", widx, mgmt->type); + } + + int32_t idx = taosArraySearchIdx(slot->meta, &id, compare, TD_EQ); + if (idx < 0) { + qError("meta not found in slot, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type); + CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR); + } + + taosArrayRemove(slot->meta, idx); + + qDebug("meta in rent removed, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type); + +_return: + + CTG_UNLOCK(CTG_WRITE, &slot->lock); + + CTG_RET(code); +} + + int32_t ctgMetaRentGetImpl(SMetaRentMgmt *mgmt, void **res, uint32_t *num, int32_t size) { int16_t ridx = atomic_add_fetch_16(&mgmt->slotRIdx, 1); if (ridx >= mgmt->slotNum) { @@ -763,44 +799,49 @@ int32_t ctgValidateAndFreeDbInfo(struct SCatalog* pCatalog, const char* dbName, return TSDB_CODE_SUCCESS; } -int32_t ctgValidateAndRemoveDbInfo(struct SCatalog* pCatalog, SDbVgVersion* target) { - SDBVgroupInfo *info = (SDBVgroupInfo *)taosHashAcquire(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName)); - if (info) { - CTG_LOCK(CTG_WRITE, &info->lock); - if (info->dbId != target->dbId) { - ctgInfo("db id already updated, db:%s, dbId:%"PRIx64 ", targetId:%"PRIx64, target->dbName, info->dbId, target->dbId); - CTG_UNLOCK(CTG_WRITE, &info->lock); - taosHashRelease(pCatalog->dbCache.cache, info); - - return TSDB_CODE_SUCCESS; - } - - if (info->vgVersion > target->vgVersion) { - ctgInfo("db vgVersion already updated, db:%s, version:%d, targetVer:%d", target->dbName, info->vgVersion, target->vgVersion); - CTG_UNLOCK(CTG_WRITE, &info->lock); - taosHashRelease(pCatalog->dbCache.cache, info); - - return TSDB_CODE_SUCCESS; - } - - if (info->vgInfo) { - ctgInfo("cleanup db vgInfo, db:%s", target->dbName); - taosHashCleanup(info->vgInfo); - info->vgInfo = NULL; - } +int32_t ctgValidateAndRemoveDbInfo(struct SCatalog* pCatalog, SDbVgVersion* target, bool *removed) { + *removed = false; - if (taosHashRemove(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName))) { - ctgError("taosHashRemove from dbCache failed, db:%s", target->dbName); - CTG_UNLOCK(CTG_WRITE, &info->lock); - taosHashRelease(pCatalog->dbCache.cache, info); - CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR); - } - - CTG_UNLOCK(CTG_WRITE, &info->lock); + SDBVgroupInfo *info = (SDBVgroupInfo *)taosHashAcquire(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName)); + if (NULL == info) { + ctgInfo("db not exist in dbCache, may be removed, db:%s", target->dbName); + return TSDB_CODE_SUCCESS; + } + CTG_LOCK(CTG_WRITE, &info->lock); + if (info->dbId != target->dbId) { + ctgInfo("db id already updated, db:%s, dbId:%"PRIx64 ", targetId:%"PRIx64, target->dbName, info->dbId, target->dbId); + CTG_UNLOCK(CTG_WRITE, &info->lock); taosHashRelease(pCatalog->dbCache.cache, info); + return TSDB_CODE_SUCCESS; + } + + if (info->vgVersion > target->vgVersion) { + ctgInfo("db vgVersion already updated, db:%s, version:%d, targetVer:%d", target->dbName, info->vgVersion, target->vgVersion); + CTG_UNLOCK(CTG_WRITE, &info->lock); + taosHashRelease(pCatalog->dbCache.cache, info); + return TSDB_CODE_SUCCESS; + } + + if (info->vgInfo) { + ctgInfo("cleanup db vgInfo, db:%s", target->dbName); + taosHashCleanup(info->vgInfo); + info->vgInfo = NULL; } + if (taosHashRemove(pCatalog->dbCache.cache, target->dbName, strlen(target->dbName))) { + ctgError("taosHashRemove from dbCache failed, db:%s", target->dbName); + CTG_UNLOCK(CTG_WRITE, &info->lock); + taosHashRelease(pCatalog->dbCache.cache, info); + CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR); + } + + CTG_UNLOCK(CTG_WRITE, &info->lock); + + taosHashRelease(pCatalog->dbCache.cache, info); + + *removed = true; + return TSDB_CODE_SUCCESS; } @@ -825,7 +866,7 @@ int32_t ctgRenewTableMetaImpl(struct SCatalog* pCatalog, void *pTransporter, con // if get from mnode failed, will not try vnode CTG_ERR_JRET(ctgGetTableMetaFromMnode(pCatalog, pTransporter, pMgmtEps, pTableName, &moutput)); - if (CTG_IS_META_NONE(moutput.metaType)) { + if (CTG_IS_META_NULL(moutput.metaType)) { CTG_ERR_JRET(ctgGetTableMetaFromVnode(pCatalog, pTransporter, pMgmtEps, pTableName, &vgroupInfo, &voutput)); } else { output = &moutput; @@ -841,6 +882,8 @@ int32_t ctgRenewTableMetaImpl(struct SCatalog* pCatalog, void *pTransporter, con CTG_ERR_JRET(ctgGetTableMetaFromMnodeImpl(pCatalog, pTransporter, pMgmtEps, voutput.tbFname, &moutput)); + voutput.metaType = moutput.metaType; + tfree(voutput.tbMeta); voutput.tbMeta = moutput.tbMeta; moutput.tbMeta = NULL; @@ -850,20 +893,22 @@ int32_t ctgRenewTableMetaImpl(struct SCatalog* pCatalog, void *pTransporter, con if (0 == exist) { CTG_ERR_JRET(ctgGetTableMetaFromMnodeImpl(pCatalog, pTransporter, pMgmtEps, voutput.tbFname, &moutput)); - if (CTG_IS_META_NONE(moutput.metaType)) { - SET_META_TYPE_NONE(voutput.metaType); + if (CTG_IS_META_NULL(moutput.metaType)) { + SET_META_TYPE_NULL(voutput.metaType); } tfree(voutput.tbMeta); voutput.tbMeta = moutput.tbMeta; moutput.tbMeta = NULL; } else { + tfree(voutput.tbMeta); + SET_META_TYPE_CTABLE(voutput.metaType); } } } - if (CTG_IS_META_NONE(output->metaType)) { + if (CTG_IS_META_NULL(output->metaType)) { ctgError("no tablemeta got, tbNmae:%s", tNameGetTableName(pTableName)); CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST); } @@ -1221,43 +1266,26 @@ _return: int32_t catalogRemoveDBVgroup(struct SCatalog* pCatalog, SDbVgVersion* dbInfo) { int32_t code = 0; + bool removed = false; if (NULL == pCatalog || NULL == dbInfo) { CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT); } - if (pCatalog->dbCache.cache) { - CTG_ERR_JRET(ctgValidateAndRemoveDbInfo(pCatalog, dbInfo)); - - CTG_ERR_JRET(taosHashRemove(pCatalog->dbCache.cache, dbName, strlen(dbName))); + if (NULL == pCatalog->dbCache.cache) { + return TSDB_CODE_SUCCESS; } - ctgWarn("db removed from cache, db:%s", dbName); - - bool newAdded = false; - if (taosHashPutExt(pCatalog->dbCache.cache, dbName, strlen(dbName), dbInfo, sizeof(*dbInfo), &newAdded) != 0) { - ctgError("taosHashPutExt db vgroup to cache failed, db:%s", dbName); - CTG_ERR_JRET(TSDB_CODE_CTG_MEM_ERROR); - } - - dbInfo->vgInfo = NULL; - - SDbVgVersion vgVersion = {.dbId = dbInfo->dbId, .vgVersion = dbInfo->vgVersion}; - if (newAdded) { - CTG_ERR_JRET(ctgMetaRentAdd(&pCatalog->dbRent, &vgVersion, dbInfo->dbId, sizeof(SDbVgVersion))); - } else { - CTG_ERR_JRET(ctgMetaRentUpdate(&pCatalog->dbRent, &vgVersion, dbInfo->dbId, sizeof(SDbVgVersion), ctgDbVgVersionCompare)); + CTG_ERR_RET(ctgValidateAndRemoveDbInfo(pCatalog, dbInfo, &removed)); + if (!removed) { + return TSDB_CODE_SUCCESS; } - ctgDebug("dbName:%s vgroup updated, vgVersion:%d", dbName, dbInfo->vgVersion); + ctgInfo("db removed from cache, db:%s", dbInfo->dbName); - -_return: - - if (dbInfo && dbInfo->vgInfo) { - taosHashCleanup(dbInfo->vgInfo); - dbInfo->vgInfo = NULL; - } + CTG_ERR_RET(ctgMetaRentRemove(&pCatalog->dbRent, dbInfo->dbId, ctgDbVgVersionCompare)); + + ctgDebug("db removed from rent, db:%s", dbInfo->dbName); CTG_RET(code); } @@ -1365,6 +1393,7 @@ int32_t catalogGetTableHashVgroup(struct SCatalog *pCatalog, void *pTransporter, CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCatalog, dbInfo, pTableName, pVgroup)); _return: + if (dbInfo) { CTG_UNLOCK(CTG_READ, &dbInfo->lock); taosHashRelease(pCatalog->dbCache.cache, dbInfo); From 09b86cbf76c7975604f274330fae77568533f6ce Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 26 Jan 2022 08:50:32 +0800 Subject: [PATCH 07/37] fix bugs --- include/common/tmsg.h | 3 +- include/libs/catalog/catalog.h | 2 + source/client/inc/clientInt.h | 14 ++- source/client/src/clientHb.c | 118 ++++++++++++++---- source/client/src/clientImpl.c | 9 +- source/common/src/tmsg.c | 2 +- source/dnode/mnode/impl/inc/mndDb.h | 1 + source/dnode/mnode/impl/src/mndProfile.c | 8 +- .../dnode/mnode/impl/test/profile/profile.cpp | 5 +- source/libs/catalog/src/catalog.c | 4 +- 10 files changed, 115 insertions(+), 51 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 97ba56bd76..1316847f48 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -76,9 +76,10 @@ typedef enum { HEARTBEAT_TYPE_MAX } EHbType; -typedef enum { +enum { HEARTBEAT_KEY_DBINFO = 1, HEARTBEAT_KEY_STBINFO, + HEARTBEAT_KEY_MQ_TMP, }; diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 9c9e370dca..0b465b7b4e 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -99,6 +99,8 @@ int32_t catalogGetDBVgroup(struct SCatalog* pCatalog, void *pTransporter, const int32_t catalogUpdateDBVgroup(struct SCatalog* pCatalog, const char* dbName, SDBVgroupInfo* dbInfo); +int32_t catalogRemoveDBVgroup(struct SCatalog* pCatalog, SDbVgVersion* dbInfo); + /** * Get a table's meta data. * @param pCatalog (input, got with catalogGetHandle) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index a25d79bf30..b346e54add 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -35,10 +35,6 @@ extern "C" { typedef struct SAppInstInfo SAppInstInfo; -typedef int32_t (*FHbRspHandle)(SClientHbRsp* pReq); - -typedef int32_t (*FHbReqHandle)(SClientHbKey *connKey, void* param, SClientHbReq *req); - typedef struct SHbConnInfo { void *param; SClientHbReq *req; @@ -60,6 +56,12 @@ typedef struct SAppHbMgr { SHashObj* connInfo; // hash } SAppHbMgr; + +typedef int32_t (*FHbRspHandle)(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRsp); + +typedef int32_t (*FHbReqHandle)(SClientHbKey *connKey, void* param, SClientHbReq *req); + + typedef struct SClientHbMgr { int8_t inited; // ctl @@ -223,11 +225,11 @@ void hbMgrCleanUp(); int hbHandleRsp(SClientHbBatchRsp* hbRsp); // cluster level -SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo); +SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo, char *key); void appHbMgrCleanup(SAppHbMgr* pAppHbMgr); // conn level -int hbRegisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, FGetConnInfo func); +int hbRegisterConn(SAppHbMgr* pAppHbMgr, int32_t connId, int64_t clusterId, int32_t hbType); void hbDeregisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey); int hbAddConnInfo(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, void* key, void* value, int32_t keyLen, int32_t valueLen); diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index 8fc9fd086c..0ab3089f13 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -15,6 +15,8 @@ #include "clientInt.h" #include "trpc.h" +#include "catalog.h" +#include "clientLog.h" static SClientHbMgr clientHbMgr = {0}; @@ -25,6 +27,67 @@ static int32_t hbMqHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRsp) return 0; } +static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) { + int32_t msgLen = 0; + int32_t code = 0; + + while (msgLen < valueLen) { + SUseDbRsp *rsp = (SUseDbRsp *)((char *)value + msgLen); + + rsp->vgVersion = ntohl(rsp->vgVersion); + rsp->vgNum = ntohl(rsp->vgNum); + rsp->uid = be64toh(rsp->uid); + + if (rsp->vgVersion < 0) { + SDbVgVersion dbInfo; + strcpy(dbInfo.dbName, rsp->db); + dbInfo.dbId = rsp->uid; + dbInfo.vgVersion = rsp->vgVersion; + + code = catalogRemoveDBVgroup(pCatalog, &dbInfo); + } else { + SDBVgroupInfo vgInfo = {0}; + vgInfo.dbId = rsp->uid; + vgInfo.vgVersion = rsp->vgVersion; + vgInfo.hashMethod = rsp->hashMethod; + vgInfo.vgInfo = taosHashInit(rsp->vgNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK); + if (NULL == vgInfo.vgInfo) { + tscError("hash init[%d] failed", rsp->vgNum); + return TSDB_CODE_TSC_OUT_OF_MEMORY; + } + + for (int32_t i = 0; i < rsp->vgNum; ++i) { + rsp->vgroupInfo[i].vgId = ntohl(rsp->vgroupInfo[i].vgId); + rsp->vgroupInfo[i].hashBegin = ntohl(rsp->vgroupInfo[i].hashBegin); + rsp->vgroupInfo[i].hashEnd = ntohl(rsp->vgroupInfo[i].hashEnd); + + for (int32_t n = 0; n < rsp->vgroupInfo[i].numOfEps; ++n) { + rsp->vgroupInfo[i].epAddr[n].port = ntohs(rsp->vgroupInfo[i].epAddr[n].port); + } + + if (0 != taosHashPut(vgInfo.vgInfo, &rsp->vgroupInfo[i].vgId, sizeof(rsp->vgroupInfo[i].vgId), &rsp->vgroupInfo[i], sizeof(rsp->vgroupInfo[i]))) { + tscError("hash push failed, errno:%d", errno); + taosHashCleanup(vgInfo.vgInfo); + return TSDB_CODE_TSC_OUT_OF_MEMORY; + } + } + + code = catalogUpdateDBVgroup(pCatalog, rsp->db, &vgInfo); + if (code) { + taosHashCleanup(vgInfo.vgInfo); + } + } + + if (code) { + return code; + } + + msgLen += sizeof(SUseDbRsp) + rsp->vgNum * sizeof(SVgroupInfo); + } + + return TSDB_CODE_SUCCESS; +} + static int32_t hbQueryHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRsp) { SHbConnInfo * info = taosHashGet(pAppHbMgr->connInfo, &pRsp->connKey, sizeof(SClientHbKey)); if (NULL == info) { @@ -36,9 +99,24 @@ static int32_t hbQueryHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRs for (int32_t i = 0; i < kvNum; ++i) { SKv *kv = taosArrayGet(pRsp->info, i); switch (kv->key) { - case HEARTBEAT_KEY_DBINFO: + case HEARTBEAT_KEY_DBINFO: { + if (kv->valueLen <= 0 || NULL == kv->value) { + tscError("invalid hb db info, len:%d, value:%p", kv->valueLen, kv->value); + break; + } + int64_t *clusterId = (int64_t *)info->param; + struct SCatalog *pCatalog = NULL; + + int32_t code = catalogGetHandle(*clusterId, &pCatalog); + if (code != TSDB_CODE_SUCCESS) { + tscWarn("catalogGetHandle failed, clusterId:%"PRIx64", error:%s", *clusterId, tstrerror(code)); + break; + } + + hbProcessDBInfoRsp(kv->value, kv->valueLen, pCatalog); break; + } case HEARTBEAT_KEY_STBINFO: break; @@ -56,8 +134,10 @@ static int32_t hbMqAsyncCallBack(void* param, const SDataBuf* pMsg, int32_t code return -1; } char *key = (char *)param; - SClientHbBatchRsp* pRsp = (SClientHbBatchRsp*) pMsg->pData; - int32_t reqNum = taosArrayGetSize(pRsp->rsps); + SClientHbBatchRsp pRsp = {0}; + tDeserializeSClientHbBatchRsp(pMsg->pData, &pRsp); + + int32_t reqNum = taosArrayGetSize(pRsp.rsps); SAppInstInfo** pInst = taosHashGet(appInfo.pInstMap, key, strlen(key)); if (pInst == NULL || NULL == *pInst) { @@ -66,7 +146,7 @@ static int32_t hbMqAsyncCallBack(void* param, const SDataBuf* pMsg, int32_t code } for (int32_t i = 0; i < reqNum; ++i) { - SClientHbRsp* rsp = taosArrayGet(pRsp->rsps, i); + SClientHbRsp* rsp = taosArrayGet(pRsp.rsps, i); code = (*clientHbMgr.rspHandle[rsp->connKey.hbType])((*pInst)->pAppHbMgr, rsp); if (code) { break; @@ -145,8 +225,9 @@ void hbFreeReqKvHash(SHashObj* info) { } } -void hbFreeReq(SClientHbReq *req) { - hbFreeReqKvHash(req->info); +void hbFreeReq(void *req) { + SClientHbReq *pReq = (SClientHbReq *)req; + hbFreeReqKvHash(pReq->info); } @@ -305,9 +386,9 @@ SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo, char *key) { } pAppHbMgr->activeInfo->freeFp = tFreeClientHbReq; // init getInfoFunc - pAppHbMgr->getInfoFuncs = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + pAppHbMgr->connInfo = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); - if (pAppHbMgr->getInfoFuncs == NULL) { + if (pAppHbMgr->connInfo == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; free(pAppHbMgr); return NULL; @@ -325,7 +406,7 @@ void appHbMgrCleanup(SAppHbMgr* pAppHbMgr) { SAppHbMgr* pTarget = taosArrayGetP(clientHbMgr.appHbMgrs, i); if (pAppHbMgr == pTarget) { taosHashCleanup(pTarget->activeInfo); - taosHashCleanup(pTarget->getInfoFuncs); + taosHashCleanup(pTarget->connInfo); } } @@ -357,23 +438,6 @@ void hbMgrCleanUp() { taosArrayDestroy(clientHbMgr.appHbMgrs); } -int hbHandleRsp(SClientHbBatchRsp* hbRsp) { - int64_t reqId = hbRsp->reqId; - int64_t rspId = hbRsp->rspId; - - SArray* rsps = hbRsp->rsps; - int32_t sz = taosArrayGetSize(rsps); - for (int i = 0; i < sz; i++) { - SClientHbRsp* pRsp = taosArrayGet(rsps, i); - if (pRsp->connKey.hbType < HEARTBEAT_TYPE_MAX) { - clientHbMgr.handle[pRsp->connKey.hbType](pRsp); - } else { - // discard rsp - } - } - return 0; -} - int hbRegisterConnImpl(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, SHbConnInfo *info) { // init hash in activeinfo void* data = taosHashGet(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); @@ -421,7 +485,7 @@ int hbRegisterConn(SAppHbMgr* pAppHbMgr, int32_t connId, int64_t clusterId, int3 void hbDeregisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey) { taosHashRemove(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); - taosHashRemove(pAppHbMgr->getInfoFuncs, &connKey, sizeof(SClientHbKey)); + taosHashRemove(pAppHbMgr->connInfo, &connKey, sizeof(SClientHbKey)); atomic_sub_fetch_32(&pAppHbMgr->connKeyCnt, 1); } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index a39a0d637b..ce0e594955 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -434,13 +434,8 @@ SArray* tmqGetConnInfo(SClientHbKey connKey, void* param) { return NULL; } SKv kv = {0}; - kv.key = malloc(256); - if (kv.key == NULL) { - taosArrayDestroy(pArray); - return NULL; - } - strcpy(kv.key, "mq-tmp"); - kv.keyLen = strlen("mq-tmp") + 1; + kv.key = HEARTBEAT_KEY_MQ_TMP; + SMqHbMsg* pMqHb = malloc(sizeof(SMqHbMsg)); if (pMqHb == NULL) { return pArray; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 1e9131c800..0d1576d03c 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -114,7 +114,7 @@ void *tDeserializeSClientHbReq(void *buf, SClientHbReq *pReq) { for(int i = 0; i < kvNum; i++) { SKv kv; buf = taosDecodeSKv(buf, &kv); - taosHashPut(pReq->info, kv.key, sizeof(kv.key), kv.value, kv.valueLen); + taosHashPut(pReq->info, &kv.key, sizeof(kv.key), kv.value, kv.valueLen); } return buf; diff --git a/source/dnode/mnode/impl/inc/mndDb.h b/source/dnode/mnode/impl/inc/mndDb.h index 91f502be7d..5a3e6ed26e 100644 --- a/source/dnode/mnode/impl/inc/mndDb.h +++ b/source/dnode/mnode/impl/inc/mndDb.h @@ -26,6 +26,7 @@ int32_t mndInitDb(SMnode *pMnode); void mndCleanupDb(SMnode *pMnode); SDbObj *mndAcquireDb(SMnode *pMnode, char *db); void mndReleaseDb(SMnode *pMnode, SDbObj *pDb); +int32_t mndValidateDBInfo(SMnode *pMnode, SDbVgVersion *dbs, int32_t num, void **rsp, int32_t *rspLen); #ifdef __cplusplus } diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index 8296cd2c6c..49265fa35e 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -346,8 +346,6 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { int sz = taosArrayGetSize(pArray); SClientHbBatchRsp batchRsp = {0}; - batchRsp.key = batchReq.key; - batchRsp.keyLen = batchReq.keyLen; batchRsp.rsps = taosArrayInit(0, sizeof(SClientHbRsp)); for (int i = 0; i < sz; i++) { @@ -365,17 +363,18 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { SKv* kv = pIter; switch (kv->key) { - case HEARTBEAT_KEY_DBINFO: + case HEARTBEAT_KEY_DBINFO: { void *rspMsg = NULL; int32_t rspLen = 0; mndValidateDBInfo(pMnode, (SDbVgVersion *)kv->value, kv->valueLen/sizeof(SDbVgVersion), &rspMsg, &rspLen); if (rspMsg && rspLen > 0) { SKv kv = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = rspLen, .value = rspMsg}; - taosArrayPush(hbRsp->info, &kv); + taosArrayPush(hbRsp.info, &kv); taosArrayPush(batchRsp.rsps, &hbRsp); } break; + } case HEARTBEAT_KEY_STBINFO: break; @@ -412,7 +411,6 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { taosArrayDestroy(rsp->info); } - tfree(batchRsp.key); taosArrayDestroy(batchRsp.rsps); pReq->contLen = tlen; pReq->pCont = buf; diff --git a/source/dnode/mnode/impl/test/profile/profile.cpp b/source/dnode/mnode/impl/test/profile/profile.cpp index 4ad979cdd3..991b4c1249 100644 --- a/source/dnode/mnode/impl/test/profile/profile.cpp +++ b/source/dnode/mnode/impl/test/profile/profile.cpp @@ -102,11 +102,10 @@ TEST_F(MndTestProfile, 04_HeartBeatMsg) { req.connKey = {.connId = 123, .hbType = HEARTBEAT_TYPE_MQ}; req.info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); SKv kv; - kv.key = (void*)"abc"; - kv.keyLen = 4; + kv.key = 123; kv.value = (void*)"bcd"; kv.valueLen = 4; - taosHashPut(req.info, kv.key, kv.keyLen, kv.value, kv.valueLen); + taosHashPut(req.info, &kv.key, sizeof(kv.key), kv.value, kv.valueLen); taosArrayPush(batchReq.reqs, &req); int32_t tlen = tSerializeSClientHbBatchReq(NULL, &batchReq); diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index 3ce71ccb44..07086e49ee 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -1236,6 +1236,8 @@ int32_t catalogUpdateDBVgroup(struct SCatalog* pCatalog, const char* dbName, SDB } bool newAdded = false; + + dbInfo->lock = 0; if (taosHashPutExt(pCatalog->dbCache.cache, dbName, strlen(dbName), dbInfo, sizeof(*dbInfo), &newAdded) != 0) { ctgError("taosHashPutExt db vgroup to cache failed, db:%s", dbName); CTG_ERR_JRET(TSDB_CODE_CTG_MEM_ERROR); @@ -1269,7 +1271,7 @@ int32_t catalogRemoveDBVgroup(struct SCatalog* pCatalog, SDbVgVersion* dbInfo) { bool removed = false; if (NULL == pCatalog || NULL == dbInfo) { - CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT); + CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT); } if (NULL == pCatalog->dbCache.cache) { From 438d10e9d2c42b2c62866ecc53a1f3faafe9845b Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 26 Jan 2022 01:56:24 +0000 Subject: [PATCH 08/37] minor changes --- source/dnode/mnode/impl/src/mndDb.c | 4 ++-- source/dnode/mnode/impl/src/mndFunc.c | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 39be41a4e5..e9ae2dafd5 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -226,10 +226,10 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) { if (pCfg->cacheBlockSize < TSDB_MIN_CACHE_BLOCK_SIZE || pCfg->cacheBlockSize > TSDB_MAX_CACHE_BLOCK_SIZE) return -1; if (pCfg->totalBlocks < TSDB_MIN_TOTAL_BLOCKS || pCfg->totalBlocks > TSDB_MAX_TOTAL_BLOCKS) return -1; if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return -1; - if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1; if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return -1; if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return -1; if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return -1; + if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1; if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1; if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1; if (pCfg->minRows < TSDB_MIN_MIN_ROW_FBLOCK || pCfg->minRows > TSDB_MAX_MIN_ROW_FBLOCK) return -1; @@ -1143,7 +1143,7 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3 prec = TSDB_TIME_PRECISION_NANO_STR; break; default: - assert(false); + prec = "none"; break; } STR_WITH_SIZE_TO_VARSTR(pWrite, prec, 2); diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index f9dde7bc75..0c139557c2 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -20,6 +20,7 @@ #include "mndTrans.h" #define SDB_FUNC_VER 1 +#define SDB_FUNC_RESERVE_SIZE 64 static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc); static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw); @@ -78,6 +79,7 @@ static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc) { SDB_SET_INT32(pRaw, dataPos, pFunc->codeSize, FUNC_ENCODE_OVER) SDB_SET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_ENCODE_OVER) SDB_SET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_ENCODE_OVER) + SDB_SET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_ENCODE_OVER) SDB_SET_DATALEN(pRaw, dataPos, FUNC_ENCODE_OVER); terrno = 0; @@ -122,6 +124,7 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { SDB_GET_INT64(pRaw, dataPos, &pFunc->signature, FUNC_DECODE_OVER) SDB_GET_INT32(pRaw, dataPos, &pFunc->commentSize, FUNC_DECODE_OVER) SDB_GET_INT32(pRaw, dataPos, &pFunc->codeSize, FUNC_DECODE_OVER) + SDB_GET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_DECODE_OVER) pFunc->pComment = calloc(1, pFunc->commentSize); pFunc->pCode = calloc(1, pFunc->codeSize); From f84de4221d8232ec18b7873518ac1d233afcc0c8 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 26 Jan 2022 02:52:37 +0000 Subject: [PATCH 09/37] minor changes --- source/dnode/mgmt/impl/src/dndVnodes.c | 1 - source/dnode/mnode/impl/src/mndDb.c | 4 ++-- source/dnode/mnode/impl/src/mndVgroup.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/dnode/mgmt/impl/src/dndVnodes.c b/source/dnode/mgmt/impl/src/dndVnodes.c index dcb73d13c7..c27f3a151e 100644 --- a/source/dnode/mgmt/impl/src/dndVnodes.c +++ b/source/dnode/mgmt/impl/src/dndVnodes.c @@ -527,7 +527,6 @@ static void dndGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { pCfg->vgId = pCreate->vgId; pCfg->wsize = pCreate->cacheBlockSize; pCfg->ssize = pCreate->cacheBlockSize; - pCfg->wsize = pCreate->cacheBlockSize; pCfg->lsize = pCreate->cacheBlockSize; pCfg->isHeapAllocator = true; pCfg->ttl = 4; diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index e9ae2dafd5..32088d84a9 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -498,7 +498,7 @@ static int32_t mndProcessCreateDbReq(SMnodeMsg *pReq) { return TSDB_CODE_MND_ACTION_IN_PROGRESS; } -static int32_t mndSetDbCfgFromAlterDbMsg(SDbObj *pDb, SAlterDbReq *pAlter) { +static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) { terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED; if (pAlter->totalBlocks >= 0 && pAlter->totalBlocks != pDb->cfg.totalBlocks) { @@ -649,7 +649,7 @@ static int32_t mndProcessAlterDbReq(SMnodeMsg *pReq) { SDbObj dbObj = {0}; memcpy(&dbObj, pDb, sizeof(SDbObj)); - int32_t code = mndSetDbCfgFromAlterDbMsg(&dbObj, pAlter); + int32_t code = mndSetDbCfgFromAlterDbReq(&dbObj, pAlter); if (code != 0) { mndReleaseDb(pMnode, pDb); mError("db:%s, failed to alter since %s", pAlter->db, tstrerror(code)); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 04fedbb3ce..73c37560fc 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -178,7 +178,7 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) { SVgObj *mndAcquireVgroup(SMnode *pMnode, int32_t vgId) { SSdb *pSdb = pMnode->pSdb; SVgObj *pVgroup = sdbAcquire(pSdb, SDB_VGROUP, &vgId); - if (pVgroup == NULL) { + if (pVgroup == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) { terrno = TSDB_CODE_MND_VGROUP_NOT_EXIST; } return pVgroup; From 8b476207f19d557bbb709f1d0c7362ac3496a69d Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 26 Jan 2022 03:33:29 +0000 Subject: [PATCH 10/37] restore func obj --- source/dnode/mnode/impl/src/mndFunc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index 0c139557c2..0e086fdb22 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -61,7 +61,7 @@ void mndCleanupFunc(SMnode *pMnode) {} static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc) { terrno = TSDB_CODE_OUT_OF_MEMORY; - int32_t size = pFunc->commentSize + pFunc->codeSize + sizeof(SFuncObj); + int32_t size = pFunc->commentSize + pFunc->codeSize + sizeof(SFuncObj) + SDB_FUNC_RESERVE_SIZE; SSdbRaw *pRaw = sdbAllocRaw(SDB_FUNC, SDB_FUNC_VER, size); if (pRaw == NULL) goto FUNC_ENCODE_OVER; @@ -124,7 +124,6 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { SDB_GET_INT64(pRaw, dataPos, &pFunc->signature, FUNC_DECODE_OVER) SDB_GET_INT32(pRaw, dataPos, &pFunc->commentSize, FUNC_DECODE_OVER) SDB_GET_INT32(pRaw, dataPos, &pFunc->codeSize, FUNC_DECODE_OVER) - SDB_GET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_DECODE_OVER) pFunc->pComment = calloc(1, pFunc->commentSize); pFunc->pCode = calloc(1, pFunc->codeSize); @@ -134,6 +133,7 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { SDB_GET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_DECODE_OVER) SDB_GET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_DECODE_OVER) + SDB_GET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_DECODE_OVER) terrno = 0; From cea06000bfed7f421911763187d0a00d7cdcb388 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 13:19:32 +0800 Subject: [PATCH 11/37] refactor rpc --- source/libs/transport/src/transCli.c | 65 +++++++++++++++++++--------- source/libs/transport/src/transSrv.c | 17 ++++---- source/libs/transport/test/rserver.c | 2 +- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 4ffaad3f84..d64df9b0f3 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -95,8 +95,10 @@ static void clientHandleExcept(SCliConn* conn); // handle req from app static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd); -static void clientMsgDestroy(SCliMsg* pMsg); -static void destroyTransConnCtx(STransConnCtx* ctx); +static void destroyUserdata(SRpcMsg* userdata); + +static void destroyCmsg(SCliMsg* cmsg); +static void transDestroyConnCtx(STransConnCtx* ctx); // thread obj static SCliThrdObj* createThrdObj(); static void destroyThrdObj(SCliThrdObj* pThrd); @@ -104,7 +106,8 @@ static void destroyThrdObj(SCliThrdObj* pThrd); static void* clientThread(void* arg); static void clientHandleResp(SCliConn* conn) { - STransConnCtx* pCtx = ((SCliMsg*)conn->data)->ctx; + SCliMsg* pMsg = conn->data; + STransConnCtx* pCtx = pMsg->ctx; SRpcInfo* pRpc = pCtx->pTransInst; STransMsgHead* pHead = (STransMsgHead*)(conn->readBuf.buf); @@ -122,41 +125,44 @@ static void clientHandleResp(SCliConn* conn) { (pRpc->cfp)(NULL, &rpcMsg, NULL); conn->notifyCount += 1; - SCliThrdObj* pThrd = conn->hostThrd; - tfree(conn->data); - // buf alread translated to rpcMsg.pCont + // buf's mem alread translated to rpcMsg.pCont transClearBuffer(&conn->readBuf); uv_read_start((uv_stream_t*)conn->stream, clientAllocBufferCb, clientReadCb); + + SCliThrdObj* pThrd = conn->hostThrd; addConnToPool(pThrd->pool, pCtx->ip, pCtx->port, conn); + destroyCmsg(pMsg); + conn->data = NULL; // start thread's timer of conn pool if not active if (!uv_is_active((uv_handle_t*)pThrd->pTimer) && pRpc->idleTime > 0) { uv_timer_start((uv_timer_t*)pThrd->pTimer, clientTimeoutCb, CONN_PERSIST_TIME(pRpc->idleTime) / 2, 0); } - destroyTransConnCtx(pCtx); } static void clientHandleExcept(SCliConn* pConn) { if (pConn->data == NULL) { + // handle conn except in conn pool clientConnDestroy(pConn, true); return; } - tDebug("conn %p destroy", pConn); + tDebug("conn %p start to destroy", pConn); SCliMsg* pMsg = pConn->data; - transFreeMsg((pMsg->msg.pCont)); - pMsg->msg.pCont = NULL; + + destroyUserdata(&pMsg->msg); STransConnCtx* pCtx = pMsg->ctx; - SRpcInfo* pRpc = pCtx->pTransInst; SRpcMsg rpcMsg = {0}; rpcMsg.ahandle = pCtx->ahandle; rpcMsg.code = -1; // SRpcInfo* pRpc = pMsg->ctx->pRpc; - (pRpc->cfp)(NULL, &rpcMsg, NULL); - tfree(pConn->data); + (pCtx->pTransInst->cfp)(NULL, &rpcMsg, NULL); pConn->notifyCount += 1; - destroyTransConnCtx(pCtx); + + destroyCmsg(pMsg); + pConn->data = NULL; + // transDestroyConnCtx(pCtx); clientConnDestroy(pConn, true); } @@ -236,6 +242,7 @@ static void addConnToPool(void* pool, char* ip, uint32_t port, SCliConn* conn) { tDebug("conn %p added to conn pool, read buf cap: %d", conn, conn->readBuf.cap); SRpcInfo* pRpc = ((SCliThrdObj*)conn->hostThrd)->pTransInst; + conn->expireTime = taosGetTimestampMs() + CONN_PERSIST_TIME(pRpc->idleTime); SConnList* plist = taosHashGet((SHashObj*)pool, key, strlen(key)); conn->notifyCount = 0; @@ -282,6 +289,9 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf } assert(nread <= 0); if (nread == 0) { + // ref http://docs.libuv.org/en/v1.x/stream.html?highlight=uv_read_start#c.uv_read_cb + // nread might be 0, which does not indicate an error or EOF. This is equivalent to EAGAIN or EWOULDBLOCK under + // read(2). return; } if (nread < 0 || nread == UV_EOF) { @@ -321,11 +331,12 @@ static void clientWriteCb(uv_write_t* req, int status) { if (status == 0) { tDebug("conn %p data already was written out", pConn); SCliMsg* pMsg = pConn->data; - if (pMsg != NULL) { - transFreeMsg((pMsg->msg.pCont)); - pMsg->msg.pCont = NULL; + if (pMsg == NULL) { + destroy + // handle + return; } - + destroyUserdata(&pMsg->msg); } else { tError("conn %p failed to write: %s", pConn, uv_err_name(status)); clientHandleExcept(pConn); @@ -453,8 +464,20 @@ void* taosInitClient(uint32_t ip, uint32_t port, char* label, int numOfThreads, } return cli; } -static void clientMsgDestroy(SCliMsg* pMsg) { - // impl later + +static void destroyUserdata(SRpcMsg* userdata) { + if (userdata->pCont == NULL) { + return; + } + transFreeMsg(userdata->pCont); + userdata->pCont = NULL; +} +static void destroyCmsg(SCliMsg* pMsg) { + if (pMsg == NULL) { + return; + } + transDestroyConnCtx(pMsg->ctx); + destroyUserdata(&pMsg->msg); free(pMsg); } static SCliThrdObj* createThrdObj() { @@ -487,7 +510,7 @@ static void destroyThrdObj(SCliThrdObj* pThrd) { free(pThrd); } -static void destroyTransConnCtx(STransConnCtx* ctx) { +static void transDestroyConnCtx(STransConnCtx* ctx) { if (ctx != NULL) { free(ctx->ip); } diff --git a/source/libs/transport/src/transSrv.c b/source/libs/transport/src/transSrv.c index 485ed904e8..f36d9bd493 100644 --- a/source/libs/transport/src/transSrv.c +++ b/source/libs/transport/src/transSrv.c @@ -91,7 +91,7 @@ static void uvWorkerAsyncCb(uv_async_t* handle); static void uvPrepareSendData(SSrvMsg* msg, uv_buf_t* wb); static void uvStartSendResp(SSrvMsg* msg); -static void destroySrvMsg(SSrvConn* conn); +static void destroySmsg(SSrvMsg* smsg); // check whether already read complete packet static bool readComplete(SConnBuffer* buf); static SSrvConn* createConn(); @@ -305,8 +305,10 @@ void uvOnTimeoutCb(uv_timer_t* handle) { void uvOnWriteCb(uv_write_t* req, int status) { SSrvConn* conn = req->data; - SSrvMsg* smsg = conn->pSrvMsg; - destroySrvMsg(conn); + + SSrvMsg* smsg = conn->pSrvMsg; + destroySmsg(smsg); + conn->pSrvMsg = NULL; transClearBuffer(&conn->readBuf); if (status == 0) { @@ -362,14 +364,12 @@ static void uvStartSendResp(SSrvMsg* smsg) { return; } -static void destroySrvMsg(SSrvConn* conn) { - SSrvMsg* smsg = conn->pSrvMsg; +static void destroySmsg(SSrvMsg* smsg) { if (smsg == NULL) { return; } transFreeMsg(smsg->msg.pCont); - free(conn->pSrvMsg); - conn->pSrvMsg = NULL; + free(smsg); } void uvWorkerAsyncCb(uv_async_t* handle) { SWorkThrdObj* pThrd = handle->data; @@ -555,7 +555,8 @@ static void destroyConn(SSrvConn* conn, bool clear) { return; } transDestroyBuffer(&conn->readBuf); - destroySrvMsg(conn); + destroySmsg(conn->pSrvMsg); + conn->pSrvMsg = NULL; if (clear) { uv_close((uv_handle_t*)conn->pTcp, uvDestroyConn); diff --git a/source/libs/transport/test/rserver.c b/source/libs/transport/test/rserver.c index 12d8a01819..d1a587f4e5 100644 --- a/source/libs/transport/test/rserver.c +++ b/source/libs/transport/test/rserver.c @@ -165,6 +165,7 @@ int main(int argc, char *argv[]) { tError("failed to start RPC server"); return -1; } + // sleep(5); tInfo("RPC server is running, ctrl-c to exit"); @@ -172,7 +173,6 @@ int main(int argc, char *argv[]) { dataFd = open(dataName, O_APPEND | O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO); if (dataFd < 0) tInfo("failed to open data file, reason:%s", strerror(errno)); } - qhandle = taosOpenQueue(); qset = taosOpenQset(); taosAddIntoQset(qset, qhandle, NULL); From 203f84590791644aeecac789d0a87c893ab14f78 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 13:42:16 +0800 Subject: [PATCH 12/37] refactor rpc --- source/libs/transport/src/transSrv.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/libs/transport/src/transSrv.c b/source/libs/transport/src/transSrv.c index f36d9bd493..a5ee1f1c63 100644 --- a/source/libs/transport/src/transSrv.c +++ b/source/libs/transport/src/transSrv.c @@ -546,10 +546,6 @@ static void destroyConn(SSrvConn* conn, bool clear) { if (conn == NULL) { return; } - // SRpcMsg* pMsg = &conn->sendMsg; - // transFreeMsg(pMsg->pCont); - // pMsg->pCont = NULL; - tDebug("conn %p try to destroy", conn); if (--conn->ref > 0) { return; From 859c74a4e50f48049e80ff618f6d928b4d576fe3 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 14:00:15 +0800 Subject: [PATCH 13/37] [td-11818] refactor sepset struct. --- include/common/tep.h | 14 +- include/common/tmsg.h | 33 ++- include/libs/qcom/query.h | 13 +- include/libs/transport/transport.h | 15 -- source/client/src/clientImpl.c | 24 +-- source/client/src/clientMsgHandler.c | 5 +- source/client/test/clientTests.cpp | 193 +++++++++--------- source/common/src/tep.c | 29 ++- source/common/src/tglobal.c | 12 +- source/dnode/mgmt/impl/src/dndMgmt.c | 41 ++-- .../dnode/mgmt/impl/test/sut/src/client.cpp | 7 +- source/dnode/mnode/impl/src/mndDb.c | 10 +- source/dnode/mnode/impl/src/mndDnode.c | 8 +- source/dnode/mnode/impl/src/mndMnode.c | 4 +- source/dnode/mnode/impl/src/mndSubscribe.c | 12 +- source/dnode/mnode/impl/src/mndVgroup.c | 4 +- source/dnode/mnode/impl/test/db/db.cpp | 12 +- .../dnode/mnode/impl/test/profile/profile.cpp | 6 +- source/libs/catalog/src/catalog.c | 18 +- source/libs/catalog/test/catalogTests.cpp | 36 ++-- source/libs/executor/src/executorimpl.c | 9 +- source/libs/parser/src/astValidate.c | 11 +- source/libs/parser/src/dCDAstProcess.c | 8 +- source/libs/parser/src/parserUtil.c | 42 ---- .../libs/parser/test/mockCatalogService.cpp | 27 ++- source/libs/planner/src/physicalPlan.c | 35 +--- source/libs/planner/src/physicalPlanJson.c | 14 +- source/libs/planner/test/phyPlanTests.cpp | 6 +- source/libs/qcom/src/querymsg.c | 4 +- source/libs/scheduler/src/scheduler.c | 26 +-- source/libs/scheduler/test/schedulerTests.cpp | 40 ++-- source/libs/transport/src/rpcMain.c | 12 +- source/libs/transport/test/rclient.c | 14 +- 33 files changed, 313 insertions(+), 431 deletions(-) diff --git a/include/common/tep.h b/include/common/tep.h index c8f45e4c82..69dd385a37 100644 --- a/include/common/tep.h +++ b/include/common/tep.h @@ -1,6 +1,10 @@ #ifndef TDENGINE_TEP_H #define TDENGINE_TEP_H +#ifdef __cplusplus +extern "C" { +#endif + #include "os.h" #include "tmsg.h" @@ -9,10 +13,16 @@ typedef struct SCorEpSet { SEpSet epSet; } SCorEpSet; -int taosGetFqdnPortFromEp(const char *ep, char *fqdn, uint16_t *port); +int taosGetFqdnPortFromEp(const char *ep, SEp *pEp); +void addEpIntoEpSet(SEpSet *pEpSet, const char *fqdn, uint16_t port); + bool isEpsetEqual(const SEpSet *s1, const SEpSet *s2); -void updateEpSet_s(SCorEpSet *pEpSet, SEpSet *pNewEpSet); +void updateEpSet_s(SCorEpSet *pEpSet, SEpSet *pNewEpSet); SEpSet getEpSet_s(SCorEpSet *pEpSet); +#ifdef __cplusplus +} +#endif + #endif // TDENGINE_TEP_H diff --git a/include/common/tmsg.h b/include/common/tmsg.h index b3d595d73b..817e59f28a 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -154,10 +154,10 @@ typedef struct { #pragma pack(push, 1) // null-terminated string instead of char array to avoid too many memory consumption in case of more than 1M tableMeta -typedef struct { +typedef struct SEp { char fqdn[TSDB_FQDN_LEN]; uint16_t port; -} SEpAddr; +} SEp; typedef struct { int32_t contLen; @@ -266,8 +266,7 @@ typedef struct { typedef struct SEpSet { int8_t inUse; int8_t numOfEps; - uint16_t port[TSDB_MAX_REPLICA]; - char fqdn[TSDB_MAX_REPLICA][TSDB_FQDN_LEN]; + SEp eps[TSDB_MAX_REPLICA]; } SEpSet; static FORCE_INLINE int taosEncodeSEpSet(void** buf, const SEpSet* pEp) { @@ -275,8 +274,8 @@ static FORCE_INLINE int taosEncodeSEpSet(void** buf, const SEpSet* pEp) { tlen += taosEncodeFixedI8(buf, pEp->inUse); tlen += taosEncodeFixedI8(buf, pEp->numOfEps); for (int i = 0; i < TSDB_MAX_REPLICA; i++) { - tlen += taosEncodeFixedU16(buf, pEp->port[i]); - tlen += taosEncodeString(buf, pEp->fqdn[i]); + tlen += taosEncodeFixedU16(buf, pEp->eps[i].port); + tlen += taosEncodeString(buf, pEp->eps[i].fqdn); } return tlen; } @@ -285,8 +284,8 @@ static FORCE_INLINE void* taosDecodeSEpSet(void* buf, SEpSet* pEp) { buf = taosDecodeFixedI8(buf, &pEp->inUse); buf = taosDecodeFixedI8(buf, &pEp->numOfEps); for (int i = 0; i < TSDB_MAX_REPLICA; i++) { - buf = taosDecodeFixedU16(buf, &pEp->port[i]); - buf = taosDecodeStringTo(buf, pEp->fqdn[i]); + buf = taosDecodeFixedU16(buf, &pEp->eps[i].port); + buf = taosDecodeStringTo(buf, pEp->eps[i].fqdn); } return buf; } @@ -617,8 +616,7 @@ typedef struct { int32_t id; int8_t isMnode; int8_t align; - uint16_t port; - char fqdn[TSDB_FQDN_LEN]; + SEp ep; } SDnodeEp; typedef struct { @@ -691,24 +689,17 @@ typedef struct { char tableNames[]; } SMultiTableInfoReq; +// todo refactor typedef struct SVgroupInfo { int32_t vgId; uint32_t hashBegin; uint32_t hashEnd; - int8_t inUse; - int8_t numOfEps; - SEpAddr epAddr[TSDB_MAX_REPLICA]; + SEpSet epset; } SVgroupInfo; typedef struct { - int32_t vgId; - int8_t numOfEps; - SEpAddr epAddr[TSDB_MAX_REPLICA]; -} SVgroupMsg; - -typedef struct { - int32_t numOfVgroups; - SVgroupMsg vgroups[]; + int32_t numOfVgroups; + SVgroupInfo vgroups[]; } SVgroupsInfo; typedef struct { diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index 1925f0e3bd..6cd33b1067 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -128,20 +128,9 @@ typedef struct SMsgSendInfo { typedef struct SQueryNodeAddr { int32_t nodeId; // vgId or qnodeId - int8_t inUse; - int8_t numOfEps; - SEpAddr epAddr[TSDB_MAX_REPLICA]; + SEpSet epset; } SQueryNodeAddr; -static FORCE_INLINE void tConvertQueryAddrToEpSet(SEpSet* pEpSet, const SQueryNodeAddr* pAddr) { - pEpSet->inUse = pAddr->inUse; - pEpSet->numOfEps = pAddr->numOfEps; - for (int j = 0; j < TSDB_MAX_REPLICA; j++) { - pEpSet->port[j] = pAddr->epAddr[j].port; - memcpy(pEpSet->fqdn[j], pAddr->epAddr[j].fqdn, TSDB_FQDN_LEN); - } -} - int32_t initTaskQueue(); int32_t cleanupTaskQueue(); diff --git a/include/libs/transport/transport.h b/include/libs/transport/transport.h index a05a76931a..f5ffc125ea 100644 --- a/include/libs/transport/transport.h +++ b/include/libs/transport/transport.h @@ -20,21 +20,6 @@ extern "C" { #endif -//typedef struct SEpAddr { -// char fqdn[TSDB_FQDN_LEN]; -// uint16_t port; -//} SEpAddr; -// -//typedef struct SVgroup { -// int32_t vgId; -// int8_t numOfEps; -// SEpAddr epAddr[TSDB_MAX_REPLICA]; -//} SVgroup; -// -//typedef struct SVgroupsInfo { -// int32_t numOfVgroups; -// SVgroup vgroups[]; -//} SVgroupsInfo; #ifdef __cplusplus } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 179e46527f..37583ed3fe 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -101,7 +101,7 @@ TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, } if (port) { - epSet.epSet.port[0] = port; + epSet.epSet.eps[0].port = port; } } else { if (initEpSetFromCfg(tsFirst, tsSecond, &epSet) < 0) { @@ -701,7 +701,7 @@ int initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSe return -1; } - taosGetFqdnPortFromEp(firstEp, mgmtEpSet->fqdn[0], &(mgmtEpSet->port[0])); + taosGetFqdnPortFromEp(firstEp, &mgmtEpSet->eps[0]); mgmtEpSet->numOfEps++; } @@ -711,7 +711,7 @@ int initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSe return -1; } - taosGetFqdnPortFromEp(secondEp, mgmtEpSet->fqdn[mgmtEpSet->numOfEps], &(mgmtEpSet->port[mgmtEpSet->numOfEps])); + taosGetFqdnPortFromEp(secondEp, &mgmtEpSet->eps[mgmtEpSet->numOfEps]); mgmtEpSet->numOfEps++; } @@ -916,14 +916,7 @@ void* doFetchRow(SRequestObj* pRequest) { SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo; SVgroupInfo* pVgroupInfo = taosArrayGet(pShowReqInfo->pArray, pShowReqInfo->currentIndex); - epSet.numOfEps = pVgroupInfo->numOfEps; - epSet.inUse = pVgroupInfo->inUse; - - for (int32_t i = 0; i < epSet.numOfEps; ++i) { - strncpy(epSet.fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(epSet.fqdn[i])); - epSet.port[i] = pVgroupInfo->epAddr[i].port; - } - + epSet = pVgroupInfo->epset; } else if (pRequest->type == TDMT_VND_SHOW_TABLES_FETCH) { pRequest->type = TDMT_VND_SHOW_TABLES; SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo; @@ -940,14 +933,7 @@ void* doFetchRow(SRequestObj* pRequest) { pRequest->body.requestMsg.pData = pShowReq; SMsgSendInfo* body = buildMsgInfoImpl(pRequest); - - epSet.numOfEps = pVgroupInfo->numOfEps; - epSet.inUse = pVgroupInfo->inUse; - - for (int32_t i = 0; i < epSet.numOfEps; ++i) { - strncpy(epSet.fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(epSet.fqdn[i])); - epSet.port[i] = pVgroupInfo->epAddr[i].port; - } + epSet = pVgroupInfo->epset; int64_t transporterId = 0; STscObj *pTscObj = pRequest->pTscObj; diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index ec088eb073..42d40b6b81 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -53,7 +53,7 @@ int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) { assert(pConnect->epSet.numOfEps > 0); for(int32_t i = 0; i < pConnect->epSet.numOfEps; ++i) { - pConnect->epSet.port[i] = htons(pConnect->epSet.port[i]); + pConnect->epSet.eps[i].port = htons(pConnect->epSet.eps[i].port); } if (!isEpsetEqual(&pTscObj->pAppInfo->mgmtEp.epSet, &pConnect->epSet)) { @@ -61,7 +61,8 @@ int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) { } for (int i = 0; i < pConnect->epSet.numOfEps; ++i) { - tscDebug("0x%" PRIx64 " epSet.fqdn[%d]:%s port:%d, connObj:0x%"PRIx64, pRequest->requestId, i, pConnect->epSet.fqdn[i], pConnect->epSet.port[i], pTscObj->id); + tscDebug("0x%" PRIx64 " epSet.fqdn[%d]:%s port:%d, connObj:0x%"PRIx64, pRequest->requestId, i, pConnect->epSet.eps[i].fqdn, + pConnect->epSet.eps[i].port, pTscObj->id); } pTscObj->connId = pConnect->connId; diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index d62d7cb826..9f20d6f74b 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -401,7 +401,16 @@ TEST(testCase, create_multiple_tables) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); ASSERT_NE(pConn, nullptr); - TAOS_RES* pRes = taos_query(pConn, "use abc1"); + TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to create db, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + taos_close(pConn); + return; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "use abc1"); if (taos_errno(pRes) != 0) { printf("failed to use db, reason:%s\n", taos_errstr(pRes)); taos_free_result(pRes); @@ -411,6 +420,13 @@ TEST(testCase, create_multiple_tables) { taos_free_result(pRes); + pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("failed to create stable tables, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + pRes = taos_query(pConn, "create table t_2 using st1 tags(1)"); if (taos_errno(pRes) != 0) { printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); @@ -528,6 +544,25 @@ TEST(testCase, generated_request_id_test) { taosHashCleanup(phash); } +TEST(testCase, insert_test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); + if (taos_errno(pRes) != 0) { + printf("failed to create into table t_2, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +#if 0 TEST(testCase, create_topic_Test) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); assert(pConn != NULL); @@ -552,25 +587,7 @@ TEST(testCase, create_topic_Test) { taos_close(pConn); } -TEST(testCase, insert_test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - ASSERT_NE(pConn, nullptr); - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - - pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); - if (taos_errno(pRes) != 0) { - printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -#if 0 TEST(testCase, tmq_subscribe_Test) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); assert(pConn != NULL); @@ -597,24 +614,6 @@ TEST(testCase, tmq_commit_TEST) { } #endif -//TEST(testCase, insert_test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} - TEST(testCase, projection_query_tables) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); ASSERT_NE(pConn, nullptr); @@ -666,66 +665,66 @@ TEST(testCase, projection_query_tables) { taos_close(pConn); } -//TEST(testCase, projection_query_stables) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "select ts from m1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} +TEST(testCase, projection_query_stables) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); -//TEST(testCase, agg_query_tables) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use dbv"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table tx using st tags(111111111111111)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create table, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "select count(*) from tu"); -// if (taos_errno(pRes) != 0) { -// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "select ts from st1"); + if (taos_errno(pRes) != 0) { + printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, agg_query_tables) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table tx using st1 tags(111111111111111)"); + if (taos_errno(pRes) != 0) { + printf("failed to create table, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "select count(*) from tu"); + if (taos_errno(pRes) != 0) { + printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} #pragma GCC diagnostic pop diff --git a/source/common/src/tep.c b/source/common/src/tep.c index 9cc99e7f51..cf38ab8dd9 100644 --- a/source/common/src/tep.c +++ b/source/common/src/tep.c @@ -2,32 +2,43 @@ #include "tglobal.h" #include "tlockfree.h" -int taosGetFqdnPortFromEp(const char *ep, char *fqdn, uint16_t *port) { - *port = 0; - strcpy(fqdn, ep); +int taosGetFqdnPortFromEp(const char *ep, SEp* pEp) { + pEp->port = 0; + strcpy(pEp->fqdn, ep); - char *temp = strchr(fqdn, ':'); + char *temp = strchr(pEp->fqdn, ':'); if (temp) { *temp = 0; - *port = atoi(temp+1); + pEp->port = atoi(temp+1); } - if (*port == 0) { - *port = tsServerPort; + if (pEp->port == 0) { + pEp->port = tsServerPort; return -1; } return 0; } +void addEpIntoEpSet(SEpSet *pEpSet, const char* fqdn, uint16_t port) { + if (pEpSet == NULL || fqdn == NULL || strlen(fqdn) == 0) { + return; + } + + int32_t index = pEpSet->numOfEps; + tstrncpy(pEpSet->eps[index].fqdn, fqdn, tListLen(pEpSet->eps[index].fqdn)); + pEpSet->eps[index].port = port; + pEpSet->numOfEps += 1; +} + bool isEpsetEqual(const SEpSet *s1, const SEpSet *s2) { if (s1->numOfEps != s2->numOfEps || s1->inUse != s2->inUse) { return false; } for (int32_t i = 0; i < s1->numOfEps; i++) { - if (s1->port[i] != s2->port[i] - || strncmp(s1->fqdn[i], s2->fqdn[i], TSDB_FQDN_LEN) != 0) + if (s1->eps[i].port != s2->eps[i].port + || strncmp(s1->eps[i].fqdn, s2->eps[i].fqdn, TSDB_FQDN_LEN) != 0) return false; } return true; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 7a0966df57..a353c018b7 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -1080,9 +1080,7 @@ static void doInitGlobalConfig(void) { void taosInitGlobalCfg() { pthread_once(&tsInitGlobalCfgOnce, doInitGlobalConfig); } int32_t taosCheckAndPrintCfg() { - char fqdn[TSDB_FQDN_LEN]; - uint16_t port; - + SEp ep = {0}; if (debugFlag & DEBUG_TRACE || debugFlag & DEBUG_DEBUG || debugFlag & DEBUG_DUMP) { taosSetAllDebugFlag(); } @@ -1097,15 +1095,15 @@ int32_t taosCheckAndPrintCfg() { if (tsFirst[0] == 0) { strcpy(tsFirst, tsLocalEp); } else { - taosGetFqdnPortFromEp(tsFirst, fqdn, &port); - snprintf(tsFirst, sizeof(tsFirst), "%s:%u", fqdn, port); + taosGetFqdnPortFromEp(tsFirst, &ep); + snprintf(tsFirst, sizeof(tsFirst), "%s:%u", ep.fqdn, ep.port); } if (tsSecond[0] == 0) { strcpy(tsSecond, tsLocalEp); } else { - taosGetFqdnPortFromEp(tsSecond, fqdn, &port); - snprintf(tsSecond, sizeof(tsSecond), "%s:%u", fqdn, port); + taosGetFqdnPortFromEp(tsSecond, &ep); + snprintf(tsSecond, sizeof(tsSecond), "%s:%u", ep.fqdn, ep.port); } taosCheckDataDirCfg(); diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index b127fb1d64..6a882e87ec 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -57,13 +57,13 @@ void dndGetDnodeEp(SDnode *pDnode, int32_t dnodeId, char *pEp, char *pFqdn, uint SDnodeEp *pDnodeEp = taosHashGet(pMgmt->dnodeHash, &dnodeId, sizeof(int32_t)); if (pDnodeEp != NULL) { if (pPort != NULL) { - *pPort = pDnodeEp->port; + *pPort = pDnodeEp->ep.port; } if (pFqdn != NULL) { - tstrncpy(pFqdn, pDnodeEp->fqdn, TSDB_FQDN_LEN); + tstrncpy(pFqdn, pDnodeEp->ep.fqdn, TSDB_FQDN_LEN); } if (pEp != NULL) { - snprintf(pEp, TSDB_EP_LEN, "%s:%u", pDnodeEp->fqdn, pDnodeEp->port); + snprintf(pEp, TSDB_EP_LEN, "%s:%u", pDnodeEp->ep.fqdn, pDnodeEp->ep.port); } } @@ -85,12 +85,12 @@ void dndSendRedirectRsp(SDnode *pDnode, SRpcMsg *pReq) { dDebug("RPC %p, req:%s is redirected, num:%d use:%d", pReq->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse); for (int32_t i = 0; i < epSet.numOfEps; ++i) { - dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]); - if (strcmp(epSet.fqdn[i], pDnode->cfg.localFqdn) == 0 && epSet.port[i] == pDnode->cfg.serverPort) { + dDebug("mnode index:%d %s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port); + if (strcmp(epSet.eps[i].fqdn, pDnode->cfg.localFqdn) == 0 && epSet.eps[i].port == pDnode->cfg.serverPort) { epSet.inUse = (i + 1) % epSet.numOfEps; } - epSet.port[i] = htons(epSet.port[i]); + epSet.eps[i].port = htons(epSet.eps[i].port); } rpcSendRedirectRsp(pReq->handle, &epSet); @@ -104,7 +104,7 @@ static void dndUpdateMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) { pMgmt->mnodeEpSet = *pEpSet; for (int32_t i = 0; i < pEpSet->numOfEps; ++i) { - dInfo("mnode index:%d %s:%u", i, pEpSet->fqdn[i], pEpSet->port[i]); + dInfo("mnode index:%d %s:%u", i, pEpSet->eps[i].fqdn, pEpSet->eps[i].port); } taosWUnLockLatch(&pMgmt->latch); @@ -116,7 +116,7 @@ static void dndPrintDnodes(SDnode *pDnode) { dDebug("print dnode ep list, num:%d", pMgmt->dnodeEps->num); for (int32_t i = 0; i < pMgmt->dnodeEps->num; i++) { SDnodeEp *pEp = &pMgmt->dnodeEps->eps[i]; - dDebug("dnode:%d, fqdn:%s port:%u isMnode:%d", pEp->id, pEp->fqdn, pEp->port, pEp->isMnode); + dDebug("dnode:%d, fqdn:%s port:%u isMnode:%d", pEp->id, pEp->ep.fqdn, pEp->ep.port, pEp->isMnode); } } @@ -145,8 +145,8 @@ static void dndResetDnodes(SDnode *pDnode, SDnodeEps *pDnodeEps) { if (!pDnodeEp->isMnode) continue; if (mIndex >= TSDB_MAX_REPLICA) continue; pMgmt->mnodeEpSet.numOfEps++; - strcpy(pMgmt->mnodeEpSet.fqdn[mIndex], pDnodeEp->fqdn); - pMgmt->mnodeEpSet.port[mIndex] = pDnodeEp->port; + + pMgmt->mnodeEpSet.eps[mIndex] = pDnodeEp->ep; mIndex++; } @@ -167,7 +167,7 @@ static bool dndIsEpChanged(SDnode *pDnode, int32_t dnodeId, char *pEp) { SDnodeEp *pDnodeEp = taosHashGet(pMgmt->dnodeHash, &dnodeId, sizeof(int32_t)); if (pDnodeEp != NULL) { char epstr[TSDB_EP_LEN + 1]; - snprintf(epstr, TSDB_EP_LEN, "%s:%u", pDnodeEp->fqdn, pDnodeEp->port); + snprintf(epstr, TSDB_EP_LEN, "%s:%u", pDnodeEp->ep.fqdn, pDnodeEp->ep.port); changed = strcmp(pEp, epstr) != 0; } @@ -251,11 +251,12 @@ static int32_t dndReadDnodes(SDnode *pDnode) { SDnodeEp *pDnodeEp = &pMgmt->dnodeEps->eps[i]; - cJSON *dnodeId = cJSON_GetObjectItem(node, "id"); - if (!dnodeId || dnodeId->type != cJSON_Number) { + cJSON *did = cJSON_GetObjectItem(node, "id"); + if (!did || did->type != cJSON_Number) { dError("failed to read %s since dnodeId not found", pMgmt->file); goto PRASE_DNODE_OVER; } + pDnodeEp->id = dnodeId->valueint; cJSON *dnodeFqdn = cJSON_GetObjectItem(node, "fqdn"); @@ -263,14 +264,15 @@ static int32_t dndReadDnodes(SDnode *pDnode) { dError("failed to read %s since dnodeFqdn not found", pMgmt->file); goto PRASE_DNODE_OVER; } - tstrncpy(pDnodeEp->fqdn, dnodeFqdn->valuestring, TSDB_FQDN_LEN); + tstrncpy(pDnodeEp->ep.fqdn, dnodeFqdn->valuestring, TSDB_FQDN_LEN); cJSON *dnodePort = cJSON_GetObjectItem(node, "port"); if (!dnodePort || dnodePort->type != cJSON_Number) { dError("failed to read %s since dnodePort not found", pMgmt->file); goto PRASE_DNODE_OVER; } - pDnodeEp->port = dnodePort->valueint; + + pDnodeEp->ep.port = dnodePort->valueint; cJSON *isMnode = cJSON_GetObjectItem(node, "isMnode"); if (!isMnode || isMnode->type != cJSON_Number) { @@ -298,7 +300,8 @@ PRASE_DNODE_OVER: pMgmt->dnodeEps = calloc(1, sizeof(SDnodeEps) + sizeof(SDnodeEp)); pMgmt->dnodeEps->num = 1; pMgmt->dnodeEps->eps[0].isMnode = 1; - taosGetFqdnPortFromEp(pDnode->cfg.firstEp, pMgmt->dnodeEps->eps[0].fqdn, &pMgmt->dnodeEps->eps[0].port); + + taosGetFqdnPortFromEp(pDnode->cfg.firstEp, &(pMgmt->dnodeEps->eps[0].ep)); } dndResetDnodes(pDnode, pMgmt->dnodeEps); @@ -329,8 +332,8 @@ static int32_t dndWriteDnodes(SDnode *pDnode) { for (int32_t i = 0; i < pMgmt->dnodeEps->num; ++i) { SDnodeEp *pDnodeEp = &pMgmt->dnodeEps->eps[i]; len += snprintf(content + len, maxLen - len, " \"id\": %d,\n", pDnodeEp->id); - len += snprintf(content + len, maxLen - len, " \"fqdn\": \"%s\",\n", pDnodeEp->fqdn); - len += snprintf(content + len, maxLen - len, " \"port\": %u,\n", pDnodeEp->port); + len += snprintf(content + len, maxLen - len, " \"fqdn\": \"%s\",\n", pDnodeEp->ep.fqdn); + len += snprintf(content + len, maxLen - len, " \"port\": %u,\n", pDnodeEp->ep.port); len += snprintf(content + len, maxLen - len, " \"isMnode\": %d\n", pDnodeEp->isMnode); if (i < pMgmt->dnodeEps->num - 1) { len += snprintf(content + len, maxLen - len, " },{\n"); @@ -450,7 +453,7 @@ static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pRsp) { pDnodeEps->num = htonl(pDnodeEps->num); for (int32_t i = 0; i < pDnodeEps->num; ++i) { pDnodeEps->eps[i].id = htonl(pDnodeEps->eps[i].id); - pDnodeEps->eps[i].port = htons(pDnodeEps->eps[i].port); + pDnodeEps->eps[i].ep.port = htons(pDnodeEps->eps[i].ep.port); } dndUpdateDnodeEps(pDnode, pDnodeEps); diff --git a/source/dnode/mgmt/impl/test/sut/src/client.cpp b/source/dnode/mgmt/impl/test/sut/src/client.cpp index 3d61db8268..8403dbf034 100644 --- a/source/dnode/mgmt/impl/test/sut/src/client.cpp +++ b/source/dnode/mgmt/impl/test/sut/src/client.cpp @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include "tep.h" #include "sut.h" static void processClientRsp(void* parent, SRpcMsg* pRsp, SEpSet* pEpSet) { @@ -61,11 +62,7 @@ void TestClient::Cleanup() { SRpcMsg* TestClient::SendReq(SRpcMsg* pReq) { SEpSet epSet = {0}; - epSet.inUse = 0; - epSet.numOfEps = 1; - epSet.port[0] = port; - memcpy(epSet.fqdn[0], fqdn, TSDB_FQDN_LEN); - + addEpIntoEpSet(&epSet, fqdn, port); rpcSendRequest(clientRpc, &epSet, pReq, NULL); tsem_wait(&sem); diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 39be41a4e5..875adc9295 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -840,18 +840,18 @@ static int32_t mndProcessUseDbReq(SMnodeMsg *pReq) { pInfo->vgId = htonl(pVgroup->vgId); pInfo->hashBegin = htonl(pVgroup->hashBegin); pInfo->hashEnd = htonl(pVgroup->hashEnd); - pInfo->numOfEps = pVgroup->replica; + pInfo->epset.numOfEps = pVgroup->replica; for (int32_t gid = 0; gid < pVgroup->replica; ++gid) { SVnodeGid *pVgid = &pVgroup->vnodeGid[gid]; - SEpAddr *pEpArrr = &pInfo->epAddr[gid]; + SEp * pEp = &pInfo->epset.eps[gid]; SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId); if (pDnode != NULL) { - memcpy(pEpArrr->fqdn, pDnode->fqdn, TSDB_FQDN_LEN); - pEpArrr->port = htons(pDnode->port); + memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN); + pEp->port = htons(pDnode->port); } mndReleaseDnode(pMnode, pDnode); if (pVgid->role == TAOS_SYNC_STATE_LEADER) { - pInfo->inUse = gid; + pInfo->epset.inUse = gid; } } vindex++; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index efdacf957b..9a96bdb0df 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -203,8 +203,8 @@ void mndReleaseDnode(SMnode *pMnode, SDnodeObj *pDnode) { } SEpSet mndGetDnodeEpset(SDnodeObj *pDnode) { - SEpSet epSet = {.inUse = 0, .numOfEps = 1, .port[0] = pDnode->port}; - memcpy(epSet.fqdn[0], pDnode->fqdn, TSDB_FQDN_LEN); + SEpSet epSet = {0}; + addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port); return epSet; } @@ -261,8 +261,8 @@ static void mndGetDnodeData(SMnode *pMnode, SDnodeEps *pEps, int32_t maxEps) { SDnodeEp *pEp = &pEps->eps[numOfEps]; pEp->id = htonl(pDnode->id); - pEp->port = htons(pDnode->port); - memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN); + pEp->ep.port = htons(pDnode->port); + memcpy(pEp->ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN); pEp->isMnode = 0; if (mndIsMnode(pMnode, pDnode->id)) { pEp->isMnode = 1; diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index 75ed5b0a1e..fbb4e5cef7 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -237,8 +237,8 @@ void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) { if (pIter == NULL) break; if (pObj->pDnode == NULL) break; - pEpSet->port[pEpSet->numOfEps] = htons(pObj->pDnode->port); - memcpy(pEpSet->fqdn[pEpSet->numOfEps], pObj->pDnode->fqdn, TSDB_FQDN_LEN); + pEpSet->eps[pEpSet->numOfEps].port = htons(pObj->pDnode->port); + memcpy(pEpSet->eps[pEpSet->numOfEps].fqdn, pObj->pDnode->fqdn, TSDB_FQDN_LEN); if (pObj->role == TAOS_SYNC_STATE_LEADER) { pEpSet->inUse = pEpSet->numOfEps; } diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index 78e9a7c17c..a72c8c78fc 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -151,11 +151,13 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas SArray *pArray; SArray* inner = taosArrayGet(pDag->pSubplans, 0); SSubplan *plan = taosArrayGetP(inner, 0); - plan->execNode.inUse = 0; - strcpy(plan->execNode.epAddr[0].fqdn, "localhost"); - plan->execNode.epAddr[0].port = 6030; + plan->execNode.nodeId = 2; - plan->execNode.numOfEps = 1; + SEpSet* pEpSet = &plan->execNode.epset; + + pEpSet->inUse = 0; + pEpSet->numOfEps = 0; + addEpIntoEpSet(pEpSet, "localhost", 6030); if (schedulerConvertDagToTaskList(pDag, &pArray) < 0) { return -1; @@ -167,7 +169,7 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas CEp.status = 0; CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1; STaskInfo* pTaskInfo = taosArrayGet(pArray, i); - tConvertQueryAddrToEpSet(&CEp.epSet, &pTaskInfo->addr); + CEp.epSet = pTaskInfo->addr.epset; /*mDebug("subscribe convert ep %d %s %s %s %s %s\n", CEp.epSet.numOfEps, CEp.epSet.fqdn[0], CEp.epSet.fqdn[1], CEp.epSet.fqdn[2], CEp.epSet.fqdn[3], CEp.epSet.fqdn[4]);*/ CEp.vgId = pTaskInfo->addr.nodeId; CEp.qmsgLen = pTaskInfo->msg->contentLen; diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 04fedbb3ce..07895c35c8 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -424,9 +424,7 @@ SEpSet mndGetVgroupEpset(SMnode *pMnode, SVgObj *pVgroup) { epset.inUse = epset.numOfEps; } - epset.port[epset.numOfEps] = pDnode->port; - memcpy(&epset.fqdn[epset.numOfEps], pDnode->fqdn, TSDB_FQDN_LEN); - epset.numOfEps++; + addEpIntoEpSet(&epset, pDnode->fqdn, pDnode->port); mndReleaseDnode(pMnode, pDnode); } diff --git a/source/dnode/mnode/impl/test/db/db.cpp b/source/dnode/mnode/impl/test/db/db.cpp index 5d5947b644..964a483aac 100644 --- a/source/dnode/mnode/impl/test/db/db.cpp +++ b/source/dnode/mnode/impl/test/db/db.cpp @@ -277,9 +277,9 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { EXPECT_GT(pInfo->vgId, 0); EXPECT_EQ(pInfo->hashBegin, 0); EXPECT_EQ(pInfo->hashEnd, UINT32_MAX / 2 - 1); - EXPECT_EQ(pInfo->inUse, 0); - EXPECT_EQ(pInfo->numOfEps, 1); - SEpAddr* pAddr = &pInfo->epAddr[0]; + EXPECT_EQ(pInfo->epset.inUse, 0); + EXPECT_EQ(pInfo->epset.numOfEps, 1); + SEp* pAddr = &pInfo->epset.eps[0]; pAddr->port = htons(pAddr->port); EXPECT_EQ(pAddr->port, 9030); EXPECT_STREQ(pAddr->fqdn, "localhost"); @@ -293,9 +293,9 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { EXPECT_GT(pInfo->vgId, 0); EXPECT_EQ(pInfo->hashBegin, UINT32_MAX / 2); EXPECT_EQ(pInfo->hashEnd, UINT32_MAX); - EXPECT_EQ(pInfo->inUse, 0); - EXPECT_EQ(pInfo->numOfEps, 1); - SEpAddr* pAddr = &pInfo->epAddr[0]; + EXPECT_EQ(pInfo->epset.inUse, 0); + EXPECT_EQ(pInfo->epset.numOfEps, 1); + SEp* pAddr = &pInfo->epset.eps[0]; pAddr->port = htons(pAddr->port); EXPECT_EQ(pAddr->port, 9030); EXPECT_STREQ(pAddr->fqdn, "localhost"); diff --git a/source/dnode/mnode/impl/test/profile/profile.cpp b/source/dnode/mnode/impl/test/profile/profile.cpp index 4ad979cdd3..b245ab3c30 100644 --- a/source/dnode/mnode/impl/test/profile/profile.cpp +++ b/source/dnode/mnode/impl/test/profile/profile.cpp @@ -44,7 +44,7 @@ TEST_F(MndTestProfile, 01_ConnectMsg) { pRsp->acctId = htonl(pRsp->acctId); pRsp->clusterId = htobe64(pRsp->clusterId); pRsp->connId = htonl(pRsp->connId); - pRsp->epSet.port[0] = htons(pRsp->epSet.port[0]); + pRsp->epSet.eps[0].port = htons(pRsp->epSet.eps[0].port); EXPECT_EQ(pRsp->acctId, 1); EXPECT_GT(pRsp->clusterId, 0); @@ -53,8 +53,8 @@ TEST_F(MndTestProfile, 01_ConnectMsg) { EXPECT_EQ(pRsp->epSet.inUse, 0); EXPECT_EQ(pRsp->epSet.numOfEps, 1); - EXPECT_EQ(pRsp->epSet.port[0], 9031); - EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost"); + EXPECT_EQ(pRsp->epSet.eps[0].port, 9031); + EXPECT_STREQ(pRsp->epSet.eps[0].fqdn, "localhost"); connId = pRsp->connId; } diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index 2197fdfd62..dc05627374 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -65,7 +65,6 @@ int32_t ctgGetDBVgroupFromCache(struct SCatalog* pCatalog, const char *dbName, S int32_t ctgGetDBVgroupFromMnode(struct SCatalog* pCatalog, void *pRpc, const SEpSet* pMgmtEps, SBuildUseDBInput *input, SUseDbOutput *out) { char *msg = NULL; - SEpSet *pVnodeEpSet = NULL; int32_t msgLen = 0; ctgDebug("try to get db vgroup from mnode, db:%s", input->db); @@ -216,17 +215,6 @@ int32_t ctgGetTableTypeFromCache(struct SCatalog* pCatalog, const SName* pTableN return TSDB_CODE_SUCCESS; } - -void ctgGenEpSet(SEpSet *epSet, SVgroupInfo *vgroupInfo) { - epSet->inUse = 0; - epSet->numOfEps = vgroupInfo->numOfEps; - - for (int32_t i = 0; i < vgroupInfo->numOfEps; ++i) { - memcpy(&epSet->port[i], &vgroupInfo->epAddr[i].port, sizeof(epSet->port[i])); - memcpy(&epSet->fqdn[i], &vgroupInfo->epAddr[i].fqdn, sizeof(epSet->fqdn[i])); - } -} - int32_t ctgGetTableMetaFromMnodeImpl(struct SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, char* tbFullName, STableMetaOutput* output) { SBuildTableMetaInput bInput = {.vgId = 0, .dbName = NULL, .tableFullName = tbFullName}; char *msg = NULL; @@ -292,7 +280,6 @@ int32_t ctgGetTableMetaFromVnode(struct SCatalog* pCatalog, void *pTransporter, SBuildTableMetaInput bInput = {.vgId = vgroupInfo->vgId, .dbName = dbFullName, .tableFullName = (char *)tNameGetTableName(pTableName)}; char *msg = NULL; - SEpSet *pVnodeEpSet = NULL; int32_t msgLen = 0; int32_t code = queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_META)](&bInput, &msg, 0, &msgLen); @@ -308,10 +295,7 @@ int32_t ctgGetTableMetaFromVnode(struct SCatalog* pCatalog, void *pTransporter, }; SRpcMsg rpcRsp = {0}; - SEpSet epSet; - - ctgGenEpSet(&epSet, vgroupInfo); - rpcSendRecv(pTransporter, &epSet, &rpcMsg, &rpcRsp); + rpcSendRecv(pTransporter, &vgroupInfo->epset, &rpcMsg, &rpcRsp); if (TSDB_CODE_SUCCESS != rpcRsp.code) { if (CTG_TABLE_NOT_EXIST(rpcRsp.code)) { diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp index a01c3bcf5d..a15744a5c7 100644 --- a/source/libs/catalog/test/catalogTests.cpp +++ b/source/libs/catalog/test/catalogTests.cpp @@ -195,10 +195,10 @@ void ctgTestBuildDBVgroup(SDBVgroupInfo *dbVgroup) { vgInfo.vgId = i + 1; vgInfo.hashBegin = i * hashUnit; vgInfo.hashEnd = hashUnit * (i + 1) - 1; - vgInfo.numOfEps = i % TSDB_MAX_REPLICA + 1; - vgInfo.inUse = i % vgInfo.numOfEps; - for (int32_t n = 0; n < vgInfo.numOfEps; ++n) { - SEpAddr *addr = &vgInfo.epAddr[n]; + vgInfo.epset.numOfEps = i % TSDB_MAX_REPLICA + 1; + vgInfo.epset.inUse = i % vgInfo.epset.numOfEps; + for (int32_t n = 0; n < vgInfo.epset.numOfEps; ++n) { + SEp *addr = &vgInfo.epset.eps[n]; strcpy(addr->fqdn, "a0"); addr->port = htons(n + 22); } @@ -229,10 +229,10 @@ void ctgTestPrepareDbVgroups(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcM vg->vgId = htonl(i + 1); vg->hashBegin = htonl(i * hashUnit); vg->hashEnd = htonl(hashUnit * (i + 1) - 1); - vg->numOfEps = i % TSDB_MAX_REPLICA + 1; - vg->inUse = i % vg->numOfEps; - for (int32_t n = 0; n < vg->numOfEps; ++n) { - SEpAddr *addr = &vg->epAddr[n]; + vg->epset.numOfEps = i % TSDB_MAX_REPLICA + 1; + vg->epset.inUse = i % vg->epset.numOfEps; + for (int32_t n = 0; n < vg->epset.numOfEps; ++n) { + SEp *addr = &vg->epset.eps[n]; strcpy(addr->fqdn, "a0"); addr->port = htons(n + 22); } @@ -693,7 +693,7 @@ TEST(tableMeta, normalTable) { code = catalogGetTableHashVgroup(pCtg, mockPointer, (const SEpSet *)mockPointer, &n, &vgInfo); ASSERT_EQ(code, 0); ASSERT_EQ(vgInfo.vgId, 8); - ASSERT_EQ(vgInfo.numOfEps, 3); + ASSERT_EQ(vgInfo.epset.numOfEps, 3); ctgTestSetPrepareTableMeta(); @@ -983,7 +983,7 @@ TEST(tableDistVgroup, normalTable) { ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1); vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0); ASSERT_EQ(vgInfo->vgId, 8); - ASSERT_EQ(vgInfo->numOfEps, 3); + ASSERT_EQ(vgInfo->epset.numOfEps, 3); catalogDestroy(); } @@ -1015,7 +1015,7 @@ TEST(tableDistVgroup, childTableCase) { ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1); vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0); ASSERT_EQ(vgInfo->vgId, 9); - ASSERT_EQ(vgInfo->numOfEps, 4); + ASSERT_EQ(vgInfo->epset.numOfEps, 4); catalogDestroy(); } @@ -1046,13 +1046,13 @@ TEST(tableDistVgroup, superTableCase) { ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 10); vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0); ASSERT_EQ(vgInfo->vgId, 1); - ASSERT_EQ(vgInfo->numOfEps, 1); + ASSERT_EQ(vgInfo->epset.numOfEps, 1); vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 1); ASSERT_EQ(vgInfo->vgId, 2); - ASSERT_EQ(vgInfo->numOfEps, 2); + ASSERT_EQ(vgInfo->epset.numOfEps, 2); vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 2); ASSERT_EQ(vgInfo->vgId, 3); - ASSERT_EQ(vgInfo->numOfEps, 3); + ASSERT_EQ(vgInfo->epset.numOfEps, 3); catalogDestroy(); } @@ -1088,14 +1088,14 @@ TEST(dbVgroup, getSetDbVgroupCase) { code = catalogGetTableHashVgroup(pCtg, mockPointer, (const SEpSet *)mockPointer, &n, &vgInfo); ASSERT_EQ(code, 0); ASSERT_EQ(vgInfo.vgId, 8); - ASSERT_EQ(vgInfo.numOfEps, 3); + ASSERT_EQ(vgInfo.epset.numOfEps, 3); code = catalogGetTableDistVgroup(pCtg, mockPointer, (const SEpSet *)mockPointer, &n, &vgList); ASSERT_EQ(code, 0); ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1); pvgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0); ASSERT_EQ(pvgInfo->vgId, 8); - ASSERT_EQ(pvgInfo->numOfEps, 3); + ASSERT_EQ(pvgInfo->epset.numOfEps, 3); taosArrayDestroy(vgList); ctgTestBuildDBVgroup(&dbVgroup); @@ -1105,14 +1105,14 @@ TEST(dbVgroup, getSetDbVgroupCase) { code = catalogGetTableHashVgroup(pCtg, mockPointer, (const SEpSet *)mockPointer, &n, &vgInfo); ASSERT_EQ(code, 0); ASSERT_EQ(vgInfo.vgId, 7); - ASSERT_EQ(vgInfo.numOfEps, 2); + ASSERT_EQ(vgInfo.epset.numOfEps, 2); code = catalogGetTableDistVgroup(pCtg, mockPointer, (const SEpSet *)mockPointer, &n, &vgList); ASSERT_EQ(code, 0); ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1); pvgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0); ASSERT_EQ(pvgInfo->vgId, 8); - ASSERT_EQ(pvgInfo->numOfEps, 3); + ASSERT_EQ(pvgInfo->epset.numOfEps, 3); taosArrayDestroy(vgList); catalogDestroy(); diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 8e30c0d711..df7341dc35 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -5163,14 +5163,9 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) { SDownstreamSource* pSource = taosArrayGet(pExchangeInfo->pSources, pExchangeInfo->current); - SEpSet epSet = {0}; - epSet.numOfEps = pSource->addr.numOfEps; - epSet.port[0] = pSource->addr.epAddr[0].port; - tstrncpy(epSet.fqdn[0], pSource->addr.epAddr[0].fqdn, tListLen(epSet.fqdn[0])); - int64_t startTs = taosGetTimestampUs(); qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", %d/%" PRIzu, - GET_TASKID(pTaskInfo), pSource->addr.nodeId, epSet.fqdn[0], pSource->taskId, pExchangeInfo->current, totalSources); + GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epset.eps[0].fqdn, pSource->taskId, pExchangeInfo->current, totalSources); pMsg->header.vgId = htonl(pSource->addr.nodeId); pMsg->sId = htobe64(pSource->schedId); @@ -5192,7 +5187,7 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) { pMsgSendInfo->fp = loadRemoteDataCallback; int64_t transporterId = 0; - int32_t code = asyncSendMsgToServer(pExchangeInfo->pTransporter, &epSet, &transporterId, pMsgSendInfo); + int32_t code = asyncSendMsgToServer(pExchangeInfo->pTransporter, &pSource->addr.epset, &transporterId, pMsgSendInfo); tsem_wait(&pExchangeInfo->ready); SRetrieveTableRsp* pRsp = pExchangeInfo->pRsp; diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index 0a2f2b20f2..a56a6524fc 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -3644,6 +3644,7 @@ int32_t evaluateSqlNode(SSqlNode* pNode, int32_t tsPrecision, SMsgBuf* pMsgBuf) return TSDB_CODE_SUCCESS; } +//TODO remove it int32_t setTableVgroupList(SParseContext *pCtx, SName* name, SVgroupsInfo **pVgList) { SArray* vgroupList = NULL; int32_t code = catalogGetTableDistVgroup(pCtx->pCatalog, pCtx->pTransporter, &pCtx->mgmtEpSet, name, &vgroupList); @@ -3651,21 +3652,17 @@ int32_t setTableVgroupList(SParseContext *pCtx, SName* name, SVgroupsInfo **pVgL return code; } - int32_t vgroupNum = taosArrayGetSize(vgroupList); + size_t vgroupNum = taosArrayGetSize(vgroupList); - SVgroupsInfo *vgList = calloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupMsg) * vgroupNum); - + SVgroupsInfo *vgList = calloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo) * vgroupNum); vgList->numOfVgroups = vgroupNum; for (int32_t i = 0; i < vgroupNum; ++i) { SVgroupInfo *vg = taosArrayGet(vgroupList, i); - vgList->vgroups[i].vgId = vg->vgId; - vgList->vgroups[i].numOfEps = vg->numOfEps; - memcpy(vgList->vgroups[i].epAddr, vg->epAddr, sizeof(vgList->vgroups[i].epAddr)); + vgList->vgroups[i] = *vg; } *pVgList = vgList; - taosArrayDestroy(vgroupList); return TSDB_CODE_SUCCESS; diff --git a/source/libs/parser/src/dCDAstProcess.c b/source/libs/parser/src/dCDAstProcess.c index 06a9a3d16e..3ae89bca0a 100644 --- a/source/libs/parser/src/dCDAstProcess.c +++ b/source/libs/parser/src/dCDAstProcess.c @@ -58,13 +58,7 @@ static int32_t setShowInfo(SShowInfo* pShowInfo, SParseContext* pCtx, void** out SVgroupInfo* info = taosArrayGet(array, 0); pShowReq->head.vgId = htonl(info->vgId); - pEpSet->numOfEps = info->numOfEps; - pEpSet->inUse = info->inUse; - - for (int32_t i = 0; i < pEpSet->numOfEps; ++i) { - strncpy(pEpSet->fqdn[i], info->epAddr[i].fqdn, tListLen(pEpSet->fqdn[i])); - pEpSet->port[i] = info->epAddr[i].port; - } + *pEpSet = info->epset; *outputLen = sizeof(SVShowTablesReq); *output = pShowReq; diff --git a/source/libs/parser/src/parserUtil.c b/source/libs/parser/src/parserUtil.c index a87e138ed0..71ee53dfea 100644 --- a/source/libs/parser/src/parserUtil.c +++ b/source/libs/parser/src/parserUtil.c @@ -1426,35 +1426,6 @@ bool isQueryWithLimit(SQueryStmtInfo* pQueryInfo) { return false; } -SVgroupsInfo* vgroupInfoClone(SVgroupsInfo *vgroupList) { - if (vgroupList == NULL) { - return NULL; - } - - size_t size = sizeof(SVgroupsInfo) + sizeof(SVgroupMsg) * vgroupList->numOfVgroups; - SVgroupsInfo* pNew = malloc(size); - if (pNew == NULL) { - return NULL; - } - - pNew->numOfVgroups = vgroupList->numOfVgroups; - - for(int32_t i = 0; i < vgroupList->numOfVgroups; ++i) { - SVgroupMsg* pNewVInfo = &pNew->vgroups[i]; - - SVgroupMsg* pvInfo = &vgroupList->vgroups[i]; - pNewVInfo->vgId = pvInfo->vgId; - pNewVInfo->numOfEps = pvInfo->numOfEps; - - for(int32_t j = 0; j < pvInfo->numOfEps; ++j) { - pNewVInfo->epAddr[j].port = pvInfo->epAddr[j].port; - tstrncpy(pNewVInfo->epAddr[j].fqdn, pvInfo->epAddr[j].fqdn, TSDB_FQDN_LEN); - } - } - - return pNew; -} - void* vgroupInfoClear(SVgroupsInfo *vgroupList) { if (vgroupList == NULL) { return NULL; @@ -1505,19 +1476,6 @@ STableMeta* tableMetaDup(const STableMeta* pTableMeta) { return p; } -SVgroupsInfo* vgroupsInfoDup(SVgroupsInfo* pVgroupsInfo) { - assert(pVgroupsInfo != NULL); - - size_t size = sizeof(SVgroupMsg) * pVgroupsInfo->numOfVgroups + sizeof(SVgroupsInfo); - SVgroupsInfo* pInfo = calloc(1, size); - pInfo->numOfVgroups = pVgroupsInfo->numOfVgroups; - for (int32_t m = 0; m < pVgroupsInfo->numOfVgroups; ++m) { - memcpy(&pInfo->vgroups[m], &pVgroupsInfo->vgroups[m], sizeof(SVgroupMsg)); - } - - return pInfo; -} - int32_t getNumOfOutput(SFieldInfo* pFieldInfo) { return pFieldInfo->numOfOutput; } diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp index e2b8766700..00d64bd12a 100644 --- a/source/libs/parser/test/mockCatalogService.cpp +++ b/source/libs/parser/test/mockCatalogService.cpp @@ -15,6 +15,7 @@ #include "mockCatalogService.h" +#include "tep.h" #include #include #include @@ -39,7 +40,16 @@ public: virtual TableBuilder& setVgid(int16_t vgid) { schema()->vgId = vgid; - meta_->vgs.emplace_back(SVgroupInfo{.vgId = vgid, .hashBegin = 0, .hashEnd = 0, .inUse = 0, .numOfEps = 3, .epAddr = {{"dnode_1", 6030}, {"dnode_2", 6030}, {"dnode_3", 6030}}}); + + SVgroupInfo vgroup = {.vgId = vgid, .hashBegin = 0, .hashEnd = 0, }; + + vgroup.epset.eps[0] = (SEp){"dnode_1", 6030}; + vgroup.epset.eps[1] = (SEp){"dnode_2", 6030}; + vgroup.epset.eps[2] = (SEp){"dnode_3", 6030}; + vgroup.epset.inUse = 0; + vgroup.epset.numOfEps = 3; + + meta_->vgs.emplace_back(vgroup); return *this; } @@ -112,9 +122,7 @@ public: int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const { // todo vgInfo->vgId = 1; - vgInfo->numOfEps = 1; - vgInfo->epAddr[0].port = 6030; - strcpy(vgInfo->epAddr[0].fqdn, "node1"); + addEpIntoEpSet(&vgInfo->epset, "node1", 6030); return 0; } @@ -133,9 +141,16 @@ public: meta_[db][tbname].reset(new MockTableMeta()); meta_[db][tbname]->schema.reset(table.release()); meta_[db][tbname]->schema->uid = id_++; - meta_[db][tbname]->vgs.emplace_back((SVgroupInfo){.vgId = vgid, .hashBegin = 0, .hashEnd = 0, .inUse = 0, .numOfEps = 3, .epAddr = {{"dnode_1", 6030}, {"dnode_2", 6030}, {"dnode_3", 6030}}}); + + SVgroupInfo vgroup = {.vgId = vgid, .hashBegin = 0, .hashEnd = 0,}; + addEpIntoEpSet(&vgroup.epset, "dnode_1", 6030); + addEpIntoEpSet(&vgroup.epset, "dnode_2", 6030); + addEpIntoEpSet(&vgroup.epset, "dnode_3", 6030); + vgroup.epset.inUse = 0; + + meta_[db][tbname]->vgs.emplace_back(vgroup); // super table - meta_[db][stbname]->vgs.emplace_back((SVgroupInfo){.vgId = vgid, .hashBegin = 0, .hashEnd = 0, .inUse = 0, .numOfEps = 3, .epAddr = {{"dnode_1", 6030}, {"dnode_2", 6030}, {"dnode_3", 6030}}}); + meta_[db][stbname]->vgs.emplace_back(vgroup); } void showTables() const { diff --git a/source/libs/planner/src/physicalPlan.c b/source/libs/planner/src/physicalPlan.c index 12c0d0780b..697504681f 100644 --- a/source/libs/planner/src/physicalPlan.c +++ b/source/libs/planner/src/physicalPlan.c @@ -251,24 +251,9 @@ static SSubplan* initSubplan(SPlanContext* pCxt, int32_t type) { return subplan; } -static void vgroupInfoToEpSet(const SVgroupInfo* vg, SQueryNodeAddr* execNode) { - execNode->nodeId = vg->vgId; - execNode->inUse = vg->inUse; - execNode->numOfEps = vg->numOfEps; - for (int8_t i = 0; i < vg->numOfEps; ++i) { - execNode->epAddr[i] = vg->epAddr[i]; - } - return; -} - -static void vgroupMsgToEpSet(const SVgroupMsg* vg, SQueryNodeAddr* execNode) { - execNode->nodeId = vg->vgId; - execNode->inUse = 0; // todo - execNode->numOfEps = vg->numOfEps; - for (int8_t i = 0; i < vg->numOfEps; ++i) { - execNode->epAddr[i] = vg->epAddr[i]; - } - return; +static void vgroupInfoToNodeAddr(const SVgroupInfo* vg, SQueryNodeAddr* pNodeAddr) { + pNodeAddr->nodeId = vg->vgId; + pNodeAddr->epset = vg->epset; } static uint64_t splitSubplanByTable(SPlanContext* pCxt, SQueryPlanNode* pPlanNode, SQueryTableInfo* pTableInfo) { @@ -277,7 +262,8 @@ static uint64_t splitSubplanByTable(SPlanContext* pCxt, SQueryPlanNode* pPlanNod STORE_CURRENT_SUBPLAN(pCxt); SSubplan* subplan = initSubplan(pCxt, QUERY_TYPE_SCAN); subplan->msgType = TDMT_VND_QUERY; - vgroupMsgToEpSet(&(pTableInfo->pMeta->vgroupList->vgroups[i]), &subplan->execNode); + + vgroupInfoToNodeAddr(&(pTableInfo->pMeta->vgroupList->vgroups[i]), &subplan->execNode); subplan->pNode = createMultiTableScanNode(pPlanNode, pTableInfo); subplan->pDataSink = createDataDispatcher(pCxt, pPlanNode, subplan->pNode); RECOVERY_CURRENT_SUBPLAN(pCxt); @@ -297,11 +283,12 @@ static bool needMultiNodeScan(SQueryTableInfo* pTable) { return (TSDB_SUPER_TABLE == pTable->pMeta->pTableMeta->tableType); } -static SPhyNode* createSingleTableScanNode(SQueryPlanNode* pPlanNode, SQueryTableInfo* pTable, SSubplan* subplan) { - vgroupMsgToEpSet(&(pTable->pMeta->vgroupList->vgroups[0]), &subplan->execNode); - +// TODO: the SVgroupInfo index +static SPhyNode* createSingleTableScanNode(SQueryPlanNode* pPlanNode, SQueryTableInfo* pTableInfo, SSubplan* subplan) { + SVgroupsInfo* pVgroupsInfo = pTableInfo->pMeta->vgroupList; + vgroupInfoToNodeAddr(&(pVgroupsInfo->vgroups[0]), &subplan->execNode); int32_t type = (pPlanNode->info.type == QNODE_TABLESCAN)? OP_TableScan:OP_StreamScan; - return createUserTableScanNode(pPlanNode, pTable, type); + return createUserTableScanNode(pPlanNode, pTableInfo, type); } static SPhyNode* createTableScanNode(SPlanContext* pCxt, SQueryPlanNode* pPlanNode) { @@ -374,7 +361,7 @@ static void splitModificationOpSubPlan(SPlanContext* pCxt, SQueryPlanNode* pPlan SSubplan* subplan = initSubplan(pCxt, QUERY_TYPE_MODIFY); SVgDataBlocks* blocks = (SVgDataBlocks*)taosArrayGetP(pPayload->payload, i); - vgroupInfoToEpSet(&blocks->vg, &subplan->execNode); + subplan->execNode.epset = blocks->vg.epset; subplan->pDataSink = createDataInserter(pCxt, blocks, NULL); subplan->pNode = NULL; subplan->type = QUERY_TYPE_MODIFY; diff --git a/source/libs/planner/src/physicalPlanJson.c b/source/libs/planner/src/physicalPlanJson.c index 4fbec534f6..8d58b262aa 100644 --- a/source/libs/planner/src/physicalPlanJson.c +++ b/source/libs/planner/src/physicalPlanJson.c @@ -736,7 +736,7 @@ static const char* jkEpAddrFqdn = "Fqdn"; static const char* jkEpAddrPort = "Port"; static bool epAddrToJson(const void* obj, cJSON* json) { - const SEpAddr* ep = (const SEpAddr*)obj; + const SEp* ep = (const SEp*)obj; bool res = cJSON_AddStringToObject(json, jkEpAddrFqdn, ep->fqdn); if (res) { res = cJSON_AddNumberToObject(json, jkEpAddrPort, ep->port); @@ -745,7 +745,7 @@ static bool epAddrToJson(const void* obj, cJSON* json) { } static bool epAddrFromJson(const cJSON* json, void* obj) { - SEpAddr* ep = (SEpAddr*)obj; + SEp* ep = (SEp*)obj; copyString(json, jkEpAddrFqdn, ep->fqdn); ep->port = getNumber(json, jkEpAddrPort); return true; @@ -763,11 +763,11 @@ static bool queryNodeAddrToJson(const void* obj, cJSON* json) { bool res = cJSON_AddNumberToObject(json, jkNodeAddrId, pAddr->nodeId); if (res) { - res = cJSON_AddNumberToObject(json, jkNodeAddrInUse, pAddr->inUse); + res = cJSON_AddNumberToObject(json, jkNodeAddrInUse, pAddr->epset.inUse); } if (res) { - res = addRawArray(json, jkNodeAddrEpAddrs, epAddrToJson, pAddr->epAddr, sizeof(SEpAddr), pAddr->numOfEps); + res = addRawArray(json, jkNodeAddrEpAddrs, epAddrToJson, pAddr->epset.eps, sizeof(SEp), pAddr->epset.numOfEps); } return res; } @@ -776,11 +776,11 @@ static bool queryNodeAddrFromJson(const cJSON* json, void* obj) { SQueryNodeAddr* pAddr = (SQueryNodeAddr*) obj; pAddr->nodeId = getNumber(json, jkNodeAddrId); - pAddr->inUse = getNumber(json, jkNodeAddrInUse); + pAddr->epset.inUse = getNumber(json, jkNodeAddrInUse); int32_t numOfEps = 0; - bool res = fromRawArray(json, jkNodeAddrEpAddrs, epAddrFromJson, pAddr->epAddr, sizeof(SEpAddr), &numOfEps); - pAddr->numOfEps = numOfEps; + bool res = fromRawArray(json, jkNodeAddrEpAddrs, epAddrFromJson, pAddr->epset.eps, sizeof(SEp), &numOfEps); + pAddr->epset.numOfEps = numOfEps; return res; } diff --git a/source/libs/planner/test/phyPlanTests.cpp b/source/libs/planner/test/phyPlanTests.cpp index edf5fa5a81..f4bdf57572 100644 --- a/source/libs/planner/test/phyPlanTests.cpp +++ b/source/libs/planner/test/phyPlanTests.cpp @@ -124,12 +124,10 @@ private: } void copyStorageMeta(SVgroupsInfo** dst, const std::vector& src) { - *dst = (SVgroupsInfo*)myCalloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupMsg) * src.size()); + *dst = (SVgroupsInfo*)myCalloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo) * src.size()); (*dst)->numOfVgroups = src.size(); for (int32_t i = 0; i < src.size(); ++i) { - (*dst)->vgroups[i].vgId = src[i].vgId; - (*dst)->vgroups[i].numOfEps = src[i].numOfEps; - memcpy((*dst)->vgroups[i].epAddr, src[i].epAddr, src[i].numOfEps); + (*dst)->vgroups[i] = src[i]; } } diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c index 52e632ffbb..38ce005094 100644 --- a/source/libs/qcom/src/querymsg.c +++ b/source/libs/qcom/src/querymsg.c @@ -127,8 +127,8 @@ int32_t queryProcessUseDBRsp(void* output, char *msg, int32_t msgSize) { pRsp->vgroupInfo[i].hashBegin = ntohl(pRsp->vgroupInfo[i].hashBegin); pRsp->vgroupInfo[i].hashEnd = ntohl(pRsp->vgroupInfo[i].hashEnd); - for (int32_t n = 0; n < pRsp->vgroupInfo[i].numOfEps; ++n) { - pRsp->vgroupInfo[i].epAddr[n].port = ntohs(pRsp->vgroupInfo[i].epAddr[n].port); + for (int32_t n = 0; n < pRsp->vgroupInfo[i].epset.numOfEps; ++n) { + pRsp->vgroupInfo[i].epset.eps[n].port = ntohs(pRsp->vgroupInfo[i].epset.eps[n].port); } if (0 != taosHashPut(pOut->dbVgroup.vgInfo, &pRsp->vgroupInfo[i].vgId, sizeof(pRsp->vgroupInfo[i].vgId), &pRsp->vgroupInfo[i], sizeof(pRsp->vgroupInfo[i]))) { diff --git a/source/libs/scheduler/src/scheduler.c b/source/libs/scheduler/src/scheduler.c index 223fa300df..7a843765b6 100644 --- a/source/libs/scheduler/src/scheduler.c +++ b/source/libs/scheduler/src/scheduler.c @@ -417,13 +417,13 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) { SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY); } - if (pTask->plan->execNode.numOfEps > 0) { + if (pTask->plan->execNode.epset.numOfEps > 0) { if (NULL == taosArrayPush(pTask->candidateAddrs, &pTask->plan->execNode)) { SCH_TASK_ELOG("taosArrayPush execNode to candidate addrs failed, errno:%d", errno); SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY); } - SCH_TASK_DLOG("use execNode from plan as candidate addr, numOfEps:%d", pTask->plan->execNode.numOfEps); + SCH_TASK_DLOG("use execNode from plan as candidate addr, numOfEps:%d", pTask->plan->execNode.epset.numOfEps); return TSDB_CODE_SUCCESS; } @@ -446,7 +446,7 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) { } if (addNum <= 0) { - SCH_TASK_ELOG("no available execNode as candidate addr, nodeNum:%d", nodeNum); + SCH_TASK_ELOG("no available execNode as candidates, nodeNum:%d", nodeNum); return TSDB_CODE_QRY_INVALID_INPUT; } @@ -1050,31 +1050,19 @@ _return: SCH_RET(code); } -void schConvertAddrToEpSet(SQueryNodeAddr *addr, SEpSet *epSet) { - epSet->inUse = addr->inUse; - epSet->numOfEps = addr->numOfEps; - - for (int8_t i = 0; i < epSet->numOfEps; ++i) { - strncpy(epSet->fqdn[i], addr->epAddr[i].fqdn, sizeof(addr->epAddr[i].fqdn)); - epSet->port[i] = addr->epAddr[i].port; - } -} - int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, int32_t msgType) { uint32_t msgSize = 0; void *msg = NULL; int32_t code = 0; bool isCandidateAddr = false; - SEpSet epSet; - if (NULL == addr) { addr = taosArrayGet(pTask->candidateAddrs, atomic_load_8(&pTask->candidateIdx)); isCandidateAddr = true; } - schConvertAddrToEpSet(addr, &epSet); - + SEpSet epSet = addr->epset; + switch (msgType) { case TDMT_VND_CREATE_TABLE: case TDMT_VND_SUBMIT: { @@ -1218,8 +1206,6 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) { SCH_TASK_ELOG("subplanToString error, code:%x, msg:%p, len:%d", code, pTask->msg, pTask->msgLen); SCH_ERR_JRET(code); } - -// printf("physical plan:%s\n", pTask->msg); } SCH_ERR_JRET(schSetTaskCandidateAddrs(pJob, pTask)); @@ -1300,7 +1286,7 @@ void schDropJobAllTasks(SSchJob *pJob) { int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** job, bool syncSchedule) { qDebug("QID:0x%"PRIx64" job started", pDag->queryId); - if (pNodeList && taosArrayGetSize(pNodeList) <= 0) { + if (pNodeList == NULL || (pNodeList && taosArrayGetSize(pNodeList) <= 0)) { qDebug("QID:0x%"PRIx64" input exec nodeList is empty", pDag->queryId); } diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp index 58714c51cc..6e44d99c15 100644 --- a/source/libs/scheduler/test/schedulerTests.cpp +++ b/source/libs/scheduler/test/schedulerTests.cpp @@ -29,7 +29,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wwrite-strings" -#pragma GCC diagnostic ignored "-Wliteral-suffix" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wsign-compare" @@ -92,11 +91,11 @@ void schtBuildQueryDag(SQueryDag *dag) { scanPlan->id.templateId = 0x0000000000000002; scanPlan->id.subplanId = 0x0000000000000003; scanPlan->type = QUERY_TYPE_SCAN; - scanPlan->execNode.numOfEps = 1; + scanPlan->execNode.nodeId = 1; - scanPlan->execNode.inUse = 0; - scanPlan->execNode.epAddr[0].port = 6030; - strcpy(scanPlan->execNode.epAddr[0].fqdn, "ep0"); + scanPlan->execNode.epset.inUse = 0; + addEpIntoEpSet(&scanPlan->execNode.epset, "ep0", 6030); + scanPlan->pChildren = NULL; scanPlan->level = 1; scanPlan->pParents = taosArrayInit(1, POINTER_BYTES); @@ -108,7 +107,8 @@ void schtBuildQueryDag(SQueryDag *dag) { mergePlan->id.subplanId = 0x5555555555; mergePlan->type = QUERY_TYPE_MERGE; mergePlan->level = 0; - mergePlan->execNode.numOfEps = 0; + mergePlan->execNode.epset.numOfEps = 0; + mergePlan->pChildren = taosArrayInit(1, POINTER_BYTES); mergePlan->pParents = NULL; mergePlan->pNode = (SPhyNode*)calloc(1, sizeof(SPhyNode)); @@ -144,11 +144,11 @@ void schtBuildInsertDag(SQueryDag *dag) { insertPlan[0].id.subplanId = 0x0000000000000004; insertPlan[0].type = QUERY_TYPE_MODIFY; insertPlan[0].level = 0; - insertPlan[0].execNode.numOfEps = 1; + insertPlan[0].execNode.nodeId = 1; - insertPlan[0].execNode.inUse = 0; - insertPlan[0].execNode.epAddr[0].port = 6030; - strcpy(insertPlan[0].execNode.epAddr[0].fqdn, "ep0"); + insertPlan[0].execNode.epset.inUse = 0; + addEpIntoEpSet(&insertPlan[0].execNode.epset, "ep0", 6030); + insertPlan[0].pChildren = NULL; insertPlan[0].pParents = NULL; insertPlan[0].pNode = NULL; @@ -160,11 +160,11 @@ void schtBuildInsertDag(SQueryDag *dag) { insertPlan[1].id.subplanId = 0x0000000000000005; insertPlan[1].type = QUERY_TYPE_MODIFY; insertPlan[1].level = 0; - insertPlan[1].execNode.numOfEps = 1; + insertPlan[1].execNode.nodeId = 1; - insertPlan[1].execNode.inUse = 1; - insertPlan[1].execNode.epAddr[0].port = 6030; - strcpy(insertPlan[1].execNode.epAddr[0].fqdn, "ep1"); + insertPlan[1].execNode.epset.inUse = 0; + addEpIntoEpSet(&insertPlan[1].execNode.epset, "ep0", 6030); + insertPlan[1].pChildren = NULL; insertPlan[1].pParents = NULL; insertPlan[1].pNode = NULL; @@ -371,9 +371,9 @@ void* schtRunJobThread(void *aa) { while (!schtTestStop) { schtBuildQueryDag(&dag); - SArray *qnodeList = taosArrayInit(1, sizeof(SEpAddr)); + SArray *qnodeList = taosArrayInit(1, sizeof(SEp)); - SEpAddr qnodeAddr = {0}; + SEp qnodeAddr = {0}; strcpy(qnodeAddr.fqdn, "qnode0.ep"); qnodeAddr.port = 6031; taosArrayPush(qnodeList, &qnodeAddr); @@ -523,9 +523,9 @@ TEST(queryTest, normalCase) { schtInitLogFile(); - SArray *qnodeList = taosArrayInit(1, sizeof(SEpAddr)); + SArray *qnodeList = taosArrayInit(1, sizeof(SEp)); - SEpAddr qnodeAddr = {0}; + SEp qnodeAddr = {0}; strcpy(qnodeAddr.fqdn, "qnode0.ep"); qnodeAddr.port = 6031; taosArrayPush(qnodeList, &qnodeAddr); @@ -627,9 +627,9 @@ TEST(insertTest, normalCase) { schtInitLogFile(); - SArray *qnodeList = taosArrayInit(1, sizeof(SEpAddr)); + SArray *qnodeList = taosArrayInit(1, sizeof(SEp)); - SEpAddr qnodeAddr = {0}; + SEp qnodeAddr = {0}; strcpy(qnodeAddr.fqdn, "qnode0.ep"); qnodeAddr.port = 6031; taosArrayPush(qnodeList, &qnodeAddr); diff --git a/source/libs/transport/src/rpcMain.c b/source/libs/transport/src/rpcMain.c index b0927e9ecf..a286482fc1 100644 --- a/source/libs/transport/src/rpcMain.c +++ b/source/libs/transport/src/rpcMain.c @@ -814,9 +814,9 @@ static SRpcConn *rpcSetupConnToServer(SRpcReqContext *pContext) { SEpSet * pEpSet = &pContext->epSet; pConn = - rpcGetConnFromCache(pRpc->pCache, pEpSet->fqdn[pEpSet->inUse], pEpSet->port[pEpSet->inUse], pContext->connType); + rpcGetConnFromCache(pRpc->pCache, pEpSet->eps[pEpSet->inUse].fqdn, pEpSet->eps[pEpSet->inUse].port, pContext->connType); if (pConn == NULL || pConn->user[0] == 0) { - pConn = rpcOpenConn(pRpc, pEpSet->fqdn[pEpSet->inUse], pEpSet->port[pEpSet->inUse], pContext->connType); + pConn = rpcOpenConn(pRpc, pEpSet->eps[pEpSet->inUse].fqdn, pEpSet->eps[pEpSet->inUse].port, pContext->connType); } if (pConn) { @@ -1188,7 +1188,7 @@ static void rpcProcessIncomingMsg(SRpcConn *pConn, SRpcHead *pHead, SRpcReqConte // for UDP, port may be changed by server, the port in epSet shall be used for cache if (pHead->code != TSDB_CODE_RPC_TOO_SLOW) { - rpcAddConnIntoCache(pRpc->pCache, pConn, pConn->peerFqdn, pContext->epSet.port[pContext->epSet.inUse], + rpcAddConnIntoCache(pRpc->pCache, pConn, pConn->peerFqdn, pContext->epSet.eps[pContext->epSet.inUse].port, pConn->connType); } else { rpcCloseConn(pConn); @@ -1202,9 +1202,9 @@ static void rpcProcessIncomingMsg(SRpcConn *pConn, SRpcHead *pHead, SRpcReqConte tDebug("%s, redirect is received, numOfEps:%d inUse:%d", pConn->info, pContext->epSet.numOfEps, pContext->epSet.inUse); for (int i = 0; i < pContext->epSet.numOfEps; ++i) { - pContext->epSet.port[i] = htons(pContext->epSet.port[i]); - tDebug("%s, redirect is received, index:%d ep:%s:%u", pConn->info, i, pContext->epSet.fqdn[i], - pContext->epSet.port[i]); + pContext->epSet.eps[i].port = htons(pContext->epSet.eps[i].port); + tDebug("%s, redirect is received, index:%d ep:%s:%u", pConn->info, i, pContext->epSet.eps[i].fqdn, + pContext->epSet.eps[i].port); } } rpcSendReqToServer(pRpc, pContext); diff --git a/source/libs/transport/test/rclient.c b/source/libs/transport/test/rclient.c index 84814f39fc..4c1fd0c327 100644 --- a/source/libs/transport/test/rclient.c +++ b/source/libs/transport/test/rclient.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include #include "os.h" #include "rpcLog.h" #include "taoserror.h" @@ -86,12 +87,9 @@ int main(int argc, char *argv[]) { pthread_attr_t thattr; // server info - epSet.numOfEps = 1; epSet.inUse = 0; - epSet.port[0] = 7000; - epSet.port[1] = 7000; - strcpy(epSet.fqdn[0], serverIp); - strcpy(epSet.fqdn[1], "192.168.0.1"); + addEpIntoEpSet(&epSet, serverIp, 7000); + addEpIntoEpSet(&epSet, "192.168.0.1", 7000); // client info memset(&rpcInit, 0, sizeof(rpcInit)); @@ -109,9 +107,9 @@ int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "-p") == 0 && i < argc - 1) { - epSet.port[0] = atoi(argv[++i]); + epSet.eps[0].port = atoi(argv[++i]); } else if (strcmp(argv[i], "-i") == 0 && i < argc - 1) { - tstrncpy(epSet.fqdn[0], argv[++i], sizeof(epSet.fqdn[0])); + tstrncpy(epSet.eps[0].fqdn, argv[++i], sizeof(epSet.eps[0].fqdn)); } else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) { rpcInit.numOfThreads = atoi(argv[++i]); } else if (strcmp(argv[i], "-m") == 0 && i < argc - 1) { @@ -135,7 +133,7 @@ int main(int argc, char *argv[]) { } else { printf("\nusage: %s [options] \n", argv[0]); printf(" [-i ip]: first server IP address, default is:%s\n", serverIp); - printf(" [-p port]: server port number, default is:%d\n", epSet.port[0]); + printf(" [-p port]: server port number, default is:%d\n", epSet.eps[0].port); printf(" [-t threads]: number of rpc threads, default is:%d\n", rpcInit.numOfThreads); printf(" [-s sessions]: number of rpc sessions, default is:%d\n", rpcInit.sessions); printf(" [-m msgSize]: message body size, default is:%d\n", msgSize); From 101568a928da538f5115c8aa7658b8da86eaa5f4 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Wed, 26 Jan 2022 01:03:27 -0500 Subject: [PATCH 14/37] TD-13197 SELECT statement syntax definition --- source/libs/parser/inc/astCreateContext.h | 43 ++ source/libs/parser/inc/astCreateFuncs.h | 18 +- source/libs/parser/inc/new_sql.y | 43 +- .../parser/inc/{astCreater.h => parserImpl.h} | 12 +- source/libs/parser/src/astCreateContext.c | 40 + source/libs/parser/src/astCreateFuncs.c | 91 +++ source/libs/parser/src/new_sql.c | 709 +++++++++--------- .../parser/src/{astCreater.c => parserImpl.c} | 83 +- source/libs/parser/test/newParserTest.cpp | 2 +- 9 files changed, 559 insertions(+), 482 deletions(-) create mode 100644 source/libs/parser/inc/astCreateContext.h rename source/libs/parser/inc/{astCreater.h => parserImpl.h} (89%) create mode 100644 source/libs/parser/src/astCreateContext.c create mode 100644 source/libs/parser/src/astCreateFuncs.c rename source/libs/parser/src/{astCreater.c => parserImpl.c} (59%) diff --git a/source/libs/parser/inc/astCreateContext.h b/source/libs/parser/inc/astCreateContext.h new file mode 100644 index 0000000000..dcdc6a045b --- /dev/null +++ b/source/libs/parser/inc/astCreateContext.h @@ -0,0 +1,43 @@ +/* + * 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 . + */ + +#ifndef _TD_AST_CREATER_H_ +#define _TD_AST_CREATER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nodes.h" +#include "parser.h" + +typedef struct SAstCreateContext { + SParseContext* pQueryCxt; + bool notSupport; + bool valid; + SNode* pRootNode; +} SAstCreateContext; + +int32_t createAstCreateContext(const SParseContext* pQueryCxt, SAstCreateContext* pCxt); +int32_t destroyAstCreateContext(SAstCreateContext* pCxt); + +void* acquireRaii(SAstCreateContext* pCxt, void* p); +void* releaseRaii(SAstCreateContext* pCxt, void* p); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_AST_CREATER_H_*/ diff --git a/source/libs/parser/inc/astCreateFuncs.h b/source/libs/parser/inc/astCreateFuncs.h index 5cb5587001..c4c5dcba6c 100644 --- a/source/libs/parser/inc/astCreateFuncs.h +++ b/source/libs/parser/inc/astCreateFuncs.h @@ -15,7 +15,8 @@ #include "nodes.h" #include "nodesShowStmts.h" -#include "parser.h" +#include "astCreateContext.h" +#include "ttoken.h" #ifndef _TD_AST_CREATE_FUNCS_H_ #define _TD_AST_CREATE_FUNCS_H_ @@ -24,20 +25,13 @@ extern "C" { #endif -typedef struct SAstCreateContext { - SParseContext* pQueryCxt; - bool notSupport; - bool valid; - SNode* pRootNode; -} SAstCreateContext; - -int32_t createAstCreater(const SParseContext* pQueryCxt, SAstCreateContext* pCxt); -int32_t destroyAstCreater(SAstCreateContext* pCxt); - bool checkTableName(const SToken* pTableName); - SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode); +SNode* addOrderByList(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrderByList); +SNode* addSlimit(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit); +SNode* addLimit(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit); SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableName, const SToken* pColumnName); +SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset); SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode); SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder); SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName); diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y index d18cfbbebd..9237f63f35 100644 --- a/source/libs/parser/inc/new_sql.y +++ b/source/libs/parser/inc/new_sql.y @@ -147,35 +147,36 @@ subquery ::= NK_LR query_expression NK_RP. table_subquery ::= subquery. +// query_expression +query_expression(A) ::= with_clause_opt query_expression_body(B) order_by_clause_opt(C) slimit_clause_opt(D) limit_clause_opt(E). { + PARSER_TRACE; + addOrderByList(pCxt, B, C); + addSlimit(pCxt, B, D); + addLimit(pCxt, B, E); + A = B; + } -//////////////////////// query_expression ///////////////////////////////// -query_expression(A) ::= with_clause_opt query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt. { PARSER_TRACE; A = B; } +// WITH AS +with_clause_opt ::= . {} -with_clause_opt ::= . {} -with_clause_opt ::= WITH with_list. { PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } -with_clause_opt ::= WITH RECURSIVE with_list. { PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } +query_expression_body(A) ::= query_primary(B). { PARSER_TRACE; A = B; } +query_expression_body(A) ::= query_expression_body(B) UNION ALL query_expression_body(D). { PARSER_TRACE; A = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, B, D); } -with_list ::= with_list_element. {} -with_list ::= with_list NK_COMMA with_list_element. {} - -with_list_element ::= NK_ID AS table_subquery. {} - -table_subquery ::= . {} - -query_expression_body(A) ::= query_primary(B). { PARSER_TRACE; A = B; } -query_expression_body(A) ::= query_expression_body(B) UNION ALL query_expression_body(C). { PARSER_TRACE; A = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, B, C); } - -query_primary(A) ::= query_specification(B). { PARSER_TRACE; A = B; } -query_primary(A) ::= NK_LP query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP. { PARSER_TRACE; A = B;} +query_primary(A) ::= query_specification(B). { PARSER_TRACE; A = B; } +query_primary(A) ::= NK_LP query_expression_body(B) order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP. { PARSER_TRACE; A = B;} %type order_by_clause_opt { SNodeList* } %destructor order_by_clause_opt { nodesDestroyNodeList($$); } -order_by_clause_opt(A) ::= . { PARSER_TRACE; A = NULL; } -order_by_clause_opt(A) ::= ORDER BY sort_specification_list(B). { PARSER_TRACE; A = B; } +order_by_clause_opt(A) ::= . { PARSER_TRACE; A = NULL; } +order_by_clause_opt(A) ::= ORDER BY sort_specification_list(B). { PARSER_TRACE; A = B; } -limit_clause_opt ::= . +slimit_clause_opt(A) ::= . { A = NULL; } +slimit_clause_opt(A) ::= SLIMIT NK_INTEGER(B) SOFFSET NK_INTEGER(C). { A = createLimitNode(pCxt, &B, &C); } +slimit_clause_opt(A) ::= SLIMIT NK_INTEGER(C) NK_COMMA NK_INTEGER(B). { A = createLimitNode(pCxt, &B, &C); } -slimit_clause_opt ::= . +limit_clause_opt(A) ::= . { A = NULL; } +limit_clause_opt(A) ::= LIMIT NK_INTEGER(B) OFFSET NK_INTEGER(C). { A = createLimitNode(pCxt, &B, &C); } +limit_clause_opt(A) ::= LIMIT NK_INTEGER(C) NK_COMMA NK_INTEGER(B). { A = createLimitNode(pCxt, &B, &C); } //////////////////////// sort_specification_list ///////////////////////////////// %type sort_specification_list { SNodeList* } diff --git a/source/libs/parser/inc/astCreater.h b/source/libs/parser/inc/parserImpl.h similarity index 89% rename from source/libs/parser/inc/astCreater.h rename to source/libs/parser/inc/parserImpl.h index df674ca425..57012e2fd6 100644 --- a/source/libs/parser/inc/astCreater.h +++ b/source/libs/parser/inc/parserImpl.h @@ -13,16 +13,16 @@ * along with this program. If not, see . */ -#ifndef _TD_AST_CREATER_H_ -#define _TD_AST_CREATER_H_ +#include "nodes.h" +#include "parser.h" + +#ifndef _TD_AST_CREATE_FUNCS_H_ +#define _TD_AST_CREATE_FUNCS_H_ #ifdef __cplusplus extern "C" { #endif -#include "nodes.h" -#include "parser.h" - typedef struct SQuery { SNode* pRoot; } SQuery; @@ -33,4 +33,4 @@ int32_t doParse(SParseContext* pParseCxt, SQuery* pQuery); } #endif -#endif /*_TD_AST_CREATER_H_*/ +#endif /*_TD_AST_CREATE_FUNCS_H_*/ diff --git a/source/libs/parser/src/astCreateContext.c b/source/libs/parser/src/astCreateContext.c new file mode 100644 index 0000000000..42c5257360 --- /dev/null +++ b/source/libs/parser/src/astCreateContext.c @@ -0,0 +1,40 @@ +/* + * 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 "ttoken.h" +#include "astCreateContext.h" + +void* acquireRaii(SAstCreateContext* pCxt, void* p) { + if (NULL == p) { + return NULL; + } + return p; +} + +void* releaseRaii(SAstCreateContext* pCxt, void* p) { + if (NULL == p) { + return NULL; + } + return p; +} + +int32_t createAstCreater(const SParseContext* pQueryCxt, SAstCreateContext* pCxt) { + +} + +int32_t destroyAstCreater(SAstCreateContext* pCxt) { + +} + diff --git a/source/libs/parser/src/astCreateFuncs.c b/source/libs/parser/src/astCreateFuncs.c new file mode 100644 index 0000000000..337ae78d75 --- /dev/null +++ b/source/libs/parser/src/astCreateFuncs.c @@ -0,0 +1,91 @@ + +/* + * 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 "astCreateFuncs.h" + +#include "astCreateContext.h" + +bool checkTableName(const SToken* pTableName) { + printf("%p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); + return pTableName->n < TSDB_TABLE_NAME_LEN ? true : false; +} + +SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode) { + +} + +SNode* addOrderByList(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pOrderByList) { + +} + +SNode* addSlimit(SAstCreateContext* pCxt, SNode* pStmt, SNode* pSlimit) { + +} + +SNode* addLimit(SAstCreateContext* pCxt, SNode* pStmt, SNode* pLimit) { + +} + +SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableName, const SToken* pColumnName) { + +} + +SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset) { + +} + +SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) { + +} + +SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { + +} + +SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName) { + SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); + if (NULL != pDbName) { + printf("DbName %p : %d, %d, %s\n", pDbName, pDbName->type, pDbName->n, pDbName->z); + strncpy(realTable->dbName, pDbName->z, pDbName->n); + } + printf("TableName %p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); + strncpy(realTable->table.tableName, pTableName->z, pTableName->n); + return acquireRaii(pCxt, realTable); +} + +SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { + SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + select->isDistinct = isDistinct; + if (NULL == pProjectionList) { + select->isStar = true; + } + select->pProjectionList = releaseRaii(pCxt, pProjectionList); + printf("pTable = %p, name = %s\n", pTable, ((SRealTableNode*)pTable)->table.tableName); + select->pFromTable = releaseRaii(pCxt, pTable); + return acquireRaii(pCxt, select); +} + +SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { + +} + +SNode* createShowStmt(SAstCreateContext* pCxt, EShowStmtType type) { + +} + +SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias) { + +} diff --git a/source/libs/parser/src/new_sql.c b/source/libs/parser/src/new_sql.c index 8f02806897..7bf29c45f8 100644 --- a/source/libs/parser/src/new_sql.c +++ b/source/libs/parser/src/new_sql.c @@ -101,18 +101,18 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 70 +#define YYNOCODE 71 #define YYACTIONTYPE unsigned char #define NewParseTOKENTYPE SToken typedef union { int yyinit; NewParseTOKENTYPE yy0; - SToken yy29; - EOrder yy78; - SNode* yy112; - bool yy117; - SNodeList* yy124; - ENullOrder yy137; + bool yy9; + SNodeList* yy30; + SToken yy67; + ENullOrder yy68; + EOrder yy108; + SNode* yy130; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -127,17 +127,17 @@ typedef union { #define NewParseCTX_PARAM #define NewParseCTX_FETCH #define NewParseCTX_STORE -#define YYNSTATE 62 -#define YYNRULE 70 -#define YYNTOKEN 32 -#define YY_MAX_SHIFT 61 -#define YY_MIN_SHIFTREDUCE 112 +#define YYNSTATE 63 +#define YYNRULE 68 +#define YYNTOKEN 35 +#define YY_MAX_SHIFT 62 +#define YY_MIN_SHIFTREDUCE 114 #define YY_MAX_SHIFTREDUCE 181 #define YY_ERROR_ACTION 182 #define YY_ACCEPT_ACTION 183 #define YY_NO_ACTION 184 #define YY_MIN_REDUCE 185 -#define YY_MAX_REDUCE 254 +#define YY_MAX_REDUCE 252 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -204,91 +204,89 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (232) +#define YY_ACTTAB_COUNT (229) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 34, 46, 34, 34, 34, 34, 54, 46, 34, 34, - /* 10 */ 50, 212, 29, 49, 47, 195, 34, 22, 34, 34, - /* 20 */ 34, 34, 56, 22, 34, 34, 34, 22, 34, 34, - /* 30 */ 34, 34, 56, 22, 34, 34, 34, 46, 34, 34, - /* 40 */ 34, 34, 54, 46, 34, 34, 14, 13, 41, 222, - /* 50 */ 21, 196, 40, 5, 40, 5, 164, 26, 164, 223, - /* 60 */ 34, 57, 34, 34, 34, 34, 56, 57, 34, 34, - /* 70 */ 34, 58, 34, 34, 34, 34, 56, 58, 34, 34, - /* 80 */ 34, 39, 34, 34, 34, 34, 56, 39, 34, 34, - /* 90 */ 204, 12, 11, 10, 9, 7, 61, 48, 212, 207, - /* 100 */ 200, 201, 202, 203, 53, 203, 203, 203, 246, 18, - /* 110 */ 246, 246, 246, 246, 56, 218, 246, 246, 245, 52, - /* 120 */ 245, 245, 245, 245, 56, 18, 245, 245, 15, 21, - /* 130 */ 23, 218, 44, 25, 1, 37, 216, 37, 37, 37, - /* 140 */ 37, 56, 51, 37, 37, 38, 217, 38, 38, 38, - /* 150 */ 38, 56, 216, 38, 38, 242, 42, 242, 242, 242, - /* 160 */ 242, 56, 214, 214, 242, 153, 154, 17, 218, 35, - /* 170 */ 241, 119, 241, 241, 241, 241, 56, 183, 59, 241, - /* 180 */ 14, 13, 120, 24, 213, 49, 40, 5, 118, 216, - /* 190 */ 164, 156, 157, 31, 126, 10, 9, 19, 115, 33, - /* 200 */ 134, 224, 205, 17, 158, 6, 8, 189, 43, 30, - /* 210 */ 3, 208, 32, 146, 16, 2, 125, 45, 4, 206, - /* 220 */ 27, 20, 178, 28, 36, 115, 55, 186, 160, 159, - /* 230 */ 185, 60, + /* 0 */ 30, 50, 30, 30, 30, 30, 55, 50, 30, 30, + /* 10 */ 10, 9, 29, 62, 51, 195, 30, 19, 30, 30, + /* 20 */ 30, 30, 57, 19, 30, 30, 30, 19, 30, 30, + /* 30 */ 30, 30, 57, 19, 30, 30, 30, 50, 30, 30, + /* 40 */ 30, 30, 55, 50, 30, 30, 39, 222, 155, 156, + /* 50 */ 23, 196, 12, 11, 10, 9, 25, 223, 30, 58, + /* 60 */ 30, 30, 30, 30, 57, 58, 30, 30, 30, 59, + /* 70 */ 30, 30, 30, 30, 57, 59, 30, 30, 30, 37, + /* 80 */ 30, 30, 30, 30, 57, 37, 30, 30, 204, 38, + /* 90 */ 5, 183, 60, 166, 158, 159, 121, 53, 200, 201, + /* 100 */ 202, 203, 54, 203, 203, 203, 246, 18, 246, 246, + /* 110 */ 246, 246, 57, 120, 246, 246, 245, 17, 245, 245, + /* 120 */ 245, 245, 57, 46, 245, 245, 35, 27, 35, 35, + /* 130 */ 35, 35, 57, 31, 35, 35, 36, 47, 36, 36, + /* 140 */ 36, 36, 57, 128, 36, 36, 242, 117, 242, 242, + /* 150 */ 242, 242, 57, 42, 241, 242, 241, 241, 241, 241, + /* 160 */ 57, 52, 212, 241, 14, 13, 122, 1, 212, 212, + /* 170 */ 38, 5, 14, 13, 166, 40, 224, 20, 38, 5, + /* 180 */ 15, 210, 166, 211, 21, 22, 17, 210, 210, 43, + /* 190 */ 160, 6, 7, 45, 41, 26, 207, 48, 24, 208, + /* 200 */ 136, 44, 205, 8, 189, 3, 142, 2, 16, 127, + /* 210 */ 147, 146, 32, 150, 49, 149, 4, 33, 180, 206, + /* 220 */ 28, 117, 34, 186, 56, 162, 161, 185, 61, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - /* 10 */ 63, 64, 46, 12, 48, 49, 34, 35, 36, 37, - /* 20 */ 38, 39, 40, 41, 42, 43, 34, 35, 36, 37, - /* 30 */ 38, 39, 40, 41, 42, 43, 34, 35, 36, 37, - /* 40 */ 38, 39, 40, 41, 42, 43, 6, 7, 66, 67, - /* 50 */ 22, 49, 12, 13, 12, 13, 16, 68, 16, 67, - /* 60 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - /* 70 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - /* 80 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - /* 90 */ 40, 6, 7, 8, 9, 13, 10, 63, 64, 17, - /* 100 */ 50, 51, 52, 53, 54, 55, 56, 57, 34, 23, - /* 110 */ 36, 37, 38, 39, 40, 44, 42, 43, 34, 12, - /* 120 */ 36, 37, 38, 39, 40, 23, 42, 43, 13, 22, - /* 130 */ 59, 44, 1, 18, 45, 34, 65, 36, 37, 38, - /* 140 */ 39, 40, 33, 42, 43, 34, 59, 36, 37, 38, - /* 150 */ 39, 40, 65, 42, 43, 34, 25, 36, 37, 38, - /* 160 */ 39, 40, 56, 57, 43, 27, 28, 58, 44, 29, - /* 170 */ 34, 2, 36, 37, 38, 39, 40, 32, 33, 43, - /* 180 */ 6, 7, 8, 59, 64, 12, 12, 13, 19, 65, - /* 190 */ 16, 30, 31, 60, 8, 8, 9, 24, 12, 60, - /* 200 */ 12, 69, 40, 58, 14, 15, 21, 47, 62, 61, - /* 210 */ 15, 62, 61, 14, 2, 26, 12, 20, 15, 17, - /* 220 */ 15, 20, 14, 17, 17, 12, 17, 0, 14, 14, - /* 230 */ 0, 11, 70, 70, 70, 70, 70, 70, 70, 70, - /* 240 */ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - /* 250 */ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - /* 260 */ 70, 70, 70, 70, + /* 0 */ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + /* 10 */ 8, 9, 49, 10, 51, 52, 37, 38, 39, 40, + /* 20 */ 41, 42, 43, 44, 45, 46, 37, 38, 39, 40, + /* 30 */ 41, 42, 43, 44, 45, 46, 37, 38, 39, 40, + /* 40 */ 41, 42, 43, 44, 45, 46, 67, 68, 30, 31, + /* 50 */ 69, 52, 6, 7, 8, 9, 63, 68, 37, 38, + /* 60 */ 39, 40, 41, 42, 43, 44, 45, 46, 37, 38, + /* 70 */ 39, 40, 41, 42, 43, 44, 45, 46, 37, 38, + /* 80 */ 39, 40, 41, 42, 43, 44, 45, 46, 43, 12, + /* 90 */ 13, 35, 36, 16, 33, 34, 2, 12, 53, 54, + /* 100 */ 55, 56, 57, 58, 59, 60, 37, 22, 39, 40, + /* 110 */ 41, 42, 43, 19, 45, 46, 37, 61, 39, 40, + /* 120 */ 41, 42, 43, 15, 45, 46, 37, 63, 39, 40, + /* 130 */ 41, 42, 43, 32, 45, 46, 37, 29, 39, 40, + /* 140 */ 41, 42, 43, 8, 45, 46, 37, 12, 39, 40, + /* 150 */ 41, 42, 43, 1, 37, 46, 39, 40, 41, 42, + /* 160 */ 43, 36, 47, 46, 6, 7, 8, 48, 47, 47, + /* 170 */ 12, 13, 6, 7, 16, 23, 70, 62, 12, 13, + /* 180 */ 13, 66, 16, 62, 62, 18, 61, 66, 66, 15, + /* 190 */ 14, 15, 13, 25, 64, 64, 17, 28, 65, 65, + /* 200 */ 12, 27, 43, 21, 50, 15, 14, 24, 2, 12, + /* 210 */ 26, 26, 26, 26, 20, 26, 15, 26, 14, 17, + /* 220 */ 17, 12, 17, 0, 17, 14, 14, 0, 11, 71, + /* 230 */ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + /* 240 */ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + /* 250 */ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + /* 260 */ 71, 71, 71, 71, }; -#define YY_SHIFT_COUNT (61) +#define YY_SHIFT_COUNT (62) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (230) +#define YY_SHIFT_MAX (227) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 86, 174, 40, 40, 40, 40, 40, 40, 107, 40, - /* 10 */ 40, 40, 40, 42, 42, 115, 115, 115, 173, 1, - /* 20 */ 28, 102, 138, 131, 131, 169, 140, 1, 188, 185, - /* 30 */ 232, 232, 232, 232, 85, 161, 186, 187, 187, 190, - /* 40 */ 82, 195, 189, 199, 212, 204, 197, 203, 205, 201, - /* 50 */ 205, 208, 202, 206, 207, 213, 209, 214, 215, 227, - /* 60 */ 230, 220, + /* 0 */ 3, 158, 166, 166, 166, 166, 166, 166, 85, 166, + /* 10 */ 166, 166, 166, 77, 77, 167, 167, 167, 229, 18, + /* 20 */ 152, 152, 94, 101, 168, 169, 169, 168, 188, 182, + /* 30 */ 46, 61, 174, 108, 135, 2, 2, 176, 179, 190, + /* 40 */ 183, 192, 206, 184, 185, 186, 187, 189, 191, 197, + /* 50 */ 194, 201, 204, 202, 203, 205, 209, 207, 211, 212, + /* 60 */ 223, 227, 217, }; -#define YY_REDUCE_COUNT (33) -#define YY_REDUCE_MIN (-53) -#define YY_REDUCE_MAX (162) +#define YY_REDUCE_COUNT (29) +#define YY_REDUCE_MIN (-37) +#define YY_REDUCE_MAX (159) static const short yy_reduce_ofst[] = { - /* 0 */ 145, -34, -18, -8, 2, 26, 36, 46, 50, 74, - /* 10 */ 84, 101, 111, 121, 136, 71, 87, 124, -53, 34, - /* 20 */ 106, 109, -11, 133, 139, 89, 132, 120, 162, 160, - /* 30 */ 146, 148, 149, 151, + /* 0 */ 56, -37, -21, -11, -1, 21, 31, 41, 45, 69, + /* 10 */ 79, 89, 99, 109, 117, 115, 121, 122, 125, -19, + /* 20 */ -7, 64, 119, 106, 130, 133, 134, 131, 159, 154, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 209, 182, 182, 182, 182, 182, 182, 182, 215, 182, - /* 10 */ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - /* 20 */ 215, 209, 225, 220, 220, 190, 228, 182, 182, 182, - /* 30 */ 254, 253, 254, 253, 239, 182, 182, 244, 243, 182, - /* 40 */ 187, 221, 182, 182, 182, 182, 197, 194, 211, 182, - /* 50 */ 210, 182, 207, 182, 182, 182, 182, 182, 182, 182, - /* 60 */ 182, 182, + /* 0 */ 209, 182, 182, 182, 182, 182, 182, 182, 182, 182, + /* 10 */ 182, 182, 182, 182, 182, 182, 182, 182, 209, 225, + /* 20 */ 214, 214, 190, 228, 216, 219, 219, 216, 182, 182, + /* 30 */ 239, 182, 182, 182, 182, 244, 243, 182, 187, 215, + /* 40 */ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + /* 50 */ 197, 194, 182, 207, 182, 182, 182, 182, 182, 182, + /* 60 */ 182, 182, 182, }; /********** End of lemon-generated parsing tables *****************************/ @@ -418,53 +416,54 @@ static const char *const yyTokenName[] = { /* 20 */ "AS", /* 21 */ "FROM", /* 22 */ "NK_LR", - /* 23 */ "WITH", - /* 24 */ "RECURSIVE", - /* 25 */ "ORDER", - /* 26 */ "BY", - /* 27 */ "ASC", - /* 28 */ "DESC", - /* 29 */ "NULLS", - /* 30 */ "FIRST", - /* 31 */ "LAST", - /* 32 */ "cmd", - /* 33 */ "query_expression", - /* 34 */ "value_function", - /* 35 */ "value_expression", - /* 36 */ "value_expression_primary", - /* 37 */ "nonparenthesized_value_expression_primary", - /* 38 */ "literal", - /* 39 */ "column_reference", - /* 40 */ "table_name", - /* 41 */ "common_value_expression", - /* 42 */ "numeric_value_expression", - /* 43 */ "numeric_primary", - /* 44 */ "query_specification", - /* 45 */ "set_quantifier_opt", - /* 46 */ "select_list", - /* 47 */ "from_clause", - /* 48 */ "select_sublist", - /* 49 */ "select_item", - /* 50 */ "table_reference_list", - /* 51 */ "table_reference", - /* 52 */ "table_factor", - /* 53 */ "table_primary", - /* 54 */ "db_name", - /* 55 */ "derived_table", - /* 56 */ "table_subquery", - /* 57 */ "subquery", - /* 58 */ "with_clause_opt", - /* 59 */ "query_expression_body", - /* 60 */ "order_by_clause_opt", - /* 61 */ "limit_clause_opt", - /* 62 */ "slimit_clause_opt", - /* 63 */ "with_list", - /* 64 */ "with_list_element", - /* 65 */ "query_primary", - /* 66 */ "sort_specification_list", - /* 67 */ "sort_specification", - /* 68 */ "ordering_specification_opt", - /* 69 */ "null_ordering_opt", + /* 23 */ "ORDER", + /* 24 */ "BY", + /* 25 */ "SLIMIT", + /* 26 */ "NK_INTEGER", + /* 27 */ "SOFFSET", + /* 28 */ "LIMIT", + /* 29 */ "OFFSET", + /* 30 */ "ASC", + /* 31 */ "DESC", + /* 32 */ "NULLS", + /* 33 */ "FIRST", + /* 34 */ "LAST", + /* 35 */ "cmd", + /* 36 */ "query_expression", + /* 37 */ "value_function", + /* 38 */ "value_expression", + /* 39 */ "value_expression_primary", + /* 40 */ "nonparenthesized_value_expression_primary", + /* 41 */ "literal", + /* 42 */ "column_reference", + /* 43 */ "table_name", + /* 44 */ "common_value_expression", + /* 45 */ "numeric_value_expression", + /* 46 */ "numeric_primary", + /* 47 */ "query_specification", + /* 48 */ "set_quantifier_opt", + /* 49 */ "select_list", + /* 50 */ "from_clause", + /* 51 */ "select_sublist", + /* 52 */ "select_item", + /* 53 */ "table_reference_list", + /* 54 */ "table_reference", + /* 55 */ "table_factor", + /* 56 */ "table_primary", + /* 57 */ "db_name", + /* 58 */ "derived_table", + /* 59 */ "table_subquery", + /* 60 */ "subquery", + /* 61 */ "with_clause_opt", + /* 62 */ "query_expression_body", + /* 63 */ "order_by_clause_opt", + /* 64 */ "slimit_clause_opt", + /* 65 */ "limit_clause_opt", + /* 66 */ "query_primary", + /* 67 */ "sort_specification_list", + /* 68 */ "sort_specification", + /* 69 */ "ordering_specification_opt", + /* 70 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -495,20 +494,20 @@ static const char *const yyRuleName[] = { /* 20 */ "table_primary ::= db_name NK_DOT table_name", /* 21 */ "db_name ::= NK_ID", /* 22 */ "table_name ::= NK_ID", - /* 23 */ "query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt", + /* 23 */ "query_expression ::= with_clause_opt query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", /* 24 */ "with_clause_opt ::=", - /* 25 */ "with_clause_opt ::= WITH with_list", - /* 26 */ "with_clause_opt ::= WITH RECURSIVE with_list", - /* 27 */ "with_list ::= with_list_element", - /* 28 */ "with_list ::= with_list NK_COMMA with_list_element", - /* 29 */ "with_list_element ::= NK_ID AS table_subquery", - /* 30 */ "table_subquery ::=", - /* 31 */ "query_expression_body ::= query_primary", - /* 32 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 33 */ "query_primary ::= query_specification", - /* 34 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP", - /* 35 */ "order_by_clause_opt ::=", - /* 36 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 25 */ "query_expression_body ::= query_primary", + /* 26 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 27 */ "query_primary ::= query_specification", + /* 28 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP", + /* 29 */ "order_by_clause_opt ::=", + /* 30 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 31 */ "slimit_clause_opt ::=", + /* 32 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 33 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 34 */ "limit_clause_opt ::=", + /* 35 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 36 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", /* 37 */ "sort_specification_list ::= sort_specification", /* 38 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", /* 39 */ "sort_specification ::= value_expression ordering_specification_opt null_ordering_opt", @@ -540,8 +539,6 @@ static const char *const yyRuleName[] = { /* 65 */ "derived_table ::= table_subquery", /* 66 */ "subquery ::= NK_LR query_expression NK_RP", /* 67 */ "table_subquery ::= subquery", - /* 68 */ "limit_clause_opt ::=", - /* 69 */ "slimit_clause_opt ::=", }; #endif /* NDEBUG */ @@ -668,60 +665,58 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 32: /* cmd */ - case 33: /* query_expression */ - case 34: /* value_function */ - case 35: /* value_expression */ - case 36: /* value_expression_primary */ - case 37: /* nonparenthesized_value_expression_primary */ - case 38: /* literal */ - case 39: /* column_reference */ - case 40: /* table_name */ - case 41: /* common_value_expression */ - case 42: /* numeric_value_expression */ - case 43: /* numeric_primary */ - case 44: /* query_specification */ - case 47: /* from_clause */ - case 49: /* select_item */ - case 50: /* table_reference_list */ - case 51: /* table_reference */ - case 52: /* table_factor */ - case 53: /* table_primary */ - case 54: /* db_name */ - case 55: /* derived_table */ - case 56: /* table_subquery */ - case 57: /* subquery */ - case 58: /* with_clause_opt */ - case 59: /* query_expression_body */ - case 61: /* limit_clause_opt */ - case 62: /* slimit_clause_opt */ - case 63: /* with_list */ - case 64: /* with_list_element */ - case 65: /* query_primary */ - case 67: /* sort_specification */ + case 35: /* cmd */ + case 36: /* query_expression */ + case 37: /* value_function */ + case 38: /* value_expression */ + case 39: /* value_expression_primary */ + case 40: /* nonparenthesized_value_expression_primary */ + case 41: /* literal */ + case 42: /* column_reference */ + case 43: /* table_name */ + case 44: /* common_value_expression */ + case 45: /* numeric_value_expression */ + case 46: /* numeric_primary */ + case 47: /* query_specification */ + case 50: /* from_clause */ + case 52: /* select_item */ + case 53: /* table_reference_list */ + case 54: /* table_reference */ + case 55: /* table_factor */ + case 56: /* table_primary */ + case 57: /* db_name */ + case 58: /* derived_table */ + case 59: /* table_subquery */ + case 60: /* subquery */ + case 61: /* with_clause_opt */ + case 62: /* query_expression_body */ + case 64: /* slimit_clause_opt */ + case 65: /* limit_clause_opt */ + case 66: /* query_primary */ + case 68: /* sort_specification */ { - nodesDestroyNode((yypminor->yy112)); + nodesDestroyNode((yypminor->yy130)); } break; - case 45: /* set_quantifier_opt */ + case 48: /* set_quantifier_opt */ { } break; - case 46: /* select_list */ - case 48: /* select_sublist */ - case 60: /* order_by_clause_opt */ - case 66: /* sort_specification_list */ + case 49: /* select_list */ + case 51: /* select_sublist */ + case 63: /* order_by_clause_opt */ + case 67: /* sort_specification_list */ { - nodesDestroyNodeList((yypminor->yy124)); + nodesDestroyNodeList((yypminor->yy30)); } break; - case 68: /* ordering_specification_opt */ + case 69: /* ordering_specification_opt */ { } break; - case 69: /* null_ordering_opt */ + case 70: /* null_ordering_opt */ { } @@ -1020,76 +1015,74 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 32, -2 }, /* (0) cmd ::= SHOW DATABASES */ - { 32, -1 }, /* (1) cmd ::= query_expression */ - { 39, -1 }, /* (2) column_reference ::= NK_ID */ - { 39, -3 }, /* (3) column_reference ::= table_name NK_DOT NK_ID */ - { 44, -4 }, /* (4) query_specification ::= SELECT set_quantifier_opt select_list from_clause */ - { 45, 0 }, /* (5) set_quantifier_opt ::= */ - { 45, -1 }, /* (6) set_quantifier_opt ::= DISTINCT */ - { 45, -1 }, /* (7) set_quantifier_opt ::= ALL */ - { 46, -1 }, /* (8) select_list ::= NK_STAR */ - { 46, -1 }, /* (9) select_list ::= select_sublist */ - { 48, -1 }, /* (10) select_sublist ::= select_item */ - { 48, -3 }, /* (11) select_sublist ::= select_sublist NK_COMMA select_item */ - { 49, -1 }, /* (12) select_item ::= value_expression */ - { 49, -3 }, /* (13) select_item ::= value_expression AS NK_ID */ - { 49, -3 }, /* (14) select_item ::= table_name NK_DOT NK_STAR */ - { 47, -2 }, /* (15) from_clause ::= FROM table_reference_list */ - { 50, -1 }, /* (16) table_reference_list ::= table_reference */ - { 51, -1 }, /* (17) table_reference ::= table_factor */ - { 52, -1 }, /* (18) table_factor ::= table_primary */ - { 53, -1 }, /* (19) table_primary ::= table_name */ - { 53, -3 }, /* (20) table_primary ::= db_name NK_DOT table_name */ - { 54, -1 }, /* (21) db_name ::= NK_ID */ - { 40, -1 }, /* (22) table_name ::= NK_ID */ - { 33, -5 }, /* (23) query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ - { 58, 0 }, /* (24) with_clause_opt ::= */ - { 58, -2 }, /* (25) with_clause_opt ::= WITH with_list */ - { 58, -3 }, /* (26) with_clause_opt ::= WITH RECURSIVE with_list */ - { 63, -1 }, /* (27) with_list ::= with_list_element */ - { 63, -3 }, /* (28) with_list ::= with_list NK_COMMA with_list_element */ - { 64, -3 }, /* (29) with_list_element ::= NK_ID AS table_subquery */ - { 56, 0 }, /* (30) table_subquery ::= */ - { 59, -1 }, /* (31) query_expression_body ::= query_primary */ - { 59, -4 }, /* (32) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 65, -1 }, /* (33) query_primary ::= query_specification */ - { 65, -6 }, /* (34) query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ - { 60, 0 }, /* (35) order_by_clause_opt ::= */ - { 60, -3 }, /* (36) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 66, -1 }, /* (37) sort_specification_list ::= sort_specification */ - { 66, -3 }, /* (38) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 67, -3 }, /* (39) sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ - { 68, 0 }, /* (40) ordering_specification_opt ::= */ - { 68, -1 }, /* (41) ordering_specification_opt ::= ASC */ - { 68, -1 }, /* (42) ordering_specification_opt ::= DESC */ - { 69, 0 }, /* (43) null_ordering_opt ::= */ - { 69, -2 }, /* (44) null_ordering_opt ::= NULLS FIRST */ - { 69, -2 }, /* (45) null_ordering_opt ::= NULLS LAST */ - { 34, -4 }, /* (46) value_function ::= NK_ID NK_LP value_expression NK_RP */ - { 34, -6 }, /* (47) value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ - { 36, -3 }, /* (48) value_expression_primary ::= NK_LP value_expression NK_RP */ - { 36, -1 }, /* (49) value_expression_primary ::= nonparenthesized_value_expression_primary */ - { 37, -1 }, /* (50) nonparenthesized_value_expression_primary ::= literal */ - { 37, -1 }, /* (51) nonparenthesized_value_expression_primary ::= column_reference */ - { 38, -1 }, /* (52) literal ::= NK_LITERAL */ - { 35, -1 }, /* (53) value_expression ::= common_value_expression */ - { 41, -1 }, /* (54) common_value_expression ::= numeric_value_expression */ - { 42, -1 }, /* (55) numeric_value_expression ::= numeric_primary */ - { 42, -2 }, /* (56) numeric_value_expression ::= NK_PLUS numeric_primary */ - { 42, -2 }, /* (57) numeric_value_expression ::= NK_MINUS numeric_primary */ - { 42, -3 }, /* (58) numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ - { 42, -3 }, /* (59) numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ - { 42, -3 }, /* (60) numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ - { 42, -3 }, /* (61) numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ - { 43, -1 }, /* (62) numeric_primary ::= value_expression_primary */ - { 43, -1 }, /* (63) numeric_primary ::= value_function */ - { 53, -1 }, /* (64) table_primary ::= derived_table */ - { 55, -1 }, /* (65) derived_table ::= table_subquery */ - { 57, -3 }, /* (66) subquery ::= NK_LR query_expression NK_RP */ - { 56, -1 }, /* (67) table_subquery ::= subquery */ - { 61, 0 }, /* (68) limit_clause_opt ::= */ - { 62, 0 }, /* (69) slimit_clause_opt ::= */ + { 35, -2 }, /* (0) cmd ::= SHOW DATABASES */ + { 35, -1 }, /* (1) cmd ::= query_expression */ + { 42, -1 }, /* (2) column_reference ::= NK_ID */ + { 42, -3 }, /* (3) column_reference ::= table_name NK_DOT NK_ID */ + { 47, -4 }, /* (4) query_specification ::= SELECT set_quantifier_opt select_list from_clause */ + { 48, 0 }, /* (5) set_quantifier_opt ::= */ + { 48, -1 }, /* (6) set_quantifier_opt ::= DISTINCT */ + { 48, -1 }, /* (7) set_quantifier_opt ::= ALL */ + { 49, -1 }, /* (8) select_list ::= NK_STAR */ + { 49, -1 }, /* (9) select_list ::= select_sublist */ + { 51, -1 }, /* (10) select_sublist ::= select_item */ + { 51, -3 }, /* (11) select_sublist ::= select_sublist NK_COMMA select_item */ + { 52, -1 }, /* (12) select_item ::= value_expression */ + { 52, -3 }, /* (13) select_item ::= value_expression AS NK_ID */ + { 52, -3 }, /* (14) select_item ::= table_name NK_DOT NK_STAR */ + { 50, -2 }, /* (15) from_clause ::= FROM table_reference_list */ + { 53, -1 }, /* (16) table_reference_list ::= table_reference */ + { 54, -1 }, /* (17) table_reference ::= table_factor */ + { 55, -1 }, /* (18) table_factor ::= table_primary */ + { 56, -1 }, /* (19) table_primary ::= table_name */ + { 56, -3 }, /* (20) table_primary ::= db_name NK_DOT table_name */ + { 57, -1 }, /* (21) db_name ::= NK_ID */ + { 43, -1 }, /* (22) table_name ::= NK_ID */ + { 36, -5 }, /* (23) query_expression ::= with_clause_opt query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 61, 0 }, /* (24) with_clause_opt ::= */ + { 62, -1 }, /* (25) query_expression_body ::= query_primary */ + { 62, -4 }, /* (26) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 66, -1 }, /* (27) query_primary ::= query_specification */ + { 66, -6 }, /* (28) query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ + { 63, 0 }, /* (29) order_by_clause_opt ::= */ + { 63, -3 }, /* (30) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 64, 0 }, /* (31) slimit_clause_opt ::= */ + { 64, -4 }, /* (32) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 64, -4 }, /* (33) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 65, 0 }, /* (34) limit_clause_opt ::= */ + { 65, -4 }, /* (35) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 65, -4 }, /* (36) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 67, -1 }, /* (37) sort_specification_list ::= sort_specification */ + { 67, -3 }, /* (38) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 68, -3 }, /* (39) sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ + { 69, 0 }, /* (40) ordering_specification_opt ::= */ + { 69, -1 }, /* (41) ordering_specification_opt ::= ASC */ + { 69, -1 }, /* (42) ordering_specification_opt ::= DESC */ + { 70, 0 }, /* (43) null_ordering_opt ::= */ + { 70, -2 }, /* (44) null_ordering_opt ::= NULLS FIRST */ + { 70, -2 }, /* (45) null_ordering_opt ::= NULLS LAST */ + { 37, -4 }, /* (46) value_function ::= NK_ID NK_LP value_expression NK_RP */ + { 37, -6 }, /* (47) value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ + { 39, -3 }, /* (48) value_expression_primary ::= NK_LP value_expression NK_RP */ + { 39, -1 }, /* (49) value_expression_primary ::= nonparenthesized_value_expression_primary */ + { 40, -1 }, /* (50) nonparenthesized_value_expression_primary ::= literal */ + { 40, -1 }, /* (51) nonparenthesized_value_expression_primary ::= column_reference */ + { 41, -1 }, /* (52) literal ::= NK_LITERAL */ + { 38, -1 }, /* (53) value_expression ::= common_value_expression */ + { 44, -1 }, /* (54) common_value_expression ::= numeric_value_expression */ + { 45, -1 }, /* (55) numeric_value_expression ::= numeric_primary */ + { 45, -2 }, /* (56) numeric_value_expression ::= NK_PLUS numeric_primary */ + { 45, -2 }, /* (57) numeric_value_expression ::= NK_MINUS numeric_primary */ + { 45, -3 }, /* (58) numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ + { 45, -3 }, /* (59) numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ + { 45, -3 }, /* (60) numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ + { 45, -3 }, /* (61) numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ + { 46, -1 }, /* (62) numeric_primary ::= value_expression_primary */ + { 46, -1 }, /* (63) numeric_primary ::= value_function */ + { 56, -1 }, /* (64) table_primary ::= derived_table */ + { 58, -1 }, /* (65) derived_table ::= table_subquery */ + { 60, -3 }, /* (66) subquery ::= NK_LR query_expression NK_RP */ + { 59, -1 }, /* (67) table_subquery ::= subquery */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1180,189 +1173,183 @@ static YYACTIONTYPE yy_reduce( { PARSER_TRACE; createShowStmt(pCxt, SHOW_TYPE_DATABASE); } break; case 1: /* cmd ::= query_expression */ -{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy112; } +{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy130; } break; case 2: /* column_reference ::= NK_ID */ -{ PARSER_TRACE; yylhsminor.yy112 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy130 = yylhsminor.yy130; break; case 3: /* column_reference ::= table_name NK_DOT NK_ID */ case 14: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==14); -{ PARSER_TRACE; yylhsminor.yy112 = createColumnNode(pCxt, &yymsp[-2].minor.yy29, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = createColumnNode(pCxt, &yymsp[-2].minor.yy67, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy130 = yylhsminor.yy130; break; case 4: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause */ -{ PARSER_TRACE; yymsp[-3].minor.yy112 = createSelectStmt(pCxt, yymsp[-2].minor.yy117, yymsp[-1].minor.yy124, yymsp[0].minor.yy112); } +{ PARSER_TRACE; yymsp[-3].minor.yy130 = createSelectStmt(pCxt, yymsp[-2].minor.yy9, yymsp[-1].minor.yy30, yymsp[0].minor.yy130); } break; case 5: /* set_quantifier_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy117 = false; } +{ PARSER_TRACE; yymsp[1].minor.yy9 = false; } break; case 6: /* set_quantifier_opt ::= DISTINCT */ -{ PARSER_TRACE; yymsp[0].minor.yy117 = true; } +{ PARSER_TRACE; yymsp[0].minor.yy9 = true; } break; case 7: /* set_quantifier_opt ::= ALL */ -{ PARSER_TRACE; yymsp[0].minor.yy117 = false; } +{ PARSER_TRACE; yymsp[0].minor.yy9 = false; } break; case 8: /* select_list ::= NK_STAR */ -{ PARSER_TRACE; yymsp[0].minor.yy124 = NULL; } +{ PARSER_TRACE; yymsp[0].minor.yy30 = NULL; } break; case 9: /* select_list ::= select_sublist */ -{ PARSER_TRACE; yylhsminor.yy124 = yymsp[0].minor.yy124; } - yymsp[0].minor.yy124 = yylhsminor.yy124; +{ PARSER_TRACE; yylhsminor.yy30 = yymsp[0].minor.yy30; } + yymsp[0].minor.yy30 = yylhsminor.yy30; break; case 10: /* select_sublist ::= select_item */ case 37: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==37); -{ PARSER_TRACE; yylhsminor.yy124 = createNodeList(pCxt, yymsp[0].minor.yy112); } - yymsp[0].minor.yy124 = yylhsminor.yy124; +{ PARSER_TRACE; yylhsminor.yy30 = createNodeList(pCxt, yymsp[0].minor.yy130); } + yymsp[0].minor.yy30 = yylhsminor.yy30; break; case 11: /* select_sublist ::= select_sublist NK_COMMA select_item */ case 38: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==38); -{ PARSER_TRACE; yylhsminor.yy124 = addNodeToList(pCxt, yymsp[-2].minor.yy124, yymsp[0].minor.yy112); } - yymsp[-2].minor.yy124 = yylhsminor.yy124; +{ PARSER_TRACE; yylhsminor.yy30 = addNodeToList(pCxt, yymsp[-2].minor.yy30, yymsp[0].minor.yy130); } + yymsp[-2].minor.yy30 = yylhsminor.yy30; break; case 12: /* select_item ::= value_expression */ case 16: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==16); case 17: /* table_reference ::= table_factor */ yytestcase(yyruleno==17); case 18: /* table_factor ::= table_primary */ yytestcase(yyruleno==18); - case 31: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==31); - case 33: /* query_primary ::= query_specification */ yytestcase(yyruleno==33); -{ PARSER_TRACE; yylhsminor.yy112 = yymsp[0].minor.yy112; } - yymsp[0].minor.yy112 = yylhsminor.yy112; + case 25: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==25); + case 27: /* query_primary ::= query_specification */ yytestcase(yyruleno==27); +{ PARSER_TRACE; yylhsminor.yy130 = yymsp[0].minor.yy130; } + yymsp[0].minor.yy130 = yylhsminor.yy130; break; case 13: /* select_item ::= value_expression AS NK_ID */ -{ PARSER_TRACE; yylhsminor.yy112 = setProjectionAlias(pCxt, yymsp[-2].minor.yy112, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = setProjectionAlias(pCxt, yymsp[-2].minor.yy130, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy130 = yylhsminor.yy130; break; case 15: /* from_clause ::= FROM table_reference_list */ -{ PARSER_TRACE; yymsp[-1].minor.yy112 = yymsp[0].minor.yy112; } +{ PARSER_TRACE; yymsp[-1].minor.yy130 = yymsp[0].minor.yy130; } break; case 19: /* table_primary ::= table_name */ -{ PARSER_TRACE; yylhsminor.yy112 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy29); } - yymsp[0].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy67); } + yymsp[0].minor.yy130 = yylhsminor.yy130; break; case 20: /* table_primary ::= db_name NK_DOT table_name */ -{ PARSER_TRACE; yylhsminor.yy112 = createRealTableNode(pCxt, &yymsp[-2].minor.yy29, &yymsp[0].minor.yy29); } - yymsp[-2].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = createRealTableNode(pCxt, &yymsp[-2].minor.yy67, &yymsp[0].minor.yy67); } + yymsp[-2].minor.yy130 = yylhsminor.yy130; break; case 21: /* db_name ::= NK_ID */ case 22: /* table_name ::= NK_ID */ yytestcase(yyruleno==22); -{ PARSER_TRACE; yylhsminor.yy29 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy29 = yylhsminor.yy29; +{ PARSER_TRACE; yylhsminor.yy67 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy67 = yylhsminor.yy67; break; - case 23: /* query_expression ::= with_clause_opt query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt */ -{ yy_destructor(yypParser,58,&yymsp[-4].minor); -{ PARSER_TRACE; yymsp[-4].minor.yy112 = yymsp[-3].minor.yy112; } - yy_destructor(yypParser,60,&yymsp[-2].minor); - yy_destructor(yypParser,61,&yymsp[-1].minor); - yy_destructor(yypParser,62,&yymsp[0].minor); + case 23: /* query_expression ::= with_clause_opt query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ +{ yy_destructor(yypParser,61,&yymsp[-4].minor); +{ + PARSER_TRACE; + addOrderByList(pCxt, yymsp[-3].minor.yy130, yymsp[-2].minor.yy30); + addSlimit(pCxt, yymsp[-3].minor.yy130, yymsp[-1].minor.yy130); + addLimit(pCxt, yymsp[-3].minor.yy130, yymsp[0].minor.yy130); + yymsp[-4].minor.yy130 = yymsp[-3].minor.yy130; + } } break; case 24: /* with_clause_opt ::= */ - case 30: /* table_subquery ::= */ yytestcase(yyruleno==30); {} break; - case 25: /* with_clause_opt ::= WITH with_list */ - case 26: /* with_clause_opt ::= WITH RECURSIVE with_list */ yytestcase(yyruleno==26); -{ PARSER_TRACE; pCxt->notSupport = true; pCxt->valid = false; } - yy_destructor(yypParser,63,&yymsp[0].minor); + case 26: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ PARSER_TRACE; yylhsminor.yy130 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy130, yymsp[0].minor.yy130); } + yymsp[-3].minor.yy130 = yylhsminor.yy130; break; - case 27: /* with_list ::= with_list_element */ -{ yy_destructor(yypParser,64,&yymsp[0].minor); -{} -} + case 28: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy130 = yymsp[-4].minor.yy130;} + yy_destructor(yypParser,63,&yymsp[-3].minor); + yy_destructor(yypParser,65,&yymsp[-2].minor); + yy_destructor(yypParser,64,&yymsp[-1].minor); break; - case 28: /* with_list ::= with_list NK_COMMA with_list_element */ -{ yy_destructor(yypParser,63,&yymsp[-2].minor); -{} - yy_destructor(yypParser,64,&yymsp[0].minor); -} + case 29: /* order_by_clause_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy30 = NULL; } break; - case 29: /* with_list_element ::= NK_ID AS table_subquery */ -{} - yy_destructor(yypParser,56,&yymsp[0].minor); + case 30: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ +{ PARSER_TRACE; yymsp[-2].minor.yy30 = yymsp[0].minor.yy30; } break; - case 32: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ PARSER_TRACE; yylhsminor.yy112 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy112, yymsp[0].minor.yy112); } - yymsp[-3].minor.yy112 = yylhsminor.yy112; + case 31: /* slimit_clause_opt ::= */ + case 34: /* limit_clause_opt ::= */ yytestcase(yyruleno==34); +{ yymsp[1].minor.yy130 = NULL; } break; - case 34: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt limit_clause_opt slimit_clause_opt NK_RP */ -{ PARSER_TRACE; yymsp[-5].minor.yy112 = yymsp[-4].minor.yy112;} - yy_destructor(yypParser,60,&yymsp[-3].minor); - yy_destructor(yypParser,61,&yymsp[-2].minor); - yy_destructor(yypParser,62,&yymsp[-1].minor); + case 32: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 35: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==35); +{ yymsp[-3].minor.yy130 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 35: /* order_by_clause_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy124 = NULL; } - break; - case 36: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ -{ PARSER_TRACE; yymsp[-2].minor.yy124 = yymsp[0].minor.yy124; } + case 33: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 36: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==36); +{ yymsp[-3].minor.yy130 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; case 39: /* sort_specification ::= value_expression ordering_specification_opt null_ordering_opt */ -{ PARSER_TRACE; yylhsminor.yy112 = createOrderByExprNode(pCxt, yymsp[-2].minor.yy112, yymsp[-1].minor.yy78, yymsp[0].minor.yy137); } - yymsp[-2].minor.yy112 = yylhsminor.yy112; +{ PARSER_TRACE; yylhsminor.yy130 = createOrderByExprNode(pCxt, yymsp[-2].minor.yy130, yymsp[-1].minor.yy108, yymsp[0].minor.yy68); } + yymsp[-2].minor.yy130 = yylhsminor.yy130; break; case 40: /* ordering_specification_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy78 = ORDER_ASC; } +{ PARSER_TRACE; yymsp[1].minor.yy108 = ORDER_ASC; } break; case 41: /* ordering_specification_opt ::= ASC */ -{ PARSER_TRACE; yymsp[0].minor.yy78 = ORDER_ASC; } +{ PARSER_TRACE; yymsp[0].minor.yy108 = ORDER_ASC; } break; case 42: /* ordering_specification_opt ::= DESC */ -{ PARSER_TRACE; yymsp[0].minor.yy78 = ORDER_DESC; } +{ PARSER_TRACE; yymsp[0].minor.yy108 = ORDER_DESC; } break; case 43: /* null_ordering_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy137 = NULL_ORDER_DEFAULT; } +{ PARSER_TRACE; yymsp[1].minor.yy68 = NULL_ORDER_DEFAULT; } break; case 44: /* null_ordering_opt ::= NULLS FIRST */ -{ PARSER_TRACE; yymsp[-1].minor.yy137 = NULL_ORDER_FIRST; } +{ PARSER_TRACE; yymsp[-1].minor.yy68 = NULL_ORDER_FIRST; } break; case 45: /* null_ordering_opt ::= NULLS LAST */ -{ PARSER_TRACE; yymsp[-1].minor.yy137 = NULL_ORDER_LAST; } +{ PARSER_TRACE; yymsp[-1].minor.yy68 = NULL_ORDER_LAST; } break; case 46: /* value_function ::= NK_ID NK_LP value_expression NK_RP */ case 48: /* value_expression_primary ::= NK_LP value_expression NK_RP */ yytestcase(yyruleno==48); { } - yy_destructor(yypParser,35,&yymsp[-1].minor); + yy_destructor(yypParser,38,&yymsp[-1].minor); break; case 47: /* value_function ::= NK_ID NK_LP value_expression NK_COMMA value_expression NK_RP */ { } - yy_destructor(yypParser,35,&yymsp[-3].minor); - yy_destructor(yypParser,35,&yymsp[-1].minor); + yy_destructor(yypParser,38,&yymsp[-3].minor); + yy_destructor(yypParser,38,&yymsp[-1].minor); break; case 49: /* value_expression_primary ::= nonparenthesized_value_expression_primary */ -{ yy_destructor(yypParser,37,&yymsp[0].minor); +{ yy_destructor(yypParser,40,&yymsp[0].minor); { } } break; case 50: /* nonparenthesized_value_expression_primary ::= literal */ -{ yy_destructor(yypParser,38,&yymsp[0].minor); -{ -} -} - break; - case 51: /* nonparenthesized_value_expression_primary ::= column_reference */ -{ yy_destructor(yypParser,39,&yymsp[0].minor); -{ -} -} - break; - case 53: /* value_expression ::= common_value_expression */ { yy_destructor(yypParser,41,&yymsp[0].minor); { } } break; - case 54: /* common_value_expression ::= numeric_value_expression */ + case 51: /* nonparenthesized_value_expression_primary ::= column_reference */ { yy_destructor(yypParser,42,&yymsp[0].minor); { } +} + break; + case 53: /* value_expression ::= common_value_expression */ +{ yy_destructor(yypParser,44,&yymsp[0].minor); +{ +} +} + break; + case 54: /* common_value_expression ::= numeric_value_expression */ +{ yy_destructor(yypParser,45,&yymsp[0].minor); +{ +} } break; case 55: /* numeric_value_expression ::= numeric_primary */ -{ yy_destructor(yypParser,43,&yymsp[0].minor); +{ yy_destructor(yypParser,46,&yymsp[0].minor); { } } @@ -1371,38 +1358,38 @@ static YYACTIONTYPE yy_reduce( case 57: /* numeric_value_expression ::= NK_MINUS numeric_primary */ yytestcase(yyruleno==57); { } - yy_destructor(yypParser,43,&yymsp[0].minor); + yy_destructor(yypParser,46,&yymsp[0].minor); break; case 58: /* numeric_value_expression ::= numeric_value_expression NK_PLUS numeric_value_expression */ case 59: /* numeric_value_expression ::= numeric_value_expression NK_MINUS numeric_value_expression */ yytestcase(yyruleno==59); case 60: /* numeric_value_expression ::= numeric_value_expression NK_STAR numeric_value_expression */ yytestcase(yyruleno==60); case 61: /* numeric_value_expression ::= numeric_value_expression NK_SLASH numeric_value_expression */ yytestcase(yyruleno==61); -{ yy_destructor(yypParser,42,&yymsp[-2].minor); +{ yy_destructor(yypParser,45,&yymsp[-2].minor); { } - yy_destructor(yypParser,42,&yymsp[0].minor); + yy_destructor(yypParser,45,&yymsp[0].minor); } break; case 62: /* numeric_primary ::= value_expression_primary */ -{ yy_destructor(yypParser,36,&yymsp[0].minor); +{ yy_destructor(yypParser,39,&yymsp[0].minor); { } } break; case 63: /* numeric_primary ::= value_function */ -{ yy_destructor(yypParser,34,&yymsp[0].minor); +{ yy_destructor(yypParser,37,&yymsp[0].minor); { } } break; case 64: /* table_primary ::= derived_table */ -{ yy_destructor(yypParser,55,&yymsp[0].minor); +{ yy_destructor(yypParser,58,&yymsp[0].minor); { } } break; case 65: /* derived_table ::= table_subquery */ -{ yy_destructor(yypParser,56,&yymsp[0].minor); +{ yy_destructor(yypParser,59,&yymsp[0].minor); { } } @@ -1410,18 +1397,16 @@ static YYACTIONTYPE yy_reduce( case 66: /* subquery ::= NK_LR query_expression NK_RP */ { } - yy_destructor(yypParser,33,&yymsp[-1].minor); + yy_destructor(yypParser,36,&yymsp[-1].minor); break; case 67: /* table_subquery ::= subquery */ -{ yy_destructor(yypParser,57,&yymsp[0].minor); +{ yy_destructor(yypParser,60,&yymsp[0].minor); { } } break; default: /* (52) literal ::= NK_LITERAL */ yytestcase(yyruleno==52); - /* (68) limit_clause_opt ::= */ yytestcase(yyruleno==68); - /* (69) slimit_clause_opt ::= */ yytestcase(yyruleno==69); break; /********** End reduce actions ************************************************/ }; diff --git a/source/libs/parser/src/astCreater.c b/source/libs/parser/src/parserImpl.c similarity index 59% rename from source/libs/parser/src/astCreater.c rename to source/libs/parser/src/parserImpl.c index 00a921ab73..8902da9274 100644 --- a/source/libs/parser/src/astCreater.c +++ b/source/libs/parser/src/parserImpl.c @@ -13,9 +13,10 @@ * along with this program. If not, see . */ +#include "parserImpl.h" + #include "ttoken.h" -#include "astCreateFuncs.h" -#include "astCreater.h" +#include "astCreateContext.h" typedef void* (*FMalloc)(size_t); typedef void (*FFree)(void*); @@ -24,84 +25,6 @@ extern void* NewParseAlloc(FMalloc); extern void NewParse(void*, int, SToken, void*); extern void NewParseFree(void*, FFree); -static void* acquireRaii(SAstCreateContext* pCxt, void* p) { - if (NULL == p) { - return NULL; - } - return p; -} - -static void* releaseRaii(SAstCreateContext* pCxt, void* p) { - if (NULL == p) { - return NULL; - } - return p; -} - -int32_t createAstCreater(const SParseContext* pQueryCxt, SAstCreateContext* pCxt) { - -} - -int32_t destroyAstCreater(SAstCreateContext* pCxt) { - -} - -bool checkTableName(const SToken* pTableName) { - printf("%p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); - return pTableName->n < TSDB_TABLE_NAME_LEN ? true : false; -} - -SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode) { - -} - -SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableName, const SToken* pColumnName) { - -} - -SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) { - -} - -SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { - -} - -SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName) { - SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); - if (NULL != pDbName) { - printf("DbName %p : %d, %d, %s\n", pDbName, pDbName->type, pDbName->n, pDbName->z); - strncpy(realTable->dbName, pDbName->z, pDbName->n); - } - printf("TableName %p : %d, %d, %s\n", pTableName, pTableName->type, pTableName->n, pTableName->z); - strncpy(realTable->table.tableName, pTableName->z, pTableName->n); - return acquireRaii(pCxt, realTable); -} - -SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { - SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); - select->isDistinct = isDistinct; - if (NULL == pProjectionList) { - select->isStar = true; - } - select->pProjectionList = releaseRaii(pCxt, pProjectionList); - printf("pTable = %p, name = %s\n", pTable, ((SRealTableNode*)pTable)->table.tableName); - select->pFromTable = releaseRaii(pCxt, pTable); - return acquireRaii(pCxt, select); -} - -SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { - -} - -SNode* createShowStmt(SAstCreateContext* pCxt, EShowStmtType type) { - -} - -SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias) { - -} - uint32_t toNewTokenId(uint32_t tokenId) { switch (tokenId) { case TK_UNION: diff --git a/source/libs/parser/test/newParserTest.cpp b/source/libs/parser/test/newParserTest.cpp index 36db2b3dcc..5223c9f02a 100644 --- a/source/libs/parser/test/newParserTest.cpp +++ b/source/libs/parser/test/newParserTest.cpp @@ -15,7 +15,7 @@ #include -#include "astCreater.h" +#include "parserImpl.h" using namespace std; using namespace testing; From 28c84696b47f5746f55f4d83d38c433683f3407f Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Wed, 26 Jan 2022 01:07:10 -0500 Subject: [PATCH 15/37] TD-13197 SELECT statement syntax definition --- src/connector/go | 1 - src/connector/grafanaplugin | 1 - src/connector/hivemq-tdengine-extension | 1 - 3 files changed, 3 deletions(-) delete mode 160000 src/connector/go delete mode 160000 src/connector/grafanaplugin delete mode 160000 src/connector/hivemq-tdengine-extension diff --git a/src/connector/go b/src/connector/go deleted file mode 160000 index b8f76da4a7..0000000000 --- a/src/connector/go +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b8f76da4a708d158ec3cc4b844571dc4414e36b4 diff --git a/src/connector/grafanaplugin b/src/connector/grafanaplugin deleted file mode 160000 index 4a4d79099b..0000000000 --- a/src/connector/grafanaplugin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4a4d79099b076b8ff12d5b4fdbcba54049a6866d diff --git a/src/connector/hivemq-tdengine-extension b/src/connector/hivemq-tdengine-extension deleted file mode 160000 index ce52010141..0000000000 --- a/src/connector/hivemq-tdengine-extension +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ce5201014136503d34fecbd56494b67b4961056c From 5700a83295a72cc9caf6f9e5709ad1716f61f5cb Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 14:08:13 +0800 Subject: [PATCH 16/37] [td-11818] fix compiler error. --- source/dnode/mnode/impl/src/mndSubscribe.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index 38a6b829f4..4269196c2e 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -208,16 +208,12 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas SArray *pArray; SArray *inner = taosArrayGet(pDag->pSubplans, 0); SSubplan *plan = taosArrayGetP(inner, 0); - plan->execNode.inUse = 0; - strcpy(plan->execNode.epAddr[0].fqdn, "localhost"); - plan->execNode.epAddr[0].port = 6030; + plan->execNode.nodeId = 2; SEpSet* pEpSet = &plan->execNode.epset; pEpSet->inUse = 0; - pEpSet->numOfEps = 0; addEpIntoEpSet(pEpSet, "localhost", 6030); - if (schedulerConvertDagToTaskList(pDag, &pArray) < 0) { return -1; } @@ -229,7 +225,8 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas CEp.consumerId = -1; CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1; STaskInfo *pTaskInfo = taosArrayGet(pArray, i); - tConvertQueryAddrToEpSet(&CEp.epSet, &pTaskInfo->addr); + CEp.epSet = pTaskInfo->addr.epset; + /*mDebug("subscribe convert ep %d %s %s %s %s %s\n", CEp.epSet.numOfEps, CEp.epSet.fqdn[0], CEp.epSet.fqdn[1], * CEp.epSet.fqdn[2], CEp.epSet.fqdn[3], CEp.epSet.fqdn[4]);*/ CEp.vgId = pTaskInfo->addr.nodeId; From 29a49f325ccab5c20648f249982c0ec84da5ec58 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 26 Jan 2022 06:44:54 +0000 Subject: [PATCH 17/37] rollback fetch worker --- source/util/src/tworker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/util/src/tworker.c b/source/util/src/tworker.c index 97440f8dae..ca4e5a6f30 100644 --- a/source/util/src/tworker.c +++ b/source/util/src/tworker.c @@ -181,7 +181,7 @@ static void *tFWorkerThreadFp(SQWorker *worker) { } STaosQueue *tFWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp) { - return tWorkerAllocQueue(pool, ahandle, fp, (ThreadFp)tFWorkerThreadFp); + return tWorkerAllocQueue(pool, ahandle, fp, (ThreadFp)tQWorkerThreadFp); } void tFWorkerFreeQueue(SFWorkerPool *pool, STaosQueue *queue) { tQWorkerFreeQueue(pool, queue); } From ac567bac9b1a9857ef2ea50bafe1c84e92d02288 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 14:51:57 +0800 Subject: [PATCH 18/37] [td-11818] Refactor. --- source/client/src/clientImpl.c | 1 - source/client/test/clientTests.cpp | 1276 +++++++++++------------ source/dnode/mgmt/impl/src/dndMgmt.c | 2 +- source/libs/executor/src/executorimpl.c | 4 +- source/libs/qworker/src/qworker.c | 2 - 5 files changed, 641 insertions(+), 644 deletions(-) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 102d9d545a..1db1c1756a 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -776,7 +776,6 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { if (qIsDdlQuery(pQueryNode)) { CHECK_CODE_GOTO(execDdlQuery(pRequest, pQueryNode), _return); } else { - CHECK_CODE_GOTO(getPlan(pRequest, pQueryNode, &pRequest->body.pDag, pNodeList), _return); CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return); pRequest->code = terrno; diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 12e4532b09..4dda0b3757 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -61,643 +61,643 @@ TEST(testCase, connect_Test) { taos_close(pConn); } -TEST(testCase, create_user_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, create_account_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, drop_account_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, show_user_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "show users"); - TAOS_ROW pRow = NULL; - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, drop_user_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "drop user abc"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, show_db_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "show databases"); - TAOS_ROW pRow = NULL; - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_close(pConn); -} - -TEST(testCase, create_db_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2"); - if (taos_errno(pRes) != 0) { - printf("error in create db, reason:%s\n", taos_errstr(pRes)); - } - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - ASSERT_TRUE(pFields == NULL); - - int32_t numOfFields = taos_num_fields(pRes); - ASSERT_EQ(numOfFields, 0); - - taos_free_result(pRes); - - pRes = taos_query(pConn, "create database abc1 vgroups 4"); - if (taos_errno(pRes) != 0) { - printf("error in create db, reason:%s\n", taos_errstr(pRes)); - } - taos_close(pConn); -} - -TEST(testCase, create_dnode_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000"); - if (taos_errno(pRes) != 0) { - printf("error in create dnode, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000"); - if (taos_errno(pRes) != 0) { - printf("failed to create dnode, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - taos_close(pConn); -} - -TEST(testCase, drop_dnode_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "drop dnode 3"); - if (taos_errno(pRes) != 0) { - printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); - } - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - ASSERT_TRUE(pFields == NULL); - - int32_t numOfFields = taos_num_fields(pRes); - ASSERT_EQ(numOfFields, 0); - - pRes = taos_query(pConn, "drop dnode 4"); - if (taos_errno(pRes) != 0) { - printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, use_db_test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("error in use db, reason:%s\n", taos_errstr(pRes)); - } - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - ASSERT_TRUE(pFields == NULL); - - int32_t numOfFields = taos_num_fields(pRes); - ASSERT_EQ(numOfFields, 0); - - taos_close(pConn); -} - - TEST(testCase, drop_db_test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - showDB(pConn); - - TAOS_RES* pRes = taos_query(pConn, "drop database abc1"); - if (taos_errno(pRes) != 0) { - printf("failed to drop db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - showDB(pConn); - - pRes = taos_query(pConn, "create database abc1"); - if (taos_errno(pRes) != 0) { - printf("create to drop db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, create_stable_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2"); - if (taos_errno(pRes) != 0) { - printf("error in create db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)"); - if (taos_errno(pRes) != 0) { - printf("error in create stable, reason:%s\n", taos_errstr(pRes)); - } - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - ASSERT_TRUE(pFields == NULL); - - int32_t numOfFields = taos_num_fields(pRes); - ASSERT_EQ(numOfFields, 0); - taos_free_result(pRes); - - pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)"); - if (taos_errno(pRes) != 0) { - printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes)); - } - - pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - pRes = taos_query(pConn, "drop stable `123_$^)`"); - if (taos_errno(pRes) != 0) { - printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes)); - } - - taos_close(pConn); -} - -TEST(testCase, create_table_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)"); - ASSERT_EQ(taos_errno(pRes), 0); - - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)"); - ASSERT_NE(taos_errno(pRes), 0); - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, create_ctable_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("failed to use db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)"); - if (taos_errno(pRes) != 0) { - printf("failed to create stable, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table tm0 using st1 tags(1)"); - if (taos_errno(pRes) != 0) { - printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, show_stable_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != nullptr); - - TAOS_RES* pRes = taos_query(pConn, "show abc1.stables"); - if (taos_errno(pRes) != 0) { - printf("failed to show stables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - TAOS_ROW pRow = NULL; - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, show_vgroup_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("failed to use db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "show vgroups"); - if (taos_errno(pRes) != 0) { - printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - TAOS_ROW pRow = NULL; - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, create_multiple_tables) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - ASSERT_NE(pConn, nullptr); - - TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); - if (taos_errno(pRes) != 0) { - printf("failed to create db, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - taos_close(pConn); - return; - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("failed to use db, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - taos_close(pConn); - return; - } - - taos_free_result(pRes); - - pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); - if (taos_errno(pRes) != 0) { - printf("failed to create stable tables, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table t_2 using st1 tags(1)"); - if (taos_errno(pRes) != 0) { - printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - taos_free_result(pRes); - pRes = taos_query(pConn, "create table t_3 using st1 tags(2)"); - if (taos_errno(pRes) != 0) { - printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - TAOS_ROW pRow = NULL; - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - - for (int32_t i = 0; i < 20; ++i) { - char sql[512] = {0}; - snprintf(sql, tListLen(sql), - "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i, - (i + 1) * 30, (i + 2) * 40); - TAOS_RES* pres = taos_query(pConn, sql); - if (taos_errno(pres) != 0) { - printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres)); - } - taos_free_result(pres); - } - - taos_close(pConn); -} - -TEST(testCase, show_table_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "show tables"); - if (taos_errno(pRes) != 0) { - printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - } - - taos_free_result(pRes); - - pRes = taos_query(pConn, "show abc1.tables"); - if (taos_errno(pRes) != 0) { - printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - } - - TAOS_ROW pRow = NULL; - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - int32_t count = 0; - char str[512] = {0}; - - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%d: %s\n", ++count, str); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, drop_stable_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != nullptr); - - TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); - if (taos_errno(pRes) != 0) { - printf("error in creating db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("error in using db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "drop stable st1"); - if (taos_errno(pRes) != 0) { - printf("failed to drop stable, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, generated_request_id_test) { - SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); - - for (int32_t i = 0; i < 50000; ++i) { - uint64_t v = generateRequestId(); - void* result = taosHashGet(phash, &v, sizeof(v)); - if (result != nullptr) { - printf("0x%lx, index:%d\n", v, i); - } - assert(result == nullptr); - taosHashPut(phash, &v, sizeof(v), NULL, 0); - } - - taosHashCleanup(phash); -} - -TEST(testCase, insert_test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - ASSERT_NE(pConn, nullptr); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - - pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); - if (taos_errno(pRes) != 0) { - printf("failed to create into table t_2, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -#if 0 -TEST(testCase, create_topic_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("error in use db, reason:%s\n", taos_errstr(pRes)); - } - //taos_free_result(pRes); - - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - ASSERT_TRUE(pFields == nullptr); - - int32_t numOfFields = taos_num_fields(pRes); - ASSERT_EQ(numOfFields, 0); - - taos_free_result(pRes); - - char* sql = "select * from tu"; - pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql)); - taos_free_result(pRes); - taos_close(pConn); -} - - -TEST(testCase, tmq_subscribe_Test) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - if (taos_errno(pRes) != 0) { - printf("error in use db, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - tmq_conf_t* conf = tmq_conf_new(); - tmq_conf_set(conf, "group.id", "tg1"); - tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0); - - tmq_list_t* topic_list = tmq_list_new(); - tmq_list_append(topic_list, "test_topic_1"); - tmq_subscribe(tmq, topic_list); - - while (1) { - tmq_message_t* msg = tmq_consume_poll(tmq, 0); - printf("get msg\n"); - //if (msg == NULL) break; - } -} -#endif - -TEST(testCase, tmq_consume_Test) { -} - -TEST(testCase, tmq_commit_TEST) { -} - -TEST(testCase, projection_query_tables) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - ASSERT_NE(pConn, nullptr); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - - pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)"); - if (taos_errno(pRes) != 0) { - printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - pRes = taos_query(pConn, "create table tu using st1 tags(1)"); - if (taos_errno(pRes) != 0) { - printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); - } - taos_free_result(pRes); - - for(int32_t i = 0; i < 100000; ++i) { - char sql[512] = {0}; - sprintf(sql, "insert into tu values(now+%da, %d)", i, i); - TAOS_RES* p = taos_query(pConn, sql); - if (taos_errno(p) != 0) { - printf("failed to insert data, reason:%s\n", taos_errstr(p)); - } - - taos_free_result(p); - } - - pRes = taos_query(pConn, "select * from tu"); - if (taos_errno(pRes) != 0) { - printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - TAOS_ROW pRow = NULL; - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - taos_close(pConn); -} - -TEST(testCase, projection_query_stables) { - TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); - ASSERT_NE(pConn, nullptr); - - TAOS_RES* pRes = taos_query(pConn, "use abc1"); - taos_free_result(pRes); - - pRes = taos_query(pConn, "select ts from st1"); - if (taos_errno(pRes) != 0) { - printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); - taos_free_result(pRes); - ASSERT_TRUE(false); - } - - TAOS_ROW pRow = NULL; - TAOS_FIELD* pFields = taos_fetch_fields(pRes); - int32_t numOfFields = taos_num_fields(pRes); - - char str[512] = {0}; - while ((pRow = taos_fetch_row(pRes)) != NULL) { - int32_t code = taos_print_row(str, pRow, pFields, numOfFields); - printf("%s\n", str); - } - - taos_free_result(pRes); - taos_close(pConn); -} +//TEST(testCase, create_user_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, create_account_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, drop_account_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, show_user_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "show users"); +// TAOS_ROW pRow = NULL; +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, drop_user_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "drop user abc"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, show_db_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "show databases"); +// TAOS_ROW pRow = NULL; +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_close(pConn); +//} +// +//TEST(testCase, create_db_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2"); +// if (taos_errno(pRes) != 0) { +// printf("error in create db, reason:%s\n", taos_errstr(pRes)); +// } +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// ASSERT_TRUE(pFields == NULL); +// +// int32_t numOfFields = taos_num_fields(pRes); +// ASSERT_EQ(numOfFields, 0); +// +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create database abc1 vgroups 4"); +// if (taos_errno(pRes) != 0) { +// printf("error in create db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_close(pConn); +//} +// +//TEST(testCase, create_dnode_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000"); +// if (taos_errno(pRes) != 0) { +// printf("error in create dnode, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create dnode, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// taos_close(pConn); +//} +// +//TEST(testCase, drop_dnode_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "drop dnode 3"); +// if (taos_errno(pRes) != 0) { +// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); +// } +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// ASSERT_TRUE(pFields == NULL); +// +// int32_t numOfFields = taos_num_fields(pRes); +// ASSERT_EQ(numOfFields, 0); +// +// pRes = taos_query(pConn, "drop dnode 4"); +// if (taos_errno(pRes) != 0) { +// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, use_db_test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("error in use db, reason:%s\n", taos_errstr(pRes)); +// } +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// ASSERT_TRUE(pFields == NULL); +// +// int32_t numOfFields = taos_num_fields(pRes); +// ASSERT_EQ(numOfFields, 0); +// +// taos_close(pConn); +//} +// +// TEST(testCase, drop_db_test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// showDB(pConn); +// +// TAOS_RES* pRes = taos_query(pConn, "drop database abc1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to drop db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// showDB(pConn); +// +// pRes = taos_query(pConn, "create database abc1"); +// if (taos_errno(pRes) != 0) { +// printf("create to drop db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, create_stable_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2"); +// if (taos_errno(pRes) != 0) { +// printf("error in create db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)"); +// if (taos_errno(pRes) != 0) { +// printf("error in create stable, reason:%s\n", taos_errstr(pRes)); +// } +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// ASSERT_TRUE(pFields == NULL); +// +// int32_t numOfFields = taos_num_fields(pRes); +// ASSERT_EQ(numOfFields, 0); +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes)); +// } +// +// pRes = taos_query(pConn, "use abc1"); +// taos_free_result(pRes); +// pRes = taos_query(pConn, "drop stable `123_$^)`"); +// if (taos_errno(pRes) != 0) { +// printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_close(pConn); +//} +// +//TEST(testCase, create_table_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)"); +// ASSERT_EQ(taos_errno(pRes), 0); +// +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)"); +// ASSERT_NE(taos_errno(pRes), 0); +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, create_ctable_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create stable, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table tm0 using st1 tags(1)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, show_stable_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "show abc1.stables"); +// if (taos_errno(pRes) != 0) { +// printf("failed to show stables, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// TAOS_ROW pRow = NULL; +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, show_vgroup_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "show vgroups"); +// if (taos_errno(pRes) != 0) { +// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// TAOS_ROW pRow = NULL; +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, create_multiple_tables) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// ASSERT_NE(pConn, nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create db, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// taos_close(pConn); +// return; +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// taos_close(pConn); +// return; +// } +// +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create stable tables, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table t_2 using st1 tags(1)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// taos_free_result(pRes); +// pRes = taos_query(pConn, "create table t_3 using st1 tags(2)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// TAOS_ROW pRow = NULL; +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// +// for (int32_t i = 0; i < 20; ++i) { +// char sql[512] = {0}; +// snprintf(sql, tListLen(sql), +// "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i, +// (i + 1) * 30, (i + 2) * 40); +// TAOS_RES* pres = taos_query(pConn, sql); +// if (taos_errno(pres) != 0) { +// printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres)); +// } +// taos_free_result(pres); +// } +// +// taos_close(pConn); +//} +// +//TEST(testCase, show_table_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "show tables"); +// if (taos_errno(pRes) != 0) { +// printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// } +// +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "show abc1.tables"); +// if (taos_errno(pRes) != 0) { +// printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// } +// +// TAOS_ROW pRow = NULL; +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// int32_t count = 0; +// char str[512] = {0}; +// +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%d: %s\n", ++count, str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, drop_stable_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); +// if (taos_errno(pRes) != 0) { +// printf("error in creating db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("error in using db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "drop stable st1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to drop stable, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, generated_request_id_test) { +// SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); +// +// for (int32_t i = 0; i < 50000; ++i) { +// uint64_t v = generateRequestId(); +// void* result = taosHashGet(phash, &v, sizeof(v)); +// if (result != nullptr) { +// printf("0x%lx, index:%d\n", v, i); +// } +// assert(result == nullptr); +// taosHashPut(phash, &v, sizeof(v), NULL, 0); +// } +// +// taosHashCleanup(phash); +//} +// +//TEST(testCase, insert_test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// ASSERT_NE(pConn, nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create into table t_2, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//#if 0 +//TEST(testCase, create_topic_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("error in use db, reason:%s\n", taos_errstr(pRes)); +// } +// //taos_free_result(pRes); +// +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// ASSERT_TRUE(pFields == nullptr); +// +// int32_t numOfFields = taos_num_fields(pRes); +// ASSERT_EQ(numOfFields, 0); +// +// taos_free_result(pRes); +// +// char* sql = "select * from tu"; +// pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql)); +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +// +//TEST(testCase, tmq_subscribe_Test) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// if (taos_errno(pRes) != 0) { +// printf("error in use db, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// tmq_conf_t* conf = tmq_conf_new(); +// tmq_conf_set(conf, "group.id", "tg1"); +// tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0); +// +// tmq_list_t* topic_list = tmq_list_new(); +// tmq_list_append(topic_list, "test_topic_1"); +// tmq_subscribe(tmq, topic_list); +// +// while (1) { +// tmq_message_t* msg = tmq_consume_poll(tmq, 0); +// printf("get msg\n"); +// //if (msg == NULL) break; +// } +//} +//#endif +// +//TEST(testCase, tmq_consume_Test) { +//} +// +//TEST(testCase, tmq_commit_TEST) { +//} +// +//TEST(testCase, projection_query_tables) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// ASSERT_NE(pConn, nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "create table tu using st1 tags(1)"); +// if (taos_errno(pRes) != 0) { +// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); +// } +// taos_free_result(pRes); +// +// for(int32_t i = 0; i < 100000; ++i) { +// char sql[512] = {0}; +// sprintf(sql, "insert into tu values(now+%da, %d)", i, i); +// TAOS_RES* p = taos_query(pConn, sql); +// if (taos_errno(p) != 0) { +// printf("failed to insert data, reason:%s\n", taos_errstr(p)); +// } +// +// taos_free_result(p); +// } +// +// pRes = taos_query(pConn, "select * from tu"); +// if (taos_errno(pRes) != 0) { +// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// TAOS_ROW pRow = NULL; +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, projection_query_stables) { +// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); +// ASSERT_NE(pConn, nullptr); +// +// TAOS_RES* pRes = taos_query(pConn, "use abc1"); +// taos_free_result(pRes); +// +// pRes = taos_query(pConn, "select ts from st1"); +// if (taos_errno(pRes) != 0) { +// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); +// taos_free_result(pRes); +// ASSERT_TRUE(false); +// } +// +// TAOS_ROW pRow = NULL; +// TAOS_FIELD* pFields = taos_fetch_fields(pRes); +// int32_t numOfFields = taos_num_fields(pRes); +// +// char str[512] = {0}; +// while ((pRow = taos_fetch_row(pRes)) != NULL) { +// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); +// printf("%s\n", str); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} TEST(testCase, agg_query_tables) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); @@ -712,7 +712,7 @@ TEST(testCase, agg_query_tables) { } taos_free_result(pRes); - pRes = taos_query(pConn, "select count(*) from tu"); + pRes = taos_query(pConn, "select count(*) from t_x_19"); if (taos_errno(pRes) != 0) { printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); taos_free_result(pRes); diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index df88610911..0674d719b9 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -398,7 +398,7 @@ void dndSendStatusReq(SDnode *pDnode) { static void dndUpdateDnodeCfg(SDnode *pDnode, SDnodeCfg *pCfg) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; if (pMgmt->dnodeId == 0) { - dInfo("set dnodeId:%d clusterId:%" PRId64, pCfg->dnodeId, pCfg->clusterId); + dInfo("set dnodeId:%d clusterId:0x%" PRId64, pCfg->dnodeId, pCfg->clusterId); taosWLockLatch(&pMgmt->latch); pMgmt->dnodeId = pCfg->dnodeId; pMgmt->clusterId = pCfg->clusterId; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index ce3738b17d..1322ec6b83 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -8825,14 +8825,14 @@ void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols) { } void doDestroyTask(SExecTaskInfo *pTaskInfo) { + qDebug("%s execTask is freed", GET_TASKID(pTaskInfo)); + doDestroyTableQueryInfo(&pTaskInfo->tableqinfoGroupInfo); // taosArrayDestroy(pTaskInfo->summary.queryProfEvents); // taosHashCleanup(pTaskInfo->summary.operatorProfResults); tfree(pTaskInfo->sql); tfree(pTaskInfo->id.str); - qDebug("%s execTask is freed", GET_TASKID(pTaskInfo)); - tfree(pTaskInfo); } diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 8fc8a783c4..9b9b6a73ca 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -1100,8 +1100,6 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) { atomic_store_8(&ctx->queryInQueue, 0); atomic_store_8(&ctx->queryContinue, 0); - DataSinkHandle sinkHandle = ctx->sinkHandle; - QW_ERR_JRET(qwExecTask(QW_FPARAMS(), ctx, &queryEnd)); if (QW_IS_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { From 1a543e56056764ff9b413948bd1d02221f475cd8 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 15:30:43 +0800 Subject: [PATCH 19/37] define BUILD_WITH_UV_TRANS --- cmake/cmake.options | 6 ++++++ source/libs/transport/CMakeLists.txt | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/cmake.options b/cmake/cmake.options index faa45256fb..e84d02800c 100644 --- a/cmake/cmake.options +++ b/cmake/cmake.options @@ -50,6 +50,12 @@ option( OFF ) +option( + BUILD_WITH_UV_TRANS + "If build with libuv_trans " + OFF +) + option( BUILD_WITH_CRAFT "If build with canonical-raft" diff --git a/source/libs/transport/CMakeLists.txt b/source/libs/transport/CMakeLists.txt index 61d781210c..5c214b75a1 100644 --- a/source/libs/transport/CMakeLists.txt +++ b/source/libs/transport/CMakeLists.txt @@ -13,7 +13,7 @@ target_link_libraries( PUBLIC util PUBLIC common ) -if (${BUILD_WITH_UV}) +if (${BUILD_WITH_UV_TRANS}) target_include_directories( transport PUBLIC "${CMAKE_SOURCE_DIR}/contrib/libuv/include" @@ -25,7 +25,7 @@ if (${BUILD_WITH_UV}) PUBLIC uv_a ) add_definitions(-DUSE_UV) -endif(${BUILD_WITH_UV}) +endif(${BUILD_WITH_UV_TRANS}) if (${BUILD_TEST}) add_subdirectory(test) From 001cab2da70797fdeb04a6b69c12a7018be79c3c Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 26 Jan 2022 07:32:07 +0000 Subject: [PATCH 20/37] check dnodeId while create vnode --- source/dnode/mgmt/impl/src/dndVnodes.c | 7 ++++ source/dnode/mgmt/impl/test/vnode/vnode.cpp | 38 +++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/source/dnode/mgmt/impl/src/dndVnodes.c b/source/dnode/mgmt/impl/src/dndVnodes.c index c27f3a151e..c4d14ef697 100644 --- a/source/dnode/mgmt/impl/src/dndVnodes.c +++ b/source/dnode/mgmt/impl/src/dndVnodes.c @@ -16,6 +16,7 @@ #define _DEFAULT_SOURCE #include "dndVnodes.h" #include "dndTransport.h" +#include "dndMgmt.h" typedef struct { int32_t vgId; @@ -577,6 +578,12 @@ int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *pReq) { SWrapperCfg wrapperCfg = {0}; dndGenerateWrapperCfg(pDnode, pCreate, &wrapperCfg); + if (pCreate->dnodeId != dndGetDnodeId(pDnode)) { + terrno = TSDB_CODE_DND_VNODE_INVALID_OPTION; + dDebug("vgId:%d, failed to create vnode since %s", pCreate->vgId, terrstr()); + return -1; + } + SVnodeObj *pVnode = dndAcquireVnode(pDnode, pCreate->vgId); if (pVnode != NULL) { dDebug("vgId:%d, already exist", pCreate->vgId); diff --git a/source/dnode/mgmt/impl/test/vnode/vnode.cpp b/source/dnode/mgmt/impl/test/vnode/vnode.cpp index 1799bf66b0..17092ed737 100644 --- a/source/dnode/mgmt/impl/test/vnode/vnode.cpp +++ b/source/dnode/mgmt/impl/test/vnode/vnode.cpp @@ -68,6 +68,44 @@ TEST_F(DndTestVnode, 01_Create_Vnode) { ASSERT_EQ(pRsp->code, TSDB_CODE_DND_VNODE_ALREADY_DEPLOYED); } } + + { + int32_t contLen = sizeof(SCreateVnodeReq); + + SCreateVnodeReq* pReq = (SCreateVnodeReq*)rpcMallocCont(contLen); + pReq->vgId = htonl(2); + pReq->dnodeId = htonl(3); + strcpy(pReq->db, "1.d1"); + pReq->dbUid = htobe64(9527); + pReq->vgVersion = htonl(1); + pReq->cacheBlockSize = htonl(16); + pReq->totalBlocks = htonl(10); + pReq->daysPerFile = htonl(10); + pReq->daysToKeep0 = htonl(3650); + pReq->daysToKeep1 = htonl(3650); + pReq->daysToKeep2 = htonl(3650); + pReq->minRows = htonl(100); + pReq->minRows = htonl(4096); + pReq->commitTime = htonl(3600); + pReq->fsyncPeriod = htonl(3000); + pReq->walLevel = 1; + pReq->precision = 0; + pReq->compression = 2; + pReq->replica = 1; + pReq->quorum = 1; + pReq->update = 0; + pReq->cacheLastRow = 0; + pReq->selfIndex = 0; + for (int r = 0; r < pReq->replica; ++r) { + SReplica* pReplica = &pReq->replicas[r]; + pReplica->id = htonl(1); + pReplica->port = htons(9527); + } + + SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_VNODE, pReq, contLen); + ASSERT_NE(pRsp, nullptr); + ASSERT_EQ(pRsp->code, TSDB_CODE_DND_VNODE_INVALID_OPTION); + } } TEST_F(DndTestVnode, 02_ALTER_Vnode) { From 21ecacf40e04412eab7ca6a5875e2150e20d46c2 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 15:53:08 +0800 Subject: [PATCH 21/37] [td-13288]fix crash when querying empty child table. --- source/libs/executor/src/executorimpl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 1322ec6b83..836b17a868 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -5896,7 +5896,7 @@ static SSDataBlock* doAggregate(void* param, bool* newgroup) { finalizeQueryResult(pOperator, pInfo->pCtx, &pInfo->resultRowInfo, pInfo->rowCellInfoOffset); pInfo->pRes->info.rows = getNumOfResult(pInfo->pCtx, pOperator->numOfOutput); - return pInfo->pRes; + return (pInfo->pRes->info.rows != 0)? pInfo->pRes:NULL; } static SSDataBlock* doSTableAggregate(void* param, bool* newgroup) { From b31b131833a955b86ca3f8eba9e6c285b0282ae6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 26 Jan 2022 08:52:25 +0000 Subject: [PATCH 22/37] impl meta with lock --- source/dnode/vnode/src/meta/metaBDBImpl.c | 81 +++++++++++++++++------ 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaBDBImpl.c b/source/dnode/vnode/src/meta/metaBDBImpl.c index dfdc144750..69bce7bbeb 100644 --- a/source/dnode/vnode/src/meta/metaBDBImpl.c +++ b/source/dnode/vnode/src/meta/metaBDBImpl.c @@ -20,6 +20,10 @@ #include "tcoding.h" #include "thash.h" +#define IMPL_WITH_LOCK 1 +// #if IMPL_WITH_LOCK +// #endif + typedef struct { tb_uid_t uid; int32_t sver; @@ -27,6 +31,9 @@ typedef struct { } SSchemaKey; struct SMetaDB { +#if IMPL_WITH_LOCK + pthread_rwlock_t rwlock; +#endif // DB DB *pTbDB; DB *pSchemaDB; @@ -58,6 +65,9 @@ static void * metaDecodeTbInfo(void *buf, STbCfg *pTbCfg); static void metaClearTbCfg(STbCfg *pTbCfg); static int metaEncodeSchema(void **buf, SSchemaWrapper *pSW); static void * metaDecodeSchema(void *buf, SSchemaWrapper *pSW); +static void metaDBWLock(SMetaDB *pDB); +static void metaDBRLock(SMetaDB *pDB); +static void metaDBULock(SMetaDB *pDB); #define BDB_PERR(info, code) fprintf(stderr, info " reason: %s", db_strerror(code)) @@ -131,7 +141,8 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { tb_uid_t uid; char buf[512]; void * pBuf; - DBT key, value; + DBT key1, value1; + DBT key2, value2; SSchema *pSchema = NULL; if (pTbCfg->type == META_SUPER_TABLE) { @@ -143,19 +154,17 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { { // save table info pBuf = buf; - memset(&key, 0, sizeof(key)); - memset(&value, 0, sizeof(key)); + memset(&key1, 0, sizeof(key1)); + memset(&value1, 0, sizeof(key1)); - key.data = &uid; - key.size = sizeof(uid); + key1.data = &uid; + key1.size = sizeof(uid); metaEncodeTbInfo(&pBuf, pTbCfg); - value.data = buf; - value.size = POINTER_DISTANCE(pBuf, buf); - value.app_data = pTbCfg; - - pMeta->pDB->pTbDB->put(pMeta->pDB->pTbDB, NULL, &key, &value, 0); + value1.data = buf; + value1.size = POINTER_DISTANCE(pBuf, buf); + value1.app_data = pTbCfg; } // save schema @@ -170,22 +179,25 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { if (pSchema) { pBuf = buf; - memset(&key, 0, sizeof(key)); - memset(&value, 0, sizeof(key)); + memset(&key2, 0, sizeof(key2)); + memset(&value2, 0, sizeof(key2)); SSchemaKey schemaKey = {uid, 0 /*TODO*/, 0}; - key.data = &schemaKey; - key.size = sizeof(schemaKey); + key2.data = &schemaKey; + key2.size = sizeof(schemaKey); SSchemaWrapper sw = {.nCols = ncols, .pSchema = pSchema}; metaEncodeSchema(&pBuf, &sw); - value.data = buf; - value.size = POINTER_DISTANCE(pBuf, buf); - - pMeta->pDB->pSchemaDB->put(pMeta->pDB->pSchemaDB, NULL, &key, &value, 0); + value2.data = buf; + value2.size = POINTER_DISTANCE(pBuf, buf); } + metaDBWLock(pMeta->pDB); + pMeta->pDB->pTbDB->put(pMeta->pDB->pTbDB, NULL, &key1, &value1, 0); + pMeta->pDB->pSchemaDB->put(pMeta->pDB->pSchemaDB, NULL, &key2, &value2, 0); + metaDBULock(pMeta->pDB); + return 0; } @@ -234,11 +246,18 @@ static SMetaDB *metaNewDB() { return NULL; } +#if IMPL_WITH_LOCK + pthread_rwlock_init(&pDB->rwlock, NULL); +#endif + return pDB; } static void metaFreeDB(SMetaDB *pDB) { if (pDB) { +#if IMPL_WITH_LOCK + pthread_rwlock_destroy(&pDB->rwlock); +#endif free(pDB); } } @@ -467,7 +486,9 @@ STbCfg *metaGetTbInfoByUid(SMeta *pMeta, tb_uid_t uid) { key.size = sizeof(uid); // Query + metaDBRLock(pDB); ret = pDB->pTbDB->get(pDB->pTbDB, NULL, &key, &value, 0); + metaDBULock(pDB); if (ret != 0) { return NULL; } @@ -496,7 +517,9 @@ STbCfg *metaGetTbInfoByName(SMeta *pMeta, char *tbname, tb_uid_t *uid) { key.size = strlen(tbname); // Query + metaDBRLock(pDB); ret = pDB->pNameIdx->pget(pDB->pNameIdx, NULL, &key, &pkey, &pvalue, 0); + metaDBULock(pDB); if (ret != 0) { return NULL; } @@ -529,7 +552,9 @@ SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, boo key.size = sizeof(schemaKey); // Query + metaDBRLock(pDB); ret = pDB->pSchemaDB->get(pDB->pSchemaDB, NULL, &key, &value, 0); + metaDBULock(pDB); if (ret != 0) { printf("failed to query schema DB since %s================\n", db_strerror(ret)); return NULL; @@ -687,4 +712,22 @@ tb_uid_t metaCtbCursorNext(SMCtbCursor *pCtbCur) { } else { return 0; } -} \ No newline at end of file +} + +static void metaDBWLock(SMetaDB *pDB) { +#if IMPL_WITH_LOCK + pthread_rwlock_wrlock(&(pDB->rwlock)); +#endif +} + +static void metaDBRLock(SMetaDB *pDB) { +#if IMPL_WITH_LOCK + pthread_rwlock_rdlock(&(pDB->rwlock)); +#endif +} + +static void metaDBULock(SMetaDB *pDB) { +#if IMPL_WITH_LOCK + pthread_rwlock_unlock(&(pDB->rwlock)); +#endif +} From 107107a7bb7f4d1527d2649a5670b0bc69a3899a Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 26 Jan 2022 09:29:48 +0000 Subject: [PATCH 23/37] fix --- source/dnode/vnode/src/meta/metaBDBImpl.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaBDBImpl.c b/source/dnode/vnode/src/meta/metaBDBImpl.c index 69bce7bbeb..e5ccd02e48 100644 --- a/source/dnode/vnode/src/meta/metaBDBImpl.c +++ b/source/dnode/vnode/src/meta/metaBDBImpl.c @@ -140,6 +140,7 @@ void metaCloseDB(SMeta *pMeta) { int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { tb_uid_t uid; char buf[512]; + char buf1[512]; void * pBuf; DBT key1, value1; DBT key2, value2; @@ -178,7 +179,7 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { } if (pSchema) { - pBuf = buf; + pBuf = buf1; memset(&key2, 0, sizeof(key2)); memset(&value2, 0, sizeof(key2)); SSchemaKey schemaKey = {uid, 0 /*TODO*/, 0}; @@ -189,13 +190,15 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) { SSchemaWrapper sw = {.nCols = ncols, .pSchema = pSchema}; metaEncodeSchema(&pBuf, &sw); - value2.data = buf; - value2.size = POINTER_DISTANCE(pBuf, buf); + value2.data = buf1; + value2.size = POINTER_DISTANCE(pBuf, buf1); } metaDBWLock(pMeta->pDB); pMeta->pDB->pTbDB->put(pMeta->pDB->pTbDB, NULL, &key1, &value1, 0); - pMeta->pDB->pSchemaDB->put(pMeta->pDB->pSchemaDB, NULL, &key2, &value2, 0); + if (pSchema) { + pMeta->pDB->pSchemaDB->put(pMeta->pDB->pSchemaDB, NULL, &key2, &value2, 0); + } metaDBULock(pMeta->pDB); return 0; From 78e49d6b08d3b8c72c726c141d835e1a4d6501a0 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 26 Jan 2022 17:42:31 +0800 Subject: [PATCH 24/37] feature/qnode --- include/common/tmsg.h | 38 ++++++++++++++++- source/client/src/clientHb.c | 51 +++++++++++++++-------- source/client/src/clientMsgHandler.c | 14 ++++++- source/common/src/tmsg.c | 2 +- source/dnode/mnode/impl/src/mndDb.c | 5 +++ source/dnode/mnode/impl/src/mndProfile.c | 5 ++- source/libs/catalog/inc/catalogInt.h | 2 +- source/libs/catalog/src/catalog.c | 23 +++++----- source/libs/executor/src/dataDispatcher.c | 1 + source/util/src/terror.c | 2 +- 10 files changed, 107 insertions(+), 36 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 210804143b..8e62b4d0db 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1391,9 +1391,26 @@ void* tDeserializeSClientHbReq(void* buf, SClientHbReq* pReq); int tSerializeSClientHbRsp(void** buf, const SClientHbRsp* pRsp); void* tDeserializeSClientHbRsp(void* buf, SClientHbRsp* pRsp); + +static FORCE_INLINE void tFreeReqKvHash(SHashObj* info) { + void *pIter = taosHashIterate(info, NULL); + while (pIter != NULL) { + SKv* kv = (SKv*)pIter; + + tfree(kv->value); + + pIter = taosHashIterate(info, pIter); + } +} + + static FORCE_INLINE void tFreeClientHbReq(void *pReq) { SClientHbReq* req = (SClientHbReq*)pReq; - if (req->info) taosHashCleanup(req->info); + if (req->info) { + tFreeReqKvHash(req->info); + + taosHashCleanup(req->info); + } } int tSerializeSClientHbBatchReq(void** buf, const SClientHbBatchReq* pReq); @@ -1409,6 +1426,25 @@ static FORCE_INLINE void tFreeClientHbBatchReq(void* pReq, bool deep) { free(pReq); } +static FORCE_INLINE void tFreeClientKv(void *pKv) { + SKv *kv = (SKv *)pKv; + if (kv) { + tfree(kv->value); + } +} + +static FORCE_INLINE void tFreeClientHbRsp(void *pRsp) { + SClientHbRsp* rsp = (SClientHbRsp*)pRsp; + if (rsp->info) taosArrayDestroyEx(rsp->info, tFreeClientKv); +} + + +static FORCE_INLINE void tFreeClientHbBatchRsp(void* pRsp) { + SClientHbBatchRsp *rsp = (SClientHbBatchRsp*)pRsp; + taosArrayDestroyEx(rsp->rsps, tFreeClientHbRsp); +} + + int tSerializeSClientHbBatchRsp(void** buf, const SClientHbBatchRsp* pBatchRsp); void* tDeserializeSClientHbBatchRsp(void* buf, SClientHbBatchRsp* pBatchRsp); diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index 0ab3089f13..4cb2cd2aae 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -37,6 +37,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog rsp->vgVersion = ntohl(rsp->vgVersion); rsp->vgNum = ntohl(rsp->vgNum); rsp->uid = be64toh(rsp->uid); + + tscDebug("hb db rsp, db:%s, vgVersion:%d, uid:%"PRIx64, rsp->db, rsp->vgVersion, rsp->uid); if (rsp->vgVersion < 0) { SDbVgVersion dbInfo; @@ -96,6 +98,9 @@ static int32_t hbQueryHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRs } int32_t kvNum = pRsp->info ? taosArrayGetSize(pRsp->info) : 0; + + tscDebug("hb got %d rsp kv", kvNum); + for (int32_t i = 0; i < kvNum; ++i) { SKv *kv = taosArrayGet(pRsp->info, i); switch (kv->key) { @@ -130,28 +135,42 @@ static int32_t hbQueryHbRspHandle(struct SAppHbMgr *pAppHbMgr, SClientHbRsp* pRs } static int32_t hbMqAsyncCallBack(void* param, const SDataBuf* pMsg, int32_t code) { + static int32_t emptyRspNum = 0; if (code != 0) { + tfree(param); return -1; } char *key = (char *)param; SClientHbBatchRsp pRsp = {0}; tDeserializeSClientHbBatchRsp(pMsg->pData, &pRsp); - int32_t reqNum = taosArrayGetSize(pRsp.rsps); + int32_t rspNum = taosArrayGetSize(pRsp.rsps); SAppInstInfo** pInst = taosHashGet(appInfo.pInstMap, key, strlen(key)); if (pInst == NULL || NULL == *pInst) { - tscError("cluster not exist, key:%s", key); + tscError("cluster not exist, key:%s", key); + tfree(param); + tFreeClientHbBatchRsp(&pRsp); return -1; } - for (int32_t i = 0; i < reqNum; ++i) { + tfree(param); + + if (rspNum) { + tscDebug("hb got %d rsp, %d empty rsp prior", rspNum, atomic_val_compare_exchange_32(&emptyRspNum, emptyRspNum, 0)); + } else { + atomic_add_fetch_32(&emptyRspNum, 1); + } + + for (int32_t i = 0; i < rspNum; ++i) { SClientHbRsp* rsp = taosArrayGet(pRsp.rsps, i); code = (*clientHbMgr.rspHandle[rsp->connKey.hbType])((*pInst)->pAppHbMgr, rsp); if (code) { break; } } + + tFreeClientHbBatchRsp(&pRsp); return code; } @@ -166,6 +185,10 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl return code; } + if (dbNum <= 0) { + return TSDB_CODE_SUCCESS; + } + for (int32_t i = 0; i < dbNum; ++i) { SDbVgVersion *db = &dbs[i]; db->dbId = htobe64(db->dbId); @@ -173,6 +196,9 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl } SKv kv = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = sizeof(SDbVgVersion) * dbNum, .value = dbs}; + + tscDebug("hb got %d expired db, valueLen:%d", dbNum, kv.valueLen); + taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); return TSDB_CODE_SUCCESS; @@ -213,21 +239,9 @@ static FORCE_INLINE void hbMgrInitHandle() { hbMgrInitMqHbHandle(); } - -void hbFreeReqKvHash(SHashObj* info) { - void *pIter = taosHashIterate(info, NULL); - while (pIter != NULL) { - SKv* kv = pIter; - - tfree(kv->value); - - pIter = taosHashIterate(info, pIter); - } -} - void hbFreeReq(void *req) { SClientHbReq *pReq = (SClientHbReq *)req; - hbFreeReqKvHash(pReq->info); + tFreeReqKvHash(pReq->info); } @@ -274,7 +288,7 @@ void hbClearReqInfo(SAppHbMgr *pAppHbMgr) { while (pIter != NULL) { SClientHbReq* pOneReq = pIter; - hbFreeReqKvHash(pOneReq->info); + tFreeReqKvHash(pOneReq->info); taosHashClear(pOneReq->info); pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter); @@ -333,7 +347,8 @@ static void* hbThreadFunc(void* param) { int64_t transporterId = 0; SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); asyncSendMsgToServer(pAppInstInfo->pTransporter, &epSet, &transporterId, pInfo); - tFreeClientHbBatchReq(pReq, false); + tFreeClientHbBatchReq(pReq, false); + hbClearReqInfo(pAppHbMgr); atomic_add_fetch_32(&pAppHbMgr->reportCnt, 1); } diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index 831006ac89..7b4b3353fb 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -18,6 +18,7 @@ #include "tname.h" #include "clientInt.h" #include "clientLog.h" +#include "catalog.h" int (*handleRequestRspFp[TDMT_MAX])(void*, const SDataBuf* pMsg, int32_t code); @@ -287,7 +288,6 @@ int32_t processCreateTableRsp(void* param, const SDataBuf* pMsg, int32_t code) { } int32_t processDropDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { - // todo: Remove cache in catalog cache. SRequestObj* pRequest = param; if (code != TSDB_CODE_SUCCESS) { setErrno(pRequest, code); @@ -295,6 +295,18 @@ int32_t processDropDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { return code; } + SDropDbReq *req = pRequest->body.requestMsg.pData; + + SDbVgVersion dbVer = {0}; + struct SCatalog *pCatalog = NULL; + + strncpy(dbVer.dbName, req->db, sizeof(dbVer.dbName)); + dbVer.dbId = 0; //TODO GET DBID FROM RSP + + catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog); + + catalogRemoveDBVgroup(pCatalog, &dbVer); + tsem_post(&pRequest->body.rspSem); return code; } diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 0d1576d03c..34b55fd812 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -114,7 +114,7 @@ void *tDeserializeSClientHbReq(void *buf, SClientHbReq *pReq) { for(int i = 0; i < kvNum; i++) { SKv kv; buf = taosDecodeSKv(buf, &kv); - taosHashPut(pReq->info, &kv.key, sizeof(kv.key), kv.value, kv.valueLen); + taosHashPut(pReq->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); } return buf; diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 5917093c7b..94dff2e559 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -894,6 +894,8 @@ int32_t mndValidateDBInfo(SMnode *pMnode, SDbVgVersion *dbs, int32_t num, void * for (int32_t i = 0; i < num; ++i) { SDbVgVersion *db = &dbs[i]; + db->dbId = be64toh(db->dbId); + db->vgVersion = ntohl(db->vgVersion); len = 0; @@ -929,6 +931,9 @@ int32_t mndValidateDBInfo(SMnode *pMnode, SDbVgVersion *dbs, int32_t num, void * pRsp->vgNum = htonl(vgNum); pRsp->hashMethod = pDb->hashMethod; } else { + pRsp->uid = htobe64(db->dbId); + pRsp->vgNum = htonl(0); + pRsp->hashMethod = 0; pRsp->vgVersion = htonl(-1); } diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index 49265fa35e..005f9a3d3c 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -370,8 +370,6 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { if (rspMsg && rspLen > 0) { SKv kv = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = rspLen, .value = rspMsg}; taosArrayPush(hbRsp.info, &kv); - - taosArrayPush(batchRsp.rsps, &hbRsp); } break; } @@ -380,11 +378,14 @@ static int32_t mndProcessHeartBeatReq(SMnodeMsg *pReq) { break; default: mError("invalid kv key:%d", kv->key); + hbRsp.status = TSDB_CODE_MND_APP_ERROR; break; } pIter = taosHashIterate(pHbReq->info, pIter); } + + taosArrayPush(batchRsp.rsps, &hbRsp); } else if (pHbReq->connKey.hbType == HEARTBEAT_TYPE_MQ) { SClientHbRsp *pRsp = mndMqHbBuildRsp(pMnode, pHbReq); if (pRsp != NULL) { diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index a96b12f597..7128e143bf 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -31,7 +31,7 @@ extern "C" { #define CTG_DEFAULT_RENT_SECOND 10 #define CTG_DEFAULT_RENT_SLOT_SIZE 10 -#define CTG_RENT_SLOT_SECOND 2 +#define CTG_RENT_SLOT_SECOND 1.5 #define CTG_DEFAULT_INVALID_VERSION (-1) diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index 07086e49ee..6b68ee87e5 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -443,9 +443,9 @@ int32_t ctgSTableVersionCompare(const void* key1, const void* key2) { } int32_t ctgDbVgVersionCompare(const void* key1, const void* key2) { - if (((SDbVgVersion*)key1)->dbId < ((SDbVgVersion*)key2)->dbId) { + if (*(int64_t *)key1 < ((SDbVgVersion*)key2)->dbId) { return -1; - } else if (((SDbVgVersion*)key1)->dbId > ((SDbVgVersion*)key2)->dbId) { + } else if (*(int64_t *)key1 > ((SDbVgVersion*)key2)->dbId) { return 1; } else { return 0; @@ -652,7 +652,7 @@ int32_t ctgMetaRentGet(SMetaRentMgmt *mgmt, void **res, uint32_t *num, int32_t s int32_t ctgUpdateTableMetaCache(struct SCatalog *pCatalog, STableMetaOutput *output) { int32_t code = 0; - if (NULL == output->tbMeta) { + if ((!CTG_IS_META_CTABLE(output->metaType)) && NULL == output->tbMeta) { ctgError("no valid table meta got from meta rsp, tbName:%s", output->tbFname); CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR); } @@ -809,20 +809,19 @@ int32_t ctgValidateAndRemoveDbInfo(struct SCatalog* pCatalog, SDbVgVersion* targ } CTG_LOCK(CTG_WRITE, &info->lock); + + //TODO OPEN IT +#if 0 if (info->dbId != target->dbId) { ctgInfo("db id already updated, db:%s, dbId:%"PRIx64 ", targetId:%"PRIx64, target->dbName, info->dbId, target->dbId); CTG_UNLOCK(CTG_WRITE, &info->lock); taosHashRelease(pCatalog->dbCache.cache, info); return TSDB_CODE_SUCCESS; } - - if (info->vgVersion > target->vgVersion) { - ctgInfo("db vgVersion already updated, db:%s, version:%d, targetVer:%d", target->dbName, info->vgVersion, target->vgVersion); - CTG_UNLOCK(CTG_WRITE, &info->lock); - taosHashRelease(pCatalog->dbCache.cache, info); - return TSDB_CODE_SUCCESS; - } - +#else + target->dbId = info->dbId; +#endif + if (info->vgInfo) { ctgInfo("cleanup db vgInfo, db:%s", target->dbName); taosHashCleanup(info->vgInfo); @@ -1246,6 +1245,8 @@ int32_t catalogUpdateDBVgroup(struct SCatalog* pCatalog, const char* dbName, SDB dbInfo->vgInfo = NULL; SDbVgVersion vgVersion = {.dbId = dbInfo->dbId, .vgVersion = dbInfo->vgVersion}; + strncpy(vgVersion.dbName, dbName, sizeof(vgVersion.dbName)); + if (newAdded) { CTG_ERR_JRET(ctgMetaRentAdd(&pCatalog->dbRent, &vgVersion, dbInfo->dbId, sizeof(SDbVgVersion))); } else { diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c index 97a0557748..3623f5947d 100644 --- a/source/libs/executor/src/dataDispatcher.c +++ b/source/libs/executor/src/dataDispatcher.c @@ -186,6 +186,7 @@ static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryE memcpy(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf)); taosFreeQitem(pBuf); *pLen = ((SDataCacheEntry*)(pDispatcher->nextOutput.pData))->dataLen; + *pQueryEnd = pDispatcher->queryEnd; } static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 56919ff99e..489fff5d64 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -410,7 +410,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_FS_INVLD_LEVEL, "tfs invalid level") TAOS_DEFINE_ERROR(TSDB_CODE_FS_NO_VALID_DISK, "tfs no valid disk") // catalog -TAOS_DEFINE_ERROR(TSDB_CODE_CTG_INTERNAL_ERROR, "catalog interval error") +TAOS_DEFINE_ERROR(TSDB_CODE_CTG_INTERNAL_ERROR, "catalog internal error") TAOS_DEFINE_ERROR(TSDB_CODE_CTG_INVALID_INPUT, "invalid catalog input parameters") TAOS_DEFINE_ERROR(TSDB_CODE_CTG_NOT_READY, "catalog is not ready") TAOS_DEFINE_ERROR(TSDB_CODE_CTG_MEM_ERROR, "catalog memory error") From 0950febc2006154e54452faa6c62f41334081b69 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 17:48:39 +0800 Subject: [PATCH 25/37] [td-11818] Add the implementation of api in taos.h --- include/client/taos.h | 35 +- include/common/tmsg.h | 2 + source/client/inc/clientInt.h | 1 + source/client/src/clientMain.c | 67 ++ source/client/src/clientMsgHandler.c | 1 + source/client/test/clientTests.cpp | 1184 +++++++++++----------- source/dnode/mnode/impl/src/mndMnode.c | 4 +- source/dnode/mnode/impl/src/mndProfile.c | 13 +- 8 files changed, 690 insertions(+), 617 deletions(-) diff --git a/include/client/taos.h b/include/client/taos.h index 40772e9d2c..626264d94e 100644 --- a/include/client/taos.h +++ b/include/client/taos.h @@ -92,14 +92,16 @@ typedef struct taosField { typedef void (*__taos_async_fn_t)(void *param, TAOS_RES *, int code); -DLL_EXPORT void taos_cleanup(void); -DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...); -DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port); -DLL_EXPORT TAOS *taos_connect_l(const char *ip, int ipLen, const char *user, int userLen, const char *pass, int passLen, const char *db, int dbLen, uint16_t port); -DLL_EXPORT TAOS *taos_connect_auth(const char *ip, const char *user, const char *auth, const char *db, uint16_t port); -DLL_EXPORT void taos_close(TAOS *taos); +typedef struct tmq_t tmq_t; +typedef struct tmq_conf_t tmq_conf_t; +typedef struct tmq_list_t tmq_list_t; -const char *taos_data_type(int type); +typedef struct tmq_message_t tmq_message_t; +typedef struct tmq_message_topic_t tmq_message_topic_t; +typedef struct tmq_message_tb_t tmq_message_tb_t; +typedef struct tmq_tb_iter_t tmq_tb_iter_t; +typedef struct tmq_message_col_t tmq_message_col_t; +typedef struct tmq_col_iter_t tmq_col_iter_t; typedef struct TAOS_BIND { int buffer_type; @@ -134,6 +136,15 @@ typedef struct TAOS_MULTI_BIND { int num; } TAOS_MULTI_BIND; +DLL_EXPORT void taos_cleanup(void); +DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...); +DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port); +DLL_EXPORT TAOS *taos_connect_l(const char *ip, int ipLen, const char *user, int userLen, const char *pass, int passLen, const char *db, int dbLen, uint16_t port); +DLL_EXPORT TAOS *taos_connect_auth(const char *ip, const char *user, const char *auth, const char *db, uint16_t port); +DLL_EXPORT void taos_close(TAOS *taos); + +const char *taos_data_type(int type); + DLL_EXPORT TAOS_STMT *taos_stmt_init(TAOS *taos); DLL_EXPORT int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length); DLL_EXPORT int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags); @@ -192,16 +203,6 @@ DLL_EXPORT void taos_close_stream(TAOS_STREAM *tstr); DLL_EXPORT int taos_load_table_info(TAOS *taos, const char* tableNameList); DLL_EXPORT TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int protocol, int precision); -typedef struct tmq_t tmq_t; -typedef struct tmq_conf_t tmq_conf_t; -typedef struct tmq_list_t tmq_list_t; - -typedef struct tmq_message_t tmq_message_t; -typedef struct tmq_message_topic_t tmq_message_topic_t; -typedef struct tmq_message_tb_t tmq_message_tb_t; -typedef struct tmq_tb_iter_t tmq_tb_iter_t; -typedef struct tmq_message_col_t tmq_message_col_t; -typedef struct tmq_col_iter_t tmq_col_iter_t; DLL_EXPORT tmq_list_t* tmq_list_new(); DLL_EXPORT int32_t tmq_list_append(tmq_list_t*, char*); diff --git a/include/common/tmsg.h b/include/common/tmsg.h index d40f48d6c6..765022ebaa 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -289,6 +289,7 @@ static FORCE_INLINE void* taosDecodeSEpSet(void* buf, SEpSet* pEp) { } return buf; } + typedef struct { int32_t acctId; int64_t clusterId; @@ -296,6 +297,7 @@ typedef struct { int8_t superUser; int8_t align[3]; SEpSet epSet; + char sVersion[128]; } SConnectRsp; typedef struct { diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index c61f3da6bd..56fe0421a3 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -114,6 +114,7 @@ typedef struct STscObj { char user[TSDB_USER_LEN]; char pass[TSDB_PASSWORD_LEN]; char db[TSDB_DB_FNAME_LEN]; + char ver[128]; int32_t acctId; uint32_t connId; int32_t connType; diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index ba2a21d7ea..61b704355b 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -275,3 +275,70 @@ int taos_affected_rows(TAOS_RES *res) { } int taos_result_precision(TAOS_RES *res) { return TSDB_TIME_PRECISION_MILLI; } + +int taos_select_db(TAOS *taos, const char *db) { + STscObj *pObj = (STscObj *)taos; + if (pObj == NULL) { + terrno = TSDB_CODE_TSC_DISCONNECTED; + return TSDB_CODE_TSC_DISCONNECTED; + } + + if (db == NULL || strlen(db) == 0) { + terrno = TSDB_CODE_TSC_INVALID_INPUT; + return terrno; + } + + char sql[256] = {0}; + snprintf(sql, tListLen(sql), "use %s", db); + + TAOS_RES* pRequest = taos_query(taos, sql); + int32_t code = taos_errno(pRequest); + + taos_free_result(pRequest); + return code; +} + +void taos_stop_query(TAOS_RES *res) { + if (res == NULL) { + return; + } + + SRequestObj* pRequest = (SRequestObj*) res; + int32_t numOfFields = taos_num_fields(pRequest); + + // It is not a query, no need to stop. + if (numOfFields == 0) { + return; + } + +// scheduleCancelJob(pRequest->body.pQueryJob); +} + +bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col) { + return false; +} + +int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows) { + return 0; +} + +int taos_validate_sql(TAOS *taos, const char *sql) { + return true; +} + +const char *taos_get_server_info(TAOS *taos) { + if (taos == NULL) { + return NULL; + } + + STscObj* pTscObj = (STscObj*) taos; + return pTscObj->ver; +} + +void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) { + // TODO +} + +void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) { + // TODO +} \ No newline at end of file diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index 42d40b6b81..cc7579f9ee 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -67,6 +67,7 @@ int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) { pTscObj->connId = pConnect->connId; pTscObj->acctId = pConnect->acctId; + tstrncpy(pTscObj->ver, pConnect->sVersion, tListLen(pTscObj->ver)); // update the appInstInfo pTscObj->pAppInfo->clusterId = pConnect->clusterId; diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 4dda0b3757..3d57a5de1d 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -61,182 +61,182 @@ TEST(testCase, connect_Test) { taos_close(pConn); } -//TEST(testCase, create_user_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, create_account_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, drop_account_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, show_user_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "show users"); -// TAOS_ROW pRow = NULL; -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, drop_user_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "drop user abc"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, show_db_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "show databases"); -// TAOS_ROW pRow = NULL; -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_close(pConn); -//} -// -//TEST(testCase, create_db_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2"); -// if (taos_errno(pRes) != 0) { -// printf("error in create db, reason:%s\n", taos_errstr(pRes)); -// } -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// ASSERT_TRUE(pFields == NULL); -// -// int32_t numOfFields = taos_num_fields(pRes); -// ASSERT_EQ(numOfFields, 0); -// -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create database abc1 vgroups 4"); -// if (taos_errno(pRes) != 0) { -// printf("error in create db, reason:%s\n", taos_errstr(pRes)); -// } -// taos_close(pConn); -//} -// -//TEST(testCase, create_dnode_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000"); -// if (taos_errno(pRes) != 0) { -// printf("error in create dnode, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create dnode, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// taos_close(pConn); -//} -// -//TEST(testCase, drop_dnode_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "drop dnode 3"); -// if (taos_errno(pRes) != 0) { -// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); -// } -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// ASSERT_TRUE(pFields == NULL); -// -// int32_t numOfFields = taos_num_fields(pRes); -// ASSERT_EQ(numOfFields, 0); -// -// pRes = taos_query(pConn, "drop dnode 4"); -// if (taos_errno(pRes) != 0) { -// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, use_db_test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("error in use db, reason:%s\n", taos_errstr(pRes)); -// } -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// ASSERT_TRUE(pFields == NULL); -// -// int32_t numOfFields = taos_num_fields(pRes); -// ASSERT_EQ(numOfFields, 0); -// -// taos_close(pConn); -//} -// +TEST(testCase, create_user_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, create_account_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, drop_account_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, show_user_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "show users"); + TAOS_ROW pRow = NULL; + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, drop_user_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "drop user abc"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, show_db_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "show databases"); + TAOS_ROW pRow = NULL; + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_close(pConn); +} + +TEST(testCase, create_db_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2"); + if (taos_errno(pRes) != 0) { + printf("error in create db, reason:%s\n", taos_errstr(pRes)); + } + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + ASSERT_TRUE(pFields == NULL); + + int32_t numOfFields = taos_num_fields(pRes); + ASSERT_EQ(numOfFields, 0); + + taos_free_result(pRes); + + pRes = taos_query(pConn, "create database abc1 vgroups 4"); + if (taos_errno(pRes) != 0) { + printf("error in create db, reason:%s\n", taos_errstr(pRes)); + } + taos_close(pConn); +} + +TEST(testCase, create_dnode_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000"); + if (taos_errno(pRes) != 0) { + printf("error in create dnode, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000"); + if (taos_errno(pRes) != 0) { + printf("failed to create dnode, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + taos_close(pConn); +} + +TEST(testCase, drop_dnode_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "drop dnode 3"); + if (taos_errno(pRes) != 0) { + printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); + } + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + ASSERT_TRUE(pFields == NULL); + + int32_t numOfFields = taos_num_fields(pRes); + ASSERT_EQ(numOfFields, 0); + + pRes = taos_query(pConn, "drop dnode 4"); + if (taos_errno(pRes) != 0) { + printf("error in drop dnode, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, use_db_test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("error in use db, reason:%s\n", taos_errstr(pRes)); + } + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + ASSERT_TRUE(pFields == NULL); + + int32_t numOfFields = taos_num_fields(pRes); + ASSERT_EQ(numOfFields, 0); + + taos_close(pConn); +} + // TEST(testCase, drop_db_test) { // TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); // assert(pConn != NULL); @@ -258,251 +258,251 @@ TEST(testCase, connect_Test) { // taos_free_result(pRes); // taos_close(pConn); //} -// -//TEST(testCase, create_stable_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2"); -// if (taos_errno(pRes) != 0) { -// printf("error in create db, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)"); -// if (taos_errno(pRes) != 0) { -// printf("error in create stable, reason:%s\n", taos_errstr(pRes)); -// } -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// ASSERT_TRUE(pFields == NULL); -// -// int32_t numOfFields = taos_num_fields(pRes); -// ASSERT_EQ(numOfFields, 0); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes)); -// } -// -// pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// pRes = taos_query(pConn, "drop stable `123_$^)`"); -// if (taos_errno(pRes) != 0) { -// printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_close(pConn); -//} -// -//TEST(testCase, create_table_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)"); -// ASSERT_EQ(taos_errno(pRes), 0); -// -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)"); -// ASSERT_NE(taos_errno(pRes), 0); -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, create_ctable_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create stable, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table tm0 using st1 tags(1)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, show_stable_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "show abc1.stables"); -// if (taos_errno(pRes) != 0) { -// printf("failed to show stables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, show_vgroup_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "show vgroups"); -// if (taos_errno(pRes) != 0) { -// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, create_multiple_tables) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create db, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// taos_close(pConn); -// return; -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to use db, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// taos_close(pConn); -// return; -// } -// -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create stable tables, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table t_2 using st1 tags(1)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// taos_free_result(pRes); -// pRes = taos_query(pConn, "create table t_3 using st1 tags(2)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// -// for (int32_t i = 0; i < 20; ++i) { -// char sql[512] = {0}; -// snprintf(sql, tListLen(sql), -// "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i, -// (i + 1) * 30, (i + 2) * 40); -// TAOS_RES* pres = taos_query(pConn, sql); -// if (taos_errno(pres) != 0) { -// printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres)); -// } -// taos_free_result(pres); -// } -// -// taos_close(pConn); -//} -// -//TEST(testCase, show_table_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "show tables"); -// if (taos_errno(pRes) != 0) { -// printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// } -// -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "show abc1.tables"); -// if (taos_errno(pRes) != 0) { -// printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// int32_t count = 0; -// char str[512] = {0}; -// -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%d: %s\n", ++count, str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// + +TEST(testCase, create_stable_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2"); + if (taos_errno(pRes) != 0) { + printf("error in create db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("error in create stable, reason:%s\n", taos_errstr(pRes)); + } + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + ASSERT_TRUE(pFields == NULL); + + int32_t numOfFields = taos_num_fields(pRes); + ASSERT_EQ(numOfFields, 0); + taos_free_result(pRes); + + pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes)); + } + + pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + pRes = taos_query(pConn, "drop stable `123_$^)`"); + if (taos_errno(pRes) != 0) { + printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes)); + } + + taos_close(pConn); +} + +TEST(testCase, create_table_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)"); + ASSERT_EQ(taos_errno(pRes), 0); + + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)"); + ASSERT_NE(taos_errno(pRes), 0); + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, create_ctable_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to use db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("failed to create stable, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table tm0 using st1 tags(1)"); + if (taos_errno(pRes) != 0) { + printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, show_stable_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != nullptr); + + TAOS_RES* pRes = taos_query(pConn, "show abc1.stables"); + if (taos_errno(pRes) != 0) { + printf("failed to show stables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, show_vgroup_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to use db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "show vgroups"); + if (taos_errno(pRes) != 0) { + printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, create_multiple_tables) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to create db, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + taos_close(pConn); + return; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to use db, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + taos_close(pConn); + return; + } + + taos_free_result(pRes); + + pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("failed to create stable tables, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table t_2 using st1 tags(1)"); + if (taos_errno(pRes) != 0) { + printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + taos_free_result(pRes); + pRes = taos_query(pConn, "create table t_3 using st1 tags(2)"); + if (taos_errno(pRes) != 0) { + printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + + for (int32_t i = 0; i < 20; ++i) { + char sql[512] = {0}; + snprintf(sql, tListLen(sql), + "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i, + (i + 1) * 30, (i + 2) * 40); + TAOS_RES* pres = taos_query(pConn, sql); + if (taos_errno(pres) != 0) { + printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres)); + } + taos_free_result(pres); + } + + taos_close(pConn); +} + +TEST(testCase, show_table_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "show tables"); + if (taos_errno(pRes) != 0) { + printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + } + + taos_free_result(pRes); + + pRes = taos_query(pConn, "show abc1.tables"); + if (taos_errno(pRes) != 0) { + printf("failed to show tables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + int32_t count = 0; + char str[512] = {0}; + + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%d: %s\n", ++count, str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + //TEST(testCase, drop_stable_Test) { // TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); // assert(pConn != nullptr); @@ -527,177 +527,177 @@ TEST(testCase, connect_Test) { // taos_free_result(pRes); // taos_close(pConn); //} -// -//TEST(testCase, generated_request_id_test) { -// SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); -// -// for (int32_t i = 0; i < 50000; ++i) { -// uint64_t v = generateRequestId(); -// void* result = taosHashGet(phash, &v, sizeof(v)); -// if (result != nullptr) { -// printf("0x%lx, index:%d\n", v, i); -// } -// assert(result == nullptr); -// taosHashPut(phash, &v, sizeof(v), NULL, 0); -// } -// -// taosHashCleanup(phash); -//} -// -//TEST(testCase, insert_test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create into table t_2, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//#if 0 -//TEST(testCase, create_topic_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("error in use db, reason:%s\n", taos_errstr(pRes)); -// } -// //taos_free_result(pRes); -// -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// ASSERT_TRUE(pFields == nullptr); -// -// int32_t numOfFields = taos_num_fields(pRes); -// ASSERT_EQ(numOfFields, 0); -// -// taos_free_result(pRes); -// -// char* sql = "select * from tu"; -// pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql)); -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -// -//TEST(testCase, tmq_subscribe_Test) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// if (taos_errno(pRes) != 0) { -// printf("error in use db, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// tmq_conf_t* conf = tmq_conf_new(); -// tmq_conf_set(conf, "group.id", "tg1"); -// tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0); -// -// tmq_list_t* topic_list = tmq_list_new(); -// tmq_list_append(topic_list, "test_topic_1"); -// tmq_subscribe(tmq, topic_list); -// -// while (1) { -// tmq_message_t* msg = tmq_consume_poll(tmq, 0); -// printf("get msg\n"); -// //if (msg == NULL) break; -// } -//} -//#endif -// -//TEST(testCase, tmq_consume_Test) { -//} -// -//TEST(testCase, tmq_commit_TEST) { -//} -// -//TEST(testCase, projection_query_tables) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "create table tu using st1 tags(1)"); -// if (taos_errno(pRes) != 0) { -// printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); -// } -// taos_free_result(pRes); -// -// for(int32_t i = 0; i < 100000; ++i) { -// char sql[512] = {0}; -// sprintf(sql, "insert into tu values(now+%da, %d)", i, i); -// TAOS_RES* p = taos_query(pConn, sql); -// if (taos_errno(p) != 0) { -// printf("failed to insert data, reason:%s\n", taos_errstr(p)); -// } -// -// taos_free_result(p); -// } -// -// pRes = taos_query(pConn, "select * from tu"); -// if (taos_errno(pRes) != 0) { -// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, projection_query_stables) { -// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); -// ASSERT_NE(pConn, nullptr); -// -// TAOS_RES* pRes = taos_query(pConn, "use abc1"); -// taos_free_result(pRes); -// -// pRes = taos_query(pConn, "select ts from st1"); -// if (taos_errno(pRes) != 0) { -// printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); -// taos_free_result(pRes); -// ASSERT_TRUE(false); -// } -// -// TAOS_ROW pRow = NULL; -// TAOS_FIELD* pFields = taos_fetch_fields(pRes); -// int32_t numOfFields = taos_num_fields(pRes); -// -// char str[512] = {0}; -// while ((pRow = taos_fetch_row(pRes)) != NULL) { -// int32_t code = taos_print_row(str, pRow, pFields, numOfFields); -// printf("%s\n", str); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} + +TEST(testCase, generated_request_id_test) { + SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); + + for (int32_t i = 0; i < 50000; ++i) { + uint64_t v = generateRequestId(); + void* result = taosHashGet(phash, &v, sizeof(v)); + if (result != nullptr) { + printf("0x%lx, index:%d\n", v, i); + } + assert(result == nullptr); + taosHashPut(phash, &v, sizeof(v), NULL, 0); + } + + taosHashCleanup(phash); +} + +TEST(testCase, insert_test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into t_2 values(now, 1)"); + if (taos_errno(pRes) != 0) { + printf("failed to create into table t_2, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +#if 0 +TEST(testCase, create_topic_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("error in use db, reason:%s\n", taos_errstr(pRes)); + } + //taos_free_result(pRes); + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + ASSERT_TRUE(pFields == nullptr); + + int32_t numOfFields = taos_num_fields(pRes); + ASSERT_EQ(numOfFields, 0); + + taos_free_result(pRes); + + char* sql = "select * from tu"; + pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql)); + taos_free_result(pRes); + taos_close(pConn); +} + + +TEST(testCase, tmq_subscribe_Test) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("error in use db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + tmq_conf_t* conf = tmq_conf_new(); + tmq_conf_set(conf, "group.id", "tg1"); + tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0); + + tmq_list_t* topic_list = tmq_list_new(); + tmq_list_append(topic_list, "test_topic_1"); + tmq_subscribe(tmq, topic_list); + + while (1) { + tmq_message_t* msg = tmq_consume_poll(tmq, 0); + printf("get msg\n"); + //if (msg == NULL) break; + } +} +#endif + +TEST(testCase, tmq_consume_Test) { +} + +TEST(testCase, tmq_commit_TEST) { +} + +TEST(testCase, projection_query_tables) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)"); + if (taos_errno(pRes) != 0) { + printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table tu using st1 tags(1)"); + if (taos_errno(pRes) != 0) { + printf("failed to create table tu, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + for(int32_t i = 0; i < 100000; ++i) { + char sql[512] = {0}; + sprintf(sql, "insert into tu values(now+%da, %d)", i, i); + TAOS_RES* p = taos_query(pConn, sql); + if (taos_errno(p) != 0) { + printf("failed to insert data, reason:%s\n", taos_errstr(p)); + } + + taos_free_result(p); + } + + pRes = taos_query(pConn, "select * from tu"); + if (taos_errno(pRes) != 0) { + printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, projection_query_stables) { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + ASSERT_NE(pConn, nullptr); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + taos_free_result(pRes); + + pRes = taos_query(pConn, "select ts from st1"); + if (taos_errno(pRes) != 0) { + printf("failed to select from table, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while ((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + taos_close(pConn); +} TEST(testCase, agg_query_tables) { TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index fbb4e5cef7..a969c0162f 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -237,13 +237,11 @@ void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) { if (pIter == NULL) break; if (pObj->pDnode == NULL) break; - pEpSet->eps[pEpSet->numOfEps].port = htons(pObj->pDnode->port); - memcpy(pEpSet->eps[pEpSet->numOfEps].fqdn, pObj->pDnode->fqdn, TSDB_FQDN_LEN); if (pObj->role == TAOS_SYNC_STATE_LEADER) { pEpSet->inUse = pEpSet->numOfEps; } - pEpSet->numOfEps++; + addEpIntoEpSet(pEpSet, pObj->pDnode->fqdn, htons(pObj->pDnode->port)); sdbRelease(pSdb, pObj); } } diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index 76fabc96ce..3e2b931413 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -14,14 +14,15 @@ */ #define _DEFAULT_SOURCE +#include "tglobal.h" #include "mndProfile.h" -#include "mndConsumer.h" +//#include "mndConsumer.h" #include "mndDb.h" #include "mndMnode.h" #include "mndShow.h" -#include "mndTopic.h" +//#include "mndTopic.h" #include "mndUser.h" -#include "mndVgroup.h" +//#include "mndVgroup.h" #define QUERY_ID_SIZE 20 #define QUERY_OBJ_ID_SIZE 18 @@ -230,10 +231,12 @@ static int32_t mndProcessConnectReq(SMnodeMsg *pReq) { goto CONN_OVER; } - pRsp->acctId = htonl(pUser->acctId); + pRsp->acctId = htonl(pUser->acctId); pRsp->superUser = pUser->superUser; pRsp->clusterId = htobe64(pMnode->clusterId); - pRsp->connId = htonl(pConn->id); + pRsp->connId = htonl(pConn->id); + + snprintf(pRsp->sVersion, tListLen(pRsp->sVersion), "ver:%s\nbuild:%s\ngitinfo:%s", version, buildinfo, gitinfo); mndGetMnodeEpSet(pMnode, &pRsp->epSet); pReq->contLen = sizeof(SConnectRsp); From e864b0a14616378e78bae3e22cf6a1fcb9a3a5d8 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 19:05:20 +0800 Subject: [PATCH 26/37] stop client gracefully --- source/libs/transport/src/transCli.c | 62 ++++++++++++++++----- source/libs/transport/test/CMakeLists.txt | 20 +++++++ source/libs/transport/test/transUT.cc | 66 +++++++++++++++++++++++ 3 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 source/libs/transport/test/transUT.cc diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index d64df9b0f3..199ee43694 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -45,13 +45,13 @@ typedef struct SCliThrdObj { pthread_t thread; uv_loop_t* loop; uv_async_t* cliAsync; // - uv_timer_t* pTimer; + uv_timer_t* timer; void* pool; // conn pool queue msg; pthread_mutex_t msgMtx; uint64_t nextTimeout; // next timeout void* pTransInst; // - + bool quit; } SCliThrdObj; typedef struct SClientObj { @@ -94,6 +94,8 @@ static void clientHandleResp(SCliConn* conn); static void clientHandleExcept(SCliConn* conn); // handle req from app static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd); +static void clientHandleQuit(SCliMsg* pMsg, SCliThrdObj* pThrd); +static void clientSendQuit(SCliThrdObj* thrd); static void destroyUserdata(SRpcMsg* userdata); @@ -136,8 +138,8 @@ static void clientHandleResp(SCliConn* conn) { destroyCmsg(pMsg); conn->data = NULL; // start thread's timer of conn pool if not active - if (!uv_is_active((uv_handle_t*)pThrd->pTimer) && pRpc->idleTime > 0) { - uv_timer_start((uv_timer_t*)pThrd->pTimer, clientTimeoutCb, CONN_PERSIST_TIME(pRpc->idleTime) / 2, 0); + if (!uv_is_active((uv_handle_t*)pThrd->timer) && pRpc->idleTime > 0) { + uv_timer_start((uv_timer_t*)pThrd->timer, clientTimeoutCb, CONN_PERSIST_TIME(pRpc->idleTime) / 2, 0); } } static void clientHandleExcept(SCliConn* pConn) { @@ -155,7 +157,7 @@ static void clientHandleExcept(SCliConn* pConn) { SRpcMsg rpcMsg = {0}; rpcMsg.ahandle = pCtx->ahandle; - rpcMsg.code = -1; + rpcMsg.code = TSDB_CODE_RPC_NETWORK_UNAVAIL; // SRpcInfo* pRpc = pMsg->ctx->pRpc; (pCtx->pTransInst->cfp)(NULL, &rpcMsg, NULL); pConn->notifyCount += 1; @@ -332,9 +334,8 @@ static void clientWriteCb(uv_write_t* req, int status) { tDebug("conn %p data already was written out", pConn); SCliMsg* pMsg = pConn->data; if (pMsg == NULL) { - destroy - // handle - return; + // handle + return; } destroyUserdata(&pMsg->msg); } else { @@ -375,6 +376,15 @@ static void clientConnCb(uv_connect_t* req, int status) { clientWrite(pConn); } +static void clientHandleQuit(SCliMsg* pMsg, SCliThrdObj* pThrd) { + tDebug("thread %p start to quit", pThrd); + destroyCmsg(pMsg); + uv_close((uv_handle_t*)pThrd->cliAsync, NULL); + uv_timer_stop(pThrd->timer); + pThrd->quit = true; + // uv__async_stop(pThrd->cliAsync); + uv_stop(pThrd->loop); +} static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) { uint64_t et = taosGetTimestampUs(); uint64_t el = et - pMsg->st; @@ -389,7 +399,13 @@ static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) { conn->data = pMsg; conn->writeReq->data = conn; transDestroyBuffer(&conn->readBuf); + + if (pThrd->quit) { + clientHandleExcept(conn); + return; + } clientWrite(conn); + } else { SCliConn* conn = calloc(1, sizeof(SCliConn)); conn->ref++; @@ -430,7 +446,12 @@ static void clientAsyncCb(uv_async_t* handle) { QUEUE_REMOVE(h); SCliMsg* pMsg = QUEUE_DATA(h, SCliMsg, q); - clientHandleReq(pMsg, pThrd); + if (pMsg->ctx == NULL) { + clientHandleQuit(pMsg, pThrd); + } else { + clientHandleReq(pMsg, pThrd); + } + // clientHandleReq(pMsg, pThrd); count++; } if (count >= 2) { @@ -458,7 +479,7 @@ void* taosInitClient(uint32_t ip, uint32_t port, char* label, int numOfThreads, int err = pthread_create(&pThrd->thread, NULL, clientThread, (void*)(pThrd)); if (err == 0) { - tDebug("sucess to create tranport-client thread %d", i); + tDebug("success to create tranport-client thread %d", i); } cli->pThreadObj[i] = pThrd; } @@ -492,11 +513,13 @@ static SCliThrdObj* createThrdObj() { uv_async_init(pThrd->loop, pThrd->cliAsync, clientAsyncCb); pThrd->cliAsync->data = pThrd; - pThrd->pTimer = malloc(sizeof(uv_timer_t)); - uv_timer_init(pThrd->loop, pThrd->pTimer); - pThrd->pTimer->data = pThrd; + pThrd->timer = malloc(sizeof(uv_timer_t)); + uv_timer_init(pThrd->loop, pThrd->timer); + pThrd->timer->data = pThrd; pThrd->pool = creatConnPool(1); + + pThrd->quit = false; return pThrd; } static void destroyThrdObj(SCliThrdObj* pThrd) { @@ -506,6 +529,7 @@ static void destroyThrdObj(SCliThrdObj* pThrd) { pthread_join(pThrd->thread, NULL); pthread_mutex_destroy(&pThrd->msgMtx); free(pThrd->cliAsync); + free(pThrd->timer); free(pThrd->loop); free(pThrd); } @@ -517,10 +541,22 @@ static void transDestroyConnCtx(STransConnCtx* ctx) { free(ctx); } // +static void clientSendQuit(SCliThrdObj* thrd) { + // cli can stop gracefully + SCliMsg* msg = calloc(1, sizeof(SCliMsg)); + msg->ctx = NULL; // + + pthread_mutex_lock(&thrd->msgMtx); + QUEUE_PUSH(&thrd->msg, &msg->q); + pthread_mutex_unlock(&thrd->msgMtx); + + uv_async_send(thrd->cliAsync); +} void taosCloseClient(void* arg) { // impl later SClientObj* cli = arg; for (int i = 0; i < cli->numOfThreads; i++) { + clientSendQuit(cli->pThreadObj[i]); destroyThrdObj(cli->pThreadObj[i]); } free(cli->pThreadObj); diff --git a/source/libs/transport/test/CMakeLists.txt b/source/libs/transport/test/CMakeLists.txt index c61f688060..3d9c396336 100644 --- a/source/libs/transport/test/CMakeLists.txt +++ b/source/libs/transport/test/CMakeLists.txt @@ -1,6 +1,12 @@ add_executable(transportTest "") add_executable(client "") add_executable(server "") +add_executable(transUT "") + +target_sources(transUT + PRIVATE + "transUT.cc" +) target_sources(transportTest PRIVATE @@ -28,6 +34,13 @@ target_link_libraries (transportTest gtest_main transport ) +target_link_libraries (transUT + os + util + common + gtest_main + transport +) target_include_directories(client PUBLIC @@ -48,6 +61,13 @@ target_include_directories(server "${CMAKE_CURRENT_SOURCE_DIR}/../inc" ) +target_include_directories(transUT + PUBLIC + "${CMAKE_SOURCE_DIR}/include/libs/transport" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) + + target_link_libraries (server os util diff --git a/source/libs/transport/test/transUT.cc b/source/libs/transport/test/transUT.cc new file mode 100644 index 0000000000..8b6fd9c45e --- /dev/null +++ b/source/libs/transport/test/transUT.cc @@ -0,0 +1,66 @@ +/* + * 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 +#include "trpc.h" +using namespace std; + +class TransObj { + public: + TransObj() { + const char *label = "APP"; + const char *secret = "secret"; + const char *user = "user"; + const char *ckey = "ckey"; + + memset(&rpcInit, 0, sizeof(rpcInit)); + rpcInit.localPort = 0; + rpcInit.label = (char *)label; + rpcInit.numOfThreads = 1; + rpcInit.cfp = NULL; + rpcInit.sessions = 100; + rpcInit.idleTime = 100; + rpcInit.user = (char *)user; + rpcInit.secret = (char *)secret; + rpcInit.ckey = (char *)ckey; + rpcInit.spi = 1; + rpcInit.connType = TAOS_CONN_CLIENT; + + trans = rpcOpen(&rpcInit); + } + bool stop() { + rpcClose(trans); + return true; + } + + private: + void * trans; + SRpcInit rpcInit; +}; +class TransEnv : public ::testing::Test { + protected: + virtual void SetUp() { + // set up trans obj + tr = new TransObj(); + } + virtual void TearDown() { + // tear down + delete tr; + } + + TransObj *tr = NULL; +}; +TEST_F(TransEnv, test_start_stop) { assert(tr->stop()); } From d6e8a0ede17931eb5643f7fbd59a6ebfa1da04fb Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 19:19:49 +0800 Subject: [PATCH 27/37] stop srv gracefully --- source/libs/transport/src/transSrv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/transport/src/transSrv.c b/source/libs/transport/src/transSrv.c index a5ee1f1c63..802f2cac9d 100644 --- a/source/libs/transport/src/transSrv.c +++ b/source/libs/transport/src/transSrv.c @@ -646,6 +646,7 @@ void destroyWorkThrd(SWorkThrdObj* pThrd) { if (pThrd == NULL) { return; } + uv_stop(pThrd->loop); pthread_join(pThrd->thread, NULL); // free(srv->pipe[i]); free(pThrd->loop); @@ -658,6 +659,7 @@ void taosCloseServer(void* arg) { for (int i = 0; i < srv->numOfThreads; i++) { destroyWorkThrd(srv->pThreadObj[i]); } + uv_stop(srv->loop); free(srv->loop); free(srv->pipe); free(srv->pThreadObj); From 19517077b3f8459f3143c868bcccf36d9e6d64de Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 26 Jan 2022 20:35:13 +0800 Subject: [PATCH 28/37] stop cli/srv gracefully --- source/libs/transport/src/transCli.c | 1 + source/libs/transport/src/transSrv.c | 54 ++++++++++++++++++++++----- source/libs/transport/test/transUT.cc | 22 +++++++++-- 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 199ee43694..069ebaeb8a 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -526,6 +526,7 @@ static void destroyThrdObj(SCliThrdObj* pThrd) { if (pThrd == NULL) { return; } + uv_stop(pThrd->loop); pthread_join(pThrd->thread, NULL); pthread_mutex_destroy(&pThrd->msgMtx); free(pThrd->cliAsync); diff --git a/source/libs/transport/src/transSrv.c b/source/libs/transport/src/transSrv.c index 802f2cac9d..475ef32b46 100644 --- a/source/libs/transport/src/transSrv.c +++ b/source/libs/transport/src/transSrv.c @@ -70,6 +70,7 @@ typedef struct SServerObj { uv_pipe_t** pipe; uint32_t ip; uint32_t port; + uv_async_t* pAcceptAsync; // just to quit from from accept thread } SServerObj; static const char* notify = "a"; @@ -88,9 +89,11 @@ static void uvOnPipeWriteCb(uv_write_t* req, int status); static void uvOnAcceptCb(uv_stream_t* stream, int status); static void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf); static void uvWorkerAsyncCb(uv_async_t* handle); +static void uvAcceptAsyncCb(uv_async_t* handle); static void uvPrepareSendData(SSrvMsg* msg, uv_buf_t* wb); static void uvStartSendResp(SSrvMsg* msg); + static void destroySmsg(SSrvMsg* smsg); // check whether already read complete packet static bool readComplete(SConnBuffer* buf); @@ -389,7 +392,13 @@ void uvWorkerAsyncCb(uv_async_t* handle) { tError("except occurred, continue"); continue; } - uvStartSendResp(msg); + if (msg->pConn == NULL) { + // + free(msg); + uv_stop(pThrd->loop); + } else { + uvStartSendResp(msg); + } // uv_buf_t wb; // uvPrepareSendData(msg, &wb); // uv_timer_stop(conn->pTimer); @@ -397,6 +406,10 @@ void uvWorkerAsyncCb(uv_async_t* handle) { // uv_write(conn->pWriter, (uv_stream_t*)conn->pTcp, &wb, 1, uvOnWriteCb); } } +static void uvAcceptAsyncCb(uv_async_t* async) { + SServerObj* srv = async->data; + uv_stop(srv->loop); +} void uvOnAcceptCb(uv_stream_t* stream, int status) { if (status == -1) { @@ -517,8 +530,12 @@ static bool addHandleToAcceptloop(void* arg) { return false; } - struct sockaddr_in bind_addr; + // register an async here to quit server gracefully + srv->pAcceptAsync = calloc(1, sizeof(uv_async_t)); + uv_async_init(srv->loop, srv->pAcceptAsync, uvAcceptAsyncCb); + srv->pAcceptAsync->data = srv; + struct sockaddr_in bind_addr; uv_ip4_addr("0.0.0.0", srv->port, &bind_addr); if ((err = uv_tcp_bind(&srv->server, (const struct sockaddr*)&bind_addr, 0)) != 0) { tError("failed to bind: %s", uv_err_name(err)); @@ -646,24 +663,43 @@ void destroyWorkThrd(SWorkThrdObj* pThrd) { if (pThrd == NULL) { return; } - uv_stop(pThrd->loop); pthread_join(pThrd->thread, NULL); - // free(srv->pipe[i]); free(pThrd->loop); - pthread_mutex_destroy(&pThrd->msgMtx); + free(pThrd->workerAsync); free(pThrd); } +void sendQuitToWorkThrd(SWorkThrdObj* pThrd) { + SSrvMsg* srvMsg = calloc(1, sizeof(SSrvMsg)); + + pthread_mutex_lock(&pThrd->msgMtx); + QUEUE_PUSH(&pThrd->msg, &srvMsg->q); + pthread_mutex_unlock(&pThrd->msgMtx); + tDebug("send quit msg to work thread"); + + uv_async_send(pThrd->workerAsync); +} + void taosCloseServer(void* arg) { // impl later SServerObj* srv = arg; for (int i = 0; i < srv->numOfThreads; i++) { + sendQuitToWorkThrd(srv->pThreadObj[i]); destroyWorkThrd(srv->pThreadObj[i]); } - uv_stop(srv->loop); - free(srv->loop); - free(srv->pipe); - free(srv->pThreadObj); + + tDebug("send quit msg to accept thread"); + uv_async_send(srv->pAcceptAsync); pthread_join(srv->thread, NULL); + + free(srv->pThreadObj); + free(srv->pAcceptAsync); + free(srv->loop); + + for (int i = 0; i < srv->numOfThreads; i++) { + free(srv->pipe[i]); + } + free(srv->pipe); + free(srv); } diff --git a/source/libs/transport/test/transUT.cc b/source/libs/transport/test/transUT.cc index 8b6fd9c45e..08c683590b 100644 --- a/source/libs/transport/test/transUT.cc +++ b/source/libs/transport/test/transUT.cc @@ -29,7 +29,7 @@ class TransObj { memset(&rpcInit, 0, sizeof(rpcInit)); rpcInit.localPort = 0; rpcInit.label = (char *)label; - rpcInit.numOfThreads = 1; + rpcInit.numOfThreads = 5; rpcInit.cfp = NULL; rpcInit.sessions = 100; rpcInit.idleTime = 100; @@ -37,12 +37,22 @@ class TransObj { rpcInit.secret = (char *)secret; rpcInit.ckey = (char *)ckey; rpcInit.spi = 1; + } + bool startCli() { + trans = NULL; rpcInit.connType = TAOS_CONN_CLIENT; - trans = rpcOpen(&rpcInit); + return trans != NULL ? true : false; + } + bool startSrv() { + trans = NULL; + rpcInit.connType = TAOS_CONN_SERVER; + trans = rpcOpen(&rpcInit); + return trans != NULL ? true : false; } bool stop() { rpcClose(trans); + trans = NULL; return true; } @@ -63,4 +73,10 @@ class TransEnv : public ::testing::Test { TransObj *tr = NULL; }; -TEST_F(TransEnv, test_start_stop) { assert(tr->stop()); } +TEST_F(TransEnv, test_start_stop) { + assert(tr->startCli()); + assert(tr->stop()); + + assert(tr->startSrv()); + assert(tr->stop()); +} From d6d8651483c34a3ba471cd2a420508b382d01fc7 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 26 Jan 2022 23:09:03 +0800 Subject: [PATCH 29/37] [td-11818] refactor ssdatablock, add plan in log. --- include/common/common.h | 24 +++--- source/client/src/clientImpl.c | 4 +- source/common/src/tep.c | 97 ++++++++++++++++++++++ source/libs/planner/src/physicalPlanJson.c | 2 - source/libs/planner/src/planner.c | 10 ++- source/libs/scheduler/src/scheduler.c | 10 +-- tools/shell/src/shellEngine.c | 1 + 7 files changed, 123 insertions(+), 25 deletions(-) diff --git a/include/common/common.h b/include/common/common.h index 9b8a465442..132d5cc92b 100644 --- a/include/common/common.h +++ b/include/common/common.h @@ -38,6 +38,12 @@ // int16_t bytes; //} SSchema; +typedef struct { + uint32_t numOfTables; + SArray *pGroupList; + SHashObj *map; // speedup acquire the tableQueryInfo by table uid +} STableGroupInfo; + typedef struct SColumnDataAgg { int16_t colId; int64_t sum; @@ -57,17 +63,12 @@ typedef struct SDataBlockInfo { typedef struct SConstantItem { SColumnInfo info; - int32_t startIndex; // run-length-encoding to save the space for multiple rows - int32_t endIndex; + int32_t startRow; // run-length-encoding to save the space for multiple rows + int32_t endRow; SVariant value; } SConstantItem; -typedef struct { - uint32_t numOfTables; - SArray *pGroupList; - SHashObj *map; // speedup acquire the tableQueryInfo by table uid -} STableGroupInfo; - +// info.numOfCols = taosArrayGetSize(pDataBlock) + taosArrayGetSize(pConstantList); typedef struct SSDataBlock { SColumnDataAgg *pBlockAgg; SArray *pDataBlock; // SArray @@ -75,9 +76,12 @@ typedef struct SSDataBlock { SDataBlockInfo info; } SSDataBlock; +// pBlockAgg->numOfNull == info.rows, all data are null +// pBlockAgg->numOfNull == 0, no data are null. typedef struct SColumnInfoData { - SColumnInfo info; // TODO filter info needs to be removed - char *pData; // the corresponding block data in memory + SColumnInfo info; // TODO filter info needs to be removed + char *nullbitmap;// + char *pData; // the corresponding block data in memory } SColumnInfoData; //====================================================================================================================== diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 1db1c1756a..247b543dea 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -218,12 +218,10 @@ int32_t getPlan(SRequestObj* pRequest, SQueryNode* pQueryNode, SQueryDag** pDag, if (pQueryNode->type == TSDB_SQL_SELECT) { setResSchemaInfo(&pRequest->body.resInfo, pSchema, numOfCols); - tfree(pSchema); pRequest->type = TDMT_VND_QUERY; - } else { - tfree(pSchema); } + tfree(pSchema); return code; } diff --git a/source/common/src/tep.c b/source/common/src/tep.c index cf38ab8dd9..45587a8856 100644 --- a/source/common/src/tep.c +++ b/source/common/src/tep.c @@ -1,4 +1,5 @@ #include "tep.h" +#include "common.h" #include "tglobal.h" #include "tlockfree.h" @@ -59,3 +60,99 @@ SEpSet getEpSet_s(SCorEpSet *pEpSet) { return ep; } +bool colDataIsNull(const SColumnInfoData* pColumnInfoData, uint32_t totalRows, uint32_t row, SColumnDataAgg* pColAgg) { + if (pColAgg != NULL) { + if (pColAgg->numOfNull == totalRows) { + ASSERT(pColumnInfoData->nullbitmap == NULL); + return true; + } else if (pColAgg->numOfNull == 0) { + ASSERT(pColumnInfoData->nullbitmap == NULL); + return false; + } + } + + if (pColumnInfoData->nullbitmap == NULL) { + return false; + } + + uint8_t v = (pColumnInfoData->nullbitmap[row>>3] & (1<<(8 - (row&0x07)))); + return (v == 1); +} + +bool colDataIsNull_f(const char* bitmap, uint32_t row) { + return (bitmap[row>>3] & (1<<(8 - (row&0x07)))); +} + +void colDataSetNull_f(char* bitmap, uint32_t row) { // TODO + return; +} + +void* colDataGet(const SColumnInfoData* pColumnInfoData, uint32_t row) { + if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) { + uint32_t offset = ((uint32_t*)pColumnInfoData->pData)[row]; + return (char*)(pColumnInfoData->pData) + offset; // the first part is the pointer to the true binary data + } else { + return (char*)(pColumnInfoData->pData) + (row * pColumnInfoData->info.bytes); + } +} + +int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, bool isNull) { + ASSERT(pColumnInfoData != NULL); + + if (isNull) { + // TODO set null value in the nullbitmap + return 0; + } + + int32_t type = pColumnInfoData->info.type; + if (IS_VAR_DATA_TYPE(type)) { + // TODO continue append var_type + } else { + char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow; + switch(type) { + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_UTINYINT: {*(int8_t*) p = *(int8_t*) pData;break;} + default: + assert(0); + } + + } + + return 0; +} + +size_t colDataGetCols(const SSDataBlock* pBlock) { + ASSERT(pBlock); + + size_t constantCols = (pBlock->pConstantList != NULL)? taosArrayGetSize(pBlock->pConstantList):0; + ASSERT( pBlock->info.numOfCols == taosArrayGetSize(pBlock->pDataBlock) + constantCols); + return pBlock->info.numOfCols; +} + +size_t colDataGetRows(const SSDataBlock* pBlock) { + return pBlock->info.rows; +} + +int32_t colDataUpdateTsWindow(SSDataBlock* pDataBlock) { + if (pDataBlock == NULL || pDataBlock->info.rows <= 0) { + return 0; + } + + if (pDataBlock->info.numOfCols <= 0) { + return -1; + } + + SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, 0); + if (pColInfoData->info.type != TSDB_DATA_TYPE_TIMESTAMP) { + return 0; + } + + ASSERT(pColInfoData->nullbitmap == NULL); + pDataBlock->info.window.skey = *(TSKEY*) colDataGet(pColInfoData, 0); + pDataBlock->info.window.ekey = *(TSKEY*) colDataGet(pColInfoData, (pDataBlock->info.rows - 1)); + return 0; +} + + + + diff --git a/source/libs/planner/src/physicalPlanJson.c b/source/libs/planner/src/physicalPlanJson.c index 8d58b262aa..5d96ab47c3 100644 --- a/source/libs/planner/src/physicalPlanJson.c +++ b/source/libs/planner/src/physicalPlanJson.c @@ -1125,8 +1125,6 @@ int32_t subPlanToString(const SSubplan* subplan, char** str, int32_t* len) { *str = cJSON_Print(json); cJSON_Delete(json); -// printf("====Physical plan:====\n"); -// printf("%s\n", *str); *len = strlen(*str) + 1; return TSDB_CODE_SUCCESS; } diff --git a/source/libs/planner/src/planner.c b/source/libs/planner/src/planner.c index d546925c5f..e6b7eaca7f 100644 --- a/source/libs/planner/src/planner.c +++ b/source/libs/planner/src/planner.c @@ -40,7 +40,8 @@ void qDestroyQueryDag(struct SQueryDag* pDag) { tfree(pDag); } -int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag, SSchema** pResSchema, int32_t* numOfCols, SArray* pNodeList, uint64_t requestId) { +int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag, SSchema** pResSchema, int32_t* numOfCols, SArray* pNodeList, + uint64_t requestId) { SQueryPlanNode* pLogicPlan; int32_t code = createQueryPlan(pNode, &pLogicPlan); if (TSDB_CODE_SUCCESS != code) { @@ -49,9 +50,10 @@ int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag, } if (pLogicPlan->info.type != QNODE_MODIFY) { -// char* str = NULL; -// queryPlanToString(pLogicPlan, &str); -// printf("%s\n", str); + char* str = NULL; + queryPlanToString(pLogicPlan, &str); + qDebug("reqId:0x%"PRIx64": %s", requestId, str); + tfree(str); } code = optimizeQueryPlan(pLogicPlan); diff --git a/source/libs/scheduler/src/scheduler.c b/source/libs/scheduler/src/scheduler.c index 92a95edf98..621ed68bae 100644 --- a/source/libs/scheduler/src/scheduler.c +++ b/source/libs/scheduler/src/scheduler.c @@ -1194,17 +1194,18 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) { code = atomic_load_32(&pJob->errCode); SCH_ERR_RET(code); - SCH_RET(TSDB_CODE_SCH_STATUS_ERROR); } SSubplan *plan = pTask->plan; - if (NULL == pTask->msg) { + if (NULL == pTask->msg) { // TODO add more detailed reason for failure code = qSubPlanToString(plan, &pTask->msg, &pTask->msgLen); if (TSDB_CODE_SUCCESS != code || NULL == pTask->msg || pTask->msgLen <= 0) { - SCH_TASK_ELOG("subplanToString error, code:%x, msg:%p, len:%d", code, pTask->msg, pTask->msgLen); + SCH_TASK_ELOG("failed to create physical plan, code:%s, msg:%p, len:%d", tstrerror(code), pTask->msg, pTask->msgLen); SCH_ERR_JRET(code); + } else { + SCH_TASK_DLOG(" ===physical plan=== len:%d, %s", pTask->msgLen, pTask->msg); } } @@ -1218,13 +1219,10 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) { } SCH_ERR_JRET(schBuildAndSendMsg(pJob, pTask, NULL, plan->msgType)); - return TSDB_CODE_SUCCESS; _return: - SCH_ERR_RET(schProcessOnTaskFailure(pJob, pTask, code)); - SCH_RET(code); } diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index c283423fbf..b785ed2707 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -360,6 +360,7 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { } } else { int num_rows_affacted = taos_affected_rows(pSql); + taos_free_result(pSql); et = taosGetTimestampUs(); printf("Query OK, %d of %d row(s) in database (%.6fs)\n", num_rows_affacted, num_rows_affacted, (et - st) / 1E6); } From 3152824ace8161255400cb73fcb65ec3cec84126 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 27 Jan 2022 01:33:44 +0000 Subject: [PATCH 30/37] return uid when deleting db --- include/common/tmsg.h | 13 +++++--- source/dnode/mnode/impl/inc/mndDef.h | 2 ++ source/dnode/mnode/impl/inc/mndTrans.h | 5 ++-- source/dnode/mnode/impl/src/mndDb.c | 8 +++++ source/dnode/mnode/impl/src/mndTrans.c | 41 +++++++++++++++++++------- source/dnode/mnode/impl/test/db/db.cpp | 13 ++++++++ 6 files changed, 66 insertions(+), 16 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index d40f48d6c6..d9d7d9bf96 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -506,21 +506,26 @@ typedef struct { } SAlterDbReq; typedef struct { - char db[TSDB_TABLE_FNAME_LEN]; + char db[TSDB_DB_FNAME_LEN]; int8_t ignoreNotExists; } SDropDbReq; typedef struct { - char db[TSDB_TABLE_FNAME_LEN]; + char db[TSDB_DB_FNAME_LEN]; + uint64_t uid; +} SDropDbRsp; + +typedef struct { + char db[TSDB_DB_FNAME_LEN]; int32_t vgVersion; } SUseDbReq; typedef struct { - char db[TSDB_TABLE_FNAME_LEN]; + char db[TSDB_DB_FNAME_LEN]; } SSyncDbReq; typedef struct { - char db[TSDB_TABLE_FNAME_LEN]; + char db[TSDB_DB_FNAME_LEN]; } SCompactDbReq; typedef struct { diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 5ec9173fc8..00d1b61b74 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -128,6 +128,8 @@ typedef struct { int32_t failedTimes; void* rpcHandle; void* rpcAHandle; + void* rpcRsp; + int32_t rpcRspLen; SArray* redoLogs; SArray* undoLogs; SArray* commitLogs; diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index fda3fed13d..f1a213790c 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -36,16 +36,17 @@ typedef struct { int32_t mndInitTrans(SMnode *pMnode); void mndCleanupTrans(SMnode *pMnode); -STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg); +STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, const SRpcMsg *pReq); void mndTransDrop(STrans *pTrans); int32_t mndTransAppendRedolog(STrans *pTrans, SSdbRaw *pRaw); int32_t mndTransAppendUndolog(STrans *pTrans, SSdbRaw *pRaw); int32_t mndTransAppendCommitlog(STrans *pTrans, SSdbRaw *pRaw); int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction); int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction); +void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen); int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans); -void mndTransProcessRsp(SMnodeMsg *pMsg); +void mndTransProcessRsp(SMnodeMsg *pRsp); void mndTransPullup(SMnode *pMnode); #ifdef __cplusplus diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 4dde8a5410..4bebdb8a5b 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -767,6 +767,14 @@ static int32_t mndDropDb(SMnode *pMnode, SMnodeMsg *pReq, SDbObj *pDb) { if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto DROP_DB_OVER; if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto DROP_DB_OVER; if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto DROP_DB_OVER; + + int32_t rspLen = sizeof(SDropDbRsp); + SDropDbRsp *pRsp = rpcMallocCont(rspLen); + if (pRsp == NULL) goto DROP_DB_OVER; + memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN); + pRsp->uid = htobe64(pDb->uid); + mndTransSetRpcRsp(pTrans, pRsp, rspLen); + if (mndTransPrepare(pMnode, pTrans) != 0) goto DROP_DB_OVER; code = 0; diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 808e6dcbe5..6686c0887f 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -308,6 +308,11 @@ static void mndTransDropData(STrans *pTrans) { mndTransDropLogs(pTrans->commitLogs); mndTransDropActions(pTrans->redoActions); mndTransDropActions(pTrans->undoActions); + if (pTrans->rpcRsp != NULL) { + rpcFreeCont(pTrans->rpcRsp); + pTrans->rpcRsp = NULL; + pTrans->rpcRspLen = 0; + } } static int32_t mndTransActionDelete(SSdb *pSdb, STrans *pTrans) { @@ -339,7 +344,7 @@ void mndReleaseTrans(SMnode *pMnode, STrans *pTrans) { sdbRelease(pSdb, pTrans); } -STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg) { +STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, const SRpcMsg *pReq) { STrans *pTrans = calloc(1, sizeof(STrans)); if (pTrans == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -350,8 +355,8 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg) { pTrans->id = sdbGetMaxId(pMnode->pSdb, SDB_TRANS); pTrans->stage = TRN_STAGE_PREPARE; pTrans->policy = policy; - pTrans->rpcHandle = pMsg->handle; - pTrans->rpcAHandle = pMsg->ahandle; + pTrans->rpcHandle = pReq->handle; + pTrans->rpcAHandle = pReq->ahandle; pTrans->redoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *)); pTrans->undoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *)); pTrans->commitLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *)); @@ -436,6 +441,11 @@ int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction) { return mndTransAppendAction(pTrans->undoActions, pAction); } +void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen) { + pTrans->rpcRsp = pCont; + pTrans->rpcRspLen = contLen; +} + static int32_t mndTransSync(SMnode *pMnode, STrans *pTrans) { SSdbRaw *pRaw = mndTransActionEncode(pTrans); if (pRaw == NULL) { @@ -479,6 +489,11 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { pNew->rpcHandle = pTrans->rpcHandle; pNew->rpcAHandle = pTrans->rpcAHandle; + pNew->rpcRsp = pTrans->rpcRsp; + pNew->rpcRspLen = pTrans->rpcRspLen; + pTrans->rpcRsp = NULL; + pTrans->rpcRspLen = 0; + mndTransExecute(pMnode, pNew); mndReleaseTrans(pMnode, pNew); return 0; @@ -529,15 +544,21 @@ static void mndTransSendRpcRsp(STrans *pTrans) { if (sendRsp && pTrans->rpcHandle != NULL) { mDebug("trans:%d, send rsp, code:0x%x stage:%d app:%p", pTrans->id, pTrans->code & 0xFFFF, pTrans->stage, pTrans->rpcAHandle); - SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, .code = pTrans->code, .ahandle = pTrans->rpcAHandle}; + SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, + .code = pTrans->code, + .ahandle = pTrans->rpcAHandle, + .pCont = pTrans->rpcRsp, + .contLen = pTrans->rpcRspLen}; rpcSendResponse(&rspMsg); pTrans->rpcHandle = NULL; + pTrans->rpcRsp = NULL; + pTrans->rpcRspLen = 0; } } -void mndTransProcessRsp(SMnodeMsg *pMsg) { - SMnode *pMnode = pMsg->pMnode; - int64_t signature = (int64_t)(pMsg->rpcMsg.ahandle); +void mndTransProcessRsp(SMnodeMsg *pRsp) { + SMnode *pMnode = pRsp->pMnode; + int64_t signature = (int64_t)(pRsp->rpcMsg.ahandle); int32_t transId = (int32_t)(signature >> 32); int32_t action = (int32_t)((signature << 32) >> 32); @@ -571,10 +592,10 @@ void mndTransProcessRsp(SMnodeMsg *pMsg) { STransAction *pAction = taosArrayGet(pArray, action); if (pAction != NULL) { pAction->msgReceived = 1; - pAction->errCode = pMsg->rpcMsg.code; + pAction->errCode = pRsp->rpcMsg.code; } - mDebug("trans:%d, action:%d response is received, code:0x%x, accept:0x%x", transId, action, pMsg->rpcMsg.code, + mDebug("trans:%d, action:%d response is received, code:0x%x, accept:0x%x", transId, action, pRsp->rpcMsg.code, pAction->acceptableCode); mndTransExecute(pMnode, pTrans); @@ -921,7 +942,7 @@ static int32_t mndProcessTransMsg(SMnodeMsg *pMsg) { void mndTransPullup(SMnode *pMnode) { STrans *pTrans = NULL; - void * pIter = NULL; + void *pIter = NULL; while (1) { pIter = sdbFetch(pMnode->pSdb, SDB_TRANS, pIter, (void **)&pTrans); diff --git a/source/dnode/mnode/impl/test/db/db.cpp b/source/dnode/mnode/impl/test/db/db.cpp index 964a483aac..2d1574467e 100644 --- a/source/dnode/mnode/impl/test/db/db.cpp +++ b/source/dnode/mnode/impl/test/db/db.cpp @@ -202,6 +202,10 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) { SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_DB, pReq, contLen); ASSERT_NE(pRsp, nullptr); ASSERT_EQ(pRsp->code, 0); + + SDropDbRsp* pDrop = (SDropDbRsp*)pRsp->pCont; + pDrop->uid = htobe64(pDrop->uid); + EXPECT_STREQ(pDrop->db, "1.d1"); } test.SendShowMetaReq(TSDB_MGMT_TABLE_DB, ""); @@ -249,6 +253,8 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { EXPECT_EQ(test.GetShowRows(), 1); CheckBinary("d2", TSDB_DB_NAME_LEN - 1); + uint64_t d2_uid = 0; + { int32_t contLen = sizeof(SUseDbReq); @@ -262,6 +268,8 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { SUseDbRsp* pRsp = (SUseDbRsp*)pMsg->pCont; EXPECT_STREQ(pRsp->db, "1.d2"); + pRsp->uid = htobe64(pRsp->uid); + d2_uid = pRsp->uid; pRsp->vgVersion = htonl(pRsp->vgVersion); pRsp->vgNum = htonl(pRsp->vgNum); pRsp->hashMethod = pRsp->hashMethod; @@ -311,5 +319,10 @@ TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_DB, pReq, contLen); ASSERT_NE(pRsp, nullptr); ASSERT_EQ(pRsp->code, 0); + + SDropDbRsp* pDrop = (SDropDbRsp*)pRsp->pCont; + pDrop->uid = htobe64(pDrop->uid); + EXPECT_STREQ(pDrop->db, "1.d2"); + EXPECT_EQ(pDrop->uid, d2_uid); } } From 5815ae163984f5e667ce7719f669322d64809d29 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 27 Jan 2022 10:57:12 +0800 Subject: [PATCH 31/37] feature/qnode --- source/client/src/clientHb.c | 7 +++++-- source/dnode/mnode/impl/src/mndDb.c | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index 0379a76832..f8957f6fd8 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -63,8 +63,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog rsp->vgroupInfo[i].hashBegin = ntohl(rsp->vgroupInfo[i].hashBegin); rsp->vgroupInfo[i].hashEnd = ntohl(rsp->vgroupInfo[i].hashEnd); - for (int32_t n = 0; n < rsp->vgroupInfo[i].numOfEps; ++n) { - rsp->vgroupInfo[i].epAddr[n].port = ntohs(rsp->vgroupInfo[i].epAddr[n].port); + for (int32_t n = 0; n < rsp->vgroupInfo[i].epset.numOfEps; ++n) { + rsp->vgroupInfo[i].epset.eps[n].port = ntohs(rsp->vgroupInfo[i].epset.eps[n].port); } if (0 != taosHashPut(vgInfo.vgInfo, &rsp->vgroupInfo[i].vgId, sizeof(rsp->vgroupInfo[i].vgId), &rsp->vgroupInfo[i], sizeof(rsp->vgroupInfo[i]))) { @@ -377,12 +377,15 @@ static int32_t hbCreateThread() { static void hbStopThread() { if (atomic_val_compare_exchange_8(&clientHbMgr.threadStop, 0, 1)) { + tscDebug("hb thread already stopped"); return; } while (2 != atomic_load_8(&clientHbMgr.threadStop)) { usleep(10); } + + tscDebug("hb thread stopped"); } SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo, char *key) { diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index c1e070b16e..73c67fc59a 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1245,5 +1245,4 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3 static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; - sdbCancelFetch(pSdb, pIter); -} + sdbCancelFetch(pSdb, \ No newline at end of file From da3e2329da0d14eb787219fc168300b11acea29a Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 27 Jan 2022 11:20:38 +0800 Subject: [PATCH 32/37] feature/qnode --- source/dnode/mnode/impl/src/mndDb.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 87a8becf33..5e6f457a67 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -824,7 +824,7 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SVgroupInfo *vgLis if (pIter == NULL) break; if (pVgroup->dbUid == pDb->uid) { - SVgroupInfo *pInfo = &pRsp->vgroupInfo[vindex]; + SVgroupInfo *pInfo = &vgList[vindex]; pInfo->vgId = htonl(pVgroup->vgId); pInfo->hashBegin = htonl(pVgroup->hashBegin); pInfo->hashEnd = htonl(pVgroup->hashEnd); @@ -1253,4 +1253,5 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3 static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; - sdbCancelFetch(pSdb, \ No newline at end of file + sdbCancelFetch(pSdb, pIter); +} \ No newline at end of file From a3241613d7f3a2a7eec4dcb4f9ccadfd2802f706 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 27 Jan 2022 13:29:53 +0800 Subject: [PATCH 33/37] fix destroy connection issue --- source/client/src/clientHb.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index f8957f6fd8..f6c473333c 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -528,8 +528,12 @@ int hbRegisterConn(SAppHbMgr* pAppHbMgr, int32_t connId, int64_t clusterId, int3 } void hbDeregisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey) { - taosHashRemove(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); - taosHashRemove(pAppHbMgr->connInfo, &connKey, sizeof(SClientHbKey)); + int32_t code = 0; + code = taosHashRemove(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); + code = taosHashRemove(pAppHbMgr->connInfo, &connKey, sizeof(SClientHbKey)); + if (code) { + return; + } atomic_sub_fetch_32(&pAppHbMgr->connKeyCnt, 1); if (atomic_load_32(&pAppHbMgr->connKeyCnt) <= 0) { appHbMgrCleanup(pAppHbMgr); From 84a7534256b74ec66ee9d48789c1c40a44cf7f87 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 27 Jan 2022 13:44:54 +0800 Subject: [PATCH 34/37] process drop database rsp --- source/client/src/clientMsgHandler.c | 6 +++--- source/libs/catalog/src/catalog.c | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index c9b1d07965..24d1c0f03c 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -299,13 +299,13 @@ int32_t processDropDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { return code; } - SDropDbReq *req = pRequest->body.requestMsg.pData; + SDropDbRsp *rsp = (SDropDbRsp *)pMsg->pData; SDbVgVersion dbVer = {0}; struct SCatalog *pCatalog = NULL; - strncpy(dbVer.dbName, req->db, sizeof(dbVer.dbName)); - dbVer.dbId = 0; //TODO GET DBID FROM RSP + strncpy(dbVer.dbName, rsp->db, sizeof(dbVer.dbName)); + dbVer.dbId = be64toh(rsp->uid); catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog); diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index f5487f7da8..1b4d711aad 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -794,17 +794,12 @@ int32_t ctgValidateAndRemoveDbInfo(struct SCatalog* pCatalog, SDbVgVersion* targ CTG_LOCK(CTG_WRITE, &info->lock); - //TODO OPEN IT -#if 0 if (info->dbId != target->dbId) { ctgInfo("db id already updated, db:%s, dbId:%"PRIx64 ", targetId:%"PRIx64, target->dbName, info->dbId, target->dbId); CTG_UNLOCK(CTG_WRITE, &info->lock); taosHashRelease(pCatalog->dbCache.cache, info); return TSDB_CODE_SUCCESS; } -#else - target->dbId = info->dbId; -#endif if (info->vgInfo) { ctgInfo("cleanup db vgInfo, db:%s", target->dbName); From a53d7036eceb9dceaeffaa9e7ceac97908bcc271 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 27 Jan 2022 13:52:10 +0800 Subject: [PATCH 35/37] fix ut case issue --- source/dnode/mnode/impl/test/profile/profile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/test/profile/profile.cpp b/source/dnode/mnode/impl/test/profile/profile.cpp index 36550f875e..ccf13d5d66 100644 --- a/source/dnode/mnode/impl/test/profile/profile.cpp +++ b/source/dnode/mnode/impl/test/profile/profile.cpp @@ -105,7 +105,7 @@ TEST_F(MndTestProfile, 04_HeartBeatMsg) { kv.key = 123; kv.value = (void*)"bcd"; kv.valueLen = 4; - taosHashPut(req.info, &kv.key, sizeof(kv.key), kv.value, kv.valueLen); + taosHashPut(req.info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); taosArrayPush(batchReq.reqs, &req); int32_t tlen = tSerializeSClientHbBatchReq(NULL, &batchReq); From 6da9c663ff78faf06ed53578092c5be291e0dec9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 27 Jan 2022 15:54:49 +0800 Subject: [PATCH 36/37] [td-11818] update log, add sql in the log file. Remove a global configure parameter. --- include/common/tglobal.h | 1 - include/common/tmsg.h | 16 +++- include/libs/scheduler/scheduler.h | 4 +- source/client/src/clientImpl.c | 13 ++-- source/common/src/tglobal.c | 11 --- source/libs/qcom/src/queryUtil.c | 2 +- source/libs/qworker/inc/qworkerInt.h | 6 +- source/libs/qworker/src/qworker.c | 3 +- source/libs/qworker/src/qworkerMsg.c | 15 ++-- source/libs/qworker/test/qworkerTests.cpp | 3 +- source/libs/scheduler/inc/schedulerInt.h | 7 +- source/libs/scheduler/src/scheduler.c | 76 +++++++------------ source/libs/scheduler/test/schedulerTests.cpp | 6 +- 13 files changed, 75 insertions(+), 88 deletions(-) diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 1b96cbdc78..4bc8c9fb86 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -64,7 +64,6 @@ extern int8_t tsKeepOriginalColumnName; extern int8_t tsDeadLockKillQuery; // client -extern int32_t tsMaxSQLStringLen; extern int32_t tsMaxWildCardsLen; extern int32_t tsMaxRegexStringLen; extern int8_t tsTscEnableRecordSql; diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 765022ebaa..8b4dc67c17 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -864,13 +864,21 @@ typedef struct { char desc[TSDB_STEP_DESC_LEN]; } SStartupReq; +/** + * The layout of the query message payload is as following: + * +--------------------+---------------------------------+ + * |Sql statement | Physical plan | + * |(denoted by sqlLen) |(In JSON, denoted by contentLen) | + * +--------------------+---------------------------------+ + */ typedef struct SSubQueryMsg { SMsgHead header; uint64_t sId; uint64_t queryId; uint64_t taskId; int8_t taskType; - uint32_t contentLen; + uint32_t sqlLen; // the query sql, + uint32_t phyLen; char msg[]; } SSubQueryMsg; @@ -1534,7 +1542,8 @@ static FORCE_INLINE int32_t tEncodeSSubQueryMsg(void** buf, const SSubQueryMsg* tlen += taosEncodeFixedU64(buf, pMsg->sId); tlen += taosEncodeFixedU64(buf, pMsg->queryId); tlen += taosEncodeFixedU64(buf, pMsg->taskId); - tlen += taosEncodeFixedU32(buf, pMsg->contentLen); + tlen += taosEncodeFixedU32(buf, pMsg->sqlLen); + tlen += taosEncodeFixedU32(buf, pMsg->phyLen); //tlen += taosEncodeBinary(buf, pMsg->msg, pMsg->contentLen); return tlen; } @@ -1543,7 +1552,8 @@ static FORCE_INLINE void* tDecodeSSubQueryMsg(void* buf, SSubQueryMsg* pMsg) { buf = taosDecodeFixedU64(buf, &pMsg->sId); buf = taosDecodeFixedU64(buf, &pMsg->queryId); buf = taosDecodeFixedU64(buf, &pMsg->taskId); - buf = taosDecodeFixedU32(buf, &pMsg->contentLen); + buf = taosDecodeFixedU32(buf, &pMsg->sqlLen); + buf = taosDecodeFixedU32(buf, &pMsg->phyLen); //buf = taosDecodeBinaryTo(buf, pMsg->msg, pMsg->contentLen); return buf; } diff --git a/include/libs/scheduler/scheduler.h b/include/libs/scheduler/scheduler.h index 5a0da46490..e856adaf31 100644 --- a/include/libs/scheduler/scheduler.h +++ b/include/libs/scheduler/scheduler.h @@ -72,7 +72,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg); * @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr * @return */ -int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes); +int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, const char* sql, SQueryResult *pRes); /** * Process the query job, generated according to the query physical plan. @@ -80,7 +80,7 @@ int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, str * @param pNodeList Qnode/Vnode address list, element is SQueryNodeAddr * @return */ -int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** pJob); +int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, const char* sql, struct SSchJob** pJob); /** * Fetch query result from the remote query executor diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 247b543dea..63da5862d3 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -239,9 +239,10 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t } int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList) { + void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter; if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) { SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf}; - int32_t code = schedulerExecJob(pRequest->pTscObj->pAppInfo->pTransporter, NULL, pDag, &pRequest->body.pQueryJob, &res); + int32_t code = schedulerExecJob(pTransporter, NULL, pDag, &pRequest->body.pQueryJob, pRequest->sqlstr, &res); if (code != TSDB_CODE_SUCCESS) { // handle error and retry } else { @@ -255,7 +256,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList) return pRequest->code; } - return schedulerAsyncExecJob(pRequest->pTscObj->pAppInfo->pTransporter, pNodeList, pDag, &pRequest->body.pQueryJob); + return schedulerAsyncExecJob(pTransporter, pNodeList, pDag, pRequest->sqlstr, &pRequest->body.pQueryJob); } @@ -532,8 +533,8 @@ TAOS_RES *taos_create_topic(TAOS* taos, const char* topicName, const char* sql, goto _return; } - if (sqlLen > tsMaxSQLStringLen) { - tscError("sql string exceeds max length:%d", tsMaxSQLStringLen); + if (sqlLen > TSDB_MAX_ALLOWED_SQL_LEN) { + tscError("sql string exceeds max length:%d", TSDB_MAX_ALLOWED_SQL_LEN); terrno = TSDB_CODE_TSC_EXCEED_SQL_LIMIT; goto _return; } @@ -755,8 +756,8 @@ void tmq_message_destroy(tmq_message_t* tmq_message) { TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { STscObj *pTscObj = (STscObj *)taos; - if (sqlLen > (size_t) tsMaxSQLStringLen) { - tscError("sql string exceeds max length:%d", tsMaxSQLStringLen); + if (sqlLen > (size_t) TSDB_MAX_ALLOWED_SQL_LEN) { + tscError("sql string exceeds max length:%d", TSDB_MAX_ALLOWED_SQL_LEN); terrno = TSDB_CODE_TSC_EXCEED_SQL_LIMIT; return NULL; } diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index a353c018b7..afba1190ba 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -78,7 +78,6 @@ int32_t tsCompressColData = -1; int32_t tsCompatibleModel = 1; // client -int32_t tsMaxSQLStringLen = TSDB_MAX_ALLOWED_SQL_LEN; int32_t tsMaxWildCardsLen = TSDB_PATTERN_STRING_DEFAULT_LEN; int32_t tsMaxRegexStringLen = TSDB_REGEX_STRING_DEFAULT_LEN; @@ -594,16 +593,6 @@ static void doInitGlobalConfig(void) { cfg.unitType = TAOS_CFG_UTYPE_NONE; taosAddConfigOption(cfg); - cfg.option = "maxSQLLength"; - cfg.ptr = &tsMaxSQLStringLen; - cfg.valType = TAOS_CFG_VTYPE_INT32; - cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_CLIENT | TSDB_CFG_CTYPE_B_SHOW; - cfg.minValue = TSDB_MAX_SQL_LEN; - cfg.maxValue = TSDB_MAX_ALLOWED_SQL_LEN; - cfg.ptrLength = 0; - cfg.unitType = TAOS_CFG_UTYPE_BYTE; - taosAddConfigOption(cfg); - cfg.option = "maxWildCardsLength"; cfg.ptr = &tsMaxWildCardsLen; cfg.valType = TAOS_CFG_VTYPE_INT32; diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c index cfe2ed96ad..9f678b4528 100644 --- a/source/libs/qcom/src/queryUtil.c +++ b/source/libs/qcom/src/queryUtil.c @@ -128,7 +128,7 @@ int32_t asyncSendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransp if (NULL == pMsg) { qError("0x%"PRIx64" msg:%s malloc failed", pInfo->requestId, TMSG_INFO(pInfo->msgType)); terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; - return -1; + return terrno; } memcpy(pMsg, pInfo->msgInfo.pData, pInfo->msgInfo.len); diff --git a/source/libs/qworker/inc/qworkerInt.h b/source/libs/qworker/inc/qworkerInt.h index a19a02069b..de2940846c 100644 --- a/source/libs/qworker/inc/qworkerInt.h +++ b/source/libs/qworker/inc/qworkerInt.h @@ -182,9 +182,9 @@ typedef struct SQWorkerMgmt { #define QW_TASK_WLOG_E(param) qWarn("QW:%p QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, qId, tId) #define QW_TASK_DLOG_E(param) qDebug("QW:%p QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, qId, tId) -#define QW_SCH_TASK_ELOG(param, ...) qError("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) -#define QW_SCH_TASK_WLOG(param, ...) qWarn("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) -#define QW_SCH_TASK_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) +#define QW_SCH_TASK_ELOG(param, ...) qError("QW:%p SID:0x%"PRIx64",QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) +#define QW_SCH_TASK_WLOG(param, ...) qWarn("QW:%p SID:0x%"PRIx64",QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) +#define QW_SCH_TASK_DLOG(param, ...) qDebug("QW:%p SID:0x%"PRIx64",QID:0x%"PRIx64",TID:0x%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__) #define QW_LOCK_DEBUG(...) do { if (gQWDebug.lockDebug) { qDebug(__VA_ARGS__); } } while (0) diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 9b9b6a73ca..8705bc23b9 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -479,7 +479,6 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryEnd) { if (NULL == pRes) { QW_TASK_DLOG("task query done, useconds:%"PRIu64, useconds); - dsEndPut(sinkHandle, useconds); if (TASK_TYPE_TEMP == ctx->taskType) { @@ -493,6 +492,8 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryEnd) { break; } + ASSERT(pRes->info.rows > 0); + SInputData inputData = {.pData = pRes, .pTableRetrieveTsMap = NULL}; code = dsPutDataBlock(sinkHandle, &inputData, &qcontinue); if (code) { diff --git a/source/libs/qworker/src/qworkerMsg.c b/source/libs/qworker/src/qworkerMsg.c index 11783335b3..368a590918 100644 --- a/source/libs/qworker/src/qworkerMsg.c +++ b/source/libs/qworker/src/qworkerMsg.c @@ -282,18 +282,21 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) { QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } - msg->sId = be64toh(msg->sId); + msg->sId = be64toh(msg->sId); msg->queryId = be64toh(msg->queryId); - msg->taskId = be64toh(msg->taskId); - msg->contentLen = ntohl(msg->contentLen); - + msg->taskId = be64toh(msg->taskId); + msg->phyLen = ntohl(msg->phyLen); + msg->sqlLen = ntohl(msg->sqlLen); + uint64_t sId = msg->sId; uint64_t qId = msg->queryId; uint64_t tId = msg->taskId; - SQWMsg qwMsg = {.node = node, .msg = msg->msg, .msgLen = msg->contentLen, .connection = pMsg}; + SQWMsg qwMsg = {.node = node, .msg = msg->msg + msg->sqlLen, .msgLen = msg->phyLen, .connection = pMsg}; - QW_SCH_TASK_DLOG("processQuery start, node:%p", node); + char* sql = strndup(msg->msg, msg->sqlLen); + QW_SCH_TASK_DLOG("processQuery start, node:%p, sql:%s", node, sql); + tfree(sql); QW_RET(qwProcessQuery(QW_FPARAMS(), &qwMsg, msg->taskType)); diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp index 4c81123bf2..38890150ee 100644 --- a/source/libs/qworker/test/qworkerTests.cpp +++ b/source/libs/qworker/test/qworkerTests.cpp @@ -113,7 +113,8 @@ void qwtBuildQueryReqMsg(SRpcMsg *queryRpc) { qwtqueryMsg.queryId = htobe64(atomic_add_fetch_64(&qwtTestQueryId, 1)); qwtqueryMsg.sId = htobe64(1); qwtqueryMsg.taskId = htobe64(1); - qwtqueryMsg.contentLen = htonl(100); + qwtqueryMsg.phyLen = htonl(100); + qwtqueryMsg.sqlLen = 0; queryRpc->msgType = TDMT_VND_QUERY; queryRpc->pCont = &qwtqueryMsg; queryRpc->contLen = sizeof(SSubQueryMsg) + 100; diff --git a/source/libs/scheduler/inc/schedulerInt.h b/source/libs/scheduler/inc/schedulerInt.h index 2ace1c66f5..f5e3ef9963 100644 --- a/source/libs/scheduler/inc/schedulerInt.h +++ b/source/libs/scheduler/inc/schedulerInt.h @@ -128,6 +128,7 @@ typedef struct SSchJob { int32_t errCode; void *res; //TODO free it or not int32_t resNumOfRows; + const char *sql; SQueryProfileSummary summary; } SSchJob; @@ -150,11 +151,11 @@ typedef struct SSchJob { #define SCH_JOB_DLOG(param, ...) qDebug("QID:0x%" PRIx64 " " param, pJob->queryId, __VA_ARGS__) #define SCH_TASK_ELOG(param, ...) \ - qError("QID:0x%" PRIx64 ",TID:%" PRId64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) + qError("QID:0x%" PRIx64 ",TID:0x%" PRIx64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) #define SCH_TASK_DLOG(param, ...) \ - qDebug("QID:0x%" PRIx64 ",TID:%" PRId64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) + qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) #define SCH_TASK_WLOG(param, ...) \ - qWarn("QID:0x%" PRIx64 ",TID:%" PRId64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) + qWarn("QID:0x%" PRIx64 ",TID:0x%" PRIx64 " " param, pJob->queryId, pTask->taskId, __VA_ARGS__) #define SCH_ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; return _code; } } while (0) #define SCH_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0) diff --git a/source/libs/scheduler/src/scheduler.c b/source/libs/scheduler/src/scheduler.c index 621ed68bae..25137beed9 100644 --- a/source/libs/scheduler/src/scheduler.c +++ b/source/libs/scheduler/src/scheduler.c @@ -345,7 +345,6 @@ int32_t schValidateAndBuildJob(SQueryDag *pDag, SSchJob *pJob) { } pLevel = taosArrayGet(pJob->levels, i); - pLevel->level = i; plans = taosArrayGetP(pDag->pSubplans, i); @@ -375,7 +374,7 @@ int32_t schValidateAndBuildJob(SQueryDag *pDag, SSchJob *pJob) { SSchTask task = {0}; SSchTask *pTask = &task; - + SCH_ERR_JRET(schInitTask(pJob, &task, plan, pLevel)); void *p = taosArrayPush(pLevel->subTasks, &task); @@ -388,8 +387,6 @@ int32_t schValidateAndBuildJob(SQueryDag *pDag, SSchJob *pJob) { SCH_TASK_ELOG("taosHashPut to planToTaks failed, taskIdx:%d", n); SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY); } - - SCH_TASK_DLOG("task initialized, level:%d", pLevel->level); } SCH_JOB_DLOG("level initialized, taskNum:%d", taskNum); @@ -716,8 +713,6 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) { int32_t code = 0; SSchTask *pErrTask = pTask; - SCH_TASK_DLOG("taskOnSuccess, status:%d", SCH_GET_TASK_STATUS(pTask)); - code = schMoveTaskToSuccList(pJob, pTask, &moved); if (code && moved) { SCH_ERR_RET(code); @@ -739,7 +734,6 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) { if (taskDone < pTask->level->taskNum) { SCH_TASK_DLOG("wait all tasks, done:%d, all:%d", taskDone, pTask->level->taskNum); - return TSDB_CODE_SUCCESS; } else if (taskDone > pTask->level->taskNum) { SCH_TASK_ELOG("taskDone number invalid, done:%d, total:%d", taskDone, pTask->level->taskNum); @@ -1031,22 +1025,18 @@ int32_t schAsyncSendMsg(void *transport, SEpSet* epSet, uint64_t qId, uint64_t t pMsgSendInfo->fp = fp; int64_t transporterId = 0; - code = asyncSendMsgToServer(transport, epSet, &transporterId, pMsgSendInfo); if (code) { - qError("QID:%"PRIx64 ",TID:%"PRIx64 " asyncSendMsgToServer failed, code:%x", qId, tId, code); SCH_ERR_JRET(code); } - qDebug("QID:%"PRIx64 ",TID:%"PRIx64 " req msg sent, type:%d, %s", qId, tId, msgType, TMSG_INFO(msgType)); - + qDebug("QID:0x%"PRIx64 ",TID:0x%"PRIx64 " req msg sent, type:%d, %s", qId, tId, msgType, TMSG_INFO(msgType)); return TSDB_CODE_SUCCESS; _return: tfree(param); tfree(pMsgSendInfo); - SCH_RET(code); } @@ -1057,7 +1047,6 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, bool isCandidateAddr = false; if (NULL == addr) { addr = taosArrayGet(pTask->candidateAddrs, atomic_load_8(&pTask->candidateIdx)); - isCandidateAddr = true; } @@ -1078,7 +1067,9 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, } case TDMT_VND_QUERY: { - msgSize = sizeof(SSubQueryMsg) + pTask->msgLen; + uint32_t len = strlen(pJob->sql); + + msgSize = sizeof(SSubQueryMsg) + pTask->msgLen + len; msg = calloc(1, msgSize); if (NULL == msg) { SCH_TASK_ELOG("calloc %d failed", msgSize); @@ -1086,15 +1077,16 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr, } SSubQueryMsg *pMsg = msg; - pMsg->header.vgId = htonl(addr->nodeId); - - pMsg->sId = htobe64(schMgmt.sId); - pMsg->queryId = htobe64(pJob->queryId); - pMsg->taskId = htobe64(pTask->taskId); - pMsg->taskType = TASK_TYPE_TEMP; - pMsg->contentLen = htonl(pTask->msgLen); - memcpy(pMsg->msg, pTask->msg, pTask->msgLen); + pMsg->sId = htobe64(schMgmt.sId); + pMsg->queryId = htobe64(pJob->queryId); + pMsg->taskId = htobe64(pTask->taskId); + pMsg->taskType = TASK_TYPE_TEMP; + pMsg->phyLen = htonl(pTask->msgLen); + pMsg->sqlLen = htonl(len); + + memcpy(pMsg->msg, pJob->sql, len); + memcpy(pMsg->msg + len, pTask->msg, pTask->msgLen); break; } @@ -1205,7 +1197,7 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) { SCH_TASK_ELOG("failed to create physical plan, code:%s, msg:%p, len:%d", tstrerror(code), pTask->msg, pTask->msgLen); SCH_ERR_JRET(code); } else { - SCH_TASK_DLOG(" ===physical plan=== len:%d, %s", pTask->msgLen, pTask->msg); + SCH_TASK_DLOG("physical plan len:%d, %s", pTask->msgLen, pTask->msg); } } @@ -1214,7 +1206,6 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) { // NOTE: race condition: the task should be put into the hash table before send msg to server if (SCH_GET_TASK_STATUS(pTask) != JOB_TASK_STATUS_EXECUTING) { SCH_ERR_JRET(schPushTaskToExecList(pJob, pTask)); - SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_EXECUTING); } @@ -1281,7 +1272,7 @@ void schDropJobAllTasks(SSchJob *pJob) { schDropTaskInHashList(pJob, pJob->failTasks); } -int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** job, bool syncSchedule) { +static int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** job, const char* sql, bool syncSchedule) { qDebug("QID:0x%"PRIx64" job started", pDag->queryId); if (pNodeList == NULL || (pNodeList && taosArrayGetSize(pNodeList) <= 0)) { @@ -1297,6 +1288,7 @@ int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, stru pJob->attr.syncSchedule = syncSchedule; pJob->transport = transport; + pJob->sql = sql; if (pNodeList != NULL) { pJob->nodeList = taosArrayDup(pNodeList); @@ -1336,7 +1328,6 @@ int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, stru } pJob->status = JOB_TASK_STATUS_NOT_START; - SCH_ERR_JRET(schLaunchJob(pJob)); *(SSchJob **)job = pJob; @@ -1347,15 +1338,12 @@ int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, stru } SCH_JOB_DLOG("job exec done, job status:%d", SCH_GET_JOB_STATUS(pJob)); - return TSDB_CODE_SUCCESS; _return: *(SSchJob **)job = NULL; - schedulerFreeJob(pJob); - SCH_RET(code); } @@ -1399,29 +1387,24 @@ int32_t schedulerInit(SSchedulerCfg *cfg) { return TSDB_CODE_SUCCESS; } -int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes) { +int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, const char* sql, SQueryResult *pRes) { if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob || NULL == pRes) { SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } - SSchJob *job = NULL; - - SCH_ERR_RET(schExecJobImpl(transport, nodeList, pDag, pJob, true)); - - job = *pJob; - - pRes->code = atomic_load_32(&job->errCode); - pRes->numOfRows = job->resNumOfRows; + SCH_ERR_RET(schExecJobImpl(transport, nodeList, pDag, pJob, sql, true)); + pRes->code = atomic_load_32(&(*pJob)->errCode); + pRes->numOfRows = (*pJob)->resNumOfRows; return TSDB_CODE_SUCCESS; } -int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** pJob) { +int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, const char* sql, struct SSchJob** pJob) { if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob) { SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } - SCH_ERR_RET(schExecJobImpl(transport, pNodeList, pDag, pJob, false)); + SCH_ERR_RET(schExecJobImpl(transport, pNodeList, pDag, pJob, sql, false)); return TSDB_CODE_SUCCESS; } @@ -1456,7 +1439,6 @@ int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks) { for (int32_t i = 0; i < taskNum; ++i) { SSubplan *plan = taosArrayGetP(plans, i); - tInfo.addr = plan->execNode; code = qSubPlanToString(plan, &msg, &msgLen); @@ -1472,16 +1454,16 @@ int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks) { } SSubQueryMsg* pMsg = calloc(1, msgSize); - /*SSubQueryMsg *pMsg = (SSubQueryMsg*) msg;*/ memcpy(pMsg->msg, msg, msgLen); pMsg->header.vgId = tInfo.addr.nodeId; - pMsg->sId = schMgmt.sId; - pMsg->queryId = plan->id.queryId; - pMsg->taskId = schGenUUID(); + pMsg->sId = schMgmt.sId; + pMsg->queryId = plan->id.queryId; + pMsg->taskId = schGenUUID(); pMsg->taskType = TASK_TYPE_PERSISTENT; - pMsg->contentLen = msgLen; + pMsg->phyLen = msgLen; + pMsg->sqlLen = 0; /*memcpy(pMsg->msg, ((SSubQueryMsg*)msg)->msg, msgLen);*/ tInfo.msg = pMsg; @@ -1514,7 +1496,7 @@ int32_t schedulerCopyTask(STaskInfo *src, SArray **dst, int32_t copyNum) { SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY); } - int32_t msgSize = src->msg->contentLen + sizeof(*src->msg); + int32_t msgSize = src->msg->phyLen + sizeof(*src->msg); STaskInfo info = {0}; info.addr = src->addr; diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp index 6e44d99c15..2c75683ecb 100644 --- a/source/libs/scheduler/test/schedulerTests.cpp +++ b/source/libs/scheduler/test/schedulerTests.cpp @@ -378,7 +378,7 @@ void* schtRunJobThread(void *aa) { qnodeAddr.port = 6031; taosArrayPush(qnodeList, &qnodeAddr); - code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, &job); + code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, "select * from tb", &job); assert(code == 0); execTasks = taosHashInit(5, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_ENTRY_LOCK); @@ -539,7 +539,7 @@ TEST(queryTest, normalCase) { schtSetExecNode(); schtSetAsyncSendMsgToServer(); - code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, &pJob); + code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, "select * from tb", &pJob); ASSERT_EQ(code, 0); SSchJob *job = (SSchJob *)pJob; @@ -649,7 +649,7 @@ TEST(insertTest, normalCase) { pthread_create(&(thread1), &thattr, schtSendRsp, &pInsertJob); SQueryResult res = {0}; - code = schedulerExecJob(mockPointer, qnodeList, &dag, &pInsertJob, &res); + code = schedulerExecJob(mockPointer, qnodeList, &dag, &pInsertJob, "insert into tb values(now,1)", &res); ASSERT_EQ(code, 0); ASSERT_EQ(res.numOfRows, 20); From 284fde6001baa7a5583ce5b0d99753b427efc88d Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 27 Jan 2022 16:03:26 +0800 Subject: [PATCH 37/37] [td-11818] fix compiler error. --- tools/shell/src/shellEngine.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index b785ed2707..4186f0dae1 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -966,7 +966,7 @@ int isCommentLine(char *line) { void source_file(TAOS *con, char *fptr) { wordexp_t full_path; int read_len = 0; - char *cmd = calloc(1, tsMaxSQLStringLen + 1); + char *cmd = calloc(1, TSDB_MAX_ALLOWED_SQL_LEN + 1); size_t cmd_len = 0; char *line = NULL; size_t line_len = 0; @@ -998,7 +998,7 @@ void source_file(TAOS *con, char *fptr) { } while ((read_len = tgetline(&line, &line_len, f)) != -1) { - if (read_len >= tsMaxSQLStringLen) continue; + if (read_len >= TSDB_MAX_ALLOWED_SQL_LEN) continue; line[--read_len] = '\0'; if (read_len == 0 || isCommentLine(line)) { // line starts with # @@ -1015,7 +1015,7 @@ void source_file(TAOS *con, char *fptr) { memcpy(cmd + cmd_len, line, read_len); printf("%s%s\n", PROMPT_HEADER, cmd); shellRunCommand(con, cmd); - memset(cmd, 0, tsMaxSQLStringLen); + memset(cmd, 0, TSDB_MAX_ALLOWED_SQL_LEN); cmd_len = 0; }