From f5c13c13c6d1a6ddfd3a3ff18ae979cba342bd9a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 1 Mar 2022 22:36:19 +0800 Subject: [PATCH 01/26] support json --- include/libs/index/index.h | 114 +++++++++++++++++++++++++--- source/libs/index/inc/indexInt.h | 57 +++++++++----- source/libs/index/src/index.c | 49 +++++++++--- source/libs/index/src/index_cache.c | 4 +- source/libs/index/src/index_json.c | 44 +++++++++++ source/libs/index/src/index_tfile.c | 13 ++-- source/libs/index/test/fstUT.cc | 10 +-- source/libs/index/test/jsonDemo.cc | 0 8 files changed, 241 insertions(+), 50 deletions(-) create mode 100644 source/libs/index/src/index_json.c create mode 100644 source/libs/index/test/jsonDemo.cc diff --git a/include/libs/index/index.h b/include/libs/index/index.h index 47eb97cc3a..9424eae1b7 100644 --- a/include/libs/index/index.h +++ b/include/libs/index/index.h @@ -29,6 +29,12 @@ typedef struct SIndexOpts SIndexOpts; typedef struct SIndexMultiTermQuery SIndexMultiTermQuery; typedef struct SArray SIndexMultiTerm; +typedef struct SIndex SIndexJson; +typedef struct SIndexTerm SIndexJsonTerm; +typedef struct SIndexOpts SIndexJsonOpts; +typedef struct SIndexMultiTermQuery SIndexJsonMultiTermQuery; +typedef struct SArray SIndexJsonMultiTerm; + typedef enum { ADD_VALUE, // add index colume value DEL_VALUE, // delete index column value @@ -39,24 +45,108 @@ typedef enum { } SIndexOperOnColumn; typedef enum { MUST = 0, SHOULD = 1, NOT = 2 } EIndexOperatorType; -typedef enum { QUERY_TERM = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2, QUERY_REGEX = 3 } EIndexQueryType; +typedef enum { QUERY_TERM = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2, QUERY_REGEX = 3, QUERY_RANGE = 4 } EIndexQueryType; + /* - * @param: oper - * + * create multi query + * @param oper (input, relation between querys) */ SIndexMultiTermQuery* indexMultiTermQueryCreate(EIndexOperatorType oper); -void indexMultiTermQueryDestroy(SIndexMultiTermQuery* pQuery); -int indexMultiTermQueryAdd(SIndexMultiTermQuery* pQuery, SIndexTerm* term, EIndexQueryType type); + /* - * @param: - * @param: + * destroy multi query + * @param pQuery (input, multi-query-object to be destory) + */ + +void indexMultiTermQueryDestroy(SIndexMultiTermQuery* pQuery); +/* + * add query to multi query + * @param pQuery (input, multi-query-object) + * @param term (input, single query term) + * @param type (input, single query type) + * @return error code + */ +int indexMultiTermQueryAdd(SIndexMultiTermQuery* pQuery, SIndexTerm* term, EIndexQueryType type); +/* + * open index + * @param opt (input, index opt) + * @param path (input, index path) + * @param index (output, index object) + * @return error code + */ +int indexOpen(SIndexOpts* opt, const char* path, SIndex** index); +/* + * close index + * @param index (input, index to be closed) + * @return error code */ -int indexOpen(SIndexOpts* opt, const char* path, SIndex** index); void indexClose(SIndex* index); -int indexPut(SIndex* index, SIndexMultiTerm* terms, uint64_t uid); -int indexDelete(SIndex* index, SIndexMultiTermQuery* query); -int indexSearch(SIndex* index, SIndexMultiTermQuery* query, SArray* result); -int indexRebuild(SIndex* index, SIndexOpts* opt); + +/* + * insert terms into index + * @param index (input, index object) + * @param term (input, terms inserted into index) + * @param uid (input, uid of terms) + * @return error code + */ +int indexPut(SIndex* index, SIndexMultiTerm* terms, uint64_t uid); +/* + * delete terms that meet query condition + * @param index (input, index object) + * @param query (input, condition query to deleted) + * @return error code + */ + +int indexDelete(SIndex* index, SIndexMultiTermQuery* query); +/* + * search index + * @param index (input, index object) + * @param query (input, multi query condition) + * @param result(output, query result) + * @return error code + */ +int indexSearch(SIndex* index, SIndexMultiTermQuery* query, SArray* result); +/* + * rebuild index + * @param index (input, index object) + * @parma opt (input, rebuild index opts) + * @return error code + */ +int indexRebuild(SIndex* index, SIndexOpts* opt); + +/* + * open index + * @param opt (input,index json opt) + * @param path (input, index json path) + * @param index (output, index json object) + * @return error code + */ +int tIndexJsonOpen(SIndexJsonOpts* opts, const char* path, SIndexJson** index); +/* + * close index + * @param index (input, index to be closed) + * @return error code + */ + +int tIndexJsonClose(SIndexJson* index); + +/* + * insert terms into index + * @param index (input, index object) + * @param term (input, terms inserted into index) + * @param uid (input, uid of terms) + * @return error code + */ +int tIndexJsonPut(SIndexJson* index, SIndexJsonMultiTerm* terms, uint64_t uid); +/* + * search index + * @param index (input, index object) + * @param query (input, multi query condition) + * @param result(output, query result) + * @return error code + */ + +int tIndexJsonSearch(SIndexJson* index, SIndexJsonMultiTermQuery* query, SArray* result); /* * @param * @param diff --git a/source/libs/index/inc/indexInt.h b/source/libs/index/inc/indexInt.h index 90ad1e15f4..57d587d297 100644 --- a/source/libs/index/inc/indexInt.h +++ b/source/libs/index/inc/indexInt.h @@ -120,29 +120,50 @@ int indexFlushCacheToTFile(SIndex* sIdx, void*); int32_t indexSerialCacheKey(ICacheKey* key, char* buf); -#define indexFatal(...) \ - do { \ - if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("index FATAL ", 255, __VA_ARGS__); } \ +#define indexFatal(...) \ + do { \ + if (sDebugFlag & DEBUG_FATAL) { \ + taosPrintLog("index FATAL ", 255, __VA_ARGS__); \ + } \ } while (0) -#define indexError(...) \ - do { \ - if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("index ERROR ", 255, __VA_ARGS__); } \ +#define indexError(...) \ + do { \ + if (sDebugFlag & DEBUG_ERROR) { \ + taosPrintLog("index ERROR ", 255, __VA_ARGS__); \ + } \ } while (0) -#define indexWarn(...) \ - do { \ - if (sDebugFlag & DEBUG_WARN) { taosPrintLog("index WARN ", 255, __VA_ARGS__); } \ +#define indexWarn(...) \ + do { \ + if (sDebugFlag & DEBUG_WARN) { \ + taosPrintLog("index WARN ", 255, __VA_ARGS__); \ + } \ } while (0) -#define indexInfo(...) \ - do { \ - if (sDebugFlag & DEBUG_INFO) { taosPrintLog("index ", 255, __VA_ARGS__); } \ +#define indexInfo(...) \ + do { \ + if (sDebugFlag & DEBUG_INFO) { \ + taosPrintLog("index ", 255, __VA_ARGS__); \ + } \ } while (0) -#define indexDebug(...) \ - do { \ - if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("index ", sDebugFlag, __VA_ARGS__); } \ +#define indexDebug(...) \ + do { \ + if (sDebugFlag & DEBUG_DEBUG) { \ + taosPrintLog("index ", sDebugFlag, __VA_ARGS__); \ + } \ } while (0) -#define indexTrace(...) \ - do { \ - if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("index ", sDebugFlag, __VA_ARGS__); } \ +#define indexTrace(...) \ + do { \ + if (sDebugFlag & DEBUG_TRACE) { \ + taosPrintLog("index ", sDebugFlag, __VA_ARGS__); \ + } \ + } while (0) + +#define INDEX_TYPE_CONTAIN_EXTERN_TYPE(ty, exTy) (((ty >> 4) & (exTy)) != 0) +#define INDEX_TYPE_GET_TYPE(ty) (ty & 0x0F) +#define INDEX_TYPE_ADD_EXTERN_TYPE(ty, exTy) \ + do { \ + uint8_t oldTy = ty; \ + ty = (ty >> 4) | exTy; \ + ty = (ty << 4) | oldTy; \ } while (0) #ifdef __cplusplus diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c index 5147734a85..b518df2ea2 100644 --- a/source/libs/index/src/index.c +++ b/source/libs/index/src/index.c @@ -2,8 +2,8 @@ * 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. + * 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 @@ -30,6 +30,8 @@ void* indexQhandle = NULL; +static char JSON_COLUMN[] = "JSON"; + void indexInit() { // refactor later indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index"); @@ -63,6 +65,9 @@ static int indexGenTFile(SIndex* index, IndexCache* cache, SArray* batch); static void indexMergeCacheAndTFile(SArray* result, IterateValue* icache, IterateValue* iTfv); static void indexMergeSameKey(SArray* result, TFileValue* tv); +static int32_t indexSerialTermKey(SIndexTerm* itm, char* buf); +int32_t indexSerialKey(ICacheKey* key, char* buf); + int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) { pthread_once(&isInit, indexInit); SIndex* sIdx = calloc(1, sizeof(SIndex)); @@ -147,9 +152,8 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(fVals); i++) { SIndexTerm* p = taosArrayGetP(fVals, i); - char buf[128] = {0}; - ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; - int32_t sz = indexSerialCacheKey(&key, buf); + char buf[128] = {0}; + int32_t sz = indexSerialTermKey(p, buf); IndexCache** cache = taosHashGet(index->colObj, buf, sz); if (cache == NULL) { @@ -162,9 +166,9 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(fVals); i++) { SIndexTerm* p = taosArrayGetP(fVals, i); - char buf[128] = {0}; - ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; - int32_t sz = indexSerialCacheKey(&key, buf); + char buf[128] = {0}; + // ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; + int32_t sz = indexSerialTermKey(p, buf); IndexCache** cache = taosHashGet(index->colObj, buf, sz); assert(*cache != NULL); @@ -554,7 +558,24 @@ END: return -1; } -int32_t indexSerialCacheKey(ICacheKey* key, char* buf) { +int32_t indexSerialTermKeyOfTag(SIndexTerm* p, char* buf) { + ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; + return indexSerialKey(&key, buf); +} +int32_t indexSerilaTermKeyOfJson(SIndexTerm* p, char* buf) { + ICacheKey key = {.suid = p->suid, .colName = JSON_COLUMN, .nColName = strlen(JSON_COLUMN)}; + return indexSerialKey(&key, buf); +} + +int32_t indexSerialTermKey(SIndexTerm* itm, char* buf) { + bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(itm->colType, TSDB_DATA_TYPE_JSON); + if (hasJson) { + return indexSerilaTermKeyOfJson(itm, buf); + } else { + return indexSerialTermKeyOfTag(itm, buf); + } +} +int32_t indexSerialKey(ICacheKey* key, char* buf) { char* p = buf; SERIALIZE_MEM_TO_BUF(buf, key, suid); SERIALIZE_VAR_TO_BUF(buf, '_', char); @@ -563,3 +584,13 @@ int32_t indexSerialCacheKey(ICacheKey* key, char* buf) { SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName); return buf - p; } + +// int32_t indexSerialCacheKey(ICacheKey* key, char* buf) { +// char* p = buf; +// SERIALIZE_MEM_TO_BUF(buf, key, suid); +// SERIALIZE_VAR_TO_BUF(buf, '_', char); +// // SERIALIZE_MEM_TO_BUF(buf, key, colType); +// // SERIALIZE_VAR_TO_BUF(buf, '_', char); +// SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName); +// return buf - p; +//} diff --git a/source/libs/index/src/index_cache.c b/source/libs/index/src/index_cache.c index d6a7141825..bb29a78cb1 100644 --- a/source/libs/index/src/index_cache.c +++ b/source/libs/index/src/index_cache.c @@ -24,6 +24,8 @@ #define MEM_THRESHOLD 1024 * 1024 #define MEM_ESTIMATE_RADIO 1.5 +static char JSON_COLUMN[] = "JSON"; + static void indexMemRef(MemTable* tbl); static void indexMemUnRef(MemTable* tbl); @@ -45,7 +47,7 @@ IndexCache* indexCacheCreate(SIndex* idx, uint64_t suid, const char* colName, in return NULL; }; cache->mem = indexInternalCacheCreate(type); - cache->colName = tstrdup(colName); + cache->colName = INDEX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? tstrdup(JSON_COLUMN) : tstrdup(colName); cache->type = type; cache->index = idx; cache->version = 0; diff --git a/source/libs/index/src/index_json.c b/source/libs/index/src/index_json.c new file mode 100644 index 0000000000..f4d28b45b0 --- /dev/null +++ b/source/libs/index/src/index_json.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include "indeInt.h" +#include "index.h" + +int tIndexJsonOpen(SIndexJsonOpts *opts, const char *path, SIndexJson **index) { + // handle + return tIndexOpen(opts, path, index); +} +// k +int tIndexJsonPut(SIndexJson *index, SIndexJsonMultiTerm *terms, uint64_t uid) { + for (int i = 0; i < taosArrayGetSize(terms); i++) { + SIndexJsonTerm *p = taosArrayGetP(terms, i); + INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON); + } + return indexPut(index, terms, uid); + // handle put +} + +int tIndexJsonSearch(SIndexJson *index, SIndexJsonMultiTermQuery *query, SArray *result) { + for (int i = 0; i < taosArrayGetSize(terms); i++) { + SIndexJsonTerm *p = taosArrayGetP(terms, i); + INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON); + } + return indexSearch(index, query, result); + // handle search +} + +int tIndexJsonClose(SIndexJson *index) { + return tIndexClose(index); + // handle close +} diff --git a/source/libs/index/src/index_tfile.c b/source/libs/index/src/index_tfile.c index e44f8fc1c3..a05884b790 100644 --- a/source/libs/index/src/index_tfile.c +++ b/source/libs/index/src/index_tfile.c @@ -205,7 +205,11 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* resul } else if (qtype == QUERY_PREFIX) { // handle later // - } else { + } else if (qtype == QUERY_SUFFIX) { + // handle later + } else if (qtype == QUERY_REGEX) { + // handle later + } else if (qtype == QUERY_RANGE) { // handle later } tfileReaderUnRef(reader); @@ -586,11 +590,10 @@ static int tfileReaderLoadHeader(TFileReader* reader) { int64_t nread = reader->ctx->readFrom(reader->ctx, buf, sizeof(buf), 0); if (nread == -1) { - indexError("actual Read: %d, to read: %d, errno: %d, filename: %s", (int)(nread), (int)sizeof(buf), - errno, reader->ctx->file.buf); + indexError("actual Read: %d, to read: %d, errno: %d, filename: %s", (int)(nread), (int)sizeof(buf), errno, + reader->ctx->file.buf); } else { - indexInfo("actual Read: %d, to read: %d, filename: %s", (int)(nread), (int)sizeof(buf), - reader->ctx->file.buf); + indexInfo("actual Read: %d, to read: %d, filename: %s", (int)(nread), (int)sizeof(buf), reader->ctx->file.buf); } // assert(nread == sizeof(buf)); memcpy(&reader->header, buf, sizeof(buf)); diff --git a/source/libs/index/test/fstUT.cc b/source/libs/index/test/fstUT.cc index d59a3428da..b34fd71e9c 100644 --- a/source/libs/index/test/fstUT.cc +++ b/source/libs/index/test/fstUT.cc @@ -216,21 +216,21 @@ class FstEnv : public ::testing::Test { TEST_F(FstEnv, writeNormal) { fst->CreateWriter(); - std::string str("aa"); + std::string str("11"); for (int i = 0; i < 10; i++) { - str[0] = 'a' + i; + str[0] = '1' + i; str.resize(2); assert(fst->Put(str, i) == true); } // order failed - assert(fst->Put("aa", 1) == false); + assert(fst->Put("11", 1) == false); fst->DestroyWriter(); fst->CreateReader(); uint64_t val; - assert(fst->Get("a", &val) == false); - assert(fst->Get("aa", &val) == true); + assert(fst->Get("1", &val) == false); + assert(fst->Get("11", &val) == true); assert(val == 0); std::vector rlt; diff --git a/source/libs/index/test/jsonDemo.cc b/source/libs/index/test/jsonDemo.cc new file mode 100644 index 0000000000..e69de29bb2 From d7c3415ae0a5806f3a8710dc6fb13f4816197c25 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 2 Mar 2022 09:24:17 +0800 Subject: [PATCH 02/26] support json --- source/libs/index/src/index_json.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/index/src/index_json.c b/source/libs/index/src/index_json.c index f4d28b45b0..9ffab3fad1 100644 --- a/source/libs/index/src/index_json.c +++ b/source/libs/index/src/index_json.c @@ -12,8 +12,8 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -#include "indeInt.h" #include "index.h" +#include "indexInt.h" int tIndexJsonOpen(SIndexJsonOpts *opts, const char *path, SIndexJson **index) { // handle From 4be79789ca9d044df45cd465b85fad63146b647e Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 2 Mar 2022 15:05:16 +0800 Subject: [PATCH 03/26] support json --- include/libs/index/index.h | 4 +-- source/libs/index/inc/indexInt.h | 2 ++ source/libs/index/src/index.c | 55 ++++++++++------------------- source/libs/index/src/index_cache.c | 46 +++++++++++++++++++----- source/libs/index/src/index_json.c | 12 +++---- 5 files changed, 65 insertions(+), 54 deletions(-) diff --git a/include/libs/index/index.h b/include/libs/index/index.h index 9424eae1b7..453b49e4c6 100644 --- a/include/libs/index/index.h +++ b/include/libs/index/index.h @@ -125,10 +125,10 @@ int tIndexJsonOpen(SIndexJsonOpts* opts, const char* path, SIndexJson** index); /* * close index * @param index (input, index to be closed) - * @return error code + * @return void */ -int tIndexJsonClose(SIndexJson* index); +void tIndexJsonClose(SIndexJson* index); /* * insert terms into index diff --git a/source/libs/index/inc/indexInt.h b/source/libs/index/inc/indexInt.h index 57d587d297..928e8b6102 100644 --- a/source/libs/index/inc/indexInt.h +++ b/source/libs/index/inc/indexInt.h @@ -119,6 +119,8 @@ typedef struct TFileCacheKey { int indexFlushCacheToTFile(SIndex* sIdx, void*); int32_t indexSerialCacheKey(ICacheKey* key, char* buf); +// int32_t indexSerialKey(ICacheKey* key, char* buf); +// int32_t indexSerialTermKey(SIndexTerm* itm, char* buf); #define indexFatal(...) \ do { \ diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c index b518df2ea2..168e819073 100644 --- a/source/libs/index/src/index.c +++ b/source/libs/index/src/index.c @@ -65,8 +65,8 @@ static int indexGenTFile(SIndex* index, IndexCache* cache, SArray* batch); static void indexMergeCacheAndTFile(SArray* result, IterateValue* icache, IterateValue* iTfv); static void indexMergeSameKey(SArray* result, TFileValue* tv); -static int32_t indexSerialTermKey(SIndexTerm* itm, char* buf); -int32_t indexSerialKey(ICacheKey* key, char* buf); +// static int32_t indexSerialTermKey(SIndexTerm* itm, char* buf); +// int32_t indexSerialKey(ICacheKey* key, char* buf); int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) { pthread_once(&isInit, indexInit); @@ -152,8 +152,9 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(fVals); i++) { SIndexTerm* p = taosArrayGetP(fVals, i); - char buf[128] = {0}; - int32_t sz = indexSerialTermKey(p, buf); + char buf[128] = {0}; + ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName), .colType = p->colType}; + int32_t sz = indexSerialCacheKey(&key, buf); IndexCache** cache = taosHashGet(index->colObj, buf, sz); if (cache == NULL) { @@ -166,9 +167,9 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(fVals); i++) { SIndexTerm* p = taosArrayGetP(fVals, i); - char buf[128] = {0}; - // ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; - int32_t sz = indexSerialTermKey(p, buf); + char buf[128] = {0}; + ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName), .colType = p->colType}; + int32_t sz = indexSerialCacheKey(&key, buf); IndexCache** cache = taosHashGet(index->colObj, buf, sz); assert(*cache != NULL); @@ -334,8 +335,9 @@ static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* query, SArray** result IndexCache* cache = NULL; char buf[128] = {0}; - ICacheKey key = {.suid = term->suid, .colName = term->colName, .nColName = strlen(term->colName)}; - int32_t sz = indexSerialCacheKey(&key, buf); + ICacheKey key = { + .suid = term->suid, .colName = term->colName, .nColName = strlen(term->colName), .colType = term->colType}; + int32_t sz = indexSerialCacheKey(&key, buf); pthread_mutex_lock(&sIdx->mtx); IndexCache** pCache = taosHashGet(sIdx->colObj, buf, sz); @@ -558,39 +560,18 @@ END: return -1; } -int32_t indexSerialTermKeyOfTag(SIndexTerm* p, char* buf) { - ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)}; - return indexSerialKey(&key, buf); -} -int32_t indexSerilaTermKeyOfJson(SIndexTerm* p, char* buf) { - ICacheKey key = {.suid = p->suid, .colName = JSON_COLUMN, .nColName = strlen(JSON_COLUMN)}; - return indexSerialKey(&key, buf); -} +int32_t indexSerialCacheKey(ICacheKey* key, char* buf) { + bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(key->colType, TSDB_DATA_TYPE_JSON); -int32_t indexSerialTermKey(SIndexTerm* itm, char* buf) { - bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(itm->colType, TSDB_DATA_TYPE_JSON); - if (hasJson) { - return indexSerilaTermKeyOfJson(itm, buf); - } else { - return indexSerialTermKeyOfTag(itm, buf); - } -} -int32_t indexSerialKey(ICacheKey* key, char* buf) { char* p = buf; SERIALIZE_MEM_TO_BUF(buf, key, suid); SERIALIZE_VAR_TO_BUF(buf, '_', char); // SERIALIZE_MEM_TO_BUF(buf, key, colType); // SERIALIZE_VAR_TO_BUF(buf, '_', char); - SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName); + if (hasJson) { + SERIALIZE_STR_VAR_TO_BUF(buf, JSON_COLUMN, strlen(JSON_COLUMN)); + } else { + SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName); + } return buf - p; } - -// int32_t indexSerialCacheKey(ICacheKey* key, char* buf) { -// char* p = buf; -// SERIALIZE_MEM_TO_BUF(buf, key, suid); -// SERIALIZE_VAR_TO_BUF(buf, '_', char); -// // SERIALIZE_MEM_TO_BUF(buf, key, colType); -// // SERIALIZE_VAR_TO_BUF(buf, '_', char); -// SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName); -// return buf - p; -//} diff --git a/source/libs/index/src/index_cache.c b/source/libs/index/src/index_cache.c index bb29a78cb1..a1f074feae 100644 --- a/source/libs/index/src/index_cache.c +++ b/source/libs/index/src/index_cache.c @@ -25,6 +25,7 @@ #define MEM_ESTIMATE_RADIO 1.5 static char JSON_COLUMN[] = "JSON"; +static char JSON_VALUE_DELIM = '&'; static void indexMemRef(MemTable* tbl); static void indexMemUnRef(MemTable* tbl); @@ -46,6 +47,7 @@ IndexCache* indexCacheCreate(SIndex* idx, uint64_t suid, const char* colName, in indexError("failed to create index cache"); return NULL; }; + cache->mem = indexInternalCacheCreate(type); cache->colName = INDEX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? tstrdup(JSON_COLUMN) : tstrdup(colName); cache->type = type; @@ -209,11 +211,38 @@ static void indexCacheMakeRoomForWrite(IndexCache* cache) { } } } +static char* indexCachePackJsonData(SIndexTerm* itm) { + /* + * |<-----colname---->|<-----dataType---->|<--------colVal---------->| + * |<-----string----->|<-----uint8_t----->|<----depend on dataType-->| + */ + uint8_t ty = INDEX_TYPE_GET_TYPE(itm->colType); + int32_t sz = itm->nColName + itm->nColVal + sizeof(uint8_t) + sizeof(JSON_VALUE_DELIM) * 2 + 1; + char* buf = (char*)calloc(1, sz); + char* p = buf; + + memcpy(p, itm->colVal, itm->nColName); + p += itm->nColName; + + memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); + p += sizeof(JSON_VALUE_DELIM); + + memcpy(p, &ty, sizeof(ty)); + p += sizeof(ty); + + memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); + p += sizeof(JSON_VALUE_DELIM); + + memcpy(p, itm->colVal, itm->nColVal); + + return buf; +} int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) { if (cache == NULL) { return -1; } + bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON); IndexCache* pCache = cache; indexCacheRef(pCache); @@ -224,8 +253,12 @@ int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) { } // set up key ct->colType = term->colType; - ct->colVal = (char*)calloc(1, sizeof(char) * (term->nColVal + 1)); - memcpy(ct->colVal, term->colVal, term->nColVal); + if (hasJson) { + ct->colVal = indexCachePackJsonData(term); + } else { + ct->colVal = (char*)calloc(1, sizeof(char) * (term->nColVal + 1)); + memcpy(ct->colVal, term->colVal, term->nColVal); + } ct->version = atomic_add_fetch_32(&pCache->version, 1); // set value ct->uid = uid; @@ -369,6 +402,8 @@ static int32_t indexCacheTermCompare(const void* l, const void* r) { } static MemTable* indexInternalCacheCreate(int8_t type) { + type = INDEX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? TSDB_DATA_TYPE_BINARY : type; + MemTable* tbl = calloc(1, sizeof(MemTable)); indexMemRef(tbl); if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { @@ -391,9 +426,6 @@ static bool indexCacheIteratorNext(Iterate* itera) { IterateValue* iv = &itera->val; iterateValueDestroy(iv, false); - // IterateValue* iv = &itera->val; - // IterateValue tIterVal = {.colVal = NULL, .val = taosArrayInit(1, sizeof(uint64_t))}; - bool next = tSkipListIterNext(iter); if (next) { SSkipListNode* node = tSkipListIterGet(iter); @@ -413,10 +445,6 @@ static bool indexCacheIteratorNext(Iterate* itera) { taosArrayPush(iv->val, &ct->uid); } - // IterateValue* iv = &itera->val; - // iterateValueDestroy(iv, true); - //*iv = tIterVal; - return next; } diff --git a/source/libs/index/src/index_json.c b/source/libs/index/src/index_json.c index 9ffab3fad1..de88ff3c8a 100644 --- a/source/libs/index/src/index_json.c +++ b/source/libs/index/src/index_json.c @@ -17,9 +17,8 @@ int tIndexJsonOpen(SIndexJsonOpts *opts, const char *path, SIndexJson **index) { // handle - return tIndexOpen(opts, path, index); + return indexOpen(opts, path, index); } -// k int tIndexJsonPut(SIndexJson *index, SIndexJsonMultiTerm *terms, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(terms); i++) { SIndexJsonTerm *p = taosArrayGetP(terms, i); @@ -29,16 +28,17 @@ int tIndexJsonPut(SIndexJson *index, SIndexJsonMultiTerm *terms, uint64_t uid) { // handle put } -int tIndexJsonSearch(SIndexJson *index, SIndexJsonMultiTermQuery *query, SArray *result) { +int tIndexJsonSearch(SIndexJson *index, SIndexJsonMultiTermQuery *tq, SArray *result) { + SArray *terms = tq->query; for (int i = 0; i < taosArrayGetSize(terms); i++) { SIndexJsonTerm *p = taosArrayGetP(terms, i); INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON); } - return indexSearch(index, query, result); + return indexSearch(index, tq, result); // handle search } -int tIndexJsonClose(SIndexJson *index) { - return tIndexClose(index); +void tIndexJsonClose(SIndexJson *index) { + return indexClose(index); // handle close } From 6a6f31c4a75dd30d916b7b31512f7620b6af1d02 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 2 Mar 2022 17:09:22 +0800 Subject: [PATCH 04/26] support json --- source/libs/index/src/index_cache.c | 13 +++- source/libs/index/test/CMakeLists.txt | 18 ++++++ source/libs/index/test/jsonUT.cc | 92 +++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 source/libs/index/test/jsonUT.cc diff --git a/source/libs/index/src/index_cache.c b/source/libs/index/src/index_cache.c index a1f074feae..2742830d3b 100644 --- a/source/libs/index/src/index_cache.c +++ b/source/libs/index/src/index_cache.c @@ -222,7 +222,7 @@ static char* indexCachePackJsonData(SIndexTerm* itm) { char* buf = (char*)calloc(1, sz); char* p = buf; - memcpy(p, itm->colVal, itm->nColName); + memcpy(p, itm->colName, itm->nColName); p += itm->nColName; memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); @@ -329,13 +329,22 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, SArray* result, STermV SIndexTerm* term = query->term; EIndexQueryType qtype = query->qType; - CacheTerm ct = {.colVal = term->colVal, .version = atomic_load_32(&pCache->version)}; + + bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON); + char* p = term->colVal; + if (hasJson) { + p = indexCachePackJsonData(term); + } + CacheTerm ct = {.colVal = p, .version = atomic_load_32(&pCache->version)}; int ret = indexQueryMem(mem, &ct, qtype, result, s); if (ret == 0 && *s != kTypeDeletion) { // continue search in imm ret = indexQueryMem(imm, &ct, qtype, result, s); } + if (hasJson) { + tfree(p); + } indexMemUnRef(mem); indexMemUnRef(imm); diff --git a/source/libs/index/test/CMakeLists.txt b/source/libs/index/test/CMakeLists.txt index bed42be3e5..1ebf85368b 100644 --- a/source/libs/index/test/CMakeLists.txt +++ b/source/libs/index/test/CMakeLists.txt @@ -2,6 +2,7 @@ add_executable(indexTest "") add_executable(fstTest "") add_executable(fstUT "") add_executable(UtilUT "") +add_executable(jsonUT "") target_sources(indexTest PRIVATE @@ -21,6 +22,10 @@ target_sources(UtilUT "utilUT.cc" ) +target_sources(jsonUT + PRIVATE + "jsonUT.cc" +) target_include_directories ( indexTest PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/index" @@ -43,6 +48,12 @@ target_include_directories ( UtilUT "${CMAKE_SOURCE_DIR}/include/libs/index" "${CMAKE_CURRENT_SOURCE_DIR}/../inc" ) + +target_include_directories (jsonUT + PUBLIC + "${CMAKE_SOURCE_DIR}/include/libs/index" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) target_link_libraries (indexTest os util @@ -73,6 +84,13 @@ target_link_libraries (UtilUT index ) +target_link_libraries (jsonUT + os + util + common + gtest_main + index +) #add_test( # NAME index_test diff --git a/source/libs/index/test/jsonUT.cc b/source/libs/index/test/jsonUT.cc new file mode 100644 index 0000000000..20b59add9f --- /dev/null +++ b/source/libs/index/test/jsonUT.cc @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include +#include "index.h" +#include "indexInt.h" +#include "index_cache.h" +#include "index_fst.h" +#include "index_fst_counting_writer.h" +#include "index_fst_util.h" +#include "index_tfile.h" +#include "index_util.h" +#include "tglobal.h" +#include "tskiplist.h" +#include "tutil.h" + +static std::string dir = "/tmp/json"; +class JsonEnv : public ::testing::Test { + protected: + virtual void SetUp() { + taosRemoveDir(dir.c_str()); + opts = indexOptsCreate(); + int ret = tIndexJsonOpen(opts, dir.c_str(), &index); + assert(ret == 0); + } + virtual void TearDown() { + tIndexJsonClose(index); + indexOptsDestroy(opts); + } + SIndexJsonOpts* opts; + SIndexJson* index; +}; + +TEST_F(JsonEnv, testWrite) { + { + std::string colName("voltage"); + std::string colVal("ab"); + SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); + for (size_t i = 0; i < 100; i++) { + tIndexJsonPut(index, terms, i); + } + indexMultiTermDestroy(terms); + } + { + std::string colName("voltage"); + std::string colVal("ab1"); + SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); + for (size_t i = 0; i < 100; i++) { + tIndexJsonPut(index, terms, i); + } + indexMultiTermDestroy(terms); + } + { + std::string colName("voltage"); + std::string colVal("123"); + SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); + for (size_t i = 0; i < 100; i++) { + tIndexJsonPut(index, terms, i); + } + indexMultiTermDestroy(terms); + } + { + std::string colName("voltage"); + std::string colVal("ab"); + + SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST); + SIndexTerm* q = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SArray* result = taosArrayInit(1, sizeof(uint64_t)); + indexMultiTermQueryAdd(mq, q, QUERY_TERM); + tIndexJsonSearch(index, mq, result); + assert(100 == taosArrayGetSize(result)); + indexMultiTermQueryDestroy(mq); + } + + // SIndexTermQuery query = {.term = term, .qType = QUERY_TERM}; +} From 7ae87c10103c801d06092ea3ddea00b9e9b671bd Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 2 Mar 2022 22:06:02 +0800 Subject: [PATCH 05/26] add UT --- source/libs/index/inc/index_comm.h | 32 +++++++++++++++++++ source/libs/index/src/index_cache.c | 35 ++------------------ source/libs/index/src/index_comm.c | 48 ++++++++++++++++++++++++++++ source/libs/index/src/index_tfile.c | 13 +++++++- source/libs/index/test/fstUT.cc | 16 ++++++++++ source/libs/index/test/jsonDemo.cc | 0 source/libs/index/test/jsonUT.cc | 33 +++++++++++++++++-- source/libs/transport/src/transSrv.c | 20 ++++++------ 8 files changed, 153 insertions(+), 44 deletions(-) create mode 100644 source/libs/index/inc/index_comm.h create mode 100644 source/libs/index/src/index_comm.c delete mode 100644 source/libs/index/test/jsonDemo.cc diff --git a/source/libs/index/inc/index_comm.h b/source/libs/index/inc/index_comm.h new file mode 100644 index 0000000000..0d8418ba65 --- /dev/null +++ b/source/libs/index/inc/index_comm.h @@ -0,0 +1,32 @@ +/* + * 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_INDEX_COMM_H_ +#define _TD_INDEX_COMM_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +extern char JSON_COLUMN[]; +extern char JSON_VALUE_DELIM; + +char* indexPackJsonData(SIndexTerm* itm); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/libs/index/src/index_cache.c b/source/libs/index/src/index_cache.c index 2742830d3b..599bac3fe6 100644 --- a/source/libs/index/src/index_cache.c +++ b/source/libs/index/src/index_cache.c @@ -14,6 +14,7 @@ */ #include "index_cache.h" +#include "index_comm.h" #include "index_util.h" #include "tcompare.h" #include "tsched.h" @@ -24,9 +25,6 @@ #define MEM_THRESHOLD 1024 * 1024 #define MEM_ESTIMATE_RADIO 1.5 -static char JSON_COLUMN[] = "JSON"; -static char JSON_VALUE_DELIM = '&'; - static void indexMemRef(MemTable* tbl); static void indexMemUnRef(MemTable* tbl); @@ -211,33 +209,6 @@ static void indexCacheMakeRoomForWrite(IndexCache* cache) { } } } -static char* indexCachePackJsonData(SIndexTerm* itm) { - /* - * |<-----colname---->|<-----dataType---->|<--------colVal---------->| - * |<-----string----->|<-----uint8_t----->|<----depend on dataType-->| - */ - uint8_t ty = INDEX_TYPE_GET_TYPE(itm->colType); - - int32_t sz = itm->nColName + itm->nColVal + sizeof(uint8_t) + sizeof(JSON_VALUE_DELIM) * 2 + 1; - char* buf = (char*)calloc(1, sz); - char* p = buf; - - memcpy(p, itm->colName, itm->nColName); - p += itm->nColName; - - memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); - p += sizeof(JSON_VALUE_DELIM); - - memcpy(p, &ty, sizeof(ty)); - p += sizeof(ty); - - memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); - p += sizeof(JSON_VALUE_DELIM); - - memcpy(p, itm->colVal, itm->nColVal); - - return buf; -} int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) { if (cache == NULL) { return -1; @@ -254,7 +225,7 @@ int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) { // set up key ct->colType = term->colType; if (hasJson) { - ct->colVal = indexCachePackJsonData(term); + ct->colVal = indexPackJsonData(term); } else { ct->colVal = (char*)calloc(1, sizeof(char) * (term->nColVal + 1)); memcpy(ct->colVal, term->colVal, term->nColVal); @@ -333,7 +304,7 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, SArray* result, STermV bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON); char* p = term->colVal; if (hasJson) { - p = indexCachePackJsonData(term); + p = indexPackJsonData(term); } CacheTerm ct = {.colVal = p, .version = atomic_load_32(&pCache->version)}; diff --git a/source/libs/index/src/index_comm.c b/source/libs/index/src/index_comm.c new file mode 100644 index 0000000000..4f3cbaa4da --- /dev/null +++ b/source/libs/index/src/index_comm.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "index.h" +#include "indexInt.h" + +char JSON_COLUMN[] = "JSON"; +char JSON_VALUE_DELIM = '&'; + +char* indexPackJsonData(SIndexTerm* itm) { + /* + * |<-----colname---->|<-----dataType---->|<--------colVal---------->| + * |<-----string----->|<-----uint8_t----->|<----depend on dataType-->| + */ + uint8_t ty = INDEX_TYPE_GET_TYPE(itm->colType); + + int32_t sz = itm->nColName + itm->nColVal + sizeof(uint8_t) + sizeof(JSON_VALUE_DELIM) * 2 + 1; + char* buf = (char*)calloc(1, sz); + char* p = buf; + + memcpy(p, itm->colName, itm->nColName); + p += itm->nColName; + + memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); + p += sizeof(JSON_VALUE_DELIM); + + memcpy(p, &ty, sizeof(ty)); + p += sizeof(ty); + + memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); + p += sizeof(JSON_VALUE_DELIM); + + memcpy(p, itm->colVal, itm->nColVal); + + return buf; +} diff --git a/source/libs/index/src/index_tfile.c b/source/libs/index/src/index_tfile.c index a05884b790..a2089e8eee 100644 --- a/source/libs/index/src/index_tfile.c +++ b/source/libs/index/src/index_tfile.c @@ -15,6 +15,7 @@ p * #include "index_tfile.h" #include "index.h" +#include "index_comm.h" #include "index_fst.h" #include "index_fst_counting_writer.h" #include "index_util.h" @@ -186,13 +187,20 @@ void tfileReaderDestroy(TFileReader* reader) { int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* result) { SIndexTerm* term = query->term; + bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON); EIndexQueryType qtype = query->qType; int ret = -1; // refactor to callback later if (qtype == QUERY_TERM) { uint64_t offset; - FstSlice key = fstSliceCreate(term->colVal, term->nColVal); + char* p = term->colVal; + uint64_t sz = term->nColVal; + if (hasJson) { + p = indexPackJsonData(term); + sz = strlen(p); + } + FstSlice key = fstSliceCreate(p, sz); if (fstGet(reader->fst, &key, &offset)) { indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, found table info in tindex", term->suid, term->colName, term->colVal); @@ -202,6 +210,9 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* resul term->colVal); } fstSliceDestroy(&key); + if (hasJson) { + free(p); + } } else if (qtype == QUERY_PREFIX) { // handle later // diff --git a/source/libs/index/test/fstUT.cc b/source/libs/index/test/fstUT.cc index b34fd71e9c..3bc3b6da6a 100644 --- a/source/libs/index/test/fstUT.cc +++ b/source/libs/index/test/fstUT.cc @@ -238,3 +238,19 @@ TEST_F(FstEnv, writeNormal) { assert(fst->Search(ctx, rlt) == true); } TEST_F(FstEnv, WriteMillonrRecord) {} +TEST_F(FstEnv, writeAbNormal) { + fst->CreateWriter(); + std::string str1("voltage&\b&ab"); + std::string str2("voltbge&\b&ab"); + + fst->Put(str1, 1); + fst->Put(str2, 2); + + fst->DestroyWriter(); + + fst->CreateReader(); + uint64_t val; + assert(fst->Get("1", &val) == false); + assert(fst->Get("voltage&\b&ab", &val) == true); + assert(val == 1); +} diff --git a/source/libs/index/test/jsonDemo.cc b/source/libs/index/test/jsonDemo.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/libs/index/test/jsonUT.cc b/source/libs/index/test/jsonUT.cc index 20b59add9f..e184bc49ae 100644 --- a/source/libs/index/test/jsonUT.cc +++ b/source/libs/index/test/jsonUT.cc @@ -21,6 +21,8 @@ class JsonEnv : public ::testing::Test { protected: virtual void SetUp() { taosRemoveDir(dir.c_str()); + taosMkDir(dir.c_str()); + opts = indexOptsCreate(); int ret = tIndexJsonOpen(opts, dir.c_str(), &index); assert(ret == 0); @@ -87,6 +89,33 @@ TEST_F(JsonEnv, testWrite) { assert(100 == taosArrayGetSize(result)); indexMultiTermQueryDestroy(mq); } - - // SIndexTermQuery query = {.term = term, .qType = QUERY_TERM}; +} +TEST_F(JsonEnv, testWriteMillonData) { + { + std::string colName("voltagefdadfa"); + std::string colVal("abxxxxxxxxxxxx"); + SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); + for (size_t i = 0; i < 1000000; i++) { + tIndexJsonPut(index, terms, i); + } + indexMultiTermDestroy(terms); + } + { + std::string colName("voltage"); + std::string colVal("ab"); + + SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST); + SIndexTerm* q = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SArray* result = taosArrayInit(1, sizeof(uint64_t)); + indexMultiTermQueryAdd(mq, q, QUERY_TERM); + tIndexJsonSearch(index, mq, result); + assert(100 == taosArrayGetSize(result)); + indexMultiTermQueryDestroy(mq); + } } diff --git a/source/libs/transport/src/transSrv.c b/source/libs/transport/src/transSrv.c index f0db054797..c7b6ca2a2c 100644 --- a/source/libs/transport/src/transSrv.c +++ b/source/libs/transport/src/transSrv.c @@ -286,15 +286,17 @@ void uvOnWriteCb(uv_write_t* req, int status) { transClearBuffer(&conn->readBuf); if (status == 0) { tTrace("server conn %p data already was written on stream", conn); - assert(taosArrayGetSize(conn->srvMsgs) >= 1); - SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, 0); - taosArrayRemove(conn->srvMsgs, 0); - destroySmsg(msg); + if (conn->srvMsgs != NULL) { + assert(taosArrayGetSize(conn->srvMsgs) >= 1); + SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, 0); + taosArrayRemove(conn->srvMsgs, 0); + destroySmsg(msg); - // send second data, just use for push - if (taosArrayGetSize(conn->srvMsgs) > 0) { - msg = (SSrvMsg*)taosArrayGetP(conn->srvMsgs, 0); - uvStartSendRespInternal(msg); + // send second data, just use for push + if (taosArrayGetSize(conn->srvMsgs) > 0) { + msg = (SSrvMsg*)taosArrayGetP(conn->srvMsgs, 0); + uvStartSendRespInternal(msg); + } } } else { tError("server conn %p failed to write data, %s", conn, uv_err_name(status)); @@ -615,7 +617,7 @@ static void destroyConn(SSrvConn* conn, bool clear) { SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, i); destroySmsg(msg); } - taosArrayDestroy(conn->srvMsgs); + conn->srvMsgs = taosArrayDestroy(conn->srvMsgs); QUEUE_REMOVE(&conn->queue); if (clear) { From 7986a372e9160594ecf16cdd059a219395d16355 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 11:29:08 +0800 Subject: [PATCH 06/26] monitor --- include/libs/monitor/monitor.h | 9 +- source/dnode/mgmt/impl/inc/dndEnv.h | 3 + source/dnode/mgmt/impl/src/dndEnv.c | 2 + source/dnode/mgmt/impl/src/dndMgmt.c | 20 +++- source/libs/monitor/src/monitor.c | 157 ++++++++++++++++++++++++++- 5 files changed, 183 insertions(+), 8 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 4b7c6a9bc9..090fea9dab 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -57,7 +57,6 @@ typedef struct { typedef struct { int32_t dnode_id; - int8_t vnode_online; char vnode_role[8]; } SMonVnodeDesc; @@ -69,7 +68,7 @@ typedef struct { typedef struct { char database_name[TSDB_DB_NAME_LEN]; int32_t tables_num; - int8_t status; + char status[10]; SArray *vgroups; // array of SMonVgroupDesc } SMonVgroupInfo; @@ -107,7 +106,7 @@ typedef struct { int32_t errors; int32_t vnodes_num; int32_t masters; - int32_t has_mnode; + int8_t has_mnode; } SMonDnodeInfo; typedef struct { @@ -117,7 +116,9 @@ typedef struct { } SMonDiskDesc; typedef struct { - SArray *disks; // array of SMonDiskDesc + SArray *datadirs; // array of SMonDiskDesc + SMonDiskDesc logdir; + SMonDiskDesc tempdir; } SMonDiskInfo; typedef struct { diff --git a/source/dnode/mgmt/impl/inc/dndEnv.h b/source/dnode/mgmt/impl/inc/dndEnv.h index cbd5eb5827..724ba30155 100644 --- a/source/dnode/mgmt/impl/inc/dndEnv.h +++ b/source/dnode/mgmt/impl/inc/dndEnv.h @@ -137,6 +137,9 @@ typedef struct SDnode { SStartupReq startup; } SDnode; + +int32_t dndGetDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo); + #ifdef __cplusplus } #endif diff --git a/source/dnode/mgmt/impl/src/dndEnv.c b/source/dnode/mgmt/impl/src/dndEnv.c index 2539443b41..ae08d6387c 100644 --- a/source/dnode/mgmt/impl/src/dndEnv.c +++ b/source/dnode/mgmt/impl/src/dndEnv.c @@ -323,3 +323,5 @@ void dndCleanup() { taosStopCacheRefreshWorker(); dInfo("dnode env is cleaned up"); } + +int32_t dndGetDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo) { return 0; } \ No newline at end of file diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index 4bf8b82043..afad4b87bc 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -474,11 +474,14 @@ void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) { rpcSendResponse(&rpcRsp); } -void dndGetBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { +static int32_t dndGetBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->dnode_id = dndGetDnodeId(pDnode); tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN); + return 0; } +static int32_t dndGetDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { return 0; } + static void dndSendMonitorReport(SDnode *pDnode) { if (!tsEnableMonitor || tsMonitorFqdn[0] == 0) return; SMonInfo *pMonitor = monCreateMonitorInfo(); @@ -487,8 +490,9 @@ static void dndSendMonitorReport(SDnode *pDnode) { dTrace("pDnode:%p, send monitor report to %s:%u", pDnode, tsMonitorFqdn, tsMonitorPort); SMonBasicInfo basicInfo = {0}; - dndGetBasicInfo(pDnode, &basicInfo); - monSetBasicInfo(pMonitor, &basicInfo); + if (dndGetBasicInfo(pDnode, &basicInfo) == 0) { + monSetBasicInfo(pMonitor, &basicInfo); + } SMonClusterInfo clusterInfo = {0}; SMonVgroupInfo vgroupInfo = {0}; @@ -499,6 +503,16 @@ static void dndSendMonitorReport(SDnode *pDnode) { monSetGrantInfo(pMonitor, &grantInfo); } + SMonDnodeInfo dnodeInfo = {0}; + if (dndGetDnodeInfo(pDnode, &dnodeInfo) == 0) { + monSetDnodeInfo(pMonitor, &dnodeInfo); + } + + SMonDiskInfo diskInfo = {0}; + if (dndGetDiskInfo(pDnode, &diskInfo) == 0) { + monSetDiskInfo(pMonitor, &diskInfo); + } + monSendReport(pMonitor); monCleanupMonitorInfo(pMonitor); } diff --git a/source/libs/monitor/src/monitor.c b/source/libs/monitor/src/monitor.c index 811ee40dc8..67605432ac 100644 --- a/source/libs/monitor/src/monitor.c +++ b/source/libs/monitor/src/monitor.c @@ -97,21 +97,176 @@ void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) { } void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { + SJson *pParentJson = pMonitor->pJson; + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pParentJson, "cluster_info", pJson) != 0) return; + tjsonAddStringToObject(pJson, "first_ep", pInfo->first_ep); + tjsonAddDoubleToObject(pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); + tjsonAddStringToObject(pJson, "version", pInfo->version); + tjsonAddDoubleToObject(pJson, "master_uptime", pInfo->master_uptime); + tjsonAddDoubleToObject(pJson, "monitor_interval", pInfo->monitor_interval); + tjsonAddDoubleToObject(pJson, "vgroups_total", pInfo->vgroups_total); + tjsonAddDoubleToObject(pJson, "vgroups_alive", pInfo->vgroups_alive); + tjsonAddDoubleToObject(pJson, "vnodes_total", pInfo->vnodes_total); + tjsonAddDoubleToObject(pJson, "vnodes_alive", pInfo->vnodes_alive); + tjsonAddDoubleToObject(pJson, "connections_total", pInfo->connections_total); + + SJson *pDnodesJson = tjsonAddArrayToObject(pJson, "dnodes"); + if (pDnodesJson == NULL) return; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) { + SJson *pDnodeJson = tjsonCreateObject(); + if (pDnodeJson == NULL) continue; + + SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); + if (tjsonAddDoubleToObject(pDnodesJson, "dnode_id", pDnodeDesc->dnode_id) != 0) tjsonDelete(pDnodeJson); + if (tjsonAddStringToObject(pDnodesJson, "dnode_ep", pDnodeDesc->dnode_ep) != 0) tjsonDelete(pDnodeJson); + if (tjsonAddStringToObject(pDnodesJson, "status", pDnodeDesc->status) != 0) tjsonDelete(pDnodeJson); + + if (tjsonAddItemToArray(pDnodesJson, pDnodeJson) != 0) tjsonDelete(pDnodeJson); + } + + SJson *pMnodesJson = tjsonAddArrayToObject(pJson, "mnodes"); + if (pMnodesJson == NULL) return; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) { + SJson *pMnodeJson = tjsonCreateObject(); + if (pMnodeJson == NULL) continue; + + SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->dnodes, i); + if (tjsonAddDoubleToObject(pMnodesJson, "mnode_id", pMnodeDesc->mnode_id) != 0) tjsonDelete(pMnodeJson); + if (tjsonAddStringToObject(pMnodesJson, "mnode_ep", pMnodeDesc->mnode_ep) != 0) tjsonDelete(pMnodeJson); + if (tjsonAddStringToObject(pMnodesJson, "role", pMnodeDesc->role) != 0) tjsonDelete(pMnodeJson); + + if (tjsonAddItemToArray(pMnodesJson, pMnodeJson) != 0) tjsonDelete(pMnodeJson); + } } void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) { + SJson *pParentJson = pMonitor->pJson; + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pParentJson, "vgroups_info", pJson) != 0) return; + tjsonAddStringToObject(pJson, "database_name", pInfo->database_name); + tjsonAddDoubleToObject(pJson, "tables_num", pInfo->tables_num); + tjsonAddStringToObject(pJson, "status", pInfo->status); + + SJson *pVgroupsJson = tjsonAddArrayToObject(pJson, "vgroups"); + if (pVgroupsJson == NULL) return; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) { + SJson *pVgroupJson = tjsonCreateObject(); + if (pVgroupJson == NULL) continue; + + SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i); + if (tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id) != 0) tjsonDelete(pVgroupJson); + + SJson *pVnodesJson = tjsonAddArrayToObject(pVgroupJson, "vnodes"); + if (pVnodesJson == NULL) tjsonDelete(pVgroupJson); + + for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) { + SMonVnodeDesc *pVnodeDesc = &pVgroupDesc->vnodes[j]; + if (pVnodeDesc[j].dnode_id <= 0) continue; + + SJson *pVnodeJson = tjsonCreateObject(); + if (pVnodeJson == NULL) continue; + + if (tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id) != 0) tjsonDelete(pVnodeJson); + if (tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role) != 0) tjsonDelete(pVnodeJson); + + if (tjsonAddItemToArray(pVnodesJson, pVnodeJson) != 0) tjsonDelete(pVnodeJson); + } + } } void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) { + SJson *pParentJson = pMonitor->pJson; + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pParentJson, "grant_info", pJson) != 0) return; + tjsonAddDoubleToObject(pJson, "expire_time", pInfo->expire_time); + tjsonAddDoubleToObject(pJson, "timeseries_used", pInfo->timeseries_used); + tjsonAddDoubleToObject(pJson, "timeseries_total", pInfo->timeseries_total); } void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) { + SJson *pParentJson = pMonitor->pJson; + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pParentJson, "dnode_info", pJson) != 0) return; + tjsonAddDoubleToObject(pJson, "uptime", pInfo->uptime); + tjsonAddDoubleToObject(pJson, "cpu_engine", pInfo->cpu_engine); + tjsonAddDoubleToObject(pJson, "cpu_system", pInfo->cpu_system); + tjsonAddDoubleToObject(pJson, "cpu_cores", pInfo->cpu_cores); + tjsonAddDoubleToObject(pJson, "mem_engine", pInfo->mem_engine); + tjsonAddDoubleToObject(pJson, "mem_system", pInfo->mem_system); + tjsonAddDoubleToObject(pJson, "mem_total", pInfo->mem_total); + tjsonAddDoubleToObject(pJson, "disk_engine", pInfo->disk_engine); + tjsonAddDoubleToObject(pJson, "disk_used", pInfo->disk_used); + tjsonAddDoubleToObject(pJson, "disk_total", pInfo->disk_total); + tjsonAddDoubleToObject(pJson, "net_in", pInfo->net_in); + tjsonAddDoubleToObject(pJson, "net_out", pInfo->net_out); + tjsonAddDoubleToObject(pJson, "io_read", pInfo->io_read); + tjsonAddDoubleToObject(pJson, "io_write", pInfo->io_write); + tjsonAddDoubleToObject(pJson, "io_read_disk", pInfo->io_read_disk); + tjsonAddDoubleToObject(pJson, "io_write_disk", pInfo->io_write_disk); + tjsonAddDoubleToObject(pJson, "req_select", pInfo->req_select); + tjsonAddDoubleToObject(pJson, "req_select_rate", pInfo->req_select_rate); + tjsonAddDoubleToObject(pJson, "req_insert", pInfo->req_insert); + tjsonAddDoubleToObject(pJson, "req_insert_success", pInfo->req_insert_success); + tjsonAddDoubleToObject(pJson, "req_insert_rate", pInfo->req_insert_rate); + tjsonAddDoubleToObject(pJson, "req_insert_batch", pInfo->req_insert_batch); + tjsonAddDoubleToObject(pJson, "req_insert_batch_success", pInfo->req_insert_batch_success); + tjsonAddDoubleToObject(pJson, "req_insert_batch_rate", pInfo->req_insert_batch_rate); + tjsonAddDoubleToObject(pJson, "errors", pInfo->errors); + tjsonAddDoubleToObject(pJson, "vnodes_num", pInfo->vnodes_num); + tjsonAddDoubleToObject(pJson, "masters", pInfo->masters); + tjsonAddDoubleToObject(pJson, "has_mnode", pInfo->has_mnode); } void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { - + SJson *pParentJson = pMonitor->pJson; + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pParentJson, "disks_info", pJson) != 0) return; + + SJson *pDatadirsJson = tjsonAddArrayToObject(pJson, "datadirs"); + if (pDatadirsJson == NULL) return; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->datadirs); ++i) { + SJson *pDatadirJson = tjsonCreateObject(); + if (pDatadirJson == NULL) continue; + + SMonDiskDesc *pDatadirDesc = taosArrayGet(pInfo->datadirs, i); + if (tjsonAddStringToObject(pDatadirJson, "name", pDatadirDesc->name) != 0) tjsonDelete(pDatadirJson); + if (tjsonAddDoubleToObject(pDatadirJson, "level", pDatadirDesc->level) != 0) tjsonDelete(pDatadirJson); + if (tjsonAddDoubleToObject(pDatadirJson, "avail", pDatadirDesc->size.avail) != 0) tjsonDelete(pDatadirJson); + if (tjsonAddDoubleToObject(pDatadirJson, "used", pDatadirDesc->size.used) != 0) tjsonDelete(pDatadirJson); + if (tjsonAddDoubleToObject(pDatadirJson, "total", pDatadirDesc->size.total) != 0) tjsonDelete(pDatadirJson); + + if (tjsonAddItemToArray(pDatadirsJson, pDatadirJson) != 0) tjsonDelete(pDatadirJson); + } + + SJson *pLogdirJson = tjsonCreateObject(); + if (pLogdirJson == NULL) return; + if (tjsonAddItemToObject(pJson, "logdir", pLogdirJson) != 0) return; + tjsonAddStringToObject(pLogdirJson, "name", pInfo->logdir.name); + tjsonAddDoubleToObject(pLogdirJson, "level", pInfo->logdir.level); + tjsonAddDoubleToObject(pLogdirJson, "avail", pInfo->logdir.size.avail); + tjsonAddDoubleToObject(pLogdirJson, "used", pInfo->logdir.size.used); + tjsonAddDoubleToObject(pLogdirJson, "total", pInfo->logdir.size.total); + + SJson *pTempdirJson = tjsonCreateObject(); + if (pTempdirJson == NULL) return; + if (tjsonAddItemToObject(pJson, "tempdir", pTempdirJson) != 0) return; + tjsonAddStringToObject(pTempdirJson, "name", pInfo->tempdir.name); + tjsonAddDoubleToObject(pTempdirJson, "level", pInfo->tempdir.level); + tjsonAddDoubleToObject(pTempdirJson, "avail", pInfo->tempdir.size.avail); + tjsonAddDoubleToObject(pTempdirJson, "used", pInfo->tempdir.size.used); + tjsonAddDoubleToObject(pTempdirJson, "total", pInfo->tempdir.size.total); } From 76c4fce8d03c0201ea71bfb5aa42c774b6ea86f9 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 3 Mar 2022 11:37:19 +0800 Subject: [PATCH 07/26] ping test --- source/libs/sync/src/syncIO.c | 14 ++++-------- source/libs/sync/src/syncMain.c | 10 --------- source/libs/sync/test/syncPingTest.cpp | 31 ++++++++++++++++---------- 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/source/libs/sync/src/syncIO.c b/source/libs/sync/src/syncIO.c index 8d04b5bb26..3ba145a96b 100644 --- a/source/libs/sync/src/syncIO.c +++ b/source/libs/sync/src/syncIO.c @@ -211,23 +211,17 @@ static void *syncIOConsumerFunc(void *param) { if (pRpcMsg->msgType == SYNC_PING) { if (io->FpOnSyncPing != NULL) { SyncPing *pSyncMsg; - - SRpcMsg tmpRpcMsg; - memcpy(&tmpRpcMsg, pRpcMsg, sizeof(SRpcMsg)); - pSyncMsg = syncPingBuild(tmpRpcMsg.contLen); - + pSyncMsg = syncPingBuild(pRpcMsg->contLen); syncPingFromRpcMsg(pRpcMsg, pSyncMsg); - // memcpy(pSyncMsg, tmpRpcMsg.pCont, tmpRpcMsg.contLen); - io->FpOnSyncPing(io->pSyncNode, pSyncMsg); } } else if (pRpcMsg->msgType == SYNC_PING_REPLY) { - SyncPingReply *pSyncMsg = syncPingReplyBuild(pRpcMsg->contLen); - syncPingReplyFromRpcMsg(pRpcMsg, pSyncMsg); - if (io->FpOnSyncPingReply != NULL) { + SyncPingReply *pSyncMsg; + pSyncMsg = syncPingReplyBuild(pRpcMsg->contLen); + syncPingReplyFromRpcMsg(pRpcMsg, pSyncMsg); io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg); } } else { diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 49fac038da..9cb3a61fff 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -171,16 +171,6 @@ static int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, Syn SRpcMsg rpcMsg; syncPing2RpcMsg(pMsg, &rpcMsg); - - /* - SRpcMsg rpcMsg; - rpcMsg.contLen = 64; - rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen); - snprintf((char*)rpcMsg.pCont, rpcMsg.contLen, "%s", "xxxxxxxxxxxxxx"); - rpcMsg.handle = NULL; - rpcMsg.msgType = 1; - */ - syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg); { diff --git a/source/libs/sync/test/syncPingTest.cpp b/source/libs/sync/test/syncPingTest.cpp index 24d9ead5e3..8268128347 100644 --- a/source/libs/sync/test/syncPingTest.cpp +++ b/source/libs/sync/test/syncPingTest.cpp @@ -13,7 +13,9 @@ void logTest() { sFatal("--- sync log test: fatal"); } -SSyncNode* doSync() { +uint16_t ports[3] = {7010, 7110, 7210}; + +SSyncNode* doSync(int myIndex) { SSyncFSM* pFsm; SSyncInfo syncInfo; @@ -24,18 +26,18 @@ SSyncNode* doSync() { snprintf(syncInfo.path, sizeof(syncInfo.path), "%s", "./test_sync_ping"); SSyncCfg* pCfg = &syncInfo.syncCfg; - pCfg->myIndex = 0; - pCfg->replicaNum = 2; + pCfg->myIndex = myIndex; + pCfg->replicaNum = 3; - pCfg->nodeInfo[0].nodePort = 7010; + pCfg->nodeInfo[0].nodePort = ports[0]; snprintf(pCfg->nodeInfo[0].nodeFqdn, sizeof(pCfg->nodeInfo[0].nodeFqdn), "%s", "127.0.0.1"); // taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn); - pCfg->nodeInfo[1].nodePort = 7110; + pCfg->nodeInfo[1].nodePort = ports[1]; snprintf(pCfg->nodeInfo[1].nodeFqdn, sizeof(pCfg->nodeInfo[1].nodeFqdn), "%s", "127.0.0.1"); // taosGetFqdn(pCfg->nodeInfo[1].nodeFqdn); - pCfg->nodeInfo[2].nodePort = 7210; + pCfg->nodeInfo[2].nodePort = ports[2]; snprintf(pCfg->nodeInfo[2].nodeFqdn, sizeof(pCfg->nodeInfo[2].nodeFqdn), "%s", "127.0.0.1"); // taosGetFqdn(pCfg->nodeInfo[2].nodeFqdn); @@ -53,20 +55,25 @@ void timerPingAll(void* param, void* tmrId) { syncNodePingAll(pSyncNode); } -int main() { +int main(int argc, char** argv) { // taosInitLog((char*)"syncPingTest.log", 100000, 10); tsAsyncLog = 0; sDebugFlag = 143 + 64; logTest(); - int32_t ret = syncIOStart((char*)"127.0.0.1", 7010); + int 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); - SSyncNode* pSyncNode = doSync(); + SSyncNode* pSyncNode = doSync(myIndex); gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing; gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply; @@ -74,9 +81,9 @@ int main() { assert(ret == 0); /* - taosMsleep(10000); - ret = syncNodeStopPingTimer(pSyncNode); - assert(ret == 0); + taosMsleep(10000); + ret = syncNodeStopPingTimer(pSyncNode); + assert(ret == 0); */ while (1) { From aec7bef25b05afb69696533bafe00e7b53210c0c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 3 Mar 2022 12:29:54 +0800 Subject: [PATCH 08/26] add UT --- source/libs/index/src/index_tfile.c | 3 +++ source/libs/index/test/fstTest.cc | 23 +++++++++++++---------- source/libs/index/test/jsonUT.cc | 22 ++++++++++++++++++---- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/source/libs/index/src/index_tfile.c b/source/libs/index/src/index_tfile.c index a2089e8eee..0947c796b2 100644 --- a/source/libs/index/src/index_tfile.c +++ b/source/libs/index/src/index_tfile.c @@ -275,6 +275,7 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) { __compar_fn_t fn; int8_t colType = tw->header.colType; + colType = INDEX_TYPE_GET_TYPE(colType); if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) { fn = tfileStrCompare; } else { @@ -572,6 +573,8 @@ static int tfileWriteHeader(TFileWriter* writer) { static int tfileWriteData(TFileWriter* write, TFileValue* tval) { TFileHeader* header = &write->header; uint8_t colType = header->colType; + + colType = INDEX_TYPE_GET_TYPE(colType); if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) { FstSlice key = fstSliceCreate((uint8_t*)(tval->colVal), (size_t)strlen(tval->colVal)); if (fstBuilderInsert(write->fb, key, tval->offset)) { diff --git a/source/libs/index/test/fstTest.cc b/source/libs/index/test/fstTest.cc index 65118a2bce..74dcec4490 100644 --- a/source/libs/index/test/fstTest.cc +++ b/source/libs/index/test/fstTest.cc @@ -312,15 +312,18 @@ void validateTFile(char* arg) { tfCleanup(); } -void iterTFileReader(char* path, char* ver) { +void iterTFileReader(char* path, char* uid, char* colName, char* ver) { tfInit(); - int version = atoi(ver); - TFileReader* reader = tfileReaderOpen(path, 0, version, "tag1"); - Iterate* iter = tfileIteratorCreate(reader); - bool tn = iter ? iter->next(iter) : false; - int count = 0; - int termCount = 0; + uint64_t suid = atoi(uid); + int version = atoi(ver); + + TFileReader* reader = tfileReaderOpen(path, suid, version, colName); + + Iterate* iter = tfileIteratorCreate(reader); + bool tn = iter ? iter->next(iter) : false; + int count = 0; + int termCount = 0; while (tn == true) { count++; IterateValue* cv = iter->getValue(iter); @@ -337,9 +340,9 @@ void iterTFileReader(char* path, char* ver) { int main(int argc, char* argv[]) { // tool to check all kind of fst test // if (argc > 1) { validateTFile(argv[1]); } - if (argc > 2) { - // opt - iterTFileReader(argv[1], argv[2]); + if (argc > 4) { + // path suid colName ver + iterTFileReader(argv[1], argv[2], argv[3], argv[4]); } // checkFstCheckIterator(); // checkFstLongTerm(); diff --git a/source/libs/index/test/jsonUT.cc b/source/libs/index/test/jsonUT.cc index e184bc49ae..e5c79d137f 100644 --- a/source/libs/index/test/jsonUT.cc +++ b/source/libs/index/test/jsonUT.cc @@ -22,7 +22,7 @@ class JsonEnv : public ::testing::Test { virtual void SetUp() { taosRemoveDir(dir.c_str()); taosMkDir(dir.c_str()); - + printf("set up\n"); opts = indexOptsCreate(); int ret = tIndexJsonOpen(opts, dir.c_str(), &index); assert(ret == 0); @@ -30,6 +30,7 @@ class JsonEnv : public ::testing::Test { virtual void TearDown() { tIndexJsonClose(index); indexOptsDestroy(opts); + printf("destory\n"); } SIndexJsonOpts* opts; SIndexJson* index; @@ -37,7 +38,7 @@ class JsonEnv : public ::testing::Test { TEST_F(JsonEnv, testWrite) { { - std::string colName("voltage"); + std::string colName("test"); std::string colVal("ab"); SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size()); @@ -76,7 +77,7 @@ TEST_F(JsonEnv, testWrite) { indexMultiTermDestroy(terms); } { - std::string colName("voltage"); + std::string colName("test"); std::string colVal("ab"); SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST); @@ -91,6 +92,19 @@ TEST_F(JsonEnv, testWrite) { } } TEST_F(JsonEnv, testWriteMillonData) { + { + std::string colName("test"); + std::string colVal("ab"); + SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); + for (size_t i = 0; i < 100; i++) { + tIndexJsonPut(index, terms, i); + } + indexMultiTermDestroy(terms); + } { std::string colName("voltagefdadfa"); std::string colVal("abxxxxxxxxxxxx"); @@ -105,7 +119,7 @@ TEST_F(JsonEnv, testWriteMillonData) { indexMultiTermDestroy(terms); } { - std::string colName("voltage"); + std::string colName("test"); std::string colVal("ab"); SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST); From 1fe0c21fd22ab64be6c6afa75c0c49cf191c9ea8 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 13:48:13 +0800 Subject: [PATCH 09/26] monitor --- source/dnode/mgmt/impl/src/dndMgmt.c | 6 +- source/libs/monitor/src/monitor.c | 118 +++++++++++++++++++++------ 2 files changed, 97 insertions(+), 27 deletions(-) diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index afad4b87bc..268ed7e362 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -483,12 +483,12 @@ static int32_t dndGetBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { static int32_t dndGetDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { return 0; } static void dndSendMonitorReport(SDnode *pDnode) { - if (!tsEnableMonitor || tsMonitorFqdn[0] == 0) return; + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; + dTrace("pDnode:%p, send monitor report to %s:%u", pDnode, tsMonitorFqdn, tsMonitorPort); + SMonInfo *pMonitor = monCreateMonitorInfo(); if (pMonitor == NULL) return; - dTrace("pDnode:%p, send monitor report to %s:%u", pDnode, tsMonitorFqdn, tsMonitorPort); - SMonBasicInfo basicInfo = {0}; if (dndGetBasicInfo(pDnode, &basicInfo) == 0) { monSetBasicInfo(pMonitor, &basicInfo); diff --git a/source/libs/monitor/src/monitor.c b/source/libs/monitor/src/monitor.c index 67605432ac..7ba65b87b0 100644 --- a/source/libs/monitor/src/monitor.c +++ b/source/libs/monitor/src/monitor.c @@ -54,7 +54,10 @@ void monAddLogItem(SMonLogItem *pItem) { SMonInfo *monCreateMonitorInfo() { SMonInfo *pMonitor = calloc(1, sizeof(SMonInfo)); - if (pMonitor == NULL) return NULL; + if (pMonitor == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } taosWLockLatch(&tsMonitor.lock); pMonitor->logs = taosArrayDup(tsMonitor.logs); @@ -77,30 +80,24 @@ void monCleanupMonitorInfo(SMonInfo *pMonitor) { free(pMonitor); } -void monSendReport(SMonInfo *pMonitor) { - char *pCont = tjsonToString(pMonitor->pJson); - if (pCont != NULL) { - taosSendHttpReport(tsMonitor.server, tsMonitor.port, pCont, strlen(pCont)); - free(pCont); - } -} - void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) { - SJson *pJson = pMonitor->pJson; - tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id); - tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep); - + SJson *pJson = pMonitor->pJson; int64_t ms = taosGetTimestampMs(); char buf[40] = {0}; taosFormatUtcTime(buf, sizeof(buf), ms, TSDB_TIME_PRECISION_MILLI); + tjsonAddStringToObject(pJson, "ts", buf); + tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id); + tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep); } void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { - SJson *pParentJson = pMonitor->pJson; SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pParentJson, "cluster_info", pJson) != 0) return; + if (tjsonAddItemToObject(pMonitor->pJson, "cluster_info", pJson) != 0) { + tjsonDelete(pJson); + return; + } tjsonAddStringToObject(pJson, "first_ep", pInfo->first_ep); tjsonAddDoubleToObject(pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); @@ -145,10 +142,12 @@ void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { } void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) { - SJson *pParentJson = pMonitor->pJson; SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pParentJson, "vgroups_info", pJson) != 0) return; + if (tjsonAddItemToObject(pMonitor->pJson, "vgroup_infos", pJson) != 0) { + tjsonDelete(pJson); + return; + } tjsonAddStringToObject(pJson, "database_name", pInfo->database_name); tjsonAddDoubleToObject(pJson, "tables_num", pInfo->tables_num); @@ -183,10 +182,12 @@ void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) { } void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) { - SJson *pParentJson = pMonitor->pJson; SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pParentJson, "grant_info", pJson) != 0) return; + if (tjsonAddItemToObject(pMonitor->pJson, "grant_info", pJson) != 0) { + tjsonDelete(pJson); + return; + } tjsonAddDoubleToObject(pJson, "expire_time", pInfo->expire_time); tjsonAddDoubleToObject(pJson, "timeseries_used", pInfo->timeseries_used); @@ -194,10 +195,12 @@ void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) { } void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) { - SJson *pParentJson = pMonitor->pJson; SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pParentJson, "dnode_info", pJson) != 0) return; + if (tjsonAddItemToObject(pMonitor->pJson, "dnode_info", pJson) != 0) { + tjsonDelete(pJson); + return; + } tjsonAddDoubleToObject(pJson, "uptime", pInfo->uptime); tjsonAddDoubleToObject(pJson, "cpu_engine", pInfo->cpu_engine); @@ -230,12 +233,14 @@ void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) { } void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { - SJson *pParentJson = pMonitor->pJson; SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pParentJson, "disks_info", pJson) != 0) return; + if (tjsonAddItemToObject(pMonitor->pJson, "disks_infos", pJson) != 0) { + tjsonDelete(pJson); + return; + } - SJson *pDatadirsJson = tjsonAddArrayToObject(pJson, "datadirs"); + SJson *pDatadirsJson = tjsonAddArrayToObject(pJson, "datadir"); if (pDatadirsJson == NULL) return; for (int32_t i = 0; i < taosArrayGetSize(pInfo->datadirs); ++i) { @@ -270,3 +275,68 @@ void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { tjsonAddDoubleToObject(pTempdirJson, "used", pInfo->tempdir.size.used); tjsonAddDoubleToObject(pTempdirJson, "total", pInfo->tempdir.size.total); } + +static void monSetLogInfo(SMonInfo *pMonitor) { + SJson *pJson = tjsonCreateObject(); + if (pJson == NULL) return; + if (tjsonAddItemToObject(pMonitor->pJson, "log_infos", pJson) != 0) { + tjsonDelete(pJson); + return; + } + + SJson *pLogsJson = tjsonAddArrayToObject(pJson, "logs"); + if (pLogsJson == NULL) return; + + for (int32_t i = 0; i < taosArrayGetSize(pMonitor->logs); ++i) { + SJson *pLogJson = tjsonCreateObject(); + if (pLogJson == NULL) continue; + + SMonLogItem *pLogItem = taosArrayGet(pMonitor->logs, i); + + char buf[40] = {0}; + taosFormatUtcTime(buf, sizeof(buf), pLogItem->ts, TSDB_TIME_PRECISION_MILLI); + + if (tjsonAddStringToObject(pLogItem, "ts", buf) != 0) tjsonDelete(pLogJson); + if (tjsonAddDoubleToObject(pLogItem, "level", pLogItem->level) != 0) tjsonDelete(pLogJson); + if (tjsonAddStringToObject(pLogItem, "content", pLogItem->content) != 0) tjsonDelete(pLogJson); + + if (tjsonAddItemToArray(pLogsJson, pLogJson) != 0) tjsonDelete(pLogJson); + } + + SJson *pSummaryJson = tjsonAddArrayToObject(pJson, "summary"); + if (pSummaryJson == NULL) return; + + SJson *pLogError = tjsonCreateObject(); + if (pLogError == NULL) return; + tjsonAddStringToObject(pLogError, "level", "error"); + tjsonAddDoubleToObject(pLogError, "total", 1); + if (tjsonAddItemToArray(pSummaryJson, pLogError) != 0) tjsonDelete(pLogError); + + SJson *pLogInfo = tjsonCreateObject(); + if (pLogInfo == NULL) return; + tjsonAddStringToObject(pLogInfo, "level", "info"); + tjsonAddDoubleToObject(pLogInfo, "total", 1); + if (tjsonAddItemToArray(pSummaryJson, pLogInfo) != 0) tjsonDelete(pLogInfo); + + SJson *pLogDebug = tjsonCreateObject(); + if (pLogDebug == NULL) return; + tjsonAddStringToObject(pLogDebug, "level", "debug"); + tjsonAddDoubleToObject(pLogDebug, "total", 1); + if (tjsonAddItemToArray(pSummaryJson, pLogDebug) != 0) tjsonDelete(pLogDebug); + + SJson *pLogTrace = tjsonCreateObject(); + if (pLogTrace == NULL) return; + tjsonAddStringToObject(pLogTrace, "level", "trace"); + tjsonAddDoubleToObject(pLogTrace, "total", 1); + if (tjsonAddItemToArray(pSummaryJson, pLogTrace) != 0) tjsonDelete(pLogTrace); +} + +void monSendReport(SMonInfo *pMonitor) { + monSetLogInfo(pMonitor); + + char *pCont = tjsonToString(pMonitor->pJson); + if (pCont != NULL) { + taosSendHttpReport(tsMonitor.server, tsMonitor.port, pCont, strlen(pCont)); + free(pCont); + } +} From f263a623dd7186525c28bb79668426158404a71e Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 3 Mar 2022 14:52:30 +0800 Subject: [PATCH 10/26] sync encode/decode --- source/libs/sync/inc/syncMessage.h | 162 ++++++++------- source/libs/sync/src/syncMessage.c | 245 ++++++++++++++++------- source/libs/sync/test/syncEncodeTest.cpp | 129 +++++++++--- 3 files changed, 368 insertions(+), 168 deletions(-) diff --git a/source/libs/sync/inc/syncMessage.h b/source/libs/sync/inc/syncMessage.h index be53559e8a..a51567d1dd 100644 --- a/source/libs/sync/inc/syncMessage.h +++ b/source/libs/sync/inc/syncMessage.h @@ -28,30 +28,25 @@ extern "C" { #include "syncRaftEntry.h" #include "taosdef.h" -// encode as uint64 +// encode as uint32 typedef enum ESyncMessageType { SYNC_PING = 101, SYNC_PING_REPLY = 103, - SYNC_CLIENT_REQUEST, - SYNC_CLIENT_REQUEST_REPLY, - SYNC_REQUEST_VOTE, - SYNC_REQUEST_VOTE_REPLY, - SYNC_APPEND_ENTRIES, - SYNC_APPEND_ENTRIES_REPLY, + SYNC_CLIENT_REQUEST = 105, + SYNC_CLIENT_REQUEST_REPLY = 107, + SYNC_REQUEST_VOTE = 109, + SYNC_REQUEST_VOTE_REPLY = 111, + SYNC_APPEND_ENTRIES = 113, + SYNC_APPEND_ENTRIES_REPLY = 115, } ESyncMessageType; -/* -typedef struct SRaftId { - SyncNodeId addr; // typedef uint64_t SyncNodeId; - SyncGroupId vgId; // typedef int32_t SyncGroupId; -} SRaftId; -*/ - +// --------------------------------------------- typedef struct SyncPing { uint32_t bytes; uint32_t msgType; SRaftId srcId; SRaftId destId; + // private data uint32_t dataLen; char data[]; } SyncPing; @@ -59,28 +54,22 @@ typedef struct SyncPing { #define SYNC_PING_FIX_LEN (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t)) SyncPing* syncPingBuild(uint32_t dataLen); - -void syncPingDestroy(SyncPing* pMsg); - -void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen); - -void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg); - -void syncPing2RpcMsg(const SyncPing* pMsg, SRpcMsg* pRpcMsg); - -void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg); - -cJSON* syncPing2Json(const SyncPing* pMsg); - +void syncPingDestroy(SyncPing* pMsg); +void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen); +void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg); +void syncPing2RpcMsg(const SyncPing* pMsg, SRpcMsg* pRpcMsg); +void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg); +cJSON* syncPing2Json(const SyncPing* pMsg); SyncPing* syncPingBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str); - SyncPing* syncPingBuild3(const SRaftId* srcId, const SRaftId* destId); +// --------------------------------------------- typedef struct SyncPingReply { uint32_t bytes; uint32_t msgType; SRaftId srcId; SRaftId destId; + // private data uint32_t dataLen; char data[]; } SyncPingReply; @@ -89,72 +78,95 @@ typedef struct SyncPingReply { (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t)) SyncPingReply* syncPingReplyBuild(uint32_t dataLen); - -void syncPingReplyDestroy(SyncPingReply* pMsg); - -void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen); - -void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg); - -void syncPingReply2RpcMsg(const SyncPingReply* pMsg, SRpcMsg* pRpcMsg); - -void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg); - -cJSON* syncPingReply2Json(const SyncPingReply* pMsg); - +void syncPingReplyDestroy(SyncPingReply* pMsg); +void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen); +void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg); +void syncPingReply2RpcMsg(const SyncPingReply* pMsg, SRpcMsg* pRpcMsg); +void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg); +cJSON* syncPingReply2Json(const SyncPingReply* pMsg); SyncPingReply* syncPingReplyBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str); - SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId); +// --------------------------------------------- typedef struct SyncClientRequest { - ESyncMessageType msgType; - char* data; - uint32_t dataLen; - int64_t seqNum; - bool isWeak; + uint32_t bytes; + uint32_t msgType; + int64_t seqNum; + bool isWeak; + uint32_t dataLen; + char data[]; } SyncClientRequest; +// --------------------------------------------- typedef struct SyncClientRequestReply { - ESyncMessageType msgType; - int32_t errCode; - SSyncBuffer* pErrMsg; - SSyncBuffer* pLeaderHint; + uint32_t bytes; + uint32_t msgType; + int32_t errCode; + SRaftId leaderHint; } SyncClientRequestReply; +// --------------------------------------------- typedef struct SyncRequestVote { - ESyncMessageType msgType; - SyncTerm currentTerm; - SyncNodeId nodeId; - SyncGroupId vgId; - SyncIndex lastLogIndex; - SyncTerm lastLogTerm; + uint32_t bytes; + uint32_t msgType; + SRaftId srcId; + SRaftId destId; + // private data + SyncTerm currentTerm; + SyncIndex lastLogIndex; + SyncTerm lastLogTerm; } SyncRequestVote; +SyncRequestVote* syncRequestVoteBuild(); +void syncRequestVoteDestroy(SyncRequestVote* pMsg); +void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen); +void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg); +void syncRequestVote2RpcMsg(const SyncRequestVote* pMsg, SRpcMsg* pRpcMsg); +void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg); +cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg); + +// --------------------------------------------- typedef struct SyncRequestVoteReply { - ESyncMessageType msgType; - SyncTerm currentTerm; - SyncNodeId nodeId; - SyncGroupId vgId; - bool voteGranted; + uint32_t bytes; + uint32_t msgType; + SRaftId srcId; + SRaftId destId; + // private data + SyncTerm term; + bool voteGranted; } SyncRequestVoteReply; +SyncRequestVoteReply* SyncRequestVoteReplyBuild(); +void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg); +void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen); +void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg); +void syncRequestVoteReply2RpcMsg(const SyncRequestVoteReply* pMsg, SRpcMsg* pRpcMsg); +void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply* pMsg); +cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg); + +// --------------------------------------------- typedef struct SyncAppendEntries { - ESyncMessageType msgType; - SyncTerm currentTerm; - SyncNodeId nodeId; - SyncIndex prevLogIndex; - SyncTerm prevLogTerm; - int32_t entryCount; - SSyncRaftEntry* logEntries; - SyncIndex commitIndex; + uint32_t bytes; + uint32_t msgType; + SRaftId srcId; + SRaftId destId; + // private data + SyncIndex prevLogIndex; + SyncTerm prevLogTerm; + SyncIndex commitIndex; + uint32_t dataLen; + char data[]; } SyncAppendEntries; +// --------------------------------------------- typedef struct SyncAppendEntriesReply { - ESyncMessageType msgType; - SyncTerm currentTerm; - SyncNodeId nodeId; - bool success; - SyncIndex matchIndex; + uint32_t bytes; + uint32_t msgType; + SRaftId srcId; + SRaftId destId; + // private data + bool success; + SyncIndex matchIndex; } SyncAppendEntriesReply; #ifdef __cplusplus diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c index a26c8401b2..ac3f550e3e 100644 --- a/source/libs/sync/src/syncMessage.c +++ b/source/libs/sync/src/syncMessage.c @@ -60,12 +60,15 @@ void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) { } cJSON* syncPing2Json(const SyncPing* pMsg) { + char u64buf[128]; + cJSON* pRoot = cJSON_CreateObject(); cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); cJSON* pSrcId = cJSON_CreateObject(); - cJSON_AddNumberToObject(pSrcId, "addr", pMsg->srcId.addr); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); { uint64_t u64 = pMsg->srcId.addr; cJSON* pTmp = pSrcId; @@ -79,7 +82,8 @@ cJSON* syncPing2Json(const SyncPing* pMsg) { cJSON_AddItemToObject(pRoot, "srcId", pSrcId); cJSON* pDestId = cJSON_CreateObject(); - cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr); + cJSON_AddStringToObject(pDestId, "addr", u64buf); { uint64_t u64 = pMsg->destId.addr; cJSON* pTmp = pDestId; @@ -154,12 +158,15 @@ void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) { } cJSON* syncPingReply2Json(const SyncPingReply* pMsg) { + char u64buf[128]; + cJSON* pRoot = cJSON_CreateObject(); cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); cJSON* pSrcId = cJSON_CreateObject(); - cJSON_AddNumberToObject(pSrcId, "addr", pMsg->srcId.addr); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); { uint64_t u64 = pMsg->srcId.addr; cJSON* pTmp = pSrcId; @@ -173,7 +180,8 @@ cJSON* syncPingReply2Json(const SyncPingReply* pMsg) { cJSON_AddItemToObject(pRoot, "srcId", pSrcId); cJSON* pDestId = cJSON_CreateObject(); - cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr); + cJSON_AddStringToObject(pDestId, "addr", u64buf); { uint64_t u64 = pMsg->destId.addr; cJSON* pTmp = pDestId; @@ -208,72 +216,169 @@ SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId) return pMsg; } -#if 0 -void syncPingSerialize(const SyncPing* pMsg, char** ppBuf, uint32_t* bufLen) { - *bufLen = sizeof(SyncPing) + pMsg->dataLen; - *ppBuf = (char*)malloc(*bufLen); - void* pStart = *ppBuf; - uint32_t allBytes = *bufLen; - - int len = 0; - len = taosEncodeFixedU32(&pStart, pMsg->msgType); - allBytes -= len; - assert(len > 0); - pStart += len; - - len = taosEncodeFixedU64(&pStart, pMsg->srcId.addr); - allBytes -= len; - assert(len > 0); - pStart += len; - - len = taosEncodeFixedI32(&pStart, pMsg->srcId.vgId); - allBytes -= len; - assert(len > 0); - pStart += len; - - len = taosEncodeFixedU64(&pStart, pMsg->destId.addr); - allBytes -= len; - assert(len > 0); - pStart += len; - - len = taosEncodeFixedI32(&pStart, pMsg->destId.vgId); - allBytes -= len; - assert(len > 0); - pStart += len; - - len = taosEncodeFixedU32(&pStart, pMsg->dataLen); - allBytes -= len; - assert(len > 0); - pStart += len; - - memcpy(pStart, pMsg->data, pMsg->dataLen); - allBytes -= pMsg->dataLen; - assert(allBytes == 0); +// ---- message process SyncRequestVote---- +SyncRequestVote* syncRequestVoteBuild() { + uint32_t bytes = sizeof(SyncRequestVote); + SyncRequestVote* pMsg = malloc(bytes); + memset(pMsg, 0, bytes); + pMsg->bytes = bytes; + pMsg->msgType = SYNC_REQUEST_VOTE; } - -void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) { - void* pStart = (void*)buf; - uint64_t u64; - int32_t i32; - uint32_t u32; - - pStart = taosDecodeFixedU64(pStart, &u64); - pMsg->msgType = u64; - - pStart = taosDecodeFixedU64(pStart, &u64); - pMsg->srcId.addr = u64; - - pStart = taosDecodeFixedI32(pStart, &i32); - pMsg->srcId.vgId = i32; - - pStart = taosDecodeFixedU64(pStart, &u64); - pMsg->destId.addr = u64; - - pStart = taosDecodeFixedI32(pStart, &i32); - pMsg->destId.vgId = i32; - - pStart = taosDecodeFixedU32(pStart, &u32); - pMsg->dataLen = u32; +void syncRequestVoteDestroy(SyncRequestVote* pMsg) { + if (pMsg != NULL) { + free(pMsg); + } } -#endif \ No newline at end of file + +void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) { + assert(pMsg->bytes <= bufLen); + memcpy(buf, pMsg, pMsg->bytes); +} + +void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) { + memcpy(pMsg, buf, len); + assert(len == pMsg->bytes); +} + +void syncRequestVote2RpcMsg(const SyncRequestVote* pMsg, SRpcMsg* pRpcMsg) { + memset(pRpcMsg, 0, sizeof(*pRpcMsg)); + pRpcMsg->msgType = pMsg->msgType; + pRpcMsg->contLen = pMsg->bytes; + pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + syncRequestVoteSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen); +} + +void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) { + syncRequestVoteDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg); +} + +cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg) { + char u64buf[128]; + + cJSON* pRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); + cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); + + cJSON* pSrcId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); + { + uint64_t u64 = pMsg->srcId.addr; + cJSON* pTmp = pSrcId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId); + cJSON_AddItemToObject(pRoot, "srcId", pSrcId); + + cJSON* pDestId = cJSON_CreateObject(); + cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr); + { + uint64_t u64 = pMsg->destId.addr; + cJSON* pTmp = pDestId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId); + cJSON_AddItemToObject(pRoot, "destId", pDestId); + + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->currentTerm); + cJSON_AddStringToObject(pRoot, "currentTerm", u64buf); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->lastLogIndex); + cJSON_AddStringToObject(pRoot, "lastLogIndex", u64buf); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->lastLogTerm); + cJSON_AddStringToObject(pRoot, "lastLogTerm", u64buf); + + cJSON* pJson = cJSON_CreateObject(); + cJSON_AddItemToObject(pJson, "SyncRequestVote", pRoot); + return pJson; +} + +// ---- message process SyncRequestVoteReply---- +SyncRequestVoteReply* SyncRequestVoteReplyBuild() { + uint32_t bytes = sizeof(SyncRequestVoteReply); + SyncRequestVoteReply* pMsg = malloc(bytes); + memset(pMsg, 0, bytes); + pMsg->bytes = bytes; + pMsg->msgType = SYNC_REQUEST_VOTE_REPLY; +} + +void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) { + if (pMsg != NULL) { + free(pMsg); + } +} + +void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) { + assert(pMsg->bytes <= bufLen); + memcpy(buf, pMsg, pMsg->bytes); +} + +void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) { + memcpy(pMsg, buf, len); + assert(len == pMsg->bytes); +} + +void syncRequestVoteReply2RpcMsg(const SyncRequestVoteReply* pMsg, SRpcMsg* pRpcMsg) { + memset(pRpcMsg, 0, sizeof(*pRpcMsg)); + pRpcMsg->msgType = pMsg->msgType; + pRpcMsg->contLen = pMsg->bytes; + pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + syncRequestVoteReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen); +} + +void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply* pMsg) { + syncRequestVoteReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg); +} + +cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg) { + char u64buf[128]; + + cJSON* pRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); + cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); + + cJSON* pSrcId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); + { + uint64_t u64 = pMsg->srcId.addr; + cJSON* pTmp = pSrcId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId); + cJSON_AddItemToObject(pRoot, "srcId", pSrcId); + + cJSON* pDestId = cJSON_CreateObject(); + cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr); + { + uint64_t u64 = pMsg->destId.addr; + cJSON* pTmp = pDestId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId); + cJSON_AddItemToObject(pRoot, "destId", pDestId); + + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->term); + cJSON_AddStringToObject(pRoot, "term", u64buf); + cJSON_AddNumberToObject(pRoot, "vote_granted", pMsg->voteGranted); + + cJSON* pJson = cJSON_CreateObject(); + cJSON_AddItemToObject(pJson, "SyncRequestVoteReply", pRoot); + return pJson; +} \ No newline at end of file diff --git a/source/libs/sync/test/syncEncodeTest.cpp b/source/libs/sync/test/syncEncodeTest.cpp index 4deceb603e..e0179b2c8b 100644 --- a/source/libs/sync/test/syncEncodeTest.cpp +++ b/source/libs/sync/test/syncEncodeTest.cpp @@ -3,6 +3,7 @@ #include "syncIO.h" #include "syncInt.h" #include "syncMessage.h" +#include "syncUtil.h" void logTest() { sTrace("--- sync log test: trace"); @@ -21,16 +22,16 @@ void test1() { char msg[PING_MSG_LEN]; snprintf(msg, sizeof(msg), "%s", "test ping"); SyncPing* pMsg = syncPingBuild(PING_MSG_LEN); - pMsg->srcId.addr = 1; - pMsg->srcId.vgId = 2; - pMsg->destId.addr = 3; - pMsg->destId.vgId = 4; + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222); + pMsg->destId.vgId = 100; memcpy(pMsg->data, msg, PING_MSG_LEN); { cJSON* pJson = syncPing2Json(pMsg); char* serialized = cJSON_Print(pJson); - printf("SyncPing: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -45,7 +46,7 @@ void test1() { { cJSON* pJson = syncPing2Json(pMsg2); char* serialized = cJSON_Print(pJson); - printf("SyncPing2: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -61,16 +62,16 @@ void test2() { char msg[PING_MSG_LEN]; snprintf(msg, sizeof(msg), "%s", "hello raft"); SyncPing* pMsg = syncPingBuild(PING_MSG_LEN); - pMsg->srcId.addr = 100; + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 3333); pMsg->srcId.vgId = 200; - pMsg->destId.addr = 300; - pMsg->destId.vgId = 400; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 4444); + pMsg->destId.vgId = 200; memcpy(pMsg->data, msg, PING_MSG_LEN); { cJSON* pJson = syncPing2Json(pMsg); char* serialized = cJSON_Print(pJson); - printf("SyncPing: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -84,7 +85,7 @@ void test2() { { cJSON* pJson = syncPing2Json(pMsg2); char* serialized = cJSON_Print(pJson); - printf("SyncPing2: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -99,16 +100,16 @@ void test3() { char msg[PING_MSG_LEN]; snprintf(msg, sizeof(msg), "%s", "test ping"); SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN); - pMsg->srcId.addr = 19; - pMsg->srcId.vgId = 29; - pMsg->destId.addr = 39; - pMsg->destId.vgId = 49; + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 5555); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 6666); + pMsg->destId.vgId = 100; memcpy(pMsg->data, msg, PING_MSG_LEN); { cJSON* pJson = syncPingReply2Json(pMsg); char* serialized = cJSON_Print(pJson); - printf("SyncPingReply: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -123,7 +124,7 @@ void test3() { { cJSON* pJson = syncPingReply2Json(pMsg2); char* serialized = cJSON_Print(pJson); - printf("SyncPingReply2: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -139,16 +140,16 @@ void test4() { char msg[PING_MSG_LEN]; snprintf(msg, sizeof(msg), "%s", "hello raft"); SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN); - pMsg->srcId.addr = 66; - pMsg->srcId.vgId = 77; - pMsg->destId.addr = 88; - pMsg->destId.vgId = 99; + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 7777); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 8888); + pMsg->destId.vgId = 100; memcpy(pMsg->data, msg, PING_MSG_LEN); { cJSON* pJson = syncPingReply2Json(pMsg); char* serialized = cJSON_Print(pJson); - printf("SyncPingReply: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -162,7 +163,7 @@ void test4() { { cJSON* pJson = syncPingReply2Json(pMsg2); char* serialized = cJSON_Print(pJson); - printf("SyncPingReply2: \n%s\n\n", serialized); + printf("\n%s\n\n", serialized); free(serialized); cJSON_Delete(pJson); } @@ -170,6 +171,86 @@ void test4() { syncPingReplyDestroy(pMsg); syncPingReplyDestroy(pMsg2); } + +void test5() { + sTrace("test5: ---- syncRequestVoteSerialize, syncRequestVoteDeserialize"); + + SyncRequestVote* pMsg = syncRequestVoteBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678); + pMsg->destId.vgId = 100; + pMsg->currentTerm = 20; + pMsg->lastLogIndex = 21; + pMsg->lastLogTerm = 22; + + { + cJSON* pJson = syncRequestVote2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + uint32_t bufLen = pMsg->bytes; + char* buf = (char*)malloc(bufLen); + syncRequestVoteSerialize(pMsg, buf, bufLen); + + SyncRequestVote* pMsg2 = (SyncRequestVote*)malloc(pMsg->bytes); + syncRequestVoteDeserialize(buf, bufLen, pMsg2); + + { + cJSON* pJson = syncRequestVote2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncRequestVoteDestroy(pMsg); + syncRequestVoteDestroy(pMsg2); + free(buf); +} + +void test6() { + sTrace("test6: ---- syncRequestVoteReplySerialize, syncRequestVoteReplyDeserialize"); + + SyncRequestVoteReply* pMsg = SyncRequestVoteReplyBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678); + pMsg->destId.vgId = 100; + pMsg->term = 20; + pMsg->voteGranted = 1; + + { + cJSON* pJson = syncRequestVoteReply2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + uint32_t bufLen = pMsg->bytes; + char* buf = (char*)malloc(bufLen); + syncRequestVoteReplySerialize(pMsg, buf, bufLen); + + SyncRequestVoteReply* pMsg2 = (SyncRequestVoteReply*)malloc(pMsg->bytes); + syncRequestVoteReplyDeserialize(buf, bufLen, pMsg2); + + { + cJSON* pJson = syncRequestVoteReply2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncRequestVoteReplyDestroy(pMsg); + syncRequestVoteReplyDestroy(pMsg2); + free(buf); +} + int main() { // taosInitLog((char*)"syncPingTest.log", 100000, 10); tsAsyncLog = 0; @@ -179,6 +260,8 @@ int main() { test2(); test3(); test4(); + test5(); + test6(); return 0; } From aeb94af5e0b382e2ca29db907de5c6c78c649bf3 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 3 Mar 2022 16:15:18 +0800 Subject: [PATCH 11/26] sync encode/decode --- source/libs/sync/inc/syncMessage.h | 20 ++ source/libs/sync/src/syncMessage.c | 176 ++++++++++++++++ source/libs/sync/test/syncEncodeTest.cpp | 244 ++++++++++++++++++++++- 3 files changed, 439 insertions(+), 1 deletion(-) diff --git a/source/libs/sync/inc/syncMessage.h b/source/libs/sync/inc/syncMessage.h index a51567d1dd..3057e23bc2 100644 --- a/source/libs/sync/inc/syncMessage.h +++ b/source/libs/sync/inc/syncMessage.h @@ -158,6 +158,18 @@ typedef struct SyncAppendEntries { char data[]; } SyncAppendEntries; +#define SYNC_APPEND_ENTRIES_FIX_LEN \ + (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(SyncIndex) + sizeof(SyncTerm) + \ + sizeof(SyncIndex) + sizeof(uint32_t)) + +SyncAppendEntries* syncAppendEntriesBuild(uint32_t dataLen); +void syncAppendEntriesDestroy(SyncAppendEntries* pMsg); +void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen); +void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg); +void syncAppendEntries2RpcMsg(const SyncAppendEntries* pMsg, SRpcMsg* pRpcMsg); +void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg); +cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg); + // --------------------------------------------- typedef struct SyncAppendEntriesReply { uint32_t bytes; @@ -169,6 +181,14 @@ typedef struct SyncAppendEntriesReply { SyncIndex matchIndex; } SyncAppendEntriesReply; +SyncAppendEntriesReply* syncAppendEntriesReplyBuild(); +void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg); +void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen); +void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg); +void syncAppendEntriesReply2RpcMsg(const SyncAppendEntriesReply* pMsg, SRpcMsg* pRpcMsg); +void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesReply* pMsg); +cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg); + #ifdef __cplusplus } #endif diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c index ac3f550e3e..4c44b4691c 100644 --- a/source/libs/sync/src/syncMessage.c +++ b/source/libs/sync/src/syncMessage.c @@ -381,4 +381,180 @@ cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg) { cJSON* pJson = cJSON_CreateObject(); cJSON_AddItemToObject(pJson, "SyncRequestVoteReply", pRoot); return pJson; +} + +// ---- message process SyncAppendEntries---- +SyncAppendEntries* syncAppendEntriesBuild(uint32_t dataLen) { + uint32_t bytes = SYNC_APPEND_ENTRIES_FIX_LEN + dataLen; + SyncAppendEntries* pMsg = malloc(bytes); + memset(pMsg, 0, bytes); + pMsg->bytes = bytes; + pMsg->msgType = SYNC_APPEND_ENTRIES; + pMsg->dataLen = dataLen; +} + +void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) { + if (pMsg != NULL) { + free(pMsg); + } +} + +void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) { + assert(pMsg->bytes <= bufLen); + memcpy(buf, pMsg, pMsg->bytes); +} + +void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) { + memcpy(pMsg, buf, len); + assert(len == pMsg->bytes); + assert(pMsg->bytes == SYNC_APPEND_ENTRIES_FIX_LEN + pMsg->dataLen); +} + +void syncAppendEntries2RpcMsg(const SyncAppendEntries* pMsg, SRpcMsg* pRpcMsg) { + memset(pRpcMsg, 0, sizeof(*pRpcMsg)); + pRpcMsg->msgType = pMsg->msgType; + pRpcMsg->contLen = pMsg->bytes; + pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + syncAppendEntriesSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen); +} + +void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg) { + syncAppendEntriesDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg); +} + +cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg) { + char u64buf[128]; + + cJSON* pRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); + cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); + + cJSON* pSrcId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); + { + uint64_t u64 = pMsg->srcId.addr; + cJSON* pTmp = pSrcId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId); + cJSON_AddItemToObject(pRoot, "srcId", pSrcId); + + cJSON* pDestId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr); + cJSON_AddStringToObject(pDestId, "addr", u64buf); + { + uint64_t u64 = pMsg->destId.addr; + cJSON* pTmp = pDestId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId); + cJSON_AddItemToObject(pRoot, "destId", pDestId); + + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->prevLogIndex); + cJSON_AddStringToObject(pRoot, "pre_log_index", u64buf); + + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->prevLogTerm); + cJSON_AddStringToObject(pRoot, "pre_log_term", u64buf); + + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->commitIndex); + cJSON_AddStringToObject(pRoot, "commit_index", u64buf); + + cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen); + cJSON_AddStringToObject(pRoot, "data", pMsg->data); + + cJSON* pJson = cJSON_CreateObject(); + cJSON_AddItemToObject(pJson, "SyncAppendEntries", pRoot); + return pJson; +} + +// ---- message process SyncAppendEntriesReply---- +SyncAppendEntriesReply* syncAppendEntriesReplyBuild() { + uint32_t bytes = sizeof(SyncAppendEntriesReply); + SyncAppendEntriesReply* pMsg = malloc(bytes); + memset(pMsg, 0, bytes); + pMsg->bytes = bytes; + pMsg->msgType = SYNC_APPEND_ENTRIES_REPLY; +} + +void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) { + if (pMsg != NULL) { + free(pMsg); + } +} + +void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) { + assert(pMsg->bytes <= bufLen); + memcpy(buf, pMsg, pMsg->bytes); +} + +void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) { + memcpy(pMsg, buf, len); + assert(len == pMsg->bytes); +} + +void syncAppendEntriesReply2RpcMsg(const SyncAppendEntriesReply* pMsg, SRpcMsg* pRpcMsg) { + memset(pRpcMsg, 0, sizeof(*pRpcMsg)); + pRpcMsg->msgType = pMsg->msgType; + pRpcMsg->contLen = pMsg->bytes; + pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + syncAppendEntriesReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen); +} + +void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesReply* pMsg) { + syncAppendEntriesReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg); +} + +cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg) { + char u64buf[128]; + + cJSON* pRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes); + cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType); + + cJSON* pSrcId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr); + cJSON_AddStringToObject(pSrcId, "addr", u64buf); + { + uint64_t u64 = pMsg->srcId.addr; + cJSON* pTmp = pSrcId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId); + cJSON_AddItemToObject(pRoot, "srcId", pSrcId); + + cJSON* pDestId = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr); + cJSON_AddStringToObject(pDestId, "addr", u64buf); + { + uint64_t u64 = pMsg->destId.addr; + cJSON* pTmp = pDestId; + char host[128]; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pTmp, "addr_host", host); + cJSON_AddNumberToObject(pTmp, "addr_port", port); + } + cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId); + cJSON_AddItemToObject(pRoot, "destId", pDestId); + + cJSON_AddNumberToObject(pRoot, "success", pMsg->success); + snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->matchIndex); + cJSON_AddStringToObject(pRoot, "match_index", u64buf); + + cJSON* pJson = cJSON_CreateObject(); + cJSON_AddItemToObject(pJson, "SyncAppendEntriesReply", pRoot); + return pJson; } \ No newline at end of file diff --git a/source/libs/sync/test/syncEncodeTest.cpp b/source/libs/sync/test/syncEncodeTest.cpp index e0179b2c8b..6197621051 100644 --- a/source/libs/sync/test/syncEncodeTest.cpp +++ b/source/libs/sync/test/syncEncodeTest.cpp @@ -15,6 +15,7 @@ void logTest() { } #define PING_MSG_LEN 20 +#define APPEND_ENTRIES_VALUE_LEN 32 void test1() { sTrace("test1: ---- syncPingSerialize, syncPingDeserialize"); @@ -213,7 +214,45 @@ void test5() { } void test6() { - sTrace("test6: ---- syncRequestVoteReplySerialize, syncRequestVoteReplyDeserialize"); + sTrace("test6: ---- syncRequestVote2RpcMsg, syncRequestVoteFromRpcMsg"); + + SyncRequestVote* pMsg = syncRequestVoteBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678); + pMsg->destId.vgId = 100; + pMsg->currentTerm = 20; + pMsg->lastLogIndex = 21; + pMsg->lastLogTerm = 22; + + { + cJSON* pJson = syncRequestVote2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + SRpcMsg rpcMsg; + syncRequestVote2RpcMsg(pMsg, &rpcMsg); + SyncRequestVote* pMsg2 = (SyncRequestVote*)malloc(pMsg->bytes); + syncRequestVoteFromRpcMsg(&rpcMsg, pMsg2); + rpcFreeCont(rpcMsg.pCont); + + { + cJSON* pJson = syncRequestVote2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncRequestVoteDestroy(pMsg); + syncRequestVoteDestroy(pMsg2); +} + +void test7() { + sTrace("test7: ---- syncRequestVoteReplySerialize, syncRequestVoteReplyDeserialize"); SyncRequestVoteReply* pMsg = SyncRequestVoteReplyBuild(); pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234); @@ -251,6 +290,203 @@ void test6() { free(buf); } +void test8() { + sTrace("test8: ---- syncRequestVoteReply2RpcMsg, syncRequestVoteReplyFromRpcMsg"); + + SyncRequestVoteReply* pMsg = SyncRequestVoteReplyBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678); + pMsg->destId.vgId = 100; + pMsg->term = 20; + pMsg->voteGranted = 1; + + { + cJSON* pJson = syncRequestVoteReply2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + SRpcMsg rpcMsg; + syncRequestVoteReply2RpcMsg(pMsg, &rpcMsg); + SyncRequestVoteReply* pMsg2 = (SyncRequestVoteReply*)malloc(pMsg->bytes); + syncRequestVoteReplyFromRpcMsg(&rpcMsg, pMsg2); + rpcFreeCont(rpcMsg.pCont); + + { + cJSON* pJson = syncRequestVoteReply2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncRequestVoteReplyDestroy(pMsg); + syncRequestVoteReplyDestroy(pMsg2); +} + +void test9() { + sTrace("test9: ---- syncAppendEntriesSerialize, syncAppendEntriesDeserialize"); + + char msg[APPEND_ENTRIES_VALUE_LEN]; + snprintf(msg, sizeof(msg), "%s", "test value"); + SyncAppendEntries* pMsg = syncAppendEntriesBuild(APPEND_ENTRIES_VALUE_LEN); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222); + pMsg->destId.vgId = 100; + pMsg->prevLogIndex = 55; + pMsg->prevLogTerm = 66; + pMsg->commitIndex = 77; + memcpy(pMsg->data, msg, APPEND_ENTRIES_VALUE_LEN); + + { + cJSON* pJson = syncAppendEntries2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + uint32_t bufLen = pMsg->bytes; + char* buf = (char*)malloc(bufLen); + syncAppendEntriesSerialize(pMsg, buf, bufLen); + + SyncAppendEntries* pMsg2 = (SyncAppendEntries*)malloc(pMsg->bytes); + syncAppendEntriesDeserialize(buf, bufLen, pMsg2); + + { + cJSON* pJson = syncAppendEntries2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncAppendEntriesDestroy(pMsg); + syncAppendEntriesDestroy(pMsg2); + free(buf); +} + +void test10() { + sTrace("test10: ---- syncAppendEntries2RpcMsg, syncAppendEntriesFromRpcMsg"); + + char msg[APPEND_ENTRIES_VALUE_LEN]; + snprintf(msg, sizeof(msg), "%s", "test value"); + SyncAppendEntries* pMsg = syncAppendEntriesBuild(APPEND_ENTRIES_VALUE_LEN); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222); + pMsg->destId.vgId = 100; + pMsg->prevLogIndex = 55; + pMsg->prevLogTerm = 66; + pMsg->commitIndex = 77; + memcpy(pMsg->data, msg, APPEND_ENTRIES_VALUE_LEN); + + { + cJSON* pJson = syncAppendEntries2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + SRpcMsg rpcMsg; + syncAppendEntries2RpcMsg(pMsg, &rpcMsg); + SyncAppendEntries* pMsg2 = (SyncAppendEntries*)malloc(pMsg->bytes); + syncAppendEntriesFromRpcMsg(&rpcMsg, pMsg2); + rpcFreeCont(rpcMsg.pCont); + + { + cJSON* pJson = syncAppendEntries2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncAppendEntriesDestroy(pMsg); + syncAppendEntriesDestroy(pMsg2); +} + +void test11() { + sTrace("test11: ---- syncAppendEntriesReplySerialize, syncAppendEntriesReplyDeserialize"); + + SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222); + pMsg->destId.vgId = 100; + pMsg->success = 1; + pMsg->matchIndex = 23; + + { + cJSON* pJson = syncAppendEntriesReply2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + uint32_t bufLen = pMsg->bytes; + char* buf = (char*)malloc(bufLen); + syncAppendEntriesReplySerialize(pMsg, buf, bufLen); + + SyncAppendEntriesReply* pMsg2 = (SyncAppendEntriesReply*)malloc(pMsg->bytes); + syncAppendEntriesReplyDeserialize(buf, bufLen, pMsg2); + + { + cJSON* pJson = syncAppendEntriesReply2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncAppendEntriesReplyDestroy(pMsg); + syncAppendEntriesReplyDestroy(pMsg2); + free(buf); +} + +void test12() { + sTrace("test12: ---- syncAppendEntriesReply2RpcMsg, syncAppendEntriesReplyFromRpcMsg"); + + SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyBuild(); + pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111); + pMsg->srcId.vgId = 100; + pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222); + pMsg->destId.vgId = 100; + pMsg->success = 1; + pMsg->matchIndex = 23; + + { + cJSON* pJson = syncAppendEntriesReply2Json(pMsg); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + SRpcMsg rpcMsg; + syncAppendEntriesReply2RpcMsg(pMsg, &rpcMsg); + SyncAppendEntriesReply* pMsg2 = (SyncAppendEntriesReply*)malloc(pMsg->bytes); + syncAppendEntriesReplyFromRpcMsg(&rpcMsg, pMsg2); + rpcFreeCont(rpcMsg.pCont); + + { + cJSON* pJson = syncAppendEntriesReply2Json(pMsg2); + char* serialized = cJSON_Print(pJson); + printf("\n%s\n\n", serialized); + free(serialized); + cJSON_Delete(pJson); + } + + syncAppendEntriesReplyDestroy(pMsg); + syncAppendEntriesReplyDestroy(pMsg2); +} + int main() { // taosInitLog((char*)"syncPingTest.log", 100000, 10); tsAsyncLog = 0; @@ -262,6 +498,12 @@ int main() { test4(); test5(); test6(); + test7(); + test8(); + test9(); + test10(); + test11(); + test12(); return 0; } From cc82966e2e2281a89e3436c47b6e6bfc92f3f044 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 16:37:37 +0800 Subject: [PATCH 12/26] monitor --- include/libs/monitor/monitor.h | 21 ++- source/libs/monitor/src/monitor.c | 56 +++--- source/libs/monitor/test/monTest.cpp | 255 ++++++++++++++++++++++++++- 3 files changed, 286 insertions(+), 46 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 090fea9dab..b3b6091b95 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -23,6 +23,11 @@ extern "C" { #endif +#define MON_STATUS_LEN 8 +#define MON_ROLE_LEN 9 +#define MON_VER_LEN 12 +#define MON_LOG_LEN 1024 + typedef struct { int32_t dnode_id; char dnode_ep[TSDB_EP_LEN]; @@ -31,19 +36,19 @@ typedef struct { typedef struct { int32_t dnode_id; char dnode_ep[TSDB_EP_LEN]; - char status[8]; + char status[MON_STATUS_LEN]; } SMonDnodeDesc; typedef struct { int32_t mnode_id; char mnode_ep[TSDB_EP_LEN]; - char role[8]; + char role[MON_ROLE_LEN]; } SMonMnodeDesc; typedef struct { char first_ep[TSDB_EP_LEN]; int32_t first_ep_dnode_id; - char version[12]; + char version[MON_VER_LEN]; float master_uptime; // day int32_t monitor_interval; // sec int32_t vgroups_total; @@ -57,18 +62,18 @@ typedef struct { typedef struct { int32_t dnode_id; - char vnode_role[8]; + char vnode_role[MON_ROLE_LEN]; } SMonVnodeDesc; typedef struct { int32_t vgroup_id; + char database_name[TSDB_DB_NAME_LEN]; + int32_t tables_num; + char status[MON_STATUS_LEN]; SMonVnodeDesc vnodes[TSDB_MAX_REPLICA]; } SMonVgroupDesc; typedef struct { - char database_name[TSDB_DB_NAME_LEN]; - int32_t tables_num; - char status[10]; SArray *vgroups; // array of SMonVgroupDesc } SMonVgroupInfo; @@ -124,7 +129,7 @@ typedef struct { typedef struct { int64_t ts; int8_t level; - char content[1024]; + char content[MON_LOG_LEN]; } SMonLogItem; typedef struct SMonInfo SMonInfo; diff --git a/source/libs/monitor/src/monitor.c b/source/libs/monitor/src/monitor.c index 7ba65b87b0..ecf9da218b 100644 --- a/source/libs/monitor/src/monitor.c +++ b/source/libs/monitor/src/monitor.c @@ -23,7 +23,7 @@ static SMonitor tsMonitor = {0}; int32_t monInit(const SMonCfg *pCfg) { - tsMonitor.logs = taosArrayInit(16, sizeof(SMonInfo)); + tsMonitor.logs = taosArrayInit(16, sizeof(SMonLogItem)); if (tsMonitor.logs == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return -1; @@ -44,7 +44,7 @@ void monCleanup() { void monAddLogItem(SMonLogItem *pItem) { taosWLockLatch(&tsMonitor.lock); int32_t size = taosArrayGetSize(tsMonitor.logs); - if (size > tsMonitor.maxLogs) { + if (size >= tsMonitor.maxLogs) { uInfo("too many logs for monitor"); } else { taosArrayPush(tsMonitor.logs, pItem); @@ -118,9 +118,9 @@ void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { if (pDnodeJson == NULL) continue; SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); - if (tjsonAddDoubleToObject(pDnodesJson, "dnode_id", pDnodeDesc->dnode_id) != 0) tjsonDelete(pDnodeJson); - if (tjsonAddStringToObject(pDnodesJson, "dnode_ep", pDnodeDesc->dnode_ep) != 0) tjsonDelete(pDnodeJson); - if (tjsonAddStringToObject(pDnodesJson, "status", pDnodeDesc->status) != 0) tjsonDelete(pDnodeJson); + tjsonAddDoubleToObject(pDnodeJson, "dnode_id", pDnodeDesc->dnode_id); + tjsonAddStringToObject(pDnodeJson, "dnode_ep", pDnodeDesc->dnode_ep); + tjsonAddStringToObject(pDnodeJson, "status", pDnodeDesc->status); if (tjsonAddItemToArray(pDnodesJson, pDnodeJson) != 0) tjsonDelete(pDnodeJson); } @@ -133,48 +133,44 @@ void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { if (pMnodeJson == NULL) continue; SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->dnodes, i); - if (tjsonAddDoubleToObject(pMnodesJson, "mnode_id", pMnodeDesc->mnode_id) != 0) tjsonDelete(pMnodeJson); - if (tjsonAddStringToObject(pMnodesJson, "mnode_ep", pMnodeDesc->mnode_ep) != 0) tjsonDelete(pMnodeJson); - if (tjsonAddStringToObject(pMnodesJson, "role", pMnodeDesc->role) != 0) tjsonDelete(pMnodeJson); + tjsonAddDoubleToObject(pMnodeJson, "mnode_id", pMnodeDesc->mnode_id); + tjsonAddStringToObject(pMnodeJson, "mnode_ep", pMnodeDesc->mnode_ep); + tjsonAddStringToObject(pMnodeJson, "role", pMnodeDesc->role); if (tjsonAddItemToArray(pMnodesJson, pMnodeJson) != 0) tjsonDelete(pMnodeJson); } } void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) { - SJson *pJson = tjsonCreateObject(); + SJson *pJson = tjsonAddArrayToObject(pMonitor->pJson, "vgroup_infos"); if (pJson == NULL) return; - if (tjsonAddItemToObject(pMonitor->pJson, "vgroup_infos", pJson) != 0) { - tjsonDelete(pJson); - return; - } - - tjsonAddStringToObject(pJson, "database_name", pInfo->database_name); - tjsonAddDoubleToObject(pJson, "tables_num", pInfo->tables_num); - tjsonAddStringToObject(pJson, "status", pInfo->status); - - SJson *pVgroupsJson = tjsonAddArrayToObject(pJson, "vgroups"); - if (pVgroupsJson == NULL) return; for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) { SJson *pVgroupJson = tjsonCreateObject(); if (pVgroupJson == NULL) continue; + if (tjsonAddItemToArray(pJson, pVgroupJson) != 0) { + tjsonDelete(pVgroupJson); + continue; + } SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i); - if (tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id) != 0) tjsonDelete(pVgroupJson); + tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id); + tjsonAddStringToObject(pVgroupJson, "database_name", pVgroupDesc->database_name); + tjsonAddDoubleToObject(pVgroupJson, "tables_num", pVgroupDesc->tables_num); + tjsonAddStringToObject(pVgroupJson, "status", pVgroupDesc->status); SJson *pVnodesJson = tjsonAddArrayToObject(pVgroupJson, "vnodes"); - if (pVnodesJson == NULL) tjsonDelete(pVgroupJson); + if (pVnodesJson == NULL) continue; for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) { SMonVnodeDesc *pVnodeDesc = &pVgroupDesc->vnodes[j]; - if (pVnodeDesc[j].dnode_id <= 0) continue; + if (pVnodeDesc->dnode_id <= 0) continue; SJson *pVnodeJson = tjsonCreateObject(); if (pVnodeJson == NULL) continue; - if (tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id) != 0) tjsonDelete(pVnodeJson); - if (tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role) != 0) tjsonDelete(pVnodeJson); + tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id); + tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role); if (tjsonAddItemToArray(pVnodesJson, pVnodeJson) != 0) tjsonDelete(pVnodeJson); } @@ -235,7 +231,7 @@ void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) { void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { SJson *pJson = tjsonCreateObject(); if (pJson == NULL) return; - if (tjsonAddItemToObject(pMonitor->pJson, "disks_infos", pJson) != 0) { + if (tjsonAddItemToObject(pMonitor->pJson, "disk_infos", pJson) != 0) { tjsonDelete(pJson); return; } @@ -261,7 +257,6 @@ void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { if (pLogdirJson == NULL) return; if (tjsonAddItemToObject(pJson, "logdir", pLogdirJson) != 0) return; tjsonAddStringToObject(pLogdirJson, "name", pInfo->logdir.name); - tjsonAddDoubleToObject(pLogdirJson, "level", pInfo->logdir.level); tjsonAddDoubleToObject(pLogdirJson, "avail", pInfo->logdir.size.avail); tjsonAddDoubleToObject(pLogdirJson, "used", pInfo->logdir.size.used); tjsonAddDoubleToObject(pLogdirJson, "total", pInfo->logdir.size.total); @@ -270,7 +265,6 @@ void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { if (pTempdirJson == NULL) return; if (tjsonAddItemToObject(pJson, "tempdir", pTempdirJson) != 0) return; tjsonAddStringToObject(pTempdirJson, "name", pInfo->tempdir.name); - tjsonAddDoubleToObject(pTempdirJson, "level", pInfo->tempdir.level); tjsonAddDoubleToObject(pTempdirJson, "avail", pInfo->tempdir.size.avail); tjsonAddDoubleToObject(pTempdirJson, "used", pInfo->tempdir.size.used); tjsonAddDoubleToObject(pTempdirJson, "total", pInfo->tempdir.size.total); @@ -296,9 +290,9 @@ static void monSetLogInfo(SMonInfo *pMonitor) { char buf[40] = {0}; taosFormatUtcTime(buf, sizeof(buf), pLogItem->ts, TSDB_TIME_PRECISION_MILLI); - if (tjsonAddStringToObject(pLogItem, "ts", buf) != 0) tjsonDelete(pLogJson); - if (tjsonAddDoubleToObject(pLogItem, "level", pLogItem->level) != 0) tjsonDelete(pLogJson); - if (tjsonAddStringToObject(pLogItem, "content", pLogItem->content) != 0) tjsonDelete(pLogJson); + tjsonAddStringToObject(pLogJson, "ts", buf); + tjsonAddDoubleToObject(pLogJson, "level", pLogItem->level); + tjsonAddStringToObject(pLogJson, "content", pLogItem->content); if (tjsonAddItemToArray(pLogsJson, pLogJson) != 0) tjsonDelete(pLogJson); } diff --git a/source/libs/monitor/test/monTest.cpp b/source/libs/monitor/test/monTest.cpp index a1805d0c9c..ad48ed5407 100644 --- a/source/libs/monitor/test/monTest.cpp +++ b/source/libs/monitor/test/monTest.cpp @@ -13,21 +13,262 @@ #include "os.h" #include "monitor.h" +#include "tglobal.h" class MonitorTest : public ::testing::Test { protected: - static void SetUpTestSuite() { root = "/tmp/monTest"; } - static void TearDownTestSuite() {} + static void SetUpTestSuite() { + SMonCfg cfg; + cfg.maxLogs = 2; + cfg.port = 80; + cfg.server = "localhost"; + monInit(&cfg); + } + + static void TearDownTestSuite() { monCleanup(); } public: void SetUp() override {} void TearDown() override {} - static const char *root; + void GetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo); + void GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo); + void GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo); + void GetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo); + void GetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo); + void GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo); + void AddLogInfo1(); + void AddLogInfo2(); }; -const char *MonitorTest::root; - -TEST_F(MonitorTest, 01_Open_Close) { - +void MonitorTest::GetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) { + pInfo->dnode_id = 1; + strcpy(pInfo->dnode_ep, "localhost"); +} + +void MonitorTest::GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) { + strcpy(pInfo->first_ep, "localhost:6030"); + pInfo->first_ep_dnode_id = 1; + strcpy(pInfo->version, "3.0.0.0"); + pInfo->master_uptime = 1; + pInfo->monitor_interval = 2; + pInfo->vgroups_total = 3; + pInfo->vgroups_alive = 43; + pInfo->vnodes_total = 5; + pInfo->vnodes_alive = 6; + pInfo->connections_total = 7; + + pInfo->dnodes = taosArrayInit(4, sizeof(SMonDnodeDesc)); + SMonDnodeDesc d1 = {0}; + d1.dnode_id = 1; + strcpy(d1.dnode_ep, "localhost:6030"); + strcpy(d1.status, "ready"); + taosArrayPush(pInfo->dnodes, &d1); + SMonDnodeDesc d2 = {0}; + d2.dnode_id = 2; + strcpy(d2.dnode_ep, "localhost:7030"); + strcpy(d2.status, "offline"); + taosArrayPush(pInfo->dnodes, &d2); + + pInfo->mnodes = taosArrayInit(4, sizeof(SMonMnodeDesc)); + SMonMnodeDesc m1 = {0}; + m1.mnode_id = 1; + strcpy(m1.mnode_ep, "localhost:6030"); + strcpy(m1.role, "master"); + taosArrayPush(pInfo->mnodes, &m1); + SMonMnodeDesc m2 = {0}; + m2.mnode_id = 2; + strcpy(m2.mnode_ep, "localhost:7030"); + strcpy(m2.role, "unsynced"); + taosArrayPush(pInfo->mnodes, &m2); +} + +void MonitorTest::GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) { + pInfo->vgroups = taosArrayInit(4, sizeof(SMonVgroupDesc)); + + SMonVgroupDesc vg1 = {0}; + vg1.vgroup_id = 1; + strcpy(vg1.database_name, "d1"); + vg1.tables_num = 4; + strcpy(vg1.status, "ready"); + vg1.vnodes[0].dnode_id = 1; + strcpy(vg1.vnodes[0].vnode_role, "master"); + vg1.vnodes[1].dnode_id = 2; + strcpy(vg1.vnodes[1].vnode_role, "slave"); + taosArrayPush(pInfo->vgroups, &vg1); + + SMonVgroupDesc vg2 = {0}; + vg2.vgroup_id = 2; + strcpy(vg2.database_name, "d2"); + vg2.tables_num = 5; + strcpy(vg2.status, "offline"); + vg2.vnodes[0].dnode_id = 1; + strcpy(vg2.vnodes[0].vnode_role, "master"); + vg2.vnodes[1].dnode_id = 2; + strcpy(vg2.vnodes[1].vnode_role, "unsynced"); + taosArrayPush(pInfo->vgroups, &vg2); + + SMonVgroupDesc vg3 = {0}; + vg3.vgroup_id = 3; + strcpy(vg3.database_name, "d3"); + vg3.tables_num = 6; + strcpy(vg3.status, "ready"); + vg3.vnodes[0].dnode_id = 1; + strcpy(vg3.vnodes[0].vnode_role, "master"); + taosArrayPush(pInfo->vgroups, &vg3); +} + +void MonitorTest::GetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) { + pInfo->expire_time = 1234567; + pInfo->timeseries_total = 234567; + pInfo->timeseries_used = 34567; +} + +void MonitorTest::GetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) { + pInfo->uptime = 1.2; + pInfo->cpu_engine = 2.1; + pInfo->cpu_system = 2.1; + pInfo->cpu_cores = 2; + pInfo->mem_engine = 3.1; + pInfo->mem_system = 3.2; + pInfo->mem_total = 3.3; + pInfo->disk_engine = 4.1; + pInfo->disk_used = 4.2; + pInfo->disk_total = 4.3; + pInfo->net_in = 5.1; + pInfo->net_out = 5.2; + pInfo->io_read = 6.1; + pInfo->io_write = 6.2; + pInfo->io_read_disk = 7.1; + pInfo->io_write_disk = 7.2; + pInfo->req_select = 8; + pInfo->req_select_rate = 8.1; + pInfo->req_insert = 9; + pInfo->req_insert_success = 10; + pInfo->req_insert_rate = 10.1; + pInfo->req_insert_batch = 11; + pInfo->req_insert_batch_success = 12; + pInfo->req_insert_batch_rate = 12.3; + pInfo->errors = 4; + pInfo->vnodes_num = 5; + pInfo->masters = 6; + pInfo->has_mnode = 1; +} + +void MonitorTest::GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) { + pInfo->datadirs = taosArrayInit(2, sizeof(SMonDiskDesc)); + SMonDiskDesc d1 = {0}; + strcpy(d1.name, "/t1/d1/d"); + d1.level = 0; + d1.size.avail = 11; + d1.size.total = 12; + d1.size.used = 13; + taosArrayPush(pInfo->datadirs, &d1); + + SMonDiskDesc d2 = {0}; + strcpy(d2.name, "/t2d2/d"); + d2.level = 2; + d2.size.avail = 21; + d2.size.total = 22; + d2.size.used = 23; + taosArrayPush(pInfo->datadirs, &d2); + + SMonDiskDesc d3 = {0}; + strcpy(d3.name, "/t3/d3/d"); + d3.level = 3; + d3.size.avail = 31; + d3.size.total = 32; + d3.size.used = 33; + taosArrayPush(pInfo->datadirs, &d3); + + strcpy(pInfo->logdir.name, "/log/dir/d"); + pInfo->logdir.size.avail = 41; + pInfo->logdir.size.total = 42; + pInfo->logdir.size.used = 43; + + strcpy(pInfo->tempdir.name, "/data/dir/d"); + pInfo->tempdir.size.avail = 51; + pInfo->tempdir.size.total = 52; + pInfo->tempdir.size.used = 53; +} + +void MonitorTest::AddLogInfo1() { + SMonLogItem log1 = {0}; + log1.ts = taosGetTimestampMs(); + log1.level = 1; + strcpy(log1.content, "1 -------------------------- a"); + monAddLogItem(&log1); + + SMonLogItem log2 = {0}; + log2.ts = taosGetTimestampMs(); + log2.level = 1; + strcpy(log2.content, "1 ------------------------ b"); + monAddLogItem(&log2); + + SMonLogItem log3 = {0}; + log3.ts = taosGetTimestampMs(); + log3.level = 1; + strcpy(log3.content, "1 ------- c"); + monAddLogItem(&log3); +} + +void MonitorTest::AddLogInfo2() { + SMonLogItem log1; + log1.ts = taosGetTimestampMs(); + log1.level = 01; + strcpy(log1.content, "2 ------- a"); + monAddLogItem(&log1); + + SMonLogItem log2; + log2.ts = taosGetTimestampMs(); + log2.level = 0; + strcpy(log2.content, "2 ------- b"); + monAddLogItem(&log2); +} + +TEST_F(MonitorTest, 01_Full) { + AddLogInfo1(); + + SMonInfo *pMonitor = monCreateMonitorInfo(); + if (pMonitor == NULL) return; + + SMonBasicInfo basicInfo = {0}; + GetBasicInfo(pMonitor, &basicInfo); + monSetBasicInfo(pMonitor, &basicInfo); + + SMonClusterInfo clusterInfo = {0}; + SMonVgroupInfo vgroupInfo = {0}; + SMonGrantInfo grantInfo = {0}; + GetClusterInfo(pMonitor, &clusterInfo); + GetVgroupInfo(pMonitor, &vgroupInfo); + GetGrantInfo(pMonitor, &grantInfo); + monSetClusterInfo(pMonitor, &clusterInfo); + monSetVgroupInfo(pMonitor, &vgroupInfo); + monSetGrantInfo(pMonitor, &grantInfo); + + SMonDnodeInfo dnodeInfo = {0}; + GetDnodeInfo(pMonitor, &dnodeInfo); + monSetDnodeInfo(pMonitor, &dnodeInfo); + + SMonDiskInfo diskInfo = {0}; + GetDiskInfo(pMonitor, &diskInfo); + monSetDiskInfo(pMonitor, &diskInfo); + + monSendReport(pMonitor); + monCleanupMonitorInfo(pMonitor); + + taosArrayDestroy(clusterInfo.dnodes); + taosArrayDestroy(clusterInfo.mnodes); + taosArrayDestroy(vgroupInfo.vgroups); + taosArrayDestroy(diskInfo.datadirs); +} + +TEST_F(MonitorTest, 02_Log) { + AddLogInfo2(); + + SMonInfo *pMonitor = monCreateMonitorInfo(); + if (pMonitor == NULL) return; + + monSendReport(pMonitor); + monCleanupMonitorInfo(pMonitor); } From 6cfff92b21d0d38e7e9e155402f1b40e62a7f522 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 17:11:24 +0800 Subject: [PATCH 13/26] get tfs monitor info --- include/libs/tfs/tfs.h | 9 +++++++++ source/dnode/mgmt/impl/inc/dndEnv.h | 5 ++--- source/dnode/mgmt/impl/src/dndEnv.c | 9 ++++++++- source/dnode/mgmt/impl/src/dndMgmt.c | 15 ++++++++++----- source/libs/tfs/CMakeLists.txt | 2 +- source/libs/tfs/src/tfs.c | 21 +++++++++++++++++++++ 6 files changed, 51 insertions(+), 10 deletions(-) diff --git a/include/libs/tfs/tfs.h b/include/libs/tfs/tfs.h index b6d10c81bf..1b41da33bb 100644 --- a/include/libs/tfs/tfs.h +++ b/include/libs/tfs/tfs.h @@ -17,6 +17,7 @@ #define _TD_TFS_H_ #include "tdef.h" +#include "monitor.h" #ifdef __cplusplus extern "C" { @@ -237,6 +238,14 @@ const STfsFile *tfsReaddir(STfsDir *pDir); */ void tfsClosedir(STfsDir *pDir); +/** + * @brief Get disk info of tfs. + * + * @param pTfs The fs object. + * @param pInfo The info object. + */ +int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo); + #ifdef __cplusplus } #endif diff --git a/source/dnode/mgmt/impl/inc/dndEnv.h b/source/dnode/mgmt/impl/inc/dndEnv.h index 724ba30155..efe54ee1e5 100644 --- a/source/dnode/mgmt/impl/inc/dndEnv.h +++ b/source/dnode/mgmt/impl/inc/dndEnv.h @@ -31,7 +31,7 @@ typedef struct { SDnode *pDnode; STaosQueue *queue; union { - SQWorkerPool pool; + SQWorkerPool pool; SWWorkerPool mpool; }; } SDnodeWorker; @@ -137,8 +137,7 @@ typedef struct SDnode { SStartupReq startup; } SDnode; - -int32_t dndGetDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo); +int32_t dndGetMonitorDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo); #ifdef __cplusplus } diff --git a/source/dnode/mgmt/impl/src/dndEnv.c b/source/dnode/mgmt/impl/src/dndEnv.c index ae08d6387c..1cbdf0c1dc 100644 --- a/source/dnode/mgmt/impl/src/dndEnv.c +++ b/source/dnode/mgmt/impl/src/dndEnv.c @@ -324,4 +324,11 @@ void dndCleanup() { dInfo("dnode env is cleaned up"); } -int32_t dndGetDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo) { return 0; } \ No newline at end of file +int32_t dndGetMonitorDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo) { + tstrncpy(pInfo->logdir.name, tsLogDir, sizeof(pInfo->logdir.name)); + pInfo->logdir.size = tsLogSpace.size; + tstrncpy(pInfo->tempdir.name, tsTempDir, sizeof(pInfo->tempdir.name)); + pInfo->tempdir.size = tsTempSpace.size; + + return tfsGetMonitorInfo(pDnode->pTfs, pInfo); +} \ No newline at end of file diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index 268ed7e362..70f5060ead 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -474,13 +474,13 @@ void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) { rpcSendResponse(&rpcRsp); } -static int32_t dndGetBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { +static int32_t dndGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->dnode_id = dndGetDnodeId(pDnode); tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN); return 0; } -static int32_t dndGetDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { return 0; } +static int32_t dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { return 0; } static void dndSendMonitorReport(SDnode *pDnode) { if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; @@ -490,7 +490,7 @@ static void dndSendMonitorReport(SDnode *pDnode) { if (pMonitor == NULL) return; SMonBasicInfo basicInfo = {0}; - if (dndGetBasicInfo(pDnode, &basicInfo) == 0) { + if (dndGetMonitorBasicInfo(pDnode, &basicInfo) == 0) { monSetBasicInfo(pMonitor, &basicInfo); } @@ -504,15 +504,20 @@ static void dndSendMonitorReport(SDnode *pDnode) { } SMonDnodeInfo dnodeInfo = {0}; - if (dndGetDnodeInfo(pDnode, &dnodeInfo) == 0) { + if (dndGetMonitorDnodeInfo(pDnode, &dnodeInfo) == 0) { monSetDnodeInfo(pMonitor, &dnodeInfo); } SMonDiskInfo diskInfo = {0}; - if (dndGetDiskInfo(pDnode, &diskInfo) == 0) { + if (dndGetMonitorDiskInfo(pDnode, &diskInfo) == 0) { monSetDiskInfo(pMonitor, &diskInfo); } + taosArrayDestroy(clusterInfo.dnodes); + taosArrayDestroy(clusterInfo.mnodes); + taosArrayDestroy(vgroupInfo.vgroups); + taosArrayDestroy(diskInfo.datadirs); + monSendReport(pMonitor); monCleanupMonitorInfo(pMonitor); } diff --git a/source/libs/tfs/CMakeLists.txt b/source/libs/tfs/CMakeLists.txt index 607ccd4c48..97e02fc8a9 100644 --- a/source/libs/tfs/CMakeLists.txt +++ b/source/libs/tfs/CMakeLists.txt @@ -6,7 +6,7 @@ target_include_directories( PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -target_link_libraries(tfs os util common) +target_link_libraries(tfs os util common monitor) if(${BUILD_TEST}) add_subdirectory(test) diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index f686703643..944e67c863 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -544,3 +544,24 @@ static STfsDisk *tfsNextDisk(STfs *pTfs, SDiskIter *pIter) { return pDisk; } + +int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo) { + pInfo->datadirs = taosArrayInit(32, sizeof(SMonDiskDesc)); + if (pInfo->datadirs == NULL) return -1; + + tfsUpdateSize(pTfs); + + tfsLock(pTfs); + for (int32_t level = 0; level < pTfs->nlevel; level++) { + STfsTier *pTier = &pTfs->tiers[level]; + for (int32_t disk = 0; disk < pTier->ndisk; ++disk) { + STfsDisk *pDisk = pTier->disks[disk]; + SMonDiskDesc dinfo = {0}; + dinfo.size = pDisk->size; + dinfo.level = pDisk->level; + tstrncpy(dinfo.name, pDisk->path, sizeof(dinfo.name)); + taosArrayPush(pInfo->datadirs, &dinfo); + } + } + tfsUnLock(pTfs); +} \ No newline at end of file From 64d224a0d2b5450e221b0136b8a80b8d57184025 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 3 Mar 2022 17:28:00 +0800 Subject: [PATCH 14/26] syncInt --- include/libs/sync/sync.h | 4 +- source/libs/sync/inc/syncInt.h | 72 +++++++++++++++++++----------- source/libs/sync/inc/syncVoteMgr.h | 6 +++ source/libs/sync/src/syncMain.c | 2 +- 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index cd04783dbc..53fad4607a 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -34,9 +34,7 @@ typedef enum { TAOS_SYNC_STATE_FOLLOWER = 0, TAOS_SYNC_STATE_CANDIDATE = 1, TAOS_SYNC_STATE_LEADER = 2, -} ESyncRole; - -typedef ESyncRole ESyncState; +} ESyncState; typedef struct SSyncBuffer { void* data; diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 0901330488..aedb9662b1 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -25,6 +25,7 @@ extern "C" { #include #include "sync.h" #include "taosdef.h" +#include "tglobal.h" #include "tlog.h" #include "ttimer.h" @@ -91,31 +92,61 @@ typedef struct SyncAppendEntriesReply SyncAppendEntriesReply; struct SSyncEnv; typedef struct SSyncEnv SSyncEnv; +struct SRaftStore; +typedef struct SRaftStore SRaftStore; + +struct SVotesGranted; +typedef struct SVotesGranted SVotesGranted; + +struct SVotesResponded; +typedef struct SVotesResponded SVotesResponded; + typedef struct SRaftId { SyncNodeId addr; // typedef uint64_t SyncNodeId; SyncGroupId vgId; // typedef int32_t SyncGroupId; } SRaftId; typedef struct SSyncNode { + // init by SSyncInfo SyncGroupId vgId; SSyncCfg syncCfg; char path[TSDB_FILENAME_LEN]; - SSyncFSM* pFsm; - - // passed from outside - void* rpcClient; + void* rpcClient; int32_t (*FpSendMsg)(void* rpcClient, const SEpSet* pEpSet, SRpcMsg* pMsg); + // init internal + SNodeInfo me; + int32_t peersNum; + SNodeInfo peers[TSDB_MAX_REPLICA]; + + // raft algorithm + SSyncFSM* pFsm; + SRaftId raftId; + SRaftId peersId[TSDB_MAX_REPLICA]; + int32_t replicaNum; + int32_t quorum; + + // life cycle int32_t refCount; int64_t rid; - SNodeInfo me; - SNodeInfo peers[TSDB_MAX_REPLICA]; - int32_t peersNum; + // tla+ server vars + ESyncState state; + SRaftStore* pRaftStore; - ESyncRole role; - SRaftId raftId; + // tla+ candidate vars + SVotesGranted* pVotesGranted; + SVotesResponded* pVotesResponded; + // tla+ leader vars + SHashObj* pNextIndex; + SHashObj* pMatchIndex; + + // tla+ log vars + SSyncLogStore* pLogStore; + SyncIndex commitIndex; + + // timer tmr_h pPingTimer; int32_t pingTimerMS; uint8_t pingTimerStart; @@ -136,32 +167,21 @@ typedef struct SSyncNode { // callback int32_t (*FpOnPing)(SSyncNode* ths, SyncPing* pMsg); - int32_t (*FpOnPingReply)(SSyncNode* ths, SyncPingReply* pMsg); - int32_t (*FpOnRequestVote)(SSyncNode* ths, SyncRequestVote* pMsg); - int32_t (*FpOnRequestVoteReply)(SSyncNode* ths, SyncRequestVoteReply* pMsg); - int32_t (*FpOnAppendEntries)(SSyncNode* ths, SyncAppendEntries* pMsg); - int32_t (*FpOnAppendEntriesReply)(SSyncNode* ths, SyncAppendEntriesReply* pMsg); } SSyncNode; SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo); - -void syncNodeClose(SSyncNode* pSyncNode); - -void syncNodePingAll(SSyncNode* pSyncNode); - -void syncNodePingPeers(SSyncNode* pSyncNode); - -void syncNodePingSelf(SSyncNode* pSyncNode); - -int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode); - -int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode); +void syncNodeClose(SSyncNode* pSyncNode); +void syncNodePingAll(SSyncNode* pSyncNode); +void syncNodePingPeers(SSyncNode* pSyncNode); +void syncNodePingSelf(SSyncNode* pSyncNode); +int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode); +int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode); #ifdef __cplusplus } diff --git a/source/libs/sync/inc/syncVoteMgr.h b/source/libs/sync/inc/syncVoteMgr.h index cfcf58bee2..b841f2e316 100644 --- a/source/libs/sync/inc/syncVoteMgr.h +++ b/source/libs/sync/inc/syncVoteMgr.h @@ -26,6 +26,12 @@ extern "C" { #include "syncInt.h" #include "taosdef.h" +typedef struct SVotesGranted { +} SVotesGranted; + +typedef struct SVotesResponded { +} SVotesResponded; + #ifdef __cplusplus } #endif diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 9cb3a61fff..7e01e7e81c 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -88,7 +88,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) { } } - pSyncNode->role = TAOS_SYNC_STATE_FOLLOWER; + pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER; syncUtilnodeInfo2raftId(&pSyncNode->me, pSyncNode->vgId, &pSyncNode->raftId); pSyncNode->pPingTimer = NULL; From c018e91859645c280a8f12d7784a0ba87abd8885 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 17:30:33 +0800 Subject: [PATCH 15/26] minor changes --- include/os/osSysinfo.h | 6 +- source/dnode/mnode/impl/src/mndTelem.c | 4 +- source/os/src/osSysinfo.c | 110 ++++++++++++------------- 3 files changed, 58 insertions(+), 62 deletions(-) diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h index bf9d7662e6..7ad9c57a3c 100644 --- a/include/os/osSysinfo.h +++ b/include/os/osSysinfo.h @@ -34,9 +34,9 @@ typedef struct { } SDiskSpace; void taosGetSystemInfo(); -bool taosGetEmail(char *email, int32_t maxLen); -bool taosGetOsReleaseName(char *releaseName, int32_t maxLen); -bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores); +int32_t taosGetEmail(char *email, int32_t maxLen); +int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen); +int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores); int32_t taosGetCpuCores(); bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage); bool taosGetTotalSysMemoryKB(uint64_t *kb); diff --git a/source/dnode/mnode/impl/src/mndTelem.c b/source/dnode/mnode/impl/src/mndTelem.c index 1cd7593846..da2c52ec8f 100644 --- a/source/dnode/mnode/impl/src/mndTelem.c +++ b/source/dnode/mnode/impl/src/mndTelem.c @@ -52,12 +52,12 @@ static char* mndBuildTelemetryReport(SMnode* pMnode) { tjsonAddStringToObject(pJson, "instanceId", clusterName); tjsonAddDoubleToObject(pJson, "reportVersion", 1); - if (taosGetOsReleaseName(tmp, sizeof(tmp))) { + if (taosGetOsReleaseName(tmp, sizeof(tmp)) == 0) { tjsonAddStringToObject(pJson, "os", tmp); } int32_t numOfCores = 0; - if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores)) { + if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) { tjsonAddStringToObject(pJson, "cpuModel", tmp); tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores); } else { diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index 3e761c6d91..d3f56e5901 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -80,7 +80,6 @@ bool taosGetProcMemory(float *memoryUsedMB) { return true; } - int32_t taosGetCpuCores() { SYSTEM_INFO info; GetSystemInfo(&info); @@ -106,7 +105,7 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { diskSize->used = (int64_t)(i64TotalBytes - i64FreeBytes); return 0; } else { - //printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno)); + // printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno)); terrno = TAOS_SYSTEM_ERROR(errno); return -1; } @@ -173,12 +172,12 @@ void taosGetSystemInfo() { } void taosKillSystem() { - //printf("function taosKillSystem, exit!"); + // printf("function taosKillSystem, exit!"); exit(0); } int taosSystem(const char *cmd) { - //printf("taosSystem not support"); + // printf("taosSystem not support"); return -1; } @@ -241,9 +240,8 @@ char *taosGetCmdlineByPID(int pid) { return ""; } #include #include - void taosKillSystem() { - //printf("function taosKillSystem, exit!"); + // printf("function taosKillSystem, exit!"); exit(0); } @@ -300,7 +298,7 @@ bool taosGetSysMemory(float *memoryUsedMB) { } int taosSystem(const char *cmd) { - //printf("un support funtion"); + // printf("un support funtion"); return -1; } @@ -309,7 +307,7 @@ void taosSetCoreDump() {} int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { struct statvfs info; if (statvfs(dataDir, &info)) { - //printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno)); + // printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno)); terrno = TAOS_SYSTEM_ERROR(errno); return -1; } else { @@ -404,12 +402,12 @@ bool taosGetProcMemory(float *memoryUsedMB) { // FILE *fp = fopen(tsProcMemFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcMemFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - //printf("open file:%s failed", tsProcMemFile); + // printf("open file:%s failed", tsProcMemFile); return false; } ssize_t _bytes = 0; - char * line = NULL; + char *line = NULL; while (!taosEOFFile(pFile)) { _bytes = taosGetLineFile(pFile, &line); if ((_bytes < 0) || (line == NULL)) { @@ -421,7 +419,7 @@ bool taosGetProcMemory(float *memoryUsedMB) { } if (line == NULL) { - //printf("read file:%s failed", tsProcMemFile); + // printf("read file:%s failed", tsProcMemFile); taosCloseFile(&pFile); return false; } @@ -431,7 +429,7 @@ bool taosGetProcMemory(float *memoryUsedMB) { sscanf(line, "%s %" PRId64, tmp, &memKB); *memoryUsedMB = (float)((double)memKB / 1024); - if(line != NULL) tfree(line); + if (line != NULL) tfree(line); taosCloseFile(&pFile); return true; } @@ -440,14 +438,14 @@ static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { // FILE *fp = fopen(tsSysCpuFile, "r"); TdFilePtr pFile = taosOpenFile(tsSysCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - //printf("open file:%s failed", tsSysCpuFile); + // printf("open file:%s failed", tsSysCpuFile); return false; } - char * line = NULL; + char *line = NULL; ssize_t _bytes = taosGetLineFile(pFile, &line); if ((_bytes < 0) || (line == NULL)) { - //printf("read file:%s failed", tsSysCpuFile); + // printf("read file:%s failed", tsSysCpuFile); taosCloseFile(&pFile); return false; } @@ -456,7 +454,7 @@ static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system, &cpuInfo->idle); - if(line != NULL) tfree(line); + if (line != NULL) tfree(line); taosCloseFile(&pFile); return true; } @@ -465,14 +463,14 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { // FILE *fp = fopen(tsProcCpuFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - //printf("open file:%s failed", tsProcCpuFile); + // printf("open file:%s failed", tsProcCpuFile); return false; } - char * line = NULL; + char *line = NULL; ssize_t _bytes = taosGetLineFile(pFile, &line); if ((_bytes < 0) || (line == NULL)) { - //printf("read file:%s failed", tsProcCpuFile); + // printf("read file:%s failed", tsProcCpuFile); taosCloseFile(&pFile); return false; } @@ -486,12 +484,11 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { } } - if(line != NULL) tfree(line); + if (line != NULL) tfree(line); taosCloseFile(&pFile); return true; } - int32_t taosGetCpuCores() { return (int32_t)sysconf(_SC_NPROCESSORS_ONLN); } bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { @@ -550,12 +547,12 @@ bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { // FILE *fp = fopen(tsSysNetFile, "r"); TdFilePtr pFile = taosOpenFile(tsSysNetFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - //printf("open file:%s failed", tsSysNetFile); + // printf("open file:%s failed", tsSysNetFile); return false; } ssize_t _bytes = 0; - char * line = NULL; + char *line = NULL; while (!taosEOFFile(pFile)) { int64_t o_rbytes = 0; @@ -590,7 +587,7 @@ bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { *bytes += (o_rbytes + o_tbytes); } - if(line != NULL) tfree(line); + if (line != NULL) tfree(line); taosCloseFile(&pFile); return true; @@ -636,12 +633,12 @@ bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { // FILE *fp = fopen(tsProcIOFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcIOFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - //printf("open file:%s failed", tsProcIOFile); + // printf("open file:%s failed", tsProcIOFile); return false; } ssize_t _bytes = 0; - char * line = NULL; + char *line = NULL; char tmp[10]; int readIndex = 0; @@ -662,11 +659,11 @@ bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { if (readIndex >= 2) break; } - if(line != NULL) tfree(line); + if (line != NULL) tfree(line); taosCloseFile(&pFile); if (readIndex < 2) { - //printf("read file:%s failed", tsProcIOFile); + // printf("read file:%s failed", tsProcIOFile); return false; } @@ -713,12 +710,11 @@ void taosGetSystemInfo() { taosGetBandSpeed(&tmp1); taosGetCpuUsage(&tmp1, &tmp2); taosGetProcIO(&tmp1, &tmp2); - } void taosKillSystem() { // SIGINT - //printf("taosd will shut down soon"); + // printf("taosd will shut down soon"); kill(tsProcId, 2); } @@ -727,22 +723,22 @@ int taosSystem(const char *cmd) { int res; char buf[1024]; if (cmd == NULL) { - //printf("taosSystem cmd is NULL!"); + // printf("taosSystem cmd is NULL!"); return -1; } if ((fp = popen(cmd, "r")) == NULL) { - //printf("popen cmd:%s error: %s", cmd, strerror(errno)); + // printf("popen cmd:%s error: %s", cmd, strerror(errno)); return -1; } else { while (fgets(buf, sizeof(buf), fp)) { - //printf("popen result:%s", buf); + // printf("popen result:%s", buf); } if ((res = pclose(fp)) == -1) { - //printf("close popen file pointer fp error!"); + // printf("close popen file pointer fp error!"); } else { - //printf("popen res is :%d", res); + // printf("popen res is :%d", res); } return res; @@ -757,14 +753,14 @@ void taosSetCoreDump(bool enable) { struct rlimit rlim_new; if (getrlimit(RLIMIT_CORE, &rlim) == 0) { #ifndef _ALPINE - //printf("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max); + // printf("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max); #else - //printf("the old unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max); + // printf("the old unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max); #endif rlim_new.rlim_cur = RLIM_INFINITY; rlim_new.rlim_max = RLIM_INFINITY; if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) { - //printf("set unlimited fail, error: %s", strerror(errno)); + // printf("set unlimited fail, error: %s", strerror(errno)); rlim_new.rlim_cur = rlim.rlim_max; rlim_new.rlim_max = rlim.rlim_max; (void)setrlimit(RLIMIT_CORE, &rlim_new); @@ -773,9 +769,9 @@ void taosSetCoreDump(bool enable) { if (getrlimit(RLIMIT_CORE, &rlim) == 0) { #ifndef _ALPINE - //printf("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max); + // printf("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max); #else - //printf("the new unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max); + // printf("the new unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max); #endif } @@ -801,10 +797,10 @@ void taosSetCoreDump(bool enable) { old_len = sizeof(old_usespid); if (syscall(SYS__sysctl, &args) == -1) { - //printf("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno)); + // printf("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno)); } - //printf("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); + // printf("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); old_usespid = 0; old_len = 0; @@ -817,10 +813,10 @@ void taosSetCoreDump(bool enable) { old_len = sizeof(old_usespid); if (syscall(SYS__sysctl, &args) == -1) { - //printf("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno)); + // printf("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno)); } - //printf("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); + // printf("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); #endif } @@ -885,7 +881,7 @@ SysNameInfo taosGetSysNameInfo() { return info; } -bool taosGetEmail(char *email, int32_t maxLen) { +int32_t taosGetEmail(char *email, int32_t maxLen) { const char *filepath = "/usr/local/taos/email"; TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ); @@ -893,17 +889,17 @@ bool taosGetEmail(char *email, int32_t maxLen) { if (taosReadFile(pFile, (void *)email, maxLen) < 0) { taosCloseFile(&pFile); - return false; + return -1; } taosCloseFile(&pFile); - return true; + return 0; } -bool taosGetOsReleaseName(char *releaseName, int32_t maxLen) { - char *line = NULL; - size_t size = 0; - bool ret = false; +int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) { + char *line = NULL; + size_t size = 0; + int32_t code = -1; TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return false; @@ -917,21 +913,21 @@ bool taosGetOsReleaseName(char *releaseName, int32_t maxLen) { line[size - 2] = 0; } tstrncpy(releaseName, p, maxLen); - ret = true; + code = 0; break; } } if (line != NULL) free(line); taosCloseFile(&pFile); - return ret; + return code; } -bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { +int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { char *line = NULL; size_t size = 0; int32_t done = 0; - bool ret = false; + int32_t code = -1; TdFilePtr pFile = taosOpenFile("/proc/cpuinfo", TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return false; @@ -941,7 +937,7 @@ bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { if (((done & 1) == 0) && strncmp(line, "model name", 10) == 0) { const char *v = strchr(line, ':') + 2; tstrncpy(cpuModel, v, maxLen); - ret = true; + code = 0; done |= 1; } else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) { const char *v = strchr(line, ':') + 2; @@ -953,7 +949,7 @@ bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { if (line != NULL) free(line); taosCloseFile(&pFile); - return ret; + return code; } bool taosGetTotalSysMemoryKB(uint64_t *kb) { From c890b0b5c1987ffbec0186c5c72ba4a0db27d100 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 18:10:56 +0800 Subject: [PATCH 16/26] sysinfo in monitor --- include/libs/monitor/monitor.h | 6 +- include/os/osEnv.h | 6 +- include/os/osSysinfo.h | 12 +- source/common/src/tglobal.c | 10 +- source/dnode/mgmt/impl/src/dndMgmt.c | 43 ++++-- source/dnode/mnode/impl/src/mndTelem.c | 11 +- source/os/src/osEnv.c | 11 +- source/os/src/osSysinfo.c | 183 +++++++++++-------------- 8 files changed, 140 insertions(+), 142 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index b3b6091b95..487b2bfe88 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -88,9 +88,9 @@ typedef struct { float cpu_engine; float cpu_system; float cpu_cores; - float mem_engine; // MB - float mem_system; // MB - float mem_total; // MB + int64_t mem_engine; // KB + int64_t mem_system; // KB + int64_t mem_total; // KB float disk_engine; // GB float disk_used; // GB float disk_total; // GB diff --git a/include/os/osEnv.h b/include/os/osEnv.h index 4ac073f6c2..1426ba87f6 100644 --- a/include/os/osEnv.h +++ b/include/os/osEnv.h @@ -28,11 +28,11 @@ extern char tsCharset[]; extern char tsLocale[]; extern int8_t tsDaylight; extern bool tsEnableCoreFile; -extern int64_t tsPageSize; +extern int64_t tsPageSizeKB; extern int64_t tsOpenMax; extern int64_t tsStreamMax; -extern int32_t tsNumOfCores; -extern int32_t tsTotalMemoryMB; +extern float tsNumOfCores; +extern int64_t tsTotalMemoryKB; extern char configDir[]; extern char tsDataDir[]; diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h index 7ad9c57a3c..df5ed28a99 100644 --- a/include/os/osSysinfo.h +++ b/include/os/osSysinfo.h @@ -36,12 +36,12 @@ typedef struct { void taosGetSystemInfo(); int32_t taosGetEmail(char *email, int32_t maxLen); int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen); -int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores); -int32_t taosGetCpuCores(); -bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage); -bool taosGetTotalSysMemoryKB(uint64_t *kb); -bool taosGetProcMemory(float *memoryUsedMB); // -bool taosGetSysMemory(float *memoryUsedMB); // +int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores); +int32_t taosGetCpuCores(float *numOfCores); +int32_t taosGetCpuUsage(float *cpu_system, float *cpu_engine); +int32_t taosGetTotalMemory(int64_t *totalKB); +int32_t taosGetProcMemory(int64_t *usedKB); +int32_t taosGetSysMemory(int64_t *usedKB); int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize); bool taosReadProcIO(int64_t *rchars, int64_t *wchars); bool taosGetProcIO(float *readKB, float *writeKB); diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 5998b7c9ce..93b66e3369 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -279,11 +279,11 @@ static int32_t taosAddSystemCfg(SConfig *pCfg) { if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1; if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1; if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1; - if (cfgAddInt32(pCfg, "numOfCores", tsNumOfCores, 1, 100000, 1) != 0) return -1; - if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSize, 0, INT64_MAX, 1) != 0) return -1; + if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 0, 100000, 1) != 0) return -1; if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1; if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1; - if (cfgAddInt32(pCfg, "totalMemory(MB)", tsTotalMemoryMB, 0, INT32_MAX, 1) != 0) return -1; + if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSizeKB, 0, INT64_MAX, 1) != 0) return -1; + if (cfgAddInt64(pCfg, "totalMemory(KB)", tsTotalMemoryKB, 0, INT64_MAX, 1) != 0) return -1; if (cfgAddString(pCfg, "os sysname", info.sysname, 1) != 0) return -1; if (cfgAddString(pCfg, "os nodename", info.nodename, 1) != 0) return -1; if (cfgAddString(pCfg, "os release", info.release, 1) != 0) return -1; @@ -404,10 +404,6 @@ static void taosSetSystemCfg(SConfig *pCfg) { const char *charset = cfgGetItem(pCfg, "charset")->str; taosSetSystemLocale(locale, charset); - if (tsNumOfCores <= 1) { - tsNumOfCores = 2; - } - bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval; taosSetConsoleEcho(enableCore); diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index 70f5060ead..704847894e 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -474,13 +474,40 @@ void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) { rpcSendResponse(&rpcRsp); } -static int32_t dndGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { +static void dndGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->dnode_id = dndGetDnodeId(pDnode); tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN); - return 0; } -static int32_t dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { return 0; } +static void dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { + pInfo->uptime = (taosGetTimestampMs() - pDnode->dmgmt.rebootTime) / (86400000.0f); + taosGetCpuUsage(&pInfo->cpu_engine, &pInfo->cpu_system); + pInfo->cpu_cores = tsNumOfCores; + taosGetProcMemory(&pInfo->mem_engine); + taosGetSysMemory(&pInfo->mem_system); + pInfo->mem_total = tsTotalMemoryKB; + pInfo->disk_engine = 4.1; + pInfo->disk_used = 4.2; + pInfo->disk_total = 4.3; + pInfo->net_in = 5.1; + pInfo->net_out = 5.2; + pInfo->io_read = 6.1; + pInfo->io_write = 6.2; + pInfo->io_read_disk = 7.1; + pInfo->io_write_disk = 7.2; + pInfo->req_select = 8; + pInfo->req_select_rate = 8.1; + pInfo->req_insert = 9; + pInfo->req_insert_success = 10; + pInfo->req_insert_rate = 10.1; + pInfo->req_insert_batch = 11; + pInfo->req_insert_batch_success = 12; + pInfo->req_insert_batch_rate = 12.3; + pInfo->errors = 4; + pInfo->vnodes_num = 5; + pInfo->masters = 6; + pInfo->has_mnode = 1; +} static void dndSendMonitorReport(SDnode *pDnode) { if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; @@ -490,9 +517,8 @@ static void dndSendMonitorReport(SDnode *pDnode) { if (pMonitor == NULL) return; SMonBasicInfo basicInfo = {0}; - if (dndGetMonitorBasicInfo(pDnode, &basicInfo) == 0) { - monSetBasicInfo(pMonitor, &basicInfo); - } + dndGetMonitorBasicInfo(pDnode, &basicInfo); + monSetBasicInfo(pMonitor, &basicInfo); SMonClusterInfo clusterInfo = {0}; SMonVgroupInfo vgroupInfo = {0}; @@ -504,9 +530,8 @@ static void dndSendMonitorReport(SDnode *pDnode) { } SMonDnodeInfo dnodeInfo = {0}; - if (dndGetMonitorDnodeInfo(pDnode, &dnodeInfo) == 0) { - monSetDnodeInfo(pMonitor, &dnodeInfo); - } + dndGetMonitorDnodeInfo(pDnode, &dnodeInfo); + monSetDnodeInfo(pMonitor, &dnodeInfo); SMonDiskInfo diskInfo = {0}; if (dndGetMonitorDiskInfo(pDnode, &diskInfo) == 0) { diff --git a/source/dnode/mnode/impl/src/mndTelem.c b/source/dnode/mnode/impl/src/mndTelem.c index da2c52ec8f..968319e7b4 100644 --- a/source/dnode/mnode/impl/src/mndTelem.c +++ b/source/dnode/mnode/impl/src/mndTelem.c @@ -56,19 +56,16 @@ static char* mndBuildTelemetryReport(SMnode* pMnode) { tjsonAddStringToObject(pJson, "os", tmp); } - int32_t numOfCores = 0; + float numOfCores = 0; if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) { tjsonAddStringToObject(pJson, "cpuModel", tmp); tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores); } else { - tjsonAddDoubleToObject(pJson, "numOfCpu", taosGetCpuCores()); + tjsonAddDoubleToObject(pJson, "numOfCpu", tsNumOfCores); } - uint64_t memoryKB = 0; - if (taosGetTotalSysMemoryKB(&memoryKB)) { - snprintf(tmp, sizeof(tmp), "%" PRIu64 " kB", memoryKB); - tjsonAddStringToObject(pJson, "memory", tmp); - } + snprintf(tmp, sizeof(tmp), "%" PRId64 " kB", tsTotalMemoryKB); + tjsonAddStringToObject(pJson, "memory", tmp); tjsonAddStringToObject(pJson, "version", version); tjsonAddStringToObject(pJson, "buildInfo", buildinfo); diff --git a/source/os/src/osEnv.c b/source/os/src/osEnv.c index 4c368fe895..0b2fe904b3 100644 --- a/source/os/src/osEnv.c +++ b/source/os/src/osEnv.c @@ -31,11 +31,11 @@ char tsLocale[TD_LOCALE_LEN] = {0}; char tsCharset[TD_CHARSET_LEN] = {0}; int8_t tsDaylight = 0; bool tsEnableCoreFile = 0; -int64_t tsPageSize = 0; +int64_t tsPageSizeKB = 0; int64_t tsOpenMax = 0; int64_t tsStreamMax = 0; -int32_t tsNumOfCores = 0; -int32_t tsTotalMemoryMB = 0; +float tsNumOfCores = 0; +int64_t tsTotalMemoryKB = 0; void osInit() { srand(taosSafeRand()); @@ -44,6 +44,11 @@ void osInit() { taosSetSystemTimezone(tsTimezone, tsTimezone, &tsDaylight); taosGetSystemInfo(); + // deadlock in query + if (tsNumOfCores < 2) { + tsNumOfCores = 2; + } + #if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) taosWinSocketInit(); diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index d3f56e5901..bf036354e9 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -39,32 +39,32 @@ #include #pragma warning(pop) -static int32_t taosGetTotalMemory() { +int32_t taosGetTotalMemory(int64_t *totalKB) { MEMORYSTATUSEX memsStat; memsStat.dwLength = sizeof(memsStat); if (!GlobalMemoryStatusEx(&memsStat)) { - return 0; + return -1; } - float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f); - return (int32_t)nMemTotal; + *totalKB = memsStat.ullTotalPhys / 1024; + return 0; } -bool taosGetSysMemory(float *memoryUsedMB) { +int32_t taosGetSysMemory(int64_t *usedKB) { MEMORYSTATUSEX memsStat; memsStat.dwLength = sizeof(memsStat); if (!GlobalMemoryStatusEx(&memsStat)) { - return false; + return -1; } - float nMemFree = memsStat.ullAvailPhys / (1024.0f * 1024.0f); - float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f); + int64_t nMemFree = memsStat.ullAvailPhys / 1024; + int64_t nMemTotal = memsStat.ullTotalPhys / 1024.0; - *memoryUsedMB = nMemTotal - nMemFree; - return true; + *usedKB = nMemTotal - nMemFree; + return 0; } -bool taosGetProcMemory(float *memoryUsedMB) { +int32_t taosGetProcMemory(int64_t *usedKB) { unsigned bytes_used = 0; #if defined(_WIN64) && defined(_MSC_VER) @@ -76,20 +76,21 @@ bool taosGetProcMemory(float *memoryUsedMB) { } #endif - *memoryUsedMB = (float)bytes_used / 1024 / 1024; - return true; + *usedKB = bytes_used / 1024; + return 0; } -int32_t taosGetCpuCores() { +int32_t taosGetCpuCores(float *numOfCores) { SYSTEM_INFO info; GetSystemInfo(&info); - return (int32_t)info.dwNumberOfProcessors; + *numOfCores = info.dwNumberOfProcessors; + return 0; } -bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { +int32_t taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { *sysCpuUsage = 0; *procCpuUsage = 0; - return true; + return 0; } int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { @@ -162,8 +163,8 @@ bool taosGetProcIO(float *readKB, float *writeKB) { } void taosGetSystemInfo() { - tsNumOfCores = taosGetCpuCores(); - tsTotalMemoryMB = taosGetTotalMemory(); + taosGetCpuCores(&tsNumOfCores); + taosGetTotalMemory(&tsTotalMemoryKB); float tmp1, tmp2; taosGetBandSpeed(&tmp1); @@ -245,16 +246,17 @@ void taosKillSystem() { exit(0); } -int32_t taosGetCpuCores() { return sysconf(_SC_NPROCESSORS_ONLN); } +int32_t taosGetCpuCores(float *numOfCores) { + *numOfCores = sysconf(_SC_NPROCESSORS_ONLN); + return 0; +} void taosGetSystemInfo() { - // taosGetProcInfos(); - - tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN); long physical_pages = sysconf(_SC_PHYS_PAGES); long page_size = sysconf(_SC_PAGESIZE); - tsTotalMemoryMB = physical_pages * page_size / (1024 * 1024); - tsPageSize = page_size; + tsTotalMemoryKB = physical_pages * page_size / 1024; + tsPageSizeKB = page_size / 1024; + tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN); } bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { @@ -281,20 +283,20 @@ bool taosGetBandSpeed(float *bandSpeedKb) { return true; } -bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { +int32_t taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { *sysCpuUsage = 0; *procCpuUsage = 0; - return true; + return 0; } -bool taosGetProcMemory(float *memoryUsedMB) { - *memoryUsedMB = 0; - return true; +int32_t taosGetProcMemory(int64_t *usedKB) { + *usedKB = 0; + return 0; } -bool taosGetSysMemory(float *memoryUsedMB) { - *memoryUsedMB = 0; - return true; +int32_t taosGetSysMemory(int64_t *usedKB) { + *usedKB = 0; + return 0; } int taosSystem(const char *cmd) { @@ -375,35 +377,34 @@ static char tsSysCpuFile[] = "/proc/stat"; static char tsProcCpuFile[25] = {0}; static char tsProcMemFile[25] = {0}; static char tsProcIOFile[25] = {0}; -static float tsPageSizeKB = 0; static void taosGetProcInfos() { - tsPageSize = sysconf(_SC_PAGESIZE); + tsPageSizeKB = sysconf(_SC_PAGESIZE) / 1024; tsOpenMax = sysconf(_SC_OPEN_MAX); tsStreamMax = sysconf(_SC_STREAM_MAX); - tsProcId = (pid_t)syscall(SYS_gettid); - tsPageSizeKB = (float)(sysconf(_SC_PAGESIZE)) / 1024; - snprintf(tsProcMemFile, 25, "/proc/%d/status", tsProcId); - snprintf(tsProcCpuFile, 25, "/proc/%d/stat", tsProcId); - snprintf(tsProcIOFile, 25, "/proc/%d/io", tsProcId); + snprintf(tsProcMemFile, sizeof(tsProcMemFile), "/proc/%d/status", tsProcId); + snprintf(tsProcCpuFile, sizeof(tsProcCpuFile), "/proc/%d/stat", tsProcId); + snprintf(tsProcIOFile, sizeof(tsProcIOFile), "/proc/%d/io", tsProcId); } -static int32_t taosGetTotalMemory() { return (int32_t)((float)sysconf(_SC_PHYS_PAGES) * tsPageSizeKB / 1024); } - -bool taosGetSysMemory(float *memoryUsedMB) { - float memoryAvailMB = (float)sysconf(_SC_AVPHYS_PAGES) * tsPageSizeKB / 1024; - *memoryUsedMB = (float)tsTotalMemoryMB - memoryAvailMB; - return true; +int32_t taosGetTotalMemory(int64_t *totalKB) { + *totalKB = (int64_t)(sysconf(_SC_PHYS_PAGES) * tsPageSizeKB); + return 0; } -bool taosGetProcMemory(float *memoryUsedMB) { +int32_t taosGetSysMemory(int64_t *usedKB) { + *usedKB = sysconf(_SC_AVPHYS_PAGES) * tsPageSizeKB; + return 0; +} + +int32_t taosGetProcMemory(int64_t *usedKB) { // FILE *fp = fopen(tsProcMemFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcMemFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsProcMemFile); - return false; + return -1; } ssize_t _bytes = 0; @@ -421,25 +422,23 @@ bool taosGetProcMemory(float *memoryUsedMB) { if (line == NULL) { // printf("read file:%s failed", tsProcMemFile); taosCloseFile(&pFile); - return false; + return -1; } - int64_t memKB = 0; - char tmp[10]; - sscanf(line, "%s %" PRId64, tmp, &memKB); - *memoryUsedMB = (float)((double)memKB / 1024); + char tmp[10]; + sscanf(line, "%s %" PRId64, tmp, usedKB); if (line != NULL) tfree(line); taosCloseFile(&pFile); - return true; + return 0; } -static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { +static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { // FILE *fp = fopen(tsSysCpuFile, "r"); TdFilePtr pFile = taosOpenFile(tsSysCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsSysCpuFile); - return false; + return -1; } char *line = NULL; @@ -447,7 +446,7 @@ static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { if ((_bytes < 0) || (line == NULL)) { // printf("read file:%s failed", tsSysCpuFile); taosCloseFile(&pFile); - return false; + return -1; } char cpu[10] = {0}; @@ -456,15 +455,15 @@ static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { if (line != NULL) tfree(line); taosCloseFile(&pFile); - return true; + return 0; } -static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { +static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { // FILE *fp = fopen(tsProcCpuFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsProcCpuFile); - return false; + return -1; } char *line = NULL; @@ -472,7 +471,7 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { if ((_bytes < 0) || (line == NULL)) { // printf("read file:%s failed", tsProcCpuFile); taosCloseFile(&pFile); - return false; + return -1; } for (int i = 0, blank = 0; line[i] != 0; ++i) { @@ -486,23 +485,26 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { if (line != NULL) tfree(line); taosCloseFile(&pFile); - return true; + return 0; } -int32_t taosGetCpuCores() { return (int32_t)sysconf(_SC_NPROCESSORS_ONLN); } +int32_t taosGetCpuCores(float *numOfCores) { + *numOfCores = sysconf(_SC_NPROCESSORS_ONLN); + return 0; +} -bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { +int32_t taosGetCpuUsage(float *cpu_system, float *cpu_engine) { static uint64_t lastSysUsed = 0; static uint64_t lastSysTotal = 0; static uint64_t lastProcTotal = 0; SysCpuInfo sysCpu; ProcCpuInfo procCpu; - if (!taosGetSysCpuInfo(&sysCpu)) { - return false; + if (taosGetSysCpuInfo(&sysCpu) != 0) { + return -1; } - if (!taosGetProcCpuInfo(&procCpu)) { - return false; + if (taosGetProcCpuInfo(&procCpu) != 0) { + return -1; } uint64_t curSysUsed = sysCpu.user + sysCpu.nice + sysCpu.system; @@ -513,21 +515,21 @@ bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { lastSysUsed = curSysUsed > 1 ? curSysUsed : 1; lastSysTotal = curSysTotal > 1 ? curSysTotal : 1; lastProcTotal = curProcTotal > 1 ? curProcTotal : 1; - return false; + return -1; } if (curSysTotal == lastSysTotal) { - return false; + return -1; } - *sysCpuUsage = (float)((double)(curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100); - *procCpuUsage = (float)((double)(curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100); + *cpu_engine = (float)((double)(curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100); + *cpu_system = (float)((double)(curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100); lastSysUsed = curSysUsed; lastSysTotal = curSysTotal; lastProcTotal = curProcTotal; - return true; + return 0; } int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { @@ -700,13 +702,10 @@ bool taosGetProcIO(float *readKB, float *writeKB) { void taosGetSystemInfo() { taosGetProcInfos(); - - tsNumOfCores = taosGetCpuCores(); - tsTotalMemoryMB = taosGetTotalMemory(); + taosGetCpuCores(&tsNumOfCores); + taosGetTotalMemory(&tsTotalMemoryKB); float tmp1, tmp2; - taosGetSysMemory(&tmp1); - taosGetProcMemory(&tmp2); taosGetBandSpeed(&tmp1); taosGetCpuUsage(&tmp1, &tmp2); taosGetProcIO(&tmp1, &tmp2); @@ -923,7 +922,7 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) { return code; } -int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { +int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { char *line = NULL; size_t size = 0; int32_t done = 0; @@ -941,7 +940,7 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { done |= 1; } else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) { const char *v = strchr(line, ':') + 2; - *numOfCores = atoi(v); + *numOfCores = atof(v); done |= 2; } } @@ -952,28 +951,4 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) { return code; } -bool taosGetTotalSysMemoryKB(uint64_t *kb) { - char *line = NULL; - size_t size = 0; - bool ret = false; - - TdFilePtr pFile = taosOpenFile("/proc/meminfo", TD_FILE_READ | TD_FILE_STREAM); - if (pFile == NULL) return false; - - while ((size = taosGetLineFile(pFile, &line)) != -1) { - line[size - 1] = '\0'; - if (strncmp(line, "MemTotal", 8) == 0) { - const char *p = strchr(line, ':') + 1; - while (*p == ' ') p++; - ret = true; - *kb = atoll(p); - break; - } - } - - if (line != NULL) free(line); - taosCloseFile(&pFile); - return ret; -} - #endif From 3fbb78a951fd383b6a4882f915393ba867544565 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 18:55:16 +0800 Subject: [PATCH 17/26] io --- include/os/osSysinfo.h | 4 +-- source/dnode/mgmt/impl/src/dndMgmt.c | 7 ++--- source/os/src/osSysinfo.c | 42 ++++++++++++++-------------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h index df5ed28a99..3c68615c64 100644 --- a/include/os/osSysinfo.h +++ b/include/os/osSysinfo.h @@ -43,8 +43,8 @@ int32_t taosGetTotalMemory(int64_t *totalKB); int32_t taosGetProcMemory(int64_t *usedKB); int32_t taosGetSysMemory(int64_t *usedKB); int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize); -bool taosReadProcIO(int64_t *rchars, int64_t *wchars); -bool taosGetProcIO(float *readKB, float *writeKB); +int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars); +int32_t taosGetProcIO(float *readKB, float *writeKB); bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes); bool taosGetBandSpeed(float *bandSpeedKb); diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index 704847894e..6a743fcf48 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -491,10 +491,9 @@ static void dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { pInfo->disk_total = 4.3; pInfo->net_in = 5.1; pInfo->net_out = 5.2; - pInfo->io_read = 6.1; - pInfo->io_write = 6.2; - pInfo->io_read_disk = 7.1; - pInfo->io_write_disk = 7.2; + taosGetProcIO(&pInfo->io_read, &pInfo->io_write); + pInfo->io_read_disk = 0; + pInfo->io_write_disk = 0; pInfo->req_select = 8; pInfo->req_select_rate = 8.1; pInfo->req_insert = 9; diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index bf036354e9..3683943c61 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -124,31 +124,31 @@ bool taosGetBandSpeed(float *bandSpeedKb) { return true; } -bool taosReadProcIO(int64_t *readbyte, int64_t *writebyte) { +int32_t taosReadProcIO(int64_t *readbyte, int64_t *writebyte) { IO_COUNTERS io_counter; if (GetProcessIoCounters(GetCurrentProcess(), &io_counter)) { if (readbyte) *readbyte = io_counter.ReadTransferCount; if (writebyte) *writebyte = io_counter.WriteTransferCount; - return true; + return 0; } - return false; + return -1; } -bool taosGetProcIO(float *readKB, float *writeKB) { +int32_t taosGetProcIO(float *readKB, float *writeKB) { static int64_t lastReadbyte = -1; static int64_t lastWritebyte = -1; int64_t curReadbyte = 0; int64_t curWritebyte = 0; - if (!taosReadProcIO(&curReadbyte, &curWritebyte)) { - return false; + if (taosReadProcIO(&curReadbyte, &curWritebyte) != 0) { + return -1; } if (lastReadbyte == -1 || lastWritebyte == -1) { lastReadbyte = curReadbyte; lastWritebyte = curWritebyte; - return false; + return -1; } *readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024); @@ -159,7 +159,7 @@ bool taosGetProcIO(float *readKB, float *writeKB) { lastReadbyte = curReadbyte; lastWritebyte = curWritebyte; - return true; + return 0; } void taosGetSystemInfo() { @@ -259,16 +259,16 @@ void taosGetSystemInfo() { tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN); } -bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { +int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars) { if (rchars) *rchars = 0; if (wchars) *wchars = 0; - return true; + return 0; } -bool taosGetProcIO(float *readKB, float *writeKB) { +int32_t taosGetProcIO(float *readKB, float *writeKB) { *readKB = 0; *writeKB = 0; - return true; + return 0; } bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { @@ -631,12 +631,12 @@ bool taosGetBandSpeed(float *bandSpeedKb) { return true; } -bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { +int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars) { // FILE *fp = fopen(tsProcIOFile, "r"); TdFilePtr pFile = taosOpenFile(tsProcIOFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsProcIOFile); - return false; + return -1; } ssize_t _bytes = 0; @@ -666,27 +666,27 @@ bool taosReadProcIO(int64_t *rchars, int64_t *wchars) { if (readIndex < 2) { // printf("read file:%s failed", tsProcIOFile); - return false; + return -1; } - return true; + return 0; } -bool taosGetProcIO(float *readKB, float *writeKB) { +int32_t taosGetProcIO(float *readKB, float *writeKB) { static int64_t lastReadbyte = -1; static int64_t lastWritebyte = -1; int64_t curReadbyte = 0; int64_t curWritebyte = 0; - if (!taosReadProcIO(&curReadbyte, &curWritebyte)) { - return false; + if (taosReadProcIO(&curReadbyte, &curWritebyte) != 0) { + return -1; } if (lastReadbyte == -1 || lastWritebyte == -1) { lastReadbyte = curReadbyte; lastWritebyte = curWritebyte; - return false; + return -1; } *readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024); @@ -697,7 +697,7 @@ bool taosGetProcIO(float *readKB, float *writeKB) { lastReadbyte = curReadbyte; lastWritebyte = curWritebyte; - return true; + return 0; } void taosGetSystemInfo() { From 2bf46ddc54a1282620b4ad725f2a94a68c95008c Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 3 Mar 2022 19:12:08 +0800 Subject: [PATCH 18/26] monitor --- include/libs/monitor/monitor.h | 12 ++++----- include/os/osSysinfo.h | 4 +-- source/dnode/mgmt/impl/inc/dndMnode.h | 1 + source/dnode/mgmt/impl/src/dndMgmt.c | 33 +++++++++++------------ source/dnode/mgmt/impl/src/dndMnode.c | 7 +++++ source/os/src/osSysinfo.c | 38 +++++++++++++-------------- 6 files changed, 51 insertions(+), 44 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 487b2bfe88..00cb7c3dbc 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -94,12 +94,12 @@ typedef struct { float disk_engine; // GB float disk_used; // GB float disk_total; // GB - float net_in; // Kb/s - float net_out; // Kb/s - float io_read; // Mb/s - float io_write; // Mb/s - float io_read_disk; // Mb/s - float io_write_disk; // Mb/s + int64_t net_in; + int64_t net_out; + float io_read; + float io_write; + float io_read_disk; + float io_write_disk; int32_t req_select; float req_select_rate; int32_t req_insert; diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h index 3c68615c64..e14dba8269 100644 --- a/include/os/osSysinfo.h +++ b/include/os/osSysinfo.h @@ -45,8 +45,8 @@ int32_t taosGetSysMemory(int64_t *usedKB); int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize); int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars); int32_t taosGetProcIO(float *readKB, float *writeKB); -bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes); -bool taosGetBandSpeed(float *bandSpeedKb); +int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes); +int32_t taosGetBandSpeed(float *bandSpeedKb); int32_t taosSystem(const char *cmd); void taosKillSystem(); diff --git a/source/dnode/mgmt/impl/inc/dndMnode.h b/source/dnode/mgmt/impl/inc/dndMnode.h index 0f03bb3832..0aee3b4b43 100644 --- a/source/dnode/mgmt/impl/inc/dndMnode.h +++ b/source/dnode/mgmt/impl/inc/dndMnode.h @@ -34,6 +34,7 @@ int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); int32_t dndGetMnodeMonitorInfo(SDnode *pDnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo, SMonGrantInfo *pGrantInfo); +int8_t dndIsMnode(SDnode *pDnode); #ifdef __cplusplus } diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c index 6a743fcf48..60cfdc299c 100644 --- a/source/dnode/mgmt/impl/src/dndMgmt.c +++ b/source/dnode/mgmt/impl/src/dndMgmt.c @@ -486,26 +486,25 @@ static void dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { taosGetProcMemory(&pInfo->mem_engine); taosGetSysMemory(&pInfo->mem_system); pInfo->mem_total = tsTotalMemoryKB; - pInfo->disk_engine = 4.1; - pInfo->disk_used = 4.2; - pInfo->disk_total = 4.3; - pInfo->net_in = 5.1; - pInfo->net_out = 5.2; + pInfo->disk_engine = 0; + pInfo->disk_used = tsDataSpace.size.used / (1024 * 1024 * 1024.0); + pInfo->disk_total = tsDataSpace.size.avail / (1024 * 1024 * 1024.0); + taosGetCardInfo(NULL, &pInfo->net_in, &pInfo->net_out); taosGetProcIO(&pInfo->io_read, &pInfo->io_write); pInfo->io_read_disk = 0; pInfo->io_write_disk = 0; - pInfo->req_select = 8; - pInfo->req_select_rate = 8.1; - pInfo->req_insert = 9; - pInfo->req_insert_success = 10; - pInfo->req_insert_rate = 10.1; - pInfo->req_insert_batch = 11; - pInfo->req_insert_batch_success = 12; - pInfo->req_insert_batch_rate = 12.3; - pInfo->errors = 4; - pInfo->vnodes_num = 5; - pInfo->masters = 6; - pInfo->has_mnode = 1; + pInfo->req_select = 0; + pInfo->req_select_rate = 0; + pInfo->req_insert = 0; + pInfo->req_insert_success = 0; + pInfo->req_insert_rate = 0; + pInfo->req_insert_batch = 0; + pInfo->req_insert_batch_success = 0; + pInfo->req_insert_batch_rate = 0; + pInfo->errors = 0; + pInfo->vnodes_num = 0; + pInfo->masters = 0; + pInfo->has_mnode = dndIsMnode(pDnode); } static void dndSendMonitorReport(SDnode *pDnode) { diff --git a/source/dnode/mgmt/impl/src/dndMnode.c b/source/dnode/mgmt/impl/src/dndMnode.c index 6cb117867f..47e74b5c57 100644 --- a/source/dnode/mgmt/impl/src/dndMnode.c +++ b/source/dnode/mgmt/impl/src/dndMnode.c @@ -639,4 +639,11 @@ int32_t dndGetMnodeMonitorInfo(SDnode *pDnode, SMonClusterInfo *pClusterInfo, SM int32_t code = mndGetMonitorInfo(pMnode, pClusterInfo, pVgroupInfo, pGrantInfo); dndReleaseMnode(pDnode, pMnode); return code; +} + +int8_t dndIsMnode(SDnode *pDnode) { + SMnode *pMnode = dndAcquireMnode(pDnode); + if (pMnode == NULL) return 0; + dndReleaseMnode(pDnode, pMnode); + return 1; } \ No newline at end of file diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index 3683943c61..c674aeaca2 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -112,16 +112,16 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { } } -bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { +int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { if (bytes) *bytes = 0; if (rbytes) *rbytes = 0; if (tbytes) *tbytes = 0; - return true; + return 0; } -bool taosGetBandSpeed(float *bandSpeedKb) { +int32_t taosGetBandSpeed(float *bandSpeedKb) { *bandSpeedKb = 0; - return true; + return 0; } int32_t taosReadProcIO(int64_t *readbyte, int64_t *writebyte) { @@ -271,16 +271,16 @@ int32_t taosGetProcIO(float *readKB, float *writeKB) { return 0; } -bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { +int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { if (bytes) *bytes = 0; if (rbytes) *rbytes = 0; if (tbytes) *tbytes = 0; - return true; + return 0; } -bool taosGetBandSpeed(float *bandSpeedKb) { +int32_t taosGetBandSpeed(float *bandSpeedKb) { *bandSpeedKb = 0; - return true; + return 0; } int32_t taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) { @@ -544,13 +544,13 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { } } -bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { - *bytes = 0; +int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { + if (bytes) *bytes = 0; // FILE *fp = fopen(tsSysNetFile, "r"); TdFilePtr pFile = taosOpenFile(tsSysNetFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsSysNetFile); - return false; + return -1; } ssize_t _bytes = 0; @@ -586,37 +586,37 @@ bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) { nouse0, &o_rbytes, &rpackts, &nouse1, &nouse2, &nouse3, &nouse4, &nouse5, &nouse6, &o_tbytes, &tpackets); if (rbytes) *rbytes = o_rbytes; if (tbytes) *tbytes = o_tbytes; - *bytes += (o_rbytes + o_tbytes); + if (bytes) *bytes += (o_rbytes + o_tbytes); } if (line != NULL) tfree(line); taosCloseFile(&pFile); - return true; + return 0; } -bool taosGetBandSpeed(float *bandSpeedKb) { +int32_t taosGetBandSpeed(float *bandSpeedKb) { static int64_t lastBytes = 0; static time_t lastTime = 0; int64_t curBytes = 0; time_t curTime = time(NULL); - if (!taosGetCardInfo(&curBytes, NULL, NULL)) { - return false; + if (taosGetCardInfo(&curBytes, NULL, NULL) != 0) { + return -1; } if (lastTime == 0 || lastBytes == 0) { lastTime = curTime; lastBytes = curBytes; *bandSpeedKb = 0; - return true; + return 0; } if (lastTime >= curTime || lastBytes > curBytes) { lastTime = curTime; lastBytes = curBytes; *bandSpeedKb = 0; - return true; + return 0; } double totalBytes = (double)(curBytes - lastBytes) / 1024 * 8; // Kb @@ -628,7 +628,7 @@ bool taosGetBandSpeed(float *bandSpeedKb) { lastTime = curTime; lastBytes = curBytes; - return true; + return 0; } int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars) { From ad56011fdf5833ec4ab0ec4e29768275bf786308 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 3 Mar 2022 19:47:52 +0800 Subject: [PATCH 19/26] [td-13039] fix compiler error. --- source/libs/parser/src/astCreateFuncs.c | 38 +++++++++---------- source/libs/scheduler/test/schedulerTests.cpp | 4 +- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/source/libs/parser/src/astCreateFuncs.c b/source/libs/parser/src/astCreateFuncs.c index a531f3de71..df8e1f4eb8 100644 --- a/source/libs/parser/src/astCreateFuncs.c +++ b/source/libs/parser/src/astCreateFuncs.c @@ -44,7 +44,7 @@ static SDatabaseOptions* setDbBlocks(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_TOTAL_BLOCKS || val > TSDB_MAX_TOTAL_BLOCKS) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option totalBlocks: %d valid range: [%d, %d]", val, TSDB_MIN_TOTAL_BLOCKS, TSDB_MAX_TOTAL_BLOCKS); + "invalid db option totalBlocks: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_TOTAL_BLOCKS, TSDB_MAX_TOTAL_BLOCKS); pCxt->valid = false; return pOptions; } @@ -56,7 +56,7 @@ static SDatabaseOptions* setDbCache(SAstCreateContext* pCxt, SDatabaseOptions* p int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_CACHE_BLOCK_SIZE || val > TSDB_MAX_CACHE_BLOCK_SIZE) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option cacheBlockSize: %d valid range: [%d, %d]", val, TSDB_MIN_CACHE_BLOCK_SIZE, TSDB_MAX_CACHE_BLOCK_SIZE); + "invalid db option cacheBlockSize: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_CACHE_BLOCK_SIZE, TSDB_MAX_CACHE_BLOCK_SIZE); pCxt->valid = false; return pOptions; } @@ -68,7 +68,7 @@ static SDatabaseOptions* setDbCacheLast(SAstCreateContext* pCxt, SDatabaseOption int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_CACHE_LAST_ROW || val > TSDB_MAX_DB_CACHE_LAST_ROW) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option cacheLast: %d valid range: [%d, %d]", val, TSDB_MIN_DB_CACHE_LAST_ROW, TSDB_MAX_DB_CACHE_LAST_ROW); + "invalid db option cacheLast: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_DB_CACHE_LAST_ROW, TSDB_MAX_DB_CACHE_LAST_ROW); pCxt->valid = false; return pOptions; } @@ -80,7 +80,7 @@ static SDatabaseOptions* setDbComp(SAstCreateContext* pCxt, SDatabaseOptions* pO int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_COMP_LEVEL || val > TSDB_MAX_COMP_LEVEL) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option compression: %d valid range: [%d, %d]", val, TSDB_MIN_COMP_LEVEL, TSDB_MAX_COMP_LEVEL); + "invalid db option compression: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_COMP_LEVEL, TSDB_MAX_COMP_LEVEL); pCxt->valid = false; return pOptions; } @@ -92,7 +92,7 @@ static SDatabaseOptions* setDbDays(SAstCreateContext* pCxt, SDatabaseOptions* pO int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DAYS_PER_FILE || val > TSDB_MAX_DAYS_PER_FILE) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option daysPerFile: %d valid range: [%d, %d]", val, TSDB_MIN_DAYS_PER_FILE, TSDB_MAX_DAYS_PER_FILE); + "invalid db option daysPerFile: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_DAYS_PER_FILE, TSDB_MAX_DAYS_PER_FILE); pCxt->valid = false; return pOptions; } @@ -104,7 +104,7 @@ static SDatabaseOptions* setDbFsync(SAstCreateContext* pCxt, SDatabaseOptions* p int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_FSYNC_PERIOD || val > TSDB_MAX_FSYNC_PERIOD) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option fsyncPeriod: %d valid range: [%d, %d]", val, TSDB_MIN_FSYNC_PERIOD, TSDB_MAX_FSYNC_PERIOD); + "invalid db option fsyncPeriod: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_FSYNC_PERIOD, TSDB_MAX_FSYNC_PERIOD); pCxt->valid = false; return pOptions; } @@ -116,7 +116,7 @@ static SDatabaseOptions* setDbMaxRows(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_MAX_ROW_FBLOCK || val > TSDB_MAX_MAX_ROW_FBLOCK) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option maxRowsPerBlock: %d valid range: [%d, %d]", val, TSDB_MIN_MAX_ROW_FBLOCK, TSDB_MAX_MAX_ROW_FBLOCK); + "invalid db option maxRowsPerBlock: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_MAX_ROW_FBLOCK, TSDB_MAX_MAX_ROW_FBLOCK); pCxt->valid = false; return pOptions; } @@ -128,7 +128,7 @@ static SDatabaseOptions* setDbMinRows(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_MIN_ROW_FBLOCK || val > TSDB_MAX_MIN_ROW_FBLOCK) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option minRowsPerBlock: %d valid range: [%d, %d]", val, TSDB_MIN_MIN_ROW_FBLOCK, TSDB_MAX_MIN_ROW_FBLOCK); + "invalid db option minRowsPerBlock: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_MIN_ROW_FBLOCK, TSDB_MAX_MIN_ROW_FBLOCK); pCxt->valid = false; return pOptions; } @@ -140,7 +140,7 @@ static SDatabaseOptions* setDbKeep(SAstCreateContext* pCxt, SDatabaseOptions* pO int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_KEEP || val > TSDB_MAX_KEEP) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option keep: %d valid range: [%d, %d]", val, TSDB_MIN_KEEP, TSDB_MAX_KEEP); + "invalid db option keep: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_KEEP, TSDB_MAX_KEEP); pCxt->valid = false; return pOptions; } @@ -168,7 +168,7 @@ static SDatabaseOptions* setDbQuorum(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_QUORUM_OPTION || val > TSDB_MAX_DB_QUORUM_OPTION) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option quorum: %d valid range: [%d, %d]", val, TSDB_MIN_DB_QUORUM_OPTION, TSDB_MAX_DB_QUORUM_OPTION); + "invalid db option quorum: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_DB_QUORUM_OPTION, TSDB_MAX_DB_QUORUM_OPTION); pCxt->valid = false; return pOptions; } @@ -180,7 +180,7 @@ static SDatabaseOptions* setDbReplica(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_REPLICA_OPTION || val > TSDB_MAX_DB_REPLICA_OPTION) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option replications: %d valid range: [%d, %d]", val, TSDB_MIN_DB_REPLICA_OPTION, TSDB_MAX_DB_REPLICA_OPTION); + "invalid db option replications: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_DB_REPLICA_OPTION, TSDB_MAX_DB_REPLICA_OPTION); pCxt->valid = false; return pOptions; } @@ -192,7 +192,7 @@ static SDatabaseOptions* setDbTtl(SAstCreateContext* pCxt, SDatabaseOptions* pOp int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_TTL_OPTION) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option ttl: %d, should be greater than or equal to %d", val, TSDB_MIN_DB_TTL_OPTION); + "invalid db option ttl: %"PRId64", should be greater than or equal to %d", val, TSDB_MIN_DB_TTL_OPTION); pCxt->valid = false; return pOptions; } @@ -203,7 +203,7 @@ static SDatabaseOptions* setDbTtl(SAstCreateContext* pCxt, SDatabaseOptions* pOp static SDatabaseOptions* setDbWal(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal) { int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_WAL_LEVEL || val > TSDB_MAX_WAL_LEVEL) { - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option walLevel: %d, only 1-2 allowed", val); + snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option walLevel: %"PRId64", only 1-2 allowed", val); pCxt->valid = false; return pOptions; } @@ -215,7 +215,7 @@ static SDatabaseOptions* setDbVgroups(SAstCreateContext* pCxt, SDatabaseOptions* int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_VNODES_PER_DB || val > TSDB_MAX_VNODES_PER_DB) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid db option vgroups: %d valid range: [%d, %d]", val, TSDB_MIN_VNODES_PER_DB, TSDB_MAX_VNODES_PER_DB); + "invalid db option vgroups: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_VNODES_PER_DB, TSDB_MAX_VNODES_PER_DB); pCxt->valid = false; return pOptions; } @@ -226,7 +226,7 @@ static SDatabaseOptions* setDbVgroups(SAstCreateContext* pCxt, SDatabaseOptions* static SDatabaseOptions* setDbSingleStable(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal) { int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_SINGLE_STABLE_OPTION || val > TSDB_MAX_DB_SINGLE_STABLE_OPTION) { - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option singleStable: %d, only 0-1 allowed", val); + snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option singleStable: %"PRId64", only 0-1 allowed", val); pCxt->valid = false; return pOptions; } @@ -237,7 +237,7 @@ static SDatabaseOptions* setDbSingleStable(SAstCreateContext* pCxt, SDatabaseOpt static SDatabaseOptions* setDbStreamMode(SAstCreateContext* pCxt, SDatabaseOptions* pOptions, const SToken* pVal) { int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_STREAM_MODE_OPTION || val > TSDB_MAX_DB_STREAM_MODE_OPTION) { - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option streamMode: %d, only 0-1 allowed", val); + snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "invalid db option streamMode: %"PRId64", only 0-1 allowed", val); pCxt->valid = false; return pOptions; } @@ -269,7 +269,7 @@ static STableOptions* setTableKeep(SAstCreateContext* pCxt, STableOptions* pOpti int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_KEEP || val > TSDB_MAX_KEEP) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid table option keep: %d valid range: [%d, %d]", val, TSDB_MIN_KEEP, TSDB_MAX_KEEP); + "invalid table option keep: %"PRId64" valid range: [%d, %d]", val, TSDB_MIN_KEEP, TSDB_MAX_KEEP); pCxt->valid = false; return pOptions; } @@ -281,7 +281,7 @@ static STableOptions* setTableTtl(SAstCreateContext* pCxt, STableOptions* pOptio int64_t val = strtol(pVal->z, NULL, 10); if (val < TSDB_MIN_DB_TTL_OPTION) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid table option ttl: %d, should be greater than or equal to %d", val, TSDB_MIN_DB_TTL_OPTION); + "invalid table option ttl: %"PRId64", should be greater than or equal to %d", val, TSDB_MIN_DB_TTL_OPTION); pCxt->valid = false; return pOptions; } @@ -292,7 +292,7 @@ static STableOptions* setTableTtl(SAstCreateContext* pCxt, STableOptions* pOptio static STableOptions* setTableComment(SAstCreateContext* pCxt, STableOptions* pOptions, const SToken* pVal) { if (pVal->n >= sizeof(pOptions->comments)) { snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, - "invalid table option comment, length cannot exceed %d", sizeof(pOptions->comments) - 1); + "invalid table option comment, length cannot exceed %d", (int32_t)(sizeof(pOptions->comments) - 1)); pCxt->valid = false; return pOptions; } diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp index 80fd7e35b3..077a07615f 100644 --- a/source/libs/scheduler/test/schedulerTests.cpp +++ b/source/libs/scheduler/test/schedulerTests.cpp @@ -535,7 +535,9 @@ TEST(queryTest, normalCase) { char *tablename = "table1"; SVgroupInfo vgInfo = {0}; int64_t job = 0; - SQueryPlan dag = {0}; + + SQueryPlan dag; + memset(&dag, 0, sizeof(dag)); schtInitLogFile(); From 441db317fddd240ac433e04087f98f992940daeb Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 3 Mar 2022 07:25:16 -0500 Subject: [PATCH 20/26] TD-13706 client modify vnode process integration --- include/client/taos.h | 1 + include/common/ttokendef.h | 132 +- include/libs/nodes/cmdnodes.h | 11 +- include/libs/nodes/nodes.h | 6 +- include/libs/nodes/plannodes.h | 24 +- include/libs/nodes/querynodes.h | 1 + include/libs/parser/parser.h | 4 +- source/client/src/clientImpl.c | 13 +- source/libs/nodes/src/nodesCloneFuncs.c | 12 + source/libs/nodes/src/nodesCodeFuncs.c | 71 +- source/libs/nodes/src/nodesUtilFuncs.c | 41 +- source/libs/parser/inc/astCreateFuncs.h | 6 + source/libs/parser/inc/new_sql.y | 17 +- source/libs/parser/src/astCreateFuncs.c | 23 + source/libs/parser/src/astParse.c | 30 +- source/libs/parser/src/astTranslate.c | 169 +- source/libs/parser/src/new_sql.c | 2382 ++++++++++++---------- source/libs/parser/src/ttokenizer.c | 32 +- source/libs/parser/test/parserTest.cpp | 20 + source/libs/planner/inc/plannerInt.h | 9 + source/libs/planner/src/logicPlan.c | 12 +- source/libs/planner/src/physicalPlan.c | 188 +- source/libs/planner/src/planner.c | 7 + source/libs/planner/test/plannerTest.cpp | 5 + 24 files changed, 1977 insertions(+), 1239 deletions(-) diff --git a/include/client/taos.h b/include/client/taos.h index 8b1517c6ff..f098a48631 100644 --- a/include/client/taos.h +++ b/include/client/taos.h @@ -51,6 +51,7 @@ typedef void **TAOS_ROW; #define TSDB_DATA_TYPE_JSON 17 // json #define TSDB_DATA_TYPE_DECIMAL 18 // decimal #define TSDB_DATA_TYPE_BLOB 19 // binary +#define TSDB_DATA_TYPE_MEDIUMBLOB 20 typedef enum { TSDB_OPTION_LOCALE, diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index fe5e1cc68c..9e961ff111 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -57,63 +57,85 @@ #define TK_VGROUPS 39 #define TK_SINGLESTABLE 40 #define TK_STREAMMODE 41 -#define TK_NK_FLOAT 42 -#define TK_NK_BOOL 43 -#define TK_TIMESTAMP 44 -#define TK_NK_VARIABLE 45 -#define TK_NK_COMMA 46 -#define TK_NK_ID 47 -#define TK_NK_LP 48 -#define TK_NK_RP 49 -#define TK_NK_DOT 50 -#define TK_BETWEEN 51 -#define TK_IS 52 -#define TK_NULL 53 -#define TK_NK_LT 54 -#define TK_NK_GT 55 -#define TK_NK_LE 56 -#define TK_NK_GE 57 -#define TK_NK_NE 58 -#define TK_NK_EQ 59 -#define TK_LIKE 60 -#define TK_MATCH 61 -#define TK_NMATCH 62 -#define TK_IN 63 -#define TK_FROM 64 -#define TK_AS 65 -#define TK_JOIN 66 -#define TK_ON 67 -#define TK_INNER 68 -#define TK_SELECT 69 -#define TK_DISTINCT 70 -#define TK_WHERE 71 -#define TK_PARTITION 72 -#define TK_BY 73 -#define TK_SESSION 74 -#define TK_STATE_WINDOW 75 -#define TK_INTERVAL 76 -#define TK_SLIDING 77 -#define TK_FILL 78 -#define TK_VALUE 79 -#define TK_NONE 80 -#define TK_PREV 81 -#define TK_LINEAR 82 -#define TK_NEXT 83 -#define TK_GROUP 84 -#define TK_HAVING 85 -#define TK_ORDER 86 -#define TK_SLIMIT 87 -#define TK_SOFFSET 88 -#define TK_LIMIT 89 -#define TK_OFFSET 90 -#define TK_ASC 91 -#define TK_DESC 92 -#define TK_NULLS 93 -#define TK_FIRST 94 -#define TK_LAST 95 +#define TK_USE 42 +#define TK_TABLE 43 +#define TK_NK_LP 44 +#define TK_NK_RP 45 +#define TK_NK_ID 46 +#define TK_NK_DOT 47 +#define TK_NK_COMMA 48 +#define TK_COMMENT 49 +#define TK_BOOL 50 +#define TK_TINYINT 51 +#define TK_SMALLINT 52 +#define TK_INT 53 +#define TK_INTEGER 54 +#define TK_BIGINT 55 +#define TK_FLOAT 56 +#define TK_DOUBLE 57 +#define TK_BINARY 58 +#define TK_TIMESTAMP 59 +#define TK_NCHAR 60 +#define TK_UNSIGNED 61 +#define TK_JSON 62 +#define TK_VARCHAR 63 +#define TK_MEDIUMBLOB 64 +#define TK_BLOB 65 +#define TK_VARBINARY 66 +#define TK_DECIMAL 67 +#define TK_SHOW 68 +#define TK_DATABASES 69 +#define TK_NK_FLOAT 70 +#define TK_NK_BOOL 71 +#define TK_NK_VARIABLE 72 +#define TK_BETWEEN 73 +#define TK_IS 74 +#define TK_NULL 75 +#define TK_NK_LT 76 +#define TK_NK_GT 77 +#define TK_NK_LE 78 +#define TK_NK_GE 79 +#define TK_NK_NE 80 +#define TK_NK_EQ 81 +#define TK_LIKE 82 +#define TK_MATCH 83 +#define TK_NMATCH 84 +#define TK_IN 85 +#define TK_FROM 86 +#define TK_AS 87 +#define TK_JOIN 88 +#define TK_ON 89 +#define TK_INNER 90 +#define TK_SELECT 91 +#define TK_DISTINCT 92 +#define TK_WHERE 93 +#define TK_PARTITION 94 +#define TK_BY 95 +#define TK_SESSION 96 +#define TK_STATE_WINDOW 97 +#define TK_INTERVAL 98 +#define TK_SLIDING 99 +#define TK_FILL 100 +#define TK_VALUE 101 +#define TK_NONE 102 +#define TK_PREV 103 +#define TK_LINEAR 104 +#define TK_NEXT 105 +#define TK_GROUP 106 +#define TK_HAVING 107 +#define TK_ORDER 108 +#define TK_SLIMIT 109 +#define TK_SOFFSET 110 +#define TK_LIMIT 111 +#define TK_OFFSET 112 +#define TK_ASC 113 +#define TK_DESC 114 +#define TK_NULLS 115 +#define TK_FIRST 116 +#define TK_LAST 117 #define TK_SPACE 300 -#define TK_COMMENT 301 +#define TK_NK_COMMENT 301 #define TK_ILLEGAL 302 #define TK_HEX 303 // hex number 0x123 #define TK_OCT 304 // oct number diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 9344fd09c3..cddecfd9c5 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -13,8 +13,8 @@ * along with this program. If not, see . */ -#ifndef _TD_PLANN_NODES_H_ -#define _TD_PLANN_NODES_H_ +#ifndef _TD_CMD_NODES_H_ +#define _TD_CMD_NODES_H_ #ifdef __cplusplus extern "C" { @@ -49,6 +49,11 @@ typedef struct SCreateDatabaseStmt { SDatabaseOptions options; } SCreateDatabaseStmt; +typedef struct SUseDatabaseStmt { + ENodeType type; + char dbName[TSDB_DB_NAME_LEN]; +} SUseDatabaseStmt; + typedef struct STableOptions { int32_t keep; int32_t ttl; @@ -77,4 +82,4 @@ typedef struct SCreateTableStmt { } #endif -#endif /*_TD_PLANN_NODES_H_*/ +#endif /*_TD_CMD_NODES_H_*/ diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index eadf618d08..92af6151b5 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -70,16 +70,18 @@ typedef enum ENodeType { // Statement nodes are used in parser and planner module. QUERY_NODE_SET_OPERATOR, QUERY_NODE_SELECT_STMT, - QUERY_NODE_SHOW_STMT, QUERY_NODE_VNODE_MODIF_STMT, QUERY_NODE_CREATE_DATABASE_STMT, QUERY_NODE_CREATE_TABLE_STMT, + QUERY_NODE_USE_DATABASE_STMT, + QUERY_NODE_SHOW_DATABASE_STMT, // temp // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN, QUERY_NODE_LOGIC_PLAN_JOIN, QUERY_NODE_LOGIC_PLAN_AGG, QUERY_NODE_LOGIC_PLAN_PROJECT, + QUERY_NODE_LOGIC_PLAN_VNODE_MODIF, QUERY_NODE_LOGIC_SUBPLAN, QUERY_NODE_LOGIC_PLAN, @@ -94,6 +96,7 @@ typedef enum ENodeType { QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, QUERY_NODE_PHYSICAL_PLAN_SORT, QUERY_NODE_PHYSICAL_PLAN_DISPATCH, + QUERY_NODE_PHYSICAL_PLAN_INSERT, QUERY_NODE_PHYSICAL_SUBPLAN, QUERY_NODE_PHYSICAL_PLAN } ENodeType; @@ -153,6 +156,7 @@ bool nodesEqualNode(const SNodeptr a, const SNodeptr b); SNodeptr nodesCloneNode(const SNodeptr pNode); SNodeList* nodesCloneList(const SNodeList* pList); +const char* nodesNodeName(ENodeType type); int32_t nodesNodeToString(const SNodeptr pNode, bool format, char** pStr, int32_t* pLen); int32_t nodesStringToNode(const char* pStr, SNode** pNode); diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h index cf5d17cd74..d72befcaf0 100644 --- a/include/libs/nodes/plannodes.h +++ b/include/libs/nodes/plannodes.h @@ -65,11 +65,28 @@ typedef struct SProjectLogicNode { SNodeList* pProjections; } SProjectLogicNode; +typedef struct SVnodeModifLogicNode { + ENodeType type;; + int32_t msgType; + SArray* pDataBlocks; + SVgDataBlocks* pVgDataBlocks; +} SVnodeModifLogicNode; + +typedef enum ESubplanType { + SUBPLAN_TYPE_MERGE = 1, + SUBPLAN_TYPE_PARTIAL, + SUBPLAN_TYPE_SCAN, + SUBPLAN_TYPE_MODIFY +} ESubplanType; + typedef struct SSubLogicPlan { ENodeType type; SNodeList* pChildren; SNodeList* pParents; SLogicNode* pNode; + SQueryNodeAddr execNode; + ESubplanType subplanType; + int32_t level; } SSubLogicPlan; typedef struct SQueryLogicPlan { @@ -178,13 +195,6 @@ typedef struct SSubplanId { int32_t subplanId; } SSubplanId; -typedef enum ESubplanType { - SUBPLAN_TYPE_MERGE = 1, - SUBPLAN_TYPE_PARTIAL, - SUBPLAN_TYPE_SCAN, - SUBPLAN_TYPE_MODIFY -} ESubplanType; - typedef struct SSubplan { ENodeType type; SSubplanId id; // unique id of the subplan diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 4cc39325f7..342913343a 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -264,6 +264,7 @@ typedef struct SVgDataBlocks { typedef struct SVnodeModifOpStmt { ENodeType nodeType; + ENodeType sqlNodeType; SArray* pDataBlocks; // data block for each vgroup, SArray. int8_t schemaAttache; // denote if submit block is built with table schema or not uint8_t payloadType; // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h index cb23a30aac..06d9919755 100644 --- a/include/libs/parser/parser.h +++ b/include/libs/parser/parser.h @@ -43,7 +43,9 @@ typedef struct SCmdMsgInfo { } SCmdMsgInfo; typedef struct SQuery { - bool isCmd; + bool directRpc; + bool haveResultSet; + ENodeType sqlNodeType; SNode* pRoot; int32_t numOfResCols; SSchema* pResSchema; diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 0e60305d40..fb7b4ad130 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -161,7 +161,7 @@ int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery) { } code = qParseQuerySql(&cxt, pQuery); - if (TSDB_CODE_SUCCESS == code && !((*pQuery)->isCmd)) { + if (TSDB_CODE_SUCCESS == code && ((*pQuery)->haveResultSet)) { setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols); } @@ -184,19 +184,12 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) { } int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pDag, SArray* pNodeList) { - // pRequest->type = pQuery->type; - + pRequest->type = pQuery->sqlNodeType; SPlanContext cxt = { .queryId = pRequest->requestId, .pAstRoot = pQuery->pRoot }; int32_t code = qCreateQueryPlan(&cxt, pDag); if (code != 0) { return code; } - - // if (pQuery->type == TSDB_SQL_SELECT) { - // setResSchemaInfo(&pRequest->body.resInfo, pSchema, numOfCols); - // pRequest->type = TDMT_VND_QUERY; - // } - return code; } @@ -254,7 +247,7 @@ TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) { CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return); CHECK_CODE_GOTO(parseSql(pRequest, &pQuery), _return); - if (pQuery->isCmd) { + if (pQuery->directRpc) { CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return); } else { CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList), _return); diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index a125906faf..befe96050a 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include "plannodes.h" #include "querynodes.h" #include "taos.h" #include "taoserror.h" @@ -157,6 +158,13 @@ static SNode* groupingSetNodeCopy(const SGroupingSetNode* pSrc, SGroupingSetNode return (SNode*)pDst; } +static SNode* logicSubplanCopy(const SSubLogicPlan* pSrc, SSubLogicPlan* pDst) { + COPY_NODE_FIELD(pNode); + COPY_SCALAR_FIELD(execNode); + COPY_SCALAR_FIELD(subplanType); + return (SNode*)pDst; +} + SNodeptr nodesCloneNode(const SNodeptr pNode) { if (NULL == pNode) { return NULL; @@ -187,9 +195,13 @@ SNodeptr nodesCloneNode(const SNodeptr pNode) { return groupingSetNodeCopy((const SGroupingSetNode*)pNode, (SGroupingSetNode*)pDst); case QUERY_NODE_ORDER_BY_EXPR: case QUERY_NODE_LIMIT: + break; + case QUERY_NODE_LOGIC_SUBPLAN: + return logicSubplanCopy((const SSubLogicPlan*)pNode, (SSubLogicPlan*)pDst); default: break; } + printf("nodesCloneNode unknown node = %s\n", nodesNodeName(nodeType(pNode))); return pDst; } diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index f01aac7b5c..284798a3ba 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -24,7 +24,7 @@ static int32_t jsonToNode(const SJson* pJson, void* pObj); static int32_t jsonToNodeObject(const SJson* pJson, const char* pName, SNode** pNode); static int32_t makeNodeByJson(const SJson* pJson, SNode** pNode); -static char* nodeName(ENodeType type) { +const char* nodesNodeName(ENodeType type) { switch (type) { case QUERY_NODE_COLUMN: return "Column"; @@ -58,20 +58,30 @@ static char* nodeName(ENodeType type) { return "NodeList"; case QUERY_NODE_FILL: return "Fill"; - case QUERY_NODE_TARGET: - return "Target"; case QUERY_NODE_RAW_EXPR: return "RawExpr"; + case QUERY_NODE_TARGET: + return "Target"; case QUERY_NODE_DATABLOCK_DESC: return "TupleDesc"; case QUERY_NODE_SLOT_DESC: return "SlotDesc"; + case QUERY_NODE_COLUMN_DEF: + return "ColumnDef"; case QUERY_NODE_SET_OPERATOR: return "SetOperator"; case QUERY_NODE_SELECT_STMT: return "SelectStmt"; - case QUERY_NODE_SHOW_STMT: - return "ShowStmt"; + case QUERY_NODE_VNODE_MODIF_STMT: + return "VnodeModifStmt"; + case QUERY_NODE_CREATE_DATABASE_STMT: + return "CreateDatabaseStmt"; + case QUERY_NODE_CREATE_TABLE_STMT: + return "CreateTableStmt"; + case QUERY_NODE_USE_DATABASE_STMT: + return "UseDatabaseStmt"; + case QUERY_NODE_SHOW_DATABASE_STMT: + return "ShowDatabaseStmt"; case QUERY_NODE_LOGIC_PLAN_SCAN: return "LogicScan"; case QUERY_NODE_LOGIC_PLAN_JOIN: @@ -80,16 +90,34 @@ static char* nodeName(ENodeType type) { return "LogicAgg"; case QUERY_NODE_LOGIC_PLAN_PROJECT: return "LogicProject"; + case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF: + return "LogicVnodeModif"; + case QUERY_NODE_LOGIC_SUBPLAN: + return "LogicSubplan"; + case QUERY_NODE_LOGIC_PLAN: + return "LogicPlan"; case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: return "PhysiTagScan"; case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: return "PhysiTableScan"; + case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN: + return "PhysiTableSeqScan"; + case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: + return "PhysiSreamScan"; case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return "PhysiProject"; case QUERY_NODE_PHYSICAL_PLAN_JOIN: return "PhysiJoin"; case QUERY_NODE_PHYSICAL_PLAN_AGG: return "PhysiAgg"; + case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: + return "PhysiExchange"; + case QUERY_NODE_PHYSICAL_PLAN_SORT: + return "PhysiSort"; + case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: + return "PhysiDispatch"; + case QUERY_NODE_PHYSICAL_PLAN_INSERT: + return "PhysiInsert"; case QUERY_NODE_PHYSICAL_SUBPLAN: return "PhysiSubplan"; case QUERY_NODE_PHYSICAL_PLAN: @@ -1249,23 +1277,28 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { case QUERY_NODE_STATE_WINDOW: case QUERY_NODE_SESSION_WINDOW: case QUERY_NODE_INTERVAL_WINDOW: + break; case QUERY_NODE_NODE_LIST: return nodeListNodeToJson(pObj, pJson); case QUERY_NODE_FILL: + case QUERY_NODE_RAW_EXPR: break; case QUERY_NODE_TARGET: return targetNodeToJson(pObj, pJson); - case QUERY_NODE_RAW_EXPR: - break; case QUERY_NODE_DATABLOCK_DESC: return dataBlockDescNodeToJson(pObj, pJson); case QUERY_NODE_SLOT_DESC: return slotDescNodeToJson(pObj, pJson); + case QUERY_NODE_COLUMN_DEF: case QUERY_NODE_SET_OPERATOR: break; case QUERY_NODE_SELECT_STMT: return selectStmtTojson(pObj, pJson); - case QUERY_NODE_SHOW_STMT: + case QUERY_NODE_VNODE_MODIF_STMT: + case QUERY_NODE_CREATE_DATABASE_STMT: + case QUERY_NODE_CREATE_TABLE_STMT: + case QUERY_NODE_USE_DATABASE_STMT: + case QUERY_NODE_SHOW_DATABASE_STMT: break; case QUERY_NODE_LOGIC_PLAN_SCAN: return logicScanNodeToJson(pObj, pJson); @@ -1275,16 +1308,28 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { return logicAggNodeToJson(pObj, pJson); case QUERY_NODE_LOGIC_PLAN_PROJECT: return logicProjectNodeToJson(pObj, pJson); + case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF: + case QUERY_NODE_LOGIC_SUBPLAN: + case QUERY_NODE_LOGIC_PLAN: + break; case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: 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; case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return physiProjectNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_JOIN: return physiJoinNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_AGG: return physiAggNodeToJson(pObj, pJson); + case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: + case QUERY_NODE_PHYSICAL_PLAN_SORT: + case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: + case QUERY_NODE_PHYSICAL_PLAN_INSERT: + break; case QUERY_NODE_PHYSICAL_SUBPLAN: return subplanToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN: @@ -1292,7 +1337,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { default: break; } - printf("================================ specificNodeToJson unknown node = %s\n", nodeName(nodeType(pObj))); + printf("================================ specificNodeToJson unknown node = %s\n", nodesNodeName(nodeType(pObj))); return TSDB_CODE_SUCCESS; } @@ -1334,8 +1379,6 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { // break; // case QUERY_NODE_SELECT_STMT: // return jsonToSelectStmt(pJson, pObj); - // case QUERY_NODE_SHOW_STMT: - // break; // case QUERY_NODE_LOGIC_PLAN_SCAN: // return jsonToLogicScanNode(pJson, pObj); // case QUERY_NODE_LOGIC_PLAN_JOIN: @@ -1372,10 +1415,10 @@ static int32_t nodeToJson(const void* pObj, SJson* pJson) { int32_t code = tjsonAddIntegerToObject(pJson, jkNodeType, pNode->type); if (TSDB_CODE_SUCCESS == code) { - code = tjsonAddStringToObject(pJson, jkNodeName, nodeName(pNode->type)); + code = tjsonAddStringToObject(pJson, jkNodeName, nodesNodeName(pNode->type)); } if (TSDB_CODE_SUCCESS == code) { - code = tjsonAddObject(pJson, nodeName(pNode->type), specificNodeToJson, pNode); + code = tjsonAddObject(pJson, nodesNodeName(pNode->type), specificNodeToJson, pNode); } return code; @@ -1388,7 +1431,7 @@ static int32_t jsonToNode(const SJson* pJson, void* pObj) { int32_t code = tjsonGetIntValue(pJson, jkNodeType, &val); pNode->type = val; if (TSDB_CODE_SUCCESS == code) { - code = tjsonToObject(pJson, nodeName(pNode->type), jsonToSpecificNode, pNode); + code = tjsonToObject(pJson, nodesNodeName(pNode->type), jsonToSpecificNode, pNode); } return code; diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 7fffaa268c..498668d231 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include "cmdnodes.h" #include "querynodes.h" #include "plannodes.h" #include "taos.h" @@ -65,12 +66,28 @@ SNodeptr nodesMakeNode(ENodeType type) { return makeNode(type, sizeof(SFillNode)); case QUERY_NODE_RAW_EXPR: return makeNode(type, sizeof(SRawExprNode)); + case QUERY_NODE_TARGET: + return makeNode(type, sizeof(STargetNode)); + case QUERY_NODE_DATABLOCK_DESC: + return makeNode(type, sizeof(SDataBlockDescNode)); + case QUERY_NODE_SLOT_DESC: + return makeNode(type, sizeof(SSlotDescNode)); + case QUERY_NODE_COLUMN_DEF: + return makeNode(type, sizeof(SColumnDefNode)); case QUERY_NODE_SET_OPERATOR: return makeNode(type, sizeof(SSetOperator)); case QUERY_NODE_SELECT_STMT: return makeNode(type, sizeof(SSelectStmt)); - // case QUERY_NODE_SHOW_STMT: - // return makeNode(type, sizeof(SShowStmt)); + case QUERY_NODE_VNODE_MODIF_STMT: + return makeNode(type, sizeof(SVnodeModifOpStmt)); + case QUERY_NODE_CREATE_DATABASE_STMT: + return makeNode(type, sizeof(SCreateDatabaseStmt)); + case QUERY_NODE_CREATE_TABLE_STMT: + return makeNode(type, sizeof(SCreateTableStmt)); + case QUERY_NODE_USE_DATABASE_STMT: + return makeNode(type, sizeof(SUseDatabaseStmt)); + case QUERY_NODE_SHOW_DATABASE_STMT: + return makeNode(type, sizeof(SNode));; case QUERY_NODE_LOGIC_PLAN_SCAN: return makeNode(type, sizeof(SScanLogicNode)); case QUERY_NODE_LOGIC_PLAN_JOIN: @@ -79,26 +96,34 @@ SNodeptr nodesMakeNode(ENodeType type) { return makeNode(type, sizeof(SAggLogicNode)); case QUERY_NODE_LOGIC_PLAN_PROJECT: return makeNode(type, sizeof(SProjectLogicNode)); + case QUERY_NODE_LOGIC_PLAN_VNODE_MODIF: + return makeNode(type, sizeof(SVnodeModifLogicNode)); case QUERY_NODE_LOGIC_SUBPLAN: return makeNode(type, sizeof(SSubLogicPlan)); case QUERY_NODE_LOGIC_PLAN: return makeNode(type, sizeof(SQueryLogicPlan)); - case QUERY_NODE_TARGET: - return makeNode(type, sizeof(STargetNode)); - case QUERY_NODE_DATABLOCK_DESC: - return makeNode(type, sizeof(SDataBlockDescNode)); - case QUERY_NODE_SLOT_DESC: - return makeNode(type, sizeof(SSlotDescNode)); case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: return makeNode(type, sizeof(STagScanPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: return makeNode(type, sizeof(STableScanPhysiNode)); + 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)); case QUERY_NODE_PHYSICAL_PLAN_PROJECT: return makeNode(type, sizeof(SProjectPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_JOIN: return makeNode(type, sizeof(SJoinPhysiNode)); case QUERY_NODE_PHYSICAL_PLAN_AGG: return makeNode(type, sizeof(SAggPhysiNode)); + case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: + return makeNode(type, sizeof(SExchangePhysiNode)); + case QUERY_NODE_PHYSICAL_PLAN_SORT: + return makeNode(type, sizeof(SNode)); + case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: + return makeNode(type, sizeof(SDataDispatcherNode)); + case QUERY_NODE_PHYSICAL_PLAN_INSERT: + return makeNode(type, sizeof(SDataInserterNode)); case QUERY_NODE_PHYSICAL_SUBPLAN: return makeNode(type, sizeof(SSubplan)); case QUERY_NODE_PHYSICAL_PLAN: diff --git a/source/libs/parser/inc/astCreateFuncs.h b/source/libs/parser/inc/astCreateFuncs.h index 5cddd82e2c..6c03543527 100644 --- a/source/libs/parser/inc/astCreateFuncs.h +++ b/source/libs/parser/inc/astCreateFuncs.h @@ -116,8 +116,14 @@ typedef enum ETableOptionType { STableOptions* createDefaultTableOptions(SAstCreateContext* pCxt); STableOptions* setTableOption(SAstCreateContext* pCxt, STableOptions* pOptions, ETableOptionType type, const SToken* pVal); 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); SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, const STokenPair* pFullTableName, SNodeList* pCols, STableOptions* pOptions); +SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName); + +SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type); + #ifdef __cplusplus } #endif diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y index 0ecacc432a..dbd966c6d8 100644 --- a/source/libs/parser/inc/new_sql.y +++ b/source/libs/parser/inc/new_sql.y @@ -92,22 +92,25 @@ db_options(A) ::= db_options(B) VGROUPS NK_INTEGER(C). db_options(A) ::= db_options(B) SINGLESTABLE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_SINGLESTABLE, &C); } db_options(A) ::= db_options(B) STREAMMODE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STREAMMODE, &C); } +/************************************************ create database *****************************************************/ +cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A);} + /************************************************ create table *******************************************************/ cmd ::= CREATE TABLE exists_opt(A) full_table_name(B) NK_LP column_def_list(C) NK_RP table_options(D). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, &B, C, D);} %type full_table_name { STokenPair } %destructor full_table_name { } -full_table_name(A) ::= NK_ID(B). { A = { .first = B, .second = nil_token}; } -full_table_name(A) ::= NK_ID(B) NK_DOT NK_ID(C). { A = { .first = B, .second = C}; } +full_table_name(A) ::= NK_ID(B). { STokenPair t = { .first = B, .second = nil_token}; A = t; } +full_table_name(A) ::= NK_ID(B) NK_DOT NK_ID(C). { STokenPair t = { .first = B, .second = C}; A = t; } %type column_def_list { SNodeList* } %destructor column_def_list { nodesDestroyList($$); } column_def_list(A) ::= column_def(B). { A = createNodeList(pCxt, B); } column_def_list(A) ::= column_def_list(B) NK_COMMA column_def(C). { A = addNodeToList(pCxt, B, C); } -column_def(A) ::= column_name(B) type_name(C). { A = createColumnDefNode(pCxt, B, C, NULL); } -column_def(A) ::= column_name(B) type_name(C) COMMENT NK_STRING(D). { A = createColumnDefNode(pCxt, B, C, &D); } +column_def(A) ::= column_name(B) type_name(C). { A = createColumnDefNode(pCxt, &B, C, NULL); } +column_def(A) ::= column_name(B) type_name(C) COMMENT NK_STRING(D). { A = createColumnDefNode(pCxt, &B, C, &D); } %type type_name { SDataType } %destructor type_name { } @@ -115,6 +118,7 @@ type_name(A) ::= BOOL. type_name(A) ::= TINYINT. { A = createDataType(TSDB_DATA_TYPE_TINYINT); } type_name(A) ::= SMALLINT. { A = createDataType(TSDB_DATA_TYPE_SMALLINT); } type_name(A) ::= INT. { A = createDataType(TSDB_DATA_TYPE_INT); } +type_name(A) ::= INTEGER. { A = createDataType(TSDB_DATA_TYPE_INT); } type_name(A) ::= BIGINT. { A = createDataType(TSDB_DATA_TYPE_BIGINT); } type_name(A) ::= FLOAT. { A = createDataType(TSDB_DATA_TYPE_FLOAT); } type_name(A) ::= DOUBLE. { A = createDataType(TSDB_DATA_TYPE_DOUBLE); } @@ -134,14 +138,15 @@ type_name(A) ::= DECIMAL. type_name(A) ::= DECIMAL NK_LP NK_INTEGER NK_RP. { A = createDataType(TSDB_DATA_TYPE_DECIMAL); } type_name(A) ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP. { A = createDataType(TSDB_DATA_TYPE_DECIMAL); } -%type table_options { SDatabaseOptions* } +%type table_options { STableOptions* } %destructor table_options { tfree($$); } table_options(A) ::= . { A = createDefaultTableOptions(pCxt);} table_options(A) ::= table_options(B) COMMENT NK_INTEGER(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); } -//cmd ::= SHOW DATABASES. { PARSER_TRACE; createShowStmt(pCxt, SHOW_TYPE_DATABASE); } +/************************************************ show ***************************************************************/ +cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASE_STMT); } /************************************************ select *************************************************************/ cmd ::= query_expression(A). { PARSER_TRACE; pCxt->pRootNode = A; } diff --git a/source/libs/parser/src/astCreateFuncs.c b/source/libs/parser/src/astCreateFuncs.c index a531f3de71..32e8300548 100644 --- a/source/libs/parser/src/astCreateFuncs.c +++ b/source/libs/parser/src/astCreateFuncs.c @@ -719,6 +719,16 @@ SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDat return (SNode*)pCol; } +SDataType createDataType(uint8_t type) { + SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = 0 }; + return dt; +} + +SDataType createVarLenDataType(uint8_t type, const SToken* pLen) { + SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = 0 }; + return dt; +} + SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, const STokenPair* pFullTableName, SNodeList* pCols, STableOptions* pOptions) { SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT); @@ -732,3 +742,16 @@ SNode* createCreateTableStmt(SAstCreateContext* pCxt, pStmt->options = *pOptions; return (SNode*)pStmt; } + +SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) { + SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT); + CHECK_OUT_OF_MEM(pStmt); + strncpy(pStmt->dbName, pDbName->z, pDbName->n); + return (SNode*)pStmt; +} + +SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) { + SNode* pStmt = nodesMakeNode(QUERY_NODE_SHOW_DATABASE_STMT);; + CHECK_OUT_OF_MEM(pStmt); + return pStmt; +} diff --git a/source/libs/parser/src/astParse.c b/source/libs/parser/src/astParse.c index 7519b36861..c940e10486 100644 --- a/source/libs/parser/src/astParse.c +++ b/source/libs/parser/src/astParse.c @@ -26,18 +26,19 @@ extern void NewParse(void*, int, SToken, void*); extern void NewParseFree(void*, FFree); extern void NewParseTrace(FILE*, char*); -static bool isCmd(const SNode* pRootNode) { - if (NULL == pRootNode) { - return true; +static void setQuery(SAstCreateContext* pCxt, SQuery* pQuery) { + pQuery->pRoot = pCxt->pRootNode; + ENodeType type = nodeType(pCxt->pRootNode); + if (QUERY_NODE_SELECT_STMT == type) { + pQuery->haveResultSet = true; + pQuery->directRpc = false; + } else if (QUERY_NODE_CREATE_TABLE_STMT == type) { + pQuery->haveResultSet = false; + pQuery->directRpc = false; + } else { + pQuery->haveResultSet = false; + pQuery->directRpc = true; } - switch (nodeType(pRootNode)) { - case QUERY_NODE_SELECT_STMT: - case QUERY_NODE_CREATE_TABLE_STMT: - return false; - default: - break; - } - return true; } int32_t doParse(SParseContext* pParseCxt, SQuery** pQuery) { @@ -60,6 +61,10 @@ int32_t doParse(SParseContext* pParseCxt, SQuery** pQuery) { case TK_COMMENT: { break; } + case TK_SEMI: { + NewParse(pParser, 0, t0, &cxt); + goto abort_parse; + } case TK_QUESTION: case TK_ILLEGAL: { snprintf(cxt.pQueryCxt->pMsg, cxt.pQueryCxt->msgLen, "unrecognized token: \"%s\"", t0.z); @@ -89,8 +94,7 @@ abort_parse: if (NULL == *pQuery) { return TSDB_CODE_OUT_OF_MEMORY; } - (*pQuery)->isCmd = isCmd(cxt.pRootNode); - (*pQuery)->pRoot = cxt.pRootNode; + setQuery(&cxt, *pQuery); } return cxt.valid ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED; } diff --git a/source/libs/parser/src/astTranslate.c b/source/libs/parser/src/astTranslate.c index 24a9468d2a..6f00ec9787 100644 --- a/source/libs/parser/src/astTranslate.c +++ b/source/libs/parser/src/astTranslate.c @@ -829,10 +829,52 @@ static int32_t translateCreateDatabase(STranslateContext* pCxt, SCreateDatabaseS 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)); + + SUseDbReq usedbReq = {0}; + tNameExtractFullName(&name, usedbReq.db); + + 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_USE_DB; + pCxt->pCmdMsg->msgLen = tSerializeSUseDbReq(NULL, 0, &usedbReq); + pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen); + if (NULL== pCxt->pCmdMsg->pMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + tSerializeSUseDbReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &usedbReq); + + return TSDB_CODE_SUCCESS; +} + static int32_t translateCreateTable(STranslateContext* pCxt, SCreateTableStmt* pStmt) { return TSDB_CODE_SUCCESS; } +static int32_t translateShow(STranslateContext* pCxt) { + SShowReq showReq = { .type = TSDB_MGMT_TABLE_DB }; + + 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_SHOW; + pCxt->pCmdMsg->msgLen = tSerializeSShowReq(NULL, 0, &showReq); + pCxt->pCmdMsg->pMsg = malloc(pCxt->pCmdMsg->msgLen); + if (NULL== pCxt->pCmdMsg->pMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + tSerializeSShowReq(pCxt->pCmdMsg->pMsg, pCxt->pCmdMsg->msgLen, &showReq); + + return TSDB_CODE_SUCCESS; +} + static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pNode)) { @@ -842,6 +884,11 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_CREATE_DATABASE_STMT: code = translateCreateDatabase(pCxt, (SCreateDatabaseStmt*)pNode); break; + case QUERY_NODE_USE_DATABASE_STMT: + code = translateUseDatabase(pCxt, (SUseDatabaseStmt*)pNode); + break; + case QUERY_NODE_SHOW_DATABASE_STMT: + code = translateShow(pCxt); case QUERY_NODE_CREATE_TABLE_STMT: code = translateCreateTable(pCxt, (SCreateTableStmt*)pNode); break; @@ -862,7 +909,7 @@ static int32_t translateSubquery(STranslateContext* pCxt, SNode* pNode) { return code; } -int32_t setReslutSchema(STranslateContext* pCxt, SQuery* pQuery) { +static int32_t setReslutSchema(STranslateContext* pCxt, SQuery* pQuery) { if (QUERY_NODE_SELECT_STMT == nodeType(pQuery->pRoot)) { SSelectStmt* pSelect = (SSelectStmt*)pQuery->pRoot; pQuery->numOfResCols = LIST_LENGTH(pSelect->pProjectionList); @@ -882,7 +929,7 @@ int32_t setReslutSchema(STranslateContext* pCxt, SQuery* pQuery) { return TSDB_CODE_SUCCESS; } -void destroyTranslateContext(STranslateContext* pCxt) { +static void destroyTranslateContext(STranslateContext* pCxt) { taosArrayDestroy(pCxt->pNsLevel); if (NULL != pCxt->pCmdMsg) { tfree(pCxt->pCmdMsg->pMsg); @@ -890,6 +937,116 @@ void destroyTranslateContext(STranslateContext* pCxt) { } } +typedef struct SVgroupTablesBatch { + SVCreateTbBatchReq req; + SVgroupInfo info; +} SVgroupTablesBatch; + +static void toSchema(const SColumnNode* pCol, SSchema* pSchema) { + pSchema->type = pCol->node.resType.type; + pSchema->bytes = pCol->node.resType.bytes; + strcpy(pSchema->name, pCol->colName); +} + +static int32_t doBuildSingleTableBatchReq(SName* pTableName, SNodeList* pColumns, SVgroupInfo* pVgroupInfo, SVgroupTablesBatch* pBatch) { + SVCreateTbReq req = {0}; + req.type = TD_NORMAL_TABLE; + req.name = strdup(tNameGetTableName(pTableName)); + + req.ntbCfg.nCols = LIST_LENGTH(pColumns); + int32_t num = req.ntbCfg.nCols; + + req.ntbCfg.pSchema = calloc(num, sizeof(SSchema)); + SNode* pCol; + int32_t index = 0; + FOREACH(pCol, pColumns) { + toSchema((SColumnNode*)pCol, req.ntbCfg.pSchema + index++); + } + + pBatch->info = *pVgroupInfo; + pBatch->req.pArray = taosArrayInit(1, sizeof(struct SVCreateTbReq)); + if (pBatch->req.pArray == NULL) { + return TSDB_CODE_QRY_OUT_OF_MEMORY; + } + + taosArrayPush(pBatch->req.pArray, &req); + return TSDB_CODE_SUCCESS; +} + +static int32_t serializeVgroupTablesBatchImpl(SVgroupTablesBatch* pTbBatch, SArray* pBufArray) { + int tlen = sizeof(SMsgHead) + tSerializeSVCreateTbBatchReq(NULL, &(pTbBatch->req)); + void* buf = malloc(tlen); + if (buf == NULL) { + // TODO: handle error + } + + ((SMsgHead*)buf)->vgId = htonl(pTbBatch->info.vgId); + ((SMsgHead*)buf)->contLen = htonl(tlen); + + void* pBuf = POINTER_SHIFT(buf, sizeof(SMsgHead)); + tSerializeSVCreateTbBatchReq(&pBuf, &(pTbBatch->req)); + + SVgDataBlocks* pVgData = calloc(1, sizeof(SVgDataBlocks)); + pVgData->vg = pTbBatch->info; + pVgData->pData = buf; + pVgData->size = tlen; + pVgData->numOfTables = (int32_t) taosArrayGetSize(pTbBatch->req.pArray); + + taosArrayPush(pBufArray, &pVgData); +} + +static void destroyCreateTbReqBatch(SVgroupTablesBatch* pTbBatch) { + size_t size = taosArrayGetSize(pTbBatch->req.pArray); + for(int32_t i = 0; i < size; ++i) { + SVCreateTbReq* pTableReq = taosArrayGet(pTbBatch->req.pArray, i); + tfree(pTableReq->name); + + if (pTableReq->type == TSDB_NORMAL_TABLE) { + tfree(pTableReq->ntbCfg.pSchema); + } else if (pTableReq->type == TSDB_CHILD_TABLE) { + tfree(pTableReq->ctbCfg.pTag); + } else { + assert(0); + } + } + + taosArrayDestroy(pTbBatch->req.pArray); +} + +static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { + if (QUERY_NODE_CREATE_TABLE_STMT == nodeType(pQuery->pRoot)) { + SCreateTableStmt* pStmt = (SCreateTableStmt*)pQuery->pRoot; + + SName tableName = { .type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId }; + strcpy(tableName.dbname, pStmt->dbName); + strcpy(tableName.tname, pStmt->tableName); + SVgroupInfo info = {0}; + catalogGetTableHashVgroup(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &pCxt->pParseCxt->mgmtEpSet, &tableName, &info); + + SVgroupTablesBatch tbatch = {0}; + int32_t code = doBuildSingleTableBatchReq(&tableName, pStmt->pCols, &info, &tbatch); + if (code != TSDB_CODE_SUCCESS) { + return code; + } + + SArray* pBufArray = taosArrayInit(1, POINTER_BYTES); + if (pBufArray == NULL) { + return TSDB_CODE_QRY_OUT_OF_MEMORY; + } + + serializeVgroupTablesBatchImpl(&tbatch, pBufArray); + destroyCreateTbReqBatch(&tbatch); + + SVnodeModifOpStmt* pNewStmt = nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT); + pNewStmt->sqlNodeType = nodeType(pQuery->pRoot); + pNewStmt->pDataBlocks = pBufArray; + pQuery->sqlNodeType = nodeType(pQuery->pRoot); + nodesDestroyNode(pQuery->pRoot); + pQuery->pRoot = (SNode*)pNewStmt; + } + return TSDB_CODE_SUCCESS; +} + int32_t doTranslate(SParseContext* pParseCxt, SQuery* pQuery) { STranslateContext cxt = { .pParseCxt = pParseCxt, @@ -900,14 +1057,18 @@ int32_t doTranslate(SParseContext* pParseCxt, SQuery* pQuery) { .currClause = 0 }; int32_t code = fmFuncMgtInit(); + if (TSDB_CODE_SUCCESS == code) { + code = rewriteQuery(&cxt, pQuery); + } if (TSDB_CODE_SUCCESS == code) { code = translateQuery(&cxt, pQuery->pRoot); } if (TSDB_CODE_SUCCESS == code) { - if (pQuery->isCmd) { + if (pQuery->directRpc) { pQuery->pCmdMsg = cxt.pCmdMsg; cxt.pCmdMsg = NULL; - } else { + } + if (pQuery->haveResultSet) { code = setReslutSchema(&cxt, pQuery); } } diff --git a/source/libs/parser/src/new_sql.c b/source/libs/parser/src/new_sql.c index fb9040c190..432bb66e69 100644 --- a/source/libs/parser/src/new_sql.c +++ b/source/libs/parser/src/new_sql.c @@ -109,22 +109,25 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 152 +#define YYNOCODE 179 #define YYACTIONTYPE unsigned short int #define NewParseTOKENTYPE SToken typedef union { int yyinit; NewParseTOKENTYPE yy0; - SNodeList* yy8; - EOrder yy50; - EOperatorType yy60; - SDatabaseOptions* yy87; - SNode* yy104; - SToken yy129; - bool yy185; - ENullOrder yy186; - EJoinType yy228; - EFillMode yy246; + EOrder yy14; + ENullOrder yy17; + SDatabaseOptions* yy27; + STableOptions* yy40; + SNodeList* yy60; + SToken yy105; + STokenPair yy111; + SNode* yy172; + EFillMode yy202; + EOperatorType yy214; + SDataType yy248; + bool yy259; + EJoinType yy278; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +142,17 @@ typedef union { #define NewParseCTX_PARAM #define NewParseCTX_FETCH #define NewParseCTX_STORE -#define YYNSTATE 170 -#define YYNRULE 160 -#define YYNTOKEN 96 -#define YY_MAX_SHIFT 169 -#define YY_MIN_SHIFTREDUCE 286 -#define YY_MAX_SHIFTREDUCE 445 -#define YY_ERROR_ACTION 446 -#define YY_ACCEPT_ACTION 447 -#define YY_NO_ACTION 448 -#define YY_MIN_REDUCE 449 -#define YY_MAX_REDUCE 608 +#define YYNSTATE 211 +#define YYNRULE 196 +#define YYNTOKEN 118 +#define YY_MAX_SHIFT 210 +#define YY_MIN_SHIFTREDUCE 352 +#define YY_MAX_SHIFTREDUCE 547 +#define YY_ERROR_ACTION 548 +#define YY_ACCEPT_ACTION 549 +#define YY_NO_ACTION 550 +#define YY_MIN_REDUCE 551 +#define YY_MAX_REDUCE 746 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,216 +219,256 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (757) +#define YY_ACTTAB_COUNT (890) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 486, 476, 73, 146, 501, 147, 587, 114, 89, 487, - /* 10 */ 105, 490, 30, 28, 26, 25, 24, 478, 476, 97, - /* 20 */ 586, 92, 23, 72, 585, 30, 28, 26, 25, 24, - /* 30 */ 479, 476, 146, 501, 92, 65, 486, 476, 117, 146, - /* 40 */ 501, 147, 9, 8, 41, 487, 556, 490, 526, 328, - /* 50 */ 129, 22, 101, 523, 346, 347, 348, 349, 350, 351, - /* 60 */ 352, 354, 355, 356, 22, 101, 449, 346, 347, 348, - /* 70 */ 349, 350, 351, 352, 354, 355, 356, 486, 476, 169, - /* 80 */ 146, 501, 147, 412, 395, 89, 487, 108, 490, 168, - /* 90 */ 364, 167, 166, 165, 164, 163, 162, 161, 160, 159, - /* 100 */ 140, 158, 157, 156, 155, 154, 153, 152, 387, 113, - /* 110 */ 410, 411, 413, 414, 136, 486, 476, 319, 146, 501, - /* 120 */ 147, 131, 10, 39, 487, 122, 490, 526, 131, 10, - /* 130 */ 55, 91, 522, 123, 118, 116, 486, 476, 321, 132, - /* 140 */ 501, 147, 141, 587, 40, 487, 20, 490, 526, 55, - /* 150 */ 55, 540, 99, 522, 49, 353, 70, 54, 357, 486, - /* 160 */ 476, 585, 132, 501, 147, 139, 71, 40, 487, 537, - /* 170 */ 490, 526, 107, 553, 386, 99, 522, 49, 486, 476, - /* 180 */ 143, 146, 501, 147, 6, 383, 85, 487, 134, 490, - /* 190 */ 26, 25, 24, 502, 486, 476, 554, 146, 501, 147, - /* 200 */ 75, 42, 40, 487, 409, 490, 526, 146, 501, 2, - /* 210 */ 99, 522, 599, 121, 545, 322, 383, 540, 540, 124, - /* 220 */ 343, 560, 486, 476, 144, 146, 501, 147, 447, 115, - /* 230 */ 40, 487, 149, 490, 526, 536, 535, 557, 99, 522, - /* 240 */ 599, 567, 486, 476, 322, 146, 501, 147, 138, 583, - /* 250 */ 40, 487, 112, 490, 526, 29, 27, 57, 99, 522, - /* 260 */ 599, 587, 56, 59, 11, 31, 62, 308, 358, 544, - /* 270 */ 128, 29, 27, 388, 314, 54, 45, 310, 566, 585, - /* 280 */ 11, 9, 8, 308, 43, 309, 311, 148, 314, 110, - /* 290 */ 106, 1, 111, 310, 51, 533, 534, 61, 538, 29, - /* 300 */ 27, 309, 311, 148, 314, 98, 106, 1, 11, 444, - /* 310 */ 445, 308, 55, 136, 486, 476, 5, 146, 501, 147, - /* 320 */ 547, 310, 83, 487, 31, 490, 125, 325, 64, 309, - /* 330 */ 311, 148, 314, 109, 106, 1, 29, 27, 48, 483, - /* 340 */ 4, 481, 587, 66, 308, 383, 318, 321, 308, 30, - /* 350 */ 28, 26, 25, 24, 310, 44, 54, 541, 310, 32, - /* 360 */ 585, 67, 309, 311, 148, 314, 309, 311, 148, 314, - /* 370 */ 16, 106, 7, 486, 476, 102, 146, 501, 147, 508, - /* 380 */ 584, 41, 487, 602, 490, 526, 145, 319, 142, 525, - /* 390 */ 522, 74, 317, 55, 79, 486, 476, 151, 146, 501, - /* 400 */ 147, 77, 80, 41, 487, 3, 490, 526, 31, 14, - /* 410 */ 58, 133, 522, 128, 406, 136, 60, 35, 408, 45, - /* 420 */ 29, 27, 135, 47, 63, 119, 36, 43, 441, 442, - /* 430 */ 402, 401, 308, 120, 481, 29, 27, 68, 533, 127, - /* 440 */ 37, 126, 310, 18, 587, 15, 33, 308, 380, 379, - /* 450 */ 309, 311, 148, 314, 69, 106, 7, 310, 54, 34, - /* 460 */ 29, 27, 585, 8, 480, 309, 311, 148, 314, 53, - /* 470 */ 106, 1, 308, 344, 326, 486, 476, 17, 146, 501, - /* 480 */ 147, 435, 310, 46, 487, 12, 490, 38, 430, 429, - /* 490 */ 309, 311, 148, 314, 103, 106, 7, 486, 476, 19, - /* 500 */ 146, 501, 147, 76, 21, 89, 487, 100, 490, 30, - /* 510 */ 28, 26, 25, 24, 30, 28, 26, 25, 24, 434, - /* 520 */ 433, 13, 137, 600, 30, 28, 26, 25, 24, 486, - /* 530 */ 476, 104, 146, 501, 147, 312, 470, 46, 487, 287, - /* 540 */ 490, 486, 476, 150, 146, 501, 147, 299, 306, 84, - /* 550 */ 487, 305, 490, 486, 476, 304, 146, 501, 147, 78, - /* 560 */ 448, 86, 487, 303, 490, 302, 301, 486, 476, 300, - /* 570 */ 146, 501, 147, 298, 297, 81, 487, 601, 490, 296, - /* 580 */ 486, 476, 295, 146, 501, 147, 294, 293, 87, 487, - /* 590 */ 292, 490, 486, 476, 291, 146, 501, 147, 290, 448, - /* 600 */ 82, 487, 448, 490, 486, 476, 448, 146, 501, 147, - /* 610 */ 448, 448, 88, 487, 448, 490, 448, 30, 28, 26, - /* 620 */ 25, 24, 448, 448, 486, 476, 448, 146, 501, 147, - /* 630 */ 448, 448, 498, 487, 448, 490, 486, 476, 448, 146, - /* 640 */ 501, 147, 448, 448, 497, 487, 448, 490, 486, 476, - /* 650 */ 448, 146, 501, 147, 328, 448, 496, 487, 448, 490, - /* 660 */ 486, 476, 448, 146, 501, 147, 448, 448, 95, 487, - /* 670 */ 448, 490, 486, 476, 448, 146, 501, 147, 448, 448, - /* 680 */ 94, 487, 448, 490, 448, 486, 476, 448, 146, 501, - /* 690 */ 147, 448, 448, 96, 487, 448, 490, 486, 476, 448, - /* 700 */ 146, 501, 147, 448, 448, 93, 487, 448, 490, 486, - /* 710 */ 476, 448, 146, 501, 147, 448, 448, 90, 487, 448, - /* 720 */ 490, 448, 448, 128, 448, 448, 448, 448, 128, 45, - /* 730 */ 448, 448, 448, 448, 45, 448, 448, 43, 448, 448, - /* 740 */ 448, 448, 43, 448, 448, 448, 130, 50, 533, 534, - /* 750 */ 448, 538, 52, 533, 534, 448, 538, + /* 0 */ 616, 614, 105, 187, 116, 725, 576, 48, 23, 75, + /* 10 */ 76, 639, 30, 28, 26, 25, 24, 157, 125, 724, + /* 20 */ 678, 100, 128, 723, 678, 30, 28, 26, 25, 24, + /* 30 */ 551, 617, 614, 639, 100, 68, 624, 614, 675, 157, + /* 40 */ 158, 694, 674, 42, 625, 430, 628, 664, 26, 25, + /* 50 */ 24, 663, 660, 210, 678, 209, 208, 207, 206, 205, + /* 60 */ 204, 203, 202, 201, 150, 200, 199, 198, 197, 196, + /* 70 */ 195, 194, 673, 22, 109, 151, 448, 449, 450, 451, + /* 80 */ 452, 453, 454, 456, 457, 458, 22, 109, 140, 448, + /* 90 */ 449, 450, 451, 452, 453, 454, 456, 457, 458, 30, + /* 100 */ 28, 26, 25, 24, 381, 185, 184, 183, 385, 182, + /* 110 */ 387, 388, 181, 390, 178, 117, 396, 175, 398, 399, + /* 120 */ 172, 169, 639, 573, 147, 624, 614, 133, 157, 158, + /* 130 */ 577, 48, 40, 625, 84, 628, 664, 152, 423, 80, + /* 140 */ 99, 660, 10, 639, 142, 497, 624, 614, 421, 143, + /* 150 */ 158, 424, 725, 41, 625, 189, 628, 664, 82, 20, + /* 160 */ 188, 107, 660, 52, 58, 162, 57, 639, 455, 149, + /* 170 */ 723, 459, 190, 157, 10, 74, 142, 421, 132, 73, + /* 180 */ 489, 118, 691, 639, 6, 485, 624, 614, 58, 143, + /* 190 */ 158, 640, 59, 41, 625, 78, 628, 664, 139, 9, + /* 200 */ 8, 107, 660, 52, 683, 639, 485, 2, 624, 614, + /* 210 */ 46, 157, 158, 424, 126, 41, 625, 44, 628, 664, + /* 220 */ 695, 58, 692, 107, 660, 737, 141, 53, 671, 672, + /* 230 */ 511, 676, 639, 43, 698, 624, 614, 705, 157, 158, + /* 240 */ 9, 8, 41, 625, 145, 628, 664, 134, 129, 127, + /* 250 */ 107, 660, 737, 639, 154, 549, 624, 614, 123, 157, + /* 260 */ 158, 721, 60, 41, 625, 160, 628, 664, 488, 29, + /* 270 */ 27, 107, 660, 737, 29, 27, 490, 410, 11, 546, + /* 280 */ 547, 410, 682, 11, 466, 65, 410, 412, 62, 460, + /* 290 */ 416, 412, 31, 725, 427, 121, 412, 31, 445, 621, + /* 300 */ 122, 1, 619, 114, 106, 704, 1, 57, 114, 64, + /* 310 */ 402, 723, 159, 167, 85, 5, 159, 47, 155, 685, + /* 320 */ 136, 159, 67, 411, 413, 416, 120, 411, 413, 416, + /* 330 */ 4, 51, 411, 413, 416, 485, 639, 69, 147, 624, + /* 340 */ 614, 420, 157, 158, 45, 139, 90, 625, 58, 628, + /* 350 */ 423, 29, 27, 147, 679, 29, 27, 46, 19, 32, + /* 360 */ 11, 16, 70, 410, 44, 646, 725, 410, 30, 28, + /* 370 */ 26, 25, 24, 412, 71, 671, 138, 412, 137, 740, + /* 380 */ 57, 725, 110, 1, 723, 114, 156, 7, 153, 114, + /* 390 */ 639, 419, 722, 624, 614, 57, 157, 158, 159, 723, + /* 400 */ 92, 625, 159, 628, 163, 77, 165, 191, 193, 411, + /* 410 */ 413, 416, 81, 411, 413, 416, 86, 83, 639, 3, + /* 420 */ 31, 624, 614, 98, 157, 158, 87, 14, 42, 625, + /* 430 */ 61, 628, 664, 135, 58, 508, 144, 660, 29, 27, + /* 440 */ 146, 29, 27, 63, 29, 27, 35, 510, 639, 50, + /* 450 */ 410, 624, 614, 410, 157, 158, 410, 66, 42, 625, + /* 460 */ 412, 628, 664, 412, 504, 36, 412, 661, 503, 21, + /* 470 */ 7, 130, 114, 1, 619, 114, 7, 37, 114, 30, + /* 480 */ 28, 26, 25, 24, 131, 159, 18, 15, 159, 482, + /* 490 */ 72, 159, 33, 481, 34, 8, 411, 413, 416, 411, + /* 500 */ 413, 416, 411, 413, 416, 639, 618, 56, 624, 614, + /* 510 */ 446, 157, 158, 428, 537, 49, 625, 12, 628, 38, + /* 520 */ 17, 532, 639, 531, 111, 624, 614, 536, 157, 158, + /* 530 */ 535, 112, 96, 625, 113, 628, 639, 79, 13, 624, + /* 540 */ 614, 608, 157, 158, 607, 414, 96, 625, 119, 628, + /* 550 */ 161, 572, 164, 403, 148, 738, 639, 166, 376, 624, + /* 560 */ 614, 115, 157, 158, 168, 171, 96, 625, 108, 628, + /* 570 */ 400, 639, 170, 397, 624, 614, 173, 157, 158, 174, + /* 580 */ 176, 49, 625, 639, 628, 179, 624, 614, 391, 157, + /* 590 */ 158, 177, 395, 91, 625, 389, 628, 639, 180, 394, + /* 600 */ 624, 614, 380, 157, 158, 407, 393, 93, 625, 186, + /* 610 */ 628, 406, 639, 405, 392, 624, 614, 39, 157, 158, + /* 620 */ 353, 739, 88, 625, 639, 628, 372, 624, 614, 192, + /* 630 */ 157, 158, 550, 371, 94, 625, 639, 628, 370, 624, + /* 640 */ 614, 365, 157, 158, 369, 368, 89, 625, 367, 628, + /* 650 */ 366, 364, 639, 550, 363, 624, 614, 550, 157, 158, + /* 660 */ 362, 361, 95, 625, 360, 628, 639, 359, 358, 624, + /* 670 */ 614, 357, 157, 158, 356, 550, 636, 625, 550, 628, + /* 680 */ 550, 639, 550, 550, 624, 614, 550, 157, 158, 550, + /* 690 */ 550, 635, 625, 639, 628, 550, 624, 614, 550, 157, + /* 700 */ 158, 550, 550, 634, 625, 639, 628, 550, 624, 614, + /* 710 */ 550, 157, 158, 550, 550, 103, 625, 639, 628, 550, + /* 720 */ 624, 614, 550, 157, 158, 550, 550, 102, 625, 550, + /* 730 */ 628, 639, 550, 550, 624, 614, 550, 157, 158, 550, + /* 740 */ 550, 104, 625, 639, 628, 139, 624, 614, 550, 157, + /* 750 */ 158, 139, 550, 101, 625, 639, 628, 46, 624, 614, + /* 760 */ 550, 157, 158, 46, 44, 97, 625, 514, 628, 550, + /* 770 */ 44, 550, 550, 550, 54, 671, 672, 550, 676, 550, + /* 780 */ 55, 671, 672, 550, 676, 550, 550, 30, 28, 26, + /* 790 */ 25, 24, 550, 124, 512, 513, 515, 516, 550, 550, + /* 800 */ 30, 28, 26, 25, 24, 550, 550, 550, 550, 550, + /* 810 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 820 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 830 */ 550, 550, 550, 430, 550, 550, 550, 550, 550, 550, + /* 840 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 850 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 860 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 870 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 880 */ 550, 550, 550, 550, 550, 550, 550, 550, 543, 544, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 101, 102, 150, 104, 105, 106, 129, 141, 109, 110, - /* 10 */ 111, 112, 12, 13, 14, 15, 16, 101, 102, 103, - /* 20 */ 143, 21, 114, 115, 147, 12, 13, 14, 15, 16, - /* 30 */ 101, 102, 104, 105, 21, 134, 101, 102, 110, 104, - /* 40 */ 105, 106, 1, 2, 109, 110, 108, 112, 113, 49, - /* 50 */ 127, 51, 52, 118, 54, 55, 56, 57, 58, 59, - /* 60 */ 60, 61, 62, 63, 51, 52, 0, 54, 55, 56, - /* 70 */ 57, 58, 59, 60, 61, 62, 63, 101, 102, 18, - /* 80 */ 104, 105, 106, 53, 14, 109, 110, 111, 112, 23, - /* 90 */ 49, 25, 26, 27, 28, 29, 30, 31, 32, 33, - /* 100 */ 46, 35, 36, 37, 38, 39, 40, 41, 4, 79, - /* 110 */ 80, 81, 82, 83, 100, 101, 102, 47, 104, 105, - /* 120 */ 106, 47, 48, 109, 110, 47, 112, 113, 47, 48, - /* 130 */ 69, 117, 118, 74, 75, 76, 101, 102, 47, 104, - /* 140 */ 105, 106, 88, 129, 109, 110, 51, 112, 113, 69, - /* 150 */ 69, 107, 117, 118, 119, 60, 65, 143, 63, 101, - /* 160 */ 102, 147, 104, 105, 106, 3, 131, 109, 110, 125, - /* 170 */ 112, 113, 137, 138, 70, 117, 118, 119, 101, 102, - /* 180 */ 46, 104, 105, 106, 67, 68, 109, 110, 21, 112, - /* 190 */ 14, 15, 16, 105, 101, 102, 138, 104, 105, 106, - /* 200 */ 144, 46, 109, 110, 49, 112, 113, 104, 105, 130, - /* 210 */ 117, 118, 119, 110, 66, 47, 68, 107, 107, 142, - /* 220 */ 53, 128, 101, 102, 90, 104, 105, 106, 96, 78, - /* 230 */ 109, 110, 100, 112, 113, 125, 125, 108, 117, 118, - /* 240 */ 119, 140, 101, 102, 47, 104, 105, 106, 86, 128, - /* 250 */ 109, 110, 77, 112, 113, 12, 13, 139, 117, 118, - /* 260 */ 119, 129, 65, 46, 21, 46, 49, 24, 49, 128, - /* 270 */ 98, 12, 13, 14, 45, 143, 104, 34, 140, 147, - /* 280 */ 21, 1, 2, 24, 112, 42, 43, 44, 45, 102, - /* 290 */ 47, 48, 102, 34, 122, 123, 124, 139, 126, 12, - /* 300 */ 13, 42, 43, 44, 45, 102, 47, 48, 21, 94, - /* 310 */ 95, 24, 69, 100, 101, 102, 85, 104, 105, 106, - /* 320 */ 136, 34, 109, 110, 46, 112, 84, 49, 135, 42, - /* 330 */ 43, 44, 45, 72, 47, 48, 12, 13, 133, 48, - /* 340 */ 71, 50, 129, 132, 24, 68, 47, 47, 24, 12, - /* 350 */ 13, 14, 15, 16, 34, 104, 143, 107, 34, 64, - /* 360 */ 147, 120, 42, 43, 44, 45, 42, 43, 44, 45, - /* 370 */ 48, 47, 48, 101, 102, 93, 104, 105, 106, 116, - /* 380 */ 146, 109, 110, 151, 112, 113, 89, 47, 87, 117, - /* 390 */ 118, 145, 47, 69, 98, 101, 102, 20, 104, 105, - /* 400 */ 106, 97, 99, 109, 110, 46, 112, 113, 46, 73, - /* 410 */ 49, 117, 118, 98, 49, 100, 48, 46, 49, 104, - /* 420 */ 12, 13, 14, 48, 48, 24, 48, 112, 91, 92, - /* 430 */ 49, 49, 24, 46, 50, 12, 13, 122, 123, 124, - /* 440 */ 48, 126, 34, 46, 129, 73, 66, 24, 49, 49, - /* 450 */ 42, 43, 44, 45, 50, 47, 48, 34, 143, 46, - /* 460 */ 12, 13, 147, 2, 50, 42, 43, 44, 45, 50, - /* 470 */ 47, 48, 24, 53, 49, 101, 102, 46, 104, 105, - /* 480 */ 106, 49, 34, 109, 110, 73, 112, 4, 24, 24, - /* 490 */ 42, 43, 44, 45, 24, 47, 48, 101, 102, 2, - /* 500 */ 104, 105, 106, 50, 2, 109, 110, 111, 112, 12, - /* 510 */ 13, 14, 15, 16, 12, 13, 14, 15, 16, 24, - /* 520 */ 24, 48, 148, 149, 12, 13, 14, 15, 16, 101, - /* 530 */ 102, 24, 104, 105, 106, 34, 0, 109, 110, 22, - /* 540 */ 112, 101, 102, 21, 104, 105, 106, 34, 24, 109, - /* 550 */ 110, 24, 112, 101, 102, 24, 104, 105, 106, 19, - /* 560 */ 152, 109, 110, 24, 112, 24, 24, 101, 102, 24, - /* 570 */ 104, 105, 106, 24, 24, 109, 110, 149, 112, 24, - /* 580 */ 101, 102, 24, 104, 105, 106, 24, 24, 109, 110, - /* 590 */ 24, 112, 101, 102, 24, 104, 105, 106, 24, 152, - /* 600 */ 109, 110, 152, 112, 101, 102, 152, 104, 105, 106, - /* 610 */ 152, 152, 109, 110, 152, 112, 152, 12, 13, 14, - /* 620 */ 15, 16, 152, 152, 101, 102, 152, 104, 105, 106, - /* 630 */ 152, 152, 109, 110, 152, 112, 101, 102, 152, 104, - /* 640 */ 105, 106, 152, 152, 109, 110, 152, 112, 101, 102, - /* 650 */ 152, 104, 105, 106, 49, 152, 109, 110, 152, 112, - /* 660 */ 101, 102, 152, 104, 105, 106, 152, 152, 109, 110, - /* 670 */ 152, 112, 101, 102, 152, 104, 105, 106, 152, 152, - /* 680 */ 109, 110, 152, 112, 152, 101, 102, 152, 104, 105, - /* 690 */ 106, 152, 152, 109, 110, 152, 112, 101, 102, 152, - /* 700 */ 104, 105, 106, 152, 152, 109, 110, 152, 112, 101, - /* 710 */ 102, 152, 104, 105, 106, 152, 152, 109, 110, 152, - /* 720 */ 112, 152, 152, 98, 152, 152, 152, 152, 98, 104, - /* 730 */ 152, 152, 152, 152, 104, 152, 152, 112, 152, 152, - /* 740 */ 152, 152, 112, 152, 152, 152, 121, 122, 123, 124, - /* 750 */ 152, 126, 122, 123, 124, 152, 126, + /* 0 */ 129, 130, 131, 127, 123, 156, 125, 126, 141, 142, + /* 10 */ 177, 126, 12, 13, 14, 15, 16, 132, 168, 170, + /* 20 */ 134, 21, 137, 174, 134, 12, 13, 14, 15, 16, + /* 30 */ 0, 129, 130, 126, 21, 161, 129, 130, 152, 132, + /* 40 */ 133, 135, 152, 136, 137, 45, 139, 140, 14, 15, + /* 50 */ 16, 144, 145, 23, 134, 25, 26, 27, 28, 29, + /* 60 */ 30, 31, 32, 33, 3, 35, 36, 37, 38, 39, + /* 70 */ 40, 41, 152, 73, 74, 48, 76, 77, 78, 79, + /* 80 */ 80, 81, 82, 83, 84, 85, 73, 74, 154, 76, + /* 90 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 12, + /* 100 */ 13, 14, 15, 16, 50, 51, 52, 53, 54, 55, + /* 110 */ 56, 57, 58, 59, 60, 18, 62, 63, 64, 65, + /* 120 */ 66, 67, 126, 0, 128, 129, 130, 46, 132, 133, + /* 130 */ 125, 126, 136, 137, 19, 139, 140, 110, 46, 42, + /* 140 */ 144, 145, 44, 126, 46, 14, 129, 130, 46, 132, + /* 150 */ 133, 46, 156, 136, 137, 32, 139, 140, 43, 73, + /* 160 */ 37, 144, 145, 146, 91, 68, 170, 126, 82, 108, + /* 170 */ 174, 85, 49, 132, 44, 158, 46, 46, 137, 87, + /* 180 */ 4, 164, 165, 126, 89, 90, 129, 130, 91, 132, + /* 190 */ 133, 126, 87, 136, 137, 171, 139, 140, 120, 1, + /* 200 */ 2, 144, 145, 146, 88, 126, 90, 157, 129, 130, + /* 210 */ 132, 132, 133, 46, 100, 136, 137, 139, 139, 140, + /* 220 */ 135, 91, 165, 144, 145, 146, 148, 149, 150, 151, + /* 230 */ 45, 153, 126, 48, 155, 129, 130, 167, 132, 133, + /* 240 */ 1, 2, 136, 137, 21, 139, 140, 96, 97, 98, + /* 250 */ 144, 145, 146, 126, 48, 118, 129, 130, 99, 132, + /* 260 */ 133, 155, 166, 136, 137, 128, 139, 140, 92, 12, + /* 270 */ 13, 144, 145, 146, 12, 13, 14, 24, 21, 116, + /* 280 */ 117, 24, 155, 21, 45, 45, 24, 34, 48, 45, + /* 290 */ 72, 34, 48, 156, 45, 130, 34, 48, 75, 44, + /* 300 */ 130, 44, 47, 46, 130, 167, 44, 170, 46, 166, + /* 310 */ 45, 174, 59, 48, 45, 107, 59, 48, 112, 163, + /* 320 */ 106, 59, 162, 70, 71, 72, 94, 70, 71, 72, + /* 330 */ 93, 160, 70, 71, 72, 90, 126, 159, 128, 129, + /* 340 */ 130, 46, 132, 133, 132, 120, 136, 137, 91, 139, + /* 350 */ 46, 12, 13, 128, 134, 12, 13, 132, 2, 86, + /* 360 */ 21, 44, 147, 24, 139, 143, 156, 24, 12, 13, + /* 370 */ 14, 15, 16, 34, 149, 150, 151, 34, 153, 178, + /* 380 */ 170, 156, 115, 44, 174, 46, 111, 44, 109, 46, + /* 390 */ 126, 46, 173, 129, 130, 170, 132, 133, 59, 174, + /* 400 */ 136, 137, 59, 139, 120, 172, 46, 122, 20, 70, + /* 410 */ 71, 72, 119, 70, 71, 72, 120, 119, 126, 48, + /* 420 */ 48, 129, 130, 124, 132, 133, 121, 95, 136, 137, + /* 430 */ 45, 139, 140, 169, 91, 45, 144, 145, 12, 13, + /* 440 */ 14, 12, 13, 44, 12, 13, 48, 45, 126, 44, + /* 450 */ 24, 129, 130, 24, 132, 133, 24, 44, 136, 137, + /* 460 */ 34, 139, 140, 34, 45, 44, 34, 145, 45, 2, + /* 470 */ 44, 24, 46, 44, 47, 46, 44, 44, 46, 12, + /* 480 */ 13, 14, 15, 16, 48, 59, 48, 95, 59, 45, + /* 490 */ 47, 59, 88, 45, 48, 2, 70, 71, 72, 70, + /* 500 */ 71, 72, 70, 71, 72, 126, 47, 47, 129, 130, + /* 510 */ 75, 132, 133, 45, 45, 136, 137, 95, 139, 4, + /* 520 */ 48, 24, 126, 24, 24, 129, 130, 24, 132, 133, + /* 530 */ 24, 24, 136, 137, 138, 139, 126, 47, 44, 129, + /* 540 */ 130, 0, 132, 133, 0, 34, 136, 137, 138, 139, + /* 550 */ 69, 0, 47, 45, 175, 176, 126, 24, 46, 129, + /* 560 */ 130, 24, 132, 133, 44, 44, 136, 137, 138, 139, + /* 570 */ 45, 126, 24, 45, 129, 130, 24, 132, 133, 44, + /* 580 */ 24, 136, 137, 126, 139, 24, 129, 130, 45, 132, + /* 590 */ 133, 44, 61, 136, 137, 45, 139, 126, 44, 61, + /* 600 */ 129, 130, 34, 132, 133, 24, 61, 136, 137, 49, + /* 610 */ 139, 24, 126, 24, 61, 129, 130, 44, 132, 133, + /* 620 */ 22, 176, 136, 137, 126, 139, 24, 129, 130, 21, + /* 630 */ 132, 133, 179, 24, 136, 137, 126, 139, 24, 129, + /* 640 */ 130, 34, 132, 133, 24, 24, 136, 137, 24, 139, + /* 650 */ 24, 24, 126, 179, 24, 129, 130, 179, 132, 133, + /* 660 */ 24, 24, 136, 137, 24, 139, 126, 24, 24, 129, + /* 670 */ 130, 24, 132, 133, 24, 179, 136, 137, 179, 139, + /* 680 */ 179, 126, 179, 179, 129, 130, 179, 132, 133, 179, + /* 690 */ 179, 136, 137, 126, 139, 179, 129, 130, 179, 132, + /* 700 */ 133, 179, 179, 136, 137, 126, 139, 179, 129, 130, + /* 710 */ 179, 132, 133, 179, 179, 136, 137, 126, 139, 179, + /* 720 */ 129, 130, 179, 132, 133, 179, 179, 136, 137, 179, + /* 730 */ 139, 126, 179, 179, 129, 130, 179, 132, 133, 179, + /* 740 */ 179, 136, 137, 126, 139, 120, 129, 130, 179, 132, + /* 750 */ 133, 120, 179, 136, 137, 126, 139, 132, 129, 130, + /* 760 */ 179, 132, 133, 132, 139, 136, 137, 75, 139, 179, + /* 770 */ 139, 179, 179, 179, 149, 150, 151, 179, 153, 179, + /* 780 */ 149, 150, 151, 179, 153, 179, 179, 12, 13, 14, + /* 790 */ 15, 16, 179, 101, 102, 103, 104, 105, 179, 179, + /* 800 */ 12, 13, 14, 15, 16, 179, 179, 179, 179, 179, + /* 810 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 820 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 830 */ 179, 179, 179, 45, 179, 179, 179, 179, 179, 179, + /* 840 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 850 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 860 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 870 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 880 */ 179, 179, 179, 179, 179, 179, 179, 179, 113, 114, + /* 890 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 900 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 910 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, }; -#define YY_SHIFT_COUNT (169) +#define YY_SHIFT_COUNT (210) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (605) +#define YY_SHIFT_MAX (788) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 61, 243, 259, 287, 287, 287, 287, 324, 287, 287, - /* 10 */ 81, 423, 448, 408, 448, 448, 448, 448, 448, 448, - /* 20 */ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, - /* 30 */ 448, 448, 74, 74, 74, 320, 78, 78, 80, 0, - /* 40 */ 13, 13, 320, 91, 91, 91, 337, 30, 59, 197, - /* 50 */ 148, 117, 148, 70, 162, 104, 168, 151, 175, 229, - /* 60 */ 229, 151, 175, 229, 231, 242, 261, 269, 277, 299, - /* 70 */ 300, 295, 322, 282, 297, 301, 340, 345, 377, 757, - /* 80 */ 66, 497, 502, 605, 512, 512, 512, 512, 512, 512, - /* 90 */ 512, 41, 95, 176, 176, 176, 176, 155, 217, 280, - /* 100 */ 219, 167, 215, 54, 134, 278, 291, 359, 362, 336, - /* 110 */ 361, 365, 368, 371, 369, 375, 376, 381, 378, 382, - /* 120 */ 401, 387, 384, 392, 397, 372, 399, 400, 404, 380, - /* 130 */ 413, 414, 419, 461, 420, 425, 432, 431, 412, 483, - /* 140 */ 464, 465, 470, 495, 496, 507, 453, 473, 501, 536, - /* 150 */ 517, 522, 524, 527, 531, 539, 541, 542, 545, 513, - /* 160 */ 549, 550, 555, 558, 562, 563, 566, 570, 574, 540, + /* 0 */ 97, 257, 262, 339, 339, 339, 339, 343, 339, 339, + /* 10 */ 130, 429, 432, 426, 432, 432, 432, 432, 432, 432, + /* 20 */ 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, + /* 30 */ 432, 432, 98, 98, 98, 253, 81, 81, 73, 102, + /* 40 */ 0, 13, 13, 253, 92, 92, 92, 102, 54, 775, + /* 50 */ 692, 151, 105, 116, 95, 116, 131, 61, 176, 167, + /* 60 */ 114, 159, 218, 218, 114, 159, 218, 208, 214, 232, + /* 70 */ 237, 245, 295, 304, 273, 317, 267, 275, 279, 102, + /* 80 */ 345, 360, 388, 345, 388, 890, 890, 30, 356, 467, + /* 90 */ 788, 87, 87, 87, 87, 87, 87, 87, 123, 239, + /* 100 */ 86, 34, 34, 34, 34, 185, 240, 198, 244, 223, + /* 110 */ 163, 27, 206, 249, 255, 265, 269, 115, 371, 372, + /* 120 */ 332, 385, 390, 399, 398, 402, 405, 413, 419, 421, + /* 130 */ 423, 447, 436, 427, 433, 438, 392, 444, 448, 443, + /* 140 */ 404, 446, 459, 460, 493, 435, 468, 469, 472, 422, + /* 150 */ 515, 497, 499, 500, 503, 506, 507, 490, 494, 511, + /* 160 */ 541, 544, 481, 551, 512, 505, 508, 533, 537, 520, + /* 170 */ 525, 548, 521, 528, 552, 535, 543, 556, 547, 550, + /* 180 */ 561, 554, 531, 538, 545, 553, 568, 560, 581, 587, + /* 190 */ 589, 573, 598, 608, 602, 609, 614, 620, 621, 624, + /* 200 */ 626, 607, 627, 630, 636, 637, 640, 643, 644, 647, + /* 210 */ 650, }; -#define YY_REDUCE_COUNT (79) -#define YY_REDUCE_MIN (-148) -#define YY_REDUCE_MAX (630) +#define YY_REDUCE_COUNT (86) +#define YY_REDUCE_MIN (-167) +#define YY_REDUCE_MAX (631) static const short yy_reduce_ofst[] = { - /* 0 */ 132, 14, 35, 58, 93, 121, 141, 213, 272, 294, - /* 10 */ 315, -65, 374, -101, -24, 77, 396, 428, 440, 452, - /* 20 */ 466, 479, 491, 503, 523, 535, 547, 559, 571, 584, - /* 30 */ 596, 608, 625, 172, 630, -84, -72, 103, -123, -92, - /* 40 */ -92, -92, -71, 44, 110, 111, -148, -134, -99, -62, - /* 50 */ -77, -77, -77, 88, 56, 79, 129, 101, 118, 187, - /* 60 */ 190, 138, 158, 203, 184, 193, 205, 211, -77, 251, - /* 70 */ 250, 241, 263, 232, 234, 246, 88, 296, 304, 303, + /* 0 */ 137, -4, 17, 57, 79, 106, 127, 210, -93, 292, + /* 10 */ 225, 322, 379, 396, 410, 264, 430, 445, 457, 471, + /* 20 */ 486, 498, 510, 526, 540, 555, 567, 579, 591, 605, + /* 30 */ 617, 629, 78, 625, 631, -129, -115, 41, -151, -119, + /* 40 */ -133, -133, -133, -98, -114, -110, -80, 5, -124, -167, + /* 50 */ -150, -126, -94, -66, -66, -66, 65, 24, 50, 85, + /* 60 */ 70, 96, 165, 170, 138, 143, 174, 156, 160, 171, + /* 70 */ 178, -66, 212, 220, 215, 222, 201, 219, 233, 65, + /* 80 */ 284, 285, 293, 296, 298, 299, 305, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 10 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 20 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 30 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 40 */ 528, 446, 446, 539, 539, 539, 603, 446, 563, 555, - /* 50 */ 531, 545, 532, 446, 588, 548, 446, 570, 568, 446, - /* 60 */ 446, 570, 568, 446, 582, 578, 561, 559, 545, 446, - /* 70 */ 446, 446, 446, 606, 594, 590, 446, 446, 451, 452, - /* 80 */ 446, 446, 446, 446, 581, 580, 505, 504, 503, 499, - /* 90 */ 500, 446, 446, 494, 495, 493, 492, 446, 446, 529, - /* 100 */ 446, 446, 446, 591, 595, 446, 482, 552, 562, 446, - /* 110 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 120 */ 446, 446, 482, 446, 579, 446, 538, 534, 446, 446, - /* 130 */ 530, 481, 446, 524, 446, 446, 446, 589, 446, 446, - /* 140 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 150 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - /* 160 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, + /* 0 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 10 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 20 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 30 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 40 */ 548, 666, 548, 548, 677, 677, 677, 548, 548, 741, + /* 50 */ 548, 701, 693, 669, 683, 670, 548, 726, 686, 548, + /* 60 */ 708, 706, 548, 548, 708, 706, 548, 720, 716, 699, + /* 70 */ 697, 683, 548, 548, 548, 548, 744, 732, 728, 548, + /* 80 */ 548, 548, 553, 548, 553, 603, 554, 548, 548, 548, + /* 90 */ 548, 719, 718, 643, 642, 641, 637, 638, 548, 548, + /* 100 */ 548, 632, 633, 631, 630, 548, 548, 667, 548, 548, + /* 110 */ 548, 729, 733, 548, 620, 548, 548, 548, 690, 700, + /* 120 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 130 */ 548, 548, 548, 620, 548, 717, 548, 676, 672, 548, + /* 140 */ 548, 668, 619, 548, 662, 548, 548, 548, 727, 548, + /* 150 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 160 */ 548, 548, 548, 548, 548, 574, 548, 548, 548, 600, + /* 170 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 180 */ 548, 548, 585, 583, 582, 581, 548, 578, 548, 548, + /* 190 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 200 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, + /* 210 */ 548, }; /********** End of lemon-generated parsing tables *****************************/ @@ -574,116 +617,143 @@ static const char *const yyTokenName[] = { /* 39 */ "VGROUPS", /* 40 */ "SINGLESTABLE", /* 41 */ "STREAMMODE", - /* 42 */ "NK_FLOAT", - /* 43 */ "NK_BOOL", - /* 44 */ "TIMESTAMP", - /* 45 */ "NK_VARIABLE", - /* 46 */ "NK_COMMA", - /* 47 */ "NK_ID", - /* 48 */ "NK_LP", - /* 49 */ "NK_RP", - /* 50 */ "NK_DOT", - /* 51 */ "BETWEEN", - /* 52 */ "IS", - /* 53 */ "NULL", - /* 54 */ "NK_LT", - /* 55 */ "NK_GT", - /* 56 */ "NK_LE", - /* 57 */ "NK_GE", - /* 58 */ "NK_NE", - /* 59 */ "NK_EQ", - /* 60 */ "LIKE", - /* 61 */ "MATCH", - /* 62 */ "NMATCH", - /* 63 */ "IN", - /* 64 */ "FROM", - /* 65 */ "AS", - /* 66 */ "JOIN", - /* 67 */ "ON", - /* 68 */ "INNER", - /* 69 */ "SELECT", - /* 70 */ "DISTINCT", - /* 71 */ "WHERE", - /* 72 */ "PARTITION", - /* 73 */ "BY", - /* 74 */ "SESSION", - /* 75 */ "STATE_WINDOW", - /* 76 */ "INTERVAL", - /* 77 */ "SLIDING", - /* 78 */ "FILL", - /* 79 */ "VALUE", - /* 80 */ "NONE", - /* 81 */ "PREV", - /* 82 */ "LINEAR", - /* 83 */ "NEXT", - /* 84 */ "GROUP", - /* 85 */ "HAVING", - /* 86 */ "ORDER", - /* 87 */ "SLIMIT", - /* 88 */ "SOFFSET", - /* 89 */ "LIMIT", - /* 90 */ "OFFSET", - /* 91 */ "ASC", - /* 92 */ "DESC", - /* 93 */ "NULLS", - /* 94 */ "FIRST", - /* 95 */ "LAST", - /* 96 */ "cmd", - /* 97 */ "exists_opt", - /* 98 */ "db_name", - /* 99 */ "db_options", - /* 100 */ "query_expression", - /* 101 */ "literal", - /* 102 */ "duration_literal", - /* 103 */ "literal_list", - /* 104 */ "table_name", - /* 105 */ "column_name", - /* 106 */ "function_name", - /* 107 */ "table_alias", - /* 108 */ "column_alias", - /* 109 */ "expression", - /* 110 */ "column_reference", - /* 111 */ "expression_list", - /* 112 */ "subquery", - /* 113 */ "predicate", - /* 114 */ "compare_op", - /* 115 */ "in_op", - /* 116 */ "in_predicate_value", - /* 117 */ "boolean_value_expression", - /* 118 */ "boolean_primary", - /* 119 */ "common_expression", - /* 120 */ "from_clause", - /* 121 */ "table_reference_list", - /* 122 */ "table_reference", - /* 123 */ "table_primary", - /* 124 */ "joined_table", - /* 125 */ "alias_opt", - /* 126 */ "parenthesized_joined_table", - /* 127 */ "join_type", - /* 128 */ "search_condition", - /* 129 */ "query_specification", - /* 130 */ "set_quantifier_opt", - /* 131 */ "select_list", - /* 132 */ "where_clause_opt", - /* 133 */ "partition_by_clause_opt", - /* 134 */ "twindow_clause_opt", - /* 135 */ "group_by_clause_opt", - /* 136 */ "having_clause_opt", - /* 137 */ "select_sublist", - /* 138 */ "select_item", - /* 139 */ "sliding_opt", - /* 140 */ "fill_opt", - /* 141 */ "fill_mode", - /* 142 */ "group_by_list", - /* 143 */ "query_expression_body", - /* 144 */ "order_by_clause_opt", - /* 145 */ "slimit_clause_opt", - /* 146 */ "limit_clause_opt", - /* 147 */ "query_primary", - /* 148 */ "sort_specification_list", - /* 149 */ "sort_specification", - /* 150 */ "ordering_specification_opt", - /* 151 */ "null_ordering_opt", + /* 42 */ "USE", + /* 43 */ "TABLE", + /* 44 */ "NK_LP", + /* 45 */ "NK_RP", + /* 46 */ "NK_ID", + /* 47 */ "NK_DOT", + /* 48 */ "NK_COMMA", + /* 49 */ "COMMENT", + /* 50 */ "BOOL", + /* 51 */ "TINYINT", + /* 52 */ "SMALLINT", + /* 53 */ "INT", + /* 54 */ "INTEGER", + /* 55 */ "BIGINT", + /* 56 */ "FLOAT", + /* 57 */ "DOUBLE", + /* 58 */ "BINARY", + /* 59 */ "TIMESTAMP", + /* 60 */ "NCHAR", + /* 61 */ "UNSIGNED", + /* 62 */ "JSON", + /* 63 */ "VARCHAR", + /* 64 */ "MEDIUMBLOB", + /* 65 */ "BLOB", + /* 66 */ "VARBINARY", + /* 67 */ "DECIMAL", + /* 68 */ "SHOW", + /* 69 */ "DATABASES", + /* 70 */ "NK_FLOAT", + /* 71 */ "NK_BOOL", + /* 72 */ "NK_VARIABLE", + /* 73 */ "BETWEEN", + /* 74 */ "IS", + /* 75 */ "NULL", + /* 76 */ "NK_LT", + /* 77 */ "NK_GT", + /* 78 */ "NK_LE", + /* 79 */ "NK_GE", + /* 80 */ "NK_NE", + /* 81 */ "NK_EQ", + /* 82 */ "LIKE", + /* 83 */ "MATCH", + /* 84 */ "NMATCH", + /* 85 */ "IN", + /* 86 */ "FROM", + /* 87 */ "AS", + /* 88 */ "JOIN", + /* 89 */ "ON", + /* 90 */ "INNER", + /* 91 */ "SELECT", + /* 92 */ "DISTINCT", + /* 93 */ "WHERE", + /* 94 */ "PARTITION", + /* 95 */ "BY", + /* 96 */ "SESSION", + /* 97 */ "STATE_WINDOW", + /* 98 */ "INTERVAL", + /* 99 */ "SLIDING", + /* 100 */ "FILL", + /* 101 */ "VALUE", + /* 102 */ "NONE", + /* 103 */ "PREV", + /* 104 */ "LINEAR", + /* 105 */ "NEXT", + /* 106 */ "GROUP", + /* 107 */ "HAVING", + /* 108 */ "ORDER", + /* 109 */ "SLIMIT", + /* 110 */ "SOFFSET", + /* 111 */ "LIMIT", + /* 112 */ "OFFSET", + /* 113 */ "ASC", + /* 114 */ "DESC", + /* 115 */ "NULLS", + /* 116 */ "FIRST", + /* 117 */ "LAST", + /* 118 */ "cmd", + /* 119 */ "exists_opt", + /* 120 */ "db_name", + /* 121 */ "db_options", + /* 122 */ "full_table_name", + /* 123 */ "column_def_list", + /* 124 */ "table_options", + /* 125 */ "column_def", + /* 126 */ "column_name", + /* 127 */ "type_name", + /* 128 */ "query_expression", + /* 129 */ "literal", + /* 130 */ "duration_literal", + /* 131 */ "literal_list", + /* 132 */ "table_name", + /* 133 */ "function_name", + /* 134 */ "table_alias", + /* 135 */ "column_alias", + /* 136 */ "expression", + /* 137 */ "column_reference", + /* 138 */ "expression_list", + /* 139 */ "subquery", + /* 140 */ "predicate", + /* 141 */ "compare_op", + /* 142 */ "in_op", + /* 143 */ "in_predicate_value", + /* 144 */ "boolean_value_expression", + /* 145 */ "boolean_primary", + /* 146 */ "common_expression", + /* 147 */ "from_clause", + /* 148 */ "table_reference_list", + /* 149 */ "table_reference", + /* 150 */ "table_primary", + /* 151 */ "joined_table", + /* 152 */ "alias_opt", + /* 153 */ "parenthesized_joined_table", + /* 154 */ "join_type", + /* 155 */ "search_condition", + /* 156 */ "query_specification", + /* 157 */ "set_quantifier_opt", + /* 158 */ "select_list", + /* 159 */ "where_clause_opt", + /* 160 */ "partition_by_clause_opt", + /* 161 */ "twindow_clause_opt", + /* 162 */ "group_by_clause_opt", + /* 163 */ "having_clause_opt", + /* 164 */ "select_sublist", + /* 165 */ "select_item", + /* 166 */ "sliding_opt", + /* 167 */ "fill_opt", + /* 168 */ "fill_mode", + /* 169 */ "group_by_list", + /* 170 */ "query_expression_body", + /* 171 */ "order_by_clause_opt", + /* 172 */ "slimit_clause_opt", + /* 173 */ "limit_clause_opt", + /* 174 */ "query_primary", + /* 175 */ "sort_specification_list", + /* 176 */ "sort_specification", + /* 177 */ "ordering_specification_opt", + /* 178 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -712,145 +782,181 @@ static const char *const yyRuleName[] = { /* 18 */ "db_options ::= db_options VGROUPS NK_INTEGER", /* 19 */ "db_options ::= db_options SINGLESTABLE NK_INTEGER", /* 20 */ "db_options ::= db_options STREAMMODE NK_INTEGER", - /* 21 */ "cmd ::= query_expression", - /* 22 */ "literal ::= NK_INTEGER", - /* 23 */ "literal ::= NK_FLOAT", - /* 24 */ "literal ::= NK_STRING", - /* 25 */ "literal ::= NK_BOOL", - /* 26 */ "literal ::= TIMESTAMP NK_STRING", - /* 27 */ "literal ::= duration_literal", - /* 28 */ "duration_literal ::= NK_VARIABLE", - /* 29 */ "literal_list ::= literal", - /* 30 */ "literal_list ::= literal_list NK_COMMA literal", - /* 31 */ "db_name ::= NK_ID", - /* 32 */ "table_name ::= NK_ID", - /* 33 */ "column_name ::= NK_ID", - /* 34 */ "function_name ::= NK_ID", - /* 35 */ "table_alias ::= NK_ID", - /* 36 */ "column_alias ::= NK_ID", - /* 37 */ "expression ::= literal", - /* 38 */ "expression ::= column_reference", - /* 39 */ "expression ::= function_name NK_LP expression_list NK_RP", - /* 40 */ "expression ::= function_name NK_LP NK_STAR NK_RP", - /* 41 */ "expression ::= subquery", - /* 42 */ "expression ::= NK_LP expression NK_RP", - /* 43 */ "expression ::= NK_PLUS expression", - /* 44 */ "expression ::= NK_MINUS expression", - /* 45 */ "expression ::= expression NK_PLUS expression", - /* 46 */ "expression ::= expression NK_MINUS expression", - /* 47 */ "expression ::= expression NK_STAR expression", - /* 48 */ "expression ::= expression NK_SLASH expression", - /* 49 */ "expression ::= expression NK_REM expression", - /* 50 */ "expression_list ::= expression", - /* 51 */ "expression_list ::= expression_list NK_COMMA expression", - /* 52 */ "column_reference ::= column_name", - /* 53 */ "column_reference ::= table_name NK_DOT column_name", - /* 54 */ "predicate ::= expression compare_op expression", - /* 55 */ "predicate ::= expression BETWEEN expression AND expression", - /* 56 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 57 */ "predicate ::= expression IS NULL", - /* 58 */ "predicate ::= expression IS NOT NULL", - /* 59 */ "predicate ::= expression in_op in_predicate_value", - /* 60 */ "compare_op ::= NK_LT", - /* 61 */ "compare_op ::= NK_GT", - /* 62 */ "compare_op ::= NK_LE", - /* 63 */ "compare_op ::= NK_GE", - /* 64 */ "compare_op ::= NK_NE", - /* 65 */ "compare_op ::= NK_EQ", - /* 66 */ "compare_op ::= LIKE", - /* 67 */ "compare_op ::= NOT LIKE", - /* 68 */ "compare_op ::= MATCH", - /* 69 */ "compare_op ::= NMATCH", - /* 70 */ "in_op ::= IN", - /* 71 */ "in_op ::= NOT IN", - /* 72 */ "in_predicate_value ::= NK_LP expression_list NK_RP", - /* 73 */ "boolean_value_expression ::= boolean_primary", - /* 74 */ "boolean_value_expression ::= NOT boolean_primary", - /* 75 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 76 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 77 */ "boolean_primary ::= predicate", - /* 78 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 79 */ "common_expression ::= expression", - /* 80 */ "common_expression ::= boolean_value_expression", - /* 81 */ "from_clause ::= FROM table_reference_list", - /* 82 */ "table_reference_list ::= table_reference", - /* 83 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 84 */ "table_reference ::= table_primary", - /* 85 */ "table_reference ::= joined_table", - /* 86 */ "table_primary ::= table_name alias_opt", - /* 87 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 88 */ "table_primary ::= subquery alias_opt", - /* 89 */ "table_primary ::= parenthesized_joined_table", - /* 90 */ "alias_opt ::=", - /* 91 */ "alias_opt ::= table_alias", - /* 92 */ "alias_opt ::= AS table_alias", - /* 93 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 94 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 95 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 96 */ "join_type ::=", - /* 97 */ "join_type ::= INNER", - /* 98 */ "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", - /* 99 */ "set_quantifier_opt ::=", - /* 100 */ "set_quantifier_opt ::= DISTINCT", - /* 101 */ "set_quantifier_opt ::= ALL", - /* 102 */ "select_list ::= NK_STAR", - /* 103 */ "select_list ::= select_sublist", - /* 104 */ "select_sublist ::= select_item", - /* 105 */ "select_sublist ::= select_sublist NK_COMMA select_item", - /* 106 */ "select_item ::= common_expression", - /* 107 */ "select_item ::= common_expression column_alias", - /* 108 */ "select_item ::= common_expression AS column_alias", - /* 109 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 110 */ "where_clause_opt ::=", - /* 111 */ "where_clause_opt ::= WHERE search_condition", - /* 112 */ "partition_by_clause_opt ::=", - /* 113 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 114 */ "twindow_clause_opt ::=", - /* 115 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", - /* 116 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", - /* 117 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 118 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 119 */ "sliding_opt ::=", - /* 120 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 121 */ "fill_opt ::=", - /* 122 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 123 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 124 */ "fill_mode ::= NONE", - /* 125 */ "fill_mode ::= PREV", - /* 126 */ "fill_mode ::= NULL", - /* 127 */ "fill_mode ::= LINEAR", - /* 128 */ "fill_mode ::= NEXT", - /* 129 */ "group_by_clause_opt ::=", - /* 130 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 131 */ "group_by_list ::= expression", - /* 132 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 133 */ "having_clause_opt ::=", - /* 134 */ "having_clause_opt ::= HAVING search_condition", - /* 135 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 136 */ "query_expression_body ::= query_primary", - /* 137 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 138 */ "query_primary ::= query_specification", - /* 139 */ "order_by_clause_opt ::=", - /* 140 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 141 */ "slimit_clause_opt ::=", - /* 142 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 143 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 144 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 145 */ "limit_clause_opt ::=", - /* 146 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 147 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 148 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 149 */ "subquery ::= NK_LP query_expression NK_RP", - /* 150 */ "search_condition ::= common_expression", - /* 151 */ "sort_specification_list ::= sort_specification", - /* 152 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 153 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 154 */ "ordering_specification_opt ::=", - /* 155 */ "ordering_specification_opt ::= ASC", - /* 156 */ "ordering_specification_opt ::= DESC", - /* 157 */ "null_ordering_opt ::=", - /* 158 */ "null_ordering_opt ::= NULLS FIRST", - /* 159 */ "null_ordering_opt ::= NULLS LAST", + /* 21 */ "cmd ::= USE db_name", + /* 22 */ "cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options", + /* 23 */ "full_table_name ::= NK_ID", + /* 24 */ "full_table_name ::= NK_ID NK_DOT NK_ID", + /* 25 */ "column_def_list ::= column_def", + /* 26 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 27 */ "column_def ::= column_name type_name", + /* 28 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 29 */ "type_name ::= BOOL", + /* 30 */ "type_name ::= TINYINT", + /* 31 */ "type_name ::= SMALLINT", + /* 32 */ "type_name ::= INT", + /* 33 */ "type_name ::= INTEGER", + /* 34 */ "type_name ::= BIGINT", + /* 35 */ "type_name ::= FLOAT", + /* 36 */ "type_name ::= DOUBLE", + /* 37 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 38 */ "type_name ::= TIMESTAMP", + /* 39 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 40 */ "type_name ::= TINYINT UNSIGNED", + /* 41 */ "type_name ::= SMALLINT UNSIGNED", + /* 42 */ "type_name ::= INT UNSIGNED", + /* 43 */ "type_name ::= BIGINT UNSIGNED", + /* 44 */ "type_name ::= JSON", + /* 45 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 46 */ "type_name ::= MEDIUMBLOB", + /* 47 */ "type_name ::= BLOB", + /* 48 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 49 */ "type_name ::= DECIMAL", + /* 50 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 51 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 52 */ "table_options ::=", + /* 53 */ "table_options ::= table_options COMMENT NK_INTEGER", + /* 54 */ "table_options ::= table_options KEEP NK_INTEGER", + /* 55 */ "table_options ::= table_options TTL NK_INTEGER", + /* 56 */ "cmd ::= SHOW DATABASES", + /* 57 */ "cmd ::= query_expression", + /* 58 */ "literal ::= NK_INTEGER", + /* 59 */ "literal ::= NK_FLOAT", + /* 60 */ "literal ::= NK_STRING", + /* 61 */ "literal ::= NK_BOOL", + /* 62 */ "literal ::= TIMESTAMP NK_STRING", + /* 63 */ "literal ::= duration_literal", + /* 64 */ "duration_literal ::= NK_VARIABLE", + /* 65 */ "literal_list ::= literal", + /* 66 */ "literal_list ::= literal_list NK_COMMA literal", + /* 67 */ "db_name ::= NK_ID", + /* 68 */ "table_name ::= NK_ID", + /* 69 */ "column_name ::= NK_ID", + /* 70 */ "function_name ::= NK_ID", + /* 71 */ "table_alias ::= NK_ID", + /* 72 */ "column_alias ::= NK_ID", + /* 73 */ "expression ::= literal", + /* 74 */ "expression ::= column_reference", + /* 75 */ "expression ::= function_name NK_LP expression_list NK_RP", + /* 76 */ "expression ::= function_name NK_LP NK_STAR NK_RP", + /* 77 */ "expression ::= subquery", + /* 78 */ "expression ::= NK_LP expression NK_RP", + /* 79 */ "expression ::= NK_PLUS expression", + /* 80 */ "expression ::= NK_MINUS expression", + /* 81 */ "expression ::= expression NK_PLUS expression", + /* 82 */ "expression ::= expression NK_MINUS expression", + /* 83 */ "expression ::= expression NK_STAR expression", + /* 84 */ "expression ::= expression NK_SLASH expression", + /* 85 */ "expression ::= expression NK_REM expression", + /* 86 */ "expression_list ::= expression", + /* 87 */ "expression_list ::= expression_list NK_COMMA expression", + /* 88 */ "column_reference ::= column_name", + /* 89 */ "column_reference ::= table_name NK_DOT column_name", + /* 90 */ "predicate ::= expression compare_op expression", + /* 91 */ "predicate ::= expression BETWEEN expression AND expression", + /* 92 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 93 */ "predicate ::= expression IS NULL", + /* 94 */ "predicate ::= expression IS NOT NULL", + /* 95 */ "predicate ::= expression in_op in_predicate_value", + /* 96 */ "compare_op ::= NK_LT", + /* 97 */ "compare_op ::= NK_GT", + /* 98 */ "compare_op ::= NK_LE", + /* 99 */ "compare_op ::= NK_GE", + /* 100 */ "compare_op ::= NK_NE", + /* 101 */ "compare_op ::= NK_EQ", + /* 102 */ "compare_op ::= LIKE", + /* 103 */ "compare_op ::= NOT LIKE", + /* 104 */ "compare_op ::= MATCH", + /* 105 */ "compare_op ::= NMATCH", + /* 106 */ "in_op ::= IN", + /* 107 */ "in_op ::= NOT IN", + /* 108 */ "in_predicate_value ::= NK_LP expression_list NK_RP", + /* 109 */ "boolean_value_expression ::= boolean_primary", + /* 110 */ "boolean_value_expression ::= NOT boolean_primary", + /* 111 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 112 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 113 */ "boolean_primary ::= predicate", + /* 114 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 115 */ "common_expression ::= expression", + /* 116 */ "common_expression ::= boolean_value_expression", + /* 117 */ "from_clause ::= FROM table_reference_list", + /* 118 */ "table_reference_list ::= table_reference", + /* 119 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 120 */ "table_reference ::= table_primary", + /* 121 */ "table_reference ::= joined_table", + /* 122 */ "table_primary ::= table_name alias_opt", + /* 123 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 124 */ "table_primary ::= subquery alias_opt", + /* 125 */ "table_primary ::= parenthesized_joined_table", + /* 126 */ "alias_opt ::=", + /* 127 */ "alias_opt ::= table_alias", + /* 128 */ "alias_opt ::= AS table_alias", + /* 129 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 130 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 131 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 132 */ "join_type ::=", + /* 133 */ "join_type ::= INNER", + /* 134 */ "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", + /* 135 */ "set_quantifier_opt ::=", + /* 136 */ "set_quantifier_opt ::= DISTINCT", + /* 137 */ "set_quantifier_opt ::= ALL", + /* 138 */ "select_list ::= NK_STAR", + /* 139 */ "select_list ::= select_sublist", + /* 140 */ "select_sublist ::= select_item", + /* 141 */ "select_sublist ::= select_sublist NK_COMMA select_item", + /* 142 */ "select_item ::= common_expression", + /* 143 */ "select_item ::= common_expression column_alias", + /* 144 */ "select_item ::= common_expression AS column_alias", + /* 145 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 146 */ "where_clause_opt ::=", + /* 147 */ "where_clause_opt ::= WHERE search_condition", + /* 148 */ "partition_by_clause_opt ::=", + /* 149 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 150 */ "twindow_clause_opt ::=", + /* 151 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", + /* 152 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", + /* 153 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 154 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 155 */ "sliding_opt ::=", + /* 156 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 157 */ "fill_opt ::=", + /* 158 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 159 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 160 */ "fill_mode ::= NONE", + /* 161 */ "fill_mode ::= PREV", + /* 162 */ "fill_mode ::= NULL", + /* 163 */ "fill_mode ::= LINEAR", + /* 164 */ "fill_mode ::= NEXT", + /* 165 */ "group_by_clause_opt ::=", + /* 166 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 167 */ "group_by_list ::= expression", + /* 168 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 169 */ "having_clause_opt ::=", + /* 170 */ "having_clause_opt ::= HAVING search_condition", + /* 171 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 172 */ "query_expression_body ::= query_primary", + /* 173 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 174 */ "query_primary ::= query_specification", + /* 175 */ "order_by_clause_opt ::=", + /* 176 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 177 */ "slimit_clause_opt ::=", + /* 178 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 179 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 180 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 181 */ "limit_clause_opt ::=", + /* 182 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 183 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 184 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 185 */ "subquery ::= NK_LP query_expression NK_RP", + /* 186 */ "search_condition ::= common_expression", + /* 187 */ "sort_specification_list ::= sort_specification", + /* 188 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 189 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 190 */ "ordering_specification_opt ::=", + /* 191 */ "ordering_specification_opt ::= ASC", + /* 192 */ "ordering_specification_opt ::= DESC", + /* 193 */ "null_ordering_opt ::=", + /* 194 */ "null_ordering_opt ::= NULLS FIRST", + /* 195 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -977,98 +1083,119 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 96: /* cmd */ - case 97: /* exists_opt */ - case 100: /* query_expression */ - case 101: /* literal */ - case 102: /* duration_literal */ - case 109: /* expression */ - case 110: /* column_reference */ - case 112: /* subquery */ - case 113: /* predicate */ - case 116: /* in_predicate_value */ - case 117: /* boolean_value_expression */ - case 118: /* boolean_primary */ - case 119: /* common_expression */ - case 120: /* from_clause */ - case 121: /* table_reference_list */ - case 122: /* table_reference */ - case 123: /* table_primary */ - case 124: /* joined_table */ - case 126: /* parenthesized_joined_table */ - case 128: /* search_condition */ - case 129: /* query_specification */ - case 132: /* where_clause_opt */ - case 134: /* twindow_clause_opt */ - case 136: /* having_clause_opt */ - case 138: /* select_item */ - case 139: /* sliding_opt */ - case 140: /* fill_opt */ - case 143: /* query_expression_body */ - case 145: /* slimit_clause_opt */ - case 146: /* limit_clause_opt */ - case 147: /* query_primary */ - case 149: /* sort_specification */ + case 118: /* cmd */ + case 119: /* exists_opt */ + case 125: /* column_def */ + case 128: /* query_expression */ + case 129: /* literal */ + case 130: /* duration_literal */ + case 136: /* expression */ + case 137: /* column_reference */ + case 139: /* subquery */ + case 140: /* predicate */ + case 143: /* in_predicate_value */ + case 144: /* boolean_value_expression */ + case 145: /* boolean_primary */ + case 146: /* common_expression */ + case 147: /* from_clause */ + case 148: /* table_reference_list */ + case 149: /* table_reference */ + case 150: /* table_primary */ + case 151: /* joined_table */ + case 153: /* parenthesized_joined_table */ + case 155: /* search_condition */ + case 156: /* query_specification */ + case 159: /* where_clause_opt */ + case 161: /* twindow_clause_opt */ + case 163: /* having_clause_opt */ + case 165: /* select_item */ + case 166: /* sliding_opt */ + case 167: /* fill_opt */ + case 170: /* query_expression_body */ + case 172: /* slimit_clause_opt */ + case 173: /* limit_clause_opt */ + case 174: /* query_primary */ + case 176: /* sort_specification */ { - PARSER_DESTRUCTOR_TRACE; nodesDestroyNode((yypminor->yy104)); + PARSER_DESTRUCTOR_TRACE; nodesDestroyNode((yypminor->yy172)); } break; - case 98: /* db_name */ - case 104: /* table_name */ - case 105: /* column_name */ - case 106: /* function_name */ - case 107: /* table_alias */ - case 108: /* column_alias */ - case 125: /* alias_opt */ + case 120: /* db_name */ + case 126: /* column_name */ + case 132: /* table_name */ + case 133: /* function_name */ + case 134: /* table_alias */ + case 135: /* column_alias */ + case 152: /* alias_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 99: /* db_options */ + case 121: /* db_options */ { - tfree((yypminor->yy87)); + tfree((yypminor->yy27)); } break; - case 103: /* literal_list */ - case 111: /* expression_list */ - case 131: /* select_list */ - case 133: /* partition_by_clause_opt */ - case 135: /* group_by_clause_opt */ - case 137: /* select_sublist */ - case 142: /* group_by_list */ - case 144: /* order_by_clause_opt */ - case 148: /* sort_specification_list */ + case 122: /* full_table_name */ { - PARSER_DESTRUCTOR_TRACE; nodesDestroyList((yypminor->yy8)); + } break; - case 114: /* compare_op */ - case 115: /* in_op */ + case 123: /* column_def_list */ +{ + nodesDestroyList((yypminor->yy60)); +} + break; + case 124: /* table_options */ +{ + tfree((yypminor->yy40)); +} + break; + case 127: /* type_name */ +{ + +} + break; + case 131: /* literal_list */ + case 138: /* expression_list */ + case 158: /* select_list */ + case 160: /* partition_by_clause_opt */ + case 162: /* group_by_clause_opt */ + case 164: /* select_sublist */ + case 169: /* group_by_list */ + case 171: /* order_by_clause_opt */ + case 175: /* sort_specification_list */ +{ + PARSER_DESTRUCTOR_TRACE; nodesDestroyList((yypminor->yy60)); +} + break; + case 141: /* compare_op */ + case 142: /* in_op */ { PARSER_DESTRUCTOR_TRACE; } break; - case 127: /* join_type */ + case 154: /* join_type */ { PARSER_DESTRUCTOR_TRACE; } break; - case 130: /* set_quantifier_opt */ + case 157: /* set_quantifier_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 141: /* fill_mode */ + case 168: /* fill_mode */ { PARSER_DESTRUCTOR_TRACE; } break; - case 150: /* ordering_specification_opt */ + case 177: /* ordering_specification_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 151: /* null_ordering_opt */ + case 178: /* null_ordering_opt */ { PARSER_DESTRUCTOR_TRACE; } @@ -1367,166 +1494,202 @@ 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[] = { - { 96, -5 }, /* (0) cmd ::= CREATE DATABASE exists_opt db_name db_options */ - { 97, -3 }, /* (1) exists_opt ::= IF NOT EXISTS */ - { 97, 0 }, /* (2) exists_opt ::= */ - { 99, 0 }, /* (3) db_options ::= */ - { 99, -3 }, /* (4) db_options ::= db_options BLOCKS NK_INTEGER */ - { 99, -3 }, /* (5) db_options ::= db_options CACHE NK_INTEGER */ - { 99, -3 }, /* (6) db_options ::= db_options CACHELAST NK_INTEGER */ - { 99, -3 }, /* (7) db_options ::= db_options COMP NK_INTEGER */ - { 99, -3 }, /* (8) db_options ::= db_options DAYS NK_INTEGER */ - { 99, -3 }, /* (9) db_options ::= db_options FSYNC NK_INTEGER */ - { 99, -3 }, /* (10) db_options ::= db_options MAXROWS NK_INTEGER */ - { 99, -3 }, /* (11) db_options ::= db_options MINROWS NK_INTEGER */ - { 99, -3 }, /* (12) db_options ::= db_options KEEP NK_INTEGER */ - { 99, -3 }, /* (13) db_options ::= db_options PRECISION NK_STRING */ - { 99, -3 }, /* (14) db_options ::= db_options QUORUM NK_INTEGER */ - { 99, -3 }, /* (15) db_options ::= db_options REPLICA NK_INTEGER */ - { 99, -3 }, /* (16) db_options ::= db_options TTL NK_INTEGER */ - { 99, -3 }, /* (17) db_options ::= db_options WAL NK_INTEGER */ - { 99, -3 }, /* (18) db_options ::= db_options VGROUPS NK_INTEGER */ - { 99, -3 }, /* (19) db_options ::= db_options SINGLESTABLE NK_INTEGER */ - { 99, -3 }, /* (20) db_options ::= db_options STREAMMODE NK_INTEGER */ - { 96, -1 }, /* (21) cmd ::= query_expression */ - { 101, -1 }, /* (22) literal ::= NK_INTEGER */ - { 101, -1 }, /* (23) literal ::= NK_FLOAT */ - { 101, -1 }, /* (24) literal ::= NK_STRING */ - { 101, -1 }, /* (25) literal ::= NK_BOOL */ - { 101, -2 }, /* (26) literal ::= TIMESTAMP NK_STRING */ - { 101, -1 }, /* (27) literal ::= duration_literal */ - { 102, -1 }, /* (28) duration_literal ::= NK_VARIABLE */ - { 103, -1 }, /* (29) literal_list ::= literal */ - { 103, -3 }, /* (30) literal_list ::= literal_list NK_COMMA literal */ - { 98, -1 }, /* (31) db_name ::= NK_ID */ - { 104, -1 }, /* (32) table_name ::= NK_ID */ - { 105, -1 }, /* (33) column_name ::= NK_ID */ - { 106, -1 }, /* (34) function_name ::= NK_ID */ - { 107, -1 }, /* (35) table_alias ::= NK_ID */ - { 108, -1 }, /* (36) column_alias ::= NK_ID */ - { 109, -1 }, /* (37) expression ::= literal */ - { 109, -1 }, /* (38) expression ::= column_reference */ - { 109, -4 }, /* (39) expression ::= function_name NK_LP expression_list NK_RP */ - { 109, -4 }, /* (40) expression ::= function_name NK_LP NK_STAR NK_RP */ - { 109, -1 }, /* (41) expression ::= subquery */ - { 109, -3 }, /* (42) expression ::= NK_LP expression NK_RP */ - { 109, -2 }, /* (43) expression ::= NK_PLUS expression */ - { 109, -2 }, /* (44) expression ::= NK_MINUS expression */ - { 109, -3 }, /* (45) expression ::= expression NK_PLUS expression */ - { 109, -3 }, /* (46) expression ::= expression NK_MINUS expression */ - { 109, -3 }, /* (47) expression ::= expression NK_STAR expression */ - { 109, -3 }, /* (48) expression ::= expression NK_SLASH expression */ - { 109, -3 }, /* (49) expression ::= expression NK_REM expression */ - { 111, -1 }, /* (50) expression_list ::= expression */ - { 111, -3 }, /* (51) expression_list ::= expression_list NK_COMMA expression */ - { 110, -1 }, /* (52) column_reference ::= column_name */ - { 110, -3 }, /* (53) column_reference ::= table_name NK_DOT column_name */ - { 113, -3 }, /* (54) predicate ::= expression compare_op expression */ - { 113, -5 }, /* (55) predicate ::= expression BETWEEN expression AND expression */ - { 113, -6 }, /* (56) predicate ::= expression NOT BETWEEN expression AND expression */ - { 113, -3 }, /* (57) predicate ::= expression IS NULL */ - { 113, -4 }, /* (58) predicate ::= expression IS NOT NULL */ - { 113, -3 }, /* (59) predicate ::= expression in_op in_predicate_value */ - { 114, -1 }, /* (60) compare_op ::= NK_LT */ - { 114, -1 }, /* (61) compare_op ::= NK_GT */ - { 114, -1 }, /* (62) compare_op ::= NK_LE */ - { 114, -1 }, /* (63) compare_op ::= NK_GE */ - { 114, -1 }, /* (64) compare_op ::= NK_NE */ - { 114, -1 }, /* (65) compare_op ::= NK_EQ */ - { 114, -1 }, /* (66) compare_op ::= LIKE */ - { 114, -2 }, /* (67) compare_op ::= NOT LIKE */ - { 114, -1 }, /* (68) compare_op ::= MATCH */ - { 114, -1 }, /* (69) compare_op ::= NMATCH */ - { 115, -1 }, /* (70) in_op ::= IN */ - { 115, -2 }, /* (71) in_op ::= NOT IN */ - { 116, -3 }, /* (72) in_predicate_value ::= NK_LP expression_list NK_RP */ - { 117, -1 }, /* (73) boolean_value_expression ::= boolean_primary */ - { 117, -2 }, /* (74) boolean_value_expression ::= NOT boolean_primary */ - { 117, -3 }, /* (75) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 117, -3 }, /* (76) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 118, -1 }, /* (77) boolean_primary ::= predicate */ - { 118, -3 }, /* (78) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 119, -1 }, /* (79) common_expression ::= expression */ - { 119, -1 }, /* (80) common_expression ::= boolean_value_expression */ - { 120, -2 }, /* (81) from_clause ::= FROM table_reference_list */ - { 121, -1 }, /* (82) table_reference_list ::= table_reference */ - { 121, -3 }, /* (83) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 122, -1 }, /* (84) table_reference ::= table_primary */ - { 122, -1 }, /* (85) table_reference ::= joined_table */ - { 123, -2 }, /* (86) table_primary ::= table_name alias_opt */ - { 123, -4 }, /* (87) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 123, -2 }, /* (88) table_primary ::= subquery alias_opt */ - { 123, -1 }, /* (89) table_primary ::= parenthesized_joined_table */ - { 125, 0 }, /* (90) alias_opt ::= */ - { 125, -1 }, /* (91) alias_opt ::= table_alias */ - { 125, -2 }, /* (92) alias_opt ::= AS table_alias */ - { 126, -3 }, /* (93) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 126, -3 }, /* (94) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 124, -6 }, /* (95) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 127, 0 }, /* (96) join_type ::= */ - { 127, -1 }, /* (97) join_type ::= INNER */ - { 129, -9 }, /* (98) 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 */ - { 130, 0 }, /* (99) set_quantifier_opt ::= */ - { 130, -1 }, /* (100) set_quantifier_opt ::= DISTINCT */ - { 130, -1 }, /* (101) set_quantifier_opt ::= ALL */ - { 131, -1 }, /* (102) select_list ::= NK_STAR */ - { 131, -1 }, /* (103) select_list ::= select_sublist */ - { 137, -1 }, /* (104) select_sublist ::= select_item */ - { 137, -3 }, /* (105) select_sublist ::= select_sublist NK_COMMA select_item */ - { 138, -1 }, /* (106) select_item ::= common_expression */ - { 138, -2 }, /* (107) select_item ::= common_expression column_alias */ - { 138, -3 }, /* (108) select_item ::= common_expression AS column_alias */ - { 138, -3 }, /* (109) select_item ::= table_name NK_DOT NK_STAR */ - { 132, 0 }, /* (110) where_clause_opt ::= */ - { 132, -2 }, /* (111) where_clause_opt ::= WHERE search_condition */ - { 133, 0 }, /* (112) partition_by_clause_opt ::= */ - { 133, -3 }, /* (113) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 134, 0 }, /* (114) twindow_clause_opt ::= */ - { 134, -6 }, /* (115) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ - { 134, -4 }, /* (116) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ - { 134, -6 }, /* (117) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 134, -8 }, /* (118) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 139, 0 }, /* (119) sliding_opt ::= */ - { 139, -4 }, /* (120) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 140, 0 }, /* (121) fill_opt ::= */ - { 140, -4 }, /* (122) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 140, -6 }, /* (123) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 141, -1 }, /* (124) fill_mode ::= NONE */ - { 141, -1 }, /* (125) fill_mode ::= PREV */ - { 141, -1 }, /* (126) fill_mode ::= NULL */ - { 141, -1 }, /* (127) fill_mode ::= LINEAR */ - { 141, -1 }, /* (128) fill_mode ::= NEXT */ - { 135, 0 }, /* (129) group_by_clause_opt ::= */ - { 135, -3 }, /* (130) group_by_clause_opt ::= GROUP BY group_by_list */ - { 142, -1 }, /* (131) group_by_list ::= expression */ - { 142, -3 }, /* (132) group_by_list ::= group_by_list NK_COMMA expression */ - { 136, 0 }, /* (133) having_clause_opt ::= */ - { 136, -2 }, /* (134) having_clause_opt ::= HAVING search_condition */ - { 100, -4 }, /* (135) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 143, -1 }, /* (136) query_expression_body ::= query_primary */ - { 143, -4 }, /* (137) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 147, -1 }, /* (138) query_primary ::= query_specification */ - { 144, 0 }, /* (139) order_by_clause_opt ::= */ - { 144, -3 }, /* (140) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 145, 0 }, /* (141) slimit_clause_opt ::= */ - { 145, -2 }, /* (142) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 145, -4 }, /* (143) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 145, -4 }, /* (144) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 146, 0 }, /* (145) limit_clause_opt ::= */ - { 146, -2 }, /* (146) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 146, -4 }, /* (147) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 146, -4 }, /* (148) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 112, -3 }, /* (149) subquery ::= NK_LP query_expression NK_RP */ - { 128, -1 }, /* (150) search_condition ::= common_expression */ - { 148, -1 }, /* (151) sort_specification_list ::= sort_specification */ - { 148, -3 }, /* (152) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 149, -3 }, /* (153) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 150, 0 }, /* (154) ordering_specification_opt ::= */ - { 150, -1 }, /* (155) ordering_specification_opt ::= ASC */ - { 150, -1 }, /* (156) ordering_specification_opt ::= DESC */ - { 151, 0 }, /* (157) null_ordering_opt ::= */ - { 151, -2 }, /* (158) null_ordering_opt ::= NULLS FIRST */ - { 151, -2 }, /* (159) null_ordering_opt ::= NULLS LAST */ + { 118, -5 }, /* (0) cmd ::= CREATE DATABASE exists_opt db_name db_options */ + { 119, -3 }, /* (1) exists_opt ::= IF NOT EXISTS */ + { 119, 0 }, /* (2) exists_opt ::= */ + { 121, 0 }, /* (3) db_options ::= */ + { 121, -3 }, /* (4) db_options ::= db_options BLOCKS NK_INTEGER */ + { 121, -3 }, /* (5) db_options ::= db_options CACHE NK_INTEGER */ + { 121, -3 }, /* (6) db_options ::= db_options CACHELAST NK_INTEGER */ + { 121, -3 }, /* (7) db_options ::= db_options COMP NK_INTEGER */ + { 121, -3 }, /* (8) db_options ::= db_options DAYS NK_INTEGER */ + { 121, -3 }, /* (9) db_options ::= db_options FSYNC NK_INTEGER */ + { 121, -3 }, /* (10) db_options ::= db_options MAXROWS NK_INTEGER */ + { 121, -3 }, /* (11) db_options ::= db_options MINROWS NK_INTEGER */ + { 121, -3 }, /* (12) db_options ::= db_options KEEP NK_INTEGER */ + { 121, -3 }, /* (13) db_options ::= db_options PRECISION NK_STRING */ + { 121, -3 }, /* (14) db_options ::= db_options QUORUM NK_INTEGER */ + { 121, -3 }, /* (15) db_options ::= db_options REPLICA NK_INTEGER */ + { 121, -3 }, /* (16) db_options ::= db_options TTL NK_INTEGER */ + { 121, -3 }, /* (17) db_options ::= db_options WAL NK_INTEGER */ + { 121, -3 }, /* (18) db_options ::= db_options VGROUPS NK_INTEGER */ + { 121, -3 }, /* (19) db_options ::= db_options SINGLESTABLE NK_INTEGER */ + { 121, -3 }, /* (20) db_options ::= db_options STREAMMODE NK_INTEGER */ + { 118, -2 }, /* (21) cmd ::= USE db_name */ + { 118, -8 }, /* (22) cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options */ + { 122, -1 }, /* (23) full_table_name ::= NK_ID */ + { 122, -3 }, /* (24) full_table_name ::= NK_ID NK_DOT NK_ID */ + { 123, -1 }, /* (25) column_def_list ::= column_def */ + { 123, -3 }, /* (26) column_def_list ::= column_def_list NK_COMMA column_def */ + { 125, -2 }, /* (27) column_def ::= column_name type_name */ + { 125, -4 }, /* (28) column_def ::= column_name type_name COMMENT NK_STRING */ + { 127, -1 }, /* (29) type_name ::= BOOL */ + { 127, -1 }, /* (30) type_name ::= TINYINT */ + { 127, -1 }, /* (31) type_name ::= SMALLINT */ + { 127, -1 }, /* (32) type_name ::= INT */ + { 127, -1 }, /* (33) type_name ::= INTEGER */ + { 127, -1 }, /* (34) type_name ::= BIGINT */ + { 127, -1 }, /* (35) type_name ::= FLOAT */ + { 127, -1 }, /* (36) type_name ::= DOUBLE */ + { 127, -4 }, /* (37) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 127, -1 }, /* (38) type_name ::= TIMESTAMP */ + { 127, -4 }, /* (39) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 127, -2 }, /* (40) type_name ::= TINYINT UNSIGNED */ + { 127, -2 }, /* (41) type_name ::= SMALLINT UNSIGNED */ + { 127, -2 }, /* (42) type_name ::= INT UNSIGNED */ + { 127, -2 }, /* (43) type_name ::= BIGINT UNSIGNED */ + { 127, -1 }, /* (44) type_name ::= JSON */ + { 127, -4 }, /* (45) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 127, -1 }, /* (46) type_name ::= MEDIUMBLOB */ + { 127, -1 }, /* (47) type_name ::= BLOB */ + { 127, -4 }, /* (48) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 127, -1 }, /* (49) type_name ::= DECIMAL */ + { 127, -4 }, /* (50) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 127, -6 }, /* (51) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 124, 0 }, /* (52) table_options ::= */ + { 124, -3 }, /* (53) table_options ::= table_options COMMENT NK_INTEGER */ + { 124, -3 }, /* (54) table_options ::= table_options KEEP NK_INTEGER */ + { 124, -3 }, /* (55) table_options ::= table_options TTL NK_INTEGER */ + { 118, -2 }, /* (56) cmd ::= SHOW DATABASES */ + { 118, -1 }, /* (57) cmd ::= query_expression */ + { 129, -1 }, /* (58) literal ::= NK_INTEGER */ + { 129, -1 }, /* (59) literal ::= NK_FLOAT */ + { 129, -1 }, /* (60) literal ::= NK_STRING */ + { 129, -1 }, /* (61) literal ::= NK_BOOL */ + { 129, -2 }, /* (62) literal ::= TIMESTAMP NK_STRING */ + { 129, -1 }, /* (63) literal ::= duration_literal */ + { 130, -1 }, /* (64) duration_literal ::= NK_VARIABLE */ + { 131, -1 }, /* (65) literal_list ::= literal */ + { 131, -3 }, /* (66) literal_list ::= literal_list NK_COMMA literal */ + { 120, -1 }, /* (67) db_name ::= NK_ID */ + { 132, -1 }, /* (68) table_name ::= NK_ID */ + { 126, -1 }, /* (69) column_name ::= NK_ID */ + { 133, -1 }, /* (70) function_name ::= NK_ID */ + { 134, -1 }, /* (71) table_alias ::= NK_ID */ + { 135, -1 }, /* (72) column_alias ::= NK_ID */ + { 136, -1 }, /* (73) expression ::= literal */ + { 136, -1 }, /* (74) expression ::= column_reference */ + { 136, -4 }, /* (75) expression ::= function_name NK_LP expression_list NK_RP */ + { 136, -4 }, /* (76) expression ::= function_name NK_LP NK_STAR NK_RP */ + { 136, -1 }, /* (77) expression ::= subquery */ + { 136, -3 }, /* (78) expression ::= NK_LP expression NK_RP */ + { 136, -2 }, /* (79) expression ::= NK_PLUS expression */ + { 136, -2 }, /* (80) expression ::= NK_MINUS expression */ + { 136, -3 }, /* (81) expression ::= expression NK_PLUS expression */ + { 136, -3 }, /* (82) expression ::= expression NK_MINUS expression */ + { 136, -3 }, /* (83) expression ::= expression NK_STAR expression */ + { 136, -3 }, /* (84) expression ::= expression NK_SLASH expression */ + { 136, -3 }, /* (85) expression ::= expression NK_REM expression */ + { 138, -1 }, /* (86) expression_list ::= expression */ + { 138, -3 }, /* (87) expression_list ::= expression_list NK_COMMA expression */ + { 137, -1 }, /* (88) column_reference ::= column_name */ + { 137, -3 }, /* (89) column_reference ::= table_name NK_DOT column_name */ + { 140, -3 }, /* (90) predicate ::= expression compare_op expression */ + { 140, -5 }, /* (91) predicate ::= expression BETWEEN expression AND expression */ + { 140, -6 }, /* (92) predicate ::= expression NOT BETWEEN expression AND expression */ + { 140, -3 }, /* (93) predicate ::= expression IS NULL */ + { 140, -4 }, /* (94) predicate ::= expression IS NOT NULL */ + { 140, -3 }, /* (95) predicate ::= expression in_op in_predicate_value */ + { 141, -1 }, /* (96) compare_op ::= NK_LT */ + { 141, -1 }, /* (97) compare_op ::= NK_GT */ + { 141, -1 }, /* (98) compare_op ::= NK_LE */ + { 141, -1 }, /* (99) compare_op ::= NK_GE */ + { 141, -1 }, /* (100) compare_op ::= NK_NE */ + { 141, -1 }, /* (101) compare_op ::= NK_EQ */ + { 141, -1 }, /* (102) compare_op ::= LIKE */ + { 141, -2 }, /* (103) compare_op ::= NOT LIKE */ + { 141, -1 }, /* (104) compare_op ::= MATCH */ + { 141, -1 }, /* (105) compare_op ::= NMATCH */ + { 142, -1 }, /* (106) in_op ::= IN */ + { 142, -2 }, /* (107) in_op ::= NOT IN */ + { 143, -3 }, /* (108) in_predicate_value ::= NK_LP expression_list NK_RP */ + { 144, -1 }, /* (109) boolean_value_expression ::= boolean_primary */ + { 144, -2 }, /* (110) boolean_value_expression ::= NOT boolean_primary */ + { 144, -3 }, /* (111) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 144, -3 }, /* (112) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 145, -1 }, /* (113) boolean_primary ::= predicate */ + { 145, -3 }, /* (114) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 146, -1 }, /* (115) common_expression ::= expression */ + { 146, -1 }, /* (116) common_expression ::= boolean_value_expression */ + { 147, -2 }, /* (117) from_clause ::= FROM table_reference_list */ + { 148, -1 }, /* (118) table_reference_list ::= table_reference */ + { 148, -3 }, /* (119) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 149, -1 }, /* (120) table_reference ::= table_primary */ + { 149, -1 }, /* (121) table_reference ::= joined_table */ + { 150, -2 }, /* (122) table_primary ::= table_name alias_opt */ + { 150, -4 }, /* (123) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 150, -2 }, /* (124) table_primary ::= subquery alias_opt */ + { 150, -1 }, /* (125) table_primary ::= parenthesized_joined_table */ + { 152, 0 }, /* (126) alias_opt ::= */ + { 152, -1 }, /* (127) alias_opt ::= table_alias */ + { 152, -2 }, /* (128) alias_opt ::= AS table_alias */ + { 153, -3 }, /* (129) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 153, -3 }, /* (130) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 151, -6 }, /* (131) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 154, 0 }, /* (132) join_type ::= */ + { 154, -1 }, /* (133) join_type ::= INNER */ + { 156, -9 }, /* (134) 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 */ + { 157, 0 }, /* (135) set_quantifier_opt ::= */ + { 157, -1 }, /* (136) set_quantifier_opt ::= DISTINCT */ + { 157, -1 }, /* (137) set_quantifier_opt ::= ALL */ + { 158, -1 }, /* (138) select_list ::= NK_STAR */ + { 158, -1 }, /* (139) select_list ::= select_sublist */ + { 164, -1 }, /* (140) select_sublist ::= select_item */ + { 164, -3 }, /* (141) select_sublist ::= select_sublist NK_COMMA select_item */ + { 165, -1 }, /* (142) select_item ::= common_expression */ + { 165, -2 }, /* (143) select_item ::= common_expression column_alias */ + { 165, -3 }, /* (144) select_item ::= common_expression AS column_alias */ + { 165, -3 }, /* (145) select_item ::= table_name NK_DOT NK_STAR */ + { 159, 0 }, /* (146) where_clause_opt ::= */ + { 159, -2 }, /* (147) where_clause_opt ::= WHERE search_condition */ + { 160, 0 }, /* (148) partition_by_clause_opt ::= */ + { 160, -3 }, /* (149) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 161, 0 }, /* (150) twindow_clause_opt ::= */ + { 161, -6 }, /* (151) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ + { 161, -4 }, /* (152) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ + { 161, -6 }, /* (153) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 161, -8 }, /* (154) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 166, 0 }, /* (155) sliding_opt ::= */ + { 166, -4 }, /* (156) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 167, 0 }, /* (157) fill_opt ::= */ + { 167, -4 }, /* (158) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 167, -6 }, /* (159) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 168, -1 }, /* (160) fill_mode ::= NONE */ + { 168, -1 }, /* (161) fill_mode ::= PREV */ + { 168, -1 }, /* (162) fill_mode ::= NULL */ + { 168, -1 }, /* (163) fill_mode ::= LINEAR */ + { 168, -1 }, /* (164) fill_mode ::= NEXT */ + { 162, 0 }, /* (165) group_by_clause_opt ::= */ + { 162, -3 }, /* (166) group_by_clause_opt ::= GROUP BY group_by_list */ + { 169, -1 }, /* (167) group_by_list ::= expression */ + { 169, -3 }, /* (168) group_by_list ::= group_by_list NK_COMMA expression */ + { 163, 0 }, /* (169) having_clause_opt ::= */ + { 163, -2 }, /* (170) having_clause_opt ::= HAVING search_condition */ + { 128, -4 }, /* (171) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 170, -1 }, /* (172) query_expression_body ::= query_primary */ + { 170, -4 }, /* (173) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 174, -1 }, /* (174) query_primary ::= query_specification */ + { 171, 0 }, /* (175) order_by_clause_opt ::= */ + { 171, -3 }, /* (176) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 172, 0 }, /* (177) slimit_clause_opt ::= */ + { 172, -2 }, /* (178) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 172, -4 }, /* (179) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 172, -4 }, /* (180) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 173, 0 }, /* (181) limit_clause_opt ::= */ + { 173, -2 }, /* (182) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 173, -4 }, /* (183) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 173, -4 }, /* (184) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 139, -3 }, /* (185) subquery ::= NK_LP query_expression NK_RP */ + { 155, -1 }, /* (186) search_condition ::= common_expression */ + { 175, -1 }, /* (187) sort_specification_list ::= sort_specification */ + { 175, -3 }, /* (188) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 176, -3 }, /* (189) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 177, 0 }, /* (190) ordering_specification_opt ::= */ + { 177, -1 }, /* (191) ordering_specification_opt ::= ASC */ + { 177, -1 }, /* (192) ordering_specification_opt ::= DESC */ + { 178, 0 }, /* (193) null_ordering_opt ::= */ + { 178, -2 }, /* (194) null_ordering_opt ::= NULLS FIRST */ + { 178, -2 }, /* (195) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1614,562 +1777,677 @@ static YYACTIONTYPE yy_reduce( /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE DATABASE exists_opt db_name db_options */ -{ PARSER_TRACE; pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy185, &yymsp[-1].minor.yy129, yymsp[0].minor.yy87);} +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy259, &yymsp[-1].minor.yy105, yymsp[0].minor.yy27);} break; case 1: /* exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy185 = true; } +{ yymsp[-2].minor.yy259 = true; } break; case 2: /* exists_opt ::= */ -{ yymsp[1].minor.yy185 = false; } +{ yymsp[1].minor.yy259 = false; } break; case 3: /* db_options ::= */ -{ yymsp[1].minor.yy87 = createDefaultDatabaseOptions(pCxt);} +{ yymsp[1].minor.yy27 = createDefaultDatabaseOptions(pCxt); } break; case 4: /* db_options ::= db_options BLOCKS NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 5: /* db_options ::= db_options CACHE NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 6: /* db_options ::= db_options CACHELAST NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 7: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 8: /* db_options ::= db_options DAYS NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 9: /* db_options ::= db_options FSYNC NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 10: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 11: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 12: /* db_options ::= db_options KEEP NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 13: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 14: /* db_options ::= db_options QUORUM NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 15: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 16: /* db_options ::= db_options TTL NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 17: /* db_options ::= db_options WAL NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 18: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 19: /* db_options ::= db_options SINGLESTABLE NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_SINGLESTABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_SINGLESTABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; case 20: /* db_options ::= db_options STREAMMODE NK_INTEGER */ -{ yylhsminor.yy87 = setDatabaseOption(pCxt, yymsp[-2].minor.yy87, DB_OPTION_STREAMMODE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy87 = yylhsminor.yy87; +{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_STREAMMODE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy27 = yylhsminor.yy27; break; - case 21: /* cmd ::= query_expression */ -{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy104; } + case 21: /* cmd ::= USE db_name */ +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy105);} break; - case 22: /* literal ::= NK_INTEGER */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 22: /* cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options */ +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-5].minor.yy259, &yymsp[-4].minor.yy111, yymsp[-2].minor.yy60, yymsp[0].minor.yy40);} break; - case 23: /* literal ::= NK_FLOAT */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 23: /* full_table_name ::= NK_ID */ +{ STokenPair t = { .first = yymsp[0].minor.yy0, .second = nil_token}; yylhsminor.yy111 = t; } + yymsp[0].minor.yy111 = yylhsminor.yy111; break; - case 24: /* literal ::= NK_STRING */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 24: /* full_table_name ::= NK_ID NK_DOT NK_ID */ +{ STokenPair t = { .first = yymsp[-2].minor.yy0, .second = yymsp[0].minor.yy0}; yylhsminor.yy111 = t; } + yymsp[-2].minor.yy111 = yylhsminor.yy111; break; - case 25: /* literal ::= NK_BOOL */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 25: /* column_def_list ::= column_def */ +{ yylhsminor.yy60 = createNodeList(pCxt, yymsp[0].minor.yy172); } + yymsp[0].minor.yy60 = yylhsminor.yy60; break; - case 26: /* literal ::= TIMESTAMP NK_STRING */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + case 26: /* column_def_list ::= column_def_list NK_COMMA column_def */ +{ yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy60 = yylhsminor.yy60; break; - case 27: /* literal ::= duration_literal */ - case 37: /* expression ::= literal */ yytestcase(yyruleno==37); - case 38: /* expression ::= column_reference */ yytestcase(yyruleno==38); - case 41: /* expression ::= subquery */ yytestcase(yyruleno==41); - case 73: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==73); - case 77: /* boolean_primary ::= predicate */ yytestcase(yyruleno==77); - case 82: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==82); - case 84: /* table_reference ::= table_primary */ yytestcase(yyruleno==84); - case 85: /* table_reference ::= joined_table */ yytestcase(yyruleno==85); - case 89: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==89); - case 136: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==136); - case 138: /* query_primary ::= query_specification */ yytestcase(yyruleno==138); -{ PARSER_TRACE; yylhsminor.yy104 = yymsp[0].minor.yy104; } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 27: /* column_def ::= column_name type_name */ +{ yylhsminor.yy172 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy105, yymsp[0].minor.yy248, NULL); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 28: /* duration_literal ::= NK_VARIABLE */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 28: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy172 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy105, yymsp[-2].minor.yy248, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy172 = yylhsminor.yy172; break; - case 29: /* literal_list ::= literal */ - case 50: /* expression_list ::= expression */ yytestcase(yyruleno==50); -{ PARSER_TRACE; yylhsminor.yy8 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } - yymsp[0].minor.yy8 = yylhsminor.yy8; + case 29: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 30: /* literal_list ::= literal_list NK_COMMA literal */ - case 51: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==51); -{ PARSER_TRACE; yylhsminor.yy8 = addNodeToList(pCxt, yymsp[-2].minor.yy8, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } - yymsp[-2].minor.yy8 = yylhsminor.yy8; + case 30: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 31: /* db_name ::= NK_ID */ - case 32: /* table_name ::= NK_ID */ yytestcase(yyruleno==32); - case 33: /* column_name ::= NK_ID */ yytestcase(yyruleno==33); - case 34: /* function_name ::= NK_ID */ yytestcase(yyruleno==34); - case 35: /* table_alias ::= NK_ID */ yytestcase(yyruleno==35); - case 36: /* column_alias ::= NK_ID */ yytestcase(yyruleno==36); -{ PARSER_TRACE; yylhsminor.yy129 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy129 = yylhsminor.yy129; + case 31: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 39: /* expression ::= function_name NK_LP expression_list NK_RP */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy129, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy129, yymsp[-1].minor.yy8)); } - yymsp[-3].minor.yy104 = yylhsminor.yy104; + case 32: /* type_name ::= INT */ + case 33: /* type_name ::= INTEGER */ yytestcase(yyruleno==33); +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 40: /* expression ::= function_name NK_LP NK_STAR NK_RP */ -{ PARSER_TRACE; yylhsminor.yy104 = 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.yy104 = yylhsminor.yy104; + case 34: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 42: /* expression ::= NK_LP expression NK_RP */ - case 78: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==78); -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 35: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 43: /* expression ::= NK_PLUS expression */ + case 36: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + break; + case 37: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + break; + case 38: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + break; + case 39: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + break; + case 40: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + break; + case 41: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + break; + case 42: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UINT); } + break; + case 43: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + break; + case 44: /* type_name ::= JSON */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_JSON); } + break; + case 45: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + break; + case 46: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + break; + case 47: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BLOB); } + break; + case 48: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + break; + case 49: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 50: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 51: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + break; + case 52: /* table_options ::= */ +{ yymsp[1].minor.yy40 = createDefaultTableOptions(pCxt);} + break; + case 53: /* table_options ::= table_options COMMENT NK_INTEGER */ +{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy40 = yylhsminor.yy40; + break; + case 54: /* table_options ::= table_options KEEP NK_INTEGER */ +{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy40 = yylhsminor.yy40; + break; + case 55: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy40 = yylhsminor.yy40; + break; + case 56: /* cmd ::= SHOW DATABASES */ +{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASE_STMT); } + break; + case 57: /* cmd ::= query_expression */ +{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy172; } + break; + case 58: /* literal ::= NK_INTEGER */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 59: /* literal ::= NK_FLOAT */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 60: /* literal ::= NK_STRING */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 61: /* literal ::= NK_BOOL */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 62: /* literal ::= TIMESTAMP NK_STRING */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; + break; + case 63: /* literal ::= duration_literal */ + case 73: /* expression ::= literal */ yytestcase(yyruleno==73); + case 74: /* expression ::= column_reference */ yytestcase(yyruleno==74); + case 77: /* expression ::= subquery */ yytestcase(yyruleno==77); + case 109: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==109); + case 113: /* boolean_primary ::= predicate */ yytestcase(yyruleno==113); + case 118: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==118); + case 120: /* table_reference ::= table_primary */ yytestcase(yyruleno==120); + case 121: /* table_reference ::= joined_table */ yytestcase(yyruleno==121); + case 125: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==125); + case 172: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==172); + case 174: /* query_primary ::= query_specification */ yytestcase(yyruleno==174); +{ PARSER_TRACE; yylhsminor.yy172 = yymsp[0].minor.yy172; } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 64: /* duration_literal ::= NK_VARIABLE */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; + break; + case 65: /* literal_list ::= literal */ + case 86: /* expression_list ::= expression */ yytestcase(yyruleno==86); +{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); } + yymsp[0].minor.yy60 = yylhsminor.yy60; + break; + case 66: /* literal_list ::= literal_list NK_COMMA literal */ + case 87: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==87); +{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); } + yymsp[-2].minor.yy60 = yylhsminor.yy60; + break; + case 67: /* db_name ::= NK_ID */ + case 68: /* table_name ::= NK_ID */ yytestcase(yyruleno==68); + case 69: /* column_name ::= NK_ID */ yytestcase(yyruleno==69); + case 70: /* function_name ::= NK_ID */ yytestcase(yyruleno==70); + case 71: /* table_alias ::= NK_ID */ yytestcase(yyruleno==71); + case 72: /* column_alias ::= NK_ID */ yytestcase(yyruleno==72); +{ PARSER_TRACE; yylhsminor.yy105 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy105 = yylhsminor.yy105; + break; + case 75: /* expression ::= function_name NK_LP expression_list NK_RP */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy105, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy105, yymsp[-1].minor.yy60)); } + yymsp[-3].minor.yy172 = yylhsminor.yy172; + break; + case 76: /* expression ::= function_name NK_LP NK_STAR NK_RP */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy105, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy105, createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy0)))); } + yymsp[-3].minor.yy172 = yylhsminor.yy172; + break; + case 78: /* expression ::= NK_LP expression NK_RP */ + case 114: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==114); +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; + break; + case 79: /* expression ::= NK_PLUS expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 44: /* expression ::= NK_MINUS expression */ + case 80: /* expression ::= NK_MINUS expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy104), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), NULL)); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 45: /* expression ::= expression NK_PLUS expression */ + case 81: /* expression ::= expression NK_PLUS expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 46: /* expression ::= expression NK_MINUS expression */ + case 82: /* expression ::= expression NK_MINUS expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 47: /* expression ::= expression NK_STAR expression */ + case 83: /* expression ::= expression NK_STAR expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 48: /* expression ::= expression NK_SLASH expression */ + case 84: /* expression ::= expression NK_SLASH expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 49: /* expression ::= expression NK_REM expression */ + case 85: /* expression ::= expression NK_REM expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 52: /* column_reference ::= column_name */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy129, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy129)); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 88: /* column_reference ::= column_name */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy105, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy105)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 53: /* column_reference ::= table_name NK_DOT column_name */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129, createColumnNode(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy129)); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 89: /* column_reference ::= table_name NK_DOT column_name */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy105, createColumnNode(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy105)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 54: /* predicate ::= expression compare_op expression */ - case 59: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==59); + case 90: /* predicate ::= expression compare_op expression */ + case 95: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==95); { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy60, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy214, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 55: /* predicate ::= expression BETWEEN expression AND expression */ + case 91: /* predicate ::= expression BETWEEN expression AND expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy104), releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy172), releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-4].minor.yy104 = yylhsminor.yy104; + yymsp[-4].minor.yy172 = yylhsminor.yy172; break; - case 56: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 92: /* predicate ::= expression NOT BETWEEN expression AND expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[-5].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[-5].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-5].minor.yy104 = yylhsminor.yy104; + yymsp[-5].minor.yy172 = yylhsminor.yy172; break; - case 57: /* predicate ::= expression IS NULL */ + case 93: /* predicate ::= expression IS NULL */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), NULL)); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 58: /* predicate ::= expression IS NOT NULL */ + case 94: /* predicate ::= expression IS NOT NULL */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy172), NULL)); } - yymsp[-3].minor.yy104 = yylhsminor.yy104; + yymsp[-3].minor.yy172 = yylhsminor.yy172; break; - case 60: /* compare_op ::= NK_LT */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_LOWER_THAN; } + case 96: /* compare_op ::= NK_LT */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LOWER_THAN; } break; - case 61: /* compare_op ::= NK_GT */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_GREATER_THAN; } + case 97: /* compare_op ::= NK_GT */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_GREATER_THAN; } break; - case 62: /* compare_op ::= NK_LE */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_LOWER_EQUAL; } + case 98: /* compare_op ::= NK_LE */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LOWER_EQUAL; } break; - case 63: /* compare_op ::= NK_GE */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_GREATER_EQUAL; } + case 99: /* compare_op ::= NK_GE */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_GREATER_EQUAL; } break; - case 64: /* compare_op ::= NK_NE */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_NOT_EQUAL; } + case 100: /* compare_op ::= NK_NE */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_NOT_EQUAL; } break; - case 65: /* compare_op ::= NK_EQ */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_EQUAL; } + case 101: /* compare_op ::= NK_EQ */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_EQUAL; } break; - case 66: /* compare_op ::= LIKE */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_LIKE; } + case 102: /* compare_op ::= LIKE */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LIKE; } break; - case 67: /* compare_op ::= NOT LIKE */ -{ PARSER_TRACE; yymsp[-1].minor.yy60 = OP_TYPE_NOT_LIKE; } + case 103: /* compare_op ::= NOT LIKE */ +{ PARSER_TRACE; yymsp[-1].minor.yy214 = OP_TYPE_NOT_LIKE; } break; - case 68: /* compare_op ::= MATCH */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_MATCH; } + case 104: /* compare_op ::= MATCH */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_MATCH; } break; - case 69: /* compare_op ::= NMATCH */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_NMATCH; } + case 105: /* compare_op ::= NMATCH */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_NMATCH; } break; - case 70: /* in_op ::= IN */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = OP_TYPE_IN; } + case 106: /* in_op ::= IN */ +{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_IN; } break; - case 71: /* in_op ::= NOT IN */ -{ PARSER_TRACE; yymsp[-1].minor.yy60 = OP_TYPE_NOT_IN; } + case 107: /* in_op ::= NOT IN */ +{ PARSER_TRACE; yymsp[-1].minor.yy214 = OP_TYPE_NOT_IN; } break; - case 72: /* in_predicate_value ::= NK_LP expression_list NK_RP */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy8)); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 108: /* in_predicate_value ::= NK_LP expression_list NK_RP */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy60)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 74: /* boolean_value_expression ::= NOT boolean_primary */ + case 110: /* boolean_value_expression ::= NOT boolean_primary */ { PARSER_TRACE; - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy104), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), NULL)); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 75: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 111: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 76: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 112: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 79: /* common_expression ::= expression */ - case 80: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==80); -{ yylhsminor.yy104 = yymsp[0].minor.yy104; } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 115: /* common_expression ::= expression */ + case 116: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==116); +{ yylhsminor.yy172 = yymsp[0].minor.yy172; } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 81: /* from_clause ::= FROM table_reference_list */ - case 111: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==111); - case 134: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==134); -{ PARSER_TRACE; yymsp[-1].minor.yy104 = yymsp[0].minor.yy104; } + case 117: /* from_clause ::= FROM table_reference_list */ + case 147: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==147); + case 170: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==170); +{ PARSER_TRACE; yymsp[-1].minor.yy172 = yymsp[0].minor.yy172; } break; - case 83: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ PARSER_TRACE; yylhsminor.yy104 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy104, yymsp[0].minor.yy104, NULL); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 119: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ PARSER_TRACE; yylhsminor.yy172 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy172, yymsp[0].minor.yy172, NULL); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 86: /* table_primary ::= table_name alias_opt */ -{ PARSER_TRACE; yylhsminor.yy104 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy129, &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + case 122: /* table_primary ::= table_name alias_opt */ +{ PARSER_TRACE; yylhsminor.yy172 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy105, &yymsp[0].minor.yy105); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 87: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ PARSER_TRACE; yylhsminor.yy104 = createRealTableNode(pCxt, &yymsp[-3].minor.yy129, &yymsp[-1].minor.yy129, &yymsp[0].minor.yy129); } - yymsp[-3].minor.yy104 = yylhsminor.yy104; + case 123: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ PARSER_TRACE; yylhsminor.yy172 = createRealTableNode(pCxt, &yymsp[-3].minor.yy105, &yymsp[-1].minor.yy105, &yymsp[0].minor.yy105); } + yymsp[-3].minor.yy172 = yylhsminor.yy172; break; - case 88: /* table_primary ::= subquery alias_opt */ -{ PARSER_TRACE; yylhsminor.yy104 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104), &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + case 124: /* table_primary ::= subquery alias_opt */ +{ PARSER_TRACE; yylhsminor.yy172 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172), &yymsp[0].minor.yy105); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 90: /* alias_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy129 = nil_token; } + case 126: /* alias_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy105 = nil_token; } break; - case 91: /* alias_opt ::= table_alias */ -{ PARSER_TRACE; yylhsminor.yy129 = yymsp[0].minor.yy129; } - yymsp[0].minor.yy129 = yylhsminor.yy129; + case 127: /* alias_opt ::= table_alias */ +{ PARSER_TRACE; yylhsminor.yy105 = yymsp[0].minor.yy105; } + yymsp[0].minor.yy105 = yylhsminor.yy105; break; - case 92: /* alias_opt ::= AS table_alias */ -{ PARSER_TRACE; yymsp[-1].minor.yy129 = yymsp[0].minor.yy129; } + case 128: /* alias_opt ::= AS table_alias */ +{ PARSER_TRACE; yymsp[-1].minor.yy105 = yymsp[0].minor.yy105; } break; - case 93: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 94: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==94); -{ PARSER_TRACE; yymsp[-2].minor.yy104 = yymsp[-1].minor.yy104; } + case 129: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 130: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==130); +{ PARSER_TRACE; yymsp[-2].minor.yy172 = yymsp[-1].minor.yy172; } break; - case 95: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ PARSER_TRACE; yylhsminor.yy104 = createJoinTableNode(pCxt, yymsp[-4].minor.yy228, yymsp[-5].minor.yy104, yymsp[-2].minor.yy104, yymsp[0].minor.yy104); } - yymsp[-5].minor.yy104 = yylhsminor.yy104; + case 131: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ PARSER_TRACE; yylhsminor.yy172 = createJoinTableNode(pCxt, yymsp[-4].minor.yy278, yymsp[-5].minor.yy172, yymsp[-2].minor.yy172, yymsp[0].minor.yy172); } + yymsp[-5].minor.yy172 = yylhsminor.yy172; break; - case 96: /* join_type ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy228 = JOIN_TYPE_INNER; } + case 132: /* join_type ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy278 = JOIN_TYPE_INNER; } break; - case 97: /* join_type ::= INNER */ -{ PARSER_TRACE; yymsp[0].minor.yy228 = JOIN_TYPE_INNER; } + case 133: /* join_type ::= INNER */ +{ PARSER_TRACE; yymsp[0].minor.yy278 = JOIN_TYPE_INNER; } break; - case 98: /* 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 134: /* 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 */ { PARSER_TRACE; - yymsp[-8].minor.yy104 = createSelectStmt(pCxt, yymsp[-7].minor.yy185, yymsp[-6].minor.yy8, yymsp[-5].minor.yy104); - yymsp[-8].minor.yy104 = addWhereClause(pCxt, yymsp[-8].minor.yy104, yymsp[-4].minor.yy104); - yymsp[-8].minor.yy104 = addPartitionByClause(pCxt, yymsp[-8].minor.yy104, yymsp[-3].minor.yy8); - yymsp[-8].minor.yy104 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy104, yymsp[-2].minor.yy104); - yymsp[-8].minor.yy104 = addGroupByClause(pCxt, yymsp[-8].minor.yy104, yymsp[-1].minor.yy8); - yymsp[-8].minor.yy104 = addHavingClause(pCxt, yymsp[-8].minor.yy104, yymsp[0].minor.yy104); + yymsp[-8].minor.yy172 = createSelectStmt(pCxt, yymsp[-7].minor.yy259, yymsp[-6].minor.yy60, yymsp[-5].minor.yy172); + yymsp[-8].minor.yy172 = addWhereClause(pCxt, yymsp[-8].minor.yy172, yymsp[-4].minor.yy172); + yymsp[-8].minor.yy172 = addPartitionByClause(pCxt, yymsp[-8].minor.yy172, yymsp[-3].minor.yy60); + yymsp[-8].minor.yy172 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy172, yymsp[-2].minor.yy172); + yymsp[-8].minor.yy172 = addGroupByClause(pCxt, yymsp[-8].minor.yy172, yymsp[-1].minor.yy60); + yymsp[-8].minor.yy172 = addHavingClause(pCxt, yymsp[-8].minor.yy172, yymsp[0].minor.yy172); } break; - case 99: /* set_quantifier_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy185 = false; } + case 135: /* set_quantifier_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy259 = false; } break; - case 100: /* set_quantifier_opt ::= DISTINCT */ -{ PARSER_TRACE; yymsp[0].minor.yy185 = true; } + case 136: /* set_quantifier_opt ::= DISTINCT */ +{ PARSER_TRACE; yymsp[0].minor.yy259 = true; } break; - case 101: /* set_quantifier_opt ::= ALL */ -{ PARSER_TRACE; yymsp[0].minor.yy185 = false; } + case 137: /* set_quantifier_opt ::= ALL */ +{ PARSER_TRACE; yymsp[0].minor.yy259 = false; } break; - case 102: /* select_list ::= NK_STAR */ -{ PARSER_TRACE; yymsp[0].minor.yy8 = NULL; } + case 138: /* select_list ::= NK_STAR */ +{ PARSER_TRACE; yymsp[0].minor.yy60 = NULL; } break; - case 103: /* select_list ::= select_sublist */ -{ PARSER_TRACE; yylhsminor.yy8 = yymsp[0].minor.yy8; } - yymsp[0].minor.yy8 = yylhsminor.yy8; + case 139: /* select_list ::= select_sublist */ +{ PARSER_TRACE; yylhsminor.yy60 = yymsp[0].minor.yy60; } + yymsp[0].minor.yy60 = yylhsminor.yy60; break; - case 104: /* select_sublist ::= select_item */ - case 151: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==151); -{ PARSER_TRACE; yylhsminor.yy8 = createNodeList(pCxt, yymsp[0].minor.yy104); } - yymsp[0].minor.yy8 = yylhsminor.yy8; + case 140: /* select_sublist ::= select_item */ + case 187: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==187); +{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, yymsp[0].minor.yy172); } + yymsp[0].minor.yy60 = yylhsminor.yy60; break; - case 105: /* select_sublist ::= select_sublist NK_COMMA select_item */ - case 152: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==152); -{ PARSER_TRACE; yylhsminor.yy8 = addNodeToList(pCxt, yymsp[-2].minor.yy8, yymsp[0].minor.yy104); } - yymsp[-2].minor.yy8 = yylhsminor.yy8; + case 141: /* select_sublist ::= select_sublist NK_COMMA select_item */ + case 188: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==188); +{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy60 = yylhsminor.yy60; break; - case 106: /* select_item ::= common_expression */ + case 142: /* select_item ::= common_expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); - yylhsminor.yy104 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104), &t); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); + yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), &t); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 107: /* select_item ::= common_expression column_alias */ -{ PARSER_TRACE; yylhsminor.yy104 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104), &yymsp[0].minor.yy129); } - yymsp[-1].minor.yy104 = yylhsminor.yy104; + case 143: /* select_item ::= common_expression column_alias */ +{ PARSER_TRACE; yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172), &yymsp[0].minor.yy105); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; - case 108: /* select_item ::= common_expression AS column_alias */ -{ PARSER_TRACE; yylhsminor.yy104 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), &yymsp[0].minor.yy129); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 144: /* select_item ::= common_expression AS column_alias */ +{ PARSER_TRACE; yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), &yymsp[0].minor.yy105); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 109: /* select_item ::= table_name NK_DOT NK_STAR */ -{ PARSER_TRACE; yylhsminor.yy104 = createColumnNode(pCxt, &yymsp[-2].minor.yy129, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 145: /* select_item ::= table_name NK_DOT NK_STAR */ +{ PARSER_TRACE; yylhsminor.yy172 = createColumnNode(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 110: /* where_clause_opt ::= */ - case 114: /* twindow_clause_opt ::= */ yytestcase(yyruleno==114); - case 119: /* sliding_opt ::= */ yytestcase(yyruleno==119); - case 121: /* fill_opt ::= */ yytestcase(yyruleno==121); - case 133: /* having_clause_opt ::= */ yytestcase(yyruleno==133); - case 141: /* slimit_clause_opt ::= */ yytestcase(yyruleno==141); - case 145: /* limit_clause_opt ::= */ yytestcase(yyruleno==145); -{ PARSER_TRACE; yymsp[1].minor.yy104 = NULL; } + case 146: /* where_clause_opt ::= */ + case 150: /* twindow_clause_opt ::= */ yytestcase(yyruleno==150); + case 155: /* sliding_opt ::= */ yytestcase(yyruleno==155); + case 157: /* fill_opt ::= */ yytestcase(yyruleno==157); + case 169: /* having_clause_opt ::= */ yytestcase(yyruleno==169); + case 177: /* slimit_clause_opt ::= */ yytestcase(yyruleno==177); + case 181: /* limit_clause_opt ::= */ yytestcase(yyruleno==181); +{ PARSER_TRACE; yymsp[1].minor.yy172 = NULL; } break; - case 112: /* partition_by_clause_opt ::= */ - case 129: /* group_by_clause_opt ::= */ yytestcase(yyruleno==129); - case 139: /* order_by_clause_opt ::= */ yytestcase(yyruleno==139); -{ PARSER_TRACE; yymsp[1].minor.yy8 = NULL; } + case 148: /* partition_by_clause_opt ::= */ + case 165: /* group_by_clause_opt ::= */ yytestcase(yyruleno==165); + case 175: /* order_by_clause_opt ::= */ yytestcase(yyruleno==175); +{ PARSER_TRACE; yymsp[1].minor.yy60 = NULL; } break; - case 113: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 130: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==130); - case 140: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==140); -{ PARSER_TRACE; yymsp[-2].minor.yy8 = yymsp[0].minor.yy8; } + case 149: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 166: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==166); + case 176: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==176); +{ PARSER_TRACE; yymsp[-2].minor.yy60 = yymsp[0].minor.yy60; } break; - case 115: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ -{ PARSER_TRACE; yymsp[-5].minor.yy104 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), &yymsp[-1].minor.yy0); } + case 151: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy172 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy172), &yymsp[-1].minor.yy0); } break; - case 116: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy104 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } + case 152: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy172 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172)); } break; - case 117: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ PARSER_TRACE; yymsp[-5].minor.yy104 = createIntervalWindowNode(pCxt, yymsp[-3].minor.yy104, NULL, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } + case 153: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ PARSER_TRACE; yymsp[-5].minor.yy172 = createIntervalWindowNode(pCxt, yymsp[-3].minor.yy172, NULL, yymsp[-1].minor.yy172, yymsp[0].minor.yy172); } break; - case 118: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ PARSER_TRACE; yymsp[-7].minor.yy104 = createIntervalWindowNode(pCxt, yymsp[-5].minor.yy104, yymsp[-3].minor.yy104, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } + case 154: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ PARSER_TRACE; yymsp[-7].minor.yy172 = createIntervalWindowNode(pCxt, yymsp[-5].minor.yy172, yymsp[-3].minor.yy172, yymsp[-1].minor.yy172, yymsp[0].minor.yy172); } break; - case 120: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy104 = yymsp[-1].minor.yy104; } + case 156: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy172 = yymsp[-1].minor.yy172; } break; - case 122: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy104 = createFillNode(pCxt, yymsp[-1].minor.yy246, NULL); } + case 158: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy172 = createFillNode(pCxt, yymsp[-1].minor.yy202, NULL); } break; - case 123: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ PARSER_TRACE; yymsp[-5].minor.yy104 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy8)); } + case 159: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy172 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy60)); } break; - case 124: /* fill_mode ::= NONE */ -{ PARSER_TRACE; yymsp[0].minor.yy246 = FILL_MODE_NONE; } + case 160: /* fill_mode ::= NONE */ +{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NONE; } break; - case 125: /* fill_mode ::= PREV */ -{ PARSER_TRACE; yymsp[0].minor.yy246 = FILL_MODE_PREV; } + case 161: /* fill_mode ::= PREV */ +{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_PREV; } break; - case 126: /* fill_mode ::= NULL */ -{ PARSER_TRACE; yymsp[0].minor.yy246 = FILL_MODE_NULL; } + case 162: /* fill_mode ::= NULL */ +{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NULL; } break; - case 127: /* fill_mode ::= LINEAR */ -{ PARSER_TRACE; yymsp[0].minor.yy246 = FILL_MODE_LINEAR; } + case 163: /* fill_mode ::= LINEAR */ +{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_LINEAR; } break; - case 128: /* fill_mode ::= NEXT */ -{ PARSER_TRACE; yymsp[0].minor.yy246 = FILL_MODE_NEXT; } + case 164: /* fill_mode ::= NEXT */ +{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NEXT; } break; - case 131: /* group_by_list ::= expression */ -{ PARSER_TRACE; yylhsminor.yy8 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[0].minor.yy8 = yylhsminor.yy8; + case 167: /* group_by_list ::= expression */ +{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } + yymsp[0].minor.yy60 = yylhsminor.yy60; break; - case 132: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ PARSER_TRACE; yylhsminor.yy8 = addNodeToList(pCxt, yymsp[-2].minor.yy8, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy8 = yylhsminor.yy8; + case 168: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } + yymsp[-2].minor.yy60 = yylhsminor.yy60; break; - case 135: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 171: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { PARSER_TRACE; - yylhsminor.yy104 = addOrderByClause(pCxt, yymsp[-3].minor.yy104, yymsp[-2].minor.yy8); - yylhsminor.yy104 = addSlimitClause(pCxt, yylhsminor.yy104, yymsp[-1].minor.yy104); - yylhsminor.yy104 = addLimitClause(pCxt, yylhsminor.yy104, yymsp[0].minor.yy104); + yylhsminor.yy172 = addOrderByClause(pCxt, yymsp[-3].minor.yy172, yymsp[-2].minor.yy60); + yylhsminor.yy172 = addSlimitClause(pCxt, yylhsminor.yy172, yymsp[-1].minor.yy172); + yylhsminor.yy172 = addLimitClause(pCxt, yylhsminor.yy172, yymsp[0].minor.yy172); } - yymsp[-3].minor.yy104 = yylhsminor.yy104; + yymsp[-3].minor.yy172 = yylhsminor.yy172; break; - case 137: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ PARSER_TRACE; yylhsminor.yy104 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy104, yymsp[0].minor.yy104); } - yymsp[-3].minor.yy104 = yylhsminor.yy104; + case 173: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ PARSER_TRACE; yylhsminor.yy172 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy172, yymsp[0].minor.yy172); } + yymsp[-3].minor.yy172 = yylhsminor.yy172; break; - case 142: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 146: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==146); -{ PARSER_TRACE; yymsp[-1].minor.yy104 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 178: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 182: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==182); +{ PARSER_TRACE; yymsp[-1].minor.yy172 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 143: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 147: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==147); -{ PARSER_TRACE; yymsp[-3].minor.yy104 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 179: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 183: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==183); +{ PARSER_TRACE; yymsp[-3].minor.yy172 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 144: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 148: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==148); -{ PARSER_TRACE; yymsp[-3].minor.yy104 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 180: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 184: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==184); +{ PARSER_TRACE; yymsp[-3].minor.yy172 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 149: /* subquery ::= NK_LP query_expression NK_RP */ -{ PARSER_TRACE; yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy104); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 185: /* subquery ::= NK_LP query_expression NK_RP */ +{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy172); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 150: /* search_condition ::= common_expression */ -{ PARSER_TRACE; yylhsminor.yy104 = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); } - yymsp[0].minor.yy104 = yylhsminor.yy104; + case 186: /* search_condition ::= common_expression */ +{ PARSER_TRACE; yylhsminor.yy172 = releaseRawExprNode(pCxt, yymsp[0].minor.yy172); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 153: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ PARSER_TRACE; yylhsminor.yy104 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), yymsp[-1].minor.yy50, yymsp[0].minor.yy186); } - yymsp[-2].minor.yy104 = yylhsminor.yy104; + case 189: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ PARSER_TRACE; yylhsminor.yy172 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), yymsp[-1].minor.yy14, yymsp[0].minor.yy17); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 154: /* ordering_specification_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy50 = ORDER_ASC; } + case 190: /* ordering_specification_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy14 = ORDER_ASC; } break; - case 155: /* ordering_specification_opt ::= ASC */ -{ PARSER_TRACE; yymsp[0].minor.yy50 = ORDER_ASC; } + case 191: /* ordering_specification_opt ::= ASC */ +{ PARSER_TRACE; yymsp[0].minor.yy14 = ORDER_ASC; } break; - case 156: /* ordering_specification_opt ::= DESC */ -{ PARSER_TRACE; yymsp[0].minor.yy50 = ORDER_DESC; } + case 192: /* ordering_specification_opt ::= DESC */ +{ PARSER_TRACE; yymsp[0].minor.yy14 = ORDER_DESC; } break; - case 157: /* null_ordering_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy186 = NULL_ORDER_DEFAULT; } + case 193: /* null_ordering_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy17 = NULL_ORDER_DEFAULT; } break; - case 158: /* null_ordering_opt ::= NULLS FIRST */ -{ PARSER_TRACE; yymsp[-1].minor.yy186 = NULL_ORDER_FIRST; } + case 194: /* null_ordering_opt ::= NULLS FIRST */ +{ PARSER_TRACE; yymsp[-1].minor.yy17 = NULL_ORDER_FIRST; } break; - case 159: /* null_ordering_opt ::= NULLS LAST */ -{ PARSER_TRACE; yymsp[-1].minor.yy186 = NULL_ORDER_LAST; } + case 195: /* null_ordering_opt ::= NULLS LAST */ +{ PARSER_TRACE; yymsp[-1].minor.yy17 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/src/ttokenizer.c b/source/libs/parser/src/ttokenizer.c index 873fda2515..34dc3a2ea9 100644 --- a/source/libs/parser/src/ttokenizer.c +++ b/source/libs/parser/src/ttokenizer.c @@ -30,18 +30,18 @@ typedef struct SKeyword { // keywords in sql string static SKeyword keywordTable[] = { // {"ID", TK_ID}, - // {"BOOL", TK_BOOL}, -// {"TINYINT", TK_TINYINT}, -// {"SMALLINT", TK_SMALLINT}, - // {"INTEGER", TK_INTEGER}, - // {"INT", TK_INTEGER}, -// {"BIGINT", TK_BIGINT}, - // {"FLOAT", TK_FLOAT}, -// {"DOUBLE", TK_DOUBLE}, + {"BOOL", TK_BOOL}, + {"TINYINT", TK_TINYINT}, + {"SMALLINT", TK_SMALLINT}, + {"INTEGER", TK_INTEGER}, + {"INT", TK_INTEGER}, + {"BIGINT", TK_BIGINT}, + {"FLOAT", TK_FLOAT}, + {"DOUBLE", TK_DOUBLE}, // {"STRING", TK_STRING}, {"TIMESTAMP", TK_TIMESTAMP}, -// {"BINARY", TK_BINARY}, -// {"NCHAR", TK_NCHAR}, + {"BINARY", TK_BINARY}, + {"NCHAR", TK_NCHAR}, {"OR", TK_OR}, {"AND", TK_AND}, {"NOT", TK_NOT}, @@ -74,8 +74,8 @@ static SKeyword keywordTable[] = { // {"UMINUS", TK_UMINUS}, // {"UPLUS", TK_UPLUS}, // {"BITNOT", TK_BITNOT}, - // {"SHOW", TK_SHOW}, - // {"DATABASES", TK_DATABASES}, + {"SHOW", TK_SHOW}, + {"DATABASES", TK_DATABASES}, // {"MNODES", TK_MNODES}, // {"DNODES", TK_DNODES}, // {"ACCOUNTS", TK_ACCOUNTS}, @@ -92,12 +92,12 @@ static SKeyword keywordTable[] = { // {"STABLES", TK_STABLES}, {"VGROUPS", TK_VGROUPS}, // {"DROP", TK_DROP}, - // {"TABLE", TK_TABLE}, + {"TABLE", TK_TABLE}, {"DATABASE", TK_DATABASE}, // {"DNODE", TK_DNODE}, // {"USER", TK_USER}, // {"ACCOUNT", TK_ACCOUNT}, - // {"USE", TK_USE}, + {"USE", TK_USE}, // {"DESCRIBE", TK_DESCRIBE}, // {"SYNCDB", TK_SYNCDB}, // {"ALTER", TK_ALTER}, @@ -309,7 +309,7 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) { if (z[1] == '-') { for (i = 2; z[i] && z[i] != '\n'; i++) { } - *tokenId = TK_COMMENT; + *tokenId = TK_NK_COMMENT; return i; } *tokenId = TK_MINUS; @@ -343,7 +343,7 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) { for (i = 3; z[i] && (z[i] != '/' || z[i - 1] != '*'); i++) { } if (z[i]) i++; - *tokenId = TK_COMMENT; + *tokenId = TK_NK_COMMENT; return i; } case '%': { diff --git a/source/libs/parser/test/parserTest.cpp b/source/libs/parser/test/parserTest.cpp index 76edf60338..87c2496ebe 100644 --- a/source/libs/parser/test/parserTest.cpp +++ b/source/libs/parser/test/parserTest.cpp @@ -696,3 +696,23 @@ TEST_F(ParserTest, selectSemanticError) { bind("SELECT DISTINCT c2 FROM t1 WHERE c1 > 0 ORDER BY count(c2)"); ASSERT_TRUE(run(TSDB_CODE_SUCCESS, TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION)); } + +TEST_F(ParserTest, createDatabase) { + bind("create database wxy_db"); + ASSERT_TRUE(run()); +} + +TEST_F(ParserTest, showDatabase) { + bind("show databases"); + ASSERT_TRUE(run()); +} + +TEST_F(ParserTest, useDatabase) { + bind("use wxy_db"); + ASSERT_TRUE(run()); +} + +TEST_F(ParserTest, createTable) { + bind("create table t1(ts timestamp, c1 int)"); + ASSERT_TRUE(run()); +} diff --git a/source/libs/planner/inc/plannerInt.h b/source/libs/planner/inc/plannerInt.h index a6117c9c9b..e692d5d424 100644 --- a/source/libs/planner/inc/plannerInt.h +++ b/source/libs/planner/inc/plannerInt.h @@ -39,6 +39,15 @@ extern "C" { } \ } while (0) +#define CHECK_CODE_EXT(exec) \ + do { \ + int32_t code = (exec); \ + if (TSDB_CODE_SUCCESS != code) { \ + pCxt->errCode = code; \ + return code; \ + } \ + } while (0) + int32_t createLogicPlan(SPlanContext* pCxt, SLogicNode** pLogicNode); int32_t optimize(SPlanContext* pCxt, SLogicNode* pLogicNode); int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** pPlan); diff --git a/source/libs/planner/src/logicPlan.c b/source/libs/planner/src/logicPlan.c index b97248e986..f4cc59e5af 100644 --- a/source/libs/planner/src/logicPlan.c +++ b/source/libs/planner/src/logicPlan.c @@ -348,10 +348,20 @@ static SLogicNode* createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p return pRoot; } +static SLogicNode* createVnodeModifLogicNode(SLogicPlanContext* pCxt, SVnodeModifOpStmt* pStmt) { + SVnodeModifLogicNode* pModif = (SVnodeModifLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIF); + CHECK_ALLOC(pModif, NULL); + pModif->pDataBlocks = pStmt->pDataBlocks; + pModif->msgType = (QUERY_NODE_CREATE_TABLE_STMT == pStmt->sqlNodeType ? TDMT_VND_CREATE_TABLE : TDMT_VND_SUBMIT); + return (SLogicNode*)pModif; +} + static SLogicNode* createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt) { switch (nodeType(pStmt)) { case QUERY_NODE_SELECT_STMT: - return createSelectLogicNode(pCxt, (SSelectStmt*)pStmt); + return createSelectLogicNode(pCxt, (SSelectStmt*)pStmt); + case QUERY_NODE_VNODE_MODIF_STMT: + return createVnodeModifLogicNode(pCxt, (SVnodeModifOpStmt*)pStmt); default: break; } diff --git a/source/libs/planner/src/physicalPlan.c b/source/libs/planner/src/physicalPlan.c index de35b3f2c9..66ad0a9879 100644 --- a/source/libs/planner/src/physicalPlan.c +++ b/source/libs/planner/src/physicalPlan.c @@ -466,10 +466,26 @@ static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicPl return pPhyNode; } +static SDataSinkNode* createDataInserter(SPhysiPlanContext* pCxt, SVgDataBlocks* pBlocks) { + SDataInserterNode* pInserter = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT); + pInserter->numOfTables = pBlocks->numOfTables; + pInserter->size = pBlocks->size; + TSWAP(pInserter->pData, pBlocks->pData, char*); + return (SDataSinkNode*)pInserter; +} + static SSubplan* createPhysiSubplan(SPhysiPlanContext* pCxt, SSubLogicPlan* pLogicSubplan) { SSubplan* pSubplan = (SSubplan*)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); CHECK_ALLOC(pSubplan, NULL); - pSubplan->pNode = createPhysiNode(pCxt, pLogicSubplan->pNode); + if (SUBPLAN_TYPE_MODIFY == pLogicSubplan->subplanType) { + SVnodeModifLogicNode* pModif = (SVnodeModifLogicNode*)pLogicSubplan->pNode; + pSubplan->pDataSink = createDataInserter(pCxt, pModif->pVgDataBlocks); + pSubplan->msgType = pModif->msgType; + } else { + pSubplan->pNode = createPhysiNode(pCxt, pLogicSubplan->pNode); + // pSubplan->pDataSink = createDataDispatcher(pCxt, pSubplan->pNode); + } + pSubplan->subplanType = pLogicSubplan->subplanType; return pSubplan; } @@ -484,57 +500,130 @@ static int32_t strictListAppend(SNodeList* pList, SNodeptr pNode) { return code; } -static SQueryLogicPlan* createRawQueryLogicPlan(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode) { - SQueryLogicPlan* pLogicPlan = (SQueryLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN); - CHECK_ALLOC(pLogicPlan, NULL); - pLogicPlan->pSubplans = nodesMakeList(); - CHECK_ALLOC(pLogicPlan->pSubplans, pLogicPlan); - SNodeListNode* pTopSubplans = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); - CHECK_ALLOC(pTopSubplans, pLogicPlan); - CHECK_CODE(strictListAppend(pLogicPlan->pSubplans, pTopSubplans), pLogicPlan); - pTopSubplans->pNodeList = nodesMakeList(); - CHECK_ALLOC(pTopSubplans->pNodeList, pLogicPlan); - SSubLogicPlan* pSubplan = (SSubLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); - CHECK_ALLOC(pSubplan, pLogicPlan); - CHECK_CODE(strictListAppend(pTopSubplans->pNodeList, pSubplan), pLogicPlan); - pSubplan->pNode = pLogicNode; - CHECK_ALLOC(pSubplan->pNode, pLogicPlan); - return pLogicPlan; -} - -static int32_t splitLogicPlan(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, SQueryLogicPlan** pLogicPlan) { - SQueryLogicPlan* pPlan = createRawQueryLogicPlan(pCxt, pLogicNode); - if (TSDB_CODE_SUCCESS != pCxt->errCode) { - nodesDestroyNode((SNode*)pPlan); - return pCxt->errCode; +static int32_t splitLogicPlan(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, SSubLogicPlan** pSubLogicPlan) { + *pSubLogicPlan = (SSubLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + CHECK_ALLOC(*pSubLogicPlan, TSDB_CODE_OUT_OF_MEMORY); + // todo pSubplan->pNode = nodesCloneNode(pLogicNode); + (*pSubLogicPlan)->pNode = pLogicNode; + if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIF == nodeType(pLogicNode)) { + (*pSubLogicPlan)->subplanType = SUBPLAN_TYPE_MODIFY; } // todo split - *pLogicPlan = pPlan; return TSDB_CODE_SUCCESS; } -static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SQueryLogicPlan* pLogicPlan, SQueryPlan** pPlan) { - SQueryPlan* pQueryPlan = (SQueryPlan*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); - CHECK_ALLOC(pQueryPlan, TSDB_CODE_OUT_OF_MEMORY); - *pPlan = pQueryPlan; - pQueryPlan->queryId = pCxt->pPlanCxt->queryId; - - pQueryPlan->pSubplans = nodesMakeList(); - CHECK_ALLOC(pQueryPlan->pSubplans, TSDB_CODE_OUT_OF_MEMORY); - SNode* pNode; - FOREACH(pNode, pLogicPlan->pSubplans) { - SNodeListNode* pLevelSubplans = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); - CHECK_ALLOC(pLevelSubplans, TSDB_CODE_OUT_OF_MEMORY); - CHECK_CODE(strictListAppend(pQueryPlan->pSubplans, pLevelSubplans), TSDB_CODE_OUT_OF_MEMORY); - pLevelSubplans->pNodeList = nodesMakeList(); - CHECK_ALLOC(pLevelSubplans->pNodeList, TSDB_CODE_OUT_OF_MEMORY); - SNode* pLogicSubplan; - FOREACH(pLogicSubplan, ((SNodeListNode*)pNode)->pNodeList) { - CHECK_CODE(strictListAppend(pLevelSubplans->pNodeList, - createPhysiSubplan(pCxt, (SSubLogicPlan*)pLogicSubplan)), TSDB_CODE_OUT_OF_MEMORY); - ++(pQueryPlan->numOfSubplans); - } +static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNodeptr pSubplan, int32_t level, SNodeList* pSubplans) { + SNodeListNode* pGroup; + if (level >= LIST_LENGTH(pSubplans)) { + pGroup = nodesMakeNode(QUERY_NODE_NODE_LIST); + CHECK_ALLOC(pGroup, TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE(strictListAppend(pSubplans, pGroup), TSDB_CODE_OUT_OF_MEMORY); + } else { + pGroup = nodesListGetNode(pSubplans, level); } + if (NULL == pGroup->pNodeList) { + pGroup->pNodeList = nodesMakeList(); + CHECK_ALLOC(pGroup->pNodeList, TSDB_CODE_OUT_OF_MEMORY); + } + CHECK_CODE(strictListAppend(pGroup->pNodeList, pSubplan), TSDB_CODE_OUT_OF_MEMORY); +} + +SSubLogicPlan* singleCloneSubLogicPlan(SPhysiPlanContext* pCxt, SSubLogicPlan* pSrc, int32_t level) { + SSubLogicPlan* pDst = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + CHECK_ALLOC(pDst, NULL); + // todo pDst->pNode = nodesCloneNode(pSrc->pNode); + pDst->pNode = pSrc->pNode; + if (NULL == pDst->pNode) { + nodesDestroyNode(pDst); + return NULL; + } + pDst->subplanType = pSrc->subplanType; + pDst->level = level; + return pDst; +} + +static int32_t doScaleOut(SPhysiPlanContext* pCxt, SSubLogicPlan* pSubplan, int32_t level, SQueryLogicPlan* pLogicPlan) { + if (SUBPLAN_TYPE_MODIFY == pSubplan->subplanType) { + SVnodeModifLogicNode* pNode = (SVnodeModifLogicNode*)pSubplan->pNode; + size_t numOfVgroups = taosArrayGetSize(pNode->pDataBlocks); + for (int32_t i = 0; i < numOfVgroups; ++i) { + SSubLogicPlan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); + CHECK_ALLOC(pNewSubplan, TSDB_CODE_OUT_OF_MEMORY); + SVgDataBlocks* blocks = (SVgDataBlocks*)taosArrayGetP(pNode->pDataBlocks, i); + pNewSubplan->execNode.epset = blocks->vg.epset; + ((SVnodeModifLogicNode*)pNewSubplan->pNode)->pVgDataBlocks = blocks; + CHECK_CODE_EXT(pushSubplan(pCxt, pNewSubplan, level, pLogicPlan->pSubplans)); + } + } else { + SSubLogicPlan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); + CHECK_ALLOC(pNewSubplan, TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE_EXT(pushSubplan(pCxt, pNewSubplan, level, pLogicPlan->pSubplans)); + } + + SNode* pChild; + FOREACH(pChild, pSubplan->pChildren) { + CHECK_CODE_EXT(doScaleOut(pCxt, (SSubLogicPlan*)pChild, level + 1, pLogicPlan)); + } + + return TSDB_CODE_SUCCESS; +} + +static SQueryLogicPlan* makeQueryLogicPlan(SPhysiPlanContext* pCxt) { + SQueryLogicPlan* pLogicPlan = (SQueryLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN); + CHECK_ALLOC(pLogicPlan, NULL); + pLogicPlan->pSubplans = nodesMakeList(); + if (NULL == pLogicPlan->pSubplans) { + nodesDestroyNode(pLogicPlan); + return NULL; + } + return pLogicPlan; +} + +static int32_t scaleOutLogicPlan(SPhysiPlanContext* pCxt, SSubLogicPlan* pRootSubLogicPlan, SQueryLogicPlan** pLogicPlan) { + *pLogicPlan = makeQueryLogicPlan(pCxt); + CHECK_ALLOC(*pLogicPlan, TSDB_CODE_OUT_OF_MEMORY); + return doScaleOut(pCxt, pRootSubLogicPlan, 0, *pLogicPlan); +} + +typedef struct SBuildPhysiSubplanCxt { + int32_t errCode; + SQueryPlan* pQueryPlan; + SPhysiPlanContext* pPhyCxt; +} SBuildPhysiSubplanCxt; + +static EDealRes doBuildPhysiSubplan(SNode* pNode, void* pContext) { + SBuildPhysiSubplanCxt* pCxt = (SBuildPhysiSubplanCxt*)pContext; + if (QUERY_NODE_LOGIC_SUBPLAN == nodeType(pNode)) { + SSubplan* pSubplan = createPhysiSubplan(pCxt->pPhyCxt, (SSubLogicPlan*)pNode); + CHECK_ALLOC(pSubplan, DEAL_RES_ERROR); + CHECK_CODE(pushSubplan(pCxt->pPhyCxt, pSubplan, ((SSubLogicPlan*)pNode)->level, pCxt->pQueryPlan->pSubplans), DEAL_RES_ERROR); + ++(pCxt->pQueryPlan->numOfSubplans); + return DEAL_RES_IGNORE_CHILD; + } + return DEAL_RES_CONTINUE; +} + +static SQueryPlan* makeQueryPhysiPlan(SPhysiPlanContext* pCxt) { + SQueryPlan* pPlan = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); + CHECK_ALLOC(pPlan, NULL); + pPlan->pSubplans = nodesMakeList(); + if (NULL == pPlan->pSubplans) { + nodesDestroyNode(pPlan); + return NULL; + } + pPlan->queryId = pCxt->pPlanCxt->queryId; + return pPlan; +} + +static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SQueryLogicPlan* pLogicPlan, SQueryPlan** pPlan) { + SBuildPhysiSubplanCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pQueryPlan = makeQueryPhysiPlan(pCxt), .pPhyCxt = pCxt }; + CHECK_ALLOC(cxt.pQueryPlan, TSDB_CODE_OUT_OF_MEMORY); + nodesWalkList(pLogicPlan->pSubplans, doBuildPhysiSubplan, &cxt); + if (TSDB_CODE_SUCCESS != cxt.errCode) { + nodesDestroyNode(cxt.pQueryPlan); + return cxt.errCode; + } + *pPlan = cxt.pQueryPlan; return TSDB_CODE_SUCCESS; } @@ -549,8 +638,11 @@ int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** return TSDB_CODE_OUT_OF_MEMORY; } SQueryLogicPlan* pLogicPlan; - int32_t code = splitLogicPlan(&cxt, pLogicNode, &pLogicPlan); - // todo scale out + SSubLogicPlan* pSubLogicPlan; + int32_t code = splitLogicPlan(&cxt, pLogicNode, &pSubLogicPlan); + if (TSDB_CODE_SUCCESS == code) { + code = scaleOutLogicPlan(&cxt, pSubLogicPlan, &pLogicPlan); + } // todo maping if (TSDB_CODE_SUCCESS == code) { code = buildPhysiPlan(&cxt, pLogicPlan, pPlan); diff --git a/source/libs/planner/src/planner.c b/source/libs/planner/src/planner.c index 6fc0b49fbd..cce664190d 100644 --- a/source/libs/planner/src/planner.c +++ b/source/libs/planner/src/planner.c @@ -38,6 +38,13 @@ void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstrea } int32_t qSubPlanToString(const SSubplan* subplan, char** str, int32_t* len) { + if (SUBPLAN_TYPE_MODIFY == subplan->subplanType) { + SDataInserterNode* insert = (SDataInserterNode*)subplan->pDataSink; + *len = insert->size; + *str = insert->pData; + insert->pData = NULL; + return TSDB_CODE_SUCCESS; + } return nodesNodeToString((const SNode*)subplan, false, str, len); } diff --git a/source/libs/planner/test/plannerTest.cpp b/source/libs/planner/test/plannerTest.cpp index d5a2ebbafc..2a6e7a9a55 100644 --- a/source/libs/planner/test/plannerTest.cpp +++ b/source/libs/planner/test/plannerTest.cpp @@ -151,3 +151,8 @@ TEST_F(PlannerTest, subquery) { bind("SELECT count(*) FROM (SELECT c1 + c3 a, c1 + count(*) b FROM t1 where c2 = 'abc' GROUP BY c1, c3) where a > 100 group by b"); ASSERT_TRUE(run()); } + +TEST_F(PlannerTest, createTable) { + bind("create table t1(ts timestamp, c1 int)"); + ASSERT_TRUE(run()); +} From 35b3edaea562f5c01d7f63d17634bd5479d534d0 Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Fri, 4 Mar 2022 00:04:57 +0800 Subject: [PATCH 21/26] [TD-13756]: file system stat access func. --- include/os/osDir.h | 2 +- include/os/osFile.h | 24 +++-- source/common/test/commonTests.cpp | 4 +- source/common/test/tmsgTest.cpp | 2 +- source/dnode/vnode/src/tq/tqMetaStore.c | 2 +- source/dnode/vnode/src/tsdb/tsdbCommit.c | 4 +- source/dnode/vnode/src/tsdb/tsdbFS.c | 2 +- source/dnode/vnode/src/tsdb/tsdbFile.c | 15 ++- source/libs/CMakeLists.txt | 1 - source/libs/catalog/test/catalogTests.cpp | 6 +- source/libs/executor/src/executorimpl.c | 8 +- source/libs/executor/test/executorTests.cpp | 6 +- source/libs/executor/test/sortTests.cpp | 2 +- .../index/src/index_fst_counting_writer.c | 18 ++-- source/libs/parser/test/mockCatalog.cpp | 6 +- source/libs/parser/test/parserTests.cpp | 4 +- source/libs/parser/test/plannerTest.cpp | 2 +- source/libs/qworker/test/qworkerTests.cpp | 4 +- .../libs/scalar/test/filter/filterTests.cpp | 4 +- .../libs/scalar/test/scalar/scalarTests.cpp | 4 +- source/libs/scheduler/test/schedulerTests.cpp | 24 ++--- .../sync/test/syncIOSendMsgClientTest.cpp | 2 +- .../sync/test/syncIOSendMsgServerTest.cpp | 2 +- source/libs/sync/test/syncIOSendMsgTest.cpp | 2 +- source/libs/sync/test/syncIOTickPingTest.cpp | 2 +- source/libs/sync/test/syncIOTickQTest.cpp | 2 +- source/libs/sync/test/syncRaftStoreTest.cpp | 4 +- source/libs/sync/test/syncTest.cpp | 2 +- source/libs/tdb/src/db/tdb.c | 2 +- source/libs/tdb/src/db/tdbUtil.c | 43 ++++---- source/libs/tdb/src/inc/tdbUtil.h | 8 +- source/libs/tdb/test/tdbTest.cpp | 2 +- source/libs/tfs/src/tfs.c | 11 +-- source/libs/tfs/test/tfsTest.cpp | 98 +++++++++---------- source/libs/wal/src/walMeta.c | 22 ++--- source/os/src/osDir.c | 2 +- source/os/src/osFile.c | 39 ++++++++ source/util/test/cacheTest.cpp | 2 +- source/util/test/encodeTest.cpp | 2 +- source/util/test/freelistTest.cpp | 2 +- source/util/test/hashTest.cpp | 4 +- tools/shell/src/backup/shellImport.c | 8 +- 42 files changed, 221 insertions(+), 184 deletions(-) diff --git a/include/os/osDir.h b/include/os/osDir.h index eda83ea0ea..223c603352 100644 --- a/include/os/osDir.h +++ b/include/os/osDir.h @@ -21,7 +21,7 @@ extern "C" { #endif void taosRemoveDir(const char *dirname); -int32_t taosDirExist(char *dirname); +bool taosDirExist(char *dirname); int32_t taosMkDir(const char *dirname); void taosRemoveOldFiles(const char *dirname, int32_t keepDays); int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen); diff --git a/include/os/osFile.h b/include/os/osFile.h index cbd5d693c5..7e3a5277c8 100644 --- a/include/os/osFile.h +++ b/include/os/osFile.h @@ -25,8 +25,12 @@ extern "C" { #ifndef ALLOW_FORBID_FUNC #define open OPEN_FUNC_TAOS_FORBID #define fopen FOPEN_FUNC_TAOS_FORBID - // #define close CLOSE_FUNC_TAOS_FORBID - // #define fclose FCLOSE_FUNC_TAOS_FORBID + #define access ACCESS_FUNC_TAOS_FORBID + #define stat STAT_FUNC_TAOS_FORBID + #define lstat LSTAT_FUNC_TAOS_FORBID + #define fstat FSTAT_FUNC_TAOS_FORBID + #define close CLOSE_FUNC_TAOS_FORBID + #define fclose FCLOSE_FUNC_TAOS_FORBID #endif #ifndef PATH_MAX @@ -44,6 +48,12 @@ typedef struct TdFile *TdFilePtr; #define TD_FILE_AUTO_DEL 0x0040 #define TD_FILE_EXCL 0x0080 #define TD_FILE_STREAM 0x0100 // Only support taosFprintfFile, taosGetLineFile, taosGetLineFile, taosEOFFile +TdFilePtr taosOpenFile(const char *path,int32_t tdFileOptions); + +#define TD_FILE_ACCESS_EXIST_OK 0x1 +#define TD_FILE_ACCESS_READ_OK 0x2 +#define TD_FILE_ACCESS_WRITE_OK 0x4 +bool taosCheckAccessFile(const char *pathname, int mode); int32_t taosLockFile(TdFilePtr pFile); int32_t taosUnLockFile(TdFilePtr pFile); @@ -51,9 +61,9 @@ int32_t taosUnLockFile(TdFilePtr pFile); int32_t taosUmaskFile(int32_t maskVal); int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime); +int32_t taosDevInoFile(const char *path, int64_t *stDev, int64_t *stIno); int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime); - -TdFilePtr taosOpenFile(const char *path,int32_t tdFileOptions); +bool taosCheckExistFile(const char *pathname); int64_t taosLSeekFile(TdFilePtr pFile, int64_t offset, int32_t whence); int32_t taosFtruncateFile(TdFilePtr pFile, int64_t length); @@ -62,7 +72,7 @@ int32_t taosFsyncFile(TdFilePtr pFile); int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count); 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, ...); +void taosFprintfFile(TdFilePtr pFile, const char *format, ...); int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf); int32_t taosEOFFile(TdFilePtr pFile); @@ -71,7 +81,7 @@ int64_t taosCloseFile(TdFilePtr *ppFile); int32_t taosRenameFile(const char *oldName, const char *newName); int64_t taosCopyFile(const char *from, const char *to); -void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath); +void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath); 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); @@ -79,7 +89,7 @@ int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, in void *taosMmapReadOnlyFile(TdFilePtr pFile, int64_t length); bool taosValidFile(TdFilePtr pFile); -int taosGetErrorFile(TdFilePtr pFile); +int32_t taosGetErrorFile(TdFilePtr pFile); #ifdef __cplusplus } diff --git a/source/common/test/commonTests.cpp b/source/common/test/commonTests.cpp index 4821d60875..563efe4d54 100644 --- a/source/common/test/commonTests.cpp +++ b/source/common/test/commonTests.cpp @@ -1,6 +1,4 @@ -#include "tcommon.h" #include -#include #include #pragma GCC diagnostic push @@ -10,6 +8,8 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #include "os.h" +#include "tep.h" +#include "tcommon.h" #include "taos.h" #include "tvariant.h" #include "tdef.h" diff --git a/source/common/test/tmsgTest.cpp b/source/common/test/tmsgTest.cpp index ca33d24a8c..e8c3284ea5 100644 --- a/source/common/test/tmsgTest.cpp +++ b/source/common/test/tmsgTest.cpp @@ -1,6 +1,6 @@ #include -#include "gtest/gtest.h" +#include #include "tmsg.h" diff --git a/source/dnode/vnode/src/tq/tqMetaStore.c b/source/dnode/vnode/src/tq/tqMetaStore.c index 6d5085ee74..ce00c98ff9 100644 --- a/source/dnode/vnode/src/tq/tqMetaStore.c +++ b/source/dnode/vnode/src/tq/tqMetaStore.c @@ -90,7 +90,7 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F char name[pathLen + 10]; strcpy(name, path); - if (taosDirExist(name) != 0 && taosMkDir(name) != 0) { + if (!taosDirExist(name) && taosMkDir(name) != 0) { terrno = TSDB_CODE_TQ_FAILED_TO_CREATE_DIR; tqError("failed to create dir:%s since %s ", name, terrstr()); } diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 2e7116969e..7a95820115 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -580,7 +580,7 @@ static int tsdbSetAndOpenCommitFile(SCommitH *pCommith, SDFileSet *pSet, int fid SDFile *pRSmadF = TSDB_READ_SMAD_FILE(&(pCommith->readh)); SDFile *pWSmadF = TSDB_COMMIT_SMAD_FILE(pCommith); - if (access(TSDB_FILE_FULL_NAME(pRSmadF), F_OK) != 0) { + if (!taosCheckExistFile(TSDB_FILE_FULL_NAME(pRSmadF))) { tsdbDebug("vgId:%d create data file %s as not exist", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pRSmadF)); tsdbInitDFile(pRepo, pWSmadF, did, fid, FS_TXN_VERSION(REPO_FS(pRepo)), TSDB_FILE_SMAD); @@ -614,7 +614,7 @@ static int tsdbSetAndOpenCommitFile(SCommitH *pCommith, SDFileSet *pSet, int fid SDFile *pRSmalF = TSDB_READ_SMAL_FILE(&(pCommith->readh)); SDFile *pWSmalF = TSDB_COMMIT_SMAL_FILE(pCommith); - if ((pCommith->isLFileSame) && access(TSDB_FILE_FULL_NAME(pRSmalF), F_OK) == 0) { + if ((pCommith->isLFileSame) && taosCheckExistFile(TSDB_FILE_FULL_NAME(pRSmalF))) { tsdbInitDFileEx(pWSmalF, pRSmalF); if (tsdbOpenDFile(pWSmalF, O_RDWR) < 0) { tsdbError("vgId:%d failed to open file %s to commit since %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pWSmalF), diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index dcc9700d83..411a166caa 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -314,7 +314,7 @@ int tsdbOpenFS(STsdb *pRepo) { tsdbGetTxnFname(pRepo, TSDB_TXN_CURR_FILE, current); tsdbGetRtnSnap(pRepo, &pRepo->rtn); - if (access(current, F_OK) == 0) { + if (taosCheckExistFile(current)) { if (tsdbOpenFSFromCurrent(pRepo) < 0) { tsdbError("vgId:%d failed to open FS since %s", REPO_ID(pRepo), tstrerror(terrno)); return -1; diff --git a/source/dnode/vnode/src/tsdb/tsdbFile.c b/source/dnode/vnode/src/tsdb/tsdbFile.c index 4d70c429ff..74fb8c1c1f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFile.c +++ b/source/dnode/vnode/src/tsdb/tsdbFile.c @@ -443,25 +443,24 @@ int tsdbLoadDFileHeader(SDFile *pDFile, SDFInfo *pInfo) { } static int tsdbScanAndTryFixDFile(STsdb *pRepo, SDFile *pDFile) { - struct stat dfstat; SDFile df; tsdbInitDFileEx(&df, pDFile); - if (access(TSDB_FILE_FULL_NAME(pDFile), F_OK) != 0) { + if (!taosCheckExistFile(TSDB_FILE_FULL_NAME(pDFile))) { tsdbError("vgId:%d data file %s not exit, report to upper layer to fix it", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile)); // pRepo->state |= TSDB_STATE_BAD_DATA; TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD); return 0; } - - if (stat(TSDB_FILE_FULL_NAME(&df), &dfstat) < 0) { + int64_t file_size = 0; + if (taosStatFile(TSDB_FILE_FULL_NAME(&df), &file_size, NULL) < 0) { terrno = TAOS_SYSTEM_ERROR(errno); return -1; } - if (pDFile->info.size < dfstat.st_size) { + if (pDFile->info.size < file_size) { // if (tsdbOpenDFile(&df, O_WRONLY) < 0) { if (tsdbOpenDFile(&df, TD_FILE_WRITE) < 0) { return -1; @@ -480,10 +479,10 @@ static int tsdbScanAndTryFixDFile(STsdb *pRepo, SDFile *pDFile) { tsdbCloseDFile(&df); tsdbInfo("vgId:%d file %s is truncated from %" PRId64 " to %" PRId64, REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile), - dfstat.st_size, pDFile->info.size); - } else if (pDFile->info.size > dfstat.st_size) { + file_size, pDFile->info.size); + } else if (pDFile->info.size > file_size) { tsdbError("vgId:%d data file %s has wrong size %" PRId64 " expected %" PRId64 ", report to upper layer to fix it", - REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile), dfstat.st_size, pDFile->info.size); + REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile), file_size, pDFile->info.size); // pRepo->state |= TSDB_STATE_BAD_DATA; TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD); terrno = TSDB_CODE_TDB_FILE_CORRUPTED; diff --git a/source/libs/CMakeLists.txt b/source/libs/CMakeLists.txt index 78625d1eed..d766f3cbf1 100644 --- a/source/libs/CMakeLists.txt +++ b/source/libs/CMakeLists.txt @@ -1,4 +1,3 @@ -add_definitions("-D ALLOW_FORBID_FUNC") add_subdirectory(transport) add_subdirectory(sync) add_subdirectory(tdb) diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp index b417a645be..b05fc7812a 100644 --- a/source/libs/catalog/test/catalogTests.cpp +++ b/source/libs/catalog/test/catalogTests.cpp @@ -14,9 +14,7 @@ */ #include -#include #include -#include "os.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wwrite-strings" @@ -24,8 +22,10 @@ #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wformat" +#include -#include "addr_any.h" +#include "os.h" +#include "tglobal.h" #include "catalog.h" #include "stub.h" #include "taos.h" diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index c400ded1c1..d449d7fac4 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -2215,10 +2215,10 @@ static void destroyTsComp(STaskRuntimeEnv *pRuntimeEnv, STaskAttr *pQueryAttr) { if (pQueryAttr->tsCompQuery && pRuntimeEnv->outputBuf && pRuntimeEnv->outputBuf->pDataBlock && taosArrayGetSize(pRuntimeEnv->outputBuf->pDataBlock) > 0) { SColumnInfoData* pColInfoData = taosArrayGet(pRuntimeEnv->outputBuf->pDataBlock, 0); if (pColInfoData) { - FILE *f = *(FILE **)pColInfoData->pData; // TODO refactor - if (f) { - fclose(f); - *(FILE **)pColInfoData->pData = NULL; + TdFilePtr pFile = *(TdFilePtr *)pColInfoData->pData; // TODO refactor + if (pFile != NULL) { + taosCloseFile(&pFile); + *(TdFilePtr *)pColInfoData->pData = NULL; } } } diff --git a/source/libs/executor/test/executorTests.cpp b/source/libs/executor/test/executorTests.cpp index 262232ceb1..7d3665a8cc 100644 --- a/source/libs/executor/test/executorTests.cpp +++ b/source/libs/executor/test/executorTests.cpp @@ -13,10 +13,7 @@ * along with this program. If not, see . */ -#include -#include #include -#include #include #pragma GCC diagnostic push @@ -26,6 +23,9 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #include "os.h" +#include "tglobal.h" +#include "executorimpl.h" +#include "function.h" #include "taos.h" #include "tdef.h" #include "tvariant.h" diff --git a/source/libs/executor/test/sortTests.cpp b/source/libs/executor/test/sortTests.cpp index fc366e4cc8..612b0705ea 100644 --- a/source/libs/executor/test/sortTests.cpp +++ b/source/libs/executor/test/sortTests.cpp @@ -13,7 +13,6 @@ * along with this program. If not, see . */ -#include #include #include #include @@ -26,6 +25,7 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #include "os.h" +#include "executorimpl.h" #include "executor.h" #include "stub.h" #include "taos.h" diff --git a/source/libs/index/src/index_fst_counting_writer.c b/source/libs/index/src/index_fst_counting_writer.c index 16d9893778..8cb2ff9246 100644 --- a/source/libs/index/src/index_fst_counting_writer.c +++ b/source/libs/index/src/index_fst_counting_writer.c @@ -63,9 +63,9 @@ static int writeCtxDoReadFrom(WriterCtx* ctx, uint8_t* buf, int len, int32_t off } static int writeCtxGetSize(WriterCtx* ctx) { if (ctx->type == TFile) { - struct stat fstat; - stat(ctx->file.buf, &fstat); - return fstat.st_size; + int64_t file_size = 0; + taosStatFile(ctx->file.buf, &file_size, NULL); + return (int)file_size; } return 0; } @@ -99,9 +99,9 @@ WriterCtx* writerCtxCreate(WriterType type, const char* path, bool readOnly, int // ctx->file.pFile = open(path, O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO); ctx->file.pFile = taosOpenFile(path, TD_FILE_READ); - struct stat fstat; - stat(path, &fstat); - ctx->file.size = fstat.st_size; + int64_t file_size = 0; + taosFStatFile(ctx->file.pFile, &file_size, NULL); + ctx->file.size = (int)file_size; #ifdef USE_MMAP ctx->file.ptr = (char*)tfMmapReadOnly(ctx->file.pFile, ctx->file.size); #endif @@ -142,8 +142,10 @@ void writerCtxDestroy(WriterCtx* ctx, bool remove) { #endif } if (ctx->file.readOnly == false) { - struct stat fstat; - stat(ctx->file.buf, &fstat); + int64_t file_size = 0; + taosStatFile(ctx->file.buf, &file_size, NULL); + // struct stat fstat; + // stat(ctx->file.buf, &fstat); // indexError("write file size: %d", (int)(fstat.st_size)); } if (remove) { unlink(ctx->file.buf); } diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp index 457d586ea4..e626fc68ae 100644 --- a/source/libs/parser/test/mockCatalog.cpp +++ b/source/libs/parser/test/mockCatalog.cpp @@ -13,19 +13,17 @@ * along with this program. If not, see . */ -#include "mockCatalog.h" - #include - #include "stub.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat" -#include "addr_any.h" +#include #pragma GCC diagnostic pop +#include "mockCatalog.h" namespace { void generateTestT1(MockCatalogService* mcs) { diff --git a/source/libs/parser/test/parserTests.cpp b/source/libs/parser/test/parserTests.cpp index b971760132..b80efe09ed 100644 --- a/source/libs/parser/test/parserTests.cpp +++ b/source/libs/parser/test/parserTests.cpp @@ -13,10 +13,8 @@ * along with this program. If not, see . */ -#include #include #include -#include "tglobal.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wwrite-strings" @@ -25,6 +23,8 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #include "os.h" +#include "function.h" +#include "tglobal.h" #include "astGenerator.h" #include "parserInt.h" #include "taos.h" diff --git a/source/libs/parser/test/plannerTest.cpp b/source/libs/parser/test/plannerTest.cpp index 43daff9fec..095e2f4f97 100644 --- a/source/libs/parser/test/plannerTest.cpp +++ b/source/libs/parser/test/plannerTest.cpp @@ -13,7 +13,6 @@ * along with this program. If not, see . */ -#include #include #include #include @@ -25,6 +24,7 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #include "os.h" +#include "function.h" #include "astGenerator.h" #include "parserInt.h" #include "taos.h" diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp index 8ad5a76388..94d4260696 100644 --- a/source/libs/qworker/test/qworkerTests.cpp +++ b/source/libs/qworker/test/qworkerTests.cpp @@ -14,7 +14,6 @@ */ #include -#include #include #pragma GCC diagnostic push @@ -26,9 +25,11 @@ #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #pragma GCC diagnostic ignored "-Wpointer-arith" +#include #include "os.h" +#include "tglobal.h" #include "taos.h" #include "tdef.h" #include "tvariant.h" @@ -37,7 +38,6 @@ #include "planner.h" #include "qworker.h" #include "stub.h" -#include "addr_any.h" #include "executor.h" #include "dataSinkMgt.h" diff --git a/source/libs/scalar/test/filter/filterTests.cpp b/source/libs/scalar/test/filter/filterTests.cpp index fafc1ea42e..13829618a2 100644 --- a/source/libs/scalar/test/filter/filterTests.cpp +++ b/source/libs/scalar/test/filter/filterTests.cpp @@ -14,7 +14,6 @@ */ #include -#include #include #pragma GCC diagnostic push @@ -26,15 +25,16 @@ #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #pragma GCC diagnostic ignored "-Wpointer-arith" +#include #include "os.h" +#include "tglobal.h" #include "taos.h" #include "tdef.h" #include "tvariant.h" #include "tep.h" #include "stub.h" -#include "addr_any.h" #include "scalar.h" #include "nodes.h" #include "tlog.h" diff --git a/source/libs/scalar/test/scalar/scalarTests.cpp b/source/libs/scalar/test/scalar/scalarTests.cpp index b9aef99088..8eef1836a5 100644 --- a/source/libs/scalar/test/scalar/scalarTests.cpp +++ b/source/libs/scalar/test/scalar/scalarTests.cpp @@ -14,7 +14,6 @@ */ #include -#include #include #pragma GCC diagnostic push @@ -26,15 +25,16 @@ #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #pragma GCC diagnostic ignored "-Wpointer-arith" +#include #include "os.h" +#include "tglobal.h" #include "taos.h" #include "tdef.h" #include "tvariant.h" #include "tep.h" #include "stub.h" -#include "addr_any.h" #include "scalar.h" #include "nodes.h" #include "tlog.h" diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp index 11ed3335e6..1a34c20ba0 100644 --- a/source/libs/scheduler/test/schedulerTests.cpp +++ b/source/libs/scheduler/test/schedulerTests.cpp @@ -14,19 +14,8 @@ */ #include -#include #include -#include "os.h" - -#include "taos.h" -#include "tdef.h" -#include "tvariant.h" -#include "catalog.h" -#include "scheduler.h" -#include "tep.h" -#include "trpc.h" - #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wwrite-strings" #pragma GCC diagnostic ignored "-Wunused-function" @@ -34,10 +23,21 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wreturn-type" #pragma GCC diagnostic ignored "-Wformat" +#include + +#include "os.h" + +#include "tglobal.h" +#include "taos.h" +#include "tdef.h" +#include "tvariant.h" +#include "catalog.h" +#include "scheduler.h" +#include "tep.h" +#include "trpc.h" #include "schedulerInt.h" #include "stub.h" -#include "addr_any.h" #include "tref.h" namespace { diff --git a/source/libs/sync/test/syncIOSendMsgClientTest.cpp b/source/libs/sync/test/syncIOSendMsgClientTest.cpp index 9e8c7c8b65..0d06c4f811 100644 --- a/source/libs/sync/test/syncIOSendMsgClientTest.cpp +++ b/source/libs/sync/test/syncIOSendMsgClientTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/test/syncIOSendMsgServerTest.cpp b/source/libs/sync/test/syncIOSendMsgServerTest.cpp index 8af9344ed6..1582e097d3 100644 --- a/source/libs/sync/test/syncIOSendMsgServerTest.cpp +++ b/source/libs/sync/test/syncIOSendMsgServerTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/test/syncIOSendMsgTest.cpp b/source/libs/sync/test/syncIOSendMsgTest.cpp index a297981ee5..9b2cfcf1d8 100644 --- a/source/libs/sync/test/syncIOSendMsgTest.cpp +++ b/source/libs/sync/test/syncIOSendMsgTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/test/syncIOTickPingTest.cpp b/source/libs/sync/test/syncIOTickPingTest.cpp index 1559b57585..42b9a73432 100644 --- a/source/libs/sync/test/syncIOTickPingTest.cpp +++ b/source/libs/sync/test/syncIOTickPingTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/test/syncIOTickQTest.cpp b/source/libs/sync/test/syncIOTickQTest.cpp index 90304079e3..3d31c596bf 100644 --- a/source/libs/sync/test/syncIOTickQTest.cpp +++ b/source/libs/sync/test/syncIOTickQTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/test/syncRaftStoreTest.cpp b/source/libs/sync/test/syncRaftStoreTest.cpp index e533b89a92..9cfbe5a4ea 100644 --- a/source/libs/sync/test/syncRaftStoreTest.cpp +++ b/source/libs/sync/test/syncRaftStoreTest.cpp @@ -1,6 +1,6 @@ -#include "syncRaftStore.h" #include -#include "gtest/gtest.h" +#include +#include "syncRaftStore.h" #include "syncIO.h" #include "syncInt.h" diff --git a/source/libs/sync/test/syncTest.cpp b/source/libs/sync/test/syncTest.cpp index 0b397ef921..c1c5658aba 100644 --- a/source/libs/sync/test/syncTest.cpp +++ b/source/libs/sync/test/syncTest.cpp @@ -1,5 +1,5 @@ #include -#include "gtest/gtest.h" +#include #include "syncIO.h" #include "syncInt.h" #include "syncRaftStore.h" diff --git a/source/libs/tdb/src/db/tdb.c b/source/libs/tdb/src/db/tdb.c index cc3b7fa6b9..65d4cf80cc 100644 --- a/source/libs/tdb/src/db/tdb.c +++ b/source/libs/tdb/src/db/tdb.c @@ -90,7 +90,7 @@ int tdbOpen(TDB *pDb, const char *fname, const char *dbname, TENV *pEnv) { // get page file from the env, if not opened yet, open it pPgFile = NULL; snprintf(dbfname, 128, "%s/%s", tdbEnvGetRootDir(pEnv), fname); - fileExist = (tdbCheckFileAccess(fname, TDB_F_OK) == 0); + fileExist = taosCheckExistFile(fname); if (fileExist) { tdbGnrtFileID(dbfname, fileid, false); pPgFile = tdbEnvGetPageFile(pEnv, fileid); diff --git a/source/libs/tdb/src/db/tdbUtil.c b/source/libs/tdb/src/db/tdbUtil.c index fa9a3297da..fe0f3befd6 100644 --- a/source/libs/tdb/src/db/tdbUtil.c +++ b/source/libs/tdb/src/db/tdbUtil.c @@ -16,16 +16,16 @@ #include "tdbInt.h" int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique) { - struct stat statbuf; + int64_t stDev = 0, stIno = 0; - if (stat(fname, &statbuf) < 0) { + if (taosDevInoFile(fname, &stDev, &stIno) < 0) { return -1; } memset(fileid, 0, TDB_FILE_ID_LEN); - ((uint64_t *)fileid)[0] = (uint64_t)statbuf.st_ino; - ((uint64_t *)fileid)[1] = (uint64_t)statbuf.st_dev; + ((uint64_t *)fileid)[0] = stDev; + ((uint64_t *)fileid)[1] = stIno; if (unique) { ((uint64_t *)fileid)[2] = rand(); } @@ -33,35 +33,34 @@ int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique) { return 0; } -int tdbCheckFileAccess(const char *pathname, int mode) { - int flags = 0; +// int tdbCheckFileAccess(const char *pathname, int mode) { +// int flags = 0; - if (mode & TDB_F_OK) { - flags |= F_OK; - } +// if (mode & TDB_F_OK) { +// flags |= F_OK; +// } - if (mode & TDB_R_OK) { - flags |= R_OK; - } +// if (mode & TDB_R_OK) { +// flags |= R_OK; +// } - if (mode & TDB_W_OK) { - flags |= W_OK; - } +// if (mode & TDB_W_OK) { +// flags |= W_OK; +// } - return access(pathname, flags); -} +// return access(pathname, flags); +// } int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize) { - struct stat st; int ret; - - ret = stat(fname, &st); + int64_t file_size = 0; + ret = taosStatFile(fname, &file_size, NULL); if (ret != 0) { return -1; } - ASSERT(st.st_size % pgSize == 0); + ASSERT(file_size % pgSize == 0); - *pSize = st.st_size / pgSize; + *pSize = file_size / pgSize; return 0; } \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbUtil.h b/source/libs/tdb/src/inc/tdbUtil.h index 8108e5aba6..ca05790f77 100644 --- a/source/libs/tdb/src/inc/tdbUtil.h +++ b/source/libs/tdb/src/inc/tdbUtil.h @@ -30,10 +30,10 @@ extern "C" { int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique); -#define TDB_F_OK 0x1 -#define TDB_R_OK 0x2 -#define TDB_W_OK 0x4 -int tdbCheckFileAccess(const char *pathname, int mode); +// #define TDB_F_OK 0x1 +// #define TDB_R_OK 0x2 +// #define TDB_W_OK 0x4 +// int tdbCheckFileAccess(const char *pathname, int mode); int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize); diff --git a/source/libs/tdb/test/tdbTest.cpp b/source/libs/tdb/test/tdbTest.cpp index 5ab0b4c0f1..ad550c7804 100644 --- a/source/libs/tdb/test/tdbTest.cpp +++ b/source/libs/tdb/test/tdbTest.cpp @@ -1,4 +1,4 @@ -#include "gtest/gtest.h" +#include #include "tdb.h" diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index 944e67c863..26fa90bdef 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -389,7 +389,6 @@ static int32_t tfsMount(STfs *pTfs, SDiskCfg *pCfg) { static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { char dirName[TSDB_FILENAME_LEN] = "\0"; - struct stat pstat; if (pCfg->level < 0 || pCfg->level >= TFS_MAX_TIERS) { fError("failed to mount %s to FS since invalid level %d", pCfg->dir, pCfg->level); @@ -422,19 +421,13 @@ static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { return -1; } - if (access(dirName, W_OK | R_OK | F_OK) != 0) { + if (!taosCheckAccessFile(dirName, TD_FILE_ACCESS_EXIST_OK | TD_FILE_ACCESS_READ_OK | TD_FILE_ACCESS_WRITE_OK)) { fError("failed to mount %s to FS since no R/W access rights", pCfg->dir); terrno = TSDB_CODE_FS_INVLD_CFG; return -1; } - if (stat(dirName, &pstat) < 0) { - fError("failed to mount %s to FS since %s", pCfg->dir, strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - - if (!S_ISDIR(pstat.st_mode)) { + if (!taosIsDir(dirName)) { fError("failed to mount %s to FS since not a directory", pCfg->dir); terrno = TSDB_CODE_FS_INVLD_CFG; return -1; diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index af66304f84..9cb914a670 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -119,29 +119,29 @@ TEST_F(TfsTest, 03_Dir) { char p1[] = "p1"; char ap1[128] = {0}; snprintf(ap1, 128, "%s%s%s", root, TD_DIRSEP, p1); - EXPECT_NE(taosDirExist(ap1), 0); + EXPECT_NE(taosDirExist(ap1), 1); EXPECT_EQ(tfsMkdir(pTfs, p1), 0); - EXPECT_EQ(taosDirExist(ap1), 0); + EXPECT_EQ(taosDirExist(ap1), 1); char p2[] = "p2"; char ap2[128] = {0}; snprintf(ap2, 128, "%s%s%s", root, TD_DIRSEP, p2); SDiskID did = {0}; - EXPECT_NE(taosDirExist(ap2), 0); + EXPECT_NE(taosDirExist(ap2), 1); EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0); - EXPECT_EQ(taosDirExist(ap2), 0); + EXPECT_EQ(taosDirExist(ap2), 1); char p3[] = "p3/p2/p1/p0"; char ap3[128] = {0}; snprintf(ap3, 128, "%s%s%s", root, TD_DIRSEP, p3); - EXPECT_NE(taosDirExist(ap3), 0); + EXPECT_NE(taosDirExist(ap3), 1); EXPECT_NE(tfsMkdir(pTfs, p3), 0); EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0); EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0); - EXPECT_EQ(taosDirExist(ap3), 0); + EXPECT_EQ(taosDirExist(ap3), 1); EXPECT_EQ(tfsRmdir(pTfs, p3), 0); - EXPECT_NE(taosDirExist(ap3), 0); + EXPECT_NE(taosDirExist(ap3), 1); char p45[] = "p5"; char p44[] = "p4"; @@ -149,12 +149,12 @@ TEST_F(TfsTest, 03_Dir) { char ap4[128] = {0}; snprintf(ap4, 128, "%s%s%s", root, TD_DIRSEP, p4); - EXPECT_NE(taosDirExist(ap4), 0); + EXPECT_NE(taosDirExist(ap4), 1); EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0); - EXPECT_EQ(taosDirExist(ap4), 0); + EXPECT_EQ(taosDirExist(ap4), 1); EXPECT_EQ(tfsRename(pTfs, p44, p45), 0); EXPECT_EQ(tfsRmdir(pTfs, p4), 0); - EXPECT_NE(taosDirExist(ap4), 0); + EXPECT_NE(taosDirExist(ap4), 1); tfsClose(pTfs); } @@ -251,9 +251,9 @@ TEST_F(TfsTest, 04_File) { char af2[128] = {0}; snprintf(af2, 128, "%s%s%s", root, TD_DIRSEP, n2); - EXPECT_EQ(taosDirExist(af2), 0); + EXPECT_EQ(taosDirExist(af2), 1); tfsRemoveFile(&f2); - EXPECT_NE(taosDirExist(af2), 0); + EXPECT_NE(taosDirExist(af2), 1); { STfsDir *pDir = tfsOpendir(pTfs, "t3"); @@ -529,35 +529,35 @@ TEST_F(TfsTest, 05_MultiDisk) { snprintf(ap22, 128, "%s%s%s", root22, TD_DIRSEP, p1); char ap23[128] = {0}; snprintf(ap23, 128, "%s%s%s", root23, TD_DIRSEP, p1); - EXPECT_NE(taosDirExist(ap00), 0); - EXPECT_NE(taosDirExist(ap01), 0); - EXPECT_NE(taosDirExist(ap10), 0); - EXPECT_NE(taosDirExist(ap11), 0); - EXPECT_NE(taosDirExist(ap12), 0); - EXPECT_NE(taosDirExist(ap20), 0); - EXPECT_NE(taosDirExist(ap21), 0); - EXPECT_NE(taosDirExist(ap22), 0); - EXPECT_NE(taosDirExist(ap23), 0); + EXPECT_NE(taosDirExist(ap00), 1); + EXPECT_NE(taosDirExist(ap01), 1); + EXPECT_NE(taosDirExist(ap10), 1); + EXPECT_NE(taosDirExist(ap11), 1); + EXPECT_NE(taosDirExist(ap12), 1); + EXPECT_NE(taosDirExist(ap20), 1); + EXPECT_NE(taosDirExist(ap21), 1); + EXPECT_NE(taosDirExist(ap22), 1); + EXPECT_NE(taosDirExist(ap23), 1); EXPECT_EQ(tfsMkdir(pTfs, p1), 0); - EXPECT_EQ(taosDirExist(ap00), 0); - EXPECT_EQ(taosDirExist(ap01), 0); - EXPECT_EQ(taosDirExist(ap10), 0); - EXPECT_EQ(taosDirExist(ap11), 0); - EXPECT_EQ(taosDirExist(ap12), 0); - EXPECT_EQ(taosDirExist(ap20), 0); - EXPECT_EQ(taosDirExist(ap21), 0); - EXPECT_EQ(taosDirExist(ap22), 0); - EXPECT_EQ(taosDirExist(ap23), 0); + EXPECT_EQ(taosDirExist(ap00), 1); + EXPECT_EQ(taosDirExist(ap01), 1); + EXPECT_EQ(taosDirExist(ap10), 1); + EXPECT_EQ(taosDirExist(ap11), 1); + EXPECT_EQ(taosDirExist(ap12), 1); + EXPECT_EQ(taosDirExist(ap20), 1); + EXPECT_EQ(taosDirExist(ap21), 1); + EXPECT_EQ(taosDirExist(ap22), 1); + EXPECT_EQ(taosDirExist(ap23), 1); EXPECT_EQ(tfsRmdir(pTfs, p1), 0); - EXPECT_NE(taosDirExist(ap00), 0); - EXPECT_NE(taosDirExist(ap01), 0); - EXPECT_NE(taosDirExist(ap10), 0); - EXPECT_NE(taosDirExist(ap11), 0); - EXPECT_NE(taosDirExist(ap12), 0); - EXPECT_NE(taosDirExist(ap20), 0); - EXPECT_NE(taosDirExist(ap21), 0); - EXPECT_NE(taosDirExist(ap22), 0); - EXPECT_NE(taosDirExist(ap23), 0); + EXPECT_NE(taosDirExist(ap00), 1); + EXPECT_NE(taosDirExist(ap01), 1); + EXPECT_NE(taosDirExist(ap10), 1); + EXPECT_NE(taosDirExist(ap11), 1); + EXPECT_NE(taosDirExist(ap12), 1); + EXPECT_NE(taosDirExist(ap20), 1); + EXPECT_NE(taosDirExist(ap21), 1); + EXPECT_NE(taosDirExist(ap22), 1); + EXPECT_NE(taosDirExist(ap23), 1); char p2[] = "p2"; char _ap21[128] = {0}; @@ -565,22 +565,22 @@ TEST_F(TfsTest, 05_MultiDisk) { SDiskID did = {0}; did.level = 2; did.id = 1; - EXPECT_NE(taosDirExist(_ap21), 0); + EXPECT_NE(taosDirExist(_ap21), 1); EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0); - EXPECT_EQ(taosDirExist(_ap21), 0); + EXPECT_EQ(taosDirExist(_ap21), 1); char p3[] = "p3/p2/p1/p0"; char _ap12[128] = {0}; snprintf(_ap12, 128, "%s%s%s", root12, TD_DIRSEP, p3); did.level = 1; did.id = 2; - EXPECT_NE(taosDirExist(_ap12), 0); + EXPECT_NE(taosDirExist(_ap12), 1); EXPECT_NE(tfsMkdir(pTfs, p3), 0); EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0); EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0); - EXPECT_EQ(taosDirExist(_ap12), 0); + EXPECT_EQ(taosDirExist(_ap12), 1); EXPECT_EQ(tfsRmdir(pTfs, p3), 0); - EXPECT_NE(taosDirExist(_ap12), 0); + EXPECT_NE(taosDirExist(_ap12), 1); char p45[] = "p5"; char p44[] = "p4"; @@ -590,12 +590,12 @@ TEST_F(TfsTest, 05_MultiDisk) { did.level = 2; did.id = 2; - EXPECT_NE(taosDirExist(_ap22), 0); + EXPECT_NE(taosDirExist(_ap22), 1); EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0); - EXPECT_EQ(taosDirExist(_ap22), 0); + EXPECT_EQ(taosDirExist(_ap22), 1); EXPECT_EQ(tfsRename(pTfs, p44, p45), 0); EXPECT_EQ(tfsRmdir(pTfs, p4), 0); - EXPECT_NE(taosDirExist(_ap22), 0); + EXPECT_NE(taosDirExist(_ap22), 1); } //------------- File -----------------// @@ -660,7 +660,7 @@ TEST_F(TfsTest, 05_MultiDisk) { char af2[128] = {0}; snprintf(af2, 128, "%s%s%s", root23, TD_DIRSEP, n2); - EXPECT_EQ(taosDirExist(af2), 0); + EXPECT_EQ(taosDirExist(af2), 1); tfsRemoveFile(&f2); { @@ -678,7 +678,7 @@ TEST_F(TfsTest, 05_MultiDisk) { tfsClosedir(pDir); } - EXPECT_NE(taosDirExist(af2), 0); + EXPECT_NE(taosDirExist(af2), 1); EXPECT_GT(tfsCopyFile(&f1, &f2), 0); { diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c index ae0b0bd849..e64260c541 100644 --- a/source/libs/wal/src/walMeta.c +++ b/source/libs/wal/src/walMeta.c @@ -64,10 +64,10 @@ static inline int64_t walScanLogGetLastVer(SWal* pWal) { char fnameStr[WAL_FILE_LEN]; walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr); - struct stat statbuf; - stat(fnameStr, &statbuf); - int readSize = TMIN(WAL_MAX_SIZE + 2, statbuf.st_size); - pLastFileInfo->fileSize = statbuf.st_size; + int64_t file_size = 0; + taosStatFile(fnameStr, &file_size, NULL); + int readSize = TMIN(WAL_MAX_SIZE + 2, file_size); + pLastFileInfo->fileSize = file_size; TdFilePtr pFile = taosOpenFile(fnameStr, TD_FILE_READ); if (pFile == NULL) { @@ -177,11 +177,11 @@ int walCheckAndRepairMeta(SWal* pWal) { SWalFileInfo *pLastFileInfo = taosArrayGet(pWal->fileInfoSet, newSz-1); char fnameStr[WAL_FILE_LEN]; walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr); - struct stat statbuf; - stat(fnameStr, &statbuf); + int64_t file_size = 0; + taosStatFile(fnameStr, &file_size, NULL); - if (oldSz != newSz || pLastFileInfo->fileSize != statbuf.st_size) { - pLastFileInfo->fileSize = statbuf.st_size; + if (oldSz != newSz || pLastFileInfo->fileSize != file_size) { + pLastFileInfo->fileSize = file_size; pWal->vers.lastVer = walScanLogGetLastVer(pWal); ((SWalFileInfo*)taosArrayGetLast(pWal->fileInfoSet))->lastVer = pWal->vers.lastVer; ASSERT(pWal->vers.lastVer != -1); @@ -395,9 +395,9 @@ int walLoadMeta(SWal* pWal) { char fnameStr[WAL_FILE_LEN]; walBuildMetaName(pWal, metaVer, fnameStr); // read metafile - struct stat statbuf; - stat(fnameStr, &statbuf); - int size = statbuf.st_size; + int64_t file_size = 0; + taosStatFile(fnameStr, &file_size, NULL); + int size = (int)file_size; char* buf = malloc(size + 5); if (buf == NULL) { terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c index 91ef97e66b..e0f5f80dab 100644 --- a/source/os/src/osDir.c +++ b/source/os/src/osDir.c @@ -60,7 +60,7 @@ void taosRemoveDir(const char *dirname) { //printf("dir:%s is removed\n", dirname); } -int32_t taosDirExist(char *dirname) { return access(dirname, F_OK); } +bool taosDirExist(char *dirname) { return taosCheckExistFile(dirname); } int32_t taosMkDir(const char *dirname) { int32_t code = mkdir(dirname, 0755); diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index c2e9b52f88..37004e9d70 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -186,6 +186,27 @@ int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime) { return 0; #endif } +int32_t taosDevInoFile(const char *path, int64_t *stDev, int64_t *stIno) { +#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) + return 0; +#else + struct stat fileStat; + int32_t code = stat(path, &fileStat); + if (code < 0) { + return code; + } + + if (stDev != NULL) { + *stDev = fileStat.st_dev; + } + + if (stIno != NULL) { + *stIno = fileStat.st_ino; + } + + return 0; +#endif +} void autoDelFileListAdd(const char *path) { return; } @@ -733,3 +754,21 @@ int32_t taosEOFFile(TdFilePtr pFile) { return feof(pFile->fp); } +bool taosCheckAccessFile(const char *pathname, int32_t tdFileAccessOptions) { + int flags = 0; + + if (tdFileAccessOptions & TD_FILE_ACCESS_EXIST_OK) { + flags |= F_OK; + } + + if (tdFileAccessOptions & TD_FILE_ACCESS_READ_OK) { + flags |= R_OK; + } + + if (tdFileAccessOptions & TD_FILE_ACCESS_WRITE_OK) { + flags |= W_OK; + } + + return access(pathname, flags) == 0; +} +bool taosCheckExistFile(const char *pathname) { return taosCheckAccessFile(pathname, TD_FILE_ACCESS_EXIST_OK); }; \ No newline at end of file diff --git a/source/util/test/cacheTest.cpp b/source/util/test/cacheTest.cpp index 970f1c23a9..4dde374bdd 100644 --- a/source/util/test/cacheTest.cpp +++ b/source/util/test/cacheTest.cpp @@ -1,7 +1,7 @@ -#include "os.h" #include #include +#include "os.h" #include "taos.h" #include "tcache.h" diff --git a/source/util/test/encodeTest.cpp b/source/util/test/encodeTest.cpp index 5505a6207f..7b993ebf35 100644 --- a/source/util/test/encodeTest.cpp +++ b/source/util/test/encodeTest.cpp @@ -1,6 +1,6 @@ #include -#include "gtest/gtest.h" +#include #include "tencode.h" diff --git a/source/util/test/freelistTest.cpp b/source/util/test/freelistTest.cpp index cf11d6b5bf..7fd3d693fb 100644 --- a/source/util/test/freelistTest.cpp +++ b/source/util/test/freelistTest.cpp @@ -1,4 +1,4 @@ -#include "gtest/gtest.h" +#include #include "tfreelist.h" diff --git a/source/util/test/hashTest.cpp b/source/util/test/hashTest.cpp index ac1bae2434..4c6ee8d10c 100644 --- a/source/util/test/hashTest.cpp +++ b/source/util/test/hashTest.cpp @@ -1,9 +1,9 @@ -#include "os.h" #include #include -#include #include +#include "os.h" +#include "taosdef.h" #include "thash.h" #include "taos.h" diff --git a/tools/shell/src/backup/shellImport.c b/tools/shell/src/backup/shellImport.c index c0ab7ef461..36489a448b 100644 --- a/tools/shell/src/backup/shellImport.c +++ b/tools/shell/src/backup/shellImport.c @@ -93,8 +93,7 @@ static void shellCheckTablesSQLFile(const char *directoryName) { sprintf(shellTablesSQLFile, "%s/tables.sql", directoryName); - struct stat fstat; - if (stat(shellTablesSQLFile, &fstat) < 0) { + if (taosFStatFile(shellTablesSQLFile, NULL, NULL) < 0) { shellTablesSQLFile[0] = 0; } } @@ -109,13 +108,12 @@ static void shellMallocSQLFiles() static void shellGetDirectoryFileList(char *inputDir) { - struct stat fileStat; - if (stat(inputDir, &fileStat) < 0) { + if (!taosDirExist(inputDir)) { fprintf(stderr, "ERROR: %s not exist\n", inputDir); exit(0); } - if (fileStat.st_mode & S_IFDIR) { + if (taosIsDir(inputDir)) { shellCheckTablesSQLFile(inputDir); shellSQLFileNum = shellGetFilesNum(inputDir, "sql"); int totalSQLFileNum = shellSQLFileNum; From cd674d8ee6c1582c8b3f3bc49bf1c158f9cde87f Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 4 Mar 2022 11:22:51 +0800 Subject: [PATCH 22/26] [td-13039] fix bug. --- source/util/src/tjson.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/util/src/tjson.c b/source/util/src/tjson.c index a8649f1ea7..cf388880eb 100644 --- a/source/util/src/tjson.c +++ b/source/util/src/tjson.c @@ -161,7 +161,7 @@ int32_t tjsonGetBigIntValue(const SJson* pJson, const char* pName, int64_t* pVal } char* pEnd = NULL; *pVal = strtol(p, &pEnd, 10); - return (NULL == pEnd ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED); + return (errno == EINVAL || errno == ERANGE)? TSDB_CODE_FAILED:TSDB_CODE_SUCCESS; } int32_t tjsonGetIntValue(const SJson* pJson, const char* pName, int32_t* pVal) { @@ -192,7 +192,7 @@ int32_t tjsonGetUBigIntValue(const SJson* pJson, const char* pName, uint64_t* pV } char* pEnd = NULL; *pVal = strtoul(p, &pEnd, 10); - return (NULL == pEnd ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED); + return (errno == ERANGE||errno == EINVAL)? TSDB_CODE_FAILED:TSDB_CODE_SUCCESS; } int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pVal) { @@ -204,7 +204,7 @@ int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pV int32_t tjsonGetBoolValue(const SJson* pJson, const char* pName, bool* pVal) { const SJson* pObject = tjsonGetObjectItem(pJson, pName); - if (cJSON_IsBool(pObject)) { + if (!cJSON_IsBool(pObject)) { return TSDB_CODE_FAILED; } *pVal = cJSON_IsTrue(pObject) ? true : false; From f8bde073403169ee928a11bc5c104806e86b9e63 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 4 Mar 2022 02:17:04 -0500 Subject: [PATCH 23/26] TD-13037 datasink code --- include/libs/nodes/plannodes.h | 4 +- source/libs/executor/src/dataDispatcher.c | 16 +- source/libs/nodes/src/nodesCloneFuncs.c | 23 ++- source/libs/nodes/src/nodesCodeFuncs.c | 177 +++++++++++++--------- source/libs/nodes/src/nodesUtilFuncs.c | 1 + source/libs/planner/src/physicalPlan.c | 48 +++--- source/libs/planner/test/plannerTest.cpp | 13 +- source/util/src/tjson.c | 13 +- 8 files changed, 180 insertions(+), 115 deletions(-) diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h index d72befcaf0..f07183d64f 100644 --- a/include/libs/nodes/plannodes.h +++ b/include/libs/nodes/plannodes.h @@ -113,7 +113,7 @@ typedef struct SDataBlockDescNode { typedef struct SPhysiNode { ENodeType type; - SDataBlockDescNode outputDataBlockDesc; + SDataBlockDescNode* pOutputDataBlockDesc; SNode* pConditions; SNodeList* pChildren; struct SPhysiNode* pParent; @@ -175,7 +175,7 @@ typedef struct SExchangePhysiNode { typedef struct SDataSinkNode { ENodeType type;; - SDataBlockDescNode inputDataBlockDesc; + SDataBlockDescNode* pInputDataBlockDesc; } SDataSinkNode; typedef struct SDataDispatcherNode { diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c index 4f1b83ad5d..9c86e19166 100644 --- a/source/libs/executor/src/dataDispatcher.c +++ b/source/libs/executor/src/dataDispatcher.c @@ -39,7 +39,7 @@ typedef struct SDataCacheEntry { typedef struct SDataDispatchHandle { SDataSinkHandle sink; SDataSinkManager* pManager; - SDataBlockDescNode schema; + SDataBlockDescNode* pSchema; STaosQueue* pDataBlocks; SDataDispatchBuf nextOutput; int32_t status; @@ -109,14 +109,14 @@ static void copyData(const SInputData* pInput, const SDataBlockDescNode* pSchema // data format: SDataCacheEntry | col1_data col2_data ... | numOfTables | STableIdInfo STableIdInfo ... static void toDataCacheEntry(const SDataDispatchHandle* pHandle, const SInputData* pInput, SDataDispatchBuf* pBuf) { SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData; - pEntry->compressed = (int8_t)needCompress(pInput->pData, &(pHandle->schema)); + pEntry->compressed = (int8_t)needCompress(pInput->pData, pHandle->pSchema); pEntry->numOfRows = pInput->pData->info.rows; pEntry->dataLen = 0; pBuf->useSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap); - copyData(pInput, &pHandle->schema, pEntry->data, pEntry->compressed, &pEntry->dataLen); + copyData(pInput, pHandle->pSchema, pEntry->data, pEntry->compressed, &pEntry->dataLen); if (0 == pEntry->compressed) { - pEntry->dataLen = pHandle->schema.resultRowSize * pInput->pData->info.rows; + pEntry->dataLen = pHandle->pSchema->resultRowSize * pInput->pData->info.rows; } pBuf->useSize += pEntry->dataLen; // todo completed @@ -130,7 +130,7 @@ static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput, return false; } - pBuf->allocSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap) + pDispatcher->schema.resultRowSize * pInput->pData->info.rows; + pBuf->allocSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap) + pDispatcher->pSchema->resultRowSize * pInput->pData->info.rows; pBuf->pData = malloc(pBuf->allocSize); if (pBuf->pData == NULL) { qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno)); @@ -196,7 +196,7 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { if (NULL == pDispatcher->nextOutput.pData) { assert(pDispatcher->queryEnd); pOutput->useconds = pDispatcher->useconds; - pOutput->precision = pDispatcher->schema.precision; + pOutput->precision = pDispatcher->pSchema->precision; return TSDB_CODE_SUCCESS; } SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDispatcher->nextOutput.pData); @@ -208,7 +208,7 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) { pthread_mutex_lock(&pDispatcher->mutex); pOutput->queryEnd = pDispatcher->queryEnd; pOutput->useconds = pDispatcher->useconds; - pOutput->precision = pDispatcher->schema.precision; + pOutput->precision = pDispatcher->pSchema->precision; pthread_mutex_unlock(&pDispatcher->mutex); return TSDB_CODE_SUCCESS; } @@ -238,7 +238,7 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD dispatcher->sink.fGetData = getDataBlock; dispatcher->sink.fDestroy = destroyDataSinker; dispatcher->pManager = pManager; - dispatcher->schema = pDataSink->inputDataBlockDesc; + dispatcher->pSchema = pDataSink->pInputDataBlockDesc; dispatcher->status = DS_BUF_EMPTY; dispatcher->queryEnd = false; dispatcher->pDataBlocks = taosOpenQueue(); diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index befe96050a..403b177a97 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -165,6 +165,23 @@ static SNode* logicSubplanCopy(const SSubLogicPlan* pSrc, SSubLogicPlan* pDst) { return (SNode*)pDst; } +static SNode* dataBlockDescCopy(const SDataBlockDescNode* pSrc, SDataBlockDescNode* pDst) { + COPY_SCALAR_FIELD(dataBlockId); + COPY_NODE_LIST_FIELD(pSlots); + COPY_SCALAR_FIELD(resultRowSize); + COPY_SCALAR_FIELD(precision); + return (SNode*)pDst; +} + +static SNode* slotDescCopy(const SSlotDescNode* pSrc, SSlotDescNode* pDst) { + COPY_SCALAR_FIELD(slotId); + dataTypeCopy(&pSrc->dataType, &pDst->dataType); + COPY_SCALAR_FIELD(reserve); + COPY_SCALAR_FIELD(output); + COPY_SCALAR_FIELD(tag); + return (SNode*)pDst; +} + SNodeptr nodesCloneNode(const SNodeptr pNode) { if (NULL == pNode) { return NULL; @@ -196,8 +213,12 @@ SNodeptr nodesCloneNode(const SNodeptr pNode) { case QUERY_NODE_ORDER_BY_EXPR: case QUERY_NODE_LIMIT: break; + case QUERY_NODE_DATABLOCK_DESC: + return dataBlockDescCopy((const SDataBlockDescNode*)pNode, (SDataBlockDescNode*)pDst); + case QUERY_NODE_SLOT_DESC: + return slotDescCopy((const SSlotDescNode*)pNode, (SSlotDescNode*)pDst); case QUERY_NODE_LOGIC_SUBPLAN: - return logicSubplanCopy((const SSubLogicPlan*)pNode, (SSubLogicPlan*)pDst); + return logicSubplanCopy((const SSubLogicPlan*)pNode, (SSubLogicPlan*)pDst); default: break; } diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 284798a3ba..1f99a00bba 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -262,7 +262,7 @@ static const char* jkPhysiPlanChildren = "Children"; static int32_t physicPlanNodeToJson(const void* pObj, SJson* pJson) { const SPhysiNode* pNode = (const SPhysiNode*)pObj; - int32_t code = tjsonAddObject(pJson, jkPhysiPlanOutputDataBlockDesc, nodeToJson, &pNode->outputDataBlockDesc); + int32_t code = tjsonAddObject(pJson, jkPhysiPlanOutputDataBlockDesc, nodeToJson, pNode->pOutputDataBlockDesc); if (TSDB_CODE_SUCCESS == code) { code = tjsonAddObject(pJson, jkPhysiPlanConditions, nodeToJson, pNode->pConditions); } @@ -276,7 +276,7 @@ static int32_t physicPlanNodeToJson(const void* pObj, SJson* pJson) { static int32_t jsonToPhysicPlanNode(const SJson* pJson, void* pObj) { SPhysiNode* pNode = (SPhysiNode*)pObj; - int32_t code = tjsonToObject(pJson, jkPhysiPlanOutputDataBlockDesc, jsonToNode, &pNode->outputDataBlockDesc); + int32_t code = jsonToNodeObject(pJson, jkPhysiPlanOutputDataBlockDesc, (SNode**)&pNode->pOutputDataBlockDesc); if (TSDB_CODE_SUCCESS == code) { code = jsonToNodeObject(pJson, jkPhysiPlanConditions, &pNode->pConditions); } @@ -494,6 +494,26 @@ static int32_t jsonToPhysiAggNode(const SJson* pJson, void* pObj) { return code; } +static const char* jkDataSinkInputDataBlockDesc = "InputDataBlockDesc"; + +static int32_t physicDataSinkNodeToJson(const void* pObj, SJson* pJson) { + const SDataSinkNode* pNode = (const SDataSinkNode*)pObj; + return tjsonAddObject(pJson, jkDataSinkInputDataBlockDesc, nodeToJson, pNode->pInputDataBlockDesc); +} + +static int32_t jsonToPhysicDataSinkNode(const SJson* pJson, void* pObj) { + SDataSinkNode* pNode = (SDataSinkNode*)pObj; + return jsonToNodeObject(pJson, jkDataSinkInputDataBlockDesc, (SNode**)&pNode->pInputDataBlockDesc); +} + +static int32_t physiDispatchNodeToJson(const void* pObj, SJson* pJson) { + return physicDataSinkNodeToJson(pObj, pJson); +} + +static int32_t jsonToPhysiDispatchNode(const SJson* pJson, void* pObj) { + return jsonToPhysicDataSinkNode(pJson, pObj); +} + static const char* jkSubplanIdQueryId = "QueryId"; static const char* jkSubplanIdTemplateId = "TemplateId"; static const char* jkSubplanIdSubplanId = "SubplanId"; @@ -861,41 +881,43 @@ static int32_t valueNodeToJson(const void* pObj, SJson* pJson) { if (TSDB_CODE_SUCCESS == code) { code = tjsonAddBoolToObject(pJson, jkValueDuration, pNode->isDuration); } - switch (pNode->node.resType.type) { - case TSDB_DATA_TYPE_NULL: - break; - case TSDB_DATA_TYPE_BOOL: - code = tjsonAddIntegerToObject(pJson, jkValueDuration, pNode->datum.b); - break; - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_SMALLINT: - case TSDB_DATA_TYPE_INT: - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_TIMESTAMP: - code = tjsonAddIntegerToObject(pJson, jkValueDuration, pNode->datum.i); - break; - case TSDB_DATA_TYPE_UTINYINT: - case TSDB_DATA_TYPE_USMALLINT: - case TSDB_DATA_TYPE_UINT: - case TSDB_DATA_TYPE_UBIGINT: - code = tjsonAddIntegerToObject(pJson, jkValueDuration, pNode->datum.u); - break; - case TSDB_DATA_TYPE_FLOAT: - case TSDB_DATA_TYPE_DOUBLE: - code = tjsonAddDoubleToObject(pJson, jkValueDuration, pNode->datum.d); - break; - case TSDB_DATA_TYPE_BINARY: - case TSDB_DATA_TYPE_NCHAR: - case TSDB_DATA_TYPE_VARCHAR: - case TSDB_DATA_TYPE_VARBINARY: - code = tjsonAddStringToObject(pJson, jkValueLiteral, pNode->datum.p); - break; - case TSDB_DATA_TYPE_JSON: - case TSDB_DATA_TYPE_DECIMAL: - case TSDB_DATA_TYPE_BLOB: - // todo - default: - break; + if (TSDB_CODE_SUCCESS == code) { + switch (pNode->node.resType.type) { + case TSDB_DATA_TYPE_NULL: + break; + case TSDB_DATA_TYPE_BOOL: + code = tjsonAddIntegerToObject(pJson, jkValueDatum, pNode->datum.b); + break; + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_SMALLINT: + case TSDB_DATA_TYPE_INT: + case TSDB_DATA_TYPE_BIGINT: + case TSDB_DATA_TYPE_TIMESTAMP: + code = tjsonAddIntegerToObject(pJson, jkValueDatum, pNode->datum.i); + break; + case TSDB_DATA_TYPE_UTINYINT: + case TSDB_DATA_TYPE_USMALLINT: + case TSDB_DATA_TYPE_UINT: + case TSDB_DATA_TYPE_UBIGINT: + code = tjsonAddIntegerToObject(pJson, jkValueDatum, pNode->datum.u); + break; + case TSDB_DATA_TYPE_FLOAT: + case TSDB_DATA_TYPE_DOUBLE: + code = tjsonAddDoubleToObject(pJson, jkValueDatum, pNode->datum.d); + break; + case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_NCHAR: + case TSDB_DATA_TYPE_VARCHAR: + case TSDB_DATA_TYPE_VARBINARY: + code = tjsonAddStringToObject(pJson, jkValueDatum, pNode->datum.p); + break; + case TSDB_DATA_TYPE_JSON: + case TSDB_DATA_TYPE_DECIMAL: + case TSDB_DATA_TYPE_BLOB: + // todo + default: + break; + } } return code; @@ -911,41 +933,43 @@ static int32_t jsonToValueNode(const SJson* pJson, void* pObj) { if (TSDB_CODE_SUCCESS == code) { code = tjsonGetBoolValue(pJson, jkValueDuration, &pNode->isDuration); } - switch (pNode->node.resType.type) { - case TSDB_DATA_TYPE_NULL: - break; - case TSDB_DATA_TYPE_BOOL: - code = tjsonGetBoolValue(pJson, jkValueDuration, &pNode->datum.b); - break; - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_SMALLINT: - case TSDB_DATA_TYPE_INT: - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_TIMESTAMP: - code = tjsonGetBigIntValue(pJson, jkValueDuration, &pNode->datum.i); - break; - case TSDB_DATA_TYPE_UTINYINT: - case TSDB_DATA_TYPE_USMALLINT: - case TSDB_DATA_TYPE_UINT: - case TSDB_DATA_TYPE_UBIGINT: - code = tjsonGetUBigIntValue(pJson, jkValueDuration, &pNode->datum.u); - break; - case TSDB_DATA_TYPE_FLOAT: - case TSDB_DATA_TYPE_DOUBLE: - code = tjsonGetDoubleValue(pJson, jkValueDuration, &pNode->datum.d); - break; - case TSDB_DATA_TYPE_BINARY: - case TSDB_DATA_TYPE_NCHAR: - case TSDB_DATA_TYPE_VARCHAR: - case TSDB_DATA_TYPE_VARBINARY: - code = tjsonDupStringValue(pJson, jkValueLiteral, &pNode->datum.p); - break; - case TSDB_DATA_TYPE_JSON: - case TSDB_DATA_TYPE_DECIMAL: - case TSDB_DATA_TYPE_BLOB: - // todo - default: - break; + if (TSDB_CODE_SUCCESS == code) { + switch (pNode->node.resType.type) { + case TSDB_DATA_TYPE_NULL: + break; + case TSDB_DATA_TYPE_BOOL: + code = tjsonGetBoolValue(pJson, jkValueDatum, &pNode->datum.b); + break; + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_SMALLINT: + case TSDB_DATA_TYPE_INT: + case TSDB_DATA_TYPE_BIGINT: + case TSDB_DATA_TYPE_TIMESTAMP: + code = tjsonGetBigIntValue(pJson, jkValueDatum, &pNode->datum.i); + break; + case TSDB_DATA_TYPE_UTINYINT: + case TSDB_DATA_TYPE_USMALLINT: + case TSDB_DATA_TYPE_UINT: + case TSDB_DATA_TYPE_UBIGINT: + code = tjsonGetUBigIntValue(pJson, jkValueDatum, &pNode->datum.u); + break; + case TSDB_DATA_TYPE_FLOAT: + case TSDB_DATA_TYPE_DOUBLE: + code = tjsonGetDoubleValue(pJson, jkValueDatum, &pNode->datum.d); + break; + case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_NCHAR: + case TSDB_DATA_TYPE_VARCHAR: + case TSDB_DATA_TYPE_VARBINARY: + code = tjsonDupStringValue(pJson, jkValueDatum, &pNode->datum.p); + break; + case TSDB_DATA_TYPE_JSON: + case TSDB_DATA_TYPE_DECIMAL: + case TSDB_DATA_TYPE_BLOB: + // todo + default: + break; + } } return code; @@ -1328,6 +1352,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: case QUERY_NODE_PHYSICAL_PLAN_SORT: case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: + return physiDispatchNodeToJson(pObj, pJson); case QUERY_NODE_PHYSICAL_PLAN_INSERT: break; case QUERY_NODE_PHYSICAL_SUBPLAN: @@ -1397,6 +1422,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { return jsonToPhysiJoinNode(pJson, pObj); case QUERY_NODE_PHYSICAL_PLAN_AGG: return jsonToPhysiAggNode(pJson, pObj); + case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: + return jsonToPhysiDispatchNode(pJson, pObj); case QUERY_NODE_PHYSICAL_SUBPLAN: return jsonToSubplan(pJson, pObj); case QUERY_NODE_PHYSICAL_PLAN: @@ -1404,6 +1431,7 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) { default: break; } + printf("================================ jsonToSpecificNode unknown node = %s\n", nodesNodeName(nodeType(pObj))); return TSDB_CODE_SUCCESS; } @@ -1432,6 +1460,9 @@ static int32_t jsonToNode(const SJson* pJson, void* pObj) { pNode->type = val; if (TSDB_CODE_SUCCESS == code) { code = tjsonToObject(pJson, nodesNodeName(pNode->type), jsonToSpecificNode, pNode); + if (TSDB_CODE_SUCCESS != code) { + printf("%s toNode error\n", nodesNodeName(pNode->type)); + } } return code; @@ -1454,7 +1485,7 @@ static int32_t makeNodeByJson(const SJson* pJson, SNode** pNode) { static int32_t jsonToNodeObject(const SJson* pJson, const char* pName, SNode** pNode) { SJson* pJsonNode = tjsonGetObjectItem(pJson, pName); if (NULL == pJsonNode) { - return TSDB_CODE_FAILED; + return TSDB_CODE_SUCCESS; } return makeNodeByJson(pJsonNode, pNode); } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 498668d231..49f2afc823 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -131,6 +131,7 @@ SNodeptr nodesMakeNode(ENodeType type) { default: break; } + printf("================================ nodesMakeNode unknown node = %s\n", nodesNodeName(type)); return NULL; } diff --git a/source/libs/planner/src/physicalPlan.c b/source/libs/planner/src/physicalPlan.c index 66ad0a9879..9df2b9b708 100644 --- a/source/libs/planner/src/physicalPlan.c +++ b/source/libs/planner/src/physicalPlan.c @@ -153,17 +153,20 @@ static SNodeList* setListSlotId(SPhysiPlanContext* pCxt, int16_t leftDataBlockId static SPhysiNode* makePhysiNode(SPhysiPlanContext* pCxt, ENodeType type) { SPhysiNode* pPhysiNode = (SPhysiNode*)nodesMakeNode(type); - if (NULL == pPhysiNode) { + CHECK_ALLOC(pPhysiNode, NULL); + pPhysiNode->pOutputDataBlockDesc = nodesMakeNode(QUERY_NODE_DATABLOCK_DESC); + if (NULL == pPhysiNode->pOutputDataBlockDesc) { + nodesDestroyNode(pPhysiNode); return NULL; } - pPhysiNode->outputDataBlockDesc.dataBlockId = pCxt->nextDataBlockId++; - pPhysiNode->outputDataBlockDesc.type = QUERY_NODE_DATABLOCK_DESC; + pPhysiNode->pOutputDataBlockDesc->dataBlockId = pCxt->nextDataBlockId++; + pPhysiNode->pOutputDataBlockDesc->type = QUERY_NODE_DATABLOCK_DESC; return pPhysiNode; } static int32_t setConditionsSlotId(SPhysiPlanContext* pCxt, const SLogicNode* pLogicNode, SPhysiNode* pPhysiNode) { if (NULL != pLogicNode->pConditions) { - pPhysiNode->pConditions = setNodeSlotId(pCxt, pPhysiNode->outputDataBlockDesc.dataBlockId, -1, pLogicNode->pConditions); + pPhysiNode->pConditions = setNodeSlotId(pCxt, pPhysiNode->pOutputDataBlockDesc->dataBlockId, -1, pLogicNode->pConditions); CHECK_ALLOC(pPhysiNode->pConditions, TSDB_CODE_OUT_OF_MEMORY); } return TSDB_CODE_SUCCESS; @@ -188,11 +191,11 @@ static int32_t initScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanL CHECK_ALLOC(pScanPhysiNode->pScanCols, TSDB_CODE_OUT_OF_MEMORY); } // Data block describe also needs to be set without scanning column, such as SELECT COUNT(*) FROM t - CHECK_CODE(addDataBlockDesc(pCxt, pScanPhysiNode->pScanCols, &pScanPhysiNode->node.outputDataBlockDesc), TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE(addDataBlockDesc(pCxt, pScanPhysiNode->pScanCols, pScanPhysiNode->node.pOutputDataBlockDesc), TSDB_CODE_OUT_OF_MEMORY); CHECK_CODE(setConditionsSlotId(pCxt, (const SLogicNode*)pScanLogicNode, (SPhysiNode*)pScanPhysiNode), TSDB_CODE_OUT_OF_MEMORY); - CHECK_CODE(setSlotOutput(pCxt, pScanLogicNode->node.pTargets, &pScanPhysiNode->node.outputDataBlockDesc), TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE(setSlotOutput(pCxt, pScanLogicNode->node.pTargets, pScanPhysiNode->node.pOutputDataBlockDesc), TSDB_CODE_OUT_OF_MEMORY); pScanPhysiNode->uid = pScanLogicNode->pMeta->uid; pScanPhysiNode->tableType = pScanLogicNode->pMeta->tableType; @@ -276,18 +279,18 @@ static SPhysiNode* createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil SJoinPhysiNode* pJoin = (SJoinPhysiNode*)makePhysiNode(pCxt, QUERY_NODE_PHYSICAL_PLAN_JOIN); CHECK_ALLOC(pJoin, NULL); - SDataBlockDescNode* pLeftDesc = &((SPhysiNode*)nodesListGetNode(pChildren, 0))->outputDataBlockDesc; - SDataBlockDescNode* pRightDesc = &((SPhysiNode*)nodesListGetNode(pChildren, 1))->outputDataBlockDesc; + SDataBlockDescNode* pLeftDesc = ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc; + SDataBlockDescNode* pRightDesc = ((SPhysiNode*)nodesListGetNode(pChildren, 1))->pOutputDataBlockDesc; pJoin->pOnConditions = setNodeSlotId(pCxt, pLeftDesc->dataBlockId, pRightDesc->dataBlockId, pJoinLogicNode->pOnConditions); CHECK_ALLOC(pJoin->pOnConditions, (SPhysiNode*)pJoin); pJoin->pTargets = createJoinOutputCols(pCxt, pLeftDesc, pRightDesc); CHECK_ALLOC(pJoin->pTargets, (SPhysiNode*)pJoin); - CHECK_CODE(addDataBlockDesc(pCxt, pJoin->pTargets, &pJoin->node.outputDataBlockDesc), (SPhysiNode*)pJoin); + CHECK_CODE(addDataBlockDesc(pCxt, pJoin->pTargets, pJoin->node.pOutputDataBlockDesc), (SPhysiNode*)pJoin); CHECK_CODE(setConditionsSlotId(pCxt, (const SLogicNode*)pJoinLogicNode, (SPhysiNode*)pJoin), (SPhysiNode*)pJoin); - CHECK_CODE(setSlotOutput(pCxt, pJoinLogicNode->node.pTargets, &pJoin->node.outputDataBlockDesc), (SPhysiNode*)pJoin); + CHECK_CODE(setSlotOutput(pCxt, pJoinLogicNode->node.pTargets, pJoin->node.pOutputDataBlockDesc), (SPhysiNode*)pJoin); return (SPhysiNode*)pJoin; } @@ -385,8 +388,8 @@ static SPhysiNode* createAggPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild CHECK_CODE(rewritePrecalcExprs(pCxt, pAggLogicNode->pGroupKeys, &pPrecalcExprs, &pGroupKeys), (SPhysiNode*)pAgg); CHECK_CODE(rewritePrecalcExprs(pCxt, pAggLogicNode->pAggFuncs, &pPrecalcExprs, &pAggFuncs), (SPhysiNode*)pAgg); - SDataBlockDescNode* pChildTupe = &(((SPhysiNode*)nodesListGetNode(pChildren, 0))->outputDataBlockDesc); - // push down expression to outputDataBlockDesc of child node + SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc); + // push down expression to pOutputDataBlockDesc of child node if (NULL != pPrecalcExprs) { pAgg->pExprs = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pPrecalcExprs); CHECK_ALLOC(pAgg->pExprs, (SPhysiNode*)pAgg); @@ -396,18 +399,18 @@ static SPhysiNode* createAggPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild if (NULL != pGroupKeys) { pAgg->pGroupKeys = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pGroupKeys); CHECK_ALLOC(pAgg->pGroupKeys, (SPhysiNode*)pAgg); - CHECK_CODE(addDataBlockDesc(pCxt, pAgg->pGroupKeys, &pAgg->node.outputDataBlockDesc), (SPhysiNode*)pAgg); + CHECK_CODE(addDataBlockDesc(pCxt, pAgg->pGroupKeys, pAgg->node.pOutputDataBlockDesc), (SPhysiNode*)pAgg); } if (NULL != pAggFuncs) { pAgg->pAggFuncs = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pAggFuncs); CHECK_ALLOC(pAgg->pAggFuncs, (SPhysiNode*)pAgg); - CHECK_CODE(addDataBlockDesc(pCxt, pAgg->pAggFuncs, &pAgg->node.outputDataBlockDesc), (SPhysiNode*)pAgg); + CHECK_CODE(addDataBlockDesc(pCxt, pAgg->pAggFuncs, pAgg->node.pOutputDataBlockDesc), (SPhysiNode*)pAgg); } CHECK_CODE(setConditionsSlotId(pCxt, (const SLogicNode*)pAggLogicNode, (SPhysiNode*)pAgg), (SPhysiNode*)pAgg); - CHECK_CODE(setSlotOutput(pCxt, pAggLogicNode->node.pTargets, &pAgg->node.outputDataBlockDesc), (SPhysiNode*)pAgg); + CHECK_CODE(setSlotOutput(pCxt, pAggLogicNode->node.pTargets, pAgg->node.pOutputDataBlockDesc), (SPhysiNode*)pAgg); return (SPhysiNode*)pAgg; } @@ -416,9 +419,9 @@ static SPhysiNode* createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC SProjectPhysiNode* pProject = (SProjectPhysiNode*)makePhysiNode(pCxt, QUERY_NODE_PHYSICAL_PLAN_PROJECT); CHECK_ALLOC(pProject, NULL); - pProject->pProjections = setListSlotId(pCxt, ((SPhysiNode*)nodesListGetNode(pChildren, 0))->outputDataBlockDesc.dataBlockId, -1, pProjectLogicNode->pProjections); + pProject->pProjections = setListSlotId(pCxt, ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc->dataBlockId, -1, pProjectLogicNode->pProjections); CHECK_ALLOC(pProject->pProjections, (SPhysiNode*)pProject); - CHECK_CODE(addDataBlockDesc(pCxt, pProject->pProjections, &pProject->node.outputDataBlockDesc), (SPhysiNode*)pProject); + CHECK_CODE(addDataBlockDesc(pCxt, pProject->pProjections, pProject->node.pOutputDataBlockDesc), (SPhysiNode*)pProject); CHECK_CODE(setConditionsSlotId(pCxt, (const SLogicNode*)pProjectLogicNode, (SPhysiNode*)pProject), (SPhysiNode*)pProject); @@ -468,12 +471,21 @@ static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicPl static SDataSinkNode* createDataInserter(SPhysiPlanContext* pCxt, SVgDataBlocks* pBlocks) { SDataInserterNode* pInserter = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT); + CHECK_ALLOC(pInserter, NULL); pInserter->numOfTables = pBlocks->numOfTables; pInserter->size = pBlocks->size; TSWAP(pInserter->pData, pBlocks->pData, char*); return (SDataSinkNode*)pInserter; } +static SDataSinkNode* createDataDispatcher(SPhysiPlanContext* pCxt, const SPhysiNode* pRoot) { + SDataDispatcherNode* pDispatcher = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DISPATCH); + CHECK_ALLOC(pDispatcher, NULL); + pDispatcher->sink.pInputDataBlockDesc = nodesCloneNode(pRoot->pOutputDataBlockDesc); + CHECK_ALLOC(pDispatcher->sink.pInputDataBlockDesc, (SDataSinkNode*)pDispatcher); + return (SDataSinkNode*)pDispatcher; +} + static SSubplan* createPhysiSubplan(SPhysiPlanContext* pCxt, SSubLogicPlan* pLogicSubplan) { SSubplan* pSubplan = (SSubplan*)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); CHECK_ALLOC(pSubplan, NULL); @@ -483,7 +495,7 @@ static SSubplan* createPhysiSubplan(SPhysiPlanContext* pCxt, SSubLogicPlan* pLog pSubplan->msgType = pModif->msgType; } else { pSubplan->pNode = createPhysiNode(pCxt, pLogicSubplan->pNode); - // pSubplan->pDataSink = createDataDispatcher(pCxt, pSubplan->pNode); + pSubplan->pDataSink = createDataDispatcher(pCxt, pSubplan->pNode); } pSubplan->subplanType = pLogicSubplan->subplanType; return pSubplan; diff --git a/source/libs/planner/test/plannerTest.cpp b/source/libs/planner/test/plannerTest.cpp index 2a6e7a9a55..4bdd9d21ee 100644 --- a/source/libs/planner/test/plannerTest.cpp +++ b/source/libs/planner/test/plannerTest.cpp @@ -109,6 +109,14 @@ private: cout << "sql:[" << cxt_.pSql << "] toString code:" << code << ", strerror:" << tstrerror(code) << endl; return string(); } + SNode* pNode; + code = nodesStringToNode(pStr, &pNode); + if (code != TSDB_CODE_SUCCESS) { + tfree(pStr); + cout << "sql:[" << cxt_.pSql << "] toObject code:" << code << ", strerror:" << tstrerror(code) << endl; + return string(); + } + nodesDestroyNode(pNode); string str(pStr); tfree(pStr); return str; @@ -151,8 +159,3 @@ TEST_F(PlannerTest, subquery) { bind("SELECT count(*) FROM (SELECT c1 + c3 a, c1 + count(*) b FROM t1 where c2 = 'abc' GROUP BY c1, c3) where a > 100 group by b"); ASSERT_TRUE(run()); } - -TEST_F(PlannerTest, createTable) { - bind("create table t1(ts timestamp, c1 int)"); - ASSERT_TRUE(run()); -} diff --git a/source/util/src/tjson.c b/source/util/src/tjson.c index a8649f1ea7..0cfaf4c96e 100644 --- a/source/util/src/tjson.c +++ b/source/util/src/tjson.c @@ -98,7 +98,6 @@ int32_t tjsonAddObject(SJson* pJson, const char* pName, FToJson func, const void SJson* pJobj = tjsonCreateObject(); if (NULL == pJobj || TSDB_CODE_SUCCESS != func(pObj, pJobj)) { - printf("%s:%d code = %d\n", __FUNCTION__, __LINE__, TSDB_CODE_FAILED); tjsonDelete(pJobj); return TSDB_CODE_FAILED; } @@ -159,9 +158,8 @@ int32_t tjsonGetBigIntValue(const SJson* pJson, const char* pName, int64_t* pVal if (NULL == p) { return TSDB_CODE_FAILED; } - char* pEnd = NULL; - *pVal = strtol(p, &pEnd, 10); - return (NULL == pEnd ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED); + *pVal = strtol(p, NULL, 10); + return TSDB_CODE_SUCCESS; } int32_t tjsonGetIntValue(const SJson* pJson, const char* pName, int32_t* pVal) { @@ -190,9 +188,8 @@ int32_t tjsonGetUBigIntValue(const SJson* pJson, const char* pName, uint64_t* pV if (NULL == p) { return TSDB_CODE_FAILED; } - char* pEnd = NULL; - *pVal = strtoul(p, &pEnd, 10); - return (NULL == pEnd ? TSDB_CODE_SUCCESS : TSDB_CODE_FAILED); + *pVal = strtoul(p, NULL, 10); + return TSDB_CODE_SUCCESS; } int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pVal) { @@ -204,7 +201,7 @@ int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pV int32_t tjsonGetBoolValue(const SJson* pJson, const char* pName, bool* pVal) { const SJson* pObject = tjsonGetObjectItem(pJson, pName); - if (cJSON_IsBool(pObject)) { + if (!cJSON_IsBool(pObject)) { return TSDB_CODE_FAILED; } *pVal = cJSON_IsTrue(pObject) ? true : false; From 92cd252b70dffe617a5e6ee56e39a36de09d08be Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 4 Mar 2022 05:43:23 -0500 Subject: [PATCH 24/26] TD-13706 integration create table stmt and insert stmt --- include/common/ttokendef.h | 97 +- include/libs/nodes/nodes.h | 4 +- include/libs/nodes/plannodes.h | 2 +- include/libs/nodes/querynodes.h | 1 + include/libs/parser/parser.h | 4 +- include/libs/planner/planner.h | 2 +- source/client/src/clientImpl.c | 16 +- source/libs/nodes/src/nodesCloneFuncs.c | 1 - source/libs/nodes/src/nodesCodeFuncs.c | 7 +- source/libs/nodes/src/nodesUtilFuncs.c | 14 +- source/libs/parser/inc/new_sql.y | 7 +- source/libs/parser/src/astCreateFuncs.c | 8 +- source/libs/parser/src/astParse.c | 1 + source/libs/parser/src/astTranslate.c | 86 +- source/libs/parser/src/insertParser.c | 14 +- source/libs/parser/src/new_sql.c | 2363 +++++++++++----------- source/libs/parser/src/ttokenizer.c | 2 +- source/libs/planner/inc/plannerInt.h | 2 +- source/libs/planner/src/logicPlan.c | 1 + source/libs/planner/src/physicalPlan.c | 76 +- source/libs/planner/src/planner.c | 4 +- source/libs/planner/test/plannerTest.cpp | 2 +- 22 files changed, 1421 insertions(+), 1293 deletions(-) diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 9e961ff111..2ce06348a3 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -85,54 +85,55 @@ #define TK_DECIMAL 67 #define TK_SHOW 68 #define TK_DATABASES 69 -#define TK_NK_FLOAT 70 -#define TK_NK_BOOL 71 -#define TK_NK_VARIABLE 72 -#define TK_BETWEEN 73 -#define TK_IS 74 -#define TK_NULL 75 -#define TK_NK_LT 76 -#define TK_NK_GT 77 -#define TK_NK_LE 78 -#define TK_NK_GE 79 -#define TK_NK_NE 80 -#define TK_NK_EQ 81 -#define TK_LIKE 82 -#define TK_MATCH 83 -#define TK_NMATCH 84 -#define TK_IN 85 -#define TK_FROM 86 -#define TK_AS 87 -#define TK_JOIN 88 -#define TK_ON 89 -#define TK_INNER 90 -#define TK_SELECT 91 -#define TK_DISTINCT 92 -#define TK_WHERE 93 -#define TK_PARTITION 94 -#define TK_BY 95 -#define TK_SESSION 96 -#define TK_STATE_WINDOW 97 -#define TK_INTERVAL 98 -#define TK_SLIDING 99 -#define TK_FILL 100 -#define TK_VALUE 101 -#define TK_NONE 102 -#define TK_PREV 103 -#define TK_LINEAR 104 -#define TK_NEXT 105 -#define TK_GROUP 106 -#define TK_HAVING 107 -#define TK_ORDER 108 -#define TK_SLIMIT 109 -#define TK_SOFFSET 110 -#define TK_LIMIT 111 -#define TK_OFFSET 112 -#define TK_ASC 113 -#define TK_DESC 114 -#define TK_NULLS 115 -#define TK_FIRST 116 -#define TK_LAST 117 +#define TK_TABLES 70 +#define TK_NK_FLOAT 71 +#define TK_NK_BOOL 72 +#define TK_NK_VARIABLE 73 +#define TK_BETWEEN 74 +#define TK_IS 75 +#define TK_NULL 76 +#define TK_NK_LT 77 +#define TK_NK_GT 78 +#define TK_NK_LE 79 +#define TK_NK_GE 80 +#define TK_NK_NE 81 +#define TK_NK_EQ 82 +#define TK_LIKE 83 +#define TK_MATCH 84 +#define TK_NMATCH 85 +#define TK_IN 86 +#define TK_FROM 87 +#define TK_AS 88 +#define TK_JOIN 89 +#define TK_ON 90 +#define TK_INNER 91 +#define TK_SELECT 92 +#define TK_DISTINCT 93 +#define TK_WHERE 94 +#define TK_PARTITION 95 +#define TK_BY 96 +#define TK_SESSION 97 +#define TK_STATE_WINDOW 98 +#define TK_INTERVAL 99 +#define TK_SLIDING 100 +#define TK_FILL 101 +#define TK_VALUE 102 +#define TK_NONE 103 +#define TK_PREV 104 +#define TK_LINEAR 105 +#define TK_NEXT 106 +#define TK_GROUP 107 +#define TK_HAVING 108 +#define TK_ORDER 109 +#define TK_SLIMIT 110 +#define TK_SOFFSET 111 +#define TK_LIMIT 112 +#define TK_OFFSET 113 +#define TK_ASC 114 +#define TK_DESC 115 +#define TK_NULLS 116 +#define TK_FIRST 117 +#define TK_LAST 118 #define TK_SPACE 300 #define TK_NK_COMMENT 301 diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index 92af6151b5..d04873ec12 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -74,7 +74,8 @@ typedef enum ENodeType { QUERY_NODE_CREATE_DATABASE_STMT, QUERY_NODE_CREATE_TABLE_STMT, QUERY_NODE_USE_DATABASE_STMT, - QUERY_NODE_SHOW_DATABASE_STMT, // temp + QUERY_NODE_SHOW_DATABASES_STMT, // temp + QUERY_NODE_SHOW_TABLES_STMT, // temp // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN, @@ -128,6 +129,7 @@ void nodesDestroyNode(SNodeptr pNode); SNodeList* nodesMakeList(); int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode); +int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode); int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc); SListCell* nodesListErase(SNodeList* pList, SListCell* pCell); SNodeptr nodesListGetNode(SNodeList* pList, int32_t index); diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h index f07183d64f..e6351c5f43 100644 --- a/include/libs/nodes/plannodes.h +++ b/include/libs/nodes/plannodes.h @@ -43,6 +43,7 @@ typedef struct SScanLogicNode { SLogicNode node; SNodeList* pScanCols; struct STableMeta* pMeta; + SVgroupsInfo* pVgroupList; EScanType scanType; uint8_t scanFlag; // denotes reversed scan of data or not STimeWindow scanRange; @@ -84,7 +85,6 @@ typedef struct SSubLogicPlan { SNodeList* pChildren; SNodeList* pParents; SLogicNode* pNode; - SQueryNodeAddr execNode; ESubplanType subplanType; int32_t level; } SSubLogicPlan; diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 342913343a..6f321561d1 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -123,6 +123,7 @@ struct STableMeta; typedef struct SRealTableNode { STableNode table; // QUERY_NODE_REAL_TABLE struct STableMeta* pMeta; + SVgroupsInfo* pVgroupList; } SRealTableNode; typedef struct STempTableNode { diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h index 06d9919755..1dfb81630c 100644 --- a/include/libs/parser/parser.h +++ b/include/libs/parser/parser.h @@ -38,8 +38,9 @@ typedef struct SParseContext { typedef struct SCmdMsgInfo { int16_t msgType; SEpSet epSet; - char* pMsg; + void* pMsg; int32_t msgLen; + void* pExtension; // todo remove it soon } SCmdMsgInfo; typedef struct SQuery { @@ -50,6 +51,7 @@ typedef struct SQuery { int32_t numOfResCols; SSchema* pResSchema; SCmdMsgInfo* pCmdMsg; + int32_t msgType; } SQuery; int32_t qParseQuerySql(SParseContext* pCxt, SQuery** pQuery); diff --git a/include/libs/planner/planner.h b/include/libs/planner/planner.h index cf650f95d1..0d62b7f0df 100644 --- a/include/libs/planner/planner.h +++ b/include/libs/planner/planner.h @@ -28,7 +28,7 @@ typedef struct SPlanContext { } SPlanContext; // Create the physical plan for the query, according to the AST. -int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan); +int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNodeList); // Set datasource of this subplan, multiple calls may be made to a subplan. // @subplan subplan to be schedule diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 1f63917d55..2adc6dd4e2 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -176,6 +176,14 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) { STscObj* pTscObj = pRequest->pTscObj; SMsgSendInfo* pSendMsg = buildMsgInfoImpl(pRequest); + + if (pMsgInfo->msgType == TDMT_VND_SHOW_TABLES) { + SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo; + if (pShowReqInfo->pArray == NULL) { + pShowReqInfo->currentIndex = 0; // set the first vnode/ then iterate the next vnode + pShowReqInfo->pArray = pMsgInfo->pExtension; + } + } int64_t transporterId = 0; asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pMsgInfo->epSet, &transporterId, pSendMsg); @@ -183,10 +191,10 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) { return TSDB_CODE_SUCCESS; } -int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pDag, SArray* pNodeList) { - pRequest->type = pQuery->sqlNodeType; +int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList) { + pRequest->type = pQuery->msgType; SPlanContext cxt = { .queryId = pRequest->requestId, .pAstRoot = pQuery->pRoot }; - int32_t code = qCreateQueryPlan(&cxt, pDag); + int32_t code = qCreateQueryPlan(&cxt, pPlan, pNodeList); if (code != 0) { return code; } @@ -219,7 +227,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList return pRequest->code; } - if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) { + if (TDMT_VND_SUBMIT == pRequest->type || TDMT_VND_CREATE_TABLE == pRequest->type) { pRequest->body.resInfo.numOfRows = res.numOfRows; if (pRequest->body.queryJob != 0) { diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index 403b177a97..e633dcfd93 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -160,7 +160,6 @@ static SNode* groupingSetNodeCopy(const SGroupingSetNode* pSrc, SGroupingSetNode static SNode* logicSubplanCopy(const SSubLogicPlan* pSrc, SSubLogicPlan* pDst) { COPY_NODE_FIELD(pNode); - COPY_SCALAR_FIELD(execNode); COPY_SCALAR_FIELD(subplanType); return (SNode*)pDst; } diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 1f99a00bba..ad9c392bc2 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -80,8 +80,10 @@ const char* nodesNodeName(ENodeType type) { return "CreateTableStmt"; case QUERY_NODE_USE_DATABASE_STMT: return "UseDatabaseStmt"; - case QUERY_NODE_SHOW_DATABASE_STMT: + case QUERY_NODE_SHOW_DATABASES_STMT: return "ShowDatabaseStmt"; + case QUERY_NODE_SHOW_TABLES_STMT: + return "ShowTablesStmt"; case QUERY_NODE_LOGIC_PLAN_SCAN: return "LogicScan"; case QUERY_NODE_LOGIC_PLAN_JOIN: @@ -1322,7 +1324,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) { case QUERY_NODE_CREATE_DATABASE_STMT: case QUERY_NODE_CREATE_TABLE_STMT: case QUERY_NODE_USE_DATABASE_STMT: - case QUERY_NODE_SHOW_DATABASE_STMT: + case QUERY_NODE_SHOW_DATABASES_STMT: + case QUERY_NODE_SHOW_TABLES_STMT: break; case QUERY_NODE_LOGIC_PLAN_SCAN: return logicScanNodeToJson(pObj, pJson); diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 49f2afc823..d32f43d902 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -86,7 +86,8 @@ SNodeptr nodesMakeNode(ENodeType type) { return makeNode(type, sizeof(SCreateTableStmt)); case QUERY_NODE_USE_DATABASE_STMT: return makeNode(type, sizeof(SUseDatabaseStmt)); - case QUERY_NODE_SHOW_DATABASE_STMT: + case QUERY_NODE_SHOW_DATABASES_STMT: + case QUERY_NODE_SHOW_TABLES_STMT: return makeNode(type, sizeof(SNode));; case QUERY_NODE_LOGIC_PLAN_SCAN: return makeNode(type, sizeof(SScanLogicNode)); @@ -202,6 +203,17 @@ int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode) { return TSDB_CODE_SUCCESS; } +int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode) { + if (NULL == pNode) { + return TSDB_CODE_OUT_OF_MEMORY; + } + int32_t code = nodesListAppend(pList, pNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNode); + } + return code; +} + int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc) { if (NULL == pTarget || NULL == pSrc) { return TSDB_CODE_SUCCESS; diff --git a/source/libs/parser/inc/new_sql.y b/source/libs/parser/inc/new_sql.y index dbd966c6d8..3c4e852521 100644 --- a/source/libs/parser/inc/new_sql.y +++ b/source/libs/parser/inc/new_sql.y @@ -101,8 +101,8 @@ cmd ::= CREATE TABLE exists_opt(A) full_table_name(B) %type full_table_name { STokenPair } %destructor full_table_name { } -full_table_name(A) ::= NK_ID(B). { STokenPair t = { .first = B, .second = nil_token}; A = t; } -full_table_name(A) ::= NK_ID(B) NK_DOT NK_ID(C). { STokenPair t = { .first = B, .second = C}; A = t; } +full_table_name(A) ::= NK_ID(B). { STokenPair t = { .first = nil_token, .second = B }; A = t; } +full_table_name(A) ::= NK_ID(B) NK_DOT NK_ID(C). { STokenPair t = { .first = B, .second = C }; A = t; } %type column_def_list { SNodeList* } %destructor column_def_list { nodesDestroyList($$); } @@ -146,7 +146,8 @@ table_options(A) ::= table_options(B) KEEP NK_INTEGER(C). table_options(A) ::= table_options(B) TTL NK_INTEGER(C). { A = setTableOption(pCxt, B, TABLE_OPTION_TTL, &C); } /************************************************ show ***************************************************************/ -cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASE_STMT); } +cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } +cmd ::= SHOW TABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT); } /************************************************ select *************************************************************/ cmd ::= query_expression(A). { PARSER_TRACE; pCxt->pRootNode = A; } diff --git a/source/libs/parser/src/astCreateFuncs.c b/source/libs/parser/src/astCreateFuncs.c index ba8455347f..8b254ce7af 100644 --- a/source/libs/parser/src/astCreateFuncs.c +++ b/source/libs/parser/src/astCreateFuncs.c @@ -714,18 +714,18 @@ SNode* createColumnDefNode(SAstCreateContext* pCxt, const SToken* pColName, SDat strncpy(pCol->colName, pColName->z, pColName->n); pCol->dataType = dataType; if (NULL != pComment) { - strncpy(pCol->colName, pColName->z, pColName->n); + strncpy(pCol->comments, pComment->z, pComment->n); } return (SNode*)pCol; } SDataType createDataType(uint8_t type) { - SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = 0 }; + SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = tDataTypes[type].bytes }; return dt; } SDataType createVarLenDataType(uint8_t type, const SToken* pLen) { - SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = 0 }; + SDataType dt = { .type = type, .precision = 0, .scale = 0, .bytes = tDataTypes[type].bytes }; return dt; } @@ -751,7 +751,7 @@ SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) { } SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) { - SNode* pStmt = nodesMakeNode(QUERY_NODE_SHOW_DATABASE_STMT);; + SNode* pStmt = nodesMakeNode(type);; CHECK_OUT_OF_MEM(pStmt); return pStmt; } diff --git a/source/libs/parser/src/astParse.c b/source/libs/parser/src/astParse.c index c940e10486..a64cb55146 100644 --- a/source/libs/parser/src/astParse.c +++ b/source/libs/parser/src/astParse.c @@ -39,6 +39,7 @@ static void setQuery(SAstCreateContext* pCxt, SQuery* pQuery) { pQuery->haveResultSet = false; pQuery->directRpc = true; } + pQuery->msgType = (QUERY_NODE_CREATE_TABLE_STMT == type ? TDMT_VND_CREATE_TABLE : TDMT_VND_QUERY); } int32_t doParse(SParseContext* pParseCxt, SQuery** pQuery) { diff --git a/source/libs/parser/src/astTranslate.c b/source/libs/parser/src/astTranslate.c index 6f00ec9787..be5cf62a3c 100644 --- a/source/libs/parser/src/astTranslate.c +++ b/source/libs/parser/src/astTranslate.c @@ -561,6 +561,29 @@ static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect) return TSDB_CODE_SUCCESS; } +static int32_t setTableVgroupList(STranslateContext *pCxt, SName* name, SVgroupsInfo **pVgList) { + SArray* vgroupList = NULL; + int32_t code = catalogGetTableDistVgInfo(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &(pCxt->pParseCxt->mgmtEpSet), name, &vgroupList); + if (code != TSDB_CODE_SUCCESS) { + return code; + } + + size_t vgroupNum = taosArrayGetSize(vgroupList); + + SVgroupsInfo *vgList = calloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo) * vgroupNum); + vgList->numOfVgroups = vgroupNum; + + for (int32_t i = 0; i < vgroupNum; ++i) { + SVgroupInfo *vg = taosArrayGet(vgroupList, i); + vgList->vgroups[i] = *vg; + } + + *pVgList = vgList; + taosArrayDestroy(vgroupList); + + return TSDB_CODE_SUCCESS; +} + static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pTable)) { @@ -572,6 +595,10 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { if (TSDB_CODE_SUCCESS != code) { return generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_TABLE_NOT_EXIST, pRealTable->table.tableName); } + code = setTableVgroupList(pCxt, &name, &(pRealTable->pVgroupList)); + if (TSDB_CODE_SUCCESS != code) { + return code; + } code = addNamespace(pCxt, pRealTable); break; } @@ -852,11 +879,7 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p return TSDB_CODE_SUCCESS; } -static int32_t translateCreateTable(STranslateContext* pCxt, SCreateTableStmt* pStmt) { - return TSDB_CODE_SUCCESS; -} - -static int32_t translateShow(STranslateContext* pCxt) { +static int32_t translateShowDatabases(STranslateContext* pCxt) { SShowReq showReq = { .type = TSDB_MGMT_TABLE_DB }; pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo)); @@ -875,6 +898,34 @@ static int32_t translateShow(STranslateContext* pCxt) { return TSDB_CODE_SUCCESS; } +static int32_t translateShowTables(STranslateContext* pCxt) { + SName name = {0}; + SVShowTablesReq* pShowReq = calloc(1, sizeof(SVShowTablesReq)); + tNameSetDbName(&name, pCxt->pParseCxt->acctId, pCxt->pParseCxt->db, strlen(pCxt->pParseCxt->db)); + char dbFname[TSDB_DB_FNAME_LEN] = {0}; + tNameGetFullDbName(&name, dbFname); + + SArray* array = NULL; + int32_t code = catalogGetDBVgInfo(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &pCxt->pParseCxt->mgmtEpSet, dbFname, false, &array); + if (code != TSDB_CODE_SUCCESS) { + return code; + } + SVgroupInfo* info = taosArrayGet(array, 0); + pShowReq->head.vgId = htonl(info->vgId); + + pCxt->pCmdMsg = malloc(sizeof(SCmdMsgInfo)); + if (NULL== pCxt->pCmdMsg) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pCxt->pCmdMsg->epSet = info->epset; + pCxt->pCmdMsg->msgType = TDMT_VND_SHOW_TABLES; + pCxt->pCmdMsg->msgLen = sizeof(SVShowTablesReq); + pCxt->pCmdMsg->pMsg = pShowReq; + pCxt->pCmdMsg->pExtension = array; + + return TSDB_CODE_SUCCESS; +} + static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pNode)) { @@ -887,10 +938,11 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) { case QUERY_NODE_USE_DATABASE_STMT: code = translateUseDatabase(pCxt, (SUseDatabaseStmt*)pNode); break; - case QUERY_NODE_SHOW_DATABASE_STMT: - code = translateShow(pCxt); - case QUERY_NODE_CREATE_TABLE_STMT: - code = translateCreateTable(pCxt, (SCreateTableStmt*)pNode); + case QUERY_NODE_SHOW_DATABASES_STMT: + code = translateShowDatabases(pCxt); + break; + case QUERY_NODE_SHOW_TABLES_STMT: + code = translateShowTables(pCxt); break; default: break; @@ -942,9 +994,10 @@ typedef struct SVgroupTablesBatch { SVgroupInfo info; } SVgroupTablesBatch; -static void toSchema(const SColumnNode* pCol, SSchema* pSchema) { - pSchema->type = pCol->node.resType.type; - pSchema->bytes = pCol->node.resType.bytes; +static void toSchema(const SColumnDefNode* pCol, int32_t colId, SSchema* pSchema) { + pSchema->colId = colId; + pSchema->type = pCol->dataType.type; + pSchema->bytes = pCol->dataType.bytes; strcpy(pSchema->name, pCol->colName); } @@ -960,7 +1013,8 @@ static int32_t doBuildSingleTableBatchReq(SName* pTableName, SNodeList* pColumns SNode* pCol; int32_t index = 0; FOREACH(pCol, pColumns) { - toSchema((SColumnNode*)pCol, req.ntbCfg.pSchema + index++); + toSchema((SColumnDefNode*)pCol, index + 1, req.ntbCfg.pSchema + index); + ++index; } pBatch->info = *pVgroupInfo; @@ -1018,7 +1072,11 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { SCreateTableStmt* pStmt = (SCreateTableStmt*)pQuery->pRoot; SName tableName = { .type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId }; - strcpy(tableName.dbname, pStmt->dbName); + if ('\0' == pStmt->dbName[0]) { + strcpy(tableName.dbname, pCxt->pParseCxt->db); + } else { + strcpy(tableName.dbname, pStmt->dbName); + } strcpy(tableName.tname, pStmt->tableName); SVgroupInfo info = {0}; catalogGetTableHashVgroup(pCxt->pParseCxt->pCatalog, pCxt->pParseCxt->pTransporter, &pCxt->pParseCxt->mgmtEpSet, &tableName, &info); diff --git a/source/libs/parser/src/insertParser.c b/source/libs/parser/src/insertParser.c index d8e805ab82..d953192478 100644 --- a/source/libs/parser/src/insertParser.c +++ b/source/libs/parser/src/insertParser.c @@ -159,12 +159,9 @@ static int32_t createSName(SName* pName, SToken* pTableName, SParseContext* pPar } static int32_t getTableMeta(SInsertParseContext* pCxt, SToken* pTname) { - SName name = {0}; - createSName(&name, pTname, pCxt->pComCxt, &pCxt->msg); - - char tableName[TSDB_TABLE_FNAME_LEN] = {0}; - tNameExtractFullName(&name, tableName); SParseContext* pBasicCtx = pCxt->pComCxt; + SName name = {0}; + createSName(&name, pTname, pBasicCtx, &pCxt->msg); CHECK_CODE(catalogGetTableMeta(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, &name, &pCxt->pTableMeta)); SVgroupInfo vg; CHECK_CODE(catalogGetTableHashVgroup(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, &name, &vg)); @@ -939,6 +936,13 @@ int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery) { return TSDB_CODE_TSC_OUT_OF_MEMORY; } + *pQuery = calloc(1, sizeof(SQuery)); + if (NULL == *pQuery) { + return TSDB_CODE_OUT_OF_MEMORY; + } + (*pQuery)->directRpc = false; + (*pQuery)->haveResultSet = false; + (*pQuery)->msgType = TDMT_VND_SUBMIT; (*pQuery)->pRoot = (SNode*)context.pOutput; context.pOutput->payloadType = PAYLOAD_TYPE_KV; diff --git a/source/libs/parser/src/new_sql.c b/source/libs/parser/src/new_sql.c index 432bb66e69..af3bd203a5 100644 --- a/source/libs/parser/src/new_sql.c +++ b/source/libs/parser/src/new_sql.c @@ -109,25 +109,25 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 179 +#define YYNOCODE 180 #define YYACTIONTYPE unsigned short int #define NewParseTOKENTYPE SToken typedef union { int yyinit; NewParseTOKENTYPE yy0; - EOrder yy14; - ENullOrder yy17; - SDatabaseOptions* yy27; - STableOptions* yy40; - SNodeList* yy60; - SToken yy105; - STokenPair yy111; - SNode* yy172; - EFillMode yy202; - EOperatorType yy214; - SDataType yy248; - bool yy259; - EJoinType yy278; + EOperatorType yy20; + STableOptions* yy46; + EFillMode yy54; + STokenPair yy57; + SNodeList* yy64; + bool yy137; + SDatabaseOptions* yy199; + SToken yy209; + ENullOrder yy217; + EOrder yy218; + EJoinType yy252; + SNode* yy272; + SDataType yy304; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -142,17 +142,17 @@ typedef union { #define NewParseCTX_PARAM #define NewParseCTX_FETCH #define NewParseCTX_STORE -#define YYNSTATE 211 -#define YYNRULE 196 -#define YYNTOKEN 118 -#define YY_MAX_SHIFT 210 -#define YY_MIN_SHIFTREDUCE 352 -#define YY_MAX_SHIFTREDUCE 547 -#define YY_ERROR_ACTION 548 -#define YY_ACCEPT_ACTION 549 -#define YY_NO_ACTION 550 -#define YY_MIN_REDUCE 551 -#define YY_MAX_REDUCE 746 +#define YYNSTATE 212 +#define YYNRULE 197 +#define YYNTOKEN 119 +#define YY_MAX_SHIFT 211 +#define YY_MIN_SHIFTREDUCE 353 +#define YY_MAX_SHIFTREDUCE 549 +#define YY_ERROR_ACTION 550 +#define YY_ACCEPT_ACTION 551 +#define YY_NO_ACTION 552 +#define YY_MIN_REDUCE 553 +#define YY_MAX_REDUCE 749 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -219,256 +219,255 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (890) +#define YY_ACTTAB_COUNT (871) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 616, 614, 105, 187, 116, 725, 576, 48, 23, 75, - /* 10 */ 76, 639, 30, 28, 26, 25, 24, 157, 125, 724, - /* 20 */ 678, 100, 128, 723, 678, 30, 28, 26, 25, 24, - /* 30 */ 551, 617, 614, 639, 100, 68, 624, 614, 675, 157, - /* 40 */ 158, 694, 674, 42, 625, 430, 628, 664, 26, 25, - /* 50 */ 24, 663, 660, 210, 678, 209, 208, 207, 206, 205, - /* 60 */ 204, 203, 202, 201, 150, 200, 199, 198, 197, 196, - /* 70 */ 195, 194, 673, 22, 109, 151, 448, 449, 450, 451, - /* 80 */ 452, 453, 454, 456, 457, 458, 22, 109, 140, 448, - /* 90 */ 449, 450, 451, 452, 453, 454, 456, 457, 458, 30, - /* 100 */ 28, 26, 25, 24, 381, 185, 184, 183, 385, 182, - /* 110 */ 387, 388, 181, 390, 178, 117, 396, 175, 398, 399, - /* 120 */ 172, 169, 639, 573, 147, 624, 614, 133, 157, 158, - /* 130 */ 577, 48, 40, 625, 84, 628, 664, 152, 423, 80, - /* 140 */ 99, 660, 10, 639, 142, 497, 624, 614, 421, 143, - /* 150 */ 158, 424, 725, 41, 625, 189, 628, 664, 82, 20, - /* 160 */ 188, 107, 660, 52, 58, 162, 57, 639, 455, 149, - /* 170 */ 723, 459, 190, 157, 10, 74, 142, 421, 132, 73, - /* 180 */ 489, 118, 691, 639, 6, 485, 624, 614, 58, 143, - /* 190 */ 158, 640, 59, 41, 625, 78, 628, 664, 139, 9, - /* 200 */ 8, 107, 660, 52, 683, 639, 485, 2, 624, 614, - /* 210 */ 46, 157, 158, 424, 126, 41, 625, 44, 628, 664, - /* 220 */ 695, 58, 692, 107, 660, 737, 141, 53, 671, 672, - /* 230 */ 511, 676, 639, 43, 698, 624, 614, 705, 157, 158, - /* 240 */ 9, 8, 41, 625, 145, 628, 664, 134, 129, 127, - /* 250 */ 107, 660, 737, 639, 154, 549, 624, 614, 123, 157, - /* 260 */ 158, 721, 60, 41, 625, 160, 628, 664, 488, 29, - /* 270 */ 27, 107, 660, 737, 29, 27, 490, 410, 11, 546, - /* 280 */ 547, 410, 682, 11, 466, 65, 410, 412, 62, 460, - /* 290 */ 416, 412, 31, 725, 427, 121, 412, 31, 445, 621, - /* 300 */ 122, 1, 619, 114, 106, 704, 1, 57, 114, 64, - /* 310 */ 402, 723, 159, 167, 85, 5, 159, 47, 155, 685, - /* 320 */ 136, 159, 67, 411, 413, 416, 120, 411, 413, 416, - /* 330 */ 4, 51, 411, 413, 416, 485, 639, 69, 147, 624, - /* 340 */ 614, 420, 157, 158, 45, 139, 90, 625, 58, 628, - /* 350 */ 423, 29, 27, 147, 679, 29, 27, 46, 19, 32, - /* 360 */ 11, 16, 70, 410, 44, 646, 725, 410, 30, 28, - /* 370 */ 26, 25, 24, 412, 71, 671, 138, 412, 137, 740, - /* 380 */ 57, 725, 110, 1, 723, 114, 156, 7, 153, 114, - /* 390 */ 639, 419, 722, 624, 614, 57, 157, 158, 159, 723, - /* 400 */ 92, 625, 159, 628, 163, 77, 165, 191, 193, 411, - /* 410 */ 413, 416, 81, 411, 413, 416, 86, 83, 639, 3, - /* 420 */ 31, 624, 614, 98, 157, 158, 87, 14, 42, 625, - /* 430 */ 61, 628, 664, 135, 58, 508, 144, 660, 29, 27, - /* 440 */ 146, 29, 27, 63, 29, 27, 35, 510, 639, 50, - /* 450 */ 410, 624, 614, 410, 157, 158, 410, 66, 42, 625, - /* 460 */ 412, 628, 664, 412, 504, 36, 412, 661, 503, 21, - /* 470 */ 7, 130, 114, 1, 619, 114, 7, 37, 114, 30, - /* 480 */ 28, 26, 25, 24, 131, 159, 18, 15, 159, 482, - /* 490 */ 72, 159, 33, 481, 34, 8, 411, 413, 416, 411, - /* 500 */ 413, 416, 411, 413, 416, 639, 618, 56, 624, 614, - /* 510 */ 446, 157, 158, 428, 537, 49, 625, 12, 628, 38, - /* 520 */ 17, 532, 639, 531, 111, 624, 614, 536, 157, 158, - /* 530 */ 535, 112, 96, 625, 113, 628, 639, 79, 13, 624, - /* 540 */ 614, 608, 157, 158, 607, 414, 96, 625, 119, 628, - /* 550 */ 161, 572, 164, 403, 148, 738, 639, 166, 376, 624, - /* 560 */ 614, 115, 157, 158, 168, 171, 96, 625, 108, 628, - /* 570 */ 400, 639, 170, 397, 624, 614, 173, 157, 158, 174, - /* 580 */ 176, 49, 625, 639, 628, 179, 624, 614, 391, 157, - /* 590 */ 158, 177, 395, 91, 625, 389, 628, 639, 180, 394, - /* 600 */ 624, 614, 380, 157, 158, 407, 393, 93, 625, 186, - /* 610 */ 628, 406, 639, 405, 392, 624, 614, 39, 157, 158, - /* 620 */ 353, 739, 88, 625, 639, 628, 372, 624, 614, 192, - /* 630 */ 157, 158, 550, 371, 94, 625, 639, 628, 370, 624, - /* 640 */ 614, 365, 157, 158, 369, 368, 89, 625, 367, 628, - /* 650 */ 366, 364, 639, 550, 363, 624, 614, 550, 157, 158, - /* 660 */ 362, 361, 95, 625, 360, 628, 639, 359, 358, 624, - /* 670 */ 614, 357, 157, 158, 356, 550, 636, 625, 550, 628, - /* 680 */ 550, 639, 550, 550, 624, 614, 550, 157, 158, 550, - /* 690 */ 550, 635, 625, 639, 628, 550, 624, 614, 550, 157, - /* 700 */ 158, 550, 550, 634, 625, 639, 628, 550, 624, 614, - /* 710 */ 550, 157, 158, 550, 550, 103, 625, 639, 628, 550, - /* 720 */ 624, 614, 550, 157, 158, 550, 550, 102, 625, 550, - /* 730 */ 628, 639, 550, 550, 624, 614, 550, 157, 158, 550, - /* 740 */ 550, 104, 625, 639, 628, 139, 624, 614, 550, 157, - /* 750 */ 158, 139, 550, 101, 625, 639, 628, 46, 624, 614, - /* 760 */ 550, 157, 158, 46, 44, 97, 625, 514, 628, 550, - /* 770 */ 44, 550, 550, 550, 54, 671, 672, 550, 676, 550, - /* 780 */ 55, 671, 672, 550, 676, 550, 550, 30, 28, 26, - /* 790 */ 25, 24, 550, 124, 512, 513, 515, 516, 550, 550, - /* 800 */ 30, 28, 26, 25, 24, 550, 550, 550, 550, 550, - /* 810 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 820 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 830 */ 550, 550, 550, 430, 550, 550, 550, 550, 550, 550, - /* 840 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 850 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 860 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 870 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, - /* 880 */ 550, 550, 550, 550, 550, 550, 550, 550, 543, 544, + /* 0 */ 619, 617, 105, 188, 117, 728, 578, 48, 23, 75, + /* 10 */ 76, 642, 30, 28, 26, 25, 24, 158, 126, 727, + /* 20 */ 681, 100, 129, 726, 681, 30, 28, 26, 25, 24, + /* 30 */ 553, 620, 617, 642, 100, 68, 627, 617, 678, 158, + /* 40 */ 159, 499, 677, 42, 628, 432, 631, 667, 26, 25, + /* 50 */ 24, 666, 663, 211, 681, 210, 209, 208, 207, 206, + /* 60 */ 205, 204, 203, 202, 697, 201, 200, 199, 198, 197, + /* 70 */ 196, 195, 676, 423, 22, 109, 141, 450, 451, 452, + /* 80 */ 453, 454, 455, 456, 458, 459, 460, 22, 109, 134, + /* 90 */ 450, 451, 452, 453, 454, 455, 456, 458, 459, 460, + /* 100 */ 10, 10, 143, 143, 382, 186, 185, 184, 386, 183, + /* 110 */ 388, 389, 182, 391, 179, 118, 397, 176, 399, 400, + /* 120 */ 173, 170, 642, 575, 148, 627, 617, 84, 158, 159, + /* 130 */ 9, 8, 40, 628, 58, 631, 667, 6, 487, 80, + /* 140 */ 99, 663, 423, 642, 579, 48, 627, 617, 58, 144, + /* 150 */ 159, 82, 728, 41, 628, 190, 631, 667, 642, 20, + /* 160 */ 189, 107, 663, 52, 158, 115, 57, 643, 457, 133, + /* 170 */ 726, 461, 191, 642, 468, 74, 627, 617, 151, 144, + /* 180 */ 159, 119, 694, 41, 628, 491, 631, 667, 426, 58, + /* 190 */ 551, 107, 663, 52, 78, 642, 425, 426, 627, 617, + /* 200 */ 161, 158, 159, 155, 513, 41, 628, 43, 631, 667, + /* 210 */ 9, 8, 695, 107, 663, 740, 642, 2, 65, 627, + /* 220 */ 617, 62, 158, 159, 701, 152, 41, 628, 728, 631, + /* 230 */ 667, 135, 130, 128, 107, 663, 740, 642, 73, 59, + /* 240 */ 627, 617, 57, 158, 159, 724, 726, 41, 628, 698, + /* 250 */ 631, 667, 146, 29, 27, 107, 663, 740, 29, 27, + /* 260 */ 492, 686, 11, 487, 127, 412, 685, 11, 156, 462, + /* 270 */ 412, 708, 31, 429, 490, 414, 31, 548, 549, 624, + /* 280 */ 414, 60, 622, 403, 150, 1, 168, 114, 153, 124, + /* 290 */ 1, 642, 114, 148, 627, 617, 122, 158, 159, 418, + /* 300 */ 160, 90, 628, 85, 631, 160, 47, 447, 29, 27, + /* 310 */ 123, 707, 413, 415, 418, 29, 27, 413, 415, 418, + /* 320 */ 412, 728, 163, 162, 11, 64, 106, 412, 5, 137, + /* 330 */ 414, 688, 67, 58, 121, 57, 4, 414, 69, 726, + /* 340 */ 7, 51, 114, 422, 45, 487, 425, 1, 682, 114, + /* 350 */ 642, 32, 70, 627, 617, 160, 158, 159, 16, 649, + /* 360 */ 49, 628, 160, 631, 110, 743, 725, 413, 415, 418, + /* 370 */ 154, 157, 140, 77, 413, 415, 418, 421, 164, 642, + /* 380 */ 148, 166, 627, 617, 46, 158, 159, 194, 58, 42, + /* 390 */ 628, 44, 631, 667, 192, 29, 27, 145, 663, 149, + /* 400 */ 741, 71, 674, 139, 81, 138, 86, 412, 728, 83, + /* 410 */ 87, 29, 27, 147, 412, 98, 3, 414, 31, 14, + /* 420 */ 61, 510, 57, 412, 414, 63, 726, 1, 642, 114, + /* 430 */ 35, 627, 617, 414, 158, 159, 512, 50, 96, 628, + /* 440 */ 113, 631, 160, 7, 66, 114, 506, 505, 36, 160, + /* 450 */ 131, 37, 15, 132, 413, 415, 418, 622, 160, 18, + /* 460 */ 484, 413, 415, 418, 483, 34, 33, 72, 29, 27, + /* 470 */ 413, 415, 418, 8, 621, 642, 56, 534, 627, 617, + /* 480 */ 412, 158, 159, 430, 448, 42, 628, 539, 631, 667, + /* 490 */ 414, 17, 12, 38, 664, 30, 28, 26, 25, 24, + /* 500 */ 7, 533, 114, 111, 538, 537, 112, 642, 79, 13, + /* 510 */ 627, 617, 416, 158, 159, 160, 611, 96, 628, 120, + /* 520 */ 631, 610, 609, 574, 167, 396, 116, 413, 415, 418, + /* 530 */ 642, 377, 171, 627, 617, 165, 158, 159, 404, 169, + /* 540 */ 92, 628, 401, 631, 398, 642, 381, 172, 627, 617, + /* 550 */ 175, 158, 159, 178, 174, 96, 628, 108, 631, 642, + /* 560 */ 177, 180, 627, 617, 392, 158, 159, 408, 181, 49, + /* 570 */ 628, 642, 631, 136, 627, 617, 390, 158, 159, 395, + /* 580 */ 407, 91, 628, 187, 631, 406, 642, 394, 393, 627, + /* 590 */ 617, 39, 158, 159, 354, 193, 93, 628, 366, 631, + /* 600 */ 642, 373, 372, 627, 617, 371, 158, 159, 370, 742, + /* 610 */ 88, 628, 369, 631, 642, 552, 368, 627, 617, 367, + /* 620 */ 158, 159, 365, 364, 94, 628, 363, 631, 642, 552, + /* 630 */ 362, 627, 617, 361, 158, 159, 360, 359, 89, 628, + /* 640 */ 552, 631, 642, 552, 358, 627, 617, 357, 158, 159, + /* 650 */ 552, 552, 95, 628, 552, 631, 642, 552, 552, 627, + /* 660 */ 617, 552, 158, 159, 552, 552, 639, 628, 642, 631, + /* 670 */ 552, 627, 617, 552, 158, 159, 552, 552, 638, 628, + /* 680 */ 642, 631, 552, 627, 617, 552, 158, 159, 552, 552, + /* 690 */ 637, 628, 552, 631, 642, 552, 552, 627, 617, 552, + /* 700 */ 158, 159, 552, 552, 103, 628, 642, 631, 552, 627, + /* 710 */ 617, 552, 158, 159, 552, 552, 102, 628, 642, 631, + /* 720 */ 552, 627, 617, 552, 158, 159, 552, 552, 104, 628, + /* 730 */ 552, 631, 642, 552, 552, 627, 617, 552, 158, 159, + /* 740 */ 552, 552, 101, 628, 552, 631, 642, 552, 516, 627, + /* 750 */ 617, 19, 158, 159, 140, 552, 97, 628, 552, 631, + /* 760 */ 140, 30, 28, 26, 25, 24, 46, 30, 28, 26, + /* 770 */ 25, 24, 46, 44, 125, 514, 515, 517, 518, 44, + /* 780 */ 552, 552, 142, 53, 674, 675, 552, 679, 140, 54, + /* 790 */ 674, 675, 21, 679, 552, 30, 28, 26, 25, 24, + /* 800 */ 46, 552, 30, 28, 26, 25, 24, 44, 552, 552, + /* 810 */ 552, 552, 552, 552, 552, 552, 552, 55, 674, 675, + /* 820 */ 552, 679, 552, 552, 552, 552, 552, 552, 432, 552, + /* 830 */ 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, + /* 840 */ 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, + /* 850 */ 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, + /* 860 */ 552, 552, 552, 552, 552, 552, 552, 552, 552, 545, + /* 870 */ 546, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 129, 130, 131, 127, 123, 156, 125, 126, 141, 142, - /* 10 */ 177, 126, 12, 13, 14, 15, 16, 132, 168, 170, - /* 20 */ 134, 21, 137, 174, 134, 12, 13, 14, 15, 16, - /* 30 */ 0, 129, 130, 126, 21, 161, 129, 130, 152, 132, - /* 40 */ 133, 135, 152, 136, 137, 45, 139, 140, 14, 15, - /* 50 */ 16, 144, 145, 23, 134, 25, 26, 27, 28, 29, - /* 60 */ 30, 31, 32, 33, 3, 35, 36, 37, 38, 39, - /* 70 */ 40, 41, 152, 73, 74, 48, 76, 77, 78, 79, - /* 80 */ 80, 81, 82, 83, 84, 85, 73, 74, 154, 76, - /* 90 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 12, - /* 100 */ 13, 14, 15, 16, 50, 51, 52, 53, 54, 55, + /* 0 */ 130, 131, 132, 128, 124, 157, 126, 127, 142, 143, + /* 10 */ 178, 127, 12, 13, 14, 15, 16, 133, 169, 171, + /* 20 */ 135, 21, 138, 175, 135, 12, 13, 14, 15, 16, + /* 30 */ 0, 130, 131, 127, 21, 162, 130, 131, 153, 133, + /* 40 */ 134, 14, 153, 137, 138, 45, 140, 141, 14, 15, + /* 50 */ 16, 145, 146, 23, 135, 25, 26, 27, 28, 29, + /* 60 */ 30, 31, 32, 33, 136, 35, 36, 37, 38, 39, + /* 70 */ 40, 41, 153, 46, 74, 75, 155, 77, 78, 79, + /* 80 */ 80, 81, 82, 83, 84, 85, 86, 74, 75, 46, + /* 90 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + /* 100 */ 44, 44, 46, 46, 50, 51, 52, 53, 54, 55, /* 110 */ 56, 57, 58, 59, 60, 18, 62, 63, 64, 65, - /* 120 */ 66, 67, 126, 0, 128, 129, 130, 46, 132, 133, - /* 130 */ 125, 126, 136, 137, 19, 139, 140, 110, 46, 42, - /* 140 */ 144, 145, 44, 126, 46, 14, 129, 130, 46, 132, - /* 150 */ 133, 46, 156, 136, 137, 32, 139, 140, 43, 73, - /* 160 */ 37, 144, 145, 146, 91, 68, 170, 126, 82, 108, - /* 170 */ 174, 85, 49, 132, 44, 158, 46, 46, 137, 87, - /* 180 */ 4, 164, 165, 126, 89, 90, 129, 130, 91, 132, - /* 190 */ 133, 126, 87, 136, 137, 171, 139, 140, 120, 1, - /* 200 */ 2, 144, 145, 146, 88, 126, 90, 157, 129, 130, - /* 210 */ 132, 132, 133, 46, 100, 136, 137, 139, 139, 140, - /* 220 */ 135, 91, 165, 144, 145, 146, 148, 149, 150, 151, - /* 230 */ 45, 153, 126, 48, 155, 129, 130, 167, 132, 133, - /* 240 */ 1, 2, 136, 137, 21, 139, 140, 96, 97, 98, - /* 250 */ 144, 145, 146, 126, 48, 118, 129, 130, 99, 132, - /* 260 */ 133, 155, 166, 136, 137, 128, 139, 140, 92, 12, - /* 270 */ 13, 144, 145, 146, 12, 13, 14, 24, 21, 116, - /* 280 */ 117, 24, 155, 21, 45, 45, 24, 34, 48, 45, - /* 290 */ 72, 34, 48, 156, 45, 130, 34, 48, 75, 44, - /* 300 */ 130, 44, 47, 46, 130, 167, 44, 170, 46, 166, - /* 310 */ 45, 174, 59, 48, 45, 107, 59, 48, 112, 163, - /* 320 */ 106, 59, 162, 70, 71, 72, 94, 70, 71, 72, - /* 330 */ 93, 160, 70, 71, 72, 90, 126, 159, 128, 129, - /* 340 */ 130, 46, 132, 133, 132, 120, 136, 137, 91, 139, - /* 350 */ 46, 12, 13, 128, 134, 12, 13, 132, 2, 86, - /* 360 */ 21, 44, 147, 24, 139, 143, 156, 24, 12, 13, - /* 370 */ 14, 15, 16, 34, 149, 150, 151, 34, 153, 178, - /* 380 */ 170, 156, 115, 44, 174, 46, 111, 44, 109, 46, - /* 390 */ 126, 46, 173, 129, 130, 170, 132, 133, 59, 174, - /* 400 */ 136, 137, 59, 139, 120, 172, 46, 122, 20, 70, - /* 410 */ 71, 72, 119, 70, 71, 72, 120, 119, 126, 48, - /* 420 */ 48, 129, 130, 124, 132, 133, 121, 95, 136, 137, - /* 430 */ 45, 139, 140, 169, 91, 45, 144, 145, 12, 13, - /* 440 */ 14, 12, 13, 44, 12, 13, 48, 45, 126, 44, - /* 450 */ 24, 129, 130, 24, 132, 133, 24, 44, 136, 137, - /* 460 */ 34, 139, 140, 34, 45, 44, 34, 145, 45, 2, - /* 470 */ 44, 24, 46, 44, 47, 46, 44, 44, 46, 12, - /* 480 */ 13, 14, 15, 16, 48, 59, 48, 95, 59, 45, - /* 490 */ 47, 59, 88, 45, 48, 2, 70, 71, 72, 70, - /* 500 */ 71, 72, 70, 71, 72, 126, 47, 47, 129, 130, - /* 510 */ 75, 132, 133, 45, 45, 136, 137, 95, 139, 4, - /* 520 */ 48, 24, 126, 24, 24, 129, 130, 24, 132, 133, - /* 530 */ 24, 24, 136, 137, 138, 139, 126, 47, 44, 129, - /* 540 */ 130, 0, 132, 133, 0, 34, 136, 137, 138, 139, - /* 550 */ 69, 0, 47, 45, 175, 176, 126, 24, 46, 129, - /* 560 */ 130, 24, 132, 133, 44, 44, 136, 137, 138, 139, - /* 570 */ 45, 126, 24, 45, 129, 130, 24, 132, 133, 44, - /* 580 */ 24, 136, 137, 126, 139, 24, 129, 130, 45, 132, - /* 590 */ 133, 44, 61, 136, 137, 45, 139, 126, 44, 61, - /* 600 */ 129, 130, 34, 132, 133, 24, 61, 136, 137, 49, - /* 610 */ 139, 24, 126, 24, 61, 129, 130, 44, 132, 133, - /* 620 */ 22, 176, 136, 137, 126, 139, 24, 129, 130, 21, - /* 630 */ 132, 133, 179, 24, 136, 137, 126, 139, 24, 129, - /* 640 */ 130, 34, 132, 133, 24, 24, 136, 137, 24, 139, - /* 650 */ 24, 24, 126, 179, 24, 129, 130, 179, 132, 133, - /* 660 */ 24, 24, 136, 137, 24, 139, 126, 24, 24, 129, - /* 670 */ 130, 24, 132, 133, 24, 179, 136, 137, 179, 139, - /* 680 */ 179, 126, 179, 179, 129, 130, 179, 132, 133, 179, - /* 690 */ 179, 136, 137, 126, 139, 179, 129, 130, 179, 132, - /* 700 */ 133, 179, 179, 136, 137, 126, 139, 179, 129, 130, - /* 710 */ 179, 132, 133, 179, 179, 136, 137, 126, 139, 179, - /* 720 */ 129, 130, 179, 132, 133, 179, 179, 136, 137, 179, - /* 730 */ 139, 126, 179, 179, 129, 130, 179, 132, 133, 179, - /* 740 */ 179, 136, 137, 126, 139, 120, 129, 130, 179, 132, - /* 750 */ 133, 120, 179, 136, 137, 126, 139, 132, 129, 130, - /* 760 */ 179, 132, 133, 132, 139, 136, 137, 75, 139, 179, - /* 770 */ 139, 179, 179, 179, 149, 150, 151, 179, 153, 179, - /* 780 */ 149, 150, 151, 179, 153, 179, 179, 12, 13, 14, - /* 790 */ 15, 16, 179, 101, 102, 103, 104, 105, 179, 179, - /* 800 */ 12, 13, 14, 15, 16, 179, 179, 179, 179, 179, - /* 810 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 820 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 830 */ 179, 179, 179, 45, 179, 179, 179, 179, 179, 179, - /* 840 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 850 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 860 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 870 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 880 */ 179, 179, 179, 179, 179, 179, 179, 179, 113, 114, - /* 890 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 900 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - /* 910 */ 179, 179, 179, 179, 179, 179, 179, 179, 179, + /* 120 */ 66, 67, 127, 0, 129, 130, 131, 19, 133, 134, + /* 130 */ 1, 2, 137, 138, 92, 140, 141, 90, 91, 42, + /* 140 */ 145, 146, 46, 127, 126, 127, 130, 131, 92, 133, + /* 150 */ 134, 43, 157, 137, 138, 32, 140, 141, 127, 74, + /* 160 */ 37, 145, 146, 147, 133, 68, 171, 127, 83, 138, + /* 170 */ 175, 86, 49, 127, 45, 159, 130, 131, 3, 133, + /* 180 */ 134, 165, 166, 137, 138, 4, 140, 141, 46, 92, + /* 190 */ 119, 145, 146, 147, 172, 127, 46, 46, 130, 131, + /* 200 */ 129, 133, 134, 48, 45, 137, 138, 48, 140, 141, + /* 210 */ 1, 2, 166, 145, 146, 147, 127, 158, 45, 130, + /* 220 */ 131, 48, 133, 134, 156, 48, 137, 138, 157, 140, + /* 230 */ 141, 97, 98, 99, 145, 146, 147, 127, 88, 88, + /* 240 */ 130, 131, 171, 133, 134, 156, 175, 137, 138, 136, + /* 250 */ 140, 141, 21, 12, 13, 145, 146, 147, 12, 13, + /* 260 */ 14, 89, 21, 91, 101, 24, 156, 21, 113, 45, + /* 270 */ 24, 168, 48, 45, 93, 34, 48, 117, 118, 44, + /* 280 */ 34, 167, 47, 45, 109, 44, 48, 46, 111, 100, + /* 290 */ 44, 127, 46, 129, 130, 131, 131, 133, 134, 73, + /* 300 */ 59, 137, 138, 45, 140, 59, 48, 76, 12, 13, + /* 310 */ 131, 168, 71, 72, 73, 12, 13, 71, 72, 73, + /* 320 */ 24, 157, 69, 70, 21, 167, 131, 24, 108, 107, + /* 330 */ 34, 164, 163, 92, 95, 171, 94, 34, 160, 175, + /* 340 */ 44, 161, 46, 46, 133, 91, 46, 44, 135, 46, + /* 350 */ 127, 87, 148, 130, 131, 59, 133, 134, 44, 144, + /* 360 */ 137, 138, 59, 140, 116, 179, 174, 71, 72, 73, + /* 370 */ 110, 112, 121, 173, 71, 72, 73, 46, 121, 127, + /* 380 */ 129, 46, 130, 131, 133, 133, 134, 20, 92, 137, + /* 390 */ 138, 140, 140, 141, 123, 12, 13, 145, 146, 176, + /* 400 */ 177, 150, 151, 152, 120, 154, 121, 24, 157, 120, + /* 410 */ 122, 12, 13, 14, 24, 125, 48, 34, 48, 96, + /* 420 */ 45, 45, 171, 24, 34, 44, 175, 44, 127, 46, + /* 430 */ 48, 130, 131, 34, 133, 134, 45, 44, 137, 138, + /* 440 */ 139, 140, 59, 44, 44, 46, 45, 45, 44, 59, + /* 450 */ 24, 44, 96, 48, 71, 72, 73, 47, 59, 48, + /* 460 */ 45, 71, 72, 73, 45, 48, 89, 47, 12, 13, + /* 470 */ 71, 72, 73, 2, 47, 127, 47, 24, 130, 131, + /* 480 */ 24, 133, 134, 45, 76, 137, 138, 45, 140, 141, + /* 490 */ 34, 48, 96, 4, 146, 12, 13, 14, 15, 16, + /* 500 */ 44, 24, 46, 24, 24, 24, 24, 127, 47, 44, + /* 510 */ 130, 131, 34, 133, 134, 59, 0, 137, 138, 139, + /* 520 */ 140, 0, 0, 0, 24, 61, 24, 71, 72, 73, + /* 530 */ 127, 46, 24, 130, 131, 47, 133, 134, 45, 44, + /* 540 */ 137, 138, 45, 140, 45, 127, 34, 44, 130, 131, + /* 550 */ 44, 133, 134, 44, 24, 137, 138, 139, 140, 127, + /* 560 */ 24, 24, 130, 131, 45, 133, 134, 24, 44, 137, + /* 570 */ 138, 127, 140, 170, 130, 131, 45, 133, 134, 61, + /* 580 */ 24, 137, 138, 49, 140, 24, 127, 61, 61, 130, + /* 590 */ 131, 44, 133, 134, 22, 21, 137, 138, 34, 140, + /* 600 */ 127, 24, 24, 130, 131, 24, 133, 134, 24, 177, + /* 610 */ 137, 138, 24, 140, 127, 180, 24, 130, 131, 24, + /* 620 */ 133, 134, 24, 24, 137, 138, 24, 140, 127, 180, + /* 630 */ 24, 130, 131, 24, 133, 134, 24, 24, 137, 138, + /* 640 */ 180, 140, 127, 180, 24, 130, 131, 24, 133, 134, + /* 650 */ 180, 180, 137, 138, 180, 140, 127, 180, 180, 130, + /* 660 */ 131, 180, 133, 134, 180, 180, 137, 138, 127, 140, + /* 670 */ 180, 130, 131, 180, 133, 134, 180, 180, 137, 138, + /* 680 */ 127, 140, 180, 130, 131, 180, 133, 134, 180, 180, + /* 690 */ 137, 138, 180, 140, 127, 180, 180, 130, 131, 180, + /* 700 */ 133, 134, 180, 180, 137, 138, 127, 140, 180, 130, + /* 710 */ 131, 180, 133, 134, 180, 180, 137, 138, 127, 140, + /* 720 */ 180, 130, 131, 180, 133, 134, 180, 180, 137, 138, + /* 730 */ 180, 140, 127, 180, 180, 130, 131, 180, 133, 134, + /* 740 */ 180, 180, 137, 138, 180, 140, 127, 180, 76, 130, + /* 750 */ 131, 2, 133, 134, 121, 180, 137, 138, 180, 140, + /* 760 */ 121, 12, 13, 14, 15, 16, 133, 12, 13, 14, + /* 770 */ 15, 16, 133, 140, 102, 103, 104, 105, 106, 140, + /* 780 */ 180, 180, 149, 150, 151, 152, 180, 154, 121, 150, + /* 790 */ 151, 152, 2, 154, 180, 12, 13, 14, 15, 16, + /* 800 */ 133, 180, 12, 13, 14, 15, 16, 140, 180, 180, + /* 810 */ 180, 180, 180, 180, 180, 180, 180, 150, 151, 152, + /* 820 */ 180, 154, 180, 180, 180, 180, 180, 180, 45, 180, + /* 830 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 840 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 850 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 860 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 114, + /* 870 */ 115, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 880 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 890 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 900 */ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + /* 910 */ 180, 180, 180, 180, 180, }; -#define YY_SHIFT_COUNT (210) +#define YY_SHIFT_COUNT (211) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (788) +#define YY_SHIFT_MAX (790) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 97, 257, 262, 339, 339, 339, 339, 343, 339, 339, - /* 10 */ 130, 429, 432, 426, 432, 432, 432, 432, 432, 432, - /* 20 */ 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, - /* 30 */ 432, 432, 98, 98, 98, 253, 81, 81, 73, 102, - /* 40 */ 0, 13, 13, 253, 92, 92, 92, 102, 54, 775, - /* 50 */ 692, 151, 105, 116, 95, 116, 131, 61, 176, 167, - /* 60 */ 114, 159, 218, 218, 114, 159, 218, 208, 214, 232, - /* 70 */ 237, 245, 295, 304, 273, 317, 267, 275, 279, 102, - /* 80 */ 345, 360, 388, 345, 388, 890, 890, 30, 356, 467, - /* 90 */ 788, 87, 87, 87, 87, 87, 87, 87, 123, 239, - /* 100 */ 86, 34, 34, 34, 34, 185, 240, 198, 244, 223, - /* 110 */ 163, 27, 206, 249, 255, 265, 269, 115, 371, 372, - /* 120 */ 332, 385, 390, 399, 398, 402, 405, 413, 419, 421, - /* 130 */ 423, 447, 436, 427, 433, 438, 392, 444, 448, 443, - /* 140 */ 404, 446, 459, 460, 493, 435, 468, 469, 472, 422, - /* 150 */ 515, 497, 499, 500, 503, 506, 507, 490, 494, 511, - /* 160 */ 541, 544, 481, 551, 512, 505, 508, 533, 537, 520, - /* 170 */ 525, 548, 521, 528, 552, 535, 543, 556, 547, 550, - /* 180 */ 561, 554, 531, 538, 545, 553, 568, 560, 581, 587, - /* 190 */ 589, 573, 598, 608, 602, 609, 614, 620, 621, 624, - /* 200 */ 626, 607, 627, 630, 636, 637, 640, 643, 644, 647, - /* 210 */ 650, + /* 0 */ 97, 241, 246, 303, 303, 303, 303, 296, 303, 303, + /* 10 */ 56, 383, 456, 399, 456, 456, 456, 456, 456, 456, + /* 20 */ 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + /* 30 */ 456, 456, 57, 57, 57, 390, 43, 43, 42, 96, + /* 40 */ 0, 13, 13, 390, 150, 150, 150, 96, 54, 755, + /* 50 */ 672, 134, 151, 172, 47, 172, 27, 175, 181, 142, + /* 60 */ 163, 189, 226, 226, 163, 189, 226, 220, 222, 239, + /* 70 */ 242, 254, 297, 300, 264, 314, 248, 259, 260, 96, + /* 80 */ 331, 335, 367, 331, 367, 871, 871, 30, 749, 790, + /* 90 */ 783, 483, 483, 483, 483, 483, 483, 483, 123, 129, + /* 100 */ 85, 34, 34, 34, 34, 159, 173, 209, 224, 231, + /* 110 */ 160, 177, 155, 228, 235, 253, 238, 258, 108, 368, + /* 120 */ 370, 323, 375, 376, 381, 382, 391, 393, 400, 401, + /* 130 */ 404, 402, 426, 405, 410, 407, 411, 356, 415, 419, + /* 140 */ 420, 377, 417, 427, 429, 471, 408, 438, 442, 443, + /* 150 */ 396, 489, 453, 477, 479, 480, 481, 482, 461, 465, + /* 160 */ 478, 516, 521, 522, 523, 485, 488, 493, 500, 502, + /* 170 */ 495, 497, 508, 503, 499, 530, 506, 519, 536, 509, + /* 180 */ 531, 537, 524, 464, 518, 526, 527, 512, 534, 543, + /* 190 */ 556, 561, 547, 572, 574, 577, 578, 581, 584, 588, + /* 200 */ 592, 595, 564, 598, 599, 602, 606, 609, 612, 613, + /* 210 */ 620, 623, }; #define YY_REDUCE_COUNT (86) -#define YY_REDUCE_MIN (-167) -#define YY_REDUCE_MAX (631) +#define YY_REDUCE_MIN (-168) +#define YY_REDUCE_MAX (667) static const short yy_reduce_ofst[] = { - /* 0 */ 137, -4, 17, 57, 79, 106, 127, 210, -93, 292, - /* 10 */ 225, 322, 379, 396, 410, 264, 430, 445, 457, 471, - /* 20 */ 486, 498, 510, 526, 540, 555, 567, 579, 591, 605, - /* 30 */ 617, 629, 78, 625, 631, -129, -115, 41, -151, -119, - /* 40 */ -133, -133, -133, -98, -114, -110, -80, 5, -124, -167, - /* 50 */ -150, -126, -94, -66, -66, -66, 65, 24, 50, 85, - /* 60 */ 70, 96, 165, 170, 138, 143, 174, 156, 160, 171, - /* 70 */ 178, -66, 212, 220, 215, 222, 201, 219, 233, 65, - /* 80 */ 284, 285, 293, 296, 298, 299, 305, + /* 0 */ 71, -5, 16, 46, 68, 89, 110, 164, -94, 252, + /* 10 */ 251, 348, 223, 301, 380, 403, 418, 432, 444, 459, + /* 20 */ 473, 487, 501, 515, 529, 541, 553, 567, 579, 591, + /* 30 */ 605, 619, 633, 639, 667, -130, -116, 31, -152, -120, + /* 40 */ -134, -134, -134, -99, -115, -111, -81, 18, -125, -168, + /* 50 */ -151, -127, -72, -79, -79, -79, 40, 22, 59, 113, + /* 60 */ 103, 114, 165, 179, 143, 158, 195, 167, 169, 180, + /* 70 */ 178, -79, 211, 213, 204, 215, 186, 192, 200, 40, + /* 80 */ 257, 271, 284, 285, 289, 290, 288, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 10 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 20 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 30 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 40 */ 548, 666, 548, 548, 677, 677, 677, 548, 548, 741, - /* 50 */ 548, 701, 693, 669, 683, 670, 548, 726, 686, 548, - /* 60 */ 708, 706, 548, 548, 708, 706, 548, 720, 716, 699, - /* 70 */ 697, 683, 548, 548, 548, 548, 744, 732, 728, 548, - /* 80 */ 548, 548, 553, 548, 553, 603, 554, 548, 548, 548, - /* 90 */ 548, 719, 718, 643, 642, 641, 637, 638, 548, 548, - /* 100 */ 548, 632, 633, 631, 630, 548, 548, 667, 548, 548, - /* 110 */ 548, 729, 733, 548, 620, 548, 548, 548, 690, 700, - /* 120 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 130 */ 548, 548, 548, 620, 548, 717, 548, 676, 672, 548, - /* 140 */ 548, 668, 619, 548, 662, 548, 548, 548, 727, 548, - /* 150 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 160 */ 548, 548, 548, 548, 548, 574, 548, 548, 548, 600, - /* 170 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 180 */ 548, 548, 585, 583, 582, 581, 548, 578, 548, 548, - /* 190 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 200 */ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, - /* 210 */ 548, + /* 0 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 10 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 20 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 30 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 40 */ 550, 669, 550, 550, 680, 680, 680, 550, 550, 744, + /* 50 */ 550, 704, 696, 672, 686, 673, 550, 729, 689, 550, + /* 60 */ 711, 709, 550, 550, 711, 709, 550, 723, 719, 702, + /* 70 */ 700, 686, 550, 550, 550, 550, 747, 735, 731, 550, + /* 80 */ 550, 550, 555, 550, 555, 605, 556, 550, 550, 550, + /* 90 */ 550, 722, 721, 646, 645, 644, 640, 641, 550, 550, + /* 100 */ 550, 635, 636, 634, 633, 550, 550, 670, 550, 550, + /* 110 */ 550, 732, 736, 550, 623, 550, 550, 550, 550, 693, + /* 120 */ 703, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 130 */ 550, 550, 550, 550, 623, 550, 720, 550, 679, 675, + /* 140 */ 550, 550, 671, 622, 550, 665, 550, 550, 550, 730, + /* 150 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 160 */ 550, 550, 550, 550, 550, 550, 576, 550, 550, 550, + /* 170 */ 602, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 180 */ 550, 550, 550, 587, 585, 584, 583, 550, 580, 550, + /* 190 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 200 */ 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + /* 210 */ 550, 550, }; /********** End of lemon-generated parsing tables *****************************/ @@ -645,115 +644,116 @@ static const char *const yyTokenName[] = { /* 67 */ "DECIMAL", /* 68 */ "SHOW", /* 69 */ "DATABASES", - /* 70 */ "NK_FLOAT", - /* 71 */ "NK_BOOL", - /* 72 */ "NK_VARIABLE", - /* 73 */ "BETWEEN", - /* 74 */ "IS", - /* 75 */ "NULL", - /* 76 */ "NK_LT", - /* 77 */ "NK_GT", - /* 78 */ "NK_LE", - /* 79 */ "NK_GE", - /* 80 */ "NK_NE", - /* 81 */ "NK_EQ", - /* 82 */ "LIKE", - /* 83 */ "MATCH", - /* 84 */ "NMATCH", - /* 85 */ "IN", - /* 86 */ "FROM", - /* 87 */ "AS", - /* 88 */ "JOIN", - /* 89 */ "ON", - /* 90 */ "INNER", - /* 91 */ "SELECT", - /* 92 */ "DISTINCT", - /* 93 */ "WHERE", - /* 94 */ "PARTITION", - /* 95 */ "BY", - /* 96 */ "SESSION", - /* 97 */ "STATE_WINDOW", - /* 98 */ "INTERVAL", - /* 99 */ "SLIDING", - /* 100 */ "FILL", - /* 101 */ "VALUE", - /* 102 */ "NONE", - /* 103 */ "PREV", - /* 104 */ "LINEAR", - /* 105 */ "NEXT", - /* 106 */ "GROUP", - /* 107 */ "HAVING", - /* 108 */ "ORDER", - /* 109 */ "SLIMIT", - /* 110 */ "SOFFSET", - /* 111 */ "LIMIT", - /* 112 */ "OFFSET", - /* 113 */ "ASC", - /* 114 */ "DESC", - /* 115 */ "NULLS", - /* 116 */ "FIRST", - /* 117 */ "LAST", - /* 118 */ "cmd", - /* 119 */ "exists_opt", - /* 120 */ "db_name", - /* 121 */ "db_options", - /* 122 */ "full_table_name", - /* 123 */ "column_def_list", - /* 124 */ "table_options", - /* 125 */ "column_def", - /* 126 */ "column_name", - /* 127 */ "type_name", - /* 128 */ "query_expression", - /* 129 */ "literal", - /* 130 */ "duration_literal", - /* 131 */ "literal_list", - /* 132 */ "table_name", - /* 133 */ "function_name", - /* 134 */ "table_alias", - /* 135 */ "column_alias", - /* 136 */ "expression", - /* 137 */ "column_reference", - /* 138 */ "expression_list", - /* 139 */ "subquery", - /* 140 */ "predicate", - /* 141 */ "compare_op", - /* 142 */ "in_op", - /* 143 */ "in_predicate_value", - /* 144 */ "boolean_value_expression", - /* 145 */ "boolean_primary", - /* 146 */ "common_expression", - /* 147 */ "from_clause", - /* 148 */ "table_reference_list", - /* 149 */ "table_reference", - /* 150 */ "table_primary", - /* 151 */ "joined_table", - /* 152 */ "alias_opt", - /* 153 */ "parenthesized_joined_table", - /* 154 */ "join_type", - /* 155 */ "search_condition", - /* 156 */ "query_specification", - /* 157 */ "set_quantifier_opt", - /* 158 */ "select_list", - /* 159 */ "where_clause_opt", - /* 160 */ "partition_by_clause_opt", - /* 161 */ "twindow_clause_opt", - /* 162 */ "group_by_clause_opt", - /* 163 */ "having_clause_opt", - /* 164 */ "select_sublist", - /* 165 */ "select_item", - /* 166 */ "sliding_opt", - /* 167 */ "fill_opt", - /* 168 */ "fill_mode", - /* 169 */ "group_by_list", - /* 170 */ "query_expression_body", - /* 171 */ "order_by_clause_opt", - /* 172 */ "slimit_clause_opt", - /* 173 */ "limit_clause_opt", - /* 174 */ "query_primary", - /* 175 */ "sort_specification_list", - /* 176 */ "sort_specification", - /* 177 */ "ordering_specification_opt", - /* 178 */ "null_ordering_opt", + /* 70 */ "TABLES", + /* 71 */ "NK_FLOAT", + /* 72 */ "NK_BOOL", + /* 73 */ "NK_VARIABLE", + /* 74 */ "BETWEEN", + /* 75 */ "IS", + /* 76 */ "NULL", + /* 77 */ "NK_LT", + /* 78 */ "NK_GT", + /* 79 */ "NK_LE", + /* 80 */ "NK_GE", + /* 81 */ "NK_NE", + /* 82 */ "NK_EQ", + /* 83 */ "LIKE", + /* 84 */ "MATCH", + /* 85 */ "NMATCH", + /* 86 */ "IN", + /* 87 */ "FROM", + /* 88 */ "AS", + /* 89 */ "JOIN", + /* 90 */ "ON", + /* 91 */ "INNER", + /* 92 */ "SELECT", + /* 93 */ "DISTINCT", + /* 94 */ "WHERE", + /* 95 */ "PARTITION", + /* 96 */ "BY", + /* 97 */ "SESSION", + /* 98 */ "STATE_WINDOW", + /* 99 */ "INTERVAL", + /* 100 */ "SLIDING", + /* 101 */ "FILL", + /* 102 */ "VALUE", + /* 103 */ "NONE", + /* 104 */ "PREV", + /* 105 */ "LINEAR", + /* 106 */ "NEXT", + /* 107 */ "GROUP", + /* 108 */ "HAVING", + /* 109 */ "ORDER", + /* 110 */ "SLIMIT", + /* 111 */ "SOFFSET", + /* 112 */ "LIMIT", + /* 113 */ "OFFSET", + /* 114 */ "ASC", + /* 115 */ "DESC", + /* 116 */ "NULLS", + /* 117 */ "FIRST", + /* 118 */ "LAST", + /* 119 */ "cmd", + /* 120 */ "exists_opt", + /* 121 */ "db_name", + /* 122 */ "db_options", + /* 123 */ "full_table_name", + /* 124 */ "column_def_list", + /* 125 */ "table_options", + /* 126 */ "column_def", + /* 127 */ "column_name", + /* 128 */ "type_name", + /* 129 */ "query_expression", + /* 130 */ "literal", + /* 131 */ "duration_literal", + /* 132 */ "literal_list", + /* 133 */ "table_name", + /* 134 */ "function_name", + /* 135 */ "table_alias", + /* 136 */ "column_alias", + /* 137 */ "expression", + /* 138 */ "column_reference", + /* 139 */ "expression_list", + /* 140 */ "subquery", + /* 141 */ "predicate", + /* 142 */ "compare_op", + /* 143 */ "in_op", + /* 144 */ "in_predicate_value", + /* 145 */ "boolean_value_expression", + /* 146 */ "boolean_primary", + /* 147 */ "common_expression", + /* 148 */ "from_clause", + /* 149 */ "table_reference_list", + /* 150 */ "table_reference", + /* 151 */ "table_primary", + /* 152 */ "joined_table", + /* 153 */ "alias_opt", + /* 154 */ "parenthesized_joined_table", + /* 155 */ "join_type", + /* 156 */ "search_condition", + /* 157 */ "query_specification", + /* 158 */ "set_quantifier_opt", + /* 159 */ "select_list", + /* 160 */ "where_clause_opt", + /* 161 */ "partition_by_clause_opt", + /* 162 */ "twindow_clause_opt", + /* 163 */ "group_by_clause_opt", + /* 164 */ "having_clause_opt", + /* 165 */ "select_sublist", + /* 166 */ "select_item", + /* 167 */ "sliding_opt", + /* 168 */ "fill_opt", + /* 169 */ "fill_mode", + /* 170 */ "group_by_list", + /* 171 */ "query_expression_body", + /* 172 */ "order_by_clause_opt", + /* 173 */ "slimit_clause_opt", + /* 174 */ "limit_clause_opt", + /* 175 */ "query_primary", + /* 176 */ "sort_specification_list", + /* 177 */ "sort_specification", + /* 178 */ "ordering_specification_opt", + /* 179 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -818,145 +818,146 @@ static const char *const yyRuleName[] = { /* 54 */ "table_options ::= table_options KEEP NK_INTEGER", /* 55 */ "table_options ::= table_options TTL NK_INTEGER", /* 56 */ "cmd ::= SHOW DATABASES", - /* 57 */ "cmd ::= query_expression", - /* 58 */ "literal ::= NK_INTEGER", - /* 59 */ "literal ::= NK_FLOAT", - /* 60 */ "literal ::= NK_STRING", - /* 61 */ "literal ::= NK_BOOL", - /* 62 */ "literal ::= TIMESTAMP NK_STRING", - /* 63 */ "literal ::= duration_literal", - /* 64 */ "duration_literal ::= NK_VARIABLE", - /* 65 */ "literal_list ::= literal", - /* 66 */ "literal_list ::= literal_list NK_COMMA literal", - /* 67 */ "db_name ::= NK_ID", - /* 68 */ "table_name ::= NK_ID", - /* 69 */ "column_name ::= NK_ID", - /* 70 */ "function_name ::= NK_ID", - /* 71 */ "table_alias ::= NK_ID", - /* 72 */ "column_alias ::= NK_ID", - /* 73 */ "expression ::= literal", - /* 74 */ "expression ::= column_reference", - /* 75 */ "expression ::= function_name NK_LP expression_list NK_RP", - /* 76 */ "expression ::= function_name NK_LP NK_STAR NK_RP", - /* 77 */ "expression ::= subquery", - /* 78 */ "expression ::= NK_LP expression NK_RP", - /* 79 */ "expression ::= NK_PLUS expression", - /* 80 */ "expression ::= NK_MINUS expression", - /* 81 */ "expression ::= expression NK_PLUS expression", - /* 82 */ "expression ::= expression NK_MINUS expression", - /* 83 */ "expression ::= expression NK_STAR expression", - /* 84 */ "expression ::= expression NK_SLASH expression", - /* 85 */ "expression ::= expression NK_REM expression", - /* 86 */ "expression_list ::= expression", - /* 87 */ "expression_list ::= expression_list NK_COMMA expression", - /* 88 */ "column_reference ::= column_name", - /* 89 */ "column_reference ::= table_name NK_DOT column_name", - /* 90 */ "predicate ::= expression compare_op expression", - /* 91 */ "predicate ::= expression BETWEEN expression AND expression", - /* 92 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 93 */ "predicate ::= expression IS NULL", - /* 94 */ "predicate ::= expression IS NOT NULL", - /* 95 */ "predicate ::= expression in_op in_predicate_value", - /* 96 */ "compare_op ::= NK_LT", - /* 97 */ "compare_op ::= NK_GT", - /* 98 */ "compare_op ::= NK_LE", - /* 99 */ "compare_op ::= NK_GE", - /* 100 */ "compare_op ::= NK_NE", - /* 101 */ "compare_op ::= NK_EQ", - /* 102 */ "compare_op ::= LIKE", - /* 103 */ "compare_op ::= NOT LIKE", - /* 104 */ "compare_op ::= MATCH", - /* 105 */ "compare_op ::= NMATCH", - /* 106 */ "in_op ::= IN", - /* 107 */ "in_op ::= NOT IN", - /* 108 */ "in_predicate_value ::= NK_LP expression_list NK_RP", - /* 109 */ "boolean_value_expression ::= boolean_primary", - /* 110 */ "boolean_value_expression ::= NOT boolean_primary", - /* 111 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 112 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 113 */ "boolean_primary ::= predicate", - /* 114 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 115 */ "common_expression ::= expression", - /* 116 */ "common_expression ::= boolean_value_expression", - /* 117 */ "from_clause ::= FROM table_reference_list", - /* 118 */ "table_reference_list ::= table_reference", - /* 119 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 120 */ "table_reference ::= table_primary", - /* 121 */ "table_reference ::= joined_table", - /* 122 */ "table_primary ::= table_name alias_opt", - /* 123 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 124 */ "table_primary ::= subquery alias_opt", - /* 125 */ "table_primary ::= parenthesized_joined_table", - /* 126 */ "alias_opt ::=", - /* 127 */ "alias_opt ::= table_alias", - /* 128 */ "alias_opt ::= AS table_alias", - /* 129 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 130 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 131 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 132 */ "join_type ::=", - /* 133 */ "join_type ::= INNER", - /* 134 */ "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", - /* 135 */ "set_quantifier_opt ::=", - /* 136 */ "set_quantifier_opt ::= DISTINCT", - /* 137 */ "set_quantifier_opt ::= ALL", - /* 138 */ "select_list ::= NK_STAR", - /* 139 */ "select_list ::= select_sublist", - /* 140 */ "select_sublist ::= select_item", - /* 141 */ "select_sublist ::= select_sublist NK_COMMA select_item", - /* 142 */ "select_item ::= common_expression", - /* 143 */ "select_item ::= common_expression column_alias", - /* 144 */ "select_item ::= common_expression AS column_alias", - /* 145 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 146 */ "where_clause_opt ::=", - /* 147 */ "where_clause_opt ::= WHERE search_condition", - /* 148 */ "partition_by_clause_opt ::=", - /* 149 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 150 */ "twindow_clause_opt ::=", - /* 151 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", - /* 152 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", - /* 153 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 154 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 155 */ "sliding_opt ::=", - /* 156 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 157 */ "fill_opt ::=", - /* 158 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 159 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 160 */ "fill_mode ::= NONE", - /* 161 */ "fill_mode ::= PREV", - /* 162 */ "fill_mode ::= NULL", - /* 163 */ "fill_mode ::= LINEAR", - /* 164 */ "fill_mode ::= NEXT", - /* 165 */ "group_by_clause_opt ::=", - /* 166 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 167 */ "group_by_list ::= expression", - /* 168 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 169 */ "having_clause_opt ::=", - /* 170 */ "having_clause_opt ::= HAVING search_condition", - /* 171 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 172 */ "query_expression_body ::= query_primary", - /* 173 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 174 */ "query_primary ::= query_specification", - /* 175 */ "order_by_clause_opt ::=", - /* 176 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 177 */ "slimit_clause_opt ::=", - /* 178 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 179 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 180 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 181 */ "limit_clause_opt ::=", - /* 182 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 183 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 184 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 185 */ "subquery ::= NK_LP query_expression NK_RP", - /* 186 */ "search_condition ::= common_expression", - /* 187 */ "sort_specification_list ::= sort_specification", - /* 188 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 189 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 190 */ "ordering_specification_opt ::=", - /* 191 */ "ordering_specification_opt ::= ASC", - /* 192 */ "ordering_specification_opt ::= DESC", - /* 193 */ "null_ordering_opt ::=", - /* 194 */ "null_ordering_opt ::= NULLS FIRST", - /* 195 */ "null_ordering_opt ::= NULLS LAST", + /* 57 */ "cmd ::= SHOW TABLES", + /* 58 */ "cmd ::= query_expression", + /* 59 */ "literal ::= NK_INTEGER", + /* 60 */ "literal ::= NK_FLOAT", + /* 61 */ "literal ::= NK_STRING", + /* 62 */ "literal ::= NK_BOOL", + /* 63 */ "literal ::= TIMESTAMP NK_STRING", + /* 64 */ "literal ::= duration_literal", + /* 65 */ "duration_literal ::= NK_VARIABLE", + /* 66 */ "literal_list ::= literal", + /* 67 */ "literal_list ::= literal_list NK_COMMA literal", + /* 68 */ "db_name ::= NK_ID", + /* 69 */ "table_name ::= NK_ID", + /* 70 */ "column_name ::= NK_ID", + /* 71 */ "function_name ::= NK_ID", + /* 72 */ "table_alias ::= NK_ID", + /* 73 */ "column_alias ::= NK_ID", + /* 74 */ "expression ::= literal", + /* 75 */ "expression ::= column_reference", + /* 76 */ "expression ::= function_name NK_LP expression_list NK_RP", + /* 77 */ "expression ::= function_name NK_LP NK_STAR NK_RP", + /* 78 */ "expression ::= subquery", + /* 79 */ "expression ::= NK_LP expression NK_RP", + /* 80 */ "expression ::= NK_PLUS expression", + /* 81 */ "expression ::= NK_MINUS expression", + /* 82 */ "expression ::= expression NK_PLUS expression", + /* 83 */ "expression ::= expression NK_MINUS expression", + /* 84 */ "expression ::= expression NK_STAR expression", + /* 85 */ "expression ::= expression NK_SLASH expression", + /* 86 */ "expression ::= expression NK_REM expression", + /* 87 */ "expression_list ::= expression", + /* 88 */ "expression_list ::= expression_list NK_COMMA expression", + /* 89 */ "column_reference ::= column_name", + /* 90 */ "column_reference ::= table_name NK_DOT column_name", + /* 91 */ "predicate ::= expression compare_op expression", + /* 92 */ "predicate ::= expression BETWEEN expression AND expression", + /* 93 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 94 */ "predicate ::= expression IS NULL", + /* 95 */ "predicate ::= expression IS NOT NULL", + /* 96 */ "predicate ::= expression in_op in_predicate_value", + /* 97 */ "compare_op ::= NK_LT", + /* 98 */ "compare_op ::= NK_GT", + /* 99 */ "compare_op ::= NK_LE", + /* 100 */ "compare_op ::= NK_GE", + /* 101 */ "compare_op ::= NK_NE", + /* 102 */ "compare_op ::= NK_EQ", + /* 103 */ "compare_op ::= LIKE", + /* 104 */ "compare_op ::= NOT LIKE", + /* 105 */ "compare_op ::= MATCH", + /* 106 */ "compare_op ::= NMATCH", + /* 107 */ "in_op ::= IN", + /* 108 */ "in_op ::= NOT IN", + /* 109 */ "in_predicate_value ::= NK_LP expression_list NK_RP", + /* 110 */ "boolean_value_expression ::= boolean_primary", + /* 111 */ "boolean_value_expression ::= NOT boolean_primary", + /* 112 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 113 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 114 */ "boolean_primary ::= predicate", + /* 115 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 116 */ "common_expression ::= expression", + /* 117 */ "common_expression ::= boolean_value_expression", + /* 118 */ "from_clause ::= FROM table_reference_list", + /* 119 */ "table_reference_list ::= table_reference", + /* 120 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 121 */ "table_reference ::= table_primary", + /* 122 */ "table_reference ::= joined_table", + /* 123 */ "table_primary ::= table_name alias_opt", + /* 124 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 125 */ "table_primary ::= subquery alias_opt", + /* 126 */ "table_primary ::= parenthesized_joined_table", + /* 127 */ "alias_opt ::=", + /* 128 */ "alias_opt ::= table_alias", + /* 129 */ "alias_opt ::= AS table_alias", + /* 130 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 131 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 132 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 133 */ "join_type ::=", + /* 134 */ "join_type ::= INNER", + /* 135 */ "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", + /* 136 */ "set_quantifier_opt ::=", + /* 137 */ "set_quantifier_opt ::= DISTINCT", + /* 138 */ "set_quantifier_opt ::= ALL", + /* 139 */ "select_list ::= NK_STAR", + /* 140 */ "select_list ::= select_sublist", + /* 141 */ "select_sublist ::= select_item", + /* 142 */ "select_sublist ::= select_sublist NK_COMMA select_item", + /* 143 */ "select_item ::= common_expression", + /* 144 */ "select_item ::= common_expression column_alias", + /* 145 */ "select_item ::= common_expression AS column_alias", + /* 146 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 147 */ "where_clause_opt ::=", + /* 148 */ "where_clause_opt ::= WHERE search_condition", + /* 149 */ "partition_by_clause_opt ::=", + /* 150 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 151 */ "twindow_clause_opt ::=", + /* 152 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP", + /* 153 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP", + /* 154 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 155 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 156 */ "sliding_opt ::=", + /* 157 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 158 */ "fill_opt ::=", + /* 159 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 160 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 161 */ "fill_mode ::= NONE", + /* 162 */ "fill_mode ::= PREV", + /* 163 */ "fill_mode ::= NULL", + /* 164 */ "fill_mode ::= LINEAR", + /* 165 */ "fill_mode ::= NEXT", + /* 166 */ "group_by_clause_opt ::=", + /* 167 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 168 */ "group_by_list ::= expression", + /* 169 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 170 */ "having_clause_opt ::=", + /* 171 */ "having_clause_opt ::= HAVING search_condition", + /* 172 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 173 */ "query_expression_body ::= query_primary", + /* 174 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 175 */ "query_primary ::= query_specification", + /* 176 */ "order_by_clause_opt ::=", + /* 177 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 178 */ "slimit_clause_opt ::=", + /* 179 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 180 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 181 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 182 */ "limit_clause_opt ::=", + /* 183 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 184 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 185 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 186 */ "subquery ::= NK_LP query_expression NK_RP", + /* 187 */ "search_condition ::= common_expression", + /* 188 */ "sort_specification_list ::= sort_specification", + /* 189 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 190 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 191 */ "ordering_specification_opt ::=", + /* 192 */ "ordering_specification_opt ::= ASC", + /* 193 */ "ordering_specification_opt ::= DESC", + /* 194 */ "null_ordering_opt ::=", + /* 195 */ "null_ordering_opt ::= NULLS FIRST", + /* 196 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -1083,119 +1084,119 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 118: /* cmd */ - case 119: /* exists_opt */ - case 125: /* column_def */ - case 128: /* query_expression */ - case 129: /* literal */ - case 130: /* duration_literal */ - case 136: /* expression */ - case 137: /* column_reference */ - case 139: /* subquery */ - case 140: /* predicate */ - case 143: /* in_predicate_value */ - case 144: /* boolean_value_expression */ - case 145: /* boolean_primary */ - case 146: /* common_expression */ - case 147: /* from_clause */ - case 148: /* table_reference_list */ - case 149: /* table_reference */ - case 150: /* table_primary */ - case 151: /* joined_table */ - case 153: /* parenthesized_joined_table */ - case 155: /* search_condition */ - case 156: /* query_specification */ - case 159: /* where_clause_opt */ - case 161: /* twindow_clause_opt */ - case 163: /* having_clause_opt */ - case 165: /* select_item */ - case 166: /* sliding_opt */ - case 167: /* fill_opt */ - case 170: /* query_expression_body */ - case 172: /* slimit_clause_opt */ - case 173: /* limit_clause_opt */ - case 174: /* query_primary */ - case 176: /* sort_specification */ + case 119: /* cmd */ + case 120: /* exists_opt */ + case 126: /* column_def */ + case 129: /* query_expression */ + case 130: /* literal */ + case 131: /* duration_literal */ + case 137: /* expression */ + case 138: /* column_reference */ + case 140: /* subquery */ + case 141: /* predicate */ + case 144: /* in_predicate_value */ + case 145: /* boolean_value_expression */ + case 146: /* boolean_primary */ + case 147: /* common_expression */ + case 148: /* from_clause */ + case 149: /* table_reference_list */ + case 150: /* table_reference */ + case 151: /* table_primary */ + case 152: /* joined_table */ + case 154: /* parenthesized_joined_table */ + case 156: /* search_condition */ + case 157: /* query_specification */ + case 160: /* where_clause_opt */ + case 162: /* twindow_clause_opt */ + case 164: /* having_clause_opt */ + case 166: /* select_item */ + case 167: /* sliding_opt */ + case 168: /* fill_opt */ + case 171: /* query_expression_body */ + case 173: /* slimit_clause_opt */ + case 174: /* limit_clause_opt */ + case 175: /* query_primary */ + case 177: /* sort_specification */ { - PARSER_DESTRUCTOR_TRACE; nodesDestroyNode((yypminor->yy172)); + PARSER_DESTRUCTOR_TRACE; nodesDestroyNode((yypminor->yy272)); } break; - case 120: /* db_name */ - case 126: /* column_name */ - case 132: /* table_name */ - case 133: /* function_name */ - case 134: /* table_alias */ - case 135: /* column_alias */ - case 152: /* alias_opt */ + case 121: /* db_name */ + case 127: /* column_name */ + case 133: /* table_name */ + case 134: /* function_name */ + case 135: /* table_alias */ + case 136: /* column_alias */ + case 153: /* alias_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 121: /* db_options */ + case 122: /* db_options */ { - tfree((yypminor->yy27)); + tfree((yypminor->yy199)); } break; - case 122: /* full_table_name */ + case 123: /* full_table_name */ { } break; - case 123: /* column_def_list */ + case 124: /* column_def_list */ { - nodesDestroyList((yypminor->yy60)); + nodesDestroyList((yypminor->yy64)); } break; - case 124: /* table_options */ + case 125: /* table_options */ { - tfree((yypminor->yy40)); + tfree((yypminor->yy46)); } break; - case 127: /* type_name */ + case 128: /* type_name */ { } break; - case 131: /* literal_list */ - case 138: /* expression_list */ - case 158: /* select_list */ - case 160: /* partition_by_clause_opt */ - case 162: /* group_by_clause_opt */ - case 164: /* select_sublist */ - case 169: /* group_by_list */ - case 171: /* order_by_clause_opt */ - case 175: /* sort_specification_list */ + case 132: /* literal_list */ + case 139: /* expression_list */ + case 159: /* select_list */ + case 161: /* partition_by_clause_opt */ + case 163: /* group_by_clause_opt */ + case 165: /* select_sublist */ + case 170: /* group_by_list */ + case 172: /* order_by_clause_opt */ + case 176: /* sort_specification_list */ { - PARSER_DESTRUCTOR_TRACE; nodesDestroyList((yypminor->yy60)); + PARSER_DESTRUCTOR_TRACE; nodesDestroyList((yypminor->yy64)); } break; - case 141: /* compare_op */ - case 142: /* in_op */ + case 142: /* compare_op */ + case 143: /* in_op */ { PARSER_DESTRUCTOR_TRACE; } break; - case 154: /* join_type */ + case 155: /* join_type */ { PARSER_DESTRUCTOR_TRACE; } break; - case 157: /* set_quantifier_opt */ + case 158: /* set_quantifier_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 168: /* fill_mode */ + case 169: /* fill_mode */ { PARSER_DESTRUCTOR_TRACE; } break; - case 177: /* ordering_specification_opt */ + case 178: /* ordering_specification_opt */ { PARSER_DESTRUCTOR_TRACE; } break; - case 178: /* null_ordering_opt */ + case 179: /* null_ordering_opt */ { PARSER_DESTRUCTOR_TRACE; } @@ -1494,202 +1495,203 @@ 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[] = { - { 118, -5 }, /* (0) cmd ::= CREATE DATABASE exists_opt db_name db_options */ - { 119, -3 }, /* (1) exists_opt ::= IF NOT EXISTS */ - { 119, 0 }, /* (2) exists_opt ::= */ - { 121, 0 }, /* (3) db_options ::= */ - { 121, -3 }, /* (4) db_options ::= db_options BLOCKS NK_INTEGER */ - { 121, -3 }, /* (5) db_options ::= db_options CACHE NK_INTEGER */ - { 121, -3 }, /* (6) db_options ::= db_options CACHELAST NK_INTEGER */ - { 121, -3 }, /* (7) db_options ::= db_options COMP NK_INTEGER */ - { 121, -3 }, /* (8) db_options ::= db_options DAYS NK_INTEGER */ - { 121, -3 }, /* (9) db_options ::= db_options FSYNC NK_INTEGER */ - { 121, -3 }, /* (10) db_options ::= db_options MAXROWS NK_INTEGER */ - { 121, -3 }, /* (11) db_options ::= db_options MINROWS NK_INTEGER */ - { 121, -3 }, /* (12) db_options ::= db_options KEEP NK_INTEGER */ - { 121, -3 }, /* (13) db_options ::= db_options PRECISION NK_STRING */ - { 121, -3 }, /* (14) db_options ::= db_options QUORUM NK_INTEGER */ - { 121, -3 }, /* (15) db_options ::= db_options REPLICA NK_INTEGER */ - { 121, -3 }, /* (16) db_options ::= db_options TTL NK_INTEGER */ - { 121, -3 }, /* (17) db_options ::= db_options WAL NK_INTEGER */ - { 121, -3 }, /* (18) db_options ::= db_options VGROUPS NK_INTEGER */ - { 121, -3 }, /* (19) db_options ::= db_options SINGLESTABLE NK_INTEGER */ - { 121, -3 }, /* (20) db_options ::= db_options STREAMMODE NK_INTEGER */ - { 118, -2 }, /* (21) cmd ::= USE db_name */ - { 118, -8 }, /* (22) cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options */ - { 122, -1 }, /* (23) full_table_name ::= NK_ID */ - { 122, -3 }, /* (24) full_table_name ::= NK_ID NK_DOT NK_ID */ - { 123, -1 }, /* (25) column_def_list ::= column_def */ - { 123, -3 }, /* (26) column_def_list ::= column_def_list NK_COMMA column_def */ - { 125, -2 }, /* (27) column_def ::= column_name type_name */ - { 125, -4 }, /* (28) column_def ::= column_name type_name COMMENT NK_STRING */ - { 127, -1 }, /* (29) type_name ::= BOOL */ - { 127, -1 }, /* (30) type_name ::= TINYINT */ - { 127, -1 }, /* (31) type_name ::= SMALLINT */ - { 127, -1 }, /* (32) type_name ::= INT */ - { 127, -1 }, /* (33) type_name ::= INTEGER */ - { 127, -1 }, /* (34) type_name ::= BIGINT */ - { 127, -1 }, /* (35) type_name ::= FLOAT */ - { 127, -1 }, /* (36) type_name ::= DOUBLE */ - { 127, -4 }, /* (37) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 127, -1 }, /* (38) type_name ::= TIMESTAMP */ - { 127, -4 }, /* (39) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 127, -2 }, /* (40) type_name ::= TINYINT UNSIGNED */ - { 127, -2 }, /* (41) type_name ::= SMALLINT UNSIGNED */ - { 127, -2 }, /* (42) type_name ::= INT UNSIGNED */ - { 127, -2 }, /* (43) type_name ::= BIGINT UNSIGNED */ - { 127, -1 }, /* (44) type_name ::= JSON */ - { 127, -4 }, /* (45) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 127, -1 }, /* (46) type_name ::= MEDIUMBLOB */ - { 127, -1 }, /* (47) type_name ::= BLOB */ - { 127, -4 }, /* (48) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 127, -1 }, /* (49) type_name ::= DECIMAL */ - { 127, -4 }, /* (50) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 127, -6 }, /* (51) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 124, 0 }, /* (52) table_options ::= */ - { 124, -3 }, /* (53) table_options ::= table_options COMMENT NK_INTEGER */ - { 124, -3 }, /* (54) table_options ::= table_options KEEP NK_INTEGER */ - { 124, -3 }, /* (55) table_options ::= table_options TTL NK_INTEGER */ - { 118, -2 }, /* (56) cmd ::= SHOW DATABASES */ - { 118, -1 }, /* (57) cmd ::= query_expression */ - { 129, -1 }, /* (58) literal ::= NK_INTEGER */ - { 129, -1 }, /* (59) literal ::= NK_FLOAT */ - { 129, -1 }, /* (60) literal ::= NK_STRING */ - { 129, -1 }, /* (61) literal ::= NK_BOOL */ - { 129, -2 }, /* (62) literal ::= TIMESTAMP NK_STRING */ - { 129, -1 }, /* (63) literal ::= duration_literal */ - { 130, -1 }, /* (64) duration_literal ::= NK_VARIABLE */ - { 131, -1 }, /* (65) literal_list ::= literal */ - { 131, -3 }, /* (66) literal_list ::= literal_list NK_COMMA literal */ - { 120, -1 }, /* (67) db_name ::= NK_ID */ - { 132, -1 }, /* (68) table_name ::= NK_ID */ - { 126, -1 }, /* (69) column_name ::= NK_ID */ - { 133, -1 }, /* (70) function_name ::= NK_ID */ - { 134, -1 }, /* (71) table_alias ::= NK_ID */ - { 135, -1 }, /* (72) column_alias ::= NK_ID */ - { 136, -1 }, /* (73) expression ::= literal */ - { 136, -1 }, /* (74) expression ::= column_reference */ - { 136, -4 }, /* (75) expression ::= function_name NK_LP expression_list NK_RP */ - { 136, -4 }, /* (76) expression ::= function_name NK_LP NK_STAR NK_RP */ - { 136, -1 }, /* (77) expression ::= subquery */ - { 136, -3 }, /* (78) expression ::= NK_LP expression NK_RP */ - { 136, -2 }, /* (79) expression ::= NK_PLUS expression */ - { 136, -2 }, /* (80) expression ::= NK_MINUS expression */ - { 136, -3 }, /* (81) expression ::= expression NK_PLUS expression */ - { 136, -3 }, /* (82) expression ::= expression NK_MINUS expression */ - { 136, -3 }, /* (83) expression ::= expression NK_STAR expression */ - { 136, -3 }, /* (84) expression ::= expression NK_SLASH expression */ - { 136, -3 }, /* (85) expression ::= expression NK_REM expression */ - { 138, -1 }, /* (86) expression_list ::= expression */ - { 138, -3 }, /* (87) expression_list ::= expression_list NK_COMMA expression */ - { 137, -1 }, /* (88) column_reference ::= column_name */ - { 137, -3 }, /* (89) column_reference ::= table_name NK_DOT column_name */ - { 140, -3 }, /* (90) predicate ::= expression compare_op expression */ - { 140, -5 }, /* (91) predicate ::= expression BETWEEN expression AND expression */ - { 140, -6 }, /* (92) predicate ::= expression NOT BETWEEN expression AND expression */ - { 140, -3 }, /* (93) predicate ::= expression IS NULL */ - { 140, -4 }, /* (94) predicate ::= expression IS NOT NULL */ - { 140, -3 }, /* (95) predicate ::= expression in_op in_predicate_value */ - { 141, -1 }, /* (96) compare_op ::= NK_LT */ - { 141, -1 }, /* (97) compare_op ::= NK_GT */ - { 141, -1 }, /* (98) compare_op ::= NK_LE */ - { 141, -1 }, /* (99) compare_op ::= NK_GE */ - { 141, -1 }, /* (100) compare_op ::= NK_NE */ - { 141, -1 }, /* (101) compare_op ::= NK_EQ */ - { 141, -1 }, /* (102) compare_op ::= LIKE */ - { 141, -2 }, /* (103) compare_op ::= NOT LIKE */ - { 141, -1 }, /* (104) compare_op ::= MATCH */ - { 141, -1 }, /* (105) compare_op ::= NMATCH */ - { 142, -1 }, /* (106) in_op ::= IN */ - { 142, -2 }, /* (107) in_op ::= NOT IN */ - { 143, -3 }, /* (108) in_predicate_value ::= NK_LP expression_list NK_RP */ - { 144, -1 }, /* (109) boolean_value_expression ::= boolean_primary */ - { 144, -2 }, /* (110) boolean_value_expression ::= NOT boolean_primary */ - { 144, -3 }, /* (111) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 144, -3 }, /* (112) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 145, -1 }, /* (113) boolean_primary ::= predicate */ - { 145, -3 }, /* (114) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 146, -1 }, /* (115) common_expression ::= expression */ - { 146, -1 }, /* (116) common_expression ::= boolean_value_expression */ - { 147, -2 }, /* (117) from_clause ::= FROM table_reference_list */ - { 148, -1 }, /* (118) table_reference_list ::= table_reference */ - { 148, -3 }, /* (119) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 149, -1 }, /* (120) table_reference ::= table_primary */ - { 149, -1 }, /* (121) table_reference ::= joined_table */ - { 150, -2 }, /* (122) table_primary ::= table_name alias_opt */ - { 150, -4 }, /* (123) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 150, -2 }, /* (124) table_primary ::= subquery alias_opt */ - { 150, -1 }, /* (125) table_primary ::= parenthesized_joined_table */ - { 152, 0 }, /* (126) alias_opt ::= */ - { 152, -1 }, /* (127) alias_opt ::= table_alias */ - { 152, -2 }, /* (128) alias_opt ::= AS table_alias */ - { 153, -3 }, /* (129) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 153, -3 }, /* (130) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 151, -6 }, /* (131) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 154, 0 }, /* (132) join_type ::= */ - { 154, -1 }, /* (133) join_type ::= INNER */ - { 156, -9 }, /* (134) 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 */ - { 157, 0 }, /* (135) set_quantifier_opt ::= */ - { 157, -1 }, /* (136) set_quantifier_opt ::= DISTINCT */ - { 157, -1 }, /* (137) set_quantifier_opt ::= ALL */ - { 158, -1 }, /* (138) select_list ::= NK_STAR */ - { 158, -1 }, /* (139) select_list ::= select_sublist */ - { 164, -1 }, /* (140) select_sublist ::= select_item */ - { 164, -3 }, /* (141) select_sublist ::= select_sublist NK_COMMA select_item */ - { 165, -1 }, /* (142) select_item ::= common_expression */ - { 165, -2 }, /* (143) select_item ::= common_expression column_alias */ - { 165, -3 }, /* (144) select_item ::= common_expression AS column_alias */ - { 165, -3 }, /* (145) select_item ::= table_name NK_DOT NK_STAR */ - { 159, 0 }, /* (146) where_clause_opt ::= */ - { 159, -2 }, /* (147) where_clause_opt ::= WHERE search_condition */ - { 160, 0 }, /* (148) partition_by_clause_opt ::= */ - { 160, -3 }, /* (149) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 161, 0 }, /* (150) twindow_clause_opt ::= */ - { 161, -6 }, /* (151) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ - { 161, -4 }, /* (152) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ - { 161, -6 }, /* (153) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 161, -8 }, /* (154) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 166, 0 }, /* (155) sliding_opt ::= */ - { 166, -4 }, /* (156) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 167, 0 }, /* (157) fill_opt ::= */ - { 167, -4 }, /* (158) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 167, -6 }, /* (159) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 168, -1 }, /* (160) fill_mode ::= NONE */ - { 168, -1 }, /* (161) fill_mode ::= PREV */ - { 168, -1 }, /* (162) fill_mode ::= NULL */ - { 168, -1 }, /* (163) fill_mode ::= LINEAR */ - { 168, -1 }, /* (164) fill_mode ::= NEXT */ - { 162, 0 }, /* (165) group_by_clause_opt ::= */ - { 162, -3 }, /* (166) group_by_clause_opt ::= GROUP BY group_by_list */ - { 169, -1 }, /* (167) group_by_list ::= expression */ - { 169, -3 }, /* (168) group_by_list ::= group_by_list NK_COMMA expression */ - { 163, 0 }, /* (169) having_clause_opt ::= */ - { 163, -2 }, /* (170) having_clause_opt ::= HAVING search_condition */ - { 128, -4 }, /* (171) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 170, -1 }, /* (172) query_expression_body ::= query_primary */ - { 170, -4 }, /* (173) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 174, -1 }, /* (174) query_primary ::= query_specification */ - { 171, 0 }, /* (175) order_by_clause_opt ::= */ - { 171, -3 }, /* (176) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 172, 0 }, /* (177) slimit_clause_opt ::= */ - { 172, -2 }, /* (178) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 172, -4 }, /* (179) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 172, -4 }, /* (180) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 173, 0 }, /* (181) limit_clause_opt ::= */ - { 173, -2 }, /* (182) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 173, -4 }, /* (183) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 173, -4 }, /* (184) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 139, -3 }, /* (185) subquery ::= NK_LP query_expression NK_RP */ - { 155, -1 }, /* (186) search_condition ::= common_expression */ - { 175, -1 }, /* (187) sort_specification_list ::= sort_specification */ - { 175, -3 }, /* (188) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 176, -3 }, /* (189) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 177, 0 }, /* (190) ordering_specification_opt ::= */ - { 177, -1 }, /* (191) ordering_specification_opt ::= ASC */ - { 177, -1 }, /* (192) ordering_specification_opt ::= DESC */ - { 178, 0 }, /* (193) null_ordering_opt ::= */ - { 178, -2 }, /* (194) null_ordering_opt ::= NULLS FIRST */ - { 178, -2 }, /* (195) null_ordering_opt ::= NULLS LAST */ + { 119, -5 }, /* (0) cmd ::= CREATE DATABASE exists_opt db_name db_options */ + { 120, -3 }, /* (1) exists_opt ::= IF NOT EXISTS */ + { 120, 0 }, /* (2) exists_opt ::= */ + { 122, 0 }, /* (3) db_options ::= */ + { 122, -3 }, /* (4) db_options ::= db_options BLOCKS NK_INTEGER */ + { 122, -3 }, /* (5) db_options ::= db_options CACHE NK_INTEGER */ + { 122, -3 }, /* (6) db_options ::= db_options CACHELAST NK_INTEGER */ + { 122, -3 }, /* (7) db_options ::= db_options COMP NK_INTEGER */ + { 122, -3 }, /* (8) db_options ::= db_options DAYS NK_INTEGER */ + { 122, -3 }, /* (9) db_options ::= db_options FSYNC NK_INTEGER */ + { 122, -3 }, /* (10) db_options ::= db_options MAXROWS NK_INTEGER */ + { 122, -3 }, /* (11) db_options ::= db_options MINROWS NK_INTEGER */ + { 122, -3 }, /* (12) db_options ::= db_options KEEP NK_INTEGER */ + { 122, -3 }, /* (13) db_options ::= db_options PRECISION NK_STRING */ + { 122, -3 }, /* (14) db_options ::= db_options QUORUM NK_INTEGER */ + { 122, -3 }, /* (15) db_options ::= db_options REPLICA NK_INTEGER */ + { 122, -3 }, /* (16) db_options ::= db_options TTL NK_INTEGER */ + { 122, -3 }, /* (17) db_options ::= db_options WAL NK_INTEGER */ + { 122, -3 }, /* (18) db_options ::= db_options VGROUPS NK_INTEGER */ + { 122, -3 }, /* (19) db_options ::= db_options SINGLESTABLE NK_INTEGER */ + { 122, -3 }, /* (20) db_options ::= db_options STREAMMODE NK_INTEGER */ + { 119, -2 }, /* (21) cmd ::= USE db_name */ + { 119, -8 }, /* (22) cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options */ + { 123, -1 }, /* (23) full_table_name ::= NK_ID */ + { 123, -3 }, /* (24) full_table_name ::= NK_ID NK_DOT NK_ID */ + { 124, -1 }, /* (25) column_def_list ::= column_def */ + { 124, -3 }, /* (26) column_def_list ::= column_def_list NK_COMMA column_def */ + { 126, -2 }, /* (27) column_def ::= column_name type_name */ + { 126, -4 }, /* (28) column_def ::= column_name type_name COMMENT NK_STRING */ + { 128, -1 }, /* (29) type_name ::= BOOL */ + { 128, -1 }, /* (30) type_name ::= TINYINT */ + { 128, -1 }, /* (31) type_name ::= SMALLINT */ + { 128, -1 }, /* (32) type_name ::= INT */ + { 128, -1 }, /* (33) type_name ::= INTEGER */ + { 128, -1 }, /* (34) type_name ::= BIGINT */ + { 128, -1 }, /* (35) type_name ::= FLOAT */ + { 128, -1 }, /* (36) type_name ::= DOUBLE */ + { 128, -4 }, /* (37) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 128, -1 }, /* (38) type_name ::= TIMESTAMP */ + { 128, -4 }, /* (39) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 128, -2 }, /* (40) type_name ::= TINYINT UNSIGNED */ + { 128, -2 }, /* (41) type_name ::= SMALLINT UNSIGNED */ + { 128, -2 }, /* (42) type_name ::= INT UNSIGNED */ + { 128, -2 }, /* (43) type_name ::= BIGINT UNSIGNED */ + { 128, -1 }, /* (44) type_name ::= JSON */ + { 128, -4 }, /* (45) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 128, -1 }, /* (46) type_name ::= MEDIUMBLOB */ + { 128, -1 }, /* (47) type_name ::= BLOB */ + { 128, -4 }, /* (48) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 128, -1 }, /* (49) type_name ::= DECIMAL */ + { 128, -4 }, /* (50) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 128, -6 }, /* (51) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 125, 0 }, /* (52) table_options ::= */ + { 125, -3 }, /* (53) table_options ::= table_options COMMENT NK_INTEGER */ + { 125, -3 }, /* (54) table_options ::= table_options KEEP NK_INTEGER */ + { 125, -3 }, /* (55) table_options ::= table_options TTL NK_INTEGER */ + { 119, -2 }, /* (56) cmd ::= SHOW DATABASES */ + { 119, -2 }, /* (57) cmd ::= SHOW TABLES */ + { 119, -1 }, /* (58) cmd ::= query_expression */ + { 130, -1 }, /* (59) literal ::= NK_INTEGER */ + { 130, -1 }, /* (60) literal ::= NK_FLOAT */ + { 130, -1 }, /* (61) literal ::= NK_STRING */ + { 130, -1 }, /* (62) literal ::= NK_BOOL */ + { 130, -2 }, /* (63) literal ::= TIMESTAMP NK_STRING */ + { 130, -1 }, /* (64) literal ::= duration_literal */ + { 131, -1 }, /* (65) duration_literal ::= NK_VARIABLE */ + { 132, -1 }, /* (66) literal_list ::= literal */ + { 132, -3 }, /* (67) literal_list ::= literal_list NK_COMMA literal */ + { 121, -1 }, /* (68) db_name ::= NK_ID */ + { 133, -1 }, /* (69) table_name ::= NK_ID */ + { 127, -1 }, /* (70) column_name ::= NK_ID */ + { 134, -1 }, /* (71) function_name ::= NK_ID */ + { 135, -1 }, /* (72) table_alias ::= NK_ID */ + { 136, -1 }, /* (73) column_alias ::= NK_ID */ + { 137, -1 }, /* (74) expression ::= literal */ + { 137, -1 }, /* (75) expression ::= column_reference */ + { 137, -4 }, /* (76) expression ::= function_name NK_LP expression_list NK_RP */ + { 137, -4 }, /* (77) expression ::= function_name NK_LP NK_STAR NK_RP */ + { 137, -1 }, /* (78) expression ::= subquery */ + { 137, -3 }, /* (79) expression ::= NK_LP expression NK_RP */ + { 137, -2 }, /* (80) expression ::= NK_PLUS expression */ + { 137, -2 }, /* (81) expression ::= NK_MINUS expression */ + { 137, -3 }, /* (82) expression ::= expression NK_PLUS expression */ + { 137, -3 }, /* (83) expression ::= expression NK_MINUS expression */ + { 137, -3 }, /* (84) expression ::= expression NK_STAR expression */ + { 137, -3 }, /* (85) expression ::= expression NK_SLASH expression */ + { 137, -3 }, /* (86) expression ::= expression NK_REM expression */ + { 139, -1 }, /* (87) expression_list ::= expression */ + { 139, -3 }, /* (88) expression_list ::= expression_list NK_COMMA expression */ + { 138, -1 }, /* (89) column_reference ::= column_name */ + { 138, -3 }, /* (90) column_reference ::= table_name NK_DOT column_name */ + { 141, -3 }, /* (91) predicate ::= expression compare_op expression */ + { 141, -5 }, /* (92) predicate ::= expression BETWEEN expression AND expression */ + { 141, -6 }, /* (93) predicate ::= expression NOT BETWEEN expression AND expression */ + { 141, -3 }, /* (94) predicate ::= expression IS NULL */ + { 141, -4 }, /* (95) predicate ::= expression IS NOT NULL */ + { 141, -3 }, /* (96) predicate ::= expression in_op in_predicate_value */ + { 142, -1 }, /* (97) compare_op ::= NK_LT */ + { 142, -1 }, /* (98) compare_op ::= NK_GT */ + { 142, -1 }, /* (99) compare_op ::= NK_LE */ + { 142, -1 }, /* (100) compare_op ::= NK_GE */ + { 142, -1 }, /* (101) compare_op ::= NK_NE */ + { 142, -1 }, /* (102) compare_op ::= NK_EQ */ + { 142, -1 }, /* (103) compare_op ::= LIKE */ + { 142, -2 }, /* (104) compare_op ::= NOT LIKE */ + { 142, -1 }, /* (105) compare_op ::= MATCH */ + { 142, -1 }, /* (106) compare_op ::= NMATCH */ + { 143, -1 }, /* (107) in_op ::= IN */ + { 143, -2 }, /* (108) in_op ::= NOT IN */ + { 144, -3 }, /* (109) in_predicate_value ::= NK_LP expression_list NK_RP */ + { 145, -1 }, /* (110) boolean_value_expression ::= boolean_primary */ + { 145, -2 }, /* (111) boolean_value_expression ::= NOT boolean_primary */ + { 145, -3 }, /* (112) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 145, -3 }, /* (113) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 146, -1 }, /* (114) boolean_primary ::= predicate */ + { 146, -3 }, /* (115) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 147, -1 }, /* (116) common_expression ::= expression */ + { 147, -1 }, /* (117) common_expression ::= boolean_value_expression */ + { 148, -2 }, /* (118) from_clause ::= FROM table_reference_list */ + { 149, -1 }, /* (119) table_reference_list ::= table_reference */ + { 149, -3 }, /* (120) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 150, -1 }, /* (121) table_reference ::= table_primary */ + { 150, -1 }, /* (122) table_reference ::= joined_table */ + { 151, -2 }, /* (123) table_primary ::= table_name alias_opt */ + { 151, -4 }, /* (124) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 151, -2 }, /* (125) table_primary ::= subquery alias_opt */ + { 151, -1 }, /* (126) table_primary ::= parenthesized_joined_table */ + { 153, 0 }, /* (127) alias_opt ::= */ + { 153, -1 }, /* (128) alias_opt ::= table_alias */ + { 153, -2 }, /* (129) alias_opt ::= AS table_alias */ + { 154, -3 }, /* (130) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 154, -3 }, /* (131) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 152, -6 }, /* (132) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 155, 0 }, /* (133) join_type ::= */ + { 155, -1 }, /* (134) join_type ::= INNER */ + { 157, -9 }, /* (135) 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 */ + { 158, 0 }, /* (136) set_quantifier_opt ::= */ + { 158, -1 }, /* (137) set_quantifier_opt ::= DISTINCT */ + { 158, -1 }, /* (138) set_quantifier_opt ::= ALL */ + { 159, -1 }, /* (139) select_list ::= NK_STAR */ + { 159, -1 }, /* (140) select_list ::= select_sublist */ + { 165, -1 }, /* (141) select_sublist ::= select_item */ + { 165, -3 }, /* (142) select_sublist ::= select_sublist NK_COMMA select_item */ + { 166, -1 }, /* (143) select_item ::= common_expression */ + { 166, -2 }, /* (144) select_item ::= common_expression column_alias */ + { 166, -3 }, /* (145) select_item ::= common_expression AS column_alias */ + { 166, -3 }, /* (146) select_item ::= table_name NK_DOT NK_STAR */ + { 160, 0 }, /* (147) where_clause_opt ::= */ + { 160, -2 }, /* (148) where_clause_opt ::= WHERE search_condition */ + { 161, 0 }, /* (149) partition_by_clause_opt ::= */ + { 161, -3 }, /* (150) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 162, 0 }, /* (151) twindow_clause_opt ::= */ + { 162, -6 }, /* (152) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ + { 162, -4 }, /* (153) twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ + { 162, -6 }, /* (154) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 162, -8 }, /* (155) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 167, 0 }, /* (156) sliding_opt ::= */ + { 167, -4 }, /* (157) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 168, 0 }, /* (158) fill_opt ::= */ + { 168, -4 }, /* (159) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 168, -6 }, /* (160) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 169, -1 }, /* (161) fill_mode ::= NONE */ + { 169, -1 }, /* (162) fill_mode ::= PREV */ + { 169, -1 }, /* (163) fill_mode ::= NULL */ + { 169, -1 }, /* (164) fill_mode ::= LINEAR */ + { 169, -1 }, /* (165) fill_mode ::= NEXT */ + { 163, 0 }, /* (166) group_by_clause_opt ::= */ + { 163, -3 }, /* (167) group_by_clause_opt ::= GROUP BY group_by_list */ + { 170, -1 }, /* (168) group_by_list ::= expression */ + { 170, -3 }, /* (169) group_by_list ::= group_by_list NK_COMMA expression */ + { 164, 0 }, /* (170) having_clause_opt ::= */ + { 164, -2 }, /* (171) having_clause_opt ::= HAVING search_condition */ + { 129, -4 }, /* (172) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 171, -1 }, /* (173) query_expression_body ::= query_primary */ + { 171, -4 }, /* (174) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 175, -1 }, /* (175) query_primary ::= query_specification */ + { 172, 0 }, /* (176) order_by_clause_opt ::= */ + { 172, -3 }, /* (177) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 173, 0 }, /* (178) slimit_clause_opt ::= */ + { 173, -2 }, /* (179) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 173, -4 }, /* (180) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 173, -4 }, /* (181) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 174, 0 }, /* (182) limit_clause_opt ::= */ + { 174, -2 }, /* (183) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 174, -4 }, /* (184) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 174, -4 }, /* (185) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 140, -3 }, /* (186) subquery ::= NK_LP query_expression NK_RP */ + { 156, -1 }, /* (187) search_condition ::= common_expression */ + { 176, -1 }, /* (188) sort_specification_list ::= sort_specification */ + { 176, -3 }, /* (189) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 177, -3 }, /* (190) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 178, 0 }, /* (191) ordering_specification_opt ::= */ + { 178, -1 }, /* (192) ordering_specification_opt ::= ASC */ + { 178, -1 }, /* (193) ordering_specification_opt ::= DESC */ + { 179, 0 }, /* (194) null_ordering_opt ::= */ + { 179, -2 }, /* (195) null_ordering_opt ::= NULLS FIRST */ + { 179, -2 }, /* (196) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1777,677 +1779,680 @@ static YYACTIONTYPE yy_reduce( /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE DATABASE exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy259, &yymsp[-1].minor.yy105, yymsp[0].minor.yy27);} +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy137, &yymsp[-1].minor.yy209, yymsp[0].minor.yy199);} break; case 1: /* exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy259 = true; } +{ yymsp[-2].minor.yy137 = true; } break; case 2: /* exists_opt ::= */ -{ yymsp[1].minor.yy259 = false; } +{ yymsp[1].minor.yy137 = false; } break; case 3: /* db_options ::= */ -{ yymsp[1].minor.yy27 = createDefaultDatabaseOptions(pCxt); } +{ yymsp[1].minor.yy199 = createDefaultDatabaseOptions(pCxt); } break; case 4: /* db_options ::= db_options BLOCKS NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_BLOCKS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 5: /* db_options ::= db_options CACHE NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_CACHE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 6: /* db_options ::= db_options CACHELAST NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_CACHELAST, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 7: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 8: /* db_options ::= db_options DAYS NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 9: /* db_options ::= db_options FSYNC NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 10: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 11: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 12: /* db_options ::= db_options KEEP NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 13: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 14: /* db_options ::= db_options QUORUM NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_QUORUM, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 15: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 16: /* db_options ::= db_options TTL NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 17: /* db_options ::= db_options WAL NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 18: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 19: /* db_options ::= db_options SINGLESTABLE NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_SINGLESTABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_SINGLESTABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 20: /* db_options ::= db_options STREAMMODE NK_INTEGER */ -{ yylhsminor.yy27 = setDatabaseOption(pCxt, yymsp[-2].minor.yy27, DB_OPTION_STREAMMODE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy27 = yylhsminor.yy27; +{ yylhsminor.yy199 = setDatabaseOption(pCxt, yymsp[-2].minor.yy199, DB_OPTION_STREAMMODE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy199 = yylhsminor.yy199; break; case 21: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy105);} +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy209);} break; case 22: /* cmd ::= CREATE TABLE exists_opt full_table_name NK_LP column_def_list NK_RP table_options */ -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-5].minor.yy259, &yymsp[-4].minor.yy111, yymsp[-2].minor.yy60, yymsp[0].minor.yy40);} +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-5].minor.yy137, &yymsp[-4].minor.yy57, yymsp[-2].minor.yy64, yymsp[0].minor.yy46);} break; case 23: /* full_table_name ::= NK_ID */ -{ STokenPair t = { .first = yymsp[0].minor.yy0, .second = nil_token}; yylhsminor.yy111 = t; } - yymsp[0].minor.yy111 = yylhsminor.yy111; +{ STokenPair t = { .first = nil_token, .second = yymsp[0].minor.yy0 }; yylhsminor.yy57 = t; } + yymsp[0].minor.yy57 = yylhsminor.yy57; break; case 24: /* full_table_name ::= NK_ID NK_DOT NK_ID */ -{ STokenPair t = { .first = yymsp[-2].minor.yy0, .second = yymsp[0].minor.yy0}; yylhsminor.yy111 = t; } - yymsp[-2].minor.yy111 = yylhsminor.yy111; +{ STokenPair t = { .first = yymsp[-2].minor.yy0, .second = yymsp[0].minor.yy0 }; yylhsminor.yy57 = t; } + yymsp[-2].minor.yy57 = yylhsminor.yy57; break; case 25: /* column_def_list ::= column_def */ -{ yylhsminor.yy60 = createNodeList(pCxt, yymsp[0].minor.yy172); } - yymsp[0].minor.yy60 = yylhsminor.yy60; +{ yylhsminor.yy64 = createNodeList(pCxt, yymsp[0].minor.yy272); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; case 26: /* column_def_list ::= column_def_list NK_COMMA column_def */ -{ yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, yymsp[0].minor.yy172); } - yymsp[-2].minor.yy60 = yylhsminor.yy60; +{ yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, yymsp[0].minor.yy272); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; case 27: /* column_def ::= column_name type_name */ -{ yylhsminor.yy172 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy105, yymsp[0].minor.yy248, NULL); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; +{ yylhsminor.yy272 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy209, yymsp[0].minor.yy304, NULL); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 28: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy172 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy105, yymsp[-2].minor.yy248, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; +{ yylhsminor.yy272 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy209, yymsp[-2].minor.yy304, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 29: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BOOL); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_BOOL); } break; case 30: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_TINYINT); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; case 31: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_SMALLINT); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; case 32: /* type_name ::= INT */ case 33: /* type_name ::= INTEGER */ yytestcase(yyruleno==33); -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_INT); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_INT); } break; case 34: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BIGINT); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; case 35: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_FLOAT); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; case 36: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_DOUBLE); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; case 37: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy304 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; case 38: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; case 39: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy304 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; case 40: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UTINYINT); } +{ yymsp[-1].minor.yy304 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; case 41: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_USMALLINT); } +{ yymsp[-1].minor.yy304 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; case 42: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UINT); } +{ yymsp[-1].minor.yy304 = createDataType(TSDB_DATA_TYPE_UINT); } break; case 43: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy248 = createDataType(TSDB_DATA_TYPE_UBIGINT); } +{ yymsp[-1].minor.yy304 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; case 44: /* type_name ::= JSON */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_JSON); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_JSON); } break; case 45: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy304 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; case 46: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; case 47: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_BLOB); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_BLOB); } break; case 48: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy248 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy304 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; case 49: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[0].minor.yy304 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 50: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-3].minor.yy304 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 51: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy248 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-5].minor.yy304 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 52: /* table_options ::= */ -{ yymsp[1].minor.yy40 = createDefaultTableOptions(pCxt);} +{ yymsp[1].minor.yy46 = createDefaultTableOptions(pCxt);} break; case 53: /* table_options ::= table_options COMMENT NK_INTEGER */ -{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy40 = yylhsminor.yy40; +{ yylhsminor.yy46 = setTableOption(pCxt, yymsp[-2].minor.yy46, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy46 = yylhsminor.yy46; break; case 54: /* table_options ::= table_options KEEP NK_INTEGER */ -{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_KEEP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy40 = yylhsminor.yy40; +{ yylhsminor.yy46 = setTableOption(pCxt, yymsp[-2].minor.yy46, TABLE_OPTION_KEEP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy46 = yylhsminor.yy46; break; case 55: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy40 = setTableOption(pCxt, yymsp[-2].minor.yy40, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy40 = yylhsminor.yy40; +{ yylhsminor.yy46 = setTableOption(pCxt, yymsp[-2].minor.yy46, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy46 = yylhsminor.yy46; break; case 56: /* cmd ::= SHOW DATABASES */ -{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASE_STMT); } +{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 57: /* cmd ::= query_expression */ -{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy172; } + case 57: /* cmd ::= SHOW TABLES */ +{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT); } break; - case 58: /* literal ::= NK_INTEGER */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 58: /* cmd ::= query_expression */ +{ PARSER_TRACE; pCxt->pRootNode = yymsp[0].minor.yy272; } break; - case 59: /* literal ::= NK_FLOAT */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 59: /* literal ::= NK_INTEGER */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 60: /* literal ::= NK_STRING */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 60: /* literal ::= NK_FLOAT */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 61: /* literal ::= NK_BOOL */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 61: /* literal ::= NK_STRING */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 62: /* literal ::= TIMESTAMP NK_STRING */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + case 62: /* literal ::= NK_BOOL */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 63: /* literal ::= duration_literal */ - case 73: /* expression ::= literal */ yytestcase(yyruleno==73); - case 74: /* expression ::= column_reference */ yytestcase(yyruleno==74); - case 77: /* expression ::= subquery */ yytestcase(yyruleno==77); - case 109: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==109); - case 113: /* boolean_primary ::= predicate */ yytestcase(yyruleno==113); - case 118: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==118); - case 120: /* table_reference ::= table_primary */ yytestcase(yyruleno==120); - case 121: /* table_reference ::= joined_table */ yytestcase(yyruleno==121); - case 125: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==125); - case 172: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==172); - case 174: /* query_primary ::= query_specification */ yytestcase(yyruleno==174); -{ PARSER_TRACE; yylhsminor.yy172 = yymsp[0].minor.yy172; } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 63: /* literal ::= TIMESTAMP NK_STRING */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 64: /* duration_literal ::= NK_VARIABLE */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 64: /* literal ::= duration_literal */ + case 74: /* expression ::= literal */ yytestcase(yyruleno==74); + case 75: /* expression ::= column_reference */ yytestcase(yyruleno==75); + case 78: /* expression ::= subquery */ yytestcase(yyruleno==78); + case 110: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==110); + case 114: /* boolean_primary ::= predicate */ yytestcase(yyruleno==114); + case 119: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==119); + case 121: /* table_reference ::= table_primary */ yytestcase(yyruleno==121); + case 122: /* table_reference ::= joined_table */ yytestcase(yyruleno==122); + case 126: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==126); + case 173: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==173); + case 175: /* query_primary ::= query_specification */ yytestcase(yyruleno==175); +{ PARSER_TRACE; yylhsminor.yy272 = yymsp[0].minor.yy272; } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 65: /* literal_list ::= literal */ - case 86: /* expression_list ::= expression */ yytestcase(yyruleno==86); -{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); } - yymsp[0].minor.yy60 = yylhsminor.yy60; + case 65: /* duration_literal ::= NK_VARIABLE */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 66: /* literal_list ::= literal_list NK_COMMA literal */ - case 87: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==87); -{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); } - yymsp[-2].minor.yy60 = yylhsminor.yy60; + case 66: /* literal_list ::= literal */ + case 87: /* expression_list ::= expression */ yytestcase(yyruleno==87); +{ PARSER_TRACE; yylhsminor.yy64 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 67: /* db_name ::= NK_ID */ - case 68: /* table_name ::= NK_ID */ yytestcase(yyruleno==68); - case 69: /* column_name ::= NK_ID */ yytestcase(yyruleno==69); - case 70: /* function_name ::= NK_ID */ yytestcase(yyruleno==70); - case 71: /* table_alias ::= NK_ID */ yytestcase(yyruleno==71); - case 72: /* column_alias ::= NK_ID */ yytestcase(yyruleno==72); -{ PARSER_TRACE; yylhsminor.yy105 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy105 = yylhsminor.yy105; + case 67: /* literal_list ::= literal_list NK_COMMA literal */ + case 88: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==88); +{ PARSER_TRACE; yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; - case 75: /* expression ::= function_name NK_LP expression_list NK_RP */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy105, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy105, yymsp[-1].minor.yy60)); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + case 68: /* db_name ::= NK_ID */ + case 69: /* table_name ::= NK_ID */ yytestcase(yyruleno==69); + case 70: /* column_name ::= NK_ID */ yytestcase(yyruleno==70); + case 71: /* function_name ::= NK_ID */ yytestcase(yyruleno==71); + case 72: /* table_alias ::= NK_ID */ yytestcase(yyruleno==72); + case 73: /* column_alias ::= NK_ID */ yytestcase(yyruleno==73); +{ PARSER_TRACE; yylhsminor.yy209 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy209 = yylhsminor.yy209; break; - case 76: /* expression ::= function_name NK_LP NK_STAR NK_RP */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy105, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy105, createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy0)))); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + case 76: /* expression ::= function_name NK_LP expression_list NK_RP */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy209, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy209, yymsp[-1].minor.yy64)); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 78: /* expression ::= NK_LP expression NK_RP */ - case 114: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==114); -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172)); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 77: /* expression ::= function_name NK_LP NK_STAR NK_RP */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy209, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy209, createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy0)))); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 79: /* expression ::= NK_PLUS expression */ + case 79: /* expression ::= NK_LP expression NK_RP */ + case 115: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==115); +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; + break; + case 80: /* expression ::= NK_PLUS expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy172)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 80: /* expression ::= NK_MINUS expression */ + case 81: /* expression ::= NK_MINUS expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[0].minor.yy272), NULL)); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 81: /* expression ::= expression NK_PLUS expression */ + case 82: /* expression ::= expression NK_PLUS expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 82: /* expression ::= expression NK_MINUS expression */ + case 83: /* expression ::= expression NK_MINUS expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 83: /* expression ::= expression NK_STAR expression */ + case 84: /* expression ::= expression NK_STAR expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 84: /* expression ::= expression NK_SLASH expression */ + case 85: /* expression ::= expression NK_SLASH expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 85: /* expression ::= expression NK_REM expression */ + case 86: /* expression ::= expression NK_REM expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MOD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 88: /* column_reference ::= column_name */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNode(pCxt, &yymsp[0].minor.yy105, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy105)); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 89: /* column_reference ::= column_name */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy209, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy209)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 89: /* column_reference ::= table_name NK_DOT column_name */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy105, createColumnNode(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy105)); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 90: /* column_reference ::= table_name NK_DOT column_name */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209, createColumnNode(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 90: /* predicate ::= expression compare_op expression */ - case 95: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==95); + case 91: /* predicate ::= expression compare_op expression */ + case 96: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==96); { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy214, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy20, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 91: /* predicate ::= expression BETWEEN expression AND expression */ + case 92: /* predicate ::= expression BETWEEN expression AND expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy172), releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy272), releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-4].minor.yy172 = yylhsminor.yy172; + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; - case 92: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 93: /* predicate ::= expression NOT BETWEEN expression AND expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[-5].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[-5].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-5].minor.yy172 = yylhsminor.yy172; + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; - case 93: /* predicate ::= expression IS NULL */ + case 94: /* predicate ::= expression IS NULL */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), NULL)); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 94: /* predicate ::= expression IS NOT NULL */ + case 95: /* predicate ::= expression IS NOT NULL */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy172), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), NULL)); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 96: /* compare_op ::= NK_LT */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LOWER_THAN; } + case 97: /* compare_op ::= NK_LT */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_LOWER_THAN; } break; - case 97: /* compare_op ::= NK_GT */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_GREATER_THAN; } + case 98: /* compare_op ::= NK_GT */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_GREATER_THAN; } break; - case 98: /* compare_op ::= NK_LE */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LOWER_EQUAL; } + case 99: /* compare_op ::= NK_LE */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_LOWER_EQUAL; } break; - case 99: /* compare_op ::= NK_GE */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_GREATER_EQUAL; } + case 100: /* compare_op ::= NK_GE */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_GREATER_EQUAL; } break; - case 100: /* compare_op ::= NK_NE */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_NOT_EQUAL; } + case 101: /* compare_op ::= NK_NE */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_NOT_EQUAL; } break; - case 101: /* compare_op ::= NK_EQ */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_EQUAL; } + case 102: /* compare_op ::= NK_EQ */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_EQUAL; } break; - case 102: /* compare_op ::= LIKE */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_LIKE; } + case 103: /* compare_op ::= LIKE */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_LIKE; } break; - case 103: /* compare_op ::= NOT LIKE */ -{ PARSER_TRACE; yymsp[-1].minor.yy214 = OP_TYPE_NOT_LIKE; } + case 104: /* compare_op ::= NOT LIKE */ +{ PARSER_TRACE; yymsp[-1].minor.yy20 = OP_TYPE_NOT_LIKE; } break; - case 104: /* compare_op ::= MATCH */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_MATCH; } + case 105: /* compare_op ::= MATCH */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_MATCH; } break; - case 105: /* compare_op ::= NMATCH */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_NMATCH; } + case 106: /* compare_op ::= NMATCH */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_NMATCH; } break; - case 106: /* in_op ::= IN */ -{ PARSER_TRACE; yymsp[0].minor.yy214 = OP_TYPE_IN; } + case 107: /* in_op ::= IN */ +{ PARSER_TRACE; yymsp[0].minor.yy20 = OP_TYPE_IN; } break; - case 107: /* in_op ::= NOT IN */ -{ PARSER_TRACE; yymsp[-1].minor.yy214 = OP_TYPE_NOT_IN; } + case 108: /* in_op ::= NOT IN */ +{ PARSER_TRACE; yymsp[-1].minor.yy20 = OP_TYPE_NOT_IN; } break; - case 108: /* in_predicate_value ::= NK_LP expression_list NK_RP */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy60)); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 109: /* in_predicate_value ::= NK_LP expression_list NK_RP */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy64)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 110: /* boolean_value_expression ::= NOT boolean_primary */ + case 111: /* boolean_value_expression ::= NOT boolean_primary */ { PARSER_TRACE; - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy272), NULL)); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 111: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 112: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 112: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 113: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { PARSER_TRACE; - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy172); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 115: /* common_expression ::= expression */ - case 116: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==116); -{ yylhsminor.yy172 = yymsp[0].minor.yy172; } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 116: /* common_expression ::= expression */ + case 117: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==117); +{ yylhsminor.yy272 = yymsp[0].minor.yy272; } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 117: /* from_clause ::= FROM table_reference_list */ - case 147: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==147); - case 170: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==170); -{ PARSER_TRACE; yymsp[-1].minor.yy172 = yymsp[0].minor.yy172; } + case 118: /* from_clause ::= FROM table_reference_list */ + case 148: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==148); + case 171: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==171); +{ PARSER_TRACE; yymsp[-1].minor.yy272 = yymsp[0].minor.yy272; } break; - case 119: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ PARSER_TRACE; yylhsminor.yy172 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy172, yymsp[0].minor.yy172, NULL); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 120: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ PARSER_TRACE; yylhsminor.yy272 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, NULL); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 122: /* table_primary ::= table_name alias_opt */ -{ PARSER_TRACE; yylhsminor.yy172 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy105, &yymsp[0].minor.yy105); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + case 123: /* table_primary ::= table_name alias_opt */ +{ PARSER_TRACE; yylhsminor.yy272 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 123: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ PARSER_TRACE; yylhsminor.yy172 = createRealTableNode(pCxt, &yymsp[-3].minor.yy105, &yymsp[-1].minor.yy105, &yymsp[0].minor.yy105); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + case 124: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ PARSER_TRACE; yylhsminor.yy272 = createRealTableNode(pCxt, &yymsp[-3].minor.yy209, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 124: /* table_primary ::= subquery alias_opt */ -{ PARSER_TRACE; yylhsminor.yy172 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172), &yymsp[0].minor.yy105); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + case 125: /* table_primary ::= subquery alias_opt */ +{ PARSER_TRACE; yylhsminor.yy272 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 126: /* alias_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy105 = nil_token; } + case 127: /* alias_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy209 = nil_token; } break; - case 127: /* alias_opt ::= table_alias */ -{ PARSER_TRACE; yylhsminor.yy105 = yymsp[0].minor.yy105; } - yymsp[0].minor.yy105 = yylhsminor.yy105; + case 128: /* alias_opt ::= table_alias */ +{ PARSER_TRACE; yylhsminor.yy209 = yymsp[0].minor.yy209; } + yymsp[0].minor.yy209 = yylhsminor.yy209; break; - case 128: /* alias_opt ::= AS table_alias */ -{ PARSER_TRACE; yymsp[-1].minor.yy105 = yymsp[0].minor.yy105; } + case 129: /* alias_opt ::= AS table_alias */ +{ PARSER_TRACE; yymsp[-1].minor.yy209 = yymsp[0].minor.yy209; } break; - case 129: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 130: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==130); -{ PARSER_TRACE; yymsp[-2].minor.yy172 = yymsp[-1].minor.yy172; } + case 130: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 131: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==131); +{ PARSER_TRACE; yymsp[-2].minor.yy272 = yymsp[-1].minor.yy272; } break; - case 131: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ PARSER_TRACE; yylhsminor.yy172 = createJoinTableNode(pCxt, yymsp[-4].minor.yy278, yymsp[-5].minor.yy172, yymsp[-2].minor.yy172, yymsp[0].minor.yy172); } - yymsp[-5].minor.yy172 = yylhsminor.yy172; + case 132: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ PARSER_TRACE; yylhsminor.yy272 = createJoinTableNode(pCxt, yymsp[-4].minor.yy252, yymsp[-5].minor.yy272, yymsp[-2].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; - case 132: /* join_type ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy278 = JOIN_TYPE_INNER; } + case 133: /* join_type ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy252 = JOIN_TYPE_INNER; } break; - case 133: /* join_type ::= INNER */ -{ PARSER_TRACE; yymsp[0].minor.yy278 = JOIN_TYPE_INNER; } + case 134: /* join_type ::= INNER */ +{ PARSER_TRACE; yymsp[0].minor.yy252 = JOIN_TYPE_INNER; } break; - case 134: /* 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 135: /* 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 */ { PARSER_TRACE; - yymsp[-8].minor.yy172 = createSelectStmt(pCxt, yymsp[-7].minor.yy259, yymsp[-6].minor.yy60, yymsp[-5].minor.yy172); - yymsp[-8].minor.yy172 = addWhereClause(pCxt, yymsp[-8].minor.yy172, yymsp[-4].minor.yy172); - yymsp[-8].minor.yy172 = addPartitionByClause(pCxt, yymsp[-8].minor.yy172, yymsp[-3].minor.yy60); - yymsp[-8].minor.yy172 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy172, yymsp[-2].minor.yy172); - yymsp[-8].minor.yy172 = addGroupByClause(pCxt, yymsp[-8].minor.yy172, yymsp[-1].minor.yy60); - yymsp[-8].minor.yy172 = addHavingClause(pCxt, yymsp[-8].minor.yy172, yymsp[0].minor.yy172); + yymsp[-8].minor.yy272 = createSelectStmt(pCxt, yymsp[-7].minor.yy137, yymsp[-6].minor.yy64, yymsp[-5].minor.yy272); + yymsp[-8].minor.yy272 = addWhereClause(pCxt, yymsp[-8].minor.yy272, yymsp[-4].minor.yy272); + yymsp[-8].minor.yy272 = addPartitionByClause(pCxt, yymsp[-8].minor.yy272, yymsp[-3].minor.yy64); + yymsp[-8].minor.yy272 = addWindowClauseClause(pCxt, yymsp[-8].minor.yy272, yymsp[-2].minor.yy272); + yymsp[-8].minor.yy272 = addGroupByClause(pCxt, yymsp[-8].minor.yy272, yymsp[-1].minor.yy64); + yymsp[-8].minor.yy272 = addHavingClause(pCxt, yymsp[-8].minor.yy272, yymsp[0].minor.yy272); } break; - case 135: /* set_quantifier_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy259 = false; } + case 136: /* set_quantifier_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy137 = false; } break; - case 136: /* set_quantifier_opt ::= DISTINCT */ -{ PARSER_TRACE; yymsp[0].minor.yy259 = true; } + case 137: /* set_quantifier_opt ::= DISTINCT */ +{ PARSER_TRACE; yymsp[0].minor.yy137 = true; } break; - case 137: /* set_quantifier_opt ::= ALL */ -{ PARSER_TRACE; yymsp[0].minor.yy259 = false; } + case 138: /* set_quantifier_opt ::= ALL */ +{ PARSER_TRACE; yymsp[0].minor.yy137 = false; } break; - case 138: /* select_list ::= NK_STAR */ -{ PARSER_TRACE; yymsp[0].minor.yy60 = NULL; } + case 139: /* select_list ::= NK_STAR */ +{ PARSER_TRACE; yymsp[0].minor.yy64 = NULL; } break; - case 139: /* select_list ::= select_sublist */ -{ PARSER_TRACE; yylhsminor.yy60 = yymsp[0].minor.yy60; } - yymsp[0].minor.yy60 = yylhsminor.yy60; + case 140: /* select_list ::= select_sublist */ +{ PARSER_TRACE; yylhsminor.yy64 = yymsp[0].minor.yy64; } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 140: /* select_sublist ::= select_item */ - case 187: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==187); -{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, yymsp[0].minor.yy172); } - yymsp[0].minor.yy60 = yylhsminor.yy60; + case 141: /* select_sublist ::= select_item */ + case 188: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==188); +{ PARSER_TRACE; yylhsminor.yy64 = createNodeList(pCxt, yymsp[0].minor.yy272); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 141: /* select_sublist ::= select_sublist NK_COMMA select_item */ - case 188: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==188); -{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, yymsp[0].minor.yy172); } - yymsp[-2].minor.yy60 = yylhsminor.yy60; + case 142: /* select_sublist ::= select_sublist NK_COMMA select_item */ + case 189: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==189); +{ PARSER_TRACE; yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, yymsp[0].minor.yy272); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; - case 142: /* select_item ::= common_expression */ + case 143: /* select_item ::= common_expression */ { PARSER_TRACE; - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy172); - yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172), &t); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272), &t); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 143: /* select_item ::= common_expression column_alias */ -{ PARSER_TRACE; yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172), &yymsp[0].minor.yy105); } - yymsp[-1].minor.yy172 = yylhsminor.yy172; + case 144: /* select_item ::= common_expression column_alias */ +{ PARSER_TRACE; yylhsminor.yy272 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 144: /* select_item ::= common_expression AS column_alias */ -{ PARSER_TRACE; yylhsminor.yy172 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), &yymsp[0].minor.yy105); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 145: /* select_item ::= common_expression AS column_alias */ +{ PARSER_TRACE; yylhsminor.yy272 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 145: /* select_item ::= table_name NK_DOT NK_STAR */ -{ PARSER_TRACE; yylhsminor.yy172 = createColumnNode(pCxt, &yymsp[-2].minor.yy105, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 146: /* select_item ::= table_name NK_DOT NK_STAR */ +{ PARSER_TRACE; yylhsminor.yy272 = createColumnNode(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 146: /* where_clause_opt ::= */ - case 150: /* twindow_clause_opt ::= */ yytestcase(yyruleno==150); - case 155: /* sliding_opt ::= */ yytestcase(yyruleno==155); - case 157: /* fill_opt ::= */ yytestcase(yyruleno==157); - case 169: /* having_clause_opt ::= */ yytestcase(yyruleno==169); - case 177: /* slimit_clause_opt ::= */ yytestcase(yyruleno==177); - case 181: /* limit_clause_opt ::= */ yytestcase(yyruleno==181); -{ PARSER_TRACE; yymsp[1].minor.yy172 = NULL; } + case 147: /* where_clause_opt ::= */ + case 151: /* twindow_clause_opt ::= */ yytestcase(yyruleno==151); + case 156: /* sliding_opt ::= */ yytestcase(yyruleno==156); + case 158: /* fill_opt ::= */ yytestcase(yyruleno==158); + case 170: /* having_clause_opt ::= */ yytestcase(yyruleno==170); + case 178: /* slimit_clause_opt ::= */ yytestcase(yyruleno==178); + case 182: /* limit_clause_opt ::= */ yytestcase(yyruleno==182); +{ PARSER_TRACE; yymsp[1].minor.yy272 = NULL; } break; - case 148: /* partition_by_clause_opt ::= */ - case 165: /* group_by_clause_opt ::= */ yytestcase(yyruleno==165); - case 175: /* order_by_clause_opt ::= */ yytestcase(yyruleno==175); -{ PARSER_TRACE; yymsp[1].minor.yy60 = NULL; } + case 149: /* partition_by_clause_opt ::= */ + case 166: /* group_by_clause_opt ::= */ yytestcase(yyruleno==166); + case 176: /* order_by_clause_opt ::= */ yytestcase(yyruleno==176); +{ PARSER_TRACE; yymsp[1].minor.yy64 = NULL; } break; - case 149: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 166: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==166); - case 176: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==176); -{ PARSER_TRACE; yymsp[-2].minor.yy60 = yymsp[0].minor.yy60; } + case 150: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 167: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==167); + case 177: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==177); +{ PARSER_TRACE; yymsp[-2].minor.yy64 = yymsp[0].minor.yy64; } break; - case 151: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ -{ PARSER_TRACE; yymsp[-5].minor.yy172 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy172), &yymsp[-1].minor.yy0); } + case 152: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA NK_INTEGER NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy272 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), &yymsp[-1].minor.yy0); } break; - case 152: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy172 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy172)); } + case 153: /* twindow_clause_opt ::= STATE_WINDOW NK_LP column_reference NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy272 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } break; - case 153: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ PARSER_TRACE; yymsp[-5].minor.yy172 = createIntervalWindowNode(pCxt, yymsp[-3].minor.yy172, NULL, yymsp[-1].minor.yy172, yymsp[0].minor.yy172); } + case 154: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ PARSER_TRACE; yymsp[-5].minor.yy272 = createIntervalWindowNode(pCxt, yymsp[-3].minor.yy272, NULL, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; - case 154: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ PARSER_TRACE; yymsp[-7].minor.yy172 = createIntervalWindowNode(pCxt, yymsp[-5].minor.yy172, yymsp[-3].minor.yy172, yymsp[-1].minor.yy172, yymsp[0].minor.yy172); } + case 155: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ PARSER_TRACE; yymsp[-7].minor.yy272 = createIntervalWindowNode(pCxt, yymsp[-5].minor.yy272, yymsp[-3].minor.yy272, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; - case 156: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy172 = yymsp[-1].minor.yy172; } + case 157: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy272 = yymsp[-1].minor.yy272; } break; - case 158: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ PARSER_TRACE; yymsp[-3].minor.yy172 = createFillNode(pCxt, yymsp[-1].minor.yy202, NULL); } + case 159: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ PARSER_TRACE; yymsp[-3].minor.yy272 = createFillNode(pCxt, yymsp[-1].minor.yy54, NULL); } break; - case 159: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ PARSER_TRACE; yymsp[-5].minor.yy172 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy60)); } + case 160: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ PARSER_TRACE; yymsp[-5].minor.yy272 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy64)); } break; - case 160: /* fill_mode ::= NONE */ -{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NONE; } + case 161: /* fill_mode ::= NONE */ +{ PARSER_TRACE; yymsp[0].minor.yy54 = FILL_MODE_NONE; } break; - case 161: /* fill_mode ::= PREV */ -{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_PREV; } + case 162: /* fill_mode ::= PREV */ +{ PARSER_TRACE; yymsp[0].minor.yy54 = FILL_MODE_PREV; } break; - case 162: /* fill_mode ::= NULL */ -{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NULL; } + case 163: /* fill_mode ::= NULL */ +{ PARSER_TRACE; yymsp[0].minor.yy54 = FILL_MODE_NULL; } break; - case 163: /* fill_mode ::= LINEAR */ -{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_LINEAR; } + case 164: /* fill_mode ::= LINEAR */ +{ PARSER_TRACE; yymsp[0].minor.yy54 = FILL_MODE_LINEAR; } break; - case 164: /* fill_mode ::= NEXT */ -{ PARSER_TRACE; yymsp[0].minor.yy202 = FILL_MODE_NEXT; } + case 165: /* fill_mode ::= NEXT */ +{ PARSER_TRACE; yymsp[0].minor.yy54 = FILL_MODE_NEXT; } break; - case 167: /* group_by_list ::= expression */ -{ PARSER_TRACE; yylhsminor.yy60 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[0].minor.yy60 = yylhsminor.yy60; + case 168: /* group_by_list ::= expression */ +{ PARSER_TRACE; yylhsminor.yy64 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } + yymsp[0].minor.yy64 = yylhsminor.yy64; break; - case 168: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ PARSER_TRACE; yylhsminor.yy60 = addNodeToList(pCxt, yymsp[-2].minor.yy60, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy172))); } - yymsp[-2].minor.yy60 = yylhsminor.yy60; + case 169: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ PARSER_TRACE; yylhsminor.yy64 = addNodeToList(pCxt, yymsp[-2].minor.yy64, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } + yymsp[-2].minor.yy64 = yylhsminor.yy64; break; - case 171: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 172: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { PARSER_TRACE; - yylhsminor.yy172 = addOrderByClause(pCxt, yymsp[-3].minor.yy172, yymsp[-2].minor.yy60); - yylhsminor.yy172 = addSlimitClause(pCxt, yylhsminor.yy172, yymsp[-1].minor.yy172); - yylhsminor.yy172 = addLimitClause(pCxt, yylhsminor.yy172, yymsp[0].minor.yy172); + yylhsminor.yy272 = addOrderByClause(pCxt, yymsp[-3].minor.yy272, yymsp[-2].minor.yy64); + yylhsminor.yy272 = addSlimitClause(pCxt, yylhsminor.yy272, yymsp[-1].minor.yy272); + yylhsminor.yy272 = addLimitClause(pCxt, yylhsminor.yy272, yymsp[0].minor.yy272); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 173: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ PARSER_TRACE; yylhsminor.yy172 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy172, yymsp[0].minor.yy172); } - yymsp[-3].minor.yy172 = yylhsminor.yy172; + case 174: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ PARSER_TRACE; yylhsminor.yy272 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 178: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 182: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==182); -{ PARSER_TRACE; yymsp[-1].minor.yy172 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 179: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 183: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==183); +{ PARSER_TRACE; yymsp[-1].minor.yy272 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 179: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 183: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==183); -{ PARSER_TRACE; yymsp[-3].minor.yy172 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 180: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 184: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==184); +{ PARSER_TRACE; yymsp[-3].minor.yy272 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 180: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 184: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==184); -{ PARSER_TRACE; yymsp[-3].minor.yy172 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 181: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 185: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==185); +{ PARSER_TRACE; yymsp[-3].minor.yy272 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 185: /* subquery ::= NK_LP query_expression NK_RP */ -{ PARSER_TRACE; yylhsminor.yy172 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy172); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 186: /* subquery ::= NK_LP query_expression NK_RP */ +{ PARSER_TRACE; yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy272); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 186: /* search_condition ::= common_expression */ -{ PARSER_TRACE; yylhsminor.yy172 = releaseRawExprNode(pCxt, yymsp[0].minor.yy172); } - yymsp[0].minor.yy172 = yylhsminor.yy172; + case 187: /* search_condition ::= common_expression */ +{ PARSER_TRACE; yylhsminor.yy272 = releaseRawExprNode(pCxt, yymsp[0].minor.yy272); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 189: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ PARSER_TRACE; yylhsminor.yy172 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy172), yymsp[-1].minor.yy14, yymsp[0].minor.yy17); } - yymsp[-2].minor.yy172 = yylhsminor.yy172; + case 190: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ PARSER_TRACE; yylhsminor.yy272 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), yymsp[-1].minor.yy218, yymsp[0].minor.yy217); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 190: /* ordering_specification_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy14 = ORDER_ASC; } + case 191: /* ordering_specification_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy218 = ORDER_ASC; } break; - case 191: /* ordering_specification_opt ::= ASC */ -{ PARSER_TRACE; yymsp[0].minor.yy14 = ORDER_ASC; } + case 192: /* ordering_specification_opt ::= ASC */ +{ PARSER_TRACE; yymsp[0].minor.yy218 = ORDER_ASC; } break; - case 192: /* ordering_specification_opt ::= DESC */ -{ PARSER_TRACE; yymsp[0].minor.yy14 = ORDER_DESC; } + case 193: /* ordering_specification_opt ::= DESC */ +{ PARSER_TRACE; yymsp[0].minor.yy218 = ORDER_DESC; } break; - case 193: /* null_ordering_opt ::= */ -{ PARSER_TRACE; yymsp[1].minor.yy17 = NULL_ORDER_DEFAULT; } + case 194: /* null_ordering_opt ::= */ +{ PARSER_TRACE; yymsp[1].minor.yy217 = NULL_ORDER_DEFAULT; } break; - case 194: /* null_ordering_opt ::= NULLS FIRST */ -{ PARSER_TRACE; yymsp[-1].minor.yy17 = NULL_ORDER_FIRST; } + case 195: /* null_ordering_opt ::= NULLS FIRST */ +{ PARSER_TRACE; yymsp[-1].minor.yy217 = NULL_ORDER_FIRST; } break; - case 195: /* null_ordering_opt ::= NULLS LAST */ -{ PARSER_TRACE; yymsp[-1].minor.yy17 = NULL_ORDER_LAST; } + case 196: /* null_ordering_opt ::= NULLS LAST */ +{ PARSER_TRACE; yymsp[-1].minor.yy217 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/src/ttokenizer.c b/source/libs/parser/src/ttokenizer.c index 34dc3a2ea9..b80763b757 100644 --- a/source/libs/parser/src/ttokenizer.c +++ b/source/libs/parser/src/ttokenizer.c @@ -88,7 +88,7 @@ static SKeyword keywordTable[] = { // {"SCORES", TK_SCORES}, // {"GRANTS", TK_GRANTS}, // {"DOT", TK_DOT}, - // {"TABLES", TK_TABLES}, + {"TABLES", TK_TABLES}, // {"STABLES", TK_STABLES}, {"VGROUPS", TK_VGROUPS}, // {"DROP", TK_DROP}, diff --git a/source/libs/planner/inc/plannerInt.h b/source/libs/planner/inc/plannerInt.h index e692d5d424..991ad72a31 100644 --- a/source/libs/planner/inc/plannerInt.h +++ b/source/libs/planner/inc/plannerInt.h @@ -50,7 +50,7 @@ extern "C" { int32_t createLogicPlan(SPlanContext* pCxt, SLogicNode** pLogicNode); int32_t optimize(SPlanContext* pCxt, SLogicNode* pLogicNode); -int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** pPlan); +int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** pPlan, SArray* pExecNodeList); #ifdef __cplusplus } diff --git a/source/libs/planner/src/logicPlan.c b/source/libs/planner/src/logicPlan.c index f4cc59e5af..05526190e7 100644 --- a/source/libs/planner/src/logicPlan.c +++ b/source/libs/planner/src/logicPlan.c @@ -128,6 +128,7 @@ static SLogicNode* createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe pScan->node.id = pCxt->planNodeId++; pScan->pMeta = pRealTable->pMeta; + pScan->pVgroupList = pRealTable->pVgroupList; // set columns to scan SNodeList* pCols = NULL; diff --git a/source/libs/planner/src/physicalPlan.c b/source/libs/planner/src/physicalPlan.c index 9df2b9b708..fa8c51c731 100644 --- a/source/libs/planner/src/physicalPlan.c +++ b/source/libs/planner/src/physicalPlan.c @@ -27,6 +27,7 @@ typedef struct SPhysiPlanContext { int32_t errCode; int16_t nextDataBlockId; SArray* pLocationHelper; + SArray* pExecNodeList; } SPhysiPlanContext; static int32_t getSlotKey(SNode* pNode, char* pKey) { @@ -185,11 +186,41 @@ static int32_t setSlotOutput(SPhysiPlanContext* pCxt, SNodeList* pTargets, SData return TSDB_CODE_SUCCESS; } +static SNodeptr createPrimaryKeyCol(SPhysiPlanContext* pCxt, uint64_t tableId) { + SColumnNode* pCol = nodesMakeNode(QUERY_NODE_COLUMN); + CHECK_ALLOC(pCol, NULL); + pCol->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP; + pCol->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes; + pCol->tableId = tableId; + pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID; + pCol->colType = COLUMN_TYPE_COLUMN; + return pCol; +} + +static int32_t addPrimaryKeyCol(SPhysiPlanContext* pCxt, SScanPhysiNode* pScanPhysiNode) { + if (NULL == pScanPhysiNode->pScanCols) { + pScanPhysiNode->pScanCols = nodesMakeList(); + CHECK_ALLOC(pScanPhysiNode->pScanCols, TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE_EXT(nodesListStrictAppend(pScanPhysiNode->pScanCols, createPrimaryKeyCol(pCxt, pScanPhysiNode->uid))); + return TSDB_CODE_SUCCESS; + } + SNode* pNode; + FOREACH(pNode, pScanPhysiNode->pScanCols) { + if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { + return TSDB_CODE_SUCCESS; + } + } + CHECK_CODE_EXT(nodesListStrictAppend(pScanPhysiNode->pScanCols, createPrimaryKeyCol(pCxt, pScanPhysiNode->uid))); + return TSDB_CODE_SUCCESS; +} + static int32_t initScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanLogicNode, SScanPhysiNode* pScanPhysiNode) { if (NULL != pScanLogicNode->pScanCols) { pScanPhysiNode->pScanCols = nodesCloneList(pScanLogicNode->pScanCols); CHECK_ALLOC(pScanPhysiNode->pScanCols, TSDB_CODE_OUT_OF_MEMORY); } + CHECK_CODE(addPrimaryKeyCol(pCxt, pScanPhysiNode), TSDB_CODE_OUT_OF_MEMORY); + // Data block describe also needs to be set without scanning column, such as SELECT COUNT(*) FROM t CHECK_CODE(addDataBlockDesc(pCxt, pScanPhysiNode->pScanCols, pScanPhysiNode->node.pOutputDataBlockDesc), TSDB_CODE_OUT_OF_MEMORY); @@ -206,6 +237,11 @@ static int32_t initScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanL return TSDB_CODE_SUCCESS; } +static void vgroupInfoToNodeAddr(const SVgroupInfo* vg, SQueryNodeAddr* pNodeAddr) { + pNodeAddr->nodeId = vg->vgId; + pNodeAddr->epset = vg->epset; +} + static SPhysiNode* createTagScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanLogicNode) { STagScanPhysiNode* pTagScan = (STagScanPhysiNode*)makePhysiNode(pCxt, QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN); CHECK_ALLOC(pTagScan, NULL); @@ -213,21 +249,23 @@ static SPhysiNode* createTagScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNod return (SPhysiNode*)pTagScan; } -static SPhysiNode* createTableScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanLogicNode) { +static SPhysiNode* createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan, SScanLogicNode* pScanLogicNode) { STableScanPhysiNode* pTableScan = (STableScanPhysiNode*)makePhysiNode(pCxt, QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN); CHECK_ALLOC(pTableScan, NULL); CHECK_CODE(initScanPhysiNode(pCxt, pScanLogicNode, (SScanPhysiNode*)pTableScan), (SPhysiNode*)pTableScan); pTableScan->scanFlag = pScanLogicNode->scanFlag; pTableScan->scanRange = pScanLogicNode->scanRange; + vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode); + taosArrayPush(pCxt->pExecNodeList, &pSubplan->execNode); return (SPhysiNode*)pTableScan; } -static SPhysiNode* createScanPhysiNode(SPhysiPlanContext* pCxt, SScanLogicNode* pScanLogicNode) { +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, pScanLogicNode); + return createTableScanPhysiNode(pCxt, pSubplan, pScanLogicNode); case SCAN_TYPE_STABLE: case SCAN_TYPE_STREAM: break; @@ -428,13 +466,13 @@ static SPhysiNode* createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC return (SPhysiNode*)pProject; } -static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicPlan) { +static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan, SLogicNode* pLogicPlan) { SNodeList* pChildren = nodesMakeList(); CHECK_ALLOC(pChildren, NULL); SNode* pLogicChild; FOREACH(pLogicChild, pLogicPlan->pChildren) { - SNode* pChildPhyNode = (SNode*)createPhysiNode(pCxt, (SLogicNode*)pLogicChild); + SNode* pChildPhyNode = (SNode*)createPhysiNode(pCxt, pSubplan, (SLogicNode*)pLogicChild); if (TSDB_CODE_SUCCESS != nodesListAppend(pChildren, pChildPhyNode)) { pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; nodesDestroyList(pChildren); @@ -445,7 +483,7 @@ static SPhysiNode* createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicPl SPhysiNode* pPhyNode = NULL; switch (nodeType(pLogicPlan)) { case QUERY_NODE_LOGIC_PLAN_SCAN: - pPhyNode = createScanPhysiNode(pCxt, (SScanLogicNode*)pLogicPlan); + pPhyNode = createScanPhysiNode(pCxt, pSubplan, (SScanLogicNode*)pLogicPlan); break; case QUERY_NODE_LOGIC_PLAN_JOIN: pPhyNode = createJoinPhysiNode(pCxt, pChildren, (SJoinLogicNode*)pLogicPlan); @@ -493,25 +531,17 @@ static SSubplan* createPhysiSubplan(SPhysiPlanContext* pCxt, SSubLogicPlan* pLog SVnodeModifLogicNode* pModif = (SVnodeModifLogicNode*)pLogicSubplan->pNode; pSubplan->pDataSink = createDataInserter(pCxt, pModif->pVgDataBlocks); pSubplan->msgType = pModif->msgType; + pSubplan->execNode.epset = pModif->pVgDataBlocks->vg.epset; + taosArrayPush(pCxt->pExecNodeList, &pSubplan->execNode); } else { - pSubplan->pNode = createPhysiNode(pCxt, pLogicSubplan->pNode); + pSubplan->pNode = createPhysiNode(pCxt, pSubplan, pLogicSubplan->pNode); pSubplan->pDataSink = createDataDispatcher(pCxt, pSubplan->pNode); + pSubplan->msgType = TDMT_VND_QUERY; } pSubplan->subplanType = pLogicSubplan->subplanType; return pSubplan; } -static int32_t strictListAppend(SNodeList* pList, SNodeptr pNode) { - if (NULL == pNode) { - return TSDB_CODE_OUT_OF_MEMORY; - } - int32_t code = nodesListAppend(pList, pNode); - if (TSDB_CODE_SUCCESS != code) { - nodesDestroyNode(pNode); - } - return code; -} - static int32_t splitLogicPlan(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, SSubLogicPlan** pSubLogicPlan) { *pSubLogicPlan = (SSubLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); CHECK_ALLOC(*pSubLogicPlan, TSDB_CODE_OUT_OF_MEMORY); @@ -529,7 +559,7 @@ static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNodeptr pSubplan, int32_t l if (level >= LIST_LENGTH(pSubplans)) { pGroup = nodesMakeNode(QUERY_NODE_NODE_LIST); CHECK_ALLOC(pGroup, TSDB_CODE_OUT_OF_MEMORY); - CHECK_CODE(strictListAppend(pSubplans, pGroup), TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE(nodesListStrictAppend(pSubplans, pGroup), TSDB_CODE_OUT_OF_MEMORY); } else { pGroup = nodesListGetNode(pSubplans, level); } @@ -537,7 +567,7 @@ static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNodeptr pSubplan, int32_t l pGroup->pNodeList = nodesMakeList(); CHECK_ALLOC(pGroup->pNodeList, TSDB_CODE_OUT_OF_MEMORY); } - CHECK_CODE(strictListAppend(pGroup->pNodeList, pSubplan), TSDB_CODE_OUT_OF_MEMORY); + CHECK_CODE(nodesListStrictAppend(pGroup->pNodeList, pSubplan), TSDB_CODE_OUT_OF_MEMORY); } SSubLogicPlan* singleCloneSubLogicPlan(SPhysiPlanContext* pCxt, SSubLogicPlan* pSrc, int32_t level) { @@ -562,7 +592,6 @@ static int32_t doScaleOut(SPhysiPlanContext* pCxt, SSubLogicPlan* pSubplan, int3 SSubLogicPlan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); CHECK_ALLOC(pNewSubplan, TSDB_CODE_OUT_OF_MEMORY); SVgDataBlocks* blocks = (SVgDataBlocks*)taosArrayGetP(pNode->pDataBlocks, i); - pNewSubplan->execNode.epset = blocks->vg.epset; ((SVnodeModifLogicNode*)pNewSubplan->pNode)->pVgDataBlocks = blocks; CHECK_CODE_EXT(pushSubplan(pCxt, pNewSubplan, level, pLogicPlan->pSubplans)); } @@ -639,12 +668,13 @@ static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SQueryLogicPlan* pLogicPl return TSDB_CODE_SUCCESS; } -int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** pPlan) { +int32_t createPhysiPlan(SPlanContext* pCxt, SLogicNode* pLogicNode, SQueryPlan** pPlan, SArray* pExecNodeList) { SPhysiPlanContext cxt = { .pPlanCxt = pCxt, .errCode = TSDB_CODE_SUCCESS, .nextDataBlockId = 0, - .pLocationHelper = taosArrayInit(32, POINTER_BYTES) + .pLocationHelper = taosArrayInit(32, POINTER_BYTES), + .pExecNodeList = pExecNodeList }; if (NULL == cxt.pLocationHelper) { return TSDB_CODE_OUT_OF_MEMORY; diff --git a/source/libs/planner/src/planner.c b/source/libs/planner/src/planner.c index cce664190d..3481cb3352 100644 --- a/source/libs/planner/src/planner.c +++ b/source/libs/planner/src/planner.c @@ -21,14 +21,14 @@ int32_t optimize(SPlanContext* pCxt, SLogicNode* pLogicNode) { return TSDB_CODE_SUCCESS; } -int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan) { +int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNodeList) { SLogicNode* pLogicNode = NULL; int32_t code = createLogicPlan(pCxt, &pLogicNode); if (TSDB_CODE_SUCCESS == code) { code = optimize(pCxt, pLogicNode); } if (TSDB_CODE_SUCCESS == code) { - code = createPhysiPlan(pCxt, pLogicNode, pPlan); + code = createPhysiPlan(pCxt, pLogicNode, pPlan, pExecNodeList); } return code; } diff --git a/source/libs/planner/test/plannerTest.cpp b/source/libs/planner/test/plannerTest.cpp index 4bdd9d21ee..8ba80d1ab9 100644 --- a/source/libs/planner/test/plannerTest.cpp +++ b/source/libs/planner/test/plannerTest.cpp @@ -71,7 +71,7 @@ protected: if (TEST_PHYSICAL_PLAN == target) { SQueryPlan* pPlan = nullptr; - code = createPhysiPlan(&cxt, pLogicPlan, &pPlan); + code = createPhysiPlan(&cxt, pLogicPlan, &pPlan, NULL); if (code != TSDB_CODE_SUCCESS) { cout << "sql:[" << cxt_.pSql << "] physical plan code:" << code << ", strerror:" << tstrerror(code) << endl; return false; From 024dd9966fbaa7ed6ddd8b9277456ab64e4ee6ea Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 4 Mar 2022 19:21:30 +0800 Subject: [PATCH 25/26] [td-13039] refactor. --- include/common/tmsg.h | 6 +- source/libs/executor/src/executorimpl.c | 37 +- source/libs/executor/test/executorTests.cpp | 1220 +++++++++-------- .../libs/scalar/test/scalar/scalarTests.cpp | 34 +- 4 files changed, 724 insertions(+), 573 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 25d668e788..9f4202f756 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -416,7 +416,11 @@ typedef struct { * But for data in vnode side, we need all the following information. */ typedef struct { - int16_t colId; + union { + int16_t colId; + int16_t slotId; + }; + int16_t type; int16_t bytes; SColumnFilterList flist; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index d64c2596cd..cad7bff7cb 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -315,8 +315,6 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO } SSDataBlock* createOutputBuf_rv(SArray* pExprInfo, int32_t numOfRows) { - const static int32_t minSize = 8; - size_t numOfOutput = taosArrayGetSize(pExprInfo); SSDataBlock *res = calloc(1, sizeof(SSDataBlock)); @@ -330,15 +328,28 @@ SSDataBlock* createOutputBuf_rv(SArray* pExprInfo, int32_t numOfRows) { idata.info.type = pExpr->base.resSchema.type; idata.info.bytes = pExpr->base.resSchema.bytes; idata.info.colId = pExpr->base.resSchema.colId; - - int32_t size = TMAX(idata.info.bytes * numOfRows, minSize); - idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform taosArrayPush(res->pDataBlock, &idata); } + blockDataEnsureCapacity(res, numOfRows); return res; } +SSDataBlock* createOutputBuf_rv1(SDataBlockDescNode* pNode) { + int32_t numOfCols = LIST_LENGTH(pNode->pSlots); + SSDataBlock* pBlock = calloc(1, sizeof(SSDataBlock)); + pBlock->info.numOfCols = numOfCols; + pBlock->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData)); + + for(int32_t i = 0; i < numOfCols; ++i) { + SColumnInfoData idata = {{0}}; + SSlotDescNode* pDescNode = nodesListGetNode(pNode->pSlots, i); + idata.info.type = pDescNode->dataType.type; + idata.info.bytes = pDescNode->dataType.bytes; + idata.info.slotId = pDescNode->slotId; + } +} + static bool isSelectivityWithTagsQuery(SqlFunctionCtx *pCtx, int32_t numOfOutput) { return true; // bool hasTags = false; @@ -8041,6 +8052,10 @@ static tsdbReaderT doCreateDataReader(STableScanPhysiNode* pTableScanNode, SRead static int32_t doCreateTableGroup(void* metaHandle, int32_t tableType, uint64_t tableUid, STableGroupInfo* pGroupInfo, uint64_t queryId, uint64_t taskId); SOperatorInfo* doCreateOperatorTreeNode(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SReadHandle* pHandle, uint64_t queryId, uint64_t taskId, STableGroupInfo* pTableGroupInfo) { + if (nodeType(pPhyNode) == QUERY_NODE_PHYSICAL_PLAN_PROJECT) { // ignore the project node + pPhyNode = nodesListGetNode(pPhyNode->pChildren, 0); + } + if (pPhyNode->pChildren == NULL || LIST_LENGTH(pPhyNode->pChildren) == 0) { if (QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN == nodeType(pPhyNode)) { SScanPhysiNode* pScanPhyNode = (SScanPhysiNode*)pPhyNode; @@ -8119,15 +8134,15 @@ static tsdbReaderT createDataReaderImpl(STableScanPhysiNode* pTableScanNode, STa cond.twindow = pTableScanNode->scanRange; cond.type = BLOCK_LOAD_OFFSET_SEQ_ORDER; +// cond.type = pTableScanNode->scanFlag; for (int32_t i = 0; i < cond.numOfCols; ++i) { - // SExprInfo* pExprInfo = taosArrayGetP(pTableScanNode->scan.node.pTargets, i); - // assert(pExprInfo->pExpr->nodeType == TEXPR_COL_NODE); + STargetNode* pNode = (STargetNode*)nodesListGetNode(pTableScanNode->scan.pScanCols, i); - // SSchema* pSchema = pExprInfo->pExpr->pSchema; - // cond.colList[i].type = pSchema->type; - // cond.colList[i].bytes = pSchema->bytes; - // cond.colList[i].colId = pSchema->colId; + SColumnNode* pColNode = (SColumnNode*)pNode->pExpr; + cond.colList[i].type = pColNode->colType; + cond.colList[i].bytes = pColNode->node.resType.type; + cond.colList[i].colId = pColNode->colId; } return tsdbQueryTables(readHandle, &cond, pGroupInfo, queryId, taskId); diff --git a/source/libs/executor/test/executorTests.cpp b/source/libs/executor/test/executorTests.cpp index 175d04beff..9ba6afc006 100644 --- a/source/libs/executor/test/executorTests.cpp +++ b/source/libs/executor/test/executorTests.cpp @@ -224,587 +224,711 @@ int main(int argc, char** argv) { TEST(testCase, build_executor_tree_Test) { const char* msg = "{\n" - " \"Type\": \"33\",\n" - " \"Name\": \"PhysiProject\",\n" - " \"PhysiProject\": {\n" - " \"OutputDataBlockDesc\": {\n" - " \"Type\": \"19\",\n" - " \"Name\": \"TupleDesc\",\n" - " \"TupleDesc\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"Slots\": [\n" + " \"NodeType\": \"47\",\n" + " \"Name\": \"PhysiSubplan\",\n" + " \"PhysiSubplan\": {\n" + " \"Id\": {\n" + " \"QueryId\": \"0\",\n" + " \"TemplateId\": \"0\",\n" + " \"SubplanId\": \"0\"\n" + " },\n" + " \"SubplanType\": \"0\",\n" + " \"MsgType\": \"0\",\n" + " \"Level\": \"0\",\n" + " \"NodeAddr\": {\n" + " \"Id\": \"0\",\n" + " \"InUse\": \"0\",\n" + " \"NumOfEps\": \"0\"\n" + " },\n" + " \"RootNode\": {\n" + " \"NodeType\": \"40\",\n" + " \"Name\": \"PhysiProject\",\n" + " \"PhysiProject\": {\n" + " \"OutputDataBlockDesc\": {\n" + " \"NodeType\": \"19\",\n" + " \"Name\": \"TupleDesc\",\n" + " \"TupleDesc\": {\n" + " \"DataBlockId\": \"1\",\n" + " \"Slots\": [\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"0\",\n" + " \"DataType\": {\n" + " \"Type\": \"9\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"1\",\n" + " \"DataType\": {\n" + " \"Type\": \"4\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"4\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"2\",\n" + " \"DataType\": {\n" + " \"Type\": \"8\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"20\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"3\",\n" + " \"DataType\": {\n" + " \"Type\": \"5\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"4\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"5\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " }\n" + " ]\n" + " }\n" + " },\n" + " \"Children\": [\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"37\",\n" + " \"Name\": \"PhysiTableScan\",\n" + " \"PhysiTableScan\": {\n" + " \"OutputDataBlockDesc\": {\n" + " \"NodeType\": \"19\",\n" + " \"Name\": \"TupleDesc\",\n" + " \"TupleDesc\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"Slots\": [\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"0\",\n" + " \"DataType\": {\n" + " \"Type\": \"9\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"1\",\n" + " \"DataType\": {\n" + " \"Type\": \"4\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"4\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"2\",\n" + " \"DataType\": {\n" + " \"Type\": \"8\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"20\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"3\",\n" + " \"DataType\": {\n" + " \"Type\": \"5\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"4\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"5\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": true\n" + " }\n" + " }\n" + " ]\n" + " }\n" + " },\n" + " \"ScanCols\": [\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"9\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"ts\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"1\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"ts\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"1\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"4\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"4\"\n" + " },\n" + " \"AliasName\": \"c1\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"2\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c1\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"2\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"8\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"20\"\n" + " },\n" + " \"AliasName\": \"c2\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"3\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c2\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"3\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"5\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c3\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"4\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c3\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"4\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c4\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"5\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c4\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"5\",\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c5\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"6\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c5\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" + " }\n" + " }\n" + " ],\n" + " \"TableId\": \"1\",\n" + " \"TableType\": \"3\",\n" + " \"ScanOrder\": \"1\",\n" + " \"ScanCount\": \"1\",\n" + " \"ReverseScanCount\": \"0\",\n" + " \"ScanFlag\": \"0\",\n" + " \"StartKey\": \"-9223372036854775808\",\n" + " \"EndKey\": \"9223372036854775807\"\n" + " }\n" + " }\n" + " ],\n" + " \"Projections\": [\n" + " {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"0\",\n" - " \"DataType\": {\n" - " \"Type\": \"9\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"9\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"ts\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"1\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"ts\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"0\"\n" + " }\n" + " }\n" " }\n" " },\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"1\",\n" - " \"DataType\": {\n" - " \"Type\": \"4\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"4\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"4\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"4\"\n" + " },\n" + " \"AliasName\": \"c1\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"2\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c1\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"1\"\n" + " }\n" + " }\n" " }\n" " },\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"2\",\n" - " \"DataType\": {\n" - " \"Type\": \"8\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"20\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"8\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"20\"\n" + " },\n" + " \"AliasName\": \"c2\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"3\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c2\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"2\"\n" + " }\n" + " }\n" " }\n" " },\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"3\",\n" - " \"DataType\": {\n" - " \"Type\": \"5\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"5\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c3\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"4\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c3\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"3\"\n" + " }\n" + " }\n" " }\n" " },\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"4\",\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c4\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"5\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c4\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"4\"\n" + " }\n" + " }\n" " }\n" " },\n" " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" + " \"NodeType\": \"18\",\n" + " \"Name\": \"Target\",\n" + " \"Target\": {\n" + " \"DataBlockId\": \"1\",\n" " \"SlotId\": \"5\",\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": false\n" + " \"Expr\": {\n" + " \"NodeType\": \"1\",\n" + " \"Name\": \"Column\",\n" + " \"Column\": {\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"AliasName\": \"c5\",\n" + " \"TableId\": \"0\",\n" + " \"ColId\": \"6\",\n" + " \"ColType\": \"1\",\n" + " \"DbName\": \"test\",\n" + " \"TableName\": \"t1\",\n" + " \"TableAlias\": \"t1\",\n" + " \"ColName\": \"c5\",\n" + " \"DataBlockId\": \"0\",\n" + " \"SlotId\": \"5\"\n" + " }\n" + " }\n" " }\n" " }\n" " ]\n" " }\n" " },\n" - " \"Children\": [\n" - " {\n" - " \"Type\": \"30\",\n" - " \"Name\": \"PhysiTableScan\",\n" - " \"PhysiTableScan\": {\n" - " \"OutputDataBlockDesc\": {\n" - " \"Type\": \"19\",\n" - " \"Name\": \"TupleDesc\",\n" - " \"TupleDesc\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"Slots\": [\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"0\",\n" - " \"DataType\": {\n" - " \"Type\": \"9\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"1\",\n" - " \"DataType\": {\n" - " \"Type\": \"4\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"4\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"2\",\n" - " \"DataType\": {\n" - " \"Type\": \"8\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"20\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"3\",\n" - " \"DataType\": {\n" - " \"Type\": \"5\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"4\",\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"20\",\n" - " \"Name\": \"SlotDesc\",\n" - " \"SlotDesc\": {\n" - " \"SlotId\": \"5\",\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"Reserve\": false,\n" - " \"Output\": true\n" - " }\n" + " \"DataSink\": {\n" + " \"NodeType\": \"45\",\n" + " \"Name\": \"PhysiDispatch\",\n" + " \"PhysiDispatch\": {\n" + " \"InputDataBlockDesc\": {\n" + " \"NodeType\": \"19\",\n" + " \"Name\": \"TupleDesc\",\n" + " \"TupleDesc\": {\n" + " \"DataBlockId\": \"1\",\n" + " \"Slots\": [\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"0\",\n" + " \"DataType\": {\n" + " \"Type\": \"9\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" " }\n" - " ]\n" - " }\n" - " },\n" - " \"ScanCols\": [\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"9\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"ts\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"1\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"ts\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"1\",\n" + " \"DataType\": {\n" + " \"Type\": \"4\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"4\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"2\",\n" + " \"DataType\": {\n" + " \"Type\": \"8\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"20\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"3\",\n" + " \"DataType\": {\n" + " \"Type\": \"5\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"4\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" + " }\n" + " },\n" + " {\n" + " \"NodeType\": \"20\",\n" + " \"Name\": \"SlotDesc\",\n" + " \"SlotDesc\": {\n" + " \"SlotId\": \"5\",\n" + " \"DataType\": {\n" + " \"Type\": \"7\",\n" + " \"Precision\": \"0\",\n" + " \"Scale\": \"0\",\n" + " \"Bytes\": \"8\"\n" + " },\n" + " \"Reserve\": false,\n" + " \"Output\": false\n" " }\n" " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"1\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"4\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"4\"\n" - " },\n" - " \"AliasName\": \"c1\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"2\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c1\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"2\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"8\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"20\"\n" - " },\n" - " \"AliasName\": \"c2\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"3\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c2\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"3\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"5\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c3\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"4\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c3\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"4\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c4\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"5\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c4\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"5\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c5\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"6\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c5\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " }\n" - " ],\n" - " \"TableId\": \"1\",\n" - " \"TableType\": \"3\",\n" - " \"ScanOrder\": \"1\",\n" - " \"ScanCount\": \"1\",\n" - " \"ReverseScanCount\": \"0\",\n" - " \"ScanFlag\": \"0\",\n" - " \"StartKey\": \"-9223372036854775808\",\n" - " \"EndKey\": \"9223372036854775807\"\n" - " }\n" - " }\n" - " ],\n" - " \"Projections\": [\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"0\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"9\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"ts\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"1\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"ts\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"0\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"1\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"4\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"4\"\n" - " },\n" - " \"AliasName\": \"c1\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"2\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c1\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"1\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"2\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"8\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"20\"\n" - " },\n" - " \"AliasName\": \"c2\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"3\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c2\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"2\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"3\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"5\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c3\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"4\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c3\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"3\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"4\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c4\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"5\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c4\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"4\"\n" - " }\n" - " }\n" - " }\n" - " },\n" - " {\n" - " \"Type\": \"18\",\n" - " \"Name\": \"Target\",\n" - " \"Target\": {\n" - " \"DataBlockId\": \"1\",\n" - " \"SlotId\": \"5\",\n" - " \"Expr\": {\n" - " \"Type\": \"1\",\n" - " \"Name\": \"Column\",\n" - " \"Column\": {\n" - " \"DataType\": {\n" - " \"Type\": \"7\",\n" - " \"Precision\": \"0\",\n" - " \"Scale\": \"0\",\n" - " \"Bytes\": \"8\"\n" - " },\n" - " \"AliasName\": \"c5\",\n" - " \"TableId\": \"0\",\n" - " \"ColId\": \"6\",\n" - " \"ColType\": \"1\",\n" - " \"DbName\": \"test\",\n" - " \"TableName\": \"t1\",\n" - " \"TableAlias\": \"t1\",\n" - " \"ColName\": \"c5\",\n" - " \"DataBlockId\": \"0\",\n" - " \"SlotId\": \"5\"\n" - " }\n" + " ]\n" " }\n" " }\n" " }\n" - " ]\n" + " }\n" " }\n" "}"; diff --git a/source/libs/scalar/test/scalar/scalarTests.cpp b/source/libs/scalar/test/scalar/scalarTests.cpp index 539840639f..13c5476a9f 100644 --- a/source/libs/scalar/test/scalar/scalarTests.cpp +++ b/source/libs/scalar/test/scalar/scalarTests.cpp @@ -41,6 +41,14 @@ namespace { +SColumnInfo createColumnInfo(int32_t colId, int32_t type, int32_t bytes) { + SColumnInfo info = {0}; + info.colId = colId; + info.type = type; + info.bytes = bytes; + return info; +} + int64_t scltLeftV = 21, scltRightV = 10; double scltLeftVd = 21.0, scltRightVd = 10.0; @@ -914,7 +922,7 @@ TEST(columnTest, smallint_value_add_int_column) { SArray *blockList = taosArrayInit(2, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_DOUBLE, .bytes = sizeof(double)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_DOUBLE, sizeof(double)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, true, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -954,7 +962,7 @@ TEST(columnTest, bigint_column_multi_binary_column) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_DOUBLE, .bytes = sizeof(double)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_DOUBLE, sizeof(double)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -992,7 +1000,7 @@ TEST(columnTest, smallint_column_and_binary_column) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BIGINT, .bytes = sizeof(int64_t)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1025,7 +1033,7 @@ TEST(columnTest, smallint_column_or_float_column) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BIGINT, .bytes = sizeof(int64_t)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, true, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1058,7 +1066,7 @@ TEST(columnTest, smallint_column_or_double_value) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BIGINT, .bytes = sizeof(int64_t)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, true, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1091,7 +1099,7 @@ TEST(columnTest, smallint_column_greater_double_value) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, true, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1131,7 +1139,7 @@ TEST(columnTest, int_column_in_double_list) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, true, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1190,7 +1198,7 @@ TEST(columnTest, binary_column_in_binary_list) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1234,7 +1242,7 @@ TEST(columnTest, binary_column_like_binary) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1276,7 +1284,7 @@ TEST(columnTest, binary_column_is_true) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1320,7 +1328,7 @@ TEST(columnTest, binary_column_is_null) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1363,7 +1371,7 @@ TEST(columnTest, binary_column_is_not_null) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&opNode, dataBlockId, slotId, opNode); @@ -1405,7 +1413,7 @@ TEST(columnTest, greater_and_lower) { SArray *blockList = taosArrayInit(1, POINTER_BYTES); taosArrayPush(blockList, &src); - SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; + SColumnInfo colInfo = createColumnInfo(1, TSDB_DATA_TYPE_BOOL, sizeof(bool)); int16_t dataBlockId = 0, slotId = 0; scltAppendReservedSlot(blockList, &dataBlockId, &slotId, false, rowNum, &colInfo); scltMakeTargetNode(&logicNode, dataBlockId, slotId, logicNode); From b0a4cc81bf373ab0d2588abdb113756f42483bec Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 4 Mar 2022 22:48:15 +0800 Subject: [PATCH 26/26] [td-13039] refactor and fix bugs. --- source/libs/executor/test/executorTests.cpp | 20 ++++++++++++------- source/libs/parser/test/mockCatalog.cpp | 6 ++++++ .../libs/parser/test/mockCatalogService.cpp | 17 ++++++++++++++++ source/libs/parser/test/mockCatalogService.h | 1 + 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/source/libs/executor/test/executorTests.cpp b/source/libs/executor/test/executorTests.cpp index 9ba6afc006..bfa6325211 100644 --- a/source/libs/executor/test/executorTests.cpp +++ b/source/libs/executor/test/executorTests.cpp @@ -224,7 +224,7 @@ int main(int argc, char** argv) { TEST(testCase, build_executor_tree_Test) { const char* msg = "{\n" - " \"NodeType\": \"47\",\n" + " \"NodeType\": \"48\",\n" " \"Name\": \"PhysiSubplan\",\n" " \"PhysiSubplan\": {\n" " \"Id\": {\n" @@ -233,15 +233,21 @@ TEST(testCase, build_executor_tree_Test) { " \"SubplanId\": \"0\"\n" " },\n" " \"SubplanType\": \"0\",\n" - " \"MsgType\": \"0\",\n" + " \"MsgType\": \"515\",\n" " \"Level\": \"0\",\n" " \"NodeAddr\": {\n" - " \"Id\": \"0\",\n" + " \"Id\": \"1\",\n" " \"InUse\": \"0\",\n" - " \"NumOfEps\": \"0\"\n" + " \"NumOfEps\": \"1\",\n" + " \"Eps\": [\n" + " {\n" + " \"Fqdn\": \"node1\",\n" + " \"Port\": \"6030\"\n" + " }\n" + " ]\n" " },\n" " \"RootNode\": {\n" - " \"NodeType\": \"40\",\n" + " \"NodeType\": \"41\",\n" " \"Name\": \"PhysiProject\",\n" " \"PhysiProject\": {\n" " \"OutputDataBlockDesc\": {\n" @@ -345,7 +351,7 @@ TEST(testCase, build_executor_tree_Test) { " },\n" " \"Children\": [\n" " {\n" - " \"NodeType\": \"37\",\n" + " \"NodeType\": \"38\",\n" " \"Name\": \"PhysiTableScan\",\n" " \"PhysiTableScan\": {\n" " \"OutputDataBlockDesc\": {\n" @@ -825,7 +831,7 @@ TEST(testCase, build_executor_tree_Test) { " }\n" " },\n" " \"DataSink\": {\n" - " \"NodeType\": \"45\",\n" + " \"NodeType\": \"46\",\n" " \"Name\": \"PhysiDispatch\",\n" " \"PhysiDispatch\": {\n" " \"InputDataBlockDesc\": {\n" diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp index e626fc68ae..7415e95bdb 100644 --- a/source/libs/parser/test/mockCatalog.cpp +++ b/source/libs/parser/test/mockCatalog.cpp @@ -58,6 +58,10 @@ int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, void *pRpc, const return mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo); } +int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const SName* pTableName, SArray** pVgList) { + return mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList); +} + void initMetaDataEnv() { mockCatalogService.reset(new MockCatalogService()); @@ -65,6 +69,8 @@ void initMetaDataEnv() { stub.set(catalogGetHandle, __catalogGetHandle); stub.set(catalogGetTableMeta, __catalogGetTableMeta); stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup); + stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo); + { AddrAny any("libcatalog.so"); std::map result; diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp index 00d64bd12a..a1de7c47a7 100644 --- a/source/libs/parser/test/mockCatalogService.cpp +++ b/source/libs/parser/test/mockCatalogService.cpp @@ -126,6 +126,19 @@ public: return 0; } + int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const { + SVgroupInfo info = {0}; + info.vgId = 1; + addEpIntoEpSet(&info.epset, "node1", 6030); + + info.hashBegin = 0; + info.hashEnd = 1; + *pVgList = taosArrayInit(4, sizeof(SVgroupInfo)); + + taosArrayPush(*pVgList, &info); + return 0; + } + TableBuilder& createTableBuilder(const std::string& db, const std::string& tbname, int8_t tableType, int32_t numOfColumns, int32_t numOfTags) { builder_ = TableBuilder::createTableBuilder(tableType, numOfColumns, numOfTags); meta_[db][tbname] = builder_->table(); @@ -313,4 +326,8 @@ int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableM int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const { return impl_->catalogGetTableHashVgroup(pTableName, vgInfo); +} + +int32_t MockCatalogService::catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const { + return impl_->catalogGetTableDistVgInfo(pTableName, pVgList); } \ No newline at end of file diff --git a/source/libs/parser/test/mockCatalogService.h b/source/libs/parser/test/mockCatalogService.h index b971331635..1f7cd70ac2 100644 --- a/source/libs/parser/test/mockCatalogService.h +++ b/source/libs/parser/test/mockCatalogService.h @@ -59,6 +59,7 @@ public: int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const; int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const; + int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const; private: std::unique_ptr impl_;