From c6d23aa82d5222114f175c316623e3152d73a29d Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 6 Oct 2021 23:46:48 +0800 Subject: [PATCH] [TD-10529] --- include/libs/transport/transport.h | 18 +++ include/os/os.h | 1 + source/libs/catalog/CMakeLists.txt | 5 + source/libs/parser/CMakeLists.txt | 12 ++ source/libs/parser/inc/parserInt.h | 175 +++++++++++++++++++++++++++++ source/libs/parser/src/parser.c | 6 +- 6 files changed, 216 insertions(+), 1 deletion(-) diff --git a/include/libs/transport/transport.h b/include/libs/transport/transport.h index 2733108825..e7660e4d66 100644 --- a/include/libs/transport/transport.h +++ b/include/libs/transport/transport.h @@ -20,6 +20,24 @@ extern "C" { #endif +typedef void* SEpSet; + +typedef struct SEpAddr { + char fqdn[TSDB_FQDN_LEN]; + uint16_t port; +} SEpAddr; + +typedef struct SVgroup { + int32_t vgId; + int8_t numOfEps; + SEpAddr epAddr[TSDB_MAX_REPLICA]; +} SVgroup; + +typedef struct SVgroupsInfo { + int32_t numOfVgroups; + SVgroup vgroups[]; +} SVgroupsInfo; + #ifdef __cplusplus } #endif diff --git a/include/os/os.h b/include/os/os.h index 259aef8143..83aca8ac55 100644 --- a/include/os/os.h +++ b/include/os/os.h @@ -27,6 +27,7 @@ extern "C" { #include #include #include +#include #include "osAtomic.h" #include "osDef.h" diff --git a/source/libs/catalog/CMakeLists.txt b/source/libs/catalog/CMakeLists.txt index ae331bf392..ff3e62700a 100644 --- a/source/libs/catalog/CMakeLists.txt +++ b/source/libs/catalog/CMakeLists.txt @@ -4,4 +4,9 @@ target_include_directories( catalog PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/catalog" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" +) + +target_link_libraries( + catalog + PRIVATE os util common transport ) \ No newline at end of file diff --git a/source/libs/parser/CMakeLists.txt b/source/libs/parser/CMakeLists.txt index e69de29bb2..8f6d8d2880 100644 --- a/source/libs/parser/CMakeLists.txt +++ b/source/libs/parser/CMakeLists.txt @@ -0,0 +1,12 @@ +aux_source_directory(src PARSER_SRC) +add_library(parser ${PARSER_SRC}) +target_include_directories( + parser + PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/parser" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" +) + +target_link_libraries( + parser + PRIVATE os util common catalog transport +) \ No newline at end of file diff --git a/source/libs/parser/inc/parserInt.h b/source/libs/parser/inc/parserInt.h index 2c76f1bb96..a3e84cdb22 100644 --- a/source/libs/parser/inc/parserInt.h +++ b/source/libs/parser/inc/parserInt.h @@ -20,6 +20,181 @@ extern "C" { #endif +#include "catalog.h" +#include "parser.h" +#include "tname.h" +#include "astGen.h" + +typedef struct SField { + char name[TSDB_COL_NAME_LEN]; + uint8_t type; + int16_t bytes; +} SField; + +typedef struct SInterval { + int32_t tz; // query client timezone + char intervalUnit; + char slidingUnit; + char offsetUnit; + int64_t interval; + int64_t sliding; + int64_t offset; +} SInterval; + +typedef struct SSessionWindow { + int64_t gap; // gap between two session window(in microseconds) + int32_t primaryColId; // primary timestamp column +} SSessionWindow; + +typedef struct SGroupbyExpr { + int16_t tableIndex; + SArray* columnInfo; // SArray, group by columns information + int16_t numOfGroupCols; // todo remove it + int16_t orderIndex; // order by column index + int16_t orderType; // order by type: asc/desc +} SGroupbyExpr; + +typedef struct SFieldInfo { + int16_t numOfOutput; // number of column in result + SField *final; + SArray *internalField; // SArray +} SFieldInfo; + +typedef struct SLimitVal { + int64_t limit; + int64_t offset; +} SLimitVal; + +typedef struct SOrderVal { + uint32_t order; + int32_t orderColId; +} SOrderVal; + +typedef struct SCond { + uint64_t uid; + int32_t len; // length of tag query condition data + char * cond; +} SCond; + +typedef struct SJoinNode { + uint64_t uid; + int16_t tagColId; + SArray* tsJoin; + SArray* tagJoin; +} SJoinNode; + +typedef struct SJoinInfo { + bool hasJoin; + SJoinNode *joinTables[TSDB_MAX_JOIN_TABLE_NUM]; +} SJoinInfo; + +typedef struct STagCond { + int16_t relType; // relation between tbname list and query condition, including : TK_AND or TK_OR + SCond tbnameCond; // tbname query condition, only support tbname query condition on one table + SJoinInfo joinInfo; // join condition, only support two tables join currently + SArray *pCond; // for different table, the query condition must be seperated +} STagCond; + +typedef struct STableMetaInfo { + STableMeta *pTableMeta; // table meta, cached in client side and acquired by name + uint32_t tableMetaSize; + size_t tableMetaCapacity; + SVgroupsInfo *vgroupList; + SArray *pVgroupTables; // SArray + + /* + * 1. keep the vgroup index during the multi-vnode super table projection query + * 2. keep the vgroup index for multi-vnode insertion + */ + int32_t vgroupIndex; + SName name; + char aliasName[TSDB_TABLE_NAME_LEN]; // alias name of table specified in query sql + SArray *tagColList; // SArray, involved tag columns +} STableMetaInfo; + +typedef struct SInsertStmtInfo { + SHashObj *pTableBlockHashList; // data block for each table + SArray *pDataBlocks; // SArray. Merged submit block for each vgroup + int8_t schemaAttached; // 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 + uint32_t insertType; // insert data from [file|sql statement| bound statement] + char *sql; // current sql statement position +} SInsertStmtInfo; + +typedef struct SQueryStmtInfo { + int16_t command; // the command may be different for each subclause, so keep it seperately. + uint32_t type; // query/insert type + STimeWindow window; // the whole query time window + + SInterval interval; // tumble time window + SSessionWindow sessionWindow; // session time window + + SGroupbyExpr groupbyExpr; // groupby tags info + SArray * colList; // SArray + SFieldInfo fieldsInfo; + SArray * exprList; // SArray + SArray * exprList1; // final exprlist in case of arithmetic expression exists + SLimitVal limit; + SLimitVal slimit; + STagCond tagCond; + + SArray * colCond; + + SOrderVal order; + int16_t numOfTables; + int16_t curTableIdx; + STableMetaInfo **pTableMetaInfo; + struct STSBuf *tsBuf; + + int16_t fillType; // final result fill type + int64_t * fillVal; // default value for fill + int32_t numOfFillVal; // fill value size + + char * msg; // pointer to the pCmd->payload to keep error message temporarily + int64_t clauseLimit; // limit for current sub clause + + int64_t prjOffset; // offset value in the original sql expression, only applied at client side + int64_t vgroupLimit; // table limit in case of super table projection query + global order + limit + + int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX + bool distinct; // distinct tag or not + bool onlyHasTagCond; + int32_t bufLen; + char* buf; + SArray *pUdfInfo; + + struct SQueryStmtInfo *sibling; // sibling + SArray *pUpstream; // SArray + struct SQueryStmtInfo *pDownstream; + int32_t havingFieldNum; + bool stableQuery; + bool groupbyColumn; + bool simpleAgg; + bool arithmeticOnAgg; + bool projectionQuery; + bool hasFilter; + bool onlyTagQuery; + bool orderProjectQuery; + bool stateWindow; + bool globalMerge; + bool multigroupResult; +} SQueryStmtInfo; + +/** + * validate the AST by pNode + * @param pNode + * @return SQueryNode a bounded AST with essential meta data from local buffer or mgmt node + */ +int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, const SSqlNode* pNode, SQueryStmtInfo* pQueryInfo); + +/** + * + * @param pSqlNode + * @param pMetaInfo + * @return + */ +int32_t qParserExtractRequestedMetaInfo(const SSqlNode* pSqlNode, SMetaReq* pMetaInfo); + #ifdef __cplusplus } #endif diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 6dea4a4e57..28574fa306 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -11,4 +11,8 @@ * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . - */ \ No newline at end of file + */ + +#include "parserInt.h" +#include "astGen.h" +#include "ttoken.h" \ No newline at end of file