Merge remote-tracking branch 'origin/3.0' into feature/shm
This commit is contained in:
commit
2ba675ec40
|
@ -88,6 +88,7 @@ tests/examples/JDBC/JDBCDemo/.classpath
|
||||||
tests/examples/JDBC/JDBCDemo/.project
|
tests/examples/JDBC/JDBCDemo/.project
|
||||||
tests/examples/JDBC/JDBCDemo/.settings/
|
tests/examples/JDBC/JDBCDemo/.settings/
|
||||||
source/libs/parser/inc/sql.*
|
source/libs/parser/inc/sql.*
|
||||||
|
tests/script/tmqResult.txt
|
||||||
|
|
||||||
# Emacs
|
# Emacs
|
||||||
# -*- mode: gitignore; -*-
|
# -*- mode: gitignore; -*-
|
||||||
|
|
|
@ -83,11 +83,6 @@ if(${BUILD_WITH_NURAFT})
|
||||||
cat("${CMAKE_SUPPORT_DIR}/nuraft_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${CMAKE_SUPPORT_DIR}/nuraft_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
endif(${BUILD_WITH_NURAFT})
|
endif(${BUILD_WITH_NURAFT})
|
||||||
|
|
||||||
# iconv
|
|
||||||
if(${BUILD_WITH_ICONV})
|
|
||||||
cat("${CMAKE_SUPPORT_DIR}/iconv_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
|
||||||
endif(${BUILD_WITH_ICONV})
|
|
||||||
|
|
||||||
# download dependencies
|
# download dependencies
|
||||||
configure_file(${CONTRIB_TMP_FILE} "${CMAKE_CONTRIB_DIR}/deps-download/CMakeLists.txt")
|
configure_file(${CONTRIB_TMP_FILE} "${CMAKE_CONTRIB_DIR}/deps-download/CMakeLists.txt")
|
||||||
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
|
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
|
||||||
|
@ -213,11 +208,9 @@ endif(${BUILD_WITH_TRAFT})
|
||||||
|
|
||||||
# LIBUV
|
# LIBUV
|
||||||
if(${BUILD_WITH_UV})
|
if(${BUILD_WITH_UV})
|
||||||
add_compile_options(-Wno-sign-compare)
|
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
if (${TD_WINDOWS})
|
MESSAGE("Windows need set no-sign-compare")
|
||||||
file(READ "libuv/include/uv.h" CONTENTS)
|
add_compile_options(-Wno-sign-compare)
|
||||||
string(REGEX REPLACE "/([\r]*)\nstruct uv_tcp_s {" "/\\1\ntypedef BOOL (PASCAL *LPFN_CONNECTEX) (SOCKET s, const struct sockaddr* name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength,LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped);\\1\nstruct uv_tcp_s {" CONTENTS_NEW "${CONTENTS}")
|
|
||||||
file(WRITE "libuv/include/uv.h" "${CONTENTS_NEW}")
|
|
||||||
endif ()
|
endif ()
|
||||||
add_subdirectory(libuv)
|
add_subdirectory(libuv)
|
||||||
endif(${BUILD_WITH_UV})
|
endif(${BUILD_WITH_UV})
|
||||||
|
@ -250,15 +243,7 @@ if(${BUILD_WITH_SQLITE})
|
||||||
endif(${BUILD_WITH_SQLITE})
|
endif(${BUILD_WITH_SQLITE})
|
||||||
|
|
||||||
# pthread
|
# pthread
|
||||||
if(${BUILD_PTHREAD})
|
|
||||||
add_definitions(-DPTW32_STATIC_LIB)
|
|
||||||
add_subdirectory(pthread)
|
|
||||||
endif(${BUILD_PTHREAD})
|
|
||||||
|
|
||||||
# iconv
|
|
||||||
if(${BUILD_WITH_ICONV})
|
|
||||||
add_subdirectory(iconv)
|
|
||||||
endif(${BUILD_WITH_ICONV})
|
|
||||||
|
|
||||||
# ================================================================================================
|
# ================================================================================================
|
||||||
# Build test
|
# Build test
|
||||||
|
|
|
@ -1,12 +1,30 @@
|
||||||
aux_source_directory(src TMQ_DEMO_SRC)
|
add_executable(tmq "")
|
||||||
|
add_executable(tstream "")
|
||||||
|
|
||||||
add_executable(tmq ${TMQ_DEMO_SRC})
|
target_sources(tmq
|
||||||
target_link_libraries(
|
PRIVATE
|
||||||
tmq taos
|
"src/tmq.c"
|
||||||
)
|
)
|
||||||
target_include_directories(
|
|
||||||
tmq
|
target_sources(tstream
|
||||||
|
PRIVATE
|
||||||
|
"src/tstream.c"
|
||||||
|
)
|
||||||
|
target_link_libraries(tmq
|
||||||
|
taos
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tstream
|
||||||
|
taos
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tmq
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tstream
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
||||||
|
SET_TARGET_PROPERTIES(tstream PROPERTIES OUTPUT_NAME tstream)
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "taos.h"
|
||||||
|
|
||||||
|
int32_t init_env() {
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists tu1 using st1 tags(1)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists tu2 using st1 tags(2)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table tu2, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t create_stream() {
|
||||||
|
printf("create stream\n");
|
||||||
|
TAOS_RES* pRes;
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
/*const char* sql = "select min(k), max(k), sum(k) from tu1";*/
|
||||||
|
const char* sql = "select min(k), max(k), sum(k) from st1";
|
||||||
|
/*const char* sql = "select sum(k) from tu1 interval(10m)";*/
|
||||||
|
pRes = tmq_create_stream(pConn, "stream1", "out1", sql);
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create stream out1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
taos_close(pConn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
int code;
|
||||||
|
if (argc > 1) {
|
||||||
|
printf("env init\n");
|
||||||
|
code = init_env();
|
||||||
|
}
|
||||||
|
create_stream();
|
||||||
|
#if 0
|
||||||
|
tmq_t* tmq = build_consumer();
|
||||||
|
tmq_list_t* topic_list = build_topic_list();
|
||||||
|
/*perf_loop(tmq, topic_list);*/
|
||||||
|
/*basic_consume_loop(tmq, topic_list);*/
|
||||||
|
sync_consume_loop(tmq, topic_list);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -214,7 +214,6 @@ typedef void(tmq_commit_cb(tmq_t *, tmq_resp_err_t, tmq_topic_vgroup_list_t *, v
|
||||||
DLL_EXPORT tmq_list_t *tmq_list_new();
|
DLL_EXPORT tmq_list_t *tmq_list_new();
|
||||||
DLL_EXPORT int32_t tmq_list_append(tmq_list_t *, const char *);
|
DLL_EXPORT int32_t tmq_list_append(tmq_list_t *, const char *);
|
||||||
|
|
||||||
DLL_EXPORT TAOS_RES *tmq_create_topic(TAOS *taos, const char *name, const char *sql, int sqlLen);
|
|
||||||
DLL_EXPORT tmq_t *tmq_consumer_new(void *conn, tmq_conf_t *conf, char *errstr, int32_t errstrLen);
|
DLL_EXPORT tmq_t *tmq_consumer_new(void *conn, tmq_conf_t *conf, char *errstr, int32_t errstrLen);
|
||||||
DLL_EXPORT void tmq_message_destroy(tmq_message_t *tmq_message);
|
DLL_EXPORT void tmq_message_destroy(tmq_message_t *tmq_message);
|
||||||
DLL_EXPORT const char *tmq_err2str(tmq_resp_err_t);
|
DLL_EXPORT const char *tmq_err2str(tmq_resp_err_t);
|
||||||
|
@ -258,7 +257,12 @@ int32_t tmqGetSkipLogNum(tmq_message_t *tmq_message);
|
||||||
DLL_EXPORT TAOS_ROW tmq_get_row(tmq_message_t *message);
|
DLL_EXPORT TAOS_ROW tmq_get_row(tmq_message_t *message);
|
||||||
DLL_EXPORT char *tmq_get_topic_name(tmq_message_t *message);
|
DLL_EXPORT char *tmq_get_topic_name(tmq_message_t *message);
|
||||||
|
|
||||||
/* ---------------------- OTHER ---------------------------- */
|
/* --------------------TMPORARY INTERFACE FOR TESTING--------------------- */
|
||||||
|
DLL_EXPORT TAOS_RES *tmq_create_topic(TAOS *taos, const char *name, const char *sql, int sqlLen);
|
||||||
|
|
||||||
|
DLL_EXPORT TAOS_RES *tmq_create_stream(TAOS *taos, const char *streamName, const char *tbName, const char *sql);
|
||||||
|
|
||||||
|
/* -------------------------------- OTHER -------------------------------- */
|
||||||
typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB *tsub, TAOS_RES *res, void *param, int code);
|
typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB *tsub, TAOS_RES *res, void *param, int code);
|
||||||
|
|
||||||
DLL_EXPORT int taos_stmt_affected_rows(TAOS_STMT *stmt);
|
DLL_EXPORT int taos_stmt_affected_rows(TAOS_STMT *stmt);
|
||||||
|
|
|
@ -30,12 +30,13 @@ typedef int64_t tb_uid_t;
|
||||||
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
|
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TSDB_SUPER_TABLE = 1, // super table
|
TSDB_SUPER_TABLE = 1, // super table
|
||||||
TSDB_CHILD_TABLE = 2, // table created from super table
|
TSDB_CHILD_TABLE = 2, // table created from super table
|
||||||
TSDB_NORMAL_TABLE = 3, // ordinary table
|
TSDB_NORMAL_TABLE = 3, // ordinary table
|
||||||
TSDB_STREAM_TABLE = 4, // table created by stream processing
|
TSDB_STREAM_TABLE = 4, // table created from stream computing
|
||||||
TSDB_TEMP_TABLE = 5, // temp table created by nest query
|
TSDB_TEMP_TABLE = 5, // temp table created by nest query
|
||||||
TSDB_TABLE_MAX = 6
|
TSDB_SYSTEM_TABLE = 6,
|
||||||
|
TSDB_TABLE_MAX = 7
|
||||||
} ETableType;
|
} ETableType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -74,6 +75,8 @@ typedef enum {
|
||||||
|
|
||||||
extern char *qtypeStr[];
|
extern char *qtypeStr[];
|
||||||
|
|
||||||
|
#define TSDB_PORT_DNODEDNODE 5
|
||||||
|
#define TSDB_PORT_SYNC 10
|
||||||
#define TSDB_PORT_HTTP 11
|
#define TSDB_PORT_HTTP 11
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -54,25 +54,15 @@ typedef struct SColumnDataAgg {
|
||||||
} SColumnDataAgg;
|
} SColumnDataAgg;
|
||||||
|
|
||||||
typedef struct SDataBlockInfo {
|
typedef struct SDataBlockInfo {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
int32_t rows;
|
int32_t rows;
|
||||||
int32_t rowSize;
|
int32_t rowSize;
|
||||||
int16_t numOfCols;
|
int16_t numOfCols;
|
||||||
int16_t hasVarCol;
|
int16_t hasVarCol;
|
||||||
union {
|
union {int64_t uid; int64_t blockId;};
|
||||||
int64_t uid;
|
int64_t groupId; // no need to serialize
|
||||||
int64_t blockId;
|
|
||||||
};
|
|
||||||
} SDataBlockInfo;
|
} SDataBlockInfo;
|
||||||
|
|
||||||
// typedef struct SConstantItem {
|
|
||||||
// SColumnInfo info;
|
|
||||||
// int32_t startRow; // run-length-encoding to save the space for multiple rows
|
|
||||||
// int32_t endRow;
|
|
||||||
// SVariant value;
|
|
||||||
// } SConstantItem;
|
|
||||||
|
|
||||||
// info.numOfCols = taosArrayGetSize(pDataBlock) + taosArrayGetSize(pConstantList);
|
|
||||||
typedef struct SSDataBlock {
|
typedef struct SSDataBlock {
|
||||||
SColumnDataAgg* pBlockAgg;
|
SColumnDataAgg* pBlockAgg;
|
||||||
SArray* pDataBlock; // SArray<SColumnInfoData>
|
SArray* pDataBlock; // SArray<SColumnInfoData>
|
||||||
|
@ -101,6 +91,9 @@ void* blockDataDestroy(SSDataBlock* pBlock);
|
||||||
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock);
|
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock);
|
||||||
void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock);
|
void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock);
|
||||||
|
|
||||||
|
int32_t tEncodeDataBlocks(void** buf, const SArray* blocks);
|
||||||
|
void* tDecodeDataBlocks(const void* buf, SArray* blocks);
|
||||||
|
|
||||||
static FORCE_INLINE void blockDestroyInner(SSDataBlock* pBlock) {
|
static FORCE_INLINE void blockDestroyInner(SSDataBlock* pBlock) {
|
||||||
// WARNING: do not use info.numOfCols,
|
// WARNING: do not use info.numOfCols,
|
||||||
// sometimes info.numOfCols != array size
|
// sometimes info.numOfCols != array size
|
||||||
|
@ -183,10 +176,8 @@ typedef struct SColumn {
|
||||||
int64_t dataBlockId;
|
int64_t dataBlockId;
|
||||||
};
|
};
|
||||||
|
|
||||||
union {
|
int16_t colId;
|
||||||
int16_t colId;
|
int16_t slotId;
|
||||||
int16_t slotId;
|
|
||||||
};
|
|
||||||
|
|
||||||
char name[TSDB_COL_NAME_LEN];
|
char name[TSDB_COL_NAME_LEN];
|
||||||
int8_t flag; // column type: normal column, tag, or user-input column (integer/float/string)
|
int8_t flag; // column type: normal column, tag, or user-input column (integer/float/string)
|
||||||
|
|
|
@ -102,8 +102,8 @@ static FORCE_INLINE bool colDataIsNull(const SColumnInfoData* pColumnInfoData, u
|
||||||
: ((p1_)->pData + ((r_) * (p1_)->info.bytes)))
|
: ((p1_)->pData + ((r_) * (p1_)->info.bytes)))
|
||||||
|
|
||||||
int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, bool isNull);
|
int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, bool isNull);
|
||||||
int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, const SColumnInfoData* pSource,
|
int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, const SColumnInfoData* pSource, uint32_t numOfRow2);
|
||||||
uint32_t numOfRow2);
|
int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows);
|
||||||
int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock);
|
int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock);
|
||||||
|
|
||||||
int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows);
|
int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows);
|
||||||
|
@ -112,16 +112,15 @@ void colDataTrim(SColumnInfoData* pColumnInfoData);
|
||||||
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock);
|
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock);
|
||||||
size_t blockDataGetNumOfRows(const SSDataBlock* pBlock);
|
size_t blockDataGetNumOfRows(const SSDataBlock* pBlock);
|
||||||
|
|
||||||
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc);
|
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc);
|
||||||
int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startIndex, int32_t* stopIndex,
|
int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startIndex, int32_t* stopIndex, int32_t pageSize);
|
||||||
int32_t pageSize);
|
|
||||||
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount);
|
|
||||||
|
|
||||||
int32_t blockDataToBuf(char* buf, const SSDataBlock* pBlock);
|
int32_t blockDataToBuf(char* buf, const SSDataBlock* pBlock);
|
||||||
int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf);
|
int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf);
|
||||||
|
|
||||||
|
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount);
|
||||||
|
|
||||||
size_t blockDataGetSize(const SSDataBlock* pBlock);
|
size_t blockDataGetSize(const SSDataBlock* pBlock);
|
||||||
size_t blockDataGetRowSize(const SSDataBlock* pBlock);
|
size_t blockDataGetRowSize(SSDataBlock* pBlock);
|
||||||
double blockDataGetSerialRowSize(const SSDataBlock* pBlock);
|
double blockDataGetSerialRowSize(const SSDataBlock* pBlock);
|
||||||
size_t blockDataGetSerialMetaSize(const SSDataBlock* pBlock);
|
size_t blockDataGetSerialMetaSize(const SSDataBlock* pBlock);
|
||||||
|
|
||||||
|
@ -132,7 +131,7 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
|
||||||
|
|
||||||
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
||||||
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
||||||
void blockDataClearup(SSDataBlock* pDataBlock);
|
void blockDataCleanup(SSDataBlock* pDataBlock);
|
||||||
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
||||||
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
||||||
void* blockDataDestroy(SSDataBlock* pBlock);
|
void* blockDataDestroy(SSDataBlock* pBlock);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "tlist.h"
|
#include "tlist.h"
|
||||||
|
#include "tname.h"
|
||||||
#include "trow.h"
|
#include "trow.h"
|
||||||
#include "tuuid.h"
|
#include "tuuid.h"
|
||||||
|
|
||||||
|
@ -473,6 +474,10 @@ typedef struct {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
} SQueryTableRsp;
|
} SQueryTableRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
|
||||||
|
|
||||||
|
int32_t tDeserializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
|
@ -865,6 +870,7 @@ void tFreeSShowRsp(SShowRsp* pRsp);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t type;
|
int32_t type;
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
|
char tb[TSDB_TABLE_NAME_LEN];
|
||||||
int64_t showId;
|
int64_t showId;
|
||||||
int8_t free;
|
int8_t free;
|
||||||
} SRetrieveTableReq;
|
} SRetrieveTableReq;
|
||||||
|
@ -882,6 +888,17 @@ typedef struct {
|
||||||
char data[];
|
char data[];
|
||||||
} SRetrieveTableRsp;
|
} SRetrieveTableRsp;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t handle;
|
||||||
|
int64_t useconds;
|
||||||
|
int8_t completed; // all results are returned to client
|
||||||
|
int8_t precision;
|
||||||
|
int8_t compressed;
|
||||||
|
int32_t compLen;
|
||||||
|
int32_t numOfRows;
|
||||||
|
char data[];
|
||||||
|
} SRetrieveMetaTableRsp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char fqdn[TSDB_FQDN_LEN]; // end point, hostname:port
|
char fqdn[TSDB_FQDN_LEN]; // end point, hostname:port
|
||||||
int32_t port;
|
int32_t port;
|
||||||
|
@ -1347,33 +1364,54 @@ typedef struct {
|
||||||
int64_t tuid;
|
int64_t tuid;
|
||||||
} SDDropTopicReq;
|
} SDDropTopicReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float xFilesFactor;
|
||||||
|
int8_t delayUnit;
|
||||||
|
int8_t nFuncIds;
|
||||||
|
int32_t* pFuncIds;
|
||||||
|
int64_t delay;
|
||||||
|
} SRSmaParam;
|
||||||
|
|
||||||
typedef struct SVCreateTbReq {
|
typedef struct SVCreateTbReq {
|
||||||
int64_t ver; // use a general definition
|
int64_t ver; // use a general definition
|
||||||
|
char* dbFName;
|
||||||
char* name;
|
char* name;
|
||||||
uint32_t ttl;
|
uint32_t ttl;
|
||||||
uint32_t keep;
|
uint32_t keep;
|
||||||
uint8_t type;
|
union {
|
||||||
|
uint8_t info;
|
||||||
|
struct {
|
||||||
|
uint8_t rollup : 1; // 1 means rollup sma
|
||||||
|
uint8_t type : 7;
|
||||||
|
};
|
||||||
|
};
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
uint32_t nCols;
|
uint32_t nCols;
|
||||||
SSchema* pSchema;
|
SSchema* pSchema;
|
||||||
uint32_t nTagCols;
|
uint32_t nTagCols;
|
||||||
SSchema* pTagSchema;
|
SSchema* pTagSchema;
|
||||||
|
col_id_t nBSmaCols;
|
||||||
|
col_id_t* pBSmaCols;
|
||||||
|
SRSmaParam* pRSmaParam;
|
||||||
} stbCfg;
|
} stbCfg;
|
||||||
struct {
|
struct {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
SKVRow pTag;
|
SKVRow pTag;
|
||||||
} ctbCfg;
|
} ctbCfg;
|
||||||
struct {
|
struct {
|
||||||
uint32_t nCols;
|
uint32_t nCols;
|
||||||
SSchema* pSchema;
|
SSchema* pSchema;
|
||||||
|
col_id_t nBSmaCols;
|
||||||
|
col_id_t* pBSmaCols;
|
||||||
|
SRSmaParam* pRSmaParam;
|
||||||
} ntbCfg;
|
} ntbCfg;
|
||||||
};
|
};
|
||||||
} SVCreateTbReq, SVUpdateTbReq;
|
} SVCreateTbReq, SVUpdateTbReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int tmp; // TODO: to avoid compile error
|
int32_t code;
|
||||||
} SVCreateTbRsp, SVUpdateTbRsp;
|
} SVCreateTbRsp, SVUpdateTbRsp;
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTbReq(void** buf, SVCreateTbReq* pReq);
|
int32_t tSerializeSVCreateTbReq(void** buf, SVCreateTbReq* pReq);
|
||||||
|
@ -1384,13 +1422,16 @@ typedef struct {
|
||||||
SArray* pArray;
|
SArray* pArray;
|
||||||
} SVCreateTbBatchReq;
|
} SVCreateTbBatchReq;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int tmp; // TODO: to avoid compile error
|
|
||||||
} SVCreateTbBatchRsp;
|
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTbBatchReq(void** buf, SVCreateTbBatchReq* pReq);
|
int32_t tSerializeSVCreateTbBatchReq(void** buf, SVCreateTbBatchReq* pReq);
|
||||||
void* tDeserializeSVCreateTbBatchReq(void* buf, SVCreateTbBatchReq* pReq);
|
void* tDeserializeSVCreateTbBatchReq(void* buf, SVCreateTbBatchReq* pReq);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SArray* rspList; // SArray<SVCreateTbRsp>
|
||||||
|
} SVCreateTbBatchRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSVCreateTbBatchRsp(void* buf, int32_t bufLen, SVCreateTbBatchRsp* pRsp);
|
||||||
|
int32_t tDeserializeSVCreateTbBatchRsp(void* buf, int32_t bufLen, SVCreateTbBatchRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t ver;
|
int64_t ver;
|
||||||
char* name;
|
char* name;
|
||||||
|
@ -2306,22 +2347,30 @@ enum {
|
||||||
STREAM_TASK_STATUS__STOP,
|
STREAM_TASK_STATUS__STOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
STREAM_NEXT_OP_DST__VND = 1,
|
||||||
|
STREAM_NEXT_OP_DST__SND,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void* inputHandle;
|
void* inputHandle;
|
||||||
void* executor[4];
|
void* executor;
|
||||||
} SStreamTaskParRunner;
|
} SStreamRunner;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t streamId;
|
int64_t streamId;
|
||||||
int32_t taskId;
|
int32_t taskId;
|
||||||
int32_t level;
|
int32_t level;
|
||||||
int8_t status;
|
int8_t status;
|
||||||
int8_t pipeEnd;
|
int8_t pipeSource;
|
||||||
int8_t parallel;
|
int8_t pipeSink;
|
||||||
|
int8_t numOfRunners;
|
||||||
|
int8_t parallelizable;
|
||||||
|
int8_t nextOpDst; // vnode or snode
|
||||||
SEpSet NextOpEp;
|
SEpSet NextOpEp;
|
||||||
char* qmsg;
|
char* qmsg;
|
||||||
// not applied to encoder and decoder
|
// not applied to encoder and decoder
|
||||||
SStreamTaskParRunner runner;
|
SStreamRunner runner[8];
|
||||||
// void* executor;
|
// void* executor;
|
||||||
// void* stateStore;
|
// void* stateStore;
|
||||||
// storage handle
|
// storage handle
|
||||||
|
@ -2333,6 +2382,8 @@ static FORCE_INLINE SStreamTask* streamTaskNew(int64_t streamId, int32_t level)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pTask->taskId = tGenIdPI32();
|
pTask->taskId = tGenIdPI32();
|
||||||
|
pTask->streamId = streamId;
|
||||||
|
pTask->level = level;
|
||||||
pTask->status = STREAM_TASK_STATUS__RUNNING;
|
pTask->status = STREAM_TASK_STATUS__RUNNING;
|
||||||
pTask->qmsg = NULL;
|
pTask->qmsg = NULL;
|
||||||
return pTask;
|
return pTask;
|
||||||
|
@ -2353,7 +2404,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SStreamExecMsgHead head;
|
SStreamExecMsgHead head;
|
||||||
// TODO: other info needed by task
|
SArray* data; // SArray<SSDataBlock>
|
||||||
} SStreamTaskExecReq;
|
} SStreamTaskExecReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -193,6 +193,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_TASK_DEPLOY, "vnode-task-deploy", SStreamTaskDeployReq, SStreamTaskDeployRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_TASK_DEPLOY, "vnode-task-deploy", SStreamTaskDeployReq, SStreamTaskDeployRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_TASK_EXEC, "vnode-task-exec", SStreamTaskExecReq, SStreamTaskExecRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_TASK_EXEC, "vnode-task-exec", SStreamTaskExecReq, SStreamTaskExecRsp)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_TRIGGER, "vnode-stream-trigger", NULL, NULL)
|
||||||
|
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CREATE_SMA, "vnode-create-sma", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_CREATE_SMA, "vnode-create-sma", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CANCEL_SMA, "vnode-cancel-sma", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_CANCEL_SMA, "vnode-cancel-sma", NULL, NULL)
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#define _TD_COMMON_NAME_H_
|
#define _TD_COMMON_NAME_H_
|
||||||
|
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tmsg.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -61,7 +60,8 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type);
|
||||||
|
|
||||||
int32_t tNameSetAcctId(SName* dst, int32_t acctId);
|
int32_t tNameSetAcctId(SName* dst, int32_t acctId);
|
||||||
|
|
||||||
SSchema createSchema(uint8_t type, int32_t bytes, int32_t colId, const char* name);
|
bool tNameDBNameEqual(SName* left, SName* right);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,7 @@ typedef struct {
|
||||||
#define TD_ROW_HEAD_LEN (sizeof(STSRow))
|
#define TD_ROW_HEAD_LEN (sizeof(STSRow))
|
||||||
#define TD_ROW_NCOLS_LEN (sizeof(col_id_t))
|
#define TD_ROW_NCOLS_LEN (sizeof(col_id_t))
|
||||||
|
|
||||||
|
#define TD_ROW_INFO(r) ((r)->info)
|
||||||
#define TD_ROW_TYPE(r) ((r)->type)
|
#define TD_ROW_TYPE(r) ((r)->type)
|
||||||
#define TD_ROW_DELETE(r) ((r)->del)
|
#define TD_ROW_DELETE(r) ((r)->del)
|
||||||
#define TD_ROW_ENDIAN(r) ((r)->endian)
|
#define TD_ROW_ENDIAN(r) ((r)->endian)
|
||||||
|
@ -180,6 +181,7 @@ typedef struct {
|
||||||
// (int32_t)ceil((double)nCols/TD_VTYPE_PARTS) should be added if TD_SUPPORT_BITMAP defined.
|
// (int32_t)ceil((double)nCols/TD_VTYPE_PARTS) should be added if TD_SUPPORT_BITMAP defined.
|
||||||
#define TD_ROW_MAX_BYTES_FROM_SCHEMA(s) (schemaTLen(s) + TD_ROW_HEAD_LEN)
|
#define TD_ROW_MAX_BYTES_FROM_SCHEMA(s) (schemaTLen(s) + TD_ROW_HEAD_LEN)
|
||||||
|
|
||||||
|
#define TD_ROW_SET_INFO(r, i) (TD_ROW_INFO(r) = (i))
|
||||||
#define TD_ROW_SET_TYPE(r, t) (TD_ROW_TYPE(r) = (t))
|
#define TD_ROW_SET_TYPE(r, t) (TD_ROW_TYPE(r) = (t))
|
||||||
#define TD_ROW_SET_DELETE(r) (TD_ROW_DELETE(r) = 1)
|
#define TD_ROW_SET_DELETE(r) (TD_ROW_DELETE(r) = 1)
|
||||||
#define TD_ROW_SET_SVER(r, v) (TD_ROW_SVER(r) = (v))
|
#define TD_ROW_SET_SVER(r, v) (TD_ROW_SVER(r) = (v))
|
||||||
|
@ -473,6 +475,7 @@ static int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TD_ROW_SET_INFO(pBuilder->pBuf, 0);
|
||||||
TD_ROW_SET_TYPE(pBuilder->pBuf, pBuilder->rowType);
|
TD_ROW_SET_TYPE(pBuilder->pBuf, pBuilder->rowType);
|
||||||
|
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
|
@ -968,10 +971,14 @@ static FORCE_INLINE int32_t tdGetColDataOfRow(SCellVal *pVal, SDataCol *pCol, in
|
||||||
#endif
|
#endif
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (tdGetBitmapValType(pCol->pBitmap, row, &(pVal->valType)) < 0) {
|
|
||||||
|
if (TD_COL_ROWS_NORM(pCol)) {
|
||||||
|
pVal->valType = TD_VTYPE_NORM;
|
||||||
|
} else if (tdGetBitmapValType(pCol->pBitmap, row, &(pVal->valType)) < 0) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
if (TD_COL_ROWS_NORM(pCol) || tdValTypeIsNorm(pVal->valType)) {
|
|
||||||
|
if (tdValTypeIsNorm(pVal->valType)) {
|
||||||
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
pVal->val = POINTER_SHIFT(pCol->pData, pCol->dataOff[row]);
|
pVal->val = POINTER_SHIFT(pCol->pData, pCol->dataOff[row]);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -51,130 +51,133 @@
|
||||||
#define TK_USER 33
|
#define TK_USER 33
|
||||||
#define TK_PRIVILEGE 34
|
#define TK_PRIVILEGE 34
|
||||||
#define TK_DROP 35
|
#define TK_DROP 35
|
||||||
#define TK_SHOW 36
|
#define TK_DNODE 36
|
||||||
#define TK_DNODE 37
|
#define TK_PORT 37
|
||||||
#define TK_PORT 38
|
#define TK_NK_INTEGER 38
|
||||||
#define TK_NK_INTEGER 39
|
#define TK_DNODES 39
|
||||||
#define TK_DNODES 40
|
#define TK_NK_IPTOKEN 40
|
||||||
#define TK_NK_IPTOKEN 41
|
#define TK_LOCAL 41
|
||||||
#define TK_LOCAL 42
|
#define TK_QNODE 42
|
||||||
#define TK_QNODE 43
|
#define TK_ON 43
|
||||||
#define TK_ON 44
|
#define TK_DATABASE 44
|
||||||
#define TK_QNODES 45
|
#define TK_USE 45
|
||||||
#define TK_DATABASE 46
|
#define TK_IF 46
|
||||||
#define TK_DATABASES 47
|
#define TK_NOT 47
|
||||||
#define TK_USE 48
|
#define TK_EXISTS 48
|
||||||
#define TK_IF 49
|
#define TK_BLOCKS 49
|
||||||
#define TK_NOT 50
|
#define TK_CACHE 50
|
||||||
#define TK_EXISTS 51
|
#define TK_CACHELAST 51
|
||||||
#define TK_BLOCKS 52
|
#define TK_COMP 52
|
||||||
#define TK_CACHE 53
|
#define TK_DAYS 53
|
||||||
#define TK_CACHELAST 54
|
#define TK_FSYNC 54
|
||||||
#define TK_COMP 55
|
#define TK_MAXROWS 55
|
||||||
#define TK_DAYS 56
|
#define TK_MINROWS 56
|
||||||
#define TK_FSYNC 57
|
#define TK_KEEP 57
|
||||||
#define TK_MAXROWS 58
|
#define TK_PRECISION 58
|
||||||
#define TK_MINROWS 59
|
#define TK_QUORUM 59
|
||||||
#define TK_KEEP 60
|
#define TK_REPLICA 60
|
||||||
#define TK_PRECISION 61
|
#define TK_TTL 61
|
||||||
#define TK_QUORUM 62
|
#define TK_WAL 62
|
||||||
#define TK_REPLICA 63
|
#define TK_VGROUPS 63
|
||||||
#define TK_TTL 64
|
#define TK_SINGLE_STABLE 64
|
||||||
#define TK_WAL 65
|
#define TK_STREAM_MODE 65
|
||||||
#define TK_VGROUPS 66
|
#define TK_RETENTIONS 66
|
||||||
#define TK_SINGLE_STABLE 67
|
#define TK_FILE_FACTOR 67
|
||||||
#define TK_STREAM_MODE 68
|
#define TK_NK_FLOAT 68
|
||||||
#define TK_RETENTIONS 69
|
#define TK_TABLE 69
|
||||||
#define TK_FILE_FACTOR 70
|
#define TK_NK_LP 70
|
||||||
#define TK_NK_FLOAT 71
|
#define TK_NK_RP 71
|
||||||
#define TK_TABLE 72
|
#define TK_STABLE 72
|
||||||
#define TK_NK_LP 73
|
#define TK_ADD 73
|
||||||
#define TK_NK_RP 74
|
#define TK_COLUMN 74
|
||||||
#define TK_STABLE 75
|
#define TK_MODIFY 75
|
||||||
#define TK_TABLES 76
|
#define TK_RENAME 76
|
||||||
#define TK_STABLES 77
|
#define TK_TAG 77
|
||||||
#define TK_ADD 78
|
#define TK_SET 78
|
||||||
#define TK_COLUMN 79
|
#define TK_NK_EQ 79
|
||||||
#define TK_MODIFY 80
|
#define TK_USING 80
|
||||||
#define TK_RENAME 81
|
#define TK_TAGS 81
|
||||||
#define TK_TAG 82
|
#define TK_NK_DOT 82
|
||||||
#define TK_SET 83
|
#define TK_NK_COMMA 83
|
||||||
#define TK_NK_EQ 84
|
#define TK_COMMENT 84
|
||||||
#define TK_USING 85
|
#define TK_BOOL 85
|
||||||
#define TK_TAGS 86
|
#define TK_TINYINT 86
|
||||||
#define TK_NK_DOT 87
|
#define TK_SMALLINT 87
|
||||||
#define TK_NK_COMMA 88
|
#define TK_INT 88
|
||||||
#define TK_COMMENT 89
|
#define TK_INTEGER 89
|
||||||
#define TK_BOOL 90
|
#define TK_BIGINT 90
|
||||||
#define TK_TINYINT 91
|
#define TK_FLOAT 91
|
||||||
#define TK_SMALLINT 92
|
#define TK_DOUBLE 92
|
||||||
#define TK_INT 93
|
#define TK_BINARY 93
|
||||||
#define TK_INTEGER 94
|
#define TK_TIMESTAMP 94
|
||||||
#define TK_BIGINT 95
|
#define TK_NCHAR 95
|
||||||
#define TK_FLOAT 96
|
#define TK_UNSIGNED 96
|
||||||
#define TK_DOUBLE 97
|
#define TK_JSON 97
|
||||||
#define TK_BINARY 98
|
#define TK_VARCHAR 98
|
||||||
#define TK_TIMESTAMP 99
|
#define TK_MEDIUMBLOB 99
|
||||||
#define TK_NCHAR 100
|
#define TK_BLOB 100
|
||||||
#define TK_UNSIGNED 101
|
#define TK_VARBINARY 101
|
||||||
#define TK_JSON 102
|
#define TK_DECIMAL 102
|
||||||
#define TK_VARCHAR 103
|
#define TK_SMA 103
|
||||||
#define TK_MEDIUMBLOB 104
|
#define TK_ROLLUP 104
|
||||||
#define TK_BLOB 105
|
#define TK_SHOW 105
|
||||||
#define TK_VARBINARY 106
|
#define TK_DATABASES 106
|
||||||
#define TK_DECIMAL 107
|
#define TK_TABLES 107
|
||||||
#define TK_SMA 108
|
#define TK_STABLES 108
|
||||||
#define TK_ROLLUP 109
|
#define TK_MNODES 109
|
||||||
#define TK_INDEX 110
|
#define TK_MODULES 110
|
||||||
#define TK_FULLTEXT 111
|
#define TK_QNODES 111
|
||||||
#define TK_FUNCTION 112
|
#define TK_FUNCTIONS 112
|
||||||
#define TK_INTERVAL 113
|
#define TK_INDEXES 113
|
||||||
#define TK_TOPIC 114
|
#define TK_FROM 114
|
||||||
#define TK_AS 115
|
#define TK_LIKE 115
|
||||||
#define TK_MNODES 116
|
#define TK_INDEX 116
|
||||||
#define TK_NK_BOOL 117
|
#define TK_FULLTEXT 117
|
||||||
#define TK_NK_VARIABLE 118
|
#define TK_FUNCTION 118
|
||||||
#define TK_BETWEEN 119
|
#define TK_INTERVAL 119
|
||||||
#define TK_IS 120
|
#define TK_TOPIC 120
|
||||||
#define TK_NULL 121
|
#define TK_AS 121
|
||||||
#define TK_NK_LT 122
|
#define TK_NK_BOOL 122
|
||||||
#define TK_NK_GT 123
|
#define TK_NK_VARIABLE 123
|
||||||
#define TK_NK_LE 124
|
#define TK_BETWEEN 124
|
||||||
#define TK_NK_GE 125
|
#define TK_IS 125
|
||||||
#define TK_NK_NE 126
|
#define TK_NULL 126
|
||||||
#define TK_LIKE 127
|
#define TK_NK_LT 127
|
||||||
#define TK_MATCH 128
|
#define TK_NK_GT 128
|
||||||
#define TK_NMATCH 129
|
#define TK_NK_LE 129
|
||||||
#define TK_IN 130
|
#define TK_NK_GE 130
|
||||||
#define TK_FROM 131
|
#define TK_NK_NE 131
|
||||||
#define TK_JOIN 132
|
#define TK_MATCH 132
|
||||||
#define TK_INNER 133
|
#define TK_NMATCH 133
|
||||||
#define TK_SELECT 134
|
#define TK_IN 134
|
||||||
#define TK_DISTINCT 135
|
#define TK_JOIN 135
|
||||||
#define TK_WHERE 136
|
#define TK_INNER 136
|
||||||
#define TK_PARTITION 137
|
#define TK_SELECT 137
|
||||||
#define TK_BY 138
|
#define TK_DISTINCT 138
|
||||||
#define TK_SESSION 139
|
#define TK_WHERE 139
|
||||||
#define TK_STATE_WINDOW 140
|
#define TK_PARTITION 140
|
||||||
#define TK_SLIDING 141
|
#define TK_BY 141
|
||||||
#define TK_FILL 142
|
#define TK_SESSION 142
|
||||||
#define TK_VALUE 143
|
#define TK_STATE_WINDOW 143
|
||||||
#define TK_NONE 144
|
#define TK_SLIDING 144
|
||||||
#define TK_PREV 145
|
#define TK_FILL 145
|
||||||
#define TK_LINEAR 146
|
#define TK_VALUE 146
|
||||||
#define TK_NEXT 147
|
#define TK_NONE 147
|
||||||
#define TK_GROUP 148
|
#define TK_PREV 148
|
||||||
#define TK_HAVING 149
|
#define TK_LINEAR 149
|
||||||
#define TK_ORDER 150
|
#define TK_NEXT 150
|
||||||
#define TK_SLIMIT 151
|
#define TK_GROUP 151
|
||||||
#define TK_SOFFSET 152
|
#define TK_HAVING 152
|
||||||
#define TK_LIMIT 153
|
#define TK_ORDER 153
|
||||||
#define TK_OFFSET 154
|
#define TK_SLIMIT 154
|
||||||
#define TK_ASC 155
|
#define TK_SOFFSET 155
|
||||||
#define TK_DESC 156
|
#define TK_LIMIT 156
|
||||||
#define TK_NULLS 157
|
#define TK_OFFSET 157
|
||||||
#define TK_FIRST 158
|
#define TK_ASC 158
|
||||||
#define TK_LAST 159
|
#define TK_DESC 159
|
||||||
|
#define TK_NULLS 160
|
||||||
|
#define TK_FIRST 161
|
||||||
|
#define TK_LAST 162
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
|
|
@ -46,7 +46,7 @@ typedef struct {
|
||||||
#define varDataCopy(dst, v) memcpy((dst), (void *)(v), varDataTLen(v))
|
#define varDataCopy(dst, v) memcpy((dst), (void *)(v), varDataTLen(v))
|
||||||
#define varDataLenByData(v) (*(VarDataLenT *)(((char *)(v)) - VARSTR_HEADER_SIZE))
|
#define varDataLenByData(v) (*(VarDataLenT *)(((char *)(v)) - VARSTR_HEADER_SIZE))
|
||||||
#define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT)(_len))
|
#define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT)(_len))
|
||||||
#define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_BINARY) || ((t) == TSDB_DATA_TYPE_NCHAR))
|
#define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_VARCHAR) || ((t) == TSDB_DATA_TYPE_NCHAR))
|
||||||
|
|
||||||
#define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0]))
|
#define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0]))
|
||||||
#define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v))
|
#define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v))
|
||||||
|
|
|
@ -103,16 +103,17 @@ int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* vers
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pDBName (input, full db name)
|
* @param pDBName (input, full db name)
|
||||||
* @param forceUpdate (input, force update db vgroup info from mnode)
|
|
||||||
* @param pVgroupList (output, vgroup info list, element is SVgroupInfo, NEED to simply free the array by caller)
|
* @param pVgroupList (output, vgroup info list, element is SVgroupInfo, NEED to simply free the array by caller)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t catalogGetDBVgInfo(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const char* pDBName, bool forceUpdate, SArray** pVgroupList);
|
int32_t catalogGetDBVgInfo(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const char* pDBName, SArray** pVgroupList);
|
||||||
|
|
||||||
int32_t catalogUpdateDBVgInfo(SCatalog* pCatalog, const char* dbName, uint64_t dbId, SDBVgInfo* dbInfo);
|
int32_t catalogUpdateDBVgInfo(SCatalog* pCatalog, const char* dbName, uint64_t dbId, SDBVgInfo* dbInfo);
|
||||||
|
|
||||||
int32_t catalogRemoveDB(SCatalog* pCatalog, const char* dbName, uint64_t dbId);
|
int32_t catalogRemoveDB(SCatalog* pCatalog, const char* dbName, uint64_t dbId);
|
||||||
|
|
||||||
|
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName);
|
||||||
|
|
||||||
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid);
|
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -120,7 +121,7 @@ int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId,
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
|
@ -131,7 +132,7 @@ int32_t catalogGetTableMeta(SCatalog* pCatalog, void * pTransporter, const SEpSe
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
|
@ -140,28 +141,38 @@ int32_t catalogGetSTableMeta(SCatalog* pCatalog, void * pTransporter, const SEpS
|
||||||
int32_t catalogUpdateSTableMeta(SCatalog* pCatalog, STableMetaRsp *rspMsg);
|
int32_t catalogUpdateSTableMeta(SCatalog* pCatalog, STableMetaRsp *rspMsg);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force refresh DB's local cached vgroup info.
|
||||||
|
* @param pCtg (input, got with catalogGetHandle)
|
||||||
|
* @param pTrans (input, rpc object)
|
||||||
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
|
* @param dbFName (input, db full name)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int32_t catalogRefreshDBVgInfo(SCatalog* pCtg, void *pTrans, const SEpSet* pMgmtEps, const char* dbFName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Force refresh a table's local cached meta data.
|
* Force refresh a table's local cached meta data.
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param isSTable (input, is super table or not, 1:supposed to be stable, 0: supposed not to be stable, -1:not sure)
|
* @param isSTable (input, is super table or not, 1:supposed to be stable, 0: supposed not to be stable, -1:not sure)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t catalogRefreshTableMeta(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, int32_t isSTable);
|
int32_t catalogRefreshTableMeta(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, int32_t isSTable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Force refresh a table's local cached meta data and get the new one.
|
* Force refresh a table's local cached meta data and get the new one.
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
* @param pTableMeta(output, table meta data, NEED to free it by calller)
|
||||||
* @param isSTable (input, is super table or not, 1:supposed to be stable, 0: supposed not to be stable, -1:not sure)
|
* @param isSTable (input, is super table or not, 1:supposed to be stable, 0: supposed not to be stable, -1:not sure)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t catalogRefreshGetTableMeta(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, STableMeta** pTableMeta, int32_t isSTable);
|
int32_t catalogRefreshGetTableMeta(SCatalog* pCatalog, void *pTransporter, const SEpSet* pMgmtEps, const SName* pTableName, STableMeta** pTableMeta, int32_t isSTable);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,7 +181,7 @@ int32_t catalogUpdateSTableMeta(SCatalog* pCatalog, STableMetaRsp *rspMsg);
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param pVgroupList (output, vgroup info list, element is SVgroupInfo, NEED to simply free the array by caller)
|
* @param pVgroupList (output, vgroup info list, element is SVgroupInfo, NEED to simply free the array by caller)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
|
@ -181,7 +192,7 @@ int32_t catalogGetTableDistVgInfo(SCatalog* pCatalog, void *pTransporter, const
|
||||||
* @param pCatalog (input, got with catalogGetHandle)
|
* @param pCatalog (input, got with catalogGetHandle)
|
||||||
* @param pTransporter (input, rpc object)
|
* @param pTransporter (input, rpc object)
|
||||||
* @param pMgmtEps (input, mnode EPs)
|
* @param pMgmtEps (input, mnode EPs)
|
||||||
* @param pTableName (input, table name, NOT including db name)
|
* @param pTableName (input, table name)
|
||||||
* @param vgInfo (output, vgroup info)
|
* @param vgInfo (output, vgroup info)
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -21,6 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
|
#include "query.h"
|
||||||
|
|
||||||
typedef void* qTaskInfo_t;
|
typedef void* qTaskInfo_t;
|
||||||
typedef void* DataSinkHandle;
|
typedef void* DataSinkHandle;
|
||||||
|
@ -30,18 +31,19 @@ struct SSubplan;
|
||||||
typedef struct SReadHandle {
|
typedef struct SReadHandle {
|
||||||
void* reader;
|
void* reader;
|
||||||
void* meta;
|
void* meta;
|
||||||
|
void* config;
|
||||||
} SReadHandle;
|
} SReadHandle;
|
||||||
|
|
||||||
#define STREAM_DATA_TYPE_SUBMIT_BLOCK 0x1
|
#define STREAM_DATA_TYPE_SUBMIT_BLOCK 0x1
|
||||||
#define STREAM_DATA_TYPE_SSDAT_BLOCK 0x2
|
#define STREAM_DATA_TYPE_SSDATA_BLOCK 0x2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the exec task for streaming mode
|
* Create the exec task for streaming mode
|
||||||
* @param pMsg
|
* @param pMsg
|
||||||
* @param streamReadHandle
|
* @param streamReadHandle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
qTaskInfo_t qCreateStreamExecTaskInfo(void *msg, void* streamReadHandle);
|
qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the input data block for the stream scan.
|
* Set the input data block for the stream scan.
|
||||||
|
@ -62,16 +64,17 @@ int32_t qSetStreamInput(qTaskInfo_t tinfo, const void* input, int32_t type);
|
||||||
*/
|
*/
|
||||||
int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, SArray* tableIdList, bool isAdd);
|
int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, SArray* tableIdList, bool isAdd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the exec task object according to task json
|
* Create the exec task object according to task json
|
||||||
* @param readHandle
|
* @param readHandle
|
||||||
* @param vgId
|
* @param vgId
|
||||||
* @param pTaskInfoMsg
|
* @param pTaskInfoMsg
|
||||||
* @param pTaskInfo
|
* @param pTaskInfo
|
||||||
* @param qId
|
* @param qId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId, struct SSubplan* pPlan, qTaskInfo_t* pTaskInfo, DataSinkHandle* handle);
|
int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId, struct SSubplan* pPlan,
|
||||||
|
qTaskInfo_t* pTaskInfo, DataSinkHandle* handle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main task execution function, including query on both table and multiple tables,
|
* The main task execution function, including query on both table and multiple tables,
|
||||||
|
@ -81,7 +84,7 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
|
||||||
* @param handle
|
* @param handle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds);
|
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t* useconds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the produced results information, if current query is not paused or completed,
|
* Retrieve the produced results information, if current query is not paused or completed,
|
||||||
|
@ -144,7 +147,8 @@ int32_t qGetQualifiedTableIdList(void* pTableList, const char* tagCond, int32_t
|
||||||
* @param numOfIndex
|
* @param numOfIndex
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
//int32_t qCreateTableGroupByGroupExpr(SArray* pTableIdList, TSKEY skey, STableGroupInfo groupInfo, SColIndex* groupByIndex, int32_t numOfIndex);
|
// int32_t qCreateTableGroupByGroupExpr(SArray* pTableIdList, TSKEY skey, STableGroupInfo groupInfo, SColIndex*
|
||||||
|
// groupByIndex, int32_t numOfIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the table id list of a given query.
|
* Update the table id list of a given query.
|
||||||
|
@ -167,19 +171,19 @@ void* qOpenTaskMgmt(int32_t vgId);
|
||||||
* broadcast the close information and wait for all query stop.
|
* broadcast the close information and wait for all query stop.
|
||||||
* @param pExecutor
|
* @param pExecutor
|
||||||
*/
|
*/
|
||||||
void qTaskMgmtNotifyClosing(void* pExecutor);
|
void qTaskMgmtNotifyClosing(void* pExecutor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Re-open the query handle management module when opening the vnode again.
|
* Re-open the query handle management module when opening the vnode again.
|
||||||
* @param pExecutor
|
* @param pExecutor
|
||||||
*/
|
*/
|
||||||
void qQueryMgmtReOpen(void *pExecutor);
|
void qQueryMgmtReOpen(void* pExecutor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close query mgmt and clean up resources.
|
* Close query mgmt and clean up resources.
|
||||||
* @param pExecutor
|
* @param pExecutor
|
||||||
*/
|
*/
|
||||||
void qCleanupTaskMgmt(void* pExecutor);
|
void qCleanupTaskMgmt(void* pExecutor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the query into the query mgmt object
|
* Add the query into the query mgmt object
|
||||||
|
@ -188,7 +192,7 @@ void qCleanupTaskMgmt(void* pExecutor);
|
||||||
* @param qInfo
|
* @param qInfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void** qRegisterTask(void* pMgmt, uint64_t qId, void *qInfo);
|
void** qRegisterTask(void* pMgmt, uint64_t qId, void* qInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acquire the query handle according to the key from query mgmt object.
|
* acquire the query handle according to the key from query mgmt object.
|
||||||
|
|
|
@ -163,7 +163,7 @@ typedef struct SInputColumnInfoData {
|
||||||
typedef struct SqlFunctionCtx {
|
typedef struct SqlFunctionCtx {
|
||||||
SInputColumnInfoData input;
|
SInputColumnInfoData input;
|
||||||
SResultDataInfo resDataInfo;
|
SResultDataInfo resDataInfo;
|
||||||
uint32_t order; // asc|desc
|
uint32_t order; // data block scanner order: asc|desc
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
int32_t startRow; // start row index
|
int32_t startRow; // start row index
|
||||||
int32_t size; // handled processed row number
|
int32_t size; // handled processed row number
|
||||||
|
|
|
@ -179,7 +179,8 @@ typedef struct SAlterDnodeStmt {
|
||||||
|
|
||||||
typedef struct SShowStmt {
|
typedef struct SShowStmt {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
char dbName[TSDB_DB_NAME_LEN];
|
SNode* pDbName; // SValueNode
|
||||||
|
SNode* pTbNamePattern; // SValueNode
|
||||||
} SShowStmt;
|
} SShowStmt;
|
||||||
|
|
||||||
typedef enum EIndexType {
|
typedef enum EIndexType {
|
||||||
|
|
|
@ -78,7 +78,6 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_CREATE_DATABASE_STMT,
|
QUERY_NODE_CREATE_DATABASE_STMT,
|
||||||
QUERY_NODE_DROP_DATABASE_STMT,
|
QUERY_NODE_DROP_DATABASE_STMT,
|
||||||
QUERY_NODE_ALTER_DATABASE_STMT,
|
QUERY_NODE_ALTER_DATABASE_STMT,
|
||||||
QUERY_NODE_SHOW_DATABASES_STMT, // temp
|
|
||||||
QUERY_NODE_CREATE_TABLE_STMT,
|
QUERY_NODE_CREATE_TABLE_STMT,
|
||||||
QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
|
QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
|
||||||
QUERY_NODE_CREATE_MULTI_TABLE_STMT,
|
QUERY_NODE_CREATE_MULTI_TABLE_STMT,
|
||||||
|
@ -86,20 +85,13 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_DROP_TABLE_STMT,
|
QUERY_NODE_DROP_TABLE_STMT,
|
||||||
QUERY_NODE_DROP_SUPER_TABLE_STMT,
|
QUERY_NODE_DROP_SUPER_TABLE_STMT,
|
||||||
QUERY_NODE_ALTER_TABLE_STMT,
|
QUERY_NODE_ALTER_TABLE_STMT,
|
||||||
QUERY_NODE_SHOW_TABLES_STMT, // temp
|
|
||||||
QUERY_NODE_SHOW_STABLES_STMT,
|
|
||||||
QUERY_NODE_CREATE_USER_STMT,
|
QUERY_NODE_CREATE_USER_STMT,
|
||||||
QUERY_NODE_ALTER_USER_STMT,
|
QUERY_NODE_ALTER_USER_STMT,
|
||||||
QUERY_NODE_DROP_USER_STMT,
|
QUERY_NODE_DROP_USER_STMT,
|
||||||
QUERY_NODE_SHOW_USERS_STMT,
|
|
||||||
QUERY_NODE_USE_DATABASE_STMT,
|
QUERY_NODE_USE_DATABASE_STMT,
|
||||||
QUERY_NODE_CREATE_DNODE_STMT,
|
QUERY_NODE_CREATE_DNODE_STMT,
|
||||||
QUERY_NODE_DROP_DNODE_STMT,
|
QUERY_NODE_DROP_DNODE_STMT,
|
||||||
QUERY_NODE_ALTER_DNODE_STMT,
|
QUERY_NODE_ALTER_DNODE_STMT,
|
||||||
QUERY_NODE_SHOW_DNODES_STMT,
|
|
||||||
QUERY_NODE_SHOW_VGROUPS_STMT,
|
|
||||||
QUERY_NODE_SHOW_MNODES_STMT,
|
|
||||||
QUERY_NODE_SHOW_QNODES_STMT,
|
|
||||||
QUERY_NODE_CREATE_INDEX_STMT,
|
QUERY_NODE_CREATE_INDEX_STMT,
|
||||||
QUERY_NODE_DROP_INDEX_STMT,
|
QUERY_NODE_DROP_INDEX_STMT,
|
||||||
QUERY_NODE_CREATE_QNODE_STMT,
|
QUERY_NODE_CREATE_QNODE_STMT,
|
||||||
|
@ -107,6 +99,18 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_CREATE_TOPIC_STMT,
|
QUERY_NODE_CREATE_TOPIC_STMT,
|
||||||
QUERY_NODE_DROP_TOPIC_STMT,
|
QUERY_NODE_DROP_TOPIC_STMT,
|
||||||
QUERY_NODE_ALTER_LOCAL_STMT,
|
QUERY_NODE_ALTER_LOCAL_STMT,
|
||||||
|
QUERY_NODE_SHOW_DATABASES_STMT,
|
||||||
|
QUERY_NODE_SHOW_TABLES_STMT,
|
||||||
|
QUERY_NODE_SHOW_STABLES_STMT,
|
||||||
|
QUERY_NODE_SHOW_USERS_STMT,
|
||||||
|
QUERY_NODE_SHOW_DNODES_STMT,
|
||||||
|
QUERY_NODE_SHOW_VGROUPS_STMT,
|
||||||
|
QUERY_NODE_SHOW_MNODES_STMT,
|
||||||
|
QUERY_NODE_SHOW_MODULES_STMT,
|
||||||
|
QUERY_NODE_SHOW_QNODES_STMT,
|
||||||
|
QUERY_NODE_SHOW_FUNCTIONS_STMT,
|
||||||
|
QUERY_NODE_SHOW_INDEXES_STMT,
|
||||||
|
QUERY_NODE_SHOW_STREAMS_STMT,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN,
|
QUERY_NODE_LOGIC_PLAN_SCAN,
|
||||||
|
|
|
@ -35,8 +35,7 @@ typedef struct SLogicNode {
|
||||||
typedef enum EScanType {
|
typedef enum EScanType {
|
||||||
SCAN_TYPE_TAG,
|
SCAN_TYPE_TAG,
|
||||||
SCAN_TYPE_TABLE,
|
SCAN_TYPE_TABLE,
|
||||||
SCAN_TYPE_STABLE,
|
SCAN_TYPE_SYSTEM_TABLE,
|
||||||
SCAN_TYPE_TOPIC,
|
|
||||||
SCAN_TYPE_STREAM
|
SCAN_TYPE_STREAM
|
||||||
} EScanType;
|
} EScanType;
|
||||||
|
|
||||||
|
@ -165,10 +164,14 @@ typedef struct SScanPhysiNode {
|
||||||
SName tableName;
|
SName tableName;
|
||||||
} SScanPhysiNode;
|
} SScanPhysiNode;
|
||||||
|
|
||||||
typedef SScanPhysiNode SSystemTableScanPhysiNode;
|
|
||||||
typedef SScanPhysiNode STagScanPhysiNode;
|
typedef SScanPhysiNode STagScanPhysiNode;
|
||||||
typedef SScanPhysiNode SStreamScanPhysiNode;
|
typedef SScanPhysiNode SStreamScanPhysiNode;
|
||||||
|
|
||||||
|
typedef struct SSystemTableScanPhysiNode {
|
||||||
|
SScanPhysiNode scan;
|
||||||
|
SEpSet mgmtEpSet;
|
||||||
|
} SSystemTableScanPhysiNode;
|
||||||
|
|
||||||
typedef struct STableScanPhysiNode {
|
typedef struct STableScanPhysiNode {
|
||||||
SScanPhysiNode scan;
|
SScanPhysiNode scan;
|
||||||
uint8_t scanFlag; // denotes reversed scan of data or not
|
uint8_t scanFlag; // denotes reversed scan of data or not
|
||||||
|
@ -244,6 +247,7 @@ typedef struct SSubplan {
|
||||||
ESubplanType subplanType;
|
ESubplanType subplanType;
|
||||||
int32_t msgType; // message type for subplan, used to denote the send message type to vnode.
|
int32_t msgType; // message type for subplan, used to denote the send message type to vnode.
|
||||||
int32_t level; // the execution level of current subplan, starting from 0 in a top-down manner.
|
int32_t level; // the execution level of current subplan, starting from 0 in a top-down manner.
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
SQueryNodeAddr execNode; // for the scan/modify subplan, the optional execution node
|
SQueryNodeAddr execNode; // for the scan/modify subplan, the optional execution node
|
||||||
SQueryNodeStat execNodeStat; // only for scan subplan
|
SQueryNodeStat execNodeStat; // only for scan subplan
|
||||||
SNodeList* pChildren; // the datasource subplan,from which to fetch the result
|
SNodeList* pChildren; // the datasource subplan,from which to fetch the result
|
||||||
|
|
|
@ -130,6 +130,7 @@ typedef struct SRealTableNode {
|
||||||
STableNode table; // QUERY_NODE_REAL_TABLE
|
STableNode table; // QUERY_NODE_REAL_TABLE
|
||||||
struct STableMeta* pMeta;
|
struct STableMeta* pMeta;
|
||||||
SVgroupsInfo* pVgroupList;
|
SVgroupsInfo* pVgroupList;
|
||||||
|
char useDbName[TSDB_DB_NAME_LEN];
|
||||||
} SRealTableNode;
|
} SRealTableNode;
|
||||||
|
|
||||||
typedef struct STempTableNode {
|
typedef struct STempTableNode {
|
||||||
|
|
|
@ -52,7 +52,8 @@ typedef struct SQuery {
|
||||||
SSchema* pResSchema;
|
SSchema* pResSchema;
|
||||||
SCmdMsgInfo* pCmdMsg;
|
SCmdMsgInfo* pCmdMsg;
|
||||||
int32_t msgType;
|
int32_t msgType;
|
||||||
bool streamQuery;
|
SArray* pDbList;
|
||||||
|
SArray* pTableList;
|
||||||
} SQuery;
|
} SQuery;
|
||||||
|
|
||||||
int32_t qParseQuerySql(SParseContext* pCxt, SQuery** pQuery);
|
int32_t qParseQuerySql(SParseContext* pCxt, SQuery** pQuery);
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
typedef struct SPlanContext {
|
typedef struct SPlanContext {
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
int32_t acctId;
|
int32_t acctId;
|
||||||
|
SEpSet mgmtEpSet;
|
||||||
SNode* pAstRoot;
|
SNode* pAstRoot;
|
||||||
bool topicQuery;
|
bool topicQuery;
|
||||||
bool streamQuery;
|
bool streamQuery;
|
||||||
|
|
|
@ -169,6 +169,9 @@ const SSchema* tGetTbnameColumnSchema();
|
||||||
bool tIsValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTags);
|
bool tIsValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTags);
|
||||||
|
|
||||||
int32_t queryCreateTableMetaFromMsg(STableMetaRsp* msg, bool isSuperTable, STableMeta** pMeta);
|
int32_t queryCreateTableMetaFromMsg(STableMetaRsp* msg, bool isSuperTable, STableMeta** pMeta);
|
||||||
|
char *jobTaskStatusStr(int32_t status);
|
||||||
|
|
||||||
|
SSchema createSchema(uint8_t type, int32_t bytes, int32_t colId, const char* name);
|
||||||
|
|
||||||
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen);
|
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen);
|
||||||
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
||||||
|
@ -178,6 +181,15 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t
|
||||||
#define SET_META_TYPE_TABLE(t) (t) = META_TYPE_TABLE
|
#define SET_META_TYPE_TABLE(t) (t) = META_TYPE_TABLE
|
||||||
#define SET_META_TYPE_BOTH_TABLE(t) (t) = META_TYPE_BOTH_TABLE
|
#define SET_META_TYPE_BOTH_TABLE(t) (t) = META_TYPE_BOTH_TABLE
|
||||||
|
|
||||||
|
#define NEED_CLIENT_RM_TBLMETA_ERROR(_code) ((_code) == TSDB_CODE_TDB_INVALID_TABLE_ID || (_code) == TSDB_CODE_VND_TB_NOT_EXIST)
|
||||||
|
#define NEED_CLIENT_REFRESH_VG_ERROR(_code) ((_code) == TSDB_CODE_VND_HASH_MISMATCH || (_code) == TSDB_CODE_VND_INVALID_VGROUP_ID)
|
||||||
|
#define NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code) ((_code) == TSDB_CODE_TDB_TABLE_RECREATED)
|
||||||
|
#define NEED_CLIENT_HANDLE_ERROR(_code) (NEED_CLIENT_RM_TBLMETA_ERROR(_code) || NEED_CLIENT_REFRESH_VG_ERROR(_code) || NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code))
|
||||||
|
|
||||||
|
#define NEED_SCHEDULER_RETRY_ERROR(_code) ((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_RPC_NETWORK_UNAVAIL)
|
||||||
|
|
||||||
|
#define REQUEST_MAX_TRY_TIMES 5
|
||||||
|
|
||||||
#define qFatal(...) \
|
#define qFatal(...) \
|
||||||
do { \
|
do { \
|
||||||
if (qDebugFlag & DEBUG_FATAL) { \
|
if (qDebugFlag & DEBUG_FATAL) { \
|
||||||
|
|
|
@ -52,10 +52,10 @@ typedef struct SQueryProfileSummary {
|
||||||
} SQueryProfileSummary;
|
} SQueryProfileSummary;
|
||||||
|
|
||||||
typedef struct SQueryResult {
|
typedef struct SQueryResult {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
uint64_t numOfRows;
|
uint64_t numOfRows;
|
||||||
int32_t msgSize;
|
int32_t msgSize;
|
||||||
char *msg;
|
char *msg;
|
||||||
} SQueryResult;
|
} SQueryResult;
|
||||||
|
|
||||||
typedef struct STaskInfo {
|
typedef struct STaskInfo {
|
||||||
|
|
|
@ -35,6 +35,7 @@ typedef enum {
|
||||||
TAOS_SYNC_STATE_FOLLOWER = 100,
|
TAOS_SYNC_STATE_FOLLOWER = 100,
|
||||||
TAOS_SYNC_STATE_CANDIDATE = 101,
|
TAOS_SYNC_STATE_CANDIDATE = 101,
|
||||||
TAOS_SYNC_STATE_LEADER = 102,
|
TAOS_SYNC_STATE_LEADER = 102,
|
||||||
|
TAOS_SYNC_STATE_ERROR = 103,
|
||||||
} ESyncState;
|
} ESyncState;
|
||||||
|
|
||||||
typedef struct SSyncBuffer {
|
typedef struct SSyncBuffer {
|
||||||
|
@ -68,17 +69,20 @@ typedef struct SSnapshot {
|
||||||
typedef struct SSyncFSM {
|
typedef struct SSyncFSM {
|
||||||
void* data;
|
void* data;
|
||||||
|
|
||||||
// when value in pBuf finish a raft flow, FpCommitCb is called, code indicates the result
|
// when value in pMsg finish a raft flow, FpCommitCb is called, code indicates the result
|
||||||
// user can do something according to the code and isWeak. for example, write data into tsdb
|
// user can do something according to the code and isWeak. for example, write data into tsdb
|
||||||
void (*FpCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
|
void (*FpCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SyncIndex index, bool isWeak, int32_t code,
|
||||||
|
ESyncState state);
|
||||||
|
|
||||||
// when value in pBuf has been written into local log store, FpPreCommitCb is called, code indicates the result
|
// when value in pMsg has been written into local log store, FpPreCommitCb is called, code indicates the result
|
||||||
// user can do something according to the code and isWeak. for example, write data into tsdb
|
// user can do something according to the code and isWeak. for example, write data into tsdb
|
||||||
void (*FpPreCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
|
void (*FpPreCommitCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SyncIndex index, bool isWeak, int32_t code,
|
||||||
|
ESyncState state);
|
||||||
|
|
||||||
// when log entry is updated by a new one, FpRollBackCb is called
|
// when log entry is updated by a new one, FpRollBackCb is called
|
||||||
// user can do something to roll back. for example, delete data from tsdb, or just ignore it
|
// user can do something to roll back. for example, delete data from tsdb, or just ignore it
|
||||||
void (*FpRollBackCb)(struct SSyncFSM* pFsm, const SRpcMsg* pBuf, SyncIndex index, bool isWeak, int32_t code);
|
void (*FpRollBackCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SyncIndex index, bool isWeak, int32_t code,
|
||||||
|
ESyncState state);
|
||||||
|
|
||||||
// user should implement this function, use "data" to take snapshot into "snapshot"
|
// user should implement this function, use "data" to take snapshot into "snapshot"
|
||||||
int32_t (*FpTakeSnapshot)(SSnapshot* snapshot);
|
int32_t (*FpTakeSnapshot)(SSnapshot* snapshot);
|
||||||
|
@ -157,10 +161,14 @@ void syncCleanUp();
|
||||||
int64_t syncStart(const SSyncInfo* pSyncInfo);
|
int64_t syncStart(const SSyncInfo* pSyncInfo);
|
||||||
void syncStop(int64_t rid);
|
void syncStop(int64_t rid);
|
||||||
int32_t syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg);
|
int32_t syncReconfig(int64_t rid, const SSyncCfg* pSyncCfg);
|
||||||
int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak); // use this function
|
int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak);
|
||||||
int32_t syncForwardToPeer(int64_t rid, const SRpcMsg* pMsg, bool isWeak); // just for compatibility
|
|
||||||
ESyncState syncGetMyRole(int64_t rid);
|
ESyncState syncGetMyRole(int64_t rid);
|
||||||
void syncGetNodesRole(int64_t rid, SNodesRole* pNodeRole);
|
|
||||||
|
// propose with sequence number, to implement linearizable semantics
|
||||||
|
int32_t syncPropose2(int64_t rid, const SRpcMsg* pMsg, bool isWeak, uint64_t seqNum);
|
||||||
|
|
||||||
|
// for compatibility, the same as syncPropose
|
||||||
|
int32_t syncForwardToPeer(int64_t rid, const SRpcMsg* pMsg, bool isWeak);
|
||||||
|
|
||||||
extern int32_t sDebugFlag;
|
extern int32_t sDebugFlag;
|
||||||
|
|
||||||
|
|
|
@ -51,10 +51,31 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32))
|
#if defined(WINDOWS)
|
||||||
#define htobe64 htonll
|
#define htobe64 htonll
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WINDOWS)
|
||||||
|
#define TAOS_EPOLL_WAIT_TIME 100
|
||||||
|
typedef SOCKET eventfd_t;
|
||||||
|
#define eventfd(a, b) -1
|
||||||
|
typedef SOCKET EpollFd;
|
||||||
|
#define EpollClose(pollFd) epoll_close(pollFd)
|
||||||
|
#ifndef EPOLLWAKEUP
|
||||||
|
#define EPOLLWAKEUP (1u << 29)
|
||||||
|
#endif
|
||||||
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
#define TAOS_EPOLL_WAIT_TIME 500
|
||||||
|
typedef int32_t SOCKET;
|
||||||
|
typedef SOCKET EpollFd;
|
||||||
|
#define EpollClose(pollFd) epoll_close(pollFd)
|
||||||
|
#else
|
||||||
|
#define TAOS_EPOLL_WAIT_TIME 500
|
||||||
|
typedef int32_t SOCKET;
|
||||||
|
typedef SOCKET EpollFd;
|
||||||
|
#define EpollClose(pollFd) taosCloseSocket(pollFd)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
// #define htobe64 htonll
|
// #define htobe64 htonll
|
||||||
|
|
||||||
|
@ -64,12 +85,12 @@ extern "C" {
|
||||||
# define htole16(x) OSSwapHostToLittleInt16(x)
|
# define htole16(x) OSSwapHostToLittleInt16(x)
|
||||||
# define be16toh(x) OSSwapBigToHostInt16(x)
|
# define be16toh(x) OSSwapBigToHostInt16(x)
|
||||||
# define le16toh(x) OSSwapLittleToHostInt16(x)
|
# define le16toh(x) OSSwapLittleToHostInt16(x)
|
||||||
|
|
||||||
# define htobe32(x) OSSwapHostToBigInt32(x)
|
# define htobe32(x) OSSwapHostToBigInt32(x)
|
||||||
# define htole32(x) OSSwapHostToLittleInt32(x)
|
# define htole32(x) OSSwapHostToLittleInt32(x)
|
||||||
# define be32toh(x) OSSwapBigToHostInt32(x)
|
# define be32toh(x) OSSwapBigToHostInt32(x)
|
||||||
# define le32toh(x) OSSwapLittleToHostInt32(x)
|
# define le32toh(x) OSSwapLittleToHostInt32(x)
|
||||||
|
|
||||||
# define htobe64(x) OSSwapHostToBigInt64(x)
|
# define htobe64(x) OSSwapHostToBigInt64(x)
|
||||||
# define htole64(x) OSSwapHostToLittleInt64(x)
|
# define htole64(x) OSSwapHostToLittleInt64(x)
|
||||||
# define be64toh(x) OSSwapBigToHostInt64(x)
|
# define be64toh(x) OSSwapBigToHostInt64(x)
|
||||||
|
@ -83,6 +104,17 @@ extern "C" {
|
||||||
|
|
||||||
#define TAOS_EPOLL_WAIT_TIME 500
|
#define TAOS_EPOLL_WAIT_TIME 500
|
||||||
|
|
||||||
|
typedef int32_t SocketFd;
|
||||||
|
typedef SocketFd EpollFd;
|
||||||
|
|
||||||
|
typedef struct TdSocket {
|
||||||
|
#if SOCKET_WITH_LOCK
|
||||||
|
TdThreadRwlock rwlock;
|
||||||
|
#endif
|
||||||
|
int refId;
|
||||||
|
SocketFd fd;
|
||||||
|
} *TdSocketPtr, TdSocket;
|
||||||
|
|
||||||
typedef struct TdSocketServer *TdSocketServerPtr;
|
typedef struct TdSocketServer *TdSocketServerPtr;
|
||||||
typedef struct TdSocket *TdSocketPtr;
|
typedef struct TdSocket *TdSocketPtr;
|
||||||
typedef struct TdEpoll *TdEpollPtr;
|
typedef struct TdEpoll *TdEpollPtr;
|
||||||
|
@ -91,6 +123,7 @@ int32_t taosSendto(TdSocketPtr pSocket, void * msg, int len, unsigned int flags,
|
||||||
int32_t taosWriteSocket(TdSocketPtr pSocket, void *msg, int len);
|
int32_t taosWriteSocket(TdSocketPtr pSocket, void *msg, int len);
|
||||||
int32_t taosReadSocket(TdSocketPtr pSocket, void *msg, int len);
|
int32_t taosReadSocket(TdSocketPtr pSocket, void *msg, int len);
|
||||||
int32_t taosReadFromSocket(TdSocketPtr pSocket, void *buf, int32_t len, int32_t flags, struct sockaddr *destAddr, socklen_t *addrLen);
|
int32_t taosReadFromSocket(TdSocketPtr pSocket, void *buf, int32_t len, int32_t flags, struct sockaddr *destAddr, socklen_t *addrLen);
|
||||||
|
int32_t taosCloseSocketNoCheck1(SocketFd fd);
|
||||||
int32_t taosCloseSocket(TdSocketPtr *ppSocket);
|
int32_t taosCloseSocket(TdSocketPtr *ppSocket);
|
||||||
int32_t taosCloseSocketServer(TdSocketServerPtr *ppSocketServer);
|
int32_t taosCloseSocketServer(TdSocketServerPtr *ppSocketServer);
|
||||||
int32_t taosShutDownSocketRD(TdSocketPtr pSocket);
|
int32_t taosShutDownSocketRD(TdSocketPtr pSocket);
|
||||||
|
|
|
@ -315,6 +315,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_VND_INVALID_TSDB_STATE TAOS_DEF_ERROR_CODE(0, 0x0514)
|
#define TSDB_CODE_VND_INVALID_TSDB_STATE TAOS_DEF_ERROR_CODE(0, 0x0514)
|
||||||
#define TSDB_CODE_VND_TB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0515)
|
#define TSDB_CODE_VND_TB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0515)
|
||||||
#define TSDB_CODE_VND_SMA_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0516)
|
#define TSDB_CODE_VND_SMA_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0516)
|
||||||
|
#define TSDB_CODE_VND_HASH_MISMATCH TAOS_DEF_ERROR_CODE(0, 0x0517)
|
||||||
|
|
||||||
// tsdb
|
// tsdb
|
||||||
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
|
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
|
||||||
|
@ -340,8 +341,9 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_TDB_MESSED_MSG TAOS_DEF_ERROR_CODE(0, 0x0614)
|
#define TSDB_CODE_TDB_MESSED_MSG TAOS_DEF_ERROR_CODE(0, 0x0614)
|
||||||
#define TSDB_CODE_TDB_IVLD_TAG_VAL TAOS_DEF_ERROR_CODE(0, 0x0615)
|
#define TSDB_CODE_TDB_IVLD_TAG_VAL TAOS_DEF_ERROR_CODE(0, 0x0615)
|
||||||
#define TSDB_CODE_TDB_NO_CACHE_LAST_ROW TAOS_DEF_ERROR_CODE(0, 0x0616)
|
#define TSDB_CODE_TDB_NO_CACHE_LAST_ROW TAOS_DEF_ERROR_CODE(0, 0x0616)
|
||||||
#define TSDB_CODE_TDB_NO_SMA_INDEX_IN_META TAOS_DEF_ERROR_CODE(0, 0x0617)
|
#define TSDB_CODE_TDB_TABLE_RECREATED TAOS_DEF_ERROR_CODE(0, 0x0617)
|
||||||
#define TSDB_CODE_TDB_TDB_ENV_OPEN_ERROR TAOS_DEF_ERROR_CODE(0, 0x0618)
|
#define TSDB_CODE_TDB_NO_SMA_INDEX_IN_META TAOS_DEF_ERROR_CODE(0, 0x0618)
|
||||||
|
#define TSDB_CODE_TDB_TDB_ENV_OPEN_ERROR TAOS_DEF_ERROR_CODE(0, 0x0619)
|
||||||
|
|
||||||
// query
|
// query
|
||||||
#define TSDB_CODE_QRY_INVALID_QHANDLE TAOS_DEF_ERROR_CODE(0, 0x0700)
|
#define TSDB_CODE_QRY_INVALID_QHANDLE TAOS_DEF_ERROR_CODE(0, 0x0700)
|
||||||
|
@ -443,10 +445,12 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_CTG_SYS_ERROR TAOS_DEF_ERROR_CODE(0, 0x2404)
|
#define TSDB_CODE_CTG_SYS_ERROR TAOS_DEF_ERROR_CODE(0, 0x2404)
|
||||||
#define TSDB_CODE_CTG_DB_DROPPED TAOS_DEF_ERROR_CODE(0, 0x2405)
|
#define TSDB_CODE_CTG_DB_DROPPED TAOS_DEF_ERROR_CODE(0, 0x2405)
|
||||||
#define TSDB_CODE_CTG_OUT_OF_SERVICE TAOS_DEF_ERROR_CODE(0, 0x2406)
|
#define TSDB_CODE_CTG_OUT_OF_SERVICE TAOS_DEF_ERROR_CODE(0, 0x2406)
|
||||||
|
#define TSDB_CODE_CTG_VG_META_MISMATCH TAOS_DEF_ERROR_CODE(0, 0x2407)
|
||||||
|
|
||||||
//scheduler
|
//scheduler&qworker
|
||||||
#define TSDB_CODE_SCH_STATUS_ERROR TAOS_DEF_ERROR_CODE(0, 0x2501)
|
#define TSDB_CODE_SCH_STATUS_ERROR TAOS_DEF_ERROR_CODE(0, 0x2501)
|
||||||
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
||||||
|
#define TSDB_CODE_QW_MSG_ERROR TAOS_DEF_ERROR_CODE(0, 0x2503)
|
||||||
|
|
||||||
//parser
|
//parser
|
||||||
#define TSDB_CODE_PAR_SYNTAX_ERROR TAOS_DEF_ERROR_CODE(0, 0x2600)
|
#define TSDB_CODE_PAR_SYNTAX_ERROR TAOS_DEF_ERROR_CODE(0, 0x2600)
|
||||||
|
|
|
@ -99,7 +99,7 @@ extern const int32_t TYPE_BYTES[15];
|
||||||
#define TSDB_INS_TABLE_MNODES "mnodes"
|
#define TSDB_INS_TABLE_MNODES "mnodes"
|
||||||
#define TSDB_INS_TABLE_MODULES "modules"
|
#define TSDB_INS_TABLE_MODULES "modules"
|
||||||
#define TSDB_INS_TABLE_QNODES "qnodes"
|
#define TSDB_INS_TABLE_QNODES "qnodes"
|
||||||
#define TSDB_INS_TABLE_USER_DATABASE "user_database"
|
#define TSDB_INS_TABLE_USER_DATABASES "user_databases"
|
||||||
#define TSDB_INS_TABLE_USER_FUNCTIONS "user_functions"
|
#define TSDB_INS_TABLE_USER_FUNCTIONS "user_functions"
|
||||||
#define TSDB_INS_TABLE_USER_INDEXES "user_indexes"
|
#define TSDB_INS_TABLE_USER_INDEXES "user_indexes"
|
||||||
#define TSDB_INS_TABLE_USER_STABLES "user_stables"
|
#define TSDB_INS_TABLE_USER_STABLES "user_stables"
|
||||||
|
|
|
@ -86,7 +86,7 @@ int32_t taosHashGetSize(const SHashObj *pHashObj);
|
||||||
* @param size
|
* @param size
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *data, size_t size);
|
int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, const void *data, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the payload data with the specified key
|
* return the payload data with the specified key
|
||||||
|
|
|
@ -37,9 +37,8 @@ extern "C" {
|
||||||
|
|
||||||
#define CHECK_CODE_GOTO(expr, label) \
|
#define CHECK_CODE_GOTO(expr, label) \
|
||||||
do { \
|
do { \
|
||||||
int32_t code = expr; \
|
code = expr; \
|
||||||
if (TSDB_CODE_SUCCESS != code) { \
|
if (TSDB_CODE_SUCCESS != code) { \
|
||||||
terrno = code; \
|
|
||||||
goto label; \
|
goto label; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -142,18 +141,27 @@ typedef struct STscObj {
|
||||||
SAppInstInfo* pAppInfo;
|
SAppInstInfo* pAppInfo;
|
||||||
} STscObj;
|
} STscObj;
|
||||||
|
|
||||||
|
typedef struct SResultColumn {
|
||||||
|
union {
|
||||||
|
char* nullbitmap; // bitmap, one bit for each item in the list
|
||||||
|
int32_t* offset;
|
||||||
|
};
|
||||||
|
char* pData;
|
||||||
|
} SResultColumn;
|
||||||
|
|
||||||
typedef struct SReqResultInfo {
|
typedef struct SReqResultInfo {
|
||||||
const char* pRspMsg;
|
const char* pRspMsg;
|
||||||
const char* pData;
|
const char* pData;
|
||||||
TAOS_FIELD* fields;
|
TAOS_FIELD* fields;
|
||||||
uint32_t numOfCols;
|
uint32_t numOfCols;
|
||||||
int32_t* length;
|
int32_t* length;
|
||||||
TAOS_ROW row;
|
TAOS_ROW row;
|
||||||
char** pCol;
|
SResultColumn* pCol;
|
||||||
uint32_t numOfRows;
|
uint32_t numOfRows;
|
||||||
uint64_t totalRows;
|
uint64_t totalRows;
|
||||||
uint32_t current;
|
uint32_t current;
|
||||||
bool completed;
|
bool completed;
|
||||||
|
int32_t payloadLen;
|
||||||
} SReqResultInfo;
|
} SReqResultInfo;
|
||||||
|
|
||||||
typedef struct SShowReqInfo {
|
typedef struct SShowReqInfo {
|
||||||
|
@ -186,6 +194,8 @@ typedef struct SRequestObj {
|
||||||
char* msgBuf;
|
char* msgBuf;
|
||||||
void* pInfo; // sql parse info, generated by parser module
|
void* pInfo; // sql parse info, generated by parser module
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
SArray* dbList;
|
||||||
|
SArray* tableList;
|
||||||
SQueryExecMetric metric;
|
SQueryExecMetric metric;
|
||||||
SRequestSendRecvBody body;
|
SRequestSendRecvBody body;
|
||||||
} SRequestObj;
|
} SRequestObj;
|
||||||
|
@ -226,7 +236,7 @@ TAOS* taos_connect_internal(const char* ip, const char* user, const char* pass,
|
||||||
|
|
||||||
void* doFetchRow(SRequestObj* pRequest);
|
void* doFetchRow(SRequestObj* pRequest);
|
||||||
|
|
||||||
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows);
|
int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows);
|
||||||
|
|
||||||
int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest);
|
int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest);
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
static int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet);
|
static int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet);
|
||||||
static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest);
|
static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest);
|
||||||
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody);
|
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody);
|
||||||
static void setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp);
|
static int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp);
|
||||||
|
|
||||||
static bool stringLengthCheck(const char* str, size_t maxsize) {
|
static bool stringLengthCheck(const char* str, size_t maxsize) {
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
|
@ -159,8 +159,12 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery) {
|
||||||
}
|
}
|
||||||
|
|
||||||
code = qParseQuerySql(&cxt, pQuery);
|
code = qParseQuerySql(&cxt, pQuery);
|
||||||
if (TSDB_CODE_SUCCESS == code && ((*pQuery)->haveResultSet)) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols);
|
if ((*pQuery)->haveResultSet) {
|
||||||
|
setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols);
|
||||||
|
}
|
||||||
|
TSWAP(pRequest->dbList, (*pQuery)->pDbList, SArray*);
|
||||||
|
TSWAP(pRequest->tableList, (*pQuery)->pTableList, SArray*);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -191,8 +195,17 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
|
|
||||||
int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList) {
|
int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList) {
|
||||||
pRequest->type = pQuery->msgType;
|
pRequest->type = pQuery->msgType;
|
||||||
SPlanContext cxt = { .queryId = pRequest->requestId, .pAstRoot = pQuery->pRoot, .acctId = pRequest->pTscObj->acctId };
|
SPlanContext cxt = {
|
||||||
return qCreateQueryPlan(&cxt, pPlan, pNodeList);
|
.queryId = pRequest->requestId,
|
||||||
|
.acctId = pRequest->pTscObj->acctId,
|
||||||
|
.mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp),
|
||||||
|
.pAstRoot = pQuery->pRoot
|
||||||
|
};
|
||||||
|
int32_t code = qCreateQueryPlan(&cxt, pPlan, pNodeList);
|
||||||
|
if (code != 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols) {
|
void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols) {
|
||||||
|
@ -219,6 +232,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList
|
||||||
}
|
}
|
||||||
|
|
||||||
pRequest->code = code;
|
pRequest->code = code;
|
||||||
|
terrno = code;
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,9 +245,96 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList
|
||||||
}
|
}
|
||||||
|
|
||||||
pRequest->code = res.code;
|
pRequest->code = res.code;
|
||||||
|
terrno = res.code;
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SRequestObj* execQueryImpl(STscObj* pTscObj, const char* sql, int sqlLen) {
|
||||||
|
SRequestObj* pRequest = NULL;
|
||||||
|
SQuery* pQuery = NULL;
|
||||||
|
int32_t code = 0;
|
||||||
|
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
||||||
|
|
||||||
|
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
||||||
|
CHECK_CODE_GOTO(parseSql(pRequest, false, &pQuery), _return);
|
||||||
|
|
||||||
|
if (pQuery->directRpc) {
|
||||||
|
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
||||||
|
} else {
|
||||||
|
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList), _return);
|
||||||
|
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
taosArrayDestroy(pNodeList);
|
||||||
|
qDestroyQuery(pQuery);
|
||||||
|
if (NULL != pRequest && TSDB_CODE_SUCCESS != code) {
|
||||||
|
pRequest->code = terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) {
|
||||||
|
SCatalog *pCatalog = NULL;
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t dbNum = taosArrayGetSize(pRequest->dbList);
|
||||||
|
int32_t tblNum = taosArrayGetSize(pRequest->tableList);
|
||||||
|
|
||||||
|
if (dbNum <= 0 && tblNum <= 0) {
|
||||||
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEpSet epset = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < dbNum; ++i) {
|
||||||
|
char *dbFName = taosArrayGet(pRequest->dbList, i);
|
||||||
|
|
||||||
|
code = catalogRefreshDBVgInfo(pCatalog, pTscObj->pAppInfo->pTransporter, &epset, dbFName);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tblNum; ++i) {
|
||||||
|
SName *tableName = taosArrayGet(pRequest->tableList, i);
|
||||||
|
|
||||||
|
code = catalogRefreshTableMeta(pCatalog, pTscObj->pAppInfo->pTransporter, &epset, tableName, -1);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SRequestObj* execQuery(STscObj* pTscObj, const char* sql, int sqlLen) {
|
||||||
|
SRequestObj* pRequest = NULL;
|
||||||
|
int32_t retryNum = 0;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
while (retryNum++ < REQUEST_MAX_TRY_TIMES) {
|
||||||
|
pRequest = execQueryImpl(pTscObj, sql, sqlLen);
|
||||||
|
if (TSDB_CODE_SUCCESS == pRequest->code || !NEED_CLIENT_HANDLE_ERROR(pRequest->code)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = refreshMeta(pTscObj, pRequest);
|
||||||
|
if (code) {
|
||||||
|
pRequest->code = code;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRequest;
|
||||||
|
}
|
||||||
|
|
||||||
TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) {
|
TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) {
|
||||||
STscObj* pTscObj = (STscObj*)taos;
|
STscObj* pTscObj = (STscObj*)taos;
|
||||||
if (sqlLen > (size_t)TSDB_MAX_ALLOWED_SQL_LEN) {
|
if (sqlLen > (size_t)TSDB_MAX_ALLOWED_SQL_LEN) {
|
||||||
|
@ -242,30 +343,7 @@ TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestObj* pRequest = NULL;
|
return execQuery(pTscObj, sql, sqlLen);
|
||||||
SQuery* pQuery = NULL;
|
|
||||||
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
|
||||||
CHECK_CODE_GOTO(parseSql(pRequest, false, &pQuery), _return);
|
|
||||||
|
|
||||||
if (pQuery->directRpc) {
|
|
||||||
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
|
||||||
} else {
|
|
||||||
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList), _return);
|
|
||||||
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
|
||||||
pRequest->code = terrno;
|
|
||||||
}
|
|
||||||
|
|
||||||
_return:
|
|
||||||
taosArrayDestroy(pNodeList);
|
|
||||||
qDestroyQuery(pQuery);
|
|
||||||
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
|
||||||
pRequest->code = terrno;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pRequest;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet) {
|
int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet) {
|
||||||
|
@ -384,7 +462,7 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
|
||||||
tfree(pMsgBody);
|
tfree(pMsgBody);
|
||||||
}
|
}
|
||||||
bool persistConnForSpecificMsg(void* parenct, tmsg_t msgType) {
|
bool persistConnForSpecificMsg(void* parenct, tmsg_t msgType) {
|
||||||
return msgType == TDMT_VND_QUERY_RSP || msgType == TDMT_VND_FETCH_RSP || msgType == TDMT_VND_RES_READY_RSP;
|
return msgType == TDMT_VND_QUERY_RSP || msgType == TDMT_VND_FETCH_RSP || msgType == TDMT_VND_RES_READY_RSP || msgType == TDMT_VND_QUERY_HEARTBEAT_RSP;
|
||||||
}
|
}
|
||||||
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
||||||
SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->ahandle;
|
SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->ahandle;
|
||||||
|
@ -395,7 +473,6 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
||||||
assert(pRequest->self == pSendInfo->requestObjRefId);
|
assert(pRequest->self == pSendInfo->requestObjRefId);
|
||||||
|
|
||||||
pRequest->metric.rsp = taosGetTimestampMs();
|
pRequest->metric.rsp = taosGetTimestampMs();
|
||||||
pRequest->code = pMsg->code;
|
|
||||||
|
|
||||||
STscObj* pTscObj = pRequest->pTscObj;
|
STscObj* pTscObj = pRequest->pTscObj;
|
||||||
if (pEpSet) {
|
if (pEpSet) {
|
||||||
|
@ -479,13 +556,16 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
||||||
int32_t code = schedulerFetchRows(pRequest->body.queryJob, (void**)&pResInfo->pData);
|
pRequest->code = schedulerFetchRows(pRequest->body.queryJob, (void**)&pResInfo->pData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
pRequest->code = code;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRequest->code = setQueryResultFromRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pResInfo->pData);
|
||||||
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
setQueryResultFromRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pResInfo->pData);
|
|
||||||
tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
|
tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
|
||||||
pRequest->self, pResInfo->numOfRows, pResInfo->totalRows, pResInfo->completed, pRequest->requestId);
|
pRequest->self, pResInfo->numOfRows, pResInfo->totalRows, pResInfo->completed, pRequest->requestId);
|
||||||
|
|
||||||
|
@ -552,10 +632,23 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
for (int32_t i = 0; i < pResultInfo->numOfCols; ++i) {
|
for (int32_t i = 0; i < pResultInfo->numOfCols; ++i) {
|
||||||
pResultInfo->row[i] = pResultInfo->pCol[i] + pResultInfo->fields[i].bytes * pResultInfo->current;
|
SResultColumn* pCol = &pResultInfo->pCol[i];
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) {
|
if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) {
|
||||||
pResultInfo->length[i] = varDataLen(pResultInfo->row[i]);
|
if (pCol->offset[pResultInfo->current] != -1) {
|
||||||
pResultInfo->row[i] = varDataVal(pResultInfo->row[i]);
|
char* pStart = pResultInfo->pCol[i].offset[pResultInfo->current] + pResultInfo->pCol[i].pData;
|
||||||
|
|
||||||
|
pResultInfo->length[i] = varDataLen(pStart);
|
||||||
|
pResultInfo->row[i] = varDataVal(pStart);
|
||||||
|
} else {
|
||||||
|
pResultInfo->row[i] = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!colDataIsNull_f(pCol->nullbitmap, pResultInfo->current)) {
|
||||||
|
pResultInfo->row[i] = pResultInfo->pCol[i].pData + pResultInfo->fields[i].bytes * pResultInfo->current;
|
||||||
|
} else {
|
||||||
|
pResultInfo->row[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,30 +656,52 @@ _return:
|
||||||
return pResultInfo->row;
|
return pResultInfo->row;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doPrepareResPtr(SReqResultInfo* pResInfo) {
|
static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) {
|
||||||
if (pResInfo->row == NULL) {
|
if (pResInfo->row == NULL) {
|
||||||
pResInfo->row = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
pResInfo->row = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
||||||
pResInfo->pCol = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
pResInfo->pCol = calloc(pResInfo->numOfCols, sizeof(SResultColumn));
|
||||||
pResInfo->length = calloc(pResInfo->numOfCols, sizeof(int32_t));
|
pResInfo->length = calloc(pResInfo->numOfCols, sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pResInfo->row == NULL || pResInfo->pCol == NULL || pResInfo->length == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows) {
|
int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows) {
|
||||||
assert(numOfCols > 0 && pFields != NULL && pResultInfo != NULL);
|
assert(numOfCols > 0 && pFields != NULL && pResultInfo != NULL);
|
||||||
if (numOfRows == 0) {
|
if (numOfRows == 0) {
|
||||||
return;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo check for the failure of malloc
|
int32_t code = doPrepareResPtr(pResultInfo);
|
||||||
doPrepareResPtr(pResultInfo);
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t* colLength = (int32_t*)pResultInfo->pData;
|
||||||
|
char* pStart = ((char*)pResultInfo->pData) + sizeof(int32_t) * numOfCols;
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
colLength[i] = htonl(colLength[i]);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) {
|
||||||
|
pResultInfo->pCol[i].offset = (int32_t*)pStart;
|
||||||
|
pStart += numOfRows * sizeof(int32_t);
|
||||||
|
} else {
|
||||||
|
pResultInfo->pCol[i].nullbitmap = pStart;
|
||||||
|
pStart += BitmapLen(pResultInfo->numOfRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
pResultInfo->pCol[i].pData = pStart;
|
||||||
pResultInfo->length[i] = pResultInfo->fields[i].bytes;
|
pResultInfo->length[i] = pResultInfo->fields[i].bytes;
|
||||||
pResultInfo->row[i] = (char*)(pResultInfo->pData + offset * pResultInfo->numOfRows);
|
pResultInfo->row[i] = pResultInfo->pCol[i].pData;
|
||||||
pResultInfo->pCol[i] = pResultInfo->row[i];
|
|
||||||
offset += pResultInfo->fields[i].bytes;
|
pStart += colLength[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* getDbOfConnection(STscObj* pObj) {
|
char* getDbOfConnection(STscObj* pObj) {
|
||||||
|
@ -608,15 +723,17 @@ void setConnectionDB(STscObj* pTscObj, const char* db) {
|
||||||
taosThreadMutexUnlock(&pTscObj->mutex);
|
taosThreadMutexUnlock(&pTscObj->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp) {
|
int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp) {
|
||||||
assert(pResultInfo != NULL && pRsp != NULL);
|
assert(pResultInfo != NULL && pRsp != NULL);
|
||||||
|
|
||||||
pResultInfo->pRspMsg = (const char*)pRsp;
|
pResultInfo->pRspMsg = (const char*)pRsp;
|
||||||
pResultInfo->pData = (void*)pRsp->data;
|
pResultInfo->pData = (void*)pRsp->data;
|
||||||
pResultInfo->numOfRows = htonl(pRsp->numOfRows);
|
pResultInfo->numOfRows = htonl(pRsp->numOfRows);
|
||||||
pResultInfo->current = 0;
|
pResultInfo->current = 0;
|
||||||
pResultInfo->completed = (pRsp->completed == 1);
|
pResultInfo->completed = (pRsp->completed == 1);
|
||||||
|
pResultInfo->payloadLen = htonl(pRsp->compLen);
|
||||||
|
|
||||||
|
// TODO handle the compressed case
|
||||||
pResultInfo->totalRows += pResultInfo->numOfRows;
|
pResultInfo->totalRows += pResultInfo->numOfRows;
|
||||||
setResultDataPtr(pResultInfo, pResultInfo->fields, pResultInfo->numOfCols, pResultInfo->numOfRows);
|
return setResultDataPtr(pResultInfo, pResultInfo->fields, pResultInfo->numOfCols, pResultInfo->numOfRows);
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,7 +238,11 @@ int32_t processCreateDbRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
// todo rsp with the vnode id list
|
// todo rsp with the vnode id list
|
||||||
SRequestObj* pRequest = param;
|
SRequestObj* pRequest = param;
|
||||||
free(pMsg->pData);
|
free(pMsg->pData);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
setErrno(pRequest, code);
|
||||||
|
}
|
||||||
tsem_post(&pRequest->body.rspSem);
|
tsem_post(&pRequest->body.rspSem);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t processUseDbRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
int32_t processUseDbRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
|
@ -471,8 +471,8 @@ TAOS_RES* tmq_create_stream(TAOS* taos, const char* streamName, const char* tbNa
|
||||||
}
|
}
|
||||||
sqlLen = strlen(sql);
|
sqlLen = strlen(sql);
|
||||||
|
|
||||||
if (strlen(streamName) >= TSDB_TABLE_NAME_LEN) {
|
if (strlen(tbName) >= TSDB_TABLE_NAME_LEN) {
|
||||||
tscError("stream name too long, max length:%d", TSDB_TABLE_NAME_LEN - 1);
|
tscError("output tb name too long, max length:%d", TSDB_TABLE_NAME_LEN - 1);
|
||||||
terrno = TSDB_CODE_TSC_INVALID_INPUT;
|
terrno = TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
@ -485,6 +485,7 @@ TAOS_RES* tmq_create_stream(TAOS* taos, const char* streamName, const char* tbNa
|
||||||
|
|
||||||
tscDebug("start to create stream: %s", streamName);
|
tscDebug("start to create stream: %s", streamName);
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
||||||
CHECK_CODE_GOTO(parseSql(pRequest, false, &pQueryNode), _return);
|
CHECK_CODE_GOTO(parseSql(pRequest, false, &pQueryNode), _return);
|
||||||
|
|
||||||
|
@ -571,6 +572,7 @@ TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, i
|
||||||
|
|
||||||
tscDebug("start to create topic: %s", topicName);
|
tscDebug("start to create topic: %s", topicName);
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
||||||
CHECK_CODE_GOTO(parseSql(pRequest, true, &pQueryNode), _return);
|
CHECK_CODE_GOTO(parseSql(pRequest, true, &pQueryNode), _return);
|
||||||
|
|
||||||
|
|
|
@ -271,6 +271,8 @@ TEST(testCase, create_stable_Test) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "use abc1");
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)");
|
pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
||||||
|
@ -283,17 +285,17 @@ TEST(testCase, create_stable_Test) {
|
||||||
ASSERT_EQ(numOfFields, 0);
|
ASSERT_EQ(numOfFields, 0);
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "use abc1");
|
// pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
pRes = taos_query(pConn, "drop stable `123_$^)`");
|
// pRes = taos_query(pConn, "drop stable `123_$^)`");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
// printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
|
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
@ -333,7 +335,7 @@ TEST(testCase, create_ctable_Test) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table tu using sts tags('2021-10-10 1:1:1');");
|
pRes = taos_query(pConn, "create table tu using st1 tags('2021-10-10 1:1:1');");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
}
|
||||||
|
@ -483,7 +485,9 @@ TEST(testCase, show_table_Test) {
|
||||||
|
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "show abc1.tables");
|
taos_query(pConn, "use abc1");
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "show tables");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
@ -656,13 +660,7 @@ TEST(testCase, agg_query_tables) {
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table tx using st1 tags(111111111111111)");
|
pRes = taos_query(pConn, "select count(*), sum(k),min(k),max(k) from tu");
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("failed to create table, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
pRes = taos_query(pConn, "select count(*) from t_x_19");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
|
@ -260,6 +260,56 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, co
|
||||||
return numOfRow1 + numOfRow2;
|
return numOfRow1 + numOfRow2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows) {
|
||||||
|
ASSERT(pColumnInfoData != NULL && pSource != NULL && pColumnInfoData->info.type == pSource->info.type);
|
||||||
|
if (numOfRows == 0) {
|
||||||
|
return numOfRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
||||||
|
// Handle the bitmap
|
||||||
|
char* p = realloc(pColumnInfoData->varmeta.offset, sizeof(int32_t) * numOfRows);
|
||||||
|
if (p == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pColumnInfoData->varmeta.offset = (int32_t*) p;
|
||||||
|
memcpy(pColumnInfoData->varmeta.offset, pSource->varmeta.offset, sizeof(int32_t) * numOfRows);
|
||||||
|
|
||||||
|
if (pColumnInfoData->varmeta.allocLen < pSource->varmeta.length) {
|
||||||
|
char* tmp = realloc(pColumnInfoData->pData, pSource->varmeta.length);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pColumnInfoData->pData = tmp;
|
||||||
|
pColumnInfoData->varmeta.allocLen = pSource->varmeta.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pColumnInfoData->pData, pSource->pData, pSource->varmeta.length);
|
||||||
|
pColumnInfoData->varmeta.length = pSource->varmeta.length;
|
||||||
|
} else {
|
||||||
|
char* tmp = realloc(pColumnInfoData->nullbitmap, BitmapLen(numOfRows));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pColumnInfoData->nullbitmap = tmp;
|
||||||
|
memcpy(pColumnInfoData->nullbitmap, pSource->nullbitmap, BitmapLen(numOfRows));
|
||||||
|
|
||||||
|
int32_t newSize = numOfRows * pColumnInfoData->info.bytes;
|
||||||
|
tmp = realloc(pColumnInfoData->pData, newSize);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pColumnInfoData->pData = tmp;
|
||||||
|
memcpy(pColumnInfoData->pData, pSource->pData, pSource->info.bytes * numOfRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock) {
|
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock) {
|
||||||
ASSERT(pBlock && pBlock->info.numOfCols == taosArrayGetSize(pBlock->pDataBlock));
|
ASSERT(pBlock && pBlock->info.numOfCols == taosArrayGetSize(pBlock->pDataBlock));
|
||||||
return pBlock->info.numOfCols;
|
return pBlock->info.numOfCols;
|
||||||
|
@ -447,11 +497,11 @@ SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int3
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* +------------------+---------------+--------------------+
|
* +------------------+---------------------------------------------+
|
||||||
* |the number of rows| column length | column #1 |
|
* |the number of rows| column #1 |
|
||||||
* | (4 bytes) | (4 bytes) |--------------------+
|
* | (4 bytes) |------------+-----------------------+--------+
|
||||||
* | | | null bitmap| values|
|
* | | null bitmap| column length(4bytes) | values |
|
||||||
* +------------------+---------------+--------------------+
|
* +------------------+------------+-----------------------+--------+
|
||||||
* @param buf
|
* @param buf
|
||||||
* @param pBlock
|
* @param pBlock
|
||||||
* @return
|
* @return
|
||||||
|
@ -532,9 +582,10 @@ int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t blockDataGetRowSize(const SSDataBlock* pBlock) {
|
size_t blockDataGetRowSize(SSDataBlock* pBlock) {
|
||||||
ASSERT(pBlock != NULL);
|
ASSERT(pBlock != NULL);
|
||||||
size_t rowSize = 0;
|
if (pBlock->info.rowSize == 0) {
|
||||||
|
size_t rowSize = 0;
|
||||||
|
|
||||||
size_t numOfCols = pBlock->info.numOfCols;
|
size_t numOfCols = pBlock->info.numOfCols;
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
@ -542,7 +593,10 @@ size_t blockDataGetRowSize(const SSDataBlock* pBlock) {
|
||||||
rowSize += pColInfo->info.bytes;
|
rowSize += pColInfo->info.bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rowSize;
|
pBlock->info.rowSize = rowSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pBlock->info.rowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -583,7 +637,7 @@ double blockDataGetSerialRowSize(const SSDataBlock* pBlock) {
|
||||||
if (IS_VAR_DATA_TYPE(pColInfo->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColInfo->info.type)) {
|
||||||
rowSize += sizeof(int32_t);
|
rowSize += sizeof(int32_t);
|
||||||
} else {
|
} else {
|
||||||
rowSize += 1 / 8.0;
|
rowSize += 1/8.0; // one bit for each record
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1089,7 +1143,7 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockDataClearup(SSDataBlock* pDataBlock) {
|
void blockDataCleanup(SSDataBlock* pDataBlock) {
|
||||||
pDataBlock->info.rows = 0;
|
pDataBlock->info.rows = 0;
|
||||||
|
|
||||||
if (pDataBlock->info.hasVarCol) {
|
if (pDataBlock->info.hasVarCol) {
|
||||||
|
@ -1250,3 +1304,26 @@ void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
return (void*)buf;
|
return (void*)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tEncodeDataBlocks(void** buf, const SArray* blocks) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
int32_t sz = taosArrayGetSize(blocks);
|
||||||
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SSDataBlock* pBlock = taosArrayGet(blocks, i);
|
||||||
|
tlen += tEncodeDataBlock(buf, pBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* tDecodeDataBlocks(const void* buf, SArray* blocks) {
|
||||||
|
int32_t sz;
|
||||||
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SSDataBlock pBlock = {0};
|
||||||
|
buf = tDecodeDataBlock(buf, &pBlock);
|
||||||
|
}
|
||||||
|
return (void*)buf;
|
||||||
|
}
|
||||||
|
|
|
@ -421,6 +421,7 @@ SDataCols *tdFreeDataCols(SDataCols *pCols) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
SDataCols *pRet = tdNewDataCols(pDataCols->maxCols, pDataCols->maxPoints);
|
SDataCols *pRet = tdNewDataCols(pDataCols->maxCols, pDataCols->maxPoints);
|
||||||
if (pRet == NULL) return NULL;
|
if (pRet == NULL) return NULL;
|
||||||
|
@ -431,6 +432,7 @@ SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
|
|
||||||
for (int i = 0; i < pDataCols->numOfCols; i++) {
|
for (int i = 0; i < pDataCols->numOfCols; i++) {
|
||||||
pRet->cols[i].type = pDataCols->cols[i].type;
|
pRet->cols[i].type = pDataCols->cols[i].type;
|
||||||
|
pRet->cols[i].bitmap = pDataCols->cols[i].bitmap;
|
||||||
pRet->cols[i].colId = pDataCols->cols[i].colId;
|
pRet->cols[i].colId = pDataCols->cols[i].colId;
|
||||||
pRet->cols[i].bytes = pDataCols->cols[i].bytes;
|
pRet->cols[i].bytes = pDataCols->cols[i].bytes;
|
||||||
pRet->cols[i].offset = pDataCols->cols[i].offset;
|
pRet->cols[i].offset = pDataCols->cols[i].offset;
|
||||||
|
@ -453,6 +455,7 @@ SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
|
|
||||||
return pRet;
|
return pRet;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void tdResetDataCols(SDataCols *pCols) {
|
void tdResetDataCols(SDataCols *pCols) {
|
||||||
if (pCols != NULL) {
|
if (pCols != NULL) {
|
||||||
|
|
|
@ -132,6 +132,9 @@ bool tsdbForceKeepFile = false;
|
||||||
int32_t tsDiskCfgNum = 0;
|
int32_t tsDiskCfgNum = 0;
|
||||||
SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0};
|
SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0};
|
||||||
|
|
||||||
|
// stream scheduler
|
||||||
|
bool tsStreamSchedV = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* minimum scale for whole system, millisecond by default
|
* minimum scale for whole system, millisecond by default
|
||||||
* for TSDB_TIME_PRECISION_MILLI: 86400000L
|
* for TSDB_TIME_PRECISION_MILLI: 86400000L
|
||||||
|
@ -585,4 +588,4 @@ void taosCfgDynamicOptions(const char *option, const char *value) {
|
||||||
taosResetLog();
|
taosResetLog();
|
||||||
cfgDumpCfg(tsCfg, 1, false);
|
cfgDumpCfg(tsCfg, 1, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,7 +290,7 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
tlen += taosEncodeString(buf, pReq->name);
|
tlen += taosEncodeString(buf, pReq->name);
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->ttl);
|
tlen += taosEncodeFixedU32(buf, pReq->ttl);
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->keep);
|
tlen += taosEncodeFixedU32(buf, pReq->keep);
|
||||||
tlen += taosEncodeFixedU8(buf, pReq->type);
|
tlen += taosEncodeFixedU8(buf, pReq->info);
|
||||||
|
|
||||||
switch (pReq->type) {
|
switch (pReq->type) {
|
||||||
case TD_SUPER_TABLE:
|
case TD_SUPER_TABLE:
|
||||||
|
@ -309,6 +309,20 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].bytes);
|
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].bytes);
|
||||||
tlen += taosEncodeString(buf, pReq->stbCfg.pTagSchema[i].name);
|
tlen += taosEncodeString(buf, pReq->stbCfg.pTagSchema[i].name);
|
||||||
}
|
}
|
||||||
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
||||||
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pBSmaCols[i]);
|
||||||
|
}
|
||||||
|
if (pReq->rollup && NULL != pReq->stbCfg.pRSmaParam) {
|
||||||
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
|
tlen += taosEncodeFixedU32(buf, (uint32_t)param->xFilesFactor);
|
||||||
|
tlen += taosEncodeFixedI8(buf, param->delayUnit);
|
||||||
|
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
||||||
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
|
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
||||||
|
}
|
||||||
|
tlen += taosEncodeFixedI64(buf, param->delay);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TD_CHILD_TABLE:
|
case TD_CHILD_TABLE:
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->ctbCfg.suid);
|
tlen += taosEncodeFixedI64(buf, pReq->ctbCfg.suid);
|
||||||
|
@ -322,6 +336,20 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].bytes);
|
tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].bytes);
|
||||||
tlen += taosEncodeString(buf, pReq->ntbCfg.pSchema[i].name);
|
tlen += taosEncodeString(buf, pReq->ntbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
||||||
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pBSmaCols[i]);
|
||||||
|
}
|
||||||
|
if (pReq->rollup && NULL != pReq->stbCfg.pRSmaParam) {
|
||||||
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
|
tlen += taosEncodeFixedU32(buf, (uint32_t)param->xFilesFactor);
|
||||||
|
tlen += taosEncodeFixedI8(buf, param->delayUnit);
|
||||||
|
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
||||||
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
|
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
||||||
|
}
|
||||||
|
tlen += taosEncodeFixedI64(buf, param->delay);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -335,7 +363,7 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
buf = taosDecodeString(buf, &(pReq->name));
|
buf = taosDecodeString(buf, &(pReq->name));
|
||||||
buf = taosDecodeFixedU32(buf, &(pReq->ttl));
|
buf = taosDecodeFixedU32(buf, &(pReq->ttl));
|
||||||
buf = taosDecodeFixedU32(buf, &(pReq->keep));
|
buf = taosDecodeFixedU32(buf, &(pReq->keep));
|
||||||
buf = taosDecodeFixedU8(buf, &(pReq->type));
|
buf = taosDecodeFixedU8(buf, &(pReq->info));
|
||||||
|
|
||||||
switch (pReq->type) {
|
switch (pReq->type) {
|
||||||
case TD_SUPER_TABLE:
|
case TD_SUPER_TABLE:
|
||||||
|
@ -356,6 +384,32 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].bytes);
|
buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].bytes);
|
||||||
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
||||||
}
|
}
|
||||||
|
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.nBSmaCols));
|
||||||
|
if (pReq->stbCfg.nBSmaCols > 0) {
|
||||||
|
pReq->stbCfg.pBSmaCols = (col_id_t *)malloc(pReq->stbCfg.nBSmaCols * sizeof(col_id_t));
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
||||||
|
buf = taosDecodeFixedI16(buf, pReq->stbCfg.pBSmaCols + i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pReq->stbCfg.pBSmaCols = NULL;
|
||||||
|
}
|
||||||
|
if (pReq->rollup) {
|
||||||
|
pReq->stbCfg.pRSmaParam = (SRSmaParam *)malloc(sizeof(SRSmaParam));
|
||||||
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
|
buf = taosDecodeFixedU32(buf, (uint32_t *)¶m->xFilesFactor);
|
||||||
|
buf = taosDecodeFixedI8(buf, ¶m->delayUnit);
|
||||||
|
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
||||||
|
if (param->nFuncIds > 0) {
|
||||||
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
|
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
param->pFuncIds = NULL;
|
||||||
|
}
|
||||||
|
buf = taosDecodeFixedI64(buf, ¶m->delay);
|
||||||
|
} else {
|
||||||
|
pReq->stbCfg.pRSmaParam = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TD_CHILD_TABLE:
|
case TD_CHILD_TABLE:
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->ctbCfg.suid);
|
buf = taosDecodeFixedI64(buf, &pReq->ctbCfg.suid);
|
||||||
|
@ -370,6 +424,32 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].bytes);
|
buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].bytes);
|
||||||
buf = taosDecodeStringTo(buf, pReq->ntbCfg.pSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->ntbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
|
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.nBSmaCols));
|
||||||
|
if (pReq->stbCfg.nBSmaCols > 0) {
|
||||||
|
pReq->stbCfg.pBSmaCols = (col_id_t *)malloc(pReq->stbCfg.nBSmaCols * sizeof(col_id_t));
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
||||||
|
buf = taosDecodeFixedI16(buf, pReq->stbCfg.pBSmaCols + i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pReq->stbCfg.pBSmaCols = NULL;
|
||||||
|
}
|
||||||
|
if (pReq->rollup) {
|
||||||
|
pReq->stbCfg.pRSmaParam = (SRSmaParam *)malloc(sizeof(SRSmaParam));
|
||||||
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
|
buf = taosDecodeFixedU32(buf, (uint32_t *)¶m->xFilesFactor);
|
||||||
|
buf = taosDecodeFixedI8(buf, ¶m->delayUnit);
|
||||||
|
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
||||||
|
if (param->nFuncIds > 0) {
|
||||||
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
|
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
param->pFuncIds = NULL;
|
||||||
|
}
|
||||||
|
buf = taosDecodeFixedI64(buf, ¶m->delay);
|
||||||
|
} else {
|
||||||
|
pReq->stbCfg.pRSmaParam = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1858,7 +1938,10 @@ int32_t tSerializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableReq
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->showId) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->showId) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->type) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->free) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->free) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->tb) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -1872,8 +1955,10 @@ int32_t tDeserializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableR
|
||||||
|
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pReq->showId) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->showId) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->type) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->free) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->free) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->tb) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
tCoderClear(&decoder);
|
tCoderClear(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2744,6 +2829,77 @@ int32_t tDeserializeSSchedulerHbRsp(void *buf, int32_t bufLen, SSchedulerHbRsp *
|
||||||
|
|
||||||
void tFreeSSchedulerHbRsp(SSchedulerHbRsp *pRsp) { taosArrayDestroy(pRsp->taskStatus); }
|
void tFreeSSchedulerHbRsp(SSchedulerHbRsp *pRsp) { taosArrayDestroy(pRsp->taskStatus); }
|
||||||
|
|
||||||
|
int32_t tSerializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->code) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->code) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSVCreateTbBatchRsp(void *buf, int32_t bufLen, SVCreateTbBatchRsp *pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (pRsp->rspList) {
|
||||||
|
int32_t num = taosArrayGetSize(pRsp->rspList);
|
||||||
|
if (tEncodeI32(&encoder, num) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
SVCreateTbRsp *rsp = taosArrayGet(pRsp->rspList, i);
|
||||||
|
if (tEncodeI32(&encoder, rsp->code) < 0) return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tEncodeI32(&encoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSVCreateTbBatchRsp(void *buf, int32_t bufLen, SVCreateTbBatchRsp *pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
int32_t num = 0;
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &num) < 0) return -1;
|
||||||
|
if (num > 0) {
|
||||||
|
pRsp->rspList = taosArrayInit(num, sizeof(SVCreateTbRsp));
|
||||||
|
if (NULL == pRsp->rspList) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
SVCreateTbRsp rsp = {0};
|
||||||
|
if (tDecodeI32(&decoder, &rsp.code) < 0) return -1;
|
||||||
|
if (NULL == taosArrayPush(pRsp->rspList, &rsp)) return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pRsp->rspList = NULL;
|
||||||
|
}
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTSmaReq(void **buf, SVCreateTSmaReq *pReq) {
|
int32_t tSerializeSVCreateTSmaReq(void **buf, SVCreateTSmaReq *pReq) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
|
|
||||||
|
@ -2792,7 +2948,8 @@ int32_t tSerializeSCMCreateStreamReq(void *buf, int32_t bufLen, const SCMCreateS
|
||||||
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->outputTbName) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->outputTbName) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->igExists) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->igExists) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
if (tEncodeI32(&encoder, sqlLen) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, astLen) < 0) return -1;
|
||||||
if (sqlLen > 0 && tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
if (sqlLen > 0 && tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
||||||
if (astLen > 0 && tEncodeCStr(&encoder, pReq->ast) < 0) return -1;
|
if (astLen > 0 && tEncodeCStr(&encoder, pReq->ast) < 0) return -1;
|
||||||
|
|
||||||
|
@ -2840,30 +2997,36 @@ void tFreeSCMCreateStreamReq(SCMCreateStreamReq *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tEncodeSStreamTask(SCoder *pEncoder, const SStreamTask *pTask) {
|
int32_t tEncodeSStreamTask(SCoder *pEncoder, const SStreamTask *pTask) {
|
||||||
if (tStartEncode(pEncoder) < 0) return -1;
|
/*if (tStartEncode(pEncoder) < 0) return -1;*/
|
||||||
if (tEncodeI64(pEncoder, pTask->streamId) < 0) return -1;
|
if (tEncodeI64(pEncoder, pTask->streamId) < 0) return -1;
|
||||||
if (tEncodeI32(pEncoder, pTask->taskId) < 0) return -1;
|
if (tEncodeI32(pEncoder, pTask->taskId) < 0) return -1;
|
||||||
if (tEncodeI32(pEncoder, pTask->level) < 0) return -1;
|
if (tEncodeI32(pEncoder, pTask->level) < 0) return -1;
|
||||||
if (tEncodeI8(pEncoder, pTask->status) < 0) return -1;
|
if (tEncodeI8(pEncoder, pTask->status) < 0) return -1;
|
||||||
if (tEncodeI8(pEncoder, pTask->pipeEnd) < 0) return -1;
|
if (tEncodeI8(pEncoder, pTask->pipeSource) < 0) return -1;
|
||||||
if (tEncodeI8(pEncoder, pTask->parallel) < 0) return -1;
|
if (tEncodeI8(pEncoder, pTask->pipeSink) < 0) return -1;
|
||||||
|
if (tEncodeI8(pEncoder, pTask->parallelizable) < 0) return -1;
|
||||||
|
if (tEncodeI8(pEncoder, pTask->nextOpDst) < 0) return -1;
|
||||||
|
// if (tEncodeI8(pEncoder, pTask->numOfRunners) < 0) return -1;
|
||||||
if (tEncodeSEpSet(pEncoder, &pTask->NextOpEp) < 0) return -1;
|
if (tEncodeSEpSet(pEncoder, &pTask->NextOpEp) < 0) return -1;
|
||||||
if (tEncodeCStr(pEncoder, pTask->qmsg) < 0) return -1;
|
if (tEncodeCStr(pEncoder, pTask->qmsg) < 0) return -1;
|
||||||
tEndEncode(pEncoder);
|
/*tEndEncode(pEncoder);*/
|
||||||
return pEncoder->pos;
|
return pEncoder->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDecodeSStreamTask(SCoder *pDecoder, SStreamTask *pTask) {
|
int32_t tDecodeSStreamTask(SCoder *pDecoder, SStreamTask *pTask) {
|
||||||
if (tStartDecode(pDecoder) < 0) return -1;
|
/*if (tStartDecode(pDecoder) < 0) return -1;*/
|
||||||
if (tDecodeI64(pDecoder, &pTask->streamId) < 0) return -1;
|
if (tDecodeI64(pDecoder, &pTask->streamId) < 0) return -1;
|
||||||
if (tDecodeI32(pDecoder, &pTask->taskId) < 0) return -1;
|
if (tDecodeI32(pDecoder, &pTask->taskId) < 0) return -1;
|
||||||
if (tDecodeI32(pDecoder, &pTask->level) < 0) return -1;
|
if (tDecodeI32(pDecoder, &pTask->level) < 0) return -1;
|
||||||
if (tDecodeI8(pDecoder, &pTask->status) < 0) return -1;
|
if (tDecodeI8(pDecoder, &pTask->status) < 0) return -1;
|
||||||
if (tDecodeI8(pDecoder, &pTask->pipeEnd) < 0) return -1;
|
if (tDecodeI8(pDecoder, &pTask->pipeSource) < 0) return -1;
|
||||||
if (tDecodeI8(pDecoder, &pTask->parallel) < 0) return -1;
|
if (tDecodeI8(pDecoder, &pTask->pipeSink) < 0) return -1;
|
||||||
|
if (tDecodeI8(pDecoder, &pTask->parallelizable) < 0) return -1;
|
||||||
|
if (tDecodeI8(pDecoder, &pTask->nextOpDst) < 0) return -1;
|
||||||
|
// if (tDecodeI8(pDecoder, &pTask->numOfRunners) < 0) return -1;
|
||||||
if (tDecodeSEpSet(pDecoder, &pTask->NextOpEp) < 0) return -1;
|
if (tDecodeSEpSet(pDecoder, &pTask->NextOpEp) < 0) return -1;
|
||||||
if (tDecodeCStrAlloc(pDecoder, &pTask->qmsg) < 0) return -1;
|
if (tDecodeCStrAlloc(pDecoder, &pTask->qmsg) < 0) return -1;
|
||||||
tEndDecode(pDecoder);
|
/*tEndDecode(pDecoder);*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -222,6 +222,27 @@ int32_t tNameSetAcctId(SName* dst, int32_t acctId) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tNameDBNameEqual(SName* left, SName* right) {
|
||||||
|
if (NULL == left) {
|
||||||
|
if (NULL == right) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == right) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left->acctId != right->acctId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0 == strcmp(left->dbname, right->dbname));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
|
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
|
||||||
assert(dst != NULL && str != NULL && strlen(str) > 0);
|
assert(dst != NULL && str != NULL && strlen(str) > 0);
|
||||||
|
|
||||||
|
@ -273,13 +294,4 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema createSchema(uint8_t type, int32_t bytes, int32_t colId, const char* name) {
|
|
||||||
SSchema s = {0};
|
|
||||||
s.type = type;
|
|
||||||
s.bytes = bytes;
|
|
||||||
s.colId = colId;
|
|
||||||
|
|
||||||
tstrncpy(s.name, name, tListLen(s.name));
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ static FORCE_INLINE void dataColSetNoneAt(SDataCol *pCol, int index, bool setBit
|
||||||
setNull(POINTER_SHIFT(pCol->pData, TYPE_BYTES[pCol->type] * index), pCol->type, pCol->bytes);
|
setNull(POINTER_SHIFT(pCol->pData, TYPE_BYTES[pCol->type] * index), pCol->type, pCol->bytes);
|
||||||
pCol->len += TYPE_BYTES[pCol->type];
|
pCol->len += TYPE_BYTES[pCol->type];
|
||||||
}
|
}
|
||||||
if(setBitmap) {
|
if (setBitmap) {
|
||||||
tdSetBitmapValType(pCol->pBitmap, index, TD_VTYPE_NONE);
|
tdSetBitmapValType(pCol->pBitmap, index, TD_VTYPE_NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,8 +118,8 @@ int trbWriteCol(SRowBuilder *pRB, void *pData, col_id_t cid) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
STSRow* tdRowDup(STSRow *row) {
|
STSRow *tdRowDup(STSRow *row) {
|
||||||
STSRow* trow = malloc(TD_ROW_LEN(row));
|
STSRow *trow = malloc(TD_ROW_LEN(row));
|
||||||
if (trow == NULL) return NULL;
|
if (trow == NULL) return NULL;
|
||||||
|
|
||||||
tdRowCpy(trow, row);
|
tdRowCpy(trow, row);
|
||||||
|
@ -176,7 +176,7 @@ static int32_t tdAppendTpRowToDataCol(STSRow *pRow, STSchema *pSchema, SDataCols
|
||||||
|
|
||||||
SDataCol *pDataCol = &(pCols->cols[0]);
|
SDataCol *pDataCol = &(pCols->cols[0]);
|
||||||
if (pDataCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pDataCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
tdAppendValToDataCol(pDataCol, TD_VTYPE_NORM, &pRow->ts, pCols->numOfRows, pCols->maxPoints);
|
tdAppendValToDataCol(pDataCol, TD_VTYPE_NORM, &pRow->ts, pCols->numOfRows, pCols->maxPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (dcol < pCols->numOfCols) {
|
while (dcol < pCols->numOfCols) {
|
||||||
|
@ -378,9 +378,7 @@ static void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STSRow *mergeTwoRows(void *buffer, STSRow *row1, STSRow *row2, STSchema *pSchema1, STSchema *pSchema2) {
|
||||||
|
|
||||||
STSRow* mergeTwoRows(void *buffer, STSRow* row1, STSRow *row2, STSchema *pSchema1, STSchema *pSchema2) {
|
|
||||||
#if 0
|
#if 0
|
||||||
ASSERT(TD_ROW_KEY(row1) == TD_ROW_KEY(row2));
|
ASSERT(TD_ROW_KEY(row1) == TD_ROW_KEY(row2));
|
||||||
ASSERT(schemaVersion(pSchema1) == TD_ROW_SVER(row1));
|
ASSERT(schemaVersion(pSchema1) == TD_ROW_SVER(row1));
|
||||||
|
@ -473,6 +471,44 @@ STSRow* mergeTwoRows(void *buffer, STSRow* row1, STSRow *row2, STSchema *pSchema
|
||||||
}
|
}
|
||||||
taosArrayDestroy(stashRow);
|
taosArrayDestroy(stashRow);
|
||||||
return buffer;
|
return buffer;
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
|
SDataCols *pRet = tdNewDataCols(pDataCols->maxCols, pDataCols->maxPoints);
|
||||||
|
if (pRet == NULL) return NULL;
|
||||||
|
|
||||||
|
pRet->numOfCols = pDataCols->numOfCols;
|
||||||
|
pRet->sversion = pDataCols->sversion;
|
||||||
|
if (keepData) pRet->numOfRows = pDataCols->numOfRows;
|
||||||
|
|
||||||
|
for (int i = 0; i < pDataCols->numOfCols; i++) {
|
||||||
|
pRet->cols[i].type = pDataCols->cols[i].type;
|
||||||
|
pRet->cols[i].bitmap = pDataCols->cols[i].bitmap;
|
||||||
|
pRet->cols[i].colId = pDataCols->cols[i].colId;
|
||||||
|
pRet->cols[i].bytes = pDataCols->cols[i].bytes;
|
||||||
|
pRet->cols[i].offset = pDataCols->cols[i].offset;
|
||||||
|
|
||||||
|
if (keepData) {
|
||||||
|
if (pDataCols->cols[i].len > 0) {
|
||||||
|
if (tdAllocMemForCol(&pRet->cols[i], pRet->maxPoints) < 0) {
|
||||||
|
tdFreeDataCols(pRet);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pRet->cols[i].len = pDataCols->cols[i].len;
|
||||||
|
memcpy(pRet->cols[i].pData, pDataCols->cols[i].pData, pDataCols->cols[i].len);
|
||||||
|
if (IS_VAR_DATA_TYPE(pRet->cols[i].type)) {
|
||||||
|
int dataOffSize = sizeof(VarDataOffsetT) * pDataCols->maxPoints;
|
||||||
|
memcpy(pRet->cols[i].dataOff, pDataCols->cols[i].dataOff, dataOffSize);
|
||||||
|
}
|
||||||
|
if (!TD_COL_ROWS_NORM(pRet->cols + i)) {
|
||||||
|
int32_t nBitmapBytes = (int32_t)TD_BITMAP_BYTES(pDataCols->maxPoints);
|
||||||
|
memcpy(pRet->cols[i].pBitmap, pDataCols->cols[i].pBitmap, nBitmapBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRet;
|
||||||
|
}
|
|
@ -132,6 +132,7 @@ void mmInitMsgHandles(SMgmtWrapper *pWrapper) {
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_HEARTBEAT, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_HEARTBEAT, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_SHOW, (NodeMsgFp)mmProcessReadMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_SHOW, (NodeMsgFp)mmProcessReadMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_SHOW_RETRIEVE, (NodeMsgFp)mmProcessReadMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_SHOW_RETRIEVE, (NodeMsgFp)mmProcessReadMsg, 0);
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_MND_SYSTABLE_RETRIEVE, (NodeMsgFp)mmProcessReadMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_STATUS, (NodeMsgFp)mmProcessReadMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_STATUS, (NodeMsgFp)mmProcessReadMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_KILL_TRANS, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_KILL_TRANS, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_GRANT, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_GRANT, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
|
@ -143,6 +144,8 @@ void mmInitMsgHandles(SMgmtWrapper *pWrapper) {
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_SUBSCRIBE, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_SUBSCRIBE, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_MQ_COMMIT_OFFSET, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_MQ_COMMIT_OFFSET, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_GET_SUB_EP, (NodeMsgFp)mmProcessReadMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_MND_GET_SUB_EP, (NodeMsgFp)mmProcessReadMsg, 0);
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_MND_CREATE_STREAM, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_VND_TASK_DEPLOY_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
|
|
||||||
// Requests handled by VNODE
|
// Requests handled by VNODE
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CONN_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CONN_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
|
@ -152,5 +155,4 @@ void mmInitMsgHandles(SMgmtWrapper *pWrapper) {
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_DROP_STB_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_DROP_STB_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_CREATE_SMA_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_CREATE_SMA_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_DROP_SMA_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_DROP_SMA_RSP, (NodeMsgFp)mmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_TASK_DEPLOY, (NodeMsgFp)mmProcessWriteMsg, 0);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,7 +343,7 @@ void vmGetMgmtFp(SMgmtWrapper *pWrapper) {
|
||||||
mgmtFp.requiredFp = vmRequire;
|
mgmtFp.requiredFp = vmRequire;
|
||||||
|
|
||||||
vmInitMsgHandles(pWrapper);
|
vmInitMsgHandles(pWrapper);
|
||||||
pWrapper->name = "vnodes";
|
pWrapper->name = "vnode";
|
||||||
pWrapper->fp = mgmtFp;
|
pWrapper->fp = mgmtFp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,8 +277,10 @@ void vmInitMsgHandles(SMgmtWrapper *pWrapper) {
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_REB, (NodeMsgFp)vmProcessWriteMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_REB, (NodeMsgFp)vmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, (NodeMsgFp)vmProcessFetchMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_MQ_SET_CUR, (NodeMsgFp)vmProcessFetchMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_CONSUME, (NodeMsgFp)vmProcessFetchMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_CONSUME, (NodeMsgFp)vmProcessFetchMsg, 0);
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_VND_TASK_DEPLOY, (NodeMsgFp)vmProcessWriteMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_QUERY_HEARTBEAT, (NodeMsgFp)vmProcessFetchMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_QUERY_HEARTBEAT, (NodeMsgFp)vmProcessFetchMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_VND_TASK_EXEC, (NodeMsgFp)vmProcessFetchMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_VND_TASK_EXEC, (NodeMsgFp)vmProcessFetchMsg, 0);
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_VND_STREAM_TRIGGER, (NodeMsgFp)vmProcessFetchMsg, 0);
|
||||||
|
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_VNODE, (NodeMsgFp)vmProcessMgmtMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_VNODE, (NodeMsgFp)vmProcessMgmtMsg, 0);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_ALTER_VNODE, (NodeMsgFp)vmProcessMgmtMsg, 0);
|
dndSetMsgHandle(pWrapper, TDMT_DND_ALTER_VNODE, (NodeMsgFp)vmProcessMgmtMsg, 0);
|
||||||
|
|
|
@ -24,6 +24,7 @@ extern "C" {
|
||||||
|
|
||||||
int32_t mndInitSnode(SMnode *pMnode);
|
int32_t mndInitSnode(SMnode *pMnode);
|
||||||
void mndCleanupSnode(SMnode *pMnode);
|
void mndCleanupSnode(SMnode *pMnode);
|
||||||
|
SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -930,12 +930,12 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
while (vindex < pDb->cfg.numOfVgroups) {
|
while (true) {
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
if (pVgroup->dbUid == pDb->uid) {
|
if (NULL == pDb || pVgroup->dbUid == pDb->uid) {
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
vgInfo.vgId = pVgroup->vgId;
|
vgInfo.vgId = pVgroup->vgId;
|
||||||
vgInfo.hashBegin = pVgroup->hashBegin;
|
vgInfo.hashBegin = pVgroup->hashBegin;
|
||||||
|
@ -960,6 +960,10 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
|
|
||||||
|
if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbCancelFetch(pSdb, pIter);
|
sdbCancelFetch(pSdb, pIter);
|
||||||
|
@ -981,7 +985,25 @@ static int32_t mndProcessUseDbReq(SNodeMsg *pReq) {
|
||||||
char *p = strchr(usedbReq.db, '.');
|
char *p = strchr(usedbReq.db, '.');
|
||||||
if (p && 0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB)) {
|
if (p && 0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB)) {
|
||||||
memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
|
memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
|
||||||
code = 0;
|
static int32_t vgVersion = 1;
|
||||||
|
if (usedbReq.vgVersion < vgVersion) {
|
||||||
|
usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
|
||||||
|
if (usedbRsp.pVgroupInfos == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto USE_DB_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
|
||||||
|
usedbRsp.vgVersion = vgVersion++;
|
||||||
|
|
||||||
|
if (taosArrayGetSize(usedbRsp.pVgroupInfos) <= 0) {
|
||||||
|
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
usedbRsp.vgVersion = usedbReq.vgVersion;
|
||||||
|
code = 0;
|
||||||
|
}
|
||||||
|
usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
|
||||||
} else {
|
} else {
|
||||||
pDb = mndAcquireDb(pMnode, usedbReq.db);
|
pDb = mndAcquireDb(pMnode, usedbReq.db);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
|
@ -1341,123 +1363,149 @@ char *mnGetDbStr(char *src) {
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
|
static char* getDataPosition(char* pData, SShowObj* pShow, int32_t cols, int32_t rows, int32_t capacityOfRow) {
|
||||||
|
return pData + pShow->offset[cols] * capacityOfRow + pShow->bytes[cols] * rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpDbInfoToPayload(char* data, SDbObj* pDb, SShowObj* pShow, int32_t rows, int32_t rowCapacity, int64_t numOfTables) {
|
||||||
|
int32_t cols = 0;
|
||||||
|
|
||||||
|
char* pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
char *name = mnGetDbStr(pDb->name);
|
||||||
|
if (name != NULL) {
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, name, pShow->bytes[cols]);
|
||||||
|
} else {
|
||||||
|
STR_TO_VARSTR(pWrite, "NULL");
|
||||||
|
}
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int64_t *)pWrite = pDb->createdTime;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int16_t *)pWrite = pDb->cfg.numOfVgroups;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int64_t *)pWrite = numOfTables;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int16_t *)pWrite = pDb->cfg.replications;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int16_t *)pWrite = pDb->cfg.quorum;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int16_t *)pWrite = pDb->cfg.daysPerFile;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
char tmp[128] = {0};
|
||||||
|
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
||||||
|
sprintf(tmp, "%d,%d,%d", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2, pDb->cfg.daysToKeep0);
|
||||||
|
} else {
|
||||||
|
sprintf(tmp, "%d,%d,%d", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2);
|
||||||
|
}
|
||||||
|
STR_WITH_SIZE_TO_VARSTR(pWrite, tmp, strlen(tmp));
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int32_t *)pWrite = pDb->cfg.cacheBlockSize;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int32_t *)pWrite = pDb->cfg.totalBlocks;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int32_t *)pWrite = pDb->cfg.minRows;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int32_t *)pWrite = pDb->cfg.maxRows;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int8_t *)pWrite = pDb->cfg.walLevel;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int32_t *)pWrite = pDb->cfg.fsyncPeriod;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int8_t *)pWrite = pDb->cfg.compression;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
*(int8_t *)pWrite = pDb->cfg.cacheLastRow;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
char *prec = NULL;
|
||||||
|
switch (pDb->cfg.precision) {
|
||||||
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
|
prec = TSDB_TIME_PRECISION_MILLI_STR;
|
||||||
|
break;
|
||||||
|
case TSDB_TIME_PRECISION_MICRO:
|
||||||
|
prec = TSDB_TIME_PRECISION_MICRO_STR;
|
||||||
|
break;
|
||||||
|
case TSDB_TIME_PRECISION_NANO:
|
||||||
|
prec = TSDB_TIME_PRECISION_NANO_STR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
prec = "none";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
STR_WITH_SIZE_TO_VARSTR(pWrite, prec, 2);
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
// pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
|
||||||
|
// *(int8_t *)pWrite = pDb->cfg.update;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setInformationSchemaDbCfg(SDbObj* pDbObj) {
|
||||||
|
ASSERT(pDbObj != NULL);
|
||||||
|
strncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
|
||||||
|
|
||||||
|
pDbObj->createdTime = 0;
|
||||||
|
pDbObj->cfg.numOfVgroups = 0;
|
||||||
|
pDbObj->cfg.quorum = 1;
|
||||||
|
pDbObj->cfg.replications = 1;
|
||||||
|
pDbObj->cfg.update = 1;
|
||||||
|
pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rowsCapacity) {
|
||||||
SMnode *pMnode = pReq->pNode;
|
SMnode *pMnode = pReq->pNode;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
SDbObj *pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
char *pWrite;
|
|
||||||
int32_t cols = 0;
|
|
||||||
|
|
||||||
while (numOfRows < rows) {
|
while (numOfRows < rowsCapacity) {
|
||||||
pShow->pIter = sdbFetch(pSdb, SDB_DB, pShow->pIter, (void **)&pDb);
|
pShow->pIter = sdbFetch(pSdb, SDB_DB, pShow->pIter, (void **)&pDb);
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) {
|
||||||
|
break;
|
||||||
cols = 0;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
char *name = mnGetDbStr(pDb->name);
|
|
||||||
if (name != NULL) {
|
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, name, pShow->bytes[cols]);
|
|
||||||
} else {
|
|
||||||
STR_TO_VARSTR(pWrite, "NULL");
|
|
||||||
}
|
}
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int64_t *)pWrite = pDb->createdTime;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = pDb->cfg.numOfVgroups;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = 0; // todo
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = pDb->cfg.replications;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = pDb->cfg.quorum;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = pDb->cfg.daysPerFile;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
char tmp[128] = {0};
|
|
||||||
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
|
||||||
sprintf(tmp, "%d,%d,%d", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2, pDb->cfg.daysToKeep0);
|
|
||||||
} else {
|
|
||||||
sprintf(tmp, "%d,%d,%d", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2);
|
|
||||||
}
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(pWrite, tmp, strlen(tmp));
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pDb->cfg.cacheBlockSize;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pDb->cfg.totalBlocks;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pDb->cfg.minRows;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pDb->cfg.maxRows;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int8_t *)pWrite = pDb->cfg.walLevel;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pDb->cfg.fsyncPeriod;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int8_t *)pWrite = pDb->cfg.compression;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int8_t *)pWrite = pDb->cfg.cacheLastRow;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
char *prec = NULL;
|
|
||||||
switch (pDb->cfg.precision) {
|
|
||||||
case TSDB_TIME_PRECISION_MILLI:
|
|
||||||
prec = TSDB_TIME_PRECISION_MILLI_STR;
|
|
||||||
break;
|
|
||||||
case TSDB_TIME_PRECISION_MICRO:
|
|
||||||
prec = TSDB_TIME_PRECISION_MICRO_STR;
|
|
||||||
break;
|
|
||||||
case TSDB_TIME_PRECISION_NANO:
|
|
||||||
prec = TSDB_TIME_PRECISION_NANO_STR;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
prec = "none";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(pWrite, prec, 2);
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
// pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
// *(int8_t *)pWrite = pDb->cfg.update;
|
|
||||||
// cols++;
|
|
||||||
|
|
||||||
|
dumpDbInfoToPayload(data, pDb, pShow, numOfRows, rowsCapacity, 0);
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
sdbRelease(pSdb, pDb);
|
sdbRelease(pSdb, pDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
|
// Append the information_schema database into the result.
|
||||||
|
if (numOfRows < rowsCapacity) {
|
||||||
|
SDbObj dummyISDb = {0};
|
||||||
|
setInformationSchemaDbCfg(&dummyISDb);
|
||||||
|
dumpDbInfoToPayload(data, &dummyISDb, pShow, numOfRows, rowsCapacity, 14);
|
||||||
|
numOfRows += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rowsCapacity, pShow);
|
||||||
pShow->numOfReads += numOfRows;
|
pShow->numOfReads += numOfRows;
|
||||||
|
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
|
|
|
@ -752,7 +752,7 @@ static int32_t mndGetDnodeMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *p
|
||||||
pSchema[cols].bytes = pShow->bytes[cols];
|
pSchema[cols].bytes = pShow->bytes[cols];
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
pShow->bytes[cols] = 24 + VARSTR_HEADER_SIZE;
|
pShow->bytes[cols] = 256 + VARSTR_HEADER_SIZE;
|
||||||
pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
|
pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
|
||||||
strcpy(pSchema[cols].name, "offline_reason");
|
strcpy(pSchema[cols].name, "offline_reason");
|
||||||
pSchema[cols].bytes = pShow->bytes[cols];
|
pSchema[cols].bytes = pShow->bytes[cols];
|
||||||
|
|
|
@ -16,85 +16,92 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mndInfoSchema.h"
|
#include "mndInfoSchema.h"
|
||||||
|
|
||||||
static const SInfosTableSchema dnodesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
#define SYSTABLE_SCH_TABLE_NAME_LEN ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
|
||||||
{.name = "end_point", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
#define SYSTABLE_SCH_DB_NAME_LEN ((TSDB_DB_NAME_LEN - 1) + VARSTR_HEADER_SIZE)
|
||||||
{.name = "vnodes", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
|
||||||
{.name = "cores", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
static const SInfosTableSchema dnodesSchema[] = {{.name = "id", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
{.name = "status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "endpoint", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "role", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "vnodes", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
|
{.name = "max_vnodes", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
|
{.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "offline_reason", .bytes = 256, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "note", .bytes = 256 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema mnodesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
static const SInfosTableSchema mnodesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "end_point", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "endpoint", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "role", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "role", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "role_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "role_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema modulesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
static const SInfosTableSchema modulesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "end_point", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "endpoint", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "module", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "module", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema qnodesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
static const SInfosTableSchema qnodesSchema[] = {{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "end_point", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "endpoint", .bytes = 134, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userDBSchema[] = {{.name = "name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userDBSchema[] = {{.name = "name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "created_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "ntables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "vgroups", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
{.name = "vgroups", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "ntables", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
||||||
{.name = "replica", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "replica", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
{.name = "quorum", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "quorum", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
{.name = "days", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "days", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT},
|
||||||
{.name = "keep", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "keep", .bytes = 24 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "cache", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "cache", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "blocks", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "blocks", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "minrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "minrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "maxrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "maxrows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "wallevel", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "wallevel", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
{.name = "fsync", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "fsync", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "comp", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
{.name = "cachelast", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "cachelast", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
{.name = "precision", .bytes = 2, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "precision", .bytes = 3 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
// {.name = "update", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT}, // disable update
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userFuncSchema[] = {{.name = "name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userFuncSchema[] = {{.name = "name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "created_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "ntables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "ntables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "precision", .bytes = 2, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "precision", .bytes = 2, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userIdxSchema[] = {{.name = "table_database", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userIdxSchema[] = {{.name = "db_name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "table_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "table_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "index_database", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "index_database", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "index_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "index_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "column_name", .bytes = 64, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "column_name", .bytes = 64, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "index_type", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "index_type", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "index_extensions", .bytes = 256, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "index_extensions", .bytes = 256, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userStbsSchema[] = {{.name = "db_name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userStbsSchema[] = {{.name = "stable_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "stable_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "created_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "columns", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "columns", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "tags", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "tags", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "last_update", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
|
{.name = "table_comment", .bytes = 1024 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_INT},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userStreamsSchema[] = {{.name = "stream_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userStreamsSchema[] = {{.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "user_name", .bytes = 23, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "user_name", .bytes = 23, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "dest_table", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "dest_table", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "created_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "sql", .bytes = 1024, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "sql", .bytes = 1024, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userTblsSchema[] = {{.name = "db_name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userTblsSchema[] = {
|
||||||
{.name = "table_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "table_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "created_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "columns", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "columns", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "stable_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "stable_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "tid", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
{.name = "uid", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
||||||
{.name = "vg_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "ttl", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "table_comment", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userTblDistSchema[] = {{.name = "db_name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userTblDistSchema[] = {{.name = "db_name", .bytes = 32, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "table_name", .bytes = 192, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "table_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "distributed_histogram", .bytes = 500, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "distributed_histogram", .bytes = 500, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "min_of_rows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "min_of_rows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "max_of_rows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "max_of_rows", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
@ -107,13 +114,15 @@ static const SInfosTableSchema userTblDistSchema[] = {{.name = "db_name",
|
||||||
{.name = "rows_in_mem", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "rows_in_mem", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "seek_header_time", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "seek_header_time", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema userUsersSchema[] = {{.name = "user_name", .bytes = 23, .type = TSDB_DATA_TYPE_BINARY},
|
static const SInfosTableSchema userUsersSchema[] = {{.name = "name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "privilege", .bytes = 256, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
|
{.name = "account", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
};
|
};
|
||||||
static const SInfosTableSchema vgroupsSchema[] = {{.name = "vg_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
static const SInfosTableSchema vgroupsSchema[] = {{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "onlines", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "onlines", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "v1_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "v1_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "v1_status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "v1_status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
|
@ -122,13 +131,15 @@ static const SInfosTableSchema vgroupsSchema[] = {{.name = "vg_id", .
|
||||||
{.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "v3_status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
{.name = "v3_status", .bytes = 10, .type = TSDB_DATA_TYPE_BINARY},
|
||||||
{.name = "compacting", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "compacting", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SInfosTableMeta infosMeta[] = {{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema)},
|
static const SInfosTableMeta infosMeta[] = {{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema)},
|
||||||
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema)},
|
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema)},
|
||||||
{TSDB_INS_TABLE_MODULES, modulesSchema, tListLen(modulesSchema)},
|
{TSDB_INS_TABLE_MODULES, modulesSchema, tListLen(modulesSchema)},
|
||||||
{TSDB_INS_TABLE_QNODES, qnodesSchema, tListLen(qnodesSchema)},
|
{TSDB_INS_TABLE_QNODES, qnodesSchema, tListLen(qnodesSchema)},
|
||||||
{TSDB_INS_TABLE_USER_DATABASE, userDBSchema, tListLen(userDBSchema)},
|
{TSDB_INS_TABLE_USER_DATABASES, userDBSchema, tListLen(userDBSchema)},
|
||||||
{TSDB_INS_TABLE_USER_FUNCTIONS, userFuncSchema, tListLen(userFuncSchema)},
|
{TSDB_INS_TABLE_USER_FUNCTIONS, userFuncSchema, tListLen(userFuncSchema)},
|
||||||
{TSDB_INS_TABLE_USER_INDEXES, userIdxSchema, tListLen(userIdxSchema)},
|
{TSDB_INS_TABLE_USER_INDEXES, userIdxSchema, tListLen(userIdxSchema)},
|
||||||
{TSDB_INS_TABLE_USER_STABLES, userStbsSchema, tListLen(userStbsSchema)},
|
{TSDB_INS_TABLE_USER_STABLES, userStbsSchema, tListLen(userStbsSchema)},
|
||||||
|
@ -139,7 +150,7 @@ static const SInfosTableMeta infosMeta[] = {{TSDB_INS_TABLE_DNODES, dnodesSchema
|
||||||
{TSDB_INS_TABLE_VGROUPS, vgroupsSchema, tListLen(vgroupsSchema)},
|
{TSDB_INS_TABLE_VGROUPS, vgroupsSchema, tListLen(vgroupsSchema)},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//connection/application/
|
||||||
int32_t mndInitInfosTableSchema(const SInfosTableSchema *pSrc, int32_t colNum, SSchema **pDst) {
|
int32_t mndInitInfosTableSchema(const SInfosTableSchema *pSrc, int32_t colNum, SSchema **pDst) {
|
||||||
SSchema *schema = calloc(colNum, sizeof(SSchema));
|
SSchema *schema = calloc(colNum, sizeof(SSchema));
|
||||||
if (NULL == schema) {
|
if (NULL == schema) {
|
||||||
|
@ -147,7 +158,6 @@ int32_t mndInitInfosTableSchema(const SInfosTableSchema *pSrc, int32_t colNum, S
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < colNum; ++i) {
|
for (int32_t i = 0; i < colNum; ++i) {
|
||||||
strcpy(schema[i].name, pSrc[i].name);
|
strcpy(schema[i].name, pSrc[i].name);
|
||||||
|
|
||||||
|
@ -157,7 +167,6 @@ int32_t mndInitInfosTableSchema(const SInfosTableSchema *pSrc, int32_t colNum, S
|
||||||
}
|
}
|
||||||
|
|
||||||
*pDst = schema;
|
*pDst = schema;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +174,7 @@ int32_t mndInsInitMeta(SHashObj *hash) {
|
||||||
STableMetaRsp meta = {0};
|
STableMetaRsp meta = {0};
|
||||||
|
|
||||||
strcpy(meta.dbFName, TSDB_INFORMATION_SCHEMA_DB);
|
strcpy(meta.dbFName, TSDB_INFORMATION_SCHEMA_DB);
|
||||||
meta.tableType = TSDB_NORMAL_TABLE;
|
meta.tableType = TSDB_SYSTEM_TABLE;
|
||||||
meta.sversion = 1;
|
meta.sversion = 1;
|
||||||
meta.tversion = 1;
|
meta.tversion = 1;
|
||||||
|
|
||||||
|
|
|
@ -692,11 +692,11 @@ static int32_t mndRetrieveMnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, in
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
*(int64_t *)pWrite = pObj->createdTime;
|
*(int64_t *)pWrite = pObj->roleTime;
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
*(int64_t *)pWrite = pObj->roleTime;
|
*(int64_t *)pWrite = pObj->createdTime;
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "mndMnode.h"
|
#include "mndMnode.h"
|
||||||
#include "mndOffset.h"
|
#include "mndOffset.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
|
#include "mndSnode.h"
|
||||||
#include "mndStb.h"
|
#include "mndStb.h"
|
||||||
#include "mndStream.h"
|
#include "mndStream.h"
|
||||||
#include "mndSubscribe.h"
|
#include "mndSubscribe.h"
|
||||||
|
@ -31,20 +32,23 @@
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "tuuid.h"
|
#include "tuuid.h"
|
||||||
|
|
||||||
int32_t mndPersistTaskDeployReq(STrans* pTrans, SStreamTask* pTask, const SEpSet* pEpSet) {
|
extern bool tsStreamSchedV;
|
||||||
|
|
||||||
|
int32_t mndPersistTaskDeployReq(STrans* pTrans, SStreamTask* pTask, const SEpSet* pEpSet, tmsg_t type, int32_t nodeId) {
|
||||||
SCoder encoder;
|
SCoder encoder;
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, NULL, 0, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, NULL, 0, TD_ENCODER);
|
||||||
tEncodeSStreamTask(&encoder, pTask);
|
tEncodeSStreamTask(&encoder, pTask);
|
||||||
int32_t tlen = sizeof(SMsgHead) + encoder.pos;
|
int32_t size = encoder.pos;
|
||||||
|
int32_t tlen = sizeof(SMsgHead) + size;
|
||||||
tCoderClear(&encoder);
|
tCoderClear(&encoder);
|
||||||
void* buf = malloc(tlen);
|
void* buf = malloc(tlen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
((SMsgHead*)buf)->streamTaskId = pTask->taskId;
|
((SMsgHead*)buf)->streamTaskId = htonl(nodeId);
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, abuf, tlen, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, abuf, size, TD_ENCODER);
|
||||||
tEncodeSStreamTask(&encoder, pTask);
|
tEncodeSStreamTask(&encoder, pTask);
|
||||||
tCoderClear(&encoder);
|
tCoderClear(&encoder);
|
||||||
|
|
||||||
|
@ -52,7 +56,7 @@ int32_t mndPersistTaskDeployReq(STrans* pTrans, SStreamTask* pTask, const SEpSet
|
||||||
memcpy(&action.epSet, pEpSet, sizeof(SEpSet));
|
memcpy(&action.epSet, pEpSet, sizeof(SEpSet));
|
||||||
action.pCont = buf;
|
action.pCont = buf;
|
||||||
action.contLen = tlen;
|
action.contLen = tlen;
|
||||||
action.msgType = TDMT_SND_TASK_DEPLOY;
|
action.msgType = type;
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
rpcFreeCont(buf);
|
rpcFreeCont(buf);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -69,12 +73,27 @@ int32_t mndAssignTaskToVg(SMnode* pMnode, STrans* pTrans, SStreamTask* pTask, SS
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mndPersistTaskDeployReq(pTrans, pTask, &plan->execNode.epSet);
|
mndPersistTaskDeployReq(pTrans, pTask, &plan->execNode.epSet, TDMT_VND_TASK_DEPLOY, pVgroup->vgId);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSnodeObj* mndSchedFetchSnode(SMnode* pMnode) {
|
||||||
|
SSnodeObj* pObj = NULL;
|
||||||
|
pObj = sdbFetch(pMnode->pSdb, SDB_SNODE, NULL, (void**)&pObj);
|
||||||
|
return pObj;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mndAssignTaskToSnode(SMnode* pMnode, STrans* pTrans, SStreamTask* pTask, SSubplan* plan,
|
int32_t mndAssignTaskToSnode(SMnode* pMnode, STrans* pTrans, SStreamTask* pTask, SSubplan* plan,
|
||||||
const SSnodeObj* pSnode) {
|
const SSnodeObj* pSnode) {
|
||||||
|
int32_t msgLen;
|
||||||
|
plan->execNode.nodeId = pSnode->id;
|
||||||
|
plan->execNode.epSet = mndAcquireEpFromSnode(pMnode, pSnode);
|
||||||
|
|
||||||
|
if (qSubPlanToString(plan, &pTask->qmsg, &msgLen) < 0) {
|
||||||
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
mndPersistTaskDeployReq(pTrans, pTask, &plan->execNode.epSet, TDMT_SND_TASK_DEPLOY, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +109,7 @@ int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream) {
|
||||||
|
|
||||||
int32_t totLevel = LIST_LENGTH(pPlan->pSubplans);
|
int32_t totLevel = LIST_LENGTH(pPlan->pSubplans);
|
||||||
pStream->tasks = taosArrayInit(totLevel, sizeof(SArray));
|
pStream->tasks = taosArrayInit(totLevel, sizeof(SArray));
|
||||||
|
int32_t lastUsedVgId = 0;
|
||||||
|
|
||||||
for (int32_t level = 0; level < totLevel; level++) {
|
for (int32_t level = 0; level < totLevel; level++) {
|
||||||
SArray* taskOneLevel = taosArrayInit(0, sizeof(SStreamTask));
|
SArray* taskOneLevel = taosArrayInit(0, sizeof(SStreamTask));
|
||||||
|
@ -97,9 +117,9 @@ int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream) {
|
||||||
int32_t opNum = LIST_LENGTH(inner->pNodeList);
|
int32_t opNum = LIST_LENGTH(inner->pNodeList);
|
||||||
ASSERT(opNum == 1);
|
ASSERT(opNum == 1);
|
||||||
|
|
||||||
SSubplan* plan = nodesListGetNode(inner->pNodeList, level);
|
SSubplan* plan = nodesListGetNode(inner->pNodeList, 0);
|
||||||
if (level == 0) {
|
if (level == 0) {
|
||||||
ASSERT(plan->type == SUBPLAN_TYPE_SCAN);
|
ASSERT(plan->subplanType == SUBPLAN_TYPE_SCAN);
|
||||||
void* pIter = NULL;
|
void* pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
||||||
|
@ -109,12 +129,15 @@ int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastUsedVgId = pVgroup->vgId;
|
||||||
pStream->vgNum++;
|
pStream->vgNum++;
|
||||||
// send to vnode
|
// send to vnode
|
||||||
|
|
||||||
SStreamTask* pTask = streamTaskNew(pStream->uid, level);
|
SStreamTask* pTask = streamTaskNew(pStream->uid, level);
|
||||||
|
pTask->pipeSource = 1;
|
||||||
|
pTask->pipeSink = level == totLevel - 1 ? 1 : 0;
|
||||||
|
pTask->parallelizable = 1;
|
||||||
// TODO: set to
|
// TODO: set to
|
||||||
pTask->parallel = 4;
|
|
||||||
if (mndAssignTaskToVg(pMnode, pTrans, pTask, plan, pVgroup) < 0) {
|
if (mndAssignTaskToVg(pMnode, pTrans, pTask, plan, pVgroup) < 0) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
|
@ -122,35 +145,37 @@ int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream) {
|
||||||
}
|
}
|
||||||
taosArrayPush(taskOneLevel, pTask);
|
taosArrayPush(taskOneLevel, pTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (plan->subplanType == SUBPLAN_TYPE_SCAN) {
|
|
||||||
// duplicatable
|
|
||||||
|
|
||||||
int32_t parallel = 0;
|
|
||||||
// if no snode, parallel set to fetch thread num in vnode
|
|
||||||
|
|
||||||
// if has snode, set to shared thread num in snode
|
|
||||||
parallel = SND_SHARED_THREAD_NUM;
|
|
||||||
|
|
||||||
SStreamTask* pTask = streamTaskNew(pStream->uid, level);
|
|
||||||
pTask->parallel = parallel;
|
|
||||||
// TODO:get snode id and ep
|
|
||||||
if (mndAssignTaskToVg(pMnode, pTrans, pTask, plan, pVgroup) < 0) {
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
|
||||||
qDestroyQueryPlan(pPlan);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
taosArrayPush(taskOneLevel, pTask);
|
|
||||||
} else {
|
} else {
|
||||||
// not duplicatable
|
|
||||||
SStreamTask* pTask = streamTaskNew(pStream->uid, level);
|
SStreamTask* pTask = streamTaskNew(pStream->uid, level);
|
||||||
|
pTask->pipeSource = 0;
|
||||||
|
pTask->pipeSink = level == totLevel - 1 ? 1 : 0;
|
||||||
|
pTask->parallelizable = plan->subplanType == SUBPLAN_TYPE_SCAN;
|
||||||
|
pTask->nextOpDst = STREAM_NEXT_OP_DST__VND;
|
||||||
|
|
||||||
// TODO: get snode
|
if (tsStreamSchedV) {
|
||||||
if (mndAssignTaskToVg(pMnode, pTrans, pTask, plan, pVgroup) < 0) {
|
ASSERT(lastUsedVgId != 0);
|
||||||
sdbRelease(pSdb, pVgroup);
|
SVgObj* pVg = mndAcquireVgroup(pMnode, lastUsedVgId);
|
||||||
qDestroyQueryPlan(pPlan);
|
if (mndAssignTaskToVg(pMnode, pTrans, pTask, plan, pVg) < 0) {
|
||||||
return -1;
|
sdbRelease(pSdb, pVg);
|
||||||
|
qDestroyQueryPlan(pPlan);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sdbRelease(pSdb, pVg);
|
||||||
|
} else {
|
||||||
|
SSnodeObj* pSnode = mndSchedFetchSnode(pMnode);
|
||||||
|
if (pSnode != NULL) {
|
||||||
|
if (mndAssignTaskToSnode(pMnode, pTrans, pTask, plan, pSnode) < 0) {
|
||||||
|
sdbRelease(pSdb, pSnode);
|
||||||
|
qDestroyQueryPlan(pPlan);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sdbRelease(pMnode->pSdb, pSnode);
|
||||||
|
} else {
|
||||||
|
// TODO: assign to one vg
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(taskOneLevel, pTask);
|
taosArrayPush(taskOneLevel, pTask);
|
||||||
}
|
}
|
||||||
taosArrayPush(pStream->tasks, taskOneLevel);
|
taosArrayPush(pStream->tasks, taskOneLevel);
|
||||||
|
|
|
@ -289,6 +289,20 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
|
||||||
mError("failed to process show-meta req since %s", terrstr());
|
mError("failed to process show-meta req since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STableMetaRsp *meta = (STableMetaRsp *)taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb));
|
||||||
|
pShow->numOfRows = 100;
|
||||||
|
|
||||||
|
int32_t offset = 0;
|
||||||
|
for(int32_t i = 0; i < meta->numOfColumns; ++i) {
|
||||||
|
pShow->numOfColumns = meta->numOfColumns;
|
||||||
|
pShow->offset[i] = offset;
|
||||||
|
|
||||||
|
int32_t bytes = meta->pSchemas[i].bytes;
|
||||||
|
pShow->rowSize += bytes;
|
||||||
|
pShow->bytes[i] = bytes;
|
||||||
|
offset += bytes;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
pShow = mndAcquireShowObj(pMnode, retrieveReq.showId);
|
pShow = mndAcquireShowObj(pMnode, retrieveReq.showId);
|
||||||
if (pShow == NULL) {
|
if (pShow == NULL) {
|
||||||
|
@ -330,7 +344,7 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
|
||||||
size = pShow->rowSize * rowsToRead;
|
size = pShow->rowSize * rowsToRead;
|
||||||
|
|
||||||
size += SHOW_STEP_SIZE;
|
size += SHOW_STEP_SIZE;
|
||||||
SRetrieveTableRsp *pRsp = rpcMallocCont(size);
|
SRetrieveMetaTableRsp *pRsp = rpcMallocCont(size);
|
||||||
if (pRsp == NULL) {
|
if (pRsp == NULL) {
|
||||||
mndReleaseShowObj((SShowObj*) pShow, false);
|
mndReleaseShowObj((SShowObj*) pShow, false);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -338,6 +352,8 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pRsp->handle = htobe64(pShow->id);
|
||||||
|
|
||||||
// if free flag is set, client wants to clean the resources
|
// if free flag is set, client wants to clean the resources
|
||||||
if ((retrieveReq.free & TSDB_QUERY_TYPE_FREE_RESOURCE) != TSDB_QUERY_TYPE_FREE_RESOURCE) {
|
if ((retrieveReq.free & TSDB_QUERY_TYPE_FREE_RESOURCE) != TSDB_QUERY_TYPE_FREE_RESOURCE) {
|
||||||
rowsRead = (*retrieveFp)(pReq, (SShowObj*) pShow, pRsp->data, rowsToRead);
|
rowsRead = (*retrieveFp)(pReq, (SShowObj*) pShow, pRsp->data, rowsToRead);
|
||||||
|
|
|
@ -60,6 +60,15 @@ int32_t mndInitSnode(SMnode *pMnode) {
|
||||||
|
|
||||||
void mndCleanupSnode(SMnode *pMnode) {}
|
void mndCleanupSnode(SMnode *pMnode) {}
|
||||||
|
|
||||||
|
SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode) {
|
||||||
|
SEpSet epSet;
|
||||||
|
memcpy(epSet.eps->fqdn, pSnode->pDnode->fqdn, 128);
|
||||||
|
epSet.eps->port = pSnode->pDnode->port;
|
||||||
|
epSet.numOfEps = 1;
|
||||||
|
epSet.inUse = 0;
|
||||||
|
return epSet;
|
||||||
|
}
|
||||||
|
|
||||||
static SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
|
static SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
|
||||||
SSnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_SNODE, &snodeId);
|
SSnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_SNODE, &snodeId);
|
||||||
if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
||||||
|
|
|
@ -1504,7 +1504,7 @@ static void mndExtractTableName(char *tableId, char *name) {
|
||||||
int32_t pos = -1;
|
int32_t pos = -1;
|
||||||
int32_t num = 0;
|
int32_t num = 0;
|
||||||
for (pos = 0; tableId[pos] != 0; ++pos) {
|
for (pos = 0; tableId[pos] != 0; ++pos) {
|
||||||
if (tableId[pos] == '.') num++;
|
if (tableId[pos] == TS_PATH_DELIMITER[0]) num++;
|
||||||
if (num == 2) break;
|
if (num == 2) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1522,8 +1522,11 @@ static int32_t mndRetrieveStb(SNodeMsg *pReq, SShowObj *pShow, char *data, int32
|
||||||
char *pWrite;
|
char *pWrite;
|
||||||
char prefix[TSDB_DB_FNAME_LEN] = {0};
|
char prefix[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, pShow->db);
|
SDbObj* pDb = NULL;
|
||||||
if (pDb == NULL) return 0;
|
if (strlen(pShow->db) > 0) {
|
||||||
|
pDb = mndAcquireDb(pMnode, pShow->db);
|
||||||
|
if (pDb == NULL) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
tstrncpy(prefix, pShow->db, TSDB_DB_FNAME_LEN);
|
tstrncpy(prefix, pShow->db, TSDB_DB_FNAME_LEN);
|
||||||
strcat(prefix, TS_PATH_DELIMITER);
|
strcat(prefix, TS_PATH_DELIMITER);
|
||||||
|
@ -1533,7 +1536,7 @@ static int32_t mndRetrieveStb(SNodeMsg *pReq, SShowObj *pShow, char *data, int32
|
||||||
pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
|
pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb);
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) break;
|
||||||
|
|
||||||
if (pStb->dbUid != pDb->uid) {
|
if (pDb != NULL && pStb->dbUid != pDb->uid) {
|
||||||
if (strncmp(pStb->db, pDb->name, prefixLen) == 0) {
|
if (strncmp(pStb->db, pDb->name, prefixLen) == 0) {
|
||||||
mError("Inconsistent table data, name:%s, db:%s, dbUid:%" PRIu64, pStb->name, pDb->name, pDb->uid);
|
mError("Inconsistent table data, name:%s, db:%s, dbUid:%" PRIu64, pStb->name, pDb->name, pDb->uid);
|
||||||
}
|
}
|
||||||
|
@ -1544,12 +1547,20 @@ static int32_t mndRetrieveStb(SNodeMsg *pReq, SShowObj *pShow, char *data, int32
|
||||||
|
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
|
||||||
|
SName name = {0};
|
||||||
char stbName[TSDB_TABLE_NAME_LEN] = {0};
|
char stbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
tstrncpy(stbName, pStb->name + prefixLen, TSDB_TABLE_NAME_LEN);
|
mndExtractTableName(pStb->name, stbName);
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
STR_TO_VARSTR(pWrite, stbName);
|
STR_TO_VARSTR(pWrite, stbName);
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
char db[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
tNameFromString(&name, pStb->db, T_NAME_ACCT|T_NAME_DB);
|
||||||
|
tNameGetDbName(&name, db);
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_TO_VARSTR(pWrite, db);
|
||||||
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
*(int64_t *)pWrite = pStb->createdTime;
|
*(int64_t *)pWrite = pStb->createdTime;
|
||||||
cols++;
|
cols++;
|
||||||
|
@ -1562,11 +1573,26 @@ static int32_t mndRetrieveStb(SNodeMsg *pReq, SShowObj *pShow, char *data, int32
|
||||||
*(int32_t *)pWrite = pStb->numOfTags;
|
*(int32_t *)pWrite = pStb->numOfTags;
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *)pWrite = 0; // number of tables
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int64_t *)pWrite = pStb->updateTime; // number of tables
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_TO_VARSTR(pWrite, pStb->comment);
|
||||||
|
cols++;
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
sdbRelease(pSdb, pStb);
|
sdbRelease(pSdb, pStb);
|
||||||
}
|
}
|
||||||
|
|
||||||
mndReleaseDb(pMnode, pDb);
|
if (pDb != NULL) {
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
}
|
||||||
|
|
||||||
pShow->numOfReads += numOfRows;
|
pShow->numOfReads += numOfRows;
|
||||||
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
|
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "mndScheduler.h"
|
#include "mndScheduler.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
#include "mndStb.h"
|
#include "mndStb.h"
|
||||||
|
#include "mndTopic.h"
|
||||||
#include "mndTrans.h"
|
#include "mndTrans.h"
|
||||||
#include "mndUser.h"
|
#include "mndUser.h"
|
||||||
#include "mndVgroup.h"
|
#include "mndVgroup.h"
|
||||||
|
@ -33,6 +34,7 @@ static int32_t mndStreamActionInsert(SSdb *pSdb, SStreamObj *pStream);
|
||||||
static int32_t mndStreamActionDelete(SSdb *pSdb, SStreamObj *pStream);
|
static int32_t mndStreamActionDelete(SSdb *pSdb, SStreamObj *pStream);
|
||||||
static int32_t mndStreamActionUpdate(SSdb *pSdb, SStreamObj *pStream, SStreamObj *pNewStream);
|
static int32_t mndStreamActionUpdate(SSdb *pSdb, SStreamObj *pStream, SStreamObj *pNewStream);
|
||||||
static int32_t mndProcessCreateStreamReq(SNodeMsg *pReq);
|
static int32_t mndProcessCreateStreamReq(SNodeMsg *pReq);
|
||||||
|
static int32_t mndProcessTaskDeployInternalRsp(SNodeMsg *pRsp);
|
||||||
/*static int32_t mndProcessDropStreamReq(SNodeMsg *pReq);*/
|
/*static int32_t mndProcessDropStreamReq(SNodeMsg *pReq);*/
|
||||||
/*static int32_t mndProcessDropStreamInRsp(SNodeMsg *pRsp);*/
|
/*static int32_t mndProcessDropStreamInRsp(SNodeMsg *pRsp);*/
|
||||||
static int32_t mndProcessStreamMetaReq(SNodeMsg *pReq);
|
static int32_t mndProcessStreamMetaReq(SNodeMsg *pReq);
|
||||||
|
@ -50,6 +52,8 @@ int32_t mndInitStream(SMnode *pMnode) {
|
||||||
.deleteFp = (SdbDeleteFp)mndStreamActionDelete};
|
.deleteFp = (SdbDeleteFp)mndStreamActionDelete};
|
||||||
|
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STREAM, mndProcessCreateStreamReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STREAM, mndProcessCreateStreamReq);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_VND_TASK_DEPLOY_RSP, mndProcessTaskDeployInternalRsp);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_SND_TASK_DEPLOY_RSP, mndProcessTaskDeployInternalRsp);
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_DROP_STREAM, mndProcessDropStreamReq);*/
|
/*mndSetMsgHandle(pMnode, TDMT_MND_DROP_STREAM, mndProcessDropStreamReq);*/
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_DROP_STREAM_RSP, mndProcessDropStreamInRsp);*/
|
/*mndSetMsgHandle(pMnode, TDMT_MND_DROP_STREAM_RSP, mndProcessDropStreamInRsp);*/
|
||||||
|
|
||||||
|
@ -68,7 +72,7 @@ SSdbRaw *mndStreamActionEncode(SStreamObj *pStream) {
|
||||||
|
|
||||||
SCoder encoder;
|
SCoder encoder;
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, NULL, 0, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, NULL, 0, TD_ENCODER);
|
||||||
if (tEncodeSStreamObj(NULL, pStream) < 0) {
|
if (tEncodeSStreamObj(&encoder, pStream) < 0) {
|
||||||
tCoderClear(&encoder);
|
tCoderClear(&encoder);
|
||||||
goto STREAM_ENCODE_OVER;
|
goto STREAM_ENCODE_OVER;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +87,7 @@ SSdbRaw *mndStreamActionEncode(SStreamObj *pStream) {
|
||||||
if (buf == NULL) goto STREAM_ENCODE_OVER;
|
if (buf == NULL) goto STREAM_ENCODE_OVER;
|
||||||
|
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, tlen, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, tlen, TD_ENCODER);
|
||||||
if (tEncodeSStreamObj(NULL, pStream) < 0) {
|
if (tEncodeSStreamObj(&encoder, pStream) < 0) {
|
||||||
tCoderClear(&encoder);
|
tCoderClear(&encoder);
|
||||||
goto STREAM_ENCODE_OVER;
|
goto STREAM_ENCODE_OVER;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +139,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_BINARY(pRaw, dataPos, buf, tlen, STREAM_DECODE_OVER);
|
SDB_GET_BINARY(pRaw, dataPos, buf, tlen, STREAM_DECODE_OVER);
|
||||||
|
|
||||||
SCoder decoder;
|
SCoder decoder;
|
||||||
tCoderInit(&decoder, TD_LITTLE_ENDIAN, NULL, 0, TD_DECODER);
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, tlen + 1, TD_DECODER);
|
||||||
if (tDecodeSStreamObj(&decoder, pStream) < 0) {
|
if (tDecodeSStreamObj(&decoder, pStream) < 0) {
|
||||||
goto STREAM_DECODE_OVER;
|
goto STREAM_DECODE_OVER;
|
||||||
}
|
}
|
||||||
|
@ -191,6 +195,11 @@ void mndReleaseStream(SMnode *pMnode, SStreamObj *pStream) {
|
||||||
sdbRelease(pSdb, pStream);
|
sdbRelease(pSdb, pStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndProcessTaskDeployInternalRsp(SNodeMsg *pRsp) {
|
||||||
|
mndTransProcessRsp(pRsp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static SDbObj *mndAcquireDbByStream(SMnode *pMnode, char *streamName) {
|
static SDbObj *mndAcquireDbByStream(SMnode *pMnode, char *streamName) {
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
tNameFromString(&name, streamName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
tNameFromString(&name, streamName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
|
@ -209,6 +218,33 @@ static int32_t mndCheckCreateStreamReq(SCMCreateStreamReq *pCreate) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndStreamGetPlanString(const SCMCreateStreamReq *pCreate, char **pStr) {
|
||||||
|
if (NULL == pCreate->ast) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode *pAst = NULL;
|
||||||
|
int32_t code = nodesStringToNode(pCreate->ast, &pAst);
|
||||||
|
|
||||||
|
SQueryPlan *pPlan = NULL;
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
SPlanContext cxt = {
|
||||||
|
.pAstRoot = pAst,
|
||||||
|
.topicQuery = false,
|
||||||
|
.streamQuery = true,
|
||||||
|
};
|
||||||
|
code = qCreateQueryPlan(&cxt, &pPlan, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodesNodeToString(pPlan, false, pStr, NULL);
|
||||||
|
}
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
|
nodesDestroyNode(pPlan);
|
||||||
|
terrno = code;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndCreateStream(SMnode *pMnode, SNodeMsg *pReq, SCMCreateStreamReq *pCreate, SDbObj *pDb) {
|
static int32_t mndCreateStream(SMnode *pMnode, SNodeMsg *pReq, SCMCreateStreamReq *pCreate, SDbObj *pDb) {
|
||||||
mDebug("stream:%s to create", pCreate->name);
|
mDebug("stream:%s to create", pCreate->name);
|
||||||
SStreamObj streamObj = {0};
|
SStreamObj streamObj = {0};
|
||||||
|
@ -220,8 +256,13 @@ static int32_t mndCreateStream(SMnode *pMnode, SNodeMsg *pReq, SCMCreateStreamRe
|
||||||
streamObj.dbUid = pDb->uid;
|
streamObj.dbUid = pDb->uid;
|
||||||
streamObj.version = 1;
|
streamObj.version = 1;
|
||||||
streamObj.sql = pCreate->sql;
|
streamObj.sql = pCreate->sql;
|
||||||
streamObj.physicalPlan = "";
|
/*streamObj.physicalPlan = "";*/
|
||||||
streamObj.logicalPlan = "";
|
streamObj.logicalPlan = "not implemented";
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS != mndStreamGetPlanString(pCreate, &streamObj.physicalPlan)) {
|
||||||
|
mError("topic:%s, failed to get plan since %s", pCreate->name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_STREAM, &pReq->rpcMsg);
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_STREAM, &pReq->rpcMsg);
|
||||||
if (pTrans == NULL) {
|
if (pTrans == NULL) {
|
||||||
|
|
|
@ -236,7 +236,7 @@ static int32_t mndCheckCreateTopicReq(SCMCreateTopicReq *pCreate) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndGetPlanString(SCMCreateTopicReq *pCreate, char **pStr) {
|
static int32_t mndGetPlanString(const SCMCreateTopicReq *pCreate, char **pStr) {
|
||||||
if (NULL == pCreate->ast) {
|
if (NULL == pCreate->ast) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -559,41 +559,71 @@ static int32_t mndRetrieveVgroups(SNodeMsg *pReq, SShowObj *pShow, char *data, i
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
char *pWrite;
|
char *pWrite;
|
||||||
|
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, pShow->db);
|
SDbObj *pDb = NULL;
|
||||||
if (pDb == NULL) return 0;
|
if (strlen(pShow->db) > 0) {
|
||||||
|
pDb = mndAcquireDb(pMnode, pShow->db);
|
||||||
|
if (pDb == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (numOfRows < rows) {
|
while (numOfRows < rows) {
|
||||||
pShow->pIter = sdbFetch(pSdb, SDB_VGROUP, pShow->pIter, (void **)&pVgroup);
|
pShow->pIter = sdbFetch(pSdb, SDB_VGROUP, pShow->pIter, (void **)&pVgroup);
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) break;
|
||||||
|
|
||||||
if (pVgroup->dbUid == pDb->uid) {
|
if (pDb != NULL && pVgroup->dbUid != pDb->uid) {
|
||||||
cols = 0;
|
continue;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pVgroup->vgId;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int32_t *)pWrite = pVgroup->numOfTables;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pShow->replica; ++i) {
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
*(int16_t *)pWrite = pVgroup->vnodeGid[i].dnodeId;
|
|
||||||
cols++;
|
|
||||||
|
|
||||||
const char *role = mndGetRoleStr(pVgroup->vnodeGid[i].role);
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, role, pShow->bytes[cols]);
|
|
||||||
cols++;
|
|
||||||
}
|
|
||||||
numOfRows++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cols = 0;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *)pWrite = pVgroup->vgId;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
SName name = {0};
|
||||||
|
char db[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
tNameFromString(&name, pVgroup->dbName, T_NAME_ACCT|T_NAME_DB);
|
||||||
|
tNameGetDbName(&name, db);
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_TO_VARSTR(pWrite, db);
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *)pWrite = pVgroup->numOfTables;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
//status
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_TO_VARSTR(pWrite, "ready"); // TODO
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
//onlines
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *)pWrite = pVgroup->replica;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pVgroup->replica; ++i) {
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int16_t *)pWrite = pVgroup->vnodeGid[i].dnodeId;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
const char *role = mndGetRoleStr(pVgroup->vnodeGid[i].role);
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, role, pShow->bytes[cols]);
|
||||||
|
cols++;
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfRows++;
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
mndReleaseDb(pMnode, pDb);
|
if (pDb != NULL) {
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
}
|
||||||
|
|
||||||
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
|
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
|
||||||
pShow->numOfReads += numOfRows;
|
pShow->numOfReads += numOfRows;
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
|
@ -671,7 +701,7 @@ static int32_t mndRetrieveVnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, in
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
char *pWrite;
|
char *pWrite;
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
int32_t dnodeId = pShow->replica;
|
// int32_t dnodeId = pShow->replica;
|
||||||
|
|
||||||
while (numOfRows < rows) {
|
while (numOfRows < rows) {
|
||||||
pShow->pIter = sdbFetch(pSdb, SDB_VGROUP, pShow->pIter, (void **)&pVgroup);
|
pShow->pIter = sdbFetch(pSdb, SDB_VGROUP, pShow->pIter, (void **)&pVgroup);
|
||||||
|
@ -679,17 +709,33 @@ static int32_t mndRetrieveVnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, in
|
||||||
|
|
||||||
for (int32_t i = 0; i < pVgroup->replica && numOfRows < rows; ++i) {
|
for (int32_t i = 0; i < pVgroup->replica && numOfRows < rows; ++i) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
||||||
if (pVgid->dnodeId != dnodeId) continue;
|
|
||||||
|
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
*(uint32_t *)pWrite = pVgroup->vgId;
|
*(uint32_t *)pWrite = pVgroup->vgId;
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
SName name = {0};
|
||||||
|
char db[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
tNameFromString(&name, pVgroup->dbName, T_NAME_ACCT|T_NAME_DB);
|
||||||
|
tNameGetDbName(&name, db);
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
STR_TO_VARSTR(pWrite, db);
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(uint32_t *)pWrite = 0; //todo: Tables
|
||||||
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
STR_TO_VARSTR(pWrite, mndGetRoleStr(pVgid->role));
|
STR_TO_VARSTR(pWrite, mndGetRoleStr(pVgid->role));
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(uint32_t *)pWrite = pVgroup->replica; //onlines
|
||||||
|
cols++;
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ target_link_libraries(
|
||||||
PUBLIC sut
|
PUBLIC sut
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(
|
#add_test(
|
||||||
NAME mnode_test_db
|
# NAME mnode_test_db
|
||||||
COMMAND mnode_test_db
|
# COMMAND mnode_test_db
|
||||||
)
|
#)
|
||||||
|
|
|
@ -5,7 +5,7 @@ target_link_libraries(
|
||||||
PUBLIC sut
|
PUBLIC sut
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(
|
#add_test(
|
||||||
NAME mnode_test_dnode
|
# NAME mnode_test_dnode
|
||||||
COMMAND mnode_test_dnode
|
# COMMAND mnode_test_dnode
|
||||||
)
|
#)
|
||||||
|
|
|
@ -5,7 +5,7 @@ target_link_libraries(
|
||||||
PUBLIC sut
|
PUBLIC sut
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(
|
#add_test(
|
||||||
NAME mnode_test_stb
|
# NAME mnode_test_stb
|
||||||
COMMAND mnode_test_stb
|
# COMMAND mnode_test_stb
|
||||||
)
|
#)
|
||||||
|
|
|
@ -12,4 +12,5 @@ target_link_libraries(
|
||||||
PRIVATE os
|
PRIVATE os
|
||||||
PRIVATE common
|
PRIVATE common
|
||||||
PRIVATE util
|
PRIVATE util
|
||||||
|
PRIVATE qcom
|
||||||
)
|
)
|
||||||
|
|
|
@ -57,8 +57,8 @@ void sndMetaDelete(SStreamMeta *pMeta) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t sndMetaDeployTask(SStreamMeta *pMeta, SStreamTask *pTask) {
|
int32_t sndMetaDeployTask(SStreamMeta *pMeta, SStreamTask *pTask) {
|
||||||
for (int i = 0; i < pTask->parallel; i++) {
|
for (int i = 0; i < pTask->numOfRunners; i++) {
|
||||||
pTask->runner.executor[i] = qCreateStreamExecTaskInfo(pTask->qmsg, NULL);
|
pTask->runner[i].executor = qCreateStreamExecTaskInfo(pTask->qmsg, NULL);
|
||||||
}
|
}
|
||||||
return taosHashPut(pMeta->pHash, &pTask->taskId, sizeof(int32_t), pTask, sizeof(void *));
|
return taosHashPut(pMeta->pHash, &pTask->taskId, sizeof(int32_t), pTask, sizeof(void *));
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ STSchema * metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver);
|
||||||
STSma * metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid);
|
STSma * metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid);
|
||||||
STSmaWrapper * metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid);
|
STSmaWrapper * metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid);
|
||||||
SArray * metaGetSmaTbUids(SMeta *pMeta, bool isDup);
|
SArray * metaGetSmaTbUids(SMeta *pMeta, bool isDup);
|
||||||
|
int metaGetTbNum(SMeta *pMeta);
|
||||||
|
|
||||||
SMTbCursor *metaOpenTbCursor(SMeta *pMeta);
|
SMTbCursor *metaOpenTbCursor(SMeta *pMeta);
|
||||||
void metaCloseTbCursor(SMTbCursor *pTbCur);
|
void metaCloseTbCursor(SMTbCursor *pTbCur);
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TQ_H_
|
|
||||||
#define _TQ_H_
|
|
||||||
|
|
||||||
#include "executor.h"
|
|
||||||
#include "meta.h"
|
|
||||||
#include "taoserror.h"
|
|
||||||
#include "tcommon.h"
|
|
||||||
#include "tmallocator.h"
|
|
||||||
#include "tmsg.h"
|
|
||||||
#include "trpc.h"
|
|
||||||
#include "ttimer.h"
|
|
||||||
#include "tutil.h"
|
|
||||||
#include "vnode.h"
|
|
||||||
#include "wal.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct STQ STQ;
|
|
||||||
|
|
||||||
// memory allocator provided by vnode
|
|
||||||
typedef struct {
|
|
||||||
SMemAllocatorFactory* pAllocatorFactory;
|
|
||||||
SMemAllocator* pAllocator;
|
|
||||||
} STqMemRef;
|
|
||||||
|
|
||||||
// init once
|
|
||||||
int tqInit();
|
|
||||||
void tqCleanUp();
|
|
||||||
|
|
||||||
// open in each vnode
|
|
||||||
STQ* tqOpen(const char* path, SWal* pWal, SMeta* pMeta, STqCfg* tqConfig, SMemAllocatorFactory* allocFac);
|
|
||||||
void tqClose(STQ*);
|
|
||||||
|
|
||||||
// required by vnode
|
|
||||||
int tqPushMsg(STQ*, void* msg, tmsg_t msgType, int64_t version);
|
|
||||||
int tqCommit(STQ*);
|
|
||||||
|
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg);
|
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, char* msg);
|
|
||||||
int32_t tqProcessRebReq(STQ* pTq, char* msg);
|
|
||||||
int32_t tqProcessTaskExec(STQ* pTq, SRpcMsg* msg);
|
|
||||||
|
|
||||||
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TQ_H_*/
|
|
|
@ -183,6 +183,9 @@ void vnodeOptionsInit(SVnodeCfg *pOptions);
|
||||||
*/
|
*/
|
||||||
void vnodeOptionsClear(SVnodeCfg *pOptions);
|
void vnodeOptionsClear(SVnodeCfg *pOptions);
|
||||||
|
|
||||||
|
int vnodeValidateTableHash(SVnodeCfg *pVnodeOptions, char *tableFName);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------ FOR COMPILE ------------------------ */
|
/* ------------------------ FOR COMPILE ------------------------ */
|
||||||
|
|
||||||
int32_t vnodeAlter(SVnode *pVnode, const SVnodeCfg *pCfg);
|
int32_t vnodeAlter(SVnode *pVnode, const SVnodeCfg *pCfg);
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "tq.h"
|
|
||||||
#include "tqPush.h"
|
#include "tqPush.h"
|
||||||
|
#include "vnd.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -153,6 +153,11 @@ typedef struct {
|
||||||
FTqDelete pDeleter;
|
FTqDelete pDeleter;
|
||||||
} STqMetaStore;
|
} STqMetaStore;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMemAllocatorFactory* pAllocatorFactory;
|
||||||
|
SMemAllocator* pAllocator;
|
||||||
|
} STqMemRef;
|
||||||
|
|
||||||
struct STQ {
|
struct STQ {
|
||||||
// the collection of groups
|
// the collection of groups
|
||||||
// the handle of meta kvstore
|
// the handle of meta kvstore
|
||||||
|
@ -162,6 +167,7 @@ struct STQ {
|
||||||
STqMetaStore* tqMeta;
|
STqMetaStore* tqMeta;
|
||||||
STqPushMgr* tqPushMgr;
|
STqPushMgr* tqPushMgr;
|
||||||
SHashObj* pStreamTasks;
|
SHashObj* pStreamTasks;
|
||||||
|
SVnode* pVnode;
|
||||||
SWal* pWal;
|
SWal* pWal;
|
||||||
SMeta* pVnodeMeta;
|
SMeta* pVnodeMeta;
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,12 +24,12 @@ extern "C" {
|
||||||
|
|
||||||
extern int32_t tsdbDebugFlag;
|
extern int32_t tsdbDebugFlag;
|
||||||
|
|
||||||
#define tsdbFatal(...) do { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
|
#define tsdbFatal(...) do { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TSDB FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbError(...) do { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
|
#define tsdbError(...) do { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TSDB ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbWarn(...) do { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
|
#define tsdbWarn(...) do { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TSDB WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbInfo(...) do { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
|
#define tsdbInfo(...) do { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TSDB ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbDebug(...) do { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", DEBUG_DEBUG, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
#define tsdbDebug(...) do { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TSDB ", DEBUG_DEBUG, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include "tlist.h"
|
#include "tlist.h"
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
#include "tmacro.h"
|
#include "tmacro.h"
|
||||||
#include "tq.h"
|
|
||||||
#include "wal.h"
|
#include "wal.h"
|
||||||
|
|
||||||
#include "vnode.h"
|
#include "vnode.h"
|
||||||
|
@ -34,6 +33,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct STQ STQ;
|
||||||
|
|
||||||
typedef struct SVState SVState;
|
typedef struct SVState SVState;
|
||||||
typedef struct SVBufPool SVBufPool;
|
typedef struct SVBufPool SVBufPool;
|
||||||
|
|
||||||
|
@ -81,12 +82,6 @@ struct SVnode {
|
||||||
|
|
||||||
int vnodeScheduleTask(SVnodeTask* task);
|
int vnodeScheduleTask(SVnodeTask* task);
|
||||||
|
|
||||||
int32_t vnodePutToVQueryQ(SVnode* pVnode, struct SRpcMsg* pReq);
|
|
||||||
int32_t vnodePutToVFetchQ(SVnode* pVnode, struct SRpcMsg* pReq);
|
|
||||||
int32_t vnodeSendReq(SVnode* pVnode, struct SEpSet* epSet, struct SRpcMsg* pReq);
|
|
||||||
int32_t vnodeSendMnodeReq(SVnode* pVnode, struct SRpcMsg* pReq);
|
|
||||||
void vnodeSendRsp(SVnode* pVnode, struct SEpSet* epSet, struct SRpcMsg* pRsp);
|
|
||||||
|
|
||||||
#define vFatal(...) \
|
#define vFatal(...) \
|
||||||
do { \
|
do { \
|
||||||
if (vDebugFlag & DEBUG_FATAL) { \
|
if (vDebugFlag & DEBUG_FATAL) { \
|
||||||
|
@ -171,6 +166,26 @@ void* vmaMalloc(SVMemAllocator* pVMA, uint64_t size);
|
||||||
void vmaFree(SVMemAllocator* pVMA, void* ptr);
|
void vmaFree(SVMemAllocator* pVMA, void* ptr);
|
||||||
bool vmaIsFull(SVMemAllocator* pVMA);
|
bool vmaIsFull(SVMemAllocator* pVMA);
|
||||||
|
|
||||||
|
// init once
|
||||||
|
int tqInit();
|
||||||
|
void tqCleanUp();
|
||||||
|
|
||||||
|
// open in each vnode
|
||||||
|
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal, SMeta* pMeta, STqCfg* tqConfig,
|
||||||
|
SMemAllocatorFactory* allocFac);
|
||||||
|
void tqClose(STQ*);
|
||||||
|
|
||||||
|
// required by vnode
|
||||||
|
int tqPushMsg(STQ*, void* msg, int32_t msgLen, tmsg_t msgType, int64_t version);
|
||||||
|
int tqCommit(STQ*);
|
||||||
|
|
||||||
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg);
|
||||||
|
int32_t tqProcessSetConnReq(STQ* pTq, char* msg);
|
||||||
|
int32_t tqProcessRebReq(STQ* pTq, char* msg);
|
||||||
|
int32_t tqProcessTaskExec(STQ* pTq, SRpcMsg* msg);
|
||||||
|
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen);
|
||||||
|
int32_t tqProcessStreamTrigger(STQ* pTq, void* data, int32_t dataLen);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -507,7 +507,7 @@ static int metaEncodeTbInfo(void **buf, STbCfg *pTbCfg) {
|
||||||
tsize += taosEncodeString(buf, pTbCfg->name);
|
tsize += taosEncodeString(buf, pTbCfg->name);
|
||||||
tsize += taosEncodeFixedU32(buf, pTbCfg->ttl);
|
tsize += taosEncodeFixedU32(buf, pTbCfg->ttl);
|
||||||
tsize += taosEncodeFixedU32(buf, pTbCfg->keep);
|
tsize += taosEncodeFixedU32(buf, pTbCfg->keep);
|
||||||
tsize += taosEncodeFixedU8(buf, pTbCfg->type);
|
tsize += taosEncodeFixedU8(buf, pTbCfg->info);
|
||||||
|
|
||||||
if (pTbCfg->type == META_SUPER_TABLE) {
|
if (pTbCfg->type == META_SUPER_TABLE) {
|
||||||
SSchemaWrapper sw = {.nCols = pTbCfg->stbCfg.nTagCols, .pSchema = pTbCfg->stbCfg.pTagSchema};
|
SSchemaWrapper sw = {.nCols = pTbCfg->stbCfg.nTagCols, .pSchema = pTbCfg->stbCfg.pTagSchema};
|
||||||
|
@ -527,7 +527,7 @@ static void *metaDecodeTbInfo(void *buf, STbCfg *pTbCfg) {
|
||||||
buf = taosDecodeString(buf, &(pTbCfg->name));
|
buf = taosDecodeString(buf, &(pTbCfg->name));
|
||||||
buf = taosDecodeFixedU32(buf, &(pTbCfg->ttl));
|
buf = taosDecodeFixedU32(buf, &(pTbCfg->ttl));
|
||||||
buf = taosDecodeFixedU32(buf, &(pTbCfg->keep));
|
buf = taosDecodeFixedU32(buf, &(pTbCfg->keep));
|
||||||
buf = taosDecodeFixedU8(buf, &(pTbCfg->type));
|
buf = taosDecodeFixedU8(buf, &(pTbCfg->info));
|
||||||
|
|
||||||
if (pTbCfg->type == META_SUPER_TABLE) {
|
if (pTbCfg->type == META_SUPER_TABLE) {
|
||||||
SSchemaWrapper sw;
|
SSchemaWrapper sw;
|
||||||
|
@ -705,6 +705,18 @@ SMTbCursor *metaOpenTbCursor(SMeta *pMeta) {
|
||||||
return pTbCur;
|
return pTbCur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int metaGetTbNum(SMeta *pMeta) {
|
||||||
|
SMetaDB *pDB = pMeta->pDB;
|
||||||
|
|
||||||
|
DB_BTREE_STAT *sp1;
|
||||||
|
pDB->pTbDB->stat(pDB->pNtbIdx, NULL, &sp1, 0);
|
||||||
|
|
||||||
|
DB_BTREE_STAT *sp2;
|
||||||
|
pDB->pTbDB->stat(pDB->pCtbIdx, NULL, &sp2, 0);
|
||||||
|
|
||||||
|
return sp1->bt_nkeys + sp2->bt_nkeys;
|
||||||
|
}
|
||||||
|
|
||||||
void metaCloseTbCursor(SMTbCursor *pTbCur) {
|
void metaCloseTbCursor(SMTbCursor *pTbCur) {
|
||||||
if (pTbCur) {
|
if (pTbCur) {
|
||||||
if (pTbCur->pCur) {
|
if (pTbCur->pCur) {
|
||||||
|
|
|
@ -17,11 +17,14 @@
|
||||||
#include "tqInt.h"
|
#include "tqInt.h"
|
||||||
#include "tqMetaStore.h"
|
#include "tqMetaStore.h"
|
||||||
|
|
||||||
|
void tqDebugShowSSData(SArray* dataBlocks);
|
||||||
|
|
||||||
int32_t tqInit() { return tqPushMgrInit(); }
|
int32_t tqInit() { return tqPushMgrInit(); }
|
||||||
|
|
||||||
void tqCleanUp() { tqPushMgrCleanUp(); }
|
void tqCleanUp() { tqPushMgrCleanUp(); }
|
||||||
|
|
||||||
STQ* tqOpen(const char* path, SWal* pWal, SMeta* pVnodeMeta, STqCfg* tqConfig, SMemAllocatorFactory* allocFac) {
|
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal, SMeta* pVnodeMeta, STqCfg* tqConfig,
|
||||||
|
SMemAllocatorFactory* allocFac) {
|
||||||
STQ* pTq = malloc(sizeof(STQ));
|
STQ* pTq = malloc(sizeof(STQ));
|
||||||
if (pTq == NULL) {
|
if (pTq == NULL) {
|
||||||
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
||||||
|
@ -29,6 +32,7 @@ STQ* tqOpen(const char* path, SWal* pWal, SMeta* pVnodeMeta, STqCfg* tqConfig, S
|
||||||
}
|
}
|
||||||
pTq->path = strdup(path);
|
pTq->path = strdup(path);
|
||||||
pTq->tqConfig = tqConfig;
|
pTq->tqConfig = tqConfig;
|
||||||
|
pTq->pVnode = pVnode;
|
||||||
pTq->pWal = pWal;
|
pTq->pWal = pWal;
|
||||||
pTq->pVnodeMeta = pVnodeMeta;
|
pTq->pVnodeMeta = pVnodeMeta;
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -68,8 +72,21 @@ void tqClose(STQ* pTq) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
int tqPushMsg(STQ* pTq, void* msg, tmsg_t msgType, int64_t version) {
|
int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t version) {
|
||||||
if (msgType != TDMT_VND_SUBMIT) return 0;
|
if (msgType != TDMT_VND_SUBMIT) return 0;
|
||||||
|
void* data = malloc(msgLen);
|
||||||
|
if (data == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy(data, msg, msgLen);
|
||||||
|
SRpcMsg req = {
|
||||||
|
.msgType = TDMT_VND_STREAM_TRIGGER,
|
||||||
|
.pCont = data,
|
||||||
|
.contLen = msgLen,
|
||||||
|
};
|
||||||
|
tmsgPutToQueue(&pTq->pVnode->msgCb, FETCH_QUEUE, &req);
|
||||||
|
|
||||||
|
#if 0
|
||||||
void* pIter = taosHashIterate(pTq->tqPushMgr->pHash, NULL);
|
void* pIter = taosHashIterate(pTq->tqPushMgr->pHash, NULL);
|
||||||
while (pIter != NULL) {
|
while (pIter != NULL) {
|
||||||
STqPusher* pusher = *(STqPusher**)pIter;
|
STqPusher* pusher = *(STqPusher**)pIter;
|
||||||
|
@ -97,6 +114,7 @@ int tqPushMsg(STQ* pTq, void* msg, tmsg_t msgType, int64_t version) {
|
||||||
// if handle waiting, launch query and response to consumer
|
// if handle waiting, launch query and response to consumer
|
||||||
//
|
//
|
||||||
// if no waiting handle, return
|
// if no waiting handle, return
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,6 +438,21 @@ int32_t tqProcessSetConnReq(STQ* pTq, char* msg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int32_t parallel) {
|
||||||
|
ASSERT(parallel <= 8);
|
||||||
|
pTask->numOfRunners = parallel;
|
||||||
|
for (int32_t i = 0; i < parallel; i++) {
|
||||||
|
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pVnodeMeta);
|
||||||
|
SReadHandle handle = {
|
||||||
|
.reader = pReadHandle,
|
||||||
|
.meta = pTq->pVnodeMeta,
|
||||||
|
};
|
||||||
|
pTask->runner[i].inputHandle = pReadHandle;
|
||||||
|
pTask->runner[i].executor = qCreateStreamExecTaskInfo(pTask->qmsg, &handle);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen) {
|
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
SStreamTask* pTask = malloc(sizeof(SStreamTask));
|
SStreamTask* pTask = malloc(sizeof(SStreamTask));
|
||||||
if (pTask == NULL) {
|
if (pTask == NULL) {
|
||||||
|
@ -427,15 +460,183 @@ int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
}
|
}
|
||||||
SCoder decoder;
|
SCoder decoder;
|
||||||
tCoderInit(&decoder, TD_LITTLE_ENDIAN, (uint8_t*)msg, msgLen, TD_DECODER);
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, (uint8_t*)msg, msgLen, TD_DECODER);
|
||||||
tDecodeSStreamTask(&decoder, pTask);
|
if (tDecodeSStreamTask(&decoder, pTask) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
tCoderClear(&decoder);
|
tCoderClear(&decoder);
|
||||||
|
|
||||||
|
tqExpandTask(pTq, pTask, 8);
|
||||||
taosHashPut(pTq->pStreamTasks, &pTask->taskId, sizeof(int32_t), pTask, sizeof(SStreamTask));
|
taosHashPut(pTq->pStreamTasks, &pTask->taskId, sizeof(int32_t), pTask, sizeof(SStreamTask));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessTaskExec(STQ* pTq, SRpcMsg* msg) {
|
static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
//
|
time_t tt;
|
||||||
|
int32_t ms = 0;
|
||||||
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
tt = (time_t)(val / 1000000000);
|
||||||
|
ms = val % 1000000000;
|
||||||
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
tt = (time_t)(val / 1000000);
|
||||||
|
ms = val % 1000000;
|
||||||
|
} else {
|
||||||
|
tt = (time_t)(val / 1000);
|
||||||
|
ms = val % 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* comment out as it make testcases like select_with_tags.sim fail.
|
||||||
|
but in windows, this may cause the call to localtime crash if tt < 0,
|
||||||
|
need to find a better solution.
|
||||||
|
if (tt < 0) {
|
||||||
|
tt = 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
if (tt < 0) tt = 0;
|
||||||
|
#endif
|
||||||
|
if (tt <= 0 && ms < 0) {
|
||||||
|
tt--;
|
||||||
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
ms += 1000000000;
|
||||||
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
ms += 1000000;
|
||||||
|
} else {
|
||||||
|
ms += 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm* ptm = localtime(&tt);
|
||||||
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
sprintf(buf + pos, ".%09d", ms);
|
||||||
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
sprintf(buf + pos, ".%06d", ms);
|
||||||
|
} else {
|
||||||
|
sprintf(buf + pos, ".%03d", ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
void tqDebugShowSSData(SArray* dataBlocks) {
|
||||||
|
char pBuf[128];
|
||||||
|
int32_t sz = taosArrayGetSize(dataBlocks);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SSDataBlock* pDataBlock = taosArrayGet(dataBlocks, i);
|
||||||
|
int32_t colNum = pDataBlock->info.numOfCols;
|
||||||
|
int32_t rows = pDataBlock->info.rows;
|
||||||
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
|
printf("|");
|
||||||
|
for (int32_t k = 0; k < colNum; k++) {
|
||||||
|
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, k);
|
||||||
|
void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
|
||||||
|
switch (pColInfoData->info.type) {
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
formatTimestamp(pBuf, *(uint64_t*)var, TSDB_TIME_PRECISION_MILLI);
|
||||||
|
printf(" %25s |", pBuf);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
printf(" %15d |", *(int32_t*)var);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
printf(" %15ld |", *(int64_t*)var);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqProcessStreamTrigger(STQ* pTq, void* data, int32_t dataLen) {
|
||||||
|
void* pIter = NULL;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
pIter = taosHashIterate(pTq->pStreamTasks, pIter);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
SStreamTask* pTask = (SStreamTask*)pIter;
|
||||||
|
if (!pTask->pipeSource) continue;
|
||||||
|
|
||||||
|
int32_t workerId = 0;
|
||||||
|
void* exec = pTask->runner[workerId].executor;
|
||||||
|
qSetStreamInput(exec, data, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
||||||
|
SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
||||||
|
while (1) {
|
||||||
|
SSDataBlock* output;
|
||||||
|
uint64_t ts;
|
||||||
|
if (qExecTask(exec, &output, &ts) < 0) {
|
||||||
|
ASSERT(false);
|
||||||
|
}
|
||||||
|
if (output == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
taosArrayPush(pRes, output);
|
||||||
|
}
|
||||||
|
if (pTask->pipeSink) {
|
||||||
|
// write back
|
||||||
|
/*printf("reach end\n");*/
|
||||||
|
tqDebugShowSSData(pRes);
|
||||||
|
} else {
|
||||||
|
int32_t tlen = sizeof(SStreamExecMsgHead) + tEncodeDataBlocks(NULL, pRes);
|
||||||
|
void* buf = rpcMallocCont(tlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
void* abuf = POINTER_SHIFT(buf, sizeof(SStreamExecMsgHead));
|
||||||
|
tEncodeDataBlocks(abuf, pRes);
|
||||||
|
tmsg_t type;
|
||||||
|
|
||||||
|
if (pTask->nextOpDst == STREAM_NEXT_OP_DST__VND) {
|
||||||
|
type = TDMT_VND_TASK_EXEC;
|
||||||
|
} else {
|
||||||
|
type = TDMT_SND_TASK_EXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg reqMsg = {
|
||||||
|
.pCont = buf,
|
||||||
|
.contLen = tlen,
|
||||||
|
.code = 0,
|
||||||
|
.msgType = type,
|
||||||
|
};
|
||||||
|
tmsgSendReq(&pTq->pVnode->msgCb, &pTask->NextOpEp, &reqMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqProcessTaskExec(STQ* pTq, SRpcMsg* msg) {
|
||||||
|
SStreamTaskExecReq* pReq = msg->pCont;
|
||||||
|
|
||||||
|
int32_t taskId = pReq->head.streamTaskId;
|
||||||
|
int32_t workerType = pReq->head.workerType;
|
||||||
|
|
||||||
|
SStreamTask* pTask = taosHashGet(pTq->pStreamTasks, &taskId, sizeof(int32_t));
|
||||||
|
// assume worker id is 1
|
||||||
|
int32_t workerId = 1;
|
||||||
|
void* exec = pTask->runner[workerId].executor;
|
||||||
|
int32_t sz = taosArrayGetSize(pReq->data);
|
||||||
|
printf("input data:\n");
|
||||||
|
tqDebugShowSSData(pReq->data);
|
||||||
|
SArray* pRes = taosArrayInit(0, sizeof(void*));
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SSDataBlock* input = taosArrayGet(pReq->data, i);
|
||||||
|
SSDataBlock* output;
|
||||||
|
uint64_t ts;
|
||||||
|
qSetStreamInput(exec, input, STREAM_DATA_TYPE_SSDATA_BLOCK);
|
||||||
|
if (qExecTask(exec, &output, &ts) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
if (output == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
taosArrayPush(pRes, &output);
|
||||||
|
}
|
||||||
|
printf("output data:\n");
|
||||||
|
tqDebugShowSSData(pRes);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,36 @@ SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) {
|
||||||
if (pArray == NULL) {
|
if (pArray == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
int32_t colMeta = 0;
|
||||||
|
int32_t colNeed = 0;
|
||||||
|
while (colMeta < pSchemaWrapper->nCols && colNeed < colNumNeed) {
|
||||||
|
SSchema* pColSchema = &pSchemaWrapper->pSchema[colMeta];
|
||||||
|
int16_t colIdSchema = pColSchema->colId;
|
||||||
|
int16_t colIdNeed = *(int16_t*)taosArrayGet(pHandle->pColIdList, colNeed);
|
||||||
|
if (colIdSchema < colIdNeed) {
|
||||||
|
colMeta++;
|
||||||
|
} else if (colIdSchema > colIdNeed) {
|
||||||
|
colNeed++;
|
||||||
|
} else {
|
||||||
|
SColumnInfoData colInfo = {0};
|
||||||
|
int sz = numOfRows * pColSchema->bytes;
|
||||||
|
colInfo.info.bytes = pColSchema->bytes;
|
||||||
|
colInfo.info.colId = pColSchema->colId;
|
||||||
|
colInfo.info.type = pColSchema->type;
|
||||||
|
|
||||||
|
colInfo.pData = calloc(1, sz);
|
||||||
|
if (colInfo.pData == NULL) {
|
||||||
|
// TODO free
|
||||||
|
taosArrayDestroy(pArray);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockDataEnsureColumnCapacity(&colInfo, numOfRows);
|
||||||
|
taosArrayPush(pArray, &colInfo);
|
||||||
|
colMeta++;
|
||||||
|
colNeed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (int32_t i = 0; i < colNumNeed; i++) {
|
for (int32_t i = 0; i < colNumNeed; i++) {
|
||||||
|
@ -163,11 +193,23 @@ SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) {
|
||||||
while ((row = tGetSubmitBlkNext(&pHandle->blkIter)) != NULL) {
|
while ((row = tGetSubmitBlkNext(&pHandle->blkIter)) != NULL) {
|
||||||
tdSTSRowIterReset(&iter, row);
|
tdSTSRowIterReset(&iter, row);
|
||||||
// get all wanted col of that block
|
// get all wanted col of that block
|
||||||
|
int32_t colTot = taosArrayGetSize(pArray);
|
||||||
|
for (int32_t i = 0; i < colTot; i++) {
|
||||||
|
SColumnInfoData* pColData = taosArrayGet(pArray, i);
|
||||||
|
SCellVal sVal = {0};
|
||||||
|
if (!tdSTSRowIterNext(&iter, pColData->info.colId, pColData->info.type, &sVal)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memcpy(POINTER_SHIFT(pColData->pData, curRow * pColData->info.bytes), sVal.val, pColData->info.bytes);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
for (int32_t i = 0; i < colNumNeed; i++) {
|
for (int32_t i = 0; i < colNumNeed; i++) {
|
||||||
SColumnInfoData* pColData = taosArrayGet(pArray, i);
|
SColumnInfoData* pColData = taosArrayGet(pArray, i);
|
||||||
STColumn* pCol = schemaColAt(pTschema, i);
|
STColumn* pCol = schemaColAt(pTschema, i);
|
||||||
// TODO
|
// TODO
|
||||||
ASSERT(pCol->colId == pColData->info.colId);
|
if(pCol->colId != pColData->info.colId) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// void* val = tdGetMemRowDataOfColEx(row, pCol->colId, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset, &kvIdx);
|
// void* val = tdGetMemRowDataOfColEx(row, pCol->colId, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset, &kvIdx);
|
||||||
SCellVal sVal = {0};
|
SCellVal sVal = {0};
|
||||||
if (!tdSTSRowIterNext(&iter, pCol->colId, pCol->type, &sVal)) {
|
if (!tdSTSRowIterNext(&iter, pCol->colId, pCol->type, &sVal)) {
|
||||||
|
@ -176,6 +218,7 @@ SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) {
|
||||||
}
|
}
|
||||||
memcpy(POINTER_SHIFT(pColData->pData, curRow * pCol->bytes), sVal.val, pCol->bytes);
|
memcpy(POINTER_SHIFT(pColData->pData, curRow * pCol->bytes), sVal.val, pCol->bytes);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
curRow++;
|
curRow++;
|
||||||
}
|
}
|
||||||
return pArray;
|
return pArray;
|
||||||
|
|
|
@ -401,10 +401,10 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
|
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
|
||||||
SColumnInfoData colInfo = {{0}, 0};
|
SColumnInfoData colInfo = {{0}, 0};
|
||||||
|
|
||||||
colInfo.info = pCond->colList[i];
|
colInfo.info = pCond->colList[i];
|
||||||
colInfo.pData = calloc(1, EXTRA_BYTES + pReadHandle->outputCapacity * pCond->colList[i].bytes);
|
|
||||||
if (colInfo.pData == NULL) {
|
int32_t code = blockDataEnsureColumnCapacity(&colInfo, pReadHandle->outputCapacity);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1412,34 +1412,37 @@ static int32_t doCopyRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isAllRowsNull(src) && pColInfo->info.colId == src->colId) {
|
if (!isAllRowsNull(src) && pColInfo->info.colId == src->colId) {
|
||||||
if (pColInfo->info.type != TSDB_DATA_TYPE_BINARY && pColInfo->info.type != TSDB_DATA_TYPE_NCHAR) {
|
if (!IS_VAR_DATA_TYPE(pColInfo->info.type)) { // todo opt performance
|
||||||
memmove(pData, (char*)src->pData + bytes * start, bytes * num);
|
// memmove(pData, (char*)src->pData + bytes * start, bytes * num);
|
||||||
} else { // handle the var-string
|
for(int32_t k = start; k < num + start; ++k) {
|
||||||
char* dst = pData;
|
SCellVal sVal = {0};
|
||||||
|
if (tdGetColDataOfRow(&sVal, src, k) < 0) {
|
||||||
|
TASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sVal.valType == TD_VTYPE_NULL) {
|
||||||
|
colDataAppend(pColInfo, k, NULL, true);
|
||||||
|
} else {
|
||||||
|
colDataAppend(pColInfo, k, sVal.val, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // handle the var-string
|
||||||
// todo refactor, only copy one-by-one
|
// todo refactor, only copy one-by-one
|
||||||
for (int32_t k = start; k < num + start; ++k) {
|
for (int32_t k = start; k < num + start; ++k) {
|
||||||
SCellVal sVal = {0};
|
SCellVal sVal = {0};
|
||||||
if(tdGetColDataOfRow(&sVal, src, k) < 0){
|
if(tdGetColDataOfRow(&sVal, src, k) < 0){
|
||||||
TASSERT(0);
|
TASSERT(0);
|
||||||
}
|
}
|
||||||
memcpy(dst, sVal.val, varDataTLen(sVal.val));
|
|
||||||
dst += bytes;
|
colDataAppend(pColInfo, k, sVal.val, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
j++;
|
j++;
|
||||||
i++;
|
i++;
|
||||||
} else { // pColInfo->info.colId < src->colId, it is a NULL data
|
} else { // pColInfo->info.colId < src->colId, it is a NULL data
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
for(int32_t k = start; k < num + start; ++k) { // TODO opt performance
|
||||||
char* dst = pData;
|
colDataAppend(pColInfo, k, NULL, true);
|
||||||
|
|
||||||
for(int32_t k = start; k < num + start; ++k) {
|
|
||||||
setVardataNull(dst, pColInfo->info.type);
|
|
||||||
dst += bytes;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setNullN(pData, pColInfo->info.type, pColInfo->info.bytes, num);
|
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -1447,23 +1450,9 @@ static int32_t doCopyRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, int32_t
|
||||||
|
|
||||||
while (i < requiredNumOfCols) { // the remain columns are all null data
|
while (i < requiredNumOfCols) { // the remain columns are all null data
|
||||||
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
||||||
if (ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
for(int32_t k = start; k < num + start; ++k) {
|
||||||
pData = (char*)pColInfo->pData + numOfRows * pColInfo->info.bytes;
|
colDataAppend(pColInfo, k, NULL, true); // TODO add a fast version to set a number of consecutive NULL value.
|
||||||
} else {
|
|
||||||
pData = (char*)pColInfo->pData + (capacity - numOfRows - num) * pColInfo->info.bytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
char* dst = pData;
|
|
||||||
|
|
||||||
for(int32_t k = start; k < num + start; ++k) {
|
|
||||||
setVardataNull(dst, pColInfo->info.type);
|
|
||||||
dst += pColInfo->info.bytes;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setNullN(pData, pColInfo->info.type, pColInfo->info.bytes, num);
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -727,9 +727,9 @@ static int tsdbLoadBlockDataColsImpl(SReadH *pReadh, SBlock *pBlock, SDataCols *
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(pBlockCol->colId == pDataCol->colId);
|
ASSERT(pBlockCol->colId == pDataCol->colId);
|
||||||
// set the bitmap
|
|
||||||
pDataCol->bitmap = pBlockCol->bitmap;
|
|
||||||
}
|
}
|
||||||
|
// set the bitmap
|
||||||
|
pDataCol->bitmap = pBlockCol->bitmap;
|
||||||
|
|
||||||
if (tsdbLoadColData(pReadh, pDFile, pBlock, pBlockCol, pDataCol) < 0) return -1;
|
if (tsdbLoadColData(pReadh, pDFile, pBlock, pBlockCol, pDataCol) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,4 +32,26 @@ int vnodeValidateOptions(const SVnodeCfg *pVnodeOptions) {
|
||||||
|
|
||||||
void vnodeOptionsCopy(SVnodeCfg *pDest, const SVnodeCfg *pSrc) {
|
void vnodeOptionsCopy(SVnodeCfg *pDest, const SVnodeCfg *pSrc) {
|
||||||
memcpy((void *)pDest, (void *)pSrc, sizeof(SVnodeCfg));
|
memcpy((void *)pDest, (void *)pSrc, sizeof(SVnodeCfg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vnodeValidateTableHash(SVnodeCfg *pVnodeOptions, char *tableFName) {
|
||||||
|
uint32_t hashValue = 0;
|
||||||
|
|
||||||
|
switch (pVnodeOptions->hashMethod) {
|
||||||
|
default:
|
||||||
|
hashValue = MurmurHash3_32(tableFName, strlen(tableFName));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO OPEN THIS !!!!!!!
|
||||||
|
#if 0
|
||||||
|
if (hashValue < pVnodeOptions->hashBegin || hashValue > pVnodeOptions->hashEnd) {
|
||||||
|
terrno = TSDB_CODE_VND_HASH_MISMATCH;
|
||||||
|
return TSDB_CODE_VND_HASH_MISMATCH;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ int32_t vnodeSync(SVnode *pVnode) { return 0; }
|
||||||
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
||||||
pLoad->vgId = pVnode->vgId;
|
pLoad->vgId = pVnode->vgId;
|
||||||
pLoad->role = TAOS_SYNC_STATE_LEADER;
|
pLoad->role = TAOS_SYNC_STATE_LEADER;
|
||||||
pLoad->numOfTables = 500;
|
pLoad->numOfTables = metaGetTbNum(pVnode->pMeta);
|
||||||
pLoad->numOfTimeSeries = 400;
|
pLoad->numOfTimeSeries = 400;
|
||||||
pLoad->totalStorage = 300;
|
pLoad->totalStorage = 300;
|
||||||
pLoad->compStorage = 200;
|
pLoad->compStorage = 200;
|
||||||
|
|
|
@ -115,7 +115,8 @@ static int vnodeOpenImpl(SVnode *pVnode) {
|
||||||
|
|
||||||
// Open tsdb
|
// Open tsdb
|
||||||
sprintf(dir, "%s/tsdb", pVnode->path);
|
sprintf(dir, "%s/tsdb", pVnode->path);
|
||||||
pVnode->pTsdb = tsdbOpen(dir, pVnode->vgId, &(pVnode->config.tsdbCfg), vBufPoolGetMAF(pVnode), pVnode->pMeta, pVnode->pTfs);
|
pVnode->pTsdb =
|
||||||
|
tsdbOpen(dir, pVnode->vgId, &(pVnode->config.tsdbCfg), vBufPoolGetMAF(pVnode), pVnode->pMeta, pVnode->pTfs);
|
||||||
if (pVnode->pTsdb == NULL) {
|
if (pVnode->pTsdb == NULL) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -131,7 +132,7 @@ static int vnodeOpenImpl(SVnode *pVnode) {
|
||||||
|
|
||||||
// Open TQ
|
// Open TQ
|
||||||
sprintf(dir, "%s/tq", pVnode->path);
|
sprintf(dir, "%s/tq", pVnode->path);
|
||||||
pVnode->pTq = tqOpen(dir, pVnode->pWal, pVnode->pMeta, &(pVnode->config.tqCfg), vBufPoolGetMAF(pVnode));
|
pVnode->pTq = tqOpen(dir, pVnode, pVnode->pWal, pVnode->pMeta, &(pVnode->config.tqCfg), vBufPoolGetMAF(pVnode));
|
||||||
if (pVnode->pTq == NULL) {
|
if (pVnode->pTq == NULL) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vnodeQuery.h"
|
#include "vnodeQuery.h"
|
||||||
|
#include "executor.h"
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg);
|
static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
|
@ -27,7 +28,7 @@ void vnodeQueryClose(SVnode *pVnode) { qWorkerDestroy((void **)&pVnode->pQuery);
|
||||||
|
|
||||||
int vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
int vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
vTrace("message in query queue is processing");
|
vTrace("message in query queue is processing");
|
||||||
SReadHandle handle = {.reader = pVnode->pTsdb, .meta = pVnode->pMeta};
|
SReadHandle handle = {.reader = pVnode->pTsdb, .meta = pVnode->pMeta, .config = &pVnode->config};
|
||||||
|
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
case TDMT_VND_QUERY: {
|
case TDMT_VND_QUERY: {
|
||||||
|
@ -67,6 +68,8 @@ int vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
return tqProcessPollReq(pVnode->pTq, pMsg);
|
return tqProcessPollReq(pVnode->pTq, pMsg);
|
||||||
case TDMT_VND_TASK_EXEC:
|
case TDMT_VND_TASK_EXEC:
|
||||||
return tqProcessTaskExec(pVnode->pTq, pMsg);
|
return tqProcessTaskExec(pVnode->pTq, pMsg);
|
||||||
|
case TDMT_VND_STREAM_TRIGGER:
|
||||||
|
return tqProcessStreamTrigger(pVnode->pTq, pMsg->pCont, pMsg->contLen);
|
||||||
case TDMT_VND_QUERY_HEARTBEAT:
|
case TDMT_VND_QUERY_HEARTBEAT:
|
||||||
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg);
|
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg);
|
||||||
default:
|
default:
|
||||||
|
@ -87,11 +90,24 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
SSchema *pTagSchema;
|
SSchema *pTagSchema;
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
int msgLen = 0;
|
int msgLen = 0;
|
||||||
int32_t code = TSDB_CODE_VND_APP_ERROR;
|
int32_t code = 0;
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
int32_t rspLen = 0;
|
||||||
|
void *pRsp = NULL;
|
||||||
|
|
||||||
STableInfoReq infoReq = {0};
|
STableInfoReq infoReq = {0};
|
||||||
if (tDeserializeSTableInfoReq(pMsg->pCont, pMsg->contLen, &infoReq) != 0) {
|
if (tDeserializeSTableInfoReq(pMsg->pCont, pMsg->contLen, &infoReq) != 0) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
metaRsp.dbId = pVnode->config.dbId;
|
||||||
|
memcpy(metaRsp.dbFName, infoReq.dbFName, sizeof(metaRsp.dbFName));
|
||||||
|
strcpy(metaRsp.tbName, infoReq.tbName);
|
||||||
|
|
||||||
|
sprintf(tableFName, "%s.%s", infoReq.dbFName, infoReq.tbName);
|
||||||
|
code = vnodeValidateTableHash(&pVnode->config, tableFName);
|
||||||
|
if (code) {
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,9 +147,6 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
metaRsp.dbId = pVnode->config.dbId;
|
|
||||||
memcpy(metaRsp.dbFName, infoReq.dbFName, sizeof(metaRsp.dbFName));
|
|
||||||
strcpy(metaRsp.tbName, infoReq.tbName);
|
|
||||||
if (pTbCfg->type == META_CHILD_TABLE) {
|
if (pTbCfg->type == META_CHILD_TABLE) {
|
||||||
strcpy(metaRsp.stbName, pStbCfg->name);
|
strcpy(metaRsp.stbName, pStbCfg->name);
|
||||||
metaRsp.suid = pTbCfg->ctbCfg.suid;
|
metaRsp.suid = pTbCfg->ctbCfg.suid;
|
||||||
|
@ -152,23 +165,21 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
memcpy(POINTER_SHIFT(metaRsp.pSchemas, sizeof(SSchema) * pSW->nCols), pTagSchema, sizeof(SSchema) * nTagCols);
|
memcpy(POINTER_SHIFT(metaRsp.pSchemas, sizeof(SSchema) * pSW->nCols), pTagSchema, sizeof(SSchema) * nTagCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
|
_exit:
|
||||||
|
|
||||||
|
rspLen = tSerializeSTableMetaRsp(NULL, 0, &metaRsp);
|
||||||
if (rspLen < 0) {
|
if (rspLen < 0) {
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *pRsp = rpcMallocCont(rspLen);
|
pRsp = rpcMallocCont(rspLen);
|
||||||
if (pRsp == NULL) {
|
if (pRsp == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp);
|
tSerializeSTableMetaRsp(pRsp, rspLen, &metaRsp);
|
||||||
|
|
||||||
code = 0;
|
|
||||||
|
|
||||||
_exit:
|
|
||||||
|
|
||||||
tFreeSTableMetaRsp(&metaRsp);
|
tFreeSTableMetaRsp(&metaRsp);
|
||||||
if (pSW != NULL) {
|
if (pSW != NULL) {
|
||||||
tfree(pSW->pSchema);
|
tfree(pSW->pSchema);
|
||||||
|
|
|
@ -13,12 +13,11 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tq.h"
|
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
void vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
|
void vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
|
||||||
SNodeMsg *pMsg;
|
SNodeMsg *pMsg;
|
||||||
SRpcMsg *pRpc;
|
SRpcMsg *pRpc;
|
||||||
|
|
||||||
for (int i = 0; i < taosArrayGetSize(pMsgs); i++) {
|
for (int i = 0; i < taosArrayGetSize(pMsgs); i++) {
|
||||||
pMsg = *(SNodeMsg **)taosArrayGet(pMsgs, i);
|
pMsg = *(SNodeMsg **)taosArrayGet(pMsgs, i);
|
||||||
|
@ -60,7 +59,7 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
// todo: change the interface here
|
// todo: change the interface here
|
||||||
int64_t ver;
|
int64_t ver;
|
||||||
taosDecodeFixedI64(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &ver);
|
taosDecodeFixedI64(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &ver);
|
||||||
if (tqPushMsg(pVnode->pTq, ptr, pMsg->msgType, ver) < 0) {
|
if (tqPushMsg(pVnode->pTq, pMsg->pCont, pMsg->contLen, pMsg->msgType, ver) < 0) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,9 +79,24 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
case TDMT_VND_CREATE_TABLE: {
|
case TDMT_VND_CREATE_TABLE: {
|
||||||
SVCreateTbBatchReq vCreateTbBatchReq = {0};
|
SVCreateTbBatchReq vCreateTbBatchReq = {0};
|
||||||
|
SVCreateTbBatchRsp vCreateTbBatchRsp = {0};
|
||||||
tDeserializeSVCreateTbBatchReq(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &vCreateTbBatchReq);
|
tDeserializeSVCreateTbBatchReq(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &vCreateTbBatchReq);
|
||||||
for (int i = 0; i < taosArrayGetSize(vCreateTbBatchReq.pArray); i++) {
|
int reqNum = taosArrayGetSize(vCreateTbBatchReq.pArray);
|
||||||
|
for (int i = 0; i < reqNum; i++) {
|
||||||
SVCreateTbReq *pCreateTbReq = taosArrayGet(vCreateTbBatchReq.pArray, i);
|
SVCreateTbReq *pCreateTbReq = taosArrayGet(vCreateTbBatchReq.pArray, i);
|
||||||
|
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
SMsgHead *pHead = (SMsgHead *)pMsg->pCont;
|
||||||
|
sprintf(tableFName, "%s.%s", pCreateTbReq->dbFName, pCreateTbReq->name);
|
||||||
|
|
||||||
|
int32_t code = vnodeValidateTableHash(&pVnode->config, tableFName);
|
||||||
|
if (code) {
|
||||||
|
SVCreateTbRsp rsp;
|
||||||
|
rsp.code = code;
|
||||||
|
|
||||||
|
taosArrayPush(vCreateTbBatchRsp.rspList, &rsp);
|
||||||
|
}
|
||||||
|
|
||||||
if (metaCreateTable(pVnode->pMeta, pCreateTbReq) < 0) {
|
if (metaCreateTable(pVnode->pMeta, pCreateTbReq) < 0) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
vError("vgId:%d, failed to create table: %s", pVnode->vgId, pCreateTbReq->name);
|
vError("vgId:%d, failed to create table: %s", pVnode->vgId, pCreateTbReq->name);
|
||||||
|
@ -100,6 +114,19 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
|
|
||||||
vTrace("vgId:%d process create %" PRIzu " tables", pVnode->vgId, taosArrayGetSize(vCreateTbBatchReq.pArray));
|
vTrace("vgId:%d process create %" PRIzu " tables", pVnode->vgId, taosArrayGetSize(vCreateTbBatchReq.pArray));
|
||||||
taosArrayDestroy(vCreateTbBatchReq.pArray);
|
taosArrayDestroy(vCreateTbBatchReq.pArray);
|
||||||
|
if (vCreateTbBatchRsp.rspList) {
|
||||||
|
int32_t contLen = tSerializeSVCreateTbBatchRsp(NULL, 0, &vCreateTbBatchRsp);
|
||||||
|
void *msg = rpcMallocCont(contLen);
|
||||||
|
tSerializeSVCreateTbBatchRsp(msg, contLen, &vCreateTbBatchRsp);
|
||||||
|
taosArrayDestroy(vCreateTbBatchRsp.rspList);
|
||||||
|
|
||||||
|
*pRsp = calloc(1, sizeof(SRpcMsg));
|
||||||
|
(*pRsp)->msgType = TDMT_VND_CREATE_TABLE_RSP;
|
||||||
|
(*pRsp)->pCont = msg;
|
||||||
|
(*pRsp)->contLen = contLen;
|
||||||
|
(*pRsp)->handle = pMsg->handle;
|
||||||
|
(*pRsp)->ahandle = pMsg->ahandle;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TDMT_VND_ALTER_STB: {
|
case TDMT_VND_ALTER_STB: {
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include <cstring>
|
|
||||||
#include <iostream>
|
|
||||||
#include <queue>
|
|
||||||
|
|
||||||
#include "tq.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
TEST(TqSerializerTest, basicTest) {
|
|
||||||
TqGroupHandle* gHandle = (TqGroupHandle*)malloc(sizeof(TqGroupHandle));
|
|
||||||
|
|
||||||
}
|
|
|
@ -33,6 +33,61 @@ int main(int argc, char **argv) {
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(testCase, unionEncodeDecodeTest) {
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
uint8_t info;
|
||||||
|
struct {
|
||||||
|
uint8_t rollup : 1; // 1 means rollup sma
|
||||||
|
uint8_t type : 7;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
col_id_t nBSmaCols;
|
||||||
|
col_id_t* pBSmaCols;
|
||||||
|
} SUnionTest;
|
||||||
|
|
||||||
|
SUnionTest sut = {0};
|
||||||
|
sut.rollup = 1;
|
||||||
|
sut.type = 1;
|
||||||
|
|
||||||
|
sut.nBSmaCols = 2;
|
||||||
|
sut.pBSmaCols = (col_id_t*)malloc(sut.nBSmaCols * sizeof(col_id_t));
|
||||||
|
for (col_id_t i = 0; i < sut.nBSmaCols; ++i) {
|
||||||
|
sut.pBSmaCols[i] = i + 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* buf = malloc(1024);
|
||||||
|
void * pBuf = buf;
|
||||||
|
int32_t tlen = 0;
|
||||||
|
tlen += taosEncodeFixedU8(&buf, sut.info);
|
||||||
|
tlen += taosEncodeFixedI16(&buf, sut.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i < sut.nBSmaCols; ++i) {
|
||||||
|
tlen += taosEncodeFixedI16(&buf, sut.pBSmaCols[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
SUnionTest dut = {0};
|
||||||
|
pBuf = taosDecodeFixedU8(pBuf, &dut.info);
|
||||||
|
pBuf = taosDecodeFixedI16(pBuf, &dut.nBSmaCols);
|
||||||
|
if(dut.nBSmaCols > 0) {
|
||||||
|
dut.pBSmaCols = (col_id_t*)malloc(dut.nBSmaCols * sizeof(col_id_t));
|
||||||
|
for(col_id_t i=0; i < dut.nBSmaCols; ++i) {
|
||||||
|
pBuf = taosDecodeFixedI16(pBuf, dut.pBSmaCols + i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dut.pBSmaCols = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("sut.rollup=%" PRIu8 ", type=%" PRIu8 ", info=%" PRIu8 "\n", sut.rollup, sut.type, sut.info);
|
||||||
|
printf("dut.rollup=%" PRIu8 ", type=%" PRIu8 ", info=%" PRIu8 "\n", dut.rollup, dut.type, dut.info);
|
||||||
|
|
||||||
|
ASSERT_EQ(sut.rollup, dut.rollup);
|
||||||
|
ASSERT_EQ(sut.type, dut.type);
|
||||||
|
ASSERT_EQ(sut.nBSmaCols, dut.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i< sut.nBSmaCols; ++i) {
|
||||||
|
ASSERT_EQ(*(col_id_t*)(sut.pBSmaCols + i), sut.pBSmaCols[i]);
|
||||||
|
ASSERT_EQ(*(col_id_t*)(sut.pBSmaCols + i), dut.pBSmaCols[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
TEST(testCase, tSma_Meta_Encode_Decode_Test) {
|
TEST(testCase, tSma_Meta_Encode_Decode_Test) {
|
||||||
// encode
|
// encode
|
||||||
|
@ -304,7 +359,9 @@ TEST(testCase, tSma_Data_Insert_Query_Test) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDiskCfg pDisks = {.level = 0, .primary = 1};
|
SDiskCfg pDisks = {0};
|
||||||
|
pDisks.level = 0;
|
||||||
|
pDisks.primary = 1;
|
||||||
strncpy(pDisks.dir, "/var/lib/taos", TSDB_FILENAME_LEN);
|
strncpy(pDisks.dir, "/var/lib/taos", TSDB_FILENAME_LEN);
|
||||||
int32_t numOfDisks = 1;
|
int32_t numOfDisks = 1;
|
||||||
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern "C" {
|
||||||
#define CTG_DEFAULT_CACHE_TBLMETA_NUMBER 1000
|
#define CTG_DEFAULT_CACHE_TBLMETA_NUMBER 1000
|
||||||
#define CTG_DEFAULT_RENT_SECOND 10
|
#define CTG_DEFAULT_RENT_SECOND 10
|
||||||
#define CTG_DEFAULT_RENT_SLOT_SIZE 10
|
#define CTG_DEFAULT_RENT_SLOT_SIZE 10
|
||||||
|
#define CTG_DEFAULT_MAX_RETRY_TIMES 3
|
||||||
|
|
||||||
#define CTG_RENT_SLOT_SECOND 1.5
|
#define CTG_RENT_SLOT_SECOND 1.5
|
||||||
|
|
||||||
|
@ -57,10 +58,10 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SCtgDebug {
|
typedef struct SCtgDebug {
|
||||||
bool lockDebug;
|
bool lockEnable;
|
||||||
bool cacheDebug;
|
bool cacheEnable;
|
||||||
bool apiDebug;
|
bool apiEnable;
|
||||||
bool metaDebug;
|
bool metaEnable;
|
||||||
uint32_t showCachePeriodSec;
|
uint32_t showCachePeriodSec;
|
||||||
} SCtgDebug;
|
} SCtgDebug;
|
||||||
|
|
||||||
|
@ -159,8 +160,10 @@ typedef struct SCtgRemoveTblMsg {
|
||||||
|
|
||||||
|
|
||||||
typedef struct SCtgMetaAction {
|
typedef struct SCtgMetaAction {
|
||||||
int32_t act;
|
int32_t act;
|
||||||
void *data;
|
void *data;
|
||||||
|
bool syncReq;
|
||||||
|
uint64_t seqId;
|
||||||
} SCtgMetaAction;
|
} SCtgMetaAction;
|
||||||
|
|
||||||
typedef struct SCtgQNode {
|
typedef struct SCtgQNode {
|
||||||
|
@ -168,14 +171,21 @@ typedef struct SCtgQNode {
|
||||||
struct SCtgQNode *next;
|
struct SCtgQNode *next;
|
||||||
} SCtgQNode;
|
} SCtgQNode;
|
||||||
|
|
||||||
|
typedef struct SCtgQueue {
|
||||||
|
SRWLatch qlock;
|
||||||
|
uint64_t seqId;
|
||||||
|
uint64_t seqDone;
|
||||||
|
SCtgQNode *head;
|
||||||
|
SCtgQNode *tail;
|
||||||
|
tsem_t reqSem;
|
||||||
|
tsem_t rspSem;
|
||||||
|
uint64_t qRemainNum;
|
||||||
|
} SCtgQueue;
|
||||||
|
|
||||||
typedef struct SCatalogMgmt {
|
typedef struct SCatalogMgmt {
|
||||||
bool exit;
|
bool exit;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
SRWLatch qlock;
|
SCtgQueue queue;
|
||||||
SCtgQNode *head;
|
|
||||||
SCtgQNode *tail;
|
|
||||||
tsem_t sem;
|
|
||||||
uint64_t qRemainNum;
|
|
||||||
TdThread updateThread;
|
TdThread updateThread;
|
||||||
SHashObj *pCluster; //key: clusterId, value: SCatalog*
|
SHashObj *pCluster; //key: clusterId, value: SCatalog*
|
||||||
SCatalogStat stat;
|
SCatalogStat stat;
|
||||||
|
@ -191,8 +201,8 @@ typedef struct SCtgAction {
|
||||||
ctgActFunc func;
|
ctgActFunc func;
|
||||||
} SCtgAction;
|
} SCtgAction;
|
||||||
|
|
||||||
#define CTG_QUEUE_ADD() atomic_add_fetch_64(&gCtgMgmt.qRemainNum, 1)
|
#define CTG_QUEUE_ADD() atomic_add_fetch_64(&gCtgMgmt.queue.qRemainNum, 1)
|
||||||
#define CTG_QUEUE_SUB() atomic_sub_fetch_64(&gCtgMgmt.qRemainNum, 1)
|
#define CTG_QUEUE_SUB() atomic_sub_fetch_64(&gCtgMgmt.queue.qRemainNum, 1)
|
||||||
|
|
||||||
#define CTG_STAT_ADD(n) atomic_add_fetch_64(&(n), 1)
|
#define CTG_STAT_ADD(n) atomic_add_fetch_64(&(n), 1)
|
||||||
#define CTG_STAT_SUB(n) atomic_sub_fetch_64(&(n), 1)
|
#define CTG_STAT_SUB(n) atomic_sub_fetch_64(&(n), 1)
|
||||||
|
@ -232,9 +242,9 @@ typedef struct SCtgAction {
|
||||||
#define ctgDebug(param, ...) qDebug("CTG:%p " param, pCtg, __VA_ARGS__)
|
#define ctgDebug(param, ...) qDebug("CTG:%p " param, pCtg, __VA_ARGS__)
|
||||||
#define ctgTrace(param, ...) qTrace("CTG:%p " param, pCtg, __VA_ARGS__)
|
#define ctgTrace(param, ...) qTrace("CTG:%p " param, pCtg, __VA_ARGS__)
|
||||||
|
|
||||||
#define CTG_LOCK_DEBUG(...) do { if (gCTGDebug.lockDebug) { qDebug(__VA_ARGS__); } } while (0)
|
#define CTG_LOCK_DEBUG(...) do { if (gCTGDebug.lockEnable) { qDebug(__VA_ARGS__); } } while (0)
|
||||||
#define CTG_CACHE_DEBUG(...) do { if (gCTGDebug.cacheDebug) { qDebug(__VA_ARGS__); } } while (0)
|
#define CTG_CACHE_DEBUG(...) do { if (gCTGDebug.cacheEnable) { qDebug(__VA_ARGS__); } } while (0)
|
||||||
#define CTG_API_DEBUG(...) do { if (gCTGDebug.apiDebug) { qDebug(__VA_ARGS__); } } while (0)
|
#define CTG_API_DEBUG(...) do { if (gCTGDebug.apiEnable) { qDebug(__VA_ARGS__); } } while (0)
|
||||||
|
|
||||||
#define TD_RWLATCH_WRITE_FLAG_COPY 0x40000000
|
#define TD_RWLATCH_WRITE_FLAG_COPY 0x40000000
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -713,7 +713,7 @@ void *ctgTestGetDbVgroupThread(void *param) {
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
|
|
||||||
while (!ctgTestStop) {
|
while (!ctgTestStop) {
|
||||||
code = catalogGetDBVgInfo(pCtg, mockPointer, (const SEpSet *)mockPointer, ctgTestDbname, false, &vgList);
|
code = catalogGetDBVgInfo(pCtg, mockPointer, (const SEpSet *)mockPointer, ctgTestDbname, &vgList);
|
||||||
if (code) {
|
if (code) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
@ -2009,7 +2009,7 @@ TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
code = catalogGetDBVgInfo(pCtg, mockPointer, (const SEpSet *)mockPointer, ctgTestDbname, false, &vgList);
|
code = catalogGetDBVgInfo(pCtg, mockPointer, (const SEpSet *)mockPointer, ctgTestDbname, &vgList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), ctgTestVgNum);
|
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), ctgTestVgNum);
|
||||||
|
|
||||||
|
|
|
@ -253,11 +253,6 @@ typedef struct STaskIdInfo {
|
||||||
char* str;
|
char* str;
|
||||||
} STaskIdInfo;
|
} STaskIdInfo;
|
||||||
|
|
||||||
typedef struct STaskBufInfo {
|
|
||||||
int32_t bufSize; // total available buffer size in bytes
|
|
||||||
int32_t remainBuf; // remain buffer size
|
|
||||||
} STaskBufInfo;
|
|
||||||
|
|
||||||
typedef struct SExecTaskInfo {
|
typedef struct SExecTaskInfo {
|
||||||
STaskIdInfo id;
|
STaskIdInfo id;
|
||||||
char* content;
|
char* content;
|
||||||
|
@ -269,8 +264,7 @@ typedef struct SExecTaskInfo {
|
||||||
uint64_t totalRows; // total number of rows
|
uint64_t totalRows; // total number of rows
|
||||||
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
||||||
char* sql; // query sql string
|
char* sql; // query sql string
|
||||||
jmp_buf env; // when error occurs, abort
|
jmp_buf env; //
|
||||||
STaskBufInfo bufInfo; // available buffer info this task
|
|
||||||
struct SOperatorInfo* pRoot;
|
struct SOperatorInfo* pRoot;
|
||||||
} SExecTaskInfo;
|
} SExecTaskInfo;
|
||||||
|
|
||||||
|
@ -315,7 +309,6 @@ typedef struct STaskRuntimeEnv {
|
||||||
enum {
|
enum {
|
||||||
OP_NOT_OPENED = 0x0,
|
OP_NOT_OPENED = 0x0,
|
||||||
OP_OPENED = 0x1,
|
OP_OPENED = 0x1,
|
||||||
OP_IN_EXECUTING = 0x3,
|
|
||||||
OP_RES_TO_RETURN = 0x5,
|
OP_RES_TO_RETURN = 0x5,
|
||||||
OP_EXEC_DONE = 0x9,
|
OP_EXEC_DONE = 0x9,
|
||||||
};
|
};
|
||||||
|
@ -366,9 +359,9 @@ typedef struct SQInfo {
|
||||||
} SQInfo;
|
} SQInfo;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
EX_SOURCE_DATA_NOT_READY = 0x1,
|
DATA_NOT_READY = 0x1,
|
||||||
EX_SOURCE_DATA_READY = 0x2,
|
DATA_READY = 0x2,
|
||||||
EX_SOURCE_DATA_EXHAUSTED = 0x3,
|
DATA_EXHAUSTED = 0x3,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SSourceDataInfo {
|
typedef struct SSourceDataInfo {
|
||||||
|
@ -379,6 +372,18 @@ typedef struct SSourceDataInfo {
|
||||||
int32_t status;
|
int32_t status;
|
||||||
} SSourceDataInfo;
|
} SSourceDataInfo;
|
||||||
|
|
||||||
|
typedef struct SLoadRemoteDataInfo {
|
||||||
|
uint64_t totalSize; // total load bytes from remote
|
||||||
|
uint64_t totalRows; // total number of rows
|
||||||
|
uint64_t totalElapsed; // total elapsed time
|
||||||
|
} SLoadRemoteDataInfo;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
EX_SOURCE_DATA_NOT_READY = 0x1,
|
||||||
|
EX_SOURCE_DATA_READY = 0x2,
|
||||||
|
EX_SOURCE_DATA_EXHAUSTED = 0x3,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct SExchangeInfo {
|
typedef struct SExchangeInfo {
|
||||||
SArray* pSources;
|
SArray* pSources;
|
||||||
SArray* pSourceDataInfo;
|
SArray* pSourceDataInfo;
|
||||||
|
@ -387,9 +392,7 @@ typedef struct SExchangeInfo {
|
||||||
SSDataBlock* pResult;
|
SSDataBlock* pResult;
|
||||||
bool seqLoadData; // sequential load data or not, false by default
|
bool seqLoadData; // sequential load data or not, false by default
|
||||||
int32_t current;
|
int32_t current;
|
||||||
uint64_t totalSize; // total load bytes from remote
|
SLoadRemoteDataInfo loadInfo;
|
||||||
uint64_t totalRows; // total number of rows
|
|
||||||
uint64_t totalElapsed; // total elapsed time
|
|
||||||
} SExchangeInfo;
|
} SExchangeInfo;
|
||||||
|
|
||||||
typedef struct STableScanInfo {
|
typedef struct STableScanInfo {
|
||||||
|
@ -436,19 +439,21 @@ typedef struct SSysTableScanInfo {
|
||||||
void* readHandle;
|
void* readHandle;
|
||||||
};
|
};
|
||||||
|
|
||||||
void *pCur; // cursor
|
SRetrieveMetaTableRsp *pRsp;
|
||||||
SRetrieveTableReq* pReq;
|
SRetrieveTableReq req;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
int32_t type; // show type
|
tsem_t ready;
|
||||||
tsem_t ready;
|
|
||||||
SSchema* pSchema;
|
|
||||||
SSDataBlock* pRes;
|
|
||||||
|
|
||||||
int32_t capacity;
|
SNode* pCondition; // db_name filter condition, to discard data that are not in current database
|
||||||
int64_t numOfBlocks; // extract basic running information.
|
void *pCur; // cursor for iterate the local table meta store.
|
||||||
int64_t totalRows;
|
SArray *scanCols; // SArray<int16_t> scan column id list
|
||||||
int64_t elapsedTime;
|
|
||||||
int64_t totalBytes;
|
int32_t type; // show type, TODO remove it
|
||||||
|
SName name;
|
||||||
|
SSDataBlock* pRes;
|
||||||
|
int32_t capacity;
|
||||||
|
int64_t numOfBlocks; // extract basic running information.
|
||||||
|
SLoadRemoteDataInfo loadInfo;
|
||||||
} SSysTableScanInfo;
|
} SSysTableScanInfo;
|
||||||
|
|
||||||
typedef struct SOptrBasicInfo {
|
typedef struct SOptrBasicInfo {
|
||||||
|
@ -493,10 +498,9 @@ typedef struct SAggOperatorInfo {
|
||||||
} SAggOperatorInfo;
|
} SAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct SProjectOperatorInfo {
|
typedef struct SProjectOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
SSDataBlock *existDataBlock;
|
SSDataBlock *existDataBlock;
|
||||||
int32_t threshold;
|
int32_t threshold;
|
||||||
bool hasVarCol;
|
|
||||||
} SProjectOperatorInfo;
|
} SProjectOperatorInfo;
|
||||||
|
|
||||||
typedef struct SLimitOperatorInfo {
|
typedef struct SLimitOperatorInfo {
|
||||||
|
@ -537,10 +541,22 @@ typedef struct SFillOperatorInfo {
|
||||||
bool multigroupResult;
|
bool multigroupResult;
|
||||||
} SFillOperatorInfo;
|
} SFillOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SGroupKeys {
|
||||||
|
char *pData;
|
||||||
|
bool isNull;
|
||||||
|
int16_t type;
|
||||||
|
int32_t bytes;
|
||||||
|
}SGroupKeys;
|
||||||
|
|
||||||
typedef struct SGroupbyOperatorInfo {
|
typedef struct SGroupbyOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
int32_t colIndex;
|
SArray* pGroupCols;
|
||||||
char* prevData; // previous group by value
|
SArray* pGroupColVals; // current group column values, SArray<SGroupKeys>
|
||||||
|
bool isInit; // denote if current val is initialized or not
|
||||||
|
char* keyBuf; // group by keys for hash
|
||||||
|
int32_t groupKeyLen; // total group by column width
|
||||||
|
SGroupResInfo groupResInfo;
|
||||||
|
SAggSupporter aggSup;
|
||||||
} SGroupbyOperatorInfo;
|
} SGroupbyOperatorInfo;
|
||||||
|
|
||||||
typedef struct SSessionAggOperatorInfo {
|
typedef struct SSessionAggOperatorInfo {
|
||||||
|
@ -631,13 +647,15 @@ SOperatorInfo* createMultiTableAggOperatorInfo(SOperatorInfo* downstream, SExprI
|
||||||
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t num, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t num, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createOrderOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SArray* pOrderVal, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createOrderOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SArray* pOrderVal, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t numOfDownstream, SExprInfo* pExprInfo, int32_t num, SArray* pOrderVal, SArray* pGroupInfo, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t numOfDownstream, SExprInfo* pExprInfo, int32_t num, SArray* pOrderVal, SArray* pGroupInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, const SArray* pExprInfo, const SSchema* pSchema,
|
SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, SSDataBlock* pResBlock, const SName* pName,
|
||||||
int32_t tableType, SEpSet epset, SExecTaskInfo* pTaskInfo);
|
SNode* pCondition, SEpSet epset, SArray* colList, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createLimitOperatorInfo(SOperatorInfo* downstream, int32_t numOfDownstream, SLimit* pLimit, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createLimitOperatorInfo(SOperatorInfo* downstream, int32_t numOfDownstream, SLimit* pLimit, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval,
|
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval,
|
||||||
const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
||||||
|
SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock,
|
||||||
|
SArray* pGroupColList, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
||||||
|
|
||||||
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
||||||
SOperatorInfo* createAllTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
SOperatorInfo* createAllTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
||||||
|
@ -645,8 +663,6 @@ SOperatorInfo* createAllTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, S
|
||||||
|
|
||||||
SOperatorInfo* createFillOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
SOperatorInfo* createFillOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
||||||
int32_t numOfOutput, bool multigroupResult);
|
int32_t numOfOutput, bool multigroupResult);
|
||||||
SOperatorInfo* createGroupbyOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
|
||||||
int32_t numOfOutput);
|
|
||||||
|
|
||||||
SOperatorInfo* createMultiTableTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
SOperatorInfo* createMultiTableTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
||||||
SExprInfo* pExpr, int32_t numOfOutput);
|
SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
@ -669,7 +685,6 @@ SOperatorInfo* createSLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorI
|
||||||
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pdownstream, int32_t numOfDownstream, SSchema* pSchema,
|
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pdownstream, int32_t numOfDownstream, SSchema* pSchema,
|
||||||
int32_t numOfOutput);
|
int32_t numOfOutput);
|
||||||
|
|
||||||
// int32_t doCreateFilterInfo(SColumnInfo* pCols, int32_t numOfCols, int32_t numOfFilterCols, SSingleColumnFilterInfo** pFilterInfo, uint64_t qId);
|
|
||||||
void doSetFilterColumnInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, SSDataBlock* pBlock);
|
void doSetFilterColumnInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, SSDataBlock* pBlock);
|
||||||
bool doFilterDataBlock(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, int32_t numOfRows, int8_t* p);
|
bool doFilterDataBlock(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, int32_t numOfRows, int8_t* p);
|
||||||
void doCompactSDataBlock(SSDataBlock* pBlock, int32_t numOfRows, int8_t* p);
|
void doCompactSDataBlock(SSDataBlock* pBlock, int32_t numOfRows, int8_t* p);
|
||||||
|
@ -679,6 +694,7 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO
|
||||||
void* doDestroyFilterInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols);
|
void* doDestroyFilterInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols);
|
||||||
|
|
||||||
void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order);
|
void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order);
|
||||||
|
|
||||||
void finalizeQueryResult(SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
void finalizeQueryResult(SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
|
|
||||||
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
||||||
|
@ -692,16 +708,9 @@ void freeColumnFilterInfo(SColumnFilterInfo* pFilter, int32_t numOfFilters);
|
||||||
STableQueryInfo* createTableQueryInfo(void* buf, bool groupbyColumn, STimeWindow win);
|
STableQueryInfo* createTableQueryInfo(void* buf, bool groupbyColumn, STimeWindow win);
|
||||||
STableQueryInfo* createTmpTableQueryInfo(STimeWindow win);
|
STableQueryInfo* createTmpTableQueryInfo(STimeWindow win);
|
||||||
|
|
||||||
int32_t buildArithmeticExprFromMsg(SExprInfo* pArithExprInfo, void* pQueryMsg);
|
|
||||||
|
|
||||||
bool isTaskKilled(SExecTaskInfo* pTaskInfo);
|
bool isTaskKilled(SExecTaskInfo* pTaskInfo);
|
||||||
int32_t checkForQueryBuf(size_t numOfTables);
|
int32_t checkForQueryBuf(size_t numOfTables);
|
||||||
bool checkNeedToCompressQueryCol(SQInfo* pQInfo);
|
|
||||||
void setQueryStatus(STaskRuntimeEnv* pRuntimeEnv, int8_t status);
|
|
||||||
|
|
||||||
int32_t doDumpQueryResult(SQInfo* pQInfo, char* data, int8_t compressed, int32_t* compLen);
|
|
||||||
|
|
||||||
size_t getResultSize(SQInfo* pQInfo, int64_t* numOfRows);
|
|
||||||
void setTaskKilled(SExecTaskInfo* pTaskInfo);
|
void setTaskKilled(SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
void publishOperatorProfEvent(SOperatorInfo* operatorInfo, EQueryProfEventType eventType);
|
void publishOperatorProfEvent(SOperatorInfo* operatorInfo, EQueryProfEventType eventType);
|
||||||
|
@ -711,8 +720,6 @@ void calculateOperatorProfResults(SQInfo* pQInfo);
|
||||||
void queryCostStatis(SExecTaskInfo* pTaskInfo);
|
void queryCostStatis(SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
void doDestroyTask(SExecTaskInfo* pTaskInfo);
|
void doDestroyTask(SExecTaskInfo* pTaskInfo);
|
||||||
void freeQueryAttr(STaskAttr* pQuery);
|
|
||||||
|
|
||||||
int32_t getMaximumIdleDurationSec();
|
int32_t getMaximumIdleDurationSec();
|
||||||
|
|
||||||
void doInvokeUdf(struct SUdfInfo* pUdfInfo, SqlFunctionCtx* pCtx, int32_t idx, int32_t type);
|
void doInvokeUdf(struct SUdfInfo* pUdfInfo, SqlFunctionCtx* pCtx, int32_t idx, int32_t type);
|
||||||
|
|
|
@ -15,11 +15,12 @@
|
||||||
|
|
||||||
#include "dataSinkInt.h"
|
#include "dataSinkInt.h"
|
||||||
#include "dataSinkMgt.h"
|
#include "dataSinkMgt.h"
|
||||||
|
#include "executorimpl.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "tcompression.h"
|
#include "tcompression.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tqueue.h"
|
#include "tqueue.h"
|
||||||
#include "executorimpl.h"
|
#include "tdatablock.h"
|
||||||
|
|
||||||
typedef struct SDataDispatchBuf {
|
typedef struct SDataDispatchBuf {
|
||||||
int32_t useSize;
|
int32_t useSize;
|
||||||
|
@ -64,47 +65,68 @@ static bool needCompress(const SSDataBlock* pData, const SDataBlockDescNode* pSc
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t compressColData(SColumnInfoData *pColRes, int32_t numOfRows, char *data, int8_t compressed) {
|
static int32_t compressColData(SColumnInfoData *pColRes, int32_t numOfRows, char *data, int8_t compressed) {
|
||||||
int32_t colSize = pColRes->info.bytes * numOfRows;
|
int32_t colSize = colDataGetLength(pColRes, numOfRows);
|
||||||
return (*(tDataTypes[pColRes->info.type].compFunc))(
|
return (*(tDataTypes[pColRes->info.type].compFunc))(
|
||||||
pColRes->pData, colSize, numOfRows, data, colSize + COMP_OVERFLOW_BYTES, compressed, NULL, 0);
|
pColRes->pData, colSize, numOfRows, data, colSize + COMP_OVERFLOW_BYTES, compressed, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copyData(const SInputData* pInput, const SDataBlockDescNode* pSchema, char* data, int8_t compressed, int32_t *compLen) {
|
static void copyData(const SInputData* pInput, const SDataBlockDescNode* pSchema, char* data, int8_t compressed, int32_t * dataLen) {
|
||||||
int32_t numOfCols = LIST_LENGTH(pSchema->pSlots);
|
int32_t numOfCols = LIST_LENGTH(pSchema->pSlots);
|
||||||
int32_t *compSizes = (int32_t*)data;
|
int32_t * colSizes = (int32_t*)data;
|
||||||
if (compressed) {
|
|
||||||
data += numOfCols * sizeof(int32_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
data += numOfCols * sizeof(int32_t);
|
||||||
|
*dataLen = (numOfCols * sizeof(int32_t));
|
||||||
|
|
||||||
|
int32_t numOfRows = pInput->pData->info.rows;
|
||||||
for (int32_t col = 0; col < numOfCols; ++col) {
|
for (int32_t col = 0; col < numOfCols; ++col) {
|
||||||
SColumnInfoData* pColRes = taosArrayGet(pInput->pData->pDataBlock, col);
|
SColumnInfoData* pColRes = taosArrayGet(pInput->pData->pDataBlock, col);
|
||||||
if (compressed) {
|
|
||||||
compSizes[col] = compressColData(pColRes, pInput->pData->info.rows, data, compressed);
|
// copy the null bitmap
|
||||||
data += compSizes[col];
|
if (IS_VAR_DATA_TYPE(pColRes->info.type)) {
|
||||||
*compLen += compSizes[col];
|
size_t metaSize = numOfRows * sizeof(int32_t);
|
||||||
compSizes[col] = htonl(compSizes[col]);
|
memcpy(data, pColRes->varmeta.offset, metaSize);
|
||||||
|
data += metaSize;
|
||||||
|
(*dataLen) += metaSize;
|
||||||
} else {
|
} else {
|
||||||
memmove(data, pColRes->pData, pColRes->info.bytes * pInput->pData->info.rows);
|
int32_t len = BitmapLen(numOfRows);
|
||||||
data += pColRes->info.bytes * pInput->pData->info.rows;
|
memcpy(data, pColRes->nullbitmap, len);
|
||||||
|
data += len;
|
||||||
|
(*dataLen) += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (compressed) {
|
||||||
|
colSizes[col] = compressColData(pColRes, numOfRows, data, compressed);
|
||||||
|
data += colSizes[col];
|
||||||
|
(*dataLen) += colSizes[col];
|
||||||
|
} else {
|
||||||
|
colSizes[col] = colDataGetLength(pColRes, numOfRows);
|
||||||
|
(*dataLen) += colSizes[col];
|
||||||
|
memmove(data, pColRes->pData, colSizes[col]);
|
||||||
|
data += colSizes[col];
|
||||||
|
}
|
||||||
|
|
||||||
|
colSizes[col] = htonl(colSizes[col]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// data format with compress: SDataCacheEntry | cols_data_offset | col1_data col2_data ... | numOfTables | STableIdInfo STableIdInfo ...
|
// data format:
|
||||||
// data format: SDataCacheEntry | col1_data col2_data ... | numOfTables | STableIdInfo STableIdInfo ...
|
// +----------------+--------------------------------------+-------------+-----------+-------------+-----------+
|
||||||
|
// |SDataCacheEntry | column#1 length, column#2 length ... | col1 bitmap | col1 data | col2 bitmap | col2 data | ....
|
||||||
|
// | | sizeof(int32_t) * numOfCols | actual size | | actual size | |
|
||||||
|
// +----------------+--------------------------------------+-------------+-----------+-------------+-----------+
|
||||||
|
// The length of bitmap is decided by number of rows of this data block, and the length of each column data is
|
||||||
|
// recorded in the first segment, next to the struct header
|
||||||
static void toDataCacheEntry(const SDataDispatchHandle* pHandle, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
static void toDataCacheEntry(const SDataDispatchHandle* pHandle, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
||||||
SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData;
|
SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData;
|
||||||
pEntry->compressed = (int8_t)needCompress(pInput->pData, pHandle->pSchema);
|
pEntry->compressed = (int8_t)needCompress(pInput->pData, pHandle->pSchema);
|
||||||
pEntry->numOfRows = pInput->pData->info.rows;
|
pEntry->numOfRows = pInput->pData->info.rows;
|
||||||
pEntry->dataLen = 0;
|
pEntry->dataLen = 0;
|
||||||
|
|
||||||
pBuf->useSize = sizeof(SRetrieveTableRsp);
|
pBuf->useSize = sizeof(SRetrieveTableRsp);
|
||||||
copyData(pInput, pHandle->pSchema, pEntry->data, pEntry->compressed, &pEntry->dataLen);
|
copyData(pInput, pHandle->pSchema, pEntry->data, pEntry->compressed, &pEntry->dataLen);
|
||||||
if (0 == pEntry->compressed) {
|
|
||||||
pEntry->dataLen = pHandle->pSchema->resultRowSize * pInput->pData->info.rows;
|
pEntry->dataLen = pEntry->dataLen;
|
||||||
}
|
pBuf->useSize += pEntry->dataLen;
|
||||||
pBuf->useSize += pEntry->dataLen;
|
|
||||||
// todo completed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
||||||
|
@ -115,8 +137,11 @@ static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct size + data payload + length for each column
|
// NOTE: there are four bytes of an integer more than the required buffer space.
|
||||||
pBuf->allocSize = sizeof(SRetrieveTableRsp) + pDispatcher->pSchema->resultRowSize * pInput->pData->info.rows + pInput->pData->info.numOfCols * sizeof(int32_t);
|
// struct size + data payload + length for each column + bitmap length
|
||||||
|
pBuf->allocSize = sizeof(SRetrieveTableRsp) + blockDataGetSerialMetaSize(pInput->pData) +
|
||||||
|
ceil(blockDataGetSerialRowSize(pInput->pData) * pInput->pData->info.rows);
|
||||||
|
|
||||||
pBuf->pData = malloc(pBuf->allocSize);
|
pBuf->pData = malloc(pBuf->allocSize);
|
||||||
if (pBuf->pData == NULL) {
|
if (pBuf->pData == NULL) {
|
||||||
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
||||||
|
@ -169,6 +194,7 @@ static void getDataLength(SDataSinkHandle* pHandle, int32_t* pLen, bool* pQueryE
|
||||||
*pLen = 0;
|
*pLen = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataDispatchBuf* pBuf = NULL;
|
SDataDispatchBuf* pBuf = NULL;
|
||||||
taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
||||||
memcpy(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf));
|
memcpy(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf));
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
#include "executorimpl.h"
|
#include "executorimpl.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "tq.h"
|
#include "vnode.h"
|
||||||
|
|
||||||
static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, int32_t type, char* id) {
|
static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, int32_t type, char* id) {
|
||||||
ASSERT(pOperator != NULL);
|
ASSERT(pOperator != NULL);
|
||||||
|
@ -30,7 +30,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, int32_t t
|
||||||
qError("join not supported for stream block scan, %s" PRIx64, id);
|
qError("join not supported for stream block scan, %s" PRIx64, id);
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
}
|
}
|
||||||
|
pOperator->status = OP_NOT_OPENED;
|
||||||
return doSetStreamBlock(pOperator->pDownstream[0], input, type, id);
|
return doSetStreamBlock(pOperator->pDownstream[0], input, type, id);
|
||||||
} else {
|
} else {
|
||||||
SStreamBlockScanInfo* pInfo = pOperator->info;
|
SStreamBlockScanInfo* pInfo = pOperator->info;
|
||||||
|
@ -52,9 +52,8 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, int32_t t
|
||||||
|
|
||||||
SSDataBlock* pDataBlock = input;
|
SSDataBlock* pDataBlock = input;
|
||||||
pInfo->pRes->info = pDataBlock->info;
|
pInfo->pRes->info = pDataBlock->info;
|
||||||
for(int32_t i = 0; i < pInfo->pRes->info.numOfCols; ++i) {
|
taosArrayClear(pInfo->pRes->pDataBlock);
|
||||||
pInfo->pRes->pDataBlock = pDataBlock->pDataBlock;
|
taosArrayAddAll(pInfo->pRes->pDataBlock, pDataBlock->pDataBlock);
|
||||||
}
|
|
||||||
|
|
||||||
// set current block valid.
|
// set current block valid.
|
||||||
pInfo->blockValid = true;
|
pInfo->blockValid = true;
|
||||||
|
@ -121,7 +120,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, SArray* tableIdList, bool isA
|
||||||
|
|
||||||
// traverse to the streamscan node to add this table id
|
// traverse to the streamscan node to add this table id
|
||||||
SOperatorInfo* pInfo = pTaskInfo->pRoot;
|
SOperatorInfo* pInfo = pTaskInfo->pRoot;
|
||||||
while(pInfo->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
while (pInfo->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
pInfo = pInfo->pDownstream[0];
|
pInfo = pInfo->pDownstream[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -182,7 +182,7 @@ static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) {
|
||||||
start = stop + 1;
|
start = stop + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockDataClearup(pDataBlock);
|
blockDataCleanup(pDataBlock);
|
||||||
|
|
||||||
SSDataBlock* pBlock = createOneDataBlock(pDataBlock);
|
SSDataBlock* pBlock = createOneDataBlock(pDataBlock);
|
||||||
int32_t code = doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId);
|
int32_t code = doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId);
|
||||||
|
@ -312,7 +312,7 @@ static int32_t adjustMergeTreeForNextTuple(SExternalMemSource *pSource, SMultiwa
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SMsortComparParam* cmpParam, int32_t capacity) {
|
static SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SMsortComparParam* cmpParam, int32_t capacity) {
|
||||||
blockDataClearup(pHandle->pDataBlock);
|
blockDataCleanup(pHandle->pDataBlock);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
if (cmpParam->numOfSources == pHandle->numOfCompletedSources) {
|
if (cmpParam->numOfSources == pHandle->numOfCompletedSources) {
|
||||||
|
@ -478,7 +478,7 @@ static int32_t doInternalMergeSort(SSortHandle* pHandle) {
|
||||||
setBufPageDirty(pPage, true);
|
setBufPageDirty(pPage, true);
|
||||||
releaseBufPage(pHandle->pBuf, pPage);
|
releaseBufPage(pHandle->pBuf, pPage);
|
||||||
|
|
||||||
blockDataClearup(pDataBlock);
|
blockDataCleanup(pDataBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
tMergeTreeDestroy(pHandle->pMergeTree);
|
tMergeTreeDestroy(pHandle->pMergeTree);
|
||||||
|
|
|
@ -86,7 +86,7 @@ SSDataBlock* getDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
//
|
//
|
||||||
// taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
// taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
||||||
} else {
|
} else {
|
||||||
blockDataClearup(pInfo->pBlock);
|
blockDataCleanup(pInfo->pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = pInfo->pBlock;
|
SSDataBlock* pBlock = pInfo->pBlock;
|
||||||
|
@ -151,7 +151,7 @@ SSDataBlock* get2ColsDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
|
|
||||||
taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
||||||
} else {
|
} else {
|
||||||
blockDataClearup(pInfo->pBlock);
|
blockDataCleanup(pInfo->pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = pInfo->pBlock;
|
SSDataBlock* pBlock = pInfo->pBlock;
|
||||||
|
@ -1228,4 +1228,4 @@ TEST(testCase, time_interval_Operator_Test) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnosti
|
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
|
|
||||||
bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo);
|
bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo);
|
||||||
void functionFinalizer(SqlFunctionCtx *pCtx);
|
void functionFinalize(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
bool getCountFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
bool getCountFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
void countFunction(SqlFunctionCtx *pCtx);
|
void countFunction(SqlFunctionCtx *pCtx);
|
||||||
|
@ -37,6 +37,16 @@ bool getMinmaxFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
void minFunction(SqlFunctionCtx* pCtx);
|
void minFunction(SqlFunctionCtx* pCtx);
|
||||||
void maxFunction(SqlFunctionCtx *pCtx);
|
void maxFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
bool getStddevFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
void stddevFunction(SqlFunctionCtx* pCtx);
|
||||||
|
void stddevFinalize(SqlFunctionCtx* pCtx);
|
||||||
|
|
||||||
|
bool getFirstLastFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
void firstFunction(SqlFunctionCtx *pCtx);
|
||||||
|
void lastFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
void valFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,7 +29,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.getEnvFunc = getCountFuncEnv,
|
.getEnvFunc = getCountFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
.processFunc = countFunction,
|
.processFunc = countFunction,
|
||||||
.finalizeFunc = functionFinalizer
|
.finalizeFunc = functionFinalize
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "sum",
|
.name = "sum",
|
||||||
|
@ -39,7 +39,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.getEnvFunc = getSumFuncEnv,
|
.getEnvFunc = getSumFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
.processFunc = sumFunction,
|
.processFunc = sumFunction,
|
||||||
.finalizeFunc = functionFinalizer
|
.finalizeFunc = functionFinalize
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "min",
|
.name = "min",
|
||||||
|
@ -49,7 +49,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.getEnvFunc = getMinmaxFuncEnv,
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
.initFunc = minFunctionSetup,
|
.initFunc = minFunctionSetup,
|
||||||
.processFunc = minFunction,
|
.processFunc = minFunction,
|
||||||
.finalizeFunc = functionFinalizer
|
.finalizeFunc = functionFinalize
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "max",
|
.name = "max",
|
||||||
|
@ -59,7 +59,97 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.getEnvFunc = getMinmaxFuncEnv,
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
.initFunc = maxFunctionSetup,
|
.initFunc = maxFunctionSetup,
|
||||||
.processFunc = maxFunction,
|
.processFunc = maxFunction,
|
||||||
.finalizeFunc = functionFinalizer
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "stddev",
|
||||||
|
.type = FUNCTION_TYPE_STDDEV,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getStddevFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "percentile",
|
||||||
|
.type = FUNCTION_TYPE_PERCENTILE,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "apercentile",
|
||||||
|
.type = FUNCTION_TYPE_APERCENTILE,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "top",
|
||||||
|
.type = FUNCTION_TYPE_TOP,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "bottom",
|
||||||
|
.type = FUNCTION_TYPE_BOTTOM,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "spread",
|
||||||
|
.type = FUNCTION_TYPE_SPREAD,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "last_row",
|
||||||
|
.type = FUNCTION_TYPE_LAST_ROW,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "first",
|
||||||
|
.type = FUNCTION_TYPE_FIRST,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getFirstLastFuncEnv,
|
||||||
|
.initFunc = functionSetup,
|
||||||
|
.processFunc = firstFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "last",
|
||||||
|
.type = FUNCTION_TYPE_LAST,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getFirstLastFuncEnv,
|
||||||
|
.initFunc = functionSetup,
|
||||||
|
.processFunc = lastFunction,
|
||||||
|
.finalizeFunc = functionFinalize
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "concat",
|
.name = "concat",
|
||||||
|
@ -98,6 +188,8 @@ int32_t stubCheckAndGetResultType(SFunctionNode* pFunc) {
|
||||||
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[resType].bytes, .type = resType };
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[resType].bytes, .type = resType };
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FUNCTION_TYPE_FIRST:
|
||||||
|
case FUNCTION_TYPE_LAST:
|
||||||
case FUNCTION_TYPE_MIN:
|
case FUNCTION_TYPE_MIN:
|
||||||
case FUNCTION_TYPE_MAX: {
|
case FUNCTION_TYPE_MAX: {
|
||||||
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
|
|
@ -50,7 +50,7 @@ bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
|
|
||||||
static void doFinalizer(SResultRowEntryInfo* pResInfo) { cleanupResultRowEntry(pResInfo); }
|
static void doFinalizer(SResultRowEntryInfo* pResInfo) { cleanupResultRowEntry(pResInfo); }
|
||||||
|
|
||||||
void functionFinalizer(SqlFunctionCtx *pCtx) {
|
void functionFinalize(SqlFunctionCtx *pCtx) {
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
doFinalizer(pResInfo);
|
doFinalizer(pResInfo);
|
||||||
}
|
}
|
||||||
|
@ -68,13 +68,12 @@ void countFunction(SqlFunctionCtx *pCtx) {
|
||||||
int32_t numOfElem = 0;
|
int32_t numOfElem = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1. column data missing (schema modified) causes pCtx->hasNull == true. pCtx->isAggSet == true;
|
* 1. column data missing (schema modified) causes pInputCol->hasNull == true. pInput->colDataAggIsSet == true;
|
||||||
* 2. for general non-primary key columns, pCtx->hasNull may be true or false, pCtx->isAggSet == true;
|
* 2. for general non-primary key columns, pInputCol->hasNull may be true or false, pInput->colDataAggIsSet == true;
|
||||||
* 3. for primary key column, pCtx->hasNull always be false, pCtx->isAggSet == false;
|
* 3. for primary key column, pInputCol->hasNull always be false, pInput->colDataAggIsSet == false;
|
||||||
*/
|
*/
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
if (pInput->colDataAggIsSet && pInput->totalRows == pInput->numOfRows) {
|
if (pInput->colDataAggIsSet && pInput->totalRows == pInput->numOfRows) {
|
||||||
numOfElem = pInput->numOfRows - pInput->pColumnDataAgg[0]->numOfNull;
|
numOfElem = pInput->numOfRows - pInput->pColumnDataAgg[0]->numOfNull;
|
||||||
ASSERT(numOfElem >= 0);
|
ASSERT(numOfElem >= 0);
|
||||||
|
@ -169,7 +168,7 @@ void sumFunction(SqlFunctionCtx *pCtx) {
|
||||||
SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
|
SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getSumFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getSumFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
pEnv->calcMemSize = sizeof(SSumRes);
|
pEnv->calcMemSize = sizeof(SSumRes);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -261,8 +260,7 @@ bool minFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getMinmaxFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getMinmaxFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
SNode* pNode = nodesListGetNode(pFunc->pParameterList, 0);
|
|
||||||
pEnv->calcMemSize = sizeof(int64_t);
|
pEnv->calcMemSize = sizeof(int64_t);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -274,34 +272,34 @@ bool getMinmaxFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
do { \
|
do { \
|
||||||
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
|
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
|
||||||
SqlFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
|
SqlFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
|
||||||
__ctx->fpSet.process(__ctx); \
|
__ctx->fpSet.process(__ctx); \
|
||||||
} \
|
} \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
#define DO_UPDATE_SUBSID_RES(ctx, ts) \
|
#define DO_UPDATE_SUBSID_RES(ctx, ts) \
|
||||||
do { \
|
do { \
|
||||||
for (int32_t _i = 0; _i < (ctx)->subsidiaryRes.numOfCols; ++_i) { \
|
for (int32_t _i = 0; _i < (ctx)->subsidiaryRes.numOfCols; ++_i) { \
|
||||||
SqlFunctionCtx *__ctx = (ctx)->subsidiaryRes.pCtx[_i]; \
|
SqlFunctionCtx *__ctx = (ctx)->subsidiaryRes.pCtx[_i]; \
|
||||||
if (__ctx->functionId == FUNCTION_TS_DUMMY) { \
|
if (__ctx->functionId == FUNCTION_TS_DUMMY) { \
|
||||||
__ctx->tag.i = (ts); \
|
__ctx->tag.i = (ts); \
|
||||||
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
|
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
|
||||||
} \
|
} \
|
||||||
__ctx->fpSet.process(__ctx); \
|
__ctx->fpSet.process(__ctx); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define UPDATE_DATA(ctx, left, right, num, sign, _ts) \
|
#define UPDATE_DATA(ctx, left, right, num, sign, _ts) \
|
||||||
do { \
|
do { \
|
||||||
if (((left) < (right)) ^ (sign)) { \
|
if (((left) < (right)) ^ (sign)) { \
|
||||||
(left) = (right); \
|
(left) = (right); \
|
||||||
DO_UPDATE_SUBSID_RES(ctx, _ts); \
|
DO_UPDATE_SUBSID_RES(ctx, _ts); \
|
||||||
(num) += 1; \
|
(num) += 1; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define LOOPCHECK_N(val, _col, ctx, _t, _nrow, _start, sign, num) \
|
#define LOOPCHECK_N(val, _col, ctx, _t, _nrow, _start, sign, num) \
|
||||||
do { \
|
do { \
|
||||||
_t* d = (_t*)((_col)->pData); \
|
_t *d = (_t *)((_col)->pData); \
|
||||||
for (int32_t i = (_start); i < (_nrow) + (_start); ++i) { \
|
for (int32_t i = (_start); i < (_nrow) + (_start); ++i) { \
|
||||||
if (((_col)->hasNull) && colDataIsNull_f((_col)->nullbitmap, i)) { \
|
if (((_col)->hasNull) && colDataIsNull_f((_col)->nullbitmap, i)) { \
|
||||||
continue; \
|
continue; \
|
||||||
|
@ -441,4 +439,194 @@ void minFunction(SqlFunctionCtx *pCtx) {
|
||||||
void maxFunction(SqlFunctionCtx *pCtx) {
|
void maxFunction(SqlFunctionCtx *pCtx) {
|
||||||
int32_t numOfElems = doMinMaxHelper(pCtx, 0);
|
int32_t numOfElems = doMinMaxHelper(pCtx, 0);
|
||||||
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
|
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct STopBotRes {
|
||||||
|
int32_t num;
|
||||||
|
} STopBotRes;
|
||||||
|
|
||||||
|
bool getTopBotFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
SColumnNode* pColNode = (SColumnNode*) nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
int32_t bytes = pColNode->node.resType.bytes;
|
||||||
|
SValueNode* pkNode = (SValueNode*) nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct SStddevRes {
|
||||||
|
int64_t count;
|
||||||
|
union {double quadraticDSum; int64_t quadraticISum;};
|
||||||
|
union {double dsum; int64_t isum;};
|
||||||
|
} SStddevRes;
|
||||||
|
|
||||||
|
bool getStddevFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
pEnv->calcMemSize = sizeof(SStddevRes);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stddevFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
int32_t numOfElem = 0;
|
||||||
|
|
||||||
|
// Only the pre-computing information loaded and actual data does not loaded
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
SColumnDataAgg *pAgg = pInput->pColumnDataAgg[0];
|
||||||
|
int32_t type = pInput->pData[0]->info.type;
|
||||||
|
|
||||||
|
SStddevRes* pStddevRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
|
||||||
|
|
||||||
|
// } else { // computing based on the true data block
|
||||||
|
SColumnInfoData* pCol = pInput->pData[0];
|
||||||
|
|
||||||
|
int32_t start = pInput->startRowIndex;
|
||||||
|
int32_t numOfRows = pInput->numOfRows;
|
||||||
|
|
||||||
|
switch(type) {
|
||||||
|
case TSDB_DATA_TYPE_INT: {
|
||||||
|
int32_t* plist = (int32_t*)pCol->pData;
|
||||||
|
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pStddevRes->count += 1;
|
||||||
|
pStddevRes->isum += plist[i];
|
||||||
|
pStddevRes->quadraticISum += plist[i] * plist[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// data in the check operation are all null, not output
|
||||||
|
SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stddevFinalize(SqlFunctionCtx* pCtx) {
|
||||||
|
functionFinalize(pCtx);
|
||||||
|
|
||||||
|
SStddevRes* pStddevRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
|
||||||
|
double res = pStddevRes->quadraticISum/pStddevRes->count - (pStddevRes->isum / pStddevRes->count) * (pStddevRes->isum / pStddevRes->count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool getFirstLastFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
SColumnNode* pNode = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
pEnv->calcMemSize = pNode->node.resType.bytes;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO fix this
|
||||||
|
// This ordinary first function only handle the data block in ascending order
|
||||||
|
void firstFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
if (pCtx->order == TSDB_ORDER_DESC) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
|
||||||
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
|
// All null data column, return directly.
|
||||||
|
if (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows) {
|
||||||
|
ASSERT(pInputCol->hasNull == true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for the first not null data
|
||||||
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, NULL)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* data = colDataGetData(pInputCol, i);
|
||||||
|
memcpy(buf, data, pInputCol->info.bytes);
|
||||||
|
// TODO handle the subsidary value
|
||||||
|
// if (pCtx->ptsList != NULL) {
|
||||||
|
// TSKEY k = GET_TS_DATA(pCtx, i);
|
||||||
|
// DO_UPDATE_TAG_COLUMNS(pCtx, k);
|
||||||
|
// }
|
||||||
|
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
pResInfo->complete = true;
|
||||||
|
|
||||||
|
numOfElems++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_VAL(pResInfo, numOfElems, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lastFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
if (pCtx->order != TSDB_ORDER_DESC) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
|
||||||
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
|
// All null data column, return directly.
|
||||||
|
if (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows) {
|
||||||
|
ASSERT(pInputCol->hasNull == true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCtx->order == TSDB_ORDER_DESC) {
|
||||||
|
for (int32_t i = pInput->numOfRows + pInput->startRowIndex - 1; i >= pInput->startRowIndex; --i) {
|
||||||
|
if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, NULL)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* data = colDataGetData(pInputCol, i);
|
||||||
|
memcpy(buf, data, pInputCol->info.bytes);
|
||||||
|
|
||||||
|
// TSKEY ts = pCtx->ptsList ? GET_TS_DATA(pCtx, i) : 0;
|
||||||
|
// DO_UPDATE_TAG_COLUMNS(pCtx, ts);
|
||||||
|
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
pResInfo->complete = true; // set query completed on this column
|
||||||
|
numOfElems++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else { // ascending order
|
||||||
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, NULL)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* data = colDataGetData(pInputCol, i);
|
||||||
|
TSKEY ts = pCtx->ptsList ? GET_TS_DATA(pCtx, i) : 0;
|
||||||
|
|
||||||
|
if (pResInfo->hasResult != DATA_SET_FLAG || (*(TSKEY*)buf) < ts) {
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
memcpy(buf, data, pCtx->inputBytes);
|
||||||
|
|
||||||
|
*(TSKEY*)buf = ts;
|
||||||
|
// DO_UPDATE_TAG_COLUMNS(pCtx, ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElems++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_VAL(pResInfo, numOfElems, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void valFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
SColumnInfoData* pInputCol = pCtx->input.pData[0];
|
||||||
|
memcpy(buf, pInputCol->pData, pInputCol->info.bytes);
|
||||||
|
}
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
|
|
||||||
#define COPY_CHAR_POINT_FIELD(fldname) \
|
#define COPY_CHAR_POINT_FIELD(fldname) \
|
||||||
do { \
|
do { \
|
||||||
|
if (NULL == (pSrc)->fldname) { \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
(pDst)->fldname = strdup((pSrc)->fldname); \
|
(pDst)->fldname = strdup((pSrc)->fldname); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -108,6 +111,10 @@ static SNode* valueNodeCopy(const SValueNode* pSrc, SValueNode* pDst) {
|
||||||
exprNodeCopy((const SExprNode*)pSrc, (SExprNode*)pDst);
|
exprNodeCopy((const SExprNode*)pSrc, (SExprNode*)pDst);
|
||||||
COPY_CHAR_POINT_FIELD(literal);
|
COPY_CHAR_POINT_FIELD(literal);
|
||||||
COPY_SCALAR_FIELD(isDuration);
|
COPY_SCALAR_FIELD(isDuration);
|
||||||
|
COPY_SCALAR_FIELD(translate);
|
||||||
|
if (!pSrc->translate) {
|
||||||
|
return (SNode*)pDst;
|
||||||
|
}
|
||||||
switch (pSrc->node.resType.type) {
|
switch (pSrc->node.resType.type) {
|
||||||
case TSDB_DATA_TYPE_NULL:
|
case TSDB_DATA_TYPE_NULL:
|
||||||
break;
|
break;
|
||||||
|
@ -134,7 +141,12 @@ static SNode* valueNodeCopy(const SValueNode* pSrc, SValueNode* pDst) {
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
COPY_CHAR_POINT_FIELD(datum.p);
|
pDst->datum.p = malloc(pSrc->node.resType.bytes + VARSTR_HEADER_SIZE);
|
||||||
|
if (NULL == pDst->datum.p) {
|
||||||
|
nodesDestroyNode(pDst);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(pDst->datum.p, pSrc->datum.p, pSrc->node.resType.bytes + VARSTR_HEADER_SIZE);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
|
|
|
@ -110,6 +110,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "PhysiTableSeqScan";
|
return "PhysiTableSeqScan";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
return "PhysiSreamScan";
|
return "PhysiSreamScan";
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
|
return "PhysiSystemTableScan";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return "PhysiProject";
|
return "PhysiProject";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
|
@ -630,6 +632,87 @@ static int32_t jsonToPhysiStreamScanNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToPhysiScanNode(pJson, pObj);
|
return jsonToPhysiScanNode(pJson, pObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* jkEndPointFqdn = "Fqdn";
|
||||||
|
static const char* jkEndPointPort = "Port";
|
||||||
|
|
||||||
|
static int32_t epToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SEp* pNode = (const SEp*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tjsonAddStringToObject(pJson, jkEndPointFqdn, pNode->fqdn);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkEndPointPort, pNode->port);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToEp(const SJson* pJson, void* pObj) {
|
||||||
|
SEp* pNode = (SEp*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tjsonGetStringValue(pJson, jkEndPointFqdn, pNode->fqdn);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetSmallIntValue(pJson, jkEndPointPort, &pNode->port);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* jkEpSetInUse = "InUse";
|
||||||
|
static const char* jkEpSetNumOfEps = "NumOfEps";
|
||||||
|
static const char* jkEpSetEps = "Eps";
|
||||||
|
|
||||||
|
static int32_t epSetToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SEpSet* pNode = (const SEpSet*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tjsonAddIntegerToObject(pJson, jkEpSetInUse, pNode->inUse);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkEpSetNumOfEps, pNode->numOfEps);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddArray(pJson, jkEpSetEps, epToJson, pNode->eps, sizeof(SEp), pNode->numOfEps);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToEpSet(const SJson* pJson, void* pObj) {
|
||||||
|
SEpSet* pNode = (SEpSet*)pObj;
|
||||||
|
|
||||||
|
int32_t code = tjsonGetTinyIntValue(pJson, jkEpSetInUse, &pNode->inUse);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetTinyIntValue(pJson, jkEpSetNumOfEps, &pNode->numOfEps);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonToArray(pJson, jkEpSetEps, jsonToEp, pNode->eps, sizeof(SEp));
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* jkSysTableScanPhysiPlanMnodeEpSet = "MnodeEpSet";
|
||||||
|
|
||||||
|
static int32_t physiSysTableScanNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SSystemTableScanPhysiNode* pNode = (const SSystemTableScanPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = physiScanNodeToJson(pObj, pJson);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddObject(pJson, jkSysTableScanPhysiPlanMnodeEpSet, epSetToJson, &pNode->mgmtEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToPhysiSysTableScanNode(const SJson* pJson, void* pObj) {
|
||||||
|
SSystemTableScanPhysiNode* pNode = (SSystemTableScanPhysiNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToPhysiScanNode(pJson, pObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonToObject(pJson, jkSysTableScanPhysiPlanMnodeEpSet, jsonToEpSet, &pNode->mgmtEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkProjectPhysiPlanProjections = "Projections";
|
static const char* jkProjectPhysiPlanProjections = "Projections";
|
||||||
|
|
||||||
static int32_t physiProjectNodeToJson(const void* pObj, SJson* pJson) {
|
static int32_t physiProjectNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
@ -888,31 +971,6 @@ static int32_t jsonToSubplanId(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* jkEndPointFqdn = "Fqdn";
|
|
||||||
static const char* jkEndPointPort = "Port";
|
|
||||||
|
|
||||||
static int32_t epToJson(const void* pObj, SJson* pJson) {
|
|
||||||
const SEp* pNode = (const SEp*)pObj;
|
|
||||||
|
|
||||||
int32_t code = tjsonAddStringToObject(pJson, jkEndPointFqdn, pNode->fqdn);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonAddIntegerToObject(pJson, jkEndPointPort, pNode->port);
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t jsonToEp(const SJson* pJson, void* pObj) {
|
|
||||||
SEp* pNode = (SEp*)pObj;
|
|
||||||
|
|
||||||
int32_t code = tjsonGetStringValue(pJson, jkEndPointFqdn, pNode->fqdn);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonGetSmallIntValue(pJson, jkEndPointPort, &pNode->port);
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* jkQueryNodeAddrId = "Id";
|
static const char* jkQueryNodeAddrId = "Id";
|
||||||
static const char* jkQueryNodeAddrInUse = "InUse";
|
static const char* jkQueryNodeAddrInUse = "InUse";
|
||||||
static const char* jkQueryNodeAddrNumOfEps = "NumOfEps";
|
static const char* jkQueryNodeAddrNumOfEps = "NumOfEps";
|
||||||
|
@ -1244,7 +1302,7 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) {
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
code = tjsonAddStringToObject(pJson, jkValueDatum, pNode->datum.p);
|
code = tjsonAddStringToObject(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
|
@ -1306,9 +1364,16 @@ static int32_t jsonToDatum(const SJson* pJson, void* pObj) {
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY: {
|
||||||
code = tjsonDupStringValue(pJson, jkValueDatum, &pNode->datum.p);
|
pNode->datum.p = calloc(1, pNode->node.resType.bytes);
|
||||||
|
if (NULL == pNode->datum.p) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
varDataSetLen(pNode->datum.p, pNode->node.resType.bytes);
|
||||||
|
code = tjsonGetStringValue(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
case TSDB_DATA_TYPE_BLOB:
|
||||||
|
@ -1496,38 +1561,6 @@ static int32_t jsonToTableNode(const SJson* pJson, void* pObj) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* jkEpSetInUse = "InUse";
|
|
||||||
static const char* jkEpSetNumOfEps = "NumOfEps";
|
|
||||||
static const char* jkEpSetEps = "Eps";
|
|
||||||
|
|
||||||
static int32_t epSetToJson(const void* pObj, SJson* pJson) {
|
|
||||||
const SEpSet* pNode = (const SEpSet*)pObj;
|
|
||||||
|
|
||||||
int32_t code = tjsonAddIntegerToObject(pJson, jkEpSetInUse, pNode->inUse);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonAddIntegerToObject(pJson, jkEpSetNumOfEps, pNode->numOfEps);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonAddArray(pJson, jkEpSetEps, epToJson, pNode->eps, sizeof(SEp), pNode->numOfEps);
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t jsonToEpSet(const SJson* pJson, void* pObj) {
|
|
||||||
SEpSet* pNode = (SEpSet*)pObj;
|
|
||||||
|
|
||||||
int32_t code = tjsonGetTinyIntValue(pJson, jkEpSetInUse, &pNode->inUse);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonGetTinyIntValue(pJson, jkEpSetNumOfEps, &pNode->numOfEps);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tjsonToArray(pJson, jkEpSetEps, jsonToEp, pNode->eps, sizeof(SEp));
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* jkVgroupInfoVgId = "VgId";
|
static const char* jkVgroupInfoVgId = "VgId";
|
||||||
static const char* jkVgroupInfoHashBegin = "HashBegin";
|
static const char* jkVgroupInfoHashBegin = "HashBegin";
|
||||||
static const char* jkVgroupInfoHashEnd = "HashEnd";
|
static const char* jkVgroupInfoHashEnd = "HashEnd";
|
||||||
|
@ -2019,6 +2052,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return physiTableScanNodeToJson(pObj, pJson);
|
return physiTableScanNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
return physiStreamScanNodeToJson(pObj, pJson);
|
return physiStreamScanNodeToJson(pObj, pJson);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
|
return physiSysTableScanNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return physiProjectNodeToJson(pObj, pJson);
|
return physiProjectNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
|
@ -2102,8 +2137,10 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToPhysiTagScanNode(pJson, pObj);
|
return jsonToPhysiTagScanNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
return jsonToPhysiTableScanNode(pJson, pObj);
|
return jsonToPhysiTableScanNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
return jsonToPhysiStreamScanNode(pJson, pObj);
|
return jsonToPhysiStreamScanNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
|
return jsonToPhysiSysTableScanNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return jsonToPhysiProjectNode(pJson, pObj);
|
return jsonToPhysiProjectNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
|
|
|
@ -91,11 +91,9 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SCreateDatabaseStmt));
|
return makeNode(type, sizeof(SCreateDatabaseStmt));
|
||||||
case QUERY_NODE_DROP_DATABASE_STMT:
|
case QUERY_NODE_DROP_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SDropDatabaseStmt));
|
return makeNode(type, sizeof(SDropDatabaseStmt));
|
||||||
case QUERY_NODE_ALTER_DATABASE_STMT:
|
case QUERY_NODE_ALTER_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SAlterDatabaseStmt));
|
return makeNode(type, sizeof(SAlterDatabaseStmt));
|
||||||
case QUERY_NODE_SHOW_DATABASES_STMT:
|
|
||||||
return makeNode(type, sizeof(SShowStmt));
|
|
||||||
case QUERY_NODE_CREATE_TABLE_STMT:
|
case QUERY_NODE_CREATE_TABLE_STMT:
|
||||||
return makeNode(type, sizeof(SCreateTableStmt));
|
return makeNode(type, sizeof(SCreateTableStmt));
|
||||||
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
|
||||||
|
@ -108,17 +106,12 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SDropTableStmt));
|
return makeNode(type, sizeof(SDropTableStmt));
|
||||||
case QUERY_NODE_DROP_SUPER_TABLE_STMT:
|
case QUERY_NODE_DROP_SUPER_TABLE_STMT:
|
||||||
return makeNode(type, sizeof(SDropSuperTableStmt));
|
return makeNode(type, sizeof(SDropSuperTableStmt));
|
||||||
case QUERY_NODE_SHOW_TABLES_STMT:
|
|
||||||
case QUERY_NODE_SHOW_STABLES_STMT:
|
|
||||||
return makeNode(type, sizeof(SShowStmt));
|
|
||||||
case QUERY_NODE_CREATE_USER_STMT:
|
case QUERY_NODE_CREATE_USER_STMT:
|
||||||
return makeNode(type, sizeof(SCreateUserStmt));
|
return makeNode(type, sizeof(SCreateUserStmt));
|
||||||
case QUERY_NODE_ALTER_USER_STMT:
|
case QUERY_NODE_ALTER_USER_STMT:
|
||||||
return makeNode(type, sizeof(SAlterUserStmt));
|
return makeNode(type, sizeof(SAlterUserStmt));
|
||||||
case QUERY_NODE_DROP_USER_STMT:
|
case QUERY_NODE_DROP_USER_STMT:
|
||||||
return makeNode(type, sizeof(SDropUserStmt));
|
return makeNode(type, sizeof(SDropUserStmt));
|
||||||
case QUERY_NODE_SHOW_USERS_STMT:
|
|
||||||
return makeNode(type, sizeof(SShowStmt));
|
|
||||||
case QUERY_NODE_USE_DATABASE_STMT:
|
case QUERY_NODE_USE_DATABASE_STMT:
|
||||||
return makeNode(type, sizeof(SUseDatabaseStmt));
|
return makeNode(type, sizeof(SUseDatabaseStmt));
|
||||||
case QUERY_NODE_CREATE_DNODE_STMT:
|
case QUERY_NODE_CREATE_DNODE_STMT:
|
||||||
|
@ -127,12 +120,6 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SDropDnodeStmt));
|
return makeNode(type, sizeof(SDropDnodeStmt));
|
||||||
case QUERY_NODE_ALTER_DNODE_STMT:
|
case QUERY_NODE_ALTER_DNODE_STMT:
|
||||||
return makeNode(type, sizeof(SAlterDnodeStmt));
|
return makeNode(type, sizeof(SAlterDnodeStmt));
|
||||||
case QUERY_NODE_SHOW_DNODES_STMT:
|
|
||||||
return makeNode(type, sizeof(SShowStmt));
|
|
||||||
case QUERY_NODE_SHOW_VGROUPS_STMT:
|
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
|
||||||
return makeNode(type, sizeof(SShowStmt));
|
|
||||||
case QUERY_NODE_CREATE_INDEX_STMT:
|
case QUERY_NODE_CREATE_INDEX_STMT:
|
||||||
return makeNode(type, sizeof(SCreateIndexStmt));
|
return makeNode(type, sizeof(SCreateIndexStmt));
|
||||||
case QUERY_NODE_DROP_INDEX_STMT:
|
case QUERY_NODE_DROP_INDEX_STMT:
|
||||||
|
@ -145,6 +132,19 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SCreateTopicStmt));
|
return makeNode(type, sizeof(SCreateTopicStmt));
|
||||||
case QUERY_NODE_DROP_TOPIC_STMT:
|
case QUERY_NODE_DROP_TOPIC_STMT:
|
||||||
return makeNode(type, sizeof(SDropTopicStmt));
|
return makeNode(type, sizeof(SDropTopicStmt));
|
||||||
|
case QUERY_NODE_SHOW_DATABASES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_TABLES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_STABLES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_USERS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_VGROUPS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_MODULES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_FUNCTIONS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_INDEXES_STMT:
|
||||||
|
case QUERY_NODE_SHOW_STREAMS_STMT:
|
||||||
|
return makeNode(type, sizeof(SShowStmt));
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
||||||
return makeNode(type, sizeof(SScanLogicNode));
|
return makeNode(type, sizeof(SScanLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
||||||
|
@ -171,6 +171,8 @@ SNodeptr nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(STableSeqScanPhysiNode));
|
return makeNode(type, sizeof(STableSeqScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
return makeNode(type, sizeof(SStreamScanPhysiNode));
|
return makeNode(type, sizeof(SStreamScanPhysiNode));
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
|
return makeNode(type, sizeof(SSystemTableScanPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
return makeNode(type, sizeof(SProjectPhysiNode));
|
return makeNode(type, sizeof(SProjectPhysiNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
|
|
|
@ -84,9 +84,10 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode);
|
||||||
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode);
|
SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode);
|
||||||
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode);
|
SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode);
|
||||||
|
|
||||||
SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableAlias, const SToken* pColumnName);
|
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName);
|
||||||
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral);
|
||||||
SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral);
|
SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral);
|
||||||
|
SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt);
|
||||||
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias);
|
SNode* setProjectionAlias(SAstCreateContext* pCxt, SNode* pNode, const SToken* pAlias);
|
||||||
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2);
|
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2);
|
||||||
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight);
|
SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pLeft, SNode* pRight);
|
||||||
|
@ -94,7 +95,7 @@ SNode* createBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNo
|
||||||
SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight);
|
SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight);
|
||||||
SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNodeList* pParameterList);
|
SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNodeList* pParameterList);
|
||||||
SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList);
|
SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList);
|
||||||
SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName, const SToken* pTableAlias);
|
SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pTableAlias);
|
||||||
SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const SToken* pTableAlias);
|
SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, const SToken* pTableAlias);
|
||||||
SNode* createJoinTableNode(SAstCreateContext* pCxt, EJoinType type, SNode* pLeft, SNode* pRight, SNode* pJoinCond);
|
SNode* createJoinTableNode(SAstCreateContext* pCxt, EJoinType type, SNode* pLeft, SNode* pRight, SNode* pJoinCond);
|
||||||
SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset);
|
SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset);
|
||||||
|
@ -119,9 +120,9 @@ SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode*
|
||||||
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt);
|
SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt);
|
||||||
SNode* createDefaultAlterDatabaseOptions(SAstCreateContext* pCxt);
|
SNode* createDefaultAlterDatabaseOptions(SAstCreateContext* pCxt);
|
||||||
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, const SToken* pVal);
|
SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOptionType type, const SToken* pVal);
|
||||||
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pDbName, SNode* pOptions);
|
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* pDbName, SNode* pOptions);
|
||||||
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pDbName);
|
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pDbName);
|
||||||
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName, SNode* pOptions);
|
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pOptions);
|
||||||
SNode* createDefaultTableOptions(SAstCreateContext* pCxt);
|
SNode* createDefaultTableOptions(SAstCreateContext* pCxt);
|
||||||
SNode* createDefaultAlterTableOptions(SAstCreateContext* pCxt);
|
SNode* createDefaultAlterTableOptions(SAstCreateContext* pCxt);
|
||||||
SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, const SToken* pVal);
|
SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType type, const SToken* pVal);
|
||||||
|
@ -141,17 +142,17 @@ SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable,
|
||||||
SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName);
|
SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pColName);
|
||||||
SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pOldColName, const SToken* pNewColName);
|
SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_t alterType, const SToken* pOldColName, const SToken* pNewColName);
|
||||||
SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, const SToken* pTagName, SNode* pVal);
|
SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, const SToken* pTagName, SNode* pVal);
|
||||||
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName);
|
||||||
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDbName);
|
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbNamePattern);
|
||||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, const SToken* pPassword);
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword);
|
||||||
SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int8_t alterType, const SToken* pVal);
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal);
|
||||||
SNode* createDropUserStmt(SAstCreateContext* pCxt, const SToken* pUserName);
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName);
|
||||||
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort);
|
SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort);
|
||||||
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode);
|
SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode);
|
||||||
SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig, const SToken* pValue);
|
SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig, const SToken* pValue);
|
||||||
SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, const SToken* pIndexName, const SToken* pTableName, SNodeList* pCols, SNode* pOptions);
|
SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, SToken* pIndexName, SToken* pTableName, SNodeList* pCols, SNode* pOptions);
|
||||||
SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInterval, SNode* pOffset, SNode* pSliding);
|
SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInterval, SNode* pOffset, SNode* pSliding);
|
||||||
SNode* createDropIndexStmt(SAstCreateContext* pCxt, const SToken* pIndexName, const SToken* pTableName);
|
SNode* createDropIndexStmt(SAstCreateContext* pCxt, SToken* pIndexName, SToken* pTableName);
|
||||||
SNode* createCreateQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId);
|
SNode* createCreateQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId);
|
||||||
SNode* createDropQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId);
|
SNode* createDropQnodeStmt(SAstCreateContext* pCxt, const SToken* pDnodeId);
|
||||||
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery, const SToken* pSubscribeDbName);
|
SNode* createCreateTopicStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pTopicName, SNode* pQuery, const SToken* pSubscribeDbName);
|
||||||
|
|
|
@ -78,6 +78,8 @@ typedef struct STableDataBlocks {
|
||||||
char *pData;
|
char *pData;
|
||||||
bool cloned;
|
bool cloned;
|
||||||
STagData tagData;
|
STagData tagData;
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
|
||||||
SParsedDataColInfo boundColumnInfo;
|
SParsedDataColInfo boundColumnInfo;
|
||||||
SRowBuilder rowBuilder;
|
SRowBuilder rowBuilder;
|
||||||
|
@ -115,10 +117,10 @@ static FORCE_INLINE void getMemRowAppendInfo(SSchema *pSchema, uint8_t rowType,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t setBlockInfo(SSubmitBlk *pBlocks, const STableMeta *pTableMeta, int32_t numOfRows) {
|
static FORCE_INLINE int32_t setBlockInfo(SSubmitBlk *pBlocks, STableDataBlocks* dataBuf, int32_t numOfRows) {
|
||||||
pBlocks->tid = pTableMeta->suid;
|
pBlocks->tid = dataBuf->pTableMeta->suid;
|
||||||
pBlocks->uid = pTableMeta->uid;
|
pBlocks->uid = dataBuf->pTableMeta->uid;
|
||||||
pBlocks->sversion = pTableMeta->sversion;
|
pBlocks->sversion = dataBuf->pTableMeta->sversion;
|
||||||
|
|
||||||
if (pBlocks->numOfRows + numOfRows >= INT16_MAX) {
|
if (pBlocks->numOfRows + numOfRows >= INT16_MAX) {
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
|
|
|
@ -23,6 +23,13 @@ extern "C" {
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
|
|
||||||
|
#define parserFatal(param, ...) qFatal("PARSER: " param, __VA_ARGS__)
|
||||||
|
#define parserError(param, ...) qError("PARSER: " param, __VA_ARGS__)
|
||||||
|
#define parserWarn(param, ...) qWarn("PARSER: " param, __VA_ARGS__)
|
||||||
|
#define parserInfo(param, ...) qInfo("PARSER: " param, __VA_ARGS__)
|
||||||
|
#define parserDebug(param, ...) qDebug("PARSER: " param, __VA_ARGS__)
|
||||||
|
#define parserTrace(param, ...) qTrace("PARSER: " param, __VA_ARGS__)
|
||||||
|
|
||||||
typedef struct SMsgBuf {
|
typedef struct SMsgBuf {
|
||||||
int32_t len;
|
int32_t len;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
|
@ -83,14 +83,12 @@ cmd ::= CREATE USER user_name(A) PASS NK_STRING(B).
|
||||||
cmd ::= ALTER USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PASSWD, &B); }
|
cmd ::= ALTER USER user_name(A) PASS NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PASSWD, &B); }
|
||||||
cmd ::= ALTER USER user_name(A) PRIVILEGE NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PRIVILEGES, &B); }
|
cmd ::= ALTER USER user_name(A) PRIVILEGE NK_STRING(B). { pCxt->pRootNode = createAlterUserStmt(pCxt, &A, TSDB_ALTER_USER_PRIVILEGES, &B); }
|
||||||
cmd ::= DROP USER user_name(A). { pCxt->pRootNode = createDropUserStmt(pCxt, &A); }
|
cmd ::= DROP USER user_name(A). { pCxt->pRootNode = createDropUserStmt(pCxt, &A); }
|
||||||
cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT, NULL); }
|
|
||||||
|
|
||||||
/************************************************ create/drop/alter/show dnode ****************************************/
|
/************************************************ create/drop/alter/show dnode ****************************************/
|
||||||
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
||||||
cmd ::= CREATE DNODE dnode_host_name(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B); }
|
cmd ::= CREATE DNODE dnode_host_name(A) PORT NK_INTEGER(B). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, &B); }
|
||||||
cmd ::= DROP DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); }
|
cmd ::= DROP DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); }
|
||||||
cmd ::= DROP DNODE dnode_endpoint(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); }
|
cmd ::= DROP DNODE dnode_endpoint(A). { pCxt->pRootNode = createDropDnodeStmt(pCxt, &A); }
|
||||||
cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT, NULL); }
|
|
||||||
cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, NULL); }
|
cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, NULL); }
|
||||||
cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B) NK_STRING(C). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, &C); }
|
cmd ::= ALTER DNODE NK_INTEGER(A) NK_STRING(B) NK_STRING(C). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &A, &B, &C); }
|
||||||
cmd ::= ALTER ALL DNODES NK_STRING(A). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &A, NULL); }
|
cmd ::= ALTER ALL DNODES NK_STRING(A). { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &A, NULL); }
|
||||||
|
@ -112,12 +110,10 @@ cmd ::= ALTER LOCAL NK_STRING(A) NK_STRING(B).
|
||||||
/************************************************ create/drop qnode ***************************************************/
|
/************************************************ create/drop qnode ***************************************************/
|
||||||
cmd ::= CREATE QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createCreateQnodeStmt(pCxt, &A); }
|
cmd ::= CREATE QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createCreateQnodeStmt(pCxt, &A); }
|
||||||
cmd ::= DROP QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropQnodeStmt(pCxt, &A); }
|
cmd ::= DROP QNODE ON DNODE NK_INTEGER(A). { pCxt->pRootNode = createDropQnodeStmt(pCxt, &A); }
|
||||||
cmd ::= SHOW QNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT, NULL); }
|
|
||||||
|
|
||||||
/************************************************ create/drop/show/use database ***************************************/
|
/************************************************ create/drop/show/use database ***************************************/
|
||||||
cmd ::= CREATE DATABASE not_exists_opt(A) db_name(B) db_options(C). { pCxt->pRootNode = createCreateDatabaseStmt(pCxt, A, &B, C); }
|
cmd ::= CREATE DATABASE not_exists_opt(A) db_name(B) db_options(C). { pCxt->pRootNode = createCreateDatabaseStmt(pCxt, A, &B, C); }
|
||||||
cmd ::= DROP DATABASE exists_opt(A) db_name(B). { pCxt->pRootNode = createDropDatabaseStmt(pCxt, A, &B); }
|
cmd ::= DROP DATABASE exists_opt(A) db_name(B). { pCxt->pRootNode = createDropDatabaseStmt(pCxt, A, &B); }
|
||||||
cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT, NULL); }
|
|
||||||
cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A); }
|
cmd ::= USE db_name(A). { pCxt->pRootNode = createUseDatabaseStmt(pCxt, &A); }
|
||||||
cmd ::= ALTER DATABASE db_name(A) alter_db_options(B). { pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &A, B); }
|
cmd ::= ALTER DATABASE db_name(A) alter_db_options(B). { pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &A, B); }
|
||||||
|
|
||||||
|
@ -164,7 +160,7 @@ alter_db_option(A) ::= WAL NK_INTEGER(B).
|
||||||
alter_db_option(A) ::= QUORUM NK_INTEGER(B). { A.type = DB_OPTION_QUORUM; A.val = B; }
|
alter_db_option(A) ::= QUORUM NK_INTEGER(B). { A.type = DB_OPTION_QUORUM; A.val = B; }
|
||||||
alter_db_option(A) ::= CACHELAST NK_INTEGER(B). { A.type = DB_OPTION_CACHELAST; A.val = B; }
|
alter_db_option(A) ::= CACHELAST NK_INTEGER(B). { A.type = DB_OPTION_CACHELAST; A.val = B; }
|
||||||
|
|
||||||
/************************************************ create/drop/show table/stable ***************************************/
|
/************************************************ create/drop table/stable ********************************************/
|
||||||
cmd ::= CREATE TABLE not_exists_opt(A) full_table_name(B)
|
cmd ::= CREATE TABLE not_exists_opt(A) full_table_name(B)
|
||||||
NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); }
|
NK_LP column_def_list(C) NK_RP tags_def_opt(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); }
|
||||||
cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A); }
|
cmd ::= CREATE TABLE multi_create_clause(A). { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, A); }
|
||||||
|
@ -172,8 +168,6 @@ cmd ::= CREATE STABLE not_exists_opt(A) full_table_name(B)
|
||||||
NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); }
|
NK_LP column_def_list(C) NK_RP tags_def(D) table_options(E). { pCxt->pRootNode = createCreateTableStmt(pCxt, A, B, C, D, E); }
|
||||||
cmd ::= DROP TABLE multi_drop_clause(A). { pCxt->pRootNode = createDropTableStmt(pCxt, A); }
|
cmd ::= DROP TABLE multi_drop_clause(A). { pCxt->pRootNode = createDropTableStmt(pCxt, A); }
|
||||||
cmd ::= DROP STABLE exists_opt(A) full_table_name(B). { pCxt->pRootNode = createDropSuperTableStmt(pCxt, A, B); }
|
cmd ::= DROP STABLE exists_opt(A) full_table_name(B). { pCxt->pRootNode = createDropSuperTableStmt(pCxt, A, B); }
|
||||||
cmd ::= SHOW TABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT, NULL); }
|
|
||||||
cmd ::= SHOW STABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STABLES_STMT, NULL); }
|
|
||||||
|
|
||||||
cmd ::= ALTER TABLE alter_table_clause(A). { pCxt->pRootNode = A; }
|
cmd ::= ALTER TABLE alter_table_clause(A). { pCxt->pRootNode = A; }
|
||||||
cmd ::= ALTER STABLE alter_table_clause(A). { pCxt->pRootNode = A; }
|
cmd ::= ALTER STABLE alter_table_clause(A). { pCxt->pRootNode = A; }
|
||||||
|
@ -286,6 +280,31 @@ col_name_list(A) ::= col_name_list(B) NK_COMMA col_name(C).
|
||||||
|
|
||||||
col_name(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
|
col_name(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
|
||||||
|
|
||||||
|
/************************************************ show ****************************************************************/
|
||||||
|
cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW db_name_cond_opt(A) TABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TABLES_STMT, A, B); }
|
||||||
|
cmd ::= SHOW db_name_cond_opt(A) STABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STABLES_STMT, A, B); }
|
||||||
|
cmd ::= SHOW db_name_cond_opt(A) VGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, A, NULL); }
|
||||||
|
cmd ::= SHOW MNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW MODULES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW QNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW FUNCTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT, NULL, NULL); }
|
||||||
|
cmd ::= SHOW INDEXES FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, A, B); }
|
||||||
|
cmd ::= SHOW STREAMS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); }
|
||||||
|
|
||||||
|
db_name_cond_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
|
||||||
|
db_name_cond_opt(A) ::= db_name(B) NK_DOT. { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
|
like_pattern_opt(A) ::= . { A = NULL; }
|
||||||
|
like_pattern_opt(A) ::= LIKE NK_STRING(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
|
table_name_cond(A) ::= table_name(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
|
from_db_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
|
||||||
|
from_db_opt(A) ::= FROM db_name(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
|
||||||
%type func_name_list { SNodeList* }
|
%type func_name_list { SNodeList* }
|
||||||
%destructor func_name_list { nodesDestroyList($$); }
|
%destructor func_name_list { nodesDestroyList($$); }
|
||||||
func_name_list(A) ::= func_name(B). { A = createNodeList(pCxt, B); }
|
func_name_list(A) ::= func_name(B). { A = createNodeList(pCxt, B); }
|
||||||
|
@ -317,13 +336,6 @@ cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) AS query_expression(C).
|
||||||
cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) AS db_name(C). { pCxt->pRootNode = createCreateTopicStmt(pCxt, A, &B, NULL, &C); }
|
cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) AS db_name(C). { pCxt->pRootNode = createCreateTopicStmt(pCxt, A, &B, NULL, &C); }
|
||||||
cmd ::= DROP TOPIC exists_opt(A) topic_name(B). { pCxt->pRootNode = createDropTopicStmt(pCxt, A, &B); }
|
cmd ::= DROP TOPIC exists_opt(A) topic_name(B). { pCxt->pRootNode = createDropTopicStmt(pCxt, A, &B); }
|
||||||
|
|
||||||
/************************************************ show vgroups ********************************************************/
|
|
||||||
cmd ::= SHOW VGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, NULL); }
|
|
||||||
cmd ::= SHOW db_name(B) NK_DOT VGROUPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, &B); }
|
|
||||||
|
|
||||||
/************************************************ show mnodes *********************************************************/
|
|
||||||
cmd ::= SHOW MNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT, NULL); }
|
|
||||||
|
|
||||||
/************************************************ select **************************************************************/
|
/************************************************ select **************************************************************/
|
||||||
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
||||||
|
|
||||||
|
@ -337,10 +349,31 @@ literal(A) ::= duration_literal(B).
|
||||||
|
|
||||||
duration_literal(A) ::= NK_VARIABLE(B). { A = createRawExprNode(pCxt, &B, createDurationValueNode(pCxt, &B)); }
|
duration_literal(A) ::= NK_VARIABLE(B). { A = createRawExprNode(pCxt, &B, createDurationValueNode(pCxt, &B)); }
|
||||||
|
|
||||||
|
signed(A) ::= NK_INTEGER(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &B); }
|
||||||
|
signed(A) ::= NK_PLUS NK_INTEGER(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &B); }
|
||||||
|
signed(A) ::= NK_MINUS(B) NK_INTEGER(C). {
|
||||||
|
SToken t = B;
|
||||||
|
t.n = (C.z + C.n) - B.z;
|
||||||
|
A = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t);
|
||||||
|
}
|
||||||
|
signed(A) ::= NK_FLOAT(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &B); }
|
||||||
|
signed(A) ::= NK_PLUS NK_FLOAT(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &B); }
|
||||||
|
signed(A) ::= NK_MINUS(B) NK_FLOAT(C). {
|
||||||
|
SToken t = B;
|
||||||
|
t.n = (C.z + C.n) - B.z;
|
||||||
|
A = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t);
|
||||||
|
}
|
||||||
|
|
||||||
|
signed_literal(A) ::= signed(B). { A = B; }
|
||||||
|
signed_literal(A) ::= NK_STRING(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &B); }
|
||||||
|
signed_literal(A) ::= NK_BOOL(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &B); }
|
||||||
|
signed_literal(A) ::= TIMESTAMP NK_STRING(B). { A = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &B); }
|
||||||
|
signed_literal(A) ::= duration_literal(B). { A = releaseRawExprNode(pCxt, B); }
|
||||||
|
|
||||||
%type literal_list { SNodeList* }
|
%type literal_list { SNodeList* }
|
||||||
%destructor literal_list { nodesDestroyList($$); }
|
%destructor literal_list { nodesDestroyList($$); }
|
||||||
literal_list(A) ::= literal(B). { A = createNodeList(pCxt, releaseRawExprNode(pCxt, B)); }
|
literal_list(A) ::= signed_literal(B). { A = createNodeList(pCxt, B); }
|
||||||
literal_list(A) ::= literal_list(B) NK_COMMA literal(C). { A = addNodeToList(pCxt, B, releaseRawExprNode(pCxt, C)); }
|
literal_list(A) ::= literal_list(B) NK_COMMA signed_literal(C). { A = addNodeToList(pCxt, B, C); }
|
||||||
|
|
||||||
/************************************************ names and identifiers ***********************************************/
|
/************************************************ names and identifiers ***********************************************/
|
||||||
%type db_name { SToken }
|
%type db_name { SToken }
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
do { \
|
do { \
|
||||||
if (NULL == (p)) { \
|
if (NULL == (p)) { \
|
||||||
pCxt->valid = false; \
|
pCxt->valid = false; \
|
||||||
|
snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "Out of memory"); \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -330,113 +331,132 @@ void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt) {
|
||||||
initSetTableOptionFp();
|
initSetTableOptionFp();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkUserName(SAstCreateContext* pCxt, const SToken* pUserName) {
|
static void trimEscape(SToken* pName) {
|
||||||
|
if (NULL != pName && pName->n > 1 && '`' == pName->z[0]) {
|
||||||
|
pName->z += 1;
|
||||||
|
pName->n -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool checkUserName(SAstCreateContext* pCxt, SToken* pUserName) {
|
||||||
if (NULL == pUserName) {
|
if (NULL == pUserName) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (pUserName->n >= TSDB_USER_LEN) {
|
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
|
} else {
|
||||||
|
if (pUserName->n >= TSDB_USER_LEN) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
trimEscape(pUserName);
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkPassword(SAstCreateContext* pCxt, const SToken* pPasswordToken, char* pPassword) {
|
static bool checkPassword(SAstCreateContext* pCxt, const SToken* pPasswordToken, char* pPassword) {
|
||||||
if (NULL == pPasswordToken) {
|
if (NULL == pPasswordToken) {
|
||||||
return false;
|
pCxt->valid = false;
|
||||||
}
|
} else if (pPasswordToken->n >= (TSDB_USET_PASSWORD_LEN - 2)) {
|
||||||
if (pPasswordToken->n >= (TSDB_USET_PASSWORD_LEN - 2)) {
|
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
return false;
|
} else {
|
||||||
}
|
strncpy(pPassword, pPasswordToken->z, pPasswordToken->n);
|
||||||
strncpy(pPassword, pPasswordToken->z, pPasswordToken->n);
|
strdequote(pPassword);
|
||||||
strdequote(pPassword);
|
if (strtrim(pPassword) <= 0) {
|
||||||
if (strtrim(pPassword) <= 0) {
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_PASSWD_EMPTY);
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_PASSWD_EMPTY);
|
pCxt->valid = false;
|
||||||
pCxt->valid = false;
|
}
|
||||||
}
|
}
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkAndSplitEndpoint(SAstCreateContext* pCxt, const SToken* pEp, char* pFqdn, int32_t* pPort) {
|
static bool checkAndSplitEndpoint(SAstCreateContext* pCxt, const SToken* pEp, char* pFqdn, int32_t* pPort) {
|
||||||
if (NULL == pEp) {
|
if (NULL == pEp) {
|
||||||
return false;
|
pCxt->valid = false;
|
||||||
}
|
} else if (pEp->n >= TSDB_FQDN_LEN + 2 + 6) { // format 'fqdn:port'
|
||||||
if (pEp->n >= TSDB_FQDN_LEN + 2 + 6) { // format 'fqdn:port'
|
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
}
|
} else {
|
||||||
char ep[TSDB_FQDN_LEN + 2 + 6];
|
char ep[TSDB_FQDN_LEN + 2 + 6];
|
||||||
strncpy(ep, pEp->z, pEp->n);
|
strncpy(ep, pEp->z, pEp->n);
|
||||||
strdequote(ep);
|
strdequote(ep);
|
||||||
strtrim(ep);
|
strtrim(ep);
|
||||||
char* pColon = strchr(ep, ':');
|
char* pColon = strchr(ep, ':');
|
||||||
if (NULL == pColon) {
|
if (NULL == pColon) {
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ENDPOINT);
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ENDPOINT);
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
}
|
} else {
|
||||||
strncpy(pFqdn, ep, pColon - ep);
|
strncpy(pFqdn, ep, pColon - ep);
|
||||||
*pPort = strtol(pColon + 1, NULL, 10);
|
*pPort = strtol(pColon + 1, NULL, 10);
|
||||||
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkFqdn(SAstCreateContext* pCxt, const SToken* pFqdn) {
|
static bool checkFqdn(SAstCreateContext* pCxt, const SToken* pFqdn) {
|
||||||
if (NULL == pFqdn) {
|
if (NULL == pFqdn) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (pFqdn->n >= TSDB_FQDN_LEN) {
|
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
|
} else {
|
||||||
|
if (pFqdn->n >= TSDB_FQDN_LEN) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkPort(SAstCreateContext* pCxt, const SToken* pPortToken, int32_t* pPort) {
|
static bool checkPort(SAstCreateContext* pCxt, const SToken* pPortToken, int32_t* pPort) {
|
||||||
if (NULL == pPortToken) {
|
if (NULL == pPortToken) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*pPort = strtol(pPortToken->z, NULL, 10);
|
|
||||||
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
|
||||||
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
|
||||||
pCxt->valid = false;
|
pCxt->valid = false;
|
||||||
|
} else {
|
||||||
|
*pPort = strtol(pPortToken->z, NULL, 10);
|
||||||
|
if (*pPort >= UINT16_MAX || *pPort <= 0) {
|
||||||
|
generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_PORT);
|
||||||
|
pCxt->valid = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkDbName(SAstCreateContext* pCxt, const SToken* pDbName) {
|
static bool checkDbName(SAstCreateContext* pCxt, SToken* pDbName, bool query) {
|
||||||
if (NULL == pDbName) {
|
if (NULL == pDbName) {
|
||||||
return true;
|
pCxt->valid = (query ? NULL != pCxt->pQueryCxt->db : true);
|
||||||
|
} else {
|
||||||
|
pCxt->valid = pDbName->n < TSDB_DB_NAME_LEN ? true : false;
|
||||||
}
|
}
|
||||||
pCxt->valid = pDbName->n < TSDB_DB_NAME_LEN ? true : false;
|
trimEscape(pDbName);
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkTableName(SAstCreateContext* pCxt, const SToken* pTableName) {
|
static bool checkTableName(SAstCreateContext* pCxt, SToken* pTableName) {
|
||||||
if (NULL == pTableName) {
|
if (NULL == pTableName) {
|
||||||
return true;
|
pCxt->valid = true;
|
||||||
|
} else {
|
||||||
|
pCxt->valid = pTableName->n < TSDB_TABLE_NAME_LEN ? true : false;
|
||||||
}
|
}
|
||||||
pCxt->valid = pTableName->n < TSDB_TABLE_NAME_LEN ? true : false;
|
trimEscape(pTableName);
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkColumnName(SAstCreateContext* pCxt, const SToken* pColumnName) {
|
static bool checkColumnName(SAstCreateContext* pCxt, SToken* pColumnName) {
|
||||||
if (NULL == pColumnName) {
|
if (NULL == pColumnName) {
|
||||||
return true;
|
pCxt->valid = true;
|
||||||
|
} else {
|
||||||
|
pCxt->valid = pColumnName->n < TSDB_COL_NAME_LEN ? true : false;
|
||||||
}
|
}
|
||||||
pCxt->valid = pColumnName->n < TSDB_COL_NAME_LEN ? true : false;
|
trimEscape(pColumnName);
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkIndexName(SAstCreateContext* pCxt, const SToken* pIndexName) {
|
static bool checkIndexName(SAstCreateContext* pCxt, SToken* pIndexName) {
|
||||||
if (NULL == pIndexName) {
|
if (NULL == pIndexName) {
|
||||||
return false;
|
pCxt->valid = false;
|
||||||
|
} else {
|
||||||
|
pCxt->valid = pIndexName->n < TSDB_INDEX_NAME_LEN ? true : false;
|
||||||
}
|
}
|
||||||
pCxt->valid = pIndexName->n < TSDB_INDEX_NAME_LEN ? true : false;
|
trimEscape(pIndexName);
|
||||||
return pCxt->valid;
|
return pCxt->valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,7 +511,7 @@ SNodeList* addNodeToList(SAstCreateContext* pCxt, SNodeList* pList, SNode* pNode
|
||||||
return pList;
|
return pList;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createColumnNode(SAstCreateContext* pCxt, const SToken* pTableAlias, const SToken* pColumnName) {
|
SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pColumnName) {
|
||||||
if (!checkTableName(pCxt, pTableAlias) || !checkColumnName(pCxt, pColumnName)) {
|
if (!checkTableName(pCxt, pTableAlias) || !checkColumnName(pCxt, pColumnName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -508,9 +528,12 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken*
|
||||||
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
CHECK_OUT_OF_MEM(val);
|
CHECK_OUT_OF_MEM(val);
|
||||||
val->literal = strndup(pLiteral->z, pLiteral->n);
|
val->literal = strndup(pLiteral->z, pLiteral->n);
|
||||||
|
if (TK_NK_ID != pLiteral->type && (IS_VAR_DATA_TYPE(dataType) || TSDB_DATA_TYPE_TIMESTAMP == dataType)) {
|
||||||
|
trimString(pLiteral->z, pLiteral->n, val->literal, pLiteral->n);
|
||||||
|
}
|
||||||
CHECK_OUT_OF_MEM(val->literal);
|
CHECK_OUT_OF_MEM(val->literal);
|
||||||
val->node.resType.type = dataType;
|
val->node.resType.type = dataType;
|
||||||
val->node.resType.bytes = tDataTypes[dataType].bytes;
|
val->node.resType.bytes = IS_VAR_DATA_TYPE(dataType) ? strlen(val->literal) : tDataTypes[dataType].bytes;
|
||||||
if (TSDB_DATA_TYPE_TIMESTAMP == dataType) {
|
if (TSDB_DATA_TYPE_TIMESTAMP == dataType) {
|
||||||
val->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
val->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
||||||
}
|
}
|
||||||
|
@ -532,6 +555,23 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral)
|
||||||
return (SNode*)val;
|
return (SNode*)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) {
|
||||||
|
if (NULL == pCxt->pQueryCxt->db) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
|
CHECK_OUT_OF_MEM(val);
|
||||||
|
val->literal = strdup(pCxt->pQueryCxt->db);
|
||||||
|
CHECK_OUT_OF_MEM(val->literal);
|
||||||
|
val->isDuration = false;
|
||||||
|
val->translate = false;
|
||||||
|
val->node.resType.type = TSDB_DATA_TYPE_BINARY;
|
||||||
|
val->node.resType.bytes = strlen(val->literal);
|
||||||
|
val->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
||||||
|
return (SNode*)val;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) {
|
SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) {
|
||||||
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
CHECK_OUT_OF_MEM(cond);
|
CHECK_OUT_OF_MEM(cond);
|
||||||
|
@ -576,8 +616,8 @@ SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) {
|
||||||
return (SNode*)list;
|
return (SNode*)list;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const SToken* pTableName, const SToken* pTableAlias) {
|
SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTableName, SToken* pTableAlias) {
|
||||||
if (!checkDbName(pCxt, pDbName) || !checkTableName(pCxt, pTableName)) {
|
if (!checkDbName(pCxt, pDbName, true) || !checkTableName(pCxt, pTableName) || !checkTableName(pCxt, pTableAlias)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE);
|
SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE);
|
||||||
|
@ -593,6 +633,9 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, const SToken* pDbName, const
|
||||||
strncpy(realTable->table.tableAlias, pTableName->z, pTableName->n);
|
strncpy(realTable->table.tableAlias, pTableName->z, pTableName->n);
|
||||||
}
|
}
|
||||||
strncpy(realTable->table.tableName, pTableName->z, pTableName->n);
|
strncpy(realTable->table.tableName, pTableName->z, pTableName->n);
|
||||||
|
if (NULL != pCxt->pQueryCxt->db) {
|
||||||
|
strcpy(realTable->useDbName, pCxt->pQueryCxt->db);
|
||||||
|
}
|
||||||
return (SNode*)realTable;
|
return (SNode*)realTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -811,8 +854,8 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
|
||||||
return (SNode*)setDbOptionFuncs[type](pCxt, (SDatabaseOptions*)pOptions, pVal);
|
return (SNode*)setDbOptionFuncs[type](pCxt, (SDatabaseOptions*)pOptions, pVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, const SToken* pDbName, SNode* pOptions) {
|
SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* pDbName, SNode* pOptions) {
|
||||||
if (!checkDbName(pCxt, pDbName)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SCreateDatabaseStmt* pStmt = (SCreateDatabaseStmt*)nodesMakeNode(QUERY_NODE_CREATE_DATABASE_STMT);
|
SCreateDatabaseStmt* pStmt = (SCreateDatabaseStmt*)nodesMakeNode(QUERY_NODE_CREATE_DATABASE_STMT);
|
||||||
|
@ -823,8 +866,8 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, cons
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pDbName) {
|
SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pDbName) {
|
||||||
if (!checkDbName(pCxt, pDbName)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SDropDatabaseStmt* pStmt = (SDropDatabaseStmt*)nodesMakeNode(QUERY_NODE_DROP_DATABASE_STMT);
|
SDropDatabaseStmt* pStmt = (SDropDatabaseStmt*)nodesMakeNode(QUERY_NODE_DROP_DATABASE_STMT);
|
||||||
|
@ -834,8 +877,8 @@ SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, con
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName, SNode* pOptions) {
|
SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pOptions) {
|
||||||
if (!checkDbName(pCxt, pDbName)) {
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SAlterDatabaseStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_DATABASE_STMT);
|
SAlterDatabaseStmt* pStmt = nodesMakeNode(QUERY_NODE_ALTER_DATABASE_STMT);
|
||||||
|
@ -1003,28 +1046,34 @@ SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, const
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) {
|
||||||
|
if (!checkDbName(pCxt, pDbName, false)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT);
|
SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
strncpy(pStmt->dbName, pDbName->z, pDbName->n);
|
strncpy(pStmt->dbName, pDbName->z, pDbName->n);
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDbName) {
|
static bool needDbShowStmt(ENodeType type) {
|
||||||
if (!checkDbName(pCxt, pDbName)) {
|
return QUERY_NODE_SHOW_TABLES_STMT == type || QUERY_NODE_SHOW_STABLES_STMT == type || QUERY_NODE_SHOW_VGROUPS_STMT == type;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbNamePattern) {
|
||||||
|
if (needDbShowStmt(type) && NULL == pDbName && NULL == pCxt->pQueryCxt->db) {
|
||||||
|
snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "db not specified");
|
||||||
|
pCxt->valid = false;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SShowStmt* pStmt = nodesMakeNode(type);;
|
SShowStmt* pStmt = nodesMakeNode(type);;
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
if (NULL != pDbName) {
|
pStmt->pDbName = pDbName;
|
||||||
strncpy(pStmt->dbName, pDbName->z, pDbName->n);
|
pStmt->pTbNamePattern = pTbNamePattern;
|
||||||
} else if (NULL != pCxt->pQueryCxt->db) {
|
|
||||||
strcpy(pStmt->dbName, pCxt->pQueryCxt->db);
|
|
||||||
}
|
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, const SToken* pPassword) {
|
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword) {
|
||||||
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
char password[TSDB_USET_PASSWORD_LEN] = {0};
|
||||||
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
|
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1036,7 +1085,7 @@ SNode* createCreateUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, co
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int8_t alterType, const SToken* pVal) {
|
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal) {
|
||||||
if (!checkUserName(pCxt, pUserName)) {
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1055,7 +1104,7 @@ SNode* createAlterUserStmt(SAstCreateContext* pCxt, const SToken* pUserName, int
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropUserStmt(SAstCreateContext* pCxt, const SToken* pUserName) {
|
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) {
|
||||||
if (!checkUserName(pCxt, pUserName)) {
|
if (!checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1111,7 +1160,7 @@ SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, const SToken* pIndexName, const SToken* pTableName, SNodeList* pCols, SNode* pOptions) {
|
SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, SToken* pIndexName, SToken* pTableName, SNodeList* pCols, SNode* pOptions) {
|
||||||
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1135,7 +1184,7 @@ SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInt
|
||||||
return (SNode*)pOptions;
|
return (SNode*)pOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createDropIndexStmt(SAstCreateContext* pCxt, const SToken* pIndexName, const SToken* pTableName) {
|
SNode* createDropIndexStmt(SAstCreateContext* pCxt, SToken* pIndexName, SToken* pTableName) {
|
||||||
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
if (!checkIndexName(pCxt, pIndexName) || !checkTableName(pCxt, pTableName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue