other: merge 3.0
This commit is contained in:
commit
93292d8149
|
@ -64,13 +64,6 @@ IF(${TD_WINDOWS})
|
|||
ON
|
||||
)
|
||||
|
||||
MESSAGE("build geos Win32")
|
||||
option(
|
||||
BUILD_GEOS
|
||||
"If build geos on Windows"
|
||||
ON
|
||||
)
|
||||
|
||||
ELSEIF (TD_DARWIN_64)
|
||||
IF(${BUILD_TEST})
|
||||
add_definitions(-DCOMPILER_SUPPORTS_CXX13)
|
||||
|
@ -79,7 +72,7 @@ ENDIF ()
|
|||
|
||||
option(
|
||||
BUILD_GEOS
|
||||
"If build geos on Windows"
|
||||
"If build with geos"
|
||||
ON
|
||||
)
|
||||
|
||||
|
@ -95,6 +88,12 @@ option(
|
|||
ON
|
||||
)
|
||||
|
||||
option(
|
||||
BUILD_PCRE2
|
||||
"If build with pcre2"
|
||||
ON
|
||||
)
|
||||
|
||||
option(
|
||||
JEMALLOC_ENABLED
|
||||
"If build with jemalloc"
|
||||
|
|
|
@ -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 ""
|
||||
)
|
|
@ -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_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 ================================
|
||||
typedef struct {
|
||||
int8_t cmprAlg; // filled by caller
|
||||
|
@ -125,8 +134,8 @@ void tRowDestroy(SRow *pRow);
|
|||
int32_t tRowSort(SArray *aRowP);
|
||||
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);
|
||||
void tRowGetKey(SRow *pRow, SRowKey *key);
|
||||
int32_t tRowKeyCompare(const void *p1, const void *p2);
|
||||
void tRowGetPrimaryKey(SRow *pRow, SRowKey *key);
|
||||
int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2);
|
||||
int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc);
|
||||
|
||||
// SRowIter ================================
|
||||
|
|
|
@ -258,7 +258,7 @@ extern bool tsExperimental;
|
|||
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
|
||||
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,
|
||||
bool tsc);
|
||||
bool tsc, bool isDumpCfg);
|
||||
void taosCleanupCfg();
|
||||
|
||||
int32_t taosCfgDynamicOptions(SConfig *pCfg, const char *name, bool forServer);
|
||||
|
|
|
@ -56,6 +56,10 @@ typedef enum {
|
|||
TSDB_GRANT_VIEW,
|
||||
TSDB_GRANT_MULTI_TIER,
|
||||
TSDB_GRANT_BACKUP_RESTORE,
|
||||
TSDB_GRANT_OBJECT_STORAGE,
|
||||
TSDB_GRANT_ACTIVE_ACTIVE,
|
||||
TSDB_GRANT_DUAL_REPLICA_HA,
|
||||
TSDB_GRANT_DB_ENCRYPTION,
|
||||
} EGrantType;
|
||||
|
||||
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_CLUSTER_ALIVE_STMT,
|
||||
QUERY_NODE_BALANCE_VGROUP_LEADER_STMT,
|
||||
QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT,
|
||||
QUERY_NODE_RESTORE_DNODE_STMT,
|
||||
QUERY_NODE_RESTORE_QNODE_STMT,
|
||||
QUERY_NODE_RESTORE_MNODE_STMT,
|
||||
|
@ -2427,10 +2428,11 @@ int32_t tDeserializeSRedistributeVgroupReq(void* buf, int32_t bufLen, SRedistrib
|
|||
void tFreeSRedistributeVgroupReq(SRedistributeVgroupReq* pReq);
|
||||
|
||||
typedef struct {
|
||||
int32_t useless;
|
||||
int32_t reserved;
|
||||
int32_t vgId;
|
||||
int32_t sqlLen;
|
||||
char* sql;
|
||||
char db[TSDB_DB_FNAME_LEN];
|
||||
} SBalanceVgroupLeaderReq;
|
||||
|
||||
int32_t tSerializeSBalanceVgroupLeaderReq(void* buf, int32_t bufLen, SBalanceVgroupLeaderReq* pReq);
|
||||
|
|
|
@ -582,6 +582,7 @@ typedef struct SBalanceVgroupStmt {
|
|||
typedef struct SBalanceVgroupLeaderStmt {
|
||||
ENodeType type;
|
||||
int32_t vgId;
|
||||
char dbName[TSDB_DB_NAME_LEN];
|
||||
} SBalanceVgroupLeaderStmt;
|
||||
|
||||
typedef struct SMergeVgroupStmt {
|
||||
|
|
|
@ -33,6 +33,13 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
|||
int tsem_post(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)
|
||||
#include <windows.h>
|
||||
|
||||
|
@ -44,6 +51,13 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
|||
int tsem_post(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
|
||||
|
||||
#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_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
|
||||
|
||||
#if defined(_TD_DARWIN_64)
|
||||
|
|
|
@ -222,6 +222,7 @@ int32_t taosThreadCondTimedWait(TdThreadCond *cond, TdThreadMutex *mutex, const
|
|||
int32_t taosThreadCondAttrDestroy(TdThreadCondAttr *attr);
|
||||
int32_t taosThreadCondAttrGetPshared(const TdThreadCondAttr *attr, int32_t *pshared);
|
||||
int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr);
|
||||
int32_t taosThreadCondAttrSetclock(TdThreadCondAttr *attr, int clockId);
|
||||
int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared);
|
||||
int32_t taosThreadDetach(TdThread thread);
|
||||
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_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_DB_ENCRYPT_GRANT_EXPIRED TAOS_DEF_ERROR_CODE(0, 0x039C)
|
||||
|
||||
// mnode-node
|
||||
#define TSDB_CODE_MND_MNODE_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03A0)
|
||||
|
|
|
@ -21,6 +21,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <geos_c.h>
|
||||
#include <tpcre2.h>
|
||||
|
||||
typedef struct SGeosContext {
|
||||
GEOSContextHandle_t handle;
|
||||
|
@ -31,6 +32,9 @@ typedef struct SGeosContext {
|
|||
GEOSWKBReader *WKBReader;
|
||||
GEOSWKBWriter *WKBWriter;
|
||||
|
||||
pcre2_code *WKTRegex;
|
||||
pcre2_match_data *WKTMatchData;
|
||||
|
||||
char errMsg[512];
|
||||
} 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_
|
|
@ -726,7 +726,7 @@ void taos_init_imp(void) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1, true) != 0) {
|
||||
tscInitRes = -1;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -105,7 +105,7 @@ struct tmq_t {
|
|||
STaosQueue* mqueue; // queue of rsp
|
||||
STaosQall* qall;
|
||||
STaosQueue* delayedTask; // delayed task queue for heartbeat and auto commit
|
||||
tsem_t rspSem;
|
||||
tsem2_t rspSem;
|
||||
};
|
||||
|
||||
typedef struct SAskEpInfo {
|
||||
|
@ -727,7 +727,7 @@ static void generateTimedTask(int64_t refId, int32_t type) {
|
|||
|
||||
*pTaskType = type;
|
||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||
tsem_post(&tmq->rspSem);
|
||||
tsem2_post(&tmq->rspSem);
|
||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||
}
|
||||
|
||||
|
@ -742,7 +742,7 @@ void tmqReplayTask(void* param, void* tmrId) {
|
|||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||
if (tmq == NULL) goto END;
|
||||
|
||||
tsem_post(&tmq->rspSem);
|
||||
tsem2_post(&tmq->rspSem);
|
||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||
END:
|
||||
taosMemoryFree(param);
|
||||
|
@ -1033,7 +1033,7 @@ void tmqFreeImpl(void* handle) {
|
|||
}
|
||||
|
||||
taosFreeQall(tmq->qall);
|
||||
tsem_destroy(&tmq->rspSem);
|
||||
tsem2_destroy(&tmq->rspSem);
|
||||
|
||||
taosArrayDestroyEx(tmq->clientTopics, freeClientVgImpl);
|
||||
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();
|
||||
|
||||
// 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(),
|
||||
pTmq->groupId);
|
||||
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);
|
||||
if (pTmq->pTscObj == NULL) {
|
||||
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")
|
||||
goto _failed;
|
||||
}
|
||||
|
@ -1434,7 +1434,7 @@ END:
|
|||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||
|
||||
FAIL:
|
||||
if (tmq) tsem_post(&tmq->rspSem);
|
||||
if (tmq) tsem2_post(&tmq->rspSem);
|
||||
taosMemoryFree(pParam);
|
||||
if (pMsg) taosMemoryFreeClear(pMsg->pData);
|
||||
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);
|
||||
return NULL;
|
||||
}
|
||||
tsem_timewait(&tmq->rspSem, (timeout - elapsedTime));
|
||||
tsem2_timewait(&tmq->rspSem, (timeout - elapsedTime));
|
||||
} else {
|
||||
// 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 code = 0;
|
||||
|
||||
if (!tsS3Enabled) {
|
||||
fprintf(stderr, "s3 not configured.\n");
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
code = s3Begin();
|
||||
if (code != 0) {
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
return checkColumnEncode(encode);
|
||||
return checkColumnEncode(encode) && validColEncode(type, columnEncodeVal(encode));
|
||||
}
|
||||
bool checkColumnCompress(char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
return checkColumnCompress(compress);
|
||||
|
||||
return checkColumnCompress(compress) && validColCompress(type, columnCompressVal(compress));
|
||||
}
|
||||
bool checkColumnLevel(char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
return checkColumnLevel(level);
|
||||
return checkColumnLevel(level) && validColCompressLevel(type, columnLevelVal(level));
|
||||
}
|
||||
|
||||
void setColEncode(uint32_t* compress, uint8_t l1) {
|
||||
|
|
|
@ -2414,10 +2414,21 @@ void buildCtbNameAddGroupId(const char* stbName, char* ctbName, uint64_t groupId
|
|||
if (stbName == NULL){
|
||||
snprintf(tmp, TSDB_TABLE_NAME_LEN, "_%"PRIu64, groupId);
|
||||
}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
|
||||
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.
|
||||
|
|
|
@ -1183,8 +1183,7 @@ int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, in
|
|||
}
|
||||
}
|
||||
|
||||
void tRowGetKey(SRow *row, SRowKey *key) {
|
||||
key->ts = row->ts;
|
||||
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
|
||||
key->numOfPKs = row->numOfPKs;
|
||||
|
||||
if (key->numOfPKs == 0) {
|
||||
|
@ -1283,10 +1282,7 @@ int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
|
|||
// NOTE:
|
||||
// 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
|
||||
int32_t tRowKeyCompare(const void *p1, const void *p2) {
|
||||
SRowKey *key1 = (SRowKey *)p1;
|
||||
SRowKey *key2 = (SRowKey *)p2;
|
||||
|
||||
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
|
||||
if (key1->ts < key2->ts) {
|
||||
return -1;
|
||||
} else if (key1->ts > key2->ts) {
|
||||
|
|
|
@ -240,8 +240,8 @@ int64_t tsTickPerMin[] = {60000L, 60000000L, 60000000000L};
|
|||
int64_t tsTickPerHour[] = {3600000L, 3600000000L, 3600000000000L};
|
||||
|
||||
// lossy compress 7
|
||||
char tsLossyColumns[32] = ""; // "float|double" means all float and double columns can be lossy compressed. set empty
|
||||
// can close lossy compress.
|
||||
char tsLossyColumns[32] = "float|double"; // "float|double" means all float and double columns can be lossy compressed.
|
||||
// set empty can close lossy compress.
|
||||
// below option can take effect when tsLossyColumns not empty
|
||||
float tsFPrecision = 1E-8; // float 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 tsS3AppId[TSDB_FQDN_LEN] = "<appid>";
|
||||
int8_t tsS3Enabled = false;
|
||||
int8_t tsS3EnabledCfg = false;
|
||||
int8_t tsS3Oss = false;
|
||||
int8_t tsS3StreamEnabled = false;
|
||||
|
||||
|
@ -375,6 +376,7 @@ int32_t taosSetS3Cfg(SConfig *pCfg) {
|
|||
#if defined(USE_COS) || defined(USE_S3)
|
||||
#ifdef TD_ENTERPRISE
|
||||
/*if (tsDiskCfgNum > 1) */ tsS3Enabled = true;
|
||||
tsS3EnabledCfg = true;
|
||||
#endif
|
||||
tsS3StreamEnabled = true;
|
||||
#endif
|
||||
|
@ -813,7 +815,6 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
|||
CFG_DYN_ENT_SERVER) != 0)
|
||||
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, "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;
|
||||
|
@ -1274,7 +1275,6 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
|||
|
||||
tsCacheLazyLoadThreshold = cfgGetItem(pCfg, "cacheLazyLoadThreshold")->i32;
|
||||
|
||||
tstrncpy(tsLossyColumns, cfgGetItem(pCfg, "lossyColumns")->str, sizeof(tsLossyColumns));
|
||||
tsFPrecision = cfgGetItem(pCfg, "fPrecision")->fval;
|
||||
tsDPrecision = cfgGetItem(pCfg, "dPrecision")->fval;
|
||||
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,
|
||||
bool tsc) {
|
||||
bool tsc, bool isDumpCfg) {
|
||||
if (tsCfg != NULL) return 0;
|
||||
tsCfg = cfgInit();
|
||||
|
||||
|
@ -1441,7 +1441,7 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile
|
|||
|
||||
taosSetAllDebugFlag(tsCfg, cfgGetItem(tsCfg, "debugFlag")->i32);
|
||||
|
||||
cfgDumpCfg(tsCfg, tsc, false);
|
||||
if(isDumpCfg) cfgDumpCfg(tsCfg, tsc, false);
|
||||
|
||||
if (taosCheckGlobalCfg() != 0) {
|
||||
return -1;
|
||||
|
|
|
@ -228,6 +228,8 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
|
|||
blockDataEnsureCapacity(pBlock, cfgGetSize(pConf));
|
||||
SConfigIter* pIter = cfgCreateIter(pConf);
|
||||
|
||||
cfgLock(pConf);
|
||||
|
||||
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
||||
col = startCol;
|
||||
|
||||
|
@ -253,6 +255,8 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
|
|||
numOfRows++;
|
||||
}
|
||||
|
||||
cfgUnLock(pConf);
|
||||
|
||||
pBlock->info.rows = numOfRows;
|
||||
|
||||
cfgDestroyIter(pIter);
|
||||
|
|
|
@ -5962,9 +5962,11 @@ int32_t tSerializeSBalanceVgroupLeaderReq(void *buf, int32_t bufLen, SBalanceVgr
|
|||
tEncoderInit(&encoder, buf, bufLen);
|
||||
|
||||
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;
|
||||
ENCODESQL();
|
||||
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||
|
||||
tEndEncode(&encoder);
|
||||
|
||||
int32_t tlen = encoder.pos;
|
||||
|
@ -5977,12 +5979,15 @@ int32_t tDeserializeSBalanceVgroupLeaderReq(void *buf, int32_t bufLen, SBalanceV
|
|||
tDecoderInit(&decoder, buf, bufLen);
|
||||
|
||||
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 (tDecodeI32(&decoder, &pReq->vgId) < 0) return -1;
|
||||
}
|
||||
|
||||
DECODESQL();
|
||||
if (!tDecodeIsEnd(&decoder)) {
|
||||
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||
}
|
||||
|
||||
tEndDecode(&decoder);
|
||||
|
||||
tDecoderClear(&decoder);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <tglobal.h>
|
||||
#include <tmsg.h>
|
||||
#include <iostream>
|
||||
#include <tdatablock.h>
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||
|
@ -475,6 +476,45 @@ TEST(testCase, AllNormTest) {
|
|||
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
|
||||
TEST(testCase, NoneTest) {
|
||||
const static int nCols = 14;
|
||||
|
|
|
@ -205,11 +205,11 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
|
|||
if(i < argc - 1) {
|
||||
int32_t len = strlen(argv[++i]);
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
tstrncpy(global.encryptKey, argv[i], ENCRYPT_KEY_LEN);
|
||||
|
@ -325,7 +325,7 @@ int main(int argc, char const *argv[]) {
|
|||
}
|
||||
|
||||
if (dmParseArgs(argc, argv) != 0) {
|
||||
printf("failed to start since parse args error\n");
|
||||
//printf("failed to start since parse args error\n");
|
||||
taosCleanupArgs();
|
||||
return -1;
|
||||
}
|
||||
|
@ -380,7 +380,11 @@ int mainWindows(int argc, char **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");
|
||||
taosCloseLog();
|
||||
taosCleanupArgs();
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "dmMgmt.h"
|
||||
#include "audit.h"
|
||||
#include "libs/function/tudf.h"
|
||||
#include "tgrant.h"
|
||||
|
||||
#define DM_INIT_AUDIT() \
|
||||
do { \
|
||||
|
@ -150,6 +151,7 @@ static bool dmCheckDataDirVersion() {
|
|||
|
||||
extern int32_t s3Begin();
|
||||
extern void s3End();
|
||||
extern int8_t tsS3Enabled;
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -18,12 +18,10 @@
|
|||
#include "dmNodes.h"
|
||||
#include "index.h"
|
||||
#include "qworker.h"
|
||||
#include "tstream.h"
|
||||
#ifdef TD_TSZ
|
||||
#include "tcompression.h"
|
||||
#include "tglobal.h"
|
||||
#include "tgrant.h"
|
||||
#endif
|
||||
#include "tstream.h"
|
||||
|
||||
static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
|
||||
SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
|
||||
|
@ -48,10 +46,8 @@ int32_t dmInitDnode(SDnode *pDnode) {
|
|||
goto _OVER;
|
||||
}
|
||||
|
||||
#ifdef TD_TSZ
|
||||
// compress module init
|
||||
tsCompressInit(tsLossyColumns, tsFPrecision, tsDPrecision, tsMaxRange, tsCurRange, (int)tsIfAdtFse, tsCompressor);
|
||||
#endif
|
||||
|
||||
pDnode->wrappers[DNODE].func = dmGetMgmtFunc();
|
||||
pDnode->wrappers[MNODE].func = mmGetMgmtFunc();
|
||||
|
@ -120,10 +116,8 @@ void dmCleanupDnode(SDnode *pDnode) {
|
|||
indexCleanup();
|
||||
taosConvDestroy();
|
||||
|
||||
#ifdef TD_TSZ
|
||||
// compress destroy
|
||||
tsCompressExit();
|
||||
#endif
|
||||
|
||||
dDebug("dnode is closed, ptr:%p", pDnode);
|
||||
}
|
||||
|
|
|
@ -821,6 +821,10 @@ static int32_t mndCheckDbEncryptKey(SMnode *pMnode, SCreateDbReq *pReq) {
|
|||
|
||||
#ifdef TD_ENTERPRISE
|
||||
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) {
|
||||
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,
|
||||
|
@ -903,6 +907,13 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
|
|||
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) {
|
||||
terrno = code;
|
||||
goto _OVER;
|
||||
|
@ -1163,6 +1174,12 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
|
|||
goto _OVER;
|
||||
}
|
||||
|
||||
if (alterReq.replications == 2) {
|
||||
if ((code = grantCheck(TSDB_GRANT_DUAL_REPLICA_HA)) != 0) {
|
||||
goto _OVER;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t numOfTopics = 0;
|
||||
if (mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics) != 0) {
|
||||
goto _OVER;
|
||||
|
|
|
@ -120,12 +120,32 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) {
|
|||
#define tsdbRowFromBlockData(BLOCKDATA, 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);
|
||||
int32_t tsdbRowCompare(const void *p1, const void *p2);
|
||||
int32_t tsdbRowCompareWithoutVersion(const void *p1, const void *p2);
|
||||
int32_t tsdbRowKeyCmpr(const STsdbRowKey *key1, const STsdbRowKey *key2);
|
||||
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
|
||||
|
@ -902,9 +922,16 @@ typedef struct {
|
|||
SColVal colVal;
|
||||
} SLastCol;
|
||||
|
||||
typedef struct {
|
||||
int8_t lflag;
|
||||
STsdbRowKey tsdbRowKey;
|
||||
SColVal colVal;
|
||||
} SLastUpdateCtx;
|
||||
|
||||
int32_t tsdbOpenCache(STsdb *pTsdb);
|
||||
void tsdbCloseCache(STsdb *pTsdb);
|
||||
int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *row);
|
||||
int32_t tsdbCacheRowFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, int64_t version, int32_t nRow, SRow **aRow);
|
||||
int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlockData *pBlockData);
|
||||
int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey);
|
||||
|
||||
int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, TSDBROW *row, STsdb *pTsdb);
|
||||
|
@ -946,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_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 {
|
||||
int64_t suid;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "functionMgt.h"
|
||||
#include "tsdb.h"
|
||||
#include "tsdbDataFileRW.h"
|
||||
#include "tsdbIter.h"
|
||||
#include "tsdbReadUtil.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)) {
|
||||
pLastCol->colVal.value.nData = pLastColV0->colVal.value.nData;
|
||||
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;
|
||||
} else {
|
||||
pLastCol->colVal.value.val = pLastColV0->colVal.value.val;
|
||||
|
@ -401,10 +405,13 @@ static SLastCol *tsdbCacheDeserialize(char const *value, size_t size) {
|
|||
offset += sizeof(SValue);
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
||||
pLastCol->rowKey.pks[i].pData = NULL;
|
||||
if (pLastCol->rowKey.pks[i].nData > 0) {
|
||||
pLastCol->rowKey.pks[i].pData = (uint8_t *)value + offset;
|
||||
offset += pLastCol->rowKey.pks[i].nData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (offset > size) {
|
||||
terrno = TSDB_CODE_INVALID_DATA_FMT;
|
||||
|
@ -940,10 +947,37 @@ typedef struct {
|
|||
SLastKey key;
|
||||
} SIdxKey;
|
||||
|
||||
static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal *pColVal) {
|
||||
uint8_t *pVal = NULL;
|
||||
static int32_t tsdbCacheUpdateValue(SValue *pOld, SValue *pNew) {
|
||||
uint8_t *pFree = NULL;
|
||||
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
|
||||
pLastCol->rowKey.ts = pRowKey->ts;
|
||||
pLastCol->rowKey.numOfPKs = pRowKey->numOfPKs;
|
||||
|
@ -951,87 +985,43 @@ static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal
|
|||
SValue *pPKValue = &pLastCol->rowKey.pks[i];
|
||||
SValue *pNewPKValue = &pRowKey->pks[i];
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pPKValue->type)) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
(void)tsdbCacheUpdateValue(pPKValue, pNewPKValue);
|
||||
}
|
||||
|
||||
// update colval
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
||||
nData = pLastCol->colVal.value.nData;
|
||||
pVal = pLastCol->colVal.value.pData;
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
pLastCol->colVal.cid = pColVal->cid;
|
||||
pLastCol->colVal.flag = pColVal->flag;
|
||||
(void)tsdbCacheUpdateValue(&pLastCol->colVal.value, &pColVal->value);
|
||||
|
||||
if (!pLastCol->dirty) {
|
||||
pLastCol->dirty = 1;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow) {
|
||||
static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray *updCtxArray) {
|
||||
if (!updCtxArray || TARRAY_SIZE(updCtxArray) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t code = 0;
|
||||
|
||||
// 1, fetch schema
|
||||
STSchema *pTSchema = NULL;
|
||||
int32_t sver = TSDBROW_SVERSION(pRow);
|
||||
|
||||
code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
terrno = code;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 2, iterate col values into array
|
||||
SArray *aColVal = taosArrayInit(32, sizeof(SColVal));
|
||||
|
||||
STSDBRowIter iter = {0};
|
||||
tsdbRowIterOpen(&iter, pRow, pTSchema);
|
||||
|
||||
for (SColVal *pColVal = tsdbRowIterNext(&iter); pColVal; pColVal = tsdbRowIterNext(&iter)) {
|
||||
taosArrayPush(aColVal, pColVal);
|
||||
}
|
||||
|
||||
tsdbRowClose(&iter);
|
||||
|
||||
// 3, build keys & multi get from rocks
|
||||
int num_keys = TARRAY_SIZE(aColVal);
|
||||
int num_keys = TARRAY_SIZE(updCtxArray);
|
||||
SArray *remainCols = NULL;
|
||||
SLRUCache *pCache = pTsdb->lruCache;
|
||||
|
||||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(pRow, &tsdbRowKey);
|
||||
SRowKey *pRowKey = &tsdbRowKey.key;
|
||||
|
||||
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
SColVal *pColVal = (SColVal *)taosArrayGet(aColVal, i);
|
||||
int16_t cid = pColVal->cid;
|
||||
SLastUpdateCtx *updCtx = (SLastUpdateCtx *)taosArrayGet(updCtxArray, i);
|
||||
|
||||
SLastKey *key = &(SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
int8_t lflag = updCtx->lflag;
|
||||
SRowKey *pRowKey = &updCtx->tsdbRowKey.key;
|
||||
SColVal *pColVal = &updCtx->colVal;
|
||||
|
||||
if (lflag == LFLAG_LAST && !COL_VAL_IS_VALUE(pColVal)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SLastKey *key = &(SLastKey){.lflag = lflag, .uid = uid, .cid = pColVal->cid};
|
||||
size_t klen = ROCKS_KEY_LEN;
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, klen);
|
||||
if (h) {
|
||||
|
@ -1047,23 +1037,6 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
}
|
||||
taosArrayPush(remainCols, &(SIdxKey){i, *key});
|
||||
}
|
||||
|
||||
if (COL_VAL_IS_VALUE(pColVal)) {
|
||||
key->lflag = LFLAG_LAST;
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, klen);
|
||||
if (h) {
|
||||
SLastCol *pLastCol = (SLastCol *)taosLRUCacheValue(pCache, h);
|
||||
if (tRowKeyCompare(&pLastCol->rowKey, pRowKey) != 1) {
|
||||
tsdbCacheUpdateLastCol(pLastCol, pRowKey, pColVal);
|
||||
}
|
||||
taosLRUCacheRelease(pCache, h, false);
|
||||
} else {
|
||||
if (!remainCols) {
|
||||
remainCols = taosArrayInit(num_keys * 2, sizeof(SIdxKey));
|
||||
}
|
||||
taosArrayPush(remainCols, &(SIdxKey){i, *key});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (remainCols) {
|
||||
|
@ -1091,13 +1064,17 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch;
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
SIdxKey *idxKey = &((SIdxKey *)TARRAY_DATA(remainCols))[i];
|
||||
SColVal *pColVal = (SColVal *)TARRAY_DATA(aColVal) + idxKey->idx;
|
||||
// SColVal *pColVal = (SColVal *)taosArrayGet(aColVal, idxKey->idx);
|
||||
SLastUpdateCtx *updCtx = (SLastUpdateCtx *)taosArrayGet(updCtxArray, i);
|
||||
SRowKey *pRowKey = &updCtx->tsdbRowKey.key;
|
||||
SColVal *pColVal = &updCtx->colVal;
|
||||
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]);
|
||||
SLastCol *PToFree = pLastCol;
|
||||
|
||||
if (IS_LAST_ROW_KEY(idxKey->key)) {
|
||||
if (IS_LAST_KEY(idxKey->key) && !COL_VAL_IS_VALUE(pColVal)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int32_t cmp_res = 1;
|
||||
if (pLastCol) {
|
||||
cmp_res = tRowKeyCompare(&pLastCol->rowKey, pRowKey);
|
||||
|
@ -1142,49 +1119,6 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
|
||||
taosMemoryFree(value);
|
||||
}
|
||||
} else {
|
||||
if (COL_VAL_IS_VALUE(pColVal)) {
|
||||
if (NULL == pLastCol || (tRowKeyCompare(&pLastCol->rowKey, pRowKey) != 1)) {
|
||||
char *value = NULL;
|
||||
size_t vlen = 0;
|
||||
SLastCol lastColTmp = {.rowKey = *pRowKey, .colVal = *pColVal};
|
||||
tsdbCacheSerialize(&lastColTmp, &value, &vlen);
|
||||
|
||||
taosThreadMutexLock(&pTsdb->rCache.rMutex);
|
||||
|
||||
rocksdb_writebatch_put(wb, (char *)&idxKey->key, ROCKS_KEY_LEN, value, vlen);
|
||||
|
||||
taosThreadMutexUnlock(&pTsdb->rCache.rMutex);
|
||||
|
||||
pLastCol = &lastColTmp;
|
||||
SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
*pTmpLastCol = *pLastCol;
|
||||
pLastCol = pTmpLastCol;
|
||||
|
||||
size_t charge = sizeof(*pLastCol);
|
||||
for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) {
|
||||
SValue *pValue = &pLastCol->rowKey.pks[i];
|
||||
if (IS_VAR_DATA_TYPE(pValue->type)) {
|
||||
reallocVarDataVal(pValue);
|
||||
charge += pValue->nData;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
||||
reallocVarData(&pLastCol->colVal);
|
||||
charge += pLastCol->colVal.value.nData;
|
||||
}
|
||||
|
||||
LRUStatus status = taosLRUCacheInsert(pTsdb->lruCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge,
|
||||
tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||
if (status != TAOS_LRU_STATUS_OK) {
|
||||
code = -1;
|
||||
}
|
||||
|
||||
taosMemoryFree(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
taosMemoryFreeClear(PToFree);
|
||||
rocksdb_free(values_list[i]);
|
||||
|
@ -1203,11 +1137,152 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||
|
||||
_exit:
|
||||
taosArrayDestroy(aColVal);
|
||||
taosMemoryFree(pTSchema);
|
||||
return code;
|
||||
}
|
||||
|
||||
int32_t tsdbCacheRowFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, int64_t version, int32_t nRow,
|
||||
SRow **aRow) {
|
||||
int32_t code = 0;
|
||||
|
||||
// 1. prepare last
|
||||
TSDBROW lRow = {.type = TSDBROW_ROW_FMT, .pTSRow = aRow[nRow - 1], .version = version};
|
||||
|
||||
STSchema *pTSchema = NULL;
|
||||
int32_t sver = TSDBROW_SVERSION(&lRow);
|
||||
SArray *ctxArray = NULL;
|
||||
SSHashObj *iColHash = NULL;
|
||||
|
||||
code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
terrno = code;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
TSDBROW tRow = {.type = TSDBROW_ROW_FMT, .version = version};
|
||||
int32_t nCol = pTSchema->numOfCols;
|
||||
|
||||
ctxArray = taosArrayInit(nCol, sizeof(SLastUpdateCtx));
|
||||
iColHash = tSimpleHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT));
|
||||
|
||||
// 1. prepare by lrow
|
||||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(&lRow, &tsdbRowKey);
|
||||
|
||||
STSDBRowIter iter = {0};
|
||||
tsdbRowIterOpen(&iter, &lRow, pTSchema);
|
||||
int32_t iCol = 0;
|
||||
for (SColVal *pColVal = tsdbRowIterNext(&iter); pColVal && iCol < nCol; pColVal = tsdbRowIterNext(&iter), iCol++) {
|
||||
SLastUpdateCtx updateCtx = {.lflag = LFLAG_LAST_ROW, .tsdbRowKey = tsdbRowKey, .colVal = *pColVal};
|
||||
taosArrayPush(ctxArray, &updateCtx);
|
||||
|
||||
if (!COL_VAL_IS_VALUE(pColVal)) {
|
||||
tSimpleHashPut(iColHash, &iCol, sizeof(iCol), NULL, 0);
|
||||
continue;
|
||||
}
|
||||
updateCtx.lflag = LFLAG_LAST;
|
||||
taosArrayPush(ctxArray, &updateCtx);
|
||||
}
|
||||
tsdbRowClose(&iter);
|
||||
|
||||
// 2. prepare by the other rows
|
||||
for (int32_t iRow = nRow - 2; iRow >= 0; --iRow) {
|
||||
if (tSimpleHashGetSize(iColHash) == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
tRow.pTSRow = aRow[iRow];
|
||||
|
||||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(&tRow, &tsdbRowKey);
|
||||
|
||||
void *pIte = NULL;
|
||||
int32_t iter = 0;
|
||||
while ((pIte = tSimpleHashIterate(iColHash, pIte, &iter)) != NULL) {
|
||||
int32_t iCol = ((int32_t *)pIte)[0];
|
||||
SColVal colVal = COL_VAL_NONE(0, 0);
|
||||
tsdbRowGetColVal(&tRow, pTSchema, iCol, &colVal);
|
||||
|
||||
if (COL_VAL_IS_VALUE(&colVal)) {
|
||||
SLastUpdateCtx updateCtx = {.lflag = LFLAG_LAST, .tsdbRowKey = tsdbRowKey, .colVal = colVal};
|
||||
taosArrayPush(ctxArray, &updateCtx);
|
||||
tSimpleHashIterateRemove(iColHash, &iCol, sizeof(iCol), &pIte, &iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. do update
|
||||
tsdbCacheUpdate(pTsdb, suid, uid, ctxArray);
|
||||
|
||||
_exit:
|
||||
taosMemoryFreeClear(pTSchema);
|
||||
taosArrayDestroy(ctxArray);
|
||||
tSimpleHashCleanup(iColHash);
|
||||
return code;
|
||||
}
|
||||
|
||||
int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlockData *pBlockData) {
|
||||
int32_t code = 0;
|
||||
|
||||
TSDBROW lRow = tsdbRowFromBlockData(pBlockData, pBlockData->nRow - 1);
|
||||
|
||||
STSchema *pTSchema = NULL;
|
||||
int32_t sver = TSDBROW_SVERSION(&lRow);
|
||||
SArray *ctxArray = NULL;
|
||||
|
||||
code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
terrno = code;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
ctxArray = taosArrayInit(pBlockData->nColData, sizeof(SLastUpdateCtx));
|
||||
|
||||
// 1. prepare last
|
||||
TSDBROW tRow = tsdbRowFromBlockData(pBlockData, 0);
|
||||
|
||||
for (int32_t iColData = 0; iColData < pBlockData->nColData; ++iColData) {
|
||||
SColData *pColData = &pBlockData->aColData[iColData];
|
||||
if ((pColData->flag & HAS_VALUE) != HAS_VALUE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (tRow.iRow = pBlockData->nRow - 1; tRow.iRow >= 0; --tRow.iRow) {
|
||||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(&tRow, &tsdbRowKey);
|
||||
|
||||
uint8_t colType = tColDataGetBitValue(pColData, tRow.iRow);
|
||||
if (colType == 2) {
|
||||
SColVal colVal = COL_VAL_NONE(pColData->cid, pColData->type);
|
||||
tColDataGetValue(pColData, tRow.iRow, &colVal);
|
||||
|
||||
SLastUpdateCtx updateCtx = {.lflag = LFLAG_LAST, .tsdbRowKey = tsdbRowKey, .colVal = colVal};
|
||||
taosArrayPush(ctxArray, &updateCtx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. prepare last row
|
||||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(&lRow, &tsdbRowKey);
|
||||
|
||||
STSDBRowIter iter = {0};
|
||||
tsdbRowIterOpen(&iter, &lRow, pTSchema);
|
||||
for (SColVal *pColVal = tsdbRowIterNext(&iter); pColVal; pColVal = tsdbRowIterNext(&iter)) {
|
||||
SLastUpdateCtx updateCtx = {.lflag = LFLAG_LAST_ROW, .tsdbRowKey = tsdbRowKey, .colVal = *pColVal};
|
||||
taosArrayPush(ctxArray, &updateCtx);
|
||||
}
|
||||
tsdbRowClose(&iter);
|
||||
|
||||
// 3. do update
|
||||
tsdbCacheUpdate(pTsdb, suid, uid, ctxArray);
|
||||
|
||||
_exit:
|
||||
taosMemoryFreeClear(pTSchema);
|
||||
taosArrayDestroy(ctxArray);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCacheRowsReader *pr, int16_t *aCols,
|
||||
int nCols, int16_t *slotIds);
|
||||
|
||||
|
@ -1481,7 +1556,10 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
|
|||
taosArraySet(pLastArray, idxKey->idx, pLastCol);
|
||||
// taosArrayRemove(remainCols, i);
|
||||
|
||||
if (!pTmpColArray) {
|
||||
if (/*!pTmpColArray*/ lastTmpIndexArray && !lastTmpColArray) {
|
||||
continue;
|
||||
}
|
||||
if (/*!pTmpColArray*/ lastrowTmpIndexArray && lastrowTmpColArray) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -629,14 +629,12 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
SMemSkipListNode *pos[SL_MAX_LEVEL];
|
||||
TSDBROW tRow = tsdbRowFromBlockData(pBlockData, 0);
|
||||
STsdbRowKey key;
|
||||
TSDBROW lRow; // last row
|
||||
|
||||
// first row
|
||||
tsdbRowGetKey(&tRow, &key);
|
||||
tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD);
|
||||
if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0))) goto _exit;
|
||||
pTbData->minKey = TMIN(pTbData->minKey, key.key.ts);
|
||||
lRow = tRow;
|
||||
|
||||
// remain row
|
||||
++tRow.iRow;
|
||||
|
@ -653,7 +651,6 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
}
|
||||
|
||||
if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 1))) goto _exit;
|
||||
lRow = tRow;
|
||||
|
||||
++tRow.iRow;
|
||||
}
|
||||
|
@ -664,7 +661,7 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
}
|
||||
|
||||
if (!TSDB_CACHE_NO(pMemTable->pTsdb->pVnode->config)) {
|
||||
tsdbCacheUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, &lRow);
|
||||
tsdbCacheColFormatUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, pBlockData);
|
||||
}
|
||||
|
||||
// SMemTable
|
||||
|
@ -688,7 +685,6 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
SMemSkipListNode *pos[SL_MAX_LEVEL];
|
||||
TSDBROW tRow = {.type = TSDBROW_ROW_FMT, .version = version};
|
||||
int32_t iRow = 0;
|
||||
TSDBROW lRow;
|
||||
|
||||
// backward put first data
|
||||
tRow.pTSRow = aRow[iRow++];
|
||||
|
@ -696,7 +692,6 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD);
|
||||
code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0);
|
||||
if (code) goto _exit;
|
||||
lRow = tRow;
|
||||
|
||||
pTbData->minKey = TMIN(pTbData->minKey, key.key.ts);
|
||||
|
||||
|
@ -717,8 +712,6 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 1);
|
||||
if (code) goto _exit;
|
||||
|
||||
lRow = tRow;
|
||||
|
||||
iRow++;
|
||||
}
|
||||
}
|
||||
|
@ -727,7 +720,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData,
|
|||
pTbData->maxKey = key.key.ts;
|
||||
}
|
||||
if (!TSDB_CACHE_NO(pMemTable->pTsdb->pVnode->config)) {
|
||||
tsdbCacheUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, &lRow);
|
||||
tsdbCacheRowFormatUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, version, nRow, aRow);
|
||||
}
|
||||
|
||||
// SMemTable
|
||||
|
@ -806,26 +799,3 @@ SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable) {
|
|||
_exit:
|
||||
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 *pIter2 = (SLDataIter *)(((uint8_t *)p2) - offsetof(SLDataIter, node));
|
||||
|
||||
SRowKey rkey1, rkey2;
|
||||
SRowKey rkey1 = {0}, rkey2 = {0};
|
||||
tRowGetKeyEx(&pIter1->rInfo.row, &rkey1);
|
||||
tRowGetKeyEx(&pIter2->rInfo.row, &rkey2);
|
||||
|
||||
|
|
|
@ -24,6 +24,16 @@
|
|||
|
||||
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
||||
#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 {
|
||||
bool overlapWithNeighborBlock;
|
||||
|
@ -75,11 +85,9 @@ static void getMemTableTimeRange(STsdbReader* pReader, int64_t* pMaxKey
|
|||
static void updateComposedBlockInfo(STsdbReader* pReader, double el, STableBlockScanInfo* pBlockScanInfo);
|
||||
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);
|
||||
|
||||
int32_t pkCompEx(SRowKey* p1, SRowKey* p2) {
|
||||
FORCE_INLINE int32_t pkCompEx(SRowKey* p1, SRowKey* p2) {
|
||||
if (p2 == NULL) {
|
||||
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) {
|
||||
pKey->ts = pBlock->aTSKEY[irow];
|
||||
if (slotId == -1) {
|
||||
pKey->numOfPKs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
static void tColRowGetPriamyKeyDeepCopy(SBlockData* pBlock, int32_t irow, int32_t slotId, SRowKey* pKey) {
|
||||
SColData* pColData = &pBlock->aColData[slotId];
|
||||
SColVal cv;
|
||||
tColDataGetValue(pColData, irow, &cv);
|
||||
|
@ -131,13 +133,7 @@ static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
|
|||
return n;
|
||||
}
|
||||
|
||||
static void tRowGetKeyDeepCopy(SRow* pRow, SRowKey* pKey) {
|
||||
pKey->ts = pRow->ts;
|
||||
pKey->numOfPKs = pRow->numOfPKs;
|
||||
if (pKey->numOfPKs == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
static void tRowGetPrimaryKeyDeepCopy(SRow* pRow, SRowKey* pKey) {
|
||||
SPrimaryKeyIndex indices[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);
|
||||
}
|
||||
|
||||
SRowKey k;
|
||||
SRowKey k = {0};
|
||||
tRowGetKeyEx(pRow, &k);
|
||||
|
||||
STSchema* pSchema = NULL;
|
||||
|
@ -1939,7 +1935,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
|||
pfKey = NULL;
|
||||
}
|
||||
|
||||
SRowKey k, ik;
|
||||
SRowKey k = {0}, ik = {0};
|
||||
tRowGetKeyEx(pRow, &k);
|
||||
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) {
|
||||
SRowKey rowKey;
|
||||
SRowKey rowKey = {0};
|
||||
|
||||
while (1) {
|
||||
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;
|
||||
}
|
||||
|
||||
TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader) {
|
||||
FORCE_INLINE TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pReader) {
|
||||
if (!pIter->hasVal) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -3567,7 +3563,8 @@ TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* p
|
|||
int32_t order = pReader->info.order;
|
||||
TSDBROW* pRow = tsdbTbDataIterGet(pIter->iter);
|
||||
|
||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
||||
TSDBKEY key;
|
||||
TSDBROW_INIT_KEY(pRow, key);
|
||||
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
||||
pIter->hasVal = false;
|
||||
return NULL;
|
||||
|
@ -3593,7 +3590,7 @@ TSDBROW* getValidMemRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* p
|
|||
|
||||
pRow = tsdbTbDataIterGet(pIter->iter);
|
||||
|
||||
key = TSDBROW_KEY(pRow);
|
||||
TSDBROW_INIT_KEY(pRow, key);
|
||||
if (outOfTimeWindow(key.ts, &pReader->info.window)) {
|
||||
pIter->hasVal = false;
|
||||
return NULL;
|
||||
|
@ -3632,11 +3629,13 @@ int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, SRowKey *pCurKey, SArra
|
|||
break;
|
||||
}
|
||||
|
||||
if (pCurKey->numOfPKs > 0) {
|
||||
SRowKey nextKey = {0};
|
||||
tRowGetKeyEx(pRow, &nextKey);
|
||||
if (pkCompEx(pCurKey, &nextKey) != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
STSchema* pTSchema = NULL;
|
||||
if (pRow->type == TSDBROW_ROW_FMT) {
|
||||
|
@ -3785,15 +3784,17 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
if (pKey->numOfPKs > 0) {
|
||||
SRowKey nextRowKey = {0};
|
||||
tRowGetKeyEx(pNextRow, &nextRowKey);
|
||||
if (pKey->numOfPKs > 0 && pkCompEx(pKey, &nextRowKey) != 0) {
|
||||
if (pkCompEx(pKey, &nextRowKey) != 0) {
|
||||
*pResRow = current;
|
||||
*freeTSRow = false;
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
terrno = 0;
|
||||
int32_t code = 0;
|
||||
|
@ -3801,7 +3802,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
|||
// start to merge duplicated rows
|
||||
STSchema* pTSchema = NULL;
|
||||
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) {
|
||||
return terrno;
|
||||
}
|
||||
|
@ -3814,7 +3815,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, SRowKey* pKey, uint64_t uid, SIt
|
|||
|
||||
STSchema* pTSchema1 = NULL;
|
||||
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) {
|
||||
return terrno;
|
||||
}
|
||||
|
@ -3926,24 +3927,35 @@ static int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbRea
|
|||
// todo refactor
|
||||
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
||||
if (piter->hasVal) {
|
||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
||||
if ((k.ts >= endKey && asc) || (k.ts <= endKey && !asc)) {
|
||||
tRowGetKeyEx(pRow, &rowKey);
|
||||
if ((rowKey.ts >= endKey && asc) || (rowKey.ts <= endKey && !asc)) {
|
||||
pRow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (piiter->hasVal) {
|
||||
TSDBKEY k = TSDBROW_KEY(piRow);
|
||||
if ((k.ts >= endKey && asc) || (k.ts <= endKey && !asc)) {
|
||||
tRowGetKeyEx(piRow, &irowKey);
|
||||
if ((irowKey.ts >= endKey && asc) || (irowKey.ts <= endKey && !asc)) {
|
||||
piRow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (piter->hasVal && piiter->hasVal && pRow != NULL && piRow != NULL) {
|
||||
tRowGetKeyEx(pRow, &rowKey);
|
||||
tRowGetKeyEx(piRow, &irowKey);
|
||||
|
||||
if (pRow != NULL && piRow != NULL) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
if (rowKey.numOfPKs == 0) {
|
||||
if ((rowKey.ts > irowKey.ts && asc) || (rowKey.ts < irowKey.ts && (!asc))) { // ik.ts < k.ts
|
||||
code = doMergeMemTableMultiRows(piRow, &irowKey, uid, piiter, pDelList, pResRow, pReader, freeTSRow);
|
||||
} else if ((rowKey.ts < irowKey.ts && asc) || (rowKey.ts > irowKey.ts && (!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;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int32_t ret = pkCompEx(&rowKey, &irowKey);
|
||||
if (ret != 0) {
|
||||
if ((ret > 0 && asc) || (ret < 0 && (!asc))) { // ik.ts < k.ts
|
||||
|
@ -3959,17 +3971,16 @@ static int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbRea
|
|||
return code;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
if (piter->hasVal && pRow != NULL) {
|
||||
tRowGetKeyEx(pRow, &rowKey);
|
||||
return doMergeMemTableMultiRows(pRow, &rowKey, uid, piter, pDelList, pResRow, pReader, freeTSRow);
|
||||
}
|
||||
|
||||
if (piiter->hasVal && piRow != NULL) {
|
||||
tRowGetKeyEx(piRow, &irowKey);
|
||||
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) {
|
||||
code = doAppendRowFromTSRow(pBlock, pReader, row.pTSRow, pBlockScanInfo);
|
||||
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) {
|
||||
|
|
|
@ -212,7 +212,7 @@ static void initLastProcKey(STableBlockScanInfo *pScanInfo, STsdbReader* pReader
|
|||
int32_t numOfPks = pReader->suppInfo.numOfPks;
|
||||
bool asc = ASCENDING_TRAVERSE(pReader->info.order);
|
||||
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;
|
||||
if (asc) {
|
||||
|
@ -1056,7 +1056,7 @@ static int32_t sortUidComparFn(const void* p1, const void* p2) {
|
|||
const SSttKeyRange* px1 = p1;
|
||||
const SSttKeyRange* px2 = p2;
|
||||
|
||||
int32_t ret = tRowKeyCompare(&px1, px2);
|
||||
int32_t ret = tRowKeyCompare(&px1->skey, &px2->skey);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,13 +39,17 @@ extern "C" {
|
|||
} while (0);
|
||||
|
||||
#define tRowGetKeyEx(_pRow, _pKey) \
|
||||
do { \
|
||||
{ \
|
||||
if ((_pRow)->type == TSDBROW_ROW_FMT) { \
|
||||
tRowGetKey((_pRow)->pTSRow, (_pKey)); \
|
||||
} else { \
|
||||
tColRowGetKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \
|
||||
(_pKey)->ts = (_pRow)->pTSRow->ts; \
|
||||
if ((_pRow)->pTSRow->numOfPKs > 0) { \
|
||||
tRowGetPrimaryKey((_pRow)->pTSRow, (_pKey)); \
|
||||
} \
|
||||
} while (0)
|
||||
} else { \
|
||||
(_pKey)->ts = (_pRow)->pBlockData->aTSKEY[(_pRow)->iRow]; \
|
||||
tColRowGetPrimaryKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \
|
||||
} \
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
READER_STATUS_SUSPEND = 0x1,
|
||||
|
|
|
@ -757,6 +757,16 @@ _exit:
|
|||
int32_t tsdbS3Migrate(STsdb *tsdb, int64_t now, int32_t sync) {
|
||||
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) {
|
||||
return code;
|
||||
}
|
||||
|
|
|
@ -601,11 +601,14 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *
|
|||
STColumn *pTColumn = &pTSchema->columns[iCol];
|
||||
SValue value;
|
||||
|
||||
ASSERT(iCol > 0);
|
||||
|
||||
if (pRow->type == TSDBROW_ROW_FMT) {
|
||||
tRowGet(pRow->pTSRow, pTSchema, iCol, pColVal);
|
||||
} else if (pRow->type == TSDBROW_COL_FMT) {
|
||||
if (iCol == 0) {
|
||||
*pColVal =
|
||||
COL_VAL_VALUE(PRIMARYKEY_TIMESTAMP_COL_ID,
|
||||
((SValue){.type = TSDB_DATA_TYPE_TIMESTAMP, .val = pRow->pBlockData->aTSKEY[pRow->iRow]}));
|
||||
} else {
|
||||
SColData *pColData = tBlockDataGetColData(pRow->pBlockData, pTColumn->colId);
|
||||
|
||||
if (pColData) {
|
||||
|
@ -613,6 +616,7 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *
|
|||
} else {
|
||||
*pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ASSERT(0);
|
||||
}
|
||||
|
@ -628,10 +632,7 @@ void tsdbRowGetKey(TSDBROW *row, STsdbRowKey *key) {
|
|||
}
|
||||
}
|
||||
|
||||
void tColRowGetKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
|
||||
key->ts = pBlock->aTSKEY[irow];
|
||||
key->numOfPKs = 0;
|
||||
|
||||
void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
|
||||
for (int32_t i = 0; i < pBlock->nColData; i++) {
|
||||
SColData *pColData = &pBlock->aColData[i];
|
||||
if (pColData->cflag & COL_IS_KEY) {
|
||||
|
|
|
@ -3226,14 +3226,24 @@ int32_t ctgGetTbTSMAFromCache(SCatalog* pCtg, SCtgTbTSMACtx* pCtx, int32_t dbIdx
|
|||
// get tb cache
|
||||
pName = taosArrayGet(pList, i);
|
||||
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);
|
||||
ctgAddTSMAFetch(&pCtx->pFetches, dbIdx, i, fetchIdx, baseResIdx + i, flag, FETCH_TSMA_SOURCE_TB_META, NULL);
|
||||
taosArrayPush(pCtx->pResList, &(SMetaRes){0});
|
||||
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;
|
||||
int8_t tbType = pTbCache->pMeta->tableType;
|
||||
CTG_UNLOCK(CTG_READ, &pTbCache->metaLock);
|
||||
taosHashRelease(dbCache->tbCache, pTbCache);
|
||||
SName tsmaSourceTbName = *pName;
|
||||
|
||||
|
|
|
@ -446,7 +446,13 @@ typedef struct STimeWindowAggSupp {
|
|||
SColumnInfoData timeWindowData; // query time window info for scalar function execution.
|
||||
} STimeWindowAggSupp;
|
||||
|
||||
typedef struct SSteamOpBasicInfo {
|
||||
int32_t primaryPkIndex;
|
||||
bool updateOperatorInfo;
|
||||
} SSteamOpBasicInfo;
|
||||
|
||||
typedef struct SStreamScanInfo {
|
||||
SSteamOpBasicInfo basic;
|
||||
SExprInfo* pPseudoExpr;
|
||||
int32_t numOfPseudoExpr;
|
||||
SExprSupp tbnameCalSup;
|
||||
|
@ -568,10 +574,6 @@ typedef struct SOpCheckPointInfo {
|
|||
SHashObj* children; // key:child id
|
||||
} SOpCheckPointInfo;
|
||||
|
||||
typedef struct SSteamOpBasicInfo {
|
||||
int32_t primaryPkIndex;
|
||||
} SSteamOpBasicInfo;
|
||||
|
||||
typedef struct SStreamIntervalOperatorInfo {
|
||||
SOptrBasicInfo binfo; // basic info
|
||||
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,15 +824,18 @@ int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode) {
|
|||
qDebug("%s sync killed execTask", GET_TASKID(pTaskInfo));
|
||||
setTaskKilled(pTaskInfo, TSDB_CODE_TSC_QUERY_KILLED);
|
||||
|
||||
while(1) {
|
||||
taosWLockLatch(&pTaskInfo->lock);
|
||||
while (qTaskIsExecuting(pTaskInfo)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool qTaskIsExecuting(qTaskInfo_t qinfo) {
|
||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "os.h"
|
||||
#include "querynodes.h"
|
||||
#include "systable.h"
|
||||
#include "streamexecutorInt.h"
|
||||
#include "tname.h"
|
||||
|
||||
#include "tdatablock.h"
|
||||
|
@ -2426,10 +2427,13 @@ void streamScanOperatorSaveCheckpoint(SStreamScanInfo* pInfo) {
|
|||
if (!pInfo->pState) {
|
||||
return;
|
||||
}
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
void* pBuf = NULL;
|
||||
int32_t len = streamScanOperatorEncode(pInfo, &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
|
||||
|
@ -2582,6 +2586,7 @@ FETCH_NEXT_BLOCK:
|
|||
case STREAM_NORMAL:
|
||||
case STREAM_GET_ALL:
|
||||
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
||||
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||
return pBlock;
|
||||
case STREAM_RETRIEVE: {
|
||||
pInfo->blockType = STREAM_INPUT__DATA_SUBMIT;
|
||||
|
@ -2622,6 +2627,7 @@ FETCH_NEXT_BLOCK:
|
|||
|
||||
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
||||
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
||||
setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type);
|
||||
return pInfo->pDeleteDataRes;
|
||||
} else {
|
||||
goto FETCH_NEXT_BLOCK;
|
||||
|
@ -2639,6 +2645,7 @@ FETCH_NEXT_BLOCK:
|
|||
if (pInfo->pDeleteDataRes->info.rows > 0) {
|
||||
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
||||
printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo));
|
||||
setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type);
|
||||
return pInfo->pDeleteDataRes;
|
||||
} else {
|
||||
goto FETCH_NEXT_BLOCK;
|
||||
|
@ -2652,6 +2659,7 @@ FETCH_NEXT_BLOCK:
|
|||
break;
|
||||
}
|
||||
printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo));
|
||||
setStreamOperatorState(&pInfo->basic, pBlock->info.type);
|
||||
return pBlock;
|
||||
} else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) {
|
||||
qDebug("stream scan mode:%d, %s", pInfo->scanMode, id);
|
||||
|
@ -2659,6 +2667,7 @@ FETCH_NEXT_BLOCK:
|
|||
case STREAM_SCAN_FROM_RES: {
|
||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
||||
doCheckUpdate(pInfo, pInfo->pRes->info.window.ekey, pInfo->pRes);
|
||||
setStreamOperatorState(&pInfo->basic, pInfo->pRes->info.type);
|
||||
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
||||
pInfo->pRes->info.dataLoad = 1;
|
||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||
|
@ -2762,6 +2771,7 @@ FETCH_NEXT_BLOCK:
|
|||
}
|
||||
|
||||
doCheckUpdate(pInfo, pBlockInfo->window.ekey, pInfo->pRes);
|
||||
setStreamOperatorState(&pInfo->basic, pInfo->pRes->info.type);
|
||||
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
|
||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "functionMgt.h"
|
||||
#include "operator.h"
|
||||
#include "querytask.h"
|
||||
#include "streamexecutorInt.h"
|
||||
#include "tchecksum.h"
|
||||
#include "tcommon.h"
|
||||
#include "tdatablock.h"
|
||||
|
@ -415,6 +416,7 @@ void* doStreamCountDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
|||
|
||||
void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||
SStreamCountAggOperatorInfo* pInfo = pOperator->info;
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
int32_t len = doStreamCountEncodeOpState(NULL, 0, pOperator, true);
|
||||
void* buf = taosMemoryCalloc(1, len);
|
||||
void* pBuf = buf;
|
||||
|
@ -422,6 +424,8 @@ void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) {
|
|||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_COUNT_OP_CHECKPOINT_NAME,
|
||||
strlen(STREAM_COUNT_OP_CHECKPOINT_NAME), buf, len);
|
||||
taosMemoryFree(buf);
|
||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||
}
|
||||
}
|
||||
|
||||
void doResetCountWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock) {
|
||||
|
@ -550,6 +554,7 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) {
|
|||
break;
|
||||
}
|
||||
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) {
|
||||
bool add = pInfo->destHasPrimaryKey && IS_NORMAL_COUNT_OP(pOperator);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "functionMgt.h"
|
||||
#include "operator.h"
|
||||
#include "querytask.h"
|
||||
#include "streamexecutorInt.h"
|
||||
#include "tchecksum.h"
|
||||
#include "tcommon.h"
|
||||
#include "tcompare.h"
|
||||
|
@ -458,6 +459,7 @@ void* doStreamEventDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
|||
|
||||
void doStreamEventSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||
SStreamEventAggOperatorInfo* pInfo = pOperator->info;
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
int32_t len = doStreamEventEncodeOpState(NULL, 0, pOperator);
|
||||
void* buf = taosMemoryCalloc(1, len);
|
||||
void* pBuf = buf;
|
||||
|
@ -465,6 +467,8 @@ void doStreamEventSaveCheckpoint(SOperatorInfo* pOperator) {
|
|||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_EVENT_OP_CHECKPOINT_NAME,
|
||||
strlen(STREAM_EVENT_OP_CHECKPOINT_NAME), buf, len);
|
||||
taosMemoryFree(buf);
|
||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||
}
|
||||
}
|
||||
|
||||
static SSDataBlock* buildEventResult(SOperatorInfo* pOperator) {
|
||||
|
@ -531,6 +535,7 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) {
|
|||
break;
|
||||
}
|
||||
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 ||
|
||||
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 "operator.h"
|
||||
#include "querytask.h"
|
||||
#include "streamexecutorInt.h"
|
||||
#include "tchecksum.h"
|
||||
#include "tcommon.h"
|
||||
#include "tcompare.h"
|
||||
|
@ -1211,6 +1212,7 @@ void doStreamIntervalDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera
|
|||
|
||||
void doStreamIntervalSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
int32_t len = doStreamIntervalEncodeOpState(NULL, 0, pOperator);
|
||||
void* buf = taosMemoryCalloc(1, len);
|
||||
void* pBuf = buf;
|
||||
|
@ -1218,6 +1220,8 @@ void doStreamIntervalSaveCheckpoint(SOperatorInfo* pOperator) {
|
|||
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_INTERVAL_OP_CHECKPOINT_NAME,
|
||||
strlen(STREAM_INTERVAL_OP_CHECKPOINT_NAME), buf, len);
|
||||
taosMemoryFree(buf);
|
||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||
}
|
||||
}
|
||||
|
||||
static void copyIntervalDeleteKey(SSHashObj* pMap, SArray* pWins) {
|
||||
|
@ -1347,6 +1351,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
|||
}
|
||||
pInfo->numOfDatapack++;
|
||||
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) {
|
||||
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
||||
|
@ -2690,6 +2695,7 @@ void* doStreamSessionDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera
|
|||
|
||||
void doStreamSessionSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
int32_t len = doStreamSessionEncodeOpState(NULL, 0, pOperator, true);
|
||||
void* buf = taosMemoryCalloc(1, len);
|
||||
void* pBuf = buf;
|
||||
|
@ -2697,6 +2703,8 @@ void doStreamSessionSaveCheckpoint(SOperatorInfo* pOperator) {
|
|||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_SESSION_OP_CHECKPOINT_NAME,
|
||||
strlen(STREAM_SESSION_OP_CHECKPOINT_NAME), buf, len);
|
||||
taosMemoryFree(buf);
|
||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||
}
|
||||
}
|
||||
|
||||
void resetUnCloseSessionWinInfo(SSHashObj* winMap) {
|
||||
|
@ -2766,6 +2774,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
|
|||
break;
|
||||
}
|
||||
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 ||
|
||||
pBlock->info.type == STREAM_CLEAR) {
|
||||
|
@ -3176,6 +3185,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
|
|||
break;
|
||||
}
|
||||
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 ||
|
||||
pBlock->info.type == STREAM_CLEAR) {
|
||||
|
@ -3673,6 +3683,7 @@ void* doStreamStateDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
|||
|
||||
void doStreamStateSaveCheckpoint(SOperatorInfo* pOperator) {
|
||||
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||
int32_t len = doStreamStateEncodeOpState(NULL, 0, pOperator, true);
|
||||
void* buf = taosMemoryCalloc(1, len);
|
||||
void* pBuf = buf;
|
||||
|
@ -3680,6 +3691,8 @@ void doStreamStateSaveCheckpoint(SOperatorInfo* pOperator) {
|
|||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_STATE_OP_CHECKPOINT_NAME,
|
||||
strlen(STREAM_STATE_OP_CHECKPOINT_NAME), buf, len);
|
||||
taosMemoryFree(buf);
|
||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||
}
|
||||
}
|
||||
|
||||
static SSDataBlock* buildStateResult(SOperatorInfo* pOperator) {
|
||||
|
@ -3746,6 +3759,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
|
|||
break;
|
||||
}
|
||||
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 ||
|
||||
pBlock->info.type == STREAM_CLEAR) {
|
||||
|
@ -4069,6 +4083,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
|
|||
|
||||
pInfo->numOfDatapack++;
|
||||
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 ||
|
||||
pBlock->info.type == STREAM_CLEAR) {
|
||||
|
@ -4465,6 +4480,7 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) {
|
|||
}
|
||||
pInfo->numOfDatapack++;
|
||||
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) {
|
||||
pInfo->binfo.pRes->info.type = pBlock->info.type;
|
||||
|
|
|
@ -1651,6 +1651,8 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
|
|||
SSysTableScanInfo* pInfo = pOperator->info;
|
||||
char dbName[TSDB_DB_NAME_LEN] = {0};
|
||||
|
||||
while (1) {
|
||||
|
||||
if (isTaskKilled(pOperator->pTaskInfo)) {
|
||||
setOperatorCompleted(pOperator);
|
||||
return NULL;
|
||||
|
@ -1692,11 +1694,15 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
|
|||
setOperatorCompleted(pOperator);
|
||||
}
|
||||
|
||||
return pBlock->info.rows > 0 ? pBlock : NULL;
|
||||
if (pBlock->info.rows == 0) {
|
||||
continue;
|
||||
}
|
||||
return pBlock;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
|
||||
SSDataBlock* pBlock) {
|
||||
|
|
|
@ -1424,7 +1424,7 @@ int main(int argc, char *argv[]) {
|
|||
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");
|
||||
return -2;
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@ int aggregateFuncTest() {
|
|||
int main(int argc, char *argv[]) {
|
||||
parseArgs(argc, argv);
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -86,6 +86,67 @@ _exit:
|
|||
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 code = TSDB_CODE_FAILED;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -125,6 +190,11 @@ int32_t doGeomFromText(const char *inputWKT, unsigned char **outputGeom, size_t
|
|||
GEOSGeometry *geom = 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);
|
||||
if (geom == NULL) {
|
||||
code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
|
||||
|
|
|
@ -187,6 +187,8 @@ const char* nodesNodeName(ENodeType type) {
|
|||
return "BalanceVgroupStmt";
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||
return "BalanceVgroupLeaderStmt";
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||
return "BalanceVgroupLeaderStmt";
|
||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||
return "MergeVgroupStmt";
|
||||
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.
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||
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:
|
||||
return mergeVgroupStmtToJson(pObj, pJson);
|
||||
case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
|
||||
|
@ -7953,6 +7957,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
|||
case QUERY_NODE_BALANCE_VGROUP_STMT:
|
||||
return TSDB_CODE_SUCCESS; // SBalanceVgroupStmt has no fields to deserialize.
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||
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:
|
||||
return jsonToMergeVgroupStmt(pJson, pObj);
|
||||
|
|
|
@ -473,6 +473,8 @@ SNode* nodesMakeNode(ENodeType type) {
|
|||
return makeNode(type, sizeof(SBalanceVgroupStmt));
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||
return makeNode(type, sizeof(SBalanceVgroupLeaderStmt));
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||
return makeNode(type, sizeof(SBalanceVgroupLeaderStmt));
|
||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||
return makeNode(type, sizeof(SMergeVgroupStmt));
|
||||
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_BALANCE_VGROUP_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
|
||||
break;
|
||||
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* createBalanceVgroupStmt(SAstCreateContext* pCxt);
|
||||
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* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes);
|
||||
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
||||
|
|
|
@ -773,6 +773,7 @@ cmd ::= KILL COMPACT NK_INTEGER(A).
|
|||
/************************************************ merge/redistribute/ vgroup ******************************************/
|
||||
cmd ::= BALANCE VGROUP. { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); }
|
||||
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 ::= 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); }
|
||||
|
|
|
@ -2809,6 +2809,16 @@ SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgI
|
|||
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) {
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
|
||||
SAstCreateContext cxt;
|
||||
initAstCreateContext(pParseCxt, &cxt);
|
||||
|
@ -635,8 +634,8 @@ static int32_t collectMetaKeyFromShowCompacts(SCollectMetaKeyCxt* pCxt, SShowStm
|
|||
}
|
||||
|
||||
static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_COMPACT_DETAILS,
|
||||
pCxt->pMetaCache);
|
||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
|
||||
TSDB_INS_TABLE_COMPACT_DETAILS, pCxt->pMetaCache);
|
||||
return code;
|
||||
}
|
||||
|
||||
|
@ -700,7 +699,6 @@ static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowC
|
|||
return code;
|
||||
}
|
||||
|
||||
|
||||
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_APPS,
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
static int32_t collectMetaKeyFromCreateViewStmt(SCollectMetaKeyCxt* pCxt, SCreateViewStmt* pStmt) {
|
||||
int32_t code =
|
||||
reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->viewName, pCxt->pMetaCache);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
|
||||
pCxt->pMetaCache);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName, AUTH_TYPE_ALTER,
|
||||
pCxt->pMetaCache);
|
||||
code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName,
|
||||
AUTH_TYPE_ALTER, pCxt->pMetaCache);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
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,
|
||||
pCxt->pMetaCache);
|
||||
int32_t code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName,
|
||||
pStmt->viewName, AUTH_TYPE_ALTER, pCxt->pMetaCache);
|
||||
return code;
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
#ifdef TD_ENTERPRISE
|
||||
if (TSDB_VIEW_TABLE == pRealTable->pMeta->tableType) {
|
||||
if (TSDB_VIEW_TABLE == pRealTable->pMeta->tableType && !pCurrSmt->tagScan) {
|
||||
return translateView(pCxt, pTable, &name);
|
||||
}
|
||||
translateAudit(pCxt, pRealTable, &name);
|
||||
|
@ -10578,6 +10578,7 @@ static int32_t translateBalanceVgroup(STranslateContext* pCxt, SBalanceVgroupStm
|
|||
static int32_t translateBalanceVgroupLeader(STranslateContext* pCxt, SBalanceVgroupLeaderStmt* pStmt) {
|
||||
SBalanceVgroupLeaderReq req = {0};
|
||||
req.vgId = pStmt->vgId;
|
||||
if(pStmt->dbName != NULL) strcpy(req.db, pStmt->dbName);
|
||||
int32_t code =
|
||||
buildCmdMsg(pCxt, TDMT_MND_BALANCE_VGROUP_LEADER, (FSerializeFunc)tSerializeSBalanceVgroupLeaderReq, &req);
|
||||
tFreeSBalanceVgroupLeaderReq(&req);
|
||||
|
@ -11263,6 +11264,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
|||
case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
|
||||
code = translateBalanceVgroupLeader(pCxt, (SBalanceVgroupLeaderStmt*)pNode);
|
||||
break;
|
||||
case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
|
||||
code = translateBalanceVgroupLeader(pCxt, (SBalanceVgroupLeaderStmt*)pNode);
|
||||
break;
|
||||
case QUERY_NODE_MERGE_VGROUP_STMT:
|
||||
code = translateMergeVgroup(pCxt, (SMergeVgroupStmt*)pNode);
|
||||
break;
|
||||
|
@ -11875,11 +11879,18 @@ static int32_t checkShowTags(STranslateContext* pCxt, const SShowStmt* pShow) {
|
|||
toName(pCxt->pParseCxt->acctId, ((SValueNode*)pShow->pDbName)->literal,
|
||||
((SValueNode*)pShow->pTbName)->literal, &name),
|
||||
&pTableMeta, true);
|
||||
taosMemoryFreeClear(pTableMeta);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -246,11 +246,10 @@ static bool scanPathOptMayBeOptimized(SLogicNode* pNode) {
|
|||
|
||||
static bool scanPathOptShouldGetFuncs(SLogicNode* pNode) {
|
||||
if (QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode)) {
|
||||
if (pNode->pParent && QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode->pParent)) {
|
||||
if (WINDOW_TYPE_INTERVAL == ((SWindowLogicNode*)pNode->pParent)->winType) return true;
|
||||
} else {
|
||||
if (!pNode->pParent || QUERY_NODE_LOGIC_PLAN_WINDOW != nodeType(pNode->pParent) ||
|
||||
WINDOW_TYPE_INTERVAL == ((SWindowLogicNode*)pNode->pParent)->winType)
|
||||
return !scanPathOptHaveNormalCol(((SPartitionLogicNode*)pNode)->pPartitionKeys);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode) &&
|
||||
|
|
|
@ -2740,9 +2740,11 @@ int32_t streamStateGetGroupKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* pKey,
|
|||
if (pKey->groupId == groupId) {
|
||||
return 0;
|
||||
}
|
||||
if (pVal != NULL) {
|
||||
taosMemoryFree((void*)*pVal);
|
||||
*pVal = NULL;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int32_t streamStateAddIfNotExist_rocksdb(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen) {
|
||||
|
|
|
@ -1631,6 +1631,8 @@ int32_t streamMetaAddFailedTask(SStreamMeta* pMeta, int64_t streamId, int32_t ta
|
|||
streamMetaAddTaskLaunchResult(pMeta, hId.streamId, hId.taskId, startTs, now, false);
|
||||
}
|
||||
} else {
|
||||
streamMetaRUnLock(pMeta);
|
||||
|
||||
stError("failed to locate the stream task:0x%" PRIx64 "-0x%x (vgId:%d), it may have been destroyed or stopped",
|
||||
streamId, taskId, pMeta->vgId);
|
||||
code = TSDB_CODE_STREAM_TASK_NOT_EXIST;
|
||||
|
|
|
@ -557,7 +557,6 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
|||
const int32_t BATCH_LIMIT = 256;
|
||||
|
||||
int64_t st = taosGetTimestampMs();
|
||||
int32_t numOfElems = listNEles(pSnapshot);
|
||||
SListNode* pNode = NULL;
|
||||
|
||||
int idx = streamStateGetCfIdx(pFileState->pFileStore, pFileState->cfName);
|
||||
|
@ -589,8 +588,11 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
|||
}
|
||||
taosMemoryFree(buf);
|
||||
|
||||
if (streamStateGetBatchSize(batch) > 0) {
|
||||
int32_t numOfElems = streamStateGetBatchSize(batch);
|
||||
if (numOfElems > 0) {
|
||||
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
||||
} else {
|
||||
goto _end;
|
||||
}
|
||||
|
||||
streamStateClearBatch(batch);
|
||||
|
@ -609,6 +611,7 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
|||
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
||||
}
|
||||
|
||||
_end:
|
||||
streamStateDestroyBatch(batch);
|
||||
return code;
|
||||
}
|
||||
|
|
|
@ -123,7 +123,7 @@ typedef struct {
|
|||
STransMsg* pRsp;
|
||||
SEpSet epSet;
|
||||
int8_t hasEpSet;
|
||||
tsem_t* pSem;
|
||||
tsem2_t* pSem;
|
||||
int8_t inited;
|
||||
SRWLatch latch;
|
||||
} STransSyncMsg;
|
||||
|
|
|
@ -2455,7 +2455,7 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) {
|
|||
pSyncMsg->hasEpSet = 1;
|
||||
epsetAssign(&pSyncMsg->epSet, &pCtx->epSet);
|
||||
}
|
||||
tsem_post(pSyncMsg->pSem);
|
||||
tsem2_post(pSyncMsg->pSem);
|
||||
taosReleaseRef(transGetSyncMsgMgt(), pCtx->syncMsgRef);
|
||||
} else {
|
||||
rpcFreeCont(pResp->pCont);
|
||||
|
@ -2684,8 +2684,8 @@ _RETURN:
|
|||
return ret;
|
||||
}
|
||||
int64_t transCreateSyncMsg(STransMsg* pTransMsg) {
|
||||
tsem_t* sem = taosMemoryCalloc(1, sizeof(tsem_t));
|
||||
tsem_init(sem, 0, 0);
|
||||
tsem2_t* sem = taosMemoryCalloc(1, sizeof(tsem2_t));
|
||||
tsem2_init(sem, 0, 0);
|
||||
|
||||
STransSyncMsg* pSyncMsg = taosMemoryCalloc(1, sizeof(STransSyncMsg));
|
||||
|
||||
|
@ -2745,7 +2745,7 @@ int transSendRecvWithTimeout(void* shandle, SEpSet* pEpSet, STransMsg* pReq, STr
|
|||
goto _RETURN;
|
||||
}
|
||||
|
||||
ret = tsem_timewait(pSyncMsg->pSem, timeoutMs);
|
||||
ret = tsem2_timewait(pSyncMsg->pSem, timeoutMs);
|
||||
if (ret < 0) {
|
||||
pRsp->code = TSDB_CODE_TIMEOUT_ERROR;
|
||||
ret = TSDB_CODE_TIMEOUT_ERROR;
|
||||
|
|
|
@ -683,7 +683,7 @@ void transDestroySyncMsg(void* msg) {
|
|||
if (msg == NULL) return;
|
||||
|
||||
STransSyncMsg* pSyncMsg = msg;
|
||||
tsem_destroy(pSyncMsg->pSem);
|
||||
tsem2_destroy(pSyncMsg->pSem);
|
||||
taosMemoryFree(pSyncMsg->pSem);
|
||||
transFreeMsg(pSyncMsg->pRsp->pCont);
|
||||
taosMemoryFree(pSyncMsg->pRsp);
|
||||
|
|
|
@ -680,6 +680,7 @@ static FORCE_INLINE void destroySmsg(SSvrMsg* smsg) {
|
|||
taosMemoryFree(smsg);
|
||||
}
|
||||
static FORCE_INLINE void destroySmsgWrapper(void* smsg, void* param) { destroySmsg((SSvrMsg*)smsg); }
|
||||
|
||||
static void destroyAllConn(SWorkThrd* pThrd) {
|
||||
tTrace("thread %p destroy all conn ", pThrd);
|
||||
while (!QUEUE_IS_EMPTY(&pThrd->conn)) {
|
||||
|
|
|
@ -215,14 +215,6 @@ int32_t taosGetAppName(char* name, int32_t* len) {
|
|||
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) {
|
||||
int ret = 0;
|
||||
|
||||
|
@ -241,4 +233,101 @@ int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
|
|||
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
|
||||
|
|
|
@ -170,6 +170,16 @@ int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr) {
|
|||
#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) {
|
||||
#ifdef __USE_WIN_THREAD
|
||||
return 0;
|
||||
|
|
|
@ -71,7 +71,6 @@ TEST(osSemaphoreTests, WaitTime1) {
|
|||
tsem_destroy(&sem);
|
||||
}
|
||||
|
||||
|
||||
TEST(osSemaphoreTests, WaitAndPost) {
|
||||
tsem_t sem;
|
||||
int result = tsem_init(&sem, 0, 0);
|
||||
|
@ -106,3 +105,135 @@ TEST(osSemaphoreTests, TimedWait) {
|
|||
result = tsem_destroy(&sem);
|
||||
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,27 +21,27 @@ target_include_directories(
|
|||
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/sz/inc"
|
||||
PRIVATE "${TD_SOURCE_DIR}/utils/TSZ/zstd/"
|
||||
PRIVATE "${TD_SOURCE_DIR}/contrib/lzma2/"
|
||||
PRIVATE "${TD_SOURCE_DIR}/contrib/pcre2/"
|
||||
)
|
||||
|
||||
target_link_directories(
|
||||
util
|
||||
PUBLIC "${TD_SOURCE_DIR}/contrib/lzma2"
|
||||
PUBLIC "${TD_SOURCE_DIR}/contrib/pcre2"
|
||||
)
|
||||
|
||||
|
||||
if (TD_LINUX)
|
||||
target_link_libraries(
|
||||
util
|
||||
PUBLIC os common
|
||||
PUBLIC lz4_static fast-lzma2
|
||||
PUBLIC lz4_static fast-lzma2 pcre2-8
|
||||
PUBLIC api cjson geos_c TSZ
|
||||
|
||||
)
|
||||
else()
|
||||
target_link_libraries(
|
||||
util
|
||||
PUBLIC os common
|
||||
PUBLIC lz4_static
|
||||
PUBLIC lz4_static pcre2-8
|
||||
PUBLIC api cjson geos_c TSZ
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -61,9 +61,7 @@
|
|||
#include "zstd.h"
|
||||
#endif
|
||||
|
||||
#ifdef TD_TSZ
|
||||
#include "td_sz.h"
|
||||
#endif
|
||||
|
||||
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);
|
||||
|
@ -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)))
|
||||
|
||||
#ifdef TD_TSZ
|
||||
bool lossyFloat = false;
|
||||
bool lossyDouble = false;
|
||||
|
||||
|
@ -341,8 +338,6 @@ int32_t tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision,
|
|||
// exit call
|
||||
void tsCompressExit() { tdszExit(); }
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compress Integer (Simple8B).
|
||||
*/
|
||||
|
@ -1214,7 +1209,6 @@ int32_t tsDecompressFloatImp(const char *const input, const int32_t nelements, c
|
|||
return nelements * FLOAT_BYTES;
|
||||
}
|
||||
|
||||
#ifdef TD_TSZ
|
||||
//
|
||||
// ---------- float double lossy -----------
|
||||
//
|
||||
|
@ -1283,7 +1277,6 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co
|
|||
// decompressed with sz
|
||||
return tdszDecompress(SZ_DOUBLE, input + 1, compressedSize - 1, nelements, output);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_NO_CALL
|
||||
/*************************************************************************
|
||||
|
@ -2463,13 +2456,11 @@ int32_t tsDecompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut,
|
|||
// Float =====================================================
|
||||
int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||
int32_t nBuf) {
|
||||
#ifdef TD_TSZ
|
||||
// lossy mode
|
||||
if (lossyFloat) {
|
||||
return tsCompressFloatLossyImp(pIn, nEle, pOut);
|
||||
// lossless mode
|
||||
} else {
|
||||
#endif
|
||||
if (cmprAlg == ONE_STAGE_COMP) {
|
||||
return tsCompressFloatImp(pIn, nEle, pOut);
|
||||
} 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");
|
||||
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 nBuf) {
|
||||
#ifdef TD_TSZ
|
||||
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
||||
// decompress lossy
|
||||
return tsDecompressFloatLossyImp(pIn, nIn, nEle, pOut);
|
||||
} else {
|
||||
#endif
|
||||
// decompress lossless
|
||||
if (cmprAlg == ONE_STAGE_COMP) {
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
#ifdef TD_TSZ
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Double =====================================================
|
||||
int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf,
|
||||
int32_t nBuf) {
|
||||
#ifdef TD_TSZ
|
||||
if (lossyDouble) {
|
||||
// lossy mode
|
||||
return tsCompressDoubleLossyImp(pIn, nEle, pOut);
|
||||
} else {
|
||||
#endif
|
||||
// lossless mode
|
||||
if (cmprAlg == ONE_STAGE_COMP) {
|
||||
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");
|
||||
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 nBuf) {
|
||||
#ifdef TD_TSZ
|
||||
if (HEAD_ALGO(((uint8_t *)pIn)[0]) == ALGO_SZ_LOSSY) {
|
||||
// decompress lossy
|
||||
return tsDecompressDoubleLossyImp(pIn, nIn, nEle, pOut);
|
||||
} else {
|
||||
#endif
|
||||
// decompress lossless
|
||||
if (cmprAlg == ONE_STAGE_COMP) {
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
#ifdef TD_TSZ
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// 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_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_DB_ENCRYPT_GRANT_EXPIRED, "The database encryption function grant expired")
|
||||
|
||||
// mnode-node
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_MNODE_ALREADY_EXIST, "Mnode already exists")
|
||||
|
|
|
@ -43,6 +43,10 @@ void destroyThreadLocalGeosCtx() {
|
|||
tlGeosCtx.WKBWriter = NULL;
|
||||
}
|
||||
|
||||
if (tlGeosCtx.WKTRegex) {
|
||||
destroyRegexes(tlGeosCtx.WKTRegex, tlGeosCtx.WKTMatchData);
|
||||
}
|
||||
|
||||
if(tlGeosCtx.handle) {
|
||||
GEOS_finish_r(tlGeosCtx.handle);
|
||||
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);
|
||||
}
|
|
@ -13,7 +13,7 @@ IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
|||
|
||||
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
||||
ADD_EXECUTABLE(utilTest ${SOURCE_LIST})
|
||||
TARGET_LINK_LIBRARIES(utilTest util common os gtest pthread public taos)
|
||||
TARGET_LINK_LIBRARIES(utilTest util common os gtest pthread)
|
||||
|
||||
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/cacheTest.cpp)
|
||||
LIST(APPEND SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/hashTest.cpp)
|
||||
|
|
|
@ -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())
|
|
@ -102,6 +102,22 @@ class TDTestCase(TBase):
|
|||
allRows = self.insert_rows * self.childtable_count
|
||||
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):
|
||||
# not support
|
||||
sql = "show accounts;"
|
||||
|
@ -125,10 +141,12 @@ class TDTestCase(TBase):
|
|||
sqls = [
|
||||
"show scores;",
|
||||
"SHOW CLUSTER VARIABLES",
|
||||
"SHOW BNODES;",
|
||||
# "SHOW BNODES;",
|
||||
]
|
||||
tdSql.executes(sqls)
|
||||
|
||||
self.checkShowTags()
|
||||
|
||||
|
||||
# run
|
||||
def run(self):
|
||||
|
@ -143,6 +161,9 @@ class TDTestCase(TBase):
|
|||
# do action
|
||||
self.doQuery()
|
||||
|
||||
# check show
|
||||
self.checkShow()
|
||||
|
||||
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
|
|
|
@ -48,13 +48,19 @@ class TDTestCase(TBase):
|
|||
"bigint","bigint unsigned","timestamp","bool","float","double","binary(16)","nchar(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):
|
||||
# encode
|
||||
encodes = [
|
||||
[["tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned","bigint","bigint unsigned"], ["simple8b"]],
|
||||
[["timestamp","bigint","bigint unsigned"], ["delta-i"]],
|
||||
[["bool"], ["bit-packing"]],
|
||||
[["float","double"], ["delta-d"]]
|
||||
[["tinyint","tinyint unsigned","smallint","smallint unsigned","int","int unsigned","bigint","bigint unsigned"], ["simple8B"]],
|
||||
[["timestamp","bigint","bigint unsigned"], ["Delta-i"]],
|
||||
[["bool"], ["Bit-packing"]],
|
||||
[["float","double"], ["Delta-d"]]
|
||||
]
|
||||
|
||||
c = 0 # column number
|
||||
|
@ -65,7 +71,6 @@ class TDTestCase(TBase):
|
|||
|
||||
# loop append sqls
|
||||
for lines in encodes:
|
||||
print(lines)
|
||||
for datatype in lines[0]:
|
||||
for encode in lines[1]:
|
||||
for compress in self.compresses:
|
||||
|
@ -74,6 +79,7 @@ class TDTestCase(TBase):
|
|||
# first
|
||||
sql = f"create table {self.db}.st{t} (ts timestamp"
|
||||
else:
|
||||
if self.combineValid(datatype, encode, compress):
|
||||
sql += f", c{c} {datatype} ENCODE '{encode}' COMPRESS '{compress}' LEVEL '{level}'"
|
||||
c += 1
|
||||
|
||||
|
@ -97,9 +103,11 @@ class TDTestCase(TBase):
|
|||
# check error create
|
||||
def errorCreate(self):
|
||||
sqls = [
|
||||
f"create table terr(ts timestamp, c0 int ENCODE 'abc') ",
|
||||
f""
|
||||
f"create table terr(ts timestamp, c0 int ENCODE 'simple8B' COMPRESS 'tsz' LEVEL 'high') ",
|
||||
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:
|
||||
# encode
|
||||
|
@ -112,6 +120,11 @@ class TDTestCase(TBase):
|
|||
sql = f"create table terr(ts timestamp, c0 {dtype} LEVEL 'hig') "
|
||||
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
|
||||
def defaultCorrect(self):
|
||||
# get default encode compress level
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
# 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/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/query/function/test_func_elapsed.py
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_join.py
|
||||
|
@ -20,6 +20,7 @@
|
|||
,,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/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
|
||||
,,n,army,python3 ./test.py -f community/cmdline/fullopt.py
|
||||
,,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
|
||||
pip3 list|grep taospy
|
||||
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
|
||||
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
|
||||
#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 memory_leak: $memory_leak"\033[0m"
|
||||
|
|
|
@ -135,4 +135,177 @@ endi
|
|||
print =========================== td-24781
|
||||
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
|
||||
|
|
|
@ -269,13 +269,17 @@ class TDTestCase:
|
|||
|
||||
def ins_grants_check(self):
|
||||
grant_name_dict = {
|
||||
'stream':'stream',
|
||||
'subscription':'subscription',
|
||||
'view':'view',
|
||||
'audit':'audit',
|
||||
'csv':'csv',
|
||||
'storage':'multi_tier_storage',
|
||||
'backup_restore':'backup_restore',
|
||||
'stream':'Stream',
|
||||
'subscription':'Subscription',
|
||||
'view':'View',
|
||||
'audit':'Audit',
|
||||
'csv':'CSV',
|
||||
'storage':'Multi-Tier Storage',
|
||||
'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_ua':'OPC_UA',
|
||||
'pi':'Pi',
|
||||
|
@ -285,7 +289,10 @@ class TDTestCase:
|
|||
'avevahistorian':'avevaHistorian',
|
||||
'opentsdb':'OpenTSDB',
|
||||
'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')
|
||||
|
@ -297,7 +304,7 @@ class TDTestCase:
|
|||
if result[i][0] in grant_name_dict:
|
||||
tdSql.checkEqual(result[i][1], grant_name_dict[result[i][0]])
|
||||
index += 1
|
||||
tdSql.checkEqual(index, 17)
|
||||
tdSql.checkEqual(index, 24)
|
||||
tdSql.query(f'select * from information_schema.ins_grants_logs')
|
||||
result = tdSql.queryResult
|
||||
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 ctb1 using stb tags (1, 1)')
|
||||
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 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.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 db.tb_undef')
|
||||
tdSql.error(f'show tags from tb_undef')
|
||||
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', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||
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
|
||||
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.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 db.tb_undef')
|
||||
tdSql.error(f'show table tags from tb_undef')
|
||||
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', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||
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
|
||||
tdSql.execute(f'create index idx1 on stb (t1)')
|
||||
|
|
|
@ -31,8 +31,8 @@ class LegalDataType(Enum):
|
|||
UINT = 'INT UNSIGNED'
|
||||
BIGINT = 'BIGINT'
|
||||
UBIGINT = 'BIGINT UNSIGNED'
|
||||
VARCHAR = 'VARCHAR(100)'
|
||||
BINARY = 'BINARY(100)'
|
||||
VARCHAR = 'VARCHAR(10000)'
|
||||
BINARY = 'BINARY(10000)'
|
||||
|
||||
|
||||
class TableType(Enum):
|
||||
|
|
|
@ -22,7 +22,7 @@ class TDTestCase:
|
|||
self.vgroups = 4
|
||||
self.ctbNum = 10
|
||||
self.rowsPerTbl = 10000
|
||||
self.duraion = '1h'
|
||||
self.duraion = '1d'
|
||||
|
||||
def init(self, conn, logSql, replicaVar=1):
|
||||
self.replicaVar = int(replicaVar)
|
||||
|
@ -33,7 +33,7 @@ class TDTestCase:
|
|||
if dropFlag == 1:
|
||||
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))
|
||||
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(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(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(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(*), 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):
|
||||
self.prepareTestEnv()
|
||||
tdSql.execute('flush database test')
|
||||
#time.sleep(99999999)
|
||||
self.test_sort_for_partition_hint()
|
||||
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 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)
|
||||
|
||||
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.checkRows(3)
|
||||
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")
|
||||
|
||||
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")
|
||||
|
||||
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")
|
||||
|
||||
tdSql.query("select * from stb")
|
||||
tdSql.checkRows(3)
|
||||
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")
|
||||
|
||||
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")
|
||||
|
||||
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")
|
||||
|
||||
# run
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -276,12 +276,16 @@ int32_t simExecuteExpression(SScript *script, char *exp) {
|
|||
if (op1[0] == '=') {
|
||||
strcpy(simGetVariable(script, var1 + 1, var1Len - 1), t3);
|
||||
} else if (op1[0] == '<') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
int64_t val0 = atoll(t0);
|
||||
int64_t val1 = atoll(t3);
|
||||
// val0 = atoi(t0);
|
||||
// val1 = atoi(t3);
|
||||
if (val0 >= val1) result = -1;
|
||||
} else if (op1[0] == '>') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
int64_t val0 = atoll(t0);
|
||||
int64_t val1 = atoll(t3);
|
||||
// val0 = atoi(t0);
|
||||
// val1 = atoi(t3);
|
||||
if (val0 <= val1) result = -1;
|
||||
}
|
||||
} else {
|
||||
|
@ -381,10 +385,8 @@ bool simExecuteRunBackCmd(SScript *script, char *option) {
|
|||
void simReplaceDirSep(char *buf) {
|
||||
#ifdef WINDOWS
|
||||
int i = 0;
|
||||
while(buf[i] != '\0')
|
||||
{
|
||||
if(buf[i] == '/')
|
||||
{
|
||||
while (buf[i] != '\0') {
|
||||
if (buf[i] == '/') {
|
||||
buf[i] = '\\';
|
||||
}
|
||||
i++;
|
||||
|
|
|
@ -28,7 +28,7 @@ extern bool simExecSuccess;
|
|||
|
||||
int32_t simInitCfg() {
|
||||
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();
|
||||
tstrncpy(simScriptDir, cfgGetItem(pCfg, "scriptDir")->str, PATH_MAX);
|
||||
|
|
Loading…
Reference in New Issue