diff --git a/cmake/cmake.options b/cmake/cmake.options index 1a1a5b5d785007692fcc5982558024f4bf05b893..946eb5d2583096dab9faecc2e8b222c5c24377f5 100644 --- a/cmake/cmake.options +++ b/cmake/cmake.options @@ -18,6 +18,13 @@ IF(${TD_WINDOWS}) ON ) + MESSAGE("build iconv Win32") + option( + BUILD_WITH_ICONV + "If build iconv on Windows" + ON + ) + ENDIF () IF(${TD_LINUX} MATCHES TRUE) diff --git a/cmake/iconv_CMakeLists.txt.in b/cmake/iconv_CMakeLists.txt.in new file mode 100644 index 0000000000000000000000000000000000000000..31dfd829fcbc8a5cc6a4b28752eda76280b3c791 --- /dev/null +++ b/cmake/iconv_CMakeLists.txt.in @@ -0,0 +1,12 @@ + +# iconv +ExternalProject_Add(iconv + GIT_REPOSITORY https://github.com/win-iconv/win-iconv.git + GIT_TAG v0.0.8 + SOURCE_DIR "${CMAKE_CONTRIB_DIR}/iconv" + BINARY_DIR "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) \ No newline at end of file diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index f87f660ab350eb64ea272ef085e8c14ccfe56eae..9cf68b87f9764b4670cf7091c2f7d83bbb347063 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -83,6 +83,11 @@ if(${BUILD_WITH_NURAFT}) cat("${CMAKE_SUPPORT_DIR}/nuraft_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) endif(${BUILD_WITH_NURAFT}) +# iconv +if(${BUILD_WITH_ICONV}) + cat("${CMAKE_SUPPORT_DIR}/iconv_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) +endif(${BUILD_WITH_ICONV}) + # download dependencies configure_file(${CONTRIB_TMP_FILE} "${CMAKE_CONTRIB_DIR}/deps-download/CMakeLists.txt") execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . @@ -208,14 +213,10 @@ endif(${BUILD_WITH_TRAFT}) # LIBUV if(${BUILD_WITH_UV}) - if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") - MESSAGE("Windows need set no-sign-compare") - add_compile_options(-Wno-sign-compare) - endif () - if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") - file(READ "libuv/include/uv.h" CONTENTS) - string(REGEX REPLACE "/([\r]*)\nstruct uv_tcp_s {" "/\\1\ntypedef BOOL (PASCAL *LPFN_CONNECTEX) (SOCKET s, const struct sockaddr* name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength,LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped);\\1\nstruct uv_tcp_s {" CONTENTS_NEW "${CONTENTS}") - file(WRITE "libuv/include/uv.h" "${CONTENTS_NEW}") + if (${TD_WINDOWS}) + file(READ "libuv/include/uv.h" CONTENTS) + string(REGEX REPLACE "/([\r]*)\nstruct uv_tcp_s {" "/\\1\ntypedef BOOL (PASCAL *LPFN_CONNECTEX) (SOCKET s, const struct sockaddr* name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength,LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped);\\1\nstruct uv_tcp_s {" CONTENTS_NEW "${CONTENTS}") + file(WRITE "libuv/include/uv.h" "${CONTENTS_NEW}") endif () add_subdirectory(libuv) endif(${BUILD_WITH_UV}) @@ -249,10 +250,14 @@ endif(${BUILD_WITH_SQLITE}) # pthread if(${BUILD_PTHREAD}) - ADD_DEFINITIONS("-DPTW32_STATIC_LIB") - add_subdirectory(pthread-win32) + add_definitions(-DPTW32_STATIC_LIB) + add_subdirectory(pthread) endif(${BUILD_PTHREAD}) +# iconv +if(${BUILD_WITH_ICONV}) + add_subdirectory(iconv) +endif(${BUILD_WITH_ICONV}) # ================================================================================================ # Build test diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 1621b175dddb3bb8c22db10531fa42f35703f832..bd4cc52837e0d90f7adf1c7078eae2ccd70bc8bd 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -111,15 +111,16 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_MAX, } EShowType; -#define TSDB_ALTER_TABLE_ADD_TAG 1 -#define TSDB_ALTER_TABLE_DROP_TAG 2 -#define TSDB_ALTER_TABLE_UPDATE_TAG_NAME 3 -#define TSDB_ALTER_TABLE_UPDATE_TAG_VAL 4 - +#define TSDB_ALTER_TABLE_ADD_TAG 1 +#define TSDB_ALTER_TABLE_DROP_TAG 2 +#define TSDB_ALTER_TABLE_UPDATE_TAG_NAME 3 +#define TSDB_ALTER_TABLE_UPDATE_TAG_VAL 4 #define TSDB_ALTER_TABLE_ADD_COLUMN 5 #define TSDB_ALTER_TABLE_DROP_COLUMN 6 #define TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES 7 #define TSDB_ALTER_TABLE_UPDATE_TAG_BYTES 8 +#define TSDB_ALTER_TABLE_UPDATE_OPTIONS 9 +#define TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME 10 #define TSDB_FILL_NONE 0 #define TSDB_FILL_NULL 1 @@ -2052,27 +2053,19 @@ static FORCE_INLINE void* tDecodeTSma(void* buf, STSma* pSma) { buf = taosDecodeFixedI64(buf, &pSma->sliding); if (pSma->exprLen > 0) { - pSma->expr = (char*)calloc(pSma->exprLen, 1); - if (pSma->expr != NULL) { - buf = taosDecodeStringTo(buf, pSma->expr); - } else { + if ((buf = taosDecodeString(buf, &pSma->expr)) == NULL) { tdDestroyTSma(pSma); return NULL; } - } else { pSma->expr = NULL; } if (pSma->tagsFilterLen > 0) { - pSma->tagsFilter = (char*)calloc(pSma->tagsFilterLen, 1); - if (pSma->tagsFilter != NULL) { - buf = taosDecodeStringTo(buf, pSma->tagsFilter); - } else { + if ((buf = taosDecodeString(buf, &pSma->tagsFilter)) == NULL) { tdDestroyTSma(pSma); return NULL; } - } else { pSma->tagsFilter = NULL; } diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 167c72a778a1bef50bdf8ebfc3b20ae665bdfab6..27d509e931d8197b5fab120241dc2afd5b606087 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -34,128 +34,147 @@ #define TK_NK_REM 16 #define TK_NK_CONCAT 17 #define TK_CREATE 18 -#define TK_USER 19 -#define TK_PASS 20 -#define TK_NK_STRING 21 -#define TK_ALTER 22 -#define TK_PRIVILEGE 23 -#define TK_DROP 24 -#define TK_SHOW 25 -#define TK_USERS 26 -#define TK_DNODE 27 -#define TK_PORT 28 -#define TK_NK_INTEGER 29 -#define TK_DNODES 30 -#define TK_NK_ID 31 -#define TK_NK_IPTOKEN 32 -#define TK_QNODE 33 -#define TK_ON 34 -#define TK_QNODES 35 -#define TK_DATABASE 36 -#define TK_DATABASES 37 -#define TK_USE 38 -#define TK_IF 39 -#define TK_NOT 40 -#define TK_EXISTS 41 -#define TK_BLOCKS 42 -#define TK_CACHE 43 -#define TK_CACHELAST 44 -#define TK_COMP 45 -#define TK_DAYS 46 -#define TK_FSYNC 47 -#define TK_MAXROWS 48 -#define TK_MINROWS 49 -#define TK_KEEP 50 -#define TK_PRECISION 51 -#define TK_QUORUM 52 -#define TK_REPLICA 53 -#define TK_TTL 54 -#define TK_WAL 55 -#define TK_VGROUPS 56 -#define TK_SINGLE_STABLE 57 -#define TK_STREAM_MODE 58 -#define TK_TABLE 59 -#define TK_NK_LP 60 -#define TK_NK_RP 61 -#define TK_STABLE 62 -#define TK_TABLES 63 -#define TK_STABLES 64 -#define TK_USING 65 -#define TK_TAGS 66 -#define TK_NK_DOT 67 -#define TK_NK_COMMA 68 -#define TK_COMMENT 69 -#define TK_BOOL 70 -#define TK_TINYINT 71 -#define TK_SMALLINT 72 -#define TK_INT 73 -#define TK_INTEGER 74 -#define TK_BIGINT 75 -#define TK_FLOAT 76 -#define TK_DOUBLE 77 -#define TK_BINARY 78 -#define TK_TIMESTAMP 79 -#define TK_NCHAR 80 -#define TK_UNSIGNED 81 -#define TK_JSON 82 -#define TK_VARCHAR 83 -#define TK_MEDIUMBLOB 84 -#define TK_BLOB 85 -#define TK_VARBINARY 86 -#define TK_DECIMAL 87 -#define TK_SMA 88 -#define TK_INDEX 89 -#define TK_FULLTEXT 90 -#define TK_FUNCTION 91 -#define TK_INTERVAL 92 -#define TK_TOPIC 93 -#define TK_AS 94 -#define TK_MNODES 95 -#define TK_NK_FLOAT 96 -#define TK_NK_BOOL 97 -#define TK_NK_VARIABLE 98 -#define TK_BETWEEN 99 -#define TK_IS 100 -#define TK_NULL 101 -#define TK_NK_LT 102 -#define TK_NK_GT 103 -#define TK_NK_LE 104 -#define TK_NK_GE 105 -#define TK_NK_NE 106 -#define TK_NK_EQ 107 -#define TK_LIKE 108 -#define TK_MATCH 109 -#define TK_NMATCH 110 -#define TK_IN 111 -#define TK_FROM 112 -#define TK_JOIN 113 -#define TK_INNER 114 -#define TK_SELECT 115 -#define TK_DISTINCT 116 -#define TK_WHERE 117 -#define TK_PARTITION 118 -#define TK_BY 119 -#define TK_SESSION 120 -#define TK_STATE_WINDOW 121 -#define TK_SLIDING 122 -#define TK_FILL 123 -#define TK_VALUE 124 -#define TK_NONE 125 -#define TK_PREV 126 -#define TK_LINEAR 127 -#define TK_NEXT 128 -#define TK_GROUP 129 -#define TK_HAVING 130 -#define TK_ORDER 131 -#define TK_SLIMIT 132 -#define TK_SOFFSET 133 -#define TK_LIMIT 134 -#define TK_OFFSET 135 -#define TK_ASC 136 -#define TK_DESC 137 -#define TK_NULLS 138 -#define TK_FIRST 139 -#define TK_LAST 140 +#define TK_ACCOUNT 19 +#define TK_NK_ID 20 +#define TK_PASS 21 +#define TK_NK_STRING 22 +#define TK_ALTER 23 +#define TK_PPS 24 +#define TK_TSERIES 25 +#define TK_STORAGE 26 +#define TK_STREAMS 27 +#define TK_QTIME 28 +#define TK_DBS 29 +#define TK_USERS 30 +#define TK_CONNS 31 +#define TK_STATE 32 +#define TK_USER 33 +#define TK_PRIVILEGE 34 +#define TK_DROP 35 +#define TK_SHOW 36 +#define TK_DNODE 37 +#define TK_PORT 38 +#define TK_NK_INTEGER 39 +#define TK_DNODES 40 +#define TK_NK_IPTOKEN 41 +#define TK_LOCAL 42 +#define TK_QNODE 43 +#define TK_ON 44 +#define TK_QNODES 45 +#define TK_DATABASE 46 +#define TK_DATABASES 47 +#define TK_USE 48 +#define TK_IF 49 +#define TK_NOT 50 +#define TK_EXISTS 51 +#define TK_BLOCKS 52 +#define TK_CACHE 53 +#define TK_CACHELAST 54 +#define TK_COMP 55 +#define TK_DAYS 56 +#define TK_FSYNC 57 +#define TK_MAXROWS 58 +#define TK_MINROWS 59 +#define TK_KEEP 60 +#define TK_PRECISION 61 +#define TK_QUORUM 62 +#define TK_REPLICA 63 +#define TK_TTL 64 +#define TK_WAL 65 +#define TK_VGROUPS 66 +#define TK_SINGLE_STABLE 67 +#define TK_STREAM_MODE 68 +#define TK_RETENTIONS 69 +#define TK_FILE_FACTOR 70 +#define TK_NK_FLOAT 71 +#define TK_TABLE 72 +#define TK_NK_LP 73 +#define TK_NK_RP 74 +#define TK_STABLE 75 +#define TK_TABLES 76 +#define TK_STABLES 77 +#define TK_ADD 78 +#define TK_COLUMN 79 +#define TK_MODIFY 80 +#define TK_RENAME 81 +#define TK_TAG 82 +#define TK_SET 83 +#define TK_NK_EQ 84 +#define TK_USING 85 +#define TK_TAGS 86 +#define TK_NK_DOT 87 +#define TK_NK_COMMA 88 +#define TK_COMMENT 89 +#define TK_BOOL 90 +#define TK_TINYINT 91 +#define TK_SMALLINT 92 +#define TK_INT 93 +#define TK_INTEGER 94 +#define TK_BIGINT 95 +#define TK_FLOAT 96 +#define TK_DOUBLE 97 +#define TK_BINARY 98 +#define TK_TIMESTAMP 99 +#define TK_NCHAR 100 +#define TK_UNSIGNED 101 +#define TK_JSON 102 +#define TK_VARCHAR 103 +#define TK_MEDIUMBLOB 104 +#define TK_BLOB 105 +#define TK_VARBINARY 106 +#define TK_DECIMAL 107 +#define TK_SMA 108 +#define TK_ROLLUP 109 +#define TK_INDEX 110 +#define TK_FULLTEXT 111 +#define TK_FUNCTION 112 +#define TK_INTERVAL 113 +#define TK_TOPIC 114 +#define TK_AS 115 +#define TK_MNODES 116 +#define TK_NK_BOOL 117 +#define TK_NK_VARIABLE 118 +#define TK_BETWEEN 119 +#define TK_IS 120 +#define TK_NULL 121 +#define TK_NK_LT 122 +#define TK_NK_GT 123 +#define TK_NK_LE 124 +#define TK_NK_GE 125 +#define TK_NK_NE 126 +#define TK_LIKE 127 +#define TK_MATCH 128 +#define TK_NMATCH 129 +#define TK_IN 130 +#define TK_FROM 131 +#define TK_JOIN 132 +#define TK_INNER 133 +#define TK_SELECT 134 +#define TK_DISTINCT 135 +#define TK_WHERE 136 +#define TK_PARTITION 137 +#define TK_BY 138 +#define TK_SESSION 139 +#define TK_STATE_WINDOW 140 +#define TK_SLIDING 141 +#define TK_FILL 142 +#define TK_VALUE 143 +#define TK_NONE 144 +#define TK_PREV 145 +#define TK_LINEAR 146 +#define TK_NEXT 147 +#define TK_GROUP 148 +#define TK_HAVING 149 +#define TK_ORDER 150 +#define TK_SLIMIT 151 +#define TK_SOFFSET 152 +#define TK_LIMIT 153 +#define TK_OFFSET 154 +#define TK_ASC 155 +#define TK_DESC 156 +#define TK_NULLS 157 +#define TK_FIRST 158 +#define TK_LAST 159 #define TK_NK_SPACE 300 #define TK_NK_COMMENT 301 diff --git a/include/common/ttypes.h b/include/common/ttypes.h index 5aa22bdcad699e7502d880786372d31a3545bd56..a936ea3b5410a4942bd8775a169e7841bc0083cd 100644 --- a/include/common/ttypes.h +++ b/include/common/ttypes.h @@ -27,7 +27,7 @@ extern "C" { typedef int32_t VarDataOffsetT; typedef uint32_t TDRowLenT; typedef uint8_t TDRowValT; -typedef uint16_t col_id_t; +typedef int16_t col_id_t; typedef int8_t col_type_t; #pragma pack(push, 1) diff --git a/include/common/tvariant.h b/include/common/tvariant.h index 995015fe6301b950f2ae415aef791296e6621d28..63f305ab2da00915555dbe63ffbdaefb4d2af73c 100644 --- a/include/common/tvariant.h +++ b/include/common/tvariant.h @@ -31,7 +31,7 @@ typedef struct SVariant { uint64_t u; double d; char *pz; - wchar_t *wpz; + TdUcs4 *ucs4; SArray *arr; // only for 'in' query to hold value list, not value for a field }; } SVariant; diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 5d7174fc0887f644c9924889ef5f199e93b38f30..5dbfd6c2c277f40e1d5a79a6037e6e8f4283bc29 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -127,6 +127,18 @@ typedef struct SDropSuperTableStmt { bool ignoreNotExists; } SDropSuperTableStmt; +typedef struct SAlterTableStmt { + ENodeType type; + char dbName[TSDB_DB_NAME_LEN]; + char tableName[TSDB_TABLE_NAME_LEN]; + int8_t alterType; + char colName[TSDB_COL_NAME_LEN]; + char newColName[TSDB_COL_NAME_LEN]; + STableOptions* pOptions; + SDataType dataType; + SValueNode* pVal; +} SAlterTableStmt; + typedef struct SCreateUserStmt { ENodeType type; char useName[TSDB_USER_LEN]; @@ -158,6 +170,13 @@ typedef struct SDropDnodeStmt { int32_t port; } SDropDnodeStmt; +typedef struct SAlterDnodeStmt { + ENodeType type; + int32_t dnodeId; + char config[TSDB_DNODE_CONFIG_LEN]; + char value[TSDB_DNODE_VALUE_LEN]; +} SAlterDnodeStmt; + typedef struct SShowStmt { ENodeType type; char dbName[TSDB_DB_NAME_LEN]; @@ -215,6 +234,12 @@ typedef struct SDropTopicStmt { bool ignoreNotExists; } SDropTopicStmt; +typedef struct SAlterLocalStmt { + ENodeType type; + char config[TSDB_DNODE_CONFIG_LEN]; + char value[TSDB_DNODE_VALUE_LEN]; +} SAlterLocalStmt; + #ifdef __cplusplus } #endif diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index 4ef70fc7ab868a2b4dee52c87d815e0ee8834c73..d7e67be9e03868f57737af52d80544f2af410696 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -85,6 +85,7 @@ typedef enum ENodeType { QUERY_NODE_DROP_TABLE_CLAUSE, QUERY_NODE_DROP_TABLE_STMT, QUERY_NODE_DROP_SUPER_TABLE_STMT, + QUERY_NODE_ALTER_TABLE_STMT, QUERY_NODE_SHOW_TABLES_STMT, // temp QUERY_NODE_SHOW_STABLES_STMT, QUERY_NODE_CREATE_USER_STMT, @@ -94,6 +95,7 @@ typedef enum ENodeType { QUERY_NODE_USE_DATABASE_STMT, QUERY_NODE_CREATE_DNODE_STMT, QUERY_NODE_DROP_DNODE_STMT, + QUERY_NODE_ALTER_DNODE_STMT, QUERY_NODE_SHOW_DNODES_STMT, QUERY_NODE_SHOW_VGROUPS_STMT, QUERY_NODE_SHOW_MNODES_STMT, @@ -104,6 +106,7 @@ typedef enum ENodeType { QUERY_NODE_DROP_QNODE_STMT, QUERY_NODE_CREATE_TOPIC_STMT, QUERY_NODE_DROP_TOPIC_STMT, + QUERY_NODE_ALTER_LOCAL_STMT, // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN, @@ -163,6 +166,7 @@ SNodeList* nodesMakeList(); int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode); int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode); int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc); +int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc); SListCell* nodesListErase(SNodeList* pList, SListCell* pCell); SNodeptr nodesListGetNode(SNodeList* pList, int32_t index); void nodesDestroyList(SNodeList* pList); diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h index 1d89b075395c89e42475cacf94867842dec058f5..18417cb6080ec76856d2228a36f72cefdcb0d83f 100644 --- a/include/libs/nodes/plannodes.h +++ b/include/libs/nodes/plannodes.h @@ -26,7 +26,6 @@ extern "C" { typedef struct SLogicNode { ENodeType type; - int32_t id; SNodeList* pTargets; // SColumnNode SNode* pConditions; SNodeList* pChildren; @@ -167,6 +166,7 @@ typedef struct SScanPhysiNode { typedef SScanPhysiNode SSystemTableScanPhysiNode; typedef SScanPhysiNode STagScanPhysiNode; +typedef SScanPhysiNode SStreamScanPhysiNode; typedef struct STableScanPhysiNode { SScanPhysiNode scan; diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index fe44d8666b0748d3df5399375b143ca99083b99b..a55a0e218da1bc50c5013892925fe3ccdf6984c9 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -23,6 +23,9 @@ extern "C" { #include "nodes.h" #include "tmsg.h" +#define TABLE_META_SIZE(pMeta) (NULL == (pMeta) ? 0 : (sizeof(STableMeta) + ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags) * sizeof(SSchema))) +#define VGROUPS_INFO_SIZE(pInfo) (NULL == (pInfo) ? 0 : (sizeof(SVgroupsInfo) + (pInfo)->numOfVgroups * sizeof(SVgroupInfo))) + typedef struct SRawExprNode { ENodeType nodeType; char* p; diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h index 77838c705f34b4772c910eb23972aa83d75a003c..23bcdabb1b3cf54705ebf7afbcfe86542da8302f 100644 --- a/include/libs/parser/parser.h +++ b/include/libs/parser/parser.h @@ -26,6 +26,7 @@ typedef struct SParseContext { uint64_t requestId; int32_t acctId; const char *db; + bool streamQuery; void *pTransporter; SEpSet mgmtEpSet; const char *pSql; // sql string diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index c8df40aedcaa2333f7153cebb94954e4d0e63587..b6f42eeee0ed23a98d595e03c786d9103feb6628 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -49,6 +49,10 @@ typedef struct STableComInfo { int32_t rowSize; // row size of the schema } STableComInfo; +typedef struct SIndexMeta { + +} SIndexMeta; + /* * ASSERT(sizeof(SCTableMeta) == 24) * ASSERT(tableType == TSDB_CHILD_TABLE) diff --git a/include/os/osFile.h b/include/os/osFile.h index 209cecedf8946ae51da4cebdbd98dd73a017aedf..508a52267901994da5bb1d8468b7bf48992da357 100644 --- a/include/os/osFile.h +++ b/include/os/osFile.h @@ -22,15 +22,6 @@ extern "C" { #include "osSocket.h" -#if defined(WINDOWS) -typedef int32_t FileFd; -typedef int32_t SocketFd; -#else -typedef int32_t FileFd; -typedef int32_t SocketFd; -#endif - -int64_t taosRead(FileFd fd, void *buf, int64_t count); // If the error is in a third-party library, place this header file under the third-party library header file. #ifndef ALLOW_FORBID_FUNC #define open OPEN_FUNC_TAOS_FORBID @@ -42,6 +33,7 @@ int64_t taosRead(FileFd fd, void *buf, int64_t count); #define close CLOSE_FUNC_TAOS_FORBID #define fclose FCLOSE_FUNC_TAOS_FORBID #define fsync FSYNC_FUNC_TAOS_FORBID + #define getline GETLINE_FUNC_TAOS_FORBID // #define fflush FFLUSH_FUNC_TAOS_FORBID #endif @@ -49,15 +41,6 @@ int64_t taosRead(FileFd fd, void *buf, int64_t count); #define PATH_MAX 256 #endif -typedef int32_t FileFd; - -typedef struct TdFile { - pthread_rwlock_t rwlock; - int refId; - FileFd fd; - FILE *fp; -} * TdFilePtr, TdFile; - typedef struct TdFile *TdFilePtr; #define TD_FILE_CTEATE 0x0001 @@ -95,10 +78,6 @@ int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset) int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count); void taosFprintfFile(TdFilePtr pFile, const char *format, ...); -#if defined(WINDOWS) -#define __restrict__ -#endif // WINDOWS - int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf); int32_t taosEOFFile(TdFilePtr pFile); @@ -111,15 +90,7 @@ int32_t taosRemoveFile(const char *path); void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath); -#if defined(_TD_DARWIN_64) -typedef int32_t SocketFd; - -int64_t taosSendFile(SocketFd fdDst, FileFd pFileSrc, int64_t *offset, int64_t size); -int64_t taosFSendFile(FILE *pFileOut, FILE *pFileIn, int64_t *offset, int64_t size); -#else -int64_t taosSendFile(SocketFd fdDst, TdFilePtr pFileSrc, int64_t *offset, int64_t size); int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size); -#endif void *taosMmapReadOnlyFile(TdFilePtr pFile, int64_t length); bool taosValidFile(TdFilePtr pFile); diff --git a/include/os/osString.h b/include/os/osString.h index 88160dd69e419450d1ec481a83a28065df99186d..9c6d523ab2f239fd8c66cca9a68de5fff76c317f 100644 --- a/include/os/osString.h +++ b/include/os/osString.h @@ -20,16 +20,28 @@ extern "C" { #endif +typedef wchar_t TdWchar; +typedef int32_t TdUcs4; + +// If the error is in a third-party library, place this header file under the third-party library header file. +#ifndef ALLOW_FORBID_FUNC + #define iconv_open ICONV_OPEN_FUNC_TAOS_FORBID + #define iconv_close ICONV_CLOSE_FUNC_TAOS_FORBID + #define iconv ICONV_FUNC_TAOS_FORBID + #define wcwidth WCWIDTH_FUNC_TAOS_FORBID + #define wcswidth WCSWIDTH_FUNC_TAOS_FORBID + #define mbtowc MBTOWC_FUNC_TAOS_FORBID + #define mbstowcs MBSTOWCS_FUNC_TAOS_FORBID + #define wctomb WCTOMB_FUNC_TAOS_FORBID + #define wcstombs WCSTOMBS_FUNC_TAOS_FORBID + #define wcsncpy WCSNCPY_FUNC_TAOS_FORBID + #define wchar_t WCHAR_T_FUNC_TAOS_FORBID +#endif + #if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) #define tstrdup(str) _strdup(str) - #define tstrndup(str, size) _strndup(str, size) - int32_t tgetline(char **lineptr, size_t *n, FILE *stream); - int32_t twcslen(const wchar_t *wcs); #else #define tstrdup(str) strdup(str) - #define tstrndup(str, size) strndup(str, size) - #define tgetline(lineptr, n, stream) getline(lineptr, n, stream) - #define twcslen wcslen #endif #define tstrncpy(dst, src, size) \ @@ -38,14 +50,22 @@ extern "C" { (dst)[(size)-1] = 0; \ } while (0) +int32_t taosUcs4len(TdUcs4 *ucs4); int64_t taosStr2int64(const char *str); -// USE_LIBICONV -int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs); -bool taosMbsToUcs4(const char *mbs, size_t mbs_len, char *ucs4, int32_t ucs4_max_len, int32_t *len); -int32_t tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int32_t bytes, int8_t ncharSize); +int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs); +bool taosMbsToUcs4(const char *mbs, size_t mbs_len, TdUcs4 *ucs4, int32_t ucs4_max_len, int32_t *len); +int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes); +TdUcs4* tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4); bool taosValidateEncodec(const char *encodec); +int32_t taosWcharWidth(TdWchar wchar); +int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size); +int32_t taosMbToWchar(TdWchar *pWchar, const char *pStr, int32_t size); +int32_t taosMbsToWchars(TdWchar *pWchars, const char *pStrs, int32_t size); +int32_t taosWcharToMb(char *pStr, TdWchar wchar); +int32_t taosWcharsToMbs(char *pStrs, TdWchar *pWchars, int32_t size); + #ifdef __cplusplus } #endif diff --git a/include/util/taoserror.h b/include/util/taoserror.h index fe06a1c4a2b041c08d8c23459d457af66d89dc14..7023691fe06959b51ea534518ab6c98e2334098b 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -482,6 +482,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_PAR_PASSWD_EMPTY TAOS_DEF_ERROR_CODE(0, 0x2611) #define TSDB_CODE_PAR_INVALID_PORT TAOS_DEF_ERROR_CODE(0, 0x2612) #define TSDB_CODE_PAR_INVALID_ENDPOINT TAOS_DEF_ERROR_CODE(0, 0x2613) +#define TSDB_CODE_PAR_EXPRIE_STATEMENT TAOS_DEF_ERROR_CODE(0, 0x2614) #ifdef __cplusplus } diff --git a/include/util/tcompare.h b/include/util/tcompare.h index 4c80eeb4f601034852acebd52b2e18b74c52d424..cc9e8ae4641138be528830e17467dab7897f0166 100644 --- a/include/util/tcompare.h +++ b/include/util/tcompare.h @@ -46,7 +46,7 @@ typedef struct SPatternCompareInfo { int32_t patternMatch(const char *pattern, const char *str, size_t size, const SPatternCompareInfo *pInfo); -int32_t WCSPatternMatch(const wchar_t *pattern, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo); +int32_t WCSPatternMatch(const TdUcs4 *pattern, const TdUcs4 *str, size_t size, const SPatternCompareInfo *pInfo); int32_t taosArrayCompareString(const void *a, const void *b); diff --git a/include/util/tdef.h b/include/util/tdef.h index f6c4ae8d42323a450e5ac5cb720a37503aa2b25d..47fc61947386f5c73b2c80afb999a4d57981a1df 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -41,7 +41,7 @@ extern const int32_t TYPE_BYTES[15]; #define DOUBLE_BYTES sizeof(double) #define POINTER_BYTES sizeof(void *) // 8 by default assert(sizeof(ptrdiff_t) == sizseof(void*) #define TSDB_KEYSIZE sizeof(TSKEY) -#define TSDB_NCHAR_SIZE sizeof(int32_t) +#define TSDB_NCHAR_SIZE sizeof(TdUcs4) // NULL definition #define TSDB_DATA_BOOL_NULL 0x02 diff --git a/include/util/tjson.h b/include/util/tjson.h index 1218caae356f996bf0023681926130e32f914c64..b27f3b93ac5f3f650a3ec829af62d1c08aa2fc00 100644 --- a/include/util/tjson.h +++ b/include/util/tjson.h @@ -44,6 +44,7 @@ int32_t tjsonGetIntValue(const SJson* pJson, const char* pName, int32_t* pVal); int32_t tjsonGetSmallIntValue(const SJson* pJson, const char* pName, int16_t* pVal); int32_t tjsonGetTinyIntValue(const SJson* pJson, const char* pName, int8_t* pVal); int32_t tjsonGetUBigIntValue(const SJson* pJson, const char* pName, uint64_t* pVal); +int32_t tjsonGetUIntValue(const SJson* pJson, const char* pName, uint32_t* pVal); int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pVal); int32_t tjsonGetBoolValue(const SJson* pJson, const char* pName, bool* pVal); int32_t tjsonGetDoubleValue(const SJson* pJson, const char* pName, double* pVal); @@ -60,6 +61,7 @@ int32_t tjsonAddArray(SJson* pJson, const char* pName, FToJson func, const void* typedef int32_t (*FToObject)(const SJson* pJson, void* pObj); int32_t tjsonToObject(const SJson* pJson, const char* pName, FToObject func, void* pObj); +int32_t tjsonMakeObject(const SJson* pJson, const char* pName, FToObject func, void** pObj, int32_t objSize); int32_t tjsonToArray(const SJson* pJson, const char* pName, FToObject func, void* pArray, int32_t itemSize); char* tjsonToString(const SJson* pJson); diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index b672c9bb47fd153718966a05a14ff6b7d9c6ba0e..e341729a8fcf9d5a398d7f59fb913f88e18a1936 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -179,6 +179,7 @@ typedef struct SRequestObj { uint64_t requestId; int32_t type; // request type STscObj* pTscObj; + char* pDb; char* sqlstr; // sql string int32_t sqlLen; int64_t self; @@ -229,7 +230,7 @@ void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest); -int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery); +int32_t parseSql(SRequestObj* pRequest, bool streamQuery, SQuery** pQuery); int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList); // --- heartbeat diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 525c5f9fb88503c9237cf6db24701fcf3ee03a23..2233742625e6e733f184bd2c4e7eac376afd9139 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -150,6 +150,7 @@ void *createRequest(STscObj *pObj, __taos_async_fn_t fp, void *param, int32_t ty return NULL; } + pRequest->pDb = getDbOfConnection(pObj); pRequest->requestId = generateRequestId(); pRequest->metric.start = taosGetTimestampMs(); @@ -180,6 +181,7 @@ static void doDestroyRequest(void *p) { tfree(pRequest->msgBuf); tfree(pRequest->sqlstr); tfree(pRequest->pInfo); + tfree(pRequest->pDb); doFreeReqResultInfo(&pRequest->body.resInfo); qDestroyQueryPlan(pRequest->body.pDag); diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index fc97f4113ceca0a31287e86ad0a131de170c9bfb..aa94ed42fd1838ce34200d9195d8e9cdb0d48c7c 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -137,13 +137,14 @@ int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj* return TSDB_CODE_SUCCESS; } -int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery) { +int32_t parseSql(SRequestObj* pRequest, bool streamQuery, SQuery** pQuery) { STscObj* pTscObj = pRequest->pTscObj; SParseContext cxt = { .requestId = pRequest->requestId, .acctId = pTscObj->acctId, - .db = getDbOfConnection(pTscObj), + .db = pRequest->pDb, + .streamQuery = streamQuery, .pSql = pRequest->sqlstr, .sqlLen = pRequest->sqlLen, .pMsg = pRequest->msgBuf, @@ -154,7 +155,6 @@ int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery) { cxt.mgmtEpSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp); int32_t code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &cxt.pCatalog); if (code != TSDB_CODE_SUCCESS) { - tfree(cxt.db); return code; } @@ -163,7 +163,6 @@ int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery) { setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols); } - tfree(cxt.db); return code; } @@ -249,7 +248,7 @@ TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) { terrno = TSDB_CODE_SUCCESS; CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return); - CHECK_CODE_GOTO(parseSql(pRequest, &pQuery), _return); + CHECK_CODE_GOTO(parseSql(pRequest, false, &pQuery), _return); if (pQuery->directRpc) { CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return); diff --git a/source/client/src/tmq.c b/source/client/src/tmq.c index ee13527b968c5d648cbe83e4f57b7e72c71d7eed..2aebd67c56c53d98bffe515313a5567840ee2d7e 100644 --- a/source/client/src/tmq.c +++ b/source/client/src/tmq.c @@ -482,38 +482,24 @@ TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, i } tscDebug("start to create topic, %s", topicName); -#if 0 - CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return); - CHECK_CODE_GOTO(parseSql(pRequest, &pQueryNode), _return); - pQueryNode->streamQuery = true; + CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return); + CHECK_CODE_GOTO(parseSql(pRequest, true, &pQueryNode), _return); // todo check for invalid sql statement and return with error code - SSchema* schema = NULL; - int32_t numOfCols = 0; - CHECK_CODE_GOTO(getPlan(pRequest, pQueryNode, &pRequest->body.pDag, NULL), _return); - - pStr = qQueryPlanToString(pRequest->body.pDag); - if (pStr == NULL) { - goto _return; - } + CHECK_CODE_GOTO(nodesNodeToString(pQueryNode->pRoot, false, &pStr, NULL), _return); /*printf("%s\n", pStr);*/ - // The topic should be related to a database that the queried table is belonged to. - SName name = {0}; - char dbName[TSDB_DB_FNAME_LEN] = {0}; - // tNameGetFullDbName(&((SQueryStmtInfo*)pQueryNode)->pTableMetaInfo[0]->name, dbName); - - tNameFromString(&name, dbName, T_NAME_ACCT | T_NAME_DB); - tNameFromString(&name, topicName, T_NAME_TABLE); + SName name = { .acctId = pTscObj->acctId, .type = TSDB_TABLE_NAME_T }; + strcpy(name.dbname, pRequest->pDb); + strcpy(name.tname, topicName); SCMCreateTopicReq req = { .igExists = 1, - .physicalPlan = (char*)pStr, + .ast = (char*)pStr, .sql = (char*)sql, - .logicalPlan = (char*)"no logic plan", }; tNameExtractFullName(&name, req.name); @@ -536,7 +522,7 @@ TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, i asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo); tsem_wait(&pRequest->body.rspSem); -#endif + _return: qDestroyQuery(pQueryNode); /*if (sendInfo != NULL) {*/ diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 4b649d5f62e7139929d5aac87e20b3f0914d290f..31328cc4b2b6dea97bf7661ce3aeb7e80fa3ca1f 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1072,6 +1072,10 @@ void blockDataClearup(SSDataBlock* pDataBlock) { } int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows) { + if (0 == numOfRows) { + return TSDB_CODE_SUCCESS; + } + if (IS_VAR_DATA_TYPE(pColumn->info.type)) { char* tmp = realloc(pColumn->varmeta.offset, sizeof(int32_t) * numOfRows); if (tmp == NULL) { @@ -1092,7 +1096,7 @@ int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRo pColumn->nullbitmap = tmp; memset(pColumn->nullbitmap, 0, BitmapLen(numOfRows)); - + assert(pColumn->info.bytes); tmp = realloc(pColumn->pData, numOfRows * pColumn->info.bytes); if (tmp == NULL) { return TSDB_CODE_OUT_OF_MEMORY; @@ -1137,7 +1141,7 @@ void* blockDataDestroy(SSDataBlock* pBlock) { taosArrayDestroy(pBlock->pDataBlock); tfree(pBlock->pBlockAgg); - tfree(pBlock); + // tfree(pBlock); return NULL; } @@ -1190,7 +1194,7 @@ int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) { } int32_t len = colDataGetLength(pColData, rows); - taosEncodeFixedI32(buf, len); + tlen += taosEncodeFixedI32(buf, len); tlen += taosEncodeBinary(buf, pColData->pData, len); } diff --git a/source/common/src/tvariant.c b/source/common/src/tvariant.c index af6152d3f437ba673d9f7969101c6631ffa4eb7c..c6aa1cb81d7a7fe1c48f90f37218a14e63f7cf07 100644 --- a/source/common/src/tvariant.c +++ b/source/common/src/tvariant.c @@ -199,8 +199,8 @@ void taosVariantCreateFromBinary(SVariant *pVar, const char *pz, size_t len, uin case TSDB_DATA_TYPE_NCHAR: { // here we get the nchar length from raw binary bits length size_t lenInwchar = len / TSDB_NCHAR_SIZE; - pVar->wpz = calloc(1, (lenInwchar + 1) * TSDB_NCHAR_SIZE); - memcpy(pVar->wpz, pz, lenInwchar * TSDB_NCHAR_SIZE); + pVar->ucs4 = calloc(1, (lenInwchar + 1) * TSDB_NCHAR_SIZE); + memcpy(pVar->ucs4, pz, lenInwchar * TSDB_NCHAR_SIZE); pVar->nLen = (int32_t)len; break; @@ -343,7 +343,7 @@ int32_t taosVariantToString(SVariant *pVar, char *dst) { case TSDB_DATA_TYPE_NCHAR: { dst[0] = '\''; - taosUcs4ToMbs(pVar->wpz, (twcslen(pVar->wpz) + 1) * TSDB_NCHAR_SIZE, dst + 1); + taosUcs4ToMbs(pVar->ucs4, (taosUcs4len(pVar->ucs4) + 1) * TSDB_NCHAR_SIZE, dst + 1); int32_t len = (int32_t)strlen(dst); dst[len] = '\''; dst[len + 1] = 0; @@ -384,7 +384,7 @@ static FORCE_INLINE int32_t convertToBoolImpl(char *pStr, int32_t len) { } } -static FORCE_INLINE int32_t wcsconvertToBoolImpl(wchar_t *pstr, int32_t len) { +static FORCE_INLINE int32_t wcsconvertToBoolImpl(TdUcs4 *pstr, int32_t len) { if ((wcsncasecmp(pstr, L"true", len) == 0) && (len == 4)) { return TSDB_TRUE; } else if (wcsncasecmp(pstr, L"false", len) == 0 && (len == 5)) { @@ -412,11 +412,11 @@ static int32_t toBinary(SVariant *pVariant, char **pDest, int32_t *pDestSize) { pBuf = realloc(pBuf, newSize + 1); } - taosUcs4ToMbs(pVariant->wpz, (int32_t)newSize, pBuf); - free(pVariant->wpz); + taosUcs4ToMbs(pVariant->ucs4, (int32_t)newSize, pBuf); + free(pVariant->ucs4); pBuf[newSize] = 0; } else { - taosUcs4ToMbs(pVariant->wpz, (int32_t)newSize, *pDest); + taosUcs4ToMbs(pVariant->ucs4, (int32_t)newSize, *pDest); } } else { @@ -460,8 +460,8 @@ static int32_t toNchar(SVariant *pVariant, char **pDest, int32_t *pDestSize) { } if (*pDest == pVariant->pz) { - wchar_t *pWStr = calloc(1, (nLen + 1) * TSDB_NCHAR_SIZE); - bool ret = taosMbsToUcs4(pDst, nLen, (char *)pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL); + TdUcs4 *pWStr = calloc(1, (nLen + 1) * TSDB_NCHAR_SIZE); + bool ret = taosMbsToUcs4(pDst, nLen, pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL); if (!ret) { tfree(pWStr); return -1; @@ -469,21 +469,21 @@ static int32_t toNchar(SVariant *pVariant, char **pDest, int32_t *pDestSize) { // free the binary buffer in the first place if (pVariant->nType == TSDB_DATA_TYPE_BINARY) { - free(pVariant->wpz); + free(pVariant->ucs4); } - pVariant->wpz = pWStr; - *pDestSize = twcslen(pVariant->wpz); + pVariant->ucs4 = pWStr; + *pDestSize = taosUcs4len(pVariant->ucs4); // shrink the allocate memory, no need to check here. - char *tmp = realloc(pVariant->wpz, (*pDestSize + 1) * TSDB_NCHAR_SIZE); + char *tmp = realloc(pVariant->ucs4, (*pDestSize + 1) * TSDB_NCHAR_SIZE); assert(tmp != NULL); - pVariant->wpz = (wchar_t *)tmp; + pVariant->ucs4 = (TdUcs4 *)tmp; } else { int32_t output = 0; - bool ret = taosMbsToUcs4(pDst, nLen, *pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output); + bool ret = taosMbsToUcs4(pDst, nLen, (TdUcs4*)*pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output); if (!ret) { return -1; } @@ -554,7 +554,7 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result *result = res; } else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) { errno = 0; - wchar_t *endPtr = NULL; + TdUcs4 *endPtr = NULL; SToken token = {0}; token.n = tGetToken(pVariant->pz, &token.type); @@ -564,7 +564,7 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result } if (token.type == TK_FLOAT) { - double v = wcstod(pVariant->wpz, &endPtr); + double v = wcstod(pVariant->ucs4, &endPtr); if (releaseVariantPtr) { free(pVariant->pz); pVariant->nLen = 0; @@ -583,7 +583,7 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result setNull((char *)result, type, tDataTypes[type].bytes); return 0; } else { - int64_t val = wcstoll(pVariant->wpz, &endPtr, 10); + int64_t val = wcstoll(pVariant->ucs4, &endPtr, 10); if (releaseVariantPtr) { free(pVariant->pz); pVariant->nLen = 0; @@ -649,7 +649,7 @@ static int32_t convertToBool(SVariant *pVariant, int64_t *pDest) { *pDest = ret; } else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) { int32_t ret = 0; - if ((ret = wcsconvertToBoolImpl(pVariant->wpz, pVariant->nLen)) < 0) { + if ((ret = wcsconvertToBoolImpl(pVariant->ucs4, pVariant->nLen)) < 0) { return ret; } *pDest = ret; @@ -899,7 +899,7 @@ int32_t tVariantDumpEx(SVariant *pVariant, char *payload, int16_t type, bool inc return -1; } } else { - wcsncpy((wchar_t *)payload, pVariant->wpz, pVariant->nLen); + tasoUcs4Copy((TdUcs4*)payload, pVariant->ucs4, pVariant->nLen); } } } else { @@ -913,7 +913,7 @@ int32_t tVariantDumpEx(SVariant *pVariant, char *payload, int16_t type, bool inc return -1; } } else { - memcpy(p, pVariant->wpz, pVariant->nLen); + memcpy(p, pVariant->ucs4, pVariant->nLen); newlen = pVariant->nLen; } @@ -979,7 +979,7 @@ int32_t taosVariantTypeSetType(SVariant *pVariant, char type) { pVariant->d = v; } else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) { errno = 0; - double v = wcstod(pVariant->wpz, NULL); + double v = wcstod(pVariant->ucs4, NULL); if ((errno == ERANGE && v == -1) || (isinf(v) || isnan(v))) { free(pVariant->pz); return -1; diff --git a/source/dnode/vnode/src/inc/tsdbDBDef.h b/source/dnode/vnode/src/inc/tsdbDBDef.h index 2e37b0ba45132a92e4de5b7e0a21e680564256bc..ca9b60049eeda2c6788e2675e9d6f2d69d2cf939 100644 --- a/source/dnode/vnode/src/inc/tsdbDBDef.h +++ b/source/dnode/vnode/src/inc/tsdbDBDef.h @@ -26,8 +26,9 @@ typedef struct SDBFile SDBFile; typedef DB_ENV* TDBEnv; struct SDBFile { - DB* pDB; - char* path; + int32_t fid; + DB* pDB; + char* path; }; int32_t tsdbOpenDBF(TDBEnv pEnv, SDBFile* pDBF); diff --git a/source/dnode/vnode/src/meta/metaBDBImpl.c b/source/dnode/vnode/src/meta/metaBDBImpl.c index df2d9604d28dfff0a86ff330196a7a4ae1d12197..99a2b272ed36313dfb3c940d08e35a834b3914bc 100644 --- a/source/dnode/vnode/src/meta/metaBDBImpl.c +++ b/source/dnode/vnode/src/meta/metaBDBImpl.c @@ -884,7 +884,7 @@ const char *metaSmaCursorNext(SMSmaCursor *pCur) { STSmaWrapper *metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid) { STSmaWrapper *pSW = NULL; - pSW = calloc(sizeof(*pSW), 1); + pSW = calloc(1, sizeof(*pSW)); if (pSW == NULL) { return NULL; } diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index a2342ec85aa066fab1bcbd2f7e93953151711508..0c4b933c198bf47aa9e8590afb186d66b28c2fc8 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include "tdatablock.h" #include "vnode.h" STqReadHandle* tqInitSubmitMsgScanner(SMeta* pMeta) { @@ -128,10 +129,13 @@ SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) { int j = 0; for (int32_t i = 0; i < colNumNeed; i++) { - int32_t colId = *(int32_t*)taosArrayGet(pHandle->pColIdList, i); + int16_t colId = *(int16_t*)taosArrayGet(pHandle->pColIdList, i); while (j < pSchemaWrapper->nCols && pSchemaWrapper->pSchema[j].colId < colId) { j++; } + if (j >= pSchemaWrapper->nCols) { + continue; + } SSchema* pColSchema = &pSchemaWrapper->pSchema[j]; SColumnInfoData colInfo = {0}; int sz = numOfRows * pColSchema->bytes; @@ -145,6 +149,8 @@ SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) { taosArrayDestroy(pArray); return NULL; } + + blockDataEnsureColumnCapacity(&colInfo, numOfRows); taosArrayPush(pArray, &colInfo); } diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 97c52f44ebbbb56181717ab4a308d0efda9ed8f9..6b2857c4110cb6121a7be585dd383873a300cc54 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -3386,7 +3386,7 @@ void filterPrepare(void* expr, void* param) { if (size < (uint32_t)pSchema->bytes) { size = pSchema->bytes; } - // to make sure tonchar does not cause invalid write, since the '\0' needs at least sizeof(wchar_t) space. + // to make sure tonchar does not cause invalid write, since the '\0' needs at least sizeof(TdUcs4) space. pInfo->q = calloc(1, size + TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE); tVariantDump(pCond, pInfo->q, pSchema->type, true); } diff --git a/source/dnode/vnode/src/tsdb/tsdbSma.c b/source/dnode/vnode/src/tsdb/tsdbSma.c index f3135c690e9815e18596ccb906bcee24973bcf3a..02a0b587d5793d64444fe70d6662019ce75dc07f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSma.c +++ b/source/dnode/vnode/src/tsdb/tsdbSma.c @@ -156,10 +156,6 @@ static int32_t tsdbInitSmaEnv(STsdb *pTsdb, const char *path, SSmaEnv **pEnv) { return TSDB_CODE_FAILED; } - if (*pEnv) { - return TSDB_CODE_SUCCESS; - } - if (*pEnv == NULL) { if ((*pEnv = tsdbNewSmaEnv(pTsdb, path)) == NULL) { return TSDB_CODE_FAILED; @@ -213,11 +209,14 @@ static int32_t tsdbInitSmaStat(SSmaStat **pSmaStat) { return TSDB_CODE_SUCCESS; } - // TODO: lock. lazy mode when update expired window, or hungry mode during tsdbNew. + /** + * 1. Lazy mode utilized when init SSmaStat to update expired window(or hungry mode when tsdbNew). + * 2. Currently, there is mutex lock when init SSmaEnv, thus no need add lock on SSmaStat, and please add lock if + * tsdbInitSmaStat invoked in other multithread environment later. + */ if (*pSmaStat == NULL) { *pSmaStat = (SSmaStat *)calloc(1, sizeof(SSmaStat)); if (*pSmaStat == NULL) { - // TODO: unlock terrno = TSDB_CODE_OUT_OF_MEMORY; return TSDB_CODE_FAILED; } @@ -227,11 +226,9 @@ static int32_t tsdbInitSmaStat(SSmaStat **pSmaStat) { if ((*pSmaStat)->smaStatItems == NULL) { tfree(*pSmaStat); - // TODO: unlock return TSDB_CODE_FAILED; } } - // TODO: unlock return TSDB_CODE_SUCCESS; } @@ -259,10 +256,15 @@ static SSmaStatItem *tsdbNewSmaStatItem(int8_t state) { int32_t tsdbDestroySmaState(SSmaStat *pSmaStat) { if (pSmaStat) { // TODO: use taosHashSetFreeFp when taosHashSetFreeFp is ready. - SSmaStatItem *item = taosHashIterate(pSmaStat->smaStatItems, NULL); + void *item = taosHashIterate(pSmaStat->smaStatItems, NULL); while (item != NULL) { - tfree(item->pSma); - taosHashCleanup(item->expiredWindows); + SSmaStatItem *pItem = *(SSmaStatItem **)item; + if (pItem != NULL) { + tdDestroyTSma(pItem->pSma); + tfree(pItem->pSma); + taosHashCleanup(pItem->expiredWindows); + tfree(pItem); + } item = taosHashIterate(pSmaStat->smaStatItems, item); } taosHashCleanup(pSmaStat->smaStatItems); @@ -270,15 +272,17 @@ int32_t tsdbDestroySmaState(SSmaStat *pSmaStat) { } static int32_t tsdbCheckAndInitSmaEnv(STsdb *pTsdb, int8_t smaType) { + SSmaEnv *pEnv = NULL; + // return if already init switch (smaType) { case TSDB_SMA_TYPE_TIME_RANGE: - if (pTsdb->pTSmaEnv) { + if ((pEnv = (SSmaEnv *)atomic_load_ptr(&pTsdb->pTSmaEnv)) != NULL) { return TSDB_CODE_SUCCESS; } break; case TSDB_SMA_TYPE_ROLLUP: - if (pTsdb->pRSmaEnv) { + if ((pEnv = (SSmaEnv *)atomic_load_ptr(&pTsdb->pRSmaEnv)) != NULL) { return TSDB_CODE_SUCCESS; } break; @@ -289,9 +293,10 @@ static int32_t tsdbCheckAndInitSmaEnv(STsdb *pTsdb, int8_t smaType) { // init sma env tsdbLockRepo(pTsdb); - if (pTsdb->pTSmaEnv == NULL) { + pEnv = (smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_load_ptr(&pTsdb->pTSmaEnv) : atomic_load_ptr(&pTsdb->pRSmaEnv); + if (pEnv == NULL) { char rname[TSDB_FILENAME_LEN] = {0}; - char aname[TSDB_FILENAME_LEN * 2 + 32] = {0}; // TODO: make TMPNAME_LEN public as TSDB_FILENAME_LEN? + char aname[TSDB_FILENAME_LEN] = {0}; // use TSDB_FILENAME_LEN currently SDiskID did = {0}; tfsAllocDisk(pTsdb->pTfs, TFS_PRIMARY_LEVEL, &did); @@ -307,17 +312,13 @@ static int32_t tsdbCheckAndInitSmaEnv(STsdb *pTsdb, int8_t smaType) { return TSDB_CODE_FAILED; } - SSmaEnv *pEnv = NULL; if (tsdbInitSmaEnv(pTsdb, aname, &pEnv) != TSDB_CODE_SUCCESS) { tsdbUnlockRepo(pTsdb); return TSDB_CODE_FAILED; } - if (smaType == TSDB_SMA_TYPE_TIME_RANGE) { - pTsdb->pTSmaEnv = pEnv; - } else { - pTsdb->pRSmaEnv = pEnv; - } + (smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_store_ptr(&pTsdb->pTSmaEnv, pEnv) + : atomic_store_ptr(&pTsdb->pRSmaEnv, pEnv); } tsdbUnlockRepo(pTsdb); @@ -357,8 +358,10 @@ int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, ETsdbSmaType smaType, char *msg) { SSmaStat *pStat = SMA_ENV_STAT(pEnv); SHashObj *pItemsHash = SMA_ENV_STAT_ITEMS(pEnv); + TASSERT(pEnv != NULL && pStat != NULL && pItemsHash != NULL); + tsdbRefSmaStat(pTsdb, pStat); - SSmaStatItem *pItem = (SSmaStatItem *)taosHashGet(pItemsHash, &indexUid, sizeof(indexUid)); + SSmaStatItem *pItem = taosHashGet(pItemsHash, &indexUid, sizeof(indexUid)); if (pItem == NULL) { pItem = tsdbNewSmaStatItem(TSDB_SMA_STAT_EXPIRED); // TODO use the real state if (pItem == NULL) { @@ -419,9 +422,9 @@ static int32_t tsdbResetExpiredWindow(STsdb *pTsdb, SSmaStat *pStat, int64_t ind tsdbRefSmaStat(pTsdb, pStat); if (pStat && pStat->smaStatItems) { - pItem = *(SSmaStatItem **)taosHashGet(pStat->smaStatItems, &indexUid, sizeof(indexUid)); + pItem = taosHashGet(pStat->smaStatItems, &indexUid, sizeof(indexUid)); } - if (pItem != NULL) { + if ((pItem != NULL) && ((pItem = *(SSmaStatItem **)pItem) != NULL)) { // pItem resides in hash buffer all the time unless drop sma index // TODO: multithread protect if (taosHashRemove(pItem->expiredWindows, &skey, sizeof(TSKEY)) != 0) { @@ -492,7 +495,7 @@ static int32_t tsdbGetSmaStorageLevel(int64_t interval, int8_t intervalUnit) { * @brief Insert TSma data blocks to DB File build by B+Tree * * @param pSmaH - * @param smaKey + * @param smaKey tableUid-colId-skeyOfWindow(8-2-8) * @param keyLen * @param pData * @param dataLen @@ -500,12 +503,11 @@ static int32_t tsdbGetSmaStorageLevel(int64_t interval, int8_t intervalUnit) { */ static int32_t tsdbInsertTSmaBlocks(STSmaWriteH *pSmaH, void *smaKey, uint32_t keyLen, void *pData, uint32_t dataLen) { SDBFile *pDBFile = &pSmaH->dFile; - - // TODO: insert sma data blocks into B+Tree tsdbDebug("vgId:%d insert sma data blocks into %s: smaKey %" PRIx64 "-%" PRIu16 "-%" PRIx64 ", dataLen %d", REPO_ID(pSmaH->pTsdb), pDBFile->path, *(tb_uid_t *)smaKey, *(uint16_t *)POINTER_SHIFT(smaKey, 8), *(int64_t *)POINTER_SHIFT(smaKey, 10), dataLen); + // TODO: insert sma data blocks into B+Tree(TDB) if (tsdbSaveSmaToDB(pDBFile, smaKey, keyLen, pData, dataLen) != 0) { return TSDB_CODE_FAILED; } @@ -562,34 +564,34 @@ static int64_t tsdbGetIntervalByPrecision(int64_t interval, uint8_t intervalUnit return interval / 1e3; } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // nano second return interval / 1e6; - } else { + } else { // ms return interval; } break; case TSDB_TIME_PRECISION_MICRO: if (TIME_UNIT_MICROSECOND == intervalUnit) { // us return interval; - } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // nano second + } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // ns return interval / 1e3; - } else { + } else { // ms return interval * 1e3; } break; case TSDB_TIME_PRECISION_NANO: - if (TIME_UNIT_MICROSECOND == intervalUnit) { + if (TIME_UNIT_MICROSECOND == intervalUnit) { // us return interval * 1e3; - } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // nano second + } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // ns return interval; - } else { + } else { // ms return interval * 1e6; } break; default: // ms if (TIME_UNIT_MICROSECOND == intervalUnit) { // us return interval / 1e3; - } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // nano second + } else if (TIME_UNIT_NANOSECOND == intervalUnit) { // ns return interval / 1e6; - } else { + } else { // ms return interval; } break; @@ -661,9 +663,13 @@ static void tsdbDestroyTSmaWriteH(STSmaWriteH *pSmaH) { static int32_t tsdbSetTSmaDataFile(STSmaWriteH *pSmaH, STSmaDataWrapper *pData, int32_t storageLevel, int32_t fid) { STsdb *pTsdb = pSmaH->pTsdb; ASSERT(pSmaH->dFile.path == NULL && pSmaH->dFile.pDB == NULL); + + pSmaH->dFile.fid = fid; + char tSmaFile[TSDB_FILENAME_LEN] = {0}; snprintf(tSmaFile, TSDB_FILENAME_LEN, "v%df%d.tsma", REPO_ID(pTsdb), fid); pSmaH->dFile.path = strdup(tSmaFile); + return TSDB_CODE_SUCCESS; } @@ -703,7 +709,7 @@ static int32_t tsdbInsertTSmaDataImpl(STsdb *pTsdb, char *msg) { STsdbCfg * pCfg = REPO_CFG(pTsdb); STSmaDataWrapper *pData = (STSmaDataWrapper *)msg; - if (!pTsdb->pTSmaEnv) { + if (!atomic_load_ptr(&pTsdb->pTSmaEnv)) { terrno = TSDB_CODE_INVALID_PTR; tsdbWarn("vgId:%d insert tSma data failed since pTSmaEnv is NULL", REPO_ID(pTsdb)); return terrno; @@ -881,15 +887,15 @@ static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, TSKEY *queryKey) { static int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSmaDataWrapper *pData, int64_t indexUid, int64_t interval, int8_t intervalUnit, tb_uid_t tableUid, col_id_t colId, TSKEY querySKey, int32_t nMaxResult) { - if (!pTsdb->pTSmaEnv) { + if (!atomic_load_ptr(&pTsdb->pTSmaEnv)) { terrno = TSDB_CODE_INVALID_PTR; tsdbWarn("vgId:%d getTSmaDataImpl failed since pTSmaEnv is NULL", REPO_ID(pTsdb)); return TSDB_CODE_FAILED; } tsdbRefSmaStat(pTsdb, SMA_ENV_STAT(pTsdb->pTSmaEnv)); - SSmaStatItem *pItem = *(SSmaStatItem **)taosHashGet(SMA_ENV_STAT_ITEMS(pTsdb->pTSmaEnv), &indexUid, sizeof(indexUid)); - if (pItem == NULL) { + SSmaStatItem *pItem = taosHashGet(SMA_ENV_STAT_ITEMS(pTsdb->pTSmaEnv), &indexUid, sizeof(indexUid)); + if ((pItem == NULL) || ((pItem = *(SSmaStatItem **)pItem) == NULL)) { // Normally pItem should not be NULL, mark all windows as expired and notify query module to fetch raw TS data if // it's NULL. tsdbUnRefSmaStat(pTsdb, SMA_ENV_STAT(pTsdb->pTSmaEnv)); diff --git a/source/dnode/vnode/src/vnd/vnodeWrite.c b/source/dnode/vnode/src/vnd/vnodeWrite.c index 218b53c2abe42a8d0f197fc11db395339d68f9a5..8285020e14a336c08d51287b544d2714e0029b18 100644 --- a/source/dnode/vnode/src/vnd/vnodeWrite.c +++ b/source/dnode/vnode/src/vnd/vnodeWrite.c @@ -144,6 +144,9 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { return -1; } + // record current timezone of server side + tstrncpy(vCreateSmaReq.tSma.timezone, tsTimezone, TD_TIMEZONE_LEN); + if (metaCreateTSma(pVnode->pMeta, &vCreateSmaReq) < 0) { // TODO: handle error tdDestroyTSma(&vCreateSmaReq.tSma); diff --git a/source/dnode/vnode/test/tsdbSmaTest.cpp b/source/dnode/vnode/test/tsdbSmaTest.cpp index 86958da406ebb32eb57fe86d1ad76ef84a889168..5a87c180b67ec371a30c969bd0931fdc166b6a44 100644 --- a/source/dnode/vnode/test/tsdbSmaTest.cpp +++ b/source/dnode/vnode/test/tsdbSmaTest.cpp @@ -49,7 +49,7 @@ TEST(testCase, tSma_Meta_Encode_Decode_Test) { STSmaWrapper tSmaWrapper = {.number = 1, .tSma = &tSma}; uint32_t bufLen = tEncodeTSmaWrapper(NULL, &tSmaWrapper); - void *buf = calloc(bufLen, 1); + void *buf = calloc(1, bufLen); ASSERT_NE(buf, nullptr); STSmaWrapper *pSW = (STSmaWrapper *)buf; @@ -84,6 +84,7 @@ TEST(testCase, tSma_Meta_Encode_Decode_Test) { } // resource release + tfree(pSW); tdDestroyTSma(&tSma); tdDestroyTSmaWrapper(&dstTSmaWrapper); } @@ -113,7 +114,7 @@ TEST(testCase, tSma_metaDB_Put_Get_Del_Test) { tSma.tableUid = tbUid; tSma.exprLen = strlen(expr); - tSma.expr = (char *)calloc(tSma.exprLen + 1, 1); + tSma.expr = (char *)calloc(1, tSma.exprLen + 1); ASSERT_NE(tSma.expr, nullptr); tstrncpy(tSma.expr, expr, tSma.exprLen + 1); @@ -251,12 +252,12 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { tSma.tableUid = tbUid; tSma.exprLen = strlen(expr); - tSma.expr = (char *)calloc(tSma.exprLen + 1, 1); + tSma.expr = (char *)calloc(1, tSma.exprLen + 1); ASSERT_NE(tSma.expr, nullptr); tstrncpy(tSma.expr, expr, tSma.exprLen + 1); tSma.tagsFilterLen = strlen(tagsFilter); - tSma.tagsFilter = (char *)calloc(tSma.tagsFilterLen + 1, 1); + tSma.tagsFilter = (char *)calloc(1, tSma.tagsFilterLen + 1); ASSERT_NE(tSma.tagsFilter, nullptr); tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1); @@ -273,20 +274,20 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { // step 2: insert data STSmaDataWrapper *pSmaData = NULL; - STsdb tsdb = {0}; - STsdbCfg * pCfg = &tsdb.config; - - tsdb.pMeta = pMeta; - tsdb.vgId = 2; - tsdb.config.daysPerFile = 10; // default days is 10 - tsdb.config.keep1 = 30; - tsdb.config.keep2 = 90; - tsdb.config.keep = 365; - tsdb.config.precision = TSDB_TIME_PRECISION_MILLI; - tsdb.config.update = TD_ROW_OVERWRITE_UPDATE; - tsdb.config.compression = TWO_STAGE_COMP; - - switch (tsdb.config.precision) { + STsdb * pTsdb = (STsdb *)calloc(1, sizeof(STsdb)); + STsdbCfg * pCfg = &pTsdb->config; + + pTsdb->pMeta = pMeta; + pTsdb->vgId = 2; + pTsdb->config.daysPerFile = 10; // default days is 10 + pTsdb->config.keep1 = 30; + pTsdb->config.keep2 = 90; + pTsdb->config.keep = 365; + pTsdb->config.precision = TSDB_TIME_PRECISION_MILLI; + pTsdb->config.update = TD_ROW_OVERWRITE_UPDATE; + pTsdb->config.compression = TWO_STAGE_COMP; + + switch (pTsdb->config.precision) { case TSDB_TIME_PRECISION_MILLI: skey1 *= 1e3; break; @@ -304,12 +305,12 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { SDiskCfg pDisks = {.level = 0, .primary = 1}; strncpy(pDisks.dir, "/var/lib/taos", TSDB_FILENAME_LEN); int32_t numOfDisks = 1; - tsdb.pTfs = tfsOpen(&pDisks, numOfDisks); - ASSERT_NE(tsdb.pTfs, nullptr); + pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks); + ASSERT_NE(pTsdb->pTfs, nullptr); char *msg = (char *)calloc(1, 100); ASSERT_NE(msg, nullptr); - ASSERT_EQ(tsdbUpdateSmaWindow(&tsdb, TSDB_SMA_TYPE_TIME_RANGE, msg), 0); + ASSERT_EQ(tsdbUpdateSmaWindow(pTsdb, TSDB_SMA_TYPE_TIME_RANGE, msg), 0); // init int32_t allocCnt = 0; @@ -367,13 +368,13 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { ASSERT_GE(bufSize, pSmaData->dataLen); // execute - ASSERT_EQ(tsdbInsertTSmaData(&tsdb, (char *)pSmaData), TSDB_CODE_SUCCESS); + ASSERT_EQ(tsdbInsertTSmaData(pTsdb, (char *)pSmaData), TSDB_CODE_SUCCESS); // step 3: query uint32_t checkDataCnt = 0; for (int32_t t = 0; t < numOfTables; ++t) { for (col_id_t c = 0; c < numOfCols; ++c) { - ASSERT_EQ(tsdbGetTSmaData(&tsdb, NULL, indexUid1, interval1, intervalUnit1, tbUid + t, + ASSERT_EQ(tsdbGetTSmaData(pTsdb, NULL, indexUid1, interval1, intervalUnit1, tbUid + t, c + PRIMARYKEY_TIMESTAMP_COL_ID, skey1, 1), TSDB_CODE_SUCCESS); ++checkDataCnt; @@ -383,9 +384,12 @@ TEST(testCase, tSma_Data_Insert_Query_Test) { printf("%s:%d The sma data check count for insert and query is %" PRIu32 "\n", __FILE__, __LINE__, checkDataCnt); // release data + tfree(msg); taosTZfree(buf); // release meta tdDestroyTSma(&tSma); + tfsClose(pTsdb->pTfs); + tsdbClose(pTsdb); metaClose(pMeta); } #endif diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index 80a0b3554cf23434f4624f995d8bdf0c37a8ced1..08e0ac55d7ecbf1267d9962242c5c8acf59c2539 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -2349,6 +2349,9 @@ _return: CTG_API_LEAVE(code); } +int32_t catalogUpdateVgEpSet(SCatalog* pCtg, const char* dbFName, int32_t vgId, SEpSet *epSet) { + +} int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) { CTG_API_ENTER(); @@ -2394,6 +2397,9 @@ _return: CTG_API_LEAVE(code); } +int32_t catalogGetIndexMeta(SCatalog* pCtg, void *pTrans, const SEpSet* pMgmtEps, const SName* pTableName, const char *pIndexName, SIndexMeta** pIndexMeta) { + +} int32_t catalogGetTableMeta(SCatalog* pCtg, void *pTrans, const SEpSet* pMgmtEps, const SName* pTableName, STableMeta** pTableMeta) { CTG_API_ENTER(); @@ -2662,12 +2668,15 @@ _return: int32_t catalogGetQnodeList(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, SArray* pQnodeList) { CTG_API_ENTER(); - + + int32_t code = 0; if (NULL == pCtg || NULL == pRpc || NULL == pMgmtEps || NULL == pQnodeList) { CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT); } - //TODO + CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pRpc, pMgmtEps, &pQnodeList)); + +_return: CTG_API_LEAVE(TSDB_CODE_SUCCESS); } diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index 34c211561bd3840caa612e6a3fe074138f1545cc..d66203eb40c6ea7ac6fe0de6f3df116d4c620a4f 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -190,7 +190,6 @@ static SNode* fillNodeCopy(const SFillNode* pSrc, SFillNode* pDst) { } static SNode* logicNodeCopy(const SLogicNode* pSrc, SLogicNode* pDst) { - COPY_SCALAR_FIELD(id); CLONE_NODE_LIST_FIELD(pTargets); CLONE_NODE_FIELD(pConditions); CLONE_NODE_LIST_FIELD(pChildren); @@ -198,7 +197,7 @@ static SNode* logicNodeCopy(const SLogicNode* pSrc, SLogicNode* pDst) { } static STableMeta* tableMetaClone(const STableMeta* pSrc) { - int32_t len = sizeof(STableMeta) + (pSrc->tableInfo.numOfTags + pSrc->tableInfo.numOfColumns) * sizeof(SSchema); + int32_t len = TABLE_META_SIZE(pSrc); STableMeta* pDst = malloc(len); if (NULL == pDst) { return NULL; @@ -208,7 +207,7 @@ static STableMeta* tableMetaClone(const STableMeta* pSrc) { } static SVgroupsInfo* vgroupsInfoClone(const SVgroupsInfo* pSrc) { - int32_t len = sizeof(SVgroupsInfo) + pSrc->numOfVgroups * sizeof(SVgroupInfo); + int32_t len = VGROUPS_INFO_SIZE(pSrc); SVgroupsInfo* pDst = malloc(len); if (NULL == pDst) { return NULL; diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index a2fd32d23899e56ae2992fa1263a11023e404af5..c61a2d71fb21db461eaa38c17d0b1c9414fcb482 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -193,7 +193,17 @@ static int32_t tableMetaToJson(const void* pObj, SJson* pJson) { return code; } -static const char* jkLogicPlanId = "Id"; +static int32_t jsonToTableMeta(const SJson* pJson, void* pObj) { + STableMeta* pNode = (STableMeta*)pObj; + + int32_t code = tjsonGetUBigIntValue(pJson, jkTableMetaUid, &pNode->uid); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetUBigIntValue(pJson, jkTableMetaSuid, &pNode->suid); + } + + return code; +} + static const char* jkLogicPlanTargets = "Targets"; static const char* jkLogicPlanConditions = "Conditions"; static const char* jkLogicPlanChildren = "Children"; @@ -201,10 +211,7 @@ static const char* jkLogicPlanChildren = "Children"; static int32_t logicPlanNodeToJson(const void* pObj, SJson* pJson) { const SLogicNode* pNode = (const SLogicNode*)pObj; - int32_t code = tjsonAddIntegerToObject(pJson, jkLogicPlanId, pNode->id); - if (TSDB_CODE_SUCCESS == code) { - code = nodeListToJson(pJson, jkLogicPlanTargets, pNode->pTargets); - } + int32_t code = nodeListToJson(pJson, jkLogicPlanTargets, pNode->pTargets); if (TSDB_CODE_SUCCESS == code) { code = tjsonAddObject(pJson, jkLogicPlanConditions, nodeToJson, pNode->pConditions); } @@ -445,6 +452,14 @@ static int32_t jsonToPhysiTableScanNode(const SJson* pJson, void* pObj) { return code; } +static int32_t physiStreamScanNodeToJson(const void* pObj, SJson* pJson) { + return physiScanNodeToJson(pObj, pJson); +} + +static int32_t jsonToPhysiStreamScanNode(const SJson* pJson, void* pObj) { + return jsonToPhysiScanNode(pJson, pObj); +} + static const char* jkProjectPhysiPlanProjections = "Projections"; static int32_t physiProjectNodeToJson(const void* pObj, SJson* pJson) { @@ -1273,6 +1288,193 @@ static int32_t jsonToFunctionNode(const SJson* pJson, void* pObj) { return code; } +static const char* jkTableDbName = "DbName"; +static const char* jkTableTableName = "tableName"; +static const char* jkTableTableAlias = "tableAlias"; + +static int32_t tableNodeToJson(const void* pObj, SJson* pJson) { + const STableNode* pNode = (const STableNode*)pObj; + + int32_t code = exprNodeToJson(pObj, pJson); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddStringToObject(pJson, jkTableDbName, pNode->dbName); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddStringToObject(pJson, jkTableTableName, pNode->tableName); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddStringToObject(pJson, jkTableTableAlias, pNode->tableAlias); + } + + return code; +} + +static int32_t jsonToTableNode(const SJson* pJson, void* pObj) { + STableNode* pNode = (STableNode*)pObj; + + int32_t code = jsonToExprNode(pJson, pObj); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetStringValue(pJson, jkTableDbName, pNode->dbName); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetStringValue(pJson, jkTableTableName, pNode->tableName); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetStringValue(pJson, jkTableTableAlias, pNode->tableAlias); + } + + return code; +} + +static const char* jkEpSetInUse = "InUse"; +static const char* jkEpSetNumOfEps = "NumOfEps"; +static const char* jkEpSetEps = "Eps"; + +static int32_t epSetToJson(const void* pObj, SJson* pJson) { + const SEpSet* pNode = (const SEpSet*)pObj; + + int32_t code = tjsonAddIntegerToObject(pJson, jkEpSetInUse, pNode->inUse); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkEpSetNumOfEps, pNode->numOfEps); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddArray(pJson, jkEpSetEps, epToJson, pNode->eps, sizeof(SEp), pNode->numOfEps); + } + + return code; +} + +static int32_t jsonToEpSet(const SJson* pJson, void* pObj) { + SEpSet* pNode = (SEpSet*)pObj; + + int32_t code = tjsonGetTinyIntValue(pJson, jkEpSetInUse, &pNode->inUse); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetTinyIntValue(pJson, jkEpSetNumOfEps, &pNode->numOfEps); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonToArray(pJson, jkEpSetEps, jsonToEp, pNode->eps, sizeof(SEp)); + } + + return code; +} + +static const char* jkVgroupInfoVgId = "VgId"; +static const char* jkVgroupInfoHashBegin = "HashBegin"; +static const char* jkVgroupInfoHashEnd = "HashEnd"; +static const char* jkVgroupInfoEpSet = "EpSet"; +static const char* jkVgroupInfoNumOfTable = "NumOfTable"; + +static int32_t vgroupInfoToJson(const void* pObj, SJson* pJson) { + const SVgroupInfo* pNode = (const SVgroupInfo*)pObj; + + int32_t code = tjsonAddIntegerToObject(pJson, jkVgroupInfoVgId, pNode->vgId); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkVgroupInfoHashBegin, pNode->hashBegin); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkVgroupInfoHashEnd, pNode->hashEnd); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddObject(pJson, jkVgroupInfoEpSet, epSetToJson, &pNode->epSet); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkVgroupInfoNumOfTable, pNode->numOfTable); + } + + return code; +} + +static int32_t jsonToVgroupInfo(const SJson* pJson, void* pObj) { + SVgroupInfo* pNode = (SVgroupInfo*)pObj; + + int32_t code = tjsonGetIntValue(pJson, jkVgroupInfoVgId, &pNode->vgId); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetUIntValue(pJson, jkVgroupInfoHashBegin, &pNode->hashBegin); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetUIntValue(pJson, jkVgroupInfoHashEnd, &pNode->hashEnd); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonToObject(pJson, jkVgroupInfoEpSet, jsonToEpSet, &pNode->epSet); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetIntValue(pJson, jkVgroupInfoNumOfTable, &pNode->numOfTable); + } + + return code; +} + +static const char* jkVgroupsInfoNum = "Num"; +static const char* jkVgroupsInfoVgroups = "Vgroups"; + +static int32_t vgroupsInfoToJson(const void* pObj, SJson* pJson) { + const SVgroupsInfo* pNode = (const SVgroupsInfo*)pObj; + + int32_t code = tjsonAddIntegerToObject(pJson, jkVgroupsInfoNum, pNode->numOfVgroups); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddArray(pJson, jkVgroupsInfoVgroups, vgroupInfoToJson, pNode->vgroups, sizeof(SVgroupInfo), pNode->numOfVgroups); + } + + return code; +} + +static int32_t jsonToVgroupsInfo(const SJson* pJson, void* pObj) { + SVgroupsInfo* pNode = (SVgroupsInfo*)pObj; + + int32_t code = tjsonGetIntValue(pJson, jkVgroupsInfoNum, &pNode->numOfVgroups); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonToArray(pJson, jkVgroupsInfoVgroups, jsonToVgroupInfo, pNode->vgroups, sizeof(SVgroupInfo)); + } + + return code; +} + +static const char* jkRealTableMetaSize = "MetaSize"; +static const char* jkRealTableMeta = "Meta"; +static const char* jkRealTableVgroupsInfoSize = "VgroupsInfoSize"; +static const char* jkRealTableVgroupsInfo = "VgroupsInfo"; + +static int32_t realTableNodeToJson(const void* pObj, SJson* pJson) { + const SRealTableNode* pNode = (const SRealTableNode*)pObj; + + int32_t code = tableNodeToJson(pObj, pJson); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkRealTableMetaSize, TABLE_META_SIZE(pNode->pMeta)); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddObject(pJson, jkRealTableMeta, tableMetaToJson, pNode->pMeta); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddIntegerToObject(pJson, jkRealTableVgroupsInfoSize, VGROUPS_INFO_SIZE(pNode->pVgroupList)); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonAddObject(pJson, jkRealTableVgroupsInfo, vgroupsInfoToJson, pNode->pVgroupList); + } + + return code; +} + +static int32_t jsonToRealTableNode(const SJson* pJson, void* pObj) { + SRealTableNode* pNode = (SRealTableNode*)pObj; + + int32_t objSize = 0; + int32_t code = jsonToTableNode(pJson, pObj); + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetIntValue(pJson, jkRealTableMetaSize, &objSize); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonMakeObject(pJson, jkRealTableMeta, jsonToTableMeta, (void**)&pNode->pMeta, objSize); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonGetIntValue(pJson, jkRealTableVgroupsInfoSize, &objSize); + } + if (TSDB_CODE_SUCCESS == code) { + code = tjsonMakeObject(pJson, jkRealTableVgroupsInfo, jsonToVgroupsInfo, (void**)&pNode->pVgroupList, objSize); + } + + return code; +} + static const char* jkGroupingSetType = "GroupingSetType"; static const char* jkGroupingSetParameter = "Parameters"; @@ -1464,7 +1666,7 @@ static const char* jkSelectStmtSlimit = "Slimit"; static int32_t selectStmtTojson(const void* pObj, SJson* pJson) { const SSelectStmt* pNode = (const SSelectStmt*)pObj; - int32_t code = tjsonAddIntegerToObject(pJson, jkSelectStmtDistinct, pNode->isDistinct); + int32_t code = tjsonAddBoolToObject(pJson, jkSelectStmtDistinct, pNode->isDistinct); if (TSDB_CODE_SUCCESS == code) { code = nodeListToJson(pJson, jkSelectStmtProjections, pNode->pProjectionList); } @@ -1499,6 +1701,44 @@ static int32_t selectStmtTojson(const void* pObj, SJson* pJson) { return code; } +static int32_t jsonToSelectStmt(const SJson* pJson, void* pObj) { + SSelectStmt* pNode = (SSelectStmt*)pObj; + + int32_t code = tjsonGetBoolValue(pJson, jkSelectStmtDistinct, &pNode->isDistinct); + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeList(pJson, jkSelectStmtProjections, &pNode->pProjectionList); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtFrom, &pNode->pFromTable); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtWhere, &pNode->pWhere); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeList(pJson, jkSelectStmtPartitionBy, &pNode->pPartitionByList); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtWindow, &pNode->pWindow); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeList(pJson, jkSelectStmtGroupBy, &pNode->pGroupByList); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtHaving, &pNode->pHaving); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeList(pJson, jkSelectStmtOrderBy, &pNode->pOrderByList); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtLimit, &pNode->pLimit); + } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeObject(pJson, jkSelectStmtSlimit, &pNode->pSlimit); + } + + return code; +} + static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { switch (nodeType(pObj)) { case QUERY_NODE_COLUMN: @@ -1512,6 +1752,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { case QUERY_NODE_FUNCTION: return functionNodeToJson(pObj, pJson); case QUERY_NODE_REAL_TABLE: + return realTableNodeToJson(pObj, pJson); case QUERY_NODE_TEMP_TABLE: case QUERY_NODE_JOIN_TABLE: break; @@ -1565,9 +1806,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { return physiTagScanNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: return physiTableScanNodeToJson(pObj, pJson); - case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN: case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: - break; + return physiStreamScanNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return physiProjectNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_JOIN: @@ -1589,6 +1829,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { case QUERY_NODE_PHYSICAL_PLAN: return planToJson(pObj, pJson); default: + assert(0); break; } nodesWarn("specificNodeToJson unknown node = %s", nodesNodeName(nodeType(pObj))); @@ -1607,7 +1848,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { return jsonToLogicConditionNode(pJson, pObj); case QUERY_NODE_FUNCTION: return jsonToFunctionNode(pJson, pObj); - // case QUERY_NODE_REAL_TABLE: + case QUERY_NODE_REAL_TABLE: + return jsonToRealTableNode(pJson, pObj); // case QUERY_NODE_TEMP_TABLE: // case QUERY_NODE_JOIN_TABLE: // break; @@ -1633,8 +1875,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { return jsonToDownstreamSourceNode(pJson, pObj); // case QUERY_NODE_SET_OPERATOR: // break; - // case QUERY_NODE_SELECT_STMT: - // return jsonToSelectStmt(pJson, pObj); + case QUERY_NODE_SELECT_STMT: + return jsonToSelectStmt(pJson, pObj); // case QUERY_NODE_LOGIC_PLAN_SCAN: // return jsonToLogicScanNode(pJson, pObj); // case QUERY_NODE_LOGIC_PLAN_JOIN: @@ -1647,6 +1889,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { return jsonToPhysiTagScanNode(pJson, pObj); case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: return jsonToPhysiTableScanNode(pJson, pObj); + case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: + return jsonToPhysiStreamScanNode(pJson, pObj); case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return jsonToPhysiProjectNode(pJson, pObj); case QUERY_NODE_PHYSICAL_PLAN_JOIN: @@ -1768,6 +2012,7 @@ int32_t nodesStringToNode(const char* pStr, SNode** pNode) { int32_t code = makeNodeByJson(pJson, pNode); if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode(*pNode); + *pNode = NULL; terrno = code; return code; } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 75568019cb3c5991b3aadc11f9bf2fb68e74e230..0d48202f7339e8c9d77c7abb46c19c6a687bc688 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -125,6 +125,8 @@ SNodeptr nodesMakeNode(ENodeType type) { return makeNode(type, sizeof(SCreateDnodeStmt)); case QUERY_NODE_DROP_DNODE_STMT: return makeNode(type, sizeof(SDropDnodeStmt)); + case QUERY_NODE_ALTER_DNODE_STMT: + return makeNode(type, sizeof(SAlterDnodeStmt)); case QUERY_NODE_SHOW_DNODES_STMT: return makeNode(type, sizeof(SShowStmt)); case QUERY_NODE_SHOW_VGROUPS_STMT: @@ -168,7 +170,7 @@ SNodeptr nodesMakeNode(ENodeType type) { case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN: return makeNode(type, sizeof(STableSeqScanPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: - return makeNode(type, sizeof(SNode)); + return makeNode(type, sizeof(SStreamScanPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return makeNode(type, sizeof(SProjectPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_JOIN: @@ -357,6 +359,17 @@ int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc) { return TSDB_CODE_SUCCESS; } +int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc) { + if (NULL == pSrc) { + return TSDB_CODE_OUT_OF_MEMORY; + } + int32_t code = nodesListAppendList(pTarget, pSrc); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pSrc); + } + return code; +} + SListCell* nodesListErase(SNodeList* pList, SListCell* pCell) { if (NULL == pCell->pPrev) { pList->pHead = pCell->pNext; @@ -571,7 +584,7 @@ typedef struct SCollectFuncsCxt { static EDealRes collectFuncs(SNode* pNode, void* pContext) { SCollectFuncsCxt* pCxt = (SCollectFuncsCxt*)pContext; if (QUERY_NODE_FUNCTION == nodeType(pNode) && pCxt->classifier(((SFunctionNode*)pNode)->funcId)) { - pCxt->errCode = nodesListAppend(pCxt->pFuncs, pNode); + pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, nodesCloneNode(pNode)); return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR); } return DEAL_RES_CONTINUE; diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 31d7331d0eff7a631de28849907bf3b886855ebc..46bed1d61ed6136e1449833f41a0c2bba216631f 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -50,8 +50,10 @@ typedef enum EDatabaseOptionType { DB_OPTION_TTL, DB_OPTION_WAL, DB_OPTION_VGROUPS, - DB_OPTION_SINGLESTABLE, - DB_OPTION_STREAMMODE, + DB_OPTION_SINGLE_STABLE, + DB_OPTION_STREAM_MODE, + DB_OPTION_RETENTIONS, + DB_OPTION_FILE_FACTOR, DB_OPTION_MAX } EDatabaseOptionType; @@ -65,6 +67,11 @@ typedef enum ETableOptionType { TABLE_OPTION_MAX } ETableOptionType; +typedef struct SAlterOption { + int32_t type; + SToken val; +} SAlterOption; + extern SToken nil_token; void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt); @@ -110,13 +117,16 @@ SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pPr SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight); SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt); +SNode* createDefaultAlterDatabaseOptions(SAstCreateContext* pCxt); SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, const SToken* pVal); SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pDbName, SNode* pOptions); SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pDbName); SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName, SNode* pOptions); SNode* createDefaultTableOptions(SAstCreateContext* pCxt); +SNode* createDefaultAlterTableOptions(SAstCreateContext* pCxt); SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, const SToken* pVal); SNode* setTableSmaOption(SAstCreateContext* pCxt, SNode* pOptions, SNodeList* pSma); +SNode* setTableRollupOption(SAstCreateContext* pCxt, SNode* pOptions, SNodeList* pFuncs); SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDataType dataType, const SToken* pComment); SDataType createDataType(uint8_t type); SDataType createVarLenDataType(uint8_t type, const SToken* pLen); @@ -126,6 +136,11 @@ SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable); SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables); SNode* createDropSuperTableStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable); +SNode* createAlterTableOption(SAstCreateContext* pCxt, SNode* pRealTable, SNode* pOptions); +SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName, SDataType dataType); +SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName); +SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pOldColName, const SToken* pNewColName); +SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, const SToken* pTagName, SNode* pVal); SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName); SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDbName); SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, const SToken* pPassword); @@ -133,6 +148,7 @@ SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int SNode* createDropUserStmt(SAstCreateContext* pCxt, const SToken* pUserName); SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort); SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode); +SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig, const SToken* pValue); SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, const SToken* pIndexName, const SToken* pTableName, SNodeList* pCols, SNode* pOptions); SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInterval, SNode* pOffset, SNode* pSliding); SNode* createDropIndexStmt(SAstCreateContext* pCxt, const SToken* pIndexName, const SToken* pTableName); @@ -140,6 +156,7 @@ SNode* createCreateQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId); SNode* createDropQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId); SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery, const SToken* pSubscribeDbName); SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pTopicName); +SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue); #ifdef __cplusplus } diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 31c26e1e40862dd5975194b050f74adb0af83f9b..2298ae0761faaa2bce1d7a4186321299a22b8475 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -21,13 +21,15 @@ #include "parAst.h" } -%syntax_error { - if(TOKEN.z) { - generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z); - } else { - generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL); +%syntax_error { + if (pCxt->valid) { + if(TOKEN.z) { + generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z); + } else { + generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL); + } + pCxt->valid = false; } - pCxt->valid = false; } %left OR. @@ -41,6 +43,41 @@ %left NK_CONCAT. //%right NK_BITNOT. +/************************************************ create/alter account *****************************************/ +cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options. { pCxt->valid = false; generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } +cmd ::= ALTER ACCOUNT NK_ID alter_account_options. { pCxt->valid = false; generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } + +%type account_options { int32_t } +%destructor account_options { } +account_options ::= . { } +account_options ::= account_options PPS literal. { } +account_options ::= account_options TSERIES literal. { } +account_options ::= account_options STORAGE literal. { } +account_options ::= account_options STREAMS literal. { } +account_options ::= account_options QTIME literal. { } +account_options ::= account_options DBS literal. { } +account_options ::= account_options USERS literal. { } +account_options ::= account_options CONNS literal. { } +account_options ::= account_options STATE literal. { } + +%type alter_account_options { int32_t } +%destructor alter_account_options { } +alter_account_options ::= alter_account_option. { } +alter_account_options ::= alter_account_options alter_account_option. { } + +%type alter_account_option { int32_t } +%destructor alter_account_option { } +alter_account_option ::= PASS literal. { } +alter_account_option ::= PPS literal. { } +alter_account_option ::= TSERIES literal. { } +alter_account_option ::= STORAGE literal. { } +alter_account_option ::= STREAMS literal. { } +alter_account_option ::= QTIME literal. { } +alter_account_option ::= DBS literal. { } +alter_account_option ::= USERS literal. { } +alter_account_option ::= CONNS literal. { } +alter_account_option ::= STATE literal. { } + /************************************************ create/alter/drop/show user *****************************************/ cmd ::= CREATE USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createCreateUserStmt(pCxt, &A, &B); } cmd ::= ALTER USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PASSWD, &B); } @@ -48,12 +85,16 @@ cmd ::= ALTER USER user_name(A) PRIVILEGE NK_STRING(B). cmd ::= DROP USER user_name(A). { pCxt->pRootNode = createDropUserStmt(pCxt, &A); } cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT, NULL); } -/************************************************ create/drop/show dnode **********************************************/ +/************************************************ create/drop/alter/show dnode ****************************************/ cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); } cmd ::= CREATE DNODE dnode_host_name(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B); } cmd ::= DROP DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); } cmd ::= DROP DNODE dnode_endpoint(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); } cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT, NULL); } +cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, NULL); } +cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B) NK_STRING(C). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, &C); } +cmd ::= ALTER ALL DNODES NK_STRING(A). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &A, NULL); } +cmd ::= ALTER ALL DNODES NK_STRING(A) NK_STRING(B). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &A, &B); } %type dnode_endpoint { SToken } %destructor dnode_endpoint { } @@ -64,9 +105,13 @@ dnode_endpoint(A) ::= NK_STRING(B). dnode_host_name(A) ::= NK_ID(B). { A = B; } dnode_host_name(A) ::= NK_IPTOKEN(B). { A = B; } +/************************************************ alter local *********************************************************/ +cmd ::= ALTER LOCAL NK_STRING(A). { pCxt->pRootNode = createAlterLocalStmt(pCxt, &A, NULL); } +cmd ::= ALTER LOCAL NK_STRING(A) NK_STRING(B). { pCxt->pRootNode = createAlterLocalStmt(pCxt, &A, &B); } + /************************************************ create/drop qnode ***************************************************/ cmd ::= CREATE QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createCreateQnodeStmt(pCxt, &A); } -cmd ::= DROP QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropQnodeStmt(pCxt, &A); } +cmd ::= DROP QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropQnodeStmt(pCxt, &A); } cmd ::= SHOW QNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT, NULL); } /************************************************ create/drop/show/use database ***************************************/ @@ -74,7 +119,7 @@ cmd ::= CREATE DATABASE not_exists_opt(A) db_name(B) db_options(C). cmd ::= DROP DATABASE exists_opt(A) db_name(B). { pCxt->pRootNode = createDropDatabaseStmt(pCxt, A, &B); } cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT, NULL); } cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A); } -cmd ::= ALTER DATABASE db_name(A) db_options(B). { pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &A, B); } +cmd ::= ALTER DATABASE db_name(A) alter_db_options(B). { pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &A, B); } %type not_exists_opt { bool } %destructor not_exists_opt { } @@ -102,20 +147,55 @@ db_options(A) ::= db_options(B) REPLICA NK_INTEGER(C). db_options(A) ::= db_options(B) TTL NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_TTL, &C); } db_options(A) ::= db_options(B) WAL NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_WAL, &C); } db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_VGROUPS, &C); } -db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLESTABLE, &C); } -db_options(A) ::= db_options(B) STREAM_MODE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STREAMMODE, &C); } +db_options(A) ::= db_options(B) SINGLE_STABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLE_STABLE, &C); } +db_options(A) ::= db_options(B) STREAM_MODE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STREAM_MODE, &C); } +db_options(A) ::= db_options(B) RETENTIONS NK_STRING(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_RETENTIONS, &C); } +db_options(A) ::= db_options(B) FILE_FACTOR NK_FLOAT(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_FILE_FACTOR, &C); } + +alter_db_options(A) ::= alter_db_option(B). { A = createDefaultAlterDatabaseOptions(pCxt); A = setDatabaseOption(pCxt, A, B.type, &B.val); } +alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). { A = setDatabaseOption(pCxt, B, C.type, &C.val); } + +%type alter_db_option { SAlterOption } +%destructor alter_db_option { } +alter_db_option(A) ::= BLOCKS NK_INTEGER(B). { A.type = DB_OPTION_BLOCKS; A.val = B; } +alter_db_option(A) ::= FSYNC NK_INTEGER(B). { A.type = DB_OPTION_FSYNC; A.val = B; } +alter_db_option(A) ::= KEEP NK_INTEGER(B). { A.type = DB_OPTION_KEEP; A.val = B; } +alter_db_option(A) ::= WAL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; } +alter_db_option(A) ::= QUORUM NK_INTEGER(B). { A.type = DB_OPTION_QUORUM; A.val = B; } +alter_db_option(A) ::= CACHELAST NK_INTEGER(B). { A.type = DB_OPTION_CACHELAST; A.val = B; } /************************************************ create/drop/show table/stable ***************************************/ cmd ::= CREATE TABLE not_exists_opt(A) full_table_name(B) - NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E);} -cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A);} + NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); } +cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A); } cmd ::= CREATE STABLE not_exists_opt(A) full_table_name(B) - NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E);} + NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); } cmd ::= DROP TABLE multi_drop_clause(A). { pCxt->pRootNode = createDropTableStmt(pCxt, A); } cmd ::= DROP STABLE exists_opt(A) full_table_name(B). { pCxt->pRootNode = createDropSuperTableStmt(pCxt, A, B); } cmd ::= SHOW TABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT, NULL); } cmd ::= SHOW STABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STABLES_STMT, NULL); } +cmd ::= ALTER TABLE alter_table_clause(A). { pCxt->pRootNode = A; } +cmd ::= ALTER STABLE alter_table_clause(A). { pCxt->pRootNode = A; } + +alter_table_clause(A) ::= full_table_name(B) alter_table_options(C). { A = createAlterTableOption(pCxt, B, C); } +alter_table_clause(A) ::= + full_table_name(B) ADD COLUMN column_name(C) type_name(D). { A = createAlterTableAddModifyCol(pCxt, B, TSDB_ALTER_TABLE_ADD_COLUMN, &C, D); } +alter_table_clause(A) ::= full_table_name(B) DROP COLUMN column_name(C). { A = createAlterTableDropCol(pCxt, B, TSDB_ALTER_TABLE_DROP_COLUMN, &C); } +alter_table_clause(A) ::= + full_table_name(B) MODIFY COLUMN column_name(C) type_name(D). { A = createAlterTableAddModifyCol(pCxt, B, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &C, D); } +alter_table_clause(A) ::= + full_table_name(B) RENAME COLUMN column_name(C) column_name(D). { A = createAlterTableRenameCol(pCxt, B, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &C, &D); } +alter_table_clause(A) ::= + full_table_name(B) ADD TAG column_name(C) type_name(D). { A = createAlterTableAddModifyCol(pCxt, B, TSDB_ALTER_TABLE_ADD_TAG, &C, D); } +alter_table_clause(A) ::= full_table_name(B) DROP TAG column_name(C). { A = createAlterTableDropCol(pCxt, B, TSDB_ALTER_TABLE_DROP_TAG, &C); } +alter_table_clause(A) ::= + full_table_name(B) MODIFY TAG column_name(C) type_name(D). { A = createAlterTableAddModifyCol(pCxt, B, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &C, D); } +alter_table_clause(A) ::= + full_table_name(B) RENAME TAG column_name(C) column_name(D). { A = createAlterTableRenameCol(pCxt, B, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &C, &D); } +alter_table_clause(A) ::= + full_table_name(B) SET TAG column_name(C) NK_EQ literal(D). { A = createAlterTableSetTag(pCxt, B, &C, D); } + %type multi_create_clause { SNodeList* } %destructor multi_create_clause { nodesDestroyList($$); } multi_create_clause(A) ::= create_subtable_clause(B). { A = createNodeList(pCxt, B); } @@ -183,11 +263,21 @@ tags_def_opt(A) ::= tags_def(B). %destructor tags_def { nodesDestroyList($$); } tags_def(A) ::= TAGS NK_LP column_def_list(B) NK_RP. { A = B; } -table_options(A) ::= . { A = createDefaultTableOptions(pCxt);} +table_options(A) ::= . { A = createDefaultTableOptions(pCxt); } table_options(A) ::= table_options(B) COMMENT NK_STRING(C). { A = setTableOption(pCxt, B, TABLE_OPTION_COMMENT, &C); } table_options(A) ::= table_options(B) KEEP NK_INTEGER(C). { A = setTableOption(pCxt, B, TABLE_OPTION_KEEP, &C); } table_options(A) ::= table_options(B) TTL NK_INTEGER(C). { A = setTableOption(pCxt, B, TABLE_OPTION_TTL, &C); } table_options(A) ::= table_options(B) SMA NK_LP col_name_list(C) NK_RP. { A = setTableSmaOption(pCxt, B, C); } +table_options(A) ::= table_options(B) ROLLUP NK_LP func_name_list(C) NK_RP. { A = setTableRollupOption(pCxt, B, C); } + +alter_table_options(A) ::= alter_table_option(B). { A = createDefaultAlterTableOptions(pCxt); A = setTableOption(pCxt, A, B.type, &B.val); } +alter_table_options(A) ::= alter_table_options(B) alter_table_option(C). { A = setTableOption(pCxt, B, C.type, &C.val); } + +%type alter_table_option { SAlterOption } +%destructor alter_table_option { } +alter_table_option(A) ::= COMMENT NK_STRING(B). { A.type = TABLE_OPTION_COMMENT; A.val = B; } +alter_table_option(A) ::= KEEP NK_INTEGER(B). { A.type = TABLE_OPTION_KEEP; A.val = B; } +alter_table_option(A) ::= TTL NK_INTEGER(B). { A.type = TABLE_OPTION_TTL; A.val = B; } %type col_name_list { SNodeList* } %destructor col_name_list { nodesDestroyList($$); } @@ -196,6 +286,13 @@ col_name_list(A) ::= col_name_list(B) NK_COMMA col_name(C). col_name(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); } +%type func_name_list { SNodeList* } +%destructor func_name_list { nodesDestroyList($$); } +func_name_list(A) ::= func_name(B). { A = createNodeList(pCxt, B); } +func_name_list(A) ::= func_name_list(B) NK_COMMA col_name(C). { A = addNodeToList(pCxt, B, C); } + +func_name(A) ::= function_name(B). { A = createFunctionNode(pCxt, &B, NULL); } + /************************************************ create index ********************************************************/ cmd ::= CREATE SMA INDEX index_name(A) ON table_name(B) index_options(C). { pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, &A, &B, NULL, C); } cmd ::= CREATE FULLTEXT INDEX @@ -546,7 +643,7 @@ query_expression_body(A) ::= query_primary(A) ::= query_specification(B). { A = B; } //query_primary(A) ::= // NK_LP query_expression_body(B) -// order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP. { A = B;} +// order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP. { A = B; } %type order_by_clause_opt { SNodeList* } %destructor order_by_clause_opt { nodesDestroyList($$); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 034346362c794f2dff94c96a69f671533410a0f7..eed6391d5c97af340b5827166fe4c00ba23cd21a 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -246,6 +246,16 @@ static SDatabaseOptions* setDbStreamMode(SAstCreateContext* pCxt, SDatabaseOptio return pOptions; } +static SDatabaseOptions* setDbRetentions(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal) { + // todo + return pOptions; +} + +static SDatabaseOptions* setDbFileFactor(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal) { + // todo + return pOptions; +} + static void initSetDatabaseOptionFp() { setDbOptionFuncs[DB_OPTION_BLOCKS] = setDbBlocks; setDbOptionFuncs[DB_OPTION_CACHE] = setDbCache; @@ -262,8 +272,10 @@ static void initSetDatabaseOptionFp() { setDbOptionFuncs[DB_OPTION_TTL] = setDbTtl; setDbOptionFuncs[DB_OPTION_WAL] = setDbWal; setDbOptionFuncs[DB_OPTION_VGROUPS] = setDbVgroups; - setDbOptionFuncs[DB_OPTION_SINGLESTABLE] = setDbSingleStable; - setDbOptionFuncs[DB_OPTION_STREAMMODE] = setDbStreamMode; + setDbOptionFuncs[DB_OPTION_SINGLE_STABLE] = setDbSingleStable; + setDbOptionFuncs[DB_OPTION_STREAM_MODE] = setDbStreamMode; + setDbOptionFuncs[DB_OPTION_RETENTIONS] = setDbRetentions; + setDbOptionFuncs[DB_OPTION_FILE_FACTOR] = setDbFileFactor; } static STableOptions* setTableKeep(SAstCreateContext* pCxt, STableOptions* pOptions, const SToken* pVal) { @@ -772,6 +784,29 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { return (SNode*)pOptions; } +SNode* createDefaultAlterDatabaseOptions(SAstCreateContext* pCxt) { + SDatabaseOptions* pOptions = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); + CHECK_OUT_OF_MEM(pOptions); + pOptions->numOfBlocks = -1; + pOptions->cacheBlockSize = -1; + pOptions->cachelast = -1; + pOptions->compressionLevel = -1; + pOptions->daysPerFile = -1; + pOptions->fsyncPeriod = -1; + pOptions->maxRowsPerBlock = -1; + pOptions->minRowsPerBlock = -1; + pOptions->keep = -1; + pOptions->precision = -1; + pOptions->quorum = -1; + pOptions->replica = -1; + pOptions->ttl = -1; + pOptions->walLevel = -1; + pOptions->numOfVgroups = -1; + pOptions->singleStable = -1; + pOptions->streamMode = -1; + return (SNode*)pOptions; +} + SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, const SToken* pVal) { return (SNode*)setDbOptionFuncs[type](pCxt, (SDatabaseOptions*)pOptions, pVal); } @@ -818,6 +853,14 @@ SNode* createDefaultTableOptions(SAstCreateContext* pCxt) { return (SNode*)pOptions; } +SNode* createDefaultAlterTableOptions(SAstCreateContext* pCxt) { + STableOptions* pOptions = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS); + CHECK_OUT_OF_MEM(pOptions); + pOptions->keep = -1; + pOptions->ttl = -1; + return (SNode*)pOptions; +} + SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, const SToken* pVal) { return (SNode*)setTableOptionFuncs[type](pCxt, (STableOptions*)pOptions, pVal); } @@ -827,6 +870,11 @@ SNode* setTableSmaOption(SAstCreateContext* pCxt, SNode* pOptions, SNodeList* pS return pOptions; } +SNode* setTableRollupOption(SAstCreateContext* pCxt, SNode* pOptions, SNodeList* pFuncs) { + // todo + return pOptions; +} + SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDataType dataType, const SToken* pComment) { SColumnDefNode* pCol = (SColumnDefNode*)nodesMakeNode(QUERY_NODE_COLUMN_DEF); CHECK_OUT_OF_MEM(pCol); @@ -912,6 +960,49 @@ SNode* createDropSuperTableStmt(SAstCreateContext* pCxt, bool ignoreNotExists, S return (SNode*)pStmt; } +SNode* createAlterTableOption(SAstCreateContext* pCxt, SNode* pRealTable, SNode* pOptions) { + SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_OPTIONS; + pStmt->pOptions = (STableOptions*)pOptions; + return (SNode*)pStmt; +} + +SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName, SDataType dataType) { + SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->alterType = alterType; + strncpy(pStmt->colName, pColName->z, pColName->n); + pStmt->dataType = dataType; + return (SNode*)pStmt; +} + +SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName) { + SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->alterType = alterType; + strncpy(pStmt->colName, pColName->z, pColName->n); + return (SNode*)pStmt; +} + +SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pOldColName, const SToken* pNewColName) { + SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->alterType = alterType; + strncpy(pStmt->colName, pOldColName->z, pOldColName->n); + strncpy(pStmt->newColName, pNewColName->z, pNewColName->n); + return (SNode*)pStmt; +} + +SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, const SToken* pTagName, SNode* pVal) { + SAlterTableStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_TAG_VAL; + strncpy(pStmt->colName, pTagName->z, pTagName->n); + pStmt->pVal = (SValueNode*)pVal; + return (SNode*)pStmt; +} + SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) { SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT); CHECK_OUT_OF_MEM(pStmt); @@ -1009,6 +1100,17 @@ SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode) { return (SNode*)pStmt; } +SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig, const SToken* pValue) { + SAlterDnodeStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_DNODE_STMT); + CHECK_OUT_OF_MEM(pStmt); + pStmt->dnodeId = strtol(pDnode->z, NULL, 10); + trimString(pConfig->z, pConfig->n, pStmt->config, sizeof(pStmt->config)); + if (NULL != pValue) { + trimString(pValue->z, pValue->n, pStmt->value, sizeof(pStmt->value)); + } + return (SNode*)pStmt; +} + SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, const SToken* pIndexName, const SToken* pTableName, SNodeList* pCols, SNode* pOptions) { if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) { return NULL; @@ -1077,3 +1179,13 @@ SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const pStmt->ignoreNotExists = ignoreNotExists; return (SNode*)pStmt; } + +SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue) { + SAlterLocalStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_LOCAL_STMT); + CHECK_OUT_OF_MEM(pStmt); + trimString(pConfig->z, pConfig->n, pStmt->config, sizeof(pStmt->config)); + if (NULL != pValue) { + trimString(pValue->z, pValue->n, pStmt->value, sizeof(pStmt->value)); + } + return (SNode*)pStmt; +} diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c index 6db3abb9d602203d57ea4f279669895df7623b18..a37820634f9c8cc80d5cce61047d502facd0a8d2 100644 --- a/source/libs/parser/src/parInsert.c +++ b/source/libs/parser/src/parInsert.c @@ -622,7 +622,7 @@ static FORCE_INLINE int32_t MemRowAppend(const void* value, int32_t len, void* p // if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long' int32_t output = 0; const char* rowEnd = tdRowEnd(rb->pBuf); - if (!taosMbsToUcs4(value, len, (char*)varDataVal(rowEnd), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) { + if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(rowEnd), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) { return TSDB_CODE_TSC_SQL_SYNTAX_ERROR; } varDataSetLen(rowEnd, output); @@ -725,7 +725,7 @@ static int32_t KvRowAppend(const void *value, int32_t len, void *param) { } else if (TSDB_DATA_TYPE_NCHAR == type) { // if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long' int32_t output = 0; - if (!taosMbsToUcs4(value, len, varDataVal(pa->buf), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) { + if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(pa->buf), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) { return TSDB_CODE_TSC_SQL_SYNTAX_ERROR; } diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 2d58d4e1e3821ea624a1abd1d7db3258112d618d..4549660c762f13e93ffaff5aec7c6a6712604d30 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -28,6 +28,7 @@ typedef struct SKeyword { // keywords in sql string static SKeyword keywordTable[] = { + {"ACCOUNT", TK_ACCOUNT}, {"ALL", TK_ALL}, {"ALTER", TK_ALTER}, {"AND", TK_AND}, @@ -168,7 +169,6 @@ static SKeyword keywordTable[] = { // {"SCORES", TK_SCORES}, // {"GRANTS", TK_GRANTS}, // {"DOT", TK_DOT}, - // {"ACCOUNT", TK_ACCOUNT}, // {"DESCRIBE", TK_DESCRIBE}, // {"SYNCDB", TK_SYNCDB}, // {"LOCAL", TK_LOCAL}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index af7a38b702c275d18287f8496860ae81c6665300..171ec81ca20078cf657cf9a9cbc8092cc2db2a45 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -126,7 +126,7 @@ static void setColumnInfoByExpr(const STableNode* pTable, SExprNode* pExpr, SCol static int32_t createColumnNodeByTable(STranslateContext* pCxt, const STableNode* pTable, SNodeList* pList) { if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) { const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta; - int32_t nums = pMeta->tableInfo.numOfColumns + ((TSDB_SUPER_TABLE == pMeta->tableType)? pMeta->tableInfo.numOfTags:0); + int32_t nums = pMeta->tableInfo.numOfColumns + ((TSDB_SUPER_TABLE == pMeta->tableType) ? pMeta->tableInfo.numOfTags : 0); for (int32_t i = 0; i < nums; ++i) { SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); if (NULL == pCol) { @@ -499,6 +499,10 @@ static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) } static int32_t setTableVgroupList(SParseContext* pCxt, SName* name, SRealTableNode* pRealTable) { + if (pCxt->streamQuery) { + return TSDB_CODE_SUCCESS; + } + if (TSDB_SUPER_TABLE == pRealTable->pMeta->tableType) { SArray* vgroupList = NULL; int32_t code = catalogGetTableDistVgInfo(pCxt->pCatalog, pCxt->pTransporter, &pCxt->mgmtEpSet, name, &vgroupList); @@ -962,6 +966,73 @@ static int32_t translateDropSuperTable(STranslateContext* pCxt, SDropSuperTableS return doTranslateDropSuperTable(pCxt, &tableName, pStmt->ignoreNotExists); } +static int32_t setAlterTableField(SAlterTableStmt* pStmt, SMAltertbReq* pAlterReq) { + pAlterReq->pFields = taosArrayInit(2, sizeof(TAOS_FIELD)); + if (NULL == pAlterReq->pFields) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + switch (pStmt->alterType) { + case TSDB_ALTER_TABLE_ADD_TAG: + case TSDB_ALTER_TABLE_DROP_TAG: + case TSDB_ALTER_TABLE_ADD_COLUMN: + case TSDB_ALTER_TABLE_DROP_COLUMN: + case TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES: + case TSDB_ALTER_TABLE_UPDATE_TAG_BYTES: { + TAOS_FIELD field = { .type = pStmt->dataType.type, .bytes = pStmt->dataType.bytes }; + strcpy(field.name, pStmt->colName); + taosArrayPush(pAlterReq->pFields, &field); + break; + } + case TSDB_ALTER_TABLE_UPDATE_TAG_NAME: + case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME: { + TAOS_FIELD oldField = {0}; + strcpy(oldField.name, pStmt->colName); + taosArrayPush(pAlterReq->pFields, &oldField); + TAOS_FIELD newField = {0}; + strcpy(oldField.name, pStmt->newColName); + taosArrayPush(pAlterReq->pFields, &newField); + break; + } + default: + break; + } + + return TSDB_CODE_SUCCESS; +} + +static int32_t translateAlterTable(STranslateContext* pCxt, SAlterTableStmt* pStmt) { + SMAltertbReq alterReq = {0}; + SName tableName = { .type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId }; + strcpy(tableName.dbname, pStmt->dbName); + strcpy(tableName.tname, pStmt->tableName); + tNameExtractFullName(&tableName, alterReq.name); + alterReq.alterType = pStmt->alterType; + alterReq.numOfFields = 1; + if (TSDB_ALTER_TABLE_UPDATE_OPTIONS == pStmt->alterType) { + // todo + } else { + if (TSDB_CODE_SUCCESS != setAlterTableField(pStmt, &alterReq)) { + return TSDB_CODE_OUT_OF_MEMORY; + } + } + + pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo)); + if (NULL == pCxt->pCmdMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet; + pCxt->pCmdMsg->msgType = TDMT_MND_ALTER_STB; + pCxt->pCmdMsg->msgLen = tSerializeSMAlterStbReq(NULL, 0, &alterReq); + pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen); + if (NULL == pCxt->pCmdMsg->pMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + tSerializeSMAlterStbReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &alterReq); + + return TSDB_CODE_SUCCESS; +} + static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* pStmt) { SName name = {0}; tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->dbName, strlen(pStmt->dbName)); @@ -1099,6 +1170,28 @@ static int32_t translateDropDnode(STranslateContext* pCxt, SDropDnodeStmt* pStmt return TSDB_CODE_SUCCESS; } +static int32_t translateAlterDnode(STranslateContext* pCxt, SAlterDnodeStmt* pStmt) { + SMCfgDnodeReq cfgReq = {0}; + cfgReq.dnodeId = pStmt->dnodeId; + strcpy(cfgReq.config, pStmt->config); + strcpy(cfgReq.value, pStmt->value); + + pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo)); + if (NULL == pCxt->pCmdMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet; + pCxt->pCmdMsg->msgType = TDMT_MND_CONFIG_DNODE; + pCxt->pCmdMsg->msgLen = tSerializeSMCfgDnodeReq(NULL, 0, &cfgReq); + pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen); + if (NULL == pCxt->pCmdMsg->pMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + tSerializeSMCfgDnodeReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &cfgReq); + + return TSDB_CODE_SUCCESS; +} + static int32_t nodeTypeToShowType(ENodeType nt) { switch (nt) { case QUERY_NODE_SHOW_DATABASES_STMT: @@ -1300,6 +1393,7 @@ static int32_t translateCreateTopic(STranslateContext* pCxt, SCreateTopicStmt* p SCMCreateTopicReq createReq = {0}; if (NULL != pStmt->pQuery) { + pCxt->pParseCxt->streamQuery = true; int32_t code = translateQuery(pCxt, pStmt->pQuery); if (TSDB_CODE_SUCCESS == code) { code = nodesNodeToString(pStmt->pQuery, false, &createReq.ast, NULL); @@ -1364,6 +1458,11 @@ static int32_t translateDropTopic(STranslateContext* pCxt, SDropTopicStmt* pStmt return TSDB_CODE_SUCCESS; } +static int32_t translateAlterLocal(STranslateContext* pCxt, SAlterLocalStmt* pStmt) { + // todo + return TSDB_CODE_SUCCESS; +} + static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pNode)) { @@ -1388,6 +1487,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_DROP_SUPER_TABLE_STMT: code = translateDropSuperTable(pCxt, (SDropSuperTableStmt*)pNode); break; + case QUERY_NODE_ALTER_TABLE_STMT: + code = translateAlterTable(pCxt, (SAlterTableStmt*)pNode); + break; case QUERY_NODE_CREATE_USER_STMT: code = translateCreateUser(pCxt, (SCreateUserStmt*)pNode); break; @@ -1406,6 +1508,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_DROP_DNODE_STMT: code = translateDropDnode(pCxt, (SDropDnodeStmt*)pNode); break; + case QUERY_NODE_ALTER_DNODE_STMT: + code = translateAlterDnode(pCxt, (SAlterDnodeStmt*)pNode); + break; case QUERY_NODE_SHOW_DATABASES_STMT: case QUERY_NODE_SHOW_STABLES_STMT: case QUERY_NODE_SHOW_USERS_STMT: @@ -1436,6 +1541,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_DROP_TOPIC_STMT: code = translateDropTopic(pCxt, (SDropTopicStmt*)pNode); break; + case QUERY_NODE_ALTER_LOCAL_STMT: + code = translateAlterLocal(pCxt, (SAlterLocalStmt*)pNode); + break; default: break; } @@ -1855,6 +1963,11 @@ static int32_t rewriteCreateMultiTable(STranslateContext* pCxt, SQuery* pQuery) return rewriteToVnodeModifOpStmt(pQuery, pBufArray); } +static int32_t rewriteAlterTable(STranslateContext* pCxt, SQuery* pQuery) { + // todo + return TSDB_CODE_SUCCESS; +} + static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pQuery->pRoot)) { @@ -1866,6 +1979,11 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_CREATE_MULTI_TABLE_STMT: code = rewriteCreateMultiTable(pCxt, pQuery); break; + case QUERY_NODE_ALTER_TABLE_STMT: + if (TSDB_ALTER_TABLE_UPDATE_TAG_VAL == ((SAlterTableStmt*)pQuery->pRoot)->alterType) { + code = rewriteAlterTable(pCxt, pQuery); + } + break; default: break; } diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index aa2516e2b931557816182e363f73c0f80ab9bec2..69c2380b4538765a68881722f5926d4500f4a28b 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -46,17 +46,19 @@ static char* getSyntaxErrFormat(int32_t errCode) { case TSDB_CODE_PAR_NOT_SINGLE_GROUP: return "Not a single-group group function"; case TSDB_CODE_PAR_TAGS_NOT_MATCHED: - return "tags number not matched"; + return "Tags number not matched"; case TSDB_CODE_PAR_INVALID_TAG_NAME: - return "invalid tag name : %s"; + return "Invalid tag name : %s"; case TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG: - return "name or password too long"; + return "Name or password too long"; case TSDB_CODE_PAR_PASSWD_EMPTY: - return "password can not be empty"; + return "Password can not be empty"; case TSDB_CODE_PAR_INVALID_PORT: - return "port should be an integer that is less than 65535 and greater than 0"; + return "Port should be an integer that is less than 65535 and greater than 0"; case TSDB_CODE_PAR_INVALID_ENDPOINT: - return "endpoint should be in the format of 'fqdn:port'"; + return "Endpoint should be in the format of 'fqdn:port'"; + case TSDB_CODE_PAR_EXPRIE_STATEMENT: + return "This statement is no longer supported"; case TSDB_CODE_OUT_OF_MEMORY: return "Out of memory"; default: diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 18b507c1b00705dd2f5a120c4b924a54ce313c92..3d88eb5336342371f8942305bcb78add301d91e8 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -99,22 +99,24 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 220 +#define YYNOCODE 249 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - SNodeList* yy24; - bool yy97; - SToken yy129; - SDataType yy224; - ENullOrder yy257; - EOperatorType yy260; - EFillMode yy294; - EJoinType yy332; - EOrder yy378; - SNode* yy432; + SNode* yy26; + EOrder yy32; + SNodeList* yy64; + EOperatorType yy80; + bool yy107; + EFillMode yy192; + SToken yy353; + SDataType yy370; + EJoinType yy372; + ENullOrder yy391; + SAlterOption yy443; + int32_t yy448; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -129,17 +131,17 @@ typedef union { #define ParseCTX_PARAM #define ParseCTX_FETCH #define ParseCTX_STORE -#define YYNSTATE 333 -#define YYNRULE 255 -#define YYNTOKEN 141 -#define YY_MAX_SHIFT 332 -#define YY_MIN_SHIFTREDUCE 501 -#define YY_MAX_SHIFTREDUCE 755 -#define YY_ERROR_ACTION 756 -#define YY_ACCEPT_ACTION 757 -#define YY_NO_ACTION 758 -#define YY_MIN_REDUCE 759 -#define YY_MAX_REDUCE 1013 +#define YYNSTATE 414 +#define YYNRULE 316 +#define YYNTOKEN 160 +#define YY_MAX_SHIFT 413 +#define YY_MIN_SHIFTREDUCE 631 +#define YY_MAX_SHIFTREDUCE 946 +#define YY_ERROR_ACTION 947 +#define YY_ACCEPT_ACTION 948 +#define YY_NO_ACTION 949 +#define YY_MIN_REDUCE 950 +#define YY_MAX_REDUCE 1265 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -206,322 +208,379 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (1012) +#define YY_ACTTAB_COUNT (1182) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 163, 856, 240, 855, 272, 162, 272, 200, 856, 814, - /* 10 */ 854, 878, 31, 29, 27, 26, 25, 65, 880, 817, - /* 20 */ 178, 817, 256, 176, 906, 31, 29, 27, 26, 25, - /* 30 */ 779, 878, 40, 705, 55, 819, 71, 63, 880, 62, - /* 40 */ 155, 229, 66, 812, 243, 809, 906, 79, 938, 939, - /* 50 */ 626, 943, 878, 155, 175, 258, 511, 863, 259, 891, - /* 60 */ 511, 638, 58, 892, 895, 931, 512, 513, 208, 165, - /* 70 */ 927, 77, 321, 320, 319, 318, 317, 316, 315, 314, - /* 80 */ 313, 312, 311, 310, 309, 308, 307, 306, 305, 775, - /* 90 */ 959, 27, 26, 25, 31, 29, 27, 26, 25, 23, - /* 100 */ 170, 271, 656, 657, 658, 659, 660, 661, 662, 664, - /* 110 */ 665, 666, 23, 170, 271, 656, 657, 658, 659, 660, - /* 120 */ 661, 662, 664, 665, 666, 31, 29, 27, 26, 25, - /* 130 */ 10, 321, 320, 319, 318, 317, 316, 315, 314, 313, - /* 140 */ 312, 311, 310, 309, 308, 307, 306, 305, 565, 295, - /* 150 */ 294, 293, 569, 292, 571, 572, 291, 574, 288, 804, - /* 160 */ 580, 285, 582, 583, 282, 279, 24, 117, 256, 196, - /* 170 */ 906, 992, 626, 195, 624, 256, 177, 906, 194, 856, - /* 180 */ 193, 854, 83, 878, 991, 83, 258, 233, 990, 244, - /* 190 */ 891, 180, 271, 57, 892, 895, 931, 54, 182, 190, - /* 200 */ 154, 927, 51, 819, 71, 272, 192, 191, 269, 301, - /* 210 */ 819, 71, 992, 300, 805, 243, 624, 906, 751, 752, - /* 220 */ 817, 10, 234, 878, 298, 82, 258, 945, 302, 990, - /* 230 */ 891, 757, 627, 58, 892, 895, 931, 256, 186, 906, - /* 240 */ 165, 927, 77, 228, 942, 878, 201, 299, 258, 628, - /* 250 */ 30, 28, 891, 201, 113, 58, 892, 895, 931, 617, - /* 260 */ 221, 958, 165, 927, 1004, 184, 256, 615, 906, 172, - /* 270 */ 629, 235, 230, 965, 878, 304, 878, 258, 12, 272, - /* 280 */ 297, 891, 270, 881, 58, 892, 895, 931, 992, 9, - /* 290 */ 8, 165, 927, 1004, 817, 256, 272, 906, 1, 130, - /* 300 */ 83, 82, 988, 878, 181, 990, 258, 856, 40, 854, - /* 310 */ 891, 817, 112, 58, 892, 895, 931, 273, 21, 813, - /* 320 */ 165, 927, 1004, 30, 28, 698, 272, 663, 189, 183, - /* 330 */ 667, 949, 617, 99, 616, 618, 621, 114, 30, 28, - /* 340 */ 615, 817, 172, 329, 328, 803, 247, 617, 256, 674, - /* 350 */ 906, 12, 722, 83, 140, 615, 878, 172, 161, 258, - /* 360 */ 141, 72, 244, 891, 30, 28, 144, 892, 895, 49, - /* 370 */ 945, 1, 945, 617, 84, 225, 720, 721, 723, 724, - /* 380 */ 810, 615, 226, 172, 304, 992, 7, 941, 6, 940, - /* 390 */ 273, 697, 12, 864, 259, 256, 248, 906, 82, 820, - /* 400 */ 71, 136, 990, 878, 847, 273, 258, 616, 618, 621, - /* 410 */ 891, 240, 1, 59, 892, 895, 931, 256, 107, 906, - /* 420 */ 930, 927, 616, 618, 621, 878, 65, 217, 258, 950, - /* 430 */ 693, 273, 891, 251, 69, 59, 892, 895, 931, 207, - /* 440 */ 244, 83, 254, 927, 213, 961, 63, 211, 616, 618, - /* 450 */ 621, 83, 94, 30, 28, 257, 110, 938, 239, 241, - /* 460 */ 238, 249, 617, 992, 719, 617, 30, 28, 693, 93, - /* 470 */ 615, 60, 172, 615, 246, 617, 82, 104, 907, 256, - /* 480 */ 990, 906, 668, 615, 102, 172, 116, 878, 255, 32, - /* 490 */ 258, 2, 754, 755, 891, 635, 624, 73, 892, 895, - /* 500 */ 252, 7, 32, 696, 607, 9, 8, 30, 28, 185, - /* 510 */ 256, 32, 906, 632, 7, 885, 617, 625, 878, 85, - /* 520 */ 273, 258, 883, 273, 615, 891, 172, 631, 59, 892, - /* 530 */ 895, 931, 214, 273, 245, 1005, 928, 616, 618, 621, - /* 540 */ 616, 618, 621, 197, 198, 256, 199, 906, 39, 653, - /* 550 */ 616, 618, 621, 878, 202, 1, 258, 171, 90, 122, - /* 560 */ 891, 215, 209, 148, 892, 895, 120, 256, 630, 906, - /* 570 */ 264, 134, 160, 127, 273, 878, 558, 67, 258, 222, - /* 580 */ 68, 216, 891, 69, 992, 148, 892, 895, 256, 218, - /* 590 */ 906, 616, 618, 621, 629, 553, 878, 82, 95, 258, - /* 600 */ 962, 990, 60, 891, 586, 133, 147, 892, 895, 590, - /* 610 */ 256, 277, 906, 61, 802, 227, 68, 219, 878, 325, - /* 620 */ 972, 258, 132, 262, 256, 891, 906, 100, 73, 892, - /* 630 */ 895, 621, 878, 224, 971, 258, 169, 236, 256, 891, - /* 640 */ 906, 103, 148, 892, 895, 56, 878, 164, 128, 258, - /* 650 */ 173, 5, 256, 891, 906, 952, 148, 892, 895, 237, - /* 660 */ 878, 75, 106, 258, 301, 223, 1006, 891, 300, 108, - /* 670 */ 146, 892, 895, 240, 268, 4, 220, 64, 256, 96, - /* 680 */ 906, 693, 628, 302, 595, 946, 878, 33, 65, 258, - /* 690 */ 253, 69, 256, 891, 906, 109, 149, 892, 895, 70, - /* 700 */ 878, 989, 299, 258, 1007, 250, 68, 891, 63, 166, - /* 710 */ 142, 892, 895, 256, 17, 906, 115, 242, 78, 938, - /* 720 */ 939, 878, 943, 913, 258, 862, 260, 256, 891, 906, - /* 730 */ 261, 150, 892, 895, 861, 878, 265, 174, 258, 266, - /* 740 */ 124, 256, 891, 906, 267, 143, 892, 895, 48, 878, - /* 750 */ 135, 818, 258, 50, 275, 256, 891, 906, 137, 151, - /* 760 */ 892, 895, 131, 878, 872, 138, 258, 332, 152, 256, - /* 770 */ 891, 906, 153, 903, 892, 895, 139, 878, 778, 871, - /* 780 */ 258, 870, 187, 256, 891, 906, 188, 902, 892, 895, - /* 790 */ 869, 878, 808, 807, 258, 777, 774, 256, 891, 906, - /* 800 */ 768, 901, 892, 895, 763, 878, 868, 859, 258, 87, - /* 810 */ 806, 256, 891, 906, 524, 158, 892, 895, 776, 878, - /* 820 */ 773, 205, 258, 203, 204, 256, 891, 906, 767, 157, - /* 830 */ 892, 895, 766, 878, 762, 761, 258, 210, 760, 867, - /* 840 */ 891, 866, 212, 159, 892, 895, 36, 858, 256, 42, - /* 850 */ 906, 97, 98, 3, 240, 14, 878, 15, 74, 258, - /* 860 */ 101, 105, 256, 891, 906, 43, 156, 892, 895, 65, - /* 870 */ 878, 32, 231, 258, 718, 712, 92, 891, 34, 37, - /* 880 */ 145, 892, 895, 711, 76, 44, 11, 232, 690, 63, - /* 890 */ 206, 883, 689, 91, 19, 45, 20, 111, 745, 80, - /* 900 */ 938, 939, 740, 943, 35, 739, 31, 29, 27, 26, - /* 910 */ 25, 22, 81, 167, 16, 744, 41, 743, 168, 89, - /* 920 */ 8, 31, 29, 27, 26, 25, 118, 636, 13, 31, - /* 930 */ 29, 27, 26, 25, 654, 18, 263, 857, 119, 716, - /* 940 */ 121, 123, 46, 126, 125, 47, 88, 619, 51, 276, - /* 950 */ 86, 179, 38, 280, 882, 579, 587, 129, 278, 274, - /* 960 */ 584, 281, 283, 581, 284, 286, 575, 287, 289, 573, - /* 970 */ 564, 290, 52, 53, 594, 296, 593, 578, 638, 592, - /* 980 */ 303, 577, 522, 543, 576, 542, 541, 536, 540, 539, - /* 990 */ 538, 537, 535, 534, 533, 772, 532, 531, 530, 529, - /* 1000 */ 528, 527, 322, 323, 765, 764, 326, 327, 324, 759, - /* 1010 */ 330, 331, + /* 0 */ 996, 347, 347, 24, 162, 334, 253, 1057, 227, 1049, + /* 10 */ 108, 1115, 1158, 31, 29, 27, 26, 25, 951, 331, + /* 20 */ 347, 1098, 1060, 1060, 103, 64, 962, 31, 29, 27, + /* 30 */ 26, 25, 263, 233, 1051, 973, 1106, 1108, 304, 76, + /* 40 */ 346, 1060, 75, 74, 73, 72, 71, 70, 69, 68, + /* 50 */ 67, 201, 398, 397, 396, 395, 394, 393, 392, 391, + /* 60 */ 390, 389, 388, 387, 386, 385, 384, 383, 382, 381, + /* 70 */ 380, 1130, 1130, 30, 28, 829, 31, 29, 27, 26, + /* 80 */ 25, 224, 346, 808, 76, 852, 42, 75, 74, 73, + /* 90 */ 72, 71, 70, 69, 68, 67, 275, 102, 270, 42, + /* 100 */ 806, 274, 1244, 1056, 273, 1063, 271, 1105, 88, 272, + /* 110 */ 289, 12, 950, 214, 201, 1243, 1055, 815, 1103, 1242, + /* 120 */ 23, 222, 346, 847, 848, 849, 850, 851, 853, 855, + /* 130 */ 856, 857, 807, 254, 1, 10, 86, 85, 84, 83, + /* 140 */ 82, 81, 80, 79, 78, 1132, 290, 303, 852, 747, + /* 150 */ 369, 368, 367, 751, 366, 753, 754, 365, 756, 362, + /* 160 */ 410, 762, 359, 764, 765, 356, 353, 287, 1244, 215, + /* 170 */ 942, 943, 817, 310, 305, 10, 913, 1143, 809, 812, + /* 180 */ 285, 116, 1130, 23, 222, 1242, 847, 848, 849, 850, + /* 190 */ 851, 853, 855, 856, 857, 117, 117, 1158, 300, 911, + /* 200 */ 912, 914, 915, 1132, 331, 31, 29, 27, 26, 25, + /* 210 */ 333, 347, 347, 888, 1130, 1143, 344, 345, 815, 319, + /* 220 */ 105, 1025, 60, 1144, 1147, 1183, 948, 230, 249, 200, + /* 230 */ 1179, 117, 1060, 1060, 347, 1158, 972, 292, 248, 64, + /* 240 */ 1130, 1244, 318, 247, 315, 246, 269, 309, 333, 379, + /* 250 */ 1158, 96, 1130, 1197, 116, 1060, 180, 331, 1242, 1090, + /* 260 */ 61, 1144, 1147, 1183, 243, 91, 1105, 217, 1179, 111, + /* 270 */ 1194, 237, 229, 1130, 245, 244, 308, 1103, 1143, 406, + /* 280 */ 405, 158, 30, 28, 889, 89, 347, 296, 1210, 819, + /* 290 */ 224, 175, 808, 1244, 317, 112, 1190, 1191, 1158, 1195, + /* 300 */ 228, 315, 27, 26, 25, 318, 116, 1060, 102, 806, + /* 310 */ 1242, 333, 51, 1143, 239, 1130, 1062, 58, 1202, 884, + /* 320 */ 12, 818, 91, 61, 1144, 1147, 1183, 92, 1036, 1053, + /* 330 */ 217, 1179, 111, 1158, 1052, 31, 29, 27, 26, 25, + /* 340 */ 331, 807, 89, 1, 887, 267, 333, 232, 1143, 266, + /* 350 */ 1130, 1211, 113, 1190, 1191, 102, 1195, 910, 61, 1144, + /* 360 */ 1147, 1183, 235, 1062, 117, 217, 1179, 1256, 1158, 410, + /* 370 */ 102, 77, 372, 971, 268, 331, 1217, 254, 1062, 1143, + /* 380 */ 1105, 333, 30, 28, 157, 1130, 234, 809, 812, 1035, + /* 390 */ 224, 1103, 808, 61, 1144, 1147, 1183, 829, 347, 1158, + /* 400 */ 217, 1179, 1256, 236, 9, 8, 331, 30, 28, 806, + /* 410 */ 1130, 1240, 333, 30, 28, 224, 1130, 808, 1143, 1060, + /* 420 */ 12, 224, 334, 808, 61, 1144, 1147, 1183, 1116, 1197, + /* 430 */ 808, 217, 1179, 1256, 806, 669, 970, 670, 1158, 669, + /* 440 */ 806, 807, 1201, 1, 1045, 331, 1193, 806, 1047, 376, + /* 450 */ 1105, 333, 261, 375, 969, 1130, 1143, 1034, 671, 21, + /* 460 */ 319, 1107, 322, 190, 1144, 1147, 807, 854, 7, 410, + /* 470 */ 858, 149, 807, 1130, 7, 1105, 1158, 865, 377, 807, + /* 480 */ 57, 6, 1244, 331, 968, 147, 1104, 809, 812, 333, + /* 490 */ 1143, 1130, 53, 1130, 410, 116, 967, 374, 373, 1242, + /* 500 */ 410, 62, 1144, 1147, 1183, 820, 379, 410, 1182, 1179, + /* 510 */ 1158, 315, 809, 812, 30, 28, 332, 331, 809, 812, + /* 520 */ 966, 1130, 224, 333, 808, 809, 812, 1130, 896, 117, + /* 530 */ 965, 964, 91, 1130, 817, 62, 1144, 1147, 1183, 1133, + /* 540 */ 961, 806, 329, 1179, 960, 30, 28, 319, 945, 946, + /* 550 */ 959, 1143, 89, 224, 958, 808, 957, 1130, 131, 9, + /* 560 */ 8, 129, 155, 1190, 314, 413, 313, 1130, 1130, 1244, + /* 570 */ 884, 1158, 806, 807, 956, 7, 1130, 1130, 331, 178, + /* 580 */ 1043, 1130, 116, 87, 333, 955, 1242, 1130, 1130, 402, + /* 590 */ 1143, 1130, 177, 1130, 954, 323, 106, 1144, 1147, 330, + /* 600 */ 144, 410, 953, 126, 807, 326, 1, 110, 1197, 321, + /* 610 */ 1158, 1130, 371, 259, 963, 242, 125, 331, 59, 809, + /* 620 */ 812, 173, 1130, 333, 1026, 1192, 133, 1130, 1143, 132, + /* 630 */ 159, 1130, 410, 320, 1257, 62, 1144, 1147, 1183, 1130, + /* 640 */ 991, 135, 43, 1180, 134, 123, 137, 301, 1158, 136, + /* 650 */ 809, 812, 1143, 859, 343, 331, 986, 295, 152, 324, + /* 660 */ 141, 333, 276, 1143, 185, 1130, 984, 32, 223, 187, + /* 670 */ 844, 327, 1158, 196, 1144, 1147, 1099, 826, 278, 331, + /* 680 */ 122, 186, 104, 1158, 120, 333, 1143, 260, 281, 1130, + /* 690 */ 331, 32, 297, 1137, 118, 1213, 333, 196, 1144, 1147, + /* 700 */ 1130, 1143, 316, 798, 167, 1159, 1158, 1135, 195, 1144, + /* 710 */ 1147, 1033, 339, 331, 161, 172, 1143, 32, 165, 333, + /* 720 */ 2, 1158, 250, 1130, 238, 815, 93, 823, 331, 94, + /* 730 */ 119, 106, 1144, 1147, 333, 816, 1158, 1143, 1130, 311, + /* 740 */ 251, 221, 252, 331, 740, 735, 196, 1144, 1147, 333, + /* 750 */ 822, 41, 1143, 1130, 255, 124, 225, 1158, 96, 77, + /* 760 */ 821, 196, 1144, 1147, 331, 262, 264, 768, 1143, 1258, + /* 770 */ 333, 376, 1158, 772, 1130, 375, 778, 1050, 777, 331, + /* 780 */ 117, 351, 194, 1144, 1147, 333, 66, 94, 1158, 1130, + /* 790 */ 95, 1143, 96, 128, 97, 331, 1143, 197, 1144, 1147, + /* 800 */ 377, 333, 1046, 291, 130, 1130, 98, 1143, 94, 99, + /* 810 */ 1048, 1158, 1143, 188, 1144, 1147, 1158, 1044, 331, 374, + /* 820 */ 373, 140, 100, 331, 333, 101, 213, 1158, 1130, 333, + /* 830 */ 820, 1214, 1158, 1130, 331, 293, 198, 1144, 1147, 331, + /* 840 */ 333, 189, 1144, 1147, 1130, 333, 1224, 1143, 294, 1130, + /* 850 */ 1143, 302, 199, 1144, 1147, 337, 145, 1155, 1144, 1147, + /* 860 */ 812, 148, 299, 216, 298, 5, 1204, 1158, 1223, 312, + /* 870 */ 1158, 4, 884, 90, 331, 819, 151, 331, 109, 1198, + /* 880 */ 333, 33, 153, 333, 1130, 1143, 154, 1130, 218, 328, + /* 890 */ 17, 1241, 1154, 1144, 1147, 1153, 1144, 1147, 1259, 325, + /* 900 */ 1143, 160, 1165, 340, 1114, 1158, 335, 169, 336, 50, + /* 910 */ 341, 1113, 331, 226, 1061, 342, 1143, 179, 333, 52, + /* 920 */ 1158, 1143, 1130, 315, 181, 176, 409, 331, 191, 349, + /* 930 */ 204, 1144, 1147, 333, 183, 184, 1158, 1130, 1124, 192, + /* 940 */ 999, 1158, 1123, 331, 91, 203, 1144, 1147, 331, 333, + /* 950 */ 1122, 240, 1143, 1130, 333, 241, 1121, 208, 1130, 1039, + /* 960 */ 1038, 205, 1144, 1147, 89, 998, 202, 1144, 1147, 1000, + /* 970 */ 995, 983, 1158, 121, 114, 1190, 1191, 280, 1195, 331, + /* 980 */ 978, 1120, 267, 1111, 1037, 333, 266, 684, 997, 1130, + /* 990 */ 994, 256, 288, 258, 257, 982, 981, 193, 1144, 1147, + /* 1000 */ 209, 977, 207, 206, 1041, 265, 139, 65, 127, 781, + /* 1010 */ 283, 268, 1040, 783, 782, 277, 713, 712, 711, 138, + /* 1020 */ 992, 275, 210, 270, 710, 709, 274, 987, 708, 273, + /* 1030 */ 211, 271, 279, 985, 272, 212, 282, 976, 284, 975, + /* 1040 */ 286, 63, 1119, 1118, 1110, 38, 36, 142, 37, 44, + /* 1050 */ 3, 20, 32, 143, 14, 39, 146, 15, 306, 34, + /* 1060 */ 307, 31, 29, 27, 26, 25, 22, 909, 903, 47, + /* 1070 */ 11, 107, 150, 931, 930, 45, 31, 29, 27, 26, + /* 1080 */ 25, 902, 46, 8, 881, 880, 219, 935, 1109, 934, + /* 1090 */ 220, 993, 1135, 980, 19, 949, 936, 170, 827, 164, + /* 1100 */ 350, 156, 13, 35, 115, 18, 231, 354, 357, 360, + /* 1110 */ 907, 16, 845, 163, 166, 363, 53, 746, 168, 48, + /* 1120 */ 774, 704, 776, 775, 348, 49, 400, 1134, 769, 40, + /* 1130 */ 352, 399, 766, 355, 401, 378, 763, 757, 682, 358, + /* 1140 */ 171, 338, 174, 703, 361, 702, 755, 364, 701, 700, + /* 1150 */ 699, 698, 54, 55, 697, 56, 696, 705, 695, 694, + /* 1160 */ 761, 693, 692, 691, 690, 689, 403, 370, 688, 687, + /* 1170 */ 404, 979, 974, 407, 760, 408, 759, 810, 758, 182, + /* 1180 */ 411, 412, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 158, 163, 146, 165, 146, 160, 146, 149, 163, 149, - /* 10 */ 165, 169, 12, 13, 14, 15, 16, 161, 176, 161, - /* 20 */ 158, 161, 161, 150, 163, 12, 13, 14, 15, 16, - /* 30 */ 0, 169, 148, 14, 145, 162, 163, 181, 176, 155, - /* 40 */ 40, 180, 153, 159, 161, 156, 163, 191, 192, 193, - /* 50 */ 31, 195, 169, 40, 168, 172, 21, 171, 172, 176, - /* 60 */ 21, 61, 179, 180, 181, 182, 31, 32, 29, 186, - /* 70 */ 187, 188, 42, 43, 44, 45, 46, 47, 48, 49, - /* 80 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, - /* 90 */ 207, 14, 15, 16, 12, 13, 14, 15, 16, 99, - /* 100 */ 100, 31, 102, 103, 104, 105, 106, 107, 108, 109, - /* 110 */ 110, 111, 99, 100, 31, 102, 103, 104, 105, 106, - /* 120 */ 107, 108, 109, 110, 111, 12, 13, 14, 15, 16, - /* 130 */ 60, 42, 43, 44, 45, 46, 47, 48, 49, 50, - /* 140 */ 51, 52, 53, 54, 55, 56, 57, 58, 70, 71, - /* 150 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 0, - /* 160 */ 82, 83, 84, 85, 86, 87, 183, 184, 161, 26, - /* 170 */ 163, 198, 31, 30, 31, 161, 160, 163, 35, 163, - /* 180 */ 37, 165, 115, 169, 211, 115, 172, 180, 215, 175, - /* 190 */ 176, 150, 31, 179, 180, 181, 182, 60, 150, 56, - /* 200 */ 186, 187, 65, 162, 163, 146, 63, 64, 149, 50, - /* 210 */ 162, 163, 198, 54, 0, 161, 31, 163, 136, 137, - /* 220 */ 161, 60, 31, 169, 66, 211, 172, 177, 69, 215, - /* 230 */ 176, 141, 31, 179, 180, 181, 182, 161, 95, 163, - /* 240 */ 186, 187, 188, 92, 194, 169, 39, 88, 172, 31, - /* 250 */ 12, 13, 176, 39, 200, 179, 180, 181, 182, 21, - /* 260 */ 206, 207, 186, 187, 188, 175, 161, 29, 163, 31, - /* 270 */ 31, 120, 121, 197, 169, 39, 169, 172, 40, 146, - /* 280 */ 164, 176, 149, 176, 179, 180, 181, 182, 198, 1, - /* 290 */ 2, 186, 187, 188, 161, 161, 146, 163, 60, 149, - /* 300 */ 115, 211, 197, 169, 160, 215, 172, 163, 148, 165, - /* 310 */ 176, 161, 94, 179, 180, 181, 182, 79, 99, 159, - /* 320 */ 186, 187, 188, 12, 13, 14, 146, 108, 146, 149, - /* 330 */ 111, 197, 21, 94, 96, 97, 98, 218, 12, 13, - /* 340 */ 29, 161, 31, 143, 144, 0, 3, 21, 161, 61, - /* 350 */ 163, 40, 101, 115, 18, 29, 169, 31, 22, 172, - /* 360 */ 24, 25, 175, 176, 12, 13, 179, 180, 181, 145, - /* 370 */ 177, 60, 177, 21, 38, 124, 125, 126, 127, 128, - /* 380 */ 156, 29, 209, 31, 39, 198, 60, 194, 34, 194, - /* 390 */ 79, 4, 40, 171, 172, 161, 68, 163, 211, 162, - /* 400 */ 163, 151, 215, 169, 154, 79, 172, 96, 97, 98, - /* 410 */ 176, 146, 60, 179, 180, 181, 182, 161, 203, 163, - /* 420 */ 186, 187, 96, 97, 98, 169, 161, 61, 172, 113, - /* 430 */ 114, 79, 176, 68, 68, 179, 180, 181, 182, 143, - /* 440 */ 175, 115, 186, 187, 20, 178, 181, 23, 96, 97, - /* 450 */ 98, 115, 19, 12, 13, 14, 191, 192, 193, 196, - /* 460 */ 195, 133, 21, 198, 61, 21, 12, 13, 114, 36, - /* 470 */ 29, 68, 31, 29, 131, 21, 211, 61, 163, 161, - /* 480 */ 215, 163, 61, 29, 68, 31, 212, 169, 40, 68, - /* 490 */ 172, 199, 139, 140, 176, 61, 31, 179, 180, 181, - /* 500 */ 135, 60, 68, 116, 61, 1, 2, 12, 13, 146, - /* 510 */ 161, 68, 163, 31, 60, 60, 21, 31, 169, 148, - /* 520 */ 79, 172, 67, 79, 29, 176, 31, 31, 179, 180, - /* 530 */ 181, 182, 146, 79, 216, 217, 187, 96, 97, 98, - /* 540 */ 96, 97, 98, 174, 161, 161, 166, 163, 148, 101, - /* 550 */ 96, 97, 98, 169, 146, 60, 172, 173, 148, 61, - /* 560 */ 176, 175, 142, 179, 180, 181, 68, 161, 31, 163, - /* 570 */ 61, 146, 142, 61, 79, 169, 61, 68, 172, 173, - /* 580 */ 68, 174, 176, 68, 198, 179, 180, 181, 161, 161, - /* 590 */ 163, 96, 97, 98, 31, 61, 169, 211, 145, 172, - /* 600 */ 178, 215, 68, 176, 61, 19, 179, 180, 181, 61, - /* 610 */ 161, 68, 163, 27, 0, 123, 68, 166, 169, 33, - /* 620 */ 208, 172, 36, 122, 161, 176, 163, 170, 179, 180, - /* 630 */ 181, 98, 169, 169, 208, 172, 173, 210, 161, 176, - /* 640 */ 163, 170, 179, 180, 181, 59, 169, 169, 62, 172, - /* 650 */ 173, 130, 161, 176, 163, 205, 179, 180, 181, 129, - /* 660 */ 169, 202, 204, 172, 50, 118, 217, 176, 54, 201, - /* 670 */ 179, 180, 181, 146, 88, 117, 90, 161, 161, 93, - /* 680 */ 163, 114, 31, 69, 61, 177, 169, 112, 161, 172, - /* 690 */ 134, 68, 161, 176, 163, 189, 179, 180, 181, 61, - /* 700 */ 169, 214, 88, 172, 219, 132, 68, 176, 181, 138, - /* 710 */ 179, 180, 181, 161, 60, 163, 213, 190, 191, 192, - /* 720 */ 193, 169, 195, 185, 172, 170, 169, 161, 176, 163, - /* 730 */ 169, 179, 180, 181, 170, 169, 91, 169, 172, 167, - /* 740 */ 161, 161, 176, 163, 166, 179, 180, 181, 145, 169, - /* 750 */ 154, 161, 172, 60, 157, 161, 176, 163, 146, 179, - /* 760 */ 180, 181, 145, 169, 0, 147, 172, 142, 152, 161, - /* 770 */ 176, 163, 152, 179, 180, 181, 147, 169, 0, 0, - /* 780 */ 172, 0, 56, 161, 176, 163, 67, 179, 180, 181, - /* 790 */ 0, 169, 0, 0, 172, 0, 0, 161, 176, 163, - /* 800 */ 0, 179, 180, 181, 0, 169, 0, 0, 172, 34, - /* 810 */ 0, 161, 176, 163, 41, 179, 180, 181, 0, 169, - /* 820 */ 0, 34, 172, 29, 27, 161, 176, 163, 0, 179, - /* 830 */ 180, 181, 0, 169, 0, 0, 172, 21, 0, 0, - /* 840 */ 176, 0, 21, 179, 180, 181, 94, 0, 161, 60, - /* 850 */ 163, 34, 89, 68, 146, 119, 169, 119, 60, 172, - /* 860 */ 61, 60, 161, 176, 163, 60, 179, 180, 181, 161, - /* 870 */ 169, 68, 29, 172, 61, 61, 19, 176, 113, 68, - /* 880 */ 179, 180, 181, 61, 27, 60, 119, 68, 61, 181, - /* 890 */ 33, 67, 61, 36, 68, 4, 2, 67, 61, 191, - /* 900 */ 192, 193, 29, 195, 68, 29, 12, 13, 14, 15, - /* 910 */ 16, 2, 67, 29, 68, 29, 59, 29, 29, 62, - /* 920 */ 2, 12, 13, 14, 15, 16, 67, 61, 60, 12, - /* 930 */ 13, 14, 15, 16, 101, 60, 92, 0, 61, 61, - /* 940 */ 60, 60, 60, 89, 34, 60, 89, 21, 65, 29, - /* 950 */ 93, 29, 60, 29, 67, 81, 61, 67, 60, 66, - /* 960 */ 61, 60, 29, 61, 60, 29, 61, 60, 29, 61, - /* 970 */ 21, 60, 60, 60, 29, 69, 29, 81, 61, 21, - /* 980 */ 40, 81, 41, 29, 81, 29, 29, 21, 29, 29, - /* 990 */ 29, 29, 29, 29, 29, 0, 29, 29, 29, 29, - /* 1000 */ 29, 29, 29, 27, 0, 0, 29, 28, 34, 0, - /* 1010 */ 21, 20, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1020 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1030 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1040 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1050 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1060 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1070 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1080 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1090 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1100 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1110 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1120 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1130 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1140 */ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - /* 1150 */ 220, 220, 220, + /* 0 */ 0, 169, 169, 212, 213, 196, 174, 174, 199, 184, + /* 10 */ 182, 202, 183, 12, 13, 14, 15, 16, 0, 190, + /* 20 */ 169, 193, 190, 190, 162, 174, 164, 12, 13, 14, + /* 30 */ 15, 16, 181, 192, 163, 163, 195, 196, 209, 21, + /* 40 */ 20, 190, 24, 25, 26, 27, 28, 29, 30, 31, + /* 50 */ 32, 50, 52, 53, 54, 55, 56, 57, 58, 59, + /* 60 */ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + /* 70 */ 70, 200, 200, 12, 13, 74, 12, 13, 14, 15, + /* 80 */ 16, 20, 20, 22, 21, 84, 171, 24, 25, 26, + /* 90 */ 27, 28, 29, 30, 31, 32, 52, 183, 54, 171, + /* 100 */ 39, 57, 227, 188, 60, 191, 62, 183, 180, 65, + /* 110 */ 169, 50, 0, 189, 50, 240, 188, 20, 194, 244, + /* 120 */ 119, 120, 20, 122, 123, 124, 125, 126, 127, 128, + /* 130 */ 129, 130, 71, 49, 73, 73, 24, 25, 26, 27, + /* 140 */ 28, 29, 30, 31, 32, 163, 205, 113, 84, 90, + /* 150 */ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + /* 160 */ 99, 102, 103, 104, 105, 106, 107, 21, 227, 187, + /* 170 */ 155, 156, 20, 139, 140, 73, 121, 163, 117, 118, + /* 180 */ 34, 240, 200, 119, 120, 244, 122, 123, 124, 125, + /* 190 */ 126, 127, 128, 129, 130, 134, 134, 183, 143, 144, + /* 200 */ 145, 146, 147, 163, 190, 12, 13, 14, 15, 16, + /* 210 */ 196, 169, 169, 4, 200, 163, 174, 174, 20, 205, + /* 220 */ 172, 173, 208, 209, 210, 211, 160, 187, 30, 215, + /* 230 */ 216, 134, 190, 190, 169, 183, 163, 74, 40, 174, + /* 240 */ 200, 227, 190, 45, 169, 47, 181, 20, 196, 49, + /* 250 */ 183, 88, 200, 206, 240, 190, 176, 190, 244, 179, + /* 260 */ 208, 209, 210, 211, 66, 190, 183, 215, 216, 217, + /* 270 */ 223, 205, 189, 200, 76, 77, 209, 194, 163, 166, + /* 280 */ 167, 229, 12, 13, 14, 210, 169, 235, 236, 20, + /* 290 */ 20, 174, 22, 227, 219, 220, 221, 222, 183, 224, + /* 300 */ 175, 169, 14, 15, 16, 190, 240, 190, 183, 39, + /* 310 */ 244, 196, 168, 163, 116, 200, 191, 168, 132, 133, + /* 320 */ 50, 20, 190, 208, 209, 210, 211, 178, 0, 185, + /* 330 */ 215, 216, 217, 183, 185, 12, 13, 14, 15, 16, + /* 340 */ 190, 71, 210, 73, 135, 60, 196, 175, 163, 64, + /* 350 */ 200, 236, 220, 221, 222, 183, 224, 74, 208, 209, + /* 360 */ 210, 211, 175, 191, 134, 215, 216, 217, 183, 99, + /* 370 */ 183, 88, 86, 163, 89, 190, 226, 49, 191, 163, + /* 380 */ 183, 196, 12, 13, 115, 200, 189, 117, 118, 0, + /* 390 */ 20, 194, 22, 208, 209, 210, 211, 74, 169, 183, + /* 400 */ 215, 216, 217, 174, 1, 2, 190, 12, 13, 39, + /* 410 */ 200, 226, 196, 12, 13, 20, 200, 22, 163, 190, + /* 420 */ 50, 20, 196, 22, 208, 209, 210, 211, 202, 206, + /* 430 */ 22, 215, 216, 217, 39, 22, 163, 20, 183, 22, + /* 440 */ 39, 71, 226, 73, 184, 190, 223, 39, 184, 60, + /* 450 */ 183, 196, 39, 64, 163, 200, 163, 0, 41, 119, + /* 460 */ 205, 194, 3, 208, 209, 210, 71, 127, 73, 99, + /* 470 */ 130, 74, 71, 200, 73, 183, 183, 74, 89, 71, + /* 480 */ 73, 44, 227, 190, 163, 88, 194, 117, 118, 196, + /* 490 */ 163, 200, 85, 200, 99, 240, 163, 108, 109, 244, + /* 500 */ 99, 208, 209, 210, 211, 20, 49, 99, 215, 216, + /* 510 */ 183, 169, 117, 118, 12, 13, 14, 190, 117, 118, + /* 520 */ 163, 200, 20, 196, 22, 117, 118, 200, 14, 134, + /* 530 */ 163, 163, 190, 200, 20, 208, 209, 210, 211, 163, + /* 540 */ 163, 39, 215, 216, 163, 12, 13, 205, 158, 159, + /* 550 */ 163, 163, 210, 20, 163, 22, 163, 200, 79, 1, + /* 560 */ 2, 82, 220, 221, 222, 19, 224, 200, 200, 227, + /* 570 */ 133, 183, 39, 71, 163, 73, 200, 200, 190, 33, + /* 580 */ 184, 200, 240, 37, 196, 163, 244, 200, 200, 43, + /* 590 */ 163, 200, 46, 200, 163, 88, 208, 209, 210, 50, + /* 600 */ 115, 99, 163, 33, 71, 88, 73, 37, 206, 150, + /* 610 */ 183, 200, 184, 43, 164, 169, 46, 190, 72, 117, + /* 620 */ 118, 75, 200, 196, 173, 223, 79, 200, 163, 82, + /* 630 */ 247, 200, 99, 245, 246, 208, 209, 210, 211, 200, + /* 640 */ 0, 79, 72, 216, 82, 75, 79, 238, 183, 82, + /* 650 */ 117, 118, 163, 74, 108, 190, 0, 111, 232, 152, + /* 660 */ 114, 196, 22, 163, 18, 200, 0, 88, 203, 23, + /* 670 */ 121, 154, 183, 208, 209, 210, 193, 74, 22, 190, + /* 680 */ 110, 35, 36, 183, 114, 196, 163, 166, 22, 200, + /* 690 */ 190, 88, 203, 73, 48, 207, 196, 208, 209, 210, + /* 700 */ 200, 163, 225, 74, 74, 183, 183, 87, 208, 209, + /* 710 */ 210, 0, 74, 190, 241, 74, 163, 88, 88, 196, + /* 720 */ 228, 183, 204, 200, 169, 20, 88, 20, 190, 88, + /* 730 */ 171, 208, 209, 210, 196, 20, 183, 163, 200, 239, + /* 740 */ 190, 203, 197, 190, 74, 74, 208, 209, 210, 196, + /* 750 */ 20, 171, 163, 200, 169, 171, 203, 183, 88, 88, + /* 760 */ 20, 208, 209, 210, 190, 165, 183, 74, 163, 246, + /* 770 */ 196, 60, 183, 74, 200, 64, 74, 183, 74, 190, + /* 780 */ 134, 88, 208, 209, 210, 196, 169, 88, 183, 200, + /* 790 */ 88, 163, 88, 183, 74, 190, 163, 208, 209, 210, + /* 800 */ 89, 196, 183, 204, 183, 200, 183, 163, 88, 183, + /* 810 */ 183, 183, 163, 208, 209, 210, 183, 183, 190, 108, + /* 820 */ 109, 168, 183, 190, 196, 183, 165, 183, 200, 196, + /* 830 */ 20, 207, 183, 200, 190, 190, 208, 209, 210, 190, + /* 840 */ 196, 208, 209, 210, 200, 196, 237, 163, 197, 200, + /* 850 */ 163, 142, 208, 209, 210, 141, 201, 208, 209, 210, + /* 860 */ 118, 201, 200, 200, 137, 149, 234, 183, 237, 148, + /* 870 */ 183, 136, 133, 190, 190, 20, 233, 190, 231, 206, + /* 880 */ 196, 131, 230, 196, 200, 163, 218, 200, 157, 153, + /* 890 */ 73, 243, 208, 209, 210, 208, 209, 210, 248, 151, + /* 900 */ 163, 242, 214, 112, 201, 183, 200, 190, 200, 168, + /* 910 */ 198, 201, 190, 200, 190, 197, 163, 179, 196, 73, + /* 920 */ 183, 163, 200, 169, 169, 168, 165, 190, 177, 186, + /* 930 */ 208, 209, 210, 196, 170, 161, 183, 200, 0, 177, + /* 940 */ 0, 183, 0, 190, 190, 208, 209, 210, 190, 196, + /* 950 */ 0, 66, 163, 200, 196, 87, 0, 35, 200, 0, + /* 960 */ 0, 208, 209, 210, 210, 0, 208, 209, 210, 0, + /* 970 */ 0, 0, 183, 44, 220, 221, 222, 4, 224, 190, + /* 980 */ 0, 0, 60, 0, 0, 196, 64, 51, 0, 200, + /* 990 */ 0, 39, 19, 44, 37, 0, 0, 208, 209, 210, + /* 1000 */ 78, 0, 80, 81, 0, 83, 33, 84, 82, 22, + /* 1010 */ 37, 89, 0, 39, 39, 42, 39, 39, 39, 46, + /* 1020 */ 0, 52, 22, 54, 39, 39, 57, 0, 39, 60, + /* 1030 */ 22, 62, 40, 0, 65, 22, 39, 0, 22, 0, + /* 1040 */ 22, 20, 0, 0, 0, 72, 115, 44, 75, 73, + /* 1050 */ 88, 2, 88, 110, 138, 88, 74, 138, 39, 132, + /* 1060 */ 88, 12, 13, 14, 15, 16, 2, 74, 74, 4, + /* 1070 */ 138, 73, 73, 39, 39, 73, 12, 13, 14, 15, + /* 1080 */ 16, 74, 73, 2, 74, 74, 39, 39, 0, 39, + /* 1090 */ 39, 0, 87, 0, 88, 249, 74, 44, 74, 74, + /* 1100 */ 39, 87, 73, 88, 87, 73, 39, 39, 39, 39, + /* 1110 */ 74, 88, 121, 87, 73, 39, 85, 22, 73, 73, + /* 1120 */ 22, 22, 39, 39, 86, 73, 37, 87, 74, 73, + /* 1130 */ 73, 39, 74, 73, 44, 50, 74, 74, 51, 73, + /* 1140 */ 110, 113, 87, 39, 73, 39, 74, 73, 39, 39, + /* 1150 */ 39, 39, 73, 73, 39, 73, 22, 71, 39, 39, + /* 1160 */ 101, 39, 39, 39, 39, 39, 39, 89, 39, 39, + /* 1170 */ 38, 0, 0, 22, 101, 21, 101, 22, 101, 22, + /* 1180 */ 21, 20, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1190 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1200 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1210 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1220 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1230 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1240 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1250 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1260 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1270 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1280 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1290 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1300 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1310 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1320 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1330 */ 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + /* 1340 */ 249, 249, }; -#define YY_SHIFT_COUNT (332) +#define YY_SHIFT_COUNT (413) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1009) +#define YY_SHIFT_MAX (1172) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 336, 238, 311, 352, 352, 352, 352, 326, 352, 352, - /* 10 */ 70, 454, 495, 441, 454, 454, 454, 454, 454, 454, - /* 20 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 30 */ 454, 454, 454, 161, 161, 161, 185, 444, 444, 83, - /* 40 */ 83, 207, 141, 191, 191, 67, 201, 141, 83, 83, - /* 50 */ 141, 83, 141, 141, 141, 83, 236, 0, 13, 13, - /* 60 */ 444, 35, 214, 218, 218, 218, 345, 201, 141, 141, - /* 70 */ 158, 78, 143, 82, 251, 151, 39, 239, 316, 354, - /* 80 */ 316, 19, 343, 387, 465, 482, 207, 486, 496, 207, - /* 90 */ 465, 207, 537, 465, 537, 482, 236, 486, 496, 563, - /* 100 */ 492, 501, 533, 492, 501, 533, 521, 530, 547, 558, - /* 110 */ 567, 486, 651, 575, 571, 556, 573, 654, 141, 501, - /* 120 */ 533, 533, 501, 533, 645, 486, 496, 158, 236, 486, - /* 130 */ 693, 465, 236, 537, 1012, 1012, 1012, 1012, 30, 89, - /* 140 */ 586, 857, 894, 909, 917, 113, 113, 113, 113, 113, - /* 150 */ 113, 113, 159, 614, 288, 219, 77, 77, 77, 77, - /* 160 */ 424, 433, 366, 403, 416, 504, 353, 328, 365, 421, - /* 170 */ 448, 434, 455, 443, 498, 509, 512, 515, 534, 543, - /* 180 */ 548, 623, 638, 137, 764, 778, 779, 781, 726, 719, - /* 190 */ 790, 792, 793, 795, 796, 800, 804, 806, 807, 775, - /* 200 */ 810, 773, 818, 820, 794, 797, 787, 828, 832, 834, - /* 210 */ 835, 816, 838, 821, 839, 841, 752, 847, 789, 817, - /* 220 */ 763, 785, 803, 736, 799, 811, 813, 798, 801, 814, - /* 230 */ 805, 822, 843, 819, 824, 825, 826, 738, 827, 831, - /* 240 */ 830, 765, 836, 845, 837, 846, 767, 891, 873, 876, - /* 250 */ 884, 886, 888, 889, 918, 833, 859, 866, 868, 875, - /* 260 */ 877, 878, 880, 881, 844, 882, 937, 910, 854, 885, - /* 270 */ 883, 887, 890, 926, 892, 893, 895, 920, 922, 898, - /* 280 */ 899, 924, 901, 902, 933, 904, 905, 936, 907, 908, - /* 290 */ 939, 911, 874, 896, 900, 903, 949, 906, 912, 913, - /* 300 */ 945, 947, 958, 941, 940, 954, 956, 957, 959, 960, - /* 310 */ 961, 962, 966, 963, 964, 965, 967, 968, 969, 970, - /* 320 */ 971, 972, 995, 973, 976, 974, 1004, 977, 979, 1005, - /* 330 */ 1009, 989, 991, + /* 0 */ 646, 61, 270, 370, 370, 370, 370, 395, 370, 370, + /* 10 */ 62, 401, 533, 502, 401, 401, 401, 401, 401, 401, + /* 20 */ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, + /* 30 */ 401, 401, 401, 102, 102, 102, 97, 20, 20, 408, + /* 40 */ 408, 20, 20, 84, 152, 227, 227, 230, 301, 152, + /* 50 */ 20, 20, 152, 20, 152, 301, 152, 152, 20, 200, + /* 60 */ 1, 64, 64, 63, 922, 408, 44, 408, 408, 408, + /* 70 */ 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, + /* 80 */ 408, 408, 408, 408, 408, 408, 408, 417, 328, 269, + /* 90 */ 269, 269, 457, 301, 152, 152, 152, 286, 59, 59, + /* 100 */ 59, 59, 59, 18, 198, 969, 15, 55, 285, 34, + /* 110 */ 413, 485, 186, 437, 186, 514, 459, 209, 705, 707, + /* 120 */ 84, 715, 730, 84, 705, 84, 740, 152, 152, 152, + /* 130 */ 152, 152, 152, 152, 152, 152, 152, 152, 705, 740, + /* 140 */ 707, 200, 715, 730, 810, 709, 714, 742, 709, 714, + /* 150 */ 742, 716, 721, 727, 735, 739, 715, 855, 750, 731, + /* 160 */ 736, 748, 817, 152, 714, 742, 742, 714, 742, 791, + /* 170 */ 715, 730, 286, 200, 715, 846, 705, 200, 740, 1182, + /* 180 */ 1182, 1182, 1182, 0, 112, 546, 570, 973, 1049, 1064, + /* 190 */ 323, 389, 711, 193, 193, 193, 193, 193, 193, 193, + /* 200 */ 403, 340, 288, 288, 288, 288, 479, 547, 562, 567, + /* 210 */ 640, 656, 666, 146, 163, 283, 397, 558, 390, 507, + /* 220 */ 517, 579, 549, 603, 620, 629, 630, 638, 641, 670, + /* 230 */ 671, 693, 699, 702, 704, 720, 407, 938, 940, 942, + /* 240 */ 950, 885, 868, 956, 959, 960, 965, 970, 971, 980, + /* 250 */ 981, 983, 929, 984, 936, 988, 990, 952, 957, 949, + /* 260 */ 995, 996, 1001, 1004, 923, 926, 974, 975, 987, 1012, + /* 270 */ 977, 978, 979, 985, 986, 989, 1020, 1000, 1027, 1008, + /* 280 */ 992, 1033, 1013, 997, 1037, 1016, 1039, 1018, 1021, 1042, + /* 290 */ 1043, 931, 1044, 976, 1003, 943, 962, 964, 916, 982, + /* 300 */ 967, 993, 998, 999, 994, 1002, 1007, 1019, 972, 1005, + /* 310 */ 1009, 1006, 919, 1010, 1011, 1014, 927, 1015, 1017, 1022, + /* 320 */ 1023, 932, 1065, 1034, 1035, 1047, 1048, 1050, 1051, 1081, + /* 330 */ 991, 1026, 1024, 1029, 1032, 1025, 1036, 1041, 1045, 1028, + /* 340 */ 1046, 1088, 1053, 1030, 1052, 1031, 1040, 1055, 1056, 1038, + /* 350 */ 1054, 1061, 1067, 1057, 1058, 1068, 1060, 1062, 1069, 1066, + /* 360 */ 1063, 1070, 1071, 1072, 1076, 1074, 1059, 1073, 1075, 1077, + /* 370 */ 1095, 1078, 1079, 1080, 1082, 1083, 1084, 1098, 1087, 1085, + /* 380 */ 1086, 1099, 1104, 1106, 1109, 1110, 1111, 1112, 1115, 1134, + /* 390 */ 1119, 1120, 1122, 1123, 1124, 1125, 1126, 1129, 1130, 1091, + /* 400 */ 1092, 1089, 1090, 1093, 1127, 1132, 1171, 1172, 1151, 1154, + /* 410 */ 1155, 1157, 1159, 1161, }; -#define YY_REDUCE_COUNT (137) -#define YY_REDUCE_MIN (-162) -#define YY_REDUCE_MAX (708) +#define YY_REDUCE_COUNT (182) +#define YY_REDUCE_MIN (-209) +#define YY_REDUCE_MAX (789) static const short yy_reduce_ofst[] = { - /* 0 */ 90, 14, 54, -117, 76, 105, 134, 187, 234, 256, - /* 10 */ 265, 318, 349, 384, 406, 427, 449, 463, 477, 491, - /* 20 */ 517, 531, 552, 566, 580, 594, 608, 622, 636, 650, - /* 30 */ 664, 687, 701, 527, -144, 708, 386, -158, -138, -142, - /* 40 */ -140, -116, -155, -139, 7, -27, -114, -127, 59, 133, - /* 50 */ 16, 150, 41, 144, 48, 180, -111, -17, -17, -17, - /* 60 */ 107, 200, 160, 50, 193, 195, 224, 222, 237, -162, - /* 70 */ 250, 116, 182, 119, 173, 215, 296, 267, 263, 263, - /* 80 */ 263, 315, 274, 292, 363, 369, 371, 383, 380, 400, - /* 90 */ 408, 410, 420, 425, 430, 407, 453, 428, 451, 422, - /* 100 */ 412, 457, 464, 426, 471, 478, 450, 458, 459, 468, - /* 110 */ 263, 516, 508, 506, 485, 487, 503, 538, 315, 555, - /* 120 */ 557, 561, 564, 568, 572, 579, 578, 596, 603, 590, - /* 130 */ 597, 612, 617, 625, 618, 616, 620, 629, + /* 0 */ 66, 14, 52, 115, 150, 185, 216, 255, 293, 327, + /* 10 */ 342, 388, 427, 465, 489, 500, 523, 538, 553, 574, + /* 20 */ 589, 605, 628, 633, 644, 649, 684, 687, 722, 737, + /* 30 */ 753, 758, 789, 75, 132, 754, -59, -149, 65, -18, + /* 40 */ 40, -168, -167, -72, -76, -171, 67, -125, -191, 125, + /* 50 */ 42, 43, 83, 117, 172, -159, 197, 187, 229, 149, + /* 60 */ -209, -209, -209, -138, -172, -129, 48, -128, 73, 210, + /* 70 */ 273, 291, 321, 333, 357, 367, 368, 376, 377, 381, + /* 80 */ 387, 391, 393, 411, 422, 431, 439, 113, -85, 47, + /* 90 */ 223, 402, 144, 226, -86, 267, 292, 80, -175, 260, + /* 100 */ 264, 396, 428, 450, 446, 451, 383, 409, 483, 426, + /* 110 */ 521, 488, 477, 477, 477, 522, 473, 492, 555, 518, + /* 120 */ 559, 550, 545, 580, 585, 584, 600, 583, 594, 610, + /* 130 */ 619, 621, 623, 626, 627, 634, 639, 642, 617, 661, + /* 140 */ 599, 653, 645, 651, 624, 609, 655, 662, 631, 660, + /* 150 */ 663, 632, 643, 647, 652, 477, 683, 673, 668, 650, + /* 160 */ 648, 659, 688, 522, 703, 706, 708, 710, 713, 712, + /* 170 */ 717, 718, 738, 741, 724, 743, 755, 757, 761, 751, + /* 180 */ 762, 764, 774, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 10 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 20 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 30 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 40 */ 756, 783, 756, 756, 756, 756, 756, 756, 756, 756, - /* 50 */ 756, 756, 756, 756, 756, 756, 781, 756, 933, 756, - /* 60 */ 756, 756, 783, 944, 944, 944, 781, 756, 756, 756, - /* 70 */ 846, 756, 756, 1008, 756, 968, 756, 960, 936, 950, - /* 80 */ 937, 756, 993, 953, 756, 756, 783, 756, 756, 783, - /* 90 */ 756, 783, 756, 756, 756, 756, 781, 756, 756, 756, - /* 100 */ 975, 973, 756, 975, 973, 756, 987, 983, 966, 964, - /* 110 */ 950, 756, 756, 756, 1011, 999, 995, 756, 756, 973, - /* 120 */ 756, 756, 973, 756, 860, 756, 756, 756, 781, 756, - /* 130 */ 815, 756, 781, 756, 784, 849, 849, 784, 756, 756, - /* 140 */ 756, 756, 756, 756, 756, 905, 986, 985, 904, 910, - /* 150 */ 909, 908, 756, 756, 756, 756, 899, 900, 898, 897, - /* 160 */ 756, 756, 756, 756, 756, 934, 756, 996, 1000, 756, - /* 170 */ 756, 756, 884, 756, 756, 756, 756, 756, 756, 756, - /* 180 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 190 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 200 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 210 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 220 */ 756, 957, 967, 756, 756, 756, 756, 756, 756, 756, - /* 230 */ 756, 756, 756, 756, 884, 756, 984, 756, 943, 939, - /* 240 */ 756, 756, 935, 756, 756, 994, 756, 756, 756, 756, - /* 250 */ 756, 756, 756, 756, 929, 756, 756, 756, 756, 756, - /* 260 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 270 */ 756, 883, 756, 756, 756, 756, 756, 756, 756, 843, - /* 280 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 290 */ 756, 756, 828, 826, 825, 824, 756, 821, 756, 756, - /* 300 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 310 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 320 */ 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - /* 330 */ 756, 756, 756, + /* 0 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 10 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 20 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 30 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 40 */ 947, 947, 947, 1004, 947, 947, 947, 947, 947, 947, + /* 50 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 1002, + /* 60 */ 947, 1185, 947, 947, 947, 947, 947, 947, 947, 947, + /* 70 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 80 */ 947, 947, 947, 947, 947, 947, 947, 947, 1004, 1196, + /* 90 */ 1196, 1196, 1002, 947, 947, 947, 947, 1089, 947, 947, + /* 100 */ 947, 947, 947, 947, 947, 947, 1260, 947, 1042, 1220, + /* 110 */ 947, 1212, 1188, 1202, 1189, 947, 1245, 1205, 947, 947, + /* 120 */ 1004, 947, 947, 1004, 947, 1004, 947, 947, 947, 947, + /* 130 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 140 */ 947, 1002, 947, 947, 947, 1227, 1225, 947, 1227, 1225, + /* 150 */ 947, 1239, 1235, 1218, 1216, 1202, 947, 947, 947, 1263, + /* 160 */ 1251, 1247, 947, 947, 1225, 947, 947, 1225, 947, 1112, + /* 170 */ 947, 947, 947, 1002, 947, 1058, 947, 1002, 947, 1092, + /* 180 */ 1092, 1005, 952, 947, 947, 947, 947, 947, 947, 947, + /* 190 */ 947, 947, 947, 1157, 1238, 1237, 1156, 1162, 1161, 1160, + /* 200 */ 947, 947, 1151, 1152, 1150, 1149, 947, 947, 947, 947, + /* 210 */ 947, 947, 947, 947, 947, 947, 947, 1186, 947, 1248, + /* 220 */ 1252, 947, 947, 947, 1136, 947, 947, 947, 947, 947, + /* 230 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 240 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 250 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 260 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 270 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 280 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 290 */ 947, 947, 947, 947, 947, 947, 1209, 1219, 947, 947, + /* 300 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 1136, + /* 310 */ 947, 1236, 947, 1195, 1191, 947, 947, 1187, 947, 947, + /* 320 */ 1246, 947, 947, 947, 947, 947, 947, 947, 947, 1181, + /* 330 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 340 */ 947, 947, 947, 947, 947, 947, 1135, 947, 947, 947, + /* 350 */ 947, 947, 947, 1086, 947, 947, 947, 947, 947, 947, + /* 360 */ 947, 947, 947, 947, 947, 947, 1071, 1069, 1068, 1067, + /* 370 */ 947, 1064, 947, 947, 947, 947, 947, 947, 947, 947, + /* 380 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 390 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 400 */ 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, + /* 410 */ 947, 947, 947, 947, }; /********** End of lemon-generated parsing tables *****************************/ @@ -647,207 +706,236 @@ static const char *const yyTokenName[] = { /* 16 */ "NK_REM", /* 17 */ "NK_CONCAT", /* 18 */ "CREATE", - /* 19 */ "USER", - /* 20 */ "PASS", - /* 21 */ "NK_STRING", - /* 22 */ "ALTER", - /* 23 */ "PRIVILEGE", - /* 24 */ "DROP", - /* 25 */ "SHOW", - /* 26 */ "USERS", - /* 27 */ "DNODE", - /* 28 */ "PORT", - /* 29 */ "NK_INTEGER", - /* 30 */ "DNODES", - /* 31 */ "NK_ID", - /* 32 */ "NK_IPTOKEN", - /* 33 */ "QNODE", - /* 34 */ "ON", - /* 35 */ "QNODES", - /* 36 */ "DATABASE", - /* 37 */ "DATABASES", - /* 38 */ "USE", - /* 39 */ "IF", - /* 40 */ "NOT", - /* 41 */ "EXISTS", - /* 42 */ "BLOCKS", - /* 43 */ "CACHE", - /* 44 */ "CACHELAST", - /* 45 */ "COMP", - /* 46 */ "DAYS", - /* 47 */ "FSYNC", - /* 48 */ "MAXROWS", - /* 49 */ "MINROWS", - /* 50 */ "KEEP", - /* 51 */ "PRECISION", - /* 52 */ "QUORUM", - /* 53 */ "REPLICA", - /* 54 */ "TTL", - /* 55 */ "WAL", - /* 56 */ "VGROUPS", - /* 57 */ "SINGLE_STABLE", - /* 58 */ "STREAM_MODE", - /* 59 */ "TABLE", - /* 60 */ "NK_LP", - /* 61 */ "NK_RP", - /* 62 */ "STABLE", - /* 63 */ "TABLES", - /* 64 */ "STABLES", - /* 65 */ "USING", - /* 66 */ "TAGS", - /* 67 */ "NK_DOT", - /* 68 */ "NK_COMMA", - /* 69 */ "COMMENT", - /* 70 */ "BOOL", - /* 71 */ "TINYINT", - /* 72 */ "SMALLINT", - /* 73 */ "INT", - /* 74 */ "INTEGER", - /* 75 */ "BIGINT", - /* 76 */ "FLOAT", - /* 77 */ "DOUBLE", - /* 78 */ "BINARY", - /* 79 */ "TIMESTAMP", - /* 80 */ "NCHAR", - /* 81 */ "UNSIGNED", - /* 82 */ "JSON", - /* 83 */ "VARCHAR", - /* 84 */ "MEDIUMBLOB", - /* 85 */ "BLOB", - /* 86 */ "VARBINARY", - /* 87 */ "DECIMAL", - /* 88 */ "SMA", - /* 89 */ "INDEX", - /* 90 */ "FULLTEXT", - /* 91 */ "FUNCTION", - /* 92 */ "INTERVAL", - /* 93 */ "TOPIC", - /* 94 */ "AS", - /* 95 */ "MNODES", - /* 96 */ "NK_FLOAT", - /* 97 */ "NK_BOOL", - /* 98 */ "NK_VARIABLE", - /* 99 */ "BETWEEN", - /* 100 */ "IS", - /* 101 */ "NULL", - /* 102 */ "NK_LT", - /* 103 */ "NK_GT", - /* 104 */ "NK_LE", - /* 105 */ "NK_GE", - /* 106 */ "NK_NE", - /* 107 */ "NK_EQ", - /* 108 */ "LIKE", - /* 109 */ "MATCH", - /* 110 */ "NMATCH", - /* 111 */ "IN", - /* 112 */ "FROM", - /* 113 */ "JOIN", - /* 114 */ "INNER", - /* 115 */ "SELECT", - /* 116 */ "DISTINCT", - /* 117 */ "WHERE", - /* 118 */ "PARTITION", - /* 119 */ "BY", - /* 120 */ "SESSION", - /* 121 */ "STATE_WINDOW", - /* 122 */ "SLIDING", - /* 123 */ "FILL", - /* 124 */ "VALUE", - /* 125 */ "NONE", - /* 126 */ "PREV", - /* 127 */ "LINEAR", - /* 128 */ "NEXT", - /* 129 */ "GROUP", - /* 130 */ "HAVING", - /* 131 */ "ORDER", - /* 132 */ "SLIMIT", - /* 133 */ "SOFFSET", - /* 134 */ "LIMIT", - /* 135 */ "OFFSET", - /* 136 */ "ASC", - /* 137 */ "DESC", - /* 138 */ "NULLS", - /* 139 */ "FIRST", - /* 140 */ "LAST", - /* 141 */ "cmd", - /* 142 */ "user_name", - /* 143 */ "dnode_endpoint", - /* 144 */ "dnode_host_name", - /* 145 */ "not_exists_opt", - /* 146 */ "db_name", - /* 147 */ "db_options", - /* 148 */ "exists_opt", - /* 149 */ "full_table_name", - /* 150 */ "column_def_list", - /* 151 */ "tags_def_opt", - /* 152 */ "table_options", - /* 153 */ "multi_create_clause", - /* 154 */ "tags_def", - /* 155 */ "multi_drop_clause", - /* 156 */ "create_subtable_clause", - /* 157 */ "specific_tags_opt", - /* 158 */ "literal_list", - /* 159 */ "drop_table_clause", - /* 160 */ "col_name_list", - /* 161 */ "table_name", - /* 162 */ "column_def", - /* 163 */ "column_name", - /* 164 */ "type_name", - /* 165 */ "col_name", - /* 166 */ "index_name", - /* 167 */ "index_options", - /* 168 */ "func_list", - /* 169 */ "duration_literal", - /* 170 */ "sliding_opt", - /* 171 */ "func", - /* 172 */ "function_name", - /* 173 */ "expression_list", - /* 174 */ "topic_name", - /* 175 */ "query_expression", - /* 176 */ "literal", - /* 177 */ "table_alias", - /* 178 */ "column_alias", - /* 179 */ "expression", - /* 180 */ "column_reference", - /* 181 */ "subquery", - /* 182 */ "predicate", - /* 183 */ "compare_op", - /* 184 */ "in_op", - /* 185 */ "in_predicate_value", - /* 186 */ "boolean_value_expression", - /* 187 */ "boolean_primary", - /* 188 */ "common_expression", - /* 189 */ "from_clause", - /* 190 */ "table_reference_list", - /* 191 */ "table_reference", - /* 192 */ "table_primary", - /* 193 */ "joined_table", - /* 194 */ "alias_opt", - /* 195 */ "parenthesized_joined_table", - /* 196 */ "join_type", - /* 197 */ "search_condition", - /* 198 */ "query_specification", - /* 199 */ "set_quantifier_opt", - /* 200 */ "select_list", - /* 201 */ "where_clause_opt", - /* 202 */ "partition_by_clause_opt", - /* 203 */ "twindow_clause_opt", - /* 204 */ "group_by_clause_opt", - /* 205 */ "having_clause_opt", - /* 206 */ "select_sublist", - /* 207 */ "select_item", - /* 208 */ "fill_opt", - /* 209 */ "fill_mode", - /* 210 */ "group_by_list", - /* 211 */ "query_expression_body", - /* 212 */ "order_by_clause_opt", - /* 213 */ "slimit_clause_opt", - /* 214 */ "limit_clause_opt", - /* 215 */ "query_primary", - /* 216 */ "sort_specification_list", - /* 217 */ "sort_specification", - /* 218 */ "ordering_specification_opt", - /* 219 */ "null_ordering_opt", + /* 19 */ "ACCOUNT", + /* 20 */ "NK_ID", + /* 21 */ "PASS", + /* 22 */ "NK_STRING", + /* 23 */ "ALTER", + /* 24 */ "PPS", + /* 25 */ "TSERIES", + /* 26 */ "STORAGE", + /* 27 */ "STREAMS", + /* 28 */ "QTIME", + /* 29 */ "DBS", + /* 30 */ "USERS", + /* 31 */ "CONNS", + /* 32 */ "STATE", + /* 33 */ "USER", + /* 34 */ "PRIVILEGE", + /* 35 */ "DROP", + /* 36 */ "SHOW", + /* 37 */ "DNODE", + /* 38 */ "PORT", + /* 39 */ "NK_INTEGER", + /* 40 */ "DNODES", + /* 41 */ "NK_IPTOKEN", + /* 42 */ "LOCAL", + /* 43 */ "QNODE", + /* 44 */ "ON", + /* 45 */ "QNODES", + /* 46 */ "DATABASE", + /* 47 */ "DATABASES", + /* 48 */ "USE", + /* 49 */ "IF", + /* 50 */ "NOT", + /* 51 */ "EXISTS", + /* 52 */ "BLOCKS", + /* 53 */ "CACHE", + /* 54 */ "CACHELAST", + /* 55 */ "COMP", + /* 56 */ "DAYS", + /* 57 */ "FSYNC", + /* 58 */ "MAXROWS", + /* 59 */ "MINROWS", + /* 60 */ "KEEP", + /* 61 */ "PRECISION", + /* 62 */ "QUORUM", + /* 63 */ "REPLICA", + /* 64 */ "TTL", + /* 65 */ "WAL", + /* 66 */ "VGROUPS", + /* 67 */ "SINGLE_STABLE", + /* 68 */ "STREAM_MODE", + /* 69 */ "RETENTIONS", + /* 70 */ "FILE_FACTOR", + /* 71 */ "NK_FLOAT", + /* 72 */ "TABLE", + /* 73 */ "NK_LP", + /* 74 */ "NK_RP", + /* 75 */ "STABLE", + /* 76 */ "TABLES", + /* 77 */ "STABLES", + /* 78 */ "ADD", + /* 79 */ "COLUMN", + /* 80 */ "MODIFY", + /* 81 */ "RENAME", + /* 82 */ "TAG", + /* 83 */ "SET", + /* 84 */ "NK_EQ", + /* 85 */ "USING", + /* 86 */ "TAGS", + /* 87 */ "NK_DOT", + /* 88 */ "NK_COMMA", + /* 89 */ "COMMENT", + /* 90 */ "BOOL", + /* 91 */ "TINYINT", + /* 92 */ "SMALLINT", + /* 93 */ "INT", + /* 94 */ "INTEGER", + /* 95 */ "BIGINT", + /* 96 */ "FLOAT", + /* 97 */ "DOUBLE", + /* 98 */ "BINARY", + /* 99 */ "TIMESTAMP", + /* 100 */ "NCHAR", + /* 101 */ "UNSIGNED", + /* 102 */ "JSON", + /* 103 */ "VARCHAR", + /* 104 */ "MEDIUMBLOB", + /* 105 */ "BLOB", + /* 106 */ "VARBINARY", + /* 107 */ "DECIMAL", + /* 108 */ "SMA", + /* 109 */ "ROLLUP", + /* 110 */ "INDEX", + /* 111 */ "FULLTEXT", + /* 112 */ "FUNCTION", + /* 113 */ "INTERVAL", + /* 114 */ "TOPIC", + /* 115 */ "AS", + /* 116 */ "MNODES", + /* 117 */ "NK_BOOL", + /* 118 */ "NK_VARIABLE", + /* 119 */ "BETWEEN", + /* 120 */ "IS", + /* 121 */ "NULL", + /* 122 */ "NK_LT", + /* 123 */ "NK_GT", + /* 124 */ "NK_LE", + /* 125 */ "NK_GE", + /* 126 */ "NK_NE", + /* 127 */ "LIKE", + /* 128 */ "MATCH", + /* 129 */ "NMATCH", + /* 130 */ "IN", + /* 131 */ "FROM", + /* 132 */ "JOIN", + /* 133 */ "INNER", + /* 134 */ "SELECT", + /* 135 */ "DISTINCT", + /* 136 */ "WHERE", + /* 137 */ "PARTITION", + /* 138 */ "BY", + /* 139 */ "SESSION", + /* 140 */ "STATE_WINDOW", + /* 141 */ "SLIDING", + /* 142 */ "FILL", + /* 143 */ "VALUE", + /* 144 */ "NONE", + /* 145 */ "PREV", + /* 146 */ "LINEAR", + /* 147 */ "NEXT", + /* 148 */ "GROUP", + /* 149 */ "HAVING", + /* 150 */ "ORDER", + /* 151 */ "SLIMIT", + /* 152 */ "SOFFSET", + /* 153 */ "LIMIT", + /* 154 */ "OFFSET", + /* 155 */ "ASC", + /* 156 */ "DESC", + /* 157 */ "NULLS", + /* 158 */ "FIRST", + /* 159 */ "LAST", + /* 160 */ "cmd", + /* 161 */ "account_options", + /* 162 */ "alter_account_options", + /* 163 */ "literal", + /* 164 */ "alter_account_option", + /* 165 */ "user_name", + /* 166 */ "dnode_endpoint", + /* 167 */ "dnode_host_name", + /* 168 */ "not_exists_opt", + /* 169 */ "db_name", + /* 170 */ "db_options", + /* 171 */ "exists_opt", + /* 172 */ "alter_db_options", + /* 173 */ "alter_db_option", + /* 174 */ "full_table_name", + /* 175 */ "column_def_list", + /* 176 */ "tags_def_opt", + /* 177 */ "table_options", + /* 178 */ "multi_create_clause", + /* 179 */ "tags_def", + /* 180 */ "multi_drop_clause", + /* 181 */ "alter_table_clause", + /* 182 */ "alter_table_options", + /* 183 */ "column_name", + /* 184 */ "type_name", + /* 185 */ "create_subtable_clause", + /* 186 */ "specific_tags_opt", + /* 187 */ "literal_list", + /* 188 */ "drop_table_clause", + /* 189 */ "col_name_list", + /* 190 */ "table_name", + /* 191 */ "column_def", + /* 192 */ "func_name_list", + /* 193 */ "alter_table_option", + /* 194 */ "col_name", + /* 195 */ "func_name", + /* 196 */ "function_name", + /* 197 */ "index_name", + /* 198 */ "index_options", + /* 199 */ "func_list", + /* 200 */ "duration_literal", + /* 201 */ "sliding_opt", + /* 202 */ "func", + /* 203 */ "expression_list", + /* 204 */ "topic_name", + /* 205 */ "query_expression", + /* 206 */ "table_alias", + /* 207 */ "column_alias", + /* 208 */ "expression", + /* 209 */ "column_reference", + /* 210 */ "subquery", + /* 211 */ "predicate", + /* 212 */ "compare_op", + /* 213 */ "in_op", + /* 214 */ "in_predicate_value", + /* 215 */ "boolean_value_expression", + /* 216 */ "boolean_primary", + /* 217 */ "common_expression", + /* 218 */ "from_clause", + /* 219 */ "table_reference_list", + /* 220 */ "table_reference", + /* 221 */ "table_primary", + /* 222 */ "joined_table", + /* 223 */ "alias_opt", + /* 224 */ "parenthesized_joined_table", + /* 225 */ "join_type", + /* 226 */ "search_condition", + /* 227 */ "query_specification", + /* 228 */ "set_quantifier_opt", + /* 229 */ "select_list", + /* 230 */ "where_clause_opt", + /* 231 */ "partition_by_clause_opt", + /* 232 */ "twindow_clause_opt", + /* 233 */ "group_by_clause_opt", + /* 234 */ "having_clause_opt", + /* 235 */ "select_sublist", + /* 236 */ "select_item", + /* 237 */ "fill_opt", + /* 238 */ "fill_mode", + /* 239 */ "group_by_list", + /* 240 */ "query_expression_body", + /* 241 */ "order_by_clause_opt", + /* 242 */ "slimit_clause_opt", + /* 243 */ "limit_clause_opt", + /* 244 */ "query_primary", + /* 245 */ "sort_specification_list", + /* 246 */ "sort_specification", + /* 247 */ "ordering_specification_opt", + /* 248 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -855,261 +943,322 @@ static const char *const yyTokenName[] = { /* For tracing reduce actions, the names of all rules are required. */ static const char *const yyRuleName[] = { - /* 0 */ "cmd ::= CREATE USER user_name PASS NK_STRING", - /* 1 */ "cmd ::= ALTER USER user_name PASS NK_STRING", - /* 2 */ "cmd ::= ALTER USER user_name PRIVILEGE NK_STRING", - /* 3 */ "cmd ::= DROP USER user_name", - /* 4 */ "cmd ::= SHOW USERS", - /* 5 */ "cmd ::= CREATE DNODE dnode_endpoint", - /* 6 */ "cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER", - /* 7 */ "cmd ::= DROP DNODE NK_INTEGER", - /* 8 */ "cmd ::= DROP DNODE dnode_endpoint", - /* 9 */ "cmd ::= SHOW DNODES", - /* 10 */ "dnode_endpoint ::= NK_STRING", - /* 11 */ "dnode_host_name ::= NK_ID", - /* 12 */ "dnode_host_name ::= NK_IPTOKEN", - /* 13 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER", - /* 14 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER", - /* 15 */ "cmd ::= SHOW QNODES", - /* 16 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options", - /* 17 */ "cmd ::= DROP DATABASE exists_opt db_name", - /* 18 */ "cmd ::= SHOW DATABASES", - /* 19 */ "cmd ::= USE db_name", - /* 20 */ "cmd ::= ALTER DATABASE db_name db_options", - /* 21 */ "not_exists_opt ::= IF NOT EXISTS", - /* 22 */ "not_exists_opt ::=", - /* 23 */ "exists_opt ::= IF EXISTS", - /* 24 */ "exists_opt ::=", - /* 25 */ "db_options ::=", - /* 26 */ "db_options ::= db_options BLOCKS NK_INTEGER", - /* 27 */ "db_options ::= db_options CACHE NK_INTEGER", - /* 28 */ "db_options ::= db_options CACHELAST NK_INTEGER", - /* 29 */ "db_options ::= db_options COMP NK_INTEGER", - /* 30 */ "db_options ::= db_options DAYS NK_INTEGER", - /* 31 */ "db_options ::= db_options FSYNC NK_INTEGER", - /* 32 */ "db_options ::= db_options MAXROWS NK_INTEGER", - /* 33 */ "db_options ::= db_options MINROWS NK_INTEGER", - /* 34 */ "db_options ::= db_options KEEP NK_INTEGER", - /* 35 */ "db_options ::= db_options PRECISION NK_STRING", - /* 36 */ "db_options ::= db_options QUORUM NK_INTEGER", - /* 37 */ "db_options ::= db_options REPLICA NK_INTEGER", - /* 38 */ "db_options ::= db_options TTL NK_INTEGER", - /* 39 */ "db_options ::= db_options WAL NK_INTEGER", - /* 40 */ "db_options ::= db_options VGROUPS NK_INTEGER", - /* 41 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", - /* 42 */ "db_options ::= db_options STREAM_MODE NK_INTEGER", - /* 43 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 44 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 45 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 46 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 47 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 48 */ "cmd ::= SHOW TABLES", - /* 49 */ "cmd ::= SHOW STABLES", - /* 50 */ "multi_create_clause ::= create_subtable_clause", - /* 51 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 52 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP", - /* 53 */ "multi_drop_clause ::= drop_table_clause", - /* 54 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 55 */ "drop_table_clause ::= exists_opt full_table_name", - /* 56 */ "specific_tags_opt ::=", - /* 57 */ "specific_tags_opt ::= NK_LP col_name_list NK_RP", - /* 58 */ "full_table_name ::= table_name", - /* 59 */ "full_table_name ::= db_name NK_DOT table_name", - /* 60 */ "column_def_list ::= column_def", - /* 61 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 62 */ "column_def ::= column_name type_name", - /* 63 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 64 */ "type_name ::= BOOL", - /* 65 */ "type_name ::= TINYINT", - /* 66 */ "type_name ::= SMALLINT", - /* 67 */ "type_name ::= INT", - /* 68 */ "type_name ::= INTEGER", - /* 69 */ "type_name ::= BIGINT", - /* 70 */ "type_name ::= FLOAT", - /* 71 */ "type_name ::= DOUBLE", - /* 72 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 73 */ "type_name ::= TIMESTAMP", - /* 74 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 75 */ "type_name ::= TINYINT UNSIGNED", - /* 76 */ "type_name ::= SMALLINT UNSIGNED", - /* 77 */ "type_name ::= INT UNSIGNED", - /* 78 */ "type_name ::= BIGINT UNSIGNED", - /* 79 */ "type_name ::= JSON", - /* 80 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 81 */ "type_name ::= MEDIUMBLOB", - /* 82 */ "type_name ::= BLOB", - /* 83 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 84 */ "type_name ::= DECIMAL", - /* 85 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 86 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 87 */ "tags_def_opt ::=", - /* 88 */ "tags_def_opt ::= tags_def", - /* 89 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 90 */ "table_options ::=", - /* 91 */ "table_options ::= table_options COMMENT NK_STRING", - /* 92 */ "table_options ::= table_options KEEP NK_INTEGER", - /* 93 */ "table_options ::= table_options TTL NK_INTEGER", - /* 94 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 95 */ "col_name_list ::= col_name", - /* 96 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 97 */ "col_name ::= column_name", - /* 98 */ "cmd ::= CREATE SMA INDEX index_name ON table_name index_options", - /* 99 */ "cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP", - /* 100 */ "cmd ::= DROP INDEX index_name ON table_name", - /* 101 */ "index_options ::=", - /* 102 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt", - /* 103 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt", - /* 104 */ "func_list ::= func", - /* 105 */ "func_list ::= func_list NK_COMMA func", - /* 106 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 107 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", - /* 108 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name", - /* 109 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 110 */ "cmd ::= SHOW VGROUPS", - /* 111 */ "cmd ::= SHOW db_name NK_DOT VGROUPS", - /* 112 */ "cmd ::= SHOW MNODES", - /* 113 */ "cmd ::= query_expression", - /* 114 */ "literal ::= NK_INTEGER", - /* 115 */ "literal ::= NK_FLOAT", - /* 116 */ "literal ::= NK_STRING", - /* 117 */ "literal ::= NK_BOOL", - /* 118 */ "literal ::= TIMESTAMP NK_STRING", - /* 119 */ "literal ::= duration_literal", - /* 120 */ "duration_literal ::= NK_VARIABLE", - /* 121 */ "literal_list ::= literal", - /* 122 */ "literal_list ::= literal_list NK_COMMA literal", - /* 123 */ "db_name ::= NK_ID", - /* 124 */ "table_name ::= NK_ID", - /* 125 */ "column_name ::= NK_ID", - /* 126 */ "function_name ::= NK_ID", - /* 127 */ "table_alias ::= NK_ID", - /* 128 */ "column_alias ::= NK_ID", - /* 129 */ "user_name ::= NK_ID", - /* 130 */ "index_name ::= NK_ID", - /* 131 */ "topic_name ::= NK_ID", - /* 132 */ "expression ::= literal", - /* 133 */ "expression ::= column_reference", - /* 134 */ "expression ::= function_name NK_LP expression_list NK_RP", - /* 135 */ "expression ::= function_name NK_LP NK_STAR NK_RP", - /* 136 */ "expression ::= subquery", - /* 137 */ "expression ::= NK_LP expression NK_RP", - /* 138 */ "expression ::= NK_PLUS expression", - /* 139 */ "expression ::= NK_MINUS expression", - /* 140 */ "expression ::= expression NK_PLUS expression", - /* 141 */ "expression ::= expression NK_MINUS expression", - /* 142 */ "expression ::= expression NK_STAR expression", - /* 143 */ "expression ::= expression NK_SLASH expression", - /* 144 */ "expression ::= expression NK_REM expression", - /* 145 */ "expression_list ::= expression", - /* 146 */ "expression_list ::= expression_list NK_COMMA expression", - /* 147 */ "column_reference ::= column_name", - /* 148 */ "column_reference ::= table_name NK_DOT column_name", - /* 149 */ "predicate ::= expression compare_op expression", - /* 150 */ "predicate ::= expression BETWEEN expression AND expression", - /* 151 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 152 */ "predicate ::= expression IS NULL", - /* 153 */ "predicate ::= expression IS NOT NULL", - /* 154 */ "predicate ::= expression in_op in_predicate_value", - /* 155 */ "compare_op ::= NK_LT", - /* 156 */ "compare_op ::= NK_GT", - /* 157 */ "compare_op ::= NK_LE", - /* 158 */ "compare_op ::= NK_GE", - /* 159 */ "compare_op ::= NK_NE", - /* 160 */ "compare_op ::= NK_EQ", - /* 161 */ "compare_op ::= LIKE", - /* 162 */ "compare_op ::= NOT LIKE", - /* 163 */ "compare_op ::= MATCH", - /* 164 */ "compare_op ::= NMATCH", - /* 165 */ "in_op ::= IN", - /* 166 */ "in_op ::= NOT IN", - /* 167 */ "in_predicate_value ::= NK_LP expression_list NK_RP", - /* 168 */ "boolean_value_expression ::= boolean_primary", - /* 169 */ "boolean_value_expression ::= NOT boolean_primary", - /* 170 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 171 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 172 */ "boolean_primary ::= predicate", - /* 173 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 174 */ "common_expression ::= expression", - /* 175 */ "common_expression ::= boolean_value_expression", - /* 176 */ "from_clause ::= FROM table_reference_list", - /* 177 */ "table_reference_list ::= table_reference", - /* 178 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 179 */ "table_reference ::= table_primary", - /* 180 */ "table_reference ::= joined_table", - /* 181 */ "table_primary ::= table_name alias_opt", - /* 182 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 183 */ "table_primary ::= subquery alias_opt", - /* 184 */ "table_primary ::= parenthesized_joined_table", - /* 185 */ "alias_opt ::=", - /* 186 */ "alias_opt ::= table_alias", - /* 187 */ "alias_opt ::= AS table_alias", - /* 188 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 189 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 190 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 191 */ "join_type ::=", - /* 192 */ "join_type ::= INNER", - /* 193 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 194 */ "set_quantifier_opt ::=", - /* 195 */ "set_quantifier_opt ::= DISTINCT", - /* 196 */ "set_quantifier_opt ::= ALL", - /* 197 */ "select_list ::= NK_STAR", - /* 198 */ "select_list ::= select_sublist", - /* 199 */ "select_sublist ::= select_item", - /* 200 */ "select_sublist ::= select_sublist NK_COMMA select_item", - /* 201 */ "select_item ::= common_expression", - /* 202 */ "select_item ::= common_expression column_alias", - /* 203 */ "select_item ::= common_expression AS column_alias", - /* 204 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 205 */ "where_clause_opt ::=", - /* 206 */ "where_clause_opt ::= WHERE search_condition", - /* 207 */ "partition_by_clause_opt ::=", - /* 208 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 209 */ "twindow_clause_opt ::=", - /* 210 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", - /* 211 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", - /* 212 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 213 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 214 */ "sliding_opt ::=", - /* 215 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 216 */ "fill_opt ::=", - /* 217 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 218 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 219 */ "fill_mode ::= NONE", - /* 220 */ "fill_mode ::= PREV", - /* 221 */ "fill_mode ::= NULL", - /* 222 */ "fill_mode ::= LINEAR", - /* 223 */ "fill_mode ::= NEXT", - /* 224 */ "group_by_clause_opt ::=", - /* 225 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 226 */ "group_by_list ::= expression", - /* 227 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 228 */ "having_clause_opt ::=", - /* 229 */ "having_clause_opt ::= HAVING search_condition", - /* 230 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 231 */ "query_expression_body ::= query_primary", - /* 232 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 233 */ "query_primary ::= query_specification", - /* 234 */ "order_by_clause_opt ::=", - /* 235 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 236 */ "slimit_clause_opt ::=", - /* 237 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 238 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 239 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 240 */ "limit_clause_opt ::=", - /* 241 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 242 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 243 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 244 */ "subquery ::= NK_LP query_expression NK_RP", - /* 245 */ "search_condition ::= common_expression", - /* 246 */ "sort_specification_list ::= sort_specification", - /* 247 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 248 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 249 */ "ordering_specification_opt ::=", - /* 250 */ "ordering_specification_opt ::= ASC", - /* 251 */ "ordering_specification_opt ::= DESC", - /* 252 */ "null_ordering_opt ::=", - /* 253 */ "null_ordering_opt ::= NULLS FIRST", - /* 254 */ "null_ordering_opt ::= NULLS LAST", + /* 0 */ "cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options", + /* 1 */ "cmd ::= ALTER ACCOUNT NK_ID alter_account_options", + /* 2 */ "account_options ::=", + /* 3 */ "account_options ::= account_options PPS literal", + /* 4 */ "account_options ::= account_options TSERIES literal", + /* 5 */ "account_options ::= account_options STORAGE literal", + /* 6 */ "account_options ::= account_options STREAMS literal", + /* 7 */ "account_options ::= account_options QTIME literal", + /* 8 */ "account_options ::= account_options DBS literal", + /* 9 */ "account_options ::= account_options USERS literal", + /* 10 */ "account_options ::= account_options CONNS literal", + /* 11 */ "account_options ::= account_options STATE literal", + /* 12 */ "alter_account_options ::= alter_account_option", + /* 13 */ "alter_account_options ::= alter_account_options alter_account_option", + /* 14 */ "alter_account_option ::= PASS literal", + /* 15 */ "alter_account_option ::= PPS literal", + /* 16 */ "alter_account_option ::= TSERIES literal", + /* 17 */ "alter_account_option ::= STORAGE literal", + /* 18 */ "alter_account_option ::= STREAMS literal", + /* 19 */ "alter_account_option ::= QTIME literal", + /* 20 */ "alter_account_option ::= DBS literal", + /* 21 */ "alter_account_option ::= USERS literal", + /* 22 */ "alter_account_option ::= CONNS literal", + /* 23 */ "alter_account_option ::= STATE literal", + /* 24 */ "cmd ::= CREATE USER user_name PASS NK_STRING", + /* 25 */ "cmd ::= ALTER USER user_name PASS NK_STRING", + /* 26 */ "cmd ::= ALTER USER user_name PRIVILEGE NK_STRING", + /* 27 */ "cmd ::= DROP USER user_name", + /* 28 */ "cmd ::= SHOW USERS", + /* 29 */ "cmd ::= CREATE DNODE dnode_endpoint", + /* 30 */ "cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER", + /* 31 */ "cmd ::= DROP DNODE NK_INTEGER", + /* 32 */ "cmd ::= DROP DNODE dnode_endpoint", + /* 33 */ "cmd ::= SHOW DNODES", + /* 34 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING", + /* 35 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING", + /* 36 */ "cmd ::= ALTER ALL DNODES NK_STRING", + /* 37 */ "cmd ::= ALTER ALL DNODES NK_STRING NK_STRING", + /* 38 */ "dnode_endpoint ::= NK_STRING", + /* 39 */ "dnode_host_name ::= NK_ID", + /* 40 */ "dnode_host_name ::= NK_IPTOKEN", + /* 41 */ "cmd ::= ALTER LOCAL NK_STRING", + /* 42 */ "cmd ::= ALTER LOCAL NK_STRING NK_STRING", + /* 43 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER", + /* 44 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER", + /* 45 */ "cmd ::= SHOW QNODES", + /* 46 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options", + /* 47 */ "cmd ::= DROP DATABASE exists_opt db_name", + /* 48 */ "cmd ::= SHOW DATABASES", + /* 49 */ "cmd ::= USE db_name", + /* 50 */ "cmd ::= ALTER DATABASE db_name alter_db_options", + /* 51 */ "not_exists_opt ::= IF NOT EXISTS", + /* 52 */ "not_exists_opt ::=", + /* 53 */ "exists_opt ::= IF EXISTS", + /* 54 */ "exists_opt ::=", + /* 55 */ "db_options ::=", + /* 56 */ "db_options ::= db_options BLOCKS NK_INTEGER", + /* 57 */ "db_options ::= db_options CACHE NK_INTEGER", + /* 58 */ "db_options ::= db_options CACHELAST NK_INTEGER", + /* 59 */ "db_options ::= db_options COMP NK_INTEGER", + /* 60 */ "db_options ::= db_options DAYS NK_INTEGER", + /* 61 */ "db_options ::= db_options FSYNC NK_INTEGER", + /* 62 */ "db_options ::= db_options MAXROWS NK_INTEGER", + /* 63 */ "db_options ::= db_options MINROWS NK_INTEGER", + /* 64 */ "db_options ::= db_options KEEP NK_INTEGER", + /* 65 */ "db_options ::= db_options PRECISION NK_STRING", + /* 66 */ "db_options ::= db_options QUORUM NK_INTEGER", + /* 67 */ "db_options ::= db_options REPLICA NK_INTEGER", + /* 68 */ "db_options ::= db_options TTL NK_INTEGER", + /* 69 */ "db_options ::= db_options WAL NK_INTEGER", + /* 70 */ "db_options ::= db_options VGROUPS NK_INTEGER", + /* 71 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", + /* 72 */ "db_options ::= db_options STREAM_MODE NK_INTEGER", + /* 73 */ "db_options ::= db_options RETENTIONS NK_STRING", + /* 74 */ "db_options ::= db_options FILE_FACTOR NK_FLOAT", + /* 75 */ "alter_db_options ::= alter_db_option", + /* 76 */ "alter_db_options ::= alter_db_options alter_db_option", + /* 77 */ "alter_db_option ::= BLOCKS NK_INTEGER", + /* 78 */ "alter_db_option ::= FSYNC NK_INTEGER", + /* 79 */ "alter_db_option ::= KEEP NK_INTEGER", + /* 80 */ "alter_db_option ::= WAL NK_INTEGER", + /* 81 */ "alter_db_option ::= QUORUM NK_INTEGER", + /* 82 */ "alter_db_option ::= CACHELAST NK_INTEGER", + /* 83 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 84 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 85 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 86 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 87 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 88 */ "cmd ::= SHOW TABLES", + /* 89 */ "cmd ::= SHOW STABLES", + /* 90 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 91 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 92 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 93 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 94 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 95 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 96 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 97 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 98 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 99 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 100 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 101 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ literal", + /* 102 */ "multi_create_clause ::= create_subtable_clause", + /* 103 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 104 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP", + /* 105 */ "multi_drop_clause ::= drop_table_clause", + /* 106 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 107 */ "drop_table_clause ::= exists_opt full_table_name", + /* 108 */ "specific_tags_opt ::=", + /* 109 */ "specific_tags_opt ::= NK_LP col_name_list NK_RP", + /* 110 */ "full_table_name ::= table_name", + /* 111 */ "full_table_name ::= db_name NK_DOT table_name", + /* 112 */ "column_def_list ::= column_def", + /* 113 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 114 */ "column_def ::= column_name type_name", + /* 115 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 116 */ "type_name ::= BOOL", + /* 117 */ "type_name ::= TINYINT", + /* 118 */ "type_name ::= SMALLINT", + /* 119 */ "type_name ::= INT", + /* 120 */ "type_name ::= INTEGER", + /* 121 */ "type_name ::= BIGINT", + /* 122 */ "type_name ::= FLOAT", + /* 123 */ "type_name ::= DOUBLE", + /* 124 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 125 */ "type_name ::= TIMESTAMP", + /* 126 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 127 */ "type_name ::= TINYINT UNSIGNED", + /* 128 */ "type_name ::= SMALLINT UNSIGNED", + /* 129 */ "type_name ::= INT UNSIGNED", + /* 130 */ "type_name ::= BIGINT UNSIGNED", + /* 131 */ "type_name ::= JSON", + /* 132 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 133 */ "type_name ::= MEDIUMBLOB", + /* 134 */ "type_name ::= BLOB", + /* 135 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 136 */ "type_name ::= DECIMAL", + /* 137 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 138 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 139 */ "tags_def_opt ::=", + /* 140 */ "tags_def_opt ::= tags_def", + /* 141 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 142 */ "table_options ::=", + /* 143 */ "table_options ::= table_options COMMENT NK_STRING", + /* 144 */ "table_options ::= table_options KEEP NK_INTEGER", + /* 145 */ "table_options ::= table_options TTL NK_INTEGER", + /* 146 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 147 */ "table_options ::= table_options ROLLUP NK_LP func_name_list NK_RP", + /* 148 */ "alter_table_options ::= alter_table_option", + /* 149 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 150 */ "alter_table_option ::= COMMENT NK_STRING", + /* 151 */ "alter_table_option ::= KEEP NK_INTEGER", + /* 152 */ "alter_table_option ::= TTL NK_INTEGER", + /* 153 */ "col_name_list ::= col_name", + /* 154 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 155 */ "col_name ::= column_name", + /* 156 */ "func_name_list ::= func_name", + /* 157 */ "func_name_list ::= func_name_list NK_COMMA col_name", + /* 158 */ "func_name ::= function_name", + /* 159 */ "cmd ::= CREATE SMA INDEX index_name ON table_name index_options", + /* 160 */ "cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP", + /* 161 */ "cmd ::= DROP INDEX index_name ON table_name", + /* 162 */ "index_options ::=", + /* 163 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt", + /* 164 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt", + /* 165 */ "func_list ::= func", + /* 166 */ "func_list ::= func_list NK_COMMA func", + /* 167 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 168 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression", + /* 169 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name", + /* 170 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 171 */ "cmd ::= SHOW VGROUPS", + /* 172 */ "cmd ::= SHOW db_name NK_DOT VGROUPS", + /* 173 */ "cmd ::= SHOW MNODES", + /* 174 */ "cmd ::= query_expression", + /* 175 */ "literal ::= NK_INTEGER", + /* 176 */ "literal ::= NK_FLOAT", + /* 177 */ "literal ::= NK_STRING", + /* 178 */ "literal ::= NK_BOOL", + /* 179 */ "literal ::= TIMESTAMP NK_STRING", + /* 180 */ "literal ::= duration_literal", + /* 181 */ "duration_literal ::= NK_VARIABLE", + /* 182 */ "literal_list ::= literal", + /* 183 */ "literal_list ::= literal_list NK_COMMA literal", + /* 184 */ "db_name ::= NK_ID", + /* 185 */ "table_name ::= NK_ID", + /* 186 */ "column_name ::= NK_ID", + /* 187 */ "function_name ::= NK_ID", + /* 188 */ "table_alias ::= NK_ID", + /* 189 */ "column_alias ::= NK_ID", + /* 190 */ "user_name ::= NK_ID", + /* 191 */ "index_name ::= NK_ID", + /* 192 */ "topic_name ::= NK_ID", + /* 193 */ "expression ::= literal", + /* 194 */ "expression ::= column_reference", + /* 195 */ "expression ::= function_name NK_LP expression_list NK_RP", + /* 196 */ "expression ::= function_name NK_LP NK_STAR NK_RP", + /* 197 */ "expression ::= subquery", + /* 198 */ "expression ::= NK_LP expression NK_RP", + /* 199 */ "expression ::= NK_PLUS expression", + /* 200 */ "expression ::= NK_MINUS expression", + /* 201 */ "expression ::= expression NK_PLUS expression", + /* 202 */ "expression ::= expression NK_MINUS expression", + /* 203 */ "expression ::= expression NK_STAR expression", + /* 204 */ "expression ::= expression NK_SLASH expression", + /* 205 */ "expression ::= expression NK_REM expression", + /* 206 */ "expression_list ::= expression", + /* 207 */ "expression_list ::= expression_list NK_COMMA expression", + /* 208 */ "column_reference ::= column_name", + /* 209 */ "column_reference ::= table_name NK_DOT column_name", + /* 210 */ "predicate ::= expression compare_op expression", + /* 211 */ "predicate ::= expression BETWEEN expression AND expression", + /* 212 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 213 */ "predicate ::= expression IS NULL", + /* 214 */ "predicate ::= expression IS NOT NULL", + /* 215 */ "predicate ::= expression in_op in_predicate_value", + /* 216 */ "compare_op ::= NK_LT", + /* 217 */ "compare_op ::= NK_GT", + /* 218 */ "compare_op ::= NK_LE", + /* 219 */ "compare_op ::= NK_GE", + /* 220 */ "compare_op ::= NK_NE", + /* 221 */ "compare_op ::= NK_EQ", + /* 222 */ "compare_op ::= LIKE", + /* 223 */ "compare_op ::= NOT LIKE", + /* 224 */ "compare_op ::= MATCH", + /* 225 */ "compare_op ::= NMATCH", + /* 226 */ "in_op ::= IN", + /* 227 */ "in_op ::= NOT IN", + /* 228 */ "in_predicate_value ::= NK_LP expression_list NK_RP", + /* 229 */ "boolean_value_expression ::= boolean_primary", + /* 230 */ "boolean_value_expression ::= NOT boolean_primary", + /* 231 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 232 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 233 */ "boolean_primary ::= predicate", + /* 234 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 235 */ "common_expression ::= expression", + /* 236 */ "common_expression ::= boolean_value_expression", + /* 237 */ "from_clause ::= FROM table_reference_list", + /* 238 */ "table_reference_list ::= table_reference", + /* 239 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 240 */ "table_reference ::= table_primary", + /* 241 */ "table_reference ::= joined_table", + /* 242 */ "table_primary ::= table_name alias_opt", + /* 243 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 244 */ "table_primary ::= subquery alias_opt", + /* 245 */ "table_primary ::= parenthesized_joined_table", + /* 246 */ "alias_opt ::=", + /* 247 */ "alias_opt ::= table_alias", + /* 248 */ "alias_opt ::= AS table_alias", + /* 249 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 250 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 251 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 252 */ "join_type ::=", + /* 253 */ "join_type ::= INNER", + /* 254 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt", + /* 255 */ "set_quantifier_opt ::=", + /* 256 */ "set_quantifier_opt ::= DISTINCT", + /* 257 */ "set_quantifier_opt ::= ALL", + /* 258 */ "select_list ::= NK_STAR", + /* 259 */ "select_list ::= select_sublist", + /* 260 */ "select_sublist ::= select_item", + /* 261 */ "select_sublist ::= select_sublist NK_COMMA select_item", + /* 262 */ "select_item ::= common_expression", + /* 263 */ "select_item ::= common_expression column_alias", + /* 264 */ "select_item ::= common_expression AS column_alias", + /* 265 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 266 */ "where_clause_opt ::=", + /* 267 */ "where_clause_opt ::= WHERE search_condition", + /* 268 */ "partition_by_clause_opt ::=", + /* 269 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 270 */ "twindow_clause_opt ::=", + /* 271 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", + /* 272 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", + /* 273 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 274 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 275 */ "sliding_opt ::=", + /* 276 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 277 */ "fill_opt ::=", + /* 278 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 279 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 280 */ "fill_mode ::= NONE", + /* 281 */ "fill_mode ::= PREV", + /* 282 */ "fill_mode ::= NULL", + /* 283 */ "fill_mode ::= LINEAR", + /* 284 */ "fill_mode ::= NEXT", + /* 285 */ "group_by_clause_opt ::=", + /* 286 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 287 */ "group_by_list ::= expression", + /* 288 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 289 */ "having_clause_opt ::=", + /* 290 */ "having_clause_opt ::= HAVING search_condition", + /* 291 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 292 */ "query_expression_body ::= query_primary", + /* 293 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 294 */ "query_primary ::= query_specification", + /* 295 */ "order_by_clause_opt ::=", + /* 296 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 297 */ "slimit_clause_opt ::=", + /* 298 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 299 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 300 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 301 */ "limit_clause_opt ::=", + /* 302 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 303 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 304 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 305 */ "subquery ::= NK_LP query_expression NK_RP", + /* 306 */ "search_condition ::= common_expression", + /* 307 */ "sort_specification_list ::= sort_specification", + /* 308 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 309 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 310 */ "ordering_specification_opt ::=", + /* 311 */ "ordering_specification_opt ::= ASC", + /* 312 */ "ordering_specification_opt ::= DESC", + /* 313 */ "null_ordering_opt ::=", + /* 314 */ "null_ordering_opt ::= NULLS FIRST", + /* 315 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -1236,121 +1385,139 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 141: /* cmd */ - case 147: /* db_options */ - case 149: /* full_table_name */ - case 152: /* table_options */ - case 156: /* create_subtable_clause */ - case 159: /* drop_table_clause */ - case 162: /* column_def */ - case 165: /* col_name */ - case 167: /* index_options */ - case 169: /* duration_literal */ - case 170: /* sliding_opt */ - case 171: /* func */ - case 175: /* query_expression */ - case 176: /* literal */ - case 179: /* expression */ - case 180: /* column_reference */ - case 181: /* subquery */ - case 182: /* predicate */ - case 185: /* in_predicate_value */ - case 186: /* boolean_value_expression */ - case 187: /* boolean_primary */ - case 188: /* common_expression */ - case 189: /* from_clause */ - case 190: /* table_reference_list */ - case 191: /* table_reference */ - case 192: /* table_primary */ - case 193: /* joined_table */ - case 195: /* parenthesized_joined_table */ - case 197: /* search_condition */ - case 198: /* query_specification */ - case 201: /* where_clause_opt */ - case 203: /* twindow_clause_opt */ - case 205: /* having_clause_opt */ - case 207: /* select_item */ - case 208: /* fill_opt */ - case 211: /* query_expression_body */ - case 213: /* slimit_clause_opt */ - case 214: /* limit_clause_opt */ - case 215: /* query_primary */ - case 217: /* sort_specification */ + case 160: /* cmd */ + case 163: /* literal */ + case 170: /* db_options */ + case 172: /* alter_db_options */ + case 174: /* full_table_name */ + case 177: /* table_options */ + case 181: /* alter_table_clause */ + case 182: /* alter_table_options */ + case 185: /* create_subtable_clause */ + case 188: /* drop_table_clause */ + case 191: /* column_def */ + case 194: /* col_name */ + case 195: /* func_name */ + case 198: /* index_options */ + case 200: /* duration_literal */ + case 201: /* sliding_opt */ + case 202: /* func */ + case 205: /* query_expression */ + case 208: /* expression */ + case 209: /* column_reference */ + case 210: /* subquery */ + case 211: /* predicate */ + case 214: /* in_predicate_value */ + case 215: /* boolean_value_expression */ + case 216: /* boolean_primary */ + case 217: /* common_expression */ + case 218: /* from_clause */ + case 219: /* table_reference_list */ + case 220: /* table_reference */ + case 221: /* table_primary */ + case 222: /* joined_table */ + case 224: /* parenthesized_joined_table */ + case 226: /* search_condition */ + case 227: /* query_specification */ + case 230: /* where_clause_opt */ + case 232: /* twindow_clause_opt */ + case 234: /* having_clause_opt */ + case 236: /* select_item */ + case 237: /* fill_opt */ + case 240: /* query_expression_body */ + case 242: /* slimit_clause_opt */ + case 243: /* limit_clause_opt */ + case 244: /* query_primary */ + case 246: /* sort_specification */ { - nodesDestroyNode((yypminor->yy432)); + nodesDestroyNode((yypminor->yy26)); } break; - case 142: /* user_name */ - case 143: /* dnode_endpoint */ - case 144: /* dnode_host_name */ - case 146: /* db_name */ - case 161: /* table_name */ - case 163: /* column_name */ - case 166: /* index_name */ - case 172: /* function_name */ - case 174: /* topic_name */ - case 177: /* table_alias */ - case 178: /* column_alias */ - case 194: /* alias_opt */ + case 161: /* account_options */ + case 162: /* alter_account_options */ + case 164: /* alter_account_option */ { } break; - case 145: /* not_exists_opt */ - case 148: /* exists_opt */ - case 199: /* set_quantifier_opt */ + case 165: /* user_name */ + case 166: /* dnode_endpoint */ + case 167: /* dnode_host_name */ + case 169: /* db_name */ + case 183: /* column_name */ + case 190: /* table_name */ + case 196: /* function_name */ + case 197: /* index_name */ + case 204: /* topic_name */ + case 206: /* table_alias */ + case 207: /* column_alias */ + case 223: /* alias_opt */ { } break; - case 150: /* column_def_list */ - case 151: /* tags_def_opt */ - case 153: /* multi_create_clause */ - case 154: /* tags_def */ - case 155: /* multi_drop_clause */ - case 157: /* specific_tags_opt */ - case 158: /* literal_list */ - case 160: /* col_name_list */ - case 168: /* func_list */ - case 173: /* expression_list */ - case 200: /* select_list */ - case 202: /* partition_by_clause_opt */ - case 204: /* group_by_clause_opt */ - case 206: /* select_sublist */ - case 210: /* group_by_list */ - case 212: /* order_by_clause_opt */ - case 216: /* sort_specification_list */ + case 168: /* not_exists_opt */ + case 171: /* exists_opt */ + case 228: /* set_quantifier_opt */ { - nodesDestroyList((yypminor->yy24)); + } break; - case 164: /* type_name */ + case 173: /* alter_db_option */ + case 193: /* alter_table_option */ { } break; - case 183: /* compare_op */ - case 184: /* in_op */ + case 175: /* column_def_list */ + case 176: /* tags_def_opt */ + case 178: /* multi_create_clause */ + case 179: /* tags_def */ + case 180: /* multi_drop_clause */ + case 186: /* specific_tags_opt */ + case 187: /* literal_list */ + case 189: /* col_name_list */ + case 192: /* func_name_list */ + case 199: /* func_list */ + case 203: /* expression_list */ + case 229: /* select_list */ + case 231: /* partition_by_clause_opt */ + case 233: /* group_by_clause_opt */ + case 235: /* select_sublist */ + case 239: /* group_by_list */ + case 241: /* order_by_clause_opt */ + case 245: /* sort_specification_list */ +{ + nodesDestroyList((yypminor->yy64)); +} + break; + case 184: /* type_name */ { } break; - case 196: /* join_type */ + case 212: /* compare_op */ + case 213: /* in_op */ { } break; - case 209: /* fill_mode */ + case 225: /* join_type */ { } break; - case 218: /* ordering_specification_opt */ + case 238: /* fill_mode */ { } break; - case 219: /* null_ordering_opt */ + case 247: /* ordering_specification_opt */ +{ + +} + break; + case 248: /* null_ordering_opt */ { } @@ -1649,261 +1816,322 @@ 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[] = { - { 141, -5 }, /* (0) cmd ::= CREATE USER user_name PASS NK_STRING */ - { 141, -5 }, /* (1) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 141, -5 }, /* (2) cmd ::= ALTER USER user_name PRIVILEGE NK_STRING */ - { 141, -3 }, /* (3) cmd ::= DROP USER user_name */ - { 141, -2 }, /* (4) cmd ::= SHOW USERS */ - { 141, -3 }, /* (5) cmd ::= CREATE DNODE dnode_endpoint */ - { 141, -5 }, /* (6) cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER */ - { 141, -3 }, /* (7) cmd ::= DROP DNODE NK_INTEGER */ - { 141, -3 }, /* (8) cmd ::= DROP DNODE dnode_endpoint */ - { 141, -2 }, /* (9) cmd ::= SHOW DNODES */ - { 143, -1 }, /* (10) dnode_endpoint ::= NK_STRING */ - { 144, -1 }, /* (11) dnode_host_name ::= NK_ID */ - { 144, -1 }, /* (12) dnode_host_name ::= NK_IPTOKEN */ - { 141, -5 }, /* (13) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 141, -5 }, /* (14) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 141, -2 }, /* (15) cmd ::= SHOW QNODES */ - { 141, -5 }, /* (16) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 141, -4 }, /* (17) cmd ::= DROP DATABASE exists_opt db_name */ - { 141, -2 }, /* (18) cmd ::= SHOW DATABASES */ - { 141, -2 }, /* (19) cmd ::= USE db_name */ - { 141, -4 }, /* (20) cmd ::= ALTER DATABASE db_name db_options */ - { 145, -3 }, /* (21) not_exists_opt ::= IF NOT EXISTS */ - { 145, 0 }, /* (22) not_exists_opt ::= */ - { 148, -2 }, /* (23) exists_opt ::= IF EXISTS */ - { 148, 0 }, /* (24) exists_opt ::= */ - { 147, 0 }, /* (25) db_options ::= */ - { 147, -3 }, /* (26) db_options ::= db_options BLOCKS NK_INTEGER */ - { 147, -3 }, /* (27) db_options ::= db_options CACHE NK_INTEGER */ - { 147, -3 }, /* (28) db_options ::= db_options CACHELAST NK_INTEGER */ - { 147, -3 }, /* (29) db_options ::= db_options COMP NK_INTEGER */ - { 147, -3 }, /* (30) db_options ::= db_options DAYS NK_INTEGER */ - { 147, -3 }, /* (31) db_options ::= db_options FSYNC NK_INTEGER */ - { 147, -3 }, /* (32) db_options ::= db_options MAXROWS NK_INTEGER */ - { 147, -3 }, /* (33) db_options ::= db_options MINROWS NK_INTEGER */ - { 147, -3 }, /* (34) db_options ::= db_options KEEP NK_INTEGER */ - { 147, -3 }, /* (35) db_options ::= db_options PRECISION NK_STRING */ - { 147, -3 }, /* (36) db_options ::= db_options QUORUM NK_INTEGER */ - { 147, -3 }, /* (37) db_options ::= db_options REPLICA NK_INTEGER */ - { 147, -3 }, /* (38) db_options ::= db_options TTL NK_INTEGER */ - { 147, -3 }, /* (39) db_options ::= db_options WAL NK_INTEGER */ - { 147, -3 }, /* (40) db_options ::= db_options VGROUPS NK_INTEGER */ - { 147, -3 }, /* (41) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 147, -3 }, /* (42) db_options ::= db_options STREAM_MODE NK_INTEGER */ - { 141, -9 }, /* (43) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 141, -3 }, /* (44) cmd ::= CREATE TABLE multi_create_clause */ - { 141, -9 }, /* (45) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 141, -3 }, /* (46) cmd ::= DROP TABLE multi_drop_clause */ - { 141, -4 }, /* (47) cmd ::= DROP STABLE exists_opt full_table_name */ - { 141, -2 }, /* (48) cmd ::= SHOW TABLES */ - { 141, -2 }, /* (49) cmd ::= SHOW STABLES */ - { 153, -1 }, /* (50) multi_create_clause ::= create_subtable_clause */ - { 153, -2 }, /* (51) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 156, -9 }, /* (52) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP */ - { 155, -1 }, /* (53) multi_drop_clause ::= drop_table_clause */ - { 155, -2 }, /* (54) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 159, -2 }, /* (55) drop_table_clause ::= exists_opt full_table_name */ - { 157, 0 }, /* (56) specific_tags_opt ::= */ - { 157, -3 }, /* (57) specific_tags_opt ::= NK_LP col_name_list NK_RP */ - { 149, -1 }, /* (58) full_table_name ::= table_name */ - { 149, -3 }, /* (59) full_table_name ::= db_name NK_DOT table_name */ - { 150, -1 }, /* (60) column_def_list ::= column_def */ - { 150, -3 }, /* (61) column_def_list ::= column_def_list NK_COMMA column_def */ - { 162, -2 }, /* (62) column_def ::= column_name type_name */ - { 162, -4 }, /* (63) column_def ::= column_name type_name COMMENT NK_STRING */ - { 164, -1 }, /* (64) type_name ::= BOOL */ - { 164, -1 }, /* (65) type_name ::= TINYINT */ - { 164, -1 }, /* (66) type_name ::= SMALLINT */ - { 164, -1 }, /* (67) type_name ::= INT */ - { 164, -1 }, /* (68) type_name ::= INTEGER */ - { 164, -1 }, /* (69) type_name ::= BIGINT */ - { 164, -1 }, /* (70) type_name ::= FLOAT */ - { 164, -1 }, /* (71) type_name ::= DOUBLE */ - { 164, -4 }, /* (72) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 164, -1 }, /* (73) type_name ::= TIMESTAMP */ - { 164, -4 }, /* (74) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 164, -2 }, /* (75) type_name ::= TINYINT UNSIGNED */ - { 164, -2 }, /* (76) type_name ::= SMALLINT UNSIGNED */ - { 164, -2 }, /* (77) type_name ::= INT UNSIGNED */ - { 164, -2 }, /* (78) type_name ::= BIGINT UNSIGNED */ - { 164, -1 }, /* (79) type_name ::= JSON */ - { 164, -4 }, /* (80) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 164, -1 }, /* (81) type_name ::= MEDIUMBLOB */ - { 164, -1 }, /* (82) type_name ::= BLOB */ - { 164, -4 }, /* (83) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 164, -1 }, /* (84) type_name ::= DECIMAL */ - { 164, -4 }, /* (85) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 164, -6 }, /* (86) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 151, 0 }, /* (87) tags_def_opt ::= */ - { 151, -1 }, /* (88) tags_def_opt ::= tags_def */ - { 154, -4 }, /* (89) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 152, 0 }, /* (90) table_options ::= */ - { 152, -3 }, /* (91) table_options ::= table_options COMMENT NK_STRING */ - { 152, -3 }, /* (92) table_options ::= table_options KEEP NK_INTEGER */ - { 152, -3 }, /* (93) table_options ::= table_options TTL NK_INTEGER */ - { 152, -5 }, /* (94) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 160, -1 }, /* (95) col_name_list ::= col_name */ - { 160, -3 }, /* (96) col_name_list ::= col_name_list NK_COMMA col_name */ - { 165, -1 }, /* (97) col_name ::= column_name */ - { 141, -7 }, /* (98) cmd ::= CREATE SMA INDEX index_name ON table_name index_options */ - { 141, -9 }, /* (99) cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP */ - { 141, -5 }, /* (100) cmd ::= DROP INDEX index_name ON table_name */ - { 167, 0 }, /* (101) index_options ::= */ - { 167, -9 }, /* (102) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt */ - { 167, -11 }, /* (103) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt */ - { 168, -1 }, /* (104) func_list ::= func */ - { 168, -3 }, /* (105) func_list ::= func_list NK_COMMA func */ - { 171, -4 }, /* (106) func ::= function_name NK_LP expression_list NK_RP */ - { 141, -6 }, /* (107) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ - { 141, -6 }, /* (108) cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name */ - { 141, -4 }, /* (109) cmd ::= DROP TOPIC exists_opt topic_name */ - { 141, -2 }, /* (110) cmd ::= SHOW VGROUPS */ - { 141, -4 }, /* (111) cmd ::= SHOW db_name NK_DOT VGROUPS */ - { 141, -2 }, /* (112) cmd ::= SHOW MNODES */ - { 141, -1 }, /* (113) cmd ::= query_expression */ - { 176, -1 }, /* (114) literal ::= NK_INTEGER */ - { 176, -1 }, /* (115) literal ::= NK_FLOAT */ - { 176, -1 }, /* (116) literal ::= NK_STRING */ - { 176, -1 }, /* (117) literal ::= NK_BOOL */ - { 176, -2 }, /* (118) literal ::= TIMESTAMP NK_STRING */ - { 176, -1 }, /* (119) literal ::= duration_literal */ - { 169, -1 }, /* (120) duration_literal ::= NK_VARIABLE */ - { 158, -1 }, /* (121) literal_list ::= literal */ - { 158, -3 }, /* (122) literal_list ::= literal_list NK_COMMA literal */ - { 146, -1 }, /* (123) db_name ::= NK_ID */ - { 161, -1 }, /* (124) table_name ::= NK_ID */ - { 163, -1 }, /* (125) column_name ::= NK_ID */ - { 172, -1 }, /* (126) function_name ::= NK_ID */ - { 177, -1 }, /* (127) table_alias ::= NK_ID */ - { 178, -1 }, /* (128) column_alias ::= NK_ID */ - { 142, -1 }, /* (129) user_name ::= NK_ID */ - { 166, -1 }, /* (130) index_name ::= NK_ID */ - { 174, -1 }, /* (131) topic_name ::= NK_ID */ - { 179, -1 }, /* (132) expression ::= literal */ - { 179, -1 }, /* (133) expression ::= column_reference */ - { 179, -4 }, /* (134) expression ::= function_name NK_LP expression_list NK_RP */ - { 179, -4 }, /* (135) expression ::= function_name NK_LP NK_STAR NK_RP */ - { 179, -1 }, /* (136) expression ::= subquery */ - { 179, -3 }, /* (137) expression ::= NK_LP expression NK_RP */ - { 179, -2 }, /* (138) expression ::= NK_PLUS expression */ - { 179, -2 }, /* (139) expression ::= NK_MINUS expression */ - { 179, -3 }, /* (140) expression ::= expression NK_PLUS expression */ - { 179, -3 }, /* (141) expression ::= expression NK_MINUS expression */ - { 179, -3 }, /* (142) expression ::= expression NK_STAR expression */ - { 179, -3 }, /* (143) expression ::= expression NK_SLASH expression */ - { 179, -3 }, /* (144) expression ::= expression NK_REM expression */ - { 173, -1 }, /* (145) expression_list ::= expression */ - { 173, -3 }, /* (146) expression_list ::= expression_list NK_COMMA expression */ - { 180, -1 }, /* (147) column_reference ::= column_name */ - { 180, -3 }, /* (148) column_reference ::= table_name NK_DOT column_name */ - { 182, -3 }, /* (149) predicate ::= expression compare_op expression */ - { 182, -5 }, /* (150) predicate ::= expression BETWEEN expression AND expression */ - { 182, -6 }, /* (151) predicate ::= expression NOT BETWEEN expression AND expression */ - { 182, -3 }, /* (152) predicate ::= expression IS NULL */ - { 182, -4 }, /* (153) predicate ::= expression IS NOT NULL */ - { 182, -3 }, /* (154) predicate ::= expression in_op in_predicate_value */ - { 183, -1 }, /* (155) compare_op ::= NK_LT */ - { 183, -1 }, /* (156) compare_op ::= NK_GT */ - { 183, -1 }, /* (157) compare_op ::= NK_LE */ - { 183, -1 }, /* (158) compare_op ::= NK_GE */ - { 183, -1 }, /* (159) compare_op ::= NK_NE */ - { 183, -1 }, /* (160) compare_op ::= NK_EQ */ - { 183, -1 }, /* (161) compare_op ::= LIKE */ - { 183, -2 }, /* (162) compare_op ::= NOT LIKE */ - { 183, -1 }, /* (163) compare_op ::= MATCH */ - { 183, -1 }, /* (164) compare_op ::= NMATCH */ - { 184, -1 }, /* (165) in_op ::= IN */ - { 184, -2 }, /* (166) in_op ::= NOT IN */ - { 185, -3 }, /* (167) in_predicate_value ::= NK_LP expression_list NK_RP */ - { 186, -1 }, /* (168) boolean_value_expression ::= boolean_primary */ - { 186, -2 }, /* (169) boolean_value_expression ::= NOT boolean_primary */ - { 186, -3 }, /* (170) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 186, -3 }, /* (171) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 187, -1 }, /* (172) boolean_primary ::= predicate */ - { 187, -3 }, /* (173) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 188, -1 }, /* (174) common_expression ::= expression */ - { 188, -1 }, /* (175) common_expression ::= boolean_value_expression */ - { 189, -2 }, /* (176) from_clause ::= FROM table_reference_list */ - { 190, -1 }, /* (177) table_reference_list ::= table_reference */ - { 190, -3 }, /* (178) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 191, -1 }, /* (179) table_reference ::= table_primary */ - { 191, -1 }, /* (180) table_reference ::= joined_table */ - { 192, -2 }, /* (181) table_primary ::= table_name alias_opt */ - { 192, -4 }, /* (182) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 192, -2 }, /* (183) table_primary ::= subquery alias_opt */ - { 192, -1 }, /* (184) table_primary ::= parenthesized_joined_table */ - { 194, 0 }, /* (185) alias_opt ::= */ - { 194, -1 }, /* (186) alias_opt ::= table_alias */ - { 194, -2 }, /* (187) alias_opt ::= AS table_alias */ - { 195, -3 }, /* (188) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 195, -3 }, /* (189) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 193, -6 }, /* (190) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 196, 0 }, /* (191) join_type ::= */ - { 196, -1 }, /* (192) join_type ::= INNER */ - { 198, -9 }, /* (193) query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ - { 199, 0 }, /* (194) set_quantifier_opt ::= */ - { 199, -1 }, /* (195) set_quantifier_opt ::= DISTINCT */ - { 199, -1 }, /* (196) set_quantifier_opt ::= ALL */ - { 200, -1 }, /* (197) select_list ::= NK_STAR */ - { 200, -1 }, /* (198) select_list ::= select_sublist */ - { 206, -1 }, /* (199) select_sublist ::= select_item */ - { 206, -3 }, /* (200) select_sublist ::= select_sublist NK_COMMA select_item */ - { 207, -1 }, /* (201) select_item ::= common_expression */ - { 207, -2 }, /* (202) select_item ::= common_expression column_alias */ - { 207, -3 }, /* (203) select_item ::= common_expression AS column_alias */ - { 207, -3 }, /* (204) select_item ::= table_name NK_DOT NK_STAR */ - { 201, 0 }, /* (205) where_clause_opt ::= */ - { 201, -2 }, /* (206) where_clause_opt ::= WHERE search_condition */ - { 202, 0 }, /* (207) partition_by_clause_opt ::= */ - { 202, -3 }, /* (208) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 203, 0 }, /* (209) twindow_clause_opt ::= */ - { 203, -6 }, /* (210) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ - { 203, -4 }, /* (211) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ - { 203, -6 }, /* (212) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 203, -8 }, /* (213) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 170, 0 }, /* (214) sliding_opt ::= */ - { 170, -4 }, /* (215) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 208, 0 }, /* (216) fill_opt ::= */ - { 208, -4 }, /* (217) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 208, -6 }, /* (218) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 209, -1 }, /* (219) fill_mode ::= NONE */ - { 209, -1 }, /* (220) fill_mode ::= PREV */ - { 209, -1 }, /* (221) fill_mode ::= NULL */ - { 209, -1 }, /* (222) fill_mode ::= LINEAR */ - { 209, -1 }, /* (223) fill_mode ::= NEXT */ - { 204, 0 }, /* (224) group_by_clause_opt ::= */ - { 204, -3 }, /* (225) group_by_clause_opt ::= GROUP BY group_by_list */ - { 210, -1 }, /* (226) group_by_list ::= expression */ - { 210, -3 }, /* (227) group_by_list ::= group_by_list NK_COMMA expression */ - { 205, 0 }, /* (228) having_clause_opt ::= */ - { 205, -2 }, /* (229) having_clause_opt ::= HAVING search_condition */ - { 175, -4 }, /* (230) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 211, -1 }, /* (231) query_expression_body ::= query_primary */ - { 211, -4 }, /* (232) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 215, -1 }, /* (233) query_primary ::= query_specification */ - { 212, 0 }, /* (234) order_by_clause_opt ::= */ - { 212, -3 }, /* (235) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 213, 0 }, /* (236) slimit_clause_opt ::= */ - { 213, -2 }, /* (237) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 213, -4 }, /* (238) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 213, -4 }, /* (239) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 214, 0 }, /* (240) limit_clause_opt ::= */ - { 214, -2 }, /* (241) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 214, -4 }, /* (242) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 214, -4 }, /* (243) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 181, -3 }, /* (244) subquery ::= NK_LP query_expression NK_RP */ - { 197, -1 }, /* (245) search_condition ::= common_expression */ - { 216, -1 }, /* (246) sort_specification_list ::= sort_specification */ - { 216, -3 }, /* (247) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 217, -3 }, /* (248) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 218, 0 }, /* (249) ordering_specification_opt ::= */ - { 218, -1 }, /* (250) ordering_specification_opt ::= ASC */ - { 218, -1 }, /* (251) ordering_specification_opt ::= DESC */ - { 219, 0 }, /* (252) null_ordering_opt ::= */ - { 219, -2 }, /* (253) null_ordering_opt ::= NULLS FIRST */ - { 219, -2 }, /* (254) null_ordering_opt ::= NULLS LAST */ + { 160, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 160, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 161, 0 }, /* (2) account_options ::= */ + { 161, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 161, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 161, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 161, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 161, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 161, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 161, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 161, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 161, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 162, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 162, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 164, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 164, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 164, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 164, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 164, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 164, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 164, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 164, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 164, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 164, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 160, -5 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING */ + { 160, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 160, -5 }, /* (26) cmd ::= ALTER USER user_name PRIVILEGE NK_STRING */ + { 160, -3 }, /* (27) cmd ::= DROP USER user_name */ + { 160, -2 }, /* (28) cmd ::= SHOW USERS */ + { 160, -3 }, /* (29) cmd ::= CREATE DNODE dnode_endpoint */ + { 160, -5 }, /* (30) cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER */ + { 160, -3 }, /* (31) cmd ::= DROP DNODE NK_INTEGER */ + { 160, -3 }, /* (32) cmd ::= DROP DNODE dnode_endpoint */ + { 160, -2 }, /* (33) cmd ::= SHOW DNODES */ + { 160, -4 }, /* (34) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 160, -5 }, /* (35) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 160, -4 }, /* (36) cmd ::= ALTER ALL DNODES NK_STRING */ + { 160, -5 }, /* (37) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 166, -1 }, /* (38) dnode_endpoint ::= NK_STRING */ + { 167, -1 }, /* (39) dnode_host_name ::= NK_ID */ + { 167, -1 }, /* (40) dnode_host_name ::= NK_IPTOKEN */ + { 160, -3 }, /* (41) cmd ::= ALTER LOCAL NK_STRING */ + { 160, -4 }, /* (42) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 160, -5 }, /* (43) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 160, -5 }, /* (44) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 160, -2 }, /* (45) cmd ::= SHOW QNODES */ + { 160, -5 }, /* (46) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 160, -4 }, /* (47) cmd ::= DROP DATABASE exists_opt db_name */ + { 160, -2 }, /* (48) cmd ::= SHOW DATABASES */ + { 160, -2 }, /* (49) cmd ::= USE db_name */ + { 160, -4 }, /* (50) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 168, -3 }, /* (51) not_exists_opt ::= IF NOT EXISTS */ + { 168, 0 }, /* (52) not_exists_opt ::= */ + { 171, -2 }, /* (53) exists_opt ::= IF EXISTS */ + { 171, 0 }, /* (54) exists_opt ::= */ + { 170, 0 }, /* (55) db_options ::= */ + { 170, -3 }, /* (56) db_options ::= db_options BLOCKS NK_INTEGER */ + { 170, -3 }, /* (57) db_options ::= db_options CACHE NK_INTEGER */ + { 170, -3 }, /* (58) db_options ::= db_options CACHELAST NK_INTEGER */ + { 170, -3 }, /* (59) db_options ::= db_options COMP NK_INTEGER */ + { 170, -3 }, /* (60) db_options ::= db_options DAYS NK_INTEGER */ + { 170, -3 }, /* (61) db_options ::= db_options FSYNC NK_INTEGER */ + { 170, -3 }, /* (62) db_options ::= db_options MAXROWS NK_INTEGER */ + { 170, -3 }, /* (63) db_options ::= db_options MINROWS NK_INTEGER */ + { 170, -3 }, /* (64) db_options ::= db_options KEEP NK_INTEGER */ + { 170, -3 }, /* (65) db_options ::= db_options PRECISION NK_STRING */ + { 170, -3 }, /* (66) db_options ::= db_options QUORUM NK_INTEGER */ + { 170, -3 }, /* (67) db_options ::= db_options REPLICA NK_INTEGER */ + { 170, -3 }, /* (68) db_options ::= db_options TTL NK_INTEGER */ + { 170, -3 }, /* (69) db_options ::= db_options WAL NK_INTEGER */ + { 170, -3 }, /* (70) db_options ::= db_options VGROUPS NK_INTEGER */ + { 170, -3 }, /* (71) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 170, -3 }, /* (72) db_options ::= db_options STREAM_MODE NK_INTEGER */ + { 170, -3 }, /* (73) db_options ::= db_options RETENTIONS NK_STRING */ + { 170, -3 }, /* (74) db_options ::= db_options FILE_FACTOR NK_FLOAT */ + { 172, -1 }, /* (75) alter_db_options ::= alter_db_option */ + { 172, -2 }, /* (76) alter_db_options ::= alter_db_options alter_db_option */ + { 173, -2 }, /* (77) alter_db_option ::= BLOCKS NK_INTEGER */ + { 173, -2 }, /* (78) alter_db_option ::= FSYNC NK_INTEGER */ + { 173, -2 }, /* (79) alter_db_option ::= KEEP NK_INTEGER */ + { 173, -2 }, /* (80) alter_db_option ::= WAL NK_INTEGER */ + { 173, -2 }, /* (81) alter_db_option ::= QUORUM NK_INTEGER */ + { 173, -2 }, /* (82) alter_db_option ::= CACHELAST NK_INTEGER */ + { 160, -9 }, /* (83) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 160, -3 }, /* (84) cmd ::= CREATE TABLE multi_create_clause */ + { 160, -9 }, /* (85) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 160, -3 }, /* (86) cmd ::= DROP TABLE multi_drop_clause */ + { 160, -4 }, /* (87) cmd ::= DROP STABLE exists_opt full_table_name */ + { 160, -2 }, /* (88) cmd ::= SHOW TABLES */ + { 160, -2 }, /* (89) cmd ::= SHOW STABLES */ + { 160, -3 }, /* (90) cmd ::= ALTER TABLE alter_table_clause */ + { 160, -3 }, /* (91) cmd ::= ALTER STABLE alter_table_clause */ + { 181, -2 }, /* (92) alter_table_clause ::= full_table_name alter_table_options */ + { 181, -5 }, /* (93) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 181, -4 }, /* (94) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 181, -5 }, /* (95) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 181, -5 }, /* (96) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 181, -5 }, /* (97) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 181, -4 }, /* (98) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 181, -5 }, /* (99) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 181, -5 }, /* (100) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 181, -6 }, /* (101) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ literal */ + { 178, -1 }, /* (102) multi_create_clause ::= create_subtable_clause */ + { 178, -2 }, /* (103) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 185, -9 }, /* (104) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP */ + { 180, -1 }, /* (105) multi_drop_clause ::= drop_table_clause */ + { 180, -2 }, /* (106) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 188, -2 }, /* (107) drop_table_clause ::= exists_opt full_table_name */ + { 186, 0 }, /* (108) specific_tags_opt ::= */ + { 186, -3 }, /* (109) specific_tags_opt ::= NK_LP col_name_list NK_RP */ + { 174, -1 }, /* (110) full_table_name ::= table_name */ + { 174, -3 }, /* (111) full_table_name ::= db_name NK_DOT table_name */ + { 175, -1 }, /* (112) column_def_list ::= column_def */ + { 175, -3 }, /* (113) column_def_list ::= column_def_list NK_COMMA column_def */ + { 191, -2 }, /* (114) column_def ::= column_name type_name */ + { 191, -4 }, /* (115) column_def ::= column_name type_name COMMENT NK_STRING */ + { 184, -1 }, /* (116) type_name ::= BOOL */ + { 184, -1 }, /* (117) type_name ::= TINYINT */ + { 184, -1 }, /* (118) type_name ::= SMALLINT */ + { 184, -1 }, /* (119) type_name ::= INT */ + { 184, -1 }, /* (120) type_name ::= INTEGER */ + { 184, -1 }, /* (121) type_name ::= BIGINT */ + { 184, -1 }, /* (122) type_name ::= FLOAT */ + { 184, -1 }, /* (123) type_name ::= DOUBLE */ + { 184, -4 }, /* (124) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 184, -1 }, /* (125) type_name ::= TIMESTAMP */ + { 184, -4 }, /* (126) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 184, -2 }, /* (127) type_name ::= TINYINT UNSIGNED */ + { 184, -2 }, /* (128) type_name ::= SMALLINT UNSIGNED */ + { 184, -2 }, /* (129) type_name ::= INT UNSIGNED */ + { 184, -2 }, /* (130) type_name ::= BIGINT UNSIGNED */ + { 184, -1 }, /* (131) type_name ::= JSON */ + { 184, -4 }, /* (132) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 184, -1 }, /* (133) type_name ::= MEDIUMBLOB */ + { 184, -1 }, /* (134) type_name ::= BLOB */ + { 184, -4 }, /* (135) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 184, -1 }, /* (136) type_name ::= DECIMAL */ + { 184, -4 }, /* (137) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 184, -6 }, /* (138) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 176, 0 }, /* (139) tags_def_opt ::= */ + { 176, -1 }, /* (140) tags_def_opt ::= tags_def */ + { 179, -4 }, /* (141) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 177, 0 }, /* (142) table_options ::= */ + { 177, -3 }, /* (143) table_options ::= table_options COMMENT NK_STRING */ + { 177, -3 }, /* (144) table_options ::= table_options KEEP NK_INTEGER */ + { 177, -3 }, /* (145) table_options ::= table_options TTL NK_INTEGER */ + { 177, -5 }, /* (146) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 177, -5 }, /* (147) table_options ::= table_options ROLLUP NK_LP func_name_list NK_RP */ + { 182, -1 }, /* (148) alter_table_options ::= alter_table_option */ + { 182, -2 }, /* (149) alter_table_options ::= alter_table_options alter_table_option */ + { 193, -2 }, /* (150) alter_table_option ::= COMMENT NK_STRING */ + { 193, -2 }, /* (151) alter_table_option ::= KEEP NK_INTEGER */ + { 193, -2 }, /* (152) alter_table_option ::= TTL NK_INTEGER */ + { 189, -1 }, /* (153) col_name_list ::= col_name */ + { 189, -3 }, /* (154) col_name_list ::= col_name_list NK_COMMA col_name */ + { 194, -1 }, /* (155) col_name ::= column_name */ + { 192, -1 }, /* (156) func_name_list ::= func_name */ + { 192, -3 }, /* (157) func_name_list ::= func_name_list NK_COMMA col_name */ + { 195, -1 }, /* (158) func_name ::= function_name */ + { 160, -7 }, /* (159) cmd ::= CREATE SMA INDEX index_name ON table_name index_options */ + { 160, -9 }, /* (160) cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP */ + { 160, -5 }, /* (161) cmd ::= DROP INDEX index_name ON table_name */ + { 198, 0 }, /* (162) index_options ::= */ + { 198, -9 }, /* (163) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt */ + { 198, -11 }, /* (164) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt */ + { 199, -1 }, /* (165) func_list ::= func */ + { 199, -3 }, /* (166) func_list ::= func_list NK_COMMA func */ + { 202, -4 }, /* (167) func ::= function_name NK_LP expression_list NK_RP */ + { 160, -6 }, /* (168) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ + { 160, -6 }, /* (169) cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name */ + { 160, -4 }, /* (170) cmd ::= DROP TOPIC exists_opt topic_name */ + { 160, -2 }, /* (171) cmd ::= SHOW VGROUPS */ + { 160, -4 }, /* (172) cmd ::= SHOW db_name NK_DOT VGROUPS */ + { 160, -2 }, /* (173) cmd ::= SHOW MNODES */ + { 160, -1 }, /* (174) cmd ::= query_expression */ + { 163, -1 }, /* (175) literal ::= NK_INTEGER */ + { 163, -1 }, /* (176) literal ::= NK_FLOAT */ + { 163, -1 }, /* (177) literal ::= NK_STRING */ + { 163, -1 }, /* (178) literal ::= NK_BOOL */ + { 163, -2 }, /* (179) literal ::= TIMESTAMP NK_STRING */ + { 163, -1 }, /* (180) literal ::= duration_literal */ + { 200, -1 }, /* (181) duration_literal ::= NK_VARIABLE */ + { 187, -1 }, /* (182) literal_list ::= literal */ + { 187, -3 }, /* (183) literal_list ::= literal_list NK_COMMA literal */ + { 169, -1 }, /* (184) db_name ::= NK_ID */ + { 190, -1 }, /* (185) table_name ::= NK_ID */ + { 183, -1 }, /* (186) column_name ::= NK_ID */ + { 196, -1 }, /* (187) function_name ::= NK_ID */ + { 206, -1 }, /* (188) table_alias ::= NK_ID */ + { 207, -1 }, /* (189) column_alias ::= NK_ID */ + { 165, -1 }, /* (190) user_name ::= NK_ID */ + { 197, -1 }, /* (191) index_name ::= NK_ID */ + { 204, -1 }, /* (192) topic_name ::= NK_ID */ + { 208, -1 }, /* (193) expression ::= literal */ + { 208, -1 }, /* (194) expression ::= column_reference */ + { 208, -4 }, /* (195) expression ::= function_name NK_LP expression_list NK_RP */ + { 208, -4 }, /* (196) expression ::= function_name NK_LP NK_STAR NK_RP */ + { 208, -1 }, /* (197) expression ::= subquery */ + { 208, -3 }, /* (198) expression ::= NK_LP expression NK_RP */ + { 208, -2 }, /* (199) expression ::= NK_PLUS expression */ + { 208, -2 }, /* (200) expression ::= NK_MINUS expression */ + { 208, -3 }, /* (201) expression ::= expression NK_PLUS expression */ + { 208, -3 }, /* (202) expression ::= expression NK_MINUS expression */ + { 208, -3 }, /* (203) expression ::= expression NK_STAR expression */ + { 208, -3 }, /* (204) expression ::= expression NK_SLASH expression */ + { 208, -3 }, /* (205) expression ::= expression NK_REM expression */ + { 203, -1 }, /* (206) expression_list ::= expression */ + { 203, -3 }, /* (207) expression_list ::= expression_list NK_COMMA expression */ + { 209, -1 }, /* (208) column_reference ::= column_name */ + { 209, -3 }, /* (209) column_reference ::= table_name NK_DOT column_name */ + { 211, -3 }, /* (210) predicate ::= expression compare_op expression */ + { 211, -5 }, /* (211) predicate ::= expression BETWEEN expression AND expression */ + { 211, -6 }, /* (212) predicate ::= expression NOT BETWEEN expression AND expression */ + { 211, -3 }, /* (213) predicate ::= expression IS NULL */ + { 211, -4 }, /* (214) predicate ::= expression IS NOT NULL */ + { 211, -3 }, /* (215) predicate ::= expression in_op in_predicate_value */ + { 212, -1 }, /* (216) compare_op ::= NK_LT */ + { 212, -1 }, /* (217) compare_op ::= NK_GT */ + { 212, -1 }, /* (218) compare_op ::= NK_LE */ + { 212, -1 }, /* (219) compare_op ::= NK_GE */ + { 212, -1 }, /* (220) compare_op ::= NK_NE */ + { 212, -1 }, /* (221) compare_op ::= NK_EQ */ + { 212, -1 }, /* (222) compare_op ::= LIKE */ + { 212, -2 }, /* (223) compare_op ::= NOT LIKE */ + { 212, -1 }, /* (224) compare_op ::= MATCH */ + { 212, -1 }, /* (225) compare_op ::= NMATCH */ + { 213, -1 }, /* (226) in_op ::= IN */ + { 213, -2 }, /* (227) in_op ::= NOT IN */ + { 214, -3 }, /* (228) in_predicate_value ::= NK_LP expression_list NK_RP */ + { 215, -1 }, /* (229) boolean_value_expression ::= boolean_primary */ + { 215, -2 }, /* (230) boolean_value_expression ::= NOT boolean_primary */ + { 215, -3 }, /* (231) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 215, -3 }, /* (232) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 216, -1 }, /* (233) boolean_primary ::= predicate */ + { 216, -3 }, /* (234) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 217, -1 }, /* (235) common_expression ::= expression */ + { 217, -1 }, /* (236) common_expression ::= boolean_value_expression */ + { 218, -2 }, /* (237) from_clause ::= FROM table_reference_list */ + { 219, -1 }, /* (238) table_reference_list ::= table_reference */ + { 219, -3 }, /* (239) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 220, -1 }, /* (240) table_reference ::= table_primary */ + { 220, -1 }, /* (241) table_reference ::= joined_table */ + { 221, -2 }, /* (242) table_primary ::= table_name alias_opt */ + { 221, -4 }, /* (243) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 221, -2 }, /* (244) table_primary ::= subquery alias_opt */ + { 221, -1 }, /* (245) table_primary ::= parenthesized_joined_table */ + { 223, 0 }, /* (246) alias_opt ::= */ + { 223, -1 }, /* (247) alias_opt ::= table_alias */ + { 223, -2 }, /* (248) alias_opt ::= AS table_alias */ + { 224, -3 }, /* (249) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 224, -3 }, /* (250) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 222, -6 }, /* (251) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 225, 0 }, /* (252) join_type ::= */ + { 225, -1 }, /* (253) join_type ::= INNER */ + { 227, -9 }, /* (254) query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + { 228, 0 }, /* (255) set_quantifier_opt ::= */ + { 228, -1 }, /* (256) set_quantifier_opt ::= DISTINCT */ + { 228, -1 }, /* (257) set_quantifier_opt ::= ALL */ + { 229, -1 }, /* (258) select_list ::= NK_STAR */ + { 229, -1 }, /* (259) select_list ::= select_sublist */ + { 235, -1 }, /* (260) select_sublist ::= select_item */ + { 235, -3 }, /* (261) select_sublist ::= select_sublist NK_COMMA select_item */ + { 236, -1 }, /* (262) select_item ::= common_expression */ + { 236, -2 }, /* (263) select_item ::= common_expression column_alias */ + { 236, -3 }, /* (264) select_item ::= common_expression AS column_alias */ + { 236, -3 }, /* (265) select_item ::= table_name NK_DOT NK_STAR */ + { 230, 0 }, /* (266) where_clause_opt ::= */ + { 230, -2 }, /* (267) where_clause_opt ::= WHERE search_condition */ + { 231, 0 }, /* (268) partition_by_clause_opt ::= */ + { 231, -3 }, /* (269) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 232, 0 }, /* (270) twindow_clause_opt ::= */ + { 232, -6 }, /* (271) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ + { 232, -4 }, /* (272) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ + { 232, -6 }, /* (273) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 232, -8 }, /* (274) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 201, 0 }, /* (275) sliding_opt ::= */ + { 201, -4 }, /* (276) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 237, 0 }, /* (277) fill_opt ::= */ + { 237, -4 }, /* (278) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 237, -6 }, /* (279) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 238, -1 }, /* (280) fill_mode ::= NONE */ + { 238, -1 }, /* (281) fill_mode ::= PREV */ + { 238, -1 }, /* (282) fill_mode ::= NULL */ + { 238, -1 }, /* (283) fill_mode ::= LINEAR */ + { 238, -1 }, /* (284) fill_mode ::= NEXT */ + { 233, 0 }, /* (285) group_by_clause_opt ::= */ + { 233, -3 }, /* (286) group_by_clause_opt ::= GROUP BY group_by_list */ + { 239, -1 }, /* (287) group_by_list ::= expression */ + { 239, -3 }, /* (288) group_by_list ::= group_by_list NK_COMMA expression */ + { 234, 0 }, /* (289) having_clause_opt ::= */ + { 234, -2 }, /* (290) having_clause_opt ::= HAVING search_condition */ + { 205, -4 }, /* (291) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 240, -1 }, /* (292) query_expression_body ::= query_primary */ + { 240, -4 }, /* (293) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 244, -1 }, /* (294) query_primary ::= query_specification */ + { 241, 0 }, /* (295) order_by_clause_opt ::= */ + { 241, -3 }, /* (296) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 242, 0 }, /* (297) slimit_clause_opt ::= */ + { 242, -2 }, /* (298) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 242, -4 }, /* (299) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 242, -4 }, /* (300) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 243, 0 }, /* (301) limit_clause_opt ::= */ + { 243, -2 }, /* (302) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 243, -4 }, /* (303) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 243, -4 }, /* (304) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 210, -3 }, /* (305) subquery ::= NK_LP query_expression NK_RP */ + { 226, -1 }, /* (306) search_condition ::= common_expression */ + { 245, -1 }, /* (307) sort_specification_list ::= sort_specification */ + { 245, -3 }, /* (308) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 246, -3 }, /* (309) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 247, 0 }, /* (310) ordering_specification_opt ::= */ + { 247, -1 }, /* (311) ordering_specification_opt ::= ASC */ + { 247, -1 }, /* (312) ordering_specification_opt ::= DESC */ + { 248, 0 }, /* (313) null_ordering_opt ::= */ + { 248, -2 }, /* (314) null_ordering_opt ::= NULLS FIRST */ + { 248, -2 }, /* (315) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1990,794 +2218,964 @@ static YYACTIONTYPE yy_reduce( */ /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; - case 0: /* cmd ::= CREATE USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy0); } + case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ +{ pCxt->valid = false; generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } + yy_destructor(yypParser,161,&yymsp[0].minor); + break; + case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ +{ pCxt->valid = false; generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } + yy_destructor(yypParser,162,&yymsp[0].minor); + break; + case 2: /* account_options ::= */ +{ } + break; + case 3: /* account_options ::= account_options PPS literal */ + case 4: /* account_options ::= account_options TSERIES literal */ yytestcase(yyruleno==4); + case 5: /* account_options ::= account_options STORAGE literal */ yytestcase(yyruleno==5); + case 6: /* account_options ::= account_options STREAMS literal */ yytestcase(yyruleno==6); + case 7: /* account_options ::= account_options QTIME literal */ yytestcase(yyruleno==7); + case 8: /* account_options ::= account_options DBS literal */ yytestcase(yyruleno==8); + case 9: /* account_options ::= account_options USERS literal */ yytestcase(yyruleno==9); + case 10: /* account_options ::= account_options CONNS literal */ yytestcase(yyruleno==10); + case 11: /* account_options ::= account_options STATE literal */ yytestcase(yyruleno==11); +{ yy_destructor(yypParser,161,&yymsp[-2].minor); +{ } + yy_destructor(yypParser,163,&yymsp[0].minor); +} + break; + case 12: /* alter_account_options ::= alter_account_option */ +{ yy_destructor(yypParser,164,&yymsp[0].minor); +{ } +} break; - case 1: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy129, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } + case 13: /* alter_account_options ::= alter_account_options alter_account_option */ +{ yy_destructor(yypParser,162,&yymsp[-1].minor); +{ } + yy_destructor(yypParser,164,&yymsp[0].minor); +} + break; + case 14: /* alter_account_option ::= PASS literal */ + case 15: /* alter_account_option ::= PPS literal */ yytestcase(yyruleno==15); + case 16: /* alter_account_option ::= TSERIES literal */ yytestcase(yyruleno==16); + case 17: /* alter_account_option ::= STORAGE literal */ yytestcase(yyruleno==17); + case 18: /* alter_account_option ::= STREAMS literal */ yytestcase(yyruleno==18); + case 19: /* alter_account_option ::= QTIME literal */ yytestcase(yyruleno==19); + case 20: /* alter_account_option ::= DBS literal */ yytestcase(yyruleno==20); + case 21: /* alter_account_option ::= USERS literal */ yytestcase(yyruleno==21); + case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22); + case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23); +{ } + yy_destructor(yypParser,163,&yymsp[0].minor); + break; + case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING */ +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy0); } break; - case 2: /* cmd ::= ALTER USER user_name PRIVILEGE NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy129, TSDB_ALTER_USER_PRIVILEGES, &yymsp[0].minor.yy0); } + case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy353, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; - case 3: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy129); } + case 26: /* cmd ::= ALTER USER user_name PRIVILEGE NK_STRING */ +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy353, TSDB_ALTER_USER_PRIVILEGES, &yymsp[0].minor.yy0); } break; - case 4: /* cmd ::= SHOW USERS */ + case 27: /* cmd ::= DROP USER user_name */ +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy353); } + break; + case 28: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT, NULL); } break; - case 5: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy129, NULL); } + case 29: /* cmd ::= CREATE DNODE dnode_endpoint */ +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy353, NULL); } break; - case 6: /* cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy0); } + case 30: /* cmd ::= CREATE DNODE dnode_host_name PORT NK_INTEGER */ +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy0); } break; - case 7: /* cmd ::= DROP DNODE NK_INTEGER */ + case 31: /* cmd ::= DROP DNODE NK_INTEGER */ { pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 8: /* cmd ::= DROP DNODE dnode_endpoint */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy129); } + case 32: /* cmd ::= DROP DNODE dnode_endpoint */ +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy353); } break; - case 9: /* cmd ::= SHOW DNODES */ + case 33: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT, NULL); } break; - case 10: /* dnode_endpoint ::= NK_STRING */ - case 11: /* dnode_host_name ::= NK_ID */ yytestcase(yyruleno==11); - case 12: /* dnode_host_name ::= NK_IPTOKEN */ yytestcase(yyruleno==12); - case 123: /* db_name ::= NK_ID */ yytestcase(yyruleno==123); - case 124: /* table_name ::= NK_ID */ yytestcase(yyruleno==124); - case 125: /* column_name ::= NK_ID */ yytestcase(yyruleno==125); - case 126: /* function_name ::= NK_ID */ yytestcase(yyruleno==126); - case 127: /* table_alias ::= NK_ID */ yytestcase(yyruleno==127); - case 128: /* column_alias ::= NK_ID */ yytestcase(yyruleno==128); - case 129: /* user_name ::= NK_ID */ yytestcase(yyruleno==129); - case 130: /* index_name ::= NK_ID */ yytestcase(yyruleno==130); - case 131: /* topic_name ::= NK_ID */ yytestcase(yyruleno==131); -{ yylhsminor.yy129 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy129 = yylhsminor.yy129; - break; - case 13: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + case 34: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ +{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } + break; + case 35: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ +{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } + break; + case 36: /* cmd ::= ALTER ALL DNODES NK_STRING */ +{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[0].minor.yy0, NULL); } + break; + case 37: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ +{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } + break; + case 38: /* dnode_endpoint ::= NK_STRING */ + case 39: /* dnode_host_name ::= NK_ID */ yytestcase(yyruleno==39); + case 40: /* dnode_host_name ::= NK_IPTOKEN */ yytestcase(yyruleno==40); + case 184: /* db_name ::= NK_ID */ yytestcase(yyruleno==184); + case 185: /* table_name ::= NK_ID */ yytestcase(yyruleno==185); + case 186: /* column_name ::= NK_ID */ yytestcase(yyruleno==186); + case 187: /* function_name ::= NK_ID */ yytestcase(yyruleno==187); + case 188: /* table_alias ::= NK_ID */ yytestcase(yyruleno==188); + case 189: /* column_alias ::= NK_ID */ yytestcase(yyruleno==189); + case 190: /* user_name ::= NK_ID */ yytestcase(yyruleno==190); + case 191: /* index_name ::= NK_ID */ yytestcase(yyruleno==191); + case 192: /* topic_name ::= NK_ID */ yytestcase(yyruleno==192); +{ yylhsminor.yy353 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy353 = yylhsminor.yy353; + break; + case 41: /* cmd ::= ALTER LOCAL NK_STRING */ +{ pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } + break; + case 42: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */ +{ pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } + break; + case 43: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createCreateQnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 14: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + case 44: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createDropQnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 15: /* cmd ::= SHOW QNODES */ + case 45: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT, NULL); } break; - case 16: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy97, &yymsp[-1].minor.yy129, yymsp[0].minor.yy432); } + case 46: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy107, &yymsp[-1].minor.yy353, yymsp[0].minor.yy26); } break; - case 17: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy97, &yymsp[0].minor.yy129); } + case 47: /* cmd ::= DROP DATABASE exists_opt db_name */ +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy107, &yymsp[0].minor.yy353); } break; - case 18: /* cmd ::= SHOW DATABASES */ + case 48: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT, NULL); } break; - case 19: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy129); } + case 49: /* cmd ::= USE db_name */ +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy353); } break; - case 20: /* cmd ::= ALTER DATABASE db_name db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy129, yymsp[0].minor.yy432); } + case 50: /* cmd ::= ALTER DATABASE db_name alter_db_options */ +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy353, yymsp[0].minor.yy26); } break; - case 21: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy97 = true; } + case 51: /* not_exists_opt ::= IF NOT EXISTS */ +{ yymsp[-2].minor.yy107 = true; } break; - case 22: /* not_exists_opt ::= */ - case 24: /* exists_opt ::= */ yytestcase(yyruleno==24); - case 194: /* set_quantifier_opt ::= */ yytestcase(yyruleno==194); -{ yymsp[1].minor.yy97 = false; } + case 52: /* not_exists_opt ::= */ + case 54: /* exists_opt ::= */ yytestcase(yyruleno==54); + case 255: /* set_quantifier_opt ::= */ yytestcase(yyruleno==255); +{ yymsp[1].minor.yy107 = false; } break; - case 23: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy97 = true; } + case 53: /* exists_opt ::= IF EXISTS */ +{ yymsp[-1].minor.yy107 = true; } break; - case 25: /* db_options ::= */ -{ yymsp[1].minor.yy432 = createDefaultDatabaseOptions(pCxt); } + case 55: /* db_options ::= */ +{ yymsp[1].minor.yy26 = createDefaultDatabaseOptions(pCxt); } break; - case 26: /* db_options ::= db_options BLOCKS NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 56: /* db_options ::= db_options BLOCKS NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 27: /* db_options ::= db_options CACHE NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 57: /* db_options ::= db_options CACHE NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 28: /* db_options ::= db_options CACHELAST NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 58: /* db_options ::= db_options CACHELAST NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 29: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 59: /* db_options ::= db_options COMP NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 30: /* db_options ::= db_options DAYS NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 60: /* db_options ::= db_options DAYS NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 31: /* db_options ::= db_options FSYNC NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 61: /* db_options ::= db_options FSYNC NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 32: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 62: /* db_options ::= db_options MAXROWS NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 33: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 63: /* db_options ::= db_options MINROWS NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 34: /* db_options ::= db_options KEEP NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 64: /* db_options ::= db_options KEEP NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 35: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 65: /* db_options ::= db_options PRECISION NK_STRING */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 36: /* db_options ::= db_options QUORUM NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 66: /* db_options ::= db_options QUORUM NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 37: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 67: /* db_options ::= db_options REPLICA NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 38: /* db_options ::= db_options TTL NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 68: /* db_options ::= db_options TTL NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 39: /* db_options ::= db_options WAL NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 69: /* db_options ::= db_options WAL NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 40: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 70: /* db_options ::= db_options VGROUPS NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 41: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_SINGLESTABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 71: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 42: /* db_options ::= db_options STREAM_MODE NK_INTEGER */ -{ yylhsminor.yy432 = setDatabaseOption(pCxt, yymsp[-2].minor.yy432, DB_OPTION_STREAMMODE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 72: /* db_options ::= db_options STREAM_MODE NK_INTEGER */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_STREAM_MODE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 43: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 45: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==45); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy97, yymsp[-5].minor.yy432, yymsp[-3].minor.yy24, yymsp[-1].minor.yy24, yymsp[0].minor.yy432);} + case 73: /* db_options ::= db_options RETENTIONS NK_STRING */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_RETENTIONS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 44: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy24);} + case 74: /* db_options ::= db_options FILE_FACTOR NK_FLOAT */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-2].minor.yy26, DB_OPTION_FILE_FACTOR, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 46: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy24); } + case 75: /* alter_db_options ::= alter_db_option */ +{ yylhsminor.yy26 = createDefaultAlterDatabaseOptions(pCxt); yylhsminor.yy26 = setDatabaseOption(pCxt, yylhsminor.yy26, yymsp[0].minor.yy443.type, &yymsp[0].minor.yy443.val); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 47: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy97, yymsp[0].minor.yy432); } + case 76: /* alter_db_options ::= alter_db_options alter_db_option */ +{ yylhsminor.yy26 = setDatabaseOption(pCxt, yymsp[-1].minor.yy26, yymsp[0].minor.yy443.type, &yymsp[0].minor.yy443.val); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 48: /* cmd ::= SHOW TABLES */ + case 77: /* alter_db_option ::= BLOCKS NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_BLOCKS; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 78: /* alter_db_option ::= FSYNC NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 79: /* alter_db_option ::= KEEP NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_KEEP; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 80: /* alter_db_option ::= WAL NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_WAL; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 81: /* alter_db_option ::= QUORUM NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_QUORUM; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 82: /* alter_db_option ::= CACHELAST NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = DB_OPTION_CACHELAST; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } + break; + case 83: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 85: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==85); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy107, yymsp[-5].minor.yy26, yymsp[-3].minor.yy64, yymsp[-1].minor.yy64, yymsp[0].minor.yy26); } + break; + case 84: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy64); } + break; + case 86: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy64); } + break; + case 87: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy107, yymsp[0].minor.yy26); } + break; + case 88: /* cmd ::= SHOW TABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT, NULL); } break; - case 49: /* cmd ::= SHOW STABLES */ + case 89: /* cmd ::= SHOW STABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STABLES_STMT, NULL); } break; - case 50: /* multi_create_clause ::= create_subtable_clause */ - case 53: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==53); - case 60: /* column_def_list ::= column_def */ yytestcase(yyruleno==60); - case 95: /* col_name_list ::= col_name */ yytestcase(yyruleno==95); - case 104: /* func_list ::= func */ yytestcase(yyruleno==104); - case 199: /* select_sublist ::= select_item */ yytestcase(yyruleno==199); - case 246: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==246); -{ yylhsminor.yy24 = createNodeList(pCxt, yymsp[0].minor.yy432); } - yymsp[0].minor.yy24 = yylhsminor.yy24; + case 90: /* cmd ::= ALTER TABLE alter_table_clause */ + case 91: /* cmd ::= ALTER STABLE alter_table_clause */ yytestcase(yyruleno==91); + case 174: /* cmd ::= query_expression */ yytestcase(yyruleno==174); +{ pCxt->pRootNode = yymsp[0].minor.yy26; } + break; + case 92: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy26 = createAlterTableOption(pCxt, yymsp[-1].minor.yy26, yymsp[0].minor.yy26); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; + break; + case 93: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy26 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy353, yymsp[0].minor.yy370); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 94: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy26 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy26, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy353); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; + break; + case 95: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy26 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy353, yymsp[0].minor.yy370); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 96: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy26 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy353, &yymsp[0].minor.yy353); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 97: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy26 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy353, yymsp[0].minor.yy370); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 98: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy26 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy26, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy353); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; + break; + case 99: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy26 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy353, yymsp[0].minor.yy370); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 100: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy26 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy26, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy353, &yymsp[0].minor.yy353); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; + break; + case 101: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ literal */ +{ yylhsminor.yy26 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy26, &yymsp[-2].minor.yy353, yymsp[0].minor.yy26); } + yymsp[-5].minor.yy26 = yylhsminor.yy26; break; - case 51: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 54: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==54); -{ yylhsminor.yy24 = addNodeToList(pCxt, yymsp[-1].minor.yy24, yymsp[0].minor.yy432); } - yymsp[-1].minor.yy24 = yylhsminor.yy24; + case 102: /* multi_create_clause ::= create_subtable_clause */ + case 105: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==105); + case 112: /* column_def_list ::= column_def */ yytestcase(yyruleno==112); + case 153: /* col_name_list ::= col_name */ yytestcase(yyruleno==153); + case 156: /* func_name_list ::= func_name */ yytestcase(yyruleno==156); + case 165: /* func_list ::= func */ yytestcase(yyruleno==165); + case 260: /* select_sublist ::= select_item */ yytestcase(yyruleno==260); + case 307: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==307); +{ yylhsminor.yy64 = createNodeList(pCxt, yymsp[0].minor.yy26); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 52: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP */ -{ yylhsminor.yy432 = createCreateSubTableClause(pCxt, yymsp[-8].minor.yy97, yymsp[-7].minor.yy432, yymsp[-5].minor.yy432, yymsp[-4].minor.yy24, yymsp[-1].minor.yy24); } - yymsp[-8].minor.yy432 = yylhsminor.yy432; + case 103: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 106: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==106); +{ yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-1].minor.yy64, yymsp[0].minor.yy26); } + yymsp[-1].minor.yy64 = yylhsminor.yy64; break; - case 55: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy432 = createDropTableClause(pCxt, yymsp[-1].minor.yy97, yymsp[0].minor.yy432); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + case 104: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_tags_opt TAGS NK_LP literal_list NK_RP */ +{ yylhsminor.yy26 = createCreateSubTableClause(pCxt, yymsp[-8].minor.yy107, yymsp[-7].minor.yy26, yymsp[-5].minor.yy26, yymsp[-4].minor.yy64, yymsp[-1].minor.yy64); } + yymsp[-8].minor.yy26 = yylhsminor.yy26; break; - case 56: /* specific_tags_opt ::= */ - case 87: /* tags_def_opt ::= */ yytestcase(yyruleno==87); - case 207: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==207); - case 224: /* group_by_clause_opt ::= */ yytestcase(yyruleno==224); - case 234: /* order_by_clause_opt ::= */ yytestcase(yyruleno==234); -{ yymsp[1].minor.yy24 = NULL; } + case 107: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy26 = createDropTableClause(pCxt, yymsp[-1].minor.yy107, yymsp[0].minor.yy26); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 57: /* specific_tags_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy24 = yymsp[-1].minor.yy24; } + case 108: /* specific_tags_opt ::= */ + case 139: /* tags_def_opt ::= */ yytestcase(yyruleno==139); + case 268: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==268); + case 285: /* group_by_clause_opt ::= */ yytestcase(yyruleno==285); + case 295: /* order_by_clause_opt ::= */ yytestcase(yyruleno==295); +{ yymsp[1].minor.yy64 = NULL; } break; - case 58: /* full_table_name ::= table_name */ -{ yylhsminor.yy432 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy129, NULL); } - yymsp[0].minor.yy432 = yylhsminor.yy432; + case 109: /* specific_tags_opt ::= NK_LP col_name_list NK_RP */ +{ yymsp[-2].minor.yy64 = yymsp[-1].minor.yy64; } break; - case 59: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy432 = createRealTableNode(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129, NULL); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 110: /* full_table_name ::= table_name */ +{ yylhsminor.yy26 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy353, NULL); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 61: /* column_def_list ::= column_def_list NK_COMMA column_def */ - case 96: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==96); - case 105: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==105); - case 200: /* select_sublist ::= select_sublist NK_COMMA select_item */ yytestcase(yyruleno==200); - case 247: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==247); -{ yylhsminor.yy24 = addNodeToList(pCxt, yymsp[-2].minor.yy24, yymsp[0].minor.yy432); } - yymsp[-2].minor.yy24 = yylhsminor.yy24; + case 111: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy26 = createRealTableNode(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy353, NULL); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 62: /* column_def ::= column_name type_name */ -{ yylhsminor.yy432 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy129, yymsp[0].minor.yy224, NULL); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + case 113: /* column_def_list ::= column_def_list NK_COMMA column_def */ + case 154: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==154); + case 157: /* func_name_list ::= func_name_list NK_COMMA col_name */ yytestcase(yyruleno==157); + case 166: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==166); + case 261: /* select_sublist ::= select_sublist NK_COMMA select_item */ yytestcase(yyruleno==261); + case 308: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==308); +{ yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, yymsp[0].minor.yy26); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; - case 63: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy432 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy129, yymsp[-2].minor.yy224, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + case 114: /* column_def ::= column_name type_name */ +{ yylhsminor.yy26 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy353, yymsp[0].minor.yy370, NULL); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 64: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BOOL); } + case 115: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy26 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy353, yymsp[-2].minor.yy370, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; break; - case 65: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_TINYINT); } + case 116: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 66: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + case 117: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 67: /* type_name ::= INT */ - case 68: /* type_name ::= INTEGER */ yytestcase(yyruleno==68); -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_INT); } + case 118: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 69: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BIGINT); } + case 119: /* type_name ::= INT */ + case 120: /* type_name ::= INTEGER */ yytestcase(yyruleno==120); +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 70: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_FLOAT); } + case 121: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 71: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + case 122: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 72: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + case 123: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 73: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + case 124: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy370 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 74: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + case 125: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 75: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + case 126: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy370 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 76: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + case 127: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy370 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 77: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UINT); } + case 128: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy370 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 78: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy224 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + case 129: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy370 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 79: /* type_name ::= JSON */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_JSON); } + case 130: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy370 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 80: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + case 131: /* type_name ::= JSON */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 81: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + case 132: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy370 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 82: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_BLOB); } + case 133: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 83: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + case 134: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 84: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 135: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy370 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 85: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 136: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy370 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 86: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy224 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 137: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy370 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 88: /* tags_def_opt ::= tags_def */ - case 198: /* select_list ::= select_sublist */ yytestcase(yyruleno==198); -{ yylhsminor.yy24 = yymsp[0].minor.yy24; } - yymsp[0].minor.yy24 = yylhsminor.yy24; + case 138: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy370 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 89: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy24 = yymsp[-1].minor.yy24; } + case 140: /* tags_def_opt ::= tags_def */ + case 259: /* select_list ::= select_sublist */ yytestcase(yyruleno==259); +{ yylhsminor.yy64 = yymsp[0].minor.yy64; } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 90: /* table_options ::= */ -{ yymsp[1].minor.yy432 = createDefaultTableOptions(pCxt);} + case 141: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ +{ yymsp[-3].minor.yy64 = yymsp[-1].minor.yy64; } break; - case 91: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy432 = setTableOption(pCxt, yymsp[-2].minor.yy432, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 142: /* table_options ::= */ +{ yymsp[1].minor.yy26 = createDefaultTableOptions(pCxt); } break; - case 92: /* table_options ::= table_options KEEP NK_INTEGER */ -{ yylhsminor.yy432 = setTableOption(pCxt, yymsp[-2].minor.yy432, TABLE_OPTION_KEEP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 143: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy26 = setTableOption(pCxt, yymsp[-2].minor.yy26, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 93: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy432 = setTableOption(pCxt, yymsp[-2].minor.yy432, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 144: /* table_options ::= table_options KEEP NK_INTEGER */ +{ yylhsminor.yy26 = setTableOption(pCxt, yymsp[-2].minor.yy26, TABLE_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 94: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy432 = setTableSmaOption(pCxt, yymsp[-4].minor.yy432, yymsp[-1].minor.yy24); } - yymsp[-4].minor.yy432 = yylhsminor.yy432; + case 145: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy26 = setTableOption(pCxt, yymsp[-2].minor.yy26, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 97: /* col_name ::= column_name */ -{ yylhsminor.yy432 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy129); } - yymsp[0].minor.yy432 = yylhsminor.yy432; + case 146: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy26 = setTableSmaOption(pCxt, yymsp[-4].minor.yy26, yymsp[-1].minor.yy64); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; break; - case 98: /* cmd ::= CREATE SMA INDEX index_name ON table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, &yymsp[-3].minor.yy129, &yymsp[-1].minor.yy129, NULL, yymsp[0].minor.yy432); } + case 147: /* table_options ::= table_options ROLLUP NK_LP func_name_list NK_RP */ +{ yylhsminor.yy26 = setTableRollupOption(pCxt, yymsp[-4].minor.yy26, yymsp[-1].minor.yy64); } + yymsp[-4].minor.yy26 = yylhsminor.yy26; break; - case 99: /* cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_FULLTEXT, &yymsp[-5].minor.yy129, &yymsp[-3].minor.yy129, yymsp[-1].minor.yy24, NULL); } + case 148: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy26 = createDefaultAlterTableOptions(pCxt); yylhsminor.yy26 = setTableOption(pCxt, yylhsminor.yy26, yymsp[0].minor.yy443.type, &yymsp[0].minor.yy443.val); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 100: /* cmd ::= DROP INDEX index_name ON table_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129); } + case 149: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy26 = setTableOption(pCxt, yymsp[-1].minor.yy26, yymsp[0].minor.yy443.type, &yymsp[0].minor.yy443.val); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 101: /* index_options ::= */ - case 205: /* where_clause_opt ::= */ yytestcase(yyruleno==205); - case 209: /* twindow_clause_opt ::= */ yytestcase(yyruleno==209); - case 214: /* sliding_opt ::= */ yytestcase(yyruleno==214); - case 216: /* fill_opt ::= */ yytestcase(yyruleno==216); - case 228: /* having_clause_opt ::= */ yytestcase(yyruleno==228); - case 236: /* slimit_clause_opt ::= */ yytestcase(yyruleno==236); - case 240: /* limit_clause_opt ::= */ yytestcase(yyruleno==240); -{ yymsp[1].minor.yy432 = NULL; } + case 150: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy443.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } break; - case 102: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt */ -{ yymsp[-8].minor.yy432 = createIndexOption(pCxt, yymsp[-6].minor.yy24, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), NULL, yymsp[0].minor.yy432); } + case 151: /* alter_table_option ::= KEEP NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = TABLE_OPTION_KEEP; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } break; - case 103: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt */ -{ yymsp[-10].minor.yy432 = createIndexOption(pCxt, yymsp[-8].minor.yy24, releaseRawExprNode(pCxt, yymsp[-4].minor.yy432), releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), yymsp[0].minor.yy432); } + case 152: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy443.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy443.val = yymsp[0].minor.yy0; } break; - case 106: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy432 = createFunctionNode(pCxt, &yymsp[-3].minor.yy129, yymsp[-1].minor.yy24); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + case 155: /* col_name ::= column_name */ +{ yylhsminor.yy26 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy353); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 107: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ -{ pCxt->pRootNode = createCreateTopicStmt(pCxt, yymsp[-3].minor.yy97, &yymsp[-2].minor.yy129, yymsp[0].minor.yy432, NULL); } + case 158: /* func_name ::= function_name */ +{ yylhsminor.yy26 = createFunctionNode(pCxt, &yymsp[0].minor.yy353, NULL); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 108: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name */ -{ pCxt->pRootNode = createCreateTopicStmt(pCxt, yymsp[-3].minor.yy97, &yymsp[-2].minor.yy129, NULL, &yymsp[0].minor.yy129); } + case 159: /* cmd ::= CREATE SMA INDEX index_name ON table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, &yymsp[-3].minor.yy353, &yymsp[-1].minor.yy353, NULL, yymsp[0].minor.yy26); } break; - case 109: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy97, &yymsp[0].minor.yy129); } + case 160: /* cmd ::= CREATE FULLTEXT INDEX index_name ON table_name NK_LP col_name_list NK_RP */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_FULLTEXT, &yymsp[-5].minor.yy353, &yymsp[-3].minor.yy353, yymsp[-1].minor.yy64, NULL); } break; - case 110: /* cmd ::= SHOW VGROUPS */ + case 161: /* cmd ::= DROP INDEX index_name ON table_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy353); } + break; + case 162: /* index_options ::= */ + case 266: /* where_clause_opt ::= */ yytestcase(yyruleno==266); + case 270: /* twindow_clause_opt ::= */ yytestcase(yyruleno==270); + case 275: /* sliding_opt ::= */ yytestcase(yyruleno==275); + case 277: /* fill_opt ::= */ yytestcase(yyruleno==277); + case 289: /* having_clause_opt ::= */ yytestcase(yyruleno==289); + case 297: /* slimit_clause_opt ::= */ yytestcase(yyruleno==297); + case 301: /* limit_clause_opt ::= */ yytestcase(yyruleno==301); +{ yymsp[1].minor.yy26 = NULL; } + break; + case 163: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt */ +{ yymsp[-8].minor.yy26 = createIndexOption(pCxt, yymsp[-6].minor.yy64, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), NULL, yymsp[0].minor.yy26); } + break; + case 164: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt */ +{ yymsp[-10].minor.yy26 = createIndexOption(pCxt, yymsp[-8].minor.yy64, releaseRawExprNode(pCxt, yymsp[-4].minor.yy26), releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), yymsp[0].minor.yy26); } + break; + case 167: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy26 = createFunctionNode(pCxt, &yymsp[-3].minor.yy353, yymsp[-1].minor.yy64); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; + break; + case 168: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ +{ pCxt->pRootNode = createCreateTopicStmt(pCxt, yymsp[-3].minor.yy107, &yymsp[-2].minor.yy353, yymsp[0].minor.yy26, NULL); } + break; + case 169: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS db_name */ +{ pCxt->pRootNode = createCreateTopicStmt(pCxt, yymsp[-3].minor.yy107, &yymsp[-2].minor.yy353, NULL, &yymsp[0].minor.yy353); } + break; + case 170: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy107, &yymsp[0].minor.yy353); } + break; + case 171: /* cmd ::= SHOW VGROUPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, NULL); } break; - case 111: /* cmd ::= SHOW db_name NK_DOT VGROUPS */ -{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, &yymsp[-2].minor.yy129); } + case 172: /* cmd ::= SHOW db_name NK_DOT VGROUPS */ +{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, &yymsp[-2].minor.yy353); } break; - case 112: /* cmd ::= SHOW MNODES */ + case 173: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT, NULL); } break; - case 113: /* cmd ::= query_expression */ -{ pCxt->pRootNode = yymsp[0].minor.yy432; } - break; - case 114: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 115: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 116: /* literal ::= NK_STRING */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 117: /* literal ::= NK_BOOL */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 118: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; - break; - case 119: /* literal ::= duration_literal */ - case 132: /* expression ::= literal */ yytestcase(yyruleno==132); - case 133: /* expression ::= column_reference */ yytestcase(yyruleno==133); - case 136: /* expression ::= subquery */ yytestcase(yyruleno==136); - case 168: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==168); - case 172: /* boolean_primary ::= predicate */ yytestcase(yyruleno==172); - case 174: /* common_expression ::= expression */ yytestcase(yyruleno==174); - case 175: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==175); - case 177: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==177); - case 179: /* table_reference ::= table_primary */ yytestcase(yyruleno==179); - case 180: /* table_reference ::= joined_table */ yytestcase(yyruleno==180); - case 184: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==184); - case 231: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==231); - case 233: /* query_primary ::= query_specification */ yytestcase(yyruleno==233); -{ yylhsminor.yy432 = yymsp[0].minor.yy432; } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 120: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; - break; - case 121: /* literal_list ::= literal */ - case 145: /* expression_list ::= expression */ yytestcase(yyruleno==145); -{ yylhsminor.yy24 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy432)); } - yymsp[0].minor.yy24 = yylhsminor.yy24; - break; - case 122: /* literal_list ::= literal_list NK_COMMA literal */ - case 146: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==146); -{ yylhsminor.yy24 = addNodeToList(pCxt, yymsp[-2].minor.yy24, releaseRawExprNode(pCxt, yymsp[0].minor.yy432)); } - yymsp[-2].minor.yy24 = yylhsminor.yy24; - break; - case 134: /* expression ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy129, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy129, yymsp[-1].minor.yy24)); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; - break; - case 135: /* expression ::= function_name NK_LP NK_STAR NK_RP */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy129, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy129, createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy0)))); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; - break; - case 137: /* expression ::= NK_LP expression NK_RP */ - case 173: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==173); -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy432)); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; - break; - case 138: /* expression ::= NK_PLUS expression */ + case 175: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 176: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 177: /* literal ::= NK_STRING */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 178: /* literal ::= NK_BOOL */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 179: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; + break; + case 180: /* literal ::= duration_literal */ + case 193: /* expression ::= literal */ yytestcase(yyruleno==193); + case 194: /* expression ::= column_reference */ yytestcase(yyruleno==194); + case 197: /* expression ::= subquery */ yytestcase(yyruleno==197); + case 229: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==229); + case 233: /* boolean_primary ::= predicate */ yytestcase(yyruleno==233); + case 235: /* common_expression ::= expression */ yytestcase(yyruleno==235); + case 236: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==236); + case 238: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==238); + case 240: /* table_reference ::= table_primary */ yytestcase(yyruleno==240); + case 241: /* table_reference ::= joined_table */ yytestcase(yyruleno==241); + case 245: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==245); + case 292: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==292); + case 294: /* query_primary ::= query_specification */ yytestcase(yyruleno==294); +{ yylhsminor.yy26 = yymsp[0].minor.yy26; } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 181: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; + break; + case 182: /* literal_list ::= literal */ + case 206: /* expression_list ::= expression */ yytestcase(yyruleno==206); +{ yylhsminor.yy64 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy26)); } + yymsp[0].minor.yy64 = yylhsminor.yy64; + break; + case 183: /* literal_list ::= literal_list NK_COMMA literal */ + case 207: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==207); +{ yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, releaseRawExprNode(pCxt, yymsp[0].minor.yy26)); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; + break; + case 195: /* expression ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy353, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy353, yymsp[-1].minor.yy64)); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; + break; + case 196: /* expression ::= function_name NK_LP NK_STAR NK_RP */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy353, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy353, createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy0)))); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; + break; + case 198: /* expression ::= NK_LP expression NK_RP */ + case 234: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==234); +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy26)); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; + break; + case 199: /* expression ::= NK_PLUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy432)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy26)); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 139: /* expression ::= NK_MINUS expression */ + case 200: /* expression ::= NK_MINUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy432), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy26), NULL)); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 140: /* expression ::= expression NK_PLUS expression */ + case 201: /* expression ::= expression NK_PLUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 141: /* expression ::= expression NK_MINUS expression */ + case 202: /* expression ::= expression NK_MINUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 142: /* expression ::= expression NK_STAR expression */ + case 203: /* expression ::= expression NK_STAR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 143: /* expression ::= expression NK_SLASH expression */ + case 204: /* expression ::= expression NK_SLASH expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 144: /* expression ::= expression NK_REM expression */ + case 205: /* expression ::= expression NK_REM expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 147: /* column_reference ::= column_name */ -{ yylhsminor.yy432 = createRawExprNode(pCxt, &yymsp[0].minor.yy129, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy129)); } - yymsp[0].minor.yy432 = yylhsminor.yy432; + case 208: /* column_reference ::= column_name */ +{ yylhsminor.yy26 = createRawExprNode(pCxt, &yymsp[0].minor.yy353, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy353)); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 148: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129, createColumnNode(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129)); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 209: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy353, createColumnNode(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy353)); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 149: /* predicate ::= expression compare_op expression */ - case 154: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==154); + case 210: /* predicate ::= expression compare_op expression */ + case 215: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==215); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy260, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy80, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 150: /* predicate ::= expression BETWEEN expression AND expression */ + case 211: /* predicate ::= expression BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy432), releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy26), releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-4].minor.yy432 = yylhsminor.yy432; + yymsp[-4].minor.yy26 = yylhsminor.yy26; break; - case 151: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 212: /* predicate ::= expression NOT BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[-5].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[-5].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-5].minor.yy432 = yylhsminor.yy432; + yymsp[-5].minor.yy26 = yylhsminor.yy26; break; - case 152: /* predicate ::= expression IS NULL */ + case 213: /* predicate ::= expression IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), NULL)); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 153: /* predicate ::= expression IS NOT NULL */ + case 214: /* predicate ::= expression IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy432), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy26), NULL)); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + yymsp[-3].minor.yy26 = yylhsminor.yy26; break; - case 155: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy260 = OP_TYPE_LOWER_THAN; } + case 216: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy80 = OP_TYPE_LOWER_THAN; } break; - case 156: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy260 = OP_TYPE_GREATER_THAN; } + case 217: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy80 = OP_TYPE_GREATER_THAN; } break; - case 157: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy260 = OP_TYPE_LOWER_EQUAL; } + case 218: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy80 = OP_TYPE_LOWER_EQUAL; } break; - case 158: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy260 = OP_TYPE_GREATER_EQUAL; } + case 219: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy80 = OP_TYPE_GREATER_EQUAL; } break; - case 159: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy260 = OP_TYPE_NOT_EQUAL; } + case 220: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy80 = OP_TYPE_NOT_EQUAL; } break; - case 160: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy260 = OP_TYPE_EQUAL; } + case 221: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy80 = OP_TYPE_EQUAL; } break; - case 161: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy260 = OP_TYPE_LIKE; } + case 222: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy80 = OP_TYPE_LIKE; } break; - case 162: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy260 = OP_TYPE_NOT_LIKE; } + case 223: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy80 = OP_TYPE_NOT_LIKE; } break; - case 163: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy260 = OP_TYPE_MATCH; } + case 224: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy80 = OP_TYPE_MATCH; } break; - case 164: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy260 = OP_TYPE_NMATCH; } + case 225: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy80 = OP_TYPE_NMATCH; } break; - case 165: /* in_op ::= IN */ -{ yymsp[0].minor.yy260 = OP_TYPE_IN; } + case 226: /* in_op ::= IN */ +{ yymsp[0].minor.yy80 = OP_TYPE_IN; } break; - case 166: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy260 = OP_TYPE_NOT_IN; } + case 227: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy80 = OP_TYPE_NOT_IN; } break; - case 167: /* in_predicate_value ::= NK_LP expression_list NK_RP */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy24)); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 228: /* in_predicate_value ::= NK_LP expression_list NK_RP */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy64)); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 169: /* boolean_value_expression ::= NOT boolean_primary */ + case 230: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy432), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy26), NULL)); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 170: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 231: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 171: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 232: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy432); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy26); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 176: /* from_clause ::= FROM table_reference_list */ - case 206: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==206); - case 229: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==229); -{ yymsp[-1].minor.yy432 = yymsp[0].minor.yy432; } + case 237: /* from_clause ::= FROM table_reference_list */ + case 267: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==267); + case 290: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==290); +{ yymsp[-1].minor.yy26 = yymsp[0].minor.yy26; } break; - case 178: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy432 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy432, yymsp[0].minor.yy432, NULL); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 239: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy26 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy26, yymsp[0].minor.yy26, NULL); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 181: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy432 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy129, &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + case 242: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy26 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy353, &yymsp[0].minor.yy353); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 182: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy432 = createRealTableNode(pCxt, &yymsp[-3].minor.yy129, &yymsp[-1].minor.yy129, &yymsp[0].minor.yy129); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + case 243: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy26 = createRealTableNode(pCxt, &yymsp[-3].minor.yy353, &yymsp[-1].minor.yy353, &yymsp[0].minor.yy353); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; break; - case 183: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy432 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy432), &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + case 244: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy26 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy26), &yymsp[0].minor.yy353); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 185: /* alias_opt ::= */ -{ yymsp[1].minor.yy129 = nil_token; } + case 246: /* alias_opt ::= */ +{ yymsp[1].minor.yy353 = nil_token; } break; - case 186: /* alias_opt ::= table_alias */ -{ yylhsminor.yy129 = yymsp[0].minor.yy129; } - yymsp[0].minor.yy129 = yylhsminor.yy129; + case 247: /* alias_opt ::= table_alias */ +{ yylhsminor.yy353 = yymsp[0].minor.yy353; } + yymsp[0].minor.yy353 = yylhsminor.yy353; break; - case 187: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy129 = yymsp[0].minor.yy129; } + case 248: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy353 = yymsp[0].minor.yy353; } break; - case 188: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 189: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==189); -{ yymsp[-2].minor.yy432 = yymsp[-1].minor.yy432; } + case 249: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 250: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==250); +{ yymsp[-2].minor.yy26 = yymsp[-1].minor.yy26; } break; - case 190: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy432 = createJoinTableNode(pCxt, yymsp[-4].minor.yy332, yymsp[-5].minor.yy432, yymsp[-2].minor.yy432, yymsp[0].minor.yy432); } - yymsp[-5].minor.yy432 = yylhsminor.yy432; + case 251: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy26 = createJoinTableNode(pCxt, yymsp[-4].minor.yy372, yymsp[-5].minor.yy26, yymsp[-2].minor.yy26, yymsp[0].minor.yy26); } + yymsp[-5].minor.yy26 = yylhsminor.yy26; break; - case 191: /* join_type ::= */ -{ yymsp[1].minor.yy332 = JOIN_TYPE_INNER; } + case 252: /* join_type ::= */ +{ yymsp[1].minor.yy372 = JOIN_TYPE_INNER; } break; - case 192: /* join_type ::= INNER */ -{ yymsp[0].minor.yy332 = JOIN_TYPE_INNER; } + case 253: /* join_type ::= INNER */ +{ yymsp[0].minor.yy372 = JOIN_TYPE_INNER; } break; - case 193: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + case 254: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ { - yymsp[-8].minor.yy432 = createSelectStmt(pCxt, yymsp[-7].minor.yy97, yymsp[-6].minor.yy24, yymsp[-5].minor.yy432); - yymsp[-8].minor.yy432 = addWhereClause(pCxt, yymsp[-8].minor.yy432, yymsp[-4].minor.yy432); - yymsp[-8].minor.yy432 = addPartitionByClause(pCxt, yymsp[-8].minor.yy432, yymsp[-3].minor.yy24); - yymsp[-8].minor.yy432 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy432, yymsp[-2].minor.yy432); - yymsp[-8].minor.yy432 = addGroupByClause(pCxt, yymsp[-8].minor.yy432, yymsp[-1].minor.yy24); - yymsp[-8].minor.yy432 = addHavingClause(pCxt, yymsp[-8].minor.yy432, yymsp[0].minor.yy432); + yymsp[-8].minor.yy26 = createSelectStmt(pCxt, yymsp[-7].minor.yy107, yymsp[-6].minor.yy64, yymsp[-5].minor.yy26); + yymsp[-8].minor.yy26 = addWhereClause(pCxt, yymsp[-8].minor.yy26, yymsp[-4].minor.yy26); + yymsp[-8].minor.yy26 = addPartitionByClause(pCxt, yymsp[-8].minor.yy26, yymsp[-3].minor.yy64); + yymsp[-8].minor.yy26 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy26, yymsp[-2].minor.yy26); + yymsp[-8].minor.yy26 = addGroupByClause(pCxt, yymsp[-8].minor.yy26, yymsp[-1].minor.yy64); + yymsp[-8].minor.yy26 = addHavingClause(pCxt, yymsp[-8].minor.yy26, yymsp[0].minor.yy26); } break; - case 195: /* set_quantifier_opt ::= DISTINCT */ -{ yymsp[0].minor.yy97 = true; } + case 256: /* set_quantifier_opt ::= DISTINCT */ +{ yymsp[0].minor.yy107 = true; } break; - case 196: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy97 = false; } + case 257: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy107 = false; } break; - case 197: /* select_list ::= NK_STAR */ -{ yymsp[0].minor.yy24 = NULL; } + case 258: /* select_list ::= NK_STAR */ +{ yymsp[0].minor.yy64 = NULL; } break; - case 201: /* select_item ::= common_expression */ + case 262: /* select_item ::= common_expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy432); - yylhsminor.yy432 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy432), &t); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy26); + yylhsminor.yy26 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy26), &t); } - yymsp[0].minor.yy432 = yylhsminor.yy432; + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 202: /* select_item ::= common_expression column_alias */ -{ yylhsminor.yy432 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy432), &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy432 = yylhsminor.yy432; + case 263: /* select_item ::= common_expression column_alias */ +{ yylhsminor.yy26 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy26), &yymsp[0].minor.yy353); } + yymsp[-1].minor.yy26 = yylhsminor.yy26; break; - case 203: /* select_item ::= common_expression AS column_alias */ -{ yylhsminor.yy432 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), &yymsp[0].minor.yy129); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 264: /* select_item ::= common_expression AS column_alias */ +{ yylhsminor.yy26 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), &yymsp[0].minor.yy353); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 204: /* select_item ::= table_name NK_DOT NK_STAR */ -{ yylhsminor.yy432 = createColumnNode(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 265: /* select_item ::= table_name NK_DOT NK_STAR */ +{ yylhsminor.yy26 = createColumnNode(pCxt, &yymsp[-2].minor.yy353, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 208: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 225: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==225); - case 235: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==235); -{ yymsp[-2].minor.yy24 = yymsp[0].minor.yy24; } + case 269: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 286: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==286); + case 296: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==296); +{ yymsp[-2].minor.yy64 = yymsp[0].minor.yy64; } break; - case 210: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy432 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy432), &yymsp[-1].minor.yy0); } + case 271: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy26 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy26), &yymsp[-1].minor.yy0); } break; - case 211: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ -{ yymsp[-3].minor.yy432 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy432)); } + case 272: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ +{ yymsp[-3].minor.yy26 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy26)); } break; - case 212: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy432 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy432), NULL, yymsp[-1].minor.yy432, yymsp[0].minor.yy432); } + case 273: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy26 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy26), NULL, yymsp[-1].minor.yy26, yymsp[0].minor.yy26); } break; - case 213: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy432 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy432), releaseRawExprNode(pCxt, yymsp[-3].minor.yy432), yymsp[-1].minor.yy432, yymsp[0].minor.yy432); } + case 274: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy26 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy26), releaseRawExprNode(pCxt, yymsp[-3].minor.yy26), yymsp[-1].minor.yy26, yymsp[0].minor.yy26); } break; - case 215: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ -{ yymsp[-3].minor.yy432 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy432); } + case 276: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ +{ yymsp[-3].minor.yy26 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy26); } break; - case 217: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy432 = createFillNode(pCxt, yymsp[-1].minor.yy294, NULL); } + case 278: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy26 = createFillNode(pCxt, yymsp[-1].minor.yy192, NULL); } break; - case 218: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy432 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy24)); } + case 279: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy26 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy64)); } break; - case 219: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy294 = FILL_MODE_NONE; } + case 280: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy192 = FILL_MODE_NONE; } break; - case 220: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy294 = FILL_MODE_PREV; } + case 281: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy192 = FILL_MODE_PREV; } break; - case 221: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy294 = FILL_MODE_NULL; } + case 282: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy192 = FILL_MODE_NULL; } break; - case 222: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy294 = FILL_MODE_LINEAR; } + case 283: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy192 = FILL_MODE_LINEAR; } break; - case 223: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy294 = FILL_MODE_NEXT; } + case 284: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy192 = FILL_MODE_NEXT; } break; - case 226: /* group_by_list ::= expression */ -{ yylhsminor.yy24 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); } - yymsp[0].minor.yy24 = yylhsminor.yy24; + case 287: /* group_by_list ::= expression */ +{ yylhsminor.yy64 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 227: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ yylhsminor.yy24 = addNodeToList(pCxt, yymsp[-2].minor.yy24, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy432))); } - yymsp[-2].minor.yy24 = yylhsminor.yy24; + case 288: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy26))); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; - case 230: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 291: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy432 = addOrderByClause(pCxt, yymsp[-3].minor.yy432, yymsp[-2].minor.yy24); - yylhsminor.yy432 = addSlimitClause(pCxt, yylhsminor.yy432, yymsp[-1].minor.yy432); - yylhsminor.yy432 = addLimitClause(pCxt, yylhsminor.yy432, yymsp[0].minor.yy432); + yylhsminor.yy26 = addOrderByClause(pCxt, yymsp[-3].minor.yy26, yymsp[-2].minor.yy64); + yylhsminor.yy26 = addSlimitClause(pCxt, yylhsminor.yy26, yymsp[-1].minor.yy26); + yylhsminor.yy26 = addLimitClause(pCxt, yylhsminor.yy26, yymsp[0].minor.yy26); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + yymsp[-3].minor.yy26 = yylhsminor.yy26; break; - case 232: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy432 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy432, yymsp[0].minor.yy432); } - yymsp[-3].minor.yy432 = yylhsminor.yy432; + case 293: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy26 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy26, yymsp[0].minor.yy26); } + yymsp[-3].minor.yy26 = yylhsminor.yy26; break; - case 237: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 241: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==241); -{ yymsp[-1].minor.yy432 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 298: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 302: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==302); +{ yymsp[-1].minor.yy26 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 238: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 242: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==242); -{ yymsp[-3].minor.yy432 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 299: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 303: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==303); +{ yymsp[-3].minor.yy26 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 239: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 243: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==243); -{ yymsp[-3].minor.yy432 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 300: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 304: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==304); +{ yymsp[-3].minor.yy26 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 244: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy432 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy432); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 305: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy26 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy26); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 245: /* search_condition ::= common_expression */ -{ yylhsminor.yy432 = releaseRawExprNode(pCxt, yymsp[0].minor.yy432); } - yymsp[0].minor.yy432 = yylhsminor.yy432; + case 306: /* search_condition ::= common_expression */ +{ yylhsminor.yy26 = releaseRawExprNode(pCxt, yymsp[0].minor.yy26); } + yymsp[0].minor.yy26 = yylhsminor.yy26; break; - case 248: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy432 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy432), yymsp[-1].minor.yy378, yymsp[0].minor.yy257); } - yymsp[-2].minor.yy432 = yylhsminor.yy432; + case 309: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy26 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy26), yymsp[-1].minor.yy32, yymsp[0].minor.yy391); } + yymsp[-2].minor.yy26 = yylhsminor.yy26; break; - case 249: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy378 = ORDER_ASC; } + case 310: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy32 = ORDER_ASC; } break; - case 250: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy378 = ORDER_ASC; } + case 311: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy32 = ORDER_ASC; } break; - case 251: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy378 = ORDER_DESC; } + case 312: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy32 = ORDER_DESC; } break; - case 252: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy257 = NULL_ORDER_DEFAULT; } + case 313: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy391 = NULL_ORDER_DEFAULT; } break; - case 253: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy257 = NULL_ORDER_FIRST; } + case 314: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy391 = NULL_ORDER_FIRST; } break; - case 254: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy257 = NULL_ORDER_LAST; } + case 315: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy391 = NULL_ORDER_LAST; } break; default: break; @@ -2839,13 +3237,15 @@ static void yy_syntax_error( ParseCTX_FETCH #define TOKEN yyminor /************ Begin %syntax_error code ****************************************/ - - if(TOKEN.z) { - generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z); - } else { - generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL); + + if (pCxt->valid) { + if(TOKEN.z) { + generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z); + } else { + generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL); + } + pCxt->valid = false; } - pCxt->valid = false; /************ End %syntax_error code ******************************************/ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */ ParseCTX_STORE diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp index 65d3f51dde3e1aaf7cba570f60b9f3f10bf5641c..1f333e49e7726f90567d437731c27b878e449046 100644 --- a/source/libs/parser/test/mockCatalogService.cpp +++ b/source/libs/parser/test/mockCatalogService.cpp @@ -13,12 +13,11 @@ * along with this program. If not, see . */ -#include "mockCatalogService.h" - #include #include #include #include "tdatablock.h" +#include "mockCatalogService.h" #include "tname.h" #include "ttypes.h" diff --git a/source/libs/parser/test/parserAstTest.cpp b/source/libs/parser/test/parserAstTest.cpp index f4c1bde478bd82e22df89a45681c925cb81126fb..bb2f2539e90c5d2887228cb27d59083c3085525e 100644 --- a/source/libs/parser/test/parserAstTest.cpp +++ b/source/libs/parser/test/parserAstTest.cpp @@ -302,6 +302,13 @@ TEST_F(ParserTest, createUser) { ASSERT_TRUE(run()); } +TEST_F(ParserTest, alterAccount) { + setDatabase("root", "test"); + + bind("alter account ac_wxy pass '123456'"); + ASSERT_TRUE(run(TSDB_CODE_PAR_EXPRIE_STATEMENT)); +} + TEST_F(ParserTest, createDnode) { setDatabase("root", "test"); @@ -312,6 +319,16 @@ TEST_F(ParserTest, createDnode) { ASSERT_TRUE(run()); } +TEST_F(ParserTest, alterDnode) { + setDatabase("root", "test"); + + bind("alter dnode 1 'resetLog'"); + ASSERT_TRUE(run()); + + bind("alter dnode 1 'debugFlag' '134'"); + ASSERT_TRUE(run()); +} + TEST_F(ParserTest, createDatabase) { setDatabase("root", "test"); diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index cd9857c7f68b570db63625c03999581c69bdd540..cbc3921711cd15b224b37ed68c823978ab89e21e 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -18,13 +18,13 @@ #include "functionMgt.h" typedef struct SLogicPlanContext { - int32_t errCode; - int32_t planNodeId; - int32_t acctId; + SPlanContext* pPlanCxt; } SLogicPlanContext; -static SLogicNode* createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt); -static SLogicNode* createLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable); +typedef int32_t (*FCreateLogicNode)(SLogicPlanContext*, SSelectStmt*, SLogicNode**); + +static int32_t doCreateLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable, SLogicNode** pLogicNode); +static int32_t createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt, SLogicNode** pLogicNode); typedef struct SRewriteExprCxt { int32_t errCode; @@ -66,7 +66,6 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) { } typedef struct SNameExprCxt { - int32_t planNodeId; int32_t rewriteId; } SNameExprCxt; @@ -76,7 +75,7 @@ static EDealRes doNameExpr(SNode* pNode, void* pContext) { case QUERY_NODE_LOGIC_CONDITION: case QUERY_NODE_FUNCTION: { SNameExprCxt* pCxt = (SNameExprCxt*)pContext; - sprintf(((SExprNode*)pNode)->aliasName, "#expr_%d_%d", pCxt->planNodeId, pCxt->rewriteId++); + sprintf(((SExprNode*)pNode)->aliasName, "#expr_%d", pCxt->rewriteId++); return DEAL_RES_IGNORE_CHILD; } default: @@ -86,131 +85,194 @@ static EDealRes doNameExpr(SNode* pNode, void* pContext) { return DEAL_RES_CONTINUE; } -static int32_t rewriteExpr(int32_t planNodeId, int32_t rewriteId, SNodeList* pExprs, SSelectStmt* pSelect, ESqlClause clause) { - SNameExprCxt nameCxt = { .planNodeId = planNodeId, .rewriteId = rewriteId }; +static int32_t rewriteExpr(SNodeList* pExprs, SSelectStmt* pSelect, ESqlClause clause) { + static int32_t rewriteId = 1; + SNameExprCxt nameCxt = { .rewriteId = rewriteId }; nodesWalkList(pExprs, doNameExpr, &nameCxt); SRewriteExprCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs }; nodesRewriteSelectStmt(pSelect, clause, doRewriteExpr, &cxt); return cxt.errCode; } -static SLogicNode* pushLogicNode(SLogicPlanContext* pCxt, SLogicNode* pRoot, SLogicNode* pNode) { - if (TSDB_CODE_SUCCESS != pCxt->errCode) { - goto error; +static int32_t pushLogicNode(SLogicPlanContext* pCxt, SLogicNode** pOldRoot, SLogicNode* pNewRoot) { + if (NULL == pNewRoot->pChildren) { + pNewRoot->pChildren = nodesMakeList(); + if (NULL == pNewRoot->pChildren) { + return TSDB_CODE_OUT_OF_MEMORY; + } } - - if (NULL == pRoot) { - return pNode; + if (TSDB_CODE_SUCCESS != nodesListAppend(pNewRoot->pChildren, (SNode*)*pOldRoot)) { + return TSDB_CODE_OUT_OF_MEMORY; } - if (NULL == pNode) { - return pRoot; - } + (*pOldRoot)->pParent = pNewRoot; + *pOldRoot = pNewRoot; - if (NULL == pNode->pChildren) { - pNode->pChildren = nodesMakeList(); - if (NULL == pNode->pChildren) { - goto error; - } + return TSDB_CODE_SUCCESS; +} + +static int32_t createChildLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, FCreateLogicNode func, SLogicNode** pRoot) { + SLogicNode* pNode = NULL; + int32_t code = func(pCxt, pSelect, &pNode); + if (TSDB_CODE_SUCCESS == code && NULL != pNode) { + code = pushLogicNode(pCxt, pRoot, pNode); } - if (TSDB_CODE_SUCCESS != nodesListAppend(pNode->pChildren, (SNode*)pRoot)) { - goto error; + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNode); } - pRoot->pParent = pNode; - return pNode; -error: - nodesDestroyNode((SNode*)pNode); - return pRoot; + return code; } -static SLogicNode* createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SRealTableNode* pRealTable) { +static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SRealTableNode* pRealTable, SLogicNode** pLogicNode) { SScanLogicNode* pScan = (SScanLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SCAN); - CHECK_ALLOC(pScan, NULL); - pScan->node.id = pCxt->planNodeId++; + if (NULL == pScan) { + return TSDB_CODE_OUT_OF_MEMORY; + } TSWAP(pScan->pMeta, pRealTable->pMeta, STableMeta*); TSWAP(pScan->pVgroupList, pRealTable->pVgroupList, SVgroupsInfo*); + pScan->scanType = pCxt->pPlanCxt->streamQuery ? SCAN_TYPE_STREAM : SCAN_TYPE_TABLE; + pScan->scanFlag = MAIN_SCAN; + pScan->scanRange = TSWINDOW_INITIALIZER; + pScan->tableName.type = TSDB_TABLE_NAME_T; + pScan->tableName.acctId = pCxt->pPlanCxt->acctId; + strcpy(pScan->tableName.dbname, pRealTable->table.dbName); + strcpy(pScan->tableName.tname, pRealTable->table.tableName); // set columns to scan SNodeList* pCols = NULL; - CHECK_CODE(nodesCollectColumns(pSelect, SQL_CLAUSE_FROM, pRealTable->table.tableAlias, &pCols), (SLogicNode*)pScan); - if (NULL != pCols) { + int32_t code = nodesCollectColumns(pSelect, SQL_CLAUSE_FROM, pRealTable->table.tableAlias, &pCols); + if (TSDB_CODE_SUCCESS == code && NULL != pCols) { pScan->pScanCols = nodesCloneList(pCols); - CHECK_ALLOC(pScan->pScanCols, (SLogicNode*)pScan); + if (NULL == pScan) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } // set output - if (NULL != pCols) { + if (TSDB_CODE_SUCCESS == code && NULL != pCols) { pScan->node.pTargets = nodesCloneList(pCols); - CHECK_ALLOC(pScan->node.pTargets, (SLogicNode*)pScan); + if (NULL == pScan) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } - pScan->scanType = SCAN_TYPE_TABLE; - pScan->scanFlag = MAIN_SCAN; - pScan->scanRange = TSWINDOW_INITIALIZER; - pScan->tableName.type = TSDB_TABLE_NAME_T; - pScan->tableName.acctId = pCxt->acctId; - strcpy(pScan->tableName.dbname, pRealTable->table.dbName); - strcpy(pScan->tableName.tname, pRealTable->table.tableName); + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = (SLogicNode*)pScan; + } else { + nodesDestroyNode(pScan); + } - return (SLogicNode*)pScan; + return code; } -static SLogicNode* createSubqueryLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, STempTableNode* pTable) { - SLogicNode* pRoot = createQueryLogicNode(pCxt, pTable->pSubquery); - CHECK_ALLOC(pRoot, NULL); - SNode* pNode; - FOREACH(pNode, pRoot->pTargets) { - strcpy(((SColumnNode*)pNode)->tableAlias, pTable->table.tableAlias); +static int32_t createSubqueryLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, STempTableNode* pTable, SLogicNode** pLogicNode) { + int32_t code = createQueryLogicNode(pCxt, pTable->pSubquery, pLogicNode); + if (TSDB_CODE_SUCCESS == code) { + SNode* pNode; + FOREACH(pNode, (*pLogicNode)->pTargets) { + strcpy(((SColumnNode*)pNode)->tableAlias, pTable->table.tableAlias); + } } - return pRoot; + return code; } -static SLogicNode* createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SJoinTableNode* pJoinTable) { +static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SJoinTableNode* pJoinTable, SLogicNode** pLogicNode) { SJoinLogicNode* pJoin = (SJoinLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_JOIN); - CHECK_ALLOC(pJoin, NULL); - pJoin->node.id = pCxt->planNodeId++; + if (NULL == pJoin) { + return TSDB_CODE_OUT_OF_MEMORY; + } pJoin->joinType = pJoinTable->joinType; + int32_t code = TSDB_CODE_SUCCESS; + // set left and right node pJoin->node.pChildren = nodesMakeList(); - CHECK_ALLOC(pJoin->node.pChildren, (SLogicNode*)pJoin); - SLogicNode* pLeft = createLogicNodeByTable(pCxt, pSelect, pJoinTable->pLeft); - CHECK_ALLOC(pLeft, (SLogicNode*)pJoin); - CHECK_CODE(nodesListAppend(pJoin->node.pChildren, (SNode*)pLeft), (SLogicNode*)pJoin); - SLogicNode* pRight = createLogicNodeByTable(pCxt, pSelect, pJoinTable->pRight); - CHECK_ALLOC(pRight, (SLogicNode*)pJoin); - CHECK_CODE(nodesListAppend(pJoin->node.pChildren, (SNode*)pRight), (SLogicNode*)pJoin); + if (NULL == pJoin->node.pChildren) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + + SLogicNode* pLeft = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = doCreateLogicNodeByTable(pCxt, pSelect, pJoinTable->pLeft, &pLeft); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->node.pChildren, (SNode*)pLeft); + } + } + + SLogicNode* pRight = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = doCreateLogicNodeByTable(pCxt, pSelect, pJoinTable->pRight, &pRight); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->node.pChildren, (SNode*)pRight); + } + } // set on conditions - if (NULL != pJoinTable->pOnCond) { + if (TSDB_CODE_SUCCESS == code && NULL != pJoinTable->pOnCond) { pJoin->pOnConditions = nodesCloneNode(pJoinTable->pOnCond); - CHECK_ALLOC(pJoin->pOnConditions, (SLogicNode*)pJoin); + if (NULL == pJoin->pOnConditions) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } // set the output - pJoin->node.pTargets = nodesCloneList(pLeft->pTargets); - CHECK_ALLOC(pJoin->node.pTargets, (SLogicNode*)pJoin); - SNodeList* pTargets = nodesCloneList(pRight->pTargets); - CHECK_ALLOC(pTargets, (SLogicNode*)pJoin); - nodesListAppendList(pJoin->node.pTargets, pTargets); + if (TSDB_CODE_SUCCESS == code) { + pJoin->node.pTargets = nodesCloneList(pLeft->pTargets); + if (NULL == pJoin->pOnConditions) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppendList(pJoin->node.pTargets, nodesCloneList(pRight->pTargets)); + } + } - return (SLogicNode*)pJoin; + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = (SLogicNode*)pJoin; + } else { + nodesDestroyNode(pJoin); + } + + return code; } -static SLogicNode* createLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable) { +static int32_t doCreateLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable, SLogicNode** pLogicNode) { switch (nodeType(pTable)) { case QUERY_NODE_REAL_TABLE: - return createScanLogicNode(pCxt, pSelect, (SRealTableNode*)pTable); + return createScanLogicNode(pCxt, pSelect, (SRealTableNode*)pTable, pLogicNode); case QUERY_NODE_TEMP_TABLE: - return createSubqueryLogicNode(pCxt, pSelect, (STempTableNode*)pTable); + return createSubqueryLogicNode(pCxt, pSelect, (STempTableNode*)pTable, pLogicNode); case QUERY_NODE_JOIN_TABLE: - return createJoinLogicNode(pCxt, pSelect, (SJoinTableNode*)pTable); + return createJoinLogicNode(pCxt, pSelect, (SJoinTableNode*)pTable, pLogicNode); default: break; } - return NULL; + return TSDB_CODE_FAILED; +} + +static int32_t createLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable, SLogicNode** pLogicNode) { + SLogicNode* pNode = NULL; + int32_t code = doCreateLogicNodeByTable(pCxt, pSelect, pTable, &pNode); + if (TSDB_CODE_SUCCESS == code) { + pNode->pConditions = nodesCloneNode(pSelect->pWhere); + if (NULL != pSelect->pWhere && NULL == pNode->pConditions) { + nodesDestroyNode(pNode); + return TSDB_CODE_OUT_OF_MEMORY; + } + *pLogicNode = pNode; + } + return code; +} + +static SColumnNode* createColumnByExpr(SExprNode* pExpr) { + SColumnNode* pCol = nodesMakeNode(QUERY_NODE_COLUMN); + if (NULL == pCol) { + return NULL; + } + pCol->node.resType = pExpr->resType; + strcpy(pCol->colName, pExpr->aliasName); + return pCol; } typedef struct SCreateColumnCxt { @@ -245,196 +307,241 @@ static EDealRes doCreateColumn(SNode* pNode, void* pContext) { return DEAL_RES_CONTINUE; } -static SNodeList* createColumnByRewriteExps(SLogicPlanContext* pCxt, SNodeList* pExprs) { - SCreateColumnCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pList = nodesMakeList() }; - CHECK_ALLOC(cxt.pList, NULL); +static int32_t createColumnByRewriteExps(SLogicPlanContext* pCxt, SNodeList* pExprs, SNodeList** pList) { + SCreateColumnCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pList = (NULL == *pList ? nodesMakeList() : *pList) }; + if (NULL == cxt.pList) { + return TSDB_CODE_OUT_OF_MEMORY; + } nodesWalkList(pExprs, doCreateColumn, &cxt); if (TSDB_CODE_SUCCESS != cxt.errCode) { nodesDestroyList(cxt.pList); - return NULL; + return cxt.errCode; + } + if (NULL == *pList) { + *pList = cxt.pList; } - return cxt.pList; + return cxt.errCode; } -static SLogicNode* createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect) { +static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { SNodeList* pAggFuncs = NULL; - CHECK_CODE(nodesCollectFuncs(pSelect, fmIsAggFunc, &pAggFuncs), NULL); + int32_t code = nodesCollectFuncs(pSelect, fmIsAggFunc, &pAggFuncs); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (NULL == pAggFuncs && NULL == pSelect->pGroupByList) { - return NULL; + return TSDB_CODE_SUCCESS; } SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); - CHECK_ALLOC(pAgg, NULL); - pAgg->node.id = pCxt->planNodeId++; + if (NULL == pAgg) { + return TSDB_CODE_OUT_OF_MEMORY; + } // set grouyp keys, agg funcs and having conditions if (NULL != pSelect->pGroupByList) { pAgg->pGroupKeys = nodesCloneList(pSelect->pGroupByList); - CHECK_ALLOC(pAgg->pGroupKeys, (SLogicNode*)pAgg); + if (NULL == pAgg->pGroupKeys) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } - if (NULL != pAggFuncs) { + + if (TSDB_CODE_SUCCESS == code && NULL != pAggFuncs) { pAgg->pAggFuncs = nodesCloneList(pAggFuncs); - CHECK_ALLOC(pAgg->pAggFuncs, (SLogicNode*)pAgg); + if (NULL == pAgg->pAggFuncs) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } // rewrite the expression in subsequent clauses - CHECK_CODE(rewriteExpr(pAgg->node.id, 1, pAgg->pGroupKeys, pSelect, SQL_CLAUSE_GROUP_BY), (SLogicNode*)pAgg); - CHECK_CODE(rewriteExpr(pAgg->node.id, 1 + LIST_LENGTH(pAgg->pGroupKeys), pAgg->pAggFuncs, pSelect, SQL_CLAUSE_GROUP_BY), (SLogicNode*)pAgg); + if (TSDB_CODE_SUCCESS == code) { + code = rewriteExpr(pAgg->pGroupKeys, pSelect, SQL_CLAUSE_GROUP_BY); + } + if (TSDB_CODE_SUCCESS == code) { + code = rewriteExpr(pAgg->pAggFuncs, pSelect, SQL_CLAUSE_GROUP_BY); + } - if (NULL != pSelect->pHaving) { + if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pHaving) { pAgg->node.pConditions = nodesCloneNode(pSelect->pHaving); - CHECK_ALLOC(pAgg->node.pConditions, (SLogicNode*)pAgg); + if (NULL == pAgg->node.pConditions) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } // set the output - pAgg->node.pTargets = nodesMakeList(); - CHECK_ALLOC(pAgg->node.pTargets, (SLogicNode*)pAgg); - if (NULL != pAgg->pGroupKeys) { - SNodeList* pTargets = createColumnByRewriteExps(pCxt, pAgg->pGroupKeys); - CHECK_ALLOC(pAgg->node.pTargets, (SLogicNode*)pAgg); - nodesListAppendList(pAgg->node.pTargets, pTargets); - } - if (NULL != pAgg->pAggFuncs) { - SNodeList* pTargets = createColumnByRewriteExps(pCxt, pAgg->pAggFuncs); - CHECK_ALLOC(pTargets, (SLogicNode*)pAgg); - nodesListAppendList(pAgg->node.pTargets, pTargets); - } - - return (SLogicNode*)pAgg; + if (TSDB_CODE_SUCCESS == code && NULL != pAgg->pGroupKeys) { + code = createColumnByRewriteExps(pCxt, pAgg->pGroupKeys, &pAgg->node.pTargets); + } + if (TSDB_CODE_SUCCESS == code && NULL != pAgg->pAggFuncs) { + code = createColumnByRewriteExps(pCxt, pAgg->pAggFuncs, &pAgg->node.pTargets); + } + + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = (SLogicNode*)pAgg; + } else { + nodesDestroyNode(pAgg); + } + + return code; } -static SLogicNode* createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SIntervalWindowNode* pInterval, SSelectStmt* pSelect) { +static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SIntervalWindowNode* pInterval, SSelectStmt* pSelect, SLogicNode** pLogicNode) { SWindowLogicNode* pWindow = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); - CHECK_ALLOC(pWindow, NULL); - pWindow->node.id = pCxt->planNodeId++; + if (NULL == pWindow) { + return TSDB_CODE_OUT_OF_MEMORY; + } pWindow->winType = WINDOW_TYPE_INTERVAL; - SValueNode* pIntervalNode = (SValueNode*)((SRawExprNode*)(pInterval->pInterval))->pNode; - - pWindow->interval = pIntervalNode->datum.i; + pWindow->interval = ((SValueNode*)pInterval->pInterval)->datum.i; + pWindow->intervalUnit = ((SValueNode*)pInterval->pInterval)->unit; pWindow->offset = (NULL != pInterval->pOffset ? ((SValueNode*)pInterval->pOffset)->datum.i : 0); pWindow->sliding = (NULL != pInterval->pSliding ? ((SValueNode*)pInterval->pSliding)->datum.i : pWindow->interval); + pWindow->slidingUnit = (NULL != pInterval->pSliding ? ((SValueNode*)pInterval->pSliding)->unit : pWindow->intervalUnit); + + int32_t code = TSDB_CODE_SUCCESS; if (NULL != pInterval->pFill) { pWindow->pFill = nodesCloneNode(pInterval->pFill); - CHECK_ALLOC(pWindow->pFill, (SLogicNode*)pWindow); + if (NULL == pWindow->pFill) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + + if (TSDB_CODE_SUCCESS == code) { + code = nodesCollectFuncs(pSelect, fmIsAggFunc, &pWindow->pFuncs); } - SNodeList* pFuncs = NULL; - CHECK_CODE(nodesCollectFuncs(pSelect, fmIsAggFunc, &pFuncs), NULL); - if (NULL != pFuncs) { - pWindow->pFuncs = nodesCloneList(pFuncs); - CHECK_ALLOC(pWindow->pFuncs, (SLogicNode*)pWindow); + if (TSDB_CODE_SUCCESS == code) { + code = rewriteExpr(pWindow->pFuncs, pSelect, SQL_CLAUSE_WINDOW); } - CHECK_CODE(rewriteExpr(pWindow->node.id, 1, pWindow->pFuncs, pSelect, SQL_CLAUSE_WINDOW), (SLogicNode*)pWindow); + if (TSDB_CODE_SUCCESS == code) { + code = createColumnByRewriteExps(pCxt, pWindow->pFuncs, &pWindow->node.pTargets); + } - pWindow->node.pTargets = createColumnByRewriteExps(pCxt, pWindow->pFuncs); - CHECK_ALLOC(pWindow->node.pTargets, (SLogicNode*)pWindow); + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = (SLogicNode*)pWindow; + } else { + nodesDestroyNode(pWindow); + } - return (SLogicNode*)pWindow; + return code; } -static SLogicNode* createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect) { +static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { if (NULL == pSelect->pWindow) { - return NULL; + return TSDB_CODE_SUCCESS; } switch (nodeType(pSelect->pWindow)) { case QUERY_NODE_INTERVAL_WINDOW: - return createWindowLogicNodeByInterval(pCxt, (SIntervalWindowNode*)pSelect->pWindow, pSelect); + return createWindowLogicNodeByInterval(pCxt, (SIntervalWindowNode*)pSelect->pWindow, pSelect, pLogicNode); default: break; } - return NULL; + return TSDB_CODE_FAILED; } -static SNodeList* createColumnByProjections(SLogicPlanContext* pCxt, SNodeList* pExprs) { +static int32_t createColumnByProjections(SLogicPlanContext* pCxt, SNodeList* pExprs, SNodeList** pCols) { SNodeList* pList = nodesMakeList(); - CHECK_ALLOC(pList, NULL); + if (NULL == pList) { + return TSDB_CODE_OUT_OF_MEMORY; + } + SNode* pNode; - FOREACH(pNode, pExprs) { - SExprNode* pExpr = (SExprNode*)pNode; - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - goto error; - } - pCol->node.resType = pExpr->resType; - strcpy(pCol->colName, pExpr->aliasName); - if (TSDB_CODE_SUCCESS != nodesListAppend(pList, (SNode*)pCol)) { - goto error; + FOREACH(pNode, pExprs) { + if (TSDB_CODE_SUCCESS != nodesListAppend(pList, createColumnByExpr((SExprNode*)pNode))) { + nodesDestroyList(pList); + return TSDB_CODE_OUT_OF_MEMORY; } } - return pList; -error: - nodesDestroyList(pList); - return NULL; + + *pCols = pList; + return TSDB_CODE_SUCCESS; } -static SLogicNode* createProjectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect) { +static int32_t createProjectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { SProjectLogicNode* pProject = (SProjectLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT); - CHECK_ALLOC(pProject, NULL); - pProject->node.id = pCxt->planNodeId++; + if (NULL == pProject) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + int32_t code = TSDB_CODE_SUCCESS; pProject->pProjections = nodesCloneList(pSelect->pProjectionList); + if (NULL == pProject->pProjections) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + + if (TSDB_CODE_SUCCESS == code) { + code = createColumnByProjections(pCxt,pSelect->pProjectionList, &pProject->node.pTargets); + } - pProject->node.pTargets = createColumnByProjections(pCxt,pSelect->pProjectionList); - CHECK_ALLOC(pProject->node.pTargets, (SLogicNode*)pProject); + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = (SLogicNode*)pProject; + } else { + nodesDestroyNode(pProject); + } - return (SLogicNode*)pProject; + return code; } -static SLogicNode* createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect) { - SLogicNode* pRoot = createLogicNodeByTable(pCxt, pSelect, pSelect->pFromTable); - if (TSDB_CODE_SUCCESS == pCxt->errCode && NULL != pSelect->pWhere) { - pRoot->pConditions = nodesCloneNode(pSelect->pWhere); - CHECK_ALLOC(pRoot->pConditions, pRoot); +static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { + SLogicNode* pRoot = NULL; + int32_t code = createLogicNodeByTable(pCxt, pSelect, pSelect->pFromTable, &pRoot); + if (TSDB_CODE_SUCCESS == code) { + code = createChildLogicNode(pCxt, pSelect, createWindowLogicNode, &pRoot); } - if (TSDB_CODE_SUCCESS == pCxt->errCode) { - pRoot = pushLogicNode(pCxt, pRoot, createWindowLogicNode(pCxt, pSelect)); + if (TSDB_CODE_SUCCESS == code) { + code = createChildLogicNode(pCxt, pSelect, createAggLogicNode, &pRoot); } - if (TSDB_CODE_SUCCESS == pCxt->errCode) { - pRoot = pushLogicNode(pCxt, pRoot, createAggLogicNode(pCxt, pSelect)); + if (TSDB_CODE_SUCCESS == code) { + code = createChildLogicNode(pCxt, pSelect, createProjectLogicNode, &pRoot); } - if (TSDB_CODE_SUCCESS == pCxt->errCode) { - pRoot = pushLogicNode(pCxt, pRoot, createProjectLogicNode(pCxt, pSelect)); + + if (TSDB_CODE_SUCCESS == code) { + *pLogicNode = pRoot; + } else { + nodesDestroyNode(pRoot); } - return pRoot; + + return code; } static int32_t getMsgType(ENodeType sqlType) { return (QUERY_NODE_CREATE_TABLE_STMT == sqlType || QUERY_NODE_CREATE_MULTI_TABLE_STMT == sqlType) ? TDMT_VND_CREATE_TABLE : TDMT_VND_SUBMIT; } -static SLogicNode* createVnodeModifLogicNode(SLogicPlanContext* pCxt, SVnodeModifOpStmt* pStmt) { - SVnodeModifLogicNode* pModif = (SVnodeModifLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIF); - CHECK_ALLOC(pModif, NULL); +static int32_t createVnodeModifLogicNode(SLogicPlanContext* pCxt, SVnodeModifOpStmt* pStmt, SLogicNode** pLogicNode) { + SVnodeModifLogicNode* pModif = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIF); + if (NULL == pModif) { + return TSDB_CODE_OUT_OF_MEMORY; + } pModif->pDataBlocks = pStmt->pDataBlocks; pModif->msgType = getMsgType(pStmt->sqlNodeType); - return (SLogicNode*)pModif; + *pLogicNode = (SLogicNode*)pModif; + return TSDB_CODE_SUCCESS; } -static SLogicNode* createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt) { +static int32_t createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt, SLogicNode** pLogicNode) { switch (nodeType(pStmt)) { case QUERY_NODE_SELECT_STMT: - return createSelectLogicNode(pCxt, (SSelectStmt*)pStmt); + return createSelectLogicNode(pCxt, (SSelectStmt*)pStmt, pLogicNode); case QUERY_NODE_VNODE_MODIF_STMT: - return createVnodeModifLogicNode(pCxt, (SVnodeModifOpStmt*)pStmt); + return createVnodeModifLogicNode(pCxt, (SVnodeModifOpStmt*)pStmt, pLogicNode); default: break; } - return NULL; // to avoid compiler error + return TSDB_CODE_FAILED; } int32_t createLogicPlan(SPlanContext* pCxt, SLogicNode** pLogicNode) { - SLogicPlanContext cxt = { .errCode = TSDB_CODE_SUCCESS, .planNodeId = 1, .acctId = pCxt->acctId }; - SLogicNode* pRoot = createQueryLogicNode(&cxt, pCxt->pAstRoot); - if (TSDB_CODE_SUCCESS != cxt.errCode) { - nodesDestroyNode((SNode*)pRoot); - return cxt.errCode; + SLogicPlanContext cxt = { .pPlanCxt = pCxt }; + int32_t code = createQueryLogicNode(&cxt, pCxt->pAstRoot, pLogicNode); + if (TSDB_CODE_SUCCESS != code) { + return code; } - *pLogicNode = pRoot; return TSDB_CODE_SUCCESS; } diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index 0affd93f4de0d8dab9ed4eef2251dc4088f85718..9bd926b67634f94d876756df0c37fa943d11a6e0 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -259,15 +259,21 @@ static SPhysiNode* createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* p return (SPhysiNode*)pTableScan; } +static SPhysiNode* createStreamScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan, SScanLogicNode* pScanLogicNode) { + SStreamScanPhysiNode* pTableScan = (SStreamScanPhysiNode*)makePhysiNode(pCxt, QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN); + CHECK_ALLOC(pTableScan, NULL); + CHECK_CODE(initScanPhysiNode(pCxt, pScanLogicNode, (SScanPhysiNode*)pTableScan), (SPhysiNode*)pTableScan); + return (SPhysiNode*)pTableScan; +} + static SPhysiNode* createScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan, SScanLogicNode* pScanLogicNode) { switch (pScanLogicNode->scanType) { case SCAN_TYPE_TAG: return createTagScanPhysiNode(pCxt, pScanLogicNode); case SCAN_TYPE_TABLE: return createTableScanPhysiNode(pCxt, pSubplan, pScanLogicNode); - case SCAN_TYPE_STABLE: case SCAN_TYPE_STREAM: - break; + return createStreamScanPhysiNode(pCxt, pSubplan, pScanLogicNode); default: break; } diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 33ec8ab6efb19437c290fba480678a5c6aabc08f..58b5c8340a2152d3335d411be2d2cd58f0fd0caf 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -1813,7 +1813,7 @@ int32_t fltInitValFieldData(SFilterInfo *info) { if(type == TSDB_DATA_TYPE_NCHAR && (unit->compare.optr == OP_TYPE_MATCH || unit->compare.optr == OP_TYPE_NMATCH)){ char newValData[TSDB_REGEX_STRING_DEFAULT_LEN * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE] = {0}; - int32_t len = taosUcs4ToMbs(varDataVal(fi->data), varDataLen(fi->data), varDataVal(newValData)); + int32_t len = taosUcs4ToMbs((TdUcs4*)varDataVal(fi->data), varDataLen(fi->data), varDataVal(newValData)); if (len < 0){ qError("filterInitValFieldData taosUcs4ToMbs error 1"); return TSDB_CODE_QRY_APP_ERROR; @@ -2992,7 +2992,7 @@ bool filterExecuteImplMisc(void *pinfo, int32_t numOfRows, int8_t** p, SColumnDa if(info->cunits[uidx].dataType == TSDB_DATA_TYPE_NCHAR && (info->cunits[uidx].optr == OP_TYPE_MATCH || info->cunits[uidx].optr == OP_TYPE_NMATCH)){ char *newColData = calloc(info->cunits[uidx].dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1); - int32_t len = taosUcs4ToMbs(varDataVal(colData), varDataLen(colData), varDataVal(newColData)); + int32_t len = taosUcs4ToMbs((TdUcs4*)varDataVal(colData), varDataLen(colData), varDataVal(newColData)); if (len < 0){ qError("castConvert1 taosUcs4ToMbs error"); }else{ @@ -3052,7 +3052,7 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, int8_t** p, SColumnDataAg } else { if(cunit->dataType == TSDB_DATA_TYPE_NCHAR && (cunit->optr == OP_TYPE_MATCH || cunit->optr == OP_TYPE_NMATCH)){ char *newColData = calloc(cunit->dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1); - int32_t len = taosUcs4ToMbs(varDataVal(colData), varDataLen(colData), varDataVal(newColData)); + int32_t len = taosUcs4ToMbs((TdUcs4*)varDataVal(colData), varDataLen(colData), varDataVal(newColData)); if (len < 0){ qError("castConvert1 taosUcs4ToMbs error"); }else{ @@ -3433,7 +3433,7 @@ int32_t filterConverNcharColumns(SFilterInfo* info, int32_t rows, bool *gotNchar varDataCopy(dst, src); continue; } - bool ret = taosMbsToUcs4(varDataVal(src), varDataLen(src), varDataVal(dst), bufSize, &len); + bool ret = taosMbsToUcs4(varDataVal(src), varDataLen(src), (TdUcs4*)varDataVal(dst), bufSize, &len); if(!ret) { qError("filterConverNcharColumns taosMbsToUcs4 error"); return TSDB_CODE_FAILED; diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index 0fe7bf6e369fc3c9e9b2d8658ccb45c513b255f3..17ac9b19fd5574b61beb25ec3198dace2992e5fe 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -316,7 +316,7 @@ int32_t vectorConvertFromVarData(SScalarParam* pIn, SScalarParam* pOut, int32_t tmp = realloc(tmp, bufSize); } - int len = taosUcs4ToMbs(varDataVal(pIn->data), varDataLen(pIn->data), tmp); + int len = taosUcs4ToMbs((TdUcs4*)varDataVal(pIn->data), varDataLen(pIn->data), tmp); if (len < 0){ sclError("castConvert taosUcs4ToMbs error 1"); tfree(tmp); diff --git a/source/libs/sync/inc/syncCommit.h b/source/libs/sync/inc/syncCommit.h new file mode 100644 index 0000000000000000000000000000000000000000..c76236d5bfd3ca3050c7dbe3900a5644c4388911 --- /dev/null +++ b/source/libs/sync/inc/syncCommit.h @@ -0,0 +1,60 @@ +/* + * 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_LIBS_SYNC_COMMIT_H +#define _TD_LIBS_SYNC_COMMIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "syncInt.h" +#include "taosdef.h" + +// \* Leader i advances its commitIndex. +// \* This is done as a separate step from handling AppendEntries responses, +// \* in part to minimize atomic regions, and in part so that leaders of +// \* single-server clusters are able to mark entries committed. +// AdvanceCommitIndex(i) == +// /\ state[i] = Leader +// /\ LET \* The set of servers that agree up through index. +// Agree(index) == {i} \cup {k \in Server : +// matchIndex[i][k] >= index} +// \* The maximum indexes for which a quorum agrees +// agreeIndexes == {index \in 1..Len(log[i]) : +// Agree(index) \in Quorum} +// \* New value for commitIndex'[i] +// newCommitIndex == +// IF /\ agreeIndexes /= {} +// /\ log[i][Max(agreeIndexes)].term = currentTerm[i] +// THEN +// Max(agreeIndexes) +// ELSE +// commitIndex[i] +// IN commitIndex' = [commitIndex EXCEPT ![i] = newCommitIndex] +// /\ UNCHANGED <> +// +void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode); +bool syncAgreeIndex(SSyncNode* pSyncNode, SRaftId* pRaftId, SyncIndex index); +bool syncAgree(SSyncNode* pSyncNode, SyncIndex index); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_LIBS_SYNC_COMMIT_H*/ diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 5a9af83827b6d952ea36165d9a97524708c1c985..8e36424f192e03fc72b6878f184ce075ecbdd0bc 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -236,7 +236,6 @@ void syncNodeCandidate2Follower(SSyncNode* pSyncNode); // raft vote -------------- void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId); void syncNodeVoteForSelf(SSyncNode* pSyncNode); -void syncNodeMaybeAdvanceCommitIndex(SSyncNode* pSyncNode); // for debug -------------- void syncNodePrint(SSyncNode* pObj); diff --git a/source/libs/sync/inc/syncOnMessage.h b/source/libs/sync/inc/syncOnMessage.h index 7cb186a8121800134fad6d1896870e85cbe503b1..2f8856e652a84332a9455fb1f6bc26bf8a975e89 100644 --- a/source/libs/sync/inc/syncOnMessage.h +++ b/source/libs/sync/inc/syncOnMessage.h @@ -25,6 +25,46 @@ extern "C" { #include #include "taosdef.h" +// TLA+ Spec +// Receive(m) == +// LET i == m.mdest +// j == m.msource +// IN \* Any RPC with a newer term causes the recipient to advance +// \* its term first. Responses with stale terms are ignored. +// \/ UpdateTerm(i, j, m) +// \/ /\ m.mtype = RequestVoteRequest +// /\ HandleRequestVoteRequest(i, j, m) +// \/ /\ m.mtype = RequestVoteResponse +// /\ \/ DropStaleResponse(i, j, m) +// \/ HandleRequestVoteResponse(i, j, m) +// \/ /\ m.mtype = AppendEntriesRequest +// /\ HandleAppendEntriesRequest(i, j, m) +// \/ /\ m.mtype = AppendEntriesResponse +// /\ \/ DropStaleResponse(i, j, m) +// \/ HandleAppendEntriesResponse(i, j, m) + +// DuplicateMessage(m) == +// /\ Send(m) +// /\ UNCHANGED <> + +// DropMessage(m) == +// /\ Discard(m) +// /\ UNCHANGED <> + +// Next == /\ \/ \E i \in Server : Restart(i) +// \/ \E i \in Server : Timeout(i) +// \/ \E i,j \in Server : RequestVote(i, j) +// \/ \E i \in Server : BecomeLeader(i) +// \/ \E i \in Server, v \in Value : ClientRequest(i, v) +// \/ \E i \in Server : AdvanceCommitIndex(i) +// \/ \E i,j \in Server : AppendEntries(i, j) +// \/ \E m \in DOMAIN messages : Receive(m) +// \/ \E m \in DOMAIN messages : DuplicateMessage(m) +// \/ \E m \in DOMAIN messages : DropMessage(m) +// \* History variable that tracks every log ever: +// /\ allLogs' = allLogs \cup {log[i] : i \in Server} +// + #ifdef __cplusplus } #endif diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 7013d281e3f04a8614663c97ea8990359bac8482..270180e3477b4c6359feb07a918de56ac097fcef 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -94,6 +94,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { } assert(pMsg->term <= ths->pRaftStore->currentTerm); + // reset elect timer if (pMsg->term == ths->pRaftStore->currentTerm) { ths->leaderCache = pMsg->srcId; syncNodeResetElectTimer(ths); @@ -135,38 +136,117 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE) { syncNodeBecomeFollower(ths); - // need ret? + // ret or reply? return ret; } // accept request if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) { - bool matchSuccess = false; + bool preMatch = false; if (pMsg->prevLogIndex == SYNC_INDEX_INVALID && ths->pLogStore->getLastIndex(ths->pLogStore) == SYNC_INDEX_INVALID) { - matchSuccess = true; + preMatch = true; } if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) { SSyncRaftEntry* pPreEntry = logStoreGetEntry(ths->pLogStore, pMsg->prevLogIndex); assert(pPreEntry != NULL); if (pMsg->prevLogTerm == pPreEntry->term) { - matchSuccess = true; + preMatch = true; } syncEntryDestory(pPreEntry); } - if (matchSuccess) { - // delete conflict entries - if (pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore)) { - SyncIndex fromIndex = pMsg->prevLogIndex + 1; - ths->pLogStore->truncate(ths->pLogStore, fromIndex); - } + if (preMatch) { + // must has preIndex in local log + assert(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)); + + bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore); + bool hasAppendEntries = pMsg->dataLen > 0; + + if (hasExtraEntries && hasAppendEntries) { + // conflict + bool conflict = false; + + SyncIndex extraIndex = pMsg->prevLogIndex + 1; + SSyncRaftEntry* pExtraEntry = logStoreGetEntry(ths->pLogStore, extraIndex); + assert(pExtraEntry != NULL); + + SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen); + assert(pAppendEntry != NULL); + + assert(extraIndex == pAppendEntry->index); + if (pExtraEntry->term == pAppendEntry->term) { + conflict = true; + } + + if (conflict) { + // roll back + SyncIndex delBegin = ths->pLogStore->getLastIndex(ths->pLogStore); + SyncIndex delEnd = extraIndex; + + // notice! reverse roll back! + for (SyncIndex index = delEnd; index >= delBegin; --index) { + if (ths->pFsm->FpRollBackCb != NULL) { + SSyncRaftEntry* pRollBackEntry = logStoreGetEntry(ths->pLogStore, index); + assert(pRollBackEntry != NULL); + + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pRollBackEntry, &rpcMsg); + ths->pFsm->FpRollBackCb(ths->pFsm, &rpcMsg, pRollBackEntry->index, pRollBackEntry->isWeak, 0); + rpcFreeCont(rpcMsg.pCont); + syncEntryDestory(pRollBackEntry); + } + } + + // delete confict entries + ths->pLogStore->truncate(ths->pLogStore, extraIndex); + + // append new entries + ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry); + + // pre commit + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pAppendEntry, &rpcMsg); + if (ths->pFsm != NULL) { + if (ths->pFsm->FpPreCommitCb != NULL) { + ths->pFsm->FpPreCommitCb(ths->pFsm, &rpcMsg, pAppendEntry->index, pAppendEntry->isWeak, 0); + } + } + rpcFreeCont(rpcMsg.pCont); + } + + // free memory + syncEntryDestory(pExtraEntry); + syncEntryDestory(pAppendEntry); - // append one entry - if (pMsg->dataLen > 0) { - SSyncRaftEntry* pEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen); - ths->pLogStore->appendEntry(ths->pLogStore, pEntry); - syncEntryDestory(pEntry); + } else if (hasExtraEntries && !hasAppendEntries) { + // do nothing + + } else if (!hasExtraEntries && hasAppendEntries) { + SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen); + assert(pAppendEntry != NULL); + + // append new entries + ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry); + + // pre commit + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pAppendEntry, &rpcMsg); + if (ths->pFsm != NULL) { + if (ths->pFsm->FpPreCommitCb != NULL) { + ths->pFsm->FpPreCommitCb(ths->pFsm, &rpcMsg, pAppendEntry->index, pAppendEntry->isWeak, 0); + } + } + rpcFreeCont(rpcMsg.pCont); + + // free memory + syncEntryDestory(pAppendEntry); + + } else if (!hasExtraEntries && !hasAppendEntries) { + // do nothing + + } else { + assert(0); } SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(); @@ -175,7 +255,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { pReply->term = ths->pRaftStore->currentTerm; pReply->success = true; - if (pMsg->dataLen > 0) { + if (hasAppendEntries) { pReply->matchIndex = pMsg->prevLogIndex + 1; } else { pReply->matchIndex = pMsg->prevLogIndex; @@ -201,11 +281,38 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) { syncAppendEntriesReplyDestroy(pReply); } + // maybe update commit index from leader if (pMsg->commitIndex > ths->commitIndex) { + // has commit entry in local if (pMsg->commitIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) { - // commit + SyncIndex beginIndex = ths->commitIndex + 1; + SyncIndex endIndex = pMsg->commitIndex; + + // update commit index ths->commitIndex = pMsg->commitIndex; + + // call back Wal ths->pLogStore->updateCommitIndex(ths->pLogStore, ths->commitIndex); + + // execute fsm + if (ths->pFsm != NULL) { + for (SyncIndex i = beginIndex; i <= endIndex; ++i) { + if (i != SYNC_INDEX_INVALID) { + SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, i); + assert(pEntry != NULL); + + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pEntry, &rpcMsg); + + if (ths->pFsm->FpCommitCb != NULL) { + ths->pFsm->FpCommitCb(ths->pFsm, &rpcMsg, pEntry->index, pEntry->isWeak, 0); + } + + rpcFreeCont(rpcMsg.pCont); + syncEntryDestory(pEntry); + } + } + } } } } diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 93539db9386dd061fa680a83fc1d2c955f933326..9db9a3e8ac532790dbcffff40f80b5950adc983c 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -14,6 +14,7 @@ */ #include "syncAppendEntriesReply.h" +#include "syncCommit.h" #include "syncIndexMgr.h" #include "syncInt.h" #include "syncRaftLog.h" @@ -59,7 +60,7 @@ int32_t syncNodeOnAppendEntriesReplyCb(SSyncNode* ths, SyncAppendEntriesReply* p syncIndexMgrSetIndex(ths->pMatchIndex, &(pMsg->srcId), pMsg->matchIndex); // maybe commit - syncNodeMaybeAdvanceCommitIndex(ths); + syncMaybeAdvanceCommitIndex(ths); } else { SyncIndex nextIndex = syncIndexMgrGetIndex(ths->pNextIndex, &(pMsg->srcId)); diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index 25835edc926a3b5b7f1b176860d5984a47291be7..38b39e04cf06b4dfbb6cc1f1da15756f7b50affe 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -13,9 +13,12 @@ * along with this program. If not, see . */ +#include "syncCommit.h" #include "syncIndexMgr.h" #include "syncInt.h" #include "syncRaftLog.h" +#include "syncRaftStore.h" +#include "syncUtil.h" // \* Leader i advances its commitIndex. // \* This is done as a separate step from handling AppendEntries responses, @@ -40,28 +43,86 @@ // IN commitIndex' = [commitIndex EXCEPT ![i] = newCommitIndex] // /\ UNCHANGED <> // -void syncNodeMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { +void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { syncIndexMgrLog2("==syncNodeMaybeAdvanceCommitIndex== pNextIndex", pSyncNode->pNextIndex); syncIndexMgrLog2("==syncNodeMaybeAdvanceCommitIndex== pMatchIndex", pSyncNode->pMatchIndex); // update commit index - - if (pSyncNode->pFsm != NULL) { - SyncIndex beginIndex = SYNC_INDEX_INVALID; - SyncIndex endIndex = SYNC_INDEX_INVALID; - for (SyncIndex i = beginIndex; i <= endIndex; ++i) { - SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, i); + SyncIndex newCommitIndex = pSyncNode->commitIndex; + for (SyncIndex index = pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore); index > pSyncNode->commitIndex; + ++index) { + bool agree = syncAgree(pSyncNode, index); + if (agree) { + // term + SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index); assert(pEntry != NULL); - SRpcMsg rpcMsg; - syncEntry2OriginalRpc(pEntry, &rpcMsg); + // cannot commit, even if quorum agree. need check term! + if (pEntry->term == pSyncNode->pRaftStore->currentTerm) { + // update commit index + newCommitIndex = index; + break; + } + } + } + + if (newCommitIndex > pSyncNode->commitIndex) { + SyncIndex beginIndex = pSyncNode->commitIndex + 1; + SyncIndex endIndex = newCommitIndex; + + // update commit index + pSyncNode->commitIndex = newCommitIndex; + + // call back Wal + pSyncNode->pLogStore->updateCommitIndex(pSyncNode->pLogStore, pSyncNode->commitIndex); + + // execute fsm + if (pSyncNode->pFsm != NULL) { + for (SyncIndex i = beginIndex; i <= endIndex; ++i) { + if (i != SYNC_INDEX_INVALID) { + SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, i); + assert(pEntry != NULL); + + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pEntry, &rpcMsg); - if (pSyncNode->pFsm->FpCommitCb != NULL) { - pSyncNode->pFsm->FpCommitCb(pSyncNode->pFsm, &rpcMsg, pEntry->index, pEntry->isWeak, 0); + if (pSyncNode->pFsm->FpCommitCb != NULL) { + pSyncNode->pFsm->FpCommitCb(pSyncNode->pFsm, &rpcMsg, pEntry->index, pEntry->isWeak, 0); + } + + rpcFreeCont(rpcMsg.pCont); + syncEntryDestory(pEntry); + } } + } + } +} + +bool syncAgreeIndex(SSyncNode* pSyncNode, SRaftId* pRaftId, SyncIndex index) { + // I am leader, I agree + if (syncUtilSameId(pRaftId, &(pSyncNode->myRaftId)) && pSyncNode->state == TAOS_SYNC_STATE_LEADER) { + return true; + } - rpcFreeCont(rpcMsg.pCont); - syncEntryDestory(pEntry); + // follower agree + SyncIndex matchIndex = syncIndexMgrGetIndex(pSyncNode->pMatchIndex, pRaftId); + if (matchIndex >= index) { + return true; + } + + // not agree + return false; +} + +bool syncAgree(SSyncNode* pSyncNode, SyncIndex index) { + int agreeCount = 0; + for (int i = 0; i < pSyncNode->replicaNum; ++i) { + if (syncAgreeIndex(pSyncNode, &(pSyncNode->replicasId[i]), index)) { + ++agreeCount; + } + if (agreeCount >= pSyncNode->quorum) { + return true; } } + return false; } \ No newline at end of file diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 1f3e709a27e7001e71f064b75d718dfa8f0b0bc9..6ed922962540d6d2327978a39335ef9bcb5ac2bd 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -17,6 +17,7 @@ #include "sync.h" #include "syncAppendEntries.h" #include "syncAppendEntriesReply.h" +#include "syncCommit.h" #include "syncElection.h" #include "syncEnv.h" #include "syncIndexMgr.h" @@ -59,11 +60,14 @@ int64_t syncStart(const SSyncInfo* pSyncInfo) { int32_t ret = 0; SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo); assert(pSyncNode != NULL); + + // todo : return ref id return ret; } void syncStop(int64_t rid) { - SSyncNode* pSyncNode = NULL; // get pointer from rid + // todo : get pointer from rid + SSyncNode* pSyncNode = NULL; syncNodeClose(pSyncNode); } @@ -73,8 +77,10 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg) { } int32_t syncForwardToPeer(int64_t rid, const SRpcMsg* pMsg, bool isWeak) { - int32_t ret = 0; - SSyncNode* pSyncNode = NULL; // get pointer from rid + int32_t ret = 0; + + // todo : get pointer from rid + SSyncNode* pSyncNode = NULL; if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) { SyncClientRequest* pSyncMsg = syncClientRequestBuild2(pMsg, 0, isWeak); SRpcMsg rpcMsg; @@ -85,13 +91,14 @@ int32_t syncForwardToPeer(int64_t rid, const SRpcMsg* pMsg, bool isWeak) { } else { sTrace("syncForwardToPeer not leader, %s", syncUtilState2String(pSyncNode->state)); - ret = -1; // need define err code !! + ret = -1; // todo : need define err code !! } return ret; } ESyncState syncGetMyRole(int64_t rid) { - SSyncNode* pSyncNode = NULL; // get pointer from rid + // todo : get pointer from rid + SSyncNode* pSyncNode = NULL; return pSyncNode->state; } @@ -150,6 +157,30 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) { // init life cycle + // TLA+ Spec + // InitHistoryVars == /\ elections = {} + // /\ allLogs = {} + // /\ voterLog = [i \in Server |-> [j \in {} |-> <<>>]] + // InitServerVars == /\ currentTerm = [i \in Server |-> 1] + // /\ state = [i \in Server |-> Follower] + // /\ votedFor = [i \in Server |-> Nil] + // InitCandidateVars == /\ votesResponded = [i \in Server |-> {}] + // /\ votesGranted = [i \in Server |-> {}] + // \* The values nextIndex[i][i] and matchIndex[i][i] are never read, since the + // \* leader does not send itself messages. It's still easier to include these + // \* in the functions. + // InitLeaderVars == /\ nextIndex = [i \in Server |-> [j \in Server |-> 1]] + // /\ matchIndex = [i \in Server |-> [j \in Server |-> 0]] + // InitLogVars == /\ log = [i \in Server |-> << >>] + // /\ commitIndex = [i \in Server |-> 0] + // Init == /\ messages = [m \in {} |-> 0] + // /\ InitHistoryVars + // /\ InitServerVars + // /\ InitCandidateVars + // /\ InitLeaderVars + // /\ InitLogVars + // + // init TLA+ server vars pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER; pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath); @@ -170,7 +201,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) { // init TLA+ log vars pSyncNode->pLogStore = logStoreCreate(pSyncNode); assert(pSyncNode->pLogStore != NULL); - pSyncNode->commitIndex = 0; + pSyncNode->commitIndex = SYNC_INDEX_INVALID; // init ping timer pSyncNode->pPingTimer = NULL; @@ -727,6 +758,16 @@ static int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) { return ret; } +// TLA+ Spec +// ClientRequest(i, v) == +// /\ state[i] = Leader +// /\ LET entry == [term |-> currentTerm[i], +// value |-> v] +// newLog == Append(log[i], entry) +// IN log' = [log EXCEPT ![i] = newLog] +// /\ UNCHANGED <> +// static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg) { int32_t ret = 0; syncClientRequestLog2("==syncNodeOnClientRequestCb==", pMsg); @@ -739,9 +780,6 @@ static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg if (ths->state == TAOS_SYNC_STATE_LEADER) { ths->pLogStore->appendEntry(ths->pLogStore, pEntry); - // only myself, maybe commit - syncNodeMaybeAdvanceCommitIndex(ths); - // start replicate right now! syncNodeReplicate(ths); @@ -756,6 +794,9 @@ static int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg } rpcFreeCont(rpcMsg.pCont); + // only myself, maybe commit + syncMaybeAdvanceCommitIndex(ths); + } else { // pre commit SRpcMsg rpcMsg; diff --git a/source/libs/sync/src/syncOnMessage.c b/source/libs/sync/src/syncOnMessage.c index 19a97ee1566d32ed0fc8786c4d75542c2c435f30..ce8bed9cd39c44df9b090ae931cba063d1dda53c 100644 --- a/source/libs/sync/src/syncOnMessage.c +++ b/source/libs/sync/src/syncOnMessage.c @@ -14,3 +14,43 @@ */ #include "syncOnMessage.h" + +// TLA+ Spec +// Receive(m) == +// LET i == m.mdest +// j == m.msource +// IN \* Any RPC with a newer term causes the recipient to advance +// \* its term first. Responses with stale terms are ignored. +// \/ UpdateTerm(i, j, m) +// \/ /\ m.mtype = RequestVoteRequest +// /\ HandleRequestVoteRequest(i, j, m) +// \/ /\ m.mtype = RequestVoteResponse +// /\ \/ DropStaleResponse(i, j, m) +// \/ HandleRequestVoteResponse(i, j, m) +// \/ /\ m.mtype = AppendEntriesRequest +// /\ HandleAppendEntriesRequest(i, j, m) +// \/ /\ m.mtype = AppendEntriesResponse +// /\ \/ DropStaleResponse(i, j, m) +// \/ HandleAppendEntriesResponse(i, j, m) + +// DuplicateMessage(m) == +// /\ Send(m) +// /\ UNCHANGED <> + +// DropMessage(m) == +// /\ Discard(m) +// /\ UNCHANGED <> + +// Next == /\ \/ \E i \in Server : Restart(i) +// \/ \E i \in Server : Timeout(i) +// \/ \E i,j \in Server : RequestVote(i, j) +// \/ \E i \in Server : BecomeLeader(i) +// \/ \E i \in Server, v \in Value : ClientRequest(i, v) +// \/ \E i \in Server : AdvanceCommitIndex(i) +// \/ \E i,j \in Server : AppendEntries(i, j) +// \/ \E m \in DOMAIN messages : Receive(m) +// \/ \E m \in DOMAIN messages : DuplicateMessage(m) +// \/ \E m \in DOMAIN messages : DropMessage(m) +// \* History variable that tracks every log ever: +// /\ allLogs' = allLogs \cup {log[i] : i \in Server} +// \ No newline at end of file diff --git a/source/libs/sync/test/CMakeLists.txt b/source/libs/sync/test/CMakeLists.txt index 5fa0e975d88bb043708b58ae37f2514d699492a4..0c7608f902621ba8b233f67a6844fdf953b360fa 100644 --- a/source/libs/sync/test/CMakeLists.txt +++ b/source/libs/sync/test/CMakeLists.txt @@ -29,6 +29,8 @@ add_executable(syncPingTimerTest2 "") add_executable(syncPingSelfTest "") add_executable(syncElectTest "") add_executable(syncEncodeTest "") +add_executable(syncWriteTest "") +add_executable(syncReplicateTest "") target_sources(syncTest @@ -155,6 +157,14 @@ target_sources(syncEncodeTest PRIVATE "syncEncodeTest.cpp" ) +target_sources(syncWriteTest + PRIVATE + "syncWriteTest.cpp" +) +target_sources(syncReplicateTest + PRIVATE + "syncReplicateTest.cpp" +) target_include_directories(syncTest @@ -317,6 +327,16 @@ target_include_directories(syncEncodeTest "${CMAKE_SOURCE_DIR}/include/libs/sync" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" ) +target_include_directories(syncWriteTest + PUBLIC + "${CMAKE_SOURCE_DIR}/include/libs/sync" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) +target_include_directories(syncReplicateTest + PUBLIC + "${CMAKE_SOURCE_DIR}/include/libs/sync" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) target_link_libraries(syncTest @@ -443,6 +463,14 @@ target_link_libraries(syncEncodeTest sync gtest_main ) +target_link_libraries(syncWriteTest + sync + gtest_main +) +target_link_libraries(syncReplicateTest + sync + gtest_main +) enable_testing() diff --git a/source/libs/sync/test/syncEncodeTest.cpp b/source/libs/sync/test/syncEncodeTest.cpp index f615c1d237a75f6f37877ae363597a47e6ef48ea..e554858072bf6a3f71c8ec1c185ead2274a0b852 100644 --- a/source/libs/sync/test/syncEncodeTest.cpp +++ b/source/libs/sync/test/syncEncodeTest.cpp @@ -8,7 +8,6 @@ #include "syncRaftLog.h" #include "syncRaftStore.h" #include "syncUtil.h" -#include "syncRaftLog.h" void logTest() { sTrace("--- sync log test: trace"); @@ -25,11 +24,11 @@ int32_t myIndex = 0; SRaftId ids[TSDB_MAX_REPLICA]; SSyncInfo syncInfo; -SSyncFSM* pFsm; -SWal* pWal; -SSyncNode* pSyncNode; +SSyncFSM * pFsm; +SWal * pWal; +SSyncNode *pSyncNode; -SSyncNode* syncNodeInit() { +SSyncNode *syncNodeInit() { syncInfo.vgId = 1234; syncInfo.rpcClient = gSyncIO->clientRpc; syncInfo.FpSendMsg = syncIOSendMsg; @@ -54,7 +53,7 @@ SSyncNode* syncNodeInit() { syncInfo.pWal = pWal; - SSyncCfg* pCfg = &syncInfo.syncCfg; + SSyncCfg *pCfg = &syncInfo.syncCfg; pCfg->myIndex = myIndex; pCfg->replicaNum = replicaNum; @@ -81,43 +80,12 @@ SSyncNode* syncNodeInit() { return pSyncNode; } -SSyncNode* syncInitTest() { return syncNodeInit(); } - -void logStoreTest() { - logStorePrint2((char*)"logStoreTest", pSyncNode->pLogStore); - - assert(pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore) == SYNC_INDEX_INVALID); - - for (int i = 0; i < 5; ++i) { - int32_t dataLen = 10; - SSyncRaftEntry* pEntry = syncEntryBuild(dataLen); - assert(pEntry != NULL); - pEntry->msgType = 1; - pEntry->originalRpcType = 2; - pEntry->seqNum = 3; - pEntry->isWeak = true; - pEntry->term = 100; - pEntry->index = pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore) + 1; - snprintf(pEntry->data, dataLen, "value%d", i); - - // syncEntryPrint2((char*)"write entry:", pEntry); - pSyncNode->pLogStore->appendEntry(pSyncNode->pLogStore, pEntry); - syncEntryDestory(pEntry); - - if (i == 0) { - assert(pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore) == SYNC_INDEX_BEGIN); - } - } - logStorePrint2((char*)"after appendEntry", pSyncNode->pLogStore); - - pSyncNode->pLogStore->truncate(pSyncNode->pLogStore, 3); - logStorePrint2((char*)"after truncate 3", pSyncNode->pLogStore); -} +SSyncNode *syncInitTest() { return syncNodeInit(); } -void initRaftId(SSyncNode* pSyncNode) { +void initRaftId(SSyncNode *pSyncNode) { for (int i = 0; i < replicaNum; ++i) { ids[i] = pSyncNode->replicasId[i]; - char* s = syncUtilRaftId2Str(&ids[i]); + char *s = syncUtilRaftId2Str(&ids[i]); printf("raftId[%d] : %s\n", i, s); free(s); } @@ -181,7 +149,7 @@ int main(int argc, char **argv) { myIndex = atoi(argv[1]); } - int32_t ret = syncIOStart((char*)"127.0.0.1", ports[myIndex]); + int32_t ret = syncIOStart((char *)"127.0.0.1", ports[myIndex]); assert(ret == 0); ret = syncEnvStart(); @@ -210,7 +178,7 @@ int main(int argc, char **argv) { syncEntryPrint2((char *)"==step4==", pMsg4); // log, relog - SSyncNode* pSyncNode = syncNodeInit(); + SSyncNode *pSyncNode = syncNodeInit(); assert(pSyncNode != NULL); SSyncRaftEntry *pEntry = pMsg4; pSyncNode->pLogStore->appendEntry(pSyncNode->pLogStore, pEntry); diff --git a/source/libs/sync/test/syncReplicateTest.cpp b/source/libs/sync/test/syncReplicateTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..502263cfbf736758298961211db6eda5876de2a3 --- /dev/null +++ b/source/libs/sync/test/syncReplicateTest.cpp @@ -0,0 +1,126 @@ +#include +#include +#include "syncEnv.h" +#include "syncIO.h" +#include "syncInt.h" +#include "syncRaftLog.h" +#include "syncRaftStore.h" +#include "syncUtil.h" + +void logTest() { + sTrace("--- sync log test: trace"); + sDebug("--- sync log test: debug"); + sInfo("--- sync log test: info"); + sWarn("--- sync log test: warn"); + sError("--- sync log test: error"); + sFatal("--- sync log test: fatal"); +} + +uint16_t ports[] = {7010, 7110, 7210, 7310, 7410}; +int32_t replicaNum = 3; +int32_t myIndex = 0; + +SRaftId ids[TSDB_MAX_REPLICA]; +SSyncInfo syncInfo; +SSyncFSM* pFsm; +SWal* pWal; +SSyncNode* gSyncNode; + +SSyncNode* syncNodeInit() { + syncInfo.vgId = 1234; + syncInfo.rpcClient = gSyncIO->clientRpc; + syncInfo.FpSendMsg = syncIOSendMsg; + syncInfo.queue = gSyncIO->pMsgQ; + syncInfo.FpEqMsg = syncIOEqMsg; + syncInfo.pFsm = pFsm; + snprintf(syncInfo.path, sizeof(syncInfo.path), "./elect_test_%d", myIndex); + + int code = walInit(); + assert(code == 0); + SWalCfg walCfg; + memset(&walCfg, 0, sizeof(SWalCfg)); + walCfg.vgId = syncInfo.vgId; + walCfg.fsyncPeriod = 1000; + walCfg.retentionPeriod = 1000; + walCfg.rollPeriod = 1000; + walCfg.retentionSize = 1000; + walCfg.segSize = 1000; + walCfg.level = TAOS_WAL_FSYNC; + + char tmpdir[128]; + snprintf(tmpdir, sizeof(tmpdir), "./elect_test_wal_%d", myIndex); + pWal = walOpen(tmpdir, &walCfg); + assert(pWal != NULL); + + syncInfo.pWal = pWal; + + SSyncCfg* pCfg = &syncInfo.syncCfg; + pCfg->myIndex = myIndex; + pCfg->replicaNum = replicaNum; + + for (int i = 0; i < replicaNum; ++i) { + pCfg->nodeInfo[i].nodePort = ports[i]; + snprintf(pCfg->nodeInfo[i].nodeFqdn, sizeof(pCfg->nodeInfo[i].nodeFqdn), "%s", "127.0.0.1"); + // taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn); + } + + SSyncNode* pSyncNode = syncNodeOpen(&syncInfo); + assert(pSyncNode != NULL); + + gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing; + gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply; + gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote; + gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply; + gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries; + gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply; + gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing; + gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply; + gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout; + gSyncIO->pSyncNode = pSyncNode; + + return pSyncNode; +} + +SSyncNode* syncInitTest() { return syncNodeInit(); } + +void initRaftId(SSyncNode* pSyncNode) { + for (int i = 0; i < replicaNum; ++i) { + ids[i] = pSyncNode->replicasId[i]; + char* s = syncUtilRaftId2Str(&ids[i]); + printf("raftId[%d] : %s\n", i, s); + free(s); + } +} + +int main(int argc, char** argv) { + // taosInitLog((char *)"syncTest.log", 100000, 10); + tsAsyncLog = 0; + sDebugFlag = 143 + 64; + + myIndex = 0; + if (argc >= 2) { + myIndex = atoi(argv[1]); + } + + int32_t ret = syncIOStart((char*)"127.0.0.1", ports[myIndex]); + assert(ret == 0); + + ret = syncEnvStart(); + assert(ret == 0); + + gSyncNode = syncInitTest(); + assert(gSyncNode != NULL); + syncNodePrint2((char*)"", gSyncNode); + + initRaftId(gSyncNode); + + //--------------------------- + while (1) { + sTrace("while 1 sleep, state: %d, %s, electTimerLogicClock:%lu, electTimerLogicClockUser:%lu, electTimerMS:%d", + gSyncNode->state, syncUtilState2String(gSyncNode->state), gSyncNode->electTimerLogicClock, + gSyncNode->electTimerLogicClockUser, gSyncNode->electTimerMS); + taosMsleep(1000); + } + + return 0; +} diff --git a/source/libs/sync/test/syncWriteTest.cpp b/source/libs/sync/test/syncWriteTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2598abbddd86ac6813afd287246202d5439cb9c8 --- /dev/null +++ b/source/libs/sync/test/syncWriteTest.cpp @@ -0,0 +1,180 @@ +#include +#include +#include "syncEnv.h" +#include "syncIO.h" +#include "syncInt.h" +#include "syncMessage.h" +#include "syncRaftEntry.h" +#include "syncRaftLog.h" +#include "syncRaftStore.h" +#include "syncUtil.h" + +void logTest() { + sTrace("--- sync log test: trace"); + sDebug("--- sync log test: debug"); + sInfo("--- sync log test: info"); + sWarn("--- sync log test: warn"); + sError("--- sync log test: error"); + sFatal("--- sync log test: fatal"); +} + +uint16_t ports[] = {7010, 7110, 7210, 7310, 7410}; +int32_t replicaNum = 1; +int32_t myIndex = 0; + +SRaftId ids[TSDB_MAX_REPLICA]; +SSyncInfo syncInfo; +SSyncFSM * pFsm; +SWal * pWal; +SSyncNode *gSyncNode; + +void CommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pBuf, SyncIndex index, bool isWeak, int32_t code) { + printf("==CommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d \n", pFsm, index, isWeak, code); + syncRpcMsgPrint2((char *)"==CommitCb==", (SRpcMsg *)pBuf); +} + +void PreCommitCb(struct SSyncFSM *pFsm, const SRpcMsg *pBuf, SyncIndex index, bool isWeak, int32_t code) { + printf("==PreCommitCb== pFsm:%p, index:%ld, isWeak:%d, code:%d \n", pFsm, index, isWeak, code); + syncRpcMsgPrint2((char *)"==PreCommitCb==", (SRpcMsg *)pBuf); +} + +void RollBackCb(struct SSyncFSM *pFsm, const SRpcMsg *pBuf, SyncIndex index, bool isWeak, int32_t code) { + printf("==RollBackCb== pFsm:%p, index:%ld, isWeak:%d, code:%d \n", pFsm, index, isWeak, code); + syncRpcMsgPrint2((char *)"==RollBackCb==", (SRpcMsg *)pBuf); +} + +void initFsm() { + pFsm = (SSyncFSM *)malloc(sizeof(SSyncFSM)); + pFsm->FpCommitCb = CommitCb; + pFsm->FpPreCommitCb = PreCommitCb; + pFsm->FpRollBackCb = RollBackCb; +} + +SSyncNode *syncNodeInit() { + syncInfo.vgId = 1234; + syncInfo.rpcClient = gSyncIO->clientRpc; + syncInfo.FpSendMsg = syncIOSendMsg; + syncInfo.queue = gSyncIO->pMsgQ; + syncInfo.FpEqMsg = syncIOEqMsg; + syncInfo.pFsm = pFsm; + snprintf(syncInfo.path, sizeof(syncInfo.path), "%s", "./write_test"); + + int code = walInit(); + assert(code == 0); + SWalCfg walCfg; + memset(&walCfg, 0, sizeof(SWalCfg)); + walCfg.vgId = syncInfo.vgId; + walCfg.fsyncPeriod = 1000; + walCfg.retentionPeriod = 1000; + walCfg.rollPeriod = 1000; + walCfg.retentionSize = 1000; + walCfg.segSize = 1000; + walCfg.level = TAOS_WAL_FSYNC; + pWal = walOpen("./write_test_wal", &walCfg); + assert(pWal != NULL); + + syncInfo.pWal = pWal; + + SSyncCfg *pCfg = &syncInfo.syncCfg; + pCfg->myIndex = myIndex; + pCfg->replicaNum = replicaNum; + + for (int i = 0; i < replicaNum; ++i) { + pCfg->nodeInfo[i].nodePort = ports[i]; + snprintf(pCfg->nodeInfo[i].nodeFqdn, sizeof(pCfg->nodeInfo[i].nodeFqdn), "%s", "127.0.0.1"); + // taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn); + } + + SSyncNode *pSyncNode = syncNodeOpen(&syncInfo); + assert(pSyncNode != NULL); + + gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing; + gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest; + gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply; + gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote; + gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply; + gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries; + gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply; + gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout; + gSyncIO->pSyncNode = pSyncNode; + + return pSyncNode; +} + +SSyncNode *syncInitTest() { return syncNodeInit(); } + +void initRaftId(SSyncNode *pSyncNode) { + for (int i = 0; i < replicaNum; ++i) { + ids[i] = pSyncNode->replicasId[i]; + char *s = syncUtilRaftId2Str(&ids[i]); + printf("raftId[%d] : %s\n", i, s); + free(s); + } +} + +SRpcMsg *step0() { + SRpcMsg *pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg)); + memset(pMsg, 0, sizeof(SRpcMsg)); + pMsg->msgType = 9999; + pMsg->contLen = 32; + pMsg->pCont = malloc(pMsg->contLen); + snprintf((char *)(pMsg->pCont), pMsg->contLen, "hello, world"); + return pMsg; +} + +SyncClientRequest *step1(const SRpcMsg *pMsg) { + SyncClientRequest *pRetMsg = syncClientRequestBuild2(pMsg, 123, true); + return pRetMsg; +} + +int main(int argc, char **argv) { + // taosInitLog((char *)"syncTest.log", 100000, 10); + tsAsyncLog = 0; + sDebugFlag = 143 + 64; + void logTest(); + + myIndex = 0; + if (argc >= 2) { + myIndex = atoi(argv[1]); + } + + int32_t ret = syncIOStart((char *)"127.0.0.1", ports[myIndex]); + assert(ret == 0); + + ret = syncEnvStart(); + assert(ret == 0); + + taosRemoveDir("./wal_test"); + + initFsm(); + + gSyncNode = syncInitTest(); + assert(gSyncNode != NULL); + syncNodePrint2((char *)"", gSyncNode); + + initRaftId(gSyncNode); + + // step0 + SRpcMsg *pMsg0 = step0(); + syncRpcMsgPrint2((char *)"==step0==", pMsg0); + + // step1 + SyncClientRequest *pMsg1 = step1(pMsg0); + syncClientRequestPrint2((char *)"==step1==", pMsg1); + + for (int i = 0; i < 10; ++i) { + SyncClientRequest *pSyncClientRequest = pMsg1; + SRpcMsg rpcMsg; + syncClientRequest2RpcMsg(pSyncClientRequest, &rpcMsg); + gSyncNode->FpEqMsg(gSyncNode->queue, &rpcMsg); + + taosMsleep(1000); + } + + while (1) { + sTrace("while 1 sleep"); + taosMsleep(1000); + } + + return 0; +} diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index 97b8912b60f9bc3e39c1be03cb14a35adfe0340c..aee7376491c9b7c395456ce7d1bc20559b70c969 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -204,7 +204,8 @@ void tfsDirname(const STfsFile *pFile, char *dest) { void tfsAbsoluteName(STfs *pTfs, SDiskID diskId, const char *rname, char *aname) { STfsDisk *pDisk = TFS_DISK_AT(pTfs, diskId); - snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + + snprintf(aname, TSDB_FILENAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); } int32_t tfsRemoveFile(const STfsFile *pFile) { return taosRemoveFile(pFile->aname); } diff --git a/source/os/CMakeLists.txt b/source/os/CMakeLists.txt index ed240015d4dcbff2ddb0c44cbeee7fc751f95429..eea390391126cd86725e39e7c0e756243780ab7f 100644 --- a/source/os/CMakeLists.txt +++ b/source/os/CMakeLists.txt @@ -5,9 +5,14 @@ target_include_directories( PUBLIC "${CMAKE_SOURCE_DIR}/include/os" PUBLIC "${CMAKE_SOURCE_DIR}/include" PUBLIC "${CMAKE_SOURCE_DIR}/include/util" - PUBLIC "${CMAKE_SOURCE_DIR}/contrib/pthread-win32" + PUBLIC "${CMAKE_SOURCE_DIR}/contrib/pthread" PUBLIC "${CMAKE_SOURCE_DIR}/contrib/gnuregex" ) +# iconv +find_path(IconvApiIncludes iconv.h PATHS) +if(NOT IconvApiIncludes) + add_definitions(-DDISALLOW_NCHAR_WITHOUT_ICONV) +endif () target_link_libraries( os pthread dl rt m ) diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index bcbd95e16028fc7efe20297ec265061580484760..5e859de5d602aef6077ed666575f9bb3b6ac1db8 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -46,6 +46,23 @@ extern int openU(const char *, int, ...); /* MsvcLibX UTF-8 version of open */ #define O_TEXT LINUX_FILE_NO_TEXT_OPTION #endif +#if defined(WINDOWS) +typedef int32_t FileFd; +typedef int32_t SocketFd; +#else +typedef int32_t FileFd; +typedef int32_t SocketFd; +#endif + +typedef int32_t FileFd; + +typedef struct TdFile { + pthread_rwlock_t rwlock; + int refId; + FileFd fd; + FILE *fp; +} * TdFilePtr, TdFile; + #define FILE_WITH_LOCK 1 void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath) { diff --git a/source/os/src/osLocale.c b/source/os/src/osLocale.c index e9d6ed7c5424aff687175391942171f57c43c5f8..5f12f9cd3d5a2a75cd4080d1f35cdb892ea8e0b8 100644 --- a/source/os/src/osLocale.c +++ b/source/os/src/osLocale.c @@ -81,7 +81,7 @@ void taosSetSystemLocale(const char *inLocale, const char *inCharSet) { } if (!taosValidateEncodec(inCharSet)) { - printf("Invalid charset:%s, please set the valid charset in config file", inCharSet); + printf("Invalid charset:%s, please set the valid charset in config file\n", inCharSet); exit(-1); } } diff --git a/source/os/src/osString.c b/source/os/src/osString.c index 1052d108af43599ae2fb6706388a2ce9b4b2e115..d3d1ab5ddaf0c97ce6d2d8e0f5037509721e5a00 100644 --- a/source/os/src/osString.c +++ b/source/os/src/osString.c @@ -13,22 +13,69 @@ * along with this program. If not, see . */ +#define ALLOW_FORBID_FUNC #define _DEFAULT_SOURCE +#include #include "os.h" -#include "tdef.h" -#include -#include +#ifndef DISALLOW_NCHAR_WITHOUT_ICONV +#include "iconv.h" +#endif + +extern int wcwidth(wchar_t c); +extern int wcswidth(const wchar_t *s, size_t n); int64_t taosStr2int64(const char *str) { char *endptr = NULL; return strtoll(str, &endptr, 10); } -#ifdef USE_LIBICONV -#include "iconv.h" +int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes) { + for (int32_t i = 0; i < bytes; i += sizeof(TdUcs4)) { + int32_t f1 = *(int32_t *)((char *)f1_ucs4 + i); + int32_t f2 = *(int32_t *)((char *)f2_ucs4 + i); + + if ((f1 == 0 && f2 != 0) || (f1 != 0 && f2 == 0)) { + return f1 - f2; + } else if (f1 == 0 && f2 == 0) { + return 0; + } + + if (f1 != f2) { + return f1 - f2; + } + } + + return 0; + +#if 0 + int32_t ucs4_max_len = bytes + 4; + char *f1_mbs = calloc(bytes, 1); + char *f2_mbs = calloc(bytes, 1); + if (taosUcs4ToMbs(f1_ucs4, ucs4_max_len, f1_mbs) < 0) { + return -1; + } + if (taosUcs4ToMbs(f2_ucs4, ucs4_max_len, f2_mbs) < 0) { + return -1; + } + int32_t ret = strcmp(f1_mbs, f2_mbs); + free(f1_mbs); + free(f2_mbs); + return ret; +#endif +} + -int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) { +TdUcs4* tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4) { + assert(malloc_usable_size(target_ucs4)>=len_ucs4*sizeof(TdUcs4)); + return memcpy(target_ucs4, source_ucs4, len_ucs4*sizeof(TdUcs4)); +} + +int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs) { +#ifdef DISALLOW_NCHAR_WITHOUT_ICONV + printf("Nchar cannot be read and written without iconv, please install iconv library and recompile TDengine.\n"); + return -1; +#else iconv_t cd = iconv_open(tsCharset, DEFAULT_UNICODE_ENCODEC); size_t ucs4_input_len = ucs4_max_len; size_t outLen = ucs4_max_len; @@ -39,14 +86,19 @@ int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) { iconv_close(cd); return (int32_t)(ucs4_max_len - outLen); +#endif } -bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, int32_t *len) { +bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4_max_len, int32_t *len) { +#ifdef DISALLOW_NCHAR_WITHOUT_ICONV + printf("Nchar cannot be read and written without iconv, please install iconv library and recompile TDengine.\n"); + return -1; +#else memset(ucs4, 0, ucs4_max_len); iconv_t cd = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset); size_t ucs4_input_len = mbsLength; size_t outLeft = ucs4_max_len; - if (iconv(cd, &mbs, &ucs4_input_len, &ucs4, &outLeft) == -1) { + if (iconv(cd, (char**)&mbs, &ucs4_input_len, (char**)&ucs4, &outLeft) == -1) { iconv_close(cd); return false; } @@ -60,9 +112,14 @@ bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len } return true; +#endif } bool taosValidateEncodec(const char *encodec) { +#ifdef DISALLOW_NCHAR_WITHOUT_ICONV + printf("Nchar cannot be read and written without iconv, please install iconv library and recompile TDengine.\n"); + return true; +#else iconv_t cd = iconv_open(encodec, DEFAULT_UNICODE_ENCODEC); if (cd == (iconv_t)(-1)) { return false; @@ -70,214 +127,11 @@ bool taosValidateEncodec(const char *encodec) { iconv_close(cd); return true; -} - -#else - -int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) { - mbstate_t state = {0}; - int32_t len = (int32_t)wcsnrtombs(NULL, (const wchar_t **)&ucs4, ucs4_max_len / 4, 0, &state); - if (len < 0) { - return -1; - } - - memset(&state, 0, sizeof(state)); - len = wcsnrtombs(mbs, (const wchar_t **)&ucs4, ucs4_max_len / 4, (size_t)len, &state); - if (len < 0) { - return -1; - } - - return len; -} - -bool taosMbsToUcs4(const char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, int32_t *len) { - memset(ucs4, 0, ucs4_max_len); - mbstate_t state = {0}; - int32_t retlen = mbsnrtowcs((wchar_t *)ucs4, (const char **)&mbs, mbsLength, ucs4_max_len / 4, &state); - *len = retlen; - - return retlen >= 0; -} - -bool taosValidateEncodec(const char *encodec) { - return true; -} - -#endif - -#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) - -/* - * windows implementation - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#if STDC_HEADERS -#include -#else -char *malloc(), *realloc(); #endif - -/* Always add at least this many bytes when extending the buffer. */ -#define MIN_CHUNK 64 - -/* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR -+ OFFSET (and null-terminate it). *LINEPTR is a pointer returned from -malloc (or NULL), pointing to *N characters of space. It is realloc'd -as necessary. Return the number of characters read (not including the -null terminator), or -1 on error or EOF. On a -1 return, the caller -should check feof(), if not then errno has been set to indicate -the error. */ - -int32_t getstr(char **lineptr, size_t *n, FILE *stream, char terminator, int32_t offset) { - int32_t nchars_avail; /* Allocated but unused chars in *LINEPTR. */ - char * read_pos; /* Where we're reading into *LINEPTR. */ - int32_t ret; - - if (!lineptr || !n || !stream) { - errno = EINVAL; - return -1; - } - - if (!*lineptr) { - *n = MIN_CHUNK; - *lineptr = malloc(*n); - if (!*lineptr) { - errno = ENOMEM; - return -1; - } - } - - nchars_avail = (int32_t)(*n - offset); - read_pos = *lineptr + offset; - - for (;;) { - int32_t save_errno; - register int32_t c = getc(stream); - - save_errno = errno; - - /* We always want at least one char left in the buffer, since we - always (unless we get an error while reading the first char) - NUL-terminate the line buffer. */ - - assert((*lineptr + *n) == (read_pos + nchars_avail)); - if (nchars_avail < 2) { - if (*n > MIN_CHUNK) - *n *= 2; - else - *n += MIN_CHUNK; - - nchars_avail = (int32_t)(*n + *lineptr - read_pos); - char* lineptr1 = realloc(*lineptr, *n); - if (!lineptr1) { - errno = ENOMEM; - return -1; - } - *lineptr = lineptr1; - - read_pos = *n - nchars_avail + *lineptr; - assert((*lineptr + *n) == (read_pos + nchars_avail)); - } - - if (ferror(stream)) { - /* Might like to return partial line, but there is no - place for us to store errno. And we don't want to just - lose errno. */ - errno = save_errno; - return -1; - } - - if (c == EOF) { - /* Return partial line, if any. */ - if (read_pos == *lineptr) - return -1; - else - break; - } - - *read_pos++ = c; - nchars_avail--; - - if (c == terminator) /* Return the line. */ - break; - } - - /* Done - NUL terminate and return the number of chars read. */ - *read_pos = '\0'; - - ret = (int32_t)(read_pos - (*lineptr + offset)); - return ret; -} - -int32_t tgetline(char **lineptr, size_t *n, FILE *stream) { return getstr(lineptr, n, stream, '\n', 0); } - - -/* - * Get next token from string *stringp, where tokens are possibly-empty - * strings separated by characters from delim. - * - * Writes NULs into the string at *stringp to end tokens. - * delim need not remain constant from call to call. - * On return, *stringp points past the last NUL written (if there might - * be further tokens), or is NULL (if there are definitely no moretokens). - * - * If *stringp is NULL, strsep returns NULL. - */ -char *strsep(char **stringp, const char *delim) { - char * s; - const char *spanp; - int32_t c, sc; - char *tok; - if ((s = *stringp) == NULL) - return (NULL); - for (tok = s;;) { - c = *s++; - spanp = delim; - do { - if ((sc = *spanp++) == c) { - if (c == 0) - s = NULL; - else - s[-1] = 0; - *stringp = s; - return (tok); - } - } while (sc != 0); - } - /* NOTREACHED */ -} - -char *getpass(const char *prefix) { - static char passwd[TSDB_PASSWORD_LEN] = {0}; - memset(passwd, 0, TSDB_PASSWORD_LEN); - //printf("%s", prefix); - - int32_t index = 0; - char ch; - while (index < TSDB_PASSWORD_LEN) { - ch = getch(); - if (ch == '\n' || ch == '\r') { - break; - } else { - passwd[index++] = ch; - } - } - - return passwd; } -int32_t twcslen(const wchar_t *wcs) { - int32_t *wstr = (int32_t *)wcs; +int32_t taosUcs4len(TdUcs4 *ucs4) { + TdUcs4 *wstr = (TdUcs4 *)ucs4; if (NULL == wstr) { return 0; } @@ -292,73 +146,15 @@ int32_t twcslen(const wchar_t *wcs) { return n; } -int32_t tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int32_t bytes) { - for (int32_t i = 0; i < bytes; i += TSDB_NCHAR_SIZE) { - int32_t f1 = *(int32_t *)((char *)f1_ucs4 + i); - int32_t f2 = *(int32_t *)((char *)f2_ucs4 + i); - - if ((f1 == 0 && f2 != 0) || (f1 != 0 && f2 == 0)) { - return f1 - f2; - } else if (f1 == 0 && f2 == 0) { - return 0; - } - - if (f1 != f2) { - return f1 - f2; - } - } - - return 0; - -#if 0 - int32_t ucs4_max_len = bytes + 4; - char *f1_mbs = calloc(bytes, 1); - char *f2_mbs = calloc(bytes, 1); - if (taosUcs4ToMbs(f1_ucs4, ucs4_max_len, f1_mbs) < 0) { - return -1; - } - if (taosUcs4ToMbs(f2_ucs4, ucs4_max_len, f2_mbs) < 0) { - return -1; - } - int32_t ret = strcmp(f1_mbs, f2_mbs); - free(f1_mbs); - free(f2_mbs); - return ret; -#endif -} -/* Copy memory to memory until the specified number of bytes -has been copied, return pointer to following byte. -Overlap is NOT handled correctly. */ -void *mempcpy(void *dest, const void *src, size_t len) { - return (char*)memcpy(dest, src, len) + len; -} +int32_t taosWcharWidth(TdWchar wchar) { return wcwidth(wchar); } -/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ -char *stpcpy (char *dest, const char *src) { - size_t len = strlen (src); - return (char*)memcpy(dest, src, len + 1) + len; -} - -/* Copy no more than N characters of SRC to DEST, returning the address of - the terminating '\0' in DEST, if any, or else DEST + N. */ -char *stpncpy (char *dest, const char *src, size_t n) { - size_t size = strnlen (src, n); - memcpy (dest, src, size); - dest += size; - if (size == n) - return dest; - return memset (dest, '\0', n - size); -} +int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size) { return wcswidth(pWchar, size); } -#else +int32_t taosMbToWchar(TdWchar *pWchar, const char *pStr, int32_t size) { return mbtowc(pWchar, pStr, size); } -/* - * linux and darwin implementation - */ +int32_t taosMbsToWchars(TdWchar *pWchars, const char *pStrs, int32_t size) { return mbstowcs(pWchars, pStrs, size); } -int32_t tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int32_t bytes, int8_t ncharSize) { - return wcsncmp((wchar_t *)f1_ucs4, (wchar_t *)f2_ucs4, bytes / ncharSize); -} +int32_t taosWcharToMb(char *pStr, TdWchar wchar) { return wctomb(pStr, wchar); } -#endif +int32_t taosWcharsToMbs(char *pStrs, TdWchar *pWchars, int32_t size) { return wcstombs(pStrs, pWchars, size); } diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 5e3cf1247c6941064a336cb14c5f51c2c6e4013e..ff7d2cf733c6af1043957d83d0dc24a8073db571 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -208,7 +208,7 @@ int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) { if (len1 != len2) { return len1 > len2 ? 1 : -1; } else { - int32_t ret = memcmp((wchar_t *)pLeft, (wchar_t *)pRight, len1); + int32_t ret = memcmp((TdUcs4 *)pLeft, (TdUcs4 *)pRight, len1); if (ret == 0) { return 0; } else { @@ -295,10 +295,10 @@ int32_t patternMatch(const char *patterStr, const char *str, size_t size, const return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH; } -int32_t WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo) { - wchar_t c, c1; - wchar_t matchOne = L'_'; // "_" - wchar_t matchAll = L'%'; // "%" +int32_t WCSPatternMatch(const TdUcs4 *patterStr, const TdUcs4 *str, size_t size, const SPatternCompareInfo *pInfo) { + TdUcs4 c, c1; + TdUcs4 matchOne = L'_'; // "_" + TdUcs4 matchAll = L'%'; // "%" int32_t i = 0; int32_t j = 0; @@ -315,7 +315,7 @@ int32_t WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t siz return TSDB_PATTERN_MATCH; } - wchar_t accept[3] = {towupper(c), towlower(c), 0}; + TdUcs4 accept[3] = {towupper(c), towlower(c), 0}; while (1) { size_t n = wcscspn(str, accept); @@ -424,10 +424,10 @@ int32_t compareWStrPatternMatch(const void *pLeft, const void *pRight) { assert(varDataLen(pRight) <= TSDB_MAX_FIELD_LEN * TSDB_NCHAR_SIZE); - wchar_t *pattern = calloc(varDataLen(pRight) + 1, sizeof(wchar_t)); + char *pattern = calloc(varDataLen(pRight) + TSDB_NCHAR_SIZE, 1); memcpy(pattern, varDataVal(pRight), varDataLen(pRight)); - int32_t ret = WCSPatternMatch(pattern, (const wchar_t *)varDataVal(pLeft), varDataLen(pLeft) / TSDB_NCHAR_SIZE, &pInfo); + int32_t ret = WCSPatternMatch((TdUcs4*)pattern, (TdUcs4*)varDataVal(pLeft), varDataLen(pLeft) / TSDB_NCHAR_SIZE, &pInfo); free(pattern); return (ret == TSDB_PATTERN_MATCH) ? 0 : 1; @@ -647,7 +647,7 @@ int32_t doCompare(const char *f1, const char *f2, int32_t type, size_t size) { if (t1->len != t2->len) { return t1->len > t2->len ? 1 : -1; } - int32_t ret = memcmp((wchar_t *)t1, (wchar_t *)t2, t2->len); + int32_t ret = memcmp((TdUcs4 *)t1, (TdUcs4 *)t2, t2->len); if (ret == 0) { return ret; } diff --git a/source/util/src/tjson.c b/source/util/src/tjson.c index 0a4a1a07a6be9a709787bf3437fad76f3cc407fa..a85da8cbbf56f6a69f582ecc1e34469786f7cc6d 100644 --- a/source/util/src/tjson.c +++ b/source/util/src/tjson.c @@ -202,9 +202,16 @@ int32_t tjsonGetUBigIntValue(const SJson* pJson, const char* pName, uint64_t* pV return (errno == ERANGE||errno == EINVAL) ? TSDB_CODE_FAILED:TSDB_CODE_SUCCESS; } +int32_t tjsonGetUIntValue(const SJson* pJson, const char* pName, uint32_t* pVal) { + uint64_t val = 0; + int32_t code = tjsonGetUBigIntValue(pJson, pName, &val); + *pVal = val; + return code; +} + int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pVal) { uint64_t val = 0; - int32_t code = tjsonGetUBigIntValue(pJson, pName, &val); + int32_t code = tjsonGetUBigIntValue(pJson, pName, &val); *pVal = val; return code; } @@ -239,6 +246,22 @@ int32_t tjsonToObject(const SJson* pJson, const char* pName, FToObject func, voi return func(pJsonObj, pObj); } +int32_t tjsonMakeObject(const SJson* pJson, const char* pName, FToObject func, void** pObj, int32_t objSize) { + if (objSize <= 0) { + return TSDB_CODE_SUCCESS; + } + + SJson* pJsonObj = tjsonGetObjectItem(pJson, pName); + if (NULL == pJsonObj) { + return TSDB_CODE_FAILED; + } + *pObj = calloc(1, objSize); + if (NULL == *pObj) { + return TSDB_CODE_OUT_OF_MEMORY; + } + return func(pJsonObj, *pObj); +} + int32_t tjsonToArray(const SJson* pJson, const char* pName, FToObject func, void* pArray, int32_t itemSize) { const cJSON* jArray = tjsonGetObjectItem(pJson, pName); int32_t size = (NULL == jArray ? 0 : tjsonGetArraySize(jArray)); diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt index cafca76761bcf4924b0f997ef5f7de570c147c65..0c2b4fe1f4dad86661e70b06282b3cd8e9db86a9 100644 --- a/tests/script/jenkins/basic.txt +++ b/tests/script/jenkins/basic.txt @@ -18,4 +18,7 @@ # ---- insert ./test.sh -f tsim/insert/basic0.sim + +# ---- query +./test.sh -f tsim/query/interval.sim #======================b1-end=============== diff --git a/tests/script/tsim/insert/basic1.sim b/tests/script/tsim/insert/basic1.sim new file mode 100644 index 0000000000000000000000000000000000000000..3fc635532ac409000988808249d0310b7096c5e7 --- /dev/null +++ b/tests/script/tsim/insert/basic1.sim @@ -0,0 +1,94 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/exec.sh -n dnode1 -s start +sleep 50 +sql connect + +print =============== create database +sql create database d1 +sql show databases +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 + +sql use d1 + +print =============== create super table, include all type +sql create table if not exists stb (ts timestamp, c1 bool, c2 tinyint, c3 smallint, c4 int, c5 bigint, c6 float, c7 double, c8 binary(16), c9 nchar(16), c10 timestamp, c11 tinyint unsigned, c12 smallint unsigned, c13 int unsigned, c14 bigint unsigned) tags (t1 bool, t2 tinyint, t3 smallint, t4 int, t5 bigint, t6 float, t7 double, t8 binary(16), t9 nchar(16), t10 timestamp, t11 tinyint unsigned, t12 smallint unsigned, t13 int unsigned, t14 bigint unsigned) + +sql create stable if not exists stb_1 (ts timestamp, i int) tags (j int) +sql create table stb_2 (ts timestamp, i int) tags (j int) +sql create stable stb_3 (ts timestamp, i int) tags (j int) + +sql show stables +if $rows != 4 then + return -1 +endi + +print =============== create child table +sql create table c1 using stb tags(true, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 1', 'child tbl 1', '2022-02-25 18:00:00.000', 10, 20, 30, 40) +sql create table c2 using stb tags(false, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 2', 'child tbl 2', '2022-02-25 18:00:00.000', 10, 20, 30, 40) + +sql show tables +if $rows != 2 then + return -1 +endi + + +print =============== insert data, mode1: one row one table in sql +print =============== insert data, mode1: mulit rows one table in sql +print =============== insert data, mode1: one rows mulit table in sql +print =============== insert data, mode1: mulit rows mulit table in sql +sql insert into c1 values(now+0s, true, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 1', 'child tbl 1', '2022-02-25 18:00:00.000', 10, 20, 30, 40) +sql insert into c1 values(now+0s, true, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 1', 'child tbl 1', '2022-02-25 18:00:00.000', 10, 20, 30, 40) (now+1s, true, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 1', 'child tbl 1', '2022-02-25 18:00:00.000', 10, 20, 30, 40) (now+2s, true, -1, -2, -3, -4, -6.0, -7.0, 'child tbl 1', 'child tbl 1', '2022-02-25 18:00:00.000', 10, 20, 30, 40) + +print =============== query data +sql select * from c1 +if $rows != 4 then + return -1 +endi + +if $data01 != true then + return -1 +endi + +if $data02 != -1 then + return -1 +endi + +if $data03 != -2 then + return -1 +endi + +print =============== query data from st +sql select * from st +if $rows != 4 then + return -1 +endi + +print =============== stop and restart taosd +system sh/exec.sh -n dnode1 -s stop -x SIGINT +system sh/exec.sh -n dnode1 -s start + +sleep 2000 +print =============== query data +sql select * from c1 +if $rows != 4 then + return -1 +endi + +if $data01 != true then + return -1 +endi + +if $data02 != -1 then + return -1 +endi + +if $data03 != -2 then + return -1 +endi + +system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/query/interval-offset.sim b/tests/script/tsim/query/interval-offset.sim new file mode 100644 index 0000000000000000000000000000000000000000..8034a27b9f074dfa5389ebe80c51da0a480a8b15 --- /dev/null +++ b/tests/script/tsim/query/interval-offset.sim @@ -0,0 +1,292 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/exec.sh -n dnode1 -s start +sleep 50 +sql connect + +print =============== create database +sql create database d0 +sql show databases +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 + +sql use d0 + + +sql create table vehicle (ts timestamp, s int) tags (t1 int) +sql show stables +if $rows != 1 then + return -1 +endi + +sql create table car using vehicle tags(1000) +#sql create table ct1 using vehicle tags (1000) +sql show tables; +if $rows != 1 then + print rows: $rows + return -1 +endi + +sql insert into ct1 values('2019-01-01 00:00:00', 1) +sql insert into car values('2019-05-13 12:00:00', 1) +sql insert into car values('2019-12-31 23:59:59', 1) +sql insert into car values('2020-01-01 12:00:00', 1) +sql insert into car values('2020-01-02 12:00:00', 1) +sql insert into car values('2020-01-03 12:00:00', 1) +sql insert into car values('2020-01-04 12:00:00', 1) +sql insert into car values('2020-01-05 12:00:00', 1) +sql insert into car values('2020-01-31 12:00:00', 1) +sql insert into car values('2020-02-01 12:00:00', 1) +sql insert into car values('2020-02-02 12:00:00', 1) +sql insert into car values('2020-02-29 12:00:00', 1) +sql insert into car values('2020-03-01 12:00:00', 1) +sql insert into car values('2020-03-02 12:00:00', 1) +sql insert into car values('2020-03-15 12:00:00', 1) +sql insert into car values('2020-03-31 12:00:00', 1) +sql insert into car values('2020-05-01 12:00:00', 1) + +sql select count(*) from car interval(1n, 10d) +# tdSql.checkData(0, 1, 1) +# tdSql.checkData(1, 1, 1) +# tdSql.checkData(2, 1, 6) +# tdSql.checkData(3, 1, 3) +# tdSql.checkData(4, 1, 3) +# tdSql.checkData(5, 1, 2) +# tdSql.checkData(6, 1, 1) +if $rows != 17 then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data10 != 1 then + return -1 +endi +if $data20 != 6 then + return -1 +endi +if $data30 != 3 then + return -1 +endi +if $data40 != 3 then + return -1 +endi +if $data50 != 2 then + return -1 +endi +if $data60 != 1 then + return -1 +endi + +return + +sql select count(*) from car interval(1n, 10d) order by ts desc +# tdSql.checkData(0, 1, 1) +# tdSql.checkData(1, 1, 2) +# tdSql.checkData(2, 1, 3) +# tdSql.checkData(3, 1, 3) +# tdSql.checkData(4, 1, 6) +# tdSql.checkData(5, 1, 1) +# tdSql.checkData(6, 1, 1) +# +sql select count(*) from car interval(2n, 5d) +# tdSql.checkData(0, 1, 1) +# tdSql.checkData(1, 1, 1) +# tdSql.checkData(2, 1, 6) +# tdSql.checkData(3, 1, 6) +# tdSql.checkData(4, 1, 3) + +sql select count(*) from car interval(2n) order by ts desc +# tdSql.checkData(0, 1, 3) +# tdSql.checkData(1, 1, 6) +# tdSql.checkData(2, 1, 6) +# tdSql.checkData(3, 1, 1) +# tdSql.checkData(4, 1, 1) +# +sql select count(*) from car interval(1y, 1n) +# tdSql.checkData(0, 1, 1) +# tdSql.checkData(1, 1, 8) +# tdSql.checkData(2, 1, 8) +# +sql select count(*) from car interval(1y, 2n) +# tdSql.checkData(0, 1, 1) +# tdSql.checkData(1, 1, 11) +# tdSql.checkData(2, 1, 5) + +sql select count(*) from car where ts > '2019-05-14 00:00:00' interval(1y, 5d) +# tdSql.checkData(0, 1, 6) +# tdSql.checkData(1, 1, 9) + + + + + + + + + + + + +sql create table $mt (ts timestamp, tbcol int) TAGS(tgcol int) + +print ====== start create child tables and insert data +$i = 0 +while $i < $tbNum + $tb = $tbPrefix . $i + sql create table $tb using $mt tags( $i ) + + $x = 0 + while $x < $rowNum + $cc = $x * 60000 + $ms = 1601481600000 + $cc + + sql insert into $tb values ($ms , $x ) + $x = $x + 1 + endw + + $i = $i + 1 +endw + +print =============== step2 +$i = 1 +$tb = $tbPrefix . $i + +sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb interval(1m) +print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb interval(1m) +print ===> $rows $data01 $data05 +if $rows != $rowNum then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data04 != 1 then + return -1 +endi + +#print =============== step3 +#$cc = 4 * 60000 +#$ms = 1601481600000 + $cc +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms interval(1m) +#print ===> $rows $data01 $data05 +#if $rows != 5 then +# return -1 +#endi +#if $data00 != 1 then +# return -1 +#endi +#if $data04 != 1 then +# return -1 +#endi + +#print =============== step4 +#$cc = 40 * 60000 +#$ms = 1601481600000 + $cc + +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc + +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) +#print ===> $rows $data01 $data05 +#if $rows != 20 then +# return -1 +#endi +#if $data00 != 1 then +# return -1 +#endi +#if $data04 != 1 then +# return -1 +#endi + +#print =============== step5 +#$cc = 40 * 60000 +#$ms = 1601481600000 + $cc + +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc + +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) fill(value,0) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) fill(value,0) +#print ===> $rows $data21 $data25 +#if $rows != 42 then +# return -1 +#endi +#if $data20 != 1 then +# return -1 +#endi +#if $data24 != 1 then +# return -1 +#endi + +#print =============== step6 +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt interval(1m) +#print ===> $rows $data11 +#if $rows != 20 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi + +#print =============== step7 +#$cc = 4 * 60000 +#$ms = 1601481600000 + $cc +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms interval(1m) +#print ===> $rows $data11 +#if $rows != 5 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi + +#print =============== step8 +#$cc = 40 * 60000 +#$ms1 = 1601481600000 + $cc +# +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc +# +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) +#print ===> $rows $data11 +#if $rows != 20 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi +# +#print =============== step9 +#$cc = 40 * 60000 +#$ms1 = 1601481600000 + $cc +# +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc +# +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) fill(value, 0) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) fill(value, 0) +#print ===> $rows $data11 +#if $rows != 42 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi + +print =============== clear +#sql drop database $db +#sql show databases +#if $rows != 0 then +# return -1 +#endi + +#system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file diff --git a/tests/script/tsim/query/interval.sim b/tests/script/tsim/query/interval.sim index 35e7c938d87834f0795b57124d81f245519aef26..47be71bdc6f54a81c94066c1cd62eb393f030b5c 100644 --- a/tests/script/tsim/query/interval.sim +++ b/tests/script/tsim/query/interval.sim @@ -47,161 +47,137 @@ $i = 1 $tb = $tbPrefix . $i sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb interval(1m) -print ===> $rows -if $rows < $rowNum then - return -1 -endi -if $data01 != 1 then - return -1 -endi -if $data05 != 1 then - return -1 -endi - -print =============== step3 -$cc = 4 * 60000 -$ms = 1601481600000 + $cc -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms interval(1m) -print ===> $rows -if $rows > 10 then - return -1 -endi -if $rows < 3 then - return -1 -endi -if $data01 != 1 then - return -1 -endi -if $data05 != 1 then - return -1 -endi - -print =============== step4 -$cc = 40 * 60000 -$ms = 1601481600000 + $cc - -$cc = 1 * 60000 -$ms2 = 1601481600000 - $cc - -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) -print ===> $rows -if $rows < 18 then - return -1 -endi -if $rows > 22 then - return -1 -endi -if $data01 != 1 then - return -1 -endi -if $data05 != 1 then - return -1 -endi - -print =============== step5 -$cc = 40 * 60000 -$ms = 1601481600000 + $cc - -$cc = 1 * 60000 -$ms2 = 1601481600000 - $cc - -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) fill(value,0) -print ===> $rows -if $rows < 30 then - return -1 -endi -if $rows > 50 then - return -1 -endi -if $data21 != 1 then - return -1 -endi -if $data25 != 1 then - return -1 -endi - -print =============== step6 -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt interval(1m) -print ===> $rows -if $rows < 18 then - return -1 -endi -if $rows > 22 then - return -1 -endi -if $data11 > 15 then - return -1 -endi -if $data11 < 5 then - return -1 -endi - -print =============== step7 -$cc = 4 * 60000 -$ms = 1601481600000 + $cc -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms interval(1m) -print ===> $rows -if $rows < 3 then - return -1 -endi -if $rows > 7 then - return -1 -endi -if $data11 > 15 then - return -1 -endi -if $data11 < 5 then - return -1 -endi - -print =============== step8 -$cc = 40 * 60000 -$ms1 = 1601481600000 + $cc - -$cc = 1 * 60000 -$ms2 = 1601481600000 - $cc - -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) -print ===> $rows -if $rows < 18 then - return -1 -endi -if $rows > 22 then - return -1 -endi -if $data11 > 15 then - return -1 -endi -if $data11 < 5 then - return -1 -endi - -print =============== step9 -$cc = 40 * 60000 -$ms1 = 1601481600000 + $cc - -$cc = 1 * 60000 -$ms2 = 1601481600000 - $cc - -sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) fill(value, 0) -if $rows < 30 then - return -1 -endi -if $rows > 50 then - return -1 -endi -if $data11 > 15 then - return -1 -endi -if $data11 < 5 then - return -1 -endi +print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb interval(1m) +print ===> $rows $data01 $data05 +if $rows != $rowNum then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data04 != 1 then + return -1 +endi + +#print =============== step3 +#$cc = 4 * 60000 +#$ms = 1601481600000 + $cc +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms interval(1m) +#print ===> $rows $data01 $data05 +#if $rows != 5 then +# return -1 +#endi +#if $data00 != 1 then +# return -1 +#endi +#if $data04 != 1 then +# return -1 +#endi + +#print =============== step4 +#$cc = 40 * 60000 +#$ms = 1601481600000 + $cc + +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc + +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) +#print ===> $rows $data01 $data05 +#if $rows != 20 then +# return -1 +#endi +#if $data00 != 1 then +# return -1 +#endi +#if $data04 != 1 then +# return -1 +#endi + +#print =============== step5 +#$cc = 40 * 60000 +#$ms = 1601481600000 + $cc + +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc + +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) fill(value,0) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $tb where ts <= $ms and ts > $ms2 interval(1m) fill(value,0) +#print ===> $rows $data21 $data25 +#if $rows != 42 then +# return -1 +#endi +#if $data20 != 1 then +# return -1 +#endi +#if $data24 != 1 then +# return -1 +#endi + +#print =============== step6 +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt interval(1m) +#print ===> $rows $data11 +#if $rows != 20 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi + +#print =============== step7 +#$cc = 4 * 60000 +#$ms = 1601481600000 + $cc +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms interval(1m) +#print ===> $rows $data11 +#if $rows != 5 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi + +#print =============== step8 +#$cc = 40 * 60000 +#$ms1 = 1601481600000 + $cc +# +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc +# +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) +#print ===> $rows $data11 +#if $rows != 20 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi +# +#print =============== step9 +#$cc = 40 * 60000 +#$ms1 = 1601481600000 + $cc +# +#$cc = 1 * 60000 +#$ms2 = 1601481600000 - $cc +# +#sql select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) fill(value, 0) +#print ===> select count(tbcol), sum(tbcol), max(tbcol), min(tbcol), count(tbcol) from $mt where ts <= $ms1 and ts > $ms2 interval(1m) fill(value, 0) +#print ===> $rows $data11 +#if $rows != 42 then +# return -1 +#endi +#if $data11 != 10 then +# return -1 +#endi print =============== clear -sql drop database $db -sql show databases -if $rows != 0 then - return -1 -endi +#sql drop database $db +#sql show databases +#if $rows != 0 then +# return -1 +#endi -system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file +#system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tools/shell/src/backup/shellDarwin.c b/tools/shell/src/backup/shellDarwin.c index e4cf09358bc1b0b6e4777577373288c577477efc..d7a976d52cc6179726cf80645b28f5bb30bc6fac 100644 --- a/tools/shell/src/backup/shellDarwin.c +++ b/tools/shell/src/backup/shellDarwin.c @@ -28,7 +28,6 @@ int indicator = 1; struct termios oldtio; -extern int wcwidth(wchar_t c); void insertChar(Command *cmd, char *c, int size); @@ -426,7 +425,7 @@ void showOnScreen(Command *cmd) { w.ws_row = 30; } - wchar_t wc; + TdWchar wc; int size = 0; // Print out the command. @@ -441,11 +440,11 @@ void showOnScreen(Command *cmd) { int remain_column = w.ws_col; /* size = cmd->commandSize + prompt_size; */ for (char *str = total_string; size < cmd->commandSize + prompt_size;) { - int ret = mbtowc(&wc, str, MB_CUR_MAX); + int ret = taosMbToWchar(&wc, str, MB_CUR_MAX); if (ret < 0) break; size += ret; /* assert(size >= 0); */ - int width = wcwidth(wc); + int width = taosWcharWidth(wc); if (remain_column > width) { printf("%lc", wc); remain_column -= width; diff --git a/tools/shell/src/shellCommand.c b/tools/shell/src/shellCommand.c index cf0ceded38307e5bd138a77c19203e882f0662e4..fd993998b823411c666194d9f2bb9c6390baa2c4 100644 --- a/tools/shell/src/shellCommand.c +++ b/tools/shell/src/shellCommand.c @@ -21,8 +21,6 @@ #include -extern int wcwidth(wchar_t c); -extern int wcswidth(const wchar_t *s, size_t n); typedef struct { char widthInString; char widthOnScreen; @@ -43,7 +41,7 @@ int countPrefixOnes(unsigned char c) { void getPrevCharSize(const char *str, int pos, int *size, int *width) { assert(pos > 0); - wchar_t wc; + TdWchar wc; *size = 0; *width = 0; @@ -53,25 +51,25 @@ void getPrevCharSize(const char *str, int pos, int *size, int *width) { if (str[pos] > 0 || countPrefixOnes((unsigned char )str[pos]) > 1) break; } - int rc = mbtowc(&wc, str + pos, MB_CUR_MAX); + int rc = taosMbToWchar(&wc, str + pos, MB_CUR_MAX); assert(rc == *size); - *width = wcwidth(wc); + *width = taosWcharWidth(wc); } void getNextCharSize(const char *str, int pos, int *size, int *width) { assert(pos >= 0); - wchar_t wc; - *size = mbtowc(&wc, str + pos, MB_CUR_MAX); - *width = wcwidth(wc); + TdWchar wc; + *size = taosMbToWchar(&wc, str + pos, MB_CUR_MAX); + *width = taosWcharWidth(wc); } void insertChar(Command *cmd, char *c, int size) { assert(cmd->cursorOffset <= cmd->commandSize && cmd->endOffset >= cmd->screenOffset); - wchar_t wc; - if (mbtowc(&wc, c, size) < 0) return; + TdWchar wc; + if (taosMbToWchar(&wc, c, size) < 0) return; clearScreen(cmd->endOffset + prompt_size, cmd->screenOffset + prompt_size); /* update the buffer */ @@ -81,8 +79,8 @@ void insertChar(Command *cmd, char *c, int size) { /* update the values */ cmd->commandSize += size; cmd->cursorOffset += size; - cmd->screenOffset += wcwidth(wc); - cmd->endOffset += wcwidth(wc); + cmd->screenOffset += taosWcharWidth(wc); + cmd->endOffset += taosWcharWidth(wc); showOnScreen(cmd); } @@ -249,10 +247,10 @@ int isReadyGo(Command *cmd) { } void getMbSizeInfo(const char *str, int *size, int *width) { - wchar_t *wc = (wchar_t *)calloc(sizeof(wchar_t), MAX_COMMAND_SIZE); + TdWchar *wc = (TdWchar *)calloc(sizeof(TdWchar), MAX_COMMAND_SIZE); *size = strlen(str); - mbstowcs(wc, str, MAX_COMMAND_SIZE); - *width = wcswidth(wc, MAX_COMMAND_SIZE); + taosMbsToWchars(wc, str, MAX_COMMAND_SIZE); + *width = taosWcharsWidth(wc, MAX_COMMAND_SIZE); free(wc); } diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index 5a989937d8cfd41050bca0a077947a6feda9514b..1b35afb57d231c07181499fa43c66cbad137e72c 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -560,12 +560,12 @@ static int dumpResultToFile(const char *fname, TAOS_RES *tres) { } static void shellPrintNChar(const char *str, int length, int width) { - wchar_t tail[3]; + TdWchar tail[3]; int pos = 0, cols = 0, totalCols = 0, tailLen = 0; while (pos < length) { - wchar_t wc; - int bytes = mbtowc(&wc, str + pos, MB_CUR_MAX); + TdWchar wc; + int bytes = taosMbToWchar(&wc, str + pos, MB_CUR_MAX); if (bytes == 0) { break; } @@ -577,7 +577,7 @@ static void shellPrintNChar(const char *str, int length, int width) { #ifdef WINDOWS int w = bytes; #else - int w = wcwidth(wc); + int w = taosWcharWidth(wc); #endif if (w <= 0) { continue; diff --git a/tools/shell/src/shellLinux.c b/tools/shell/src/shellLinux.c index cc497688d1bfcea14aba2e6869984962b305b075..6da05f28dfbf1c74ea6fa4aeb111053c89e80160 100644 --- a/tools/shell/src/shellLinux.c +++ b/tools/shell/src/shellLinux.c @@ -31,7 +31,6 @@ int indicator = 1; struct termios oldtio; -extern int wcwidth(wchar_t c); void insertChar(Command *cmd, char *c, int size); const char *argp_program_version = version; const char *argp_program_bug_address = ""; @@ -456,7 +455,7 @@ void showOnScreen(Command *cmd) { w.ws_row = 30; } - wchar_t wc; + TdWchar wc; int size = 0; // Print out the command. @@ -471,11 +470,11 @@ void showOnScreen(Command *cmd) { int remain_column = w.ws_col; /* size = cmd->commandSize + prompt_size; */ for (char *str = total_string; size < cmd->commandSize + prompt_size;) { - int ret = mbtowc(&wc, str, MB_CUR_MAX); + int ret = taosMbToWchar(&wc, str, MB_CUR_MAX); if (ret < 0) break; size += ret; /* assert(size >= 0); */ - int width = wcwidth(wc); + int width = taosWcharWidth(wc); if (remain_column > width) { printf("%lc", wc); remain_column -= width;