Merge branch '3.0' into fix/TD-29995-3.0
This commit is contained in:
commit
3b8c27764d
|
@ -47,27 +47,20 @@ IF(${TD_WINDOWS})
|
||||||
|
|
||||||
MESSAGE("build wingetopt Win32")
|
MESSAGE("build wingetopt Win32")
|
||||||
option(
|
option(
|
||||||
BUILD_WINGETOPT
|
BUILD_WINGETOPT
|
||||||
"If build wingetopt on Windows"
|
"If build wingetopt on Windows"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
TDENGINE_3
|
TDENGINE_3
|
||||||
"TDengine 3.x for taos-tools"
|
"TDengine 3.x for taos-tools"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_CRASHDUMP
|
BUILD_CRASHDUMP
|
||||||
"If build crashdump on Windows"
|
"If build crashdump on Windows"
|
||||||
ON
|
|
||||||
)
|
|
||||||
|
|
||||||
MESSAGE("build geos Win32")
|
|
||||||
option(
|
|
||||||
BUILD_GEOS
|
|
||||||
"If build geos on Windows"
|
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -79,7 +72,7 @@ ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_GEOS
|
BUILD_GEOS
|
||||||
"If build geos on Windows"
|
"If build with geos"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -95,6 +88,12 @@ option(
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
option(
|
||||||
|
BUILD_PCRE2
|
||||||
|
"If build with pcre2"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
JEMALLOC_ENABLED
|
JEMALLOC_ENABLED
|
||||||
"If build with jemalloc"
|
"If build with jemalloc"
|
||||||
|
@ -114,14 +113,14 @@ option(
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LEVELDB
|
BUILD_WITH_LEVELDB
|
||||||
"If build with leveldb"
|
"If build with leveldb"
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_ROCKSDB
|
BUILD_WITH_ROCKSDB
|
||||||
"If build with rocksdb"
|
"If build with rocksdb"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -170,46 +169,46 @@ ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_SQLITE
|
BUILD_WITH_SQLITE
|
||||||
"If build with sqlite"
|
"If build with sqlite"
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_BDB
|
BUILD_WITH_BDB
|
||||||
"If build with BDB"
|
"If build with BDB"
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LUCENE
|
BUILD_WITH_LUCENE
|
||||||
"If build with lucene"
|
"If build with lucene"
|
||||||
off
|
off
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_NURAFT
|
BUILD_WITH_NURAFT
|
||||||
"If build with NuRaft"
|
"If build with NuRaft"
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_UV
|
BUILD_WITH_UV
|
||||||
"If build with libuv"
|
"If build with libuv"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_UV_TRANS
|
BUILD_WITH_UV_TRANS
|
||||||
"If build with libuv_trans "
|
"If build with libuv_trans "
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
IF(${TD_LINUX} MATCHES TRUE)
|
IF(${TD_LINUX} MATCHES TRUE)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_DEPENDENCY_TESTS
|
BUILD_DEPENDENCY_TESTS
|
||||||
"If build dependency tests"
|
"If build dependency tests"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -217,14 +216,14 @@ ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_DOCS
|
BUILD_DOCS
|
||||||
"If use doxygen build documents"
|
"If use doxygen build documents"
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_INVERTEDINDEX
|
BUILD_WITH_INVERTEDINDEX
|
||||||
"If use invertedIndex"
|
"If use invertedIndex"
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# pcre2
|
||||||
|
ExternalProject_Add(pcre2
|
||||||
|
GIT_REPOSITORY https://github.com/PCRE2Project/pcre2.git
|
||||||
|
GIT_TAG pcre2-10.43
|
||||||
|
SOURCE_DIR "${TD_CONTRIB_DIR}/pcre2"
|
||||||
|
#BINARY_DIR "${TD_CONTRIB_DIR}/pcre2"
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -121,7 +121,7 @@ if (${BUILD_CONTRIB})
|
||||||
cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
add_definitions(-DUSE_ROCKSDB)
|
add_definitions(-DUSE_ROCKSDB)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
if (NOT ${TD_LINUX})
|
if (NOT ${TD_LINUX})
|
||||||
if(${BUILD_WITH_ROCKSDB})
|
if(${BUILD_WITH_ROCKSDB})
|
||||||
cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
@ -183,6 +183,11 @@ if(${BUILD_GEOS})
|
||||||
cat("${TD_SUPPORT_DIR}/geos_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${TD_SUPPORT_DIR}/geos_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#
|
||||||
|
if(${BUILD_PCRE2})
|
||||||
|
cat("${TD_SUPPORT_DIR}/pcre2_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
|
endif()
|
||||||
|
|
||||||
# download dependencies
|
# download dependencies
|
||||||
configure_file(${CONTRIB_TMP_FILE} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt")
|
configure_file(${CONTRIB_TMP_FILE} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt")
|
||||||
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
|
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
|
||||||
|
@ -270,8 +275,8 @@ unset(CMAKE_PROJECT_INCLUDE_BEFORE)
|
||||||
# add_subdirectory(xz EXCLUDE_FROM_ALL)
|
# add_subdirectory(xz EXCLUDE_FROM_ALL)
|
||||||
# target_include_directories(
|
# target_include_directories(
|
||||||
# xz
|
# xz
|
||||||
# PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/xz
|
# PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/xz
|
||||||
# PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/xz
|
# PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/xz
|
||||||
# )
|
# )
|
||||||
|
|
||||||
# leveldb
|
# leveldb
|
||||||
|
@ -351,7 +356,7 @@ if (${BUILD_WITH_ROCKSDB})
|
||||||
rocksdb
|
rocksdb
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include>
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include>
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
if (NOT ${TD_LINUX})
|
if (NOT ${TD_LINUX})
|
||||||
MESSAGE(STATUS "ROCKSDB CXX STATUS CONFIG: " ${CMAKE_CXX_FLAGS})
|
MESSAGE(STATUS "ROCKSDB CXX STATUS CONFIG: " ${CMAKE_CXX_FLAGS})
|
||||||
MESSAGE(STATUS "ROCKSDB C STATUS CONFIG: " ${CMAKE_C_FLAGS})
|
MESSAGE(STATUS "ROCKSDB C STATUS CONFIG: " ${CMAKE_C_FLAGS})
|
||||||
|
@ -400,8 +405,8 @@ if (${BUILD_WITH_ROCKSDB})
|
||||||
rocksdb
|
rocksdb
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include>
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/rocksdb/include>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -605,6 +610,10 @@ if(${BUILD_GEOS})
|
||||||
)
|
)
|
||||||
endif(${BUILD_GEOS})
|
endif(${BUILD_GEOS})
|
||||||
|
|
||||||
|
if (${BUILD_PCRE2})
|
||||||
|
add_subdirectory(pcre2 EXCLUDE_FROM_ALL)
|
||||||
|
endif(${BUILD_PCRE2})
|
||||||
|
|
||||||
# ================================================================================================
|
# ================================================================================================
|
||||||
# Build test
|
# Build test
|
||||||
# ================================================================================================
|
# ================================================================================================
|
||||||
|
|
|
@ -95,6 +95,15 @@ const static uint8_t BIT2_MAP[4] = {0b11111100, 0b11110011, 0b11001111, 0b001111
|
||||||
#define COL_VAL_IS_NULL(CV) ((CV)->flag == CV_FLAG_NULL)
|
#define COL_VAL_IS_NULL(CV) ((CV)->flag == CV_FLAG_NULL)
|
||||||
#define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE)
|
#define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE)
|
||||||
|
|
||||||
|
#define tRowGetKey(_pRow, _pKey) \
|
||||||
|
do { \
|
||||||
|
(_pKey)->ts = (_pRow)->ts; \
|
||||||
|
(_pKey)->numOfPKs = 0; \
|
||||||
|
if ((_pRow)->numOfPKs > 0) { \
|
||||||
|
tRowGetPrimaryKey((_pRow), (_pKey)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// SValueColumn ================================
|
// SValueColumn ================================
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t cmprAlg; // filled by caller
|
int8_t cmprAlg; // filled by caller
|
||||||
|
@ -125,8 +134,8 @@ void tRowDestroy(SRow *pRow);
|
||||||
int32_t tRowSort(SArray *aRowP);
|
int32_t tRowSort(SArray *aRowP);
|
||||||
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag);
|
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag);
|
||||||
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag);
|
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag);
|
||||||
void tRowGetKey(SRow *pRow, SRowKey *key);
|
void tRowGetPrimaryKey(SRow *pRow, SRowKey *key);
|
||||||
int32_t tRowKeyCompare(const void *p1, const void *p2);
|
int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2);
|
||||||
int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc);
|
int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc);
|
||||||
|
|
||||||
// SRowIter ================================
|
// SRowIter ================================
|
||||||
|
|
|
@ -258,7 +258,7 @@ extern bool tsExperimental;
|
||||||
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
|
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
|
||||||
const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc);
|
const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc);
|
||||||
int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs,
|
int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs,
|
||||||
bool tsc);
|
bool tsc, bool isDumpCfg);
|
||||||
void taosCleanupCfg();
|
void taosCleanupCfg();
|
||||||
|
|
||||||
int32_t taosCfgDynamicOptions(SConfig *pCfg, const char *name, bool forServer);
|
int32_t taosCfgDynamicOptions(SConfig *pCfg, const char *name, bool forServer);
|
||||||
|
|
|
@ -56,6 +56,10 @@ typedef enum {
|
||||||
TSDB_GRANT_VIEW,
|
TSDB_GRANT_VIEW,
|
||||||
TSDB_GRANT_MULTI_TIER,
|
TSDB_GRANT_MULTI_TIER,
|
||||||
TSDB_GRANT_BACKUP_RESTORE,
|
TSDB_GRANT_BACKUP_RESTORE,
|
||||||
|
TSDB_GRANT_OBJECT_STORAGE,
|
||||||
|
TSDB_GRANT_ACTIVE_ACTIVE,
|
||||||
|
TSDB_GRANT_DUAL_REPLICA_HA,
|
||||||
|
TSDB_GRANT_DB_ENCRYPTION,
|
||||||
} EGrantType;
|
} EGrantType;
|
||||||
|
|
||||||
int32_t checkAndGetCryptKey(const char *encryptCode, const char *machineId, char **key);
|
int32_t checkAndGetCryptKey(const char *encryptCode, const char *machineId, char **key);
|
||||||
|
|
|
@ -329,6 +329,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_SHOW_DB_ALIVE_STMT,
|
QUERY_NODE_SHOW_DB_ALIVE_STMT,
|
||||||
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT,
|
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT,
|
||||||
QUERY_NODE_BALANCE_VGROUP_LEADER_STMT,
|
QUERY_NODE_BALANCE_VGROUP_LEADER_STMT,
|
||||||
|
QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT,
|
||||||
QUERY_NODE_RESTORE_DNODE_STMT,
|
QUERY_NODE_RESTORE_DNODE_STMT,
|
||||||
QUERY_NODE_RESTORE_QNODE_STMT,
|
QUERY_NODE_RESTORE_QNODE_STMT,
|
||||||
QUERY_NODE_RESTORE_MNODE_STMT,
|
QUERY_NODE_RESTORE_MNODE_STMT,
|
||||||
|
@ -2425,10 +2426,11 @@ int32_t tDeserializeSRedistributeVgroupReq(void* buf, int32_t bufLen, SRedistrib
|
||||||
void tFreeSRedistributeVgroupReq(SRedistributeVgroupReq* pReq);
|
void tFreeSRedistributeVgroupReq(SRedistributeVgroupReq* pReq);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t useless;
|
int32_t reserved;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t sqlLen;
|
int32_t sqlLen;
|
||||||
char* sql;
|
char* sql;
|
||||||
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
} SBalanceVgroupLeaderReq;
|
} SBalanceVgroupLeaderReq;
|
||||||
|
|
||||||
int32_t tSerializeSBalanceVgroupLeaderReq(void* buf, int32_t bufLen, SBalanceVgroupLeaderReq* pReq);
|
int32_t tSerializeSBalanceVgroupLeaderReq(void* buf, int32_t bufLen, SBalanceVgroupLeaderReq* pReq);
|
||||||
|
|
|
@ -582,6 +582,7 @@ typedef struct SBalanceVgroupStmt {
|
||||||
typedef struct SBalanceVgroupLeaderStmt {
|
typedef struct SBalanceVgroupLeaderStmt {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
} SBalanceVgroupLeaderStmt;
|
} SBalanceVgroupLeaderStmt;
|
||||||
|
|
||||||
typedef struct SMergeVgroupStmt {
|
typedef struct SMergeVgroupStmt {
|
||||||
|
|
|
@ -33,6 +33,13 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
||||||
int tsem_post(tsem_t *sem);
|
int tsem_post(tsem_t *sem);
|
||||||
int tsem_destroy(tsem_t *sem);
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
|
||||||
|
#define tsem2_t tsem_t
|
||||||
|
#define tsem2_init tsem_init
|
||||||
|
#define tsem2_wait tsem_wait
|
||||||
|
#define tsem2_timewait tsem_timewait
|
||||||
|
#define tsem2_post tsem_post
|
||||||
|
#define tsem2_destroy tsem_destroy
|
||||||
|
|
||||||
#elif defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#elif defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
@ -44,6 +51,13 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
||||||
int tsem_post(tsem_t *sem);
|
int tsem_post(tsem_t *sem);
|
||||||
int tsem_destroy(tsem_t *sem);
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
|
||||||
|
#define tsem2_t tsem_t
|
||||||
|
#define tsem2_init tsem_init
|
||||||
|
#define tsem2_wait tsem_wait
|
||||||
|
#define tsem2_timewait tsem_timewait
|
||||||
|
#define tsem2_post tsem_post
|
||||||
|
#define tsem2_destroy tsem_destroy
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define tsem_t sem_t
|
#define tsem_t sem_t
|
||||||
|
@ -53,6 +67,20 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
||||||
#define tsem_post sem_post
|
#define tsem_post sem_post
|
||||||
#define tsem_destroy sem_destroy
|
#define tsem_destroy sem_destroy
|
||||||
|
|
||||||
|
typedef struct tsem2_t {
|
||||||
|
TdThreadMutex mutex;
|
||||||
|
TdThreadCond cond;
|
||||||
|
TdThreadCondAttr attr;
|
||||||
|
int count;
|
||||||
|
} tsem2_t;
|
||||||
|
|
||||||
|
// #define tsem2_t sem_t
|
||||||
|
int tsem2_init(tsem2_t* sem, int pshared, unsigned int value);
|
||||||
|
int tsem2_wait(tsem2_t* sem);
|
||||||
|
int tsem2_timewait(tsem2_t* sem, int64_t milis);
|
||||||
|
int tsem2_post(tsem2_t* sem);
|
||||||
|
int tsem2_destroy(tsem2_t* sem);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
|
|
|
@ -222,6 +222,7 @@ int32_t taosThreadCondTimedWait(TdThreadCond *cond, TdThreadMutex *mutex, const
|
||||||
int32_t taosThreadCondAttrDestroy(TdThreadCondAttr *attr);
|
int32_t taosThreadCondAttrDestroy(TdThreadCondAttr *attr);
|
||||||
int32_t taosThreadCondAttrGetPshared(const TdThreadCondAttr *attr, int32_t *pshared);
|
int32_t taosThreadCondAttrGetPshared(const TdThreadCondAttr *attr, int32_t *pshared);
|
||||||
int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr);
|
int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr);
|
||||||
|
int32_t taosThreadCondAttrSetclock(TdThreadCondAttr *attr, int clockId);
|
||||||
int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared);
|
int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared);
|
||||||
int32_t taosThreadDetach(TdThread thread);
|
int32_t taosThreadDetach(TdThread thread);
|
||||||
int32_t taosThreadEqual(TdThread t1, TdThread t2);
|
int32_t taosThreadEqual(TdThread t1, TdThread t2);
|
||||||
|
|
|
@ -327,6 +327,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_MND_DB_IN_CREATING TAOS_DEF_ERROR_CODE(0, 0x0396) //
|
#define TSDB_CODE_MND_DB_IN_CREATING TAOS_DEF_ERROR_CODE(0, 0x0396) //
|
||||||
#define TSDB_CODE_MND_INVALID_SYS_TABLENAME TAOS_DEF_ERROR_CODE(0, 0x039A)
|
#define TSDB_CODE_MND_INVALID_SYS_TABLENAME TAOS_DEF_ERROR_CODE(0, 0x039A)
|
||||||
#define TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE TAOS_DEF_ERROR_CODE(0, 0x039B)
|
#define TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE TAOS_DEF_ERROR_CODE(0, 0x039B)
|
||||||
|
#define TSDB_CODE_MND_DB_ENCRYPT_GRANT_EXPIRED TAOS_DEF_ERROR_CODE(0, 0x039C)
|
||||||
|
|
||||||
// mnode-node
|
// mnode-node
|
||||||
#define TSDB_CODE_MND_MNODE_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03A0)
|
#define TSDB_CODE_MND_MNODE_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03A0)
|
||||||
|
|
|
@ -21,6 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <geos_c.h>
|
#include <geos_c.h>
|
||||||
|
#include <tpcre2.h>
|
||||||
|
|
||||||
typedef struct SGeosContext {
|
typedef struct SGeosContext {
|
||||||
GEOSContextHandle_t handle;
|
GEOSContextHandle_t handle;
|
||||||
|
@ -31,6 +32,9 @@ typedef struct SGeosContext {
|
||||||
GEOSWKBReader *WKBReader;
|
GEOSWKBReader *WKBReader;
|
||||||
GEOSWKBWriter *WKBWriter;
|
GEOSWKBWriter *WKBWriter;
|
||||||
|
|
||||||
|
pcre2_code *WKTRegex;
|
||||||
|
pcre2_match_data *WKTMatchData;
|
||||||
|
|
||||||
char errMsg[512];
|
char errMsg[512];
|
||||||
} SGeosContext;
|
} SGeosContext;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* 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_ULIT_PCRE2_H_
|
||||||
|
#define _TD_ULIT_PCRE2_H_
|
||||||
|
|
||||||
|
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
|
#include "pcre2.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int32_t doRegComp(pcre2_code** ppRegex, pcre2_match_data** ppMatchData, const char* pattern);
|
||||||
|
int32_t doRegExec(const char* pString, pcre2_code* pRegex, pcre2_match_data* pMatchData);
|
||||||
|
void destroyRegexes(pcre2_code* pWktRegex, pcre2_match_data* pWktMatchData);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _TD_UTIL_PAGEDBUF_H_
|
|
@ -725,7 +725,7 @@ void taos_init_imp(void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1, true) != 0) {
|
||||||
tscInitRes = -1;
|
tscInitRes = -1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ struct tmq_t {
|
||||||
STaosQueue* mqueue; // queue of rsp
|
STaosQueue* mqueue; // queue of rsp
|
||||||
STaosQall* qall;
|
STaosQall* qall;
|
||||||
STaosQueue* delayedTask; // delayed task queue for heartbeat and auto commit
|
STaosQueue* delayedTask; // delayed task queue for heartbeat and auto commit
|
||||||
tsem_t rspSem;
|
tsem2_t rspSem;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SAskEpInfo {
|
typedef struct SAskEpInfo {
|
||||||
|
@ -727,7 +727,7 @@ static void generateTimedTask(int64_t refId, int32_t type) {
|
||||||
|
|
||||||
*pTaskType = type;
|
*pTaskType = type;
|
||||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem2_post(&tmq->rspSem);
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,7 +742,7 @@ void tmqReplayTask(void* param, void* tmrId) {
|
||||||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||||
if (tmq == NULL) goto END;
|
if (tmq == NULL) goto END;
|
||||||
|
|
||||||
tsem_post(&tmq->rspSem);
|
tsem2_post(&tmq->rspSem);
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
END:
|
END:
|
||||||
taosMemoryFree(param);
|
taosMemoryFree(param);
|
||||||
|
@ -1033,7 +1033,7 @@ void tmqFreeImpl(void* handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosFreeQall(tmq->qall);
|
taosFreeQall(tmq->qall);
|
||||||
tsem_destroy(&tmq->rspSem);
|
tsem2_destroy(&tmq->rspSem);
|
||||||
|
|
||||||
taosArrayDestroyEx(tmq->clientTopics, freeClientVgImpl);
|
taosArrayDestroyEx(tmq->clientTopics, freeClientVgImpl);
|
||||||
taos_close_internal(tmq->pTscObj);
|
taos_close_internal(tmq->pTscObj);
|
||||||
|
@ -1121,7 +1121,7 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
pTmq->consumerId = tGenIdPI64();
|
pTmq->consumerId = tGenIdPI64();
|
||||||
|
|
||||||
// init semaphore
|
// init semaphore
|
||||||
if (tsem_init(&pTmq->rspSem, 0, 0) != 0) {
|
if (tsem2_init(&pTmq->rspSem, 0, 0) != 0) {
|
||||||
tscError("consumer:0x %" PRIx64 " setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(),
|
tscError("consumer:0x %" PRIx64 " setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(),
|
||||||
pTmq->groupId);
|
pTmq->groupId);
|
||||||
SET_ERROR_MSG_TMQ("init t_sem failed")
|
SET_ERROR_MSG_TMQ("init t_sem failed")
|
||||||
|
@ -1132,7 +1132,7 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
pTmq->pTscObj = taos_connect_internal(conf->ip, user, pass, NULL, NULL, conf->port, CONN_TYPE__TMQ);
|
pTmq->pTscObj = taos_connect_internal(conf->ip, user, pass, NULL, NULL, conf->port, CONN_TYPE__TMQ);
|
||||||
if (pTmq->pTscObj == NULL) {
|
if (pTmq->pTscObj == NULL) {
|
||||||
tscError("consumer:0x%" PRIx64 " setup failed since %s, groupId:%s", pTmq->consumerId, terrstr(), pTmq->groupId);
|
tscError("consumer:0x%" PRIx64 " setup failed since %s, groupId:%s", pTmq->consumerId, terrstr(), pTmq->groupId);
|
||||||
tsem_destroy(&pTmq->rspSem);
|
tsem2_destroy(&pTmq->rspSem);
|
||||||
SET_ERROR_MSG_TMQ("init tscObj failed")
|
SET_ERROR_MSG_TMQ("init tscObj failed")
|
||||||
goto _failed;
|
goto _failed;
|
||||||
}
|
}
|
||||||
|
@ -1434,7 +1434,7 @@ END:
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
|
|
||||||
FAIL:
|
FAIL:
|
||||||
if (tmq) tsem_post(&tmq->rspSem);
|
if (tmq) tsem2_post(&tmq->rspSem);
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
if (pMsg) taosMemoryFreeClear(pMsg->pData);
|
if (pMsg) taosMemoryFreeClear(pMsg->pData);
|
||||||
if (pMsg) taosMemoryFreeClear(pMsg->pEpSet);
|
if (pMsg) taosMemoryFreeClear(pMsg->pEpSet);
|
||||||
|
@ -2132,10 +2132,10 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
|
||||||
tmq->consumerId, tmq->epoch, startTime, currentTime);
|
tmq->consumerId, tmq->epoch, startTime, currentTime);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
tsem_timewait(&tmq->rspSem, (timeout - elapsedTime));
|
tsem2_timewait(&tmq->rspSem, (timeout - elapsedTime));
|
||||||
} else {
|
} else {
|
||||||
// use tsem_timewait instead of tsem_wait to avoid unexpected stuck
|
// use tsem_timewait instead of tsem_wait to avoid unexpected stuck
|
||||||
tsem_timewait(&tmq->rspSem, 1000);
|
tsem2_timewait(&tmq->rspSem, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,11 @@ static int32_t s3ListBucket(char const *bucketname);
|
||||||
int32_t s3CheckCfg() {
|
int32_t s3CheckCfg() {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (!tsS3Enabled) {
|
||||||
|
fprintf(stderr, "s3 not configured.\n");
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
code = s3Begin();
|
code = s3Begin();
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
fprintf(stderr, "failed to initialize s3.\n");
|
fprintf(stderr, "failed to initialize s3.\n");
|
||||||
|
|
|
@ -250,7 +250,7 @@ bool checkColumnEncodeOrSetDefault(uint8_t type, char encode[TSDB_CL_COMPRESS_OP
|
||||||
strncpy(encode, getDefaultEncodeStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
strncpy(encode, getDefaultEncodeStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return checkColumnEncode(encode);
|
return checkColumnEncode(encode) && validColEncode(type, columnEncodeVal(encode));
|
||||||
}
|
}
|
||||||
bool checkColumnCompress(char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
bool checkColumnCompress(char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
if (0 == strlen(compress)) return true;
|
if (0 == strlen(compress)) return true;
|
||||||
|
@ -267,7 +267,8 @@ bool checkColumnCompressOrSetDefault(uint8_t type, char compress[TSDB_CL_COMPRES
|
||||||
strncpy(compress, getDefaultCompressStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
strncpy(compress, getDefaultCompressStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return checkColumnCompress(compress);
|
|
||||||
|
return checkColumnCompress(compress) && validColCompress(type, columnCompressVal(compress));
|
||||||
}
|
}
|
||||||
bool checkColumnLevel(char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
bool checkColumnLevel(char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
if (0 == strlen(level)) return true;
|
if (0 == strlen(level)) return true;
|
||||||
|
@ -288,7 +289,7 @@ bool checkColumnLevelOrSetDefault(uint8_t type, char level[TSDB_CL_COMPRESS_OPTI
|
||||||
strncpy(level, getDefaultLevelStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
strncpy(level, getDefaultLevelStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return checkColumnLevel(level);
|
return checkColumnLevel(level) && validColCompressLevel(type, columnLevelVal(level));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setColEncode(uint32_t* compress, uint8_t l1) {
|
void setColEncode(uint32_t* compress, uint8_t l1) {
|
||||||
|
|
|
@ -2411,13 +2411,24 @@ _end:
|
||||||
|
|
||||||
void buildCtbNameAddGroupId(const char* stbName, char* ctbName, uint64_t groupId) {
|
void buildCtbNameAddGroupId(const char* stbName, char* ctbName, uint64_t groupId) {
|
||||||
char tmp[TSDB_TABLE_NAME_LEN] = {0};
|
char tmp[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
if (stbName == NULL) {
|
if (stbName == NULL){
|
||||||
snprintf(tmp, TSDB_TABLE_NAME_LEN, "_%" PRIu64, groupId);
|
snprintf(tmp, TSDB_TABLE_NAME_LEN, "_%"PRIu64, groupId);
|
||||||
} else {
|
}else{
|
||||||
snprintf(tmp, TSDB_TABLE_NAME_LEN, "_%s_%" PRIu64, stbName, groupId);
|
int32_t i = strlen(stbName) - 1;
|
||||||
|
for(; i >= 0; i--){
|
||||||
|
if (stbName[i] == '.'){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
snprintf(tmp, TSDB_TABLE_NAME_LEN, "_%s_%"PRIu64, stbName + i + 1, groupId);
|
||||||
}
|
}
|
||||||
ctbName[TSDB_TABLE_NAME_LEN - strlen(tmp) - 1] = 0; // put stbname + groupId to the end
|
ctbName[TSDB_TABLE_NAME_LEN - strlen(tmp) - 1] = 0; // put stbname + groupId to the end
|
||||||
strcat(ctbName, tmp);
|
strcat(ctbName, tmp);
|
||||||
|
for(int i = 0; i < strlen(ctbName); i++){
|
||||||
|
if(ctbName[i] == '.'){
|
||||||
|
ctbName[i] = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto stream subtable name starts with 't_', followed by the first segment of MD5 digest for group vals.
|
// auto stream subtable name starts with 't_', followed by the first segment of MD5 digest for group vals.
|
||||||
|
|
|
@ -1198,8 +1198,7 @@ int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tRowGetKey(SRow *row, SRowKey *key) {
|
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
|
||||||
key->ts = row->ts;
|
|
||||||
key->numOfPKs = row->numOfPKs;
|
key->numOfPKs = row->numOfPKs;
|
||||||
|
|
||||||
if (key->numOfPKs == 0) {
|
if (key->numOfPKs == 0) {
|
||||||
|
@ -1298,10 +1297,7 @@ int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
|
||||||
// NOTE:
|
// NOTE:
|
||||||
// set key->numOfPKs to 0 as the smallest key with ts
|
// set key->numOfPKs to 0 as the smallest key with ts
|
||||||
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
|
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
|
||||||
int32_t tRowKeyCompare(const void *p1, const void *p2) {
|
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
|
||||||
SRowKey *key1 = (SRowKey *)p1;
|
|
||||||
SRowKey *key2 = (SRowKey *)p2;
|
|
||||||
|
|
||||||
if (key1->ts < key2->ts) {
|
if (key1->ts < key2->ts) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (key1->ts > key2->ts) {
|
} else if (key1->ts > key2->ts) {
|
||||||
|
|
|
@ -240,8 +240,8 @@ int64_t tsTickPerMin[] = {60000L, 60000000L, 60000000000L};
|
||||||
int64_t tsTickPerHour[] = {3600000L, 3600000000L, 3600000000000L};
|
int64_t tsTickPerHour[] = {3600000L, 3600000000L, 3600000000000L};
|
||||||
|
|
||||||
// lossy compress 7
|
// lossy compress 7
|
||||||
char tsLossyColumns[32] = ""; // "float|double" means all float and double columns can be lossy compressed. set empty
|
char tsLossyColumns[32] = "float|double"; // "float|double" means all float and double columns can be lossy compressed.
|
||||||
// can close lossy compress.
|
// set empty can close lossy compress.
|
||||||
// below option can take effect when tsLossyColumns not empty
|
// below option can take effect when tsLossyColumns not empty
|
||||||
float tsFPrecision = 1E-8; // float column precision
|
float tsFPrecision = 1E-8; // float column precision
|
||||||
double tsDPrecision = 1E-16; // double column precision
|
double tsDPrecision = 1E-16; // double column precision
|
||||||
|
@ -296,6 +296,7 @@ char tsS3AccessKeySecret[TSDB_FQDN_LEN] = "<accesskeysecrect>";
|
||||||
char tsS3BucketName[TSDB_FQDN_LEN] = "<bucketname>";
|
char tsS3BucketName[TSDB_FQDN_LEN] = "<bucketname>";
|
||||||
char tsS3AppId[TSDB_FQDN_LEN] = "<appid>";
|
char tsS3AppId[TSDB_FQDN_LEN] = "<appid>";
|
||||||
int8_t tsS3Enabled = false;
|
int8_t tsS3Enabled = false;
|
||||||
|
int8_t tsS3EnabledCfg = false;
|
||||||
int8_t tsS3Oss = false;
|
int8_t tsS3Oss = false;
|
||||||
int8_t tsS3StreamEnabled = false;
|
int8_t tsS3StreamEnabled = false;
|
||||||
|
|
||||||
|
@ -375,6 +376,7 @@ int32_t taosSetS3Cfg(SConfig *pCfg) {
|
||||||
#if defined(USE_COS) || defined(USE_S3)
|
#if defined(USE_COS) || defined(USE_S3)
|
||||||
#ifdef TD_ENTERPRISE
|
#ifdef TD_ENTERPRISE
|
||||||
/*if (tsDiskCfgNum > 1) */ tsS3Enabled = true;
|
/*if (tsDiskCfgNum > 1) */ tsS3Enabled = true;
|
||||||
|
tsS3EnabledCfg = true;
|
||||||
#endif
|
#endif
|
||||||
tsS3StreamEnabled = true;
|
tsS3StreamEnabled = true;
|
||||||
#endif
|
#endif
|
||||||
|
@ -813,7 +815,6 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
CFG_DYN_ENT_SERVER) != 0)
|
CFG_DYN_ENT_SERVER) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (cfgAddString(pCfg, "lossyColumns", tsLossyColumns, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
|
||||||
if (cfgAddFloat(pCfg, "fPrecision", tsFPrecision, 0.0f, 100000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddFloat(pCfg, "fPrecision", tsFPrecision, 0.0f, 100000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddFloat(pCfg, "dPrecision", tsDPrecision, 0.0f, 1000000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddFloat(pCfg, "dPrecision", tsDPrecision, 0.0f, 1000000.0f, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxRange", tsMaxRange, 0, 65536, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxRange", tsMaxRange, 0, 65536, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
|
@ -1274,7 +1275,6 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
tsCacheLazyLoadThreshold = cfgGetItem(pCfg, "cacheLazyLoadThreshold")->i32;
|
tsCacheLazyLoadThreshold = cfgGetItem(pCfg, "cacheLazyLoadThreshold")->i32;
|
||||||
|
|
||||||
tstrncpy(tsLossyColumns, cfgGetItem(pCfg, "lossyColumns")->str, sizeof(tsLossyColumns));
|
|
||||||
tsFPrecision = cfgGetItem(pCfg, "fPrecision")->fval;
|
tsFPrecision = cfgGetItem(pCfg, "fPrecision")->fval;
|
||||||
tsDPrecision = cfgGetItem(pCfg, "dPrecision")->fval;
|
tsDPrecision = cfgGetItem(pCfg, "dPrecision")->fval;
|
||||||
tsMaxRange = cfgGetItem(pCfg, "maxRange")->i32;
|
tsMaxRange = cfgGetItem(pCfg, "maxRange")->i32;
|
||||||
|
@ -1394,7 +1394,7 @@ static int32_t taosCheckGlobalCfg() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs,
|
int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl, SArray *pArgs,
|
||||||
bool tsc) {
|
bool tsc, bool isDumpCfg) {
|
||||||
if (tsCfg != NULL) return 0;
|
if (tsCfg != NULL) return 0;
|
||||||
tsCfg = cfgInit();
|
tsCfg = cfgInit();
|
||||||
|
|
||||||
|
@ -1441,7 +1441,7 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile
|
||||||
|
|
||||||
taosSetAllDebugFlag(tsCfg, cfgGetItem(tsCfg, "debugFlag")->i32);
|
taosSetAllDebugFlag(tsCfg, cfgGetItem(tsCfg, "debugFlag")->i32);
|
||||||
|
|
||||||
cfgDumpCfg(tsCfg, tsc, false);
|
if(isDumpCfg) cfgDumpCfg(tsCfg, tsc, false);
|
||||||
|
|
||||||
if (taosCheckGlobalCfg() != 0) {
|
if (taosCheckGlobalCfg() != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -228,6 +228,8 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
|
||||||
blockDataEnsureCapacity(pBlock, cfgGetSize(pConf));
|
blockDataEnsureCapacity(pBlock, cfgGetSize(pConf));
|
||||||
SConfigIter* pIter = cfgCreateIter(pConf);
|
SConfigIter* pIter = cfgCreateIter(pConf);
|
||||||
|
|
||||||
|
cfgLock(pConf);
|
||||||
|
|
||||||
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
||||||
col = startCol;
|
col = startCol;
|
||||||
|
|
||||||
|
@ -253,6 +255,8 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfgUnLock(pConf);
|
||||||
|
|
||||||
pBlock->info.rows = numOfRows;
|
pBlock->info.rows = numOfRows;
|
||||||
|
|
||||||
cfgDestroyIter(pIter);
|
cfgDestroyIter(pIter);
|
||||||
|
|
|
@ -5962,9 +5962,11 @@ int32_t tSerializeSBalanceVgroupLeaderReq(void *buf, int32_t bufLen, SBalanceVgr
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->useless) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->reserved) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->vgId) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->vgId) < 0) return -1;
|
||||||
ENCODESQL();
|
ENCODESQL();
|
||||||
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -5977,12 +5979,15 @@ int32_t tDeserializeSBalanceVgroupLeaderReq(void *buf, int32_t bufLen, SBalanceV
|
||||||
tDecoderInit(&decoder, buf, bufLen);
|
tDecoderInit(&decoder, buf, bufLen);
|
||||||
|
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->useless) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->reserved) < 0) return -1;
|
||||||
if (!tDecodeIsEnd(&decoder)) {
|
if (!tDecodeIsEnd(&decoder)) {
|
||||||
if (tDecodeI32(&decoder, &pReq->vgId) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->vgId) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODESQL();
|
DECODESQL();
|
||||||
|
if (!tDecodeIsEnd(&decoder)) {
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <tglobal.h>
|
#include <tglobal.h>
|
||||||
#include <tmsg.h>
|
#include <tmsg.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <tdatablock.h>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
@ -475,6 +476,45 @@ TEST(testCase, AllNormTest) {
|
||||||
taosMemoryFree(pTSchema);
|
taosMemoryFree(pTSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(testCase, StreamAllNormTest) {
|
||||||
|
char ctbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
uint64_t groupId = 12345;
|
||||||
|
|
||||||
|
buildCtbNameAddGroupId(NULL, ctbName, groupId);
|
||||||
|
|
||||||
|
ASSERT_STREQ("_12345", ctbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, StreamWithStbName) {
|
||||||
|
char stbName[] = "1.table.stb";
|
||||||
|
char ctbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
uint64_t groupId = 12345;
|
||||||
|
|
||||||
|
buildCtbNameAddGroupId(stbName, ctbName, groupId);
|
||||||
|
|
||||||
|
ASSERT_STREQ("_stb_12345", ctbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, StreamWithoutDotInStbName) {
|
||||||
|
char stbName[] = "table";
|
||||||
|
char ctbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
uint64_t groupId = 12345;
|
||||||
|
|
||||||
|
buildCtbNameAddGroupId(stbName, ctbName, groupId);
|
||||||
|
|
||||||
|
ASSERT_STREQ("_table_12345", ctbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, StreamWithoutDotInStbName2) {
|
||||||
|
char stbName[] = "";
|
||||||
|
char ctbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
uint64_t groupId = 12345;
|
||||||
|
|
||||||
|
buildCtbNameAddGroupId(stbName, ctbName, groupId);
|
||||||
|
|
||||||
|
ASSERT_STREQ("__12345", ctbName);
|
||||||
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
TEST(testCase, NoneTest) {
|
TEST(testCase, NoneTest) {
|
||||||
const static int nCols = 14;
|
const static int nCols = 14;
|
||||||
|
|
|
@ -205,11 +205,11 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
|
||||||
if(i < argc - 1) {
|
if(i < argc - 1) {
|
||||||
int32_t len = strlen(argv[++i]);
|
int32_t len = strlen(argv[++i]);
|
||||||
if (len < ENCRYPT_KEY_LEN_MIN) {
|
if (len < ENCRYPT_KEY_LEN_MIN) {
|
||||||
printf("encrypt key is too short, it should be great or equal to %d\n", ENCRYPT_KEY_LEN_MIN);
|
printf("Error: Encrypt key should be at least %d characters\n", ENCRYPT_KEY_LEN_MIN);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (len > ENCRYPT_KEY_LEN) {
|
if (len > ENCRYPT_KEY_LEN) {
|
||||||
printf("encrypt key overflow, it should be less or equal to %d\n", ENCRYPT_KEY_LEN);
|
printf("Error: Encrypt key overflow, it should be at most %d characters\n", ENCRYPT_KEY_LEN);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tstrncpy(global.encryptKey, argv[i], ENCRYPT_KEY_LEN);
|
tstrncpy(global.encryptKey, argv[i], ENCRYPT_KEY_LEN);
|
||||||
|
@ -325,7 +325,7 @@ int main(int argc, char const *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dmParseArgs(argc, argv) != 0) {
|
if (dmParseArgs(argc, argv) != 0) {
|
||||||
printf("failed to start since parse args error\n");
|
//printf("failed to start since parse args error\n");
|
||||||
taosCleanupArgs();
|
taosCleanupArgs();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -380,7 +380,11 @@ int mainWindows(int argc, char **argv) {
|
||||||
|
|
||||||
dmPrintArgs(argc, argv);
|
dmPrintArgs(argc, argv);
|
||||||
|
|
||||||
if (taosInitCfg(configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0) != 0) {
|
bool isDumpCfg = true;
|
||||||
|
if(global.generateCode) {
|
||||||
|
isDumpCfg = false;
|
||||||
|
}
|
||||||
|
if (taosInitCfg(configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0, isDumpCfg) != 0) {
|
||||||
dError("failed to start since read config error");
|
dError("failed to start since read config error");
|
||||||
taosCloseLog();
|
taosCloseLog();
|
||||||
taosCleanupArgs();
|
taosCleanupArgs();
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "dmMgmt.h"
|
#include "dmMgmt.h"
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
#include "libs/function/tudf.h"
|
#include "libs/function/tudf.h"
|
||||||
|
#include "tgrant.h"
|
||||||
|
|
||||||
#define DM_INIT_AUDIT() \
|
#define DM_INIT_AUDIT() \
|
||||||
do { \
|
do { \
|
||||||
|
@ -150,6 +151,7 @@ static bool dmCheckDataDirVersion() {
|
||||||
|
|
||||||
extern int32_t s3Begin();
|
extern int32_t s3Begin();
|
||||||
extern void s3End();
|
extern void s3End();
|
||||||
|
extern int8_t tsS3Enabled;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -18,12 +18,10 @@
|
||||||
#include "dmNodes.h"
|
#include "dmNodes.h"
|
||||||
#include "index.h"
|
#include "index.h"
|
||||||
#include "qworker.h"
|
#include "qworker.h"
|
||||||
#include "tstream.h"
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
#include "tcompression.h"
|
#include "tcompression.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tgrant.h"
|
#include "tgrant.h"
|
||||||
#endif
|
#include "tstream.h"
|
||||||
|
|
||||||
static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
|
static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
|
||||||
SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
|
SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
|
||||||
|
@ -48,10 +46,8 @@ int32_t dmInitDnode(SDnode *pDnode) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
// compress module init
|
// compress module init
|
||||||
tsCompressInit(tsLossyColumns, tsFPrecision, tsDPrecision, tsMaxRange, tsCurRange, (int)tsIfAdtFse, tsCompressor);
|
tsCompressInit(tsLossyColumns, tsFPrecision, tsDPrecision, tsMaxRange, tsCurRange, (int)tsIfAdtFse, tsCompressor);
|
||||||
#endif
|
|
||||||
|
|
||||||
pDnode->wrappers[DNODE].func = dmGetMgmtFunc();
|
pDnode->wrappers[DNODE].func = dmGetMgmtFunc();
|
||||||
pDnode->wrappers[MNODE].func = mmGetMgmtFunc();
|
pDnode->wrappers[MNODE].func = mmGetMgmtFunc();
|
||||||
|
@ -88,7 +84,7 @@ int32_t dmInitDnode(SDnode *pDnode) {
|
||||||
streamMetaInit();
|
streamMetaInit();
|
||||||
|
|
||||||
dmInitStatusClient(pDnode);
|
dmInitStatusClient(pDnode);
|
||||||
dmInitSyncClient(pDnode);
|
dmInitSyncClient(pDnode);
|
||||||
|
|
||||||
dmReportStartup("dnode-transport", "initialized");
|
dmReportStartup("dnode-transport", "initialized");
|
||||||
dDebug("dnode is created, ptr:%p", pDnode);
|
dDebug("dnode is created, ptr:%p", pDnode);
|
||||||
|
@ -120,10 +116,8 @@ void dmCleanupDnode(SDnode *pDnode) {
|
||||||
indexCleanup();
|
indexCleanup();
|
||||||
taosConvDestroy();
|
taosConvDestroy();
|
||||||
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
// compress destroy
|
// compress destroy
|
||||||
tsCompressExit();
|
tsCompressExit();
|
||||||
#endif
|
|
||||||
|
|
||||||
dDebug("dnode is closed, ptr:%p", pDnode);
|
dDebug("dnode is closed, ptr:%p", pDnode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -821,6 +821,10 @@ static int32_t mndCheckDbEncryptKey(SMnode *pMnode, SCreateDbReq *pReq) {
|
||||||
|
|
||||||
#ifdef TD_ENTERPRISE
|
#ifdef TD_ENTERPRISE
|
||||||
if (pReq->encryptAlgorithm == TSDB_ENCRYPT_ALGO_NONE) goto _exit;
|
if (pReq->encryptAlgorithm == TSDB_ENCRYPT_ALGO_NONE) goto _exit;
|
||||||
|
if (grantCheck(TSDB_GRANT_DB_ENCRYPTION) != 0) {
|
||||||
|
code = TSDB_CODE_MND_DB_ENCRYPT_GRANT_EXPIRED;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
if (tsEncryptionKeyStat != ENCRYPT_KEY_STAT_LOADED) {
|
if (tsEncryptionKeyStat != ENCRYPT_KEY_STAT_LOADED) {
|
||||||
code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
|
code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
|
||||||
mError("db:%s, failed to check encryption key:%" PRIi8 " in mnode leader since it's not loaded", pReq->db,
|
mError("db:%s, failed to check encryption key:%" PRIi8 " in mnode leader since it's not loaded", pReq->db,
|
||||||
|
@ -903,6 +907,13 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (createReq.replications == 2) {
|
||||||
|
if ((terrno = grantCheck(TSDB_GRANT_DUAL_REPLICA_HA)) != 0) {
|
||||||
|
code = terrno;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((code = mndCheckDbEncryptKey(pMnode, &createReq)) != 0) {
|
if ((code = mndCheckDbEncryptKey(pMnode, &createReq)) != 0) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1163,6 +1174,12 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alterReq.replications == 2) {
|
||||||
|
if ((code = grantCheck(TSDB_GRANT_DUAL_REPLICA_HA)) != 0) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t numOfTopics = 0;
|
int32_t numOfTopics = 0;
|
||||||
if (mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics) != 0) {
|
if (mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics) != 0) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
|
|
@ -120,12 +120,32 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) {
|
||||||
#define tsdbRowFromBlockData(BLOCKDATA, IROW) \
|
#define tsdbRowFromBlockData(BLOCKDATA, IROW) \
|
||||||
((TSDBROW){.type = TSDBROW_COL_FMT, .pBlockData = (BLOCKDATA), .iRow = (IROW)})
|
((TSDBROW){.type = TSDBROW_COL_FMT, .pBlockData = (BLOCKDATA), .iRow = (IROW)})
|
||||||
|
|
||||||
|
#define TSDBROW_INIT_KEY(_ROW, _KEY) \
|
||||||
|
{ \
|
||||||
|
if ((_ROW)->type == TSDBROW_ROW_FMT) { \
|
||||||
|
_KEY.version = (_ROW)->version; \
|
||||||
|
_KEY.ts = (_ROW)->pTSRow->ts; \
|
||||||
|
} else { \
|
||||||
|
_KEY.version = (_ROW)->pBlockData->aVersion[(_ROW)->iRow]; \
|
||||||
|
_KEY.ts = (_ROW)->pBlockData->aTSKEY[(_ROW)->iRow]; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define tColRowGetKey(_pBlock, _irow, _key) \
|
||||||
|
{ \
|
||||||
|
(_key)->ts = (_pBlock)->aTSKEY[(_irow)]; \
|
||||||
|
(_key)->numOfPKs = 0; \
|
||||||
|
if ((_pBlock)->nColData > 0) { \
|
||||||
|
tColRowGetPrimaryKey((_pBlock), (_irow), (_key)); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
||||||
int32_t tsdbRowCompare(const void *p1, const void *p2);
|
int32_t tsdbRowCompare(const void *p1, const void *p2);
|
||||||
int32_t tsdbRowCompareWithoutVersion(const void *p1, const void *p2);
|
int32_t tsdbRowCompareWithoutVersion(const void *p1, const void *p2);
|
||||||
int32_t tsdbRowKeyCmpr(const STsdbRowKey *key1, const STsdbRowKey *key2);
|
int32_t tsdbRowKeyCmpr(const STsdbRowKey *key1, const STsdbRowKey *key2);
|
||||||
void tsdbRowGetKey(TSDBROW *row, STsdbRowKey *key);
|
void tsdbRowGetKey(TSDBROW *row, STsdbRowKey *key);
|
||||||
void tColRowGetKey(SBlockData *pBlock, int32_t irow, SRowKey *key);
|
void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key);
|
||||||
|
|
||||||
|
|
||||||
// STSDBRowIter
|
// STSDBRowIter
|
||||||
|
@ -953,7 +973,28 @@ static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) {
|
||||||
// #define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
// #define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
||||||
// #define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
// #define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
||||||
|
|
||||||
TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter);
|
static FORCE_INLINE TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) {
|
||||||
|
if (pIter == NULL) return NULL;
|
||||||
|
|
||||||
|
if (pIter->pRow) {
|
||||||
|
return pIter->pRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pIter->backward) {
|
||||||
|
if (pIter->pNode == pIter->pTbData->sl.pHead) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pIter->pNode == pIter->pTbData->sl.pTail) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pIter->pRow = &pIter->row;
|
||||||
|
pIter->row = pIter->pNode->row;
|
||||||
|
|
||||||
|
return pIter->pRow;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsdbDataFileRW.h"
|
#include "tsdbDataFileRW.h"
|
||||||
|
#include "tsdbIter.h"
|
||||||
#include "tsdbReadUtil.h"
|
#include "tsdbReadUtil.h"
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
|
@ -359,7 +360,10 @@ static int32_t tsdbCacheDeserializeV0(char const *value, SLastCol *pLastCol) {
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
||||||
pLastCol->colVal.value.nData = pLastColV0->colVal.value.nData;
|
pLastCol->colVal.value.nData = pLastColV0->colVal.value.nData;
|
||||||
pLastCol->colVal.value.pData = (uint8_t *)(&pLastColV0[1]);
|
pLastCol->colVal.value.pData = NULL;
|
||||||
|
if (pLastCol->colVal.value.nData > 0) {
|
||||||
|
pLastCol->colVal.value.pData = (uint8_t *)(&pLastColV0[1]);
|
||||||
|
}
|
||||||
return sizeof(SLastColV0) + pLastColV0->colVal.value.nData;
|
return sizeof(SLastColV0) + pLastColV0->colVal.value.nData;
|
||||||
} else {
|
} else {
|
||||||
pLastCol->colVal.value.val = pLastColV0->colVal.value.val;
|
pLastCol->colVal.value.val = pLastColV0->colVal.value.val;
|
||||||
|
@ -401,8 +405,11 @@ static SLastCol *tsdbCacheDeserialize(char const *value, size_t size) {
|
||||||
offset += sizeof(SValue);
|
offset += sizeof(SValue);
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
||||||
pLastCol->rowKey.pks[i].pData = (uint8_t *)value + offset;
|
pLastCol->rowKey.pks[i].pData = NULL;
|
||||||
offset += pLastCol->rowKey.pks[i].nData;
|
if (pLastCol->rowKey.pks[i].nData > 0) {
|
||||||
|
pLastCol->rowKey.pks[i].pData = (uint8_t *)value + offset;
|
||||||
|
offset += pLastCol->rowKey.pks[i].nData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,10 +947,37 @@ typedef struct {
|
||||||
SLastKey key;
|
SLastKey key;
|
||||||
} SIdxKey;
|
} SIdxKey;
|
||||||
|
|
||||||
static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal *pColVal) {
|
static int32_t tsdbCacheUpdateValue(SValue *pOld, SValue *pNew) {
|
||||||
uint8_t *pVal = NULL;
|
uint8_t *pFree = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pOld->type)) {
|
||||||
|
pFree = pOld->pData;
|
||||||
|
nData = pOld->nData;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pOld = *pNew;
|
||||||
|
if (IS_VAR_DATA_TYPE(pNew->type)) {
|
||||||
|
if (nData < pNew->nData) {
|
||||||
|
pOld->pData = taosMemoryCalloc(1, pNew->nData);
|
||||||
|
} else {
|
||||||
|
pOld->pData = pFree;
|
||||||
|
pFree = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNew->nData) {
|
||||||
|
memcpy(pOld->pData, pNew->pData, pNew->nData);
|
||||||
|
} else {
|
||||||
|
pFree = pOld->pData;
|
||||||
|
pOld->pData = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pFree);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal *pColVal) {
|
||||||
// update rowkey
|
// update rowkey
|
||||||
pLastCol->rowKey.ts = pRowKey->ts;
|
pLastCol->rowKey.ts = pRowKey->ts;
|
||||||
pLastCol->rowKey.numOfPKs = pRowKey->numOfPKs;
|
pLastCol->rowKey.numOfPKs = pRowKey->numOfPKs;
|
||||||
|
@ -951,41 +985,13 @@ static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal
|
||||||
SValue *pPKValue = &pLastCol->rowKey.pks[i];
|
SValue *pPKValue = &pLastCol->rowKey.pks[i];
|
||||||
SValue *pNewPKValue = &pRowKey->pks[i];
|
SValue *pNewPKValue = &pRowKey->pks[i];
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pPKValue->type)) {
|
(void)tsdbCacheUpdateValue(pPKValue, pNewPKValue);
|
||||||
pVal = pPKValue->pData;
|
|
||||||
nData = pPKValue->nData;
|
|
||||||
}
|
|
||||||
*pPKValue = *pNewPKValue;
|
|
||||||
if (IS_VAR_DATA_TYPE(pPKValue->type)) {
|
|
||||||
if (nData < pPKValue->nData) {
|
|
||||||
taosMemoryFree(pVal);
|
|
||||||
pPKValue->pData = taosMemoryCalloc(1, pNewPKValue->nData);
|
|
||||||
} else {
|
|
||||||
pPKValue->pData = pVal;
|
|
||||||
}
|
|
||||||
if (pNewPKValue->nData) {
|
|
||||||
memcpy(pPKValue->pData, pNewPKValue->pData, pNewPKValue->nData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update colval
|
// update colval
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
pLastCol->colVal.cid = pColVal->cid;
|
||||||
nData = pLastCol->colVal.value.nData;
|
pLastCol->colVal.flag = pColVal->flag;
|
||||||
pVal = pLastCol->colVal.value.pData;
|
(void)tsdbCacheUpdateValue(&pLastCol->colVal.value, &pColVal->value);
|
||||||
}
|
|
||||||
pLastCol->colVal = *pColVal;
|
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
|
||||||
if (nData < pColVal->value.nData) {
|
|
||||||
taosMemoryFree(pVal);
|
|
||||||
pLastCol->colVal.value.pData = taosMemoryCalloc(1, pColVal->value.nData);
|
|
||||||
} else {
|
|
||||||
pLastCol->colVal.value.pData = pVal;
|
|
||||||
}
|
|
||||||
if (pColVal->value.nData) {
|
|
||||||
memcpy(pLastCol->colVal.value.pData, pColVal->value.pData, pColVal->value.nData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pLastCol->dirty) {
|
if (!pLastCol->dirty) {
|
||||||
pLastCol->dirty = 1;
|
pLastCol->dirty = 1;
|
||||||
|
|
|
@ -799,26 +799,3 @@ SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable) {
|
||||||
_exit:
|
_exit:
|
||||||
return aTbDataP;
|
return aTbDataP;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) {
|
|
||||||
if (pIter == NULL) return NULL;
|
|
||||||
|
|
||||||
if (pIter->pRow) {
|
|
||||||
return pIter->pRow;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pIter->backward) {
|
|
||||||
if (pIter->pNode == pIter->pTbData->sl.pHead) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (pIter->pNode == pIter->pTbData->sl.pTail) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pIter->pRow = &pIter->row;
|
|
||||||
pIter->row = pIter->pNode->row;
|
|
||||||
|
|
||||||
return pIter->pRow;
|
|
||||||
}
|
|
||||||
|
|
|
@ -828,7 +828,7 @@ static FORCE_INLINE int32_t tLDataIterCmprFn(const SRBTreeNode *p1, const SRBTre
|
||||||
SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - offsetof(SLDataIter, node));
|
SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - offsetof(SLDataIter, node));
|
||||||
SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - offsetof(SLDataIter, node));
|
SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - offsetof(SLDataIter, node));
|
||||||
|
|
||||||
SRowKey rkey1, rkey2;
|
SRowKey rkey1 = {0}, rkey2 = {0};
|
||||||
tRowGetKeyEx(&pIter1->rInfo.row, &rkey1);
|
tRowGetKeyEx(&pIter1->rInfo.row, &rkey1);
|
||||||
tRowGetKeyEx(&pIter2->rInfo.row, &rkey2);
|
tRowGetKeyEx(&pIter2->rInfo.row, &rkey2);
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,16 @@
|
||||||
|
|
||||||
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
||||||
#define getCurrentKeyInSttBlock(_r) (&((_r)->currentKey))
|
#define getCurrentKeyInSttBlock(_r) (&((_r)->currentKey))
|
||||||
|
#define tColRowGetKeyDeepCopy(_pBlock, _irow, _slotId, _pKey) \
|
||||||
|
do { \
|
||||||
|
(_pKey)->ts = (_pBlock)->aTSKEY[(_irow)]; \
|
||||||
|
(_pKey)->numOfPKs = 0; \
|
||||||
|
if ((_slotId) != -1) { \
|
||||||
|
tColRowGetPriamyKeyDeepCopy(_pBlock, _irow, _slotId, _pKey); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define outOfTimeWindow(_ts, _window) (((_ts) > (_window)->ekey) || ((_ts) < (_window)->skey))
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool overlapWithNeighborBlock;
|
bool overlapWithNeighborBlock;
|
||||||
|
@ -75,11 +85,9 @@ static void getMemTableTimeRange(STsdbReader* pReader, int64_t* pMaxKey
|
||||||
static void updateComposedBlockInfo(STsdbReader* pReader, double el, STableBlockScanInfo* pBlockScanInfo);
|
static void updateComposedBlockInfo(STsdbReader* pReader, double el, STableBlockScanInfo* pBlockScanInfo);
|
||||||
static int32_t buildFromPreFilesetBuffer(STsdbReader* pReader);
|
static int32_t buildFromPreFilesetBuffer(STsdbReader* pReader);
|
||||||
|
|
||||||
static bool outOfTimeWindow(int64_t ts, STimeWindow* pWindow) { return (ts > pWindow->ekey) || (ts < pWindow->skey); }
|
|
||||||
|
|
||||||
static void resetPreFilesetMemTableListIndex(SReaderStatus* pStatus);
|
static void resetPreFilesetMemTableListIndex(SReaderStatus* pStatus);
|
||||||
|
|
||||||
int32_t pkCompEx(SRowKey* p1, SRowKey* p2) {
|
FORCE_INLINE int32_t pkCompEx(SRowKey* p1, SRowKey* p2) {
|
||||||
if (p2 == NULL) {
|
if (p2 == NULL) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -101,13 +109,7 @@ int32_t pkCompEx(SRowKey* p1, SRowKey* p2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tColRowGetKeyDeepCopy(SBlockData* pBlock, int32_t irow, int32_t slotId, SRowKey* pKey) {
|
static void tColRowGetPriamyKeyDeepCopy(SBlockData* pBlock, int32_t irow, int32_t slotId, SRowKey* pKey) {
|
||||||
pKey->ts = pBlock->aTSKEY[irow];
|
|
||||||
if (slotId == -1) {
|
|
||||||
pKey->numOfPKs = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SColData* pColData = &pBlock->aColData[slotId];
|
SColData* pColData = &pBlock->aColData[slotId];
|
||||||
SColVal cv;
|
SColVal cv;
|
||||||
tColDataGetValue(pColData, irow, &cv);
|
tColDataGetValue(pColData, irow, &cv);
|
||||||
|
@ -131,13 +133,7 @@ static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tRowGetKeyDeepCopy(SRow* pRow, SRowKey* pKey) {
|
static void tRowGetPrimaryKeyDeepCopy(SRow* pRow, SRowKey* pKey) {
|
||||||
pKey->ts = pRow->ts;
|
|
||||||
pKey->numOfPKs = pRow->numOfPKs;
|
|
||||||
if (pKey->numOfPKs == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
|
SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
|
||||||
ASSERT(pKey->numOfPKs <= TD_MAX_PK_COLS);
|
ASSERT(pKey->numOfPKs <= TD_MAX_PK_COLS);
|
||||||
|
|
||||||
|
@ -1735,7 +1731,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
pSttKey = getCurrentKeyInSttBlock(pSttBlockReader);
|
pSttKey = getCurrentKeyInSttBlock(pSttBlockReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRowKey k;
|
SRowKey k = {0};
|
||||||
tRowGetKeyEx(pRow, &k);
|
tRowGetKeyEx(pRow, &k);
|
||||||
|
|
||||||
STSchema* pSchema = NULL;
|
STSchema* pSchema = NULL;
|
||||||
|
@ -1939,7 +1935,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
pfKey = NULL;
|
pfKey = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRowKey k, ik;
|
SRowKey k = {0}, ik = {0};
|
||||||
tRowGetKeyEx(pRow, &k);
|
tRowGetKeyEx(pRow, &k);
|
||||||
tRowGetKeyEx(piRow, &ik);
|
tRowGetKeyEx(piRow, &ik);
|
||||||
|
|
||||||
|
@ -2086,7 +2082,7 @@ int32_t doInitMemDataIter(STsdbReader* pReader, STbData** pData, STableBlockScan
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doForwardDataIter(SRowKey* pKey, SIterInfo* pIter, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) {
|
static void doForwardDataIter(SRowKey* pKey, SIterInfo* pIter, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) {
|
||||||
SRowKey rowKey;
|
SRowKey rowKey = {0};
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
TSDBROW* pRow = getValidMemRow(pIter, pBlockScanInfo->delSkyline, pReader);
|
TSDBROW* pRow = getValidMemRow(pIter, pBlockScanInfo->delSkyline, pReader);
|
||||||
|
@ -3559,7 +3555,7 @@ bool hasBeenDropped(const SArray* pDelList, int32_t* index, int64_t key, int64_t
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader) {
|
FORCE_INLINE TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader) {
|
||||||
if (!pIter->hasVal) {
|
if (!pIter->hasVal) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3567,7 +3563,8 @@ TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* p
|
||||||
int32_t order = pReader->info.order;
|
int32_t order = pReader->info.order;
|
||||||
TSDBROW* pRow = tsdbTbDataIterGet(pIter->iter);
|
TSDBROW* pRow = tsdbTbDataIterGet(pIter->iter);
|
||||||
|
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
TSDBKEY key;
|
||||||
|
TSDBROW_INIT_KEY(pRow, key);
|
||||||
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
||||||
pIter->hasVal = false;
|
pIter->hasVal = false;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3593,7 +3590,7 @@ TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* p
|
||||||
|
|
||||||
pRow = tsdbTbDataIterGet(pIter->iter);
|
pRow = tsdbTbDataIterGet(pIter->iter);
|
||||||
|
|
||||||
key = TSDBROW_KEY(pRow);
|
TSDBROW_INIT_KEY(pRow, key);
|
||||||
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
||||||
pIter->hasVal = false;
|
pIter->hasVal = false;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3632,10 +3629,12 @@ int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, SRowKey *pCurKey, SArra
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRowKey nextKey = {0};
|
if (pCurKey->numOfPKs > 0) {
|
||||||
tRowGetKeyEx(pRow, &nextKey);
|
SRowKey nextKey = {0};
|
||||||
if (pkCompEx(pCurKey, &nextKey) != 0) {
|
tRowGetKeyEx(pRow, &nextKey);
|
||||||
break;
|
if (pkCompEx(pCurKey, &nextKey) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STSchema* pTSchema = NULL;
|
STSchema* pTSchema = NULL;
|
||||||
|
@ -3785,12 +3784,14 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRowKey nextRowKey = {0};
|
if (pKey->numOfPKs > 0) {
|
||||||
tRowGetKeyEx(pNextRow, &nextRowKey);
|
SRowKey nextRowKey = {0};
|
||||||
if (pKey->numOfPKs > 0 && pkCompEx(pKey, &nextRowKey) != 0) {
|
tRowGetKeyEx(pNextRow, &nextRowKey);
|
||||||
*pResRow = current;
|
if (pkCompEx(pKey, &nextRowKey) != 0) {
|
||||||
*freeTSRow = false;
|
*pResRow = current;
|
||||||
return TSDB_CODE_SUCCESS;
|
*freeTSRow = false;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3801,7 +3802,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
||||||
// start to merge duplicated rows
|
// start to merge duplicated rows
|
||||||
STSchema* pTSchema = NULL;
|
STSchema* pTSchema = NULL;
|
||||||
if (current.type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory
|
if (current.type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory
|
||||||
pTSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(¤t), pReader, uid);
|
pTSchema = doGetSchemaForTSRow(current.pTSRow->sver, pReader, uid);
|
||||||
if (pTSchema == NULL) {
|
if (pTSchema == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -3814,7 +3815,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
||||||
|
|
||||||
STSchema* pTSchema1 = NULL;
|
STSchema* pTSchema1 = NULL;
|
||||||
if (pNextRow->type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory
|
if (pNextRow->type == TSDBROW_ROW_FMT) { // get the correct schema for row-wise data in memory
|
||||||
pTSchema1 = doGetSchemaForTSRow(TSDBROW_SVERSION(pNextRow), pReader, uid);
|
pTSchema1 = doGetSchemaForTSRow(pNextRow->pTSRow->sver, pReader, uid);
|
||||||
if (pTSchema1 == NULL) {
|
if (pTSchema1 == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -3926,37 +3927,49 @@ static int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbRea
|
||||||
// todo refactor
|
// todo refactor
|
||||||
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
||||||
if (piter->hasVal) {
|
if (piter->hasVal) {
|
||||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
tRowGetKeyEx(pRow, &rowKey);
|
||||||
if ((k.ts >= endKey && asc) || (k.ts <= endKey && !asc)) {
|
if ((rowKey.ts >= endKey && asc) || (rowKey.ts <= endKey && !asc)) {
|
||||||
pRow = NULL;
|
pRow = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (piiter->hasVal) {
|
if (piiter->hasVal) {
|
||||||
TSDBKEY k = TSDBROW_KEY(piRow);
|
tRowGetKeyEx(piRow, &irowKey);
|
||||||
if ((k.ts >= endKey && asc) || (k.ts <= endKey && !asc)) {
|
if ((irowKey.ts >= endKey && asc) || (irowKey.ts <= endKey && !asc)) {
|
||||||
piRow = NULL;
|
piRow = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (piter->hasVal && piiter->hasVal && pRow != NULL && piRow != NULL) {
|
if (pRow != NULL && piRow != NULL) {
|
||||||
tRowGetKeyEx(pRow, &rowKey);
|
|
||||||
tRowGetKeyEx(piRow, &irowKey);
|
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
int32_t ret = pkCompEx(&rowKey, &irowKey);
|
if (rowKey.numOfPKs == 0) {
|
||||||
if (ret != 0) {
|
if ((rowKey.ts > irowKey.ts && asc) || (rowKey.ts < irowKey.ts && (!asc))) { // ik.ts < k.ts
|
||||||
if ((ret > 0 && asc) || (ret < 0 && (!asc))) { // ik.ts < k.ts
|
|
||||||
code = doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
code = doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
} else if ((ret < 0 && asc) || (ret > 0 && (!asc))) {
|
} else if ((rowKey.ts < irowKey.ts && asc) || (rowKey.ts > irowKey.ts && (!asc))) {
|
||||||
code = doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
code = doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
|
} else { // ik.ts == k.ts
|
||||||
|
*freeTSRow = true;
|
||||||
|
pResRow->type = TSDBROW_ROW_FMT;
|
||||||
|
code = doMergeMemIMemRows(pRow, &rowKey, piRow, &irowKey, pBlockScanInfo, pReader, &pResRow->pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else { // ik.ts == k.ts
|
} else {
|
||||||
*freeTSRow = true;
|
int32_t ret = pkCompEx(&rowKey, &irowKey);
|
||||||
pResRow->type = TSDBROW_ROW_FMT;
|
if (ret != 0) {
|
||||||
code = doMergeMemIMemRows(pRow, &rowKey, piRow, &irowKey, pBlockScanInfo, pReader, &pResRow->pTSRow);
|
if ((ret > 0 && asc) || (ret < 0 && (!asc))) { // ik.ts < k.ts
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
code = doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
return code;
|
} else if ((ret < 0 && asc) || (ret > 0 && (!asc))) {
|
||||||
|
code = doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
|
}
|
||||||
|
} else { // ik.ts == k.ts
|
||||||
|
*freeTSRow = true;
|
||||||
|
pResRow->type = TSDBROW_ROW_FMT;
|
||||||
|
code = doMergeMemIMemRows(pRow, &rowKey, piRow, &irowKey, pBlockScanInfo, pReader, &pResRow->pTSRow);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3964,12 +3977,10 @@ static int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbRea
|
||||||
}
|
}
|
||||||
|
|
||||||
if (piter->hasVal && pRow != NULL) {
|
if (piter->hasVal && pRow != NULL) {
|
||||||
tRowGetKeyEx(pRow, &rowKey);
|
|
||||||
return doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
return doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (piiter->hasVal && piRow != NULL) {
|
if (piiter->hasVal && piRow != NULL) {
|
||||||
tRowGetKeyEx(piRow, &irowKey);
|
|
||||||
return doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
return doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4095,7 +4106,11 @@ int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t e
|
||||||
if (row.type == TSDBROW_ROW_FMT) {
|
if (row.type == TSDBROW_ROW_FMT) {
|
||||||
code = doAppendRowFromTSRow(pBlock, pReader, row.pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pBlock, pReader, row.pTSRow, pBlockScanInfo);
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
tRowGetKeyDeepCopy(row.pTSRow, &pBlockScanInfo->lastProcKey);
|
pBlockScanInfo->lastProcKey.ts = row.pTSRow->ts;
|
||||||
|
pBlockScanInfo->lastProcKey.numOfPKs = row.pTSRow->numOfPKs;
|
||||||
|
if (row.pTSRow->numOfPKs > 0) {
|
||||||
|
tRowGetPrimaryKeyDeepCopy(row.pTSRow, &pBlockScanInfo->lastProcKey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (freeTSRow) {
|
if (freeTSRow) {
|
||||||
|
|
|
@ -212,7 +212,7 @@ static void initLastProcKey(STableBlockScanInfo *pScanInfo, STsdbReader* pReader
|
||||||
int32_t numOfPks = pReader->suppInfo.numOfPks;
|
int32_t numOfPks = pReader->suppInfo.numOfPks;
|
||||||
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
||||||
int8_t type = pReader->suppInfo.pk.type;
|
int8_t type = pReader->suppInfo.pk.type;
|
||||||
int8_t bytes = pReader->suppInfo.pk.bytes;
|
int32_t bytes = pReader->suppInfo.pk.bytes;
|
||||||
|
|
||||||
SRowKey* pRowKey = &pScanInfo->lastProcKey;
|
SRowKey* pRowKey = &pScanInfo->lastProcKey;
|
||||||
if (asc) {
|
if (asc) {
|
||||||
|
@ -1056,7 +1056,7 @@ static int32_t sortUidComparFn(const void* p1, const void* p2) {
|
||||||
const SSttKeyRange* px1 = p1;
|
const SSttKeyRange* px1 = p1;
|
||||||
const SSttKeyRange* px2 = p2;
|
const SSttKeyRange* px2 = p2;
|
||||||
|
|
||||||
int32_t ret = tRowKeyCompare(&px1, px2);
|
int32_t ret = tRowKeyCompare(&px1->skey, &px2->skey);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,14 +38,18 @@ extern "C" {
|
||||||
(_k)->ekey.ts = INT64_MIN; \
|
(_k)->ekey.ts = INT64_MIN; \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
#define tRowGetKeyEx(_pRow, _pKey) \
|
#define tRowGetKeyEx(_pRow, _pKey) \
|
||||||
do { \
|
{ \
|
||||||
if ((_pRow)->type == TSDBROW_ROW_FMT) { \
|
if ((_pRow)->type == TSDBROW_ROW_FMT) { \
|
||||||
tRowGetKey((_pRow)->pTSRow, (_pKey)); \
|
(_pKey)->ts = (_pRow)->pTSRow->ts; \
|
||||||
} else { \
|
if ((_pRow)->pTSRow->numOfPKs > 0) { \
|
||||||
tColRowGetKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \
|
tRowGetPrimaryKey((_pRow)->pTSRow, (_pKey)); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} else { \
|
||||||
|
(_pKey)->ts = (_pRow)->pBlockData->aTSKEY[(_pRow)->iRow]; \
|
||||||
|
tColRowGetPrimaryKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
READER_STATUS_SUSPEND = 0x1,
|
READER_STATUS_SUSPEND = 0x1,
|
||||||
|
|
|
@ -757,6 +757,16 @@ _exit:
|
||||||
int32_t tsdbS3Migrate(STsdb *tsdb, int64_t now, int32_t sync) {
|
int32_t tsdbS3Migrate(STsdb *tsdb, int64_t now, int32_t sync) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
extern int8_t tsS3EnabledCfg;
|
||||||
|
|
||||||
|
int32_t expired = grantCheck(TSDB_GRANT_OBJECT_STORAGE);
|
||||||
|
if (expired && tsS3Enabled) {
|
||||||
|
tsdbWarn("s3 grant expired: %d", expired);
|
||||||
|
tsS3Enabled = false;
|
||||||
|
} else if (!expired && tsS3EnabledCfg) {
|
||||||
|
tsS3Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!tsS3Enabled) {
|
if (!tsS3Enabled) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,10 +632,7 @@ void tsdbRowGetKey(TSDBROW *row, STsdbRowKey *key) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tColRowGetKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
|
void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
|
||||||
key->ts = pBlock->aTSKEY[irow];
|
|
||||||
key->numOfPKs = 0;
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pBlock->nColData; i++) {
|
for (int32_t i = 0; i < pBlock->nColData; i++) {
|
||||||
SColData *pColData = &pBlock->aColData[i];
|
SColData *pColData = &pBlock->aColData[i];
|
||||||
if (pColData->cflag & COL_IS_KEY) {
|
if (pColData->cflag & COL_IS_KEY) {
|
||||||
|
|
|
@ -3226,14 +3226,24 @@ int32_t ctgGetTbTSMAFromCache(SCatalog* pCtg, SCtgTbTSMACtx* pCtx, int32_t dbIdx
|
||||||
// get tb cache
|
// get tb cache
|
||||||
pName = taosArrayGet(pList, i);
|
pName = taosArrayGet(pList, i);
|
||||||
pTbCache = taosHashAcquire(dbCache->tbCache, pName->tname, strlen(pName->tname));
|
pTbCache = taosHashAcquire(dbCache->tbCache, pName->tname, strlen(pName->tname));
|
||||||
if (!pTbCache || !pTbCache->pMeta) {
|
if (!pTbCache) {
|
||||||
ctgDebug("tb: %s.%s not in cache", dbFName, pName->tname);
|
ctgDebug("tb: %s.%s not in cache", dbFName, pName->tname);
|
||||||
ctgAddTSMAFetch(&pCtx->pFetches, dbIdx, i, fetchIdx, baseResIdx + i, flag, FETCH_TSMA_SOURCE_TB_META, NULL);
|
ctgAddTSMAFetch(&pCtx->pFetches, dbIdx, i, fetchIdx, baseResIdx + i, flag, FETCH_TSMA_SOURCE_TB_META, NULL);
|
||||||
taosArrayPush(pCtx->pResList, &(SMetaRes){0});
|
taosArrayPush(pCtx->pResList, &(SMetaRes){0});
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
CTG_LOCK(CTG_READ, &pTbCache->metaLock);
|
||||||
|
if (!pTbCache->pMeta) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &pTbCache->metaLock);
|
||||||
|
ctgDebug("tb: %s.%s not in cache", dbFName, pName->tname);
|
||||||
|
ctgAddTSMAFetch(&pCtx->pFetches, dbIdx, i, fetchIdx, baseResIdx + i, flag, FETCH_TSMA_SOURCE_TB_META, NULL);
|
||||||
|
taosArrayPush(pCtx->pResList, &(SMetaRes){0});
|
||||||
|
taosHashRelease(dbCache->tbCache, pTbCache);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
uint64_t suid = pTbCache->pMeta->suid;
|
uint64_t suid = pTbCache->pMeta->suid;
|
||||||
int8_t tbType = pTbCache->pMeta->tableType;
|
int8_t tbType = pTbCache->pMeta->tableType;
|
||||||
|
CTG_UNLOCK(CTG_READ, &pTbCache->metaLock);
|
||||||
taosHashRelease(dbCache->tbCache, pTbCache);
|
taosHashRelease(dbCache->tbCache, pTbCache);
|
||||||
SName tsmaSourceTbName = *pName;
|
SName tsmaSourceTbName = *pName;
|
||||||
|
|
||||||
|
|
|
@ -446,17 +446,23 @@ typedef struct STimeWindowAggSupp {
|
||||||
SColumnInfoData timeWindowData; // query time window info for scalar function execution.
|
SColumnInfoData timeWindowData; // query time window info for scalar function execution.
|
||||||
} STimeWindowAggSupp;
|
} STimeWindowAggSupp;
|
||||||
|
|
||||||
|
typedef struct SSteamOpBasicInfo {
|
||||||
|
int32_t primaryPkIndex;
|
||||||
|
bool updateOperatorInfo;
|
||||||
|
} SSteamOpBasicInfo;
|
||||||
|
|
||||||
typedef struct SStreamScanInfo {
|
typedef struct SStreamScanInfo {
|
||||||
SExprInfo* pPseudoExpr;
|
SSteamOpBasicInfo basic;
|
||||||
int32_t numOfPseudoExpr;
|
SExprInfo* pPseudoExpr;
|
||||||
SExprSupp tbnameCalSup;
|
int32_t numOfPseudoExpr;
|
||||||
SExprSupp* pPartTbnameSup;
|
SExprSupp tbnameCalSup;
|
||||||
SExprSupp tagCalSup;
|
SExprSupp* pPartTbnameSup;
|
||||||
int32_t primaryTsIndex; // primary time stamp slot id
|
SExprSupp tagCalSup;
|
||||||
int32_t primaryKeyIndex;
|
int32_t primaryTsIndex; // primary time stamp slot id
|
||||||
SReadHandle readHandle;
|
int32_t primaryKeyIndex;
|
||||||
SInterval interval; // if the upstream is an interval operator, the interval info is also kept here.
|
SReadHandle readHandle;
|
||||||
SColMatchInfo matchInfo;
|
SInterval interval; // if the upstream is an interval operator, the interval info is also kept here.
|
||||||
|
SColMatchInfo matchInfo;
|
||||||
|
|
||||||
SArray* pBlockLists; // multiple SSDatablock.
|
SArray* pBlockLists; // multiple SSDatablock.
|
||||||
SSDataBlock* pRes; // result SSDataBlock
|
SSDataBlock* pRes; // result SSDataBlock
|
||||||
|
@ -568,10 +574,6 @@ typedef struct SOpCheckPointInfo {
|
||||||
SHashObj* children; // key:child id
|
SHashObj* children; // key:child id
|
||||||
} SOpCheckPointInfo;
|
} SOpCheckPointInfo;
|
||||||
|
|
||||||
typedef struct SSteamOpBasicInfo {
|
|
||||||
int32_t primaryPkIndex;
|
|
||||||
} SSteamOpBasicInfo;
|
|
||||||
|
|
||||||
typedef struct SStreamIntervalOperatorInfo {
|
typedef struct SStreamIntervalOperatorInfo {
|
||||||
SOptrBasicInfo binfo; // basic info
|
SOptrBasicInfo binfo; // basic info
|
||||||
SSteamOpBasicInfo basic;
|
SSteamOpBasicInfo basic;
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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 STREAM_EXECUTORINT_H
|
||||||
|
#define STREAM_EXECUTORINT_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "executorInt.h"
|
||||||
|
|
||||||
|
void setStreamOperatorState(SSteamOpBasicInfo* pBasicInfo, EStreamType type);
|
||||||
|
bool needSaveStreamOperatorInfo(SSteamOpBasicInfo* pBasicInfo);
|
||||||
|
void saveStreamOperatorStateComplete(SSteamOpBasicInfo* pBasicInfo);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // STREAM_EXECUTORINT_H
|
|
@ -824,14 +824,17 @@ int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode) {
|
||||||
qDebug("%s sync killed execTask", GET_TASKID(pTaskInfo));
|
qDebug("%s sync killed execTask", GET_TASKID(pTaskInfo));
|
||||||
setTaskKilled(pTaskInfo, TSDB_CODE_TSC_QUERY_KILLED);
|
setTaskKilled(pTaskInfo, TSDB_CODE_TSC_QUERY_KILLED);
|
||||||
|
|
||||||
taosWLockLatch(&pTaskInfo->lock);
|
while(1) {
|
||||||
while (qTaskIsExecuting(pTaskInfo)) {
|
taosWLockLatch(&pTaskInfo->lock);
|
||||||
taosMsleep(10);
|
if (qTaskIsExecuting(pTaskInfo)) { // let's wait for 100 ms and try again
|
||||||
|
taosWUnLockLatch(&pTaskInfo->lock);
|
||||||
|
taosMsleep(100);
|
||||||
|
} else { // not running now
|
||||||
|
pTaskInfo->code = rspCode;
|
||||||
|
taosWUnLockLatch(&pTaskInfo->lock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pTaskInfo->code = rspCode;
|
|
||||||
taosWUnLockLatch(&pTaskInfo->lock);
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qTaskIsExecuting(qTaskInfo_t qinfo) {
|
bool qTaskIsExecuting(qTaskInfo_t qinfo) {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "systable.h"
|
#include "systable.h"
|
||||||
|
#include "streamexecutorInt.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
@ -2426,10 +2427,13 @@ void streamScanOperatorSaveCheckpoint(SStreamScanInfo* pInfo) {
|
||||||
if (!pInfo->pState) {
|
if (!pInfo->pState) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void* pBuf = NULL;
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
int32_t len = streamScanOperatorEncode(pInfo, &pBuf);
|
void* pBuf = NULL;
|
||||||
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_CHECKPOINT_NAME, strlen(STREAM_SCAN_OP_CHECKPOINT_NAME), pBuf, len);
|
int32_t len = streamScanOperatorEncode(pInfo, &pBuf);
|
||||||
taosMemoryFree(pBuf);
|
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_CHECKPOINT_NAME, strlen(STREAM_SCAN_OP_CHECKPOINT_NAME), pBuf, len);
|
||||||
|
taosMemoryFree(pBuf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// other properties are recovered from the execution plan
|
// other properties are recovered from the execution plan
|
||||||
|
@ -2582,6 +2586,7 @@ FETCH_NEXT_BLOCK:
|
||||||
case STREAM_NORMAL:
|
case STREAM_NORMAL:
|
||||||
case STREAM_GET_ALL:
|
case STREAM_GET_ALL:
|
||||||
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
return pBlock;
|
return pBlock;
|
||||||
case STREAM_RETRIEVE: {
|
case STREAM_RETRIEVE: {
|
||||||
pInfo->blockType = STREAM_INPUT__DATA_SUBMIT;
|
pInfo->blockType = STREAM_INPUT__DATA_SUBMIT;
|
||||||
|
@ -2622,6 +2627,7 @@ FETCH_NEXT_BLOCK:
|
||||||
|
|
||||||
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
||||||
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type);
|
||||||
return pInfo->pDeleteDataRes;
|
return pInfo->pDeleteDataRes;
|
||||||
} else {
|
} else {
|
||||||
goto FETCH_NEXT_BLOCK;
|
goto FETCH_NEXT_BLOCK;
|
||||||
|
@ -2639,6 +2645,7 @@ FETCH_NEXT_BLOCK:
|
||||||
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
||||||
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type);
|
||||||
return pInfo->pDeleteDataRes;
|
return pInfo->pDeleteDataRes;
|
||||||
} else {
|
} else {
|
||||||
goto FETCH_NEXT_BLOCK;
|
goto FETCH_NEXT_BLOCK;
|
||||||
|
@ -2652,6 +2659,7 @@ FETCH_NEXT_BLOCK:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
return pBlock;
|
return pBlock;
|
||||||
} else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) {
|
} else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
qDebug("stream scan mode:%d, %s", pInfo->scanMode, id);
|
qDebug("stream scan mode:%d, %s", pInfo->scanMode, id);
|
||||||
|
@ -2659,6 +2667,7 @@ FETCH_NEXT_BLOCK:
|
||||||
case STREAM_SCAN_FROM_RES: {
|
case STREAM_SCAN_FROM_RES: {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
||||||
doCheckUpdate(pInfo, pInfo->pRes->info.window.ekey, pInfo->pRes);
|
doCheckUpdate(pInfo, pInfo->pRes->info.window.ekey, pInfo->pRes);
|
||||||
|
setStreamOperatorState(&pInfo->basic, pInfo->pRes->info.type);
|
||||||
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
||||||
pInfo->pRes->info.dataLoad = 1;
|
pInfo->pRes->info.dataLoad = 1;
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
|
@ -2762,6 +2771,7 @@ FETCH_NEXT_BLOCK:
|
||||||
}
|
}
|
||||||
|
|
||||||
doCheckUpdate(pInfo, pBlockInfo->window.ekey, pInfo->pRes);
|
doCheckUpdate(pInfo, pBlockInfo->window.ekey, pInfo->pRes);
|
||||||
|
setStreamOperatorState(&pInfo->basic, pInfo->pRes->info.type);
|
||||||
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "operator.h"
|
#include "operator.h"
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
|
#include "streamexecutorInt.h"
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
@ -415,13 +416,16 @@ void* doStreamCountDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
||||||
|
|
||||||
void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) {
|
void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||||
SStreamCountAggOperatorInfo* pInfo = pOperator->info;
|
SStreamCountAggOperatorInfo* pInfo = pOperator->info;
|
||||||
int32_t len = doStreamCountEncodeOpState(NULL, 0, pOperator, true);
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* buf = taosMemoryCalloc(1, len);
|
int32_t len = doStreamCountEncodeOpState(NULL, 0, pOperator, true);
|
||||||
void* pBuf = buf;
|
void* buf = taosMemoryCalloc(1, len);
|
||||||
len = doStreamCountEncodeOpState(&pBuf, len, pOperator, true);
|
void* pBuf = buf;
|
||||||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_COUNT_OP_CHECKPOINT_NAME,
|
len = doStreamCountEncodeOpState(&pBuf, len, pOperator, true);
|
||||||
strlen(STREAM_COUNT_OP_CHECKPOINT_NAME), buf, len);
|
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_COUNT_OP_CHECKPOINT_NAME,
|
||||||
taosMemoryFree(buf);
|
strlen(STREAM_COUNT_OP_CHECKPOINT_NAME), buf, len);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void doResetCountWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock) {
|
void doResetCountWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock) {
|
||||||
|
@ -550,6 +554,7 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) {
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) {
|
||||||
bool add = pInfo->destHasPrimaryKey && IS_NORMAL_COUNT_OP(pOperator);
|
bool add = pInfo->destHasPrimaryKey && IS_NORMAL_COUNT_OP(pOperator);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "operator.h"
|
#include "operator.h"
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
|
#include "streamexecutorInt.h"
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -458,13 +459,16 @@ void* doStreamEventDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
||||||
|
|
||||||
void doStreamEventSaveCheckpoint(SOperatorInfo* pOperator) {
|
void doStreamEventSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||||
SStreamEventAggOperatorInfo* pInfo = pOperator->info;
|
SStreamEventAggOperatorInfo* pInfo = pOperator->info;
|
||||||
int32_t len = doStreamEventEncodeOpState(NULL, 0, pOperator);
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* buf = taosMemoryCalloc(1, len);
|
int32_t len = doStreamEventEncodeOpState(NULL, 0, pOperator);
|
||||||
void* pBuf = buf;
|
void* buf = taosMemoryCalloc(1, len);
|
||||||
len = doStreamEventEncodeOpState(&pBuf, len, pOperator);
|
void* pBuf = buf;
|
||||||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_EVENT_OP_CHECKPOINT_NAME,
|
len = doStreamEventEncodeOpState(&pBuf, len, pOperator);
|
||||||
strlen(STREAM_EVENT_OP_CHECKPOINT_NAME), buf, len);
|
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_EVENT_OP_CHECKPOINT_NAME,
|
||||||
taosMemoryFree(buf);
|
strlen(STREAM_EVENT_OP_CHECKPOINT_NAME), buf, len);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* buildEventResult(SOperatorInfo* pOperator) {
|
static SSDataBlock* buildEventResult(SOperatorInfo* pOperator) {
|
||||||
|
@ -531,6 +535,7 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
||||||
pBlock->info.type == STREAM_CLEAR) {
|
pBlock->info.type == STREAM_CLEAR) {
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* 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 "executorInt.h"
|
||||||
|
|
||||||
|
void setStreamOperatorState(SSteamOpBasicInfo* pBasicInfo, EStreamType type) {
|
||||||
|
if (type != STREAM_GET_ALL && type != STREAM_CHECKPOINT) {
|
||||||
|
pBasicInfo->updateOperatorInfo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool needSaveStreamOperatorInfo(SSteamOpBasicInfo* pBasicInfo) {
|
||||||
|
return pBasicInfo->updateOperatorInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void saveStreamOperatorStateComplete(SSteamOpBasicInfo* pBasicInfo) {
|
||||||
|
pBasicInfo->updateOperatorInfo = false;
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "operator.h"
|
#include "operator.h"
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
|
#include "streamexecutorInt.h"
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -1211,13 +1212,16 @@ void doStreamIntervalDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera
|
||||||
|
|
||||||
void doStreamIntervalSaveCheckpoint(SOperatorInfo* pOperator) {
|
void doStreamIntervalSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||||
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
||||||
int32_t len = doStreamIntervalEncodeOpState(NULL, 0, pOperator);
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* buf = taosMemoryCalloc(1, len);
|
int32_t len = doStreamIntervalEncodeOpState(NULL, 0, pOperator);
|
||||||
void* pBuf = buf;
|
void* buf = taosMemoryCalloc(1, len);
|
||||||
len = doStreamIntervalEncodeOpState(&pBuf, len, pOperator);
|
void* pBuf = buf;
|
||||||
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_INTERVAL_OP_CHECKPOINT_NAME,
|
len = doStreamIntervalEncodeOpState(&pBuf, len, pOperator);
|
||||||
strlen(STREAM_INTERVAL_OP_CHECKPOINT_NAME), buf, len);
|
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_INTERVAL_OP_CHECKPOINT_NAME,
|
||||||
taosMemoryFree(buf);
|
strlen(STREAM_INTERVAL_OP_CHECKPOINT_NAME), buf, len);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copyIntervalDeleteKey(SSHashObj* pMap, SArray* pWins) {
|
static void copyIntervalDeleteKey(SSHashObj* pMap, SArray* pWins) {
|
||||||
|
@ -1347,6 +1351,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
pInfo->numOfDatapack++;
|
pInfo->numOfDatapack++;
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
|
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
|
||||||
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
||||||
|
@ -2690,13 +2695,16 @@ void* doStreamSessionDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera
|
||||||
|
|
||||||
void doStreamSessionSaveCheckpoint(SOperatorInfo* pOperator) {
|
void doStreamSessionSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||||
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
|
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
|
||||||
int32_t len = doStreamSessionEncodeOpState(NULL, 0, pOperator, true);
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* buf = taosMemoryCalloc(1, len);
|
int32_t len = doStreamSessionEncodeOpState(NULL, 0, pOperator, true);
|
||||||
void* pBuf = buf;
|
void* buf = taosMemoryCalloc(1, len);
|
||||||
len = doStreamSessionEncodeOpState(&pBuf, len, pOperator, true);
|
void* pBuf = buf;
|
||||||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_SESSION_OP_CHECKPOINT_NAME,
|
len = doStreamSessionEncodeOpState(&pBuf, len, pOperator, true);
|
||||||
strlen(STREAM_SESSION_OP_CHECKPOINT_NAME), buf, len);
|
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_SESSION_OP_CHECKPOINT_NAME,
|
||||||
taosMemoryFree(buf);
|
strlen(STREAM_SESSION_OP_CHECKPOINT_NAME), buf, len);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetUnCloseSessionWinInfo(SSHashObj* winMap) {
|
void resetUnCloseSessionWinInfo(SSHashObj* winMap) {
|
||||||
|
@ -2766,6 +2774,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
||||||
pBlock->info.type == STREAM_CLEAR) {
|
pBlock->info.type == STREAM_CLEAR) {
|
||||||
|
@ -3176,6 +3185,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
||||||
pBlock->info.type == STREAM_CLEAR) {
|
pBlock->info.type == STREAM_CLEAR) {
|
||||||
|
@ -3673,13 +3683,16 @@ void* doStreamStateDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
||||||
|
|
||||||
void doStreamStateSaveCheckpoint(SOperatorInfo* pOperator) {
|
void doStreamStateSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||||
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
||||||
int32_t len = doStreamStateEncodeOpState(NULL, 0, pOperator, true);
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* buf = taosMemoryCalloc(1, len);
|
int32_t len = doStreamStateEncodeOpState(NULL, 0, pOperator, true);
|
||||||
void* pBuf = buf;
|
void* buf = taosMemoryCalloc(1, len);
|
||||||
len = doStreamStateEncodeOpState(&pBuf, len, pOperator, true);
|
void* pBuf = buf;
|
||||||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_STATE_OP_CHECKPOINT_NAME,
|
len = doStreamStateEncodeOpState(&pBuf, len, pOperator, true);
|
||||||
strlen(STREAM_STATE_OP_CHECKPOINT_NAME), buf, len);
|
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_STATE_OP_CHECKPOINT_NAME,
|
||||||
taosMemoryFree(buf);
|
strlen(STREAM_STATE_OP_CHECKPOINT_NAME), buf, len);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* buildStateResult(SOperatorInfo* pOperator) {
|
static SSDataBlock* buildStateResult(SOperatorInfo* pOperator) {
|
||||||
|
@ -3746,6 +3759,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
||||||
pBlock->info.type == STREAM_CLEAR) {
|
pBlock->info.type == STREAM_CLEAR) {
|
||||||
|
@ -4069,6 +4083,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
pInfo->numOfDatapack++;
|
pInfo->numOfDatapack++;
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
|
||||||
pBlock->info.type == STREAM_CLEAR) {
|
pBlock->info.type == STREAM_CLEAR) {
|
||||||
|
@ -4465,6 +4480,7 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
pInfo->numOfDatapack++;
|
pInfo->numOfDatapack++;
|
||||||
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo));
|
||||||
|
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
|
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
|
||||||
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
||||||
|
|
|
@ -1651,50 +1651,56 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
|
||||||
SSysTableScanInfo* pInfo = pOperator->info;
|
SSysTableScanInfo* pInfo = pOperator->info;
|
||||||
char dbName[TSDB_DB_NAME_LEN] = {0};
|
char dbName[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
|
||||||
if (isTaskKilled(pOperator->pTaskInfo)) {
|
while (1) {
|
||||||
setOperatorCompleted(pOperator);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
blockDataCleanup(pInfo->pRes);
|
if (isTaskKilled(pOperator->pTaskInfo)) {
|
||||||
|
|
||||||
const char* name = tNameGetTableName(&pInfo->name);
|
|
||||||
if (pInfo->showRewrite) {
|
|
||||||
getDBNameFromCondition(pInfo->pCondition, dbName);
|
|
||||||
if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
|
|
||||||
strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
|
|
||||||
sprintf(pInfo->req.db, "%d.%s", pInfo->accountId, dbName);
|
|
||||||
}
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
|
|
||||||
getDBNameFromCondition(pInfo->pCondition, dbName);
|
|
||||||
if (dbName[0]) sprintf(pInfo->req.db, "%d.%s", pInfo->accountId, dbName);
|
|
||||||
sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
|
|
||||||
}
|
|
||||||
|
|
||||||
SSDataBlock* pBlock = NULL;
|
|
||||||
if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
|
|
||||||
pBlock = sysTableScanUserTables(pOperator);
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
|
|
||||||
pBlock = sysTableScanUserTags(pOperator);
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
|
|
||||||
pBlock = sysTableScanUserCols(pOperator);
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
|
|
||||||
IS_SYS_DBNAME(dbName)) {
|
|
||||||
pBlock = sysTableScanUserSTables(pOperator);
|
|
||||||
} else { // load the meta from mnode of the given epset
|
|
||||||
pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
|
|
||||||
if (pBlock != NULL) {
|
|
||||||
bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
|
|
||||||
if (limitReached) {
|
|
||||||
setOperatorCompleted(pOperator);
|
setOperatorCompleted(pOperator);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pBlock->info.rows > 0 ? pBlock : NULL;
|
blockDataCleanup(pInfo->pRes);
|
||||||
} else {
|
|
||||||
return NULL;
|
const char* name = tNameGetTableName(&pInfo->name);
|
||||||
|
if (pInfo->showRewrite) {
|
||||||
|
getDBNameFromCondition(pInfo->pCondition, dbName);
|
||||||
|
if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
|
||||||
|
strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
|
||||||
|
sprintf(pInfo->req.db, "%d.%s", pInfo->accountId, dbName);
|
||||||
|
}
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
|
getDBNameFromCondition(pInfo->pCondition, dbName);
|
||||||
|
if (dbName[0]) sprintf(pInfo->req.db, "%d.%s", pInfo->accountId, dbName);
|
||||||
|
sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
|
||||||
|
}
|
||||||
|
|
||||||
|
SSDataBlock* pBlock = NULL;
|
||||||
|
if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
|
pBlock = sysTableScanUserTables(pOperator);
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
|
pBlock = sysTableScanUserTags(pOperator);
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
|
||||||
|
pBlock = sysTableScanUserCols(pOperator);
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
|
||||||
|
IS_SYS_DBNAME(dbName)) {
|
||||||
|
pBlock = sysTableScanUserSTables(pOperator);
|
||||||
|
} else { // load the meta from mnode of the given epset
|
||||||
|
pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
|
||||||
|
if (pBlock != NULL) {
|
||||||
|
bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
|
||||||
|
if (limitReached) {
|
||||||
|
setOperatorCompleted(pOperator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pBlock->info.rows == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return pBlock;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1424,7 +1424,7 @@ int main(int argc, char *argv[]) {
|
||||||
printf("failed to start since init log error\n");
|
printf("failed to start since init log error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 0) != 0) {
|
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 0, true) != 0) {
|
||||||
fnError("failed to start since read config error");
|
fnError("failed to start since read config error");
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,7 +127,7 @@ int aggregateFuncTest() {
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
parseArgs(argc, argv);
|
parseArgs(argc, argv);
|
||||||
initLog();
|
initLog();
|
||||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 0) != 0) {
|
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 0, true) != 0) {
|
||||||
fnError("failed to start since read config error");
|
fnError("failed to start since read config error");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,67 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int initWktRegex(pcre2_code **ppRegex, pcre2_match_data **ppMatchData) {
|
||||||
|
int ret = 0;
|
||||||
|
char *wktPatternWithSpace = taosMemoryCalloc(4, 1024);
|
||||||
|
sprintf(
|
||||||
|
wktPatternWithSpace,
|
||||||
|
"^( *)point( *)z?m?( *)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *)\\)))|linestring( *)z?m?( "
|
||||||
|
"*)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))|polygon( *)z?m?( "
|
||||||
|
"*)((empty)|(\\(( *)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))(( *)(,)( "
|
||||||
|
"*)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))( *))*( "
|
||||||
|
"*)\\)))|multipoint( *)z?m?( *)((empty)|(\\(( "
|
||||||
|
"*)((([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}|((empty)|(\\(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *)\\))))(( *)(,)( "
|
||||||
|
"*)((([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}|((empty)|(\\(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *)\\))))( *))*( "
|
||||||
|
"*)\\)))|multilinestring( *)z?m?( *)((empty)|(\\(( *)((empty)|(\\(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))(( *)(,)( "
|
||||||
|
"*)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))( *))*( "
|
||||||
|
"*)\\)))|multipolygon( *)z?m?( *)((empty)|(\\(( *)((empty)|(\\(( *)((empty)|(\\(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))(( *)(,)( "
|
||||||
|
"*)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))( *))*( *)\\)))(( *)(,)( "
|
||||||
|
"*)((empty)|(\\(( *)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))(( *)(,)( "
|
||||||
|
"*)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}(( *)(,)( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( "
|
||||||
|
"*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))( *))*( *)\\)))( *))*( "
|
||||||
|
"*)\\)))|(GEOCOLLECTION\\((?R)(( *)(,)( *)(?R))*( *)\\))( *)$");
|
||||||
|
|
||||||
|
ret = doRegComp(ppRegex, ppMatchData, wktPatternWithSpace);
|
||||||
|
taosMemoryFree(wktPatternWithSpace);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t initCtxGeomFromText() {
|
int32_t initCtxGeomFromText() {
|
||||||
int32_t code = TSDB_CODE_FAILED;
|
int32_t code = TSDB_CODE_FAILED;
|
||||||
SGeosContext* geosCtx = getThreadLocalGeosCtx();
|
SGeosContext* geosCtx = getThreadLocalGeosCtx();
|
||||||
|
@ -113,6 +174,10 @@ int32_t initCtxGeomFromText() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (geosCtx->WKTRegex == NULL) {
|
||||||
|
if (initWktRegex(&geosCtx->WKTRegex, &geosCtx->WKTMatchData) != 0) return code;
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +190,11 @@ int32_t doGeomFromText(const char *inputWKT, unsigned char **outputGeom, size_t
|
||||||
GEOSGeometry *geom = NULL;
|
GEOSGeometry *geom = NULL;
|
||||||
unsigned char *wkb = NULL;
|
unsigned char *wkb = NULL;
|
||||||
|
|
||||||
|
if (doRegExec(inputWKT, geosCtx->WKTRegex, geosCtx->WKTMatchData) != 0) {
|
||||||
|
code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
geom = GEOSWKTReader_read_r(geosCtx->handle, geosCtx->WKTReader, inputWKT);
|
geom = GEOSWKTReader_read_r(geosCtx->handle, geosCtx->WKTReader, inputWKT);
|
||||||
if (geom == NULL) {
|
if (geom == NULL) {
|
||||||
code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
|
code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
|
||||||
|
|
|
@ -187,6 +187,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "BalanceVgroupStmt";
|
return "BalanceVgroupStmt";
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||||
return "BalanceVgroupLeaderStmt";
|
return "BalanceVgroupLeaderStmt";
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||||
|
return "BalanceVgroupLeaderStmt";
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
return "MergeVgroupStmt";
|
return "MergeVgroupStmt";
|
||||||
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
|
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
|
||||||
|
@ -7607,6 +7609,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return TSDB_CODE_SUCCESS; // SBalanceVgroupStmt has no fields to serialize.
|
return TSDB_CODE_SUCCESS; // SBalanceVgroupStmt has no fields to serialize.
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||||
return TSDB_CODE_SUCCESS; // SBalanceVgroupLeaderStmt has no fields to serialize.
|
return TSDB_CODE_SUCCESS; // SBalanceVgroupLeaderStmt has no fields to serialize.
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
return mergeVgroupStmtToJson(pObj, pJson);
|
return mergeVgroupStmtToJson(pObj, pJson);
|
||||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||||
|
@ -7953,7 +7957,9 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
case QUERY_NODE_BALANCE_VGROUP_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_STMT:
|
||||||
return TSDB_CODE_SUCCESS; // SBalanceVgroupStmt has no fields to deserialize.
|
return TSDB_CODE_SUCCESS; // SBalanceVgroupStmt has no fields to deserialize.
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||||
return TSDB_CODE_SUCCESS; // SBalanceVgroupLeaderStmt has no fields to deserialize.
|
return TSDB_CODE_SUCCESS;
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||||
|
return TSDB_CODE_SUCCESS; // SBalanceVgroupLeaderStmt has no fields to deserialize.
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
return jsonToMergeVgroupStmt(pJson, pObj);
|
return jsonToMergeVgroupStmt(pJson, pObj);
|
||||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||||
|
|
|
@ -473,6 +473,8 @@ SNode* nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SBalanceVgroupStmt));
|
return makeNode(type, sizeof(SBalanceVgroupStmt));
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||||
return makeNode(type, sizeof(SBalanceVgroupLeaderStmt));
|
return makeNode(type, sizeof(SBalanceVgroupLeaderStmt));
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||||
|
return makeNode(type, sizeof(SBalanceVgroupLeaderStmt));
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
return makeNode(type, sizeof(SMergeVgroupStmt));
|
return makeNode(type, sizeof(SMergeVgroupStmt));
|
||||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||||
|
@ -1161,6 +1163,7 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
case QUERY_NODE_RESUME_STREAM_STMT: // no pointer field
|
case QUERY_NODE_RESUME_STREAM_STMT: // no pointer field
|
||||||
case QUERY_NODE_BALANCE_VGROUP_STMT: // no pointer field
|
case QUERY_NODE_BALANCE_VGROUP_STMT: // no pointer field
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT: // no pointer field
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT: // no pointer field
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT: // no pointer field
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT: // no pointer field
|
case QUERY_NODE_MERGE_VGROUP_STMT: // no pointer field
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||||
|
|
|
@ -274,6 +274,7 @@ SNode* createKillStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pId
|
||||||
SNode* createKillQueryStmt(SAstCreateContext* pCxt, const SToken* pQueryId);
|
SNode* createKillQueryStmt(SAstCreateContext* pCxt, const SToken* pQueryId);
|
||||||
SNode* createBalanceVgroupStmt(SAstCreateContext* pCxt);
|
SNode* createBalanceVgroupStmt(SAstCreateContext* pCxt);
|
||||||
SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
||||||
|
SNode* createBalanceVgroupLeaderDBNameStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
||||||
SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2);
|
SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2);
|
||||||
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes);
|
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes);
|
||||||
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
||||||
|
|
|
@ -773,6 +773,7 @@ cmd ::= KILL COMPACT NK_INTEGER(A).
|
||||||
/************************************************ merge/redistribute/ vgroup ******************************************/
|
/************************************************ merge/redistribute/ vgroup ******************************************/
|
||||||
cmd ::= BALANCE VGROUP. { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); }
|
cmd ::= BALANCE VGROUP. { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); }
|
||||||
cmd ::= BALANCE VGROUP LEADER on_vgroup_id(A). { pCxt->pRootNode = createBalanceVgroupLeaderStmt(pCxt, &A); }
|
cmd ::= BALANCE VGROUP LEADER on_vgroup_id(A). { pCxt->pRootNode = createBalanceVgroupLeaderStmt(pCxt, &A); }
|
||||||
|
cmd ::= BALANCE VGROUP LEADER DATABASE db_name(A). { pCxt->pRootNode = createBalanceVgroupLeaderDBNameStmt(pCxt, &A); }
|
||||||
cmd ::= MERGE VGROUP NK_INTEGER(A) NK_INTEGER(B). { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &A, &B); }
|
cmd ::= MERGE VGROUP NK_INTEGER(A) NK_INTEGER(B). { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &A, &B); }
|
||||||
cmd ::= REDISTRIBUTE VGROUP NK_INTEGER(A) dnode_list(B). { pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &A, B); }
|
cmd ::= REDISTRIBUTE VGROUP NK_INTEGER(A) dnode_list(B). { pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &A, B); }
|
||||||
cmd ::= SPLIT VGROUP NK_INTEGER(A). { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &A); }
|
cmd ::= SPLIT VGROUP NK_INTEGER(A). { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &A); }
|
||||||
|
|
|
@ -2809,6 +2809,16 @@ SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgI
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createBalanceVgroupLeaderDBNameStmt(SAstCreateContext* pCxt, const SToken* pDbName){
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
SBalanceVgroupLeaderStmt* pStmt = (SBalanceVgroupLeaderStmt*)nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
if (NULL != pDbName) {
|
||||||
|
COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName);
|
||||||
|
}
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2) {
|
SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
SMergeVgroupStmt* pStmt = (SMergeVgroupStmt*)nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT);
|
SMergeVgroupStmt* pStmt = (SMergeVgroupStmt*)nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT);
|
||||||
|
|
|
@ -42,7 +42,6 @@ int32_t buildQueryAfterParse(SQuery** pQuery, SNode* pRootNode, int16_t placehol
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
|
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
|
||||||
SAstCreateContext cxt;
|
SAstCreateContext cxt;
|
||||||
initAstCreateContext(pParseCxt, &cxt);
|
initAstCreateContext(pParseCxt, &cxt);
|
||||||
|
@ -635,8 +634,8 @@ static int32_t collectMetaKeyFromShowCompacts(SCollectMetaKeyCxt* pCxt, SShowStm
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_COMPACT_DETAILS,
|
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
|
||||||
pCxt->pMetaCache);
|
TSDB_INS_TABLE_COMPACT_DETAILS, pCxt->pMetaCache);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -691,7 +690,7 @@ static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowC
|
||||||
int32_t code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->viewName, 0);
|
int32_t code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->viewName, 0);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
|
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
|
||||||
AUTH_TYPE_READ, pCxt->pMetaCache);
|
AUTH_TYPE_READ, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
||||||
|
@ -700,7 +699,6 @@ static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowC
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_APPS,
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_APPS,
|
||||||
pCxt->pMetaCache);
|
pCxt->pMetaCache);
|
||||||
|
@ -759,24 +757,22 @@ static int32_t collectMetaKeyFromRevoke(SCollectMetaKeyCxt* pCxt, SRevokeStmt* p
|
||||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->objName, pStmt->tabName, pCxt->pMetaCache);
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->objName, pStmt->tabName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromCreateViewStmt(SCollectMetaKeyCxt* pCxt, SCreateViewStmt* pStmt) {
|
static int32_t collectMetaKeyFromCreateViewStmt(SCollectMetaKeyCxt* pCxt, SCreateViewStmt* pStmt) {
|
||||||
int32_t code =
|
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
||||||
reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
|
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
|
||||||
pCxt->pMetaCache);
|
pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName, AUTH_TYPE_ALTER,
|
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
|
||||||
pCxt->pMetaCache);
|
AUTH_TYPE_ALTER, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromDropViewStmt(SCollectMetaKeyCxt* pCxt, SDropViewStmt* pStmt) {
|
static int32_t collectMetaKeyFromDropViewStmt(SCollectMetaKeyCxt* pCxt, SDropViewStmt* pStmt) {
|
||||||
int32_t code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName, AUTH_TYPE_ALTER,
|
int32_t code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName,
|
||||||
pCxt->pMetaCache);
|
pStmt->viewName, AUTH_TYPE_ALTER, pCxt->pMetaCache);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -787,7 +783,7 @@ static int32_t collectMetaKeyFromCreateTSMAStmt(SCollectMetaKeyCxt* pCxt, SCreat
|
||||||
code = reserveTSMAInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
code = reserveTSMAInfoInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
char dstTbName[TSDB_TABLE_NAME_LEN] = {0};
|
char dstTbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
snprintf(dstTbName, TSDB_TABLE_NAME_LEN, "%s"TSMA_RES_STB_POSTFIX, pStmt->tableName);
|
snprintf(dstTbName, TSDB_TABLE_NAME_LEN, "%s" TSMA_RES_STB_POSTFIX, pStmt->tableName);
|
||||||
code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
|
code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
|
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, dstTbName, pCxt->pMetaCache);
|
||||||
|
@ -925,7 +921,7 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
case QUERY_NODE_SHOW_COMPACTS_STMT:
|
case QUERY_NODE_SHOW_COMPACTS_STMT:
|
||||||
return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
||||||
return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
|
case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
|
||||||
return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
|
case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
|
||||||
|
|
|
@ -4338,7 +4338,7 @@ int32_t translateTable(STranslateContext* pCxt, SNode** pTable, SNode* pJoinPare
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GET_META_ERROR, tstrerror(code));
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GET_META_ERROR, tstrerror(code));
|
||||||
}
|
}
|
||||||
#ifdef TD_ENTERPRISE
|
#ifdef TD_ENTERPRISE
|
||||||
if (TSDB_VIEW_TABLE == pRealTable->pMeta->tableType) {
|
if (TSDB_VIEW_TABLE == pRealTable->pMeta->tableType && !pCurrSmt->tagScan) {
|
||||||
return translateView(pCxt, pTable, &name);
|
return translateView(pCxt, pTable, &name);
|
||||||
}
|
}
|
||||||
translateAudit(pCxt, pRealTable, &name);
|
translateAudit(pCxt, pRealTable, &name);
|
||||||
|
@ -10578,6 +10578,7 @@ static int32_t translateBalanceVgroup(STranslateContext* pCxt, SBalanceVgroupStm
|
||||||
static int32_t translateBalanceVgroupLeader(STranslateContext* pCxt, SBalanceVgroupLeaderStmt* pStmt) {
|
static int32_t translateBalanceVgroupLeader(STranslateContext* pCxt, SBalanceVgroupLeaderStmt* pStmt) {
|
||||||
SBalanceVgroupLeaderReq req = {0};
|
SBalanceVgroupLeaderReq req = {0};
|
||||||
req.vgId = pStmt->vgId;
|
req.vgId = pStmt->vgId;
|
||||||
|
if(pStmt->dbName != NULL) strcpy(req.db, pStmt->dbName);
|
||||||
int32_t code =
|
int32_t code =
|
||||||
buildCmdMsg(pCxt, TDMT_MND_BALANCE_VGROUP_LEADER, (FSerializeFunc)tSerializeSBalanceVgroupLeaderReq, &req);
|
buildCmdMsg(pCxt, TDMT_MND_BALANCE_VGROUP_LEADER, (FSerializeFunc)tSerializeSBalanceVgroupLeaderReq, &req);
|
||||||
tFreeSBalanceVgroupLeaderReq(&req);
|
tFreeSBalanceVgroupLeaderReq(&req);
|
||||||
|
@ -11263,6 +11264,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||||
code = translateBalanceVgroupLeader(pCxt, (SBalanceVgroupLeaderStmt*)pNode);
|
code = translateBalanceVgroupLeader(pCxt, (SBalanceVgroupLeaderStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||||
|
code = translateBalanceVgroupLeader(pCxt, (SBalanceVgroupLeaderStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||||
code = translateMergeVgroup(pCxt, (SMergeVgroupStmt*)pNode);
|
code = translateMergeVgroup(pCxt, (SMergeVgroupStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
@ -11875,11 +11879,18 @@ static int32_t checkShowTags(STranslateContext* pCxt, const SShowStmt* pShow) {
|
||||||
toName(pCxt->pParseCxt->acctId, ((SValueNode*)pShow->pDbName)->literal,
|
toName(pCxt->pParseCxt->acctId, ((SValueNode*)pShow->pDbName)->literal,
|
||||||
((SValueNode*)pShow->pTbName)->literal, &name),
|
((SValueNode*)pShow->pTbName)->literal, &name),
|
||||||
&pTableMeta, true);
|
&pTableMeta, true);
|
||||||
taosMemoryFreeClear(pTableMeta);
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GET_META_ERROR, tstrerror(code));
|
code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GET_META_ERROR, tstrerror(code));
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
if (TSDB_SUPER_TABLE != pTableMeta->tableType && TSDB_CHILD_TABLE != pTableMeta->tableType) {
|
||||||
|
code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAGS_PC,
|
||||||
|
"The _TAGS pseudo column can only be used for child table and super table queries");
|
||||||
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -246,11 +246,10 @@ static bool scanPathOptMayBeOptimized(SLogicNode* pNode) {
|
||||||
|
|
||||||
static bool scanPathOptShouldGetFuncs(SLogicNode* pNode) {
|
static bool scanPathOptShouldGetFuncs(SLogicNode* pNode) {
|
||||||
if (QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode)) {
|
if (QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode)) {
|
||||||
if (pNode->pParent && QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode->pParent)) {
|
if (!pNode->pParent || QUERY_NODE_LOGIC_PLAN_WINDOW != nodeType(pNode->pParent) ||
|
||||||
if (WINDOW_TYPE_INTERVAL == ((SWindowLogicNode*)pNode->pParent)->winType) return true;
|
WINDOW_TYPE_INTERVAL == ((SWindowLogicNode*)pNode->pParent)->winType)
|
||||||
} else {
|
|
||||||
return !scanPathOptHaveNormalCol(((SPartitionLogicNode*)pNode)->pPartitionKeys);
|
return !scanPathOptHaveNormalCol(((SPartitionLogicNode*)pNode)->pPartitionKeys);
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode) &&
|
if ((QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode) &&
|
||||||
|
|
|
@ -1631,6 +1631,8 @@ int32_t streamMetaAddFailedTask(SStreamMeta* pMeta, int64_t streamId, int32_t ta
|
||||||
streamMetaAddTaskLaunchResult(pMeta, hId.streamId, hId.taskId, startTs, now, false);
|
streamMetaAddTaskLaunchResult(pMeta, hId.streamId, hId.taskId, startTs, now, false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
streamMetaRUnLock(pMeta);
|
||||||
|
|
||||||
stError("failed to locate the stream task:0x%" PRIx64 "-0x%x (vgId:%d), it may have been destroyed or stopped",
|
stError("failed to locate the stream task:0x%" PRIx64 "-0x%x (vgId:%d), it may have been destroyed or stopped",
|
||||||
streamId, taskId, pMeta->vgId);
|
streamId, taskId, pMeta->vgId);
|
||||||
code = TSDB_CODE_STREAM_TASK_NOT_EXIST;
|
code = TSDB_CODE_STREAM_TASK_NOT_EXIST;
|
||||||
|
|
|
@ -557,7 +557,6 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
const int32_t BATCH_LIMIT = 256;
|
const int32_t BATCH_LIMIT = 256;
|
||||||
|
|
||||||
int64_t st = taosGetTimestampMs();
|
int64_t st = taosGetTimestampMs();
|
||||||
int32_t numOfElems = listNEles(pSnapshot);
|
|
||||||
SListNode* pNode = NULL;
|
SListNode* pNode = NULL;
|
||||||
|
|
||||||
int idx = streamStateGetCfIdx(pFileState->pFileStore, pFileState->cfName);
|
int idx = streamStateGetCfIdx(pFileState->pFileStore, pFileState->cfName);
|
||||||
|
@ -589,8 +588,11 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
}
|
}
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
|
|
||||||
if (streamStateGetBatchSize(batch) > 0) {
|
int32_t numOfElems = streamStateGetBatchSize(batch);
|
||||||
|
if (numOfElems > 0) {
|
||||||
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
||||||
|
} else {
|
||||||
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
streamStateClearBatch(batch);
|
streamStateClearBatch(batch);
|
||||||
|
@ -609,6 +611,7 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_end:
|
||||||
streamStateDestroyBatch(batch);
|
streamStateDestroyBatch(batch);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,7 @@ typedef struct {
|
||||||
STransMsg* pRsp;
|
STransMsg* pRsp;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
int8_t hasEpSet;
|
int8_t hasEpSet;
|
||||||
tsem_t* pSem;
|
tsem2_t* pSem;
|
||||||
int8_t inited;
|
int8_t inited;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
} STransSyncMsg;
|
} STransSyncMsg;
|
||||||
|
|
|
@ -2450,7 +2450,7 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) {
|
||||||
pSyncMsg->hasEpSet = 1;
|
pSyncMsg->hasEpSet = 1;
|
||||||
epsetAssign(&pSyncMsg->epSet, &pCtx->epSet);
|
epsetAssign(&pSyncMsg->epSet, &pCtx->epSet);
|
||||||
}
|
}
|
||||||
tsem_post(pSyncMsg->pSem);
|
tsem2_post(pSyncMsg->pSem);
|
||||||
taosReleaseRef(transGetSyncMsgMgt(), pCtx->syncMsgRef);
|
taosReleaseRef(transGetSyncMsgMgt(), pCtx->syncMsgRef);
|
||||||
} else {
|
} else {
|
||||||
rpcFreeCont(pResp->pCont);
|
rpcFreeCont(pResp->pCont);
|
||||||
|
@ -2679,8 +2679,8 @@ _RETURN:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
int64_t transCreateSyncMsg(STransMsg* pTransMsg) {
|
int64_t transCreateSyncMsg(STransMsg* pTransMsg) {
|
||||||
tsem_t* sem = taosMemoryCalloc(1, sizeof(tsem_t));
|
tsem2_t* sem = taosMemoryCalloc(1, sizeof(tsem2_t));
|
||||||
tsem_init(sem, 0, 0);
|
tsem2_init(sem, 0, 0);
|
||||||
|
|
||||||
STransSyncMsg* pSyncMsg = taosMemoryCalloc(1, sizeof(STransSyncMsg));
|
STransSyncMsg* pSyncMsg = taosMemoryCalloc(1, sizeof(STransSyncMsg));
|
||||||
|
|
||||||
|
@ -2740,7 +2740,7 @@ int transSendRecvWithTimeout(void* shandle, SEpSet* pEpSet, STransMsg* pReq, STr
|
||||||
goto _RETURN;
|
goto _RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = tsem_timewait(pSyncMsg->pSem, timeoutMs);
|
ret = tsem2_timewait(pSyncMsg->pSem, timeoutMs);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pRsp->code = TSDB_CODE_TIMEOUT_ERROR;
|
pRsp->code = TSDB_CODE_TIMEOUT_ERROR;
|
||||||
ret = TSDB_CODE_TIMEOUT_ERROR;
|
ret = TSDB_CODE_TIMEOUT_ERROR;
|
||||||
|
|
|
@ -681,7 +681,7 @@ void transDestroySyncMsg(void* msg) {
|
||||||
if (msg == NULL) return;
|
if (msg == NULL) return;
|
||||||
|
|
||||||
STransSyncMsg* pSyncMsg = msg;
|
STransSyncMsg* pSyncMsg = msg;
|
||||||
tsem_destroy(pSyncMsg->pSem);
|
tsem2_destroy(pSyncMsg->pSem);
|
||||||
taosMemoryFree(pSyncMsg->pSem);
|
taosMemoryFree(pSyncMsg->pSem);
|
||||||
transFreeMsg(pSyncMsg->pRsp->pCont);
|
transFreeMsg(pSyncMsg->pRsp->pCont);
|
||||||
taosMemoryFree(pSyncMsg->pRsp);
|
taosMemoryFree(pSyncMsg->pRsp);
|
||||||
|
|
|
@ -215,14 +215,6 @@ int32_t taosGetAppName(char* name, int32_t* len) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsem_wait(tsem_t* sem) {
|
|
||||||
int ret = 0;
|
|
||||||
do {
|
|
||||||
ret = sem_wait(sem);
|
|
||||||
} while (ret != 0 && errno == EINTR);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
|
int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -241,4 +233,101 @@ int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tsem_wait(tsem_t* sem) {
|
||||||
|
int ret = 0;
|
||||||
|
do {
|
||||||
|
ret = sem_wait(sem);
|
||||||
|
} while (ret != 0 && errno == EINTR);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem2_init(tsem2_t* sem, int pshared, unsigned int value) {
|
||||||
|
int ret = taosThreadMutexInit(&sem->mutex, NULL);
|
||||||
|
if (ret != 0) return ret;
|
||||||
|
ret = taosThreadCondAttrInit(&sem->attr);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
taosThreadMutexDestroy(&sem->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ret = taosThreadCondAttrSetclock(&sem->attr, CLOCK_MONOTONIC);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
taosThreadMutexDestroy(&sem->mutex);
|
||||||
|
taosThreadCondAttrDestroy(&sem->attr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ret = taosThreadCondInit(&sem->cond, &sem->attr);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
taosThreadMutexDestroy(&sem->mutex);
|
||||||
|
taosThreadCondAttrDestroy(&sem->attr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
sem->count = value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem2_post(tsem2_t *sem) {
|
||||||
|
taosThreadMutexLock(&sem->mutex);
|
||||||
|
sem->count++;
|
||||||
|
taosThreadCondSignal(&sem->cond);
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem2_destroy(tsem2_t* sem) {
|
||||||
|
taosThreadMutexDestroy(&sem->mutex);
|
||||||
|
taosThreadCondDestroy(&sem->cond);
|
||||||
|
taosThreadCondAttrDestroy(&sem->attr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsem2_wait(tsem2_t* sem) {
|
||||||
|
taosThreadMutexLock(&sem->mutex);
|
||||||
|
while (sem->count <= 0) {
|
||||||
|
int ret = taosThreadCondWait(&sem->cond, &sem->mutex);
|
||||||
|
if (0 == ret) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sem->count--;
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) {
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
taosThreadMutexLock(&sem->mutex);
|
||||||
|
if (sem->count <= 0) {
|
||||||
|
struct timespec ts = {0};
|
||||||
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) {
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ts.tv_sec += ms / 1000;
|
||||||
|
ts.tv_nsec += (ms % 1000) * 1000000;
|
||||||
|
ts.tv_sec += ts.tv_nsec / 1000000000;
|
||||||
|
ts.tv_nsec %= 1000000000;
|
||||||
|
|
||||||
|
while (sem->count <= 0) {
|
||||||
|
ret = taosThreadCondTimedWait(&sem->cond, &sem->mutex, &ts);
|
||||||
|
if (ret != 0) {
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sem->count--;
|
||||||
|
taosThreadMutexUnlock(&sem->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -170,6 +170,16 @@ int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosThreadCondAttrSetclock(TdThreadCondAttr *attr, int clockId) {
|
||||||
|
#ifdef __USE_WIN_THREAD
|
||||||
|
return 0;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
return pthread_condattr_setclock(attr, clockId);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared) {
|
int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared) {
|
||||||
#ifdef __USE_WIN_THREAD
|
#ifdef __USE_WIN_THREAD
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -71,7 +71,6 @@ TEST(osSemaphoreTests, WaitTime1) {
|
||||||
tsem_destroy(&sem);
|
tsem_destroy(&sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(osSemaphoreTests, WaitAndPost) {
|
TEST(osSemaphoreTests, WaitAndPost) {
|
||||||
tsem_t sem;
|
tsem_t sem;
|
||||||
int result = tsem_init(&sem, 0, 0);
|
int result = tsem_init(&sem, 0, 0);
|
||||||
|
@ -106,3 +105,135 @@ TEST(osSemaphoreTests, TimedWait) {
|
||||||
result = tsem_destroy(&sem);
|
result = tsem_destroy(&sem);
|
||||||
EXPECT_EQ(result, 0);
|
EXPECT_EQ(result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance1_1) {
|
||||||
|
tsem_t sem;
|
||||||
|
const int count = 100000;
|
||||||
|
|
||||||
|
tsem_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_wait(&sem);
|
||||||
|
}
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance1_2) {
|
||||||
|
tsem2_t sem;
|
||||||
|
const int count = 100000;
|
||||||
|
|
||||||
|
tsem2_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_wait(&sem);
|
||||||
|
}
|
||||||
|
tsem2_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance2_1) {
|
||||||
|
tsem_t sem;
|
||||||
|
const int count = 50000;
|
||||||
|
|
||||||
|
tsem_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
for (int i = 0; i < count * 2; ++i) {
|
||||||
|
tsem_wait(&sem);
|
||||||
|
}
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance2_2) {
|
||||||
|
tsem2_t sem;
|
||||||
|
const int count = 50000;
|
||||||
|
|
||||||
|
tsem2_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_post(&sem);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
for (int i = 0; i < count * 2; ++i) {
|
||||||
|
tsem2_wait(&sem);
|
||||||
|
}
|
||||||
|
tsem2_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance3_1) {
|
||||||
|
const int count = 100000;
|
||||||
|
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_t sem;
|
||||||
|
tsem_init(&sem, 0, 1);
|
||||||
|
EXPECT_EQ(tsem_timewait(&sem, 1000), 0);
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance3_2) {
|
||||||
|
const int count = 100000;
|
||||||
|
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_t sem;
|
||||||
|
tsem2_init(&sem, 0, 1);
|
||||||
|
EXPECT_EQ(tsem2_timewait(&sem, 1000), 0);
|
||||||
|
tsem2_destroy(&sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance4_1) {
|
||||||
|
const int count = 1000;
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem_t sem;
|
||||||
|
tsem_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
tsem_post(&sem);
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
tsem_timewait(&sem, 1000);
|
||||||
|
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Performance4_2) {
|
||||||
|
const int count = 1000;
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
tsem2_t sem;
|
||||||
|
tsem2_init(&sem, 0, 0);
|
||||||
|
std::thread([&sem, count]() {
|
||||||
|
tsem2_post(&sem);
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
tsem2_timewait(&sem, 1000);
|
||||||
|
|
||||||
|
tsem2_destroy(&sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,29 +21,29 @@ target_include_directories(
|
||||||
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/sz/inc"
|
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/sz/inc"
|
||||||
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/zstd/"
|
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/zstd/"
|
||||||
PRIVATE "${TD_SOURCE_DIR}/contrib/lzma2/"
|
PRIVATE "${TD_SOURCE_DIR}/contrib/lzma2/"
|
||||||
|
PRIVATE "${TD_SOURCE_DIR}/contrib/pcre2/"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_directories(
|
target_link_directories(
|
||||||
util
|
util
|
||||||
PUBLIC "${TD_SOURCE_DIR}/contrib/lzma2"
|
PUBLIC "${TD_SOURCE_DIR}/contrib/lzma2"
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/contrib/pcre2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if (TD_LINUX)
|
if (TD_LINUX)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
util
|
util
|
||||||
PUBLIC os common
|
PUBLIC os common
|
||||||
PUBLIC lz4_static fast-lzma2
|
PUBLIC lz4_static fast-lzma2 pcre2-8
|
||||||
PUBLIC api cjson geos_c TSZ
|
PUBLIC api cjson geos_c TSZ
|
||||||
|
)
|
||||||
)
|
else()
|
||||||
else()
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
util
|
util
|
||||||
PUBLIC os common
|
PUBLIC os common
|
||||||
PUBLIC lz4_static
|
PUBLIC lz4_static pcre2-8
|
||||||
PUBLIC api cjson geos_c TSZ
|
PUBLIC api cjson geos_c TSZ
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -61,9 +61,7 @@
|
||||||
#include "zstd.h"
|
#include "zstd.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
#include "td_sz.h"
|
#include "td_sz.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t tsCompressPlain2(const char *const input, const int32_t nelements, char *const output, const char type);
|
int32_t tsCompressPlain2(const char *const input, const int32_t nelements, char *const output, const char type);
|
||||||
int32_t tsDecompressPlain2(const char *const input, const int32_t nelements, char *const output, const char type);
|
int32_t tsDecompressPlain2(const char *const input, const int32_t nelements, char *const output, const char type);
|
||||||
|
@ -322,7 +320,6 @@ static const int32_t TEST_NUMBER = 1;
|
||||||
|
|
||||||
#define safeInt64Add(a, b) (((a >= 0) && (b <= INT64_MAX - a)) || ((a < 0) && (b >= INT64_MIN - a)))
|
#define safeInt64Add(a, b) (((a >= 0) && (b <= INT64_MAX - a)) || ((a < 0) && (b >= INT64_MIN - a)))
|
||||||
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
bool lossyFloat = false;
|
bool lossyFloat = false;
|
||||||
bool lossyDouble = false;
|
bool lossyDouble = false;
|
||||||
|
|
||||||
|
@ -341,8 +338,6 @@ int32_t tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision,
|
||||||
// exit call
|
// exit call
|
||||||
void tsCompressExit() { tdszExit(); }
|
void tsCompressExit() { tdszExit(); }
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compress Integer (Simple8B).
|
* Compress Integer (Simple8B).
|
||||||
*/
|
*/
|
||||||
|
@ -1214,7 +1209,6 @@ int32_t tsDecompressFloatImp(const char *const input, const int32_t nelements, c
|
||||||
return nelements * FLOAT_BYTES;
|
return nelements * FLOAT_BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TD_TSZ
|
|
||||||
//
|
//
|
||||||
// ---------- float double lossy -----------
|
// ---------- float double lossy -----------
|
||||||
//
|
//
|
||||||
|
@ -1283,7 +1277,6 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co
|
||||||
// decompressed with sz
|
// decompressed with sz
|
||||||
return tdszDecompress(SZ_DOUBLE, input + 1, compressedSize - 1, nelements, output);
|
return tdszDecompress(SZ_DOUBLE, input + 1, compressedSize - 1, nelements, output);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BUILD_NO_CALL
|
#ifdef BUILD_NO_CALL
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -2463,13 +2456,11 @@ int32_t tsDecompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut,
|
||||||
// Float =====================================================
|
// Float =====================================================
|
||||||
int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||||
int32_t nBuf) {
|
int32_t nBuf) {
|
||||||
#ifdef TD_TSZ
|
|
||||||
// lossy mode
|
// lossy mode
|
||||||
if (lossyFloat) {
|
if (lossyFloat) {
|
||||||
return tsCompressFloatLossyImp(pIn, nEle, pOut);
|
return tsCompressFloatLossyImp(pIn, nEle, pOut);
|
||||||
// lossless mode
|
// lossless mode
|
||||||
} else {
|
} else {
|
||||||
#endif
|
|
||||||
if (cmprAlg == ONE_STAGE_COMP) {
|
if (cmprAlg == ONE_STAGE_COMP) {
|
||||||
return tsCompressFloatImp(pIn, nEle, pOut);
|
return tsCompressFloatImp(pIn, nEle, pOut);
|
||||||
} else if (cmprAlg == TWO_STAGE_COMP) {
|
} else if (cmprAlg == TWO_STAGE_COMP) {
|
||||||
|
@ -2479,19 +2470,15 @@ int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_
|
||||||
ASSERTS(0, "compress algo invalid");
|
ASSERTS(0, "compress algo invalid");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef TD_TSZ
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsDecompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
int32_t tsDecompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||||
int32_t nBuf) {
|
int32_t nBuf) {
|
||||||
#ifdef TD_TSZ
|
|
||||||
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
||||||
// decompress lossy
|
// decompress lossy
|
||||||
return tsDecompressFloatLossyImp(pIn, nIn, nEle, pOut);
|
return tsDecompressFloatLossyImp(pIn, nIn, nEle, pOut);
|
||||||
} else {
|
} else {
|
||||||
#endif
|
|
||||||
// decompress lossless
|
// decompress lossless
|
||||||
if (cmprAlg == ONE_STAGE_COMP) {
|
if (cmprAlg == ONE_STAGE_COMP) {
|
||||||
return tsDecompressFloatImp(pIn, nEle, pOut);
|
return tsDecompressFloatImp(pIn, nEle, pOut);
|
||||||
|
@ -2502,20 +2489,16 @@ int32_t tsDecompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int3
|
||||||
ASSERTS(0, "compress algo invalid");
|
ASSERTS(0, "compress algo invalid");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef TD_TSZ
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Double =====================================================
|
// Double =====================================================
|
||||||
int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||||
int32_t nBuf) {
|
int32_t nBuf) {
|
||||||
#ifdef TD_TSZ
|
|
||||||
if (lossyDouble) {
|
if (lossyDouble) {
|
||||||
// lossy mode
|
// lossy mode
|
||||||
return tsCompressDoubleLossyImp(pIn, nEle, pOut);
|
return tsCompressDoubleLossyImp(pIn, nEle, pOut);
|
||||||
} else {
|
} else {
|
||||||
#endif
|
|
||||||
// lossless mode
|
// lossless mode
|
||||||
if (cmprAlg == ONE_STAGE_COMP) {
|
if (cmprAlg == ONE_STAGE_COMP) {
|
||||||
return tsCompressDoubleImp(pIn, nEle, pOut);
|
return tsCompressDoubleImp(pIn, nEle, pOut);
|
||||||
|
@ -2526,19 +2509,15 @@ int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32
|
||||||
ASSERTS(0, "compress algo invalid");
|
ASSERTS(0, "compress algo invalid");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef TD_TSZ
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsDecompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
int32_t tsDecompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||||
int32_t nBuf) {
|
int32_t nBuf) {
|
||||||
#ifdef TD_TSZ
|
|
||||||
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
||||||
// decompress lossy
|
// decompress lossy
|
||||||
return tsDecompressDoubleLossyImp(pIn, nIn, nEle, pOut);
|
return tsDecompressDoubleLossyImp(pIn, nIn, nEle, pOut);
|
||||||
} else {
|
} else {
|
||||||
#endif
|
|
||||||
// decompress lossless
|
// decompress lossless
|
||||||
if (cmprAlg == ONE_STAGE_COMP) {
|
if (cmprAlg == ONE_STAGE_COMP) {
|
||||||
return tsDecompressDoubleImp(pIn, nEle, pOut);
|
return tsDecompressDoubleImp(pIn, nEle, pOut);
|
||||||
|
@ -2549,9 +2528,7 @@ int32_t tsDecompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int
|
||||||
ASSERTS(0, "compress algo invalid");
|
ASSERTS(0, "compress algo invalid");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef TD_TSZ
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Binary =====================================================
|
// Binary =====================================================
|
||||||
|
|
|
@ -259,6 +259,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_IN_CREATING, "Database in creating
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE, "Encryption is not allowed to be changed after database is created")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE, "Encryption is not allowed to be changed after database is created")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INCONSIST_ENCRYPT_KEY, "Inconsistent encryption key")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INCONSIST_ENCRYPT_KEY, "Inconsistent encryption key")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ENCRYPT_KEY, "The cluster has not been set properly for database encryption")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ENCRYPT_KEY, "The cluster has not been set properly for database encryption")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_ENCRYPT_GRANT_EXPIRED, "The database encryption function grant expired")
|
||||||
|
|
||||||
// mnode-node
|
// mnode-node
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_MNODE_ALREADY_EXIST, "Mnode already exists")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_MNODE_ALREADY_EXIST, "Mnode already exists")
|
||||||
|
|
|
@ -43,6 +43,10 @@ void destroyThreadLocalGeosCtx() {
|
||||||
tlGeosCtx.WKBWriter = NULL;
|
tlGeosCtx.WKBWriter = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx.WKTRegex) {
|
||||||
|
destroyRegexes(tlGeosCtx.WKTRegex, tlGeosCtx.WKTMatchData);
|
||||||
|
}
|
||||||
|
|
||||||
if(tlGeosCtx.handle) {
|
if(tlGeosCtx.handle) {
|
||||||
GEOS_finish_r(tlGeosCtx.handle);
|
GEOS_finish_r(tlGeosCtx.handle);
|
||||||
tlGeosCtx.handle = NULL;
|
tlGeosCtx.handle = NULL;
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "tpcre2.h"
|
||||||
|
|
||||||
|
int32_t doRegComp(pcre2_code** ppRegex, pcre2_match_data** ppMatchData, const char* pattern) {
|
||||||
|
uint32_t options = PCRE2_CASELESS;
|
||||||
|
int errorcode;
|
||||||
|
PCRE2_SIZE erroroffset;
|
||||||
|
|
||||||
|
*ppRegex = pcre2_compile((PCRE2_SPTR8)pattern, PCRE2_ZERO_TERMINATED, options, &errorcode, &erroroffset, NULL);
|
||||||
|
if (*ppRegex == NULL) {
|
||||||
|
PCRE2_UCHAR buffer[256];
|
||||||
|
pcre2_get_error_message(errorcode, buffer, sizeof(buffer));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppMatchData = pcre2_match_data_create_from_pattern(*ppRegex, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t doRegExec(const char* pString, pcre2_code* pRegex, pcre2_match_data* pMatchData) {
|
||||||
|
int32_t ret = 0;
|
||||||
|
ret = pcre2_match(pRegex, (PCRE2_SPTR)pString, PCRE2_ZERO_TERMINATED, 0, 0, pMatchData, NULL);
|
||||||
|
if (ret < 0) {
|
||||||
|
PCRE2_UCHAR buffer[256];
|
||||||
|
pcre2_get_error_message(ret, buffer, sizeof(buffer));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ret > 0) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyRegexes(pcre2_code* pWktRegex, pcre2_match_data* pWktMatchData) {
|
||||||
|
pcre2_code_free(pWktRegex);
|
||||||
|
pcre2_match_data_free(pWktMatchData);
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
|
||||||
|
import taos
|
||||||
|
import frame
|
||||||
|
import frame.etool
|
||||||
|
|
||||||
|
|
||||||
|
from frame.log import *
|
||||||
|
from frame.cases import *
|
||||||
|
from frame.sql import *
|
||||||
|
from frame.caseBase import *
|
||||||
|
from frame import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase(TBase):
|
||||||
|
|
||||||
|
def checkGeometry(self):
|
||||||
|
tdLog.info(f"check geometry")
|
||||||
|
|
||||||
|
tdSql.execute("create database db_geometry;")
|
||||||
|
tdSql.execute("use db_geometry;")
|
||||||
|
tdSql.execute("create table t_ge (ts timestamp, id int, c1 GEOMETRY(512));")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 1, 'MULTIPOINT ((0 0), (1 1))');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 1, 'MULTIPOINT (0 0, 1 1)');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 2, 'POINT (0 0)');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 2, 'POINT EMPTY');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 3, 'LINESTRING (0 0, 0 1, 1 2)');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 3, 'LINESTRING EMPTY');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 4, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 4, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 4, 'POLYGON EMPTY');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 5, 'MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 6, 'MULTIPOLYGON (((1 1, 1 3, 3 3, 3 1, 1 1)), ((4 3, 6 3, 6 1, 4 1, 4 3)))');")
|
||||||
|
tdSql.execute("insert into t_ge values(now, 7, 'GEOMETRYCOLLECTION (MULTIPOINT((0 0), (1 1)), POINT(3 4), LINESTRING(2 3, 3 4))');")
|
||||||
|
tdSql.query("select * from t_ge;")
|
||||||
|
tdSql.checkRows(12)
|
||||||
|
tdSql.query("select * from t_ge where id=1;")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query("select * from t_ge where id=2;")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query("select * from t_ge where id=3;")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query("select * from t_ge where id=4;")
|
||||||
|
tdSql.checkRows(3)
|
||||||
|
tdSql.query("select * from t_ge where id=5;")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query("select * from t_ge where id=6;")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query("select * from t_ge where id=7;")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
|
||||||
|
def checkDataType(self):
|
||||||
|
tdLog.info(f"check datatype")
|
||||||
|
|
||||||
|
self.checkGeometry()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# run
|
||||||
|
def run(self):
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
|
||||||
|
# check insert datatype
|
||||||
|
self.checkDataType()
|
||||||
|
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,181 @@
|
||||||
|
from frame.log import *
|
||||||
|
from frame.cases import *
|
||||||
|
from frame.sql import *
|
||||||
|
from frame.caseBase import *
|
||||||
|
from frame import *
|
||||||
|
from frame.eos import *
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
|
class TDTestCase(TBase):
|
||||||
|
"""Add test case to test column and tag boundary for task TD-28586
|
||||||
|
"""
|
||||||
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
|
self.replicaVar = int(replicaVar)
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
# define the max properties of column and tag
|
||||||
|
self.super_table_max_column_num = 4096
|
||||||
|
self.max_tag_num = 128
|
||||||
|
self.max_tag_length = 16382
|
||||||
|
self.max_column_length = 65517
|
||||||
|
self.child_table_num = 1
|
||||||
|
self.insert_round_num = 700
|
||||||
|
self.row_num_per_round = 15
|
||||||
|
|
||||||
|
def prepare_data(self):
|
||||||
|
# database
|
||||||
|
tdSql.execute("create database db;")
|
||||||
|
tdSql.execute("use db;")
|
||||||
|
|
||||||
|
def test_binary_boundary(self):
|
||||||
|
# create tables
|
||||||
|
tdSql.execute(f"create table st_binary (ts timestamp, c1 binary({self.max_column_length})) tags (t1 binary({self.max_tag_length}));")
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
# create child table with max column and tag length
|
||||||
|
tag = ''.join(random.sample(string.ascii_lowercase, 1)) * self.max_tag_length
|
||||||
|
tdSql.execute(f"create table ct_binary{i+1} using st_binary tags('{tag}');")
|
||||||
|
# insert data
|
||||||
|
for j in range(self.insert_round_num):
|
||||||
|
sql = "insert into ct_binary%s values" % (i+1)
|
||||||
|
for k in range(self.row_num_per_round):
|
||||||
|
sql += "(now+%ss, '%s')," % (str(j * 10 + k + 1), 'a' * self.max_column_length)
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.info(f"Insert {self.row_num_per_round} rows data into ct_binary{i+1} {j+1} times successfully")
|
||||||
|
tdSql.execute("flush database db;")
|
||||||
|
# check the data
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
tdSql.query(f"select * from ct_binary{i+1};")
|
||||||
|
tdSql.checkRows(10500)
|
||||||
|
row_num = random.randint(0, 9999)
|
||||||
|
tdSql.checkData(row_num, 1, 'a' * self.max_column_length)
|
||||||
|
tdSql.query(f"show tags from ct_binary{i+1};")
|
||||||
|
tdSql.checkData(0, 5, tag)
|
||||||
|
|
||||||
|
def test_varchar_boundary(self):
|
||||||
|
# create tables
|
||||||
|
tdSql.execute(f"create table st_varchar (ts timestamp, c1 varchar({self.max_column_length})) tags (t1 varchar({self.max_tag_length}));")
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
# create child table with max column and tag length
|
||||||
|
tag = ''.join(random.sample(string.ascii_lowercase, 1)) * self.max_tag_length
|
||||||
|
tdSql.execute(f"create table ct_varchar{i+1} using st_varchar tags('{tag}');")
|
||||||
|
# insert data
|
||||||
|
for j in range(self.insert_round_num):
|
||||||
|
sql = "insert into ct_varchar%s values" % (i+1)
|
||||||
|
for k in range(self.row_num_per_round):
|
||||||
|
sql += "(now+%ss, '%s')," % (str(j * 10 + k + 1), 'b' * self.max_column_length)
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.info(f"Insert {self.row_num_per_round} rows data into ct_varchar{i+1} {j+1} times successfully")
|
||||||
|
tdSql.execute("flush database db;")
|
||||||
|
# check the data
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
tdSql.query(f"select * from ct_varchar{i+1};")
|
||||||
|
tdSql.checkRows(10500)
|
||||||
|
row_num = random.randint(0, 9999)
|
||||||
|
tdSql.checkData(row_num, 1, 'b' * self.max_column_length)
|
||||||
|
tdSql.query(f"show tags from ct_varchar{i+1};")
|
||||||
|
tdSql.checkData(0, 5, tag)
|
||||||
|
|
||||||
|
def gen_chinese_string(self, length):
|
||||||
|
start = 0x4e00
|
||||||
|
end = 0x9fa5
|
||||||
|
chinese_string = ''
|
||||||
|
for _ in range(length):
|
||||||
|
chinese_string += chr(random.randint(start, end))
|
||||||
|
return chinese_string
|
||||||
|
|
||||||
|
def test_nchar_boundary(self):
|
||||||
|
max_nchar_column_length = self.max_column_length // 4
|
||||||
|
max_nchar_tag_length = self.max_tag_length // 4
|
||||||
|
# create tables
|
||||||
|
tdSql.execute(f"create table st_nchar (ts timestamp, c1 nchar({max_nchar_column_length})) tags (t1 nchar({max_nchar_tag_length}));")
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
# create child table with max column and tag length
|
||||||
|
tag = self.gen_chinese_string(max_nchar_tag_length)
|
||||||
|
column = self.gen_chinese_string(max_nchar_column_length)
|
||||||
|
tdSql.execute(f"create table ct_nchar{i+1} using st_nchar tags('{tag}');")
|
||||||
|
# insert data
|
||||||
|
for j in range(self.insert_round_num):
|
||||||
|
sql = "insert into ct_nchar%s values" % (i+1)
|
||||||
|
for k in range(self.row_num_per_round):
|
||||||
|
sql += "(now+%ss, '%s')," % (str(j * 10 + k + 1), column)
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.info(f"Insert {self.row_num_per_round} rows data into ct_nchar{i+1} {j+1} times successfully")
|
||||||
|
tdSql.execute("flush database db;")
|
||||||
|
# check the data
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
tdSql.query(f"select * from ct_nchar{i+1};")
|
||||||
|
tdSql.checkRows(10500)
|
||||||
|
row_num = random.randint(0, 9999)
|
||||||
|
tdSql.checkData(row_num, 1, column)
|
||||||
|
tdSql.query(f"show tags from ct_nchar{i+1};")
|
||||||
|
tdSql.checkData(0, 5, tag)
|
||||||
|
|
||||||
|
def test_varbinary_boundary(self):
|
||||||
|
row_num_per_round = 8
|
||||||
|
# create tables
|
||||||
|
tdSql.execute(f"create table st_varbinary (ts timestamp, c1 varbinary({self.max_column_length})) tags (t1 varbinary({self.max_tag_length}));")
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
# create child table with max column and tag length
|
||||||
|
tag = (''.join(random.sample(string.ascii_lowercase, 1)) * self.max_tag_length).encode().hex()
|
||||||
|
column = (''.join(random.sample(string.ascii_lowercase, 1)) * self.max_column_length).encode().hex()
|
||||||
|
tdSql.execute("create table ct_varbinary%s using st_varbinary tags('%s');" % (str(i+1), '\\x' + tag))
|
||||||
|
# insert data
|
||||||
|
for j in range(self.insert_round_num):
|
||||||
|
sql = "insert into ct_varbinary%s values" % (i+1)
|
||||||
|
for k in range(row_num_per_round):
|
||||||
|
sql += "(now+%ss, '%s')," % (str(j * 10 + k + 1), '\\x' + column)
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.info(f"Insert {row_num_per_round} rows data into ct_varbinary{i+1} {j+1} times successfully")
|
||||||
|
tdSql.execute("flush database db;")
|
||||||
|
# check the data
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
tdSql.query(f"select * from ct_varbinary{i+1};")
|
||||||
|
tdSql.checkRows(5600)
|
||||||
|
row_num = random.randint(0, 5599)
|
||||||
|
tdSql.checkData(row_num, 1, bytes.fromhex(column))
|
||||||
|
tdSql.query(f"show tags from ct_varbinary{i+1};")
|
||||||
|
tdSql.checkData(0, 5, '\\x' + tag.upper())
|
||||||
|
|
||||||
|
def test_json_tag_boundary(self):
|
||||||
|
row_num_per_round = 8
|
||||||
|
max_json_tag_length = 4095
|
||||||
|
max_json_tag_key_length = 256
|
||||||
|
# create tables
|
||||||
|
tdSql.execute(f"create table st_json_tag (ts timestamp, c1 varbinary({self.max_column_length})) tags (t1 json);")
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
# create child table with max column and tag length
|
||||||
|
tag_key = ''.join(random.sample(string.ascii_lowercase, 1)) * max_json_tag_key_length
|
||||||
|
tag_value = ''.join(random.sample(string.ascii_lowercase, 1)) * (max_json_tag_length - max_json_tag_key_length - 7)
|
||||||
|
column = (''.join(random.sample(string.ascii_lowercase, 1)) * self.max_column_length).encode().hex()
|
||||||
|
tdSql.execute("create table ct_json_tag%s using st_json_tag tags('%s');" % (str(i+1), f'{{"{tag_key}":"{tag_value}"}}'))
|
||||||
|
# insert data
|
||||||
|
for j in range(self.insert_round_num):
|
||||||
|
sql = "insert into ct_json_tag%s values" % (i+1)
|
||||||
|
for k in range(row_num_per_round):
|
||||||
|
sql += "(now+%ss, '%s')," % (str(j * 10 + k + 1), '\\x' + column)
|
||||||
|
tdSql.execute(sql)
|
||||||
|
tdLog.info(f"Insert {row_num_per_round} rows data into ct_json_tag{i+1} {j+1} times successfully")
|
||||||
|
tdSql.execute("flush database db;")
|
||||||
|
# check the data
|
||||||
|
for i in range(self.child_table_num):
|
||||||
|
tdSql.query(f"select * from ct_json_tag{i+1} where t1->'{tag_key}' = '{tag_value}';")
|
||||||
|
tdSql.checkRows(5600)
|
||||||
|
row_num = random.randint(0, 5599)
|
||||||
|
tdSql.checkData(row_num, 1, bytes.fromhex(column))
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.prepare_data()
|
||||||
|
self.test_binary_boundary()
|
||||||
|
self.test_varchar_boundary()
|
||||||
|
self.test_nchar_boundary()
|
||||||
|
self.test_varbinary_boundary()
|
||||||
|
self.test_json_tag_boundary()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.execute("drop database db;")
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -102,6 +102,22 @@ class TDTestCase(TBase):
|
||||||
allRows = self.insert_rows * self.childtable_count
|
allRows = self.insert_rows * self.childtable_count
|
||||||
tdSql.checkFirstValue(sql, allRows)
|
tdSql.checkFirstValue(sql, allRows)
|
||||||
|
|
||||||
|
def checkShowTags(self):
|
||||||
|
# verification for TD-29904
|
||||||
|
tdSql.error("show tags from t100000", expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
|
|
||||||
|
sql = "show tags from child1"
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(5)
|
||||||
|
|
||||||
|
sql = f"show tags from child1 from {self.db}"
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(5)
|
||||||
|
|
||||||
|
sql = f"show tags from {self.db}.child1"
|
||||||
|
tdSql.query(sql)
|
||||||
|
tdSql.checkRows(5)
|
||||||
|
|
||||||
def checkShow(self):
|
def checkShow(self):
|
||||||
# not support
|
# not support
|
||||||
sql = "show accounts;"
|
sql = "show accounts;"
|
||||||
|
@ -125,10 +141,12 @@ class TDTestCase(TBase):
|
||||||
sqls = [
|
sqls = [
|
||||||
"show scores;",
|
"show scores;",
|
||||||
"SHOW CLUSTER VARIABLES",
|
"SHOW CLUSTER VARIABLES",
|
||||||
"SHOW BNODES;",
|
# "SHOW BNODES;",
|
||||||
]
|
]
|
||||||
tdSql.executes(sqls)
|
tdSql.executes(sqls)
|
||||||
|
|
||||||
|
self.checkShowTags()
|
||||||
|
|
||||||
|
|
||||||
# run
|
# run
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -143,6 +161,9 @@ class TDTestCase(TBase):
|
||||||
# do action
|
# do action
|
||||||
self.doQuery()
|
self.doQuery()
|
||||||
|
|
||||||
|
# check show
|
||||||
|
self.checkShow()
|
||||||
|
|
||||||
|
|
||||||
tdLog.success(f"{__file__} successfully executed")
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
|
|
@ -47,14 +47,20 @@ class TDTestCase(TBase):
|
||||||
dtypes = [ "tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned",
|
dtypes = [ "tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned",
|
||||||
"bigint","bigint unsigned","timestamp","bool","float","double","binary(16)","nchar(16)",
|
"bigint","bigint unsigned","timestamp","bool","float","double","binary(16)","nchar(16)",
|
||||||
"varchar(16)","varbinary(16)"]
|
"varchar(16)","varbinary(16)"]
|
||||||
|
|
||||||
|
def combineValid(self, datatype, encode, compress):
|
||||||
|
if datatype != "float" and datatype != "double":
|
||||||
|
if compress == "tsz":
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def genAllSqls(self, stbName, max):
|
def genAllSqls(self, stbName, max):
|
||||||
# encode
|
# encode
|
||||||
encodes = [
|
encodes = [
|
||||||
[["tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned","bigint","bigint unsigned"], ["simple8b"]],
|
[["tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned","bigint","bigint unsigned"], ["simple8B"]],
|
||||||
[["timestamp","bigint","bigint unsigned"], ["delta-i"]],
|
[["timestamp","bigint","bigint unsigned"], ["Delta-i"]],
|
||||||
[["bool"], ["bit-packing"]],
|
[["bool"], ["Bit-packing"]],
|
||||||
[["float","double"], ["delta-d"]]
|
[["float","double"], ["Delta-d"]]
|
||||||
]
|
]
|
||||||
|
|
||||||
c = 0 # column number
|
c = 0 # column number
|
||||||
|
@ -65,7 +71,6 @@ class TDTestCase(TBase):
|
||||||
|
|
||||||
# loop append sqls
|
# loop append sqls
|
||||||
for lines in encodes:
|
for lines in encodes:
|
||||||
print(lines)
|
|
||||||
for datatype in lines[0]:
|
for datatype in lines[0]:
|
||||||
for encode in lines[1]:
|
for encode in lines[1]:
|
||||||
for compress in self.compresses:
|
for compress in self.compresses:
|
||||||
|
@ -74,8 +79,9 @@ class TDTestCase(TBase):
|
||||||
# first
|
# first
|
||||||
sql = f"create table {self.db}.st{t} (ts timestamp"
|
sql = f"create table {self.db}.st{t} (ts timestamp"
|
||||||
else:
|
else:
|
||||||
sql += f", c{c} {datatype} ENCODE '{encode}' COMPRESS '{compress}' LEVEL '{level}'"
|
if self.combineValid(datatype, encode, compress):
|
||||||
c += 1
|
sql += f", c{c} {datatype} ENCODE '{encode}' COMPRESS '{compress}' LEVEL '{level}'"
|
||||||
|
c += 1
|
||||||
|
|
||||||
if c >= max:
|
if c >= max:
|
||||||
# append sqls
|
# append sqls
|
||||||
|
@ -97,9 +103,11 @@ class TDTestCase(TBase):
|
||||||
# check error create
|
# check error create
|
||||||
def errorCreate(self):
|
def errorCreate(self):
|
||||||
sqls = [
|
sqls = [
|
||||||
f"create table terr(ts timestamp, c0 int ENCODE 'abc') ",
|
f"create table terr(ts timestamp, c0 int ENCODE 'simple8B' COMPRESS 'tsz' LEVEL 'high') ",
|
||||||
f""
|
f"create table terr(ts timestamp, bi bigint encode 'bit-packing') tags (area int);"
|
||||||
|
f"create table terr(ts timestamp, ic int encode 'delta-d') tags (area int);"
|
||||||
]
|
]
|
||||||
|
tdSql.errors(sqls)
|
||||||
|
|
||||||
for dtype in self.dtypes:
|
for dtype in self.dtypes:
|
||||||
# encode
|
# encode
|
||||||
|
@ -111,6 +119,11 @@ class TDTestCase(TBase):
|
||||||
# level
|
# level
|
||||||
sql = f"create table terr(ts timestamp, c0 {dtype} LEVEL 'hig') "
|
sql = f"create table terr(ts timestamp, c0 {dtype} LEVEL 'hig') "
|
||||||
tdSql.error(sql)
|
tdSql.error(sql)
|
||||||
|
|
||||||
|
# tsz check
|
||||||
|
if dtype != "float" and dtype != "double":
|
||||||
|
sql = f"create table terr(ts timestamp, c0 {dtype} COMPRESS 'tsz') "
|
||||||
|
tdSql.error(sql)
|
||||||
|
|
||||||
# default value correct
|
# default value correct
|
||||||
def defaultCorrect(self):
|
def defaultCorrect(self):
|
||||||
|
|
|
@ -11,14 +11,16 @@
|
||||||
# army-test
|
# army-test
|
||||||
#
|
#
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f enterprise/multi-level/mlevel_basic.py -N 3 -L 3 -D 2
|
,,y,army,./pytest.sh python3 ./test.py -f enterprise/multi-level/mlevel_basic.py -N 3 -L 3 -D 2
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f enterprise/s3/s3Basic.py -N 3
|
,,n,army,python3 ./test.py -f enterprise/s3/s3Basic.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/snapshot.py -N 3 -L 3 -D 2
|
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/snapshot.py -N 3 -L 3 -D 2
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/function/test_func_elapsed.py
|
,,y,army,./pytest.sh python3 ./test.py -f community/query/function/test_func_elapsed.py
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_join.py
|
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_join.py
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_compare.py
|
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_compare.py
|
||||||
|
,,y,army,./pytest.sh python3 ./test.py -f community/insert/test_column_tag_boundary.py
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/fill/fill_desc.py -N 3 -L 3 -D 2
|
,,y,army,./pytest.sh python3 ./test.py -f community/query/fill/fill_desc.py -N 3 -L 3 -D 2
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/incSnapshot.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/incSnapshot.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/query_basic.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f community/query/query_basic.py -N 3
|
||||||
|
,,y,army,./pytest.sh python3 ./test.py -f community/insert/insert_basic.py -N 3
|
||||||
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/splitVgroupByLearner.py -N 3
|
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/splitVgroupByLearner.py -N 3
|
||||||
,,n,army,python3 ./test.py -f community/cmdline/fullopt.py
|
,,n,army,python3 ./test.py -f community/cmdline/fullopt.py
|
||||||
,,n,army,python3 ./test.py -f community/query/show.py -N 3
|
,,n,army,python3 ./test.py -f community/query/show.py -N 3
|
||||||
|
|
|
@ -79,7 +79,7 @@ md5sum /home/TDinternal/debug/build/lib/libtaos.so
|
||||||
#define taospy 2.7.10
|
#define taospy 2.7.10
|
||||||
pip3 list|grep taospy
|
pip3 list|grep taospy
|
||||||
pip3 uninstall taospy -y
|
pip3 uninstall taospy -y
|
||||||
pip3 install --default-timeout=120 taospy==2.7.13
|
pip3 install --default-timeout=120 taospy==2.7.15
|
||||||
|
|
||||||
#define taos-ws-py 0.3.1
|
#define taos-ws-py 0.3.1
|
||||||
pip3 list|grep taos-ws-py
|
pip3 list|grep taos-ws-py
|
||||||
|
|
|
@ -72,7 +72,12 @@ python_error=$(cat ${LOG_DIR}/*.info | grep -w "stack" | wc -l)
|
||||||
|
|
||||||
#0 0x7f2d64f5a808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144
|
#0 0x7f2d64f5a808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144
|
||||||
#1 0x7f2d63fcf459 in strerror /build/glibc-SzIz7B/glibc-2.31/string/strerror.c:38
|
#1 0x7f2d63fcf459 in strerror /build/glibc-SzIz7B/glibc-2.31/string/strerror.c:38
|
||||||
runtime_error=$(cat ${LOG_DIR}/*.asan | grep "runtime error" | grep -v "trees.c:873" | grep -v "sclfunc.c.*outside the range of representable values of type" | grep -v "signed integer overflow" | grep -v "strerror.c" | grep -v "asan_malloc_linux.cc" | grep -v "strerror.c" | grep -v "asan_malloc_linux.cpp" | grep -v "sclvector.c" | wc -l)
|
|
||||||
|
# TD-29953
|
||||||
|
#/home/TDinternal/community/utils/TSZ/sz/src/sz_double.c:388:59: runtime error: 2.64021e+25 is outside the range of representable values of type 'long unsigned int'
|
||||||
|
#/home/TDinternal/community/utils/TSZ/sz/src/sz_float.c:407:59: runtime error: 5.76041e+19 is outside the range of representable values of type 'long unsigned int'
|
||||||
|
#/home/TDinternal/community/source/libs/scalar/src/sclfunc.c:808:11: runtime error: -3.40401e+18 is outside the range of representable values of type 'int'
|
||||||
|
runtime_error=$(cat ${LOG_DIR}/*.asan | grep "runtime error" | grep -v "trees.c:873" | grep -v "sclfunc.c.*outside the range of representable values of type" | grep -v "signed integer overflow" | grep -v "strerror.c" | grep -v "asan_malloc_linux.cc" | grep -v "strerror.c" | grep -v "asan_malloc_linux.cpp" | grep -v "sclvector.c" | grep -v "sclfunc.c:808"| grep -v "sz_double.c:388" | grep -v "sz_float.c:407:59"| wc -l)
|
||||||
|
|
||||||
echo -e "\033[44;32;1m"asan error_num: $error_num"\033[0m"
|
echo -e "\033[44;32;1m"asan error_num: $error_num"\033[0m"
|
||||||
echo -e "\033[44;32;1m"asan memory_leak: $memory_leak"\033[0m"
|
echo -e "\033[44;32;1m"asan memory_leak: $memory_leak"\033[0m"
|
||||||
|
|
|
@ -135,4 +135,177 @@ endi
|
||||||
print =========================== td-24781
|
print =========================== td-24781
|
||||||
sql select DISTINCT (`precision`) from `information_schema`.`ins_databases` PARTITION BY `precision`
|
sql select DISTINCT (`precision`) from `information_schema`.`ins_databases` PARTITION BY `precision`
|
||||||
|
|
||||||
|
print =========================ins_stables
|
||||||
|
|
||||||
|
print create database test vgroups 4;
|
||||||
|
sql create database test vgroups 4;
|
||||||
|
sql use test;
|
||||||
|
sql create stable st1(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st2(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st3(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st4(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st5(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st6(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st7(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st8(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st9(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st10(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st11(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st12(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st13(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st14(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st15(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st16(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st17(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st18(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st19(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st20(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st21(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st22(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st23(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st24(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st25(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st26(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st27(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st28(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st29(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st30(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st31(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st32(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st33(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st34(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st35(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st36(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st37(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st38(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st39(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st40(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st41(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st42(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st43(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st44(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st45(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st46(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st47(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st48(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st49(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st50(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st51(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st52(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st53(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st54(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st55(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st56(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st57(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st58(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st59(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st60(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st61(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st62(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st63(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st64(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st65(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st66(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st67(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st68(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st69(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st70(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
|
||||||
|
print create database test1 vgroups 4;
|
||||||
|
sql create database test1 vgroups 4;
|
||||||
|
sql use test1;
|
||||||
|
|
||||||
|
sql create stable st1(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st2(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st3(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st4(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st5(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st6(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st7(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st8(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st9(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st10(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st11(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st12(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st13(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st14(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st15(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st16(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st17(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st18(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st19(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st20(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st21(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st22(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st23(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st24(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st25(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st26(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st27(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st28(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st29(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st30(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st31(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st32(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st33(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st34(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st35(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st36(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st37(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st38(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st39(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st40(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st41(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st42(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st43(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st44(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st45(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st46(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st47(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st48(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st49(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st50(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st51(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st52(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st53(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st54(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st55(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st56(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st57(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st58(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st59(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st60(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st61(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st62(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st63(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st64(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st65(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st66(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st67(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st68(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st69(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create stable st70(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
sql select * from information_schema.ins_stables where db_name = "test" limit 68,32;
|
||||||
|
|
||||||
|
print $data00 $data01 $data02 $data03
|
||||||
|
print $data10 $data11 $data12 $data13
|
||||||
|
print $data20 $data21 $data22 $data23
|
||||||
|
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select * from information_schema.ins_stables where db_name = "test1" limit 68,32;
|
||||||
|
|
||||||
|
print $data00 $data01 $data02 $data03
|
||||||
|
print $data10 $data11 $data12 $data13
|
||||||
|
print $data20 $data21 $data22 $data23
|
||||||
|
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
#system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
#system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
|
@ -269,13 +269,17 @@ class TDTestCase:
|
||||||
|
|
||||||
def ins_grants_check(self):
|
def ins_grants_check(self):
|
||||||
grant_name_dict = {
|
grant_name_dict = {
|
||||||
'stream':'stream',
|
'stream':'Stream',
|
||||||
'subscription':'subscription',
|
'subscription':'Subscription',
|
||||||
'view':'view',
|
'view':'View',
|
||||||
'audit':'audit',
|
'audit':'Audit',
|
||||||
'csv':'csv',
|
'csv':'CSV',
|
||||||
'storage':'multi_tier_storage',
|
'storage':'Multi-Tier Storage',
|
||||||
'backup_restore':'backup_restore',
|
'backup_restore':'Data Backup & Restore',
|
||||||
|
'object_storage':'Object Storage',
|
||||||
|
'active_active':'Active-Active',
|
||||||
|
'dual_replica':'Dual-Replica HA',
|
||||||
|
'db_encryption':'Database Encryption',
|
||||||
'opc_da':'OPC_DA',
|
'opc_da':'OPC_DA',
|
||||||
'opc_ua':'OPC_UA',
|
'opc_ua':'OPC_UA',
|
||||||
'pi':'Pi',
|
'pi':'Pi',
|
||||||
|
@ -285,7 +289,10 @@ class TDTestCase:
|
||||||
'avevahistorian':'avevaHistorian',
|
'avevahistorian':'avevaHistorian',
|
||||||
'opentsdb':'OpenTSDB',
|
'opentsdb':'OpenTSDB',
|
||||||
'td2.6':'TDengine2.6',
|
'td2.6':'TDengine2.6',
|
||||||
'td3.0':'TDengine3.0'
|
'td3.0':'TDengine3.0',
|
||||||
|
'mysql':'MySQL',
|
||||||
|
'postgres':'PostgreSQL',
|
||||||
|
'oracle':'Oracle',
|
||||||
}
|
}
|
||||||
|
|
||||||
tdSql.execute('drop database if exists db2')
|
tdSql.execute('drop database if exists db2')
|
||||||
|
@ -297,7 +304,7 @@ class TDTestCase:
|
||||||
if result[i][0] in grant_name_dict:
|
if result[i][0] in grant_name_dict:
|
||||||
tdSql.checkEqual(result[i][1], grant_name_dict[result[i][0]])
|
tdSql.checkEqual(result[i][1], grant_name_dict[result[i][0]])
|
||||||
index += 1
|
index += 1
|
||||||
tdSql.checkEqual(index, 17)
|
tdSql.checkEqual(index, 24)
|
||||||
tdSql.query(f'select * from information_schema.ins_grants_logs')
|
tdSql.query(f'select * from information_schema.ins_grants_logs')
|
||||||
result = tdSql.queryResult
|
result = tdSql.queryResult
|
||||||
tdSql.checkEqual(True, len(result) >= 0)
|
tdSql.checkEqual(True, len(result) >= 0)
|
||||||
|
|
|
@ -78,6 +78,11 @@ class TDTestCase:
|
||||||
tdSql.execute(f'create table stb (ts timestamp, c0 int) tags (t0 int, t1 int)')
|
tdSql.execute(f'create table stb (ts timestamp, c0 int) tags (t0 int, t1 int)')
|
||||||
tdSql.execute(f'create table ctb1 using stb tags (1, 1)')
|
tdSql.execute(f'create table ctb1 using stb tags (1, 1)')
|
||||||
tdSql.execute(f'create table ctb2 using stb tags (2, 2)')
|
tdSql.execute(f'create table ctb2 using stb tags (2, 2)')
|
||||||
|
tdSql.execute(f'create table ntb (ts timestamp, c0 int)')
|
||||||
|
tdSql.execute(f'create view vtb as select * from stb')
|
||||||
|
tdSql.execute(f'create view vtb1 as select * from ctb1')
|
||||||
|
tdSql.execute(f'create view vtb2 as select * from ctb2')
|
||||||
|
tdSql.execute(f'create view vtbn as select * from ntb')
|
||||||
tdSql.execute(f'insert into ctb1 values (now, 1)')
|
tdSql.execute(f'insert into ctb1 values (now, 1)')
|
||||||
tdSql.execute(f'insert into ctb2 values (now, 2)')
|
tdSql.execute(f'insert into ctb2 values (now, 2)')
|
||||||
|
|
||||||
|
@ -113,9 +118,14 @@ class TDTestCase:
|
||||||
tdSql.error(f'show tags from `db`.`stb` from db')
|
tdSql.error(f'show tags from `db`.`stb` from db')
|
||||||
tdSql.error(f'show tags from db.ctb1 from db')
|
tdSql.error(f'show tags from db.ctb1 from db')
|
||||||
tdSql.error(f'show tags from `db`.`ctb1` from db')
|
tdSql.error(f'show tags from `db`.`ctb1` from db')
|
||||||
tdSql.error(f'show tags from tb_undef from db')
|
tdSql.error(f'show tags from tb_undef from db', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
tdSql.error(f'show tags from db.tb_undef')
|
tdSql.error(f'show tags from db.tb_undef', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
tdSql.error(f'show tags from tb_undef')
|
tdSql.error(f'show tags from tb_undef', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
|
tdSql.error(f'show tags from ntb', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show tags from vtb', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show tags from vtb1', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show tags from vtb2', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show tags from vtbn', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
|
||||||
# show table tags
|
# show table tags
|
||||||
tdSql.query(f'show table tags from stb')
|
tdSql.query(f'show table tags from stb')
|
||||||
|
@ -148,9 +158,14 @@ class TDTestCase:
|
||||||
tdSql.error(f'show table tags from `db`.`stb` from db')
|
tdSql.error(f'show table tags from `db`.`stb` from db')
|
||||||
tdSql.error(f'show table tags from db.ctb1 from db')
|
tdSql.error(f'show table tags from db.ctb1 from db')
|
||||||
tdSql.error(f'show table tags from `db`.`ctb1` from db')
|
tdSql.error(f'show table tags from `db`.`ctb1` from db')
|
||||||
tdSql.error(f'show table tags from tb_undef from db')
|
tdSql.error(f'show table tags from tb_undef from db', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
tdSql.error(f'show table tags from db.tb_undef')
|
tdSql.error(f'show table tags from db.tb_undef', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
tdSql.error(f'show table tags from tb_undef')
|
tdSql.error(f'show table tags from tb_undef', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
|
tdSql.error(f'show table tags from ntb', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show table tags from vtb', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show table tags from vtb1', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show table tags from vtb2', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
tdSql.error(f'show table tags from vtbn', expectErrInfo='Tags can only applied to super table and child table')
|
||||||
|
|
||||||
# show indexes
|
# show indexes
|
||||||
tdSql.execute(f'create index idx1 on stb (t1)')
|
tdSql.execute(f'create index idx1 on stb (t1)')
|
||||||
|
|
|
@ -31,8 +31,8 @@ class LegalDataType(Enum):
|
||||||
UINT = 'INT UNSIGNED'
|
UINT = 'INT UNSIGNED'
|
||||||
BIGINT = 'BIGINT'
|
BIGINT = 'BIGINT'
|
||||||
UBIGINT = 'BIGINT UNSIGNED'
|
UBIGINT = 'BIGINT UNSIGNED'
|
||||||
VARCHAR = 'VARCHAR(100)'
|
VARCHAR = 'VARCHAR(10000)'
|
||||||
BINARY = 'BINARY(100)'
|
BINARY = 'BINARY(10000)'
|
||||||
|
|
||||||
|
|
||||||
class TableType(Enum):
|
class TableType(Enum):
|
||||||
|
|
|
@ -22,7 +22,7 @@ class TDTestCase:
|
||||||
self.vgroups = 4
|
self.vgroups = 4
|
||||||
self.ctbNum = 10
|
self.ctbNum = 10
|
||||||
self.rowsPerTbl = 10000
|
self.rowsPerTbl = 10000
|
||||||
self.duraion = '1h'
|
self.duraion = '1d'
|
||||||
|
|
||||||
def init(self, conn, logSql, replicaVar=1):
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
self.replicaVar = int(replicaVar)
|
self.replicaVar = int(replicaVar)
|
||||||
|
@ -33,7 +33,7 @@ class TDTestCase:
|
||||||
if dropFlag == 1:
|
if dropFlag == 1:
|
||||||
tsql.execute("drop database if exists %s"%(dbName))
|
tsql.execute("drop database if exists %s"%(dbName))
|
||||||
|
|
||||||
tsql.execute("create database if not exists %s vgroups %d replica %d duration %s"%(dbName, vgroups, replica, duration))
|
tsql.execute("create database if not exists %s vgroups %d replica %d duration %s stt_trigger 1"%(dbName, vgroups, replica, duration))
|
||||||
tdLog.debug("complete to create database %s"%(dbName))
|
tdLog.debug("complete to create database %s"%(dbName))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -266,11 +266,11 @@ class TDTestCase:
|
||||||
#'select _wstart as ts, count(*), t1 as a, %s from meters partition by t1, %s interval(30m)' % (col_name, col_name),
|
#'select _wstart as ts, count(*), t1 as a, %s from meters partition by t1, %s interval(30m)' % (col_name, col_name),
|
||||||
#'select _wstart as ts, count(*), t1 as a, %s from meters partition by t1, %s interval(1h)' % (col_name, col_name),
|
#'select _wstart as ts, count(*), t1 as a, %s from meters partition by t1, %s interval(1h)' % (col_name, col_name),
|
||||||
|
|
||||||
'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(1s)' % (col_name, col_name, col_name),
|
'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(30d)' % (col_name, col_name, col_name),
|
||||||
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(30s)' % (col_name, col_name, col_name),
|
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(30s)' % (col_name, col_name, col_name),
|
||||||
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(1m)' % (col_name, col_name, col_name),
|
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(1m)' % (col_name, col_name, col_name),
|
||||||
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(30m)' % (col_name, col_name, col_name),
|
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(30m)' % (col_name, col_name, col_name),
|
||||||
#'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(1h)' % (col_name, col_name, col_name),
|
'select _wstart as ts, count(*), %s as a, %s from meters partition by %s interval(1h)' % (col_name, col_name, col_name),
|
||||||
|
|
||||||
'select _wstart as ts, count(*), tbname as a, %s from meters partition by %s, tbname interval(1s)' % (col_name, col_name),
|
'select _wstart as ts, count(*), tbname as a, %s from meters partition by %s, tbname interval(1s)' % (col_name, col_name),
|
||||||
'select _wstart as ts, count(*), t1 as a, %s from meters partition by %s, t1 interval(1s)' % (col_name, col_name),
|
'select _wstart as ts, count(*), t1 as a, %s from meters partition by %s, t1 interval(1s)' % (col_name, col_name),
|
||||||
|
@ -317,6 +317,7 @@ class TDTestCase:
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.prepareTestEnv()
|
self.prepareTestEnv()
|
||||||
|
tdSql.execute('flush database test')
|
||||||
#time.sleep(99999999)
|
#time.sleep(99999999)
|
||||||
self.test_sort_for_partition_hint()
|
self.test_sort_for_partition_hint()
|
||||||
self.test_sort_for_partition_res()
|
self.test_sort_for_partition_res()
|
||||||
|
|
|
@ -87,7 +87,7 @@ class TDTestCase:
|
||||||
tdSql.execute(f'insert into t2 using st tags(2) values(now, 1) (now+1s, 2)')
|
tdSql.execute(f'insert into t2 using st tags(2) values(now, 1) (now+1s, 2)')
|
||||||
tdSql.execute(f'insert into t3 using st tags(3) values(now, 1) (now+1s, 2)')
|
tdSql.execute(f'insert into t3 using st tags(3) values(now, 1) (now+1s, 2)')
|
||||||
|
|
||||||
tdSql.execute("create stream stream1 fill_history 1 into sta subtable(concat('new-', tname)) AS SELECT "
|
tdSql.execute("create stream stream1 fill_history 1 into sta subtable(concat('nee.w-', tname)) AS SELECT "
|
||||||
"_wstart, count(*), avg(i) FROM st PARTITION BY tbname tname INTERVAL(1m)", show=True)
|
"_wstart, count(*), avg(i) FROM st PARTITION BY tbname tname INTERVAL(1m)", show=True)
|
||||||
|
|
||||||
tdSql.execute("create stream stream2 fill_history 1 into stb subtable(concat('new-', tname)) AS SELECT "
|
tdSql.execute("create stream stream2 fill_history 1 into stb subtable(concat('new-', tname)) AS SELECT "
|
||||||
|
@ -97,25 +97,25 @@ class TDTestCase:
|
||||||
tdSql.query("select * from sta")
|
tdSql.query("select * from sta")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
tdSql.query("select tbname from sta order by tbname")
|
tdSql.query("select tbname from sta order by tbname")
|
||||||
if not tdSql.getData(0, 0).startswith('new-t1_1.d1.sta_'):
|
if not tdSql.getData(0, 0).startswith('nee_w-t1_sta_'):
|
||||||
tdLog.exit("error1")
|
tdLog.exit("error1")
|
||||||
|
|
||||||
if not tdSql.getData(1, 0).startswith('new-t2_1.d1.sta_'):
|
if not tdSql.getData(1, 0).startswith('nee_w-t2_sta_'):
|
||||||
tdLog.exit("error2")
|
tdLog.exit("error2")
|
||||||
|
|
||||||
if not tdSql.getData(2, 0).startswith('new-t3_1.d1.sta_'):
|
if not tdSql.getData(2, 0).startswith('nee_w-t3_sta_'):
|
||||||
tdLog.exit("error3")
|
tdLog.exit("error3")
|
||||||
|
|
||||||
tdSql.query("select * from stb")
|
tdSql.query("select * from stb")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
tdSql.query("select tbname from stb order by tbname")
|
tdSql.query("select tbname from stb order by tbname")
|
||||||
if not tdSql.getData(0, 0).startswith('new-t1_1.d1.stb_'):
|
if not tdSql.getData(0, 0).startswith('new-t1_stb_'):
|
||||||
tdLog.exit("error4")
|
tdLog.exit("error4")
|
||||||
|
|
||||||
if not tdSql.getData(1, 0).startswith('new-t2_1.d1.stb_'):
|
if not tdSql.getData(1, 0).startswith('new-t2_stb_'):
|
||||||
tdLog.exit("error5")
|
tdLog.exit("error5")
|
||||||
|
|
||||||
if not tdSql.getData(2, 0).startswith('new-t3_1.d1.stb_'):
|
if not tdSql.getData(2, 0).startswith('new-t3_stb_'):
|
||||||
tdLog.exit("error6")
|
tdLog.exit("error6")
|
||||||
|
|
||||||
# run
|
# run
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -37,15 +37,15 @@ void simLogSql(char *sql, bool useSharp) {
|
||||||
|
|
||||||
char *simParseHostName(char *varName) {
|
char *simParseHostName(char *varName) {
|
||||||
static char hostName[140];
|
static char hostName[140];
|
||||||
//#ifdef WINDOWS
|
//#ifdef WINDOWS
|
||||||
// hostName[0] = '\"';
|
// hostName[0] = '\"';
|
||||||
// taosGetFqdn(&hostName[1]);
|
// taosGetFqdn(&hostName[1]);
|
||||||
// int strEndIndex = strlen(hostName);
|
// int strEndIndex = strlen(hostName);
|
||||||
// hostName[strEndIndex] = '\"';
|
// hostName[strEndIndex] = '\"';
|
||||||
// hostName[strEndIndex + 1] = '\0';
|
// hostName[strEndIndex + 1] = '\0';
|
||||||
//#else
|
//#else
|
||||||
sprintf(hostName, "%s", "localhost");
|
sprintf(hostName, "%s", "localhost");
|
||||||
//#endif
|
//#endif
|
||||||
return hostName;
|
return hostName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,12 +276,16 @@ int32_t simExecuteExpression(SScript *script, char *exp) {
|
||||||
if (op1[0] == '=') {
|
if (op1[0] == '=') {
|
||||||
strcpy(simGetVariable(script, var1 + 1, var1Len - 1), t3);
|
strcpy(simGetVariable(script, var1 + 1, var1Len - 1), t3);
|
||||||
} else if (op1[0] == '<') {
|
} else if (op1[0] == '<') {
|
||||||
val0 = atoi(t0);
|
int64_t val0 = atoll(t0);
|
||||||
val1 = atoi(t3);
|
int64_t val1 = atoll(t3);
|
||||||
|
// val0 = atoi(t0);
|
||||||
|
// val1 = atoi(t3);
|
||||||
if (val0 >= val1) result = -1;
|
if (val0 >= val1) result = -1;
|
||||||
} else if (op1[0] == '>') {
|
} else if (op1[0] == '>') {
|
||||||
val0 = atoi(t0);
|
int64_t val0 = atoll(t0);
|
||||||
val1 = atoi(t3);
|
int64_t val1 = atoll(t3);
|
||||||
|
// val0 = atoi(t0);
|
||||||
|
// val1 = atoi(t3);
|
||||||
if (val0 <= val1) result = -1;
|
if (val0 <= val1) result = -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -378,16 +382,14 @@ bool simExecuteRunBackCmd(SScript *script, char *option) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void simReplaceDirSep (char *buf){
|
void simReplaceDirSep(char *buf) {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
int i=0;
|
int i = 0;
|
||||||
while(buf[i] != '\0')
|
while (buf[i] != '\0') {
|
||||||
{
|
if (buf[i] == '/') {
|
||||||
if(buf[i] == '/')
|
buf[i] = '\\';
|
||||||
{
|
}
|
||||||
buf[i] = '\\';
|
i++;
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -505,7 +507,7 @@ bool simExecuteSystemContentCmd(SScript *script, char *option) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool simExecuteSetBIModeCmd(SScript *script, char *option) {
|
bool simExecuteSetBIModeCmd(SScript *script, char *option) {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
|
||||||
simVisuallizeOption(script, option, buf);
|
simVisuallizeOption(script, option, buf);
|
||||||
option = buf;
|
option = buf;
|
||||||
|
|
|
@ -28,7 +28,7 @@ extern bool simExecSuccess;
|
||||||
|
|
||||||
int32_t simInitCfg() {
|
int32_t simInitCfg() {
|
||||||
taosCreateLog("simlog", 1, configDir, NULL, NULL, NULL, NULL, 1);
|
taosCreateLog("simlog", 1, configDir, NULL, NULL, NULL, NULL, 1);
|
||||||
taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1);
|
taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1, true);
|
||||||
|
|
||||||
SConfig *pCfg = taosGetCfg();
|
SConfig *pCfg = taosGetCfg();
|
||||||
tstrncpy(simScriptDir, cfgGetItem(pCfg, "scriptDir")->str, PATH_MAX);
|
tstrncpy(simScriptDir, cfgGetItem(pCfg, "scriptDir")->str, PATH_MAX);
|
||||||
|
|
Loading…
Reference in New Issue