Merge remote-tracking branch 'origin/3.0' into feature/shm
This commit is contained in:
commit
8a0ab2615e
|
@ -87,7 +87,7 @@ tests/comparisonTest/opentsdb/opentsdbtest/.settings/
|
||||||
tests/examples/JDBC/JDBCDemo/.classpath
|
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/new_sql.*
|
source/libs/parser/inc/sql.*
|
||||||
|
|
||||||
# Emacs
|
# Emacs
|
||||||
# -*- mode: gitignore; -*-
|
# -*- mode: gitignore; -*-
|
||||||
|
|
|
@ -6,40 +6,14 @@ project(
|
||||||
DESCRIPTION "An open-source big data platform designed and optimized for the Internet of Things(IOT)"
|
DESCRIPTION "An open-source big data platform designed and optimized for the Internet of Things(IOT)"
|
||||||
)
|
)
|
||||||
|
|
||||||
IF ("${BUILD_TOOLS}" STREQUAL "")
|
|
||||||
IF (TD_LINUX)
|
|
||||||
IF (TD_ARM_32)
|
|
||||||
SET(BUILD_TOOLS "false")
|
|
||||||
ELSEIF (TD_ARM_64)
|
|
||||||
SET(BUILD_TOOLS "false")
|
|
||||||
ELSE ()
|
|
||||||
SET(BUILD_TOOLS "false")
|
|
||||||
ENDIF ()
|
|
||||||
ELSEIF (TD_DARWIN)
|
|
||||||
SET(BUILD_TOOLS "false")
|
|
||||||
ELSE ()
|
|
||||||
SET(BUILD_TOOLS "false")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
IF ("${BUILD_TOOLS}" MATCHES "false")
|
|
||||||
MESSAGE("${Yellow} Will _not_ build taos_tools! ${ColourReset}")
|
|
||||||
SET(TD_TAOS_TOOLS FALSE)
|
|
||||||
ELSE ()
|
|
||||||
MESSAGE("")
|
|
||||||
MESSAGE("${Green} Will build taos_tools! ${ColourReset}")
|
|
||||||
MESSAGE("")
|
|
||||||
SET(TD_TAOS_TOOLS TRUE)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
set(CMAKE_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/cmake")
|
set(CMAKE_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
set(CMAKE_CONTRIB_DIR "${CMAKE_SOURCE_DIR}/contrib")
|
set(CMAKE_CONTRIB_DIR "${CMAKE_SOURCE_DIR}/contrib")
|
||||||
|
|
||||||
|
include(${CMAKE_SUPPORT_DIR}/cmake.platform)
|
||||||
|
include(${CMAKE_SUPPORT_DIR}/cmake.define)
|
||||||
include(${CMAKE_SUPPORT_DIR}/cmake.options)
|
include(${CMAKE_SUPPORT_DIR}/cmake.options)
|
||||||
include(${CMAKE_SUPPORT_DIR}/cmake.version)
|
include(${CMAKE_SUPPORT_DIR}/cmake.version)
|
||||||
|
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -fPIC -gdwarf-2 -msse4.2 -mfma -g3")
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -fPIC -gdwarf-2 -msse4.2 -mfma -g3")
|
|
||||||
|
|
||||||
# contrib
|
# contrib
|
||||||
add_subdirectory(contrib)
|
add_subdirectory(contrib)
|
||||||
|
|
||||||
|
@ -52,6 +26,7 @@ if(${BUILD_TEST})
|
||||||
include(CTest)
|
include(CTest)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
endif(${BUILD_TEST})
|
endif(${BUILD_TEST})
|
||||||
|
|
||||||
add_subdirectory(source)
|
add_subdirectory(source)
|
||||||
add_subdirectory(tools)
|
add_subdirectory(tools)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
IF ("${BUILD_TOOLS}" STREQUAL "")
|
||||||
|
IF (TD_LINUX)
|
||||||
|
IF (TD_ARM_32)
|
||||||
|
SET(BUILD_TOOLS "false")
|
||||||
|
ELSEIF (TD_ARM_64)
|
||||||
|
SET(BUILD_TOOLS "false")
|
||||||
|
ELSE ()
|
||||||
|
SET(BUILD_TOOLS "false")
|
||||||
|
ENDIF ()
|
||||||
|
ELSEIF (TD_DARWIN)
|
||||||
|
SET(BUILD_TOOLS "false")
|
||||||
|
ELSE ()
|
||||||
|
SET(BUILD_TOOLS "false")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${BUILD_TOOLS}" MATCHES "false")
|
||||||
|
MESSAGE("${Yellow} Will _not_ build taos_tools! ${ColourReset}")
|
||||||
|
SET(TD_TAOS_TOOLS FALSE)
|
||||||
|
ELSE ()
|
||||||
|
MESSAGE("")
|
||||||
|
MESSAGE("${Green} Will build taos_tools! ${ColourReset}")
|
||||||
|
MESSAGE("")
|
||||||
|
SET(TD_TAOS_TOOLS TRUE)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_WINDOWS)
|
||||||
|
MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}")
|
||||||
|
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
|
||||||
|
SET(COMMON_FLAGS "/nologo /WX /wd4018 /wd4999 /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
|
||||||
|
|
||||||
|
IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
|
||||||
|
SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
ELSE ()
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -fPIC -gdwarf-2 -msse4.2 -mfma -g3")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -fPIC -gdwarf-2 -msse4.2 -mfma -g3")
|
||||||
|
|
||||||
|
ENDIF ()
|
|
@ -1,12 +1,35 @@
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Deps options
|
# Deps options
|
||||||
# =========================================================
|
# =========================================================
|
||||||
|
|
||||||
|
IF(${TD_WINDOWS})
|
||||||
|
|
||||||
|
MESSAGE("build pthread Win32")
|
||||||
|
option(
|
||||||
|
BUILD_PTHREAD
|
||||||
|
"If build pthread on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
|
MESSAGE("build gnu regex for Windows")
|
||||||
|
option(
|
||||||
|
BUILD_GNUREGEX
|
||||||
|
"If build gnu regex on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF(${TD_LINUX} MATCHES TRUE)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_TEST
|
BUILD_TEST
|
||||||
"If build unit tests using googletest"
|
"If build unit tests using googletest"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LEVELDB
|
BUILD_WITH_LEVELDB
|
||||||
"If build with leveldb"
|
"If build with leveldb"
|
||||||
|
@ -25,12 +48,17 @@ option(
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IF(${TD_WINDOWS})
|
||||||
|
MESSAGE("Not build BDB on Windows")
|
||||||
|
ELSE ()
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_BDB
|
BUILD_WITH_BDB
|
||||||
"If build with BerkleyDB"
|
"If build with BerkleyDB"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LUCENE
|
BUILD_WITH_LUCENE
|
||||||
"If build with lucene"
|
"If build with lucene"
|
||||||
|
@ -68,12 +96,16 @@ option(
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IF(${TD_LINUX} MATCHES TRUE)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_DEPENDENCY_TESTS
|
BUILD_DEPENDENCY_TESTS
|
||||||
"If build dependency tests"
|
"If build dependency tests"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_DOCS
|
BUILD_DOCS
|
||||||
"If use doxygen build documents"
|
"If use doxygen build documents"
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
MESSAGE("Current system is ${CMAKE_SYSTEM_NAME}")
|
||||||
|
|
||||||
|
# init
|
||||||
|
SET(TD_LINUX FALSE)
|
||||||
|
SET(TD_WINDOWS FALSE)
|
||||||
|
SET(TD_DARWIN FALSE)
|
||||||
|
|
||||||
|
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
|
|
||||||
|
SET(TD_LINUX TRUE)
|
||||||
|
SET(OSTYPE "Linux")
|
||||||
|
ADD_DEFINITIONS("-DLINUX")
|
||||||
|
|
||||||
|
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
||||||
|
SET(TD_LINUX_64 TRUE)
|
||||||
|
ELSE ()
|
||||||
|
SET(TD_LINUX_32 TRUE)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
|
||||||
|
SET(TD_DARWIN TRUE)
|
||||||
|
SET(OSTYPE "macOS")
|
||||||
|
ADD_DEFINITIONS("-DDARWIN")
|
||||||
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
|
||||||
|
MESSAGE("Current system arch is arm64")
|
||||||
|
SET(TD_DARWIN_64 TRUE)
|
||||||
|
ADD_DEFINITIONS("-D_TD_DARWIN_64")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
ADD_DEFINITIONS("-DHAVE_UNISTD_H")
|
||||||
|
|
||||||
|
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
|
|
||||||
|
SET(TD_WINDOWS TRUE)
|
||||||
|
SET(OSTYPE "Windows")
|
||||||
|
ADD_DEFINITIONS("-DWINDOWS")
|
||||||
|
|
||||||
|
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
||||||
|
SET(TD_WINDOWS_64 TRUE)
|
||||||
|
ADD_DEFINITIONS("-D_TD_WINDOWS_64")
|
||||||
|
ELSE ()
|
||||||
|
SET(TD_WINDOWS_32 TRUE)
|
||||||
|
ADD_DEFINITIONS("-D_TD_WINDOWS_32")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
MESSAGE("C Compiler ID: ${CMAKE_C_COMPILER_ID}")
|
||||||
|
MESSAGE("CXX Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# gnuregex
|
||||||
|
ExternalProject_Add(gnuregex
|
||||||
|
URL https://launchpad.net/gnuregex/trunk/2.9/+download/libgnurx-src-2.9.zip
|
||||||
|
DOWNLOAD_NAME libgnurx-src.zip
|
||||||
|
SOURCE_DIR "${CMAKE_CONTRIB_DIR}/gnuregex"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# pthread
|
||||||
|
ExternalProject_Add(pthread
|
||||||
|
GIT_REPOSITORY https://github.com/GerHobbelt/pthread-win32
|
||||||
|
GIT_TAG v3.0.3.1
|
||||||
|
SOURCE_DIR "${CMAKE_CONTRIB_DIR}/pthread-win32"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -9,6 +9,16 @@ endfunction(cat IN_FILE OUT_FILE)
|
||||||
set(CONTRIB_TMP_FILE "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in")
|
set(CONTRIB_TMP_FILE "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in")
|
||||||
configure_file("${CMAKE_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
configure_file("${CMAKE_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
|
||||||
|
# pthread
|
||||||
|
if(${BUILD_PTHREAD})
|
||||||
|
cat("${CMAKE_SUPPORT_DIR}/pthread_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# gnu regex
|
||||||
|
if(${BUILD_GNUREGEX})
|
||||||
|
cat("${CMAKE_SUPPORT_DIR}/gnuregex_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
# googletest
|
# googletest
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
cat("${CMAKE_SUPPORT_DIR}/gtest_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${CMAKE_SUPPORT_DIR}/gtest_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
@ -193,7 +203,10 @@ endif(${BUILD_WITH_TRAFT})
|
||||||
|
|
||||||
# LIBUV
|
# LIBUV
|
||||||
if(${BUILD_WITH_UV})
|
if(${BUILD_WITH_UV})
|
||||||
|
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
|
MESSAGE("Windows need set no-sign-compare")
|
||||||
add_compile_options(-Wno-sign-compare)
|
add_compile_options(-Wno-sign-compare)
|
||||||
|
endif ()
|
||||||
add_subdirectory(libuv)
|
add_subdirectory(libuv)
|
||||||
endif(${BUILD_WITH_UV})
|
endif(${BUILD_WITH_UV})
|
||||||
|
|
||||||
|
@ -224,6 +237,7 @@ if(${BUILD_WITH_SQLITE})
|
||||||
)
|
)
|
||||||
endif(${BUILD_WITH_SQLITE})
|
endif(${BUILD_WITH_SQLITE})
|
||||||
|
|
||||||
|
# pthread
|
||||||
|
|
||||||
|
|
||||||
# ================================================================================================
|
# ================================================================================================
|
||||||
|
|
|
@ -51,6 +51,7 @@ typedef void **TAOS_ROW;
|
||||||
#define TSDB_DATA_TYPE_JSON 17 // json
|
#define TSDB_DATA_TYPE_JSON 17 // json
|
||||||
#define TSDB_DATA_TYPE_DECIMAL 18 // decimal
|
#define TSDB_DATA_TYPE_DECIMAL 18 // decimal
|
||||||
#define TSDB_DATA_TYPE_BLOB 19 // binary
|
#define TSDB_DATA_TYPE_BLOB 19 // binary
|
||||||
|
#define TSDB_DATA_TYPE_MEDIUMBLOB 20
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TSDB_OPTION_LOCALE,
|
TSDB_OPTION_LOCALE,
|
||||||
|
|
|
@ -56,8 +56,9 @@ typedef struct SColumnDataAgg {
|
||||||
typedef struct SDataBlockInfo {
|
typedef struct SDataBlockInfo {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
int32_t rows;
|
int32_t rows;
|
||||||
|
int32_t rowSize;
|
||||||
int32_t numOfCols;
|
int32_t numOfCols;
|
||||||
int64_t uid;
|
union {int64_t uid; int64_t blockId;};
|
||||||
} SDataBlockInfo;
|
} SDataBlockInfo;
|
||||||
|
|
||||||
typedef struct SConstantItem {
|
typedef struct SConstantItem {
|
||||||
|
@ -108,7 +109,7 @@ static FORCE_INLINE int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlo
|
||||||
SColumnInfoData* pColData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, i);
|
SColumnInfoData* pColData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, i);
|
||||||
tlen += taosEncodeFixedI16(buf, pColData->info.colId);
|
tlen += taosEncodeFixedI16(buf, pColData->info.colId);
|
||||||
tlen += taosEncodeFixedI16(buf, pColData->info.type);
|
tlen += taosEncodeFixedI16(buf, pColData->info.type);
|
||||||
tlen += taosEncodeFixedI16(buf, pColData->info.bytes);
|
tlen += taosEncodeFixedI32(buf, pColData->info.bytes);
|
||||||
int32_t colSz = rows * pColData->info.bytes;
|
int32_t colSz = rows * pColData->info.bytes;
|
||||||
tlen += taosEncodeBinary(buf, pColData->pData, colSz);
|
tlen += taosEncodeBinary(buf, pColData->pData, colSz);
|
||||||
}
|
}
|
||||||
|
@ -127,7 +128,7 @@ static FORCE_INLINE void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock)
|
||||||
SColumnInfoData data = {0};
|
SColumnInfoData data = {0};
|
||||||
buf = taosDecodeFixedI16(buf, &data.info.colId);
|
buf = taosDecodeFixedI16(buf, &data.info.colId);
|
||||||
buf = taosDecodeFixedI16(buf, &data.info.type);
|
buf = taosDecodeFixedI16(buf, &data.info.type);
|
||||||
buf = taosDecodeFixedI16(buf, &data.info.bytes);
|
buf = taosDecodeFixedI32(buf, &data.info.bytes);
|
||||||
int32_t colSz = pBlock->info.rows * data.info.bytes;
|
int32_t colSz = pBlock->info.rows * data.info.bytes;
|
||||||
buf = taosDecodeBinary(buf, (void**)&data.pData, colSz);
|
buf = taosDecodeBinary(buf, (void**)&data.pData, colSz);
|
||||||
taosArrayPush(pBlock->pDataBlock, &data);
|
taosArrayPush(pBlock->pDataBlock, &data);
|
||||||
|
@ -212,10 +213,22 @@ static FORCE_INLINE void tDeleteSMqConsumeRsp(SMqPollRsp* pRsp) {
|
||||||
//======================================================================================================================
|
//======================================================================================================================
|
||||||
// the following structure shared by parser and executor
|
// the following structure shared by parser and executor
|
||||||
typedef struct SColumn {
|
typedef struct SColumn {
|
||||||
|
union {
|
||||||
uint64_t uid;
|
uint64_t uid;
|
||||||
|
int64_t dataBlockId;
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
int16_t colId;
|
||||||
|
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)
|
||||||
SColumnInfo info;
|
int16_t type;
|
||||||
|
int32_t bytes;
|
||||||
|
uint8_t precision;
|
||||||
|
uint8_t scale;
|
||||||
} SColumn;
|
} SColumn;
|
||||||
|
|
||||||
typedef struct SLimit {
|
typedef struct SLimit {
|
||||||
|
@ -233,20 +246,31 @@ typedef struct SGroupbyExpr {
|
||||||
bool groupbyTag; // group by tag or column
|
bool groupbyTag; // group by tag or column
|
||||||
} SGroupbyExpr;
|
} SGroupbyExpr;
|
||||||
|
|
||||||
// the structure for sql function in select clause
|
typedef struct SFunctParam {
|
||||||
typedef struct SSqlExpr {
|
int32_t type;
|
||||||
char token[TSDB_COL_NAME_LEN]; // original token
|
SColumn *pCol;
|
||||||
SSchema resSchema;
|
SVariant param;
|
||||||
|
} SFunctParam;
|
||||||
|
|
||||||
int32_t numOfCols;
|
// the structure for sql function in select clause
|
||||||
SColumn* pColumns; // data columns that are required by query
|
typedef struct SResSchame {
|
||||||
int32_t interBytes; // inter result buffer size
|
int8_t type;
|
||||||
|
int32_t colId;
|
||||||
|
int32_t bytes;
|
||||||
|
int32_t precision;
|
||||||
|
int32_t scale;
|
||||||
|
char name[TSDB_COL_NAME_LEN];
|
||||||
|
} SResSchema;
|
||||||
|
|
||||||
|
// TODO move away to executor.h
|
||||||
|
typedef struct SExprBasicInfo {
|
||||||
|
SResSchema resSchema;
|
||||||
int16_t numOfParams; // argument value of each function
|
int16_t numOfParams; // argument value of each function
|
||||||
SVariant param[3]; // parameters are not more than 3
|
SFunctParam *pParam;
|
||||||
} SSqlExpr;
|
} SExprBasicInfo;
|
||||||
|
|
||||||
typedef struct SExprInfo {
|
typedef struct SExprInfo {
|
||||||
struct SSqlExpr base;
|
struct SExprBasicInfo base;
|
||||||
struct tExprNode *pExpr;
|
struct tExprNode *pExpr;
|
||||||
} SExprInfo;
|
} SExprInfo;
|
||||||
|
|
||||||
|
|
|
@ -94,8 +94,8 @@ int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock);
|
||||||
int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows);
|
int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows);
|
||||||
void colDataTrim(SColumnInfoData* pColumnInfoData);
|
void colDataTrim(SColumnInfoData* pColumnInfoData);
|
||||||
|
|
||||||
size_t colDataGetNumOfCols(const SSDataBlock* pBlock);
|
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock);
|
||||||
size_t colDataGetNumOfRows(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,
|
||||||
|
|
|
@ -140,6 +140,8 @@ typedef enum _mgmt_table {
|
||||||
|
|
||||||
#define TSDB_KILL_MSG_LEN 30
|
#define TSDB_KILL_MSG_LEN 30
|
||||||
|
|
||||||
|
#define TSDB_TABLE_NUM_UNIT 100000
|
||||||
|
|
||||||
#define TSDB_VN_READ_ACCCESS ((char)0x1)
|
#define TSDB_VN_READ_ACCCESS ((char)0x1)
|
||||||
#define TSDB_VN_WRITE_ACCCESS ((char)0x2)
|
#define TSDB_VN_WRITE_ACCCESS ((char)0x2)
|
||||||
#define TSDB_VN_ALL_ACCCESS (TSDB_VN_READ_ACCCESS | TSDB_VN_WRITE_ACCCESS)
|
#define TSDB_VN_ALL_ACCCESS (TSDB_VN_READ_ACCCESS | TSDB_VN_WRITE_ACCCESS)
|
||||||
|
@ -169,6 +171,7 @@ typedef struct {
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
} SBuildUseDBInput;
|
} SBuildUseDBInput;
|
||||||
|
|
||||||
typedef struct SField {
|
typedef struct SField {
|
||||||
|
@ -416,10 +419,15 @@ typedef struct {
|
||||||
* But for data in vnode side, we need all the following information.
|
* But for data in vnode side, we need all the following information.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
union {
|
||||||
int16_t colId;
|
int16_t colId;
|
||||||
|
int16_t slotId;
|
||||||
|
};
|
||||||
|
|
||||||
int16_t type;
|
int16_t type;
|
||||||
int16_t bytes;
|
int32_t bytes;
|
||||||
SColumnFilterList flist;
|
uint8_t precision;
|
||||||
|
uint8_t scale;
|
||||||
} SColumnInfo;
|
} SColumnInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -449,57 +457,6 @@ typedef struct {
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
} SInterval;
|
} SInterval;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
SMsgHead head;
|
|
||||||
char version[TSDB_VERSION_LEN];
|
|
||||||
|
|
||||||
bool stableQuery; // super table query or not
|
|
||||||
bool topBotQuery; // TODO used bitwise flag
|
|
||||||
bool interpQuery; // interp query or not
|
|
||||||
bool groupbyColumn; // denote if this is a groupby normal column query
|
|
||||||
bool hasTagResults; // if there are tag values in final result or not
|
|
||||||
bool timeWindowInterpo; // if the time window start/end required interpolation
|
|
||||||
bool queryBlockDist; // if query data block distribution
|
|
||||||
bool stabledev; // super table stddev query
|
|
||||||
bool tsCompQuery; // is tscomp query
|
|
||||||
bool simpleAgg;
|
|
||||||
bool pointInterpQuery; // point interpolation query
|
|
||||||
bool needReverseScan; // need reverse scan
|
|
||||||
bool stateWindow; // state window flag
|
|
||||||
|
|
||||||
STimeWindow window;
|
|
||||||
int32_t numOfTables;
|
|
||||||
int16_t order;
|
|
||||||
int16_t orderColId;
|
|
||||||
int16_t numOfCols; // the number of columns will be load from vnode
|
|
||||||
SInterval interval;
|
|
||||||
// SSessionWindow sw; // session window
|
|
||||||
int16_t tagCondLen; // tag length in current query
|
|
||||||
int16_t colCondLen; // column length in current query
|
|
||||||
int16_t numOfGroupCols; // num of group by columns
|
|
||||||
int16_t orderByIdx;
|
|
||||||
int16_t orderType; // used in group by xx order by xxx
|
|
||||||
int64_t vgroupLimit; // limit the number of rows for each table, used in order by + limit in stable projection query.
|
|
||||||
int16_t prjOrder; // global order in super table projection query.
|
|
||||||
int64_t limit;
|
|
||||||
int64_t offset;
|
|
||||||
int32_t queryType; // denote another query process
|
|
||||||
int16_t numOfOutput; // final output columns numbers
|
|
||||||
int16_t fillType; // interpolate type
|
|
||||||
int64_t fillVal; // default value array list
|
|
||||||
int32_t secondStageOutput;
|
|
||||||
STsBufInfo tsBuf; // tsBuf info
|
|
||||||
int32_t numOfTags; // number of tags columns involved
|
|
||||||
int32_t sqlstrLen; // sql query string
|
|
||||||
int32_t prevResultLen; // previous result length
|
|
||||||
int32_t numOfOperator;
|
|
||||||
int32_t tableScanOperator; // table scan operator. -1 means no scan operator
|
|
||||||
int32_t udfNum; // number of udf function
|
|
||||||
int32_t udfContentOffset;
|
|
||||||
int32_t udfContentLen;
|
|
||||||
SColumnInfo tableCols[];
|
|
||||||
} SQueryTableReq;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
} SQueryTableRsp;
|
} SQueryTableRsp;
|
||||||
|
@ -566,6 +523,7 @@ typedef struct {
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
} SUseDbReq;
|
} SUseDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSUseDbReq(void* buf, int32_t bufLen, SUseDbReq* pReq);
|
int32_t tSerializeSUseDbReq(void* buf, int32_t bufLen, SUseDbReq* pReq);
|
||||||
|
@ -584,6 +542,23 @@ int32_t tSerializeSUseDbRsp(void* buf, int32_t bufLen, SUseDbRsp* pRsp);
|
||||||
int32_t tDeserializeSUseDbRsp(void* buf, int32_t bufLen, SUseDbRsp* pRsp);
|
int32_t tDeserializeSUseDbRsp(void* buf, int32_t bufLen, SUseDbRsp* pRsp);
|
||||||
void tFreeSUsedbRsp(SUseDbRsp* pRsp);
|
void tFreeSUsedbRsp(SUseDbRsp* pRsp);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t rowNum;
|
||||||
|
} SQnodeListReq;
|
||||||
|
|
||||||
|
int32_t tSerializeSQnodeListReq(void* buf, int32_t bufLen, SQnodeListReq* pReq);
|
||||||
|
int32_t tDeserializeSQnodeListReq(void* buf, int32_t bufLen, SQnodeListReq* pReq);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SArray *epSetList; // SArray<SEpSet>
|
||||||
|
} SQnodeListRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSQnodeListRsp(void* buf, int32_t bufLen, SQnodeListRsp* pRsp);
|
||||||
|
int32_t tDeserializeSQnodeListRsp(void* buf, int32_t bufLen, SQnodeListRsp* pRsp);
|
||||||
|
void tFreeSQnodeListRsp(SQnodeListRsp* pRsp);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray* pArray; // Array of SUseDbRsp
|
SArray* pArray; // Array of SUseDbRsp
|
||||||
} SUseDbBatchRsp;
|
} SUseDbBatchRsp;
|
||||||
|
@ -796,8 +771,10 @@ typedef struct SVgroupInfo {
|
||||||
uint32_t hashBegin;
|
uint32_t hashBegin;
|
||||||
uint32_t hashEnd;
|
uint32_t hashEnd;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
} SVgroupInfo;
|
} SVgroupInfo;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
SVgroupInfo vgroups[];
|
SVgroupInfo vgroups[];
|
||||||
|
@ -876,6 +853,8 @@ int32_t tDeserializeSShowRsp(void* buf, int32_t bufLen, SShowRsp* pRsp);
|
||||||
void tFreeSShowRsp(SShowRsp* pRsp);
|
void tFreeSShowRsp(SShowRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int32_t type;
|
||||||
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int64_t showId;
|
int64_t showId;
|
||||||
int8_t free;
|
int8_t free;
|
||||||
} SRetrieveTableReq;
|
} SRetrieveTableReq;
|
||||||
|
@ -903,6 +882,8 @@ int32_t tDeserializeSCreateDnodeReq(void* buf, int32_t bufLen, SCreateDnodeReq*
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
} SDropDnodeReq;
|
} SDropDnodeReq;
|
||||||
|
|
||||||
int32_t tSerializeSDropDnodeReq(void* buf, int32_t bufLen, SDropDnodeReq* pReq);
|
int32_t tSerializeSDropDnodeReq(void* buf, int32_t bufLen, SDropDnodeReq* pReq);
|
||||||
|
@ -1026,6 +1007,7 @@ typedef struct SSubQueryMsg {
|
||||||
uint64_t sId;
|
uint64_t sId;
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
|
int64_t refId;
|
||||||
int8_t taskType;
|
int8_t taskType;
|
||||||
uint32_t sqlLen; // the query sql,
|
uint32_t sqlLen; // the query sql,
|
||||||
uint32_t phyLen;
|
uint32_t phyLen;
|
||||||
|
@ -1072,19 +1054,57 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
|
int64_t refId;
|
||||||
int8_t status;
|
int8_t status;
|
||||||
} STaskStatus;
|
} STaskStatus;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t num;
|
int64_t refId;
|
||||||
STaskStatus status[];
|
SArray *taskStatus; //SArray<STaskStatus>
|
||||||
} SSchedulerStatusRsp;
|
} SSchedulerStatusRsp;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t queryId;
|
||||||
|
uint64_t taskId;
|
||||||
|
int8_t action;
|
||||||
|
} STaskAction;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct SQueryNodeEpId {
|
||||||
|
int32_t nodeId; // vgId or qnodeId
|
||||||
|
SEp ep;
|
||||||
|
} SQueryNodeEpId;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMsgHead header;
|
||||||
|
uint64_t sId;
|
||||||
|
SQueryNodeEpId epId;
|
||||||
|
SArray *taskAction; //SArray<STaskAction>
|
||||||
|
} SSchedulerHbReq;
|
||||||
|
|
||||||
|
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq);
|
||||||
|
int32_t tDeserializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq);
|
||||||
|
void tFreeSSchedulerHbReq(SSchedulerHbReq *pReq);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t seqId;
|
||||||
|
SQueryNodeEpId epId;
|
||||||
|
SArray *taskStatus; //SArray<STaskStatus>
|
||||||
|
} SSchedulerHbRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSSchedulerHbRsp(void *buf, int32_t bufLen, SSchedulerHbRsp *pRsp);
|
||||||
|
int32_t tDeserializeSSchedulerHbRsp(void *buf, int32_t bufLen, SSchedulerHbRsp *pRsp);
|
||||||
|
void tFreeSSchedulerHbRsp(SSchedulerHbRsp *pRsp);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMsgHead header;
|
SMsgHead header;
|
||||||
uint64_t sId;
|
uint64_t sId;
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
|
int64_t refId;
|
||||||
} STaskCancelReq;
|
} STaskCancelReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1096,6 +1116,7 @@ typedef struct {
|
||||||
uint64_t sId;
|
uint64_t sId;
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
|
int64_t refId;
|
||||||
} STaskDropReq;
|
} STaskDropReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1335,6 +1356,7 @@ typedef struct SVCreateTbReq {
|
||||||
} SVCreateTbReq, SVUpdateTbReq;
|
} SVCreateTbReq, SVUpdateTbReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int tmp; // TODO: to avoid compile error
|
||||||
} SVCreateTbRsp, SVUpdateTbRsp;
|
} SVCreateTbRsp, SVUpdateTbRsp;
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTbReq(void** buf, SVCreateTbReq* pReq);
|
int32_t tSerializeSVCreateTbReq(void** buf, SVCreateTbReq* pReq);
|
||||||
|
@ -1346,6 +1368,7 @@ typedef struct {
|
||||||
} SVCreateTbBatchReq;
|
} SVCreateTbBatchReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int tmp; // TODO: to avoid compile error
|
||||||
} SVCreateTbBatchRsp;
|
} SVCreateTbBatchRsp;
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTbBatchReq(void** buf, SVCreateTbBatchReq* pReq);
|
int32_t tSerializeSVCreateTbBatchReq(void** buf, SVCreateTbBatchReq* pReq);
|
||||||
|
@ -1359,6 +1382,7 @@ typedef struct {
|
||||||
} SVDropTbReq;
|
} SVDropTbReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int tmp; // TODO: to avoid compile error
|
||||||
} SVDropTbRsp;
|
} SVDropTbRsp;
|
||||||
|
|
||||||
int32_t tSerializeSVDropTbReq(void** buf, SVDropTbReq* pReq);
|
int32_t tSerializeSVDropTbReq(void** buf, SVDropTbReq* pReq);
|
||||||
|
@ -1874,23 +1898,18 @@ typedef enum {
|
||||||
} ETDTimeUnit;
|
} ETDTimeUnit;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t funcId;
|
int8_t version; // for compatibility(default 0)
|
||||||
uint16_t nColIds;
|
int8_t intervalUnit;
|
||||||
col_id_t* colIds; // sorted colIds
|
int8_t slidingUnit;
|
||||||
} SFuncColIds;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t version; // for compatibility
|
|
||||||
uint8_t intervalUnit;
|
|
||||||
uint8_t slidingUnit;
|
|
||||||
char indexName[TSDB_INDEX_NAME_LEN];
|
char indexName[TSDB_INDEX_NAME_LEN];
|
||||||
char timezone[TD_TIMEZONE_LEN];
|
char timezone[TD_TIMEZONE_LEN]; // sma data is invalid if timezone change.
|
||||||
uint16_t nFuncColIds;
|
uint16_t exprLen;
|
||||||
uint16_t tagsFilterLen;
|
uint16_t tagsFilterLen;
|
||||||
tb_uid_t tableUid; // super/common table uid
|
int64_t indexUid;
|
||||||
|
tb_uid_t tableUid; // super/child/common table uid
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t sliding;
|
int64_t sliding;
|
||||||
SFuncColIds* funcColIds; // sorted funcIds
|
char* expr; // sma expression
|
||||||
char* tagsFilter;
|
char* tagsFilter;
|
||||||
} STSma; // Time-range-wise SMA
|
} STSma; // Time-range-wise SMA
|
||||||
|
|
||||||
|
@ -1909,7 +1928,9 @@ typedef struct {
|
||||||
int64_t ver; // use a general definition
|
int64_t ver; // use a general definition
|
||||||
char indexName[TSDB_INDEX_NAME_LEN];
|
char indexName[TSDB_INDEX_NAME_LEN];
|
||||||
} SVDropTSmaReq;
|
} SVDropTSmaReq;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int tmp; // TODO: to avoid compile error
|
||||||
} SVCreateTSmaRsp, SVDropTSmaRsp;
|
} SVCreateTSmaRsp, SVDropTSmaRsp;
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTSmaReq(void** buf, SVCreateTSmaReq* pReq);
|
int32_t tSerializeSVCreateTSmaReq(void** buf, SVCreateTSmaReq* pReq);
|
||||||
|
@ -1918,24 +1939,30 @@ int32_t tSerializeSVDropTSmaReq(void** buf, SVDropTSmaReq* pReq);
|
||||||
void* tDeserializeSVDropTSmaReq(void* buf, SVDropTSmaReq* pReq);
|
void* tDeserializeSVDropTSmaReq(void* buf, SVDropTSmaReq* pReq);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STimeWindow tsWindow; // [skey, ekey]
|
col_id_t colId;
|
||||||
uint64_t tableUid; // sub/common table uid
|
uint16_t blockSize; // sma data block size
|
||||||
int32_t numOfBlocks; // number of sma blocks for each column, total number is numOfBlocks*numOfColId
|
char data[];
|
||||||
int32_t dataLen; // total data length
|
} STSmaColData;
|
||||||
col_id_t* colIds; // e.g. 2,4,9,10
|
|
||||||
col_id_t numOfColIds; // e.g. 4
|
|
||||||
char data[]; // the sma blocks
|
|
||||||
} STSmaData;
|
|
||||||
|
|
||||||
// TODO: move to the final location afte schema of STSma/STSmaData defined
|
typedef struct {
|
||||||
static FORCE_INLINE void tdDestroySmaData(STSmaData* pSmaData) {
|
tb_uid_t tableUid; // super/child/normal table uid
|
||||||
if (pSmaData) {
|
int32_t dataLen; // not including head
|
||||||
if (pSmaData->colIds) {
|
char data[];
|
||||||
tfree(pSmaData->colIds);
|
} STSmaTbData;
|
||||||
}
|
|
||||||
tfree(pSmaData);
|
typedef struct {
|
||||||
}
|
int64_t indexUid;
|
||||||
}
|
TSKEY skey; // startTS of one interval/sliding
|
||||||
|
int64_t interval;
|
||||||
|
int32_t dataLen; // not including head
|
||||||
|
int8_t intervalUnit;
|
||||||
|
char data[];
|
||||||
|
} STSmaDataWrapper; // sma data for a interval/sliding window
|
||||||
|
|
||||||
|
// interval/sliding => window
|
||||||
|
|
||||||
|
// => window->table->colId
|
||||||
|
// => 当一个window下所有的表均计算完成时,流计算告知tsdb清除window的过期标记
|
||||||
|
|
||||||
// RSma: Rollup SMA
|
// RSma: Rollup SMA
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1958,13 +1985,7 @@ typedef struct {
|
||||||
|
|
||||||
static FORCE_INLINE void tdDestroyTSma(STSma* pSma) {
|
static FORCE_INLINE void tdDestroyTSma(STSma* pSma) {
|
||||||
if (pSma) {
|
if (pSma) {
|
||||||
if (pSma->funcColIds != NULL) {
|
tfree(pSma->expr);
|
||||||
for (uint16_t i = 0; i < pSma->nFuncColIds; ++i) {
|
|
||||||
tfree((pSma->funcColIds + i)->colIds);
|
|
||||||
}
|
|
||||||
tfree(pSma->funcColIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(pSma->tagsFilter);
|
tfree(pSma->tagsFilter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1983,24 +2004,20 @@ static FORCE_INLINE void tdDestroyTSmaWrapper(STSmaWrapper* pSW) {
|
||||||
static FORCE_INLINE int32_t tEncodeTSma(void** buf, const STSma* pSma) {
|
static FORCE_INLINE int32_t tEncodeTSma(void** buf, const STSma* pSma) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
|
|
||||||
tlen += taosEncodeFixedU8(buf, pSma->version);
|
tlen += taosEncodeFixedI8(buf, pSma->version);
|
||||||
tlen += taosEncodeFixedU8(buf, pSma->intervalUnit);
|
tlen += taosEncodeFixedI8(buf, pSma->intervalUnit);
|
||||||
tlen += taosEncodeFixedU8(buf, pSma->slidingUnit);
|
tlen += taosEncodeFixedI8(buf, pSma->slidingUnit);
|
||||||
tlen += taosEncodeString(buf, pSma->indexName);
|
tlen += taosEncodeString(buf, pSma->indexName);
|
||||||
tlen += taosEncodeString(buf, pSma->timezone);
|
tlen += taosEncodeString(buf, pSma->timezone);
|
||||||
tlen += taosEncodeFixedU16(buf, pSma->nFuncColIds);
|
tlen += taosEncodeFixedU16(buf, pSma->exprLen);
|
||||||
tlen += taosEncodeFixedU16(buf, pSma->tagsFilterLen);
|
tlen += taosEncodeFixedU16(buf, pSma->tagsFilterLen);
|
||||||
|
tlen += taosEncodeFixedI64(buf, pSma->indexUid);
|
||||||
tlen += taosEncodeFixedI64(buf, pSma->tableUid);
|
tlen += taosEncodeFixedI64(buf, pSma->tableUid);
|
||||||
tlen += taosEncodeFixedI64(buf, pSma->interval);
|
tlen += taosEncodeFixedI64(buf, pSma->interval);
|
||||||
tlen += taosEncodeFixedI64(buf, pSma->sliding);
|
tlen += taosEncodeFixedI64(buf, pSma->sliding);
|
||||||
|
|
||||||
for (uint16_t i = 0; i < pSma->nFuncColIds; ++i) {
|
if (pSma->exprLen > 0) {
|
||||||
SFuncColIds* funcColIds = pSma->funcColIds + i;
|
tlen += taosEncodeString(buf, pSma->expr);
|
||||||
tlen += taosEncodeFixedU16(buf, funcColIds->funcId);
|
|
||||||
tlen += taosEncodeFixedU16(buf, funcColIds->nColIds);
|
|
||||||
for (uint16_t j = 0; j < funcColIds->nColIds; ++j) {
|
|
||||||
tlen += taosEncodeFixedU16(buf, *(funcColIds->colIds + j));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSma->tagsFilterLen > 0) {
|
if (pSma->tagsFilterLen > 0) {
|
||||||
|
@ -2021,43 +2038,30 @@ static FORCE_INLINE int32_t tEncodeTSmaWrapper(void** buf, const STSmaWrapper* p
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeTSma(void* buf, STSma* pSma) {
|
static FORCE_INLINE void* tDecodeTSma(void* buf, STSma* pSma) {
|
||||||
buf = taosDecodeFixedU8(buf, &pSma->version);
|
buf = taosDecodeFixedI8(buf, &pSma->version);
|
||||||
buf = taosDecodeFixedU8(buf, &pSma->intervalUnit);
|
buf = taosDecodeFixedI8(buf, &pSma->intervalUnit);
|
||||||
buf = taosDecodeFixedU8(buf, &pSma->slidingUnit);
|
buf = taosDecodeFixedI8(buf, &pSma->slidingUnit);
|
||||||
buf = taosDecodeStringTo(buf, pSma->indexName);
|
buf = taosDecodeStringTo(buf, pSma->indexName);
|
||||||
buf = taosDecodeStringTo(buf, pSma->timezone);
|
buf = taosDecodeStringTo(buf, pSma->timezone);
|
||||||
buf = taosDecodeFixedU16(buf, &pSma->nFuncColIds);
|
buf = taosDecodeFixedU16(buf, &pSma->exprLen);
|
||||||
buf = taosDecodeFixedU16(buf, &pSma->tagsFilterLen);
|
buf = taosDecodeFixedU16(buf, &pSma->tagsFilterLen);
|
||||||
|
buf = taosDecodeFixedI64(buf, &pSma->indexUid);
|
||||||
buf = taosDecodeFixedI64(buf, &pSma->tableUid);
|
buf = taosDecodeFixedI64(buf, &pSma->tableUid);
|
||||||
buf = taosDecodeFixedI64(buf, &pSma->interval);
|
buf = taosDecodeFixedI64(buf, &pSma->interval);
|
||||||
buf = taosDecodeFixedI64(buf, &pSma->sliding);
|
buf = taosDecodeFixedI64(buf, &pSma->sliding);
|
||||||
|
|
||||||
if (pSma->nFuncColIds > 0) {
|
|
||||||
pSma->funcColIds = (SFuncColIds*)calloc(pSma->nFuncColIds, sizeof(SFuncColIds));
|
if (pSma->exprLen > 0) {
|
||||||
if (pSma->funcColIds == NULL) {
|
pSma->expr = (char*)calloc(pSma->exprLen, 1);
|
||||||
tdDestroyTSma(pSma);
|
if (pSma->expr != NULL) {
|
||||||
return NULL;
|
buf = taosDecodeStringTo(buf, pSma->expr);
|
||||||
}
|
|
||||||
for (uint16_t i = 0; i < pSma->nFuncColIds; ++i) {
|
|
||||||
SFuncColIds* funcColIds = pSma->funcColIds + i;
|
|
||||||
buf = taosDecodeFixedU16(buf, &funcColIds->funcId);
|
|
||||||
buf = taosDecodeFixedU16(buf, &funcColIds->nColIds);
|
|
||||||
if (funcColIds->nColIds > 0) {
|
|
||||||
funcColIds->colIds = (col_id_t*)calloc(funcColIds->nColIds, sizeof(col_id_t));
|
|
||||||
if (funcColIds->colIds != NULL) {
|
|
||||||
for (uint16_t j = 0; j < funcColIds->nColIds; ++j) {
|
|
||||||
buf = taosDecodeFixedU16(buf, funcColIds->colIds + j);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
tdDestroyTSma(pSma);
|
tdDestroyTSma(pSma);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
funcColIds->colIds = NULL;
|
pSma->expr = NULL;
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pSma->funcColIds = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSma->tagsFilterLen > 0) {
|
if (pSma->tagsFilterLen > 0) {
|
||||||
|
|
|
@ -129,11 +129,13 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_DROP_STB, "mnode-drop-stb", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_DROP_STB, "mnode-drop-stb", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_TABLE_META, "mnode-table-meta", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_TABLE_META, "mnode-table-meta", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_VGROUP_LIST, "mnode-vgroup-list", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_VGROUP_LIST, "mnode-vgroup-list", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_QNODE_LIST, "mnode-qnode-list", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_KILL_QUERY, "mnode-kill-query", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_KILL_QUERY, "mnode-kill-query", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_KILL_CONN, "mnode-kill-conn", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_KILL_CONN, "mnode-kill-conn", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_HEARTBEAT, "mnode-heartbeat", SClientHbBatchReq, SClientHbBatchRsp)
|
TD_DEF_MSG_TYPE(TDMT_MND_HEARTBEAT, "mnode-heartbeat", SClientHbBatchReq, SClientHbBatchRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_SHOW, "mnode-show", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_SHOW, "mnode-show", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_SHOW_RETRIEVE, "mnode-retrieve", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_SHOW_RETRIEVE, "mnode-retrieve", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_SYSTABLE_RETRIEVE, "mnode-systable-retrieve", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_STATUS, "mnode-status", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_STATUS, "mnode-status", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_TRANS_TIMER, "mnode-trans-tmr", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_TRANS_TIMER, "mnode-trans-tmr", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_KILL_TRANS, "mnode-kill-trans", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_KILL_TRANS, "mnode-kill-trans", NULL, NULL)
|
||||||
|
@ -183,6 +185,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES, "vnode-show-tables", SVShowTablesReq, SVShowTablesRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES, "vnode-show-tables", SVShowTablesReq, SVShowTablesRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_CONTINUE, "vnode-query-continue", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_CONTINUE, "vnode-query-continue", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_HEARTBEAT, "vnode-query-heartbeat", NULL, NULL)
|
||||||
|
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
||||||
|
|
|
@ -103,6 +103,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// TODO
|
// TODO
|
||||||
|
int tmp; // TODO: to avoid compile error
|
||||||
} STpRow; // tuple
|
} STpRow; // tuple
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
|
|
@ -16,279 +16,159 @@
|
||||||
#ifndef _TD_COMMON_TOKEN_H_
|
#ifndef _TD_COMMON_TOKEN_H_
|
||||||
#define _TD_COMMON_TOKEN_H_
|
#define _TD_COMMON_TOKEN_H_
|
||||||
|
|
||||||
#define TK_ID 1
|
#define TK_OR 1
|
||||||
#define TK_BOOL 2
|
#define TK_AND 2
|
||||||
#define TK_INTEGER 3
|
#define TK_UNION 3
|
||||||
#define TK_FLOAT 4
|
#define TK_ALL 4
|
||||||
#define TK_STRING 5
|
#define TK_MINUS 5
|
||||||
#define TK_TIMESTAMP 6
|
#define TK_EXCEPT 6
|
||||||
#define TK_OR 7
|
#define TK_INTERSECT 7
|
||||||
#define TK_AND 8
|
#define TK_NK_BITAND 8
|
||||||
#define TK_NOT 9
|
#define TK_NK_BITOR 9
|
||||||
#define TK_EQ 10
|
#define TK_NK_LSHIFT 10
|
||||||
#define TK_NE 11
|
#define TK_NK_RSHIFT 11
|
||||||
#define TK_ISNULL 12
|
#define TK_NK_PLUS 12
|
||||||
#define TK_NOTNULL 13
|
#define TK_NK_MINUS 13
|
||||||
#define TK_IS 14
|
#define TK_NK_STAR 14
|
||||||
#define TK_LIKE 15
|
#define TK_NK_SLASH 15
|
||||||
#define TK_MATCH 16
|
#define TK_NK_REM 16
|
||||||
#define TK_NMATCH 17
|
#define TK_NK_CONCAT 17
|
||||||
#define TK_GLOB 18
|
#define TK_CREATE 18
|
||||||
#define TK_BETWEEN 19
|
#define TK_USER 19
|
||||||
#define TK_IN 20
|
#define TK_PASS 20
|
||||||
#define TK_GT 21
|
#define TK_NK_STRING 21
|
||||||
#define TK_GE 22
|
#define TK_ALTER 22
|
||||||
#define TK_LT 23
|
#define TK_PRIVILEGE 23
|
||||||
#define TK_LE 24
|
#define TK_DROP 24
|
||||||
#define TK_BITAND 25
|
#define TK_SHOW 25
|
||||||
#define TK_BITOR 26
|
#define TK_USERS 26
|
||||||
#define TK_LSHIFT 27
|
#define TK_DNODE 27
|
||||||
#define TK_RSHIFT 28
|
#define TK_PORT 28
|
||||||
#define TK_PLUS 29
|
#define TK_NK_INTEGER 29
|
||||||
#define TK_MINUS 30
|
#define TK_DNODES 30
|
||||||
#define TK_DIVIDE 31
|
#define TK_NK_ID 31
|
||||||
#define TK_TIMES 32
|
#define TK_NK_IPTOKEN 32
|
||||||
#define TK_STAR 33
|
#define TK_DATABASE 33
|
||||||
#define TK_SLASH 34
|
#define TK_DATABASES 34
|
||||||
#define TK_REM 35
|
#define TK_USE 35
|
||||||
#define TK_CONCAT 36
|
#define TK_IF 36
|
||||||
#define TK_UMINUS 37
|
#define TK_NOT 37
|
||||||
#define TK_UPLUS 38
|
#define TK_EXISTS 38
|
||||||
#define TK_BITNOT 39
|
#define TK_BLOCKS 39
|
||||||
#define TK_SHOW 40
|
#define TK_CACHE 40
|
||||||
#define TK_DATABASES 41
|
#define TK_CACHELAST 41
|
||||||
#define TK_TOPICS 42
|
#define TK_COMP 42
|
||||||
#define TK_FUNCTIONS 43
|
#define TK_DAYS 43
|
||||||
#define TK_MNODES 44
|
#define TK_FSYNC 44
|
||||||
#define TK_DNODES 45
|
#define TK_MAXROWS 45
|
||||||
#define TK_ACCOUNTS 46
|
#define TK_MINROWS 46
|
||||||
#define TK_USERS 47
|
#define TK_KEEP 47
|
||||||
#define TK_MODULES 48
|
#define TK_PRECISION 48
|
||||||
#define TK_QUERIES 49
|
#define TK_QUORUM 49
|
||||||
#define TK_CONNECTIONS 50
|
#define TK_REPLICA 50
|
||||||
#define TK_STREAMS 51
|
#define TK_TTL 51
|
||||||
#define TK_VARIABLES 52
|
#define TK_WAL 52
|
||||||
#define TK_SCORES 53
|
#define TK_VGROUPS 53
|
||||||
#define TK_GRANTS 54
|
#define TK_SINGLE_STABLE 54
|
||||||
#define TK_VNODES 55
|
#define TK_STREAM_MODE 55
|
||||||
#define TK_DOT 56
|
#define TK_TABLE 56
|
||||||
#define TK_CREATE 57
|
#define TK_NK_LP 57
|
||||||
#define TK_TABLE 58
|
#define TK_NK_RP 58
|
||||||
#define TK_STABLE 59
|
#define TK_STABLE 59
|
||||||
#define TK_DATABASE 60
|
#define TK_TABLES 60
|
||||||
#define TK_TABLES 61
|
#define TK_STABLES 61
|
||||||
#define TK_STABLES 62
|
#define TK_USING 62
|
||||||
#define TK_VGROUPS 63
|
#define TK_TAGS 63
|
||||||
#define TK_DROP 64
|
#define TK_NK_DOT 64
|
||||||
#define TK_TOPIC 65
|
#define TK_NK_COMMA 65
|
||||||
#define TK_FUNCTION 66
|
#define TK_COMMENT 66
|
||||||
#define TK_DNODE 67
|
#define TK_BOOL 67
|
||||||
#define TK_USER 68
|
#define TK_TINYINT 68
|
||||||
#define TK_ACCOUNT 69
|
#define TK_SMALLINT 69
|
||||||
#define TK_USE 70
|
#define TK_INT 70
|
||||||
#define TK_DESCRIBE 71
|
#define TK_INTEGER 71
|
||||||
#define TK_DESC 72
|
#define TK_BIGINT 72
|
||||||
#define TK_ALTER 73
|
#define TK_FLOAT 73
|
||||||
#define TK_PASS 74
|
#define TK_DOUBLE 74
|
||||||
#define TK_PRIVILEGE 75
|
#define TK_BINARY 75
|
||||||
#define TK_LOCAL 76
|
#define TK_TIMESTAMP 76
|
||||||
#define TK_COMPACT 77
|
#define TK_NCHAR 77
|
||||||
#define TK_LP 78
|
#define TK_UNSIGNED 78
|
||||||
#define TK_RP 79
|
#define TK_JSON 79
|
||||||
#define TK_IF 80
|
#define TK_VARCHAR 80
|
||||||
#define TK_EXISTS 81
|
#define TK_MEDIUMBLOB 81
|
||||||
#define TK_PORT 82
|
#define TK_BLOB 82
|
||||||
#define TK_IPTOKEN 83
|
#define TK_VARBINARY 83
|
||||||
#define TK_AS 84
|
#define TK_DECIMAL 84
|
||||||
#define TK_OUTPUTTYPE 85
|
#define TK_SMA 85
|
||||||
#define TK_AGGREGATE 86
|
#define TK_MNODES 86
|
||||||
#define TK_BUFSIZE 87
|
#define TK_NK_FLOAT 87
|
||||||
#define TK_PPS 88
|
#define TK_NK_BOOL 88
|
||||||
#define TK_TSERIES 89
|
#define TK_NK_VARIABLE 89
|
||||||
#define TK_DBS 90
|
#define TK_BETWEEN 90
|
||||||
#define TK_STORAGE 91
|
#define TK_IS 91
|
||||||
#define TK_QTIME 92
|
#define TK_NULL 92
|
||||||
#define TK_CONNS 93
|
#define TK_NK_LT 93
|
||||||
#define TK_STATE 94
|
#define TK_NK_GT 94
|
||||||
#define TK_COMMA 95
|
#define TK_NK_LE 95
|
||||||
#define TK_KEEP 96
|
#define TK_NK_GE 96
|
||||||
#define TK_CACHE 97
|
#define TK_NK_NE 97
|
||||||
#define TK_REPLICA 98
|
#define TK_NK_EQ 98
|
||||||
#define TK_QUORUM 99
|
#define TK_LIKE 99
|
||||||
#define TK_DAYS 100
|
#define TK_MATCH 100
|
||||||
#define TK_MINROWS 101
|
#define TK_NMATCH 101
|
||||||
#define TK_MAXROWS 102
|
#define TK_IN 102
|
||||||
#define TK_BLOCKS 103
|
#define TK_FROM 103
|
||||||
#define TK_CTIME 104
|
#define TK_AS 104
|
||||||
#define TK_WAL 105
|
#define TK_JOIN 105
|
||||||
#define TK_FSYNC 106
|
#define TK_ON 106
|
||||||
#define TK_COMP 107
|
#define TK_INNER 107
|
||||||
#define TK_PRECISION 108
|
#define TK_SELECT 108
|
||||||
#define TK_UPDATE 109
|
#define TK_DISTINCT 109
|
||||||
#define TK_CACHELAST 110
|
#define TK_WHERE 110
|
||||||
#define TK_STREAM 111
|
#define TK_PARTITION 111
|
||||||
#define TK_MODE 112
|
#define TK_BY 112
|
||||||
#define TK_UNSIGNED 113
|
#define TK_SESSION 113
|
||||||
#define TK_TAGS 114
|
#define TK_STATE_WINDOW 114
|
||||||
#define TK_USING 115
|
#define TK_INTERVAL 115
|
||||||
#define TK_NULL 116
|
#define TK_SLIDING 116
|
||||||
#define TK_NOW 117
|
#define TK_FILL 117
|
||||||
#define TK_SELECT 118
|
#define TK_VALUE 118
|
||||||
#define TK_UNION 119
|
#define TK_NONE 119
|
||||||
#define TK_ALL 120
|
#define TK_PREV 120
|
||||||
#define TK_DISTINCT 121
|
#define TK_LINEAR 121
|
||||||
#define TK_FROM 122
|
#define TK_NEXT 122
|
||||||
#define TK_VARIABLE 123
|
#define TK_GROUP 123
|
||||||
#define TK_INTERVAL 124
|
#define TK_HAVING 124
|
||||||
#define TK_EVERY 125
|
#define TK_ORDER 125
|
||||||
#define TK_SESSION 126
|
#define TK_SLIMIT 126
|
||||||
#define TK_STATE_WINDOW 127
|
#define TK_SOFFSET 127
|
||||||
#define TK_FILL 128
|
#define TK_LIMIT 128
|
||||||
#define TK_SLIDING 129
|
#define TK_OFFSET 129
|
||||||
#define TK_ORDER 130
|
#define TK_ASC 130
|
||||||
#define TK_BY 131
|
#define TK_DESC 131
|
||||||
#define TK_ASC 132
|
#define TK_NULLS 132
|
||||||
#define TK_GROUP 133
|
#define TK_FIRST 133
|
||||||
#define TK_HAVING 134
|
#define TK_LAST 134
|
||||||
#define TK_LIMIT 135
|
|
||||||
#define TK_OFFSET 136
|
|
||||||
#define TK_SLIMIT 137
|
|
||||||
#define TK_SOFFSET 138
|
|
||||||
#define TK_WHERE 139
|
|
||||||
#define TK_RESET 140
|
|
||||||
#define TK_QUERY 141
|
|
||||||
#define TK_SYNCDB 142
|
|
||||||
#define TK_ADD 143
|
|
||||||
#define TK_COLUMN 144
|
|
||||||
#define TK_MODIFY 145
|
|
||||||
#define TK_TAG 146
|
|
||||||
#define TK_CHANGE 147
|
|
||||||
#define TK_SET 148
|
|
||||||
#define TK_KILL 149
|
|
||||||
#define TK_CONNECTION 150
|
|
||||||
#define TK_COLON 151
|
|
||||||
#define TK_ABORT 152
|
|
||||||
#define TK_AFTER 153
|
|
||||||
#define TK_ATTACH 154
|
|
||||||
#define TK_BEFORE 155
|
|
||||||
#define TK_BEGIN 156
|
|
||||||
#define TK_CASCADE 157
|
|
||||||
#define TK_CLUSTER 158
|
|
||||||
#define TK_CONFLICT 159
|
|
||||||
#define TK_COPY 160
|
|
||||||
#define TK_DEFERRED 161
|
|
||||||
#define TK_DELIMITERS 162
|
|
||||||
#define TK_DETACH 163
|
|
||||||
#define TK_EACH 164
|
|
||||||
#define TK_END 165
|
|
||||||
#define TK_EXPLAIN 166
|
|
||||||
#define TK_FAIL 167
|
|
||||||
#define TK_FOR 168
|
|
||||||
#define TK_IGNORE 169
|
|
||||||
#define TK_IMMEDIATE 170
|
|
||||||
#define TK_INITIALLY 171
|
|
||||||
#define TK_INSTEAD 172
|
|
||||||
#define TK_KEY 173
|
|
||||||
#define TK_OF 174
|
|
||||||
#define TK_RAISE 175
|
|
||||||
#define TK_REPLACE 176
|
|
||||||
#define TK_RESTRICT 177
|
|
||||||
#define TK_ROW 178
|
|
||||||
#define TK_STATEMENT 179
|
|
||||||
#define TK_TRIGGER 180
|
|
||||||
#define TK_VIEW 181
|
|
||||||
#define TK_SEMI 182
|
|
||||||
#define TK_NONE 183
|
|
||||||
#define TK_PREV 184
|
|
||||||
#define TK_LINEAR 185
|
|
||||||
#define TK_IMPORT 186
|
|
||||||
#define TK_TBNAME 187
|
|
||||||
#define TK_JOIN 188
|
|
||||||
#define TK_INSERT 189
|
|
||||||
#define TK_INTO 190
|
|
||||||
#define TK_VALUES 191
|
|
||||||
|
|
||||||
#define NEW_TK_OR 1
|
#define TK_NK_SPACE 300
|
||||||
#define NEW_TK_AND 2
|
#define TK_NK_COMMENT 301
|
||||||
#define NEW_TK_UNION 3
|
#define TK_NK_ILLEGAL 302
|
||||||
#define NEW_TK_ALL 4
|
#define TK_NK_HEX 303 // hex number 0x123
|
||||||
#define NEW_TK_MINUS 5
|
#define TK_NK_OCT 304 // oct number
|
||||||
#define NEW_TK_EXCEPT 6
|
#define TK_NK_BIN 305 // bin format data 0b111
|
||||||
#define NEW_TK_INTERSECT 7
|
#define TK_NK_FILE 306
|
||||||
#define NEW_TK_NK_PLUS 8
|
#define TK_NK_QUESTION 307 // denoting the placeholder of "?",when invoking statement bind query
|
||||||
#define NEW_TK_NK_MINUS 9
|
|
||||||
#define NEW_TK_NK_STAR 10
|
|
||||||
#define NEW_TK_NK_SLASH 11
|
|
||||||
#define NEW_TK_NK_REM 12
|
|
||||||
#define NEW_TK_SHOW 13
|
|
||||||
#define NEW_TK_DATABASES 14
|
|
||||||
#define NEW_TK_NK_INTEGER 15
|
|
||||||
#define NEW_TK_NK_FLOAT 16
|
|
||||||
#define NEW_TK_NK_STRING 17
|
|
||||||
#define NEW_TK_NK_BOOL 18
|
|
||||||
#define NEW_TK_TIMESTAMP 19
|
|
||||||
#define NEW_TK_NK_VARIABLE 20
|
|
||||||
#define NEW_TK_NK_COMMA 21
|
|
||||||
#define NEW_TK_NK_ID 22
|
|
||||||
#define NEW_TK_NK_LP 23
|
|
||||||
#define NEW_TK_NK_RP 24
|
|
||||||
#define NEW_TK_NK_DOT 25
|
|
||||||
#define NEW_TK_BETWEEN 26
|
|
||||||
#define NEW_TK_NOT 27
|
|
||||||
#define NEW_TK_IS 28
|
|
||||||
#define NEW_TK_NULL 29
|
|
||||||
#define NEW_TK_NK_LT 30
|
|
||||||
#define NEW_TK_NK_GT 31
|
|
||||||
#define NEW_TK_NK_LE 32
|
|
||||||
#define NEW_TK_NK_GE 33
|
|
||||||
#define NEW_TK_NK_NE 34
|
|
||||||
#define NEW_TK_NK_EQ 35
|
|
||||||
#define NEW_TK_LIKE 36
|
|
||||||
#define NEW_TK_MATCH 37
|
|
||||||
#define NEW_TK_NMATCH 38
|
|
||||||
#define NEW_TK_IN 39
|
|
||||||
#define NEW_TK_FROM 40
|
|
||||||
#define NEW_TK_AS 41
|
|
||||||
#define NEW_TK_JOIN 42
|
|
||||||
#define NEW_TK_ON 43
|
|
||||||
#define NEW_TK_INNER 44
|
|
||||||
#define NEW_TK_SELECT 45
|
|
||||||
#define NEW_TK_DISTINCT 46
|
|
||||||
#define NEW_TK_WHERE 47
|
|
||||||
#define NEW_TK_PARTITION 48
|
|
||||||
#define NEW_TK_BY 49
|
|
||||||
#define NEW_TK_SESSION 50
|
|
||||||
#define NEW_TK_STATE_WINDOW 51
|
|
||||||
#define NEW_TK_INTERVAL 52
|
|
||||||
#define NEW_TK_SLIDING 53
|
|
||||||
#define NEW_TK_FILL 54
|
|
||||||
#define NEW_TK_VALUE 55
|
|
||||||
#define NEW_TK_NONE 56
|
|
||||||
#define NEW_TK_PREV 57
|
|
||||||
#define NEW_TK_LINEAR 58
|
|
||||||
#define NEW_TK_NEXT 59
|
|
||||||
#define NEW_TK_GROUP 60
|
|
||||||
#define NEW_TK_HAVING 61
|
|
||||||
#define NEW_TK_ORDER 62
|
|
||||||
#define NEW_TK_SLIMIT 63
|
|
||||||
#define NEW_TK_SOFFSET 64
|
|
||||||
#define NEW_TK_LIMIT 65
|
|
||||||
#define NEW_TK_OFFSET 66
|
|
||||||
#define NEW_TK_ASC 67
|
|
||||||
#define NEW_TK_DESC 68
|
|
||||||
#define NEW_TK_NULLS 69
|
|
||||||
#define NEW_TK_FIRST 70
|
|
||||||
#define NEW_TK_LAST 71
|
|
||||||
|
|
||||||
#define TK_SPACE 300
|
#define TK_NK_COLON 500
|
||||||
#define TK_COMMENT 301
|
#define TK_NK_BITNOT 501
|
||||||
#define TK_ILLEGAL 302
|
#define TK_INSERT 502
|
||||||
#define TK_HEX 303 // hex number 0x123
|
#define TK_INTO 503
|
||||||
#define TK_OCT 304 // oct number
|
#define TK_NOW 504
|
||||||
#define TK_BIN 305 // bin format data 0b111
|
#define TK_VALUES 507
|
||||||
#define TK_FILE 306
|
#define TK_IMPORT 507
|
||||||
#define TK_QUESTION 307 // denoting the placeholder of "?",when invoking statement bind query
|
#define TK_NK_SEMI 508
|
||||||
|
|
||||||
#define TK_NIL 65535
|
#define TK_NK_NIL 65535
|
||||||
|
|
||||||
#endif /*_TD_COMMON_TOKEN_H_*/
|
#endif /*_TD_COMMON_TOKEN_H_*/
|
||||||
|
|
|
@ -51,7 +51,7 @@ typedef struct SMetaData {
|
||||||
SArray *pTableMeta; // STableMeta array
|
SArray *pTableMeta; // STableMeta array
|
||||||
SArray *pVgroupInfo; // SVgroupInfo list
|
SArray *pVgroupInfo; // SVgroupInfo list
|
||||||
SArray *pUdfList; // udf info list
|
SArray *pUdfList; // udf info list
|
||||||
SEpSet *pEpSet; // qnode epset list
|
SArray *pEpSetList; // qnode epset list, SArray<SEpSet>
|
||||||
} SMetaData;
|
} SMetaData;
|
||||||
|
|
||||||
typedef struct SCatalogCfg {
|
typedef struct SCatalogCfg {
|
||||||
|
@ -74,9 +74,9 @@ typedef struct SDbVgVersion {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
} SDbVgVersion;
|
} SDbVgVersion;
|
||||||
|
|
||||||
|
|
||||||
int32_t catalogInit(SCatalogCfg *cfg);
|
int32_t catalogInit(SCatalogCfg *cfg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,7 +95,7 @@ int32_t catalogGetHandle(uint64_t clusterId, SCatalog** catalogHandle);
|
||||||
*/
|
*/
|
||||||
void catalogFreeHandle(SCatalog* pCatalog);
|
void catalogFreeHandle(SCatalog* pCatalog);
|
||||||
|
|
||||||
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId);
|
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t *tableNum);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a DB's all vgroup info.
|
* Get a DB's all vgroup info.
|
||||||
|
|
|
@ -23,6 +23,7 @@ extern "C" {
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
|
#include "plannodes.h"
|
||||||
|
|
||||||
#define DS_BUF_LOW 1
|
#define DS_BUF_LOW 1
|
||||||
#define DS_BUF_FULL 2
|
#define DS_BUF_FULL 2
|
||||||
|
@ -59,7 +60,7 @@ typedef struct SOutputData {
|
||||||
* @param pHandle output
|
* @param pHandle output
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t dsCreateDataSinker(const struct SDataSink *pDataSink, DataSinkHandle* pHandle);
|
int32_t dsCreateDataSinker(const SDataSinkNode* pDataSink, DataSinkHandle* pHandle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put the result set returned by the executor into datasinker.
|
* Put the result set returned by the executor into datasinker.
|
||||||
|
|
|
@ -20,9 +20,30 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "tbuffer.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
#include "tbuffer.h"
|
|
||||||
|
struct SqlFunctionCtx;
|
||||||
|
struct SResultRowEntryInfo;
|
||||||
|
|
||||||
|
typedef struct SFunctionNode SFunctionNode;
|
||||||
|
|
||||||
|
typedef struct SFuncExecEnv {
|
||||||
|
int32_t calcMemSize;
|
||||||
|
} SFuncExecEnv;
|
||||||
|
|
||||||
|
typedef bool (*FExecGetEnv)(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
typedef bool (*FExecInit)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);
|
||||||
|
typedef void (*FExecProcess)(struct SqlFunctionCtx *pCtx);
|
||||||
|
typedef void (*FExecFinalize)(struct SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
typedef struct SFuncExecFuncs {
|
||||||
|
FExecGetEnv getEnv;
|
||||||
|
FExecInit init;
|
||||||
|
FExecProcess process;
|
||||||
|
FExecFinalize finalize;
|
||||||
|
} SFuncExecFuncs;
|
||||||
|
|
||||||
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
||||||
|
|
||||||
|
@ -111,64 +132,65 @@ struct SqlFunctionCtx;
|
||||||
struct SResultRowEntryInfo;
|
struct SResultRowEntryInfo;
|
||||||
|
|
||||||
//for selectivity query, the corresponding tag value is assigned if the data is qualified
|
//for selectivity query, the corresponding tag value is assigned if the data is qualified
|
||||||
typedef struct SExtTagsInfo {
|
typedef struct SSubsidiaryResInfo {
|
||||||
int16_t tagsLen; // keep the tags data for top/bottom query result
|
int16_t bufLen; // keep the tags data for top/bottom query result
|
||||||
int16_t numOfTagCols;
|
int16_t numOfCols;
|
||||||
struct SqlFunctionCtx **pTagCtxList;
|
struct SqlFunctionCtx **pCtx;
|
||||||
} SExtTagsInfo;
|
} SSubsidiaryResInfo;
|
||||||
|
|
||||||
typedef struct SResultDataInfo {
|
typedef struct SResultDataInfo {
|
||||||
|
int16_t precision;
|
||||||
|
int16_t scale;
|
||||||
int16_t type;
|
int16_t type;
|
||||||
int16_t bytes;
|
int16_t bytes;
|
||||||
int32_t intermediateBytes;
|
int32_t interBufSize;
|
||||||
} SResultDataInfo;
|
} SResultDataInfo;
|
||||||
|
|
||||||
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
||||||
|
|
||||||
typedef struct SFunctionFpSet {
|
typedef struct SInputColumnInfoData {
|
||||||
bool (*init)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo); // setup the execute environment
|
int32_t totalRows; // total rows in current columnar data
|
||||||
void (*addInput)(struct SqlFunctionCtx *pCtx);
|
int32_t startRowIndex; // handle started row index
|
||||||
|
int32_t numOfRows; // the number of rows needs to be handled
|
||||||
// finalizer must be called after all exec has been executed to generated final result.
|
int32_t numOfInputCols; // PTS is not included
|
||||||
void (*finalize)(struct SqlFunctionCtx *pCtx);
|
bool colDataAggIsSet;// if agg is set or not
|
||||||
void (*combine)(struct SqlFunctionCtx *pCtx);
|
SColumnInfoData *pPTS; // primary timestamp column
|
||||||
} SFunctionFpSet;
|
SColumnInfoData **pData;
|
||||||
|
SColumnDataAgg **pColumnDataAgg;
|
||||||
extern SFunctionFpSet fpSet[1];
|
} SInputColumnInfoData;
|
||||||
|
|
||||||
// sql function runtime context
|
// sql function runtime context
|
||||||
typedef struct SqlFunctionCtx {
|
typedef struct SqlFunctionCtx {
|
||||||
int32_t startRow;
|
SInputColumnInfoData input;
|
||||||
int32_t size; // number of rows
|
|
||||||
SColumnInfoData* pInput;
|
|
||||||
|
|
||||||
uint32_t order; // asc|desc
|
|
||||||
int16_t inputType;
|
|
||||||
int16_t inputBytes;
|
|
||||||
|
|
||||||
SResultDataInfo resDataInfo;
|
SResultDataInfo resDataInfo;
|
||||||
bool hasNull; // null value exist in current block
|
uint32_t order; // asc|desc
|
||||||
bool requireNull; // require null in some function
|
////////////////////////////////////////////////////////////////
|
||||||
|
int32_t startRow; // start row index
|
||||||
|
int32_t size; // handled processed row number
|
||||||
|
SColumnInfoData* pInput;
|
||||||
|
SColumnDataAgg agg;
|
||||||
|
int16_t inputType; // TODO remove it
|
||||||
|
int16_t inputBytes; // TODO remove it
|
||||||
|
bool hasNull; // null value exist in current block, TODO remove it
|
||||||
|
bool requireNull; // require null in some function, TODO remove it
|
||||||
|
int32_t columnIndex; // TODO remove it
|
||||||
|
uint8_t currentStage; // record current running step, default: 0
|
||||||
|
bool isAggSet;
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
bool stableQuery;
|
bool stableQuery;
|
||||||
int16_t functionId; // function id
|
int16_t functionId; // function id
|
||||||
char * pOutput; // final result output buffer, point to sdata->data
|
char * pOutput; // final result output buffer, point to sdata->data
|
||||||
uint8_t currentStage; // record current running step, default: 0
|
|
||||||
int64_t startTs; // timestamp range of current query when function is executed on a specific data block
|
int64_t startTs; // timestamp range of current query when function is executed on a specific data block
|
||||||
int32_t numOfParams;
|
int32_t numOfParams;
|
||||||
SVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
SVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
||||||
int64_t *ptsList; // corresponding timestamp array list
|
int64_t *ptsList; // corresponding timestamp array list
|
||||||
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
||||||
SVariant tag;
|
SVariant tag;
|
||||||
|
|
||||||
bool isAggSet;
|
|
||||||
SColumnDataAgg agg;
|
|
||||||
struct SResultRowEntryInfo *resultInfo;
|
struct SResultRowEntryInfo *resultInfo;
|
||||||
SExtTagsInfo tagInfo;
|
SSubsidiaryResInfo subsidiaryRes;
|
||||||
SPoint1 start;
|
SPoint1 start;
|
||||||
SPoint1 end;
|
SPoint1 end;
|
||||||
|
SFuncExecFuncs fpSet;
|
||||||
int32_t columnIndex;
|
|
||||||
SFunctionFpSet* fpSet;
|
|
||||||
} SqlFunctionCtx;
|
} SqlFunctionCtx;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -194,9 +216,10 @@ typedef struct tExprNode {
|
||||||
struct SVariant *pVal; // value node
|
struct SVariant *pVal; // value node
|
||||||
|
|
||||||
struct {// function node
|
struct {// function node
|
||||||
char functionName[FUNCTIONS_NAME_MAX_LENGTH];
|
char functionName[FUNCTIONS_NAME_MAX_LENGTH]; // todo refactor
|
||||||
|
int32_t functionId;
|
||||||
int32_t num;
|
int32_t num;
|
||||||
|
SFunctionNode *pFunctNode;
|
||||||
// Note that the attribute of pChild is not the parameter of function, it is the columns that involved in the
|
// Note that the attribute of pChild is not the parameter of function, it is the columns that involved in the
|
||||||
// calculation instead.
|
// calculation instead.
|
||||||
// E.g., Cov(col1, col2), the column information, w.r.t. the col1 and col2, is kept in pChild nodes.
|
// E.g., Cov(col1, col2), the column information, w.r.t. the col1 and col2, is kept in pChild nodes.
|
||||||
|
@ -207,7 +230,6 @@ typedef struct tExprNode {
|
||||||
};
|
};
|
||||||
} tExprNode;
|
} tExprNode;
|
||||||
|
|
||||||
//TODO create?
|
|
||||||
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree);
|
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree);
|
||||||
void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *));
|
void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *));
|
||||||
|
|
||||||
|
@ -294,7 +316,7 @@ tExprNode* exprdup(tExprNode* pTree);
|
||||||
|
|
||||||
void resetResultRowEntryResult(SqlFunctionCtx* pCtx, int32_t num);
|
void resetResultRowEntryResult(SqlFunctionCtx* pCtx, int32_t num);
|
||||||
void cleanupResultRowEntry(struct SResultRowEntryInfo* pCell);
|
void cleanupResultRowEntry(struct SResultRowEntryInfo* pCell);
|
||||||
int32_t getNumOfResult(SqlFunctionCtx* pCtx, int32_t num);
|
int32_t getNumOfResult(SqlFunctionCtx* pCtx, int32_t num, SSDataBlock* pResBlock);
|
||||||
bool isRowEntryCompleted(struct SResultRowEntryInfo* pEntry);
|
bool isRowEntryCompleted(struct SResultRowEntryInfo* pEntry);
|
||||||
bool isRowEntryInitialized(struct SResultRowEntryInfo* pEntry);
|
bool isRowEntryInitialized(struct SResultRowEntryInfo* pEntry);
|
||||||
|
|
||||||
|
|
|
@ -102,22 +102,6 @@ struct SqlFunctionCtx;
|
||||||
struct SResultRowEntryInfo;
|
struct SResultRowEntryInfo;
|
||||||
struct STimeWindow;
|
struct STimeWindow;
|
||||||
|
|
||||||
typedef struct SFuncExecEnv {
|
|
||||||
int32_t calcMemSize;
|
|
||||||
} SFuncExecEnv;
|
|
||||||
|
|
||||||
typedef bool (*FExecGetEnv)(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
|
||||||
typedef bool (*FExecInit)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);
|
|
||||||
typedef void (*FExecProcess)(struct SqlFunctionCtx *pCtx);
|
|
||||||
typedef void (*FExecFinalize)(struct SqlFunctionCtx *pCtx);
|
|
||||||
|
|
||||||
typedef struct SFuncExecFuncs {
|
|
||||||
FExecGetEnv getEnv;
|
|
||||||
FExecInit init;
|
|
||||||
FExecProcess process;
|
|
||||||
FExecFinalize finalize;
|
|
||||||
} SFuncExecFuncs;
|
|
||||||
|
|
||||||
typedef int32_t (*FScalarExecProcess)(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
typedef int32_t (*FScalarExecProcess)(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
||||||
typedef struct SScalarFuncExecFuncs {
|
typedef struct SScalarFuncExecFuncs {
|
||||||
|
@ -127,6 +111,8 @@ typedef struct SScalarFuncExecFuncs {
|
||||||
|
|
||||||
int32_t fmFuncMgtInit();
|
int32_t fmFuncMgtInit();
|
||||||
|
|
||||||
|
void fmFuncMgtDestroy();
|
||||||
|
|
||||||
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType);
|
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType);
|
||||||
|
|
||||||
int32_t fmGetFuncResultType(SFunctionNode* pFunc);
|
int32_t fmGetFuncResultType(SFunctionNode* pFunc);
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* 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 _TD_CMD_NODES_H_
|
||||||
|
#define _TD_CMD_NODES_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "querynodes.h"
|
||||||
|
|
||||||
|
typedef struct SDatabaseOptions {
|
||||||
|
int32_t numOfBlocks;
|
||||||
|
int32_t cacheBlockSize;
|
||||||
|
int8_t cachelast;
|
||||||
|
int32_t compressionLevel;
|
||||||
|
int32_t daysPerFile;
|
||||||
|
int32_t fsyncPeriod;
|
||||||
|
int32_t maxRowsPerBlock;
|
||||||
|
int32_t minRowsPerBlock;
|
||||||
|
int32_t keep;
|
||||||
|
int32_t precision;
|
||||||
|
int32_t quorum;
|
||||||
|
int32_t replica;
|
||||||
|
int32_t ttl;
|
||||||
|
int32_t walLevel;
|
||||||
|
int32_t numOfVgroups;
|
||||||
|
int8_t singleStable;
|
||||||
|
int8_t streamMode;
|
||||||
|
} SDatabaseOptions;
|
||||||
|
|
||||||
|
typedef struct SCreateDatabaseStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
bool ignoreExists;
|
||||||
|
SDatabaseOptions options;
|
||||||
|
} SCreateDatabaseStmt;
|
||||||
|
|
||||||
|
typedef struct SUseDatabaseStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
} SUseDatabaseStmt;
|
||||||
|
|
||||||
|
typedef struct SDropDatabaseStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropDatabaseStmt;
|
||||||
|
|
||||||
|
typedef struct STableOptions {
|
||||||
|
int32_t keep;
|
||||||
|
int32_t ttl;
|
||||||
|
char comments[TSDB_STB_COMMENT_LEN];
|
||||||
|
SNodeList* pSma;
|
||||||
|
} STableOptions;
|
||||||
|
|
||||||
|
typedef struct SColumnDefNode {
|
||||||
|
ENodeType type;
|
||||||
|
char colName[TSDB_COL_NAME_LEN];
|
||||||
|
SDataType dataType;
|
||||||
|
char comments[TSDB_STB_COMMENT_LEN];
|
||||||
|
} SColumnDefNode;
|
||||||
|
|
||||||
|
typedef struct SCreateTableStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
bool ignoreExists;
|
||||||
|
SNodeList* pCols;
|
||||||
|
SNodeList* pTags;
|
||||||
|
STableOptions options;
|
||||||
|
} SCreateTableStmt;
|
||||||
|
|
||||||
|
typedef struct SCreateSubTableClause {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char useDbName[TSDB_DB_NAME_LEN];
|
||||||
|
char useTableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
bool ignoreExists;
|
||||||
|
SNodeList* pSpecificTags;
|
||||||
|
SNodeList* pValsOfTags;
|
||||||
|
} SCreateSubTableClause;
|
||||||
|
|
||||||
|
typedef struct SCreateMultiTableStmt {
|
||||||
|
ENodeType type;
|
||||||
|
SNodeList* pSubTables;
|
||||||
|
} SCreateMultiTableStmt;
|
||||||
|
|
||||||
|
typedef struct SDropTableClause {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropTableClause;
|
||||||
|
|
||||||
|
typedef struct SDropTableStmt {
|
||||||
|
ENodeType type;
|
||||||
|
SNodeList* pTables;
|
||||||
|
} SDropTableStmt;
|
||||||
|
|
||||||
|
typedef struct SDropSuperTableStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
bool ignoreNotExists;
|
||||||
|
} SDropSuperTableStmt;
|
||||||
|
|
||||||
|
typedef struct SCreateUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN];
|
||||||
|
} SCreateUserStmt;
|
||||||
|
|
||||||
|
typedef struct SAlterUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
char password[TSDB_USET_PASSWORD_LEN];
|
||||||
|
int8_t alterType;
|
||||||
|
} SAlterUserStmt;
|
||||||
|
|
||||||
|
typedef struct SDropUserStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char useName[TSDB_USER_LEN];
|
||||||
|
} SDropUserStmt;
|
||||||
|
|
||||||
|
typedef struct SCreateDnodeStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
|
} SCreateDnodeStmt;
|
||||||
|
|
||||||
|
typedef struct SDropDnodeStmt {
|
||||||
|
ENodeType type;
|
||||||
|
int32_t dnodeId;
|
||||||
|
char fqdn[TSDB_FQDN_LEN];
|
||||||
|
int32_t port;
|
||||||
|
} SDropDnodeStmt;
|
||||||
|
|
||||||
|
typedef struct SShowStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
} SShowStmt;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_CMD_NODES_H_*/
|
|
@ -65,24 +65,60 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_TARGET,
|
QUERY_NODE_TARGET,
|
||||||
QUERY_NODE_DATABLOCK_DESC,
|
QUERY_NODE_DATABLOCK_DESC,
|
||||||
QUERY_NODE_SLOT_DESC,
|
QUERY_NODE_SLOT_DESC,
|
||||||
|
QUERY_NODE_COLUMN_DEF,
|
||||||
|
QUERY_NODE_DOWNSTREAM_SOURCE,
|
||||||
|
|
||||||
// Statement nodes are used in parser and planner module.
|
// Statement nodes are used in parser and planner module.
|
||||||
QUERY_NODE_SET_OPERATOR,
|
QUERY_NODE_SET_OPERATOR,
|
||||||
QUERY_NODE_SELECT_STMT,
|
QUERY_NODE_SELECT_STMT,
|
||||||
QUERY_NODE_SHOW_STMT,
|
QUERY_NODE_VNODE_MODIF_STMT,
|
||||||
|
QUERY_NODE_CREATE_DATABASE_STMT,
|
||||||
|
QUERY_NODE_DROP_DATABASE_STMT,
|
||||||
|
QUERY_NODE_SHOW_DATABASES_STMT, // temp
|
||||||
|
QUERY_NODE_CREATE_TABLE_STMT,
|
||||||
|
QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
|
||||||
|
QUERY_NODE_CREATE_MULTI_TABLE_STMT,
|
||||||
|
QUERY_NODE_DROP_TABLE_CLAUSE,
|
||||||
|
QUERY_NODE_DROP_TABLE_STMT,
|
||||||
|
QUERY_NODE_DROP_SUPER_TABLE_STMT,
|
||||||
|
QUERY_NODE_SHOW_TABLES_STMT, // temp
|
||||||
|
QUERY_NODE_SHOW_STABLES_STMT,
|
||||||
|
QUERY_NODE_CREATE_USER_STMT,
|
||||||
|
QUERY_NODE_ALTER_USER_STMT,
|
||||||
|
QUERY_NODE_DROP_USER_STMT,
|
||||||
|
QUERY_NODE_SHOW_USERS_STMT,
|
||||||
|
QUERY_NODE_USE_DATABASE_STMT,
|
||||||
|
QUERY_NODE_CREATE_DNODE_STMT,
|
||||||
|
QUERY_NODE_DROP_DNODE_STMT,
|
||||||
|
QUERY_NODE_SHOW_DNODES_STMT,
|
||||||
|
QUERY_NODE_SHOW_VGROUPS_STMT,
|
||||||
|
QUERY_NODE_SHOW_MNODES_STMT,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN,
|
QUERY_NODE_LOGIC_PLAN_SCAN,
|
||||||
QUERY_NODE_LOGIC_PLAN_JOIN,
|
QUERY_NODE_LOGIC_PLAN_JOIN,
|
||||||
QUERY_NODE_LOGIC_PLAN_AGG,
|
QUERY_NODE_LOGIC_PLAN_AGG,
|
||||||
QUERY_NODE_LOGIC_PLAN_PROJECT,
|
QUERY_NODE_LOGIC_PLAN_PROJECT,
|
||||||
|
QUERY_NODE_LOGIC_PLAN_VNODE_MODIF,
|
||||||
|
QUERY_NODE_LOGIC_PLAN_EXCHANGE,
|
||||||
|
QUERY_NODE_LOGIC_SUBPLAN,
|
||||||
|
QUERY_NODE_LOGIC_PLAN,
|
||||||
|
|
||||||
// physical plan node
|
// physical plan node
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_PROJECT,
|
QUERY_NODE_PHYSICAL_PLAN_PROJECT,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_JOIN,
|
QUERY_NODE_PHYSICAL_PLAN_JOIN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_AGG
|
QUERY_NODE_PHYSICAL_PLAN_AGG,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_EXCHANGE,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_SORT,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_INSERT,
|
||||||
|
QUERY_NODE_PHYSICAL_SUBPLAN,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN
|
||||||
} ENodeType;
|
} ENodeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,15 +141,20 @@ typedef struct SNodeList {
|
||||||
SListCell* pTail;
|
SListCell* pTail;
|
||||||
} SNodeList;
|
} SNodeList;
|
||||||
|
|
||||||
SNode* nodesMakeNode(ENodeType type);
|
#define SNodeptr void*
|
||||||
void nodesDestroyNode(SNode* pNode);
|
|
||||||
|
SNodeptr nodesMakeNode(ENodeType type);
|
||||||
|
void nodesDestroyNode(SNodeptr pNode);
|
||||||
|
|
||||||
SNodeList* nodesMakeList();
|
SNodeList* nodesMakeList();
|
||||||
int32_t nodesListAppend(SNodeList* pList, SNode* pNode);
|
int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode);
|
||||||
|
int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode);
|
||||||
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
||||||
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
|
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
|
||||||
SNode* nodesListGetNode(SNodeList* pList, int32_t index);
|
SNodeptr nodesListGetNode(SNodeList* pList, int32_t index);
|
||||||
void nodesDestroyList(SNodeList* pList);
|
void nodesDestroyList(SNodeList* pList);
|
||||||
|
// Only clear the linked list structure, without releasing the elements inside
|
||||||
|
void nodesClearList(SNodeList* pList);
|
||||||
|
|
||||||
typedef enum EDealRes {
|
typedef enum EDealRes {
|
||||||
DEAL_RES_CONTINUE = 1,
|
DEAL_RES_CONTINUE = 1,
|
||||||
|
@ -122,9 +163,9 @@ typedef enum EDealRes {
|
||||||
} EDealRes;
|
} EDealRes;
|
||||||
|
|
||||||
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
|
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
|
||||||
void nodesWalkNode(SNode* pNode, FNodeWalker walker, void* pContext);
|
void nodesWalkNode(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkList(SNodeList* pList, FNodeWalker walker, void* pContext);
|
void nodesWalkList(SNodeList* pList, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkNodePostOrder(SNode* pNode, FNodeWalker walker, void* pContext);
|
void nodesWalkNodePostOrder(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkListPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext);
|
void nodesWalkListPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext);
|
||||||
|
|
||||||
typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
|
typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
|
||||||
|
@ -133,12 +174,13 @@ void nodesRewriteList(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
||||||
void nodesRewriteNodePostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteNodePostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
||||||
void nodesRewriteListPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteListPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
||||||
|
|
||||||
bool nodesEqualNode(const SNode* a, const SNode* b);
|
bool nodesEqualNode(const SNodeptr a, const SNodeptr b);
|
||||||
|
|
||||||
SNode* nodesCloneNode(const SNode* pNode);
|
SNodeptr nodesCloneNode(const SNodeptr pNode);
|
||||||
SNodeList* nodesCloneList(const SNodeList* pList);
|
SNodeList* nodesCloneList(const SNodeList* pList);
|
||||||
|
|
||||||
int32_t nodesNodeToString(const SNode* pNode, bool format, char** pStr, int32_t* pLen);
|
const char* nodesNodeName(ENodeType type);
|
||||||
|
int32_t nodesNodeToString(const SNodeptr pNode, bool format, char** pStr, int32_t* pLen);
|
||||||
int32_t nodesStringToNode(const char* pStr, SNode** pNode);
|
int32_t nodesStringToNode(const char* pStr, SNode** pNode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -21,7 +21,8 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "tmsg.h"
|
#include "query.h"
|
||||||
|
#include "tname.h"
|
||||||
|
|
||||||
typedef struct SLogicNode {
|
typedef struct SLogicNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
|
@ -43,9 +44,11 @@ typedef struct SScanLogicNode {
|
||||||
SLogicNode node;
|
SLogicNode node;
|
||||||
SNodeList* pScanCols;
|
SNodeList* pScanCols;
|
||||||
struct STableMeta* pMeta;
|
struct STableMeta* pMeta;
|
||||||
|
SVgroupsInfo* pVgroupList;
|
||||||
EScanType scanType;
|
EScanType scanType;
|
||||||
uint8_t scanFlag; // denotes reversed scan of data or not
|
uint8_t scanFlag; // denotes reversed scan of data or not
|
||||||
STimeWindow scanRange;
|
STimeWindow scanRange;
|
||||||
|
SName tableName;
|
||||||
} SScanLogicNode;
|
} SScanLogicNode;
|
||||||
|
|
||||||
typedef struct SJoinLogicNode {
|
typedef struct SJoinLogicNode {
|
||||||
|
@ -65,6 +68,49 @@ typedef struct SProjectLogicNode {
|
||||||
SNodeList* pProjections;
|
SNodeList* pProjections;
|
||||||
} SProjectLogicNode;
|
} SProjectLogicNode;
|
||||||
|
|
||||||
|
typedef struct SVnodeModifLogicNode {
|
||||||
|
SLogicNode node;;
|
||||||
|
int32_t msgType;
|
||||||
|
SArray* pDataBlocks;
|
||||||
|
SVgDataBlocks* pVgDataBlocks;
|
||||||
|
} SVnodeModifLogicNode;
|
||||||
|
|
||||||
|
typedef struct SExchangeLogicNode {
|
||||||
|
SLogicNode node;
|
||||||
|
int32_t srcGroupId;
|
||||||
|
} SExchangeLogicNode;
|
||||||
|
|
||||||
|
typedef enum ESubplanType {
|
||||||
|
SUBPLAN_TYPE_MERGE = 1,
|
||||||
|
SUBPLAN_TYPE_PARTIAL,
|
||||||
|
SUBPLAN_TYPE_SCAN,
|
||||||
|
SUBPLAN_TYPE_MODIFY
|
||||||
|
} ESubplanType;
|
||||||
|
|
||||||
|
typedef struct SSubplanId {
|
||||||
|
uint64_t queryId;
|
||||||
|
int32_t groupId;
|
||||||
|
int32_t subplanId;
|
||||||
|
} SSubplanId;
|
||||||
|
|
||||||
|
typedef struct SSubLogicPlan {
|
||||||
|
ENodeType type;
|
||||||
|
SSubplanId id;
|
||||||
|
SNodeList* pChildren;
|
||||||
|
SNodeList* pParents;
|
||||||
|
SLogicNode* pNode;
|
||||||
|
ESubplanType subplanType;
|
||||||
|
SVgroupsInfo* pVgroupList;
|
||||||
|
int32_t level;
|
||||||
|
int32_t splitFlag;
|
||||||
|
} SSubLogicPlan;
|
||||||
|
|
||||||
|
typedef struct SQueryLogicPlan {
|
||||||
|
ENodeType type;;
|
||||||
|
int32_t totalLevel;
|
||||||
|
SNodeList* pTopSubplans;
|
||||||
|
} SQueryLogicPlan;
|
||||||
|
|
||||||
typedef struct SSlotDescNode {
|
typedef struct SSlotDescNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int16_t slotId;
|
int16_t slotId;
|
||||||
|
@ -78,11 +124,13 @@ typedef struct SDataBlockDescNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int16_t dataBlockId;
|
int16_t dataBlockId;
|
||||||
SNodeList* pSlots;
|
SNodeList* pSlots;
|
||||||
|
int32_t resultRowSize;
|
||||||
|
int16_t precision;
|
||||||
} SDataBlockDescNode;
|
} SDataBlockDescNode;
|
||||||
|
|
||||||
typedef struct SPhysiNode {
|
typedef struct SPhysiNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
SDataBlockDescNode outputDataBlockDesc;
|
SDataBlockDescNode* pOutputDataBlockDesc;
|
||||||
SNode* pConditions;
|
SNode* pConditions;
|
||||||
SNodeList* pChildren;
|
SNodeList* pChildren;
|
||||||
struct SPhysiNode* pParent;
|
struct SPhysiNode* pParent;
|
||||||
|
@ -96,6 +144,7 @@ typedef struct SScanPhysiNode {
|
||||||
int32_t order; // scan order: TSDB_ORDER_ASC|TSDB_ORDER_DESC
|
int32_t order; // scan order: TSDB_ORDER_ASC|TSDB_ORDER_DESC
|
||||||
int32_t count; // repeat count
|
int32_t count; // repeat count
|
||||||
int32_t reverse; // reverse scan count
|
int32_t reverse; // reverse scan count
|
||||||
|
SName tableName;
|
||||||
} SScanPhysiNode;
|
} SScanPhysiNode;
|
||||||
|
|
||||||
typedef SScanPhysiNode SSystemTableScanPhysiNode;
|
typedef SScanPhysiNode SSystemTableScanPhysiNode;
|
||||||
|
@ -129,6 +178,56 @@ typedef struct SAggPhysiNode {
|
||||||
SNodeList* pAggFuncs;
|
SNodeList* pAggFuncs;
|
||||||
} SAggPhysiNode;
|
} SAggPhysiNode;
|
||||||
|
|
||||||
|
typedef struct SDownstreamSourceNode {
|
||||||
|
ENodeType type;
|
||||||
|
SQueryNodeAddr addr;
|
||||||
|
uint64_t taskId;
|
||||||
|
uint64_t schedId;
|
||||||
|
} SDownstreamSourceNode;
|
||||||
|
|
||||||
|
typedef struct SExchangePhysiNode {
|
||||||
|
SPhysiNode node;
|
||||||
|
int32_t srcGroupId; // group id of datasource suplans
|
||||||
|
SNodeList* pSrcEndPoints; // element is SDownstreamSource, scheduler fill by calling qSetSuplanExecutionNode
|
||||||
|
} SExchangePhysiNode;
|
||||||
|
|
||||||
|
typedef struct SDataSinkNode {
|
||||||
|
ENodeType type;
|
||||||
|
SDataBlockDescNode* pInputDataBlockDesc;
|
||||||
|
} SDataSinkNode;
|
||||||
|
|
||||||
|
typedef struct SDataDispatcherNode {
|
||||||
|
SDataSinkNode sink;
|
||||||
|
} SDataDispatcherNode;
|
||||||
|
|
||||||
|
typedef struct SDataInserterNode {
|
||||||
|
SDataSinkNode sink;
|
||||||
|
int32_t numOfTables;
|
||||||
|
uint32_t size;
|
||||||
|
char *pData;
|
||||||
|
} SDataInserterNode;
|
||||||
|
|
||||||
|
typedef struct SSubplan {
|
||||||
|
ENodeType type;
|
||||||
|
SSubplanId id; // unique id of the subplan
|
||||||
|
ESubplanType subplanType;
|
||||||
|
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.
|
||||||
|
SQueryNodeAddr execNode; // for the scan/modify subplan, the optional execution node
|
||||||
|
SQueryNodeStat execNodeStat; // only for scan subplan
|
||||||
|
SNodeList* pChildren; // the datasource subplan,from which to fetch the result
|
||||||
|
SNodeList* pParents; // the data destination subplan, get data from current subplan
|
||||||
|
SPhysiNode* pNode; // physical plan of current subplan
|
||||||
|
SDataSinkNode* pDataSink; // data of the subplan flow into the datasink
|
||||||
|
} SSubplan;
|
||||||
|
|
||||||
|
typedef struct SQueryPlan {
|
||||||
|
ENodeType type;;
|
||||||
|
uint64_t queryId;
|
||||||
|
int32_t numOfSubplans;
|
||||||
|
SNodeList* pSubplans; // Element is SNodeListNode. The execution level of subplan, starting from 0.
|
||||||
|
} SQueryPlan;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,6 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
|
||||||
typedef struct SRawExprNode {
|
typedef struct SRawExprNode {
|
||||||
ENodeType nodeType;
|
ENodeType nodeType;
|
||||||
|
@ -73,6 +74,7 @@ typedef struct SValueNode {
|
||||||
SExprNode node; // QUERY_NODE_VALUE
|
SExprNode node; // QUERY_NODE_VALUE
|
||||||
char* literal;
|
char* literal;
|
||||||
bool isDuration;
|
bool isDuration;
|
||||||
|
bool translate;
|
||||||
union {
|
union {
|
||||||
bool b;
|
bool b;
|
||||||
int64_t i;
|
int64_t i;
|
||||||
|
@ -122,6 +124,7 @@ struct STableMeta;
|
||||||
typedef struct SRealTableNode {
|
typedef struct SRealTableNode {
|
||||||
STableNode table; // QUERY_NODE_REAL_TABLE
|
STableNode table; // QUERY_NODE_REAL_TABLE
|
||||||
struct STableMeta* pMeta;
|
struct STableMeta* pMeta;
|
||||||
|
SVgroupsInfo* pVgroupList;
|
||||||
} SRealTableNode;
|
} SRealTableNode;
|
||||||
|
|
||||||
typedef struct STempTableNode {
|
typedef struct STempTableNode {
|
||||||
|
@ -248,6 +251,29 @@ typedef enum ESqlClause {
|
||||||
SQL_CLAUSE_ORDER_BY
|
SQL_CLAUSE_ORDER_BY
|
||||||
} ESqlClause;
|
} ESqlClause;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PAYLOAD_TYPE_KV = 0,
|
||||||
|
PAYLOAD_TYPE_RAW = 1,
|
||||||
|
} EPayloadType;
|
||||||
|
|
||||||
|
typedef struct SVgDataBlocks {
|
||||||
|
SVgroupInfo vg;
|
||||||
|
int32_t numOfTables; // number of tables in current submit block
|
||||||
|
uint32_t size;
|
||||||
|
char *pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
|
||||||
|
} SVgDataBlocks;
|
||||||
|
|
||||||
|
typedef struct SVnodeModifOpStmt {
|
||||||
|
ENodeType nodeType;
|
||||||
|
ENodeType sqlNodeType;
|
||||||
|
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
||||||
|
int8_t schemaAttache; // denote if submit block is built with table schema or not
|
||||||
|
uint8_t payloadType; // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
||||||
|
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
||||||
|
const char* sql; // current sql statement position
|
||||||
|
} SVnodeModifOpStmt;
|
||||||
|
|
||||||
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
|
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
|
||||||
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);
|
||||||
|
|
||||||
|
|
|
@ -1,163 +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 _TD_PARSENODES_H_
|
|
||||||
#define _TD_PARSENODES_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "catalog.h"
|
|
||||||
#include "tcommon.h"
|
|
||||||
#include "function.h"
|
|
||||||
#include "tmsgtype.h"
|
|
||||||
#include "tname.h"
|
|
||||||
#include "tvariant.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The first field of a node of any type is guaranteed to be the int16_t.
|
|
||||||
* Hence the type of any node can be gotten by casting it to SQueryNode.
|
|
||||||
*/
|
|
||||||
typedef struct SQueryNode {
|
|
||||||
int16_t type;
|
|
||||||
} SQueryNode;
|
|
||||||
|
|
||||||
#define queryNodeType(nodeptr) (((const SQueryNode*)(nodeptr))->type)
|
|
||||||
|
|
||||||
typedef struct SFieldInfo {
|
|
||||||
int16_t numOfOutput; // number of column in result
|
|
||||||
SField *final;
|
|
||||||
SArray *internalField; // SArray<SInternalField>
|
|
||||||
} SFieldInfo;
|
|
||||||
|
|
||||||
typedef struct SCond {
|
|
||||||
uint64_t uid;
|
|
||||||
int32_t len; // length of tag query condition data
|
|
||||||
char * cond;
|
|
||||||
} SCond;
|
|
||||||
|
|
||||||
typedef struct SJoinNode {
|
|
||||||
uint64_t uid;
|
|
||||||
int16_t tagColId;
|
|
||||||
SArray* tsJoin;
|
|
||||||
SArray* tagJoin;
|
|
||||||
} SJoinNode;
|
|
||||||
|
|
||||||
typedef struct SJoinInfo {
|
|
||||||
bool hasJoin;
|
|
||||||
SJoinNode *joinTables[TSDB_MAX_JOIN_TABLE_NUM];
|
|
||||||
} SJoinInfo;
|
|
||||||
|
|
||||||
typedef struct STagCond {
|
|
||||||
int16_t relType; // relation between tbname list and query condition, including : TK_AND or TK_OR
|
|
||||||
SCond tbnameCond; // tbname query condition, only support tbname query condition on one table
|
|
||||||
SJoinInfo joinInfo; // join condition, only support two tables join currently
|
|
||||||
SArray *pCond; // for different table, the query condition must be seperated
|
|
||||||
} STagCond;
|
|
||||||
|
|
||||||
typedef struct STableMetaInfo {
|
|
||||||
STableMeta *pTableMeta; // table meta, cached in client side and acquired by name
|
|
||||||
SVgroupsInfo *vgroupList;
|
|
||||||
SName name;
|
|
||||||
char aliasName[TSDB_TABLE_NAME_LEN]; // alias name of table specified in query sql
|
|
||||||
SArray *tagColList; // SArray<SColumn*>, involved tag columns
|
|
||||||
} STableMetaInfo;
|
|
||||||
|
|
||||||
typedef struct SColumnIndex {
|
|
||||||
int16_t tableIndex;
|
|
||||||
int16_t columnIndex;
|
|
||||||
int16_t type; // normal column/tag/ user input constant column
|
|
||||||
} SColumnIndex;
|
|
||||||
|
|
||||||
// select statement
|
|
||||||
typedef struct SQueryStmtInfo {
|
|
||||||
int16_t command; // the command may be different for each subclause, so keep it seperately.
|
|
||||||
uint32_t type; // query/insert type
|
|
||||||
STimeWindow window; // the whole query time window
|
|
||||||
SInterval interval; // tumble time window
|
|
||||||
SSessionWindow sessionWindow; // session time window
|
|
||||||
SStateWindow stateWindow; // state window query
|
|
||||||
SGroupbyExpr groupbyExpr; // groupby tags info
|
|
||||||
SArray * colList; // SArray<SColumn*>
|
|
||||||
SFieldInfo fieldsInfo;
|
|
||||||
SArray** exprList; // SArray<SExprInfo*>
|
|
||||||
SLimit limit;
|
|
||||||
SLimit slimit;
|
|
||||||
STagCond tagCond;
|
|
||||||
SArray * colCond;
|
|
||||||
SArray * order;
|
|
||||||
int16_t numOfTables;
|
|
||||||
int16_t curTableIdx;
|
|
||||||
STableMetaInfo **pTableMetaInfo;
|
|
||||||
struct STSBuf *tsBuf;
|
|
||||||
|
|
||||||
int16_t fillType; // final result fill type
|
|
||||||
int64_t * fillVal; // default value for fill
|
|
||||||
int32_t numOfFillVal; // fill value size
|
|
||||||
|
|
||||||
char * msg; // pointer to the pCmd->payload to keep error message temporarily
|
|
||||||
int64_t clauseLimit; // limit for current sub clause
|
|
||||||
|
|
||||||
int64_t prjOffset; // offset value in the original sql expression, only applied at client side
|
|
||||||
int64_t vgroupLimit; // table limit in case of super table projection query + global order + limit
|
|
||||||
|
|
||||||
int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
|
|
||||||
int32_t bufLen;
|
|
||||||
char* buf;
|
|
||||||
SArray *pUdfInfo;
|
|
||||||
|
|
||||||
struct SQueryStmtInfo *sibling; // sibling
|
|
||||||
SMultiFunctionsDesc info;
|
|
||||||
SArray *pDownstream; // SArray<struct SQueryStmtInfo>
|
|
||||||
int32_t havingFieldNum;
|
|
||||||
int32_t exprListLevelIndex;
|
|
||||||
} SQueryStmtInfo;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
PAYLOAD_TYPE_KV = 0,
|
|
||||||
PAYLOAD_TYPE_RAW = 1,
|
|
||||||
} EPayloadType;
|
|
||||||
|
|
||||||
typedef struct SVgDataBlocks {
|
|
||||||
SVgroupInfo vg;
|
|
||||||
int32_t numOfTables; // number of tables in current submit block
|
|
||||||
uint32_t size;
|
|
||||||
char *pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
|
|
||||||
} SVgDataBlocks;
|
|
||||||
|
|
||||||
typedef struct SVnodeModifOpStmtInfo {
|
|
||||||
int16_t nodeType;
|
|
||||||
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
|
||||||
int8_t schemaAttache; // denote if submit block is built with table schema or not
|
|
||||||
uint8_t payloadType; // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
|
||||||
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
|
||||||
const char* sql; // current sql statement position
|
|
||||||
} SVnodeModifOpStmtInfo;
|
|
||||||
|
|
||||||
typedef struct SDclStmtInfo {
|
|
||||||
int16_t nodeType;
|
|
||||||
int16_t msgType;
|
|
||||||
SEpSet epSet;
|
|
||||||
char* pMsg;
|
|
||||||
int32_t msgLen;
|
|
||||||
void* pExtension; // todo remove it soon
|
|
||||||
} SDclStmtInfo;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_PARSENODES_H_*/
|
|
|
@ -20,7 +20,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "parsenodes.h"
|
#include "querynodes.h"
|
||||||
|
|
||||||
typedef struct SParseContext {
|
typedef struct SParseContext {
|
||||||
uint64_t requestId;
|
uint64_t requestId;
|
||||||
|
@ -32,67 +32,30 @@ typedef struct SParseContext {
|
||||||
size_t sqlLen; // length of the sql string
|
size_t sqlLen; // length of the sql string
|
||||||
char *pMsg; // extended error message if exists to help identifying the problem in sql statement.
|
char *pMsg; // extended error message if exists to help identifying the problem in sql statement.
|
||||||
int32_t msgLen; // max length of the msg
|
int32_t msgLen; // max length of the msg
|
||||||
|
|
||||||
struct SCatalog *pCatalog;
|
struct SCatalog *pCatalog;
|
||||||
} SParseContext;
|
} SParseContext;
|
||||||
|
|
||||||
/**
|
typedef struct SCmdMsgInfo {
|
||||||
* Parse the sql statement and then return the SQueryStmtInfo as the result of bounded AST.
|
int16_t msgType;
|
||||||
* @param pSql sql string
|
SEpSet epSet;
|
||||||
* @param length length of the sql string
|
void* pMsg;
|
||||||
* @param id operator id, generated by uuid generator
|
int32_t msgLen;
|
||||||
* @param msg extended error message if exists.
|
void* pExtension; // todo remove it soon
|
||||||
* @return error code
|
} SCmdMsgInfo;
|
||||||
*/
|
|
||||||
int32_t qParseQuerySql(SParseContext* pContext, SQueryNode** pQueryNode);
|
|
||||||
|
|
||||||
/**
|
typedef struct SQuery {
|
||||||
* Return true if it is a ddl/dcl sql statement
|
bool directRpc;
|
||||||
* @param pQuery
|
bool haveResultSet;
|
||||||
* @return
|
SNode* pRoot;
|
||||||
*/
|
int32_t numOfResCols;
|
||||||
bool qIsDdlQuery(const SQueryNode* pQueryNode);
|
SSchema* pResSchema;
|
||||||
|
SCmdMsgInfo* pCmdMsg;
|
||||||
|
int32_t msgType;
|
||||||
|
} SQuery;
|
||||||
|
|
||||||
/**
|
int32_t qParseQuerySql(SParseContext* pCxt, SQuery** pQuery);
|
||||||
* Destroy logic query plan
|
|
||||||
* @param pQueryNode
|
|
||||||
*/
|
|
||||||
void qDestroyQuery(SQueryNode* pQueryNode);
|
|
||||||
|
|
||||||
/**
|
void qDestroyQuery(SQuery* pQueryNode);
|
||||||
* Convert a normal sql statement to only query tags information to enable that the subscribe client can be aware quickly of the true vgroup ids that
|
|
||||||
* involved in the subscribe procedure.
|
|
||||||
* @param pSql
|
|
||||||
* @param length
|
|
||||||
* @param pConvertSql
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t qParserConvertSql(const char* pStr, size_t length, char** pConvertSql);
|
|
||||||
|
|
||||||
void assignExprInfo(SExprInfo* dst, const SExprInfo* src);
|
|
||||||
void columnListCopy(SArray* dst, const SArray* src, uint64_t uid);
|
|
||||||
void columnListDestroy(SArray* pColumnList);
|
|
||||||
|
|
||||||
void dropAllExprInfo(SArray** pExprInfo, int32_t numOfLevel);
|
|
||||||
void dropOneLevelExprInfo(SArray* pExprInfo);
|
|
||||||
|
|
||||||
typedef struct SSourceParam {
|
|
||||||
SArray *pExprNodeList; //Array<struct tExprNode*>
|
|
||||||
SArray *pColumnList; //Array<struct SColumn>
|
|
||||||
int32_t num;
|
|
||||||
} SSourceParam;
|
|
||||||
|
|
||||||
SExprInfo* createExprInfo(STableMetaInfo* pTableMetaInfo, const char* funcName, SSourceParam* pSource, SSchema* pResSchema, int16_t interSize);
|
|
||||||
int32_t copyExprInfoList(SArray* dst, const SArray* src, uint64_t uid, bool deepcopy);
|
|
||||||
int32_t copyAllExprInfo(SArray* dst, const SArray* src, bool deepcopy);
|
|
||||||
int32_t getExprFunctionLevel(const SQueryStmtInfo* pQueryInfo);
|
|
||||||
|
|
||||||
STableMetaInfo* getMetaInfo(const SQueryStmtInfo* pQueryInfo, int32_t tableIndex);
|
|
||||||
SSchema *getOneColumnSchema(const STableMeta* pTableMeta, int32_t colIndex);
|
|
||||||
|
|
||||||
int32_t getNewResColId();
|
|
||||||
void addIntoSourceParam(SSourceParam* pSourceParam, tExprNode* pNode, SColumn* pColumn);
|
|
||||||
SExprInfo* createBinaryExprInfo(struct tExprNode* pNode, SSchema* pResSchema);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,192 +20,31 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "query.h"
|
#include "plannodes.h"
|
||||||
#include "tmsg.h"
|
|
||||||
#include "tarray.h"
|
|
||||||
#include "trpc.h"
|
|
||||||
|
|
||||||
#define QUERY_TYPE_MERGE 1
|
typedef struct SPlanContext {
|
||||||
#define QUERY_TYPE_PARTIAL 2
|
|
||||||
#define QUERY_TYPE_SCAN 3
|
|
||||||
#define QUERY_TYPE_MODIFY 4
|
|
||||||
|
|
||||||
enum OPERATOR_TYPE_E {
|
|
||||||
OP_Unknown,
|
|
||||||
#define INCLUDE_AS_ENUM
|
|
||||||
#include "plannerOp.h"
|
|
||||||
#undef INCLUDE_AS_ENUM
|
|
||||||
OP_TotalNum
|
|
||||||
};
|
|
||||||
|
|
||||||
enum DATASINK_TYPE_E {
|
|
||||||
DSINK_Unknown,
|
|
||||||
DSINK_Dispatch,
|
|
||||||
DSINK_Insert,
|
|
||||||
DSINK_TotalNum
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SEpSet;
|
|
||||||
struct SQueryStmtInfo;
|
|
||||||
|
|
||||||
typedef SSchema SSlotSchema;
|
|
||||||
|
|
||||||
typedef struct SDataBlockSchema {
|
|
||||||
SSlotSchema *pSchema;
|
|
||||||
int32_t numOfCols; // number of columns
|
|
||||||
int32_t resultRowSize;
|
|
||||||
int16_t precision;
|
|
||||||
} SDataBlockSchema;
|
|
||||||
|
|
||||||
typedef struct SQueryNodeBasicInfo {
|
|
||||||
int32_t type; // operator type
|
|
||||||
const char *name; // operator name
|
|
||||||
} SQueryNodeBasicInfo;
|
|
||||||
|
|
||||||
typedef struct SDataSink {
|
|
||||||
SQueryNodeBasicInfo info;
|
|
||||||
SDataBlockSchema schema;
|
|
||||||
} SDataSink;
|
|
||||||
|
|
||||||
typedef struct SDataDispatcher {
|
|
||||||
SDataSink sink;
|
|
||||||
} SDataDispatcher;
|
|
||||||
|
|
||||||
typedef struct SDataInserter {
|
|
||||||
SDataSink sink;
|
|
||||||
int32_t numOfTables;
|
|
||||||
uint32_t size;
|
|
||||||
char *pData;
|
|
||||||
} SDataInserter;
|
|
||||||
|
|
||||||
typedef struct SPhyNode {
|
|
||||||
SQueryNodeBasicInfo info;
|
|
||||||
SArray *pTargets; // target list to be computed or scanned at this node
|
|
||||||
SArray *pConditions; // implicitly-ANDed qual conditions
|
|
||||||
SDataBlockSchema targetSchema;
|
|
||||||
// children plan to generated result for current node to process
|
|
||||||
// in case of join, multiple plan nodes exist.
|
|
||||||
SArray *pChildren;
|
|
||||||
struct SPhyNode *pParent;
|
|
||||||
} SPhyNode;
|
|
||||||
|
|
||||||
typedef struct SScanPhyNode {
|
|
||||||
SPhyNode node;
|
|
||||||
uint64_t uid; // unique id of the table
|
|
||||||
int8_t tableType;
|
|
||||||
int32_t order; // scan order: TSDB_ORDER_ASC|TSDB_ORDER_DESC
|
|
||||||
int32_t count; // repeat count
|
|
||||||
int32_t reverse; // reverse scan count
|
|
||||||
} SScanPhyNode;
|
|
||||||
|
|
||||||
typedef SScanPhyNode SSystemTableScanPhyNode;
|
|
||||||
typedef SScanPhyNode STagScanPhyNode;
|
|
||||||
|
|
||||||
typedef struct STableScanPhyNode {
|
|
||||||
SScanPhyNode scan;
|
|
||||||
uint8_t scanFlag; // denotes reversed scan of data or not
|
|
||||||
STimeWindow window;
|
|
||||||
SArray *pTagsConditions; // implicitly-ANDed tag qual conditions
|
|
||||||
} STableScanPhyNode;
|
|
||||||
|
|
||||||
typedef STableScanPhyNode STableSeqScanPhyNode;
|
|
||||||
|
|
||||||
typedef struct SProjectPhyNode {
|
|
||||||
SPhyNode node;
|
|
||||||
} SProjectPhyNode;
|
|
||||||
|
|
||||||
typedef struct SDownstreamSource {
|
|
||||||
SQueryNodeAddr addr;
|
|
||||||
uint64_t taskId;
|
|
||||||
uint64_t schedId;
|
|
||||||
} SDownstreamSource;
|
|
||||||
|
|
||||||
typedef struct SExchangePhyNode {
|
|
||||||
SPhyNode node;
|
|
||||||
uint64_t srcTemplateId; // template id of datasource suplans
|
|
||||||
SArray *pSrcEndPoints; // SArray<SDownstreamSource>, scheduler fill by calling qSetSuplanExecutionNode
|
|
||||||
} SExchangePhyNode;
|
|
||||||
|
|
||||||
typedef enum EAggAlgo {
|
|
||||||
AGG_ALGO_PLAIN = 1, // simple agg across all input rows
|
|
||||||
AGG_ALGO_SORTED, // grouped agg, input must be sorted
|
|
||||||
AGG_ALGO_HASHED // grouped agg, use internal hashtable
|
|
||||||
} EAggAlgo;
|
|
||||||
|
|
||||||
typedef enum EAggSplit {
|
|
||||||
AGG_SPLIT_PRE = 1, // first level agg, maybe don't need calculate the final result
|
|
||||||
AGG_SPLIT_FINAL // second level agg, must calculate the final result
|
|
||||||
} EAggSplit;
|
|
||||||
|
|
||||||
typedef struct SAggPhyNode {
|
|
||||||
SPhyNode node;
|
|
||||||
EAggAlgo aggAlgo; // algorithm used by agg operator
|
|
||||||
EAggSplit aggSplit; // distributed splitting mode
|
|
||||||
SArray *pExprs; // SExprInfo list, these are expression list of group_by_clause and parameter expression of aggregate function
|
|
||||||
SArray *pGroupByList; // SColIndex list, but these must be column node
|
|
||||||
} SAggPhyNode;
|
|
||||||
|
|
||||||
typedef struct SSubplanId {
|
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t templateId;
|
int32_t acctId;
|
||||||
uint64_t subplanId;
|
SNode* pAstRoot;
|
||||||
} SSubplanId;
|
} SPlanContext;
|
||||||
|
|
||||||
typedef struct SSubplan {
|
// Create the physical plan for the query, according to the AST.
|
||||||
SSubplanId id; // unique id of the subplan
|
int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNodeList);
|
||||||
int32_t type; // QUERY_TYPE_MERGE|QUERY_TYPE_PARTIAL|QUERY_TYPE_SCAN|QUERY_TYPE_MODIFY
|
|
||||||
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.
|
|
||||||
SQueryNodeAddr execNode; // for the scan/modify subplan, the optional execution node
|
|
||||||
SArray *pChildren; // the datasource subplan,from which to fetch the result
|
|
||||||
SArray *pParents; // the data destination subplan, get data from current subplan
|
|
||||||
SPhyNode *pNode; // physical plan of current subplan
|
|
||||||
SDataSink *pDataSink; // data of the subplan flow into the datasink
|
|
||||||
} SSubplan;
|
|
||||||
|
|
||||||
typedef struct SQueryDag {
|
|
||||||
uint64_t queryId;
|
|
||||||
int32_t numOfSubplans;
|
|
||||||
SArray *pSubplans; // SArray*<SArray*<SSubplan*>>. The execution level of subplan, starting from 0.
|
|
||||||
} SQueryDag;
|
|
||||||
|
|
||||||
struct SQueryNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the physical plan for the query, according to the AST.
|
|
||||||
* @param pQueryInfo
|
|
||||||
* @param pDag
|
|
||||||
* @param requestId
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag, SSchema** pResSchema, int32_t* numOfCols, SArray* pNodeList, uint64_t requestId);
|
|
||||||
|
|
||||||
// Set datasource of this subplan, multiple calls may be made to a subplan.
|
// Set datasource of this subplan, multiple calls may be made to a subplan.
|
||||||
// @subplan subplan to be schedule
|
// @pSubplan subplan to be schedule
|
||||||
// @templateId templateId of a group of datasource subplans of this @subplan
|
// @groupId id of a group of datasource subplans of this @pSubplan
|
||||||
// @ep one execution location of this group of datasource subplans
|
// @pSource one execution location of this group of datasource subplans
|
||||||
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource);
|
int32_t qSetSubplanExecutionNode(SSubplan* pSubplan, int32_t groupId, SDownstreamSourceNode* pSource);
|
||||||
|
|
||||||
int32_t qExplainQuery(const struct SQueryNode* pQueryInfo, struct SEpSet* pQnode, char** str);
|
// Convert to subplan to string for the scheduler to send to the executor
|
||||||
|
int32_t qSubPlanToString(const SSubplan* pSubplan, char** pStr, int32_t* pLen);
|
||||||
|
int32_t qStringToSubplan(const char* pStr, SSubplan** pSubplan);
|
||||||
|
|
||||||
/**
|
char* qQueryPlanToString(const SQueryPlan* pPlan);
|
||||||
* Convert to subplan to string for the scheduler to send to the executor
|
SQueryPlan* qStringToQueryPlan(const char* pStr);
|
||||||
*/
|
|
||||||
int32_t qSubPlanToString(const SSubplan* subplan, char** str, int32_t* len);
|
|
||||||
|
|
||||||
int32_t qStringToSubplan(const char* str, SSubplan** subplan);
|
void qDestroyQueryPlan(SQueryPlan* pPlan);
|
||||||
|
|
||||||
void qDestroySubplan(SSubplan* pSubplan);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy the physical plan.
|
|
||||||
* @param pQueryPhyNode
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
void qDestroyQueryDag(SQueryDag* pDag);
|
|
||||||
|
|
||||||
char* qDagToString(const SQueryDag* pDag);
|
|
||||||
SQueryDag* qStringToDag(const char* pStr);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,52 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(INCLUDE_AS_ENUM) // enum define mode
|
|
||||||
#undef OP_ENUM_MACRO
|
|
||||||
#define OP_ENUM_MACRO(op) OP_##op,
|
|
||||||
#elif defined(INCLUDE_AS_NAME) // comment define mode
|
|
||||||
#undef OP_ENUM_MACRO
|
|
||||||
#define OP_ENUM_MACRO(op) #op,
|
|
||||||
#else
|
|
||||||
#error To use this include file, first define either INCLUDE_AS_ENUM or INCLUDE_AS_NAME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
OP_ENUM_MACRO(StreamScan)
|
|
||||||
OP_ENUM_MACRO(TableScan)
|
|
||||||
OP_ENUM_MACRO(TableSeqScan)
|
|
||||||
OP_ENUM_MACRO(TagScan)
|
|
||||||
OP_ENUM_MACRO(SystemTableScan)
|
|
||||||
OP_ENUM_MACRO(StreamBlockScan)
|
|
||||||
OP_ENUM_MACRO(Aggregate)
|
|
||||||
OP_ENUM_MACRO(Project)
|
|
||||||
// OP_ENUM_MACRO(Groupby)
|
|
||||||
OP_ENUM_MACRO(Limit)
|
|
||||||
OP_ENUM_MACRO(SLimit)
|
|
||||||
OP_ENUM_MACRO(TimeWindow)
|
|
||||||
OP_ENUM_MACRO(SessionWindow)
|
|
||||||
OP_ENUM_MACRO(StateWindow)
|
|
||||||
OP_ENUM_MACRO(Fill)
|
|
||||||
OP_ENUM_MACRO(MultiTableAggregate)
|
|
||||||
OP_ENUM_MACRO(MultiTableTimeInterval)
|
|
||||||
OP_ENUM_MACRO(Filter)
|
|
||||||
OP_ENUM_MACRO(Distinct)
|
|
||||||
OP_ENUM_MACRO(Join)
|
|
||||||
OP_ENUM_MACRO(AllTimeWindow)
|
|
||||||
OP_ENUM_MACRO(AllMultiTableTimeInterval)
|
|
||||||
OP_ENUM_MACRO(Order)
|
|
||||||
OP_ENUM_MACRO(Exchange)
|
|
||||||
OP_ENUM_MACRO(SortedMerge)
|
|
||||||
|
|
||||||
//OP_ENUM_MACRO(TableScan)
|
|
|
@ -35,7 +35,6 @@ enum {
|
||||||
JOB_TASK_STATUS_CANCELLING,
|
JOB_TASK_STATUS_CANCELLING,
|
||||||
JOB_TASK_STATUS_CANCELLED,
|
JOB_TASK_STATUS_CANCELLED,
|
||||||
JOB_TASK_STATUS_DROPPING,
|
JOB_TASK_STATUS_DROPPING,
|
||||||
JOB_TASK_STATUS_FREEING,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -85,6 +84,7 @@ typedef struct STableMeta {
|
||||||
typedef struct SDBVgInfo {
|
typedef struct SDBVgInfo {
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
int8_t hashMethod;
|
int8_t hashMethod;
|
||||||
|
int32_t numOfTable; // DB's table num, unit is TSDB_TABLE_NUM_UNIT
|
||||||
SHashObj *vgHash; //key:vgId, value:SVgroupInfo
|
SHashObj *vgHash; //key:vgId, value:SVgroupInfo
|
||||||
} SDBVgInfo;
|
} SDBVgInfo;
|
||||||
|
|
||||||
|
@ -129,6 +129,11 @@ typedef struct SQueryNodeAddr {
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
} SQueryNodeAddr;
|
} SQueryNodeAddr;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct SQueryNodeStat {
|
||||||
|
int32_t tableNum; // vg table number, unit is TSDB_TABLE_NUM_UNIT
|
||||||
|
} SQueryNodeStat;
|
||||||
|
|
||||||
int32_t initTaskQueue();
|
int32_t initTaskQueue();
|
||||||
int32_t cleanupTaskQueue();
|
int32_t cleanupTaskQueue();
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,8 @@ int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessDropMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessDropMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
int32_t qWorkerProcessHbMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessShowMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessShowMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessShowFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessShowFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
|
|
||||||
typedef struct SSchedulerCfg {
|
typedef struct SSchedulerCfg {
|
||||||
uint32_t maxJobNum;
|
uint32_t maxJobNum;
|
||||||
|
int32_t maxNodeTableNum;
|
||||||
} SSchedulerCfg;
|
} SSchedulerCfg;
|
||||||
|
|
||||||
typedef struct SQueryProfileSummary {
|
typedef struct SQueryProfileSummary {
|
||||||
|
@ -70,7 +71,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg);
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, int64_t *pJob, const char* sql, SQueryResult *pRes);
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan* pDag, int64_t* pJob, const char* sql, SQueryResult *pRes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the query job, generated according to the query physical plan.
|
* Process the query job, generated according to the query physical plan.
|
||||||
|
@ -78,7 +79,7 @@ int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, int
|
||||||
* @param pNodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param pNodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, const char* sql, int64_t *pJob);
|
int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryPlan* pDag, const char* sql, int64_t *pJob);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch query result from the remote query executor
|
* Fetch query result from the remote query executor
|
||||||
|
@ -110,7 +111,7 @@ void schedulerDestroy(void);
|
||||||
* @param pTasks SArray**<STaskInfo>
|
* @param pTasks SArray**<STaskInfo>
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks);
|
int32_t schedulerConvertDagToTaskList(SQueryPlan* pDag, SArray **pTasks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* make one task info's multiple copies
|
* make one task info's multiple copies
|
||||||
|
|
|
@ -47,8 +47,6 @@ typedef struct SRpcMsg {
|
||||||
void * ahandle; // app handle set by client
|
void * ahandle; // app handle set by client
|
||||||
int persist; // keep handle or not, default 0
|
int persist; // keep handle or not, default 0
|
||||||
|
|
||||||
SRpcPush *push;
|
|
||||||
|
|
||||||
} SRpcMsg;
|
} SRpcMsg;
|
||||||
|
|
||||||
typedef struct SRpcPush {
|
typedef struct SRpcPush {
|
||||||
|
@ -64,7 +62,6 @@ typedef struct SRpcInit {
|
||||||
int8_t connType; // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
|
int8_t connType; // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
|
||||||
int idleTime; // milliseconds, 0 means idle timer is disabled
|
int idleTime; // milliseconds, 0 means idle timer is disabled
|
||||||
|
|
||||||
bool noPool; // create conn pool or not
|
|
||||||
// the following is for client app ecurity only
|
// the following is for client app ecurity only
|
||||||
char *user; // user name
|
char *user; // user name
|
||||||
char spi; // security parameter index
|
char spi; // security parameter index
|
||||||
|
@ -99,6 +96,9 @@ void rpcSendRecv(void *shandle, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp)
|
||||||
int rpcReportProgress(void *pConn, char *pCont, int contLen);
|
int rpcReportProgress(void *pConn, char *pCont, int contLen);
|
||||||
void rpcCancelRequest(int64_t rid);
|
void rpcCancelRequest(int64_t rid);
|
||||||
|
|
||||||
|
void rpcRefHandle(void *handle, int8_t type);
|
||||||
|
void rpcUnrefHandle(void *handle, int8_t type);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,7 +22,22 @@ extern "C" {
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if !defined(WINDOWS)
|
||||||
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
@ -30,8 +45,6 @@ extern "C" {
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <regex.h>
|
|
||||||
#include <sched.h>
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -43,16 +56,9 @@ extern "C" {
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/utsname.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
#include <wordexp.h>
|
|
||||||
#include <libgen.h>
|
|
||||||
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/prctl.h>
|
|
||||||
|
|
||||||
#include "osAtomic.h"
|
#include "osAtomic.h"
|
||||||
#include "osDef.h"
|
#include "osDef.h"
|
||||||
|
|
|
@ -49,7 +49,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(WINDOWS)
|
||||||
char *stpcpy (char *dest, const char *src);
|
char *stpcpy (char *dest, const char *src);
|
||||||
char *stpncpy (char *dest, const char *src, size_t n);
|
char *stpncpy (char *dest, const char *src, size_t n);
|
||||||
|
|
||||||
|
@ -63,16 +63,46 @@ extern "C" {
|
||||||
#define strtok_r strtok_s
|
#define strtok_r strtok_s
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#define in_addr_t unsigned long
|
#define in_addr_t unsigned long
|
||||||
#define socklen_t int
|
// #define socklen_t int
|
||||||
|
|
||||||
struct tm *localtime_r(const time_t *timep, struct tm *result);
|
|
||||||
char * strptime(const char *buf, const char *fmt, struct tm *tm);
|
|
||||||
char * strsep(char **stringp, const char *delim);
|
char * strsep(char **stringp, const char *delim);
|
||||||
char * getpass(const char *prefix);
|
char * getpass(const char *prefix);
|
||||||
char * strndup(const char *s, size_t n);
|
char * strndup(const char *s, size_t n);
|
||||||
|
int gettimeofday(struct timeval *ptv, void *pTimeZone);
|
||||||
|
|
||||||
|
// for send function in tsocket.c
|
||||||
|
#define MSG_NOSIGNAL 0
|
||||||
|
#define SO_NO_CHECK 0x1234
|
||||||
|
#define SOL_TCP 0x1234
|
||||||
|
|
||||||
|
#define SHUT_RDWR SD_BOTH
|
||||||
|
#define SHUT_RD SD_RECEIVE
|
||||||
|
#define SHUT_WR SD_SEND
|
||||||
|
|
||||||
|
#define LOCK_EX 1
|
||||||
|
#define LOCK_NB 2
|
||||||
|
#define LOCK_UN 3
|
||||||
|
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
#define PATH_MAX 256
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int we_wordc;
|
||||||
|
char *we_wordv[1];
|
||||||
|
int we_offs;
|
||||||
|
char wordPos[1025];
|
||||||
|
} wordexp_t;
|
||||||
|
int wordexp(char *words, wordexp_t *pwordexp, int flags);
|
||||||
|
void wordfree(wordexp_t *pwordexp);
|
||||||
|
|
||||||
|
#define openlog(a, b, c)
|
||||||
|
#define closelog()
|
||||||
|
#define LOG_ERR 0
|
||||||
|
#define LOG_INFO 1
|
||||||
|
void syslog(int unused, const char *format, ...);
|
||||||
|
#endif // WINDOWS
|
||||||
|
|
||||||
#ifndef WINDOWS
|
#ifndef WINDOWS
|
||||||
#ifndef O_BINARY
|
#ifndef O_BINARY
|
||||||
#define O_BINARY 0
|
#define O_BINARY 0
|
||||||
|
@ -166,7 +196,7 @@ extern "C" {
|
||||||
#define PRIzu "zu"
|
#define PRIzu "zu"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_LINUX_64) || defined(_TD_LINUX_32) || defined(_TD_MIPS_64) || defined(_TD_ARM_32) || defined(_TD_ARM_64) || defined(_TD_DARWIN_64)
|
#if !defined(WINDOWS)
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
// MacOS
|
// MacOS
|
||||||
#if !defined(_GNU_SOURCE)
|
#if !defined(_GNU_SOURCE)
|
||||||
|
@ -181,8 +211,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
// Windows
|
// Windows
|
||||||
// #define setThreadName(name)
|
#define setThreadName(name)
|
||||||
#define setThreadName(name) do { prctl(PR_SET_NAME, (name)); } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
|
|
@ -22,6 +22,15 @@ extern "C" {
|
||||||
|
|
||||||
#include "osSocket.h"
|
#include "osSocket.h"
|
||||||
|
|
||||||
|
#if defined(WINDOWS)
|
||||||
|
typedef int32_t FileFd;
|
||||||
|
typedef SOCKET SocketFd;
|
||||||
|
#else
|
||||||
|
typedef int32_t FileFd;
|
||||||
|
typedef int32_t SocketFd;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int64_t taosRead(FileFd fd, void *buf, int64_t count);
|
||||||
// If the error is in a third-party library, place this header file under the third-party library header file.
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define open OPEN_FUNC_TAOS_FORBID
|
#define open OPEN_FUNC_TAOS_FORBID
|
||||||
|
@ -76,7 +85,13 @@ int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count);
|
||||||
int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset);
|
int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset);
|
||||||
int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count);
|
int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count);
|
||||||
void taosFprintfFile(TdFilePtr pFile, const char *format, ...);
|
void taosFprintfFile(TdFilePtr pFile, const char *format, ...);
|
||||||
|
|
||||||
|
#if defined(WINDOWS)
|
||||||
|
#define __restrict__
|
||||||
|
#endif // WINDOWS
|
||||||
|
|
||||||
int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf);
|
int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf);
|
||||||
|
|
||||||
int32_t taosEOFFile(TdFilePtr pFile);
|
int32_t taosEOFFile(TdFilePtr pFile);
|
||||||
|
|
||||||
int64_t taosCloseFile(TdFilePtr *ppFile);
|
int64_t taosCloseFile(TdFilePtr *ppFile);
|
||||||
|
|
|
@ -16,12 +16,13 @@
|
||||||
#ifndef _TD_OS_SEMPHONE_H_
|
#ifndef _TD_OS_SEMPHONE_H_
|
||||||
#define _TD_OS_SEMPHONE_H_
|
#define _TD_OS_SEMPHONE_H_
|
||||||
|
|
||||||
#include <semaphore.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
|
||||||
#if defined (_TD_DARWIN_64)
|
#if defined (_TD_DARWIN_64)
|
||||||
typedef struct tsem_s *tsem_t;
|
typedef struct tsem_s *tsem_t;
|
||||||
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#define epoll_wait EPOLL_WAIT_FUNC_TAOS_FORBID
|
#define epoll_wait EPOLL_WAIT_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(WINDOWS)
|
||||||
#include "winsock2.h"
|
#include "winsock2.h"
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
#include <winbase.h>
|
#include <winbase.h>
|
||||||
|
|
|
@ -52,6 +52,13 @@ int32_t taosGetSystemUUID(char *uid, int32_t uidlen);
|
||||||
char *taosGetCmdlineByPID(int32_t pid);
|
char *taosGetCmdlineByPID(int32_t pid);
|
||||||
void taosSetCoreDump(bool enable);
|
void taosSetCoreDump(bool enable);
|
||||||
|
|
||||||
|
#if defined(WINDOWS)
|
||||||
|
|
||||||
|
#define _UTSNAME_LENGTH 65
|
||||||
|
#define _UTSNAME_MACHINE_LENGTH _UTSNAME_LENGTH
|
||||||
|
|
||||||
|
#endif // WINDOWS
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char sysname[_UTSNAME_MACHINE_LENGTH];
|
char sysname[_UTSNAME_MACHINE_LENGTH];
|
||||||
char nodename[_UTSNAME_MACHINE_LENGTH];
|
char nodename[_UTSNAME_MACHINE_LENGTH];
|
||||||
|
|
|
@ -20,7 +20,19 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
|
#define strptime STRPTIME_FUNC_TAOS_FORBID
|
||||||
|
#define gettimeofday GETTIMEOFDAY_FUNC_TAOS_FORBID
|
||||||
|
#define localtime_s LOCALTIMES_FUNC_TAOS_FORBID
|
||||||
|
#define localtime_r LOCALTIMER_FUNC_TAOS_FORBID
|
||||||
|
#define time TIME_FUNC_TAOS_FORBID
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
|
|
||||||
|
#define CLOCK_REALTIME 0
|
||||||
|
|
||||||
#ifdef _TD_GO_DLL_
|
#ifdef _TD_GO_DLL_
|
||||||
#define MILLISECOND_PER_SECOND (1000LL)
|
#define MILLISECOND_PER_SECOND (1000LL)
|
||||||
#else
|
#else
|
||||||
|
@ -61,6 +73,9 @@ static FORCE_INLINE int64_t taosGetTimestampNs() {
|
||||||
return (int64_t)systemTime.tv_sec * 1000000000L + (int64_t)systemTime.tv_nsec;
|
return (int64_t)systemTime.tv_sec * 1000000000L + (int64_t)systemTime.tv_nsec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
|
||||||
|
struct tm *taosLocalTime(const time_t *timep, struct tm *result);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,6 +20,15 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
|
#define timer_create TIMER_CREATE_FUNC_TAOS_FORBID
|
||||||
|
#define timer_settime TIMER_SETTIME_FUNC_TAOS_FORBID
|
||||||
|
#define timer_delete TIMER_DELETE_FUNC_TAOS_FORBID
|
||||||
|
#define timeSetEvent TIMESETEVENT_SETTIME_FUNC_TAOS_FORBID
|
||||||
|
#define timeKillEvent TIMEKILLEVENT_SETTIME_FUNC_TAOS_FORBID
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MSECONDS_PER_TICK 5
|
#define MSECONDS_PER_TICK 5
|
||||||
|
|
||||||
int32_t taosInitTimer(void (*callback)(int32_t), int32_t ms);
|
int32_t taosInitTimer(void (*callback)(int32_t), int32_t ms);
|
||||||
|
|
|
@ -461,6 +461,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
#define TSDB_CODE_SCH_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2502)
|
||||||
|
|
||||||
//parser
|
//parser
|
||||||
|
#define TSDB_CODE_PAR_SYNTAX_ERROR TAOS_DEF_ERROR_CODE(0, 0x2600)
|
||||||
#define TSDB_CODE_PAR_INVALID_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2601)
|
#define TSDB_CODE_PAR_INVALID_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2601)
|
||||||
#define TSDB_CODE_PAR_TABLE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x2602)
|
#define TSDB_CODE_PAR_TABLE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x2602)
|
||||||
#define TSDB_CODE_PAR_AMBIGUOUS_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2603)
|
#define TSDB_CODE_PAR_AMBIGUOUS_COLUMN TAOS_DEF_ERROR_CODE(0, 0x2603)
|
||||||
|
@ -473,6 +474,13 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION TAOS_DEF_ERROR_CODE(0, 0x260A)
|
#define TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION TAOS_DEF_ERROR_CODE(0, 0x260A)
|
||||||
#define TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION TAOS_DEF_ERROR_CODE(0, 0x260B)
|
#define TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION TAOS_DEF_ERROR_CODE(0, 0x260B)
|
||||||
#define TSDB_CODE_PAR_NOT_SINGLE_GROUP TAOS_DEF_ERROR_CODE(0, 0x260C)
|
#define TSDB_CODE_PAR_NOT_SINGLE_GROUP TAOS_DEF_ERROR_CODE(0, 0x260C)
|
||||||
|
#define TSDB_CODE_PAR_TAGS_NOT_MATCHED TAOS_DEF_ERROR_CODE(0, 0x260D)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_TAG_NAME TAOS_DEF_ERROR_CODE(0, 0x260E)
|
||||||
|
#define TSDB_CODE_PAR_INCOMPLETE_SQL TAOS_DEF_ERROR_CODE(0, 0x260F)
|
||||||
|
#define TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG TAOS_DEF_ERROR_CODE(0, 0x2610)
|
||||||
|
#define TSDB_CODE_PAR_PASSWD_EMPTY TAOS_DEF_ERROR_CODE(0, 0x2611)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_PORT TAOS_DEF_ERROR_CODE(0, 0x2612)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_ENDPOINT TAOS_DEF_ERROR_CODE(0, 0x2613)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -345,6 +345,20 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_DB_QUORUM_OPTION 2
|
#define TSDB_MAX_DB_QUORUM_OPTION 2
|
||||||
#define TSDB_DEFAULT_DB_QUORUM_OPTION 1
|
#define TSDB_DEFAULT_DB_QUORUM_OPTION 1
|
||||||
|
|
||||||
|
#define TSDB_MIN_DB_TTL_OPTION 1
|
||||||
|
#define TSDB_DEFAULT_DB_TTL_OPTION 0
|
||||||
|
|
||||||
|
#define TSDB_MIN_DB_SINGLE_STABLE_OPTION 0
|
||||||
|
#define TSDB_MAX_DB_SINGLE_STABLE_OPTION 1
|
||||||
|
#define TSDB_DEFAULT_DB_SINGLE_STABLE_OPTION 0
|
||||||
|
|
||||||
|
#define TSDB_MIN_DB_STREAM_MODE_OPTION 0
|
||||||
|
#define TSDB_MAX_DB_STREAM_MODE_OPTION 1
|
||||||
|
#define TSDB_DEFAULT_DB_STREAM_MODE_OPTION 0
|
||||||
|
|
||||||
|
#define TSDB_MAX_JOIN_TABLE_NUM 10
|
||||||
|
#define TSDB_MAX_UNION_CLAUSE 5
|
||||||
|
|
||||||
#define TSDB_MIN_DB_UPDATE 0
|
#define TSDB_MIN_DB_UPDATE 0
|
||||||
#define TSDB_MAX_DB_UPDATE 2
|
#define TSDB_MAX_DB_UPDATE 2
|
||||||
#define TSDB_DEFAULT_DB_UPDATE_OPTION 0
|
#define TSDB_DEFAULT_DB_UPDATE_OPTION 0
|
||||||
|
|
|
@ -54,10 +54,12 @@ typedef int32_t (*FToJson)(const void* pObj, SJson* pJson);
|
||||||
|
|
||||||
int32_t tjsonAddObject(SJson* pJson, const char* pName, FToJson func, const void* pObj);
|
int32_t tjsonAddObject(SJson* pJson, const char* pName, FToJson func, const void* pObj);
|
||||||
int32_t tjsonAddItem(SJson* pJson, FToJson func, const void* pObj);
|
int32_t tjsonAddItem(SJson* pJson, FToJson func, const void* pObj);
|
||||||
|
int32_t tjsonAddArray(SJson* pJson, const char* pName, FToJson func, const void* pArray, int32_t itemSize, int32_t num);
|
||||||
|
|
||||||
typedef int32_t (*FToObject)(const SJson* pJson, void* pObj);
|
typedef int32_t (*FToObject)(const SJson* pJson, void* pObj);
|
||||||
|
|
||||||
int32_t tjsonToObject(const SJson* pJson, const char* pName, FToObject func, void* pObj);
|
int32_t tjsonToObject(const SJson* pJson, const char* pName, FToObject func, void* pObj);
|
||||||
|
int32_t tjsonToArray(const SJson* pJson, const char* pName, FToObject func, void* pArray, int32_t itemSize);
|
||||||
|
|
||||||
char* tjsonToString(const SJson* pJson);
|
char* tjsonToString(const SJson* pJson);
|
||||||
char* tjsonToUnformattedString(const SJson* pJson);
|
char* tjsonToUnformattedString(const SJson* pJson);
|
||||||
|
|
|
@ -8,7 +8,7 @@ target_include_directories(
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
taos
|
taos
|
||||||
INTERFACE api
|
INTERFACE api
|
||||||
PRIVATE os util common transport parser planner catalog scheduler function qcom
|
PRIVATE os util common transport nodes parser planner catalog scheduler function qcom
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -168,7 +168,7 @@ typedef struct SRequestSendRecvBody {
|
||||||
SShowReqInfo showInfo; // todo this attribute will be removed after the query framework being completed.
|
SShowReqInfo showInfo; // todo this attribute will be removed after the query framework being completed.
|
||||||
SDataBuf requestMsg;
|
SDataBuf requestMsg;
|
||||||
int64_t queryJob; // query job, created according to sql query DAG.
|
int64_t queryJob; // query job, created according to sql query DAG.
|
||||||
struct SQueryDag* pDag; // the query dag, generated according to the sql statement.
|
struct SQueryPlan* pDag; // the query dag, generated according to the sql statement.
|
||||||
SReqResultInfo resInfo;
|
SReqResultInfo resInfo;
|
||||||
} SRequestSendRecvBody;
|
} SRequestSendRecvBody;
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t
|
||||||
|
|
||||||
int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest);
|
int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest);
|
||||||
|
|
||||||
int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery);
|
int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery);
|
||||||
|
|
||||||
// --- heartbeat
|
// --- heartbeat
|
||||||
// global, called by mgmt
|
// global, called by mgmt
|
||||||
|
|
|
@ -72,8 +72,6 @@ static void deregisterRequest(SRequestObj *pRequest) {
|
||||||
taosReleaseRef(clientConnRefPool, pTscObj->id);
|
taosReleaseRef(clientConnRefPool, pTscObj->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// todo close the transporter properly
|
// todo close the transporter properly
|
||||||
void closeTransporter(STscObj *pTscObj) {
|
void closeTransporter(STscObj *pTscObj) {
|
||||||
if (pTscObj == NULL || pTscObj->pAppInfo->pTransporter == NULL) {
|
if (pTscObj == NULL || pTscObj->pAppInfo->pTransporter == NULL) {
|
||||||
|
@ -184,7 +182,7 @@ static void doDestroyRequest(void *p) {
|
||||||
tfree(pRequest->pInfo);
|
tfree(pRequest->pInfo);
|
||||||
|
|
||||||
doFreeReqResultInfo(&pRequest->body.resInfo);
|
doFreeReqResultInfo(&pRequest->body.resInfo);
|
||||||
qDestroyQueryDag(pRequest->body.pDag);
|
qDestroyQueryPlan(pRequest->body.pDag);
|
||||||
|
|
||||||
if (pRequest->body.showInfo.pArray != NULL) {
|
if (pRequest->body.showInfo.pArray != NULL) {
|
||||||
taosArrayDestroy(pRequest->body.showInfo.pArray);
|
taosArrayDestroy(pRequest->body.showInfo.pArray);
|
||||||
|
@ -241,6 +239,7 @@ void taos_init_imp(void) {
|
||||||
clientConnRefPool = taosOpenRef(200, destroyTscObj);
|
clientConnRefPool = taosOpenRef(200, destroyTscObj);
|
||||||
clientReqRefPool = taosOpenRef(40960, doDestroyRequest);
|
clientReqRefPool = taosOpenRef(40960, doDestroyRequest);
|
||||||
|
|
||||||
|
// transDestroyBuffer(&conn->readBuf);
|
||||||
taosGetAppName(appInfo.appName, NULL);
|
taosGetAppName(appInfo.appName, NULL);
|
||||||
pthread_mutex_init(&appInfo.mutex, NULL);
|
pthread_mutex_init(&appInfo.mutex, NULL);
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,7 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl
|
||||||
SDbVgVersion *db = &dbs[i];
|
SDbVgVersion *db = &dbs[i];
|
||||||
db->dbId = htobe64(db->dbId);
|
db->dbId = htobe64(db->dbId);
|
||||||
db->vgVersion = htonl(db->vgVersion);
|
db->vgVersion = htonl(db->vgVersion);
|
||||||
|
db->numOfTable = htonl(db->numOfTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
SKv kv = {
|
SKv kv = {
|
||||||
|
@ -434,11 +435,11 @@ static int32_t hbCreateThread() {
|
||||||
pthread_attr_init(&thAttr);
|
pthread_attr_init(&thAttr);
|
||||||
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
if (pthread_create(&clientHbMgr.thread, &thAttr, hbThreadFunc, NULL) != 0) {
|
// if (pthread_create(&clientHbMgr.thread, &thAttr, hbThreadFunc, NULL) != 0) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
// terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
pthread_attr_destroy(&thAttr);
|
// pthread_attr_destroy(&thAttr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj*
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery) {
|
int32_t parseSql(SRequestObj* pRequest, SQuery** pQuery) {
|
||||||
STscObj* pTscObj = pRequest->pTscObj;
|
STscObj* pTscObj = pRequest->pTscObj;
|
||||||
|
|
||||||
SParseContext cxt = {
|
SParseContext cxt = {
|
||||||
|
@ -161,53 +161,44 @@ int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery) {
|
||||||
}
|
}
|
||||||
|
|
||||||
code = qParseQuerySql(&cxt, pQuery);
|
code = qParseQuerySql(&cxt, pQuery);
|
||||||
|
if (TSDB_CODE_SUCCESS == code && ((*pQuery)->haveResultSet)) {
|
||||||
|
setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols);
|
||||||
|
}
|
||||||
|
|
||||||
tfree(cxt.db);
|
tfree(cxt.db);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) {
|
int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
SDclStmtInfo* pDcl = (SDclStmtInfo*)pQuery;
|
SCmdMsgInfo* pMsgInfo = pQuery->pCmdMsg;
|
||||||
pRequest->type = pDcl->msgType;
|
pRequest->type = pMsgInfo->msgType;
|
||||||
pRequest->body.requestMsg = (SDataBuf){.pData = pDcl->pMsg, .len = pDcl->msgLen, .handle = NULL};
|
pRequest->body.requestMsg = (SDataBuf){.pData = pMsgInfo->pMsg, .len = pMsgInfo->msgLen, .handle = NULL};
|
||||||
|
pMsgInfo->pMsg = NULL; // pMsg transferred to SMsgSendInfo management
|
||||||
|
|
||||||
STscObj* pTscObj = pRequest->pTscObj;
|
STscObj* pTscObj = pRequest->pTscObj;
|
||||||
SMsgSendInfo* pSendMsg = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* pSendMsg = buildMsgInfoImpl(pRequest);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
if (pMsgInfo->msgType == TDMT_VND_SHOW_TABLES) {
|
||||||
if (pDcl->msgType == TDMT_VND_CREATE_TABLE || pDcl->msgType == TDMT_VND_SHOW_TABLES) {
|
|
||||||
if (pDcl->msgType == TDMT_VND_SHOW_TABLES) {
|
|
||||||
SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo;
|
SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo;
|
||||||
if (pShowReqInfo->pArray == NULL) {
|
if (pShowReqInfo->pArray == NULL) {
|
||||||
pShowReqInfo->currentIndex = 0; // set the first vnode/ then iterate the next vnode
|
pShowReqInfo->currentIndex = 0; // set the first vnode/ then iterate the next vnode
|
||||||
pShowReqInfo->pArray = pDcl->pExtension;
|
pShowReqInfo->pArray = pMsgInfo->pExtension;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pDcl->epSet, &transporterId, pSendMsg);
|
int64_t transporterId = 0;
|
||||||
} else {
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pMsgInfo->epSet, &transporterId, pSendMsg);
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pDcl->epSet, &transporterId, pSendMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getPlan(SRequestObj* pRequest, SQueryNode* pQueryNode, SQueryDag** pDag, SArray* pNodeList) {
|
int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList) {
|
||||||
pRequest->type = pQueryNode->type;
|
pRequest->type = pQuery->msgType;
|
||||||
|
SPlanContext cxt = { .queryId = pRequest->requestId, .pAstRoot = pQuery->pRoot, .acctId = pRequest->pTscObj->acctId };
|
||||||
SSchema* pSchema = NULL;
|
int32_t code = qCreateQueryPlan(&cxt, pPlan, pNodeList);
|
||||||
int32_t numOfCols = 0;
|
|
||||||
int32_t code = qCreateQueryDag(pQueryNode, pDag, &pSchema, &numOfCols, pNodeList, pRequest->requestId);
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pQueryNode->type == TSDB_SQL_SELECT) {
|
|
||||||
setResSchemaInfo(&pRequest->body.resInfo, pSchema, numOfCols);
|
|
||||||
pRequest->type = TDMT_VND_QUERY;
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(pSchema);
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,8 +215,10 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList) {
|
|
||||||
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList) {
|
||||||
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
|
||||||
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
||||||
int32_t code = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr, &res);
|
int32_t code = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr, &res);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -237,7 +230,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList)
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) {
|
if (TDMT_VND_SUBMIT == pRequest->type || TDMT_VND_CREATE_TABLE == pRequest->type) {
|
||||||
pRequest->body.resInfo.numOfRows = res.numOfRows;
|
pRequest->body.resInfo.numOfRows = res.numOfRows;
|
||||||
|
|
||||||
if (pRequest->body.queryJob != 0) {
|
if (pRequest->body.queryJob != 0) {
|
||||||
|
@ -258,24 +251,24 @@ TAOS_RES* taos_query_l(TAOS* taos, const char* sql, int sqlLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestObj* pRequest = NULL;
|
SRequestObj* pRequest = NULL;
|
||||||
SQueryNode* pQueryNode = NULL;
|
SQuery* pQuery = NULL;
|
||||||
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = 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, &pQueryNode), _return);
|
CHECK_CODE_GOTO(parseSql(pRequest, &pQuery), _return);
|
||||||
|
|
||||||
if (qIsDdlQuery(pQueryNode)) {
|
if (pQuery->directRpc) {
|
||||||
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQueryNode), _return);
|
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
||||||
} else {
|
} else {
|
||||||
CHECK_CODE_GOTO(getPlan(pRequest, pQueryNode, &pRequest->body.pDag, pNodeList), _return);
|
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList), _return);
|
||||||
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
taosArrayDestroy(pNodeList);
|
taosArrayDestroy(pNodeList);
|
||||||
qDestroyQuery(pQueryNode);
|
qDestroyQuery(pQuery);
|
||||||
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -459,7 +459,7 @@ void tmq_conf_set_offset_commit_cb(tmq_conf_t* conf, tmq_commit_cb* cb) { conf->
|
||||||
TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, int sqlLen) {
|
TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, int sqlLen) {
|
||||||
STscObj* pTscObj = (STscObj*)taos;
|
STscObj* pTscObj = (STscObj*)taos;
|
||||||
SRequestObj* pRequest = NULL;
|
SRequestObj* pRequest = NULL;
|
||||||
SQueryNode* pQueryNode = NULL;
|
SQuery* pQueryNode = NULL;
|
||||||
char* pStr = NULL;
|
char* pStr = NULL;
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
|
@ -482,7 +482,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);
|
||||||
|
#if 0
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
||||||
CHECK_CODE_GOTO(parseSql(pRequest, &pQueryNode), _return);
|
CHECK_CODE_GOTO(parseSql(pRequest, &pQueryNode), _return);
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ TAOS_RES* tmq_create_topic(TAOS* taos, const char* topicName, const char* sql, i
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
#endif
|
||||||
_return:
|
_return:
|
||||||
qDestroyQuery(pQueryNode);
|
qDestroyQuery(pQueryNode);
|
||||||
/*if (sendInfo != NULL) {*/
|
/*if (sendInfo != NULL) {*/
|
||||||
|
|
|
@ -53,7 +53,6 @@ TEST(testCase, driverInit_Test) {
|
||||||
// taos_init();
|
// taos_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
TEST(testCase, connect_Test) {
|
TEST(testCase, connect_Test) {
|
||||||
// taos_options(TSDB_OPTION_CONFIGDIR, "/home/ubuntu/first/cfg");
|
// taos_options(TSDB_OPTION_CONFIGDIR, "/home/ubuntu/first/cfg");
|
||||||
|
|
||||||
|
@ -564,20 +563,18 @@ TEST(testCase, insert_test) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
TEST(testCase, projection_query_tables) {
|
TEST(testCase, projection_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
ASSERT_NE(pConn, nullptr);
|
ASSERT_NE(pConn, nullptr);
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
|
// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
|
||||||
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 stable st1 (ts timestamp, k int) tags(a int)");
|
pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)");
|
||||||
|
@ -592,7 +589,7 @@ TEST(testCase, projection_query_tables) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
for(int32_t i = 0; i < 10000000; ++i) {
|
for(int32_t i = 0; i < 10000; ++i) {
|
||||||
char sql[512] = {0};
|
char sql[512] = {0};
|
||||||
sprintf(sql, "insert into tu values(now+%da, %d)", i, i);
|
sprintf(sql, "insert into tu values(now+%da, %d)", i, i);
|
||||||
TAOS_RES* p = taos_query(pConn, sql);
|
TAOS_RES* p = taos_query(pConn, sql);
|
||||||
|
@ -623,7 +620,6 @@ TEST(testCase, projection_query_tables) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
|
|
||||||
TEST(testCase, projection_query_stables) {
|
TEST(testCase, projection_query_stables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
@ -686,6 +682,5 @@ TEST(testCase, agg_query_tables) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
|
@ -4,6 +4,10 @@ target_include_directories(
|
||||||
common
|
common
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/common"
|
PUBLIC "${CMAKE_SOURCE_DIR}/include/common"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
IF(${TD_WINDOWS})
|
||||||
|
PRIVATE "${CMAKE_SOURCE_DIR}/contrib/pthread-win32"
|
||||||
|
PRIVATE "${CMAKE_SOURCE_DIR}/contrib/gnuregex"
|
||||||
|
ENDIF ()
|
||||||
)
|
)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
common
|
common
|
||||||
|
|
|
@ -239,7 +239,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, co
|
||||||
return numOfRow1 + numOfRow2;
|
return numOfRow1 + numOfRow2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t colDataGetNumOfCols(const SSDataBlock* pBlock) {
|
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock) {
|
||||||
ASSERT(pBlock);
|
ASSERT(pBlock);
|
||||||
|
|
||||||
size_t constantCols = (pBlock->pConstantList != NULL)? taosArrayGetSize(pBlock->pConstantList):0;
|
size_t constantCols = (pBlock->pConstantList != NULL)? taosArrayGetSize(pBlock->pConstantList):0;
|
||||||
|
@ -247,7 +247,7 @@ size_t colDataGetNumOfCols(const SSDataBlock* pBlock) {
|
||||||
return pBlock->info.numOfCols;
|
return pBlock->info.numOfCols;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t colDataGetNumOfRows(const SSDataBlock* pBlock) {
|
size_t blockDataGetNumOfRows(const SSDataBlock* pBlock) {
|
||||||
return pBlock->info.rows;
|
return pBlock->info.rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1007,11 +1007,32 @@ int32_t tDeserializeSMCreateDropQSBNodeReq(void *buf, int32_t bufLen, SMCreateQn
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
int32_t tSerializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
||||||
return tSerializeSMCreateDropQSBNodeReq(buf, bufLen, (SMCreateQnodeReq *)pReq);
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->dnodeId) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->fqdn) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->port) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDeserializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
int32_t tDeserializeSDropDnodeReq(void *buf, int32_t bufLen, SDropDnodeReq *pReq) {
|
||||||
return tDeserializeSMCreateDropQSBNodeReq(buf, bufLen, (SMCreateQnodeReq *)pReq);
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->dnodeId) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->fqdn) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->port) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSMCreateDropMnodeReq(void *buf, int32_t bufLen, SMCreateMnodeReq *pReq) {
|
int32_t tSerializeSMCreateDropMnodeReq(void *buf, int32_t bufLen, SMCreateMnodeReq *pReq) {
|
||||||
|
@ -1423,6 +1444,7 @@ int32_t tSerializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
|
||||||
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->dbId) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->dbId) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->numOfTable) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -1438,12 +1460,77 @@ int32_t tDeserializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
|
||||||
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pReq->dbId) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->dbId) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->numOfTable) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tCoderClear(&decoder);
|
tCoderClear(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t tSerializeSQnodeListReq(void* buf, int32_t bufLen, SQnodeListReq* pReq) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->rowNum) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSQnodeListReq(void *buf, int32_t bufLen, SQnodeListReq *pReq) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->rowNum) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSQnodeListRsp(void *buf, int32_t bufLen, SQnodeListRsp *pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
int32_t num = taosArrayGetSize(pRsp->epSetList);
|
||||||
|
if (tEncodeI32(&encoder, num) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
SEpSet *epSet = taosArrayGet(pRsp->epSetList, i);
|
||||||
|
if (tEncodeSEpSet(&encoder, epSet) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSQnodeListRsp(void *buf, int32_t bufLen, SQnodeListRsp *pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
int32_t num = 0;
|
||||||
|
if (tDecodeI32(&decoder, &num) < 0) return -1;
|
||||||
|
pRsp->epSetList = taosArrayInit(num, sizeof(SEpSet));
|
||||||
|
if (NULL == pRsp->epSetList) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
if (tDecodeSEpSet(&decoder, TARRAY_GET_ELEM(pRsp->epSetList, i)) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSQnodeListRsp(SQnodeListRsp *pRsp) { taosArrayDestroy(pRsp->epSetList); }
|
||||||
|
|
||||||
int32_t tSerializeSSyncDbReq(void *buf, int32_t bufLen, SSyncDbReq *pReq) {
|
int32_t tSerializeSSyncDbReq(void *buf, int32_t bufLen, SSyncDbReq *pReq) {
|
||||||
SCoder encoder = {0};
|
SCoder encoder = {0};
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
@ -1482,6 +1569,7 @@ static int32_t tSerializeSUseDbRspImp(SCoder *pEncoder, SUseDbRsp *pRsp) {
|
||||||
if (tEncodeU32(pEncoder, pVgInfo->hashBegin) < 0) return -1;
|
if (tEncodeU32(pEncoder, pVgInfo->hashBegin) < 0) return -1;
|
||||||
if (tEncodeU32(pEncoder, pVgInfo->hashEnd) < 0) return -1;
|
if (tEncodeU32(pEncoder, pVgInfo->hashEnd) < 0) return -1;
|
||||||
if (tEncodeSEpSet(pEncoder, &pVgInfo->epSet) < 0) return -1;
|
if (tEncodeSEpSet(pEncoder, &pVgInfo->epSet) < 0) return -1;
|
||||||
|
if (tEncodeI32(pEncoder, pVgInfo->numOfTable) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1542,6 +1630,7 @@ int32_t tDeserializeSUseDbRspImp(SCoder *pDecoder, SUseDbRsp *pRsp) {
|
||||||
if (tDecodeU32(pDecoder, &vgInfo.hashBegin) < 0) return -1;
|
if (tDecodeU32(pDecoder, &vgInfo.hashBegin) < 0) return -1;
|
||||||
if (tDecodeU32(pDecoder, &vgInfo.hashEnd) < 0) return -1;
|
if (tDecodeU32(pDecoder, &vgInfo.hashEnd) < 0) return -1;
|
||||||
if (tDecodeSEpSet(pDecoder, &vgInfo.epSet) < 0) return -1;
|
if (tDecodeSEpSet(pDecoder, &vgInfo.epSet) < 0) return -1;
|
||||||
|
if (tDecodeI32(pDecoder, &vgInfo.numOfTable) < 0) return -1;
|
||||||
taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
|
taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2391,6 +2480,149 @@ int32_t tDecodeSMqCMCommitOffsetReq(SCoder *decoder, SMqCMCommitOffsetReq *pReq)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
|
||||||
|
int32_t headLen = sizeof(SMsgHead);
|
||||||
|
if (buf != NULL) {
|
||||||
|
buf = (char *)buf + headLen;
|
||||||
|
bufLen -= headLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, pReq->sId) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->epId.nodeId) < 0) return -1;
|
||||||
|
if (tEncodeU16(&encoder, pReq->epId.ep.port) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->epId.ep.fqdn) < 0) return -1;
|
||||||
|
if (pReq->taskAction) {
|
||||||
|
int32_t num = taosArrayGetSize(pReq->taskAction);
|
||||||
|
if (tEncodeI32(&encoder, num) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
STaskAction *action = taosArrayGet(pReq->taskAction, i);
|
||||||
|
if (tEncodeU64(&encoder, action->queryId) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, action->taskId) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, action->action) < 0) return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tEncodeI32(&encoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
|
||||||
|
if (buf != NULL) {
|
||||||
|
SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
|
||||||
|
pHead->vgId = htonl(pReq->header.vgId);
|
||||||
|
pHead->contLen = htonl(tlen + headLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tlen + headLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
|
||||||
|
int32_t headLen = sizeof(SMsgHead);
|
||||||
|
|
||||||
|
SMsgHead *pHead = buf;
|
||||||
|
pHead->vgId = pReq->header.vgId;
|
||||||
|
pHead->contLen = pReq->header.contLen;
|
||||||
|
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, (char *)buf + headLen, bufLen - headLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &pReq->sId) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->epId.nodeId) < 0) return -1;
|
||||||
|
if (tDecodeU16(&decoder, &pReq->epId.ep.port) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->epId.ep.fqdn) < 0) return -1;
|
||||||
|
int32_t num = 0;
|
||||||
|
if (tDecodeI32(&decoder, &num) < 0) return -1;
|
||||||
|
if (num > 0) {
|
||||||
|
pReq->taskAction = taosArrayInit(num, sizeof(STaskStatus));
|
||||||
|
if (NULL == pReq->taskAction) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
STaskAction action = {0};
|
||||||
|
if (tDecodeU64(&decoder, &action.queryId) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &action.taskId) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &action.action) < 0) return -1;
|
||||||
|
taosArrayPush(pReq->taskAction, &action);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pReq->taskAction = NULL;
|
||||||
|
}
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSSchedulerHbReq(SSchedulerHbReq *pReq) { taosArrayDestroy(pReq->taskAction); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int32_t tSerializeSSchedulerHbRsp(void *buf, int32_t bufLen, SSchedulerHbRsp *pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, pRsp->seqId) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->epId.nodeId) < 0) return -1;
|
||||||
|
if (tEncodeU16(&encoder, pRsp->epId.ep.port) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->epId.ep.fqdn) < 0) return -1;
|
||||||
|
if (pRsp->taskStatus) {
|
||||||
|
int32_t num = taosArrayGetSize(pRsp->taskStatus);
|
||||||
|
if (tEncodeI32(&encoder, num) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
STaskStatus *status = taosArrayGet(pRsp->taskStatus, i);
|
||||||
|
if (tEncodeU64(&encoder, status->queryId) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, status->taskId) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, status->refId) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, status->status) < 0) return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tEncodeI32(&encoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSSchedulerHbRsp(void *buf, int32_t bufLen, SSchedulerHbRsp *pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &pRsp->seqId) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->epId.nodeId) < 0) return -1;
|
||||||
|
if (tDecodeU16(&decoder, &pRsp->epId.ep.port) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->epId.ep.fqdn) < 0) return -1;
|
||||||
|
int32_t num = 0;
|
||||||
|
if (tDecodeI32(&decoder, &num) < 0) return -1;
|
||||||
|
if (num > 0) {
|
||||||
|
pRsp->taskStatus = taosArrayInit(num, sizeof(STaskStatus));
|
||||||
|
if (NULL == pRsp->taskStatus) return -1;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
STaskStatus status = {0};
|
||||||
|
if (tDecodeU64(&decoder, &status.queryId) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &status.taskId) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &status.refId) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &status.status) < 0) return -1;
|
||||||
|
taosArrayPush(pRsp->taskStatus, &status);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pRsp->taskStatus = NULL;
|
||||||
|
}
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSSchedulerHbRsp(SSchedulerHbRsp *pRsp) { taosArrayDestroy(pRsp->taskStatus); }
|
||||||
|
|
||||||
int32_t tSerializeSVCreateTSmaReq(void **buf, SVCreateTSmaReq *pReq) {
|
int32_t tSerializeSVCreateTSmaReq(void **buf, SVCreateTSmaReq *pReq) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in
|
||||||
}
|
}
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t = (time_t)start;
|
time_t t = (time_t)start;
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
|
|
|
@ -69,7 +69,7 @@ static int64_t m_deltaUtc = 0;
|
||||||
void deltaToUtcInitOnce() {
|
void deltaToUtcInitOnce() {
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
|
|
||||||
(void)strptime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm);
|
(void)taosStrpTime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm);
|
||||||
m_deltaUtc = (int64_t)mktime(&tm);
|
m_deltaUtc = (int64_t)mktime(&tm);
|
||||||
// printf("====delta:%lld\n\n", seconds);
|
// printf("====delta:%lld\n\n", seconds);
|
||||||
}
|
}
|
||||||
|
@ -236,9 +236,9 @@ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, ch
|
||||||
|
|
||||||
char* str;
|
char* str;
|
||||||
if (delim == 'T') {
|
if (delim == 'T') {
|
||||||
str = strptime(timestr, "%Y-%m-%dT%H:%M:%S", &tm);
|
str = taosStrpTime(timestr, "%Y-%m-%dT%H:%M:%S", &tm);
|
||||||
} else if (delim == 0) {
|
} else if (delim == 0) {
|
||||||
str = strptime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
str = taosStrpTime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
||||||
} else {
|
} else {
|
||||||
str = NULL;
|
str = NULL;
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
*time = 0;
|
*time = 0;
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
|
|
||||||
char* str = strptime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
char* str = taosStrpTime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -338,7 +338,7 @@ int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
tm.tm_isdst = -1;
|
tm.tm_isdst = -1;
|
||||||
|
|
||||||
char* str = strptime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
char* str = taosStrpTime(timestr, "%Y-%m-%d %H:%M:%S", &tm);
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -466,7 +466,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
||||||
localtime_r(&tt, &tm);
|
taosLocalTime(&tt, &tm);
|
||||||
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)duration;
|
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)duration;
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
|
@ -489,11 +489,11 @@ int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t = (time_t)skey;
|
time_t t = (time_t)skey;
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
t = (time_t)ekey;
|
t = (time_t)ekey;
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
if (unit == 'y') {
|
if (unit == 'y') {
|
||||||
|
@ -514,7 +514,7 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)start;
|
time_t tt = (time_t)start;
|
||||||
localtime_r(&tt, &tm);
|
taosLocalTime(&tt, &tm);
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
|
@ -597,13 +597,13 @@ const char* fmtts(int64_t ts) {
|
||||||
|
|
||||||
if (ts > -62135625943 && ts < 32503651200) {
|
if (ts > -62135625943 && ts < 32503651200) {
|
||||||
time_t t = (time_t)ts;
|
time_t t = (time_t)ts;
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
|
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts > -62135625943000 && ts < 32503651200000) {
|
if (ts > -62135625943000 && ts < 32503651200000) {
|
||||||
time_t t = (time_t)(ts / 1000);
|
time_t t = (time_t)(ts / 1000);
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
buf[pos++] = ' ';
|
buf[pos++] = ' ';
|
||||||
buf[pos++] = '|';
|
buf[pos++] = '|';
|
||||||
|
@ -615,7 +615,7 @@ const char* fmtts(int64_t ts) {
|
||||||
|
|
||||||
{
|
{
|
||||||
time_t t = (time_t)(ts / 1000000);
|
time_t t = (time_t)(ts / 1000000);
|
||||||
localtime_r(&t, &tm);
|
taosLocalTime(&t, &tm);
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
buf[pos++] = ' ';
|
buf[pos++] = ' ';
|
||||||
buf[pos++] = '|';
|
buf[pos++] = '|';
|
||||||
|
|
|
@ -94,11 +94,11 @@ void taosVariantCreate(SVariant *pVar, const char *z, int32_t n, int32_t type) {
|
||||||
bool sign = true;
|
bool sign = true;
|
||||||
|
|
||||||
int32_t base = 10;
|
int32_t base = 10;
|
||||||
if (type == TK_HEX) {
|
if (type == TK_NK_HEX) {
|
||||||
base = 16;
|
base = 16;
|
||||||
} else if (type == TK_OCT) {
|
} else if (type == TK_NK_OCT) {
|
||||||
base = 8;
|
base = 8;
|
||||||
} else if (type == TK_BIN) {
|
} else if (type == TK_NK_BIN) {
|
||||||
base = 2;
|
base = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,8 +160,8 @@ TEST(testCase, Datablock_test) {
|
||||||
|
|
||||||
printf("binary column length:%d\n", *(int32_t*) p1->pData);
|
printf("binary column length:%d\n", *(int32_t*) p1->pData);
|
||||||
|
|
||||||
ASSERT_EQ(colDataGetNumOfCols(b), 2);
|
ASSERT_EQ(blockDataGetNumOfCols(b), 2);
|
||||||
ASSERT_EQ(colDataGetNumOfRows(b), 40);
|
ASSERT_EQ(blockDataGetNumOfRows(b), 40);
|
||||||
|
|
||||||
char* pData = colDataGetData(p1, 3);
|
char* pData = colDataGetData(p1, 3);
|
||||||
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
||||||
|
|
|
@ -152,6 +152,7 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_REB)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_REB)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeFetchMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CONSUME)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CONSUME)] = dndProcessVnodeFetchMsg;
|
||||||
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY_HEARTBEAT)] = dndProcessVnodeFetchMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
||||||
|
@ -193,7 +194,6 @@ static int32_t dndInitClient(SDnode *pDnode) {
|
||||||
rpcInit.ckey = INTERNAL_CKEY;
|
rpcInit.ckey = INTERNAL_CKEY;
|
||||||
rpcInit.spi = 1;
|
rpcInit.spi = 1;
|
||||||
rpcInit.parent = pDnode;
|
rpcInit.parent = pDnode;
|
||||||
rpcInit.noPool = true;
|
|
||||||
|
|
||||||
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
||||||
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
||||||
|
|
|
@ -354,6 +354,23 @@ typedef struct {
|
||||||
char payload[];
|
char payload[];
|
||||||
} SShowObj;
|
} SShowObj;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t id;
|
||||||
|
int8_t type;
|
||||||
|
int8_t replica;
|
||||||
|
int16_t numOfColumns;
|
||||||
|
int32_t rowSize;
|
||||||
|
int32_t numOfRows;
|
||||||
|
int32_t numOfReads;
|
||||||
|
int32_t payloadLen;
|
||||||
|
void* pIter;
|
||||||
|
SMnode* pMnode;
|
||||||
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
|
int16_t offset[TSDB_MAX_COLUMNS];
|
||||||
|
int32_t bytes[TSDB_MAX_COLUMNS];
|
||||||
|
char payload[];
|
||||||
|
} SSysTableRetrieveObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgId; // -1 for unassigned
|
int32_t vgId; // -1 for unassigned
|
||||||
int32_t status;
|
int32_t status;
|
||||||
|
|
|
@ -885,6 +885,29 @@ DROP_DB_OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode, int32_t *num) {
|
||||||
|
int32_t vindex = 0;
|
||||||
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
|
||||||
|
void *pIter = NULL;
|
||||||
|
while (vindex < pDb->cfg.numOfVgroups) {
|
||||||
|
SVgObj *pVgroup = NULL;
|
||||||
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
|
if (pVgroup->dbUid == pDb->uid) {
|
||||||
|
*num += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
|
||||||
|
|
||||||
|
vindex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbRelease(pSdb, pVgroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbCancelFetch(pSdb, pIter);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
||||||
int32_t vindex = 0;
|
int32_t vindex = 0;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
@ -900,6 +923,7 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
||||||
vgInfo.vgId = pVgroup->vgId;
|
vgInfo.vgId = pVgroup->vgId;
|
||||||
vgInfo.hashBegin = pVgroup->hashBegin;
|
vgInfo.hashBegin = pVgroup->hashBegin;
|
||||||
vgInfo.hashEnd = pVgroup->hashEnd;
|
vgInfo.hashEnd = pVgroup->hashEnd;
|
||||||
|
vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
|
||||||
vgInfo.epSet.numOfEps = pVgroup->replica;
|
vgInfo.epSet.numOfEps = pVgroup->replica;
|
||||||
for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
|
for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
|
||||||
|
@ -967,7 +991,10 @@ static int32_t mndProcessUseDbReq(SMndMsg *pReq) {
|
||||||
goto USE_DB_OVER;
|
goto USE_DB_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usedbReq.vgVersion < pDb->vgVersion || usedbReq.dbId != pDb->uid) {
|
int32_t numOfTable = 0;
|
||||||
|
mndGetDBTableNum(pDb, pMnode, &numOfTable);
|
||||||
|
|
||||||
|
if (usedbReq.vgVersion < pDb->vgVersion || usedbReq.dbId != pDb->uid || numOfTable != usedbReq.numOfTable) {
|
||||||
mndBuildDBVgroupInfo(pDb, pMnode, usedbRsp.pVgroupInfos);
|
mndBuildDBVgroupInfo(pDb, pMnode, usedbRsp.pVgroupInfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1017,6 +1044,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
SDbVgVersion *pDbVgVersion = &pDbs[i];
|
SDbVgVersion *pDbVgVersion = &pDbs[i];
|
||||||
pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
|
pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
|
||||||
pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
|
pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
|
||||||
|
pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
|
||||||
|
|
||||||
SUseDbRsp usedbRsp = {0};
|
SUseDbRsp usedbRsp = {0};
|
||||||
|
|
||||||
|
@ -1027,11 +1055,18 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
usedbRsp.uid = pDbVgVersion->dbId;
|
usedbRsp.uid = pDbVgVersion->dbId;
|
||||||
usedbRsp.vgVersion = -1;
|
usedbRsp.vgVersion = -1;
|
||||||
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
||||||
} else if (pDbVgVersion->vgVersion >= pDb->vgVersion) {
|
continue;
|
||||||
mDebug("db:%s, version not changed", pDbVgVersion->dbFName);
|
}
|
||||||
|
|
||||||
|
int32_t numOfTable = 0;
|
||||||
|
mndGetDBTableNum(pDb, pMnode, &numOfTable);
|
||||||
|
|
||||||
|
if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
|
||||||
|
mDebug("db:%s, version & numOfTable not changed", pDbVgVersion->dbFName);
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
||||||
if (usedbRsp.pVgroupInfos == NULL) {
|
if (usedbRsp.pVgroupInfos == NULL) {
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
@ -1049,7 +1084,6 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
|
int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
|
||||||
void *pRsp = malloc(rspLen);
|
void *pRsp = malloc(rspLen);
|
||||||
|
|
|
@ -36,6 +36,7 @@ static int32_t mndProcessDropQnodeRsp(SMndMsg *pRsp);
|
||||||
static int32_t mndGetQnodeMeta(SMndMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
|
static int32_t mndGetQnodeMeta(SMndMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
|
||||||
static int32_t mndRetrieveQnodes(SMndMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
|
static int32_t mndRetrieveQnodes(SMndMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
|
||||||
static void mndCancelGetNextQnode(SMnode *pMnode, void *pIter);
|
static void mndCancelGetNextQnode(SMnode *pMnode, void *pIter);
|
||||||
|
static int32_t mndProcessQnodeListReq(SMnodeMsg *pReq);
|
||||||
|
|
||||||
int32_t mndInitQnode(SMnode *pMnode) {
|
int32_t mndInitQnode(SMnode *pMnode) {
|
||||||
SSdbTable table = {.sdbType = SDB_QNODE,
|
SSdbTable table = {.sdbType = SDB_QNODE,
|
||||||
|
@ -48,6 +49,7 @@ int32_t mndInitQnode(SMnode *pMnode) {
|
||||||
|
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_QNODE, mndProcessCreateQnodeReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_QNODE, mndProcessCreateQnodeReq);
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_DROP_QNODE, mndProcessDropQnodeReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_DROP_QNODE, mndProcessDropQnodeReq);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_MND_QNODE_LIST, mndProcessQnodeListReq);
|
||||||
mndSetMsgHandle(pMnode, TDMT_DND_CREATE_QNODE_RSP, mndProcessCreateQnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_DND_CREATE_QNODE_RSP, mndProcessCreateQnodeRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_DND_DROP_QNODE_RSP, mndProcessDropQnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_DND_DROP_QNODE_RSP, mndProcessDropQnodeRsp);
|
||||||
|
|
||||||
|
@ -430,6 +432,67 @@ DROP_QNODE_OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndProcessQnodeListReq(SMnodeMsg *pReq) {
|
||||||
|
int32_t code = -1;
|
||||||
|
SQnodeListReq qlistReq = {0};
|
||||||
|
int32_t numOfRows = 0;
|
||||||
|
SMnode *pMnode = pReq->pMnode;
|
||||||
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
SQnodeObj *pObj = NULL;
|
||||||
|
SQnodeListRsp qlistRsp = {0};
|
||||||
|
|
||||||
|
if (tDeserializeSQnodeListReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &qlistReq) != 0) {
|
||||||
|
mError("invalid qnode list msg");
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto QNODE_LIST_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
qlistRsp.epSetList = taosArrayInit(5, sizeof(SEpSet));
|
||||||
|
if (NULL == qlistRsp.epSetList) {
|
||||||
|
mError("taosArrayInit epSet failed");
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto QNODE_LIST_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
void *pIter = sdbFetch(pSdb, SDB_QNODE, NULL, (void **)&pObj);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
|
SEpSet epSet = {0};
|
||||||
|
strcpy(epSet.eps[0].fqdn, pObj->pDnode->fqdn);
|
||||||
|
epSet.eps[0].port = pObj->pDnode->port;
|
||||||
|
epSet.numOfEps = 1;
|
||||||
|
|
||||||
|
taosArrayPush(qlistRsp.epSetList, &epSet);
|
||||||
|
|
||||||
|
numOfRows++;
|
||||||
|
sdbRelease(pSdb, pObj);
|
||||||
|
|
||||||
|
if (qlistReq.rowNum > 0 && numOfRows >= qlistReq.rowNum) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rspLen = tSerializeSQnodeListRsp(NULL, 0, &qlistRsp);
|
||||||
|
void *pRsp = malloc(rspLen);
|
||||||
|
if (pRsp == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto QNODE_LIST_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
tSerializeSQnodeListRsp(pRsp, rspLen, &qlistRsp);
|
||||||
|
|
||||||
|
pReq->contLen = rspLen;
|
||||||
|
pReq->pCont = pRsp;
|
||||||
|
code = 0;
|
||||||
|
|
||||||
|
QNODE_LIST_OVER:
|
||||||
|
|
||||||
|
tFreeSQnodeListRsp(&qlistRsp);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessCreateQnodeRsp(SMndMsg *pRsp) {
|
static int32_t mndProcessCreateQnodeRsp(SMndMsg *pRsp) {
|
||||||
mndTransProcessRsp(pRsp);
|
mndTransProcessRsp(pRsp);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -32,30 +32,30 @@
|
||||||
int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscribeObj* pSub) {
|
int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscribeObj* pSub) {
|
||||||
SSdb* pSdb = pMnode->pSdb;
|
SSdb* pSdb = pMnode->pSdb;
|
||||||
SVgObj* pVgroup = NULL;
|
SVgObj* pVgroup = NULL;
|
||||||
SQueryDag* pDag = qStringToDag(pTopic->physicalPlan);
|
SQueryPlan* pPlan = qStringToQueryPlan(pTopic->physicalPlan);
|
||||||
if (pDag == NULL) {
|
if (pPlan == NULL) {
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(pSub->vgNum == 0);
|
ASSERT(pSub->vgNum == 0);
|
||||||
|
|
||||||
int32_t levelNum = taosArrayGetSize(pDag->pSubplans);
|
int32_t levelNum = LIST_LENGTH(pPlan->pSubplans);
|
||||||
if (levelNum != 1) {
|
if (levelNum != 1) {
|
||||||
qDestroyQueryDag(pDag);
|
qDestroyQueryPlan(pPlan);
|
||||||
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* plans = taosArrayGetP(pDag->pSubplans, 0);
|
SNodeListNode* inner = nodesListGetNode(pPlan->pSubplans, 0);
|
||||||
|
|
||||||
int32_t opNum = taosArrayGetSize(plans);
|
int32_t opNum = LIST_LENGTH(inner->pNodeList);
|
||||||
if (opNum != 1) {
|
if (opNum != 1) {
|
||||||
qDestroyQueryDag(pDag);
|
qDestroyQueryPlan(pPlan);
|
||||||
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
SSubplan* plan = taosArrayGetP(plans, 0);
|
SSubplan* plan = nodesListGetNode(inner->pNodeList, 0);
|
||||||
|
|
||||||
void* pIter = NULL;
|
void* pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -78,14 +78,14 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib
|
||||||
int32_t msgLen;
|
int32_t msgLen;
|
||||||
if (qSubPlanToString(plan, &consumerEp.qmsg, &msgLen) < 0) {
|
if (qSubPlanToString(plan, &consumerEp.qmsg, &msgLen) < 0) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryDag(pDag);
|
qDestroyQueryPlan(pPlan);
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taosArrayPush(pSub->unassignedVg, &consumerEp);
|
taosArrayPush(pSub->unassignedVg, &consumerEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
qDestroyQueryDag(pDag);
|
qDestroyQueryPlan(pPlan);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ static void mndReleaseShowObj(SShowObj *pShow, bool forceRemove);
|
||||||
static int32_t mndProcessShowReq(SMndMsg *pReq);
|
static int32_t mndProcessShowReq(SMndMsg *pReq);
|
||||||
static int32_t mndProcessRetrieveReq(SMndMsg *pReq);
|
static int32_t mndProcessRetrieveReq(SMndMsg *pReq);
|
||||||
static bool mndCheckRetrieveFinished(SShowObj *pShow);
|
static bool mndCheckRetrieveFinished(SShowObj *pShow);
|
||||||
|
static int32_t mndProcessRetrieveSysTableReq(SMnodeMsg *pReq);
|
||||||
|
|
||||||
int32_t mndInitShow(SMnode *pMnode) {
|
int32_t mndInitShow(SMnode *pMnode) {
|
||||||
SShowMgmt *pMgmt = &pMnode->showMgmt;
|
SShowMgmt *pMgmt = &pMnode->showMgmt;
|
||||||
|
@ -38,6 +39,7 @@ int32_t mndInitShow(SMnode *pMnode) {
|
||||||
|
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_SHOW, mndProcessShowReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_SHOW, mndProcessShowReq);
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_SHOW_RETRIEVE, mndProcessRetrieveReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_SHOW_RETRIEVE, mndProcessRetrieveReq);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_MND_SYSTABLE_RETRIEVE, mndProcessRetrieveSysTableReq);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,6 +263,106 @@ static int32_t mndProcessRetrieveReq(SMndMsg *pReq) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndProcessRetrieveSysTableReq(SMnodeMsg *pReq) {
|
||||||
|
SMnode *pMnode = pReq->pMnode;
|
||||||
|
SShowMgmt *pMgmt = &pMnode->showMgmt;
|
||||||
|
int32_t rowsToRead = 0;
|
||||||
|
int32_t size = 0;
|
||||||
|
int32_t rowsRead = 0;
|
||||||
|
|
||||||
|
SRetrieveTableReq retrieveReq = {0};
|
||||||
|
if (tDeserializeSRetrieveTableReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &retrieveReq) != 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SShowObj* pShow = NULL;
|
||||||
|
|
||||||
|
if (retrieveReq.showId == 0) {
|
||||||
|
SShowReq req = {0};
|
||||||
|
req.type = retrieveReq.type;
|
||||||
|
strncpy(req.db, retrieveReq.db, tListLen(req.db));
|
||||||
|
|
||||||
|
pShow = mndCreateShowObj(pMnode, &req);
|
||||||
|
if (pShow == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
mError("failed to process show-meta req since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pShow = mndAcquireShowObj(pMnode, retrieveReq.showId);
|
||||||
|
if (pShow == NULL) {
|
||||||
|
terrno = TSDB_CODE_MND_INVALID_SHOWOBJ;
|
||||||
|
mError("failed to process show-retrieve req:%p since %s", pShow, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowRetrieveFp retrieveFp = pMgmt->retrieveFps[pShow->type];
|
||||||
|
if (retrieveFp == NULL) {
|
||||||
|
mndReleaseShowObj((SShowObj*) pShow, false);
|
||||||
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
|
mError("show:0x%" PRIx64 ", failed to retrieve data since %s", pShow->id, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mDebug("show:0x%" PRIx64 ", start retrieve data, numOfReads:%d numOfRows:%d type:%s", pShow->id, pShow->numOfReads,
|
||||||
|
pShow->numOfRows, mndShowStr(pShow->type));
|
||||||
|
|
||||||
|
if (mndCheckRetrieveFinished((SShowObj*) pShow)) {
|
||||||
|
mDebug("show:0x%" PRIx64 ", read finished, numOfReads:%d numOfRows:%d", pShow->id, pShow->numOfReads,
|
||||||
|
pShow->numOfRows);
|
||||||
|
pShow->numOfReads = pShow->numOfRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((retrieveReq.free & TSDB_QUERY_TYPE_FREE_RESOURCE) != TSDB_QUERY_TYPE_FREE_RESOURCE) {
|
||||||
|
rowsToRead = pShow->numOfRows - pShow->numOfReads;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return no more than 100 tables in one round trip */
|
||||||
|
if (rowsToRead > SHOW_STEP_SIZE) rowsToRead = SHOW_STEP_SIZE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the actual number of table may be larger than the value of pShow->numOfRows, if a query is
|
||||||
|
* issued during a continuous create table operation. Therefore, rowToRead may be less than 0.
|
||||||
|
*/
|
||||||
|
if (rowsToRead < 0) rowsToRead = 0;
|
||||||
|
size = pShow->rowSize * rowsToRead;
|
||||||
|
|
||||||
|
size += SHOW_STEP_SIZE;
|
||||||
|
SRetrieveTableRsp *pRsp = rpcMallocCont(size);
|
||||||
|
if (pRsp == NULL) {
|
||||||
|
mndReleaseShowObj((SShowObj*) pShow, false);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
mError("show:0x%" PRIx64 ", failed to retrieve data since %s", pShow->id, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if free flag is set, client wants to clean the resources
|
||||||
|
if ((retrieveReq.free & TSDB_QUERY_TYPE_FREE_RESOURCE) != TSDB_QUERY_TYPE_FREE_RESOURCE) {
|
||||||
|
rowsRead = (*retrieveFp)(pReq, (SShowObj*) pShow, pRsp->data, rowsToRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
mDebug("show:0x%" PRIx64 ", stop retrieve data, rowsRead:%d rowsToRead:%d", pShow->id, rowsRead, rowsToRead);
|
||||||
|
|
||||||
|
pRsp->numOfRows = htonl(rowsRead);
|
||||||
|
pRsp->precision = TSDB_TIME_PRECISION_MILLI; // millisecond time precision
|
||||||
|
|
||||||
|
pReq->pCont = pRsp;
|
||||||
|
pReq->contLen = size;
|
||||||
|
|
||||||
|
if (rowsRead == 0 || rowsToRead == 0 || (rowsRead == rowsToRead && pShow->numOfRows == pShow->numOfReads)) {
|
||||||
|
pRsp->completed = 1;
|
||||||
|
mDebug("show:0x%" PRIx64 ", retrieve completed", pShow->id);
|
||||||
|
mndReleaseShowObj((SShowObj*) pShow, true);
|
||||||
|
} else {
|
||||||
|
mDebug("show:0x%" PRIx64 ", retrieve not completed yet", pShow->id);
|
||||||
|
mndReleaseShowObj((SShowObj*) pShow, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
char *mndShowStr(int32_t showType) {
|
char *mndShowStr(int32_t showType) {
|
||||||
switch (showType) {
|
switch (showType) {
|
||||||
case TSDB_MGMT_TABLE_ACCT:
|
case TSDB_MGMT_TABLE_ACCT:
|
||||||
|
|
|
@ -773,10 +773,10 @@ static int32_t mndProcessDoRebalanceMsg(SMndMsg *pMsg) {
|
||||||
static int32_t mndInitUnassignedVg(SMnode *pMnode, const SMqTopicObj *pTopic, SMqSubscribeObj *pSub) {
|
static int32_t mndInitUnassignedVg(SMnode *pMnode, const SMqTopicObj *pTopic, SMqSubscribeObj *pSub) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
SQueryDag *pDag = qStringToDag(pTopic->physicalPlan);
|
SQueryPlan *pPlan = qStringToQueryPlan(pTopic->physicalPlan);
|
||||||
SArray *pArray = NULL;
|
SArray *pArray = NULL;
|
||||||
SArray *inner = taosArrayGet(pDag->pSubplans, 0);
|
SNodeListNode *inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 0);
|
||||||
SSubplan *plan = taosArrayGetP(inner, 0);
|
SSubplan *plan = (SSubplan*)nodesListGetNode(inner->pNodeList, 0);
|
||||||
SArray *unassignedVg = pSub->unassignedVg;
|
SArray *unassignedVg = pSub->unassignedVg;
|
||||||
|
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
@ -792,7 +792,7 @@ static int32_t mndInitUnassignedVg(SMnode *pMnode, const SMqTopicObj *pTopic, SM
|
||||||
plan->execNode.nodeId = pVgroup->vgId;
|
plan->execNode.nodeId = pVgroup->vgId;
|
||||||
plan->execNode.epset = mndGetVgroupEpset(pMnode, pVgroup);
|
plan->execNode.epset = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
|
|
||||||
if (schedulerConvertDagToTaskList(pDag, &pArray) < 0) {
|
if (schedulerConvertDagToTaskList(pPlan, &pArray) < 0) {
|
||||||
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
terrno = TSDB_CODE_MND_UNSUPPORTED_TOPIC;
|
||||||
mError("unsupport topic: %s, sql: %s", pTopic->name, pTopic->sql);
|
mError("unsupport topic: %s, sql: %s", pTopic->name, pTopic->sql);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -11,4 +11,7 @@ target_link_libraries(
|
||||||
PRIVATE os
|
PRIVATE os
|
||||||
PRIVATE common
|
PRIVATE common
|
||||||
PRIVATE util
|
PRIVATE util
|
||||||
|
PRIVATE qworker
|
||||||
|
PRIVATE qcom
|
||||||
|
PRIVATE executor
|
||||||
)
|
)
|
|
@ -28,8 +28,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct SQWorkerMgmt SQHandle;
|
||||||
|
|
||||||
typedef struct SQnode {
|
typedef struct SQnode {
|
||||||
|
int32_t qndId;
|
||||||
SQnodeOpt opt;
|
SQnodeOpt opt;
|
||||||
|
SQHandle* pQuery;
|
||||||
} SQnode;
|
} SQnode;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -14,13 +14,35 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qndInt.h"
|
#include "qndInt.h"
|
||||||
|
#include "query.h"
|
||||||
|
#include "qworker.h"
|
||||||
|
#include "executor.h"
|
||||||
|
|
||||||
|
int32_t qnodePutReqToVQueryQ(SQnode* pQnode, struct SRpcMsg* pReq) {}
|
||||||
|
void qnodeSendReqToDnode(SQnode* pQnode, struct SEpSet* epSet, struct SRpcMsg* pReq) {}
|
||||||
|
|
||||||
|
|
||||||
SQnode *qndOpen(const SQnodeOpt *pOption) {
|
SQnode *qndOpen(const SQnodeOpt *pOption) {
|
||||||
SQnode *pQnode = calloc(1, sizeof(SQnode));
|
SQnode *pQnode = calloc(1, sizeof(SQnode));
|
||||||
|
if (NULL == pQnode) {
|
||||||
|
qError("calloc SQnode failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qWorkerInit(NODE_TYPE_QNODE, pQnode->qndId, NULL, (void **)&pQnode->pQuery, pQnode,
|
||||||
|
(putReqToQueryQFp)qnodePutReqToVQueryQ, (sendReqToDnodeFp)qnodeSendReqToDnode)) {
|
||||||
|
tfree(pQnode);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return pQnode;
|
return pQnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qndClose(SQnode *pQnode) { free(pQnode); }
|
void qndClose(SQnode *pQnode) {
|
||||||
|
qWorkerDestroy((void **)&pQnode->pQuery);
|
||||||
|
|
||||||
|
free(pQnode);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t qndGetLoad(SQnode *pQnode, SQnodeLoad *pLoad) { return 0; }
|
int32_t qndGetLoad(SQnode *pQnode, SQnodeLoad *pLoad) { return 0; }
|
||||||
|
|
||||||
|
@ -29,3 +51,51 @@ int32_t qndProcessMsg(SQnode *pQnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qnodeProcessQueryMsg(SQnode *pQnode, SRpcMsg *pMsg) {
|
||||||
|
qTrace("message in query queue is processing");
|
||||||
|
SReadHandle handle = {0};
|
||||||
|
|
||||||
|
switch (pMsg->msgType) {
|
||||||
|
case TDMT_VND_QUERY:{
|
||||||
|
return qWorkerProcessQueryMsg(&handle, pQnode->pQuery, pMsg);
|
||||||
|
}
|
||||||
|
case TDMT_VND_QUERY_CONTINUE:
|
||||||
|
return qWorkerProcessCQueryMsg(&handle, pQnode->pQuery, pMsg);
|
||||||
|
default:
|
||||||
|
qError("unknown msg type:%d in query queue", pMsg->msgType);
|
||||||
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int qnodeProcessFetchMsg(SQnode *pQnode, SRpcMsg *pMsg) {
|
||||||
|
qTrace("message in fetch queue is processing");
|
||||||
|
switch (pMsg->msgType) {
|
||||||
|
case TDMT_VND_FETCH:
|
||||||
|
return qWorkerProcessFetchMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_FETCH_RSP:
|
||||||
|
return qWorkerProcessFetchRsp(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_RES_READY:
|
||||||
|
return qWorkerProcessReadyMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_TASKS_STATUS:
|
||||||
|
return qWorkerProcessStatusMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_CANCEL_TASK:
|
||||||
|
return qWorkerProcessCancelMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_DROP_TASK:
|
||||||
|
return qWorkerProcessDropMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_SHOW_TABLES:
|
||||||
|
return qWorkerProcessShowMsg(pQnode, pQnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_SHOW_TABLES_FETCH:
|
||||||
|
//return vnodeGetTableList(pQnode, pMsg);
|
||||||
|
case TDMT_VND_TABLE_META:
|
||||||
|
//return vnodeGetTableMeta(pQnode, pMsg);
|
||||||
|
case TDMT_VND_CONSUME:
|
||||||
|
//return tqProcessConsumeReq(pQnode->pTq, pMsg);
|
||||||
|
default:
|
||||||
|
qError("unknown msg type:%d in fetch queue", pMsg->msgType);
|
||||||
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,8 +58,8 @@ STbCfg * metaGetTbInfoByUid(SMeta *pMeta, tb_uid_t uid);
|
||||||
STbCfg * metaGetTbInfoByName(SMeta *pMeta, char *tbname, tb_uid_t *uid);
|
STbCfg * metaGetTbInfoByName(SMeta *pMeta, char *tbname, tb_uid_t *uid);
|
||||||
SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline);
|
SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline);
|
||||||
STSchema * metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver);
|
STSchema * metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver);
|
||||||
STSma * metaGetSmaInfoByName(SMeta *pMeta, const char *indexName);
|
STSma * metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid);
|
||||||
STSmaWrapper * metaGetSmaInfoByUid(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);
|
||||||
|
|
||||||
SMTbCursor *metaOpenTbCursor(SMeta *pMeta);
|
SMTbCursor *metaOpenTbCursor(SMeta *pMeta);
|
||||||
|
|
|
@ -91,22 +91,19 @@ int tsdbCommit(STsdb *pTsdb);
|
||||||
* @brief Insert tSma(Time-range-wise SMA) data from stream computing engine
|
* @brief Insert tSma(Time-range-wise SMA) data from stream computing engine
|
||||||
*
|
*
|
||||||
* @param pTsdb
|
* @param pTsdb
|
||||||
* @param param
|
* @param msg
|
||||||
* @param pData
|
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbInsertTSmaData(STsdb *pTsdb, STSma *param, STSmaData *pData);
|
int32_t tsdbInsertTSmaData(STsdb *pTsdb, char *msg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Insert RSma(Time-range-wise Rollup SMA) data.
|
* @brief Insert RSma(Time-range-wise Rollup SMA) data.
|
||||||
*
|
*
|
||||||
* @param pTsdb
|
* @param pTsdb
|
||||||
* @param param
|
* @param msg
|
||||||
* @param pData
|
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbInsertRSmaData(STsdb *pTsdb, SRSma *param, STSmaData *pData);
|
int32_t tsdbInsertRSmaData(STsdb *pTsdb, char *msg);
|
||||||
|
|
||||||
|
|
||||||
// STsdbCfg
|
// STsdbCfg
|
||||||
int tsdbOptionsInit(STsdbCfg *);
|
int tsdbOptionsInit(STsdbCfg *);
|
||||||
|
|
|
@ -42,17 +42,14 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STsdbFSMeta meta; // FS meta
|
STsdbFSMeta meta; // FS meta
|
||||||
SArray * df; // data file array
|
SArray * df; // data file array
|
||||||
|
SArray * sf; // sma data file array v2(t|r)1900.index_name_1
|
||||||
// SArray * v2t100.index_name
|
|
||||||
|
|
||||||
SArray * smaf; // sma data file array v2t1900.index_name
|
|
||||||
} SFSStatus;
|
} SFSStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Directory structure of .tsma data files.
|
* @brief Directory structure of .tsma data files.
|
||||||
*
|
*
|
||||||
* root@cary /vnode2/tsdb $ tree .tsma/
|
* /vnode2/tsdb $ tree .sma/
|
||||||
* .tsma/
|
* .sma/
|
||||||
* ├── v2t100.index_name_1
|
* ├── v2t100.index_name_1
|
||||||
* ├── v2t101.index_name_1
|
* ├── v2t101.index_name_1
|
||||||
* ├── v2t102.index_name_1
|
* ├── v2t102.index_name_1
|
||||||
|
|
|
@ -335,6 +335,17 @@ typedef struct {
|
||||||
SDFile files[TSDB_FILE_MAX];
|
SDFile files[TSDB_FILE_MAX];
|
||||||
} SDFileSet;
|
} SDFileSet;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int fid;
|
||||||
|
int8_t state;
|
||||||
|
uint8_t ver;
|
||||||
|
#if 0
|
||||||
|
SDFInfo info;
|
||||||
|
#endif
|
||||||
|
STfsFile f;
|
||||||
|
TdFilePtr pFile;
|
||||||
|
} SSFile; // files split by days with fid
|
||||||
|
|
||||||
#define TSDB_LATEST_FSET_VER 0
|
#define TSDB_LATEST_FSET_VER 0
|
||||||
|
|
||||||
#define TSDB_FSET_FID(s) ((s)->fid)
|
#define TSDB_FSET_FID(s) ((s)->fid)
|
||||||
|
|
|
@ -19,26 +19,28 @@
|
||||||
typedef struct SSmaStat SSmaStat;
|
typedef struct SSmaStat SSmaStat;
|
||||||
|
|
||||||
// insert/update interface
|
// insert/update interface
|
||||||
int32_t tsdbInsertTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData);
|
int32_t tsdbInsertTSmaDataImpl(STsdb *pTsdb, char *msg);
|
||||||
int32_t tsdbInsertRSmaDataImpl(STsdb *pTsdb, SRSma *param, STSmaData *pData);
|
int32_t tsdbInsertRSmaDataImpl(STsdb *pTsdb, char *msg);
|
||||||
|
|
||||||
|
|
||||||
// query interface
|
// query interface
|
||||||
// TODO: This is the basic params, and should wrap the params to a queryHandle.
|
// TODO: This is the basic params, and should wrap the params to a queryHandle.
|
||||||
int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeWindow *queryWin, int32_t nMaxResult);
|
int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSmaDataWrapper *pData, STimeWindow *queryWin, int32_t nMaxResult);
|
||||||
|
|
||||||
// management interface
|
// management interface
|
||||||
int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg);
|
int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg);
|
||||||
|
int32_t tsdbDestroySmaState(SSmaStat *pSmaStat);
|
||||||
|
#if 0
|
||||||
int32_t tsdbGetTSmaStatus(STsdb *pTsdb, STSma *param, void *result);
|
int32_t tsdbGetTSmaStatus(STsdb *pTsdb, STSma *param, void *result);
|
||||||
int32_t tsdbRemoveTSmaData(STsdb *pTsdb, STSma *param, STimeWindow *pWin);
|
int32_t tsdbRemoveTSmaData(STsdb *pTsdb, STSma *param, STimeWindow *pWin);
|
||||||
int32_t tsdbDestroySmaState(SSmaStat *pSmaStat);
|
#endif
|
||||||
|
|
||||||
// internal func
|
// internal func
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tsdbEncodeTSmaKey(uint64_t tableUid, col_id_t colId, TSKEY tsKey, void **pData) {
|
static FORCE_INLINE int32_t tsdbEncodeTSmaKey(tb_uid_t tableUid, col_id_t colId, TSKEY tsKey, void **pData) {
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
len += taosEncodeFixedU64(pData, tableUid);
|
len += taosEncodeFixedI64(pData, tableUid);
|
||||||
len += taosEncodeFixedU16(pData, colId);
|
len += taosEncodeFixedU16(pData, colId);
|
||||||
len += taosEncodeFixedI64(pData, tsKey);
|
len += taosEncodeFixedI64(pData, tsKey);
|
||||||
return len;
|
return len;
|
||||||
|
|
|
@ -26,6 +26,7 @@ extern "C" {
|
||||||
typedef struct SQWorkerMgmt SQHandle;
|
typedef struct SQWorkerMgmt SQHandle;
|
||||||
|
|
||||||
int vnodeQueryOpen(SVnode *pVnode);
|
int vnodeQueryOpen(SVnode *pVnode);
|
||||||
|
void vnodeQueryClose(SVnode *pVnode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,21 +227,27 @@ int metaRemoveTableFromDb(SMeta *pMeta, tb_uid_t uid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaSaveSmaToDB(SMeta *pMeta, STSma *pSmaCfg) {
|
int metaSaveSmaToDB(SMeta *pMeta, STSma *pSmaCfg) {
|
||||||
char buf[512] = {0}; // TODO: may overflow
|
// char buf[512] = {0}; // TODO: may overflow
|
||||||
void *pBuf = NULL;
|
void *pBuf = NULL, *qBuf = NULL;
|
||||||
DBT key1 = {0}, value1 = {0};
|
DBT key1 = {0}, value1 = {0};
|
||||||
|
|
||||||
{
|
{
|
||||||
// save sma info
|
// save sma info
|
||||||
pBuf = buf;
|
int32_t len = tEncodeTSma(NULL, pSmaCfg);
|
||||||
|
pBuf = calloc(len, 1);
|
||||||
|
if (pBuf == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
key1.data = pSmaCfg->indexName;
|
key1.data = (void *)&pSmaCfg->indexUid;
|
||||||
key1.size = strlen(key1.data);
|
key1.size = sizeof(pSmaCfg->indexUid);
|
||||||
|
|
||||||
tEncodeTSma(&pBuf, pSmaCfg);
|
qBuf = pBuf;
|
||||||
|
tEncodeTSma(&qBuf, pSmaCfg);
|
||||||
|
|
||||||
value1.data = buf;
|
value1.data = pBuf;
|
||||||
value1.size = POINTER_DISTANCE(pBuf, buf);
|
value1.size = POINTER_DISTANCE(qBuf, pBuf);
|
||||||
value1.app_data = pSmaCfg;
|
value1.app_data = pSmaCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -609,7 +615,7 @@ STbCfg *metaGetTbInfoByName(SMeta *pMeta, char *tbname, tb_uid_t *uid) {
|
||||||
return pTbCfg;
|
return pTbCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
STSma *metaGetSmaInfoByName(SMeta *pMeta, const char *indexName) {
|
STSma *metaGetSmaInfoByIndex(SMeta *pMeta, int64_t indexUid) {
|
||||||
STSma * pCfg = NULL;
|
STSma * pCfg = NULL;
|
||||||
SMetaDB *pDB = pMeta->pDB;
|
SMetaDB *pDB = pMeta->pDB;
|
||||||
DBT key = {0};
|
DBT key = {0};
|
||||||
|
@ -617,8 +623,8 @@ STSma *metaGetSmaInfoByName(SMeta *pMeta, const char *indexName) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
// Set key/value
|
// Set key/value
|
||||||
key.data = (void *)indexName;
|
key.data = (void *)&indexUid;
|
||||||
key.size = strlen(indexName);
|
key.size = sizeof(indexUid);
|
||||||
|
|
||||||
// Query
|
// Query
|
||||||
metaDBRLock(pDB);
|
metaDBRLock(pDB);
|
||||||
|
@ -634,7 +640,10 @@ STSma *metaGetSmaInfoByName(SMeta *pMeta, const char *indexName) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDecodeTSma(value.data, pCfg);
|
if (tDecodeTSma(value.data, pCfg) == NULL) {
|
||||||
|
tfree(pCfg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return pCfg;
|
return pCfg;
|
||||||
}
|
}
|
||||||
|
@ -871,7 +880,7 @@ const char *metaSmaCursorNext(SMSmaCursor *pCur) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STSmaWrapper *metaGetSmaInfoByUid(SMeta *pMeta, tb_uid_t uid) {
|
STSmaWrapper *metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid) {
|
||||||
STSmaWrapper *pSW = NULL;
|
STSmaWrapper *pSW = NULL;
|
||||||
|
|
||||||
pSW = calloc(sizeof(*pSW), 1);
|
pSW = calloc(sizeof(*pSW), 1);
|
||||||
|
|
|
@ -13,18 +13,19 @@
|
||||||
* 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 <tdatablock.h>
|
||||||
|
#include "os.h"
|
||||||
|
#include "talgo.h"
|
||||||
|
#include "tcompare.h"
|
||||||
|
#include "tdataformat.h"
|
||||||
|
#include "texception.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsdbDef.h"
|
#include "tsdbDef.h"
|
||||||
#include "tsdbFS.h"
|
#include "tsdbFS.h"
|
||||||
#include "tsdbLog.h"
|
#include "tsdbLog.h"
|
||||||
#include "tsdbReadImpl.h"
|
#include "tsdbReadImpl.h"
|
||||||
#include "ttime.h"
|
|
||||||
#include "texception.h"
|
|
||||||
#include "os.h"
|
|
||||||
#include "talgo.h"
|
|
||||||
#include "tcompare.h"
|
|
||||||
#include "tdataformat.h"
|
|
||||||
#include "tskiplist.h"
|
#include "tskiplist.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
|
@ -1472,6 +1473,8 @@ static int32_t doCopyRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, int32_t
|
||||||
return numOfRows + num;
|
return numOfRows + num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO fix bug for reverse copy data
|
||||||
|
// TODO handle the null data
|
||||||
// Note: row1 always has high priority
|
// Note: row1 always has high priority
|
||||||
static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacity, int32_t numOfRows, STSRow* row1,
|
static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacity, int32_t numOfRows, STSRow* row1,
|
||||||
STSRow* row2, int32_t numOfCols, uint64_t uid, STSchema* pSchema1, STSchema* pSchema2,
|
STSRow* row2, int32_t numOfCols, uint64_t uid, STSchema* pSchema1, STSchema* pSchema2,
|
||||||
|
@ -1515,7 +1518,6 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t i = 0, j = 0, k = 0;
|
int32_t i = 0, j = 0, k = 0;
|
||||||
while(i < numOfCols && (j < numOfColsOfRow1 || k < numOfColsOfRow2)) {
|
while(i < numOfCols && (j < numOfColsOfRow1 || k < numOfColsOfRow2)) {
|
||||||
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
||||||
|
@ -1586,7 +1588,6 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
tdSKvRowGetVal(row, colId, offset, chosen_itr, &sVal);
|
tdSKvRowGetVal(row, colId, offset, chosen_itr, &sVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (colId == pColInfo->info.colId) {
|
if (colId == pColInfo->info.colId) {
|
||||||
if (tdValTypeIsNorm(sVal.valType)) {
|
if (tdValTypeIsNorm(sVal.valType)) {
|
||||||
switch (pColInfo->info.type) {
|
switch (pColInfo->info.type) {
|
||||||
|
@ -1594,7 +1595,6 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
memcpy(pData, sVal.val, varDataTLen(sVal.val));
|
memcpy(pData, sVal.val, varDataTLen(sVal.val));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_NULL:
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
@ -1625,11 +1625,7 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
memcpy(pData, sVal.val, pColInfo->info.bytes);
|
memcpy(pData, sVal.val, pColInfo->info.bytes);
|
||||||
}
|
}
|
||||||
} else if (forceSetNull) {
|
} else if (forceSetNull) {
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
colDataAppend(pColInfo, numOfRows, NULL, true);
|
||||||
setVardataNull(pData, pColInfo->info.type);
|
|
||||||
} else {
|
|
||||||
setNull(pData, pColInfo->info.type, pColInfo->info.bytes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
|
@ -1640,11 +1636,7 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(forceSetNull) {
|
if(forceSetNull) {
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
colDataAppend(pColInfo, numOfRows, NULL, true);
|
||||||
setVardataNull(pData, pColInfo->info.type);
|
|
||||||
} else {
|
|
||||||
setNull(pData, pColInfo->info.type, pColInfo->info.bytes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -1653,18 +1645,7 @@ static void mergeTwoRowFromMem(STsdbReadHandle* pTsdbReadHandle, int32_t capacit
|
||||||
if(forceSetNull) {
|
if(forceSetNull) {
|
||||||
while (i < numOfCols) { // the remain columns are all null data
|
while (i < numOfCols) { // the remain columns are all null data
|
||||||
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i);
|
||||||
if (ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
colDataAppend(pColInfo, numOfRows, NULL, true);
|
||||||
pData = (char*)pColInfo->pData + numOfRows * pColInfo->info.bytes;
|
|
||||||
} else {
|
|
||||||
pData = (char*)pColInfo->pData + (capacity - numOfRows - 1) * pColInfo->info.bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
setVardataNull(pData, pColInfo->info.type);
|
|
||||||
} else {
|
|
||||||
setNull(pData, pColInfo->info.type, pColInfo->info.bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,22 +19,20 @@
|
||||||
#define SMA_STORAGE_SPLIT_HOURS 24
|
#define SMA_STORAGE_SPLIT_HOURS 24
|
||||||
#define SMA_KEY_LEN 18 // tableUid_colId_TSKEY 8+2+8
|
#define SMA_KEY_LEN 18 // tableUid_colId_TSKEY 8+2+8
|
||||||
|
|
||||||
#define SMA_STORE_SINGLE_BLOCKS // store SMA data by single block or multiple blocks
|
|
||||||
|
|
||||||
#define SMA_STATE_HASH_SLOT 4
|
#define SMA_STATE_HASH_SLOT 4
|
||||||
#define SMA_STATE_ITEM_HASH_SLOT 32
|
#define SMA_STATE_ITEM_HASH_SLOT 32
|
||||||
|
|
||||||
#define SMA_TEST_INDEX_NAME "smaTestIndexName" // TODO: just for test
|
#define SMA_TEST_INDEX_NAME "smaTestIndexName" // TODO: just for test
|
||||||
|
#define SMA_TEST_INDEX_UID 123456 // TODO: just for test
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SMA_STORAGE_LEVEL_TSDB = 0, // store TSma in dir e.g. vnode${N}/tsdb/.tsma
|
SMA_STORAGE_LEVEL_TSDB = 0, // use days of self-defined e.g. vnode${N}/tsdb/tsma/sma_index_uid/v2t200.dat
|
||||||
SMA_STORAGE_LEVEL_DFILESET = 1 // store TSma in file e.g. vnode${N}/tsdb/v2f1900.tsma.${sma_index_name}
|
SMA_STORAGE_LEVEL_DFILESET = 1 // use days of TS data e.g. vnode${N}/tsdb/rsma/sma_index_uid/v2r200.dat
|
||||||
} ESmaStorageLevel;
|
} ESmaStorageLevel;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STsdb * pTsdb;
|
STsdb * pTsdb;
|
||||||
char * pDFile; // TODO: use the real DFile type, not char*
|
char * pDFile; // TODO: use the real DFile type, not char*
|
||||||
int32_t interval; // interval with the precision of DB
|
int32_t interval; // interval with the precision of DB
|
||||||
int32_t blockSize; // size of SMA block item
|
|
||||||
// TODO
|
// TODO
|
||||||
} STSmaWriteH;
|
} STSmaWriteH;
|
||||||
|
|
||||||
|
@ -62,6 +60,7 @@ typedef struct {
|
||||||
*/
|
*/
|
||||||
int8_t state; // ETsdbSmaStat
|
int8_t state; // ETsdbSmaStat
|
||||||
SHashObj *expiredWindows; // key: skey of time window, value: N/A
|
SHashObj *expiredWindows; // key: skey of time window, value: N/A
|
||||||
|
STSma * pSma;
|
||||||
} SSmaStatItem;
|
} SSmaStatItem;
|
||||||
|
|
||||||
struct SSmaStat {
|
struct SSmaStat {
|
||||||
|
@ -69,20 +68,18 @@ struct SSmaStat {
|
||||||
};
|
};
|
||||||
|
|
||||||
// declaration of static functions
|
// declaration of static functions
|
||||||
static int32_t tsdbInitTSmaWriteH(STSmaWriteH *pSmaH, STsdb *pTsdb, STSma *param, STSmaData *pData);
|
static int32_t tsdbInitTSmaWriteH(STSmaWriteH *pSmaH, STsdb *pTsdb, STSmaDataWrapper *pData);
|
||||||
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSma *param, STSmaData *pData);
|
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSmaDataWrapper *pData);
|
||||||
static int32_t tsdbJudgeStorageLevel(int64_t interval, int8_t intervalUnit);
|
static int32_t tsdbJudgeStorageLevel(int64_t interval, int8_t intervalUnit);
|
||||||
static int32_t tsdbInsertTSmaDataSection(STSmaWriteH *pSmaH, STSmaData *pData, int32_t sectionDataLen, int32_t nBlocks);
|
static int32_t tsdbInsertTSmaDataSection(STSmaWriteH *pSmaH, STSmaDataWrapper *pData);
|
||||||
static int32_t tsdbInsertTSmaBlocks(void *bTree, const char *smaKey, const char *pData, int32_t dataLen);
|
static int32_t tsdbInsertTSmaBlocks(void *bTree, const char *smaKey, const char *pData, int32_t dataLen);
|
||||||
static int32_t tsdbTSmaDataSplit(STSmaWriteH *pSmaH, STSma *param, STSmaData *pData, int32_t days, int32_t nOffset,
|
|
||||||
int32_t fid, int32_t *nSmaBlocks);
|
|
||||||
static int64_t tsdbGetIntervalByPrecision(int64_t interval, uint8_t intervalUnit, int8_t precision);
|
|
||||||
static int32_t tsdbSetTSmaDataFile(STSmaWriteH *pSmaH, STSma *param, STSmaData *pData, int32_t storageLevel,
|
|
||||||
int32_t fid);
|
|
||||||
|
|
||||||
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSma *param, STSmaData *pData);
|
static int64_t tsdbGetIntervalByPrecision(int64_t interval, uint8_t intervalUnit, int8_t precision);
|
||||||
static int32_t tsdbInitTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow *queryWin);
|
static int32_t tsdbSetTSmaDataFile(STSmaWriteH *pSmaH, STSmaDataWrapper *pData, int32_t storageLevel, int32_t fid);
|
||||||
static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow *queryWin);
|
|
||||||
|
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSmaDataWrapper *pData);
|
||||||
|
static int32_t tsdbInitTSmaFile(STSmaReadH *pReadH, STimeWindow *queryWin);
|
||||||
|
static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, STimeWindow *queryWin);
|
||||||
|
|
||||||
static int32_t tsdbInitSmaStat(SSmaStat **pSmaStat) {
|
static int32_t tsdbInitSmaStat(SSmaStat **pSmaStat) {
|
||||||
ASSERT(pSmaStat != NULL);
|
ASSERT(pSmaStat != NULL);
|
||||||
|
@ -133,10 +130,10 @@ int32_t tsdbDestroySmaState(SSmaStat *pSmaStat) {
|
||||||
// TODO: use taosHashSetFreeFp when taosHashSetFreeFp is ready.
|
// TODO: use taosHashSetFreeFp when taosHashSetFreeFp is ready.
|
||||||
SSmaStatItem *item = taosHashIterate(pSmaStat->smaStatItems, NULL);
|
SSmaStatItem *item = taosHashIterate(pSmaStat->smaStatItems, NULL);
|
||||||
while (item != NULL) {
|
while (item != NULL) {
|
||||||
|
tfree(item->pSma);
|
||||||
taosHashCleanup(item->expiredWindows);
|
taosHashCleanup(item->expiredWindows);
|
||||||
item = taosHashIterate(pSmaStat->smaStatItems, item);
|
item = taosHashIterate(pSmaStat->smaStatItems, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashCleanup(pSmaStat->smaStatItems);
|
taosHashCleanup(pSmaStat->smaStatItems);
|
||||||
free(pSmaStat);
|
free(pSmaStat);
|
||||||
}
|
}
|
||||||
|
@ -154,9 +151,13 @@ int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbInitSmaStat(&pTsdb->pSmaStat); // lazy mode
|
// lazy mode
|
||||||
|
if (tsdbInitSmaStat(&pTsdb->pSmaStat) != TSDB_CODE_SUCCESS) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: decode the msg => start
|
// TODO: decode the msg => start
|
||||||
|
int64_t indexUid = SMA_TEST_INDEX_UID;
|
||||||
const char * indexName = SMA_TEST_INDEX_NAME;
|
const char * indexName = SMA_TEST_INDEX_NAME;
|
||||||
const int32_t SMA_TEST_EXPIRED_WINDOW_SIZE = 10;
|
const int32_t SMA_TEST_EXPIRED_WINDOW_SIZE = 10;
|
||||||
TSKEY expiredWindows[SMA_TEST_EXPIRED_WINDOW_SIZE];
|
TSKEY expiredWindows[SMA_TEST_EXPIRED_WINDOW_SIZE];
|
||||||
|
@ -169,14 +170,24 @@ int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg) {
|
||||||
SHashObj *pItemsHash = pTsdb->pSmaStat->smaStatItems;
|
SHashObj *pItemsHash = pTsdb->pSmaStat->smaStatItems;
|
||||||
|
|
||||||
SSmaStatItem *pItem = (SSmaStatItem *)taosHashGet(pItemsHash, indexName, strlen(indexName));
|
SSmaStatItem *pItem = (SSmaStatItem *)taosHashGet(pItemsHash, indexName, strlen(indexName));
|
||||||
if (!pItem) {
|
if (pItem == NULL) {
|
||||||
pItem = tsdbNewSmaStatItem(TSDB_SMA_STAT_EXPIRED); // TODO use the real state
|
pItem = tsdbNewSmaStatItem(TSDB_SMA_STAT_EXPIRED); // TODO use the real state
|
||||||
if (!pItem) {
|
if (pItem == NULL) {
|
||||||
// Response to stream computing: OOM
|
// Response to stream computing: OOM
|
||||||
// For query, if the indexName not found, the TSDB should tell query module to query raw TS data.
|
// For query, if the indexName not found, the TSDB should tell query module to query raw TS data.
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cache smaMeta
|
||||||
|
STSma *pSma = metaGetSmaInfoByIndex(pTsdb->pMeta, indexUid);
|
||||||
|
if (pSma == NULL) {
|
||||||
|
taosHashCleanup(pItem->expiredWindows);
|
||||||
|
free(pItem);
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
pItem->pSma = pSma;
|
||||||
|
|
||||||
|
// TODO: change indexName to indexUid
|
||||||
if (taosHashPut(pItemsHash, indexName, strnlen(indexName, TSDB_INDEX_NAME_LEN), &pItem, sizeof(pItem)) != 0) {
|
if (taosHashPut(pItemsHash, indexName, strnlen(indexName, TSDB_INDEX_NAME_LEN), &pItem, sizeof(pItem)) != 0) {
|
||||||
// If error occurs during put smaStatItem, free the resources of pItem
|
// If error occurs during put smaStatItem, free the resources of pItem
|
||||||
taosHashCleanup(pItem->expiredWindows);
|
taosHashCleanup(pItem->expiredWindows);
|
||||||
|
@ -195,6 +206,7 @@ int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg) {
|
||||||
// 2) This would solve the inconsistency to some extent, but not completely, unless we record all expired
|
// 2) This would solve the inconsistency to some extent, but not completely, unless we record all expired
|
||||||
// windows failed to put into hash table.
|
// windows failed to put into hash table.
|
||||||
taosHashCleanup(pItem->expiredWindows);
|
taosHashCleanup(pItem->expiredWindows);
|
||||||
|
tfree(pItem->pSma);
|
||||||
taosHashRemove(pItemsHash, indexName, sizeof(indexName));
|
taosHashRemove(pItemsHash, indexName, sizeof(indexName));
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -203,19 +215,21 @@ int32_t tsdbUpdateExpiredWindow(STsdb *pTsdb, char *msg) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbResetExpiredWindow(STsdb *pTsdb, const char *indexName, void *timeWindow) {
|
static int32_t tsdbResetExpiredWindow(STsdb *pTsdb, int64_t indexUid, TSKEY skey) {
|
||||||
SSmaStatItem *pItem = NULL;
|
SSmaStatItem *pItem = NULL;
|
||||||
|
|
||||||
if (pTsdb->pSmaStat && pTsdb->pSmaStat->smaStatItems) {
|
if (pTsdb->pSmaStat && pTsdb->pSmaStat->smaStatItems) {
|
||||||
pItem = (SSmaStatItem *)taosHashGet(pTsdb->pSmaStat->smaStatItems, indexName, strlen(indexName));
|
pItem = (SSmaStatItem *)taosHashGet(pTsdb->pSmaStat->smaStatItems, &indexUid, sizeof(indexUid));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pItem != NULL) {
|
if (pItem != NULL) {
|
||||||
// TODO: reset time windows for the sma data blocks
|
// TODO: reset time window for the sma data blocks
|
||||||
while (true) {
|
if (taosHashRemove(pItem->expiredWindows, &skey, sizeof(TSKEY)) != 0) {
|
||||||
TSKEY thisWindow = 0;
|
// error handling
|
||||||
taosHashRemove(pItem->expiredWindows, &thisWindow, sizeof(thisWindow));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// error handling
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -277,7 +291,7 @@ static int32_t tsdbJudgeStorageLevel(int64_t interval, int8_t intervalUnit) {
|
||||||
*/
|
*/
|
||||||
static int32_t tsdbInsertTSmaBlocks(void *bTree, const char *smaKey, const char *pData, int32_t dataLen) {
|
static int32_t tsdbInsertTSmaBlocks(void *bTree, const char *smaKey, const char *pData, int32_t dataLen) {
|
||||||
// TODO: insert sma data blocks into B+Tree
|
// TODO: insert sma data blocks into B+Tree
|
||||||
printf("insert sma data blocks into B+Tree: smaKey %" PRIx64 "-%" PRIu16 "-%" PRIx64 ", dataLen %d\n",
|
tsdbDebug("insert sma data blocks into B+Tree: smaKey %" PRIx64 "-%" PRIu16 "-%" PRIx64 ", dataLen %d",
|
||||||
*(uint64_t *)smaKey, *(uint16_t *)POINTER_SHIFT(smaKey, 8), *(int64_t *)POINTER_SHIFT(smaKey, 10), dataLen);
|
*(uint64_t *)smaKey, *(uint16_t *)POINTER_SHIFT(smaKey, 8), *(int64_t *)POINTER_SHIFT(smaKey, 10), dataLen);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -360,85 +374,60 @@ static int64_t tsdbGetIntervalByPrecision(int64_t interval, uint8_t intervalUnit
|
||||||
* @param nBlocks The nBlocks with the same fid since nOffset.
|
* @param nBlocks The nBlocks with the same fid since nOffset.
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
static int32_t tsdbInsertTSmaDataSection(STSmaWriteH *pSmaH, STSmaData *pData, int32_t nOffset, int32_t nBlocks) {
|
static int32_t tsdbInsertTSmaDataSection(STSmaWriteH *pSmaH, STSmaDataWrapper *pData) {
|
||||||
STsdb *pTsdb = pSmaH->pTsdb;
|
STsdb *pTsdb = pSmaH->pTsdb;
|
||||||
|
|
||||||
TASSERT(pData->colIds != NULL);
|
tsdbDebug("tsdbInsertTSmaDataSection: index %" PRIi64 ", skey %" PRIi64, pData->indexUid, pData->skey);
|
||||||
|
|
||||||
tsdbDebug("tsdbInsertTSmaDataSection: nOffset %d, nBlocks %d", nOffset, nBlocks);
|
// TODO: check the data integrity
|
||||||
printf("tsdbInsertTSmaDataSection: nOffset %d, nBlocks %d\n", nOffset, nBlocks);
|
|
||||||
|
|
||||||
int32_t colDataLen = pData->dataLen / pData->numOfColIds;
|
|
||||||
int32_t sectionDataLen = pSmaH->blockSize * nBlocks;
|
|
||||||
|
|
||||||
for (col_id_t i = 0; i < pData->numOfColIds; ++i) {
|
|
||||||
// param: pointer of B+Tree, key, value, dataLen
|
|
||||||
void *bTree = pSmaH->pDFile;
|
void *bTree = pSmaH->pDFile;
|
||||||
#ifndef SMA_STORE_SINGLE_BLOCKS
|
|
||||||
// save tSma data blocks as a whole
|
int32_t len = 0;
|
||||||
|
while (true) {
|
||||||
|
if (len >= pData->dataLen) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assert(pData->dataLen > 0);
|
||||||
|
STSmaTbData *pTbData = (STSmaTbData *)POINTER_SHIFT(pData->data, len);
|
||||||
|
|
||||||
|
int32_t tbLen = 0;
|
||||||
|
while (true) {
|
||||||
|
if (tbLen >= pTbData->dataLen) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assert(pTbData->dataLen > 0);
|
||||||
|
STSmaColData *pColData = (STSmaColData *)POINTER_SHIFT(pTbData->data, tbLen);
|
||||||
char smaKey[SMA_KEY_LEN] = {0};
|
char smaKey[SMA_KEY_LEN] = {0};
|
||||||
void * pSmaKey = &smaKey;
|
void * pSmaKey = &smaKey;
|
||||||
tsdbEncodeTSmaKey(pData->tableUid, *(pData->colIds + i), pData->tsWindow.skey + nOffset * pSmaH->interval,
|
#if 0
|
||||||
(void **)&pSmaKey);
|
printf("tsdbInsertTSmaDataSection: index %" PRIi64 ", skey %" PRIi64 " table[%" PRIi64 "]col[%" PRIu16 "]\n",
|
||||||
if (tsdbInsertTSmaBlocks(bTree, smaKey, pData->data + i * colDataLen + nOffset * pSmaH->blockSize, sectionDataLen) <
|
pData->indexUid, pData->skey, pTbData->tableUid, pColData->colId);
|
||||||
0) {
|
|
||||||
tsdbWarn("vgId:%d insert tSma blocks failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// save tSma data blocks separately
|
|
||||||
for (int32_t n = 0; n < nBlocks; ++n) {
|
|
||||||
char smaKey[SMA_KEY_LEN] = {0};
|
|
||||||
void *pSmaKey = &smaKey;
|
|
||||||
tsdbEncodeTSmaKey(pData->tableUid, *(pData->colIds + i), pData->tsWindow.skey + (nOffset + n) * pSmaH->interval,
|
|
||||||
(void **)&pSmaKey);
|
|
||||||
if (tsdbInsertTSmaBlocks(bTree, smaKey, pData->data + i * colDataLen + (nOffset + n) * pSmaH->blockSize,
|
|
||||||
pSmaH->blockSize) < 0) {
|
|
||||||
tsdbWarn("vgId:%d insert tSma blocks failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
tsdbEncodeTSmaKey(pTbData->tableUid, pColData->colId, pData->skey, (void **)&pSmaKey);
|
||||||
|
if (tsdbInsertTSmaBlocks(bTree, smaKey, pColData->data, pColData->blockSize) < 0) {
|
||||||
|
tsdbWarn("vgId:%d insert tSma blocks failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
||||||
}
|
}
|
||||||
|
tbLen += (sizeof(STSmaColData) + pColData->blockSize);
|
||||||
|
}
|
||||||
|
len += (sizeof(STSmaTbData) + pTbData->dataLen);
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbInitTSmaWriteH(STSmaWriteH *pSmaH, STsdb *pTsdb, STSma *param, STSmaData *pData) {
|
static int32_t tsdbInitTSmaWriteH(STSmaWriteH *pSmaH, STsdb *pTsdb, STSmaDataWrapper *pData) {
|
||||||
pSmaH->pTsdb = pTsdb;
|
pSmaH->pTsdb = pTsdb;
|
||||||
pSmaH->interval = tsdbGetIntervalByPrecision(param->interval, param->intervalUnit, REPO_CFG(pTsdb)->precision);
|
pSmaH->interval = tsdbGetIntervalByPrecision(pData->interval, pData->intervalUnit, REPO_CFG(pTsdb)->precision);
|
||||||
// pSmaH->blockSize = param->numOfFuncIds * sizeof(int64_t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbSetTSmaDataFile(STSmaWriteH *pSmaH, STSma *param, STSmaData *pData, int32_t storageLevel,
|
static int32_t tsdbSetTSmaDataFile(STSmaWriteH *pSmaH, STSmaDataWrapper *pData, int32_t storageLevel, int32_t fid) {
|
||||||
int32_t fid) {
|
|
||||||
// TODO
|
// TODO
|
||||||
pSmaH->pDFile = "tSma_interval_file_name";
|
pSmaH->pDFile = "tSma_interval_file_name";
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} /**
|
}
|
||||||
* @brief Split the sma data blocks by fid.
|
|
||||||
*
|
|
||||||
* @param pSmaH
|
|
||||||
* @param param
|
|
||||||
* @param pData
|
|
||||||
* @param nOffset
|
|
||||||
* @param fid
|
|
||||||
* @param nSmaBlocks
|
|
||||||
* @return int32_t
|
|
||||||
*/
|
|
||||||
static int32_t tsdbTSmaDataSplit(STSmaWriteH *pSmaH, STSma *param, STSmaData *pData, int32_t days, int32_t nOffset,
|
|
||||||
int32_t fid, int32_t *nSmaBlocks) {
|
|
||||||
STsdbCfg *pCfg = REPO_CFG(pSmaH->pTsdb);
|
|
||||||
|
|
||||||
// TODO: use binary search
|
|
||||||
for (int32_t n = nOffset + 1; n < pData->numOfBlocks; ++n) {
|
|
||||||
// TODO: The tsWindow.skey should use the precision of DB.
|
|
||||||
int32_t tFid = (int32_t)(TSDB_KEY_FID(pData->tsWindow.skey + pSmaH->interval * n, days, pCfg->precision));
|
|
||||||
if (tFid > fid) {
|
|
||||||
*nSmaBlocks = n - nOffset;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Insert/Update Time-range-wise SMA data.
|
* @brief Insert/Update Time-range-wise SMA data.
|
||||||
|
@ -449,124 +438,81 @@ static int32_t tsdbTSmaDataSplit(STSmaWriteH *pSmaH, STSma *param, STSmaData *pD
|
||||||
* - The destination file of one data block for some interval is determined by its start TS key.
|
* - The destination file of one data block for some interval is determined by its start TS key.
|
||||||
*
|
*
|
||||||
* @param pTsdb
|
* @param pTsdb
|
||||||
* @param param
|
* @param msg
|
||||||
* @param pData
|
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbInsertTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData) {
|
int32_t tsdbInsertTSmaDataImpl(STsdb *pTsdb, char *msg) {
|
||||||
STsdbCfg * pCfg = REPO_CFG(pTsdb);
|
STsdbCfg * pCfg = REPO_CFG(pTsdb);
|
||||||
STSmaData * curData = pData;
|
STSmaDataWrapper *pData = (STSmaDataWrapper *)msg;
|
||||||
STSmaWriteH tSmaH = {0};
|
STSmaWriteH tSmaH = {0};
|
||||||
|
|
||||||
tsdbInitTSmaWriteH(&tSmaH, pTsdb, param, pData);
|
tsdbInitTSmaWriteH(&tSmaH, pTsdb, pData);
|
||||||
|
|
||||||
if (pData->numOfBlocks <= 0 || pData->numOfColIds <= 0 || pData->dataLen <= 0) {
|
if (pData->dataLen <= 0) {
|
||||||
TASSERT(0);
|
TASSERT(0);
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 1: Judge the storage level
|
// Step 1: Judge the storage level
|
||||||
int32_t storageLevel = tsdbJudgeStorageLevel(param->interval, param->intervalUnit);
|
int32_t storageLevel = tsdbJudgeStorageLevel(pData->interval, pData->intervalUnit);
|
||||||
int32_t daysPerFile = storageLevel == SMA_STORAGE_LEVEL_TSDB ? SMA_STORAGE_TSDB_DAYS : pCfg->daysPerFile;
|
int32_t daysPerFile = storageLevel == SMA_STORAGE_LEVEL_TSDB ? SMA_STORAGE_TSDB_DAYS : pCfg->daysPerFile;
|
||||||
|
|
||||||
// Step 2: Set the DFile for storage of SMA index, and iterate/split the TSma data and store to B+Tree index file
|
// Step 2: Set the DFile for storage of SMA index, and iterate/split the TSma data and store to B+Tree index file
|
||||||
// - Set and open the DFile or the B+Tree file
|
// - Set and open the DFile or the B+Tree file
|
||||||
|
|
||||||
int32_t minFid = (int32_t)(TSDB_KEY_FID(pData->tsWindow.skey, daysPerFile, pCfg->precision));
|
int32_t fid = (int32_t)(TSDB_KEY_FID(pData->skey, daysPerFile, pCfg->precision));
|
||||||
int32_t maxFid = (int32_t)(TSDB_KEY_FID(pData->tsWindow.ekey, daysPerFile, pCfg->precision));
|
|
||||||
|
|
||||||
if (minFid == maxFid) {
|
|
||||||
// Save all the TSma data to one file
|
// Save all the TSma data to one file
|
||||||
// TODO: tsdbStartTSmaCommit();
|
// TODO: tsdbStartTSmaCommit();
|
||||||
tsdbSetTSmaDataFile(&tSmaH, param, pData, storageLevel, minFid);
|
tsdbSetTSmaDataFile(&tSmaH, pData, storageLevel, fid);
|
||||||
tsdbInsertTSmaDataSection(&tSmaH, pData, 0, pData->numOfBlocks);
|
tsdbInsertTSmaDataSection(&tSmaH, pData);
|
||||||
// TODO:tsdbEndTSmaCommit();
|
// TODO:tsdbEndTSmaCommit();
|
||||||
} else if (minFid < maxFid) {
|
|
||||||
// Split the TSma data and save to multiple files. As there is limit for the span, it can't span more than 2 files
|
|
||||||
// actually.
|
|
||||||
// TODO: tsdbStartTSmaCommit();
|
|
||||||
int32_t tFid = minFid;
|
|
||||||
int32_t nOffset = 0;
|
|
||||||
int32_t nSmaBlocks = 0;
|
|
||||||
do {
|
|
||||||
tsdbTSmaDataSplit(&tSmaH, param, pData, daysPerFile, nOffset, tFid, &nSmaBlocks);
|
|
||||||
tsdbSetTSmaDataFile(&tSmaH, param, pData, storageLevel, tFid);
|
|
||||||
if (tsdbInsertTSmaDataSection(&tSmaH, pData, nOffset, nSmaBlocks) < 0) {
|
|
||||||
return terrno;
|
|
||||||
}
|
|
||||||
|
|
||||||
++tFid;
|
|
||||||
nOffset += nSmaBlocks;
|
|
||||||
|
|
||||||
if (tFid == maxFid) {
|
|
||||||
tsdbSetTSmaDataFile(&tSmaH, param, pData, storageLevel, tFid);
|
|
||||||
tsdbInsertTSmaDataSection(&tSmaH, pData, nOffset, pData->numOfBlocks - nOffset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (true);
|
|
||||||
|
|
||||||
// TODO:tsdbEndTSmaCommit();
|
|
||||||
} else {
|
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
|
||||||
return terrno;
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset the SSmaStat
|
// reset the SSmaStat
|
||||||
tsdbResetExpiredWindow(pTsdb, param->indexName, &pData->tsWindow);
|
tsdbResetExpiredWindow(pTsdb, pData->indexUid, pData->skey);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbSetRSmaDataFile(STSmaWriteH *pSmaH, SRSma *param, STSmaData *pData, int32_t fid) {
|
static int32_t tsdbSetRSmaDataFile(STSmaWriteH *pSmaH, STSmaDataWrapper *pData, int32_t fid) {
|
||||||
// TODO
|
// TODO
|
||||||
pSmaH->pDFile = "rSma_interval_file_name";
|
pSmaH->pDFile = "rSma_interval_file_name";
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbInsertRSmaDataImpl(STsdb *pTsdb, SRSma *param, STSmaData *pData) {
|
int32_t tsdbInsertRSmaDataImpl(STsdb *pTsdb, char *msg) {
|
||||||
STsdbCfg * pCfg = REPO_CFG(pTsdb);
|
STsdbCfg * pCfg = REPO_CFG(pTsdb);
|
||||||
STSma * tParam = ¶m->tsma;
|
STSmaDataWrapper *pData = (STSmaDataWrapper *)msg;
|
||||||
STSmaData * curData = pData;
|
|
||||||
STSmaWriteH tSmaH = {0};
|
STSmaWriteH tSmaH = {0};
|
||||||
|
|
||||||
tsdbInitTSmaWriteH(&tSmaH, pTsdb, tParam, pData);
|
tsdbInitTSmaWriteH(&tSmaH, pTsdb, pData);
|
||||||
|
|
||||||
int32_t nSmaBlocks = pData->numOfBlocks;
|
if (pData->dataLen <= 0) {
|
||||||
int32_t colDataLen = pData->dataLen / nSmaBlocks;
|
|
||||||
|
|
||||||
// Step 2.2: Storage of SMA_STORAGE_LEVEL_DFILESET
|
|
||||||
// TODO: Use the daysPerFile for rSma data, not for TS data.
|
|
||||||
// TODO: The lifecycle of rSma data should be processed like the TS data files.
|
|
||||||
int32_t minFid = (int32_t)(TSDB_KEY_FID(pData->tsWindow.skey, pCfg->daysPerFile, pCfg->precision));
|
|
||||||
int32_t maxFid = (int32_t)(TSDB_KEY_FID(pData->tsWindow.ekey, pCfg->daysPerFile, pCfg->precision));
|
|
||||||
|
|
||||||
if (minFid == maxFid) {
|
|
||||||
// Save all the TSma data to one file
|
|
||||||
tsdbSetRSmaDataFile(&tSmaH, param, pData, minFid);
|
|
||||||
// TODO: tsdbStartTSmaCommit();
|
|
||||||
tsdbInsertTSmaDataSection(&tSmaH, pData, colDataLen, nSmaBlocks);
|
|
||||||
// TODO:tsdbEndTSmaCommit();
|
|
||||||
} else if (minFid < maxFid) {
|
|
||||||
// Split the TSma data and save to multiple files. As there is limit for the span, it can't span more than 2 files
|
|
||||||
// actually.
|
|
||||||
// TODO: tsdbStartTSmaCommit();
|
|
||||||
int32_t tmpFid = 0;
|
|
||||||
int32_t step = 0;
|
|
||||||
for (int32_t n = 0; n < pData->numOfBlocks; ++n) {
|
|
||||||
}
|
|
||||||
tsdbInsertTSmaDataSection(&tSmaH, pData, colDataLen, nSmaBlocks);
|
|
||||||
// TODO:tsdbEndTSmaCommit();
|
|
||||||
} else {
|
|
||||||
TASSERT(0);
|
TASSERT(0);
|
||||||
return TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Step 1: Judge the storage level
|
||||||
|
int32_t storageLevel = tsdbJudgeStorageLevel(pData->interval, pData->intervalUnit);
|
||||||
|
int32_t daysPerFile = storageLevel == SMA_STORAGE_LEVEL_TSDB ? SMA_STORAGE_TSDB_DAYS : pCfg->daysPerFile;
|
||||||
|
|
||||||
|
// Step 2: Set the DFile for storage of SMA index, and iterate/split the TSma data and store to B+Tree index file
|
||||||
|
// - Set and open the DFile or the B+Tree file
|
||||||
|
|
||||||
|
int32_t fid = (int32_t)(TSDB_KEY_FID(pData->skey, daysPerFile, pCfg->precision));
|
||||||
|
|
||||||
|
// Save all the TSma data to one file
|
||||||
|
// TODO: tsdbStartTSmaCommit();
|
||||||
|
tsdbSetTSmaDataFile(&tSmaH, pData, storageLevel, fid);
|
||||||
|
tsdbInsertTSmaDataSection(&tSmaH, pData);
|
||||||
|
// TODO:tsdbEndTSmaCommit();
|
||||||
|
|
||||||
// reset the SSmaStat
|
// reset the SSmaStat
|
||||||
tsdbResetExpiredWindow(pTsdb, param->tsma.indexName, &pData->tsWindow);
|
tsdbResetExpiredWindow(pTsdb, pData->indexUid, pData->skey);
|
||||||
|
|
||||||
// Step 4: finish
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,9 +525,9 @@ int32_t tsdbInsertRSmaDataImpl(STsdb *pTsdb, SRSma *param, STSmaData *pData) {
|
||||||
* @param pData
|
* @param pData
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSma *param, STSmaData *pData) {
|
static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSmaDataWrapper *pData) {
|
||||||
pSmaH->pTsdb = pTsdb;
|
pSmaH->pTsdb = pTsdb;
|
||||||
pSmaH->interval = tsdbGetIntervalByPrecision(param->interval, param->intervalUnit, REPO_CFG(pTsdb)->precision);
|
pSmaH->interval = tsdbGetIntervalByPrecision(pData->interval, pData->intervalUnit, REPO_CFG(pTsdb)->precision);
|
||||||
// pSmaH->blockSize = param->numOfFuncIds * sizeof(int64_t);
|
// pSmaH->blockSize = param->numOfFuncIds * sizeof(int64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -593,8 +539,8 @@ static int32_t tsdbInitTSmaReadH(STSmaReadH *pSmaH, STsdb *pTsdb, STSma *param,
|
||||||
* @param queryWin
|
* @param queryWin
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
static int32_t tsdbInitTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow *queryWin) {
|
static int32_t tsdbInitTSmaFile(STSmaReadH *pReadH, STimeWindow *queryWin) {
|
||||||
int32_t storageLevel = tsdbJudgeStorageLevel(param->interval, param->intervalUnit);
|
int32_t storageLevel = 0; //tsdbJudgeStorageLevel(param->interval, param->intervalUnit);
|
||||||
int32_t daysPerFile =
|
int32_t daysPerFile =
|
||||||
storageLevel == SMA_STORAGE_LEVEL_TSDB ? SMA_STORAGE_TSDB_DAYS : REPO_CFG(pReadH->pTsdb)->daysPerFile;
|
storageLevel == SMA_STORAGE_LEVEL_TSDB ? SMA_STORAGE_TSDB_DAYS : REPO_CFG(pReadH->pTsdb)->daysPerFile;
|
||||||
pReadH->storageLevel = storageLevel;
|
pReadH->storageLevel = storageLevel;
|
||||||
|
@ -611,8 +557,8 @@ static int32_t tsdbInitTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow *q
|
||||||
* @return true
|
* @return true
|
||||||
* @return false
|
* @return false
|
||||||
*/
|
*/
|
||||||
static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow *queryWin) {
|
static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, STimeWindow *queryWin) {
|
||||||
SArray *smaFs = pReadH->pTsdb->fs->cstatus->smaf;
|
SArray *smaFs = pReadH->pTsdb->fs->cstatus->sf;
|
||||||
int32_t nSmaFs = taosArrayGetSize(smaFs);
|
int32_t nSmaFs = taosArrayGetSize(smaFs);
|
||||||
|
|
||||||
pReadH->pDFile = NULL;
|
pReadH->pDFile = NULL;
|
||||||
|
@ -646,10 +592,9 @@ static bool tsdbSetAndOpenTSmaFile(STSmaReadH *pReadH, STSma *param, STimeWindow
|
||||||
* @param nMaxResult The query invoker should control the nMaxResult need to return to avoid OOM.
|
* @param nMaxResult The query invoker should control the nMaxResult need to return to avoid OOM.
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeWindow *queryWin, int32_t nMaxResult) {
|
int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSmaDataWrapper *pData, STimeWindow *queryWin, int32_t nMaxResult) {
|
||||||
const char *indexName = param->indexName;
|
SSmaStatItem *pItem =
|
||||||
|
(SSmaStatItem *)taosHashGet(pTsdb->pSmaStat->smaStatItems, &pData->indexUid, sizeof(pData->indexUid));
|
||||||
SSmaStatItem *pItem = (SSmaStatItem *)taosHashGet(pTsdb->pSmaStat->smaStatItems, indexName, strlen(indexName));
|
|
||||||
if (pItem == NULL) {
|
if (pItem == NULL) {
|
||||||
// mark all window as expired and notify query module to query raw TS data.
|
// mark all window as expired and notify query module to query raw TS data.
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -664,9 +609,9 @@ int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeW
|
||||||
}
|
}
|
||||||
|
|
||||||
STSmaReadH tReadH = {0};
|
STSmaReadH tReadH = {0};
|
||||||
tsdbInitTSmaReadH(&tReadH, pTsdb, param, pData);
|
tsdbInitTSmaReadH(&tReadH, pTsdb, pData);
|
||||||
|
|
||||||
tsdbInitTSmaFile(&tReadH, param, queryWin);
|
tsdbInitTSmaFile(&tReadH, queryWin);
|
||||||
|
|
||||||
int32_t nResult = 0;
|
int32_t nResult = 0;
|
||||||
int64_t lastKey = 0;
|
int64_t lastKey = 0;
|
||||||
|
@ -677,7 +622,7 @@ int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeW
|
||||||
}
|
}
|
||||||
|
|
||||||
// set and open the file according to the STSma param
|
// set and open the file according to the STSma param
|
||||||
if (tsdbSetAndOpenTSmaFile(&tReadH, param, queryWin)) {
|
if (tsdbSetAndOpenTSmaFile(&tReadH, queryWin)) {
|
||||||
char bTree[100] = "\0";
|
char bTree[100] = "\0";
|
||||||
while (strncmp(bTree, "has more nodes", 100) == 0) {
|
while (strncmp(bTree, "has more nodes", 100) == 0) {
|
||||||
if (nResult >= nMaxResult) {
|
if (nResult >= nMaxResult) {
|
||||||
|
@ -694,6 +639,7 @@ int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeW
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/**
|
/**
|
||||||
* @brief Get the start TS key of the last data block of one interval/sliding.
|
* @brief Get the start TS key of the last data block of one interval/sliding.
|
||||||
*
|
*
|
||||||
|
@ -704,7 +650,7 @@ int32_t tsdbGetTSmaDataImpl(STsdb *pTsdb, STSma *param, STSmaData *pData, STimeW
|
||||||
* 1) Return 0 and fill the result if the check procedure is normal;
|
* 1) Return 0 and fill the result if the check procedure is normal;
|
||||||
* 2) Return -1 if error occurs during the check procedure.
|
* 2) Return -1 if error occurs during the check procedure.
|
||||||
*/
|
*/
|
||||||
int32_t tsdbGetTSmaStatus(STsdb *pTsdb, STSma *param, void *result) {
|
int32_t tsdbGetTSmaStatus(STsdb *pTsdb, void *smaIndex, void *result) {
|
||||||
const char *procedure = "";
|
const char *procedure = "";
|
||||||
if (strncmp(procedure, "get the start TS key of the last data block", 100) != 0) {
|
if (strncmp(procedure, "get the start TS key of the last data block", 100) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -721,9 +667,10 @@ int32_t tsdbGetTSmaStatus(STsdb *pTsdb, STSma *param, void *result) {
|
||||||
* @param pWin
|
* @param pWin
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbRemoveTSmaData(STsdb *pTsdb, STSma *param, STimeWindow *pWin) {
|
int32_t tsdbRemoveTSmaData(STsdb *pTsdb, void *smaIndex, STimeWindow *pWin) {
|
||||||
// for ("tSmaFiles of param-interval-sliding between pWin") {
|
// for ("tSmaFiles of param-interval-sliding between pWin") {
|
||||||
// // remove the tSmaFile
|
// // remove the tSmaFile
|
||||||
// }
|
// }
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
|
@ -39,13 +39,13 @@ int tsdbInsertData(STsdb *pTsdb, SSubmitReq *pMsg, SSubmitRsp *pRsp) {
|
||||||
*
|
*
|
||||||
* @param pTsdb
|
* @param pTsdb
|
||||||
* @param param
|
* @param param
|
||||||
* @param pData
|
* @param msg
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
* TODO: Who is responsible for resource allocate and release?
|
* TODO: Who is responsible for resource allocate and release?
|
||||||
*/
|
*/
|
||||||
int32_t tsdbInsertTSmaData(STsdb *pTsdb, STSma *param, STSmaData *pData) {
|
int32_t tsdbInsertTSmaData(STsdb *pTsdb, char *msg) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if ((code = tsdbInsertTSmaDataImpl(pTsdb, param, pData)) < 0) {
|
if ((code = tsdbInsertTSmaDataImpl(pTsdb, msg)) < 0) {
|
||||||
tsdbWarn("vgId:%d insert tSma data failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
tsdbWarn("vgId:%d insert tSma data failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -56,12 +56,12 @@ int32_t tsdbInsertTSmaData(STsdb *pTsdb, STSma *param, STSmaData *pData) {
|
||||||
*
|
*
|
||||||
* @param pTsdb
|
* @param pTsdb
|
||||||
* @param param
|
* @param param
|
||||||
* @param pData
|
* @param msg
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tsdbInsertRSmaData(STsdb *pTsdb, SRSma *param, STSmaData *pData) {
|
int32_t tsdbInsertRSmaData(STsdb *pTsdb, char *msg) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if ((code = tsdbInsertRSmaDataImpl(pTsdb, param, pData)) < 0) {
|
if ((code = tsdbInsertRSmaDataImpl(pTsdb, msg)) < 0) {
|
||||||
tsdbWarn("vgId:%d insert rSma data failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
tsdbWarn("vgId:%d insert rSma data failed since %s", REPO_ID(pTsdb), tstrerror(terrno));
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -154,5 +154,6 @@ static void vnodeCloseImpl(SVnode *pVnode) {
|
||||||
tsdbClose(pVnode->pTsdb);
|
tsdbClose(pVnode->pTsdb);
|
||||||
tqClose(pVnode->pTq);
|
tqClose(pVnode->pTq);
|
||||||
walClose(pVnode->pWal);
|
walClose(pVnode->pWal);
|
||||||
|
vnodeQueryClose(pVnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,10 @@ int vnodeQueryOpen(SVnode *pVnode) {
|
||||||
(putReqToQueryQFp)vnodePutReqToVQueryQ, (sendReqToDnodeFp)vnodeSendReqToDnode);
|
(putReqToQueryQFp)vnodePutReqToVQueryQ, (sendReqToDnodeFp)vnodeSendReqToDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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};
|
||||||
|
@ -64,6 +68,8 @@ int vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
return vnodeGetTableMeta(pVnode, pMsg);
|
return vnodeGetTableMeta(pVnode, pMsg);
|
||||||
case TDMT_VND_CONSUME:
|
case TDMT_VND_CONSUME:
|
||||||
return tqProcessPollReq(pVnode->pTq, pMsg);
|
return tqProcessPollReq(pVnode->pTq, pMsg);
|
||||||
|
case TDMT_VND_QUERY_HEARTBEAT:
|
||||||
|
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg);
|
||||||
default:
|
default:
|
||||||
vError("unknown msg type:%d in fetch queue", pMsg->msgType);
|
vError("unknown msg type:%d in fetch queue", pMsg->msgType);
|
||||||
return TSDB_CODE_VND_APP_ERROR;
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
|
|
|
@ -43,20 +43,8 @@ TEST(testCase, tSmaEncodeDecodeTest) {
|
||||||
tSma.sliding = 0;
|
tSma.sliding = 0;
|
||||||
tstrncpy(tSma.indexName, "sma_index_test", TSDB_INDEX_NAME_LEN);
|
tstrncpy(tSma.indexName, "sma_index_test", TSDB_INDEX_NAME_LEN);
|
||||||
tstrncpy(tSma.timezone, "Asia/Shanghai", TD_TIMEZONE_LEN);
|
tstrncpy(tSma.timezone, "Asia/Shanghai", TD_TIMEZONE_LEN);
|
||||||
|
tSma.indexUid = 2345678910;
|
||||||
tSma.tableUid = 1234567890;
|
tSma.tableUid = 1234567890;
|
||||||
tSma.nFuncColIds = 5;
|
|
||||||
tSma.funcColIds = (SFuncColIds *)calloc(tSma.nFuncColIds, sizeof(SFuncColIds));
|
|
||||||
ASSERT(tSma.funcColIds != NULL);
|
|
||||||
for (int32_t n = 0; n < tSma.nFuncColIds; ++n) {
|
|
||||||
SFuncColIds *funcColIds = tSma.funcColIds + n;
|
|
||||||
funcColIds->funcId = n;
|
|
||||||
funcColIds->nColIds = 10;
|
|
||||||
funcColIds->colIds = (col_id_t *)calloc(funcColIds->nColIds, sizeof(col_id_t));
|
|
||||||
ASSERT(funcColIds->colIds != NULL);
|
|
||||||
for (int32_t i = 0; i < funcColIds->nColIds; ++i) {
|
|
||||||
*(funcColIds->colIds + i) = (i + PRIMARYKEY_TIMESTAMP_COL_ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
STSmaWrapper tSmaWrapper = {.number = 1, .tSma = &tSma};
|
STSmaWrapper tSmaWrapper = {.number = 1, .tSma = &tSma};
|
||||||
uint32_t bufLen = tEncodeTSmaWrapper(NULL, &tSmaWrapper);
|
uint32_t bufLen = tEncodeTSmaWrapper(NULL, &tSmaWrapper);
|
||||||
|
@ -85,35 +73,31 @@ TEST(testCase, tSmaEncodeDecodeTest) {
|
||||||
EXPECT_EQ(pSma->slidingUnit, qSma->slidingUnit);
|
EXPECT_EQ(pSma->slidingUnit, qSma->slidingUnit);
|
||||||
EXPECT_STRCASEEQ(pSma->indexName, qSma->indexName);
|
EXPECT_STRCASEEQ(pSma->indexName, qSma->indexName);
|
||||||
EXPECT_STRCASEEQ(pSma->timezone, qSma->timezone);
|
EXPECT_STRCASEEQ(pSma->timezone, qSma->timezone);
|
||||||
EXPECT_EQ(pSma->nFuncColIds, qSma->nFuncColIds);
|
EXPECT_EQ(pSma->indexUid, qSma->indexUid);
|
||||||
EXPECT_EQ(pSma->tableUid, qSma->tableUid);
|
EXPECT_EQ(pSma->tableUid, qSma->tableUid);
|
||||||
EXPECT_EQ(pSma->interval, qSma->interval);
|
EXPECT_EQ(pSma->interval, qSma->interval);
|
||||||
EXPECT_EQ(pSma->sliding, qSma->sliding);
|
EXPECT_EQ(pSma->sliding, qSma->sliding);
|
||||||
|
EXPECT_EQ(pSma->exprLen, qSma->exprLen);
|
||||||
|
EXPECT_STRCASEEQ(pSma->expr, qSma->expr);
|
||||||
EXPECT_EQ(pSma->tagsFilterLen, qSma->tagsFilterLen);
|
EXPECT_EQ(pSma->tagsFilterLen, qSma->tagsFilterLen);
|
||||||
EXPECT_STRCASEEQ(pSma->tagsFilter, qSma->tagsFilter);
|
EXPECT_STRCASEEQ(pSma->tagsFilter, qSma->tagsFilter);
|
||||||
for (uint32_t j = 0; j < pSma->nFuncColIds; ++j) {
|
|
||||||
SFuncColIds *pFuncColIds = pSma->funcColIds + j;
|
|
||||||
SFuncColIds *qFuncColIds = qSma->funcColIds + j;
|
|
||||||
EXPECT_EQ(pFuncColIds->funcId, qFuncColIds->funcId);
|
|
||||||
EXPECT_EQ(pFuncColIds->nColIds, qFuncColIds->nColIds);
|
|
||||||
for (uint32_t k = 0; k < pFuncColIds->nColIds; ++k) {
|
|
||||||
EXPECT_EQ(*(pFuncColIds->colIds + k), *(qFuncColIds->colIds + k));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// resource release
|
// resource release
|
||||||
tdDestroyTSma(&tSma);
|
tdDestroyTSma(&tSma);
|
||||||
tdDestroyTSmaWrapper(&dstTSmaWrapper);
|
tdDestroyTSmaWrapper(&dstTSmaWrapper);
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
const char * smaIndexName1 = "sma_index_test_1";
|
const char * smaIndexName1 = "sma_index_test_1";
|
||||||
const char * smaIndexName2 = "sma_index_test_2";
|
const char * smaIndexName2 = "sma_index_test_2";
|
||||||
const char * timeZone = "Asia/Shanghai";
|
const char * timezone = "Asia/Shanghai";
|
||||||
|
const char * expr = "select count(a,b, top 20), from table interval 1d, sliding 1h;";
|
||||||
const char * tagsFilter = "I'm tags filter";
|
const char * tagsFilter = "I'm tags filter";
|
||||||
const char * smaTestDir = "./smaTest";
|
const char * smaTestDir = "./smaTest";
|
||||||
const uint64_t tbUid = 1234567890;
|
const tb_uid_t tbUid = 1234567890;
|
||||||
|
const int64_t indexUid1 = 2000000001;
|
||||||
|
const int64_t indexUid2 = 2000000002;
|
||||||
const uint32_t nCntTSma = 2;
|
const uint32_t nCntTSma = 2;
|
||||||
// encode
|
// encode
|
||||||
STSma tSma = {0};
|
STSma tSma = {0};
|
||||||
|
@ -122,22 +106,15 @@ TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
tSma.interval = 1;
|
tSma.interval = 1;
|
||||||
tSma.slidingUnit = TD_TIME_UNIT_HOUR;
|
tSma.slidingUnit = TD_TIME_UNIT_HOUR;
|
||||||
tSma.sliding = 0;
|
tSma.sliding = 0;
|
||||||
|
tSma.indexUid = indexUid1;
|
||||||
tstrncpy(tSma.indexName, smaIndexName1, TSDB_INDEX_NAME_LEN);
|
tstrncpy(tSma.indexName, smaIndexName1, TSDB_INDEX_NAME_LEN);
|
||||||
tstrncpy(tSma.timezone, timeZone, TD_TIMEZONE_LEN);
|
tstrncpy(tSma.timezone, timezone, TD_TIMEZONE_LEN);
|
||||||
tSma.tableUid = tbUid;
|
tSma.tableUid = tbUid;
|
||||||
tSma.nFuncColIds = 5;
|
|
||||||
tSma.funcColIds = (SFuncColIds *)calloc(tSma.nFuncColIds, sizeof(SFuncColIds));
|
tSma.exprLen = strlen(expr);
|
||||||
ASSERT(tSma.funcColIds != NULL);
|
tSma.expr = (char *)calloc(tSma.exprLen + 1, 1);
|
||||||
for (int32_t n = 0; n < tSma.nFuncColIds; ++n) {
|
tstrncpy(tSma.expr, expr, tSma.exprLen + 1);
|
||||||
SFuncColIds *funcColIds = tSma.funcColIds + n;
|
|
||||||
funcColIds->funcId = n;
|
|
||||||
funcColIds->nColIds = 10;
|
|
||||||
funcColIds->colIds = (col_id_t *)calloc(funcColIds->nColIds, sizeof(col_id_t));
|
|
||||||
ASSERT(funcColIds->colIds != NULL);
|
|
||||||
for (int32_t i = 0; i < funcColIds->nColIds; ++i) {
|
|
||||||
*(funcColIds->colIds + i) = (i + PRIMARYKEY_TIMESTAMP_COL_ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tSma.tagsFilterLen = strlen(tagsFilter);
|
tSma.tagsFilterLen = strlen(tagsFilter);
|
||||||
tSma.tagsFilter = (char *)calloc(tSma.tagsFilterLen + 1, 1);
|
tSma.tagsFilter = (char *)calloc(tSma.tagsFilterLen + 1, 1);
|
||||||
tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1);
|
tstrncpy(tSma.tagsFilter, tagsFilter, tSma.tagsFilterLen + 1);
|
||||||
|
@ -151,8 +128,9 @@ TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
pMeta = metaOpen(smaTestDir, pMetaCfg, NULL);
|
pMeta = metaOpen(smaTestDir, pMetaCfg, NULL);
|
||||||
assert(pMeta != NULL);
|
assert(pMeta != NULL);
|
||||||
// save index 1
|
// save index 1
|
||||||
metaSaveSmaToDB(pMeta, pSmaCfg);
|
EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
|
||||||
|
|
||||||
|
pSmaCfg->indexUid = indexUid2;
|
||||||
tstrncpy(pSmaCfg->indexName, smaIndexName2, TSDB_INDEX_NAME_LEN);
|
tstrncpy(pSmaCfg->indexName, smaIndexName2, TSDB_INDEX_NAME_LEN);
|
||||||
pSmaCfg->version = 1;
|
pSmaCfg->version = 1;
|
||||||
pSmaCfg->intervalUnit = TD_TIME_UNIT_HOUR;
|
pSmaCfg->intervalUnit = TD_TIME_UNIT_HOUR;
|
||||||
|
@ -161,24 +139,26 @@ TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
pSmaCfg->sliding = 5;
|
pSmaCfg->sliding = 5;
|
||||||
|
|
||||||
// save index 2
|
// save index 2
|
||||||
metaSaveSmaToDB(pMeta, pSmaCfg);
|
EXPECT_EQ(metaSaveSmaToDB(pMeta, pSmaCfg), 0);
|
||||||
|
|
||||||
// get value by indexName
|
// get value by indexName
|
||||||
STSma *qSmaCfg = NULL;
|
STSma *qSmaCfg = NULL;
|
||||||
qSmaCfg = metaGetSmaInfoByName(pMeta, smaIndexName1);
|
qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid1);
|
||||||
assert(qSmaCfg != NULL);
|
assert(qSmaCfg != NULL);
|
||||||
printf("name1 = %s\n", qSmaCfg->indexName);
|
printf("name1 = %s\n", qSmaCfg->indexName);
|
||||||
printf("timezone1 = %s\n", qSmaCfg->timezone);
|
printf("timezone1 = %s\n", qSmaCfg->timezone);
|
||||||
|
printf("expr1 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
|
||||||
printf("tagsFilter1 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
printf("tagsFilter1 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
||||||
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName1);
|
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName1);
|
||||||
EXPECT_EQ(qSmaCfg->tableUid, tSma.tableUid);
|
EXPECT_EQ(qSmaCfg->tableUid, tSma.tableUid);
|
||||||
tdDestroyTSma(qSmaCfg);
|
tdDestroyTSma(qSmaCfg);
|
||||||
tfree(qSmaCfg);
|
tfree(qSmaCfg);
|
||||||
|
|
||||||
qSmaCfg = metaGetSmaInfoByName(pMeta, smaIndexName2);
|
qSmaCfg = metaGetSmaInfoByIndex(pMeta, indexUid2);
|
||||||
assert(qSmaCfg != NULL);
|
assert(qSmaCfg != NULL);
|
||||||
printf("name2 = %s\n", qSmaCfg->indexName);
|
printf("name2 = %s\n", qSmaCfg->indexName);
|
||||||
printf("timezone2 = %s\n", qSmaCfg->timezone);
|
printf("timezone2 = %s\n", qSmaCfg->timezone);
|
||||||
|
printf("expr2 = %s\n", qSmaCfg->expr != NULL ? qSmaCfg->expr : "");
|
||||||
printf("tagsFilter2 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
printf("tagsFilter2 = %s\n", qSmaCfg->tagsFilter != NULL ? qSmaCfg->tagsFilter : "");
|
||||||
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName2);
|
EXPECT_STRCASEEQ(qSmaCfg->indexName, smaIndexName2);
|
||||||
EXPECT_EQ(qSmaCfg->interval, tSma.interval);
|
EXPECT_EQ(qSmaCfg->interval, tSma.interval);
|
||||||
|
@ -201,17 +181,21 @@ TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
metaCloseSmaCurosr(pSmaCur);
|
metaCloseSmaCurosr(pSmaCur);
|
||||||
|
|
||||||
// get wrapper by table uid
|
// get wrapper by table uid
|
||||||
STSmaWrapper *pSW = metaGetSmaInfoByUid(pMeta, tbUid);
|
STSmaWrapper *pSW = metaGetSmaInfoByTable(pMeta, tbUid);
|
||||||
assert(pSW != NULL);
|
assert(pSW != NULL);
|
||||||
EXPECT_EQ(pSW->number, nCntTSma);
|
EXPECT_EQ(pSW->number, nCntTSma);
|
||||||
EXPECT_STRCASEEQ(pSW->tSma->indexName, smaIndexName1);
|
EXPECT_STRCASEEQ(pSW->tSma->indexName, smaIndexName1);
|
||||||
EXPECT_STRCASEEQ(pSW->tSma->timezone, timeZone);
|
EXPECT_STRCASEEQ(pSW->tSma->timezone, timezone);
|
||||||
|
EXPECT_STRCASEEQ(pSW->tSma->expr, expr);
|
||||||
EXPECT_STRCASEEQ(pSW->tSma->tagsFilter, tagsFilter);
|
EXPECT_STRCASEEQ(pSW->tSma->tagsFilter, tagsFilter);
|
||||||
EXPECT_EQ(pSW->tSma->tableUid, tSma.tableUid);
|
EXPECT_EQ(pSW->tSma->indexUid, indexUid1);
|
||||||
|
EXPECT_EQ(pSW->tSma->tableUid, tbUid);
|
||||||
EXPECT_STRCASEEQ((pSW->tSma + 1)->indexName, smaIndexName2);
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->indexName, smaIndexName2);
|
||||||
EXPECT_STRCASEEQ((pSW->tSma + 1)->timezone, timeZone);
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->timezone, timezone);
|
||||||
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->expr, expr);
|
||||||
EXPECT_STRCASEEQ((pSW->tSma + 1)->tagsFilter, tagsFilter);
|
EXPECT_STRCASEEQ((pSW->tSma + 1)->tagsFilter, tagsFilter);
|
||||||
EXPECT_EQ((pSW->tSma + 1)->tableUid, tSma.tableUid);
|
EXPECT_EQ((pSW->tSma + 1)->indexUid, indexUid2);
|
||||||
|
EXPECT_EQ((pSW->tSma + 1)->tableUid, tbUid);
|
||||||
|
|
||||||
tdDestroyTSmaWrapper(pSW);
|
tdDestroyTSmaWrapper(pSW);
|
||||||
tfree(pSW);
|
tfree(pSW);
|
||||||
|
@ -233,44 +217,68 @@ TEST(testCase, tSma_DB_Put_Get_Del_Test) {
|
||||||
tdDestroyTSma(&tSma);
|
tdDestroyTSma(&tSma);
|
||||||
metaClose(pMeta);
|
metaClose(pMeta);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
TEST(testCase, tSmaInsertTest) {
|
TEST(testCase, tSmaInsertTest) {
|
||||||
STSma tSma = {0};
|
const int64_t indexUid = 2000000002;
|
||||||
STSmaData *pSmaData = NULL;
|
STSmaDataWrapper *pSmaData = NULL;
|
||||||
STsdb tsdb = {0};
|
STsdb tsdb = {0};
|
||||||
|
STsdbCfg * pCfg = &tsdb.config;
|
||||||
|
|
||||||
|
pCfg->daysPerFile = 1;
|
||||||
|
|
||||||
// init
|
// init
|
||||||
tSma.intervalUnit = TD_TIME_UNIT_DAY;
|
int32_t allocCnt = 0;
|
||||||
tSma.interval = 1;
|
int32_t allocStep = 40960;
|
||||||
tSma.numOfFuncIds = 5; // sum/min/max/avg/last
|
int32_t buffer = 4096;
|
||||||
|
void * buf = NULL;
|
||||||
|
EXPECT_EQ(tsdbMakeRoom(&buf, allocStep), 0);
|
||||||
|
int32_t bufSize = taosTSizeof(buf);
|
||||||
|
int32_t numOfTables = 25;
|
||||||
|
col_id_t numOfCols = 4096;
|
||||||
|
EXPECT_GT(numOfCols, 0);
|
||||||
|
|
||||||
int32_t blockSize = tSma.numOfFuncIds * sizeof(int64_t);
|
pSmaData = (STSmaDataWrapper *)buf;
|
||||||
int32_t numOfColIds = 3;
|
printf(">> allocate [%d] time to %d and addr is %p\n", ++allocCnt, bufSize, pSmaData);
|
||||||
int32_t numOfBlocks = 10;
|
pSmaData->skey = 1646987196;
|
||||||
|
pSmaData->interval = 10;
|
||||||
|
pSmaData->intervalUnit = TD_TIME_UNIT_MINUTE;
|
||||||
|
pSmaData->indexUid = indexUid;
|
||||||
|
|
||||||
int32_t dataLen = numOfColIds * numOfBlocks * blockSize;
|
int32_t len = sizeof(STSmaDataWrapper);
|
||||||
|
for (int32_t t = 0; t < numOfTables; ++t) {
|
||||||
|
STSmaTbData *pTbData = (STSmaTbData *)POINTER_SHIFT(pSmaData, len);
|
||||||
|
pTbData->tableUid = t;
|
||||||
|
|
||||||
pSmaData = (STSmaData *)malloc(sizeof(STSmaData) + dataLen);
|
int32_t tableDataLen = sizeof(STSmaTbData);
|
||||||
ASSERT_EQ(pSmaData != NULL, true);
|
for (col_id_t c = 0; c < numOfCols; ++c) {
|
||||||
pSmaData->tableUid = 3232329230;
|
if (bufSize - len - tableDataLen < buffer) {
|
||||||
pSmaData->numOfColIds = numOfColIds;
|
EXPECT_EQ(tsdbMakeRoom(&buf, bufSize + allocStep), 0);
|
||||||
pSmaData->numOfBlocks = numOfBlocks;
|
pSmaData = (STSmaDataWrapper *)buf;
|
||||||
pSmaData->dataLen = dataLen;
|
pTbData = (STSmaTbData *)POINTER_SHIFT(pSmaData, len);
|
||||||
pSmaData->tsWindow.skey = 1640000000;
|
bufSize = taosTSizeof(buf);
|
||||||
pSmaData->tsWindow.ekey = 1645788649;
|
printf(">> allocate [%d] time to %d and addr is %p\n", ++allocCnt, bufSize, pSmaData);
|
||||||
pSmaData->colIds = (col_id_t *)malloc(sizeof(col_id_t) * numOfColIds);
|
|
||||||
ASSERT_EQ(pSmaData->colIds != NULL, true);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfColIds; ++i) {
|
|
||||||
*(pSmaData->colIds + i) = (i + PRIMARYKEY_TIMESTAMP_COL_ID);
|
|
||||||
}
|
}
|
||||||
|
STSmaColData *pColData = (STSmaColData *)POINTER_SHIFT(pSmaData, len + tableDataLen);
|
||||||
|
pColData->colId = c + PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
|
pColData->blockSize = ((c & 1) == 0) ? 8 : 16;
|
||||||
|
// TODO: fill col data
|
||||||
|
tableDataLen += (sizeof(STSmaColData) + pColData->blockSize);
|
||||||
|
}
|
||||||
|
pTbData->dataLen = (tableDataLen - sizeof(STSmaTbData));
|
||||||
|
len += tableDataLen;
|
||||||
|
// printf("bufSize=%d, len=%d, len of table[%d]=%d\n", bufSize, len, t, tableDataLen);
|
||||||
|
}
|
||||||
|
pSmaData->dataLen = (len - sizeof(STSmaDataWrapper));
|
||||||
|
|
||||||
|
EXPECT_GE(bufSize, pSmaData->dataLen);
|
||||||
|
|
||||||
// execute
|
// execute
|
||||||
EXPECT_EQ(tsdbInsertTSmaData(&tsdb, &tSma, pSmaData), TSDB_CODE_SUCCESS);
|
EXPECT_EQ(tsdbInsertTSmaData(&tsdb, (char *)pSmaData), TSDB_CODE_SUCCESS);
|
||||||
|
|
||||||
// release
|
// release
|
||||||
tdDestroySmaData(pSmaData);
|
taosTZfree(buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -558,6 +558,42 @@ int32_t ctgAcquireVgInfoFromCache(SCatalog* pCtg, const char *dbFName, SCtgDBCac
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetQnodeListFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, SArray **out) {
|
||||||
|
char *msg = NULL;
|
||||||
|
int32_t msgLen = 0;
|
||||||
|
|
||||||
|
ctgDebug("try to get qnode list from mnode, mgmtEpInUse:%d", pMgmtEps->inUse);
|
||||||
|
|
||||||
|
int32_t code = queryBuildMsg[TMSG_INDEX(TDMT_MND_QNODE_LIST)](NULL, &msg, 0, &msgLen);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Build qnode list msg failed, error:%s", tstrerror(code));
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg = {
|
||||||
|
.msgType = TDMT_MND_QNODE_LIST,
|
||||||
|
.pCont = msg,
|
||||||
|
.contLen = msgLen,
|
||||||
|
};
|
||||||
|
|
||||||
|
SRpcMsg rpcRsp = {0};
|
||||||
|
|
||||||
|
rpcSendRecv(pRpc, (SEpSet*)pMgmtEps, &rpcMsg, &rpcRsp);
|
||||||
|
if (TSDB_CODE_SUCCESS != rpcRsp.code) {
|
||||||
|
ctgError("error rsp for qnode list, error:%s", tstrerror(rpcRsp.code));
|
||||||
|
CTG_ERR_RET(rpcRsp.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_QNODE_LIST)](out, rpcRsp.pCont, rpcRsp.contLen);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Process qnode list rsp failed, error:%s", tstrerror(rpcRsp.code));
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgDebug("Got qnode list from mnode, listNum:%d", (int32_t)taosArrayGetSize(*out));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgGetDBVgInfoFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, SBuildUseDBInput *input, SUseDbOutput *out) {
|
int32_t ctgGetDBVgInfoFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, SBuildUseDBInput *input, SUseDbOutput *out) {
|
||||||
|
@ -965,7 +1001,7 @@ int32_t ctgGetVgInfoFromHashValue(SCatalog *pCtg, SDBVgInfo *dbInfo, const SName
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgStbVersionCompare(const void* key1, const void* key2) {
|
int32_t ctgStbVersionSearchCompare(const void* key1, const void* key2) {
|
||||||
if (*(uint64_t *)key1 < ((SSTableMetaVersion*)key2)->suid) {
|
if (*(uint64_t *)key1 < ((SSTableMetaVersion*)key2)->suid) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (*(uint64_t *)key1 > ((SSTableMetaVersion*)key2)->suid) {
|
} else if (*(uint64_t *)key1 > ((SSTableMetaVersion*)key2)->suid) {
|
||||||
|
@ -975,7 +1011,7 @@ int32_t ctgStbVersionCompare(const void* key1, const void* key2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgDbVgVersionCompare(const void* key1, const void* key2) {
|
int32_t ctgDbVgVersionSearchCompare(const void* key1, const void* key2) {
|
||||||
if (*(int64_t *)key1 < ((SDbVgVersion*)key2)->dbId) {
|
if (*(int64_t *)key1 < ((SDbVgVersion*)key2)->dbId) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (*(int64_t *)key1 > ((SDbVgVersion*)key2)->dbId) {
|
} else if (*(int64_t *)key1 > ((SDbVgVersion*)key2)->dbId) {
|
||||||
|
@ -985,6 +1021,27 @@ int32_t ctgDbVgVersionCompare(const void* key1, const void* key2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgStbVersionSortCompare(const void* key1, const void* key2) {
|
||||||
|
if (((SSTableMetaVersion*)key1)->suid < ((SSTableMetaVersion*)key2)->suid) {
|
||||||
|
return -1;
|
||||||
|
} else if (((SSTableMetaVersion*)key1)->suid > ((SSTableMetaVersion*)key2)->suid) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgDbVgVersionSortCompare(const void* key1, const void* key2) {
|
||||||
|
if (((SDbVgVersion*)key1)->dbId < ((SDbVgVersion*)key2)->dbId) {
|
||||||
|
return -1;
|
||||||
|
} else if (((SDbVgVersion*)key1)->dbId > ((SDbVgVersion*)key2)->dbId) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgMetaRentInit(SCtgRentMgmt *mgmt, uint32_t rentSec, int8_t type) {
|
int32_t ctgMetaRentInit(SCtgRentMgmt *mgmt, uint32_t rentSec, int8_t type) {
|
||||||
mgmt->slotRIdx = 0;
|
mgmt->slotRIdx = 0;
|
||||||
mgmt->slotNum = rentSec / CTG_RENT_SLOT_SECOND;
|
mgmt->slotNum = rentSec / CTG_RENT_SLOT_SECOND;
|
||||||
|
@ -1034,7 +1091,7 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgMetaRentUpdate(SCtgRentMgmt *mgmt, void *meta, int64_t id, int32_t size, __compar_fn_t compare) {
|
int32_t ctgMetaRentUpdate(SCtgRentMgmt *mgmt, void *meta, int64_t id, int32_t size, __compar_fn_t sortCompare, __compar_fn_t searchCompare) {
|
||||||
int16_t widx = abs(id % mgmt->slotNum);
|
int16_t widx = abs(id % mgmt->slotNum);
|
||||||
|
|
||||||
SCtgRentSlot *slot = &mgmt->slots[widx];
|
SCtgRentSlot *slot = &mgmt->slots[widx];
|
||||||
|
@ -1048,12 +1105,12 @@ int32_t ctgMetaRentUpdate(SCtgRentMgmt *mgmt, void *meta, int64_t id, int32_t si
|
||||||
|
|
||||||
if (slot->needSort) {
|
if (slot->needSort) {
|
||||||
qDebug("meta slot before sorte, slot idx:%d, type:%d, size:%d", widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
qDebug("meta slot before sorte, slot idx:%d, type:%d, size:%d", widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
||||||
taosArraySort(slot->meta, compare);
|
taosArraySort(slot->meta, sortCompare);
|
||||||
slot->needSort = false;
|
slot->needSort = false;
|
||||||
qDebug("meta slot sorted, slot idx:%d, type:%d, size:%d", widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
qDebug("meta slot sorted, slot idx:%d, type:%d, size:%d", widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
||||||
}
|
}
|
||||||
|
|
||||||
void *orig = taosArraySearch(slot->meta, &id, compare, TD_EQ);
|
void *orig = taosArraySearch(slot->meta, &id, searchCompare, TD_EQ);
|
||||||
if (NULL == orig) {
|
if (NULL == orig) {
|
||||||
qError("meta not found in slot, id:%"PRIx64", slot idx:%d, type:%d, size:%d", id, widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
qError("meta not found in slot, id:%"PRIx64", slot idx:%d, type:%d, size:%d", id, widx, mgmt->type, (int32_t)taosArrayGetSize(slot->meta));
|
||||||
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
||||||
|
@ -1075,8 +1132,8 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgMetaRentRemove(SCtgRentMgmt *mgmt, int64_t id, __compar_fn_t compare) {
|
int32_t ctgMetaRentRemove(SCtgRentMgmt *mgmt, int64_t id, __compar_fn_t sortCompare, __compar_fn_t searchCompare) {
|
||||||
int16_t widx = labs(id % mgmt->slotNum);
|
int16_t widx = abs(id % mgmt->slotNum);
|
||||||
|
|
||||||
SCtgRentSlot *slot = &mgmt->slots[widx];
|
SCtgRentSlot *slot = &mgmt->slots[widx];
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1088,12 +1145,12 @@ int32_t ctgMetaRentRemove(SCtgRentMgmt *mgmt, int64_t id, __compar_fn_t compare)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slot->needSort) {
|
if (slot->needSort) {
|
||||||
taosArraySort(slot->meta, compare);
|
taosArraySort(slot->meta, sortCompare);
|
||||||
slot->needSort = false;
|
slot->needSort = false;
|
||||||
qDebug("meta slot sorted, slot idx:%d, type:%d", widx, mgmt->type);
|
qDebug("meta slot sorted, slot idx:%d, type:%d", widx, mgmt->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t idx = taosArraySearchIdx(slot->meta, &id, compare, TD_EQ);
|
int32_t idx = taosArraySearchIdx(slot->meta, &id, searchCompare, TD_EQ);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
qError("meta not found in slot, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type);
|
qError("meta not found in slot, id:%"PRIx64", slot idx:%d, type:%d", id, widx, mgmt->type);
|
||||||
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
||||||
|
@ -1240,7 +1297,7 @@ void ctgRemoveStbRent(SCatalog* pCtg, SCtgTbMetaCache *cache) {
|
||||||
uint64_t *suid = NULL;
|
uint64_t *suid = NULL;
|
||||||
suid = taosHashGetKey(pIter, NULL);
|
suid = taosHashGetKey(pIter, NULL);
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == ctgMetaRentRemove(&pCtg->stbRent, *suid, ctgStbVersionCompare)) {
|
if (TSDB_CODE_SUCCESS == ctgMetaRentRemove(&pCtg->stbRent, *suid, ctgStbVersionSortCompare, ctgStbVersionSearchCompare)) {
|
||||||
ctgDebug("stb removed from rent, suid:%"PRIx64, *suid);
|
ctgDebug("stb removed from rent, suid:%"PRIx64, *suid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1264,7 +1321,7 @@ int32_t ctgRemoveDB(SCatalog* pCtg, SCtgDBCache *dbCache, const char* dbFName) {
|
||||||
|
|
||||||
ctgInfo("db removed from cache, dbFName:%s, dbId:%"PRIx64, dbFName, dbCache->dbId);
|
ctgInfo("db removed from cache, dbFName:%s, dbId:%"PRIx64, dbFName, dbCache->dbId);
|
||||||
|
|
||||||
CTG_ERR_RET(ctgMetaRentRemove(&pCtg->dbRent, dbCache->dbId, ctgDbVgVersionCompare));
|
CTG_ERR_RET(ctgMetaRentRemove(&pCtg->dbRent, dbCache->dbId, ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
|
||||||
|
|
||||||
ctgDebug("db removed from rent, dbFName:%s, dbId:%"PRIx64, dbFName, dbCache->dbId);
|
ctgDebug("db removed from rent, dbFName:%s, dbId:%"PRIx64, dbFName, dbCache->dbId);
|
||||||
|
|
||||||
|
@ -1331,7 +1388,7 @@ int32_t ctgUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SD
|
||||||
}
|
}
|
||||||
|
|
||||||
bool newAdded = false;
|
bool newAdded = false;
|
||||||
SDbVgVersion vgVersion = {.dbId = dbId, .vgVersion = dbInfo->vgVersion};
|
SDbVgVersion vgVersion = {.dbId = dbId, .vgVersion = dbInfo->vgVersion, .numOfTable = dbInfo->numOfTable};
|
||||||
|
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
CTG_ERR_RET(ctgGetAddDBCache(pCtg, dbFName, dbId, &dbCache));
|
CTG_ERR_RET(ctgGetAddDBCache(pCtg, dbFName, dbId, &dbCache));
|
||||||
|
@ -1344,8 +1401,15 @@ int32_t ctgUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SD
|
||||||
CTG_ERR_RET(ctgWAcquireVgInfo(pCtg, dbCache));
|
CTG_ERR_RET(ctgWAcquireVgInfo(pCtg, dbCache));
|
||||||
|
|
||||||
if (dbCache->vgInfo) {
|
if (dbCache->vgInfo) {
|
||||||
if (dbInfo->vgVersion <= dbCache->vgInfo->vgVersion) {
|
if (dbInfo->vgVersion < dbCache->vgInfo->vgVersion) {
|
||||||
ctgInfo("db vgVersion is old, dbFName:%s, vgVersion:%d, currentVersion:%d", dbFName, dbInfo->vgVersion, dbCache->vgInfo->vgVersion);
|
ctgDebug("db vgVersion is old, dbFName:%s, vgVersion:%d, currentVersion:%d", dbFName, dbInfo->vgVersion, dbCache->vgInfo->vgVersion);
|
||||||
|
ctgWReleaseVgInfo(dbCache);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dbInfo->vgVersion == dbCache->vgInfo->vgVersion && dbInfo->numOfTable == dbCache->vgInfo->numOfTable) {
|
||||||
|
ctgDebug("no new db vgVersion or numOfTable, dbFName:%s, vgVersion:%d, numOfTable:%d", dbFName, dbInfo->vgVersion, dbInfo->numOfTable);
|
||||||
ctgWReleaseVgInfo(dbCache);
|
ctgWReleaseVgInfo(dbCache);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1365,7 +1429,7 @@ int32_t ctgUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SD
|
||||||
dbCache = NULL;
|
dbCache = NULL;
|
||||||
|
|
||||||
strncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
|
strncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
|
||||||
CTG_ERR_RET(ctgMetaRentUpdate(&pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion), ctgDbVgVersionCompare));
|
CTG_ERR_RET(ctgMetaRentUpdate(&pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion), ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
|
||||||
|
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
@ -1398,7 +1462,7 @@ int32_t ctgUpdateTblMeta(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFName, ui
|
||||||
|
|
||||||
ctgDebug("stb removed from stbCache, dbFName:%s, stb:%s, suid:%"PRIx64, dbFName, tbName, orig->suid);
|
ctgDebug("stb removed from stbCache, dbFName:%s, stb:%s, suid:%"PRIx64, dbFName, tbName, orig->suid);
|
||||||
|
|
||||||
ctgMetaRentRemove(&pCtg->stbRent, orig->suid, ctgStbVersionCompare);
|
ctgMetaRentRemove(&pCtg->stbRent, orig->suid, ctgStbVersionSortCompare, ctgStbVersionSearchCompare);
|
||||||
}
|
}
|
||||||
|
|
||||||
origSuid = orig->suid;
|
origSuid = orig->suid;
|
||||||
|
@ -1511,6 +1575,7 @@ int32_t ctgGetDBVgInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const
|
||||||
if (inCache) {
|
if (inCache) {
|
||||||
input.dbId = (*dbCache)->dbId;
|
input.dbId = (*dbCache)->dbId;
|
||||||
input.vgVersion = (*dbCache)->vgInfo->vgVersion;
|
input.vgVersion = (*dbCache)->vgInfo->vgVersion;
|
||||||
|
input.numOfTable = (*dbCache)->vgInfo->numOfTable;
|
||||||
} else {
|
} else {
|
||||||
input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
|
input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
|
||||||
}
|
}
|
||||||
|
@ -1924,7 +1989,7 @@ int32_t ctgActRemoveStb(SCtgMetaAction *action) {
|
||||||
|
|
||||||
ctgInfo("stb removed from cache, dbFName:%s, stbName:%s, suid:%"PRIx64, msg->dbFName, msg->stbName, msg->suid);
|
ctgInfo("stb removed from cache, dbFName:%s, stbName:%s, suid:%"PRIx64, msg->dbFName, msg->stbName, msg->suid);
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgMetaRentRemove(&msg->pCtg->stbRent, msg->suid, ctgStbVersionCompare));
|
CTG_ERR_JRET(ctgMetaRentRemove(&msg->pCtg->stbRent, msg->suid, ctgStbVersionSortCompare, ctgStbVersionSearchCompare));
|
||||||
|
|
||||||
ctgDebug("stb removed from rent, dbFName:%s, stbName:%s, suid:%"PRIx64, msg->dbFName, msg->stbName, msg->suid);
|
ctgDebug("stb removed from rent, dbFName:%s, stbName:%s, suid:%"PRIx64, msg->dbFName, msg->stbName, msg->suid);
|
||||||
|
|
||||||
|
@ -2163,7 +2228,7 @@ void catalogFreeHandle(SCatalog* pCtg) {
|
||||||
ctgInfo("handle freed, culsterId:%"PRIx64, clusterId);
|
ctgInfo("handle freed, culsterId:%"PRIx64, clusterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId) {
|
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t *tableNum) {
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId) {
|
if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId) {
|
||||||
|
@ -2194,6 +2259,7 @@ int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* vers
|
||||||
|
|
||||||
*version = dbCache->vgInfo->vgVersion;
|
*version = dbCache->vgInfo->vgVersion;
|
||||||
*dbId = dbCache->dbId;
|
*dbId = dbCache->dbId;
|
||||||
|
*tableNum = dbCache->vgInfo->numOfTable;
|
||||||
|
|
||||||
ctgReleaseVgInfo(dbCache);
|
ctgReleaseVgInfo(dbCache);
|
||||||
ctgReleaseDBCache(pCtg, dbCache);
|
ctgReleaseDBCache(pCtg, dbCache);
|
||||||
|
@ -2572,6 +2638,10 @@ int32_t catalogGetAllMeta(SCatalog* pCtg, void *pTrans, const SEpSet* pMgmtEps,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pReq->qNodeRequired) {
|
||||||
|
CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pTrans, pMgmtEps, &pRsp->pEpSetList));
|
||||||
|
}
|
||||||
|
|
||||||
CTG_API_LEAVE(TSDB_CODE_SUCCESS);
|
CTG_API_LEAVE(TSDB_CODE_SUCCESS);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern "C" {
|
||||||
|
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "dataSinkMgt.h"
|
#include "dataSinkMgt.h"
|
||||||
|
#include "plannodes.h"
|
||||||
|
|
||||||
struct SDataSink;
|
struct SDataSink;
|
||||||
struct SDataSinkHandle;
|
struct SDataSinkHandle;
|
||||||
|
@ -45,7 +46,7 @@ typedef struct SDataSinkHandle {
|
||||||
FDestroyDataSinker fDestroy;
|
FDestroyDataSinker fDestroy;
|
||||||
} SDataSinkHandle;
|
} SDataSinkHandle;
|
||||||
|
|
||||||
int32_t createDataDispatcher(SDataSinkManager* pManager, const struct SDataSink* pDataSink, DataSinkHandle* pHandle);
|
int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,10 +92,11 @@ typedef struct SResultRowPool {
|
||||||
struct STaskAttr;
|
struct STaskAttr;
|
||||||
struct STaskRuntimeEnv;
|
struct STaskRuntimeEnv;
|
||||||
struct SUdfInfo;
|
struct SUdfInfo;
|
||||||
|
struct SqlFunctionCtx;
|
||||||
|
|
||||||
int32_t getOutputInterResultBufSize(struct STaskAttr* pQueryAttr);
|
int32_t getOutputInterResultBufSize(struct STaskAttr* pQueryAttr);
|
||||||
|
|
||||||
size_t getResultRowSize(SArray* pExprInfo);
|
size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
int32_t initResultRowInfo(SResultRowInfo* pResultRowInfo, int32_t size);
|
int32_t initResultRowInfo(SResultRowInfo* pResultRowInfo, int32_t size);
|
||||||
void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo);
|
void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo);
|
||||||
|
|
||||||
|
@ -111,7 +112,6 @@ void clearResultRow(struct STaskRuntimeEnv* pRuntimeEnv, SResultRow* pResultR
|
||||||
struct SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset);
|
struct SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset);
|
||||||
|
|
||||||
void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr);
|
void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr);
|
||||||
void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols);
|
|
||||||
int32_t getRowNumForMultioutput(struct STaskAttr* pQueryAttr, bool topBottomQuery, bool stable);
|
int32_t getRowNumForMultioutput(struct STaskAttr* pQueryAttr, bool topBottomQuery, bool stable);
|
||||||
|
|
||||||
static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
||||||
|
|
|
@ -362,8 +362,8 @@ typedef struct STaskParam {
|
||||||
char* tbnameCond;
|
char* tbnameCond;
|
||||||
char* prevResult;
|
char* prevResult;
|
||||||
SArray* pTableIdList;
|
SArray* pTableIdList;
|
||||||
SSqlExpr** pExpr;
|
SExprBasicInfo** pExpr;
|
||||||
SSqlExpr** pSecExpr;
|
SExprBasicInfo** pSecExpr;
|
||||||
SExprInfo* pExprs;
|
SExprInfo* pExprs;
|
||||||
SExprInfo* pSecExprs;
|
SExprInfo* pSecExprs;
|
||||||
|
|
||||||
|
@ -410,12 +410,10 @@ typedef struct STableScanInfo {
|
||||||
int32_t numOfSkipped;
|
int32_t numOfSkipped;
|
||||||
int32_t numOfBlockStatis;
|
int32_t numOfBlockStatis;
|
||||||
int64_t numOfRows;
|
int64_t numOfRows;
|
||||||
|
|
||||||
int32_t order; // scan order
|
int32_t order; // scan order
|
||||||
int32_t times; // repeat counts
|
int32_t times; // repeat counts
|
||||||
int32_t current;
|
int32_t current;
|
||||||
int32_t reverseTimes; // 0 by default
|
int32_t reverseTimes; // 0 by default
|
||||||
|
|
||||||
SqlFunctionCtx* pCtx; // next operator query context
|
SqlFunctionCtx* pCtx; // next operator query context
|
||||||
SResultRowInfo* pResultRowInfo;
|
SResultRowInfo* pResultRowInfo;
|
||||||
int32_t* rowCellInfoOffset;
|
int32_t* rowCellInfoOffset;
|
||||||
|
@ -424,7 +422,6 @@ typedef struct STableScanInfo {
|
||||||
int32_t numOfOutput;
|
int32_t numOfOutput;
|
||||||
int64_t elapsedTime;
|
int64_t elapsedTime;
|
||||||
int32_t prevGroupId; // previous table group id
|
int32_t prevGroupId; // previous table group id
|
||||||
|
|
||||||
int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan
|
int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan
|
||||||
} STableScanInfo;
|
} STableScanInfo;
|
||||||
|
|
||||||
|
@ -443,21 +440,43 @@ typedef struct SStreamBlockScanInfo {
|
||||||
void* readerHandle; // stream block reader handle
|
void* readerHandle; // stream block reader handle
|
||||||
} SStreamBlockScanInfo;
|
} SStreamBlockScanInfo;
|
||||||
|
|
||||||
|
typedef struct SSysTableScanInfo {
|
||||||
|
union {
|
||||||
|
void* pTransporter;
|
||||||
|
void* readHandle;
|
||||||
|
};
|
||||||
|
|
||||||
|
void *pCur; // cursor
|
||||||
|
SRetrieveTableReq* pReq;
|
||||||
|
SEpSet epSet;
|
||||||
|
int32_t type; // show type
|
||||||
|
tsem_t ready;
|
||||||
|
SSchema* pSchema;
|
||||||
|
SSDataBlock* pRes;
|
||||||
|
|
||||||
|
int32_t capacity;
|
||||||
|
int64_t numOfBlocks; // extract basic running information.
|
||||||
|
int64_t totalRows;
|
||||||
|
int64_t elapsedTime;
|
||||||
|
int64_t totalBytes;
|
||||||
|
} SSysTableScanInfo;
|
||||||
|
|
||||||
typedef struct SOptrBasicInfo {
|
typedef struct SOptrBasicInfo {
|
||||||
SResultRowInfo resultRowInfo;
|
SResultRowInfo resultRowInfo;
|
||||||
int32_t* rowCellInfoOffset; // offset value for each row result cell info
|
int32_t* rowCellInfoOffset; // offset value for each row result cell info
|
||||||
SqlFunctionCtx* pCtx;
|
SqlFunctionCtx* pCtx;
|
||||||
SSDataBlock* pRes;
|
SSDataBlock* pRes;
|
||||||
uint32_t resRowSize;
|
|
||||||
int32_t capacity;
|
int32_t capacity;
|
||||||
} SOptrBasicInfo;
|
} SOptrBasicInfo;
|
||||||
|
|
||||||
|
//TODO move the resultrowsiz together with SOptrBasicInfo:rowCellInfoOffset
|
||||||
typedef struct SAggSupporter {
|
typedef struct SAggSupporter {
|
||||||
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
||||||
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
||||||
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
||||||
char* keyBuf; // window key buffer
|
char* keyBuf; // window key buffer
|
||||||
SResultRowPool *pool; // The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
SResultRowPool *pool; // The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
||||||
|
int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
|
||||||
} SAggSupporter;
|
} SAggSupporter;
|
||||||
|
|
||||||
typedef struct STableIntervalOperatorInfo {
|
typedef struct STableIntervalOperatorInfo {
|
||||||
|
@ -613,13 +632,15 @@ typedef struct SOrderOperatorInfo {
|
||||||
uint64_t totalElapsed; // total elapsed time
|
uint64_t totalElapsed; // total elapsed time
|
||||||
} SOrderOperatorInfo;
|
} SOrderOperatorInfo;
|
||||||
|
|
||||||
SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray* pSchema, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createExchangeOperatorInfo(const SNodeList* pSources, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput,
|
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput,
|
||||||
int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SSDataBlock* pResultBlock, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
||||||
SOperatorInfo* createMultiTableAggOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
SOperatorInfo* createMultiTableAggOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SSDataBlock* pResultBlock, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
||||||
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo);
|
||||||
|
SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, const SArray* pExprInfo, const SSchema* pSchema,
|
||||||
|
int32_t tableType, SEpSet epset, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
||||||
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SInterval* pInterval, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SInterval* pInterval, SExecTaskInfo* pTaskInfo);
|
||||||
|
@ -650,8 +671,6 @@ SOperatorInfo* createStatewindowOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOper
|
||||||
int32_t numOfOutput);
|
int32_t numOfOutput);
|
||||||
SOperatorInfo* createSLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
SOperatorInfo* createSLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
||||||
int32_t numOfOutput, void* merger, bool multigroupResult);
|
int32_t numOfOutput, void* merger, bool multigroupResult);
|
||||||
SOperatorInfo* createFilterOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
|
||||||
int32_t numOfOutput, SColumnInfo* pCols, int32_t numOfFilter);
|
|
||||||
|
|
||||||
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pdownstream, int32_t numOfDownstream, SSchema* pSchema,
|
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pdownstream, int32_t numOfDownstream, SSchema* pSchema,
|
||||||
int32_t numOfOutput);
|
int32_t numOfOutput);
|
||||||
|
@ -676,16 +695,8 @@ void updateOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity, int32_t numOf
|
||||||
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
||||||
void copyTsColoum(SSDataBlock* pRes, SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
void copyTsColoum(SSDataBlock* pRes, SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
|
|
||||||
int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExprInfo** pExprInfo, SSqlExpr** pExprMsg,
|
|
||||||
SColumnInfo* pTagCols, int32_t queryType, void* pMsg, struct SUdfInfo* pUdfInfo);
|
|
||||||
|
|
||||||
int32_t createIndirectQueryFuncExprFromMsg(SQueryTableReq* pQueryMsg, int32_t numOfOutput, SExprInfo** pExprInfo,
|
|
||||||
SSqlExpr** pExpr, SExprInfo* prevExpr, struct SUdfInfo* pUdfInfo);
|
|
||||||
|
|
||||||
int32_t createQueryFilter(char* data, uint16_t len, SFilterInfo** pFilters);
|
int32_t createQueryFilter(char* data, uint16_t len, SFilterInfo** pFilters);
|
||||||
|
|
||||||
SGroupbyExpr* createGroupbyExprFromMsg(SQueryTableReq* pQueryMsg, SColIndex* pColIndex, int32_t* code);
|
|
||||||
|
|
||||||
int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo* pQInfo, STaskParam* param, char* start,
|
int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo* pQInfo, STaskParam* param, char* start,
|
||||||
int32_t prevResultLen, void* merger);
|
int32_t prevResultLen, void* merger);
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ typedef struct SDataCacheEntry {
|
||||||
typedef struct SDataDispatchHandle {
|
typedef struct SDataDispatchHandle {
|
||||||
SDataSinkHandle sink;
|
SDataSinkHandle sink;
|
||||||
SDataSinkManager* pManager;
|
SDataSinkManager* pManager;
|
||||||
SDataBlockSchema schema;
|
SDataBlockDescNode* pSchema;
|
||||||
STaosQueue* pDataBlocks;
|
STaosQueue* pDataBlocks;
|
||||||
SDataDispatchBuf nextOutput;
|
SDataDispatchBuf nextOutput;
|
||||||
int32_t status;
|
int32_t status;
|
||||||
|
@ -48,12 +48,13 @@ typedef struct SDataDispatchHandle {
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
} SDataDispatchHandle;
|
} SDataDispatchHandle;
|
||||||
|
|
||||||
static bool needCompress(const SSDataBlock* pData, const SDataBlockSchema* pSchema) {
|
static bool needCompress(const SSDataBlock* pData, const SDataBlockDescNode* pSchema) {
|
||||||
if (tsCompressColData < 0 || 0 == pData->info.rows) {
|
if (tsCompressColData < 0 || 0 == pData->info.rows) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t col = 0; col < pSchema->numOfCols; ++col) {
|
int32_t numOfCols = LIST_LENGTH(pSchema->pSlots);
|
||||||
|
for (int32_t col = 0; col < numOfCols; ++col) {
|
||||||
SColumnInfoData* pColRes = taosArrayGet(pData->pDataBlock, col);
|
SColumnInfoData* pColRes = taosArrayGet(pData->pDataBlock, col);
|
||||||
int32_t colSize = pColRes->info.bytes * pData->info.rows;
|
int32_t colSize = pColRes->info.bytes * pData->info.rows;
|
||||||
if (NEEDTO_COMPRESS_QUERY(colSize)) {
|
if (NEEDTO_COMPRESS_QUERY(colSize)) {
|
||||||
|
@ -70,13 +71,14 @@ static int32_t compressColData(SColumnInfoData *pColRes, int32_t numOfRows, char
|
||||||
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 SDataBlockSchema* 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 *compLen) {
|
||||||
|
int32_t numOfCols = LIST_LENGTH(pSchema->pSlots);
|
||||||
int32_t *compSizes = (int32_t*)data;
|
int32_t *compSizes = (int32_t*)data;
|
||||||
if (compressed) {
|
if (compressed) {
|
||||||
data += pSchema->numOfCols * sizeof(int32_t);
|
data += numOfCols * sizeof(int32_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t col = 0; col < pSchema->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) {
|
if (compressed) {
|
||||||
compSizes[col] = compressColData(pColRes, pInput->pData->info.rows, data, compressed);
|
compSizes[col] = compressColData(pColRes, pInput->pData->info.rows, data, compressed);
|
||||||
|
@ -107,14 +109,14 @@ static void copyData(const SInputData* pInput, const SDataBlockSchema* pSchema,
|
||||||
// data format: SDataCacheEntry | col1_data col2_data ... | numOfTables | STableIdInfo STableIdInfo ...
|
// data format: SDataCacheEntry | col1_data col2_data ... | numOfTables | STableIdInfo STableIdInfo ...
|
||||||
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->schema));
|
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 = DATA_META_LENGTH(pInput->pTableRetrieveTsMap);
|
pBuf->useSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap);
|
||||||
copyData(pInput, &pHandle->schema, pEntry->data, pEntry->compressed, &pEntry->dataLen);
|
copyData(pInput, pHandle->pSchema, pEntry->data, pEntry->compressed, &pEntry->dataLen);
|
||||||
if (0 == pEntry->compressed) {
|
if (0 == pEntry->compressed) {
|
||||||
pEntry->dataLen = pHandle->schema.resultRowSize * pInput->pData->info.rows;
|
pEntry->dataLen = pHandle->pSchema->resultRowSize * pInput->pData->info.rows;
|
||||||
}
|
}
|
||||||
pBuf->useSize += pEntry->dataLen;
|
pBuf->useSize += pEntry->dataLen;
|
||||||
// todo completed
|
// todo completed
|
||||||
|
@ -128,7 +130,7 @@ static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pBuf->allocSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap) + pDispatcher->schema.resultRowSize * pInput->pData->info.rows;
|
pBuf->allocSize = DATA_META_LENGTH(pInput->pTableRetrieveTsMap) + pDispatcher->pSchema->resultRowSize * pInput->pData->info.rows;
|
||||||
pBuf->pData = malloc(pBuf->allocSize);
|
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));
|
||||||
|
@ -194,7 +196,7 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) {
|
||||||
if (NULL == pDispatcher->nextOutput.pData) {
|
if (NULL == pDispatcher->nextOutput.pData) {
|
||||||
assert(pDispatcher->queryEnd);
|
assert(pDispatcher->queryEnd);
|
||||||
pOutput->useconds = pDispatcher->useconds;
|
pOutput->useconds = pDispatcher->useconds;
|
||||||
pOutput->precision = pDispatcher->schema.precision;
|
pOutput->precision = pDispatcher->pSchema->precision;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDispatcher->nextOutput.pData);
|
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDispatcher->nextOutput.pData);
|
||||||
|
@ -206,7 +208,7 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) {
|
||||||
pthread_mutex_lock(&pDispatcher->mutex);
|
pthread_mutex_lock(&pDispatcher->mutex);
|
||||||
pOutput->queryEnd = pDispatcher->queryEnd;
|
pOutput->queryEnd = pDispatcher->queryEnd;
|
||||||
pOutput->useconds = pDispatcher->useconds;
|
pOutput->useconds = pDispatcher->useconds;
|
||||||
pOutput->precision = pDispatcher->schema.precision;
|
pOutput->precision = pDispatcher->pSchema->precision;
|
||||||
pthread_mutex_unlock(&pDispatcher->mutex);
|
pthread_mutex_unlock(&pDispatcher->mutex);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -224,7 +226,7 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
pthread_mutex_destroy(&pDispatcher->mutex);
|
pthread_mutex_destroy(&pDispatcher->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSink* pDataSink, DataSinkHandle* pHandle) {
|
int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle) {
|
||||||
SDataDispatchHandle* dispatcher = calloc(1, sizeof(SDataDispatchHandle));
|
SDataDispatchHandle* dispatcher = calloc(1, sizeof(SDataDispatchHandle));
|
||||||
if (NULL == dispatcher) {
|
if (NULL == dispatcher) {
|
||||||
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
@ -236,7 +238,7 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSink* pDataS
|
||||||
dispatcher->sink.fGetData = getDataBlock;
|
dispatcher->sink.fGetData = getDataBlock;
|
||||||
dispatcher->sink.fDestroy = destroyDataSinker;
|
dispatcher->sink.fDestroy = destroyDataSinker;
|
||||||
dispatcher->pManager = pManager;
|
dispatcher->pManager = pManager;
|
||||||
dispatcher->schema = pDataSink->schema;
|
dispatcher->pSchema = pDataSink->pInputDataBlockDesc;
|
||||||
dispatcher->status = DS_BUF_EMPTY;
|
dispatcher->status = DS_BUF_EMPTY;
|
||||||
dispatcher->queryEnd = false;
|
dispatcher->queryEnd = false;
|
||||||
dispatcher->pDataBlocks = taosOpenQueue();
|
dispatcher->pDataBlocks = taosOpenQueue();
|
||||||
|
|
|
@ -25,8 +25,8 @@ int32_t dsDataSinkMgtInit(SDataSinkMgtCfg *cfg) {
|
||||||
pthread_mutex_init(&gDataSinkManager.mutex, NULL);
|
pthread_mutex_init(&gDataSinkManager.mutex, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dsCreateDataSinker(const struct SDataSink *pDataSink, DataSinkHandle* pHandle) {
|
int32_t dsCreateDataSinker(const SDataSinkNode *pDataSink, DataSinkHandle* pHandle) {
|
||||||
if (DSINK_Dispatch == pDataSink->info.type) {
|
if (QUERY_NODE_PHYSICAL_PLAN_DISPATCH == nodeType(pDataSink)) {
|
||||||
return createDataDispatcher(&gDataSinkManager, pDataSink, pHandle);
|
return createDataDispatcher(&gDataSinkManager, pDataSink, pHandle);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
|
|
@ -46,7 +46,7 @@ int32_t getOutputInterResultBufSize(STaskAttr* pQueryAttr) {
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQueryAttr->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQueryAttr->numOfOutput; ++i) {
|
||||||
size += pQueryAttr->pExpr1[i].base.interBytes;
|
// size += pQueryAttr->pExpr1[i].base.interBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(size >= 0);
|
assert(size >= 0);
|
||||||
|
@ -172,9 +172,14 @@ SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_
|
||||||
return (SResultRowEntryInfo*)((char*) pRow->pEntryInfo + offset[index]);
|
return (SResultRowEntryInfo*)((char*) pRow->pEntryInfo + offset[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getResultRowSize(SArray* pExprInfo) {
|
size_t getResultRowSize(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||||
size_t numOfOutput = taosArrayGetSize(pExprInfo);
|
int32_t rowSize = (numOfOutput * sizeof(SResultRowEntryInfo)) + sizeof(SResultRow);
|
||||||
return (numOfOutput * sizeof(SResultRowEntryInfo)) + /*pQueryAttr->interBufSize +*/ sizeof(SResultRow);
|
|
||||||
|
for(int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
|
rowSize += pCtx[i].resDataInfo.interBufSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size) {
|
SResultRowPool* initResultRowPool(size_t size) {
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, char* id) {
|
static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, char* id) {
|
||||||
ASSERT(pOperator != NULL);
|
ASSERT(pOperator != NULL);
|
||||||
if (pOperator->operatorType != OP_StreamScan) {
|
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
if (pOperator->numOfDownstream == 0) {
|
if (pOperator->numOfDownstream == 0) {
|
||||||
qError("failed to find stream scan operator to set the input data block, %s" PRIx64, id);
|
qError("failed to find stream scan operator to set the input data block, %s" PRIx64, id);
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
@ -99,7 +99,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 != OP_StreamScan) {
|
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
|
@ -224,17 +224,40 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
TEST(testCase, build_executor_tree_Test) {
|
TEST(testCase, build_executor_tree_Test) {
|
||||||
const char* msg = "{\n"
|
const char* msg = "{\n"
|
||||||
" \"Type\": \"33\",\n"
|
" \"NodeType\": \"48\",\n"
|
||||||
|
" \"Name\": \"PhysiSubplan\",\n"
|
||||||
|
" \"PhysiSubplan\": {\n"
|
||||||
|
" \"Id\": {\n"
|
||||||
|
" \"QueryId\": \"0\",\n"
|
||||||
|
" \"TemplateId\": \"0\",\n"
|
||||||
|
" \"SubplanId\": \"0\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"SubplanType\": \"0\",\n"
|
||||||
|
" \"MsgType\": \"515\",\n"
|
||||||
|
" \"Level\": \"0\",\n"
|
||||||
|
" \"NodeAddr\": {\n"
|
||||||
|
" \"Id\": \"1\",\n"
|
||||||
|
" \"InUse\": \"0\",\n"
|
||||||
|
" \"NumOfEps\": \"1\",\n"
|
||||||
|
" \"Eps\": [\n"
|
||||||
|
" {\n"
|
||||||
|
" \"Fqdn\": \"node1\",\n"
|
||||||
|
" \"Port\": \"6030\"\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
" },\n"
|
||||||
|
" \"RootNode\": {\n"
|
||||||
|
" \"NodeType\": \"41\",\n"
|
||||||
" \"Name\": \"PhysiProject\",\n"
|
" \"Name\": \"PhysiProject\",\n"
|
||||||
" \"PhysiProject\": {\n"
|
" \"PhysiProject\": {\n"
|
||||||
" \"OutputDataBlockDesc\": {\n"
|
" \"OutputDataBlockDesc\": {\n"
|
||||||
" \"Type\": \"19\",\n"
|
" \"NodeType\": \"19\",\n"
|
||||||
" \"Name\": \"TupleDesc\",\n"
|
" \"Name\": \"TupleDesc\",\n"
|
||||||
" \"TupleDesc\": {\n"
|
" \"TupleDesc\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"Slots\": [\n"
|
" \"Slots\": [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"0\",\n"
|
" \"SlotId\": \"0\",\n"
|
||||||
|
@ -249,7 +272,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"1\",\n"
|
" \"SlotId\": \"1\",\n"
|
||||||
|
@ -264,7 +287,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"2\",\n"
|
" \"SlotId\": \"2\",\n"
|
||||||
|
@ -279,7 +302,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"3\",\n"
|
" \"SlotId\": \"3\",\n"
|
||||||
|
@ -294,7 +317,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"4\",\n"
|
" \"SlotId\": \"4\",\n"
|
||||||
|
@ -309,7 +332,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"5\",\n"
|
" \"SlotId\": \"5\",\n"
|
||||||
|
@ -328,17 +351,17 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" },\n"
|
" },\n"
|
||||||
" \"Children\": [\n"
|
" \"Children\": [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"30\",\n"
|
" \"NodeType\": \"38\",\n"
|
||||||
" \"Name\": \"PhysiTableScan\",\n"
|
" \"Name\": \"PhysiTableScan\",\n"
|
||||||
" \"PhysiTableScan\": {\n"
|
" \"PhysiTableScan\": {\n"
|
||||||
" \"OutputDataBlockDesc\": {\n"
|
" \"OutputDataBlockDesc\": {\n"
|
||||||
" \"Type\": \"19\",\n"
|
" \"NodeType\": \"19\",\n"
|
||||||
" \"Name\": \"TupleDesc\",\n"
|
" \"Name\": \"TupleDesc\",\n"
|
||||||
" \"TupleDesc\": {\n"
|
" \"TupleDesc\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"Slots\": [\n"
|
" \"Slots\": [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"0\",\n"
|
" \"SlotId\": \"0\",\n"
|
||||||
|
@ -353,7 +376,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"1\",\n"
|
" \"SlotId\": \"1\",\n"
|
||||||
|
@ -368,7 +391,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"2\",\n"
|
" \"SlotId\": \"2\",\n"
|
||||||
|
@ -383,7 +406,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"3\",\n"
|
" \"SlotId\": \"3\",\n"
|
||||||
|
@ -398,7 +421,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"4\",\n"
|
" \"SlotId\": \"4\",\n"
|
||||||
|
@ -413,7 +436,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"20\",\n"
|
" \"NodeType\": \"20\",\n"
|
||||||
" \"Name\": \"SlotDesc\",\n"
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
" \"SlotDesc\": {\n"
|
" \"SlotDesc\": {\n"
|
||||||
" \"SlotId\": \"5\",\n"
|
" \"SlotId\": \"5\",\n"
|
||||||
|
@ -432,13 +455,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" },\n"
|
" },\n"
|
||||||
" \"ScanCols\": [\n"
|
" \"ScanCols\": [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"0\",\n"
|
" \"SlotId\": \"0\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -462,13 +485,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"1\",\n"
|
" \"SlotId\": \"1\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -492,13 +515,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"2\",\n"
|
" \"SlotId\": \"2\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -522,13 +545,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"3\",\n"
|
" \"SlotId\": \"3\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -552,13 +575,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"4\",\n"
|
" \"SlotId\": \"4\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -582,13 +605,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"0\",\n"
|
" \"DataBlockId\": \"0\",\n"
|
||||||
" \"SlotId\": \"5\",\n"
|
" \"SlotId\": \"5\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -625,13 +648,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" ],\n"
|
" ],\n"
|
||||||
" \"Projections\": [\n"
|
" \"Projections\": [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"0\",\n"
|
" \"SlotId\": \"0\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -655,13 +678,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"1\",\n"
|
" \"SlotId\": \"1\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -685,13 +708,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"2\",\n"
|
" \"SlotId\": \"2\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -715,13 +738,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"3\",\n"
|
" \"SlotId\": \"3\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -745,13 +768,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"4\",\n"
|
" \"SlotId\": \"4\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -775,13 +798,13 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"Type\": \"18\",\n"
|
" \"NodeType\": \"18\",\n"
|
||||||
" \"Name\": \"Target\",\n"
|
" \"Name\": \"Target\",\n"
|
||||||
" \"Target\": {\n"
|
" \"Target\": {\n"
|
||||||
" \"DataBlockId\": \"1\",\n"
|
" \"DataBlockId\": \"1\",\n"
|
||||||
" \"SlotId\": \"5\",\n"
|
" \"SlotId\": \"5\",\n"
|
||||||
" \"Expr\": {\n"
|
" \"Expr\": {\n"
|
||||||
" \"Type\": \"1\",\n"
|
" \"NodeType\": \"1\",\n"
|
||||||
" \"Name\": \"Column\",\n"
|
" \"Name\": \"Column\",\n"
|
||||||
" \"Column\": {\n"
|
" \"Column\": {\n"
|
||||||
" \"DataType\": {\n"
|
" \"DataType\": {\n"
|
||||||
|
@ -806,18 +829,129 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
" }\n"
|
" }\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" \"DataSink\": {\n"
|
||||||
|
" \"NodeType\": \"46\",\n"
|
||||||
|
" \"Name\": \"PhysiDispatch\",\n"
|
||||||
|
" \"PhysiDispatch\": {\n"
|
||||||
|
" \"InputDataBlockDesc\": {\n"
|
||||||
|
" \"NodeType\": \"19\",\n"
|
||||||
|
" \"Name\": \"TupleDesc\",\n"
|
||||||
|
" \"TupleDesc\": {\n"
|
||||||
|
" \"DataBlockId\": \"1\",\n"
|
||||||
|
" \"Slots\": [\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"0\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"9\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"8\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"1\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"4\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"4\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"2\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"8\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"20\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"3\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"5\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"8\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"4\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"7\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"8\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" },\n"
|
||||||
|
" {\n"
|
||||||
|
" \"NodeType\": \"20\",\n"
|
||||||
|
" \"Name\": \"SlotDesc\",\n"
|
||||||
|
" \"SlotDesc\": {\n"
|
||||||
|
" \"SlotId\": \"5\",\n"
|
||||||
|
" \"DataType\": {\n"
|
||||||
|
" \"Type\": \"7\",\n"
|
||||||
|
" \"Precision\": \"0\",\n"
|
||||||
|
" \"Scale\": \"0\",\n"
|
||||||
|
" \"Bytes\": \"8\"\n"
|
||||||
|
" },\n"
|
||||||
|
" \"Reserve\": false,\n"
|
||||||
|
" \"Output\": false\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
SExecTaskInfo* pTaskInfo = nullptr;
|
SExecTaskInfo* pTaskInfo = nullptr;
|
||||||
DataSinkHandle sinkHandle = nullptr;
|
DataSinkHandle sinkHandle = nullptr;
|
||||||
SReadHandle handle = {.reader = reinterpret_cast<void*>(0x1), .meta = reinterpret_cast<void*>(0x1)};
|
SReadHandle handle = {.reader = reinterpret_cast<void*>(0x1), .meta = reinterpret_cast<void*>(0x1)};
|
||||||
|
|
||||||
SSubplan* plan = NULL;
|
struct SSubplan *plan = NULL;
|
||||||
qStringToSubplan(msg, &plan);
|
int32_t code = qStringToSubplan(msg, &plan);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
int32_t code = qCreateExecTask(&handle, 2, 1, NULL, (void**) &pTaskInfo, &sinkHandle);
|
code = qCreateExecTask(&handle, 2, 1, plan, (void**) &pTaskInfo, &sinkHandle);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
TEST(testCase, inMem_sort_Test) {
|
TEST(testCase, inMem_sort_Test) {
|
||||||
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
||||||
SOrder o = {.order = TSDB_ORDER_ASC};
|
SOrder o = {.order = TSDB_ORDER_ASC};
|
||||||
|
@ -847,6 +981,8 @@ TEST(testCase, inMem_sort_Test) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct su {
|
typedef struct su {
|
||||||
int32_t v;
|
int32_t v;
|
||||||
char *c;
|
char *c;
|
||||||
|
@ -865,6 +1001,7 @@ int32_t cmp(const void* p1, const void* p2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
TEST(testCase, external_sort_Test) {
|
TEST(testCase, external_sort_Test) {
|
||||||
#if 0
|
#if 0
|
||||||
su* v = static_cast<su*>(calloc(1000000, sizeof(su)));
|
su* v = static_cast<su*>(calloc(1000000, sizeof(su)));
|
||||||
|
@ -882,7 +1019,7 @@ TEST(testCase, external_sort_Test) {
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
taosSeedRand(time(NULL));
|
taosSeedRand(taosGetTimestampSec());
|
||||||
|
|
||||||
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
||||||
SOrder o = {0};
|
SOrder o = {0};
|
||||||
|
@ -943,7 +1080,7 @@ TEST(testCase, external_sort_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, sorted_merge_Test) {
|
TEST(testCase, sorted_merge_Test) {
|
||||||
taosSeedRand(time(NULL));
|
taosSeedRand(taosGetTimestampSec());
|
||||||
|
|
||||||
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
||||||
SOrder o = {0};
|
SOrder o = {0};
|
||||||
|
@ -1015,7 +1152,7 @@ TEST(testCase, sorted_merge_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, time_interval_Operator_Test) {
|
TEST(testCase, time_interval_Operator_Test) {
|
||||||
taosSeedRand(time(NULL));
|
taosSeedRand(taosGetTimestampSec());
|
||||||
|
|
||||||
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
SArray* pOrderVal = taosArrayInit(4, sizeof(SOrder));
|
||||||
SOrder o = {0};
|
SOrder o = {0};
|
||||||
|
@ -1091,5 +1228,6 @@ TEST(testCase, time_interval_Operator_Test) {
|
||||||
taosArrayDestroy(pExprInfo);
|
taosArrayDestroy(pExprInfo);
|
||||||
taosArrayDestroy(pOrderVal);
|
taosArrayDestroy(pOrderVal);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
|
||||||
TEST(testCase, linear_hash_Tests) {
|
TEST(testCase, linear_hash_Tests) {
|
||||||
taosSeedRand(time(NULL));
|
taosSeedRand(taosGetTimestampSec());
|
||||||
|
|
||||||
_hash_fn_t fn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT);
|
_hash_fn_t fn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT);
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* 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 TDENGINE_BUILTINSIMPL_H
|
||||||
|
#define TDENGINE_BUILTINSIMPL_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "function.h"
|
||||||
|
|
||||||
|
bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo);
|
||||||
|
void functionFinalizer(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
bool getCountFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
void countFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
bool getSumFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
void sumFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
bool minFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo);
|
||||||
|
bool maxFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo);
|
||||||
|
bool getMinmaxFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
void minFunction(SqlFunctionCtx* pCtx);
|
||||||
|
void maxFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif // TDENGINE_BUILTINSIMPL_H
|
|
@ -83,9 +83,7 @@ static FORCE_INLINE void initResultRowEntry(SResultRowEntryInfo *pResInfo, int32
|
||||||
pResInfo->initialized = true; // the this struct has been initialized flag
|
pResInfo->initialized = true; // the this struct has been initialized flag
|
||||||
|
|
||||||
pResInfo->complete = false;
|
pResInfo->complete = false;
|
||||||
pResInfo->hasResult = false;
|
|
||||||
pResInfo->numOfRes = 0;
|
pResInfo->numOfRes = 0;
|
||||||
|
|
||||||
memset(GET_ROWCELL_INTERBUF(pResInfo), 0, bufLen);
|
memset(GET_ROWCELL_INTERBUF(pResInfo), 0, bufLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "builtins.h"
|
#include "builtins.h"
|
||||||
|
#include "builtinsimpl.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
#include "tdatablock.h"
|
||||||
|
|
||||||
int32_t stubCheckAndGetResultType(SFunctionNode* pFunc);
|
int32_t stubCheckAndGetResultType(SFunctionNode* pFunc);
|
||||||
|
|
||||||
|
@ -24,20 +26,40 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.type = FUNCTION_TYPE_COUNT,
|
.type = FUNCTION_TYPE_COUNT,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
.checkFunc = stubCheckAndGetResultType,
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
.getEnvFunc = NULL,
|
.getEnvFunc = getCountFuncEnv,
|
||||||
.initFunc = NULL,
|
.initFunc = functionSetup,
|
||||||
.processFunc = NULL,
|
.processFunc = countFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = functionFinalizer
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "sum",
|
.name = "sum",
|
||||||
.type = FUNCTION_TYPE_SUM,
|
.type = FUNCTION_TYPE_SUM,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
.checkFunc = stubCheckAndGetResultType,
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
.getEnvFunc = NULL,
|
.getEnvFunc = getSumFuncEnv,
|
||||||
.initFunc = NULL,
|
.initFunc = functionSetup,
|
||||||
.processFunc = NULL,
|
.processFunc = sumFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = functionFinalizer
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "min",
|
||||||
|
.type = FUNCTION_TYPE_MIN,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = minFunctionSetup,
|
||||||
|
.processFunc = minFunction,
|
||||||
|
.finalizeFunc = functionFinalizer
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "max",
|
||||||
|
.type = FUNCTION_TYPE_MAX,
|
||||||
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
.getEnvFunc = getMinmaxFuncEnv,
|
||||||
|
.initFunc = maxFunctionSetup,
|
||||||
|
.processFunc = maxFunction,
|
||||||
|
.finalizeFunc = functionFinalizer
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "concat",
|
.name = "concat",
|
||||||
|
@ -51,8 +73,44 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const int funcMgtBuiltinsNum = (sizeof(funcMgtBuiltins) / sizeof(SBuiltinFuncDefinition));
|
const int32_t funcMgtBuiltinsNum = (sizeof(funcMgtBuiltins) / sizeof(SBuiltinFuncDefinition));
|
||||||
|
|
||||||
int32_t stubCheckAndGetResultType(SFunctionNode* pFunc) {
|
int32_t stubCheckAndGetResultType(SFunctionNode* pFunc) {
|
||||||
|
switch(pFunc->funcType) {
|
||||||
|
case FUNCTION_TYPE_COUNT:
|
||||||
|
pFunc->node.resType = (SDataType){.bytes = sizeof(int64_t), .type = TSDB_DATA_TYPE_BIGINT};
|
||||||
|
break;
|
||||||
|
case FUNCTION_TYPE_SUM: {
|
||||||
|
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
int32_t paraType = pParam->node.resType.type;
|
||||||
|
|
||||||
|
int32_t resType = 0;
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(paraType)) {
|
||||||
|
resType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
|
||||||
|
resType = TSDB_DATA_TYPE_UBIGINT;
|
||||||
|
} else if (IS_FLOAT_TYPE(paraType)) {
|
||||||
|
resType = TSDB_DATA_TYPE_DOUBLE;
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[resType].bytes, .type = resType };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FUNCTION_TYPE_MIN:
|
||||||
|
case FUNCTION_TYPE_MAX: {
|
||||||
|
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
int32_t paraType = pParam->node.resType.type;
|
||||||
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[paraType].bytes, .type = paraType };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FUNCTION_TYPE_CONCAT:
|
||||||
|
// todo
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0); // to found the fault ASAP.
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,448 @@
|
||||||
|
/*
|
||||||
|
* 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 "builtinsimpl.h"
|
||||||
|
#include "querynodes.h"
|
||||||
|
#include "taggfunction.h"
|
||||||
|
#include "tdatablock.h"
|
||||||
|
|
||||||
|
#define SET_VAL(_info, numOfElem, res) \
|
||||||
|
do { \
|
||||||
|
if ((numOfElem) <= 0) { \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
(_info)->numOfRes = (res); \
|
||||||
|
(_info)->hasResult = DATA_SET_FLAG; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
typedef struct SSumRes {
|
||||||
|
union {
|
||||||
|
int64_t isum;
|
||||||
|
uint64_t usum;
|
||||||
|
double dsum;
|
||||||
|
};
|
||||||
|
} SSumRes;
|
||||||
|
|
||||||
|
bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
|
if (pResultInfo->initialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCtx->pOutput != NULL) {
|
||||||
|
memset(pCtx->pOutput, 0, (size_t)pCtx->resDataInfo.bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
initResultRowEntry(pResultInfo, pCtx->resDataInfo.interBufSize);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doFinalizer(SResultRowEntryInfo* pResInfo) { cleanupResultRowEntry(pResInfo); }
|
||||||
|
|
||||||
|
void functionFinalizer(SqlFunctionCtx *pCtx) {
|
||||||
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
||||||
|
// setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
doFinalizer(pResInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getCountFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
|
pEnv->calcMemSize = sizeof(int64_t);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* count function does need the finalize, if data is missing, the default value, which is 0, is used
|
||||||
|
* count function does not use the pCtx->interResBuf to keep the intermediate buffer
|
||||||
|
*/
|
||||||
|
void countFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
int32_t numOfElem = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1. column data missing (schema modified) causes pCtx->hasNull == true. pCtx->isAggSet == true;
|
||||||
|
* 2. for general non-primary key columns, pCtx->hasNull may be true or false, pCtx->isAggSet == true;
|
||||||
|
* 3. for primary key column, pCtx->hasNull always be false, pCtx->isAggSet == false;
|
||||||
|
*/
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
|
if (pInput->colDataAggIsSet && pInput->totalRows == pInput->numOfRows) {
|
||||||
|
numOfElem = pInput->numOfRows - pInput->pColumnDataAgg[0]->numOfNull;
|
||||||
|
ASSERT(numOfElem >= 0);
|
||||||
|
} else {
|
||||||
|
if (pInputCol->hasNull) {
|
||||||
|
for (int32_t i = pInput->startRowIndex; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
|
||||||
|
if (colDataIsNull(pInputCol, pInput->totalRows, i, NULL)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
numOfElem += 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//when counting on the primary time stamp column and no statistics data is presented, use the size value directly.
|
||||||
|
numOfElem = pInput->numOfRows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
*((int64_t *)buf) += numOfElem;
|
||||||
|
|
||||||
|
SET_VAL(pResInfo, numOfElem, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LIST_ADD_N(_res, _col, _start, _rows, _t, numOfElem) \
|
||||||
|
do { \
|
||||||
|
_t *d = (_t *)(_col->pData); \
|
||||||
|
for (int32_t i = (_start); i < (_rows) + (_start); ++i) { \
|
||||||
|
if (((_col)->hasNull) && colDataIsNull_f((_col)->nullbitmap, i)) { \
|
||||||
|
continue; \
|
||||||
|
}; \
|
||||||
|
(_res) += (d)[i]; \
|
||||||
|
(numOfElem)++; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
void sumFunction(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;
|
||||||
|
|
||||||
|
SSumRes* pSumRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
|
||||||
|
|
||||||
|
if (pInput->colDataAggIsSet) {
|
||||||
|
numOfElem = pInput->numOfRows - pAgg->numOfNull;
|
||||||
|
ASSERT(numOfElem >= 0);
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
pSumRes->isum += pAgg->sum;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
pSumRes->usum += pAgg->sum;
|
||||||
|
} else if (IS_FLOAT_TYPE(type)) {
|
||||||
|
pSumRes->dsum += GET_DOUBLE_VAL((const char*)&(pAgg->sum));
|
||||||
|
}
|
||||||
|
} else { // computing based on the true data block
|
||||||
|
SColumnInfoData* pCol = pInput->pData[0];
|
||||||
|
|
||||||
|
int32_t start = pInput->startRowIndex;
|
||||||
|
int32_t numOfRows = pInput->numOfRows;
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (type == TSDB_DATA_TYPE_TINYINT) {
|
||||||
|
LIST_ADD_N(pSumRes->isum, pCol, start, numOfRows, int8_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_SMALLINT) {
|
||||||
|
LIST_ADD_N(pSumRes->isum, pCol, start, numOfRows, int16_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_INT) {
|
||||||
|
LIST_ADD_N(pSumRes->isum, pCol, start, numOfRows, int32_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BIGINT) {
|
||||||
|
LIST_ADD_N(pSumRes->isum, pCol, start, numOfRows, int64_t, numOfElem);
|
||||||
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (type == TSDB_DATA_TYPE_UTINYINT) {
|
||||||
|
LIST_ADD_N(pSumRes->usum, pCol, start, numOfRows, uint8_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_USMALLINT) {
|
||||||
|
LIST_ADD_N(pSumRes->usum, pCol, start, numOfRows, uint16_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_UINT) {
|
||||||
|
LIST_ADD_N(pSumRes->usum, pCol, start, numOfRows, uint32_t, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_UBIGINT) {
|
||||||
|
LIST_ADD_N(pSumRes->usum, pCol, start, numOfRows, uint64_t, numOfElem);
|
||||||
|
}
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
LIST_ADD_N(pSumRes->dsum, pCol, start, numOfRows, double, numOfElem);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_FLOAT) {
|
||||||
|
LIST_ADD_N(pSumRes->dsum, pCol, start, numOfRows, float, numOfElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// data in the check operation are all null, not output
|
||||||
|
SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getSumFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
pEnv->calcMemSize = sizeof(SSumRes);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool maxFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
|
if (!functionSetup(pCtx, pResultInfo)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResultInfo);
|
||||||
|
switch (pCtx->resDataInfo.type) {
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
*((int32_t *)buf) = INT32_MIN;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
*((uint32_t *)buf) = 0;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
*((float *)buf) = -FLT_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
SET_DOUBLE_VAL(((double *)buf), -DBL_MAX);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
*((int64_t *)buf) = INT64_MIN;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
*((uint64_t *)buf) = 0;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
*((int16_t *)buf) = INT16_MIN;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
*((uint16_t *)buf) = 0;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
*((int8_t *)buf) = INT8_MIN;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
*((uint8_t *)buf) = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool minFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
|
if (!functionSetup(pCtx, pResultInfo)) {
|
||||||
|
return false; // not initialized since it has been initialized
|
||||||
|
}
|
||||||
|
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResultInfo);
|
||||||
|
switch (pCtx->resDataInfo.type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
*((int8_t *)buf) = INT8_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
*(uint8_t *) buf = UINT8_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
*((int16_t *)buf) = INT16_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
*((uint16_t *)buf) = UINT16_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
*((int32_t *)buf) = INT32_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
*((uint32_t *)buf) = UINT32_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
*((int64_t *)buf) = INT64_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
*((uint64_t *)buf) = UINT64_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
*((float *)buf) = FLT_MAX;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
SET_DOUBLE_VAL(((double *)buf), DBL_MAX);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getMinmaxFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
SNode* pNode = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
pEnv->calcMemSize = sizeof(int64_t);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GET_TS_LIST(x) ((TSKEY*)((x)->ptsList))
|
||||||
|
#define GET_TS_DATA(x, y) (GET_TS_LIST(x)[(y)])
|
||||||
|
|
||||||
|
#define DO_UPDATE_TAG_COLUMNS_WITHOUT_TS(ctx) \
|
||||||
|
do { \
|
||||||
|
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
|
||||||
|
SqlFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
|
||||||
|
__ctx->fpSet.process(__ctx); \
|
||||||
|
} \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#define DO_UPDATE_SUBSID_RES(ctx, ts) \
|
||||||
|
do { \
|
||||||
|
for (int32_t _i = 0; _i < (ctx)->subsidiaryRes.numOfCols; ++_i) { \
|
||||||
|
SqlFunctionCtx *__ctx = (ctx)->subsidiaryRes.pCtx[_i]; \
|
||||||
|
if (__ctx->functionId == FUNCTION_TS_DUMMY) { \
|
||||||
|
__ctx->tag.i = (ts); \
|
||||||
|
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
|
||||||
|
} \
|
||||||
|
__ctx->fpSet.process(__ctx); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UPDATE_DATA(ctx, left, right, num, sign, _ts) \
|
||||||
|
do { \
|
||||||
|
if (((left) < (right)) ^ (sign)) { \
|
||||||
|
(left) = (right); \
|
||||||
|
DO_UPDATE_SUBSID_RES(ctx, _ts); \
|
||||||
|
(num) += 1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LOOPCHECK_N(val, _col, ctx, _t, _nrow, _start, sign, num) \
|
||||||
|
do { \
|
||||||
|
_t* d = (_t*)((_col)->pData); \
|
||||||
|
for (int32_t i = (_start); i < (_nrow) + (_start); ++i) { \
|
||||||
|
if (((_col)->hasNull) && colDataIsNull_f((_col)->nullbitmap, i)) { \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
TSKEY ts = (ctx)->ptsList != NULL ? GET_TS_DATA(ctx, i) : 0; \
|
||||||
|
UPDATE_DATA(ctx, val, d[i], num, sign, ts); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
int32_t doMinMaxHelper(SqlFunctionCtx *pCtx, int32_t isMinFunc) {
|
||||||
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
SColumnDataAgg *pAgg = pInput->pColumnDataAgg[0];
|
||||||
|
|
||||||
|
SColumnInfoData* pCol = pInput->pData[0];
|
||||||
|
int32_t type = pCol->info.type;
|
||||||
|
|
||||||
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
// data in current data block are qualified to the query
|
||||||
|
if (pInput->colDataAggIsSet) {
|
||||||
|
numOfElems = pInput->numOfRows - pAgg->numOfNull;
|
||||||
|
ASSERT(pInput->numOfRows == pInput->totalRows && numOfElems >= 0);
|
||||||
|
|
||||||
|
if (numOfElems == 0) {
|
||||||
|
return numOfElems;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* tval = NULL;
|
||||||
|
int16_t index = 0;
|
||||||
|
|
||||||
|
if (isMinFunc) {
|
||||||
|
tval = &pInput->pColumnDataAgg[0]->min;
|
||||||
|
index = pInput->pColumnDataAgg[0]->minIndex;
|
||||||
|
} else {
|
||||||
|
tval = &pInput->pColumnDataAgg[0]->max;
|
||||||
|
index = pInput->pColumnDataAgg[0]->maxIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
TSKEY key = TSKEY_INITIAL_VAL;
|
||||||
|
if (pCtx->ptsList != NULL) {
|
||||||
|
// the index is the original position, not the relative position
|
||||||
|
key = pCtx->ptsList[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
int64_t val = GET_INT64_VAL(tval);
|
||||||
|
|
||||||
|
#if defined(_DEBUG_VIEW)
|
||||||
|
qDebug("max value updated according to pre-cal:%d", *data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((*(int64_t*)buf < val) ^ isMinFunc) {
|
||||||
|
*(int64_t*) buf = val;
|
||||||
|
for (int32_t i = 0; i < (pCtx)->subsidiaryRes.numOfCols; ++i) {
|
||||||
|
SqlFunctionCtx* __ctx = pCtx->subsidiaryRes.pCtx[i];
|
||||||
|
if (__ctx->functionId == FUNCTION_TS_DUMMY) { // TODO refactor
|
||||||
|
__ctx->tag.i = key;
|
||||||
|
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
__ctx->fpSet.process(__ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
uint64_t val = GET_UINT64_VAL(tval);
|
||||||
|
UPDATE_DATA(pCtx, *(uint64_t*)buf, val, numOfElems, isMinFunc, key);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
double val = GET_DOUBLE_VAL(tval);
|
||||||
|
UPDATE_DATA(pCtx, *(double*)buf, val, numOfElems, isMinFunc, key);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_FLOAT) {
|
||||||
|
double val = GET_DOUBLE_VAL(tval);
|
||||||
|
UPDATE_DATA(pCtx, *(float*)buf, (float)val, numOfElems, isMinFunc, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return numOfElems;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t start = pInput->startRowIndex;
|
||||||
|
int32_t numOfRows = pInput->numOfRows;
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (type == TSDB_DATA_TYPE_TINYINT) {
|
||||||
|
LOOPCHECK_N(*(int8_t*)buf, pCol, pCtx, int8_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_SMALLINT) {
|
||||||
|
LOOPCHECK_N(*(int16_t*) buf, pCol, pCtx, int16_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_INT) {
|
||||||
|
int32_t *pData = (int32_t*)pCol->pData;
|
||||||
|
int32_t *val = (int32_t*) buf;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
|
if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*val < pData[i]) ^ isMinFunc) {
|
||||||
|
*val = pData[i];
|
||||||
|
TSKEY ts = (pCtx->ptsList != NULL)? GET_TS_DATA(pCtx, i) : 0;
|
||||||
|
DO_UPDATE_SUBSID_RES(pCtx, ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElems += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_DEBUG_VIEW)
|
||||||
|
qDebug("max value updated:%d", *retVal);
|
||||||
|
#endif
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BIGINT) {
|
||||||
|
LOOPCHECK_N(*(int64_t*) buf, pCol, pCtx, int64_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (type == TSDB_DATA_TYPE_UTINYINT) {
|
||||||
|
LOOPCHECK_N(*(uint8_t*) buf, pCol, pCtx, uint8_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_USMALLINT) {
|
||||||
|
LOOPCHECK_N(*(uint16_t*) buf, pCol, pCtx, uint16_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_UINT) {
|
||||||
|
LOOPCHECK_N(*(uint32_t*) buf, pCol, pCtx, uint32_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_UBIGINT) {
|
||||||
|
LOOPCHECK_N(*(uint64_t*) buf, pCol, pCtx, uint64_t, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
}
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
LOOPCHECK_N(*(double*) buf, pCol, pCtx, double, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_FLOAT) {
|
||||||
|
LOOPCHECK_N(*(float*) buf, pCol, pCtx, float, numOfRows, start, isMinFunc, numOfElems);
|
||||||
|
}
|
||||||
|
|
||||||
|
return numOfElems;
|
||||||
|
}
|
||||||
|
|
||||||
|
void minFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
int32_t numOfElems = doMinMaxHelper(pCtx, 1);
|
||||||
|
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void maxFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
int32_t numOfElems = doMinMaxHelper(pCtx, 0);
|
||||||
|
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
|
||||||
|
}
|
|
@ -26,18 +26,27 @@ typedef struct SFuncMgtService {
|
||||||
} SFuncMgtService;
|
} SFuncMgtService;
|
||||||
|
|
||||||
static SFuncMgtService gFunMgtService;
|
static SFuncMgtService gFunMgtService;
|
||||||
|
static pthread_once_t functionHashTableInit = PTHREAD_ONCE_INIT;
|
||||||
|
static int32_t initFunctionCode = 0;
|
||||||
|
|
||||||
int32_t fmFuncMgtInit() {
|
static void doInitFunctionHashTable() {
|
||||||
gFunMgtService.pFuncNameHashTable = taosHashInit(funcMgtBuiltinsNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
gFunMgtService.pFuncNameHashTable = taosHashInit(funcMgtBuiltinsNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
if (NULL == gFunMgtService.pFuncNameHashTable) {
|
if (NULL == gFunMgtService.pFuncNameHashTable) {
|
||||||
return TSDB_CODE_FAILED;
|
initFunctionCode = TSDB_CODE_FAILED;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < funcMgtBuiltinsNum; ++i) {
|
for (int32_t i = 0; i < funcMgtBuiltinsNum; ++i) {
|
||||||
if (TSDB_CODE_SUCCESS != taosHashPut(gFunMgtService.pFuncNameHashTable, funcMgtBuiltins[i].name, strlen(funcMgtBuiltins[i].name), &i, sizeof(int32_t))) {
|
if (TSDB_CODE_SUCCESS != taosHashPut(gFunMgtService.pFuncNameHashTable, funcMgtBuiltins[i].name, strlen(funcMgtBuiltins[i].name), &i, sizeof(int32_t))) {
|
||||||
return TSDB_CODE_FAILED;
|
initFunctionCode = TSDB_CODE_FAILED;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
}
|
||||||
|
|
||||||
|
int32_t fmFuncMgtInit() {
|
||||||
|
pthread_once(&functionHashTableInit, doInitFunctionHashTable);
|
||||||
|
return initFunctionCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType) {
|
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType) {
|
||||||
|
@ -85,3 +94,10 @@ bool fmIsAggFunc(int32_t funcId) {
|
||||||
}
|
}
|
||||||
return FUNC_MGT_TEST_MASK(funcMgtBuiltins[funcId].classification, FUNC_MGT_AGG_FUNC);
|
return FUNC_MGT_TEST_MASK(funcMgtBuiltins[funcId].classification, FUNC_MGT_AGG_FUNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fmFuncMgtDestroy() {
|
||||||
|
void* m = gFunMgtService.pFuncNameHashTable;
|
||||||
|
if (m != NULL && atomic_val_compare_exchange_ptr(&gFunMgtService.pFuncNameHashTable, m, 0) == m) {
|
||||||
|
taosHashCleanup(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -543,7 +543,7 @@ struct SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfOutput, co
|
||||||
pFillCol[i].col.offset = offset;
|
pFillCol[i].col.offset = offset;
|
||||||
pFillCol[i].col.colId = pExprInfo->base.resSchema.colId;
|
pFillCol[i].col.colId = pExprInfo->base.resSchema.colId;
|
||||||
pFillCol[i].tagIndex = -2;
|
pFillCol[i].tagIndex = -2;
|
||||||
pFillCol[i].flag = pExprInfo->base.pColumns->flag; // always be the normal column for table query
|
pFillCol[i].flag = pExprInfo->base.pParam[0].pCol->flag; // always be the normal column for table query
|
||||||
// pFillCol[i].functionId = pExprInfo->pExpr->_function.functionId;
|
// pFillCol[i].functionId = pExprInfo->pExpr->_function.functionId;
|
||||||
pFillCol[i].fillVal.i = fillVal[i];
|
pFillCol[i].fillVal.i = fillVal[i];
|
||||||
|
|
||||||
|
|
|
@ -341,6 +341,8 @@ static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* query, SArray** result
|
||||||
// TODO: iterator mem and tidex
|
// TODO: iterator mem and tidex
|
||||||
STermValueType s = kTypeValue;
|
STermValueType s = kTypeValue;
|
||||||
|
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
SIdxTempResult* tr = sIdxTempResultCreate();
|
SIdxTempResult* tr = sIdxTempResultCreate();
|
||||||
if (0 == indexCacheSearch(cache, query, tr, &s)) {
|
if (0 == indexCacheSearch(cache, query, tr, &s)) {
|
||||||
if (s == kTypeDeletion) {
|
if (s == kTypeDeletion) {
|
||||||
|
@ -348,17 +350,23 @@ static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* query, SArray** result
|
||||||
// coloum already drop by other oper, no need to query tindex
|
// coloum already drop by other oper, no need to query tindex
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
st = taosGetTimestampUs();
|
||||||
if (0 != indexTFileSearch(sIdx->tindex, query, tr)) {
|
if (0 != indexTFileSearch(sIdx->tindex, query, tr)) {
|
||||||
indexError("corrupt at index(TFile) col:%s val: %s", term->colName, term->colVal);
|
indexError("corrupt at index(TFile) col:%s val: %s", term->colName, term->colVal);
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
int64_t tfCost = taosGetTimestampUs() - st;
|
||||||
|
indexInfo("tfile search cost: %" PRIu64 "us", tfCost);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
indexError("corrupt at index(cache) col:%s val: %s", term->colName, term->colVal);
|
indexError("corrupt at index(cache) col:%s val: %s", term->colName, term->colVal);
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
int64_t cost = taosGetTimestampUs() - st;
|
||||||
|
indexInfo("search cost: %" PRIu64 "us", cost);
|
||||||
|
|
||||||
sIdxTempResultMergeTo(*result, tr);
|
sIdxTempResultMergeTo(*result, tr);
|
||||||
|
|
||||||
sIdxTempResultDestroy(tr);
|
sIdxTempResultDestroy(tr);
|
||||||
return 0;
|
return 0;
|
||||||
END:
|
END:
|
||||||
|
|
|
@ -276,7 +276,12 @@ static int indexQueryMem(MemTable* mem, CacheTerm* ct, EIndexQueryType qtype, SI
|
||||||
} else if (c->operaType == DEL_VALUE) {
|
} else if (c->operaType == DEL_VALUE) {
|
||||||
INDEX_MERGE_ADD_DEL(tr->added, tr->deled, c->uid)
|
INDEX_MERGE_ADD_DEL(tr->added, tr->deled, c->uid)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
} else if (qtype == QUERY_PREFIX) {
|
||||||
|
} else if (qtype == QUERY_SUFFIX) {
|
||||||
|
} else if (qtype == QUERY_RANGE) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,6 +289,7 @@ static int indexQueryMem(MemTable* mem, CacheTerm* ct, EIndexQueryType qtype, SI
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int indexCacheSearch(void* cache, SIndexTermQuery* query, SIdxTempResult* result, STermValueType* s) {
|
int indexCacheSearch(void* cache, SIndexTermQuery* query, SIdxTempResult* result, STermValueType* s) {
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
if (cache == NULL) {
|
if (cache == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -312,12 +318,14 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, SIdxTempResult* result
|
||||||
// continue search in imm
|
// continue search in imm
|
||||||
ret = indexQueryMem(imm, &ct, qtype, result, s);
|
ret = indexQueryMem(imm, &ct, qtype, result, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasJson) {
|
if (hasJson) {
|
||||||
tfree(p);
|
tfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
indexMemUnRef(mem);
|
indexMemUnRef(mem);
|
||||||
indexMemUnRef(imm);
|
indexMemUnRef(imm);
|
||||||
|
indexInfo("cache search, time cost %" PRIu64 "us", taosGetTimestampUs() - st);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,7 +189,7 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SIdxTempResul
|
||||||
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON);
|
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON);
|
||||||
EIndexQueryType qtype = query->qType;
|
EIndexQueryType qtype = query->qType;
|
||||||
|
|
||||||
SArray* result = taosArrayInit(16, sizeof(uint64_t));
|
// SArray* result = taosArrayInit(16, sizeof(uint64_t));
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
// refactor to callback later
|
// refactor to callback later
|
||||||
if (qtype == QUERY_TERM) {
|
if (qtype == QUERY_TERM) {
|
||||||
|
@ -200,11 +200,18 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SIdxTempResul
|
||||||
p = indexPackJsonData(term);
|
p = indexPackJsonData(term);
|
||||||
sz = strlen(p);
|
sz = strlen(p);
|
||||||
}
|
}
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
FstSlice key = fstSliceCreate(p, sz);
|
FstSlice key = fstSliceCreate(p, sz);
|
||||||
if (fstGet(reader->fst, &key, &offset)) {
|
if (fstGet(reader->fst, &key, &offset)) {
|
||||||
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, found table info in tindex", term->suid, term->colName,
|
int64_t et = taosGetTimestampUs();
|
||||||
term->colVal);
|
int64_t cost = et - st;
|
||||||
ret = tfileReaderLoadTableIds(reader, offset, result);
|
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, found table info in tindex, time cost: %" PRIu64 "us",
|
||||||
|
term->suid, term->colName, term->colVal, cost);
|
||||||
|
|
||||||
|
ret = tfileReaderLoadTableIds(reader, offset, tr->total);
|
||||||
|
cost = taosGetTimestampUs() - et;
|
||||||
|
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, load all table info, time cost: %" PRIu64 "us", term->suid,
|
||||||
|
term->colName, term->colVal, cost);
|
||||||
} else {
|
} else {
|
||||||
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, not found table info in tindex", term->suid, term->colName,
|
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, not found table info in tindex", term->suid, term->colName,
|
||||||
term->colVal);
|
term->colVal);
|
||||||
|
@ -225,8 +232,8 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SIdxTempResul
|
||||||
}
|
}
|
||||||
tfileReaderUnRef(reader);
|
tfileReaderUnRef(reader);
|
||||||
|
|
||||||
taosArrayAddAll(tr->total, result);
|
// taosArrayAddAll(tr->total, result);
|
||||||
taosArrayDestroy(result);
|
// taosArrayDestroy(result);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -391,6 +398,7 @@ int indexTFileSearch(void* tfile, SIndexTermQuery* query, SIdxTempResult* result
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
IndexTFile* pTfile = tfile;
|
IndexTFile* pTfile = tfile;
|
||||||
|
|
||||||
SIndexTerm* term = query->term;
|
SIndexTerm* term = query->term;
|
||||||
|
@ -399,6 +407,8 @@ int indexTFileSearch(void* tfile, SIndexTermQuery* query, SIdxTempResult* result
|
||||||
if (reader == NULL) {
|
if (reader == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int64_t cost = taosGetTimestampUs() - st;
|
||||||
|
indexInfo("index tfile stage 1 cost: %" PRId64 "", cost);
|
||||||
|
|
||||||
return tfileReaderSearch(reader, query, result);
|
return tfileReaderSearch(reader, query, result);
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue