Merge branch '3.0' into fix/TD-15957
This commit is contained in:
commit
a6a6d0f9c7
|
@ -110,3 +110,4 @@ contrib/*
|
||||||
!contrib/CMakeLists.txt
|
!contrib/CMakeLists.txt
|
||||||
!contrib/test
|
!contrib/test
|
||||||
sql
|
sql
|
||||||
|
debug*/
|
||||||
|
|
|
@ -34,7 +34,6 @@ extern "C" {
|
||||||
#define TSDB_INS_TABLE_USER_FUNCTIONS "user_functions"
|
#define TSDB_INS_TABLE_USER_FUNCTIONS "user_functions"
|
||||||
#define TSDB_INS_TABLE_USER_INDEXES "user_indexes"
|
#define TSDB_INS_TABLE_USER_INDEXES "user_indexes"
|
||||||
#define TSDB_INS_TABLE_USER_STABLES "user_stables"
|
#define TSDB_INS_TABLE_USER_STABLES "user_stables"
|
||||||
#define TSDB_INS_TABLE_USER_STREAMS "user_streams"
|
|
||||||
#define TSDB_INS_TABLE_USER_TABLES "user_tables"
|
#define TSDB_INS_TABLE_USER_TABLES "user_tables"
|
||||||
#define TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED "user_table_distributed"
|
#define TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED "user_table_distributed"
|
||||||
#define TSDB_INS_TABLE_USER_USERS "user_users"
|
#define TSDB_INS_TABLE_USER_USERS "user_users"
|
||||||
|
|
|
@ -300,9 +300,7 @@ typedef struct SSchema {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t nCols;
|
int32_t nCols;
|
||||||
int32_t sver;
|
int32_t version;
|
||||||
int32_t tagVer;
|
|
||||||
int32_t colVer;
|
|
||||||
SSchema* pSchema;
|
SSchema* pSchema;
|
||||||
} SSchemaWrapper;
|
} SSchemaWrapper;
|
||||||
|
|
||||||
|
@ -310,9 +308,7 @@ static FORCE_INLINE SSchemaWrapper* tCloneSSchemaWrapper(const SSchemaWrapper* p
|
||||||
SSchemaWrapper* pSW = (SSchemaWrapper*)taosMemoryMalloc(sizeof(SSchemaWrapper));
|
SSchemaWrapper* pSW = (SSchemaWrapper*)taosMemoryMalloc(sizeof(SSchemaWrapper));
|
||||||
if (pSW == NULL) return pSW;
|
if (pSW == NULL) return pSW;
|
||||||
pSW->nCols = pSchemaWrapper->nCols;
|
pSW->nCols = pSchemaWrapper->nCols;
|
||||||
pSW->sver = pSchemaWrapper->sver;
|
pSW->version = pSchemaWrapper->version;
|
||||||
pSW->tagVer = pSchemaWrapper->tagVer;
|
|
||||||
pSW->colVer = pSchemaWrapper->colVer;
|
|
||||||
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
||||||
if (pSW->pSchema == NULL) {
|
if (pSW->pSchema == NULL) {
|
||||||
taosMemoryFree(pSW);
|
taosMemoryFree(pSW);
|
||||||
|
@ -367,9 +363,7 @@ static FORCE_INLINE int32_t tDecodeSSchema(SDecoder* pDecoder, SSchema* pSchema)
|
||||||
static FORCE_INLINE int32_t taosEncodeSSchemaWrapper(void** buf, const SSchemaWrapper* pSW) {
|
static FORCE_INLINE int32_t taosEncodeSSchemaWrapper(void** buf, const SSchemaWrapper* pSW) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeVariantI32(buf, pSW->nCols);
|
tlen += taosEncodeVariantI32(buf, pSW->nCols);
|
||||||
tlen += taosEncodeVariantI32(buf, pSW->sver);
|
tlen += taosEncodeVariantI32(buf, pSW->version);
|
||||||
tlen += taosEncodeVariantI32(buf, pSW->tagVer);
|
|
||||||
tlen += taosEncodeVariantI32(buf, pSW->colVer);
|
|
||||||
for (int32_t i = 0; i < pSW->nCols; i++) {
|
for (int32_t i = 0; i < pSW->nCols; i++) {
|
||||||
tlen += taosEncodeSSchema(buf, &pSW->pSchema[i]);
|
tlen += taosEncodeSSchema(buf, &pSW->pSchema[i]);
|
||||||
}
|
}
|
||||||
|
@ -378,9 +372,7 @@ static FORCE_INLINE int32_t taosEncodeSSchemaWrapper(void** buf, const SSchemaWr
|
||||||
|
|
||||||
static FORCE_INLINE void* taosDecodeSSchemaWrapper(const void* buf, SSchemaWrapper* pSW) {
|
static FORCE_INLINE void* taosDecodeSSchemaWrapper(const void* buf, SSchemaWrapper* pSW) {
|
||||||
buf = taosDecodeVariantI32(buf, &pSW->nCols);
|
buf = taosDecodeVariantI32(buf, &pSW->nCols);
|
||||||
buf = taosDecodeVariantI32(buf, &pSW->sver);
|
buf = taosDecodeVariantI32(buf, &pSW->version);
|
||||||
buf = taosDecodeVariantI32(buf, &pSW->tagVer);
|
|
||||||
buf = taosDecodeVariantI32(buf, &pSW->colVer);
|
|
||||||
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
||||||
if (pSW->pSchema == NULL) {
|
if (pSW->pSchema == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -394,9 +386,7 @@ static FORCE_INLINE void* taosDecodeSSchemaWrapper(const void* buf, SSchemaWrapp
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSSchemaWrapper(SEncoder* pEncoder, const SSchemaWrapper* pSW) {
|
static FORCE_INLINE int32_t tEncodeSSchemaWrapper(SEncoder* pEncoder, const SSchemaWrapper* pSW) {
|
||||||
if (tEncodeI32v(pEncoder, pSW->nCols) < 0) return -1;
|
if (tEncodeI32v(pEncoder, pSW->nCols) < 0) return -1;
|
||||||
if (tEncodeI32v(pEncoder, pSW->sver) < 0) return -1;
|
if (tEncodeI32v(pEncoder, pSW->version) < 0) return -1;
|
||||||
if (tEncodeI32v(pEncoder, pSW->tagVer) < 0) return -1;
|
|
||||||
if (tEncodeI32v(pEncoder, pSW->colVer) < 0) return -1;
|
|
||||||
for (int32_t i = 0; i < pSW->nCols; i++) {
|
for (int32_t i = 0; i < pSW->nCols; i++) {
|
||||||
if (tEncodeSSchema(pEncoder, &pSW->pSchema[i]) < 0) return -1;
|
if (tEncodeSSchema(pEncoder, &pSW->pSchema[i]) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
@ -406,9 +396,7 @@ static FORCE_INLINE int32_t tEncodeSSchemaWrapper(SEncoder* pEncoder, const SSch
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tDecodeSSchemaWrapper(SDecoder* pDecoder, SSchemaWrapper* pSW) {
|
static FORCE_INLINE int32_t tDecodeSSchemaWrapper(SDecoder* pDecoder, SSchemaWrapper* pSW) {
|
||||||
if (tDecodeI32v(pDecoder, &pSW->nCols) < 0) return -1;
|
if (tDecodeI32v(pDecoder, &pSW->nCols) < 0) return -1;
|
||||||
if (tDecodeI32v(pDecoder, &pSW->sver) < 0) return -1;
|
if (tDecodeI32v(pDecoder, &pSW->version) < 0) return -1;
|
||||||
if (tDecodeI32v(pDecoder, &pSW->tagVer) < 0) return -1;
|
|
||||||
if (tDecodeI32v(pDecoder, &pSW->colVer) < 0) return -1;
|
|
||||||
|
|
||||||
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
|
||||||
if (pSW->pSchema == NULL) return -1;
|
if (pSW->pSchema == NULL) return -1;
|
||||||
|
@ -421,9 +409,7 @@ static FORCE_INLINE int32_t tDecodeSSchemaWrapper(SDecoder* pDecoder, SSchemaWra
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tDecodeSSchemaWrapperEx(SDecoder* pDecoder, SSchemaWrapper* pSW) {
|
static FORCE_INLINE int32_t tDecodeSSchemaWrapperEx(SDecoder* pDecoder, SSchemaWrapper* pSW) {
|
||||||
if (tDecodeI32v(pDecoder, &pSW->nCols) < 0) return -1;
|
if (tDecodeI32v(pDecoder, &pSW->nCols) < 0) return -1;
|
||||||
if (tDecodeI32v(pDecoder, &pSW->sver) < 0) return -1;
|
if (tDecodeI32v(pDecoder, &pSW->version) < 0) return -1;
|
||||||
if (tDecodeI32v(pDecoder, &pSW->tagVer) < 0) return -1;
|
|
||||||
if (tDecodeI32v(pDecoder, &pSW->colVer) < 0) return -1;
|
|
||||||
|
|
||||||
pSW->pSchema = (SSchema*)tDecoderMalloc(pDecoder, pSW->nCols * sizeof(SSchema));
|
pSW->pSchema = (SSchema*)tDecoderMalloc(pDecoder, pSW->nCols * sizeof(SSchema));
|
||||||
if (pSW->pSchema == NULL) return -1;
|
if (pSW->pSchema == NULL) return -1;
|
||||||
|
@ -469,7 +455,8 @@ int32_t tDeserializeSMDropStbReq(void* buf, int32_t bufLen, SMDropStbReq* pReq);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[TSDB_TABLE_FNAME_LEN];
|
char name[TSDB_TABLE_FNAME_LEN];
|
||||||
int8_t alterType;
|
int8_t alterType;
|
||||||
int32_t verInBlock;
|
int32_t tagVer;
|
||||||
|
int32_t colVer;
|
||||||
int32_t numOfFields;
|
int32_t numOfFields;
|
||||||
SArray* pFields;
|
SArray* pFields;
|
||||||
int32_t ttl;
|
int32_t ttl;
|
||||||
|
@ -1023,6 +1010,10 @@ typedef struct {
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
|
|
||||||
|
// for tsma
|
||||||
|
int8_t isTsma;
|
||||||
|
|
||||||
} SCreateVnodeReq;
|
} SCreateVnodeReq;
|
||||||
|
|
||||||
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
||||||
|
@ -1713,7 +1704,7 @@ typedef struct SVCreateStbReq {
|
||||||
char* name;
|
char* name;
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
int8_t rollup;
|
int8_t rollup;
|
||||||
SSchemaWrapper schema;
|
SSchemaWrapper schemaRow;
|
||||||
SSchemaWrapper schemaTag;
|
SSchemaWrapper schemaTag;
|
||||||
SRSmaParam pRSmaParam;
|
SRSmaParam pRSmaParam;
|
||||||
} SVCreateStbReq;
|
} SVCreateStbReq;
|
||||||
|
@ -1745,7 +1736,7 @@ typedef struct SVCreateTbReq {
|
||||||
uint8_t* pTag;
|
uint8_t* pTag;
|
||||||
} ctb;
|
} ctb;
|
||||||
struct {
|
struct {
|
||||||
SSchemaWrapper schema;
|
SSchemaWrapper schemaRow;
|
||||||
} ntb;
|
} ntb;
|
||||||
};
|
};
|
||||||
} SVCreateTbReq;
|
} SVCreateTbReq;
|
||||||
|
|
|
@ -214,6 +214,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_PHYSICAL_PLAN_FILL,
|
QUERY_NODE_PHYSICAL_PLAN_FILL,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
|
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW,
|
QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION_WINDOW,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW,
|
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_PARTITION,
|
QUERY_NODE_PHYSICAL_PLAN_PARTITION,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
||||||
|
|
|
@ -48,11 +48,12 @@ typedef struct SParseContext {
|
||||||
} SParseContext;
|
} SParseContext;
|
||||||
|
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
||||||
bool isInsertSql(const char* pStr, size_t length);
|
bool qIsInsertSql(const char* pStr, size_t length);
|
||||||
|
|
||||||
void qDestroyQuery(SQuery* pQueryNode);
|
void qDestroyQuery(SQuery* pQueryNode);
|
||||||
|
|
||||||
int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema);
|
int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema);
|
||||||
|
int32_t qSetSTableIdForRSma(SNode* pStmt, int64_t uid);
|
||||||
|
|
||||||
int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash);
|
int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash);
|
||||||
int32_t qResetStmtDataBlock(void* block, bool keepBuf);
|
int32_t qResetStmtDataBlock(void* block, bool keepBuf);
|
||||||
|
|
|
@ -191,7 +191,7 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t
|
||||||
#define NEED_CLIENT_RM_TBLMETA_ERROR(_code) \
|
#define NEED_CLIENT_RM_TBLMETA_ERROR(_code) \
|
||||||
((_code) == TSDB_CODE_PAR_TABLE_NOT_EXIST || (_code) == TSDB_CODE_VND_TB_NOT_EXIST || \
|
((_code) == TSDB_CODE_PAR_TABLE_NOT_EXIST || (_code) == TSDB_CODE_VND_TB_NOT_EXIST || \
|
||||||
(_code) == TSDB_CODE_PAR_INVALID_COLUMNS_NUM || (_code) == TSDB_CODE_PAR_INVALID_COLUMN || \
|
(_code) == TSDB_CODE_PAR_INVALID_COLUMNS_NUM || (_code) == TSDB_CODE_PAR_INVALID_COLUMN || \
|
||||||
(_code) == TSDB_CODE_PAR_TAGS_NOT_MATCHED)
|
(_code) == TSDB_CODE_PAR_TAGS_NOT_MATCHED || (_code == TSDB_CODE_PAR_VALUE_TOO_LONG))
|
||||||
#define NEED_CLIENT_REFRESH_VG_ERROR(_code) \
|
#define NEED_CLIENT_REFRESH_VG_ERROR(_code) \
|
||||||
((_code) == TSDB_CODE_VND_HASH_MISMATCH || (_code) == TSDB_CODE_VND_INVALID_VGROUP_ID)
|
((_code) == TSDB_CODE_VND_HASH_MISMATCH || (_code) == TSDB_CODE_VND_INVALID_VGROUP_ID)
|
||||||
#define NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code) ((_code) == TSDB_CODE_TDB_TABLE_RECREATED)
|
#define NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code) ((_code) == TSDB_CODE_TDB_TABLE_RECREATED)
|
||||||
|
|
|
@ -23,6 +23,8 @@ extern "C" {
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
|
|
||||||
|
extern tsem_t schdRspSem;
|
||||||
|
|
||||||
typedef struct SSchedulerCfg {
|
typedef struct SSchedulerCfg {
|
||||||
uint32_t maxJobNum;
|
uint32_t maxJobNum;
|
||||||
int32_t maxNodeTableNum;
|
int32_t maxNodeTableNum;
|
||||||
|
@ -62,6 +64,11 @@ typedef struct STaskInfo {
|
||||||
SSubQueryMsg *msg;
|
SSubQueryMsg *msg;
|
||||||
} STaskInfo;
|
} STaskInfo;
|
||||||
|
|
||||||
|
typedef struct SSchdFetchParam {
|
||||||
|
void **pData;
|
||||||
|
int32_t* code;
|
||||||
|
} SSchdFetchParam;
|
||||||
|
|
||||||
typedef void (*schedulerExecCallback)(SQueryResult* pResult, void* param, int32_t code);
|
typedef void (*schedulerExecCallback)(SQueryResult* pResult, void* param, int32_t code);
|
||||||
typedef void (*schedulerFetchCallback)(void* pResult, void* param, int32_t code);
|
typedef void (*schedulerFetchCallback)(void* pResult, void* param, int32_t code);
|
||||||
|
|
||||||
|
@ -113,23 +120,8 @@ void schedulerFreeJob(int64_t job);
|
||||||
|
|
||||||
void schedulerDestroy(void);
|
void schedulerDestroy(void);
|
||||||
|
|
||||||
/**
|
void schdExecCallback(SQueryResult* pResult, void* param, int32_t code);
|
||||||
* convert dag to task list
|
void schdFetchCallback(void* pResult, void* param, int32_t code);
|
||||||
* @param pDag
|
|
||||||
* @param pTasks SArray**<STaskInfo>
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t schedulerConvertDagToTaskList(SQueryPlan* pDag, SArray **pTasks);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* make one task info's multiple copies
|
|
||||||
* @param src
|
|
||||||
* @param dst SArray**<STaskInfo>
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t schedulerCopyTask(STaskInfo *src, SArray **dst, int32_t copyNum);
|
|
||||||
|
|
||||||
void schedulerFreeTaskList(SArray *taskList);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -84,15 +84,16 @@ typedef struct {
|
||||||
} SStreamCheckpoint;
|
} SStreamCheckpoint;
|
||||||
|
|
||||||
static FORCE_INLINE SStreamDataSubmit* streamDataSubmitNew(SSubmitReq* pReq) {
|
static FORCE_INLINE SStreamDataSubmit* streamDataSubmitNew(SSubmitReq* pReq) {
|
||||||
SStreamDataSubmit* pDataSubmit = (SStreamDataSubmit*)taosMemoryCalloc(1, sizeof(SStreamDataSubmit));
|
SStreamDataSubmit* pDataSubmit = (SStreamDataSubmit*)taosAllocateQitem(sizeof(SStreamDataSubmit), DEF_QITEM);
|
||||||
if (pDataSubmit == NULL) return NULL;
|
if (pDataSubmit == NULL) return NULL;
|
||||||
pDataSubmit->data = pReq;
|
|
||||||
pDataSubmit->dataRef = (int32_t*)taosMemoryMalloc(sizeof(int32_t));
|
pDataSubmit->dataRef = (int32_t*)taosMemoryMalloc(sizeof(int32_t));
|
||||||
if (pDataSubmit->data == NULL) goto FAIL;
|
if (pDataSubmit->dataRef == NULL) goto FAIL;
|
||||||
|
pDataSubmit->data = pReq;
|
||||||
*pDataSubmit->dataRef = 1;
|
*pDataSubmit->dataRef = 1;
|
||||||
|
pDataSubmit->type = STREAM_INPUT__DATA_SUBMIT;
|
||||||
return pDataSubmit;
|
return pDataSubmit;
|
||||||
FAIL:
|
FAIL:
|
||||||
taosMemoryFree(pDataSubmit);
|
taosFreeQitem(pDataSubmit);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +108,6 @@ static FORCE_INLINE void streamDataSubmitRefDec(SStreamDataSubmit* pDataSubmit)
|
||||||
if (ref == 0) {
|
if (ref == 0) {
|
||||||
taosMemoryFree(pDataSubmit->data);
|
taosMemoryFree(pDataSubmit->data);
|
||||||
taosMemoryFree(pDataSubmit->dataRef);
|
taosMemoryFree(pDataSubmit->dataRef);
|
||||||
taosFreeQitem(pDataSubmit);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -641,6 +641,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_NOT_ALLOWED_WIN_QUERY TAOS_DEF_ERROR_CODE(0, 0x2650)
|
#define TSDB_CODE_PAR_NOT_ALLOWED_WIN_QUERY TAOS_DEF_ERROR_CODE(0, 0x2650)
|
||||||
#define TSDB_CODE_PAR_INVALID_DROP_COL TAOS_DEF_ERROR_CODE(0, 0x2651)
|
#define TSDB_CODE_PAR_INVALID_DROP_COL TAOS_DEF_ERROR_CODE(0, 0x2651)
|
||||||
#define TSDB_CODE_PAR_INVALID_COL_JSON TAOS_DEF_ERROR_CODE(0, 0x2652)
|
#define TSDB_CODE_PAR_INVALID_COL_JSON TAOS_DEF_ERROR_CODE(0, 0x2652)
|
||||||
|
#define TSDB_CODE_PAR_VALUE_TOO_LONG TAOS_DEF_ERROR_CODE(0, 0x2653)
|
||||||
|
|
||||||
//planner
|
//planner
|
||||||
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
|
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
|
||||||
|
|
|
@ -289,6 +289,52 @@ void setResPrecision(SReqResultInfo* pResInfo, int32_t precision) {
|
||||||
pResInfo->precision = precision;
|
pResInfo->precision = precision;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t scheduleAsyncQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList, void** pRes) {
|
||||||
|
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
|
||||||
|
tsem_init(&schdRspSem, 0, 0);
|
||||||
|
|
||||||
|
SQueryResult res = {.code = 0, .numOfRows = 0};
|
||||||
|
int32_t code = schedulerAsyncExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr,
|
||||||
|
pRequest->metric.start, schdExecCallback, &res);
|
||||||
|
while (true) {
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
if (pRequest->body.queryJob != 0) {
|
||||||
|
schedulerFreeJob(pRequest->body.queryJob);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pRes = res.res;
|
||||||
|
|
||||||
|
pRequest->code = code;
|
||||||
|
terrno = code;
|
||||||
|
return pRequest->code;
|
||||||
|
} else {
|
||||||
|
tsem_wait(&schdRspSem);
|
||||||
|
|
||||||
|
if (res.code) {
|
||||||
|
code = res.code;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TDMT_VND_SUBMIT == pRequest->type || TDMT_VND_CREATE_TABLE == pRequest->type) {
|
||||||
|
pRequest->body.resInfo.numOfRows = res.numOfRows;
|
||||||
|
|
||||||
|
if (pRequest->body.queryJob != 0) {
|
||||||
|
schedulerFreeJob(pRequest->body.queryJob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*pRes = res.res;
|
||||||
|
|
||||||
|
pRequest->code = res.code;
|
||||||
|
terrno = res.code;
|
||||||
|
return pRequest->code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList, void** pRes) {
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList, void** pRes) {
|
||||||
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
|
||||||
|
@ -796,7 +842,58 @@ void doSetOneRowPtr(SReqResultInfo* pResultInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* doAsyncFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) {
|
||||||
|
assert(pRequest != NULL);
|
||||||
|
|
||||||
|
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
||||||
|
if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
|
||||||
|
// All data has returned to App already, no need to try again
|
||||||
|
if (pResultInfo->completed) {
|
||||||
|
pResultInfo->numOfRows = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsem_init(&schdRspSem, 0, 0);
|
||||||
|
|
||||||
|
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
||||||
|
SSchdFetchParam param = {.pData = (void**)&pResInfo->pData, .code = &pRequest->code};
|
||||||
|
pRequest->code = schedulerAsyncFetchRows(pRequest->body.queryJob, schdFetchCallback, ¶m);
|
||||||
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
|
pResultInfo->numOfRows = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsem_wait(&schdRspSem);
|
||||||
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
|
pResultInfo->numOfRows = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRequest->code = setQueryResultFromRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pResInfo->pData, convertUcs4);
|
||||||
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
|
pResultInfo->numOfRows = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
|
||||||
|
pRequest->self, pResInfo->numOfRows, pResInfo->totalRows, pResInfo->completed, pRequest->requestId);
|
||||||
|
|
||||||
|
if (pResultInfo->numOfRows == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setupOneRowPtr) {
|
||||||
|
doSetOneRowPtr(pResultInfo);
|
||||||
|
pResultInfo->current += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pResultInfo->row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) {
|
void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) {
|
||||||
|
//return doAsyncFetchRows(pRequest, setupOneRowPtr, convertUcs4);
|
||||||
assert(pRequest != NULL);
|
assert(pRequest != NULL);
|
||||||
|
|
||||||
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
||||||
|
|
|
@ -48,7 +48,8 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
||||||
break;
|
break;
|
||||||
case STMT_EXECUTE:
|
case STMT_EXECUTE:
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
if (STMT_STATUS_NE(ADD_BATCH) && STMT_STATUS_NE(FETCH_FIELDS) && STMT_STATUS_NE(BIND) && STMT_STATUS_NE(BIND_COL)) {
|
if (STMT_STATUS_NE(ADD_BATCH) && STMT_STATUS_NE(FETCH_FIELDS) && STMT_STATUS_NE(BIND) &&
|
||||||
|
STMT_STATUS_NE(BIND_COL)) {
|
||||||
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -230,22 +231,6 @@ int32_t stmtParseSql(STscStmt* pStmt) {
|
||||||
pStmt->sql.type = STMT_TYPE_QUERY;
|
pStmt->sql.type = STMT_TYPE_QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
switch (nodeType(pStmt->sql.pQuery->pRoot)) {
|
|
||||||
case QUERY_NODE_VNODE_MODIF_STMT:
|
|
||||||
if (0 == pStmt->sql.type) {
|
|
||||||
pStmt->sql.type = STMT_TYPE_INSERT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case QUERY_NODE_SELECT_STMT:
|
|
||||||
pStmt->sql.type = STMT_TYPE_QUERY;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tscError("not supported stmt type %d", nodeType(pStmt->sql.pQuery->pRoot));
|
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_CLAUSE_ERROR);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -861,7 +846,7 @@ int stmtIsInsert(TAOS_STMT* stmt, int* insert) {
|
||||||
if (pStmt->sql.type) {
|
if (pStmt->sql.type) {
|
||||||
*insert = (STMT_TYPE_INSERT == pStmt->sql.type || STMT_TYPE_MULTI_INSERT == pStmt->sql.type);
|
*insert = (STMT_TYPE_INSERT == pStmt->sql.type || STMT_TYPE_MULTI_INSERT == pStmt->sql.type);
|
||||||
} else {
|
} else {
|
||||||
*insert = isInsertSql(pStmt->sql.sqlStr, 0);
|
*insert = qIsInsertSql(pStmt->sql.sqlStr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -123,7 +123,7 @@ static const SSysDbTableSchema userStbsSchema[] = {
|
||||||
{.name = "table_comment", .bytes = 1024 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "table_comment", .bytes = 1024 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema userStreamsSchema[] = {
|
static const SSysDbTableSchema streamSchema[] = {
|
||||||
{.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "user_name", .bytes = 23, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "user_name", .bytes = 23, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "dest_table", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "dest_table", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
|
@ -196,12 +196,14 @@ static const SSysDbTableSchema vgroupsSchema[] = {
|
||||||
{.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
{.name = "tsma", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema smaSchema[] = {
|
static const SSysDbTableSchema smaSchema[] = {
|
||||||
{.name = "sma_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "sma_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "stable_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "stable_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
|
{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema transSchema[] = {
|
static const SSysDbTableSchema transSchema[] = {
|
||||||
|
@ -232,7 +234,7 @@ static const SSysTableMeta infosMeta[] = {
|
||||||
{TSDB_INS_TABLE_USER_FUNCTIONS, userFuncSchema, tListLen(userFuncSchema)},
|
{TSDB_INS_TABLE_USER_FUNCTIONS, userFuncSchema, tListLen(userFuncSchema)},
|
||||||
{TSDB_INS_TABLE_USER_INDEXES, userIdxSchema, tListLen(userIdxSchema)},
|
{TSDB_INS_TABLE_USER_INDEXES, userIdxSchema, tListLen(userIdxSchema)},
|
||||||
{TSDB_INS_TABLE_USER_STABLES, userStbsSchema, tListLen(userStbsSchema)},
|
{TSDB_INS_TABLE_USER_STABLES, userStbsSchema, tListLen(userStbsSchema)},
|
||||||
{TSDB_INS_TABLE_USER_STREAMS, userStreamsSchema, tListLen(userStreamsSchema)},
|
{TSDB_PERFS_TABLE_STREAMS, streamSchema, tListLen(streamSchema)},
|
||||||
{TSDB_INS_TABLE_USER_TABLES, userTblsSchema, tListLen(userTblsSchema)},
|
{TSDB_INS_TABLE_USER_TABLES, userTblsSchema, tListLen(userTblsSchema)},
|
||||||
{TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED, userTblDistSchema, tListLen(userTblDistSchema)},
|
{TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED, userTblDistSchema, tListLen(userTblDistSchema)},
|
||||||
{TSDB_INS_TABLE_USER_USERS, userUsersSchema, tListLen(userUsersSchema)},
|
{TSDB_INS_TABLE_USER_USERS, userUsersSchema, tListLen(userUsersSchema)},
|
||||||
|
@ -305,17 +307,7 @@ static const SSysDbTableSchema querySchema[] = {
|
||||||
{.name = "sql", .bytes = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "sql", .bytes = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema streamSchema[] = {
|
|
||||||
{.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
|
||||||
{.name = "sql", .bytes = TSDB_SHOW_SQL_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "status", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY},
|
|
||||||
{.name = "source_db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "target_db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "target_table", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "watermark", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT},
|
|
||||||
{.name = "trigger", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const SSysTableMeta perfsMeta[] = {
|
static const SSysTableMeta perfsMeta[] = {
|
||||||
{TSDB_PERFS_TABLE_CONNECTIONS, connectionsSchema, tListLen(connectionsSchema)},
|
{TSDB_PERFS_TABLE_CONNECTIONS, connectionsSchema, tListLen(connectionsSchema)},
|
||||||
|
|
|
@ -1246,7 +1246,7 @@ size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t newRows = (payloadSize - additional) / rowSize;
|
int32_t newRows = (payloadSize - additional) / rowSize;
|
||||||
ASSERT(newRows <= nRows && newRows > 1);
|
ASSERT(newRows <= nRows && newRows >= 1);
|
||||||
|
|
||||||
return newRows;
|
return newRows;
|
||||||
}
|
}
|
||||||
|
|
|
@ -600,7 +600,8 @@ int32_t tSerializeSMAlterStbReq(void *buf, int32_t bufLen, SMAlterStbReq *pReq)
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->alterType) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->alterType) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->verInBlock) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->tagVer) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->colVer) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfFields) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfFields) < 0) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfFields; ++i) {
|
for (int32_t i = 0; i < pReq->numOfFields; ++i) {
|
||||||
SField *pField = taosArrayGet(pReq->pFields, i);
|
SField *pField = taosArrayGet(pReq->pFields, i);
|
||||||
|
@ -627,7 +628,8 @@ int32_t tDeserializeSMAlterStbReq(void *buf, int32_t bufLen, SMAlterStbReq *pReq
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->name) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->name) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->alterType) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->alterType) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->verInBlock) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->tagVer) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->colVer) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfFields) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfFields) < 0) return -1;
|
||||||
pReq->pFields = taosArrayInit(pReq->numOfFields, sizeof(SField));
|
pReq->pFields = taosArrayInit(pReq->numOfFields, sizeof(SField));
|
||||||
if (pReq->pFields == NULL) {
|
if (pReq->pFields == NULL) {
|
||||||
|
@ -2915,6 +2917,8 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
if (tEncodeI8(&encoder, pRetension->freqUnit) < 0) return -1;
|
if (tEncodeI8(&encoder, pRetension->freqUnit) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRetension->keepUnit) < 0) return -1;
|
if (tEncodeI8(&encoder, pRetension->keepUnit) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tEncodeI8(&encoder, pReq->isTsma) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -2977,6 +2981,8 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tDecodeI8(&decoder, &pReq->isTsma) < 0) return -1;
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3801,7 +3807,7 @@ int tEncodeSVCreateStbReq(SEncoder *pCoder, const SVCreateStbReq *pReq) {
|
||||||
if (tEncodeCStr(pCoder, pReq->name) < 0) return -1;
|
if (tEncodeCStr(pCoder, pReq->name) < 0) return -1;
|
||||||
if (tEncodeI64(pCoder, pReq->suid) < 0) return -1;
|
if (tEncodeI64(pCoder, pReq->suid) < 0) return -1;
|
||||||
if (tEncodeI8(pCoder, pReq->rollup) < 0) return -1;
|
if (tEncodeI8(pCoder, pReq->rollup) < 0) return -1;
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pReq->schema) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pReq->schemaRow) < 0) return -1;
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pReq->schemaTag) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pReq->schemaTag) < 0) return -1;
|
||||||
if (pReq->rollup) {
|
if (pReq->rollup) {
|
||||||
if (tEncodeSRSmaParam(pCoder, &pReq->pRSmaParam) < 0) return -1;
|
if (tEncodeSRSmaParam(pCoder, &pReq->pRSmaParam) < 0) return -1;
|
||||||
|
@ -3817,7 +3823,7 @@ int tDecodeSVCreateStbReq(SDecoder *pCoder, SVCreateStbReq *pReq) {
|
||||||
if (tDecodeCStr(pCoder, &pReq->name) < 0) return -1;
|
if (tDecodeCStr(pCoder, &pReq->name) < 0) return -1;
|
||||||
if (tDecodeI64(pCoder, &pReq->suid) < 0) return -1;
|
if (tDecodeI64(pCoder, &pReq->suid) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pReq->rollup) < 0) return -1;
|
if (tDecodeI8(pCoder, &pReq->rollup) < 0) return -1;
|
||||||
if (tDecodeSSchemaWrapper(pCoder, &pReq->schema) < 0) return -1;
|
if (tDecodeSSchemaWrapper(pCoder, &pReq->schemaRow) < 0) return -1;
|
||||||
if (tDecodeSSchemaWrapper(pCoder, &pReq->schemaTag) < 0) return -1;
|
if (tDecodeSSchemaWrapper(pCoder, &pReq->schemaTag) < 0) return -1;
|
||||||
if (pReq->rollup) {
|
if (pReq->rollup) {
|
||||||
if (tDecodeSRSmaParam(pCoder, &pReq->pRSmaParam) < 0) return -1;
|
if (tDecodeSRSmaParam(pCoder, &pReq->pRSmaParam) < 0) return -1;
|
||||||
|
@ -3866,7 +3872,7 @@ int tEncodeSVCreateTbReq(SEncoder *pCoder, const SVCreateTbReq *pReq) {
|
||||||
if (tEncodeI64(pCoder, pReq->ctb.suid) < 0) return -1;
|
if (tEncodeI64(pCoder, pReq->ctb.suid) < 0) return -1;
|
||||||
if (tEncodeBinary(pCoder, pReq->ctb.pTag, kvRowLen(pReq->ctb.pTag)) < 0) return -1;
|
if (tEncodeBinary(pCoder, pReq->ctb.pTag, kvRowLen(pReq->ctb.pTag)) < 0) return -1;
|
||||||
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pReq->ntb.schema) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
@ -3892,7 +3898,7 @@ int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) {
|
||||||
if (tDecodeI64(pCoder, &pReq->ctb.suid) < 0) return -1;
|
if (tDecodeI64(pCoder, &pReq->ctb.suid) < 0) return -1;
|
||||||
if (tDecodeBinary(pCoder, &pReq->ctb.pTag, &len) < 0) return -1;
|
if (tDecodeBinary(pCoder, &pReq->ctb.pTag, &len) < 0) return -1;
|
||||||
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tDecodeSSchemaWrapper(pCoder, &pReq->ntb.schema) < 0) return -1;
|
if (tDecodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,6 +184,16 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) {
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
|
int32_t j = i;
|
||||||
|
while (str[j]) {
|
||||||
|
if ((str[j] >= '0' && str[j] <= '9') || str[j] == ':') {
|
||||||
|
++j;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
char* sep = strchr(&str[i], ':');
|
char* sep = strchr(&str[i], ':');
|
||||||
if (sep != NULL) {
|
if (sep != NULL) {
|
||||||
int32_t len = (int32_t)(sep - &str[i]);
|
int32_t len = (int32_t)(sep - &str[i]);
|
||||||
|
|
|
@ -183,7 +183,7 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("vgId:%d, create vnode req is received", createReq.vgId);
|
dDebug("vgId:%d, create vnode req is received, tsma:%d", createReq.vgId, createReq.isTsma);
|
||||||
|
|
||||||
SVnodeCfg vnodeCfg = {0};
|
SVnodeCfg vnodeCfg = {0};
|
||||||
vmGenerateVnodeCfg(&createReq, &vnodeCfg);
|
vmGenerateVnodeCfg(&createReq, &vnodeCfg);
|
||||||
|
|
|
@ -330,6 +330,7 @@ typedef struct {
|
||||||
int64_t compStorage;
|
int64_t compStorage;
|
||||||
int64_t pointsWritten;
|
int64_t pointsWritten;
|
||||||
int8_t compact;
|
int8_t compact;
|
||||||
|
int8_t isTsma;
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
SVnodeGid vnodeGid[TSDB_MAX_REPLICA];
|
SVnodeGid vnodeGid[TSDB_MAX_REPLICA];
|
||||||
} SVgObj;
|
} SVgObj;
|
||||||
|
@ -366,7 +367,6 @@ typedef struct {
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
int64_t uid;
|
int64_t uid;
|
||||||
int64_t dbUid;
|
int64_t dbUid;
|
||||||
int32_t version;
|
|
||||||
int32_t tagVer;
|
int32_t tagVer;
|
||||||
int32_t colVer;
|
int32_t colVer;
|
||||||
int32_t nextColId;
|
int32_t nextColId;
|
||||||
|
@ -589,6 +589,7 @@ typedef struct {
|
||||||
int8_t status;
|
int8_t status;
|
||||||
int8_t createdBy; // STREAM_CREATED_BY__USER or SMA
|
int8_t createdBy; // STREAM_CREATED_BY__USER or SMA
|
||||||
int32_t fixedSinkVgId; // 0 for shuffle
|
int32_t fixedSinkVgId; // 0 for shuffle
|
||||||
|
SVgObj fixedSinkVg;
|
||||||
int64_t smaId; // 0 for unused
|
int64_t smaId; // 0 for unused
|
||||||
int8_t trigger;
|
int8_t trigger;
|
||||||
int32_t triggerParam;
|
int32_t triggerParam;
|
||||||
|
|
|
@ -29,7 +29,8 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib
|
||||||
|
|
||||||
int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream);
|
int32_t mndScheduleStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStream);
|
||||||
|
|
||||||
int32_t mndConvertRSmaTask(const char* ast, int8_t triggerType, int64_t watermark, char** pStr, int32_t* pLen);
|
int32_t mndConvertRSmaTask(const char* ast, int64_t uid, int8_t triggerType, int64_t watermark, char** pStr,
|
||||||
|
int32_t* pLen);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ SSdbRaw *mndVgroupActionEncode(SVgObj *pVgroup);
|
||||||
SEpSet mndGetVgroupEpset(SMnode *pMnode, const SVgObj *pVgroup);
|
SEpSet mndGetVgroupEpset(SMnode *pMnode, const SVgObj *pVgroup);
|
||||||
int32_t mndGetVnodesNum(SMnode *pMnode, int32_t dnodeId);
|
int32_t mndGetVnodesNum(SMnode *pMnode, int32_t dnodeId);
|
||||||
|
|
||||||
|
int32_t mndAllocSmaVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup);
|
||||||
int32_t mndAllocVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj **ppVgroups);
|
int32_t mndAllocVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj **ppVgroups);
|
||||||
SArray *mndBuildDnodesArray(SMnode *pMnode);
|
SArray *mndBuildDnodesArray(SMnode *pMnode);
|
||||||
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray);
|
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray);
|
||||||
|
|
|
@ -1155,7 +1155,7 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
if (NULL == pDb || pVgroup->dbUid == pDb->uid) {
|
if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
vgInfo.vgId = pVgroup->vgId;
|
vgInfo.vgId = pVgroup->vgId;
|
||||||
vgInfo.hashBegin = pVgroup->hashBegin;
|
vgInfo.hashBegin = pVgroup->hashBegin;
|
||||||
|
|
|
@ -28,13 +28,15 @@
|
||||||
#include "mndTrans.h"
|
#include "mndTrans.h"
|
||||||
#include "mndUser.h"
|
#include "mndUser.h"
|
||||||
#include "mndVgroup.h"
|
#include "mndVgroup.h"
|
||||||
|
#include "parser.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "tuuid.h"
|
#include "tuuid.h"
|
||||||
|
|
||||||
extern bool tsStreamSchedV;
|
extern bool tsStreamSchedV;
|
||||||
|
|
||||||
int32_t mndConvertRSmaTask(const char* ast, int8_t triggerType, int64_t watermark, char** pStr, int32_t* pLen) {
|
int32_t mndConvertRSmaTask(const char* ast, int64_t uid, int8_t triggerType, int64_t watermark, char** pStr,
|
||||||
|
int32_t* pLen) {
|
||||||
SNode* pAst = NULL;
|
SNode* pAst = NULL;
|
||||||
SQueryPlan* pPlan = NULL;
|
SQueryPlan* pPlan = NULL;
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
|
@ -44,6 +46,11 @@ int32_t mndConvertRSmaTask(const char* ast, int8_t triggerType, int64_t watermar
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (qSetSTableIdForRSma(pAst, uid) < 0) {
|
||||||
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
|
goto END;
|
||||||
|
}
|
||||||
|
|
||||||
SPlanContext cxt = {
|
SPlanContext cxt = {
|
||||||
.pAstRoot = pAst,
|
.pAstRoot = pAst,
|
||||||
.topicQuery = false,
|
.topicQuery = false,
|
||||||
|
@ -230,11 +237,14 @@ int32_t mndAddFixedSinkToStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStr
|
||||||
taosArrayPush(tasks, &pTask);
|
taosArrayPush(tasks, &pTask);
|
||||||
|
|
||||||
pTask->nodeId = pStream->fixedSinkVgId;
|
pTask->nodeId = pStream->fixedSinkVgId;
|
||||||
|
#if 0
|
||||||
SVgObj* pVgroup = mndAcquireVgroup(pMnode, pStream->fixedSinkVgId);
|
SVgObj* pVgroup = mndAcquireVgroup(pMnode, pStream->fixedSinkVgId);
|
||||||
if (pVgroup == NULL) {
|
if (pVgroup == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
|
#endif
|
||||||
|
pTask->epSet = mndGetVgroupEpset(pMnode, &pStream->fixedSinkVg);
|
||||||
// source
|
// source
|
||||||
pTask->sourceType = TASK_SOURCE__MERGE;
|
pTask->sourceType = TASK_SOURCE__MERGE;
|
||||||
pTask->inputType = TASK_INPUT_TYPE__DATA_BLOCK;
|
pTask->inputType = TASK_INPUT_TYPE__DATA_BLOCK;
|
||||||
|
@ -256,7 +266,8 @@ int32_t mndAddFixedSinkToStream(SMnode* pMnode, STrans* pTrans, SStreamObj* pStr
|
||||||
// dispatch
|
// dispatch
|
||||||
pTask->dispatchType = TASK_DISPATCH__NONE;
|
pTask->dispatchType = TASK_DISPATCH__NONE;
|
||||||
|
|
||||||
mndPersistTaskDeployReq(pTrans, pTask, &pTask->epSet, TDMT_VND_TASK_DEPLOY, pVgroup->vgId);
|
/*mndPersistTaskDeployReq(pTrans, pTask, &pTask->epSet, TDMT_VND_TASK_DEPLOY, pVgroup->vgId);*/
|
||||||
|
mndPersistTaskDeployReq(pTrans, pTask, &pTask->epSet, TDMT_VND_TASK_DEPLOY, pStream->fixedSinkVg.vgId);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,6 +257,7 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) {
|
||||||
terrno = rowsRead;
|
terrno = rowsRead;
|
||||||
mDebug("show:0x%" PRIx64 ", retrieve completed", pShow->id);
|
mDebug("show:0x%" PRIx64 ", retrieve completed", pShow->id);
|
||||||
mndReleaseShowObj(pShow, true);
|
mndReleaseShowObj(pShow, true);
|
||||||
|
blockDataDestroy(pBlock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -354,6 +354,22 @@ static int32_t mndSetCreateSmaCommitLogs(SMnode *pMnode, STrans *pTrans, SSmaObj
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetCreateSmaVgroupRedoLogs(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup) {
|
||||||
|
SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
|
||||||
|
if (pVgRaw == NULL) return -1;
|
||||||
|
if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
|
||||||
|
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetCreateSmaVgroupCommitLogs(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup) {
|
||||||
|
SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
|
||||||
|
if (pVgRaw == NULL) return -1;
|
||||||
|
if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
|
||||||
|
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SSmaObj *pSma) {
|
static int32_t mndSetCreateSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SSmaObj *pSma) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
|
@ -393,6 +409,34 @@ static int32_t mndSetCreateSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
|
||||||
|
SVnodeGid *pVgid = pVgroup->vnodeGid + 0;
|
||||||
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
||||||
|
if (pDnode == NULL) return -1;
|
||||||
|
|
||||||
|
STransAction action = {0};
|
||||||
|
action.epSet = mndGetDnodeEpset(pDnode);
|
||||||
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
|
||||||
|
// todo add sma info here
|
||||||
|
|
||||||
|
int32_t contLen = 0;
|
||||||
|
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
|
||||||
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
|
action.pCont = pReq;
|
||||||
|
action.contLen = contLen;
|
||||||
|
action.msgType = TDMT_DND_CREATE_VNODE;
|
||||||
|
action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
|
||||||
|
|
||||||
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
taosMemoryFree(pReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCreate, SDbObj *pDb, SStbObj *pStb) {
|
static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCreate, SDbObj *pDb, SStbObj *pStb) {
|
||||||
SSmaObj smaObj = {0};
|
SSmaObj smaObj = {0};
|
||||||
memcpy(smaObj.name, pCreate->name, TSDB_TABLE_FNAME_LEN);
|
memcpy(smaObj.name, pCreate->name, TSDB_TABLE_FNAME_LEN);
|
||||||
|
@ -448,9 +492,14 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
streamObj.version = 1;
|
streamObj.version = 1;
|
||||||
streamObj.sql = pCreate->sql;
|
streamObj.sql = pCreate->sql;
|
||||||
streamObj.createdBy = STREAM_CREATED_BY__SMA;
|
streamObj.createdBy = STREAM_CREATED_BY__SMA;
|
||||||
streamObj.fixedSinkVgId = smaObj.dstVgId;
|
|
||||||
streamObj.smaId = smaObj.uid;
|
streamObj.smaId = smaObj.uid;
|
||||||
/*streamObj.physicalPlan = "";*/
|
|
||||||
|
if (mndAllocSmaVgroup(pMnode, pDb, &streamObj.fixedSinkVg) != 0) {
|
||||||
|
mError("sma:%s, failed to create since %s", smaObj.name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
smaObj.dstVgId = streamObj.fixedSinkVg.vgId;
|
||||||
|
streamObj.fixedSinkVgId = smaObj.dstVgId;
|
||||||
|
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_SMA, pReq);
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_SMA, pReq);
|
||||||
|
@ -460,8 +509,11 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbInfo(pTrans, pDb);
|
||||||
|
|
||||||
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
||||||
|
if (mndSetCreateSmaVgroupRedoLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaCommitLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaCommitLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
||||||
|
if (mndSetCreateSmaVgroupCommitLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaRedoActions(pMnode, pTrans, pDb, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaRedoActions(pMnode, pTrans, pDb, &smaObj) != 0) goto _OVER;
|
||||||
|
if (mndSetCreateSmaVgroupRedoActions(pMnode, pTrans, pDb, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
||||||
if (mndAddStreamToTrans(pMnode, &streamObj, pCreate->ast, STREAM_TRIGGER_AT_ONCE, 0, pTrans) != 0) goto _OVER;
|
if (mndAddStreamToTrans(pMnode, &streamObj, pCreate->ast, STREAM_TRIGGER_AT_ONCE, 0, pTrans) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
|
||||||
|
@ -480,7 +532,6 @@ static int32_t mndCheckCreateSmaReq(SMCreateSmaReq *pCreate) {
|
||||||
if (pCreate->intervalUnit < 0) return -1;
|
if (pCreate->intervalUnit < 0) return -1;
|
||||||
if (pCreate->slidingUnit < 0) return -1;
|
if (pCreate->slidingUnit < 0) return -1;
|
||||||
if (pCreate->timezone < 0) return -1;
|
if (pCreate->timezone < 0) return -1;
|
||||||
if (pCreate->dstVgId < 0) return -1;
|
|
||||||
if (pCreate->interval < 0) return -1;
|
if (pCreate->interval < 0) return -1;
|
||||||
if (pCreate->offset < 0) return -1;
|
if (pCreate->offset < 0) return -1;
|
||||||
if (pCreate->sliding < 0) return -1;
|
if (pCreate->sliding < 0) return -1;
|
||||||
|
@ -602,6 +653,24 @@ static int32_t mndSetDropSmaCommitLogs(SMnode *pMnode, STrans *pTrans, SSmaObj *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetDropSmaVgroupRedoLogs(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup) {
|
||||||
|
SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
|
||||||
|
if (pVgRaw == NULL) return -1;
|
||||||
|
if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
|
||||||
|
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPING) != 0) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetDropSmaVgroupCommitLogs(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup) {
|
||||||
|
SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
|
||||||
|
if (pVgRaw == NULL) return -1;
|
||||||
|
if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
|
||||||
|
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndSetDropSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SSmaObj *pSma) {
|
static int32_t mndSetDropSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SSmaObj *pSma) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
|
@ -643,23 +712,59 @@ static int32_t mndSetDropSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndSetDropSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
|
||||||
|
SVnodeGid *pVgid = pVgroup->vnodeGid + 0;
|
||||||
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
||||||
|
if (pDnode == NULL) return -1;
|
||||||
|
|
||||||
|
STransAction action = {0};
|
||||||
|
action.epSet = mndGetDnodeEpset(pDnode);
|
||||||
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
|
||||||
|
int32_t contLen = 0;
|
||||||
|
void *pReq = mndBuildDropVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
|
||||||
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
|
action.pCont = pReq;
|
||||||
|
action.contLen = contLen;
|
||||||
|
action.msgType = TDMT_DND_DROP_VNODE;
|
||||||
|
action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
|
||||||
|
|
||||||
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
taosMemoryFree(pReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *pSma) {
|
static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *pSma) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_DROP_SMA, pReq);
|
SVgObj *pVgroup = NULL;
|
||||||
|
STrans *pTrans = NULL;
|
||||||
|
|
||||||
|
pVgroup = mndAcquireVgroup(pMnode, pSma->dstVgId);
|
||||||
|
if (pVgroup == NULL) goto _OVER;
|
||||||
|
|
||||||
|
pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_DROP_SMA, pReq);
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to drop sma:%s", pTrans->id, pSma->name);
|
mDebug("trans:%d, used to drop sma:%s", pTrans->id, pSma->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbInfo(pTrans, pDb);
|
||||||
|
|
||||||
if (mndSetDropSmaRedoLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
if (mndSetDropSmaRedoLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
||||||
|
if (mndSetDropSmaVgroupRedoLogs(pMnode, pTrans, pVgroup) != 0) goto _OVER;
|
||||||
if (mndSetDropSmaCommitLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
if (mndSetDropSmaCommitLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
||||||
|
if (mndSetDropSmaVgroupCommitLogs(pMnode, pTrans, pVgroup) != 0) goto _OVER;
|
||||||
if (mndSetDropSmaRedoActions(pMnode, pTrans, pDb, pSma) != 0) goto _OVER;
|
if (mndSetDropSmaRedoActions(pMnode, pTrans, pDb, pSma) != 0) goto _OVER;
|
||||||
|
if (mndSetDropSmaVgroupRedoActions(pMnode, pTrans, pDb, pVgroup) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
|
mndReleaseVgroup(pMnode, pVgroup);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,6 +951,9 @@ static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)n1, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)n1, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, numOfRows, (const char *)&pSma->dstVgId, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
sdbRelease(pSdb, pSma);
|
sdbRelease(pSdb, pSma);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,6 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
|
||||||
SDB_SET_INT64(pRaw, dataPos, pStb->updateTime, _OVER)
|
SDB_SET_INT64(pRaw, dataPos, pStb->updateTime, _OVER)
|
||||||
SDB_SET_INT64(pRaw, dataPos, pStb->uid, _OVER)
|
SDB_SET_INT64(pRaw, dataPos, pStb->uid, _OVER)
|
||||||
SDB_SET_INT64(pRaw, dataPos, pStb->dbUid, _OVER)
|
SDB_SET_INT64(pRaw, dataPos, pStb->dbUid, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->version, _OVER)
|
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->tagVer, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pStb->tagVer, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->colVer, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pStb->colVer, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->nextColId, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pStb->nextColId, _OVER)
|
||||||
|
@ -167,7 +166,6 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pStb->updateTime, _OVER)
|
SDB_GET_INT64(pRaw, dataPos, &pStb->updateTime, _OVER)
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pStb->uid, _OVER)
|
SDB_GET_INT64(pRaw, dataPos, &pStb->uid, _OVER)
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pStb->dbUid, _OVER)
|
SDB_GET_INT64(pRaw, dataPos, &pStb->dbUid, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->version, _OVER)
|
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->tagVer, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pStb->tagVer, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->colVer, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pStb->colVer, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->nextColId, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pStb->nextColId, _OVER)
|
||||||
|
@ -320,7 +318,6 @@ static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOld, SStbObj *pNew) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pOld->updateTime = pNew->updateTime;
|
pOld->updateTime = pNew->updateTime;
|
||||||
pOld->version = pNew->version;
|
|
||||||
pOld->tagVer = pNew->tagVer;
|
pOld->tagVer = pNew->tagVer;
|
||||||
pOld->colVer = pNew->colVer;
|
pOld->colVer = pNew->colVer;
|
||||||
pOld->nextColId = pNew->nextColId;
|
pOld->nextColId = pNew->nextColId;
|
||||||
|
@ -388,25 +385,26 @@ static void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pSt
|
||||||
req.name = (char *)tNameGetTableName(&name);
|
req.name = (char *)tNameGetTableName(&name);
|
||||||
req.suid = pStb->uid;
|
req.suid = pStb->uid;
|
||||||
req.rollup = pStb->ast1Len > 0 ? 1 : 0;
|
req.rollup = pStb->ast1Len > 0 ? 1 : 0;
|
||||||
req.schema.nCols = pStb->numOfColumns;
|
// todo
|
||||||
req.schema.sver = pStb->version;
|
req.schemaRow.nCols = pStb->numOfColumns;
|
||||||
req.schema.tagVer = pStb->tagVer;
|
req.schemaRow.version = pStb->colVer;
|
||||||
req.schema.colVer = pStb->colVer;
|
req.schemaRow.pSchema = pStb->pColumns;
|
||||||
req.schema.pSchema = pStb->pColumns;
|
|
||||||
req.schemaTag.nCols = pStb->numOfTags;
|
req.schemaTag.nCols = pStb->numOfTags;
|
||||||
req.schemaTag.sver = 1;
|
req.schemaTag.version = pStb->tagVer;
|
||||||
req.schemaTag.pSchema = pStb->pTags;
|
req.schemaTag.pSchema = pStb->pTags;
|
||||||
|
|
||||||
if (req.rollup) {
|
if (req.rollup) {
|
||||||
req.pRSmaParam.xFilesFactor = pStb->xFilesFactor;
|
req.pRSmaParam.xFilesFactor = pStb->xFilesFactor;
|
||||||
req.pRSmaParam.delay = pStb->delay;
|
req.pRSmaParam.delay = pStb->delay;
|
||||||
if (pStb->ast1Len > 0) {
|
if (pStb->ast1Len > 0) {
|
||||||
if (mndConvertRSmaTask(pStb->pAst1, 0, 0, &req.pRSmaParam.qmsg1, &req.pRSmaParam.qmsg1Len) != TSDB_CODE_SUCCESS) {
|
if (mndConvertRSmaTask(pStb->pAst1, pStb->uid, 0, 0, &req.pRSmaParam.qmsg1, &req.pRSmaParam.qmsg1Len) !=
|
||||||
|
TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pStb->ast2Len > 0) {
|
if (pStb->ast2Len > 0) {
|
||||||
if (mndConvertRSmaTask(pStb->pAst2, 0, 0, &req.pRSmaParam.qmsg2, &req.pRSmaParam.qmsg2Len) != TSDB_CODE_SUCCESS) {
|
if (mndConvertRSmaTask(pStb->pAst2, pStb->uid, 0, 0, &req.pRSmaParam.qmsg2, &req.pRSmaParam.qmsg2Len) !=
|
||||||
|
TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -664,7 +662,6 @@ int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreat
|
||||||
pDst->updateTime = pDst->createdTime;
|
pDst->updateTime = pDst->createdTime;
|
||||||
pDst->uid = mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
|
pDst->uid = mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
|
||||||
pDst->dbUid = pDb->uid;
|
pDst->dbUid = pDb->uid;
|
||||||
pDst->version = 1;
|
|
||||||
pDst->tagVer = 1;
|
pDst->tagVer = 1;
|
||||||
pDst->colVer = 1;
|
pDst->colVer = 1;
|
||||||
pDst->nextColId = 1;
|
pDst->nextColId = 1;
|
||||||
|
@ -956,7 +953,6 @@ static int32_t mndAddSuperTableTag(const SStbObj *pOld, SStbObj *pNew, SArray *p
|
||||||
mDebug("stb:%s, start to add tag %s", pNew->name, pSchema->name);
|
mDebug("stb:%s, start to add tag %s", pNew->name, pSchema->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
pNew->version++;
|
|
||||||
pNew->tagVer++;
|
pNew->tagVer++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -975,7 +971,6 @@ static int32_t mndDropSuperTableTag(const SStbObj *pOld, SStbObj *pNew, const ch
|
||||||
memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
|
memmove(pNew->pTags + tag, pNew->pTags + tag + 1, sizeof(SSchema) * (pNew->numOfTags - tag - 1));
|
||||||
pNew->numOfTags--;
|
pNew->numOfTags--;
|
||||||
|
|
||||||
pNew->version++;
|
|
||||||
pNew->tagVer++;
|
pNew->tagVer++;
|
||||||
mDebug("stb:%s, start to drop tag %s", pNew->name, tagName);
|
mDebug("stb:%s, start to drop tag %s", pNew->name, tagName);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1016,7 +1011,6 @@ static int32_t mndAlterStbTagName(const SStbObj *pOld, SStbObj *pNew, SArray *pF
|
||||||
SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
|
SSchema *pSchema = (SSchema *)(pNew->pTags + tag);
|
||||||
memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
|
memcpy(pSchema->name, newTagName, TSDB_COL_NAME_LEN);
|
||||||
|
|
||||||
pNew->version++;
|
|
||||||
pNew->tagVer++;
|
pNew->tagVer++;
|
||||||
mDebug("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
|
mDebug("stb:%s, start to modify tag %s to %s", pNew->name, oldTagName, newTagName);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1046,7 +1040,6 @@ static int32_t mndAlterStbTagBytes(const SStbObj *pOld, SStbObj *pNew, const SFi
|
||||||
}
|
}
|
||||||
|
|
||||||
pTag->bytes = pField->bytes;
|
pTag->bytes = pField->bytes;
|
||||||
pNew->version++;
|
|
||||||
pNew->tagVer++;
|
pNew->tagVer++;
|
||||||
|
|
||||||
mDebug("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
|
mDebug("stb:%s, start to modify tag len %s to %d", pNew->name, pField->name, pField->bytes);
|
||||||
|
@ -1086,7 +1079,6 @@ static int32_t mndAddSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, SArray
|
||||||
mDebug("stb:%s, start to add column %s", pNew->name, pSchema->name);
|
mDebug("stb:%s, start to add column %s", pNew->name, pSchema->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
pNew->version++;
|
|
||||||
pNew->colVer++;
|
pNew->colVer++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1115,7 +1107,6 @@ static int32_t mndDropSuperTableColumn(const SStbObj *pOld, SStbObj *pNew, const
|
||||||
memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * (pNew->numOfColumns - col - 1));
|
memmove(pNew->pColumns + col, pNew->pColumns + col + 1, sizeof(SSchema) * (pNew->numOfColumns - col - 1));
|
||||||
pNew->numOfColumns--;
|
pNew->numOfColumns--;
|
||||||
|
|
||||||
pNew->version++;
|
|
||||||
pNew->colVer++;
|
pNew->colVer++;
|
||||||
mDebug("stb:%s, start to drop col %s", pNew->name, colName);
|
mDebug("stb:%s, start to drop col %s", pNew->name, colName);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1154,7 +1145,6 @@ static int32_t mndAlterStbColumnBytes(const SStbObj *pOld, SStbObj *pNew, const
|
||||||
}
|
}
|
||||||
|
|
||||||
pCol->bytes = pField->bytes;
|
pCol->bytes = pField->bytes;
|
||||||
pNew->version++;
|
|
||||||
pNew->colVer++;
|
pNew->colVer++;
|
||||||
|
|
||||||
mDebug("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
|
mDebug("stb:%s, start to modify col len %s to %d", pNew->name, pField->name, pField->bytes);
|
||||||
|
@ -1315,9 +1305,10 @@ static int32_t mndProcessMAlterStbReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alterReq.verInBlock > 0 && alterReq.verInBlock <= pStb->version) {
|
if ((alterReq.tagVer > 0 && alterReq.colVer > 0) &&
|
||||||
mDebug("stb:%s, already exist, verInBlock:%d smaller than verInStb:%d, alter success", alterReq.name,
|
(alterReq.tagVer <= pStb->tagVer || alterReq.colVer <= pStb->colVer)) {
|
||||||
alterReq.verInBlock, pStb->version);
|
mDebug("stb:%s, already exist, tagVer:%d colVer:%d smaller than in mnode, tagVer:%d colVer:%d, alter success",
|
||||||
|
alterReq.name, alterReq.tagVer, alterReq.colVer, pStb->tagVer, pStb->colVer);
|
||||||
code = 0;
|
code = 0;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
@ -1511,7 +1502,7 @@ static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbNa
|
||||||
pRsp->numOfColumns = pStb->numOfColumns;
|
pRsp->numOfColumns = pStb->numOfColumns;
|
||||||
pRsp->precision = pDb->cfg.precision;
|
pRsp->precision = pDb->cfg.precision;
|
||||||
pRsp->tableType = TSDB_SUPER_TABLE;
|
pRsp->tableType = TSDB_SUPER_TABLE;
|
||||||
pRsp->sversion = pStb->version;
|
pRsp->sversion = pStb->colVer;
|
||||||
pRsp->suid = pStb->uid;
|
pRsp->suid = pStb->uid;
|
||||||
pRsp->tuid = pStb->uid;
|
pRsp->tuid = pStb->uid;
|
||||||
|
|
||||||
|
|
|
@ -217,7 +217,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pTopic->schema.nCols = 0;
|
pTopic->schema.nCols = 0;
|
||||||
pTopic->schema.sver = 0;
|
pTopic->schema.version = 0;
|
||||||
pTopic->schema.pSchema = NULL;
|
pTopic->schema.pSchema = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -829,7 +829,7 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
sendRsp = true;
|
sendRsp = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pTrans->stage == TRN_STAGE_REDO_ACTION && pTrans->failedTimes > 0) {
|
if (pTrans->stage == TRN_STAGE_REDO_ACTION && pTrans->failedTimes > 6) {
|
||||||
if (code == 0) code = TSDB_CODE_MND_TRANS_UNKNOW_ERROR;
|
if (code == 0) code = TSDB_CODE_MND_TRANS_UNKNOW_ERROR;
|
||||||
sendRsp = true;
|
sendRsp = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,7 @@ SSdbRaw *mndVgroupActionEncode(SVgObj *pVgroup) {
|
||||||
SDB_SET_INT32(pRaw, dataPos, pVgroup->hashEnd, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pVgroup->hashEnd, _OVER)
|
||||||
SDB_SET_BINARY(pRaw, dataPos, pVgroup->dbName, TSDB_DB_FNAME_LEN, _OVER)
|
SDB_SET_BINARY(pRaw, dataPos, pVgroup->dbName, TSDB_DB_FNAME_LEN, _OVER)
|
||||||
SDB_SET_INT64(pRaw, dataPos, pVgroup->dbUid, _OVER)
|
SDB_SET_INT64(pRaw, dataPos, pVgroup->dbUid, _OVER)
|
||||||
|
SDB_SET_INT8(pRaw, dataPos, pVgroup->isTsma, _OVER)
|
||||||
SDB_SET_INT8(pRaw, dataPos, pVgroup->replica, _OVER)
|
SDB_SET_INT8(pRaw, dataPos, pVgroup->replica, _OVER)
|
||||||
for (int8_t i = 0; i < pVgroup->replica; ++i) {
|
for (int8_t i = 0; i < pVgroup->replica; ++i) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
||||||
|
@ -127,6 +128,7 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pVgroup->hashEnd, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pVgroup->hashEnd, _OVER)
|
||||||
SDB_GET_BINARY(pRaw, dataPos, pVgroup->dbName, TSDB_DB_FNAME_LEN, _OVER)
|
SDB_GET_BINARY(pRaw, dataPos, pVgroup->dbName, TSDB_DB_FNAME_LEN, _OVER)
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pVgroup->dbUid, _OVER)
|
SDB_GET_INT64(pRaw, dataPos, &pVgroup->dbUid, _OVER)
|
||||||
|
SDB_GET_INT8(pRaw, dataPos, &pVgroup->isTsma, _OVER)
|
||||||
SDB_GET_INT8(pRaw, dataPos, &pVgroup->replica, _OVER)
|
SDB_GET_INT8(pRaw, dataPos, &pVgroup->replica, _OVER)
|
||||||
for (int8_t i = 0; i < pVgroup->replica; ++i) {
|
for (int8_t i = 0; i < pVgroup->replica; ++i) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
|
||||||
|
@ -167,6 +169,7 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) {
|
||||||
pOld->hashBegin = pNew->hashBegin;
|
pOld->hashBegin = pNew->hashBegin;
|
||||||
pOld->hashEnd = pNew->hashEnd;
|
pOld->hashEnd = pNew->hashEnd;
|
||||||
pOld->replica = pNew->replica;
|
pOld->replica = pNew->replica;
|
||||||
|
pOld->isTsma = pNew->isTsma;
|
||||||
memcpy(pOld->vnodeGid, pNew->vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid));
|
memcpy(pOld->vnodeGid, pNew->vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -426,6 +429,25 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SVgObj *pVgroup, SArray *pAr
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t mndAllocSmaVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup) {
|
||||||
|
SArray *pArray = mndBuildDnodesArray(pMnode);
|
||||||
|
if (pArray == NULL) return -1;
|
||||||
|
|
||||||
|
pVgroup->vgId = sdbGetMaxId(pMnode->pSdb, SDB_VGROUP);
|
||||||
|
pVgroup->isTsma = 1;
|
||||||
|
pVgroup->createdTime = taosGetTimestampMs();
|
||||||
|
pVgroup->updateTime = pVgroup->createdTime;
|
||||||
|
pVgroup->version = 1;
|
||||||
|
memcpy(pVgroup->dbName, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
|
pVgroup->dbUid = pDb->uid;
|
||||||
|
pVgroup->replica = 1;
|
||||||
|
|
||||||
|
if (mndGetAvailableDnode(pMnode, pVgroup, pArray) != 0) return -1;
|
||||||
|
|
||||||
|
mInfo("db:%s, sma vgId:%d is alloced", pDb->name, pVgroup->vgId);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mndAllocVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj **ppVgroups) {
|
int32_t mndAllocVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj **ppVgroups) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SArray *pArray = NULL;
|
SArray *pArray = NULL;
|
||||||
|
@ -702,9 +724,12 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppendNULL(pColInfo, numOfRows);
|
colDataAppendNULL(pColInfo, numOfRows);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppendNULL(pColInfo, numOfRows);
|
colDataAppendNULL(pColInfo, numOfRows);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->isTsma, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,7 +277,8 @@ void* MndTestStb::BuildAlterStbUpdateColumnBytesReq(const char* stbname, const c
|
||||||
req.numOfFields = 1;
|
req.numOfFields = 1;
|
||||||
req.pFields = taosArrayInit(1, sizeof(SField));
|
req.pFields = taosArrayInit(1, sizeof(SField));
|
||||||
req.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
|
req.alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES;
|
||||||
req.verInBlock = verInBlock;
|
req.tagVer = verInBlock;
|
||||||
|
req.colVer = verInBlock;
|
||||||
|
|
||||||
SField field = {0};
|
SField field = {0};
|
||||||
field.bytes = bytes;
|
field.bytes = bytes;
|
||||||
|
|
|
@ -182,7 +182,7 @@ struct SMetaEntry {
|
||||||
char *name;
|
char *name;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
SSchemaWrapper schema;
|
SSchemaWrapper schemaRow;
|
||||||
SSchemaWrapper schemaTag;
|
SSchemaWrapper schemaTag;
|
||||||
} stbEntry;
|
} stbEntry;
|
||||||
struct {
|
struct {
|
||||||
|
@ -195,7 +195,7 @@ struct SMetaEntry {
|
||||||
int64_t ctime;
|
int64_t ctime;
|
||||||
int32_t ttlDays;
|
int32_t ttlDays;
|
||||||
int32_t ncid; // next column id
|
int32_t ncid; // next column id
|
||||||
SSchemaWrapper schema;
|
SSchemaWrapper schemaRow;
|
||||||
} ntbEntry;
|
} ntbEntry;
|
||||||
struct {
|
struct {
|
||||||
STSma *tsma;
|
STSma *tsma;
|
||||||
|
|
|
@ -24,7 +24,7 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
|
||||||
if (tEncodeCStr(pCoder, pME->name) < 0) return -1;
|
if (tEncodeCStr(pCoder, pME->name) < 0) return -1;
|
||||||
|
|
||||||
if (pME->type == TSDB_SUPER_TABLE) {
|
if (pME->type == TSDB_SUPER_TABLE) {
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pME->stbEntry.schema) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pME->stbEntry.schemaRow) < 0) return -1;
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pME->stbEntry.schemaTag) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pME->stbEntry.schemaTag) < 0) return -1;
|
||||||
} else if (pME->type == TSDB_CHILD_TABLE) {
|
} else if (pME->type == TSDB_CHILD_TABLE) {
|
||||||
if (tEncodeI64(pCoder, pME->ctbEntry.ctime) < 0) return -1;
|
if (tEncodeI64(pCoder, pME->ctbEntry.ctime) < 0) return -1;
|
||||||
|
@ -35,7 +35,7 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
|
||||||
if (tEncodeI64(pCoder, pME->ntbEntry.ctime) < 0) return -1;
|
if (tEncodeI64(pCoder, pME->ntbEntry.ctime) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pME->ntbEntry.ttlDays) < 0) return -1;
|
if (tEncodeI32(pCoder, pME->ntbEntry.ttlDays) < 0) return -1;
|
||||||
if (tEncodeI32v(pCoder, pME->ntbEntry.ncid) < 0) return -1;
|
if (tEncodeI32v(pCoder, pME->ntbEntry.ncid) < 0) return -1;
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pME->ntbEntry.schema) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pME->ntbEntry.schemaRow) < 0) return -1;
|
||||||
} else if (pME->type == TSDB_TSMA_TABLE) {
|
} else if (pME->type == TSDB_TSMA_TABLE) {
|
||||||
if (tEncodeTSma(pCoder, pME->smaEntry.tsma) < 0) return -1;
|
if (tEncodeTSma(pCoder, pME->smaEntry.tsma) < 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,7 +56,7 @@ int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
|
||||||
if (tDecodeCStr(pCoder, &pME->name) < 0) return -1;
|
if (tDecodeCStr(pCoder, &pME->name) < 0) return -1;
|
||||||
|
|
||||||
if (pME->type == TSDB_SUPER_TABLE) {
|
if (pME->type == TSDB_SUPER_TABLE) {
|
||||||
if (tDecodeSSchemaWrapperEx(pCoder, &pME->stbEntry.schema) < 0) return -1;
|
if (tDecodeSSchemaWrapperEx(pCoder, &pME->stbEntry.schemaRow) < 0) return -1;
|
||||||
if (tDecodeSSchemaWrapperEx(pCoder, &pME->stbEntry.schemaTag) < 0) return -1;
|
if (tDecodeSSchemaWrapperEx(pCoder, &pME->stbEntry.schemaTag) < 0) return -1;
|
||||||
} else if (pME->type == TSDB_CHILD_TABLE) {
|
} else if (pME->type == TSDB_CHILD_TABLE) {
|
||||||
if (tDecodeI64(pCoder, &pME->ctbEntry.ctime) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->ctbEntry.ctime) < 0) return -1;
|
||||||
|
@ -67,7 +67,7 @@ int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
|
||||||
if (tDecodeI64(pCoder, &pME->ntbEntry.ctime) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->ntbEntry.ctime) < 0) return -1;
|
||||||
if (tDecodeI32(pCoder, &pME->ntbEntry.ttlDays) < 0) return -1;
|
if (tDecodeI32(pCoder, &pME->ntbEntry.ttlDays) < 0) return -1;
|
||||||
if (tDecodeI32v(pCoder, &pME->ntbEntry.ncid) < 0) return -1;
|
if (tDecodeI32v(pCoder, &pME->ntbEntry.ncid) < 0) return -1;
|
||||||
if (tDecodeSSchemaWrapperEx(pCoder, &pME->ntbEntry.schema) < 0) return -1;
|
if (tDecodeSSchemaWrapperEx(pCoder, &pME->ntbEntry.schemaRow) < 0) return -1;
|
||||||
} else if (pME->type == TSDB_TSMA_TABLE) {
|
} else if (pME->type == TSDB_TSMA_TABLE) {
|
||||||
pME->smaEntry.tsma = tDecoderMalloc(pCoder, sizeof(STSma));
|
pME->smaEntry.tsma = tDecoderMalloc(pCoder, sizeof(STSma));
|
||||||
if (!pME->smaEntry.tsma) {
|
if (!pME->smaEntry.tsma) {
|
||||||
|
|
|
@ -56,7 +56,7 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
me.type = TSDB_SUPER_TABLE;
|
me.type = TSDB_SUPER_TABLE;
|
||||||
me.uid = pReq->suid;
|
me.uid = pReq->suid;
|
||||||
me.name = pReq->name;
|
me.name = pReq->name;
|
||||||
me.stbEntry.schema = pReq->schema;
|
me.stbEntry.schemaRow = pReq->schemaRow;
|
||||||
me.stbEntry.schemaTag = pReq->schemaTag;
|
me.stbEntry.schemaTag = pReq->schemaTag;
|
||||||
|
|
||||||
if (metaHandleEntry(pMeta, &me) < 0) goto _err;
|
if (metaHandleEntry(pMeta, &me) < 0) goto _err;
|
||||||
|
@ -182,16 +182,14 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
nStbEntry.type = TSDB_SUPER_TABLE;
|
nStbEntry.type = TSDB_SUPER_TABLE;
|
||||||
nStbEntry.uid = pReq->suid;
|
nStbEntry.uid = pReq->suid;
|
||||||
nStbEntry.name = pReq->name;
|
nStbEntry.name = pReq->name;
|
||||||
nStbEntry.stbEntry.schema = pReq->schema;
|
nStbEntry.stbEntry.schemaRow = pReq->schemaRow;
|
||||||
nStbEntry.stbEntry.schemaTag = pReq->schemaTag;
|
nStbEntry.stbEntry.schemaTag = pReq->schemaTag;
|
||||||
|
|
||||||
metaWLock(pMeta);
|
metaWLock(pMeta);
|
||||||
// compare two entry
|
// compare two entry
|
||||||
if (oStbEntry.stbEntry.schema.sver != pReq->schema.sver) {
|
if (oStbEntry.stbEntry.schemaRow.version != pReq->schemaRow.version) {
|
||||||
if (oStbEntry.stbEntry.schema.nCols != pReq->schema.nCols) {
|
|
||||||
metaSaveToSkmDb(pMeta, &nStbEntry);
|
metaSaveToSkmDb(pMeta, &nStbEntry);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// if (oStbEntry.stbEntry.schemaTag.sver != pReq->schemaTag.sver) {
|
// if (oStbEntry.stbEntry.schemaTag.sver != pReq->schemaTag.sver) {
|
||||||
// // change tag schema
|
// // change tag schema
|
||||||
|
@ -247,8 +245,8 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq) {
|
||||||
} else {
|
} else {
|
||||||
me.ntbEntry.ctime = pReq->ctime;
|
me.ntbEntry.ctime = pReq->ctime;
|
||||||
me.ntbEntry.ttlDays = pReq->ttl;
|
me.ntbEntry.ttlDays = pReq->ttl;
|
||||||
me.ntbEntry.schema = pReq->ntb.schema;
|
me.ntbEntry.schemaRow = pReq->ntb.schemaRow;
|
||||||
me.ntbEntry.ncid = me.ntbEntry.schema.pSchema[me.ntbEntry.schema.nCols - 1].colId + 1;
|
me.ntbEntry.ncid = me.ntbEntry.schemaRow.pSchema[me.ntbEntry.schemaRow.nCols - 1].colId + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metaHandleEntry(pMeta, &me) < 0) goto _err;
|
if (metaHandleEntry(pMeta, &me) < 0) goto _err;
|
||||||
|
@ -381,7 +379,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
}
|
}
|
||||||
|
|
||||||
// search the column to add/drop/update
|
// search the column to add/drop/update
|
||||||
pSchema = &entry.ntbEntry.schema;
|
pSchema = &entry.ntbEntry.schemaRow;
|
||||||
int32_t iCol = 0;
|
int32_t iCol = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
pColumn = NULL;
|
pColumn = NULL;
|
||||||
|
@ -402,16 +400,16 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS;
|
terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pSchema->sver++;
|
pSchema->version++;
|
||||||
pSchema->nCols++;
|
pSchema->nCols++;
|
||||||
pNewSchema = taosMemoryMalloc(sizeof(SSchema) * pSchema->nCols);
|
pNewSchema = taosMemoryMalloc(sizeof(SSchema) * pSchema->nCols);
|
||||||
memcpy(pNewSchema, pSchema->pSchema, sizeof(SSchema) * (pSchema->nCols - 1));
|
memcpy(pNewSchema, pSchema->pSchema, sizeof(SSchema) * (pSchema->nCols - 1));
|
||||||
pSchema->pSchema = pNewSchema;
|
pSchema->pSchema = pNewSchema;
|
||||||
pSchema->pSchema[entry.ntbEntry.schema.nCols - 1].bytes = pAlterTbReq->bytes;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].bytes = pAlterTbReq->bytes;
|
||||||
pSchema->pSchema[entry.ntbEntry.schema.nCols - 1].type = pAlterTbReq->type;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].type = pAlterTbReq->type;
|
||||||
pSchema->pSchema[entry.ntbEntry.schema.nCols - 1].flags = pAlterTbReq->flags;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].flags = pAlterTbReq->flags;
|
||||||
pSchema->pSchema[entry.ntbEntry.schema.nCols - 1].colId = entry.ntbEntry.ncid++;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].colId = entry.ntbEntry.ncid++;
|
||||||
strcpy(pSchema->pSchema[entry.ntbEntry.schema.nCols - 1].name, pAlterTbReq->colName);
|
strcpy(pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].name, pAlterTbReq->colName);
|
||||||
break;
|
break;
|
||||||
case TSDB_ALTER_TABLE_DROP_COLUMN:
|
case TSDB_ALTER_TABLE_DROP_COLUMN:
|
||||||
if (pColumn == NULL) {
|
if (pColumn == NULL) {
|
||||||
|
@ -422,7 +420,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pSchema->sver++;
|
pSchema->version++;
|
||||||
tlen = (pSchema->nCols - iCol - 1) * sizeof(SSchema);
|
tlen = (pSchema->nCols - iCol - 1) * sizeof(SSchema);
|
||||||
if (tlen) {
|
if (tlen) {
|
||||||
memmove(pColumn, pColumn + 1, tlen);
|
memmove(pColumn, pColumn + 1, tlen);
|
||||||
|
@ -438,7 +436,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pSchema->sver++;
|
pSchema->version++;
|
||||||
pColumn->bytes = pAlterTbReq->colModBytes;
|
pColumn->bytes = pAlterTbReq->colModBytes;
|
||||||
break;
|
break;
|
||||||
case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME:
|
case TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME:
|
||||||
|
@ -446,7 +444,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
|
terrno = TSDB_CODE_VND_TABLE_COL_NOT_EXISTS;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pSchema->sver++;
|
pSchema->version++;
|
||||||
strcpy(pColumn->name, pAlterTbReq->colNewName);
|
strcpy(pColumn->name, pAlterTbReq->colNewName);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -813,15 +811,15 @@ static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
const SSchemaWrapper *pSW;
|
const SSchemaWrapper *pSW;
|
||||||
|
|
||||||
if (pME->type == TSDB_SUPER_TABLE) {
|
if (pME->type == TSDB_SUPER_TABLE) {
|
||||||
pSW = &pME->stbEntry.schema;
|
pSW = &pME->stbEntry.schemaRow;
|
||||||
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
||||||
pSW = &pME->ntbEntry.schema;
|
pSW = &pME->ntbEntry.schemaRow;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
skmDbKey.uid = pME->uid;
|
skmDbKey.uid = pME->uid;
|
||||||
skmDbKey.sver = pSW->sver;
|
skmDbKey.sver = pSW->version;
|
||||||
|
|
||||||
// encode schema
|
// encode schema
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
|
|
@ -831,25 +831,13 @@ FAIL:
|
||||||
int32_t tqProcessStreamTrigger(STQ* pTq, SSubmitReq* pReq) {
|
int32_t tqProcessStreamTrigger(STQ* pTq, SSubmitReq* pReq) {
|
||||||
void* pIter = NULL;
|
void* pIter = NULL;
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
SStreamDataSubmit* pSubmit = NULL;
|
||||||
|
|
||||||
SStreamDataSubmit* pSubmit = taosAllocateQitem(sizeof(SStreamDataSubmit), DEF_QITEM);
|
pSubmit = streamDataSubmitNew(pReq);
|
||||||
if (pSubmit == NULL) {
|
if (pSubmit == NULL) {
|
||||||
failed = true;
|
failed = true;
|
||||||
goto SET_TASK_FAIL;
|
|
||||||
}
|
|
||||||
pSubmit->dataRef = taosMemoryMalloc(sizeof(int32_t));
|
|
||||||
if (pSubmit->dataRef == NULL) {
|
|
||||||
failed = true;
|
|
||||||
goto SET_TASK_FAIL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pSubmit->type = STREAM_INPUT__DATA_SUBMIT;
|
|
||||||
/*pSubmit->sourceVer = ver;*/
|
|
||||||
/*pSubmit->sourceVg = pTq->pVnode->config.vgId;*/
|
|
||||||
pSubmit->data = pReq;
|
|
||||||
*pSubmit->dataRef = 1;
|
|
||||||
|
|
||||||
SET_TASK_FAIL:
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pTq->pStreamTasks, pIter);
|
pIter = taosHashIterate(pTq->pStreamTasks, pIter);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
@ -864,7 +852,9 @@ SET_TASK_FAIL:
|
||||||
}
|
}
|
||||||
|
|
||||||
streamDataSubmitRefInc(pSubmit);
|
streamDataSubmitRefInc(pSubmit);
|
||||||
taosWriteQitem(pTask->inputQ, pSubmit);
|
SStreamDataSubmit* pSubmitClone = taosAllocateQitem(sizeof(SStreamDataSubmit), DEF_QITEM);
|
||||||
|
memcpy(pSubmitClone, pSubmit, sizeof(SStreamDataSubmit));
|
||||||
|
taosWriteQitem(pTask->inputQ, pSubmitClone);
|
||||||
|
|
||||||
int8_t execStatus = atomic_load_8(&pTask->status);
|
int8_t execStatus = atomic_load_8(&pTask->status);
|
||||||
if (execStatus == TASK_STATUS__IDLE || execStatus == TASK_STATUS__CLOSING) {
|
if (execStatus == TASK_STATUS__IDLE || execStatus == TASK_STATUS__CLOSING) {
|
||||||
|
@ -887,18 +877,12 @@ SET_TASK_FAIL:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!failed) {
|
|
||||||
streamDataSubmitRefDec(pSubmit);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
if (pSubmit) {
|
if (pSubmit) {
|
||||||
if (pSubmit->dataRef) {
|
streamDataSubmitRefDec(pSubmit);
|
||||||
taosMemoryFree(pSubmit->dataRef);
|
|
||||||
}
|
|
||||||
taosFreeQitem(pSubmit);
|
taosFreeQitem(pSubmit);
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
}
|
return failed ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) {
|
int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
|
|
|
@ -321,13 +321,13 @@ int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlo
|
||||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
strcat(pRsp->tblFName, mr.me.name);
|
if(pRsp->tblFName) strcat(pRsp->tblFName, mr.me.name);
|
||||||
|
|
||||||
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
||||||
sverNew = mr.me.ntbEntry.schema.sver;
|
sverNew = mr.me.ntbEntry.schemaRow.version;
|
||||||
} else {
|
} else {
|
||||||
metaGetTableEntryByUid(&mr, mr.me.ctbEntry.suid);
|
metaGetTableEntryByUid(&mr, mr.me.ctbEntry.suid);
|
||||||
sverNew = mr.me.stbEntry.schema.sver;
|
sverNew = mr.me.stbEntry.schemaRow.version;
|
||||||
}
|
}
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
if (mer1.me.type == TSDB_SUPER_TABLE) {
|
if (mer1.me.type == TSDB_SUPER_TABLE) {
|
||||||
strcpy(metaRsp.stbName, mer1.me.name);
|
strcpy(metaRsp.stbName, mer1.me.name);
|
||||||
schema = mer1.me.stbEntry.schema;
|
schema = mer1.me.stbEntry.schemaRow;
|
||||||
schemaTag = mer1.me.stbEntry.schemaTag;
|
schemaTag = mer1.me.stbEntry.schemaTag;
|
||||||
metaRsp.suid = mer1.me.uid;
|
metaRsp.suid = mer1.me.uid;
|
||||||
} else if (mer1.me.type == TSDB_CHILD_TABLE) {
|
} else if (mer1.me.type == TSDB_CHILD_TABLE) {
|
||||||
|
@ -73,10 +73,10 @@ int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
strcpy(metaRsp.stbName, mer2.me.name);
|
strcpy(metaRsp.stbName, mer2.me.name);
|
||||||
metaRsp.suid = mer2.me.uid;
|
metaRsp.suid = mer2.me.uid;
|
||||||
schema = mer2.me.stbEntry.schema;
|
schema = mer2.me.stbEntry.schemaRow;
|
||||||
schemaTag = mer2.me.stbEntry.schemaTag;
|
schemaTag = mer2.me.stbEntry.schemaTag;
|
||||||
} else if (mer1.me.type == TSDB_NORMAL_TABLE) {
|
} else if (mer1.me.type == TSDB_NORMAL_TABLE) {
|
||||||
schema = mer1.me.ntbEntry.schema;
|
schema = mer1.me.ntbEntry.schemaRow;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
metaRsp.numOfTags = schemaTag.nCols;
|
metaRsp.numOfTags = schemaTag.nCols;
|
||||||
metaRsp.numOfColumns = schema.nCols;
|
metaRsp.numOfColumns = schema.nCols;
|
||||||
metaRsp.precision = pVnode->config.tsdbCfg.precision;
|
metaRsp.precision = pVnode->config.tsdbCfg.precision;
|
||||||
metaRsp.sversion = schema.sver;
|
metaRsp.sversion = schema.version;
|
||||||
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (metaRsp.numOfColumns + metaRsp.numOfTags));
|
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (metaRsp.numOfColumns + metaRsp.numOfTags));
|
||||||
|
|
||||||
memcpy(metaRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
|
memcpy(metaRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
|
||||||
|
|
|
@ -96,8 +96,6 @@ typedef struct STableScanAnalyzeInfo SFileBlockLoadRecorder;
|
||||||
typedef struct STaskCostInfo {
|
typedef struct STaskCostInfo {
|
||||||
int64_t created;
|
int64_t created;
|
||||||
int64_t start;
|
int64_t start;
|
||||||
int64_t end;
|
|
||||||
|
|
||||||
uint64_t loadStatisTime;
|
uint64_t loadStatisTime;
|
||||||
uint64_t loadFileBlockTime;
|
uint64_t loadFileBlockTime;
|
||||||
uint64_t loadDataInCacheTime;
|
uint64_t loadDataInCacheTime;
|
||||||
|
@ -185,7 +183,7 @@ typedef struct SExecTaskInfo {
|
||||||
STaskCostInfo cost;
|
STaskCostInfo cost;
|
||||||
int64_t owner; // if it is in execution
|
int64_t owner; // if it is in execution
|
||||||
int32_t code;
|
int32_t code;
|
||||||
uint64_t totalRows; // total number of rows
|
// uint64_t totalRows; // total number of rows
|
||||||
struct {
|
struct {
|
||||||
char *tablename;
|
char *tablename;
|
||||||
char *dbname;
|
char *dbname;
|
||||||
|
@ -465,6 +463,7 @@ typedef struct SStreamFinalIntervalOperatorInfo {
|
||||||
SAggSupporter aggSup; // aggregate supporter
|
SAggSupporter aggSup; // aggregate supporter
|
||||||
int32_t order; // current SSDataBlock scan order
|
int32_t order; // current SSDataBlock scan order
|
||||||
STimeWindowAggSupp twAggSup;
|
STimeWindowAggSupp twAggSup;
|
||||||
|
SArray* pChildren;
|
||||||
} SStreamFinalIntervalOperatorInfo;
|
} SStreamFinalIntervalOperatorInfo;
|
||||||
|
|
||||||
typedef struct SAggOperatorInfo {
|
typedef struct SAggOperatorInfo {
|
||||||
|
@ -581,6 +580,7 @@ typedef struct SStreamSessionAggOperatorInfo {
|
||||||
SSDataBlock* pDelRes;
|
SSDataBlock* pDelRes;
|
||||||
SHashObj* pStDeleted;
|
SHashObj* pStDeleted;
|
||||||
void* pDelIterator;
|
void* pDelIterator;
|
||||||
|
SArray* pChildren; // cache for children's result;
|
||||||
} SStreamSessionAggOperatorInfo;
|
} SStreamSessionAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct STimeSliceOperatorInfo {
|
typedef struct STimeSliceOperatorInfo {
|
||||||
|
@ -674,6 +674,7 @@ int32_t setSDataBlockFromFetchRsp(SSDataBlock* pRes, SLoadRemoteDataInfo* pLoadI
|
||||||
SArray* pColList);
|
SArray* pColList);
|
||||||
void getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key, STimeWindow* win);
|
void getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key, STimeWindow* win);
|
||||||
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t *order, int32_t* scanFlag);
|
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t *order, int32_t* scanFlag);
|
||||||
|
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz);
|
||||||
|
|
||||||
void doSetOperatorCompleted(SOperatorInfo* pOperator);
|
void doSetOperatorCompleted(SOperatorInfo* pOperator);
|
||||||
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, SArray* pColMatchInfo);
|
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, SArray* pColMatchInfo);
|
||||||
|
@ -722,7 +723,7 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo*
|
||||||
STimeWindowAggSupp *pTwAggSupp, const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
STimeWindowAggSupp *pTwAggSupp, const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
||||||
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
||||||
STimeWindowAggSupp *pTwAggSupp, const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
STimeWindowAggSupp *pTwAggSupp, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
||||||
|
|
||||||
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
||||||
|
@ -797,7 +798,7 @@ int32_t getNumOfRowsInTimeWindow(SDataBlockInfo* pDataBlockInfo, TSKEY* pPrimary
|
||||||
int32_t startPos, TSKEY ekey, __block_search_fn_t searchFn, STableQueryInfo* item,
|
int32_t startPos, TSKEY ekey, __block_search_fn_t searchFn, STableQueryInfo* item,
|
||||||
int32_t order);
|
int32_t order);
|
||||||
int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
|
int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
|
||||||
int32_t initCatchSupporter(SCatchSupporter* pCatchSup, size_t rowSize, const char* pKey,
|
int32_t initCacheSupporter(SCatchSupporter* pCatchSup, size_t rowSize, const char* pKey,
|
||||||
const char* pDir);
|
const char* pDir);
|
||||||
int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey);
|
int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey);
|
||||||
SResultRow* getNewResultRow_rv(SDiskbasedBuf* pResultBuf, int64_t tableGroupId, int32_t interBufSize);
|
SResultRow* getNewResultRow_rv(SDiskbasedBuf* pResultBuf, int64_t tableGroupId, int32_t interBufSize);
|
||||||
|
|
|
@ -126,8 +126,7 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
pTaskInfo->code = ret;
|
pTaskInfo->code = ret;
|
||||||
cleanUpUdfs();
|
cleanUpUdfs();
|
||||||
qDebug("%s task abort due to error/cancel occurs, code:%s", GET_TASKID(pTaskInfo),
|
qDebug("%s task abort due to error/cancel occurs, code:%s", GET_TASKID(pTaskInfo), tstrerror(pTaskInfo->code));
|
||||||
tstrerror(pTaskInfo->code));
|
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,12 +141,13 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
|
||||||
*useconds = pTaskInfo->cost.elapsedTime;
|
*useconds = pTaskInfo->cost.elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t current = (*pRes != NULL)? (*pRes)->info.rows:0;
|
|
||||||
pTaskInfo->totalRows += current;
|
|
||||||
|
|
||||||
cleanUpUdfs();
|
cleanUpUdfs();
|
||||||
|
|
||||||
|
int32_t current = (*pRes != NULL)? (*pRes)->info.rows:0;
|
||||||
|
uint64_t total = pTaskInfo->pRoot->resultInfo.totalRows;
|
||||||
|
|
||||||
qDebug("%s task suspended, %d rows returned, total:%" PRId64 " rows, in sinkNode:%d, elapsed:%.2f ms",
|
qDebug("%s task suspended, %d rows returned, total:%" PRId64 " rows, in sinkNode:%d, elapsed:%.2f ms",
|
||||||
GET_TASKID(pTaskInfo), current, pTaskInfo->totalRows, 0, el/1000.0);
|
GET_TASKID(pTaskInfo), current, total, 0, el/1000.0);
|
||||||
|
|
||||||
atomic_store_64(&pTaskInfo->owner, 0);
|
atomic_store_64(&pTaskInfo->owner, 0);
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
|
@ -197,7 +197,7 @@ int32_t qIsTaskCompleted(qTaskInfo_t qinfo) {
|
||||||
|
|
||||||
void qDestroyTask(qTaskInfo_t qTaskHandle) {
|
void qDestroyTask(qTaskInfo_t qTaskHandle) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*) qTaskHandle;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*) qTaskHandle;
|
||||||
qDebug("%s execTask completed, numOfRows:%"PRId64, GET_TASKID(pTaskInfo), pTaskInfo->totalRows);
|
qDebug("%s execTask completed, numOfRows:%"PRId64, GET_TASKID(pTaskInfo), pTaskInfo->pRoot->resultInfo.totalRows);
|
||||||
|
|
||||||
queryCostStatis(pTaskInfo); // print the query cost summary
|
queryCostStatis(pTaskInfo); // print the query cost summary
|
||||||
doDestroyTask(pTaskInfo);
|
doDestroyTask(pTaskInfo);
|
||||||
|
|
|
@ -3938,6 +3938,21 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator) {
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz) {
|
||||||
|
*defaultPgsz = 4096;
|
||||||
|
while (*defaultPgsz < rowSize * 4) {
|
||||||
|
*defaultPgsz <<= 1u;
|
||||||
|
}
|
||||||
|
|
||||||
|
// at least four pages need to be in buffer
|
||||||
|
*defaultBufsz = 4096 * 256;
|
||||||
|
if ((*defaultBufsz) <= (*defaultPgsz)) {
|
||||||
|
(*defaultBufsz) = (*defaultPgsz) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, size_t keyBufSize,
|
int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, size_t keyBufSize,
|
||||||
const char* pKey) {
|
const char* pKey) {
|
||||||
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
||||||
|
@ -3950,16 +3965,9 @@ int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t n
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t defaultPgsz = 4096;
|
uint32_t defaultPgsz = 0;
|
||||||
while (defaultPgsz < pAggSup->resultRowSize * 4) {
|
uint32_t defaultBufsz = 0;
|
||||||
defaultPgsz <<= 1u;
|
getBufferPgSize(pAggSup->resultRowSize, &defaultPgsz, &defaultBufsz);
|
||||||
}
|
|
||||||
|
|
||||||
// at least four pages need to be in buffer
|
|
||||||
int32_t defaultBufsz = 4096 * 256;
|
|
||||||
if (defaultBufsz <= defaultPgsz) {
|
|
||||||
defaultBufsz = defaultPgsz * 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t code = createDiskbasedBuf(&pAggSup->pResultBuf, defaultPgsz, defaultBufsz, pKey, TD_TMP_DIR_PATH);
|
int32_t code = createDiskbasedBuf(&pAggSup->pResultBuf, defaultPgsz, defaultBufsz, pKey, TD_TMP_DIR_PATH);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -4455,15 +4463,15 @@ void extractTableSchemaVersion(SReadHandle* pHandle, uint64_t uid, SExecTaskInfo
|
||||||
pTaskInfo->schemaVer.tablename = strdup(mr.me.name);
|
pTaskInfo->schemaVer.tablename = strdup(mr.me.name);
|
||||||
|
|
||||||
if (mr.me.type == TSDB_SUPER_TABLE) {
|
if (mr.me.type == TSDB_SUPER_TABLE) {
|
||||||
pTaskInfo->schemaVer.sversion = mr.me.stbEntry.schema.sver;
|
pTaskInfo->schemaVer.sversion = mr.me.stbEntry.schemaRow.version;
|
||||||
pTaskInfo->schemaVer.tversion = mr.me.stbEntry.schemaTag.sver;
|
pTaskInfo->schemaVer.tversion = mr.me.stbEntry.schemaTag.version;
|
||||||
} else if (mr.me.type == TSDB_CHILD_TABLE) {
|
} else if (mr.me.type == TSDB_CHILD_TABLE) {
|
||||||
tb_uid_t suid = mr.me.ctbEntry.suid;
|
tb_uid_t suid = mr.me.ctbEntry.suid;
|
||||||
metaGetTableEntryByUid(&mr, suid);
|
metaGetTableEntryByUid(&mr, suid);
|
||||||
pTaskInfo->schemaVer.sversion = mr.me.stbEntry.schema.sver;
|
pTaskInfo->schemaVer.sversion = mr.me.stbEntry.schemaRow.version;
|
||||||
pTaskInfo->schemaVer.tversion = mr.me.stbEntry.schemaTag.sver;
|
pTaskInfo->schemaVer.tversion = mr.me.stbEntry.schemaTag.version;
|
||||||
} else {
|
} else {
|
||||||
pTaskInfo->schemaVer.sversion = mr.me.ntbEntry.schema.sver;
|
pTaskInfo->schemaVer.sversion = mr.me.ntbEntry.schemaRow.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
@ -4668,8 +4676,8 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
|
SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
|
||||||
int32_t tsSlotId = ((SColumnNode*)pSessionNode->window.pTspk)->slotId;
|
int32_t tsSlotId = ((SColumnNode*)pSessionNode->window.pTspk)->slotId;
|
||||||
|
|
||||||
pOptr =
|
pOptr = createStreamSessionAggOperatorInfo(ops[0], pExprInfo, num, pResBlock, pSessionNode->gap, tsSlotId, &as,
|
||||||
createStreamSessionAggOperatorInfo(ops[0], pExprInfo, num, pResBlock, pSessionNode->gap, tsSlotId, &as, pTaskInfo);
|
pTaskInfo);
|
||||||
|
|
||||||
} else if (QUERY_NODE_PHYSICAL_PLAN_PARTITION == type) {
|
} else if (QUERY_NODE_PHYSICAL_PLAN_PARTITION == type) {
|
||||||
SPartitionPhysiNode* pPartNode = (SPartitionPhysiNode*)pPhyNode;
|
SPartitionPhysiNode* pPartNode = (SPartitionPhysiNode*)pPhyNode;
|
||||||
|
@ -5162,8 +5170,7 @@ int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SExplainExecInfo
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t initCatchSupporter(SCatchSupporter* pCatchSup, size_t rowSize, const char* pKey,
|
int32_t initCacheSupporter(SCatchSupporter* pCatchSup, size_t rowSize, const char* pKey, const char* pDir) {
|
||||||
const char* pDir) {
|
|
||||||
pCatchSup->keySize = sizeof(int64_t) + sizeof(int64_t) + sizeof(TSKEY);
|
pCatchSup->keySize = sizeof(int64_t) + sizeof(int64_t) + sizeof(TSKEY);
|
||||||
pCatchSup->pKeyBuf = taosMemoryCalloc(1, pCatchSup->keySize);
|
pCatchSup->pKeyBuf = taosMemoryCalloc(1, pCatchSup->keySize);
|
||||||
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
||||||
|
|
|
@ -439,7 +439,6 @@ static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
|
||||||
memcpy(data + (*columnLen), src, varDataTLen(src));
|
memcpy(data + (*columnLen), src, varDataTLen(src));
|
||||||
int32_t v = (data + (*columnLen) + varDataTLen(src) - (char*)pPage);
|
int32_t v = (data + (*columnLen) + varDataTLen(src) - (char*)pPage);
|
||||||
ASSERT(v > 0);
|
ASSERT(v > 0);
|
||||||
printf("len:%d\n", v);
|
|
||||||
|
|
||||||
contentLen = varDataTLen(src);
|
contentLen = varDataTLen(src);
|
||||||
}
|
}
|
||||||
|
@ -490,16 +489,13 @@ void* getCurrentDataGroupInfo(const SPartitionOperatorInfo* pInfo, SDataGroupInf
|
||||||
|
|
||||||
int32_t *rows = (int32_t*) pPage;
|
int32_t *rows = (int32_t*) pPage;
|
||||||
if (*rows >= pInfo->rowCapacity) {
|
if (*rows >= pInfo->rowCapacity) {
|
||||||
|
// release buffer
|
||||||
|
releaseBufPage(pInfo->pBuf, pPage);
|
||||||
|
|
||||||
// add a new page for current group
|
// add a new page for current group
|
||||||
int32_t pageId = 0;
|
int32_t pageId = 0;
|
||||||
pPage = getNewBufPage(pInfo->pBuf, 0, &pageId);
|
pPage = getNewBufPage(pInfo->pBuf, 0, &pageId);
|
||||||
taosArrayPush(p->pPageList, &pageId);
|
taosArrayPush(p->pPageList, &pageId);
|
||||||
|
|
||||||
// // number of rows
|
|
||||||
// *(int32_t*) pPage = 0;
|
|
||||||
//
|
|
||||||
// uint64_t* groupId = (pPage + sizeof(int32_t));
|
|
||||||
// *groupId = 0;
|
|
||||||
memset(pPage, 0, getBufPageSize(pInfo->pBuf));
|
memset(pPage, 0, getBufPageSize(pInfo->pBuf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -566,6 +562,7 @@ static SSDataBlock* buildPartitionResult(SOperatorInfo* pOperator) {
|
||||||
blockDataFromBuf1(pInfo->binfo.pRes, page, pInfo->rowCapacity);
|
blockDataFromBuf1(pInfo->binfo.pRes, page, pInfo->rowCapacity);
|
||||||
|
|
||||||
pInfo->pageIndex += 1;
|
pInfo->pageIndex += 1;
|
||||||
|
releaseBufPage(pInfo->pBuf, page);
|
||||||
|
|
||||||
blockDataUpdateTsWindow(pInfo->binfo.pRes, 0);
|
blockDataUpdateTsWindow(pInfo->binfo.pRes, 0);
|
||||||
pInfo->binfo.pRes->info.groupId = pGroupInfo->groupId;
|
pInfo->binfo.pRes->info.groupId = pGroupInfo->groupId;
|
||||||
|
@ -631,7 +628,11 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SExprInfo*
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = createDiskbasedBuf(&pInfo->pBuf, 4096, 4096 * 256, pTaskInfo->id.str, TD_TMP_DIR_PATH);
|
uint32_t defaultPgsz = 0;
|
||||||
|
uint32_t defaultBufsz = 0;
|
||||||
|
getBufferPgSize(pResultBlock->info.rowSize, &defaultPgsz, &defaultBufsz);
|
||||||
|
|
||||||
|
int32_t code = createDiskbasedBuf(&pInfo->pBuf, defaultPgsz, defaultBufsz, pTaskInfo->id.str, TD_TMP_DIR_PATH);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "function.h"
|
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
|
#include "function.h"
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
|
@ -324,7 +324,6 @@ void addTagPseudoColumnData(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock)
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
||||||
colDataAppend(pColInfoData, i, p, (p == NULL));
|
colDataAppend(pColInfoData, i, p, (p == NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColInfoData->info.type == TSDB_DATA_TYPE_JSON) {
|
if (pColInfoData->info.type == TSDB_DATA_TYPE_JSON) {
|
||||||
taosMemoryFree((void*)p);
|
taosMemoryFree((void*)p);
|
||||||
}
|
}
|
||||||
|
@ -409,7 +408,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
STimeWindow* pWin = &pTableScanInfo->cond.twindow;
|
STimeWindow* pWin = &pTableScanInfo->cond.twindow;
|
||||||
qDebug("%s start to repeat ascending order scan data blocks due to query func required, qrange:%" PRId64
|
qDebug("%s start to repeat ascending order scan data blocks due to query func required, qrange:%" PRId64
|
||||||
"-%" PRId64, GET_TASKID(pTaskInfo), pWin->skey, pWin->ekey);
|
"-%" PRId64,
|
||||||
|
GET_TASKID(pTaskInfo), pWin->skey, pWin->ekey);
|
||||||
|
|
||||||
// do prepare for the next round table scan operation
|
// do prepare for the next round table scan operation
|
||||||
tsdbResetReadHandle(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
tsdbResetReadHandle(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
||||||
|
@ -484,7 +484,8 @@ static void destroyTableScanOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, tsdbReaderT pDataReader, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo) {
|
SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, tsdbReaderT pDataReader,
|
||||||
|
SReadHandle* readHandle, SExecTaskInfo* pTaskInfo) {
|
||||||
STableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableScanInfo));
|
STableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableScanInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
@ -498,7 +499,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
||||||
SDataBlockDescNode* pDescNode = pTableScanNode->scan.node.pOutputDataBlockDesc;
|
SDataBlockDescNode* pDescNode = pTableScanNode->scan.node.pOutputDataBlockDesc;
|
||||||
|
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
SArray* pColList = extractColMatchInfo(pTableScanNode->scan.pScanCols, pDescNode, &numOfCols, pTaskInfo, COL_MATCH_FROM_COL_ID);
|
SArray* pColList =
|
||||||
|
extractColMatchInfo(pTableScanNode->scan.pScanCols, pDescNode, &numOfCols, pTaskInfo, COL_MATCH_FROM_COL_ID);
|
||||||
|
|
||||||
int32_t code = initQueryTableDataCond(&pInfo->cond, pTableScanNode);
|
int32_t code = initQueryTableDataCond(&pInfo->cond, pTableScanNode);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -531,7 +533,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
||||||
pOperator->numOfExprs = numOfCols;
|
pOperator->numOfExprs = numOfCols;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScan, NULL, NULL, destroyTableScanOperatorInfo, NULL, NULL, getTableScannerExecInfo);
|
pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScan, NULL, NULL, destroyTableScanOperatorInfo,
|
||||||
|
NULL, NULL, getTableScannerExecInfo);
|
||||||
|
|
||||||
// for non-blocking operator, the open cost is always 0
|
// for non-blocking operator, the open cost is always 0
|
||||||
pOperator->cost.openCost = 0;
|
pOperator->cost.openCost = 0;
|
||||||
|
@ -649,9 +652,7 @@ static void doClearBufferedBlocks(SStreamBlockScanInfo* pInfo) {
|
||||||
taosArrayClear(pInfo->pBlockLists);
|
taosArrayClear(pInfo->pBlockLists);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isSessionWindow(SStreamBlockScanInfo* pInfo) {
|
static bool isSessionWindow(SStreamBlockScanInfo* pInfo) { return pInfo->sessionSup.pStreamAggSup != NULL; }
|
||||||
return pInfo->sessionSup.pStreamAggSup != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool prepareDataScan(SStreamBlockScanInfo* pInfo) {
|
static bool prepareDataScan(SStreamBlockScanInfo* pInfo) {
|
||||||
SSDataBlock* pSDB = pInfo->pUpdateRes;
|
SSDataBlock* pSDB = pInfo->pUpdateRes;
|
||||||
|
@ -665,16 +666,16 @@ static bool prepareDataScan(SStreamBlockScanInfo* pInfo) {
|
||||||
SStreamAggSupporter* pAggSup = pInfo->sessionSup.pStreamAggSup;
|
SStreamAggSupporter* pAggSup = pInfo->sessionSup.pStreamAggSup;
|
||||||
int64_t gap = pInfo->sessionSup.gap;
|
int64_t gap = pInfo->sessionSup.gap;
|
||||||
int32_t winIndex = 0;
|
int32_t winIndex = 0;
|
||||||
SResultWindowInfo* pCurWin = getSessionTimeWindow(pAggSup->pResultRows,
|
SResultWindowInfo* pCurWin =
|
||||||
tsCols[pInfo->updateResIndex], gap, &winIndex);
|
getSessionTimeWindow(pAggSup->pResultRows, tsCols[pInfo->updateResIndex], gap, &winIndex);
|
||||||
win = pCurWin->win;
|
win = pCurWin->win;
|
||||||
pInfo->updateResIndex += updateSessionWindowInfo(pCurWin, tsCols, pSDB->info.rows,
|
pInfo->updateResIndex +=
|
||||||
pInfo->updateResIndex, gap, NULL);
|
updateSessionWindowInfo(pCurWin, tsCols, pSDB->info.rows, pInfo->updateResIndex, gap, NULL);
|
||||||
} else {
|
} else {
|
||||||
win = getActiveTimeWindow(NULL, &dumyInfo, tsCols[pInfo->updateResIndex],
|
win = getActiveTimeWindow(NULL, &dumyInfo, tsCols[pInfo->updateResIndex], &pInfo->interval,
|
||||||
&pInfo->interval, pInfo->interval.precision, NULL);
|
pInfo->interval.precision, NULL);
|
||||||
pInfo->updateResIndex += getNumOfRowsInTimeWindow(&pSDB->info, tsCols, pInfo->updateResIndex,
|
pInfo->updateResIndex += getNumOfRowsInTimeWindow(&pSDB->info, tsCols, pInfo->updateResIndex, win.ekey,
|
||||||
win.ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC);
|
binarySearchForKey, NULL, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
STableScanInfo* pTableScanInfo = pInfo->pOperatorDumy->info;
|
STableScanInfo* pTableScanInfo = pInfo->pOperatorDumy->info;
|
||||||
pTableScanInfo->cond.twindow = win;
|
pTableScanInfo->cond.twindow = win;
|
||||||
|
@ -737,18 +738,16 @@ void static setSupKeyBuf(SCatchSupporter* pSup, int64_t groupId, int64_t childId
|
||||||
pKey[2] = ts;
|
pKey[2] = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t catchWidonwInfo(SSDataBlock* pDataBlock, SCatchSupporter* pSup,
|
static int32_t catchWidonwInfo(SSDataBlock* pDataBlock, SCatchSupporter* pSup, int32_t pageId, int32_t tsIndex,
|
||||||
int32_t pageId, int32_t tsIndex, int64_t childId) {
|
int64_t childId) {
|
||||||
SColumnInfoData* pColDataInfo = taosArrayGet(pDataBlock->pDataBlock, tsIndex);
|
SColumnInfoData* pColDataInfo = taosArrayGet(pDataBlock->pDataBlock, tsIndex);
|
||||||
TSKEY* tsCols = (int64_t*)pColDataInfo->pData;
|
TSKEY* tsCols = (int64_t*)pColDataInfo->pData;
|
||||||
for (int32_t i = 0; i < pDataBlock->info.rows; i++) {
|
for (int32_t i = 0; i < pDataBlock->info.rows; i++) {
|
||||||
setSupKeyBuf(pSup, pDataBlock->info.groupId, childId, tsCols[i]);
|
setSupKeyBuf(pSup, pDataBlock->info.groupId, childId, tsCols[i]);
|
||||||
SWindowPosition* p1 = (SWindowPosition*)taosHashGet(pSup->pWindowHashTable,
|
SWindowPosition* p1 = (SWindowPosition*)taosHashGet(pSup->pWindowHashTable, pSup->pKeyBuf, pSup->keySize);
|
||||||
pSup->pKeyBuf, pSup->keySize);
|
|
||||||
if (p1 == NULL) {
|
if (p1 == NULL) {
|
||||||
SWindowPosition pos = {.pageId = pageId, .rowId = i};
|
SWindowPosition pos = {.pageId = pageId, .rowId = i};
|
||||||
int32_t code = taosHashPut(pSup->pWindowHashTable, pSup->pKeyBuf, pSup->keySize, &pos,
|
int32_t code = taosHashPut(pSup->pWindowHashTable, pSup->pKeyBuf, pSup->keySize, &pos, sizeof(SWindowPosition));
|
||||||
sizeof(SWindowPosition));
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -760,8 +759,7 @@ static int32_t catchWidonwInfo(SSDataBlock* pDataBlock, SCatchSupporter* pSup,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t catchDatablock(SSDataBlock* pDataBlock, SCatchSupporter* pSup,
|
static int32_t catchDatablock(SSDataBlock* pDataBlock, SCatchSupporter* pSup, int32_t tsIndex, int64_t childId) {
|
||||||
int32_t tsIndex, int64_t childId) {
|
|
||||||
int32_t start = 0;
|
int32_t start = 0;
|
||||||
int32_t stop = 0;
|
int32_t stop = 0;
|
||||||
int32_t pageSize = getBufPageSize(pSup->pDataBuf);
|
int32_t pageSize = getBufPageSize(pSup->pDataBuf);
|
||||||
|
@ -802,10 +800,8 @@ static SSDataBlock* getDataFromCatch(SStreamBlockScanInfo* pInfo) {
|
||||||
int32_t size = taosArrayGetSize(pInfo->childIds);
|
int32_t size = taosArrayGetSize(pInfo->childIds);
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
int64_t id = *(int64_t*)taosArrayGet(pInfo->childIds, i);
|
int64_t id = *(int64_t*)taosArrayGet(pInfo->childIds, i);
|
||||||
setSupKeyBuf(pCSup, pBlock->info.groupId, id,
|
setSupKeyBuf(pCSup, pBlock->info.groupId, id, tsCols[pInfo->updateResIndex]);
|
||||||
tsCols[pInfo->updateResIndex]);
|
SWindowPosition* pos = (SWindowPosition*)taosHashGet(pCSup->pWindowHashTable, pCSup->pKeyBuf, pCSup->keySize);
|
||||||
SWindowPosition* pos = (SWindowPosition*)taosHashGet(pCSup->pWindowHashTable,
|
|
||||||
pCSup->pKeyBuf, pCSup->keySize);
|
|
||||||
void* buf = getBufPage(pCSup->pDataBuf, pos->pageId);
|
void* buf = getBufPage(pCSup->pDataBuf, pos->pageId);
|
||||||
SSDataBlock* pDB = createOneDataBlock(pInfo->pRes, false);
|
SSDataBlock* pDB = createOneDataBlock(pInfo->pRes, false);
|
||||||
blockDataFromBuf(pDB, buf);
|
blockDataFromBuf(pDB, buf);
|
||||||
|
@ -833,15 +829,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
size_t total = taosArrayGetSize(pInfo->pBlockLists);
|
size_t total = taosArrayGetSize(pInfo->pBlockLists);
|
||||||
if (pInfo->blockType == STREAM_DATA_TYPE_SSDATA_BLOCK) {
|
if (pInfo->blockType == STREAM_DATA_TYPE_SSDATA_BLOCK) {
|
||||||
if (pInfo->scanMode == STREAM_SCAN_FROM_UPDATERES) {
|
|
||||||
SSDataBlock* pDB = getDataFromCatch(pInfo);
|
|
||||||
if (pDB != NULL) {
|
|
||||||
return pDB;
|
|
||||||
} else {
|
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pInfo->validBlockIndex >= total) {
|
if (pInfo->validBlockIndex >= total) {
|
||||||
doClearBufferedBlocks(pInfo);
|
doClearBufferedBlocks(pInfo);
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
|
@ -849,17 +836,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t current = pInfo->validBlockIndex++;
|
int32_t current = pInfo->validBlockIndex++;
|
||||||
SSDataBlock* pBlock = taosArrayGetP(pInfo->pBlockLists, current);
|
return taosArrayGetP(pInfo->pBlockLists, current);
|
||||||
if (pBlock->info.type == STREAM_REPROCESS) {
|
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_UPDATERES;
|
|
||||||
} else {
|
|
||||||
int32_t code = catchDatablock(pBlock, &pInfo->childAggSup, pInfo->primaryTsIndex, 0);
|
|
||||||
if (code != TDB_CODE_SUCCESS) {
|
|
||||||
pTaskInfo->code = code;
|
|
||||||
longjmp(pTaskInfo->env, code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pBlock;
|
|
||||||
} else {
|
} else {
|
||||||
if (pInfo->scanMode == STREAM_SCAN_FROM_RES) {
|
if (pInfo->scanMode == STREAM_SCAN_FROM_RES) {
|
||||||
blockDataDestroy(pInfo->pUpdateRes);
|
blockDataDestroy(pInfo->pUpdateRes);
|
||||||
|
@ -1023,7 +1000,8 @@ SOperatorInfo* createStreamScanOperatorInfo(void* streamReadHandle, void* pDataR
|
||||||
pInfo->interval = pSTInfo->interval;
|
pInfo->interval = pSTInfo->interval;
|
||||||
pInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = NULL, .gap = -1};
|
pInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = NULL, .gap = -1};
|
||||||
|
|
||||||
initCatchSupporter(&pInfo->childAggSup, 1024, "StreamFinalInterval", "/tmp/"); // TODO(liuyao) get row size from phy plan
|
initCacheSupporter(&pInfo->childAggSup, 1024, "StreamFinalInterval",
|
||||||
|
"/tmp/"); // TODO(liuyao) get row size from phy plan
|
||||||
|
|
||||||
pOperator->name = "StreamBlockScanOperator";
|
pOperator->name = "StreamBlockScanOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
||||||
|
@ -1296,7 +1274,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
// number of columns
|
// number of columns
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
||||||
colDataAppend(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schema.nCols, false);
|
colDataAppend(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
|
||||||
|
|
||||||
// super table name
|
// super table name
|
||||||
STR_TO_VARSTR(str, mr.me.name);
|
STR_TO_VARSTR(str, mr.me.name);
|
||||||
|
@ -1320,7 +1298,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
// number of columns
|
// number of columns
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
||||||
colDataAppend(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schema.nCols, false);
|
colDataAppend(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
|
||||||
|
|
||||||
// super table name
|
// super table name
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 4);
|
pColInfoData = taosArrayGet(p->pDataBlock, 4);
|
||||||
|
|
|
@ -1067,7 +1067,8 @@ void doClearWindow(SAggSupporter* pSup, SOptrBasicInfo* pBinfo, char* pData,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doClearWindows(SAggSupporter* pSup, SOptrBasicInfo* pBinfo,
|
static void doClearWindows(SAggSupporter* pSup, SOptrBasicInfo* pBinfo,
|
||||||
SInterval* pIntrerval, int32_t tsIndex, int32_t numOfOutput, SSDataBlock* pBlock) {
|
SInterval* pIntrerval, int32_t tsIndex, int32_t numOfOutput, SSDataBlock* pBlock,
|
||||||
|
SArray* pUpWins) {
|
||||||
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
|
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
|
||||||
TSKEY *tsCols = (TSKEY*)pColDataInfo->pData;
|
TSKEY *tsCols = (TSKEY*)pColDataInfo->pData;
|
||||||
int32_t step = 0;
|
int32_t step = 0;
|
||||||
|
@ -1079,6 +1080,9 @@ static void doClearWindows(SAggSupporter* pSup, SOptrBasicInfo* pBinfo,
|
||||||
step = getNumOfRowsInTimeWindow(&pBlock->info, tsCols, i,
|
step = getNumOfRowsInTimeWindow(&pBlock->info, tsCols, i,
|
||||||
win.ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC);
|
win.ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC);
|
||||||
doClearWindow(pSup, pBinfo, (char*)&win.skey, sizeof(TKEY), pBlock->info.groupId, numOfOutput);
|
doClearWindow(pSup, pBinfo, (char*)&win.skey, sizeof(TKEY), pBlock->info.groupId, numOfOutput);
|
||||||
|
if (pUpWins) {
|
||||||
|
taosArrayPush(pUpWins, &win);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1119,7 +1123,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
if (pBlock->info.type == STREAM_REPROCESS) {
|
if (pBlock->info.type == STREAM_REPROCESS) {
|
||||||
doClearWindows(&pInfo->aggSup, &pInfo->binfo, &pInfo->interval, 0,
|
doClearWindows(&pInfo->aggSup, &pInfo->binfo, &pInfo->interval, 0,
|
||||||
pOperator->numOfExprs, pBlock);
|
pOperator->numOfExprs, pBlock, NULL);
|
||||||
qDebug("%s clear existed time window results for updates checked", GET_TASKID(pTaskInfo));
|
qDebug("%s clear existed time window results for updates checked", GET_TASKID(pTaskInfo));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1154,6 +1158,15 @@ void destroyStreamFinalIntervalOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
SStreamFinalIntervalOperatorInfo* pInfo = (SStreamFinalIntervalOperatorInfo *)param;
|
SStreamFinalIntervalOperatorInfo* pInfo = (SStreamFinalIntervalOperatorInfo *)param;
|
||||||
doDestroyBasicInfo(&pInfo->binfo, numOfOutput);
|
doDestroyBasicInfo(&pInfo->binfo, numOfOutput);
|
||||||
cleanupAggSup(&pInfo->aggSup);
|
cleanupAggSup(&pInfo->aggSup);
|
||||||
|
if (pInfo->pChildren) {
|
||||||
|
int32_t size = taosArrayGetSize(pInfo->pChildren);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, i);
|
||||||
|
destroyIntervalOperatorInfo(pChildOp->info, numOfOutput);
|
||||||
|
taosMemoryFreeClear(pChildOp->info);
|
||||||
|
taosMemoryFreeClear(pChildOp);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool allInvertible(SqlFunctionCtx* pFCtx, int32_t numOfCols) {
|
bool allInvertible(SqlFunctionCtx* pFCtx, int32_t numOfCols) {
|
||||||
|
@ -1228,32 +1241,38 @@ _error:
|
||||||
|
|
||||||
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
||||||
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
|
||||||
STimeWindowAggSupp* pTwAggSupp, const STableGroupInfo* pTableGroupInfo,
|
STimeWindowAggSupp* pTwAggSupp, SExecTaskInfo* pTaskInfo) {
|
||||||
SExecTaskInfo* pTaskInfo) {
|
|
||||||
SStreamFinalIntervalOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFinalIntervalOperatorInfo));
|
SStreamFinalIntervalOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFinalIntervalOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->order = TSDB_ORDER_ASC;
|
pInfo->order = TSDB_ORDER_ASC;
|
||||||
pInfo->interval = *pInterval;
|
pInfo->interval = *pInterval;
|
||||||
pInfo->twAggSup = *pTwAggSupp;
|
pInfo->twAggSup = *pTwAggSupp;
|
||||||
pInfo->primaryTsIndex = primaryTsSlotId;
|
pInfo->primaryTsIndex = primaryTsSlotId;
|
||||||
|
|
||||||
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
|
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
|
||||||
initResultSizeInfo(pOperator, 4096);
|
initResultSizeInfo(pOperator, 4096);
|
||||||
|
|
||||||
int32_t code =
|
int32_t code =
|
||||||
initAggInfo(&pInfo->binfo, &pInfo->aggSup, pExprInfo, numOfCols, pResBlock,
|
initAggInfo(&pInfo->binfo, &pInfo->aggSup, pExprInfo, numOfCols, pResBlock,
|
||||||
keyBufSize, pTaskInfo->id.str);
|
keyBufSize, pTaskInfo->id.str);
|
||||||
|
|
||||||
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
|
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
initResultRowInfo(&pInfo->binfo.resultRowInfo, (int32_t)1);
|
initResultRowInfo(&pInfo->binfo.resultRowInfo, (int32_t)1);
|
||||||
|
int32_t numOfChild = 8;// Todo(liuyao) get it from phy plan
|
||||||
|
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(SOperatorInfo));
|
||||||
|
for (int32_t i = 0; i < numOfChild; i++) {
|
||||||
|
SSDataBlock* chRes = createOneDataBlock(pResBlock, false);
|
||||||
|
SOperatorInfo* pChildOp = createIntervalOperatorInfo(NULL, pExprInfo, numOfCols,
|
||||||
|
chRes, pInterval, primaryTsSlotId, pTwAggSupp, NULL, pTaskInfo);
|
||||||
|
if (pChildOp && chRes) {
|
||||||
|
taosArrayPush(pInfo->pChildren, &pChildOp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
pOperator->name = "StreamFinalIntervalOperator";
|
pOperator->name = "StreamFinalIntervalOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL;
|
||||||
|
@ -1703,6 +1722,51 @@ static SArray* doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataB
|
||||||
return pUpdated;
|
return pUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isFinalInterval(SStreamFinalIntervalOperatorInfo* pInfo) {
|
||||||
|
return pInfo->pChildren != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx,
|
||||||
|
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
|
for (int32_t k = 0; k < numOfOutput; ++k) {
|
||||||
|
if (fmIsWindowPseudoColumnFunc(pDestCtx[k].functionId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) {
|
||||||
|
code = pDestCtx[k].fpSet.combine(&pDestCtx[k], &pSourceCtx[k]);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s apply functions error, code: %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
||||||
|
pTaskInfo->code = code;
|
||||||
|
longjmp(pTaskInfo->env, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SArray *pWinArray,
|
||||||
|
int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
|
int32_t size = taosArrayGetSize(pWinArray);
|
||||||
|
ASSERT(pInfo->pChildren);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
|
||||||
|
SResultRow* pCurResult = NULL;
|
||||||
|
setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, pParentWin, true, &pCurResult, 0,
|
||||||
|
pInfo->binfo.pCtx, numOfOutput, pInfo->binfo.rowCellInfoOffset, &pInfo->aggSup,
|
||||||
|
pTaskInfo);
|
||||||
|
int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren);
|
||||||
|
for (int32_t j = 0; j < numOfChildren; j++) {
|
||||||
|
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, j);
|
||||||
|
SIntervalAggOperatorInfo* pChInfo = pChildOp->info;
|
||||||
|
SResultRow* pChResult = NULL;
|
||||||
|
setTimeWindowOutputBuf(&pChInfo->binfo.resultRowInfo, pParentWin, true, &pChResult,
|
||||||
|
0, pChInfo->binfo.pCtx, pChildOp->numOfExprs, pChInfo->binfo.rowCellInfoOffset,
|
||||||
|
&pChInfo->aggSup, pTaskInfo);
|
||||||
|
compactFunctions(pInfo->binfo.pCtx, pChInfo->binfo.pCtx, numOfOutput, pTaskInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info;
|
SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info;
|
||||||
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
||||||
|
@ -1726,10 +1790,26 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
setInputDataBlock(pOperator, pInfo->binfo.pCtx, pBlock, pInfo->order, MAIN_SCAN, true);
|
setInputDataBlock(pOperator, pInfo->binfo.pCtx, pBlock, pInfo->order, MAIN_SCAN, true);
|
||||||
if (pBlock->info.type == STREAM_REPROCESS) {
|
if (pBlock->info.type == STREAM_REPROCESS) {
|
||||||
|
SArray *pUpWins = taosArrayInit(8, sizeof(STimeWindow));
|
||||||
doClearWindows(&pInfo->aggSup, &pInfo->binfo, &pInfo->interval,
|
doClearWindows(&pInfo->aggSup, &pInfo->binfo, &pInfo->interval,
|
||||||
pInfo->primaryTsIndex, pOperator->numOfExprs, pBlock);
|
pInfo->primaryTsIndex, pOperator->numOfExprs, pBlock, pUpWins);
|
||||||
|
if (isFinalInterval(pInfo)) {
|
||||||
|
int32_t childIndex = 0; //Todo(liuyao) get child id from SSDataBlock
|
||||||
|
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
|
||||||
|
SIntervalAggOperatorInfo* pChildInfo = pChildOp->info;
|
||||||
|
doClearWindows(&pChildInfo->aggSup, &pChildInfo->binfo, &pChildInfo->interval,
|
||||||
|
pChildInfo->primaryTsIndex, pChildOp->numOfExprs, pBlock, NULL);
|
||||||
|
rebuildIntervalWindow(pInfo, pUpWins, pInfo->binfo.pRes->info.groupId,
|
||||||
|
pOperator->numOfExprs, pOperator->pTaskInfo);
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pUpWins);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (isFinalInterval(pInfo)) {
|
||||||
|
int32_t chIndex = 1; //Todo(liuyao) get it from SSDataBlock
|
||||||
|
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex);
|
||||||
|
doStreamIntervalAgg(pChildOp);
|
||||||
|
}
|
||||||
pUpdated = doHashInterval(pOperator, pBlock, 0);
|
pUpdated = doHashInterval(pOperator, pBlock, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1752,6 +1832,16 @@ void destroyStreamSessionAggOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
doDestroyBasicInfo(&pInfo->binfo, numOfOutput);
|
doDestroyBasicInfo(&pInfo->binfo, numOfOutput);
|
||||||
destroyStreamAggSupporter(&pInfo->streamAggSup);
|
destroyStreamAggSupporter(&pInfo->streamAggSup);
|
||||||
cleanupGroupResInfo(&pInfo->groupResInfo);
|
cleanupGroupResInfo(&pInfo->groupResInfo);
|
||||||
|
if (pInfo->pChildren != NULL) {
|
||||||
|
int32_t size = taosArrayGetSize(pInfo->pChildren);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
SOperatorInfo *pChild = taosArrayGetP(pInfo->pChildren, i);
|
||||||
|
SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
|
||||||
|
destroyStreamSessionAggOperatorInfo(pChInfo, numOfOutput);
|
||||||
|
taosMemoryFreeClear(pChild);
|
||||||
|
taosMemoryFreeClear(pChInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t initBiasicInfo(SOptrBasicInfo* pBasicInfo, SExprInfo* pExprInfo,
|
int32_t initBiasicInfo(SOptrBasicInfo* pBasicInfo, SExprInfo* pExprInfo,
|
||||||
|
@ -1780,6 +1870,7 @@ void initDownStream(SOperatorInfo* downstream, SStreamSessionAggOperatorInfo* pI
|
||||||
SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream,
|
SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream,
|
||||||
SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, int64_t gap,
|
SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, int64_t gap,
|
||||||
int32_t tsSlotId, STimeWindowAggSupp* pTwAggSupp, SExecTaskInfo* pTaskInfo) {
|
int32_t tsSlotId, STimeWindowAggSupp* pTwAggSupp, SExecTaskInfo* pTaskInfo) {
|
||||||
|
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
SStreamSessionAggOperatorInfo* pInfo =
|
SStreamSessionAggOperatorInfo* pInfo =
|
||||||
taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
|
taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
|
@ -1789,7 +1880,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream,
|
||||||
|
|
||||||
initResultSizeInfo(pOperator, 4096);
|
initResultSizeInfo(pOperator, 4096);
|
||||||
|
|
||||||
int32_t code = initStreamAggSupporter(&pInfo->streamAggSup, "StreamSessionAggOperatorInfo");
|
code = initStreamAggSupporter(&pInfo->streamAggSup, "StreamSessionAggOperatorInfo");
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -1820,6 +1911,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream,
|
||||||
pInfo->pDelIterator = NULL;
|
pInfo->pDelIterator = NULL;
|
||||||
pInfo->pDelRes = createOneDataBlock(pResBlock, false);
|
pInfo->pDelRes = createOneDataBlock(pResBlock, false);
|
||||||
blockDataEnsureCapacity(pInfo->pDelRes, 64);
|
blockDataEnsureCapacity(pInfo->pDelRes, 64);
|
||||||
|
pInfo->pChildren = NULL;
|
||||||
|
|
||||||
pOperator->name = "StreamSessionWindowAggOperator";
|
pOperator->name = "StreamSessionWindowAggOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION_WINDOW;
|
||||||
|
@ -2068,24 +2160,6 @@ int32_t getNumCompactWindow(SArray* pWinInfos, int32_t startIndex, int64_t gap)
|
||||||
return size - startIndex - 1;
|
return size - startIndex - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx,
|
|
||||||
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
|
||||||
for (int32_t k = 0; k < numOfOutput; ++k) {
|
|
||||||
if (fmIsWindowPseudoColumnFunc(pDestCtx[k].functionId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
|
||||||
if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) {
|
|
||||||
code = pDestCtx[k].fpSet.combine(&pDestCtx[k], &pSourceCtx[k]);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
qError("%s apply functions error, code: %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
|
||||||
pTaskInfo->code = code;
|
|
||||||
longjmp(pTaskInfo->env, code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void compactTimeWindow(SStreamSessionAggOperatorInfo* pInfo, int32_t startIndex, int32_t num,
|
void compactTimeWindow(SStreamSessionAggOperatorInfo* pInfo, int32_t startIndex, int32_t num,
|
||||||
int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo, SHashObj* pStUpdated, SHashObj* pStDeleted) {
|
int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo, SHashObj* pStUpdated, SHashObj* pStDeleted) {
|
||||||
SResultWindowInfo* pCurWin = taosArrayGet(pInfo->streamAggSup.pResultRows, startIndex);
|
SResultWindowInfo* pCurWin = taosArrayGet(pInfo->streamAggSup.pResultRows, startIndex);
|
||||||
|
@ -2164,7 +2238,7 @@ static void doStreamSessionWindowAggImpl(SOperatorInfo* pOperator,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SOptrBasicInfo* pBinfo,
|
static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SOptrBasicInfo* pBinfo,
|
||||||
SSDataBlock* pBlock, int32_t tsIndex, int32_t numOfOutput, int64_t gap) {
|
SSDataBlock* pBlock, int32_t tsIndex, int32_t numOfOutput, int64_t gap, SArray* result) {
|
||||||
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
|
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
|
||||||
TSKEY *tsCols = (TSKEY*)pColDataInfo->pData;
|
TSKEY *tsCols = (TSKEY*)pColDataInfo->pData;
|
||||||
int32_t step = 0;
|
int32_t step = 0;
|
||||||
|
@ -2173,7 +2247,11 @@ static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SOptrBasicInfo*
|
||||||
SResultWindowInfo* pCurWin =
|
SResultWindowInfo* pCurWin =
|
||||||
getSessionTimeWindow(pAggSup->pResultRows, tsCols[i], gap, &winIndex);
|
getSessionTimeWindow(pAggSup->pResultRows, tsCols[i], gap, &winIndex);
|
||||||
step = updateSessionWindowInfo(pCurWin, tsCols, pBlock->info.rows, i, gap, NULL);
|
step = updateSessionWindowInfo(pCurWin, tsCols, pBlock->info.rows, i, gap, NULL);
|
||||||
|
ASSERT(isInWindow(pCurWin, tsCols[i], gap));
|
||||||
doClearWindowImpl(&pCurWin->pos, pAggSup->pResultBuf, pBinfo, numOfOutput);
|
doClearWindowImpl(&pCurWin->pos, pAggSup->pResultBuf, pBinfo, numOfOutput);
|
||||||
|
if (result) {
|
||||||
|
taosArrayPush(result, pCurWin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2215,6 +2293,42 @@ void doBuildDeleteDataBlock(SHashObj* pStDeleted, SSDataBlock* pBlock, void** It
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray *pWinArray,
|
||||||
|
int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
|
int32_t size = taosArrayGetSize(pWinArray);
|
||||||
|
ASSERT(pInfo->pChildren);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
SResultWindowInfo* pParentWin = taosArrayGet(pWinArray, i);
|
||||||
|
SResultRow* pCurResult = NULL;
|
||||||
|
setWindowOutputBuf(pParentWin, &pCurResult, pInfo->binfo.pCtx, groupId,
|
||||||
|
numOfOutput, pInfo->binfo.rowCellInfoOffset, &pInfo->streamAggSup, pTaskInfo);
|
||||||
|
int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren);
|
||||||
|
for (int32_t j = 0; j < numOfChildren; j++) {
|
||||||
|
SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, j);
|
||||||
|
SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
|
||||||
|
SArray* pChWins = pChInfo->streamAggSup.pResultRows;
|
||||||
|
int32_t chWinSize = taosArrayGetSize(pChWins);
|
||||||
|
int32_t index = binarySearch(pChWins, chWinSize, pParentWin->win.skey,
|
||||||
|
TSDB_ORDER_DESC, getSessionWindowEndkey);
|
||||||
|
for (int32_t k = index; k > 0 && k < chWinSize; k++) {
|
||||||
|
SResultWindowInfo* pcw = taosArrayGet(pChWins, k);
|
||||||
|
if (pParentWin->win.skey <= pcw->win.skey && pcw->win.ekey <= pParentWin->win.ekey) {
|
||||||
|
SResultRow* pChResult = NULL;
|
||||||
|
setWindowOutputBuf(pcw, &pChResult, pChInfo->binfo.pCtx, groupId,
|
||||||
|
numOfOutput, pChInfo->binfo.rowCellInfoOffset, &pChInfo->streamAggSup, pTaskInfo);
|
||||||
|
compactFunctions(pInfo->binfo.pCtx, pChInfo->binfo.pCtx, numOfOutput, pTaskInfo);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isFinalSession(SStreamSessionAggOperatorInfo* pInfo) {
|
||||||
|
return pInfo->pChildren != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static SSDataBlock* doStreamSessionWindowAgg(SOperatorInfo* pOperator) {
|
static SSDataBlock* doStreamSessionWindowAgg(SOperatorInfo* pOperator) {
|
||||||
if (pOperator->status == OP_EXEC_DONE) {
|
if (pOperator->status == OP_EXEC_DONE) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2247,10 +2361,25 @@ static SSDataBlock* doStreamSessionWindowAgg(SOperatorInfo* pOperator) {
|
||||||
// the pDataBlock are always the same one, no need to call this again
|
// the pDataBlock are always the same one, no need to call this again
|
||||||
setInputDataBlock(pOperator, pBInfo->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
|
setInputDataBlock(pOperator, pBInfo->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
|
||||||
if (pBlock->info.type == STREAM_REPROCESS) {
|
if (pBlock->info.type == STREAM_REPROCESS) {
|
||||||
|
SArray *pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
|
||||||
doClearSessionWindows(&pInfo->streamAggSup, &pInfo->binfo, pBlock, 0,
|
doClearSessionWindows(&pInfo->streamAggSup, &pInfo->binfo, pBlock, 0,
|
||||||
pOperator->numOfExprs, pInfo->gap);
|
pOperator->numOfExprs, pInfo->gap, pWins);
|
||||||
|
if (isFinalSession(pInfo)) {
|
||||||
|
int32_t childIndex = 0; //Todo(liuyao) get child id from SSDataBlock
|
||||||
|
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
|
||||||
|
SStreamSessionAggOperatorInfo* pChildInfo = pChildOp->info;
|
||||||
|
doClearSessionWindows(&pChildInfo->streamAggSup, &pChildInfo->binfo, pBlock, 0,
|
||||||
|
pChildOp->numOfExprs, pChildInfo->gap, NULL);
|
||||||
|
rebuildTimeWindow(pInfo, pWins, pInfo->binfo.pRes->info.groupId, pOperator->numOfExprs, pOperator->pTaskInfo);
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pWins);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (isFinalSession(pInfo)) {
|
||||||
|
int32_t childIndex = 0; //Todo(liuyao) get child id from SSDataBlock
|
||||||
|
SOptrBasicInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
|
||||||
|
doStreamSessionWindowAggImpl(pOperator, pBlock, NULL, NULL);
|
||||||
|
}
|
||||||
doStreamSessionWindowAggImpl(pOperator, pBlock, pStUpdated, pInfo->pStDeleted);
|
doStreamSessionWindowAggImpl(pOperator, pBlock, pStUpdated, pInfo->pStDeleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2271,3 +2400,39 @@ static SSDataBlock* doStreamSessionWindowAgg(SOperatorInfo* pOperator) {
|
||||||
pInfo->streamAggSup.pResultBuf);
|
pInfo->streamAggSup.pResultBuf);
|
||||||
return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
|
return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream,
|
||||||
|
SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, int64_t gap,
|
||||||
|
int32_t tsSlotId, STimeWindowAggSupp* pTwAggSupp, SExecTaskInfo* pTaskInfo) {
|
||||||
|
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
SStreamSessionAggOperatorInfo* pInfo = NULL;
|
||||||
|
SOperatorInfo* pOperator = createStreamSessionAggOperatorInfo(downstream, pExprInfo,
|
||||||
|
numOfCols, pResBlock, gap, tsSlotId, pTwAggSupp, pTaskInfo);
|
||||||
|
if (pOperator == NULL) {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
pOperator->name = "StreamFinalSessionWindowAggOperator";
|
||||||
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION_WINDOW;
|
||||||
|
int32_t numOfChild = 1; //Todo(liuyao) get it from phy plan
|
||||||
|
pInfo = pOperator->info;
|
||||||
|
pInfo->pChildren = taosArrayInit(8, sizeof(void *));
|
||||||
|
for (int32_t i = 0; i < numOfChild; i++) {
|
||||||
|
SOperatorInfo* pChild = createStreamSessionAggOperatorInfo(NULL, pExprInfo,
|
||||||
|
numOfCols, NULL, gap, tsSlotId, pTwAggSupp, pTaskInfo);
|
||||||
|
if (pChild == NULL) {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
taosArrayPush(pInfo->pChildren, &pChild);
|
||||||
|
}
|
||||||
|
return pOperator;
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (pInfo != NULL) {
|
||||||
|
destroyStreamSessionAggOperatorInfo(pInfo, numOfCols);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pInfo);
|
||||||
|
taosMemoryFreeClear(pOperator);
|
||||||
|
pTaskInfo->code = code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -610,7 +610,7 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
// Too long values will raise the invalid sql error message
|
// Too long values will raise the invalid sql error message
|
||||||
if (pToken->n + VARSTR_HEADER_SIZE > pSchema->bytes) {
|
if (pToken->n + VARSTR_HEADER_SIZE > pSchema->bytes) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "string data overflow", pToken->z);
|
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return func(pMsgBuf, pToken->z, pToken->n, param);
|
return func(pMsgBuf, pToken->z, pToken->n, param);
|
||||||
|
@ -658,6 +658,9 @@ static FORCE_INLINE int32_t MemRowAppend(SMsgBuf* pMsgBuf, const void* value, in
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
const char* rowEnd = tdRowEnd(rb->pBuf);
|
const char* rowEnd = tdRowEnd(rb->pBuf);
|
||||||
if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(rowEnd), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(rowEnd), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
|
if (errno == E2BIG) {
|
||||||
|
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pa->schema->name);
|
||||||
|
}
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
snprintf(buf, tListLen(buf), "%s", strerror(errno));
|
snprintf(buf, tListLen(buf), "%s", strerror(errno));
|
||||||
return buildSyntaxErrMsg(pMsgBuf, buf, value);
|
return buildSyntaxErrMsg(pMsgBuf, buf, value);
|
||||||
|
@ -771,6 +774,10 @@ static int32_t KvRowAppend(SMsgBuf* pMsgBuf, const void* value, int32_t len, voi
|
||||||
// if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long'
|
// if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long'
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(pa->buf), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(pa->buf), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
|
if (errno == E2BIG) {
|
||||||
|
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pa->schema->name);
|
||||||
|
}
|
||||||
|
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
||||||
return buildSyntaxErrMsg(pMsgBuf, buf, value);
|
return buildSyntaxErrMsg(pMsgBuf, buf, value);
|
||||||
|
|
|
@ -48,6 +48,7 @@ typedef struct SFullDatabaseName {
|
||||||
|
|
||||||
static int32_t translateSubquery(STranslateContext* pCxt, SNode* pNode);
|
static int32_t translateSubquery(STranslateContext* pCxt, SNode* pNode);
|
||||||
static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode);
|
static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode);
|
||||||
|
static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal);
|
||||||
|
|
||||||
static bool afterGroupBy(ESqlClause clause) { return clause > SQL_CLAUSE_GROUP_BY; }
|
static bool afterGroupBy(ESqlClause clause) { return clause > SQL_CLAUSE_GROUP_BY; }
|
||||||
|
|
||||||
|
@ -542,17 +543,18 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t parseTimeFromValueNode(SValueNode* pVal) {
|
static int32_t parseTimeFromValueNode(STranslateContext* pCxt, SValueNode* pVal) {
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pVal->node.resType.type)) {
|
if (IS_NUMERIC_TYPE(pVal->node.resType.type) || TSDB_DATA_TYPE_BOOL == pVal->node.resType.type) {
|
||||||
return TSDB_CODE_SUCCESS;
|
if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) {
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVal->node.resType.type)) {
|
return pCxt->errCode;
|
||||||
|
}
|
||||||
|
if (IS_UNSIGNED_NUMERIC_TYPE(pVal->node.resType.type)) {
|
||||||
pVal->datum.i = pVal->datum.u;
|
pVal->datum.i = pVal->datum.u;
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
} else if (IS_FLOAT_TYPE(pVal->node.resType.type)) {
|
} else if (IS_FLOAT_TYPE(pVal->node.resType.type)) {
|
||||||
pVal->datum.i = pVal->datum.d;
|
pVal->datum.i = pVal->datum.d;
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
} else if (TSDB_DATA_TYPE_BOOL == pVal->node.resType.type) {
|
} else if (TSDB_DATA_TYPE_BOOL == pVal->node.resType.type) {
|
||||||
pVal->datum.i = pVal->datum.b;
|
pVal->datum.i = pVal->datum.b;
|
||||||
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else if (IS_VAR_DATA_TYPE(pVal->node.resType.type) || TSDB_DATA_TYPE_TIMESTAMP == pVal->node.resType.type) {
|
} else if (IS_VAR_DATA_TYPE(pVal->node.resType.type) || TSDB_DATA_TYPE_TIMESTAMP == pVal->node.resType.type) {
|
||||||
if (TSDB_CODE_SUCCESS == taosParseTime(pVal->literal, &pVal->datum.i, pVal->node.resType.bytes,
|
if (TSDB_CODE_SUCCESS == taosParseTime(pVal->literal, &pVal->datum.i, pVal->node.resType.bytes,
|
||||||
|
@ -588,62 +590,52 @@ static EDealRes translateValueImpl(STranslateContext* pCxt, SValueNode* pVal, SD
|
||||||
*(bool*)&pVal->typeData = pVal->datum.b;
|
*(bool*)&pVal->typeData = pVal->datum.b;
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.i = taosStr2Int64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.i = taosStr2Int64(pVal->literal, &endPtr, 10);
|
|
||||||
*(int8_t*)&pVal->typeData = pVal->datum.i;
|
*(int8_t*)&pVal->typeData = pVal->datum.i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.i = taosStr2Int64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.i = taosStr2Int64(pVal->literal, &endPtr, 10);
|
|
||||||
*(int16_t*)&pVal->typeData = pVal->datum.i;
|
*(int16_t*)&pVal->typeData = pVal->datum.i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.i = taosStr2Int64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.i = taosStr2Int64(pVal->literal, &endPtr, 10);
|
|
||||||
*(int32_t*)&pVal->typeData = pVal->datum.i;
|
*(int32_t*)&pVal->typeData = pVal->datum.i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.i = taosStr2Int64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.i = taosStr2Int64(pVal->literal, &endPtr, 10);
|
|
||||||
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.u = taosStr2UInt64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.u = taosStr2UInt64(pVal->literal, &endPtr, 10);
|
|
||||||
*(uint8_t*)&pVal->typeData = pVal->datum.u;
|
*(uint8_t*)&pVal->typeData = pVal->datum.u;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.u = taosStr2UInt64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.u = taosStr2UInt64(pVal->literal, &endPtr, 10);
|
|
||||||
*(uint16_t*)&pVal->typeData = pVal->datum.u;
|
*(uint16_t*)&pVal->typeData = pVal->datum.u;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.u = taosStr2UInt64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.u = taosStr2UInt64(pVal->literal, &endPtr, 10);
|
|
||||||
*(uint32_t*)&pVal->typeData = pVal->datum.u;
|
*(uint32_t*)&pVal->typeData = pVal->datum.u;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.u = taosStr2UInt64(pVal->literal, NULL, 10);
|
||||||
pVal->datum.u = taosStr2UInt64(pVal->literal, &endPtr, 10);
|
|
||||||
*(uint64_t*)&pVal->typeData = pVal->datum.u;
|
*(uint64_t*)&pVal->typeData = pVal->datum.u;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.d = taosStr2Double(pVal->literal, NULL);
|
||||||
pVal->datum.d = taosStr2Double(pVal->literal, &endPtr);
|
|
||||||
*(float*)&pVal->typeData = pVal->datum.d;
|
*(float*)&pVal->typeData = pVal->datum.d;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
char* endPtr = NULL;
|
pVal->datum.d = taosStr2Double(pVal->literal, NULL);
|
||||||
pVal->datum.d = taosStr2Double(pVal->literal, &endPtr);
|
|
||||||
*(double*)&pVal->typeData = pVal->datum.d;
|
*(double*)&pVal->typeData = pVal->datum.d;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -659,7 +651,7 @@ static EDealRes translateValueImpl(STranslateContext* pCxt, SValueNode* pVal, SD
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
if (TSDB_CODE_SUCCESS != parseTimeFromValueNode(pVal)) {
|
if (TSDB_CODE_SUCCESS != parseTimeFromValueNode(pCxt, pVal)) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
||||||
}
|
}
|
||||||
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
||||||
|
@ -2799,6 +2791,7 @@ static int32_t buildRollupAst(STranslateContext* pCxt, SCreateTableStmt* pStmt,
|
||||||
int32_t code = getDBCfg(pCxt, pStmt->dbName, &dbCfg);
|
int32_t code = getDBCfg(pCxt, pStmt->dbName, &dbCfg);
|
||||||
int32_t num = taosArrayGetSize(dbCfg.pRetensions);
|
int32_t num = taosArrayGetSize(dbCfg.pRetensions);
|
||||||
if (TSDB_CODE_SUCCESS != code || num < 2) {
|
if (TSDB_CODE_SUCCESS != code || num < 2) {
|
||||||
|
taosArrayDestroy(dbCfg.pRetensions);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
for (int32_t i = 1; i < num; ++i) {
|
for (int32_t i = 1; i < num; ++i) {
|
||||||
|
@ -3766,7 +3759,6 @@ static const char* getSysDbName(ENodeType type) {
|
||||||
case QUERY_NODE_SHOW_QNODES_STMT:
|
case QUERY_NODE_SHOW_QNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_FUNCTIONS_STMT:
|
case QUERY_NODE_SHOW_FUNCTIONS_STMT:
|
||||||
case QUERY_NODE_SHOW_INDEXES_STMT:
|
case QUERY_NODE_SHOW_INDEXES_STMT:
|
||||||
case QUERY_NODE_SHOW_STREAMS_STMT:
|
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_LICENCE_STMT:
|
case QUERY_NODE_SHOW_LICENCE_STMT:
|
||||||
|
@ -3775,6 +3767,7 @@ static const char* getSysDbName(ENodeType type) {
|
||||||
case QUERY_NODE_SHOW_CONNECTIONS_STMT:
|
case QUERY_NODE_SHOW_CONNECTIONS_STMT:
|
||||||
case QUERY_NODE_SHOW_QUERIES_STMT:
|
case QUERY_NODE_SHOW_QUERIES_STMT:
|
||||||
case QUERY_NODE_SHOW_TOPICS_STMT:
|
case QUERY_NODE_SHOW_TOPICS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_STREAMS_STMT:
|
||||||
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
||||||
return TSDB_PERFORMANCE_SCHEMA_DB;
|
return TSDB_PERFORMANCE_SCHEMA_DB;
|
||||||
default:
|
default:
|
||||||
|
@ -3808,7 +3801,7 @@ static const char* getSysTableName(ENodeType type) {
|
||||||
case QUERY_NODE_SHOW_INDEXES_STMT:
|
case QUERY_NODE_SHOW_INDEXES_STMT:
|
||||||
return TSDB_INS_TABLE_USER_INDEXES;
|
return TSDB_INS_TABLE_USER_INDEXES;
|
||||||
case QUERY_NODE_SHOW_STREAMS_STMT:
|
case QUERY_NODE_SHOW_STREAMS_STMT:
|
||||||
return TSDB_INS_TABLE_USER_STREAMS;
|
return TSDB_PERFS_TABLE_STREAMS;
|
||||||
case QUERY_NODE_SHOW_BNODES_STMT:
|
case QUERY_NODE_SHOW_BNODES_STMT:
|
||||||
return TSDB_INS_TABLE_BNODES;
|
return TSDB_INS_TABLE_BNODES;
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
|
@ -3951,7 +3944,7 @@ typedef struct SVgroupCreateTableBatch {
|
||||||
|
|
||||||
static void destroyCreateTbReq(SVCreateTbReq* pReq) {
|
static void destroyCreateTbReq(SVCreateTbReq* pReq) {
|
||||||
taosMemoryFreeClear(pReq->name);
|
taosMemoryFreeClear(pReq->name);
|
||||||
taosMemoryFreeClear(pReq->ntb.schema.pSchema);
|
taosMemoryFreeClear(pReq->ntb.schemaRow.pSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildNormalTableBatchReq(int32_t acctId, const SCreateTableStmt* pStmt, const SVgroupInfo* pVgroupInfo,
|
static int32_t buildNormalTableBatchReq(int32_t acctId, const SCreateTableStmt* pStmt, const SVgroupInfo* pVgroupInfo,
|
||||||
|
@ -3964,10 +3957,10 @@ static int32_t buildNormalTableBatchReq(int32_t acctId, const SCreateTableStmt*
|
||||||
SVCreateTbReq req = {0};
|
SVCreateTbReq req = {0};
|
||||||
req.type = TD_NORMAL_TABLE;
|
req.type = TD_NORMAL_TABLE;
|
||||||
req.name = strdup(pStmt->tableName);
|
req.name = strdup(pStmt->tableName);
|
||||||
req.ntb.schema.nCols = LIST_LENGTH(pStmt->pCols);
|
req.ntb.schemaRow.nCols = LIST_LENGTH(pStmt->pCols);
|
||||||
req.ntb.schema.sver = 1;
|
req.ntb.schemaRow.version = 1;
|
||||||
req.ntb.schema.pSchema = taosMemoryCalloc(req.ntb.schema.nCols, sizeof(SSchema));
|
req.ntb.schemaRow.pSchema = taosMemoryCalloc(req.ntb.schemaRow.nCols, sizeof(SSchema));
|
||||||
if (NULL == req.name || NULL == req.ntb.schema.pSchema) {
|
if (NULL == req.name || NULL == req.ntb.schemaRow.pSchema) {
|
||||||
destroyCreateTbReq(&req);
|
destroyCreateTbReq(&req);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -3977,7 +3970,7 @@ static int32_t buildNormalTableBatchReq(int32_t acctId, const SCreateTableStmt*
|
||||||
SNode* pCol;
|
SNode* pCol;
|
||||||
col_id_t index = 0;
|
col_id_t index = 0;
|
||||||
FOREACH(pCol, pStmt->pCols) {
|
FOREACH(pCol, pStmt->pCols) {
|
||||||
toSchema((SColumnDefNode*)pCol, index + 1, req.ntb.schema.pSchema + index);
|
toSchema((SColumnDefNode*)pCol, index + 1, req.ntb.schemaRow.pSchema + index);
|
||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
pBatch->info = *pVgroupInfo;
|
pBatch->info = *pVgroupInfo;
|
||||||
|
@ -4031,7 +4024,7 @@ static void destroyCreateTbReqBatch(SVgroupCreateTableBatch* pTbBatch) {
|
||||||
taosMemoryFreeClear(pTableReq->name);
|
taosMemoryFreeClear(pTableReq->name);
|
||||||
|
|
||||||
if (pTableReq->type == TSDB_NORMAL_TABLE) {
|
if (pTableReq->type == TSDB_NORMAL_TABLE) {
|
||||||
taosMemoryFreeClear(pTableReq->ntb.schema.pSchema);
|
taosMemoryFreeClear(pTableReq->ntb.schemaRow.pSchema);
|
||||||
} else if (pTableReq->type == TSDB_CHILD_TABLE) {
|
} else if (pTableReq->type == TSDB_CHILD_TABLE) {
|
||||||
taosMemoryFreeClear(pTableReq->ctb.pTag);
|
taosMemoryFreeClear(pTableReq->ctb.pTag);
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,6 +173,8 @@ static char* getSyntaxErrFormat(int32_t errCode) {
|
||||||
return "No columns can be dropped";
|
return "No columns can be dropped";
|
||||||
case TSDB_CODE_PAR_INVALID_COL_JSON:
|
case TSDB_CODE_PAR_INVALID_COL_JSON:
|
||||||
return "Only tag can be json type";
|
return "Only tag can be json type";
|
||||||
|
case TSDB_CODE_PAR_VALUE_TOO_LONG:
|
||||||
|
return "Value too long for column/tag: %s";
|
||||||
case TSDB_CODE_OUT_OF_MEMORY:
|
case TSDB_CODE_OUT_OF_MEMORY:
|
||||||
return "Out of memory";
|
return "Out of memory";
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "parInt.h"
|
#include "parInt.h"
|
||||||
#include "parToken.h"
|
#include "parToken.h"
|
||||||
|
|
||||||
bool isInsertSql(const char* pStr, size_t length) {
|
bool qIsInsertSql(const char* pStr, size_t length) {
|
||||||
if (NULL == pStr) {
|
if (NULL == pStr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ static void rewriteExprAlias(SNode* pRoot) {
|
||||||
|
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (isInsertSql(pCxt->pSql, pCxt->sqlLen)) {
|
if (qIsInsertSql(pCxt->pSql, pCxt->sqlLen)) {
|
||||||
code = parseInsertSql(pCxt, pQuery);
|
code = parseInsertSql(pCxt, pQuery);
|
||||||
} else {
|
} else {
|
||||||
code = parseSqlIntoAst(pCxt, pQuery);
|
code = parseSqlIntoAst(pCxt, pQuery);
|
||||||
|
@ -184,6 +184,18 @@ int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** p
|
||||||
return extractResultSchema(pRoot, numOfCols, pSchema);
|
return extractResultSchema(pRoot, numOfCols, pSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qSetSTableIdForRSma(SNode* pStmt, int64_t uid) {
|
||||||
|
if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
|
||||||
|
SNode* pTable = ((SSelectStmt*)pStmt)->pFromTable;
|
||||||
|
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||||
|
((SRealTableNode*)pTable)->pMeta->uid = uid;
|
||||||
|
((SRealTableNode*)pTable)->pMeta->suid = uid;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t qStmtBindParams(SQuery* pQuery, TAOS_MULTI_BIND* pParams, int32_t colIdx) {
|
int32_t qStmtBindParams(SQuery* pQuery, TAOS_MULTI_BIND* pParams, int32_t colIdx) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
|
|
@ -71,11 +71,6 @@ void generateInformationSchema(MockCatalogService* mcs) {
|
||||||
.addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
.addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
||||||
builder.done();
|
builder.done();
|
||||||
}
|
}
|
||||||
{
|
|
||||||
ITableBuilder& builder = mcs->createTableBuilder("information_schema", "user_streams", TSDB_SYSTEM_TABLE, 1)
|
|
||||||
.addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
ITableBuilder& builder = mcs->createTableBuilder("information_schema", "user_tables", TSDB_SYSTEM_TABLE, 2)
|
ITableBuilder& builder = mcs->createTableBuilder("information_schema", "user_tables", TSDB_SYSTEM_TABLE, 2)
|
||||||
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
|
||||||
|
@ -106,6 +101,11 @@ void generatePerformanceSchema(MockCatalogService* mcs) {
|
||||||
.addColumn("id", TSDB_DATA_TYPE_INT);
|
.addColumn("id", TSDB_DATA_TYPE_INT);
|
||||||
builder.done();
|
builder.done();
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
ITableBuilder& builder = mcs->createTableBuilder("performance_schema", "streams", TSDB_SYSTEM_TABLE, 1)
|
||||||
|
.addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
|
||||||
|
builder.done();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -707,6 +707,7 @@ int32_t substrFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu
|
||||||
|
|
||||||
int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
int16_t inputType = GET_PARAM_TYPE(&pInput[0]);
|
int16_t inputType = GET_PARAM_TYPE(&pInput[0]);
|
||||||
|
int16_t inputLen = GET_PARAM_BYTES(&pInput[0]);
|
||||||
int16_t outputType = GET_PARAM_TYPE(&pOutput[0]);
|
int16_t outputType = GET_PARAM_TYPE(&pOutput[0]);
|
||||||
int64_t outputLen = GET_PARAM_BYTES(&pOutput[0]);
|
int64_t outputLen = GET_PARAM_BYTES(&pOutput[0]);
|
||||||
|
|
||||||
|
@ -718,15 +719,15 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
colDataAppendNULL(pOutput->columnData, i);
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *input = colDataGetData(pInput[0].columnData, i);
|
char *input = colDataGetData(pInput[0].columnData, i);
|
||||||
|
|
||||||
switch(outputType) {
|
switch(outputType) {
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
if (inputType == TSDB_DATA_TYPE_BINARY) {
|
if (inputType == TSDB_DATA_TYPE_BINARY) {
|
||||||
memcpy(output, varDataVal(input), varDataLen(input));
|
*(int64_t *)output = taosStr2Int64(varDataVal(input), NULL, 10);
|
||||||
*(int64_t *)output = taosStr2Int64(output, NULL, 10);
|
|
||||||
} else if (inputType == TSDB_DATA_TYPE_NCHAR) {
|
} else if (inputType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
char *newBuf = taosMemoryCalloc(1, outputLen * TSDB_NCHAR_SIZE + 1);
|
char *newBuf = taosMemoryCalloc(1, inputLen);
|
||||||
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(input), varDataLen(input), newBuf);
|
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(input), varDataLen(input), newBuf);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
taosMemoryFree(newBuf);
|
taosMemoryFree(newBuf);
|
||||||
|
@ -742,10 +743,9 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
if (inputType == TSDB_DATA_TYPE_BINARY) {
|
if (inputType == TSDB_DATA_TYPE_BINARY) {
|
||||||
memcpy(output, varDataVal(input), varDataLen(input));
|
*(uint64_t *)output = taosStr2UInt64(varDataVal(input), NULL, 10);
|
||||||
*(uint64_t *)output = taosStr2UInt64(output, NULL, 10);
|
|
||||||
} else if (inputType == TSDB_DATA_TYPE_NCHAR) {
|
} else if (inputType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
char *newBuf = taosMemoryCalloc(1, outputLen * TSDB_NCHAR_SIZE + 1);
|
char *newBuf = taosMemoryCalloc(1, inputLen);
|
||||||
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(input), varDataLen(input), newBuf);
|
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(input), varDataLen(input), newBuf);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
taosMemoryFree(newBuf);
|
taosMemoryFree(newBuf);
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* 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 "query.h"
|
||||||
|
#include "schedulerInt.h"
|
||||||
|
|
||||||
|
tsem_t schdRspSem;
|
||||||
|
|
||||||
|
void schdExecCallback(SQueryResult* pResult, void* param, int32_t code) {
|
||||||
|
if (code) {
|
||||||
|
pResult->code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*(SQueryResult*)param = *pResult;
|
||||||
|
|
||||||
|
taosMemoryFree(pResult);
|
||||||
|
|
||||||
|
tsem_post(&schdRspSem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void schdFetchCallback(void* pResult, void* param, int32_t code) {
|
||||||
|
SSchdFetchParam* fParam = (SSchdFetchParam*)param;
|
||||||
|
|
||||||
|
*fParam->pData = pResult;
|
||||||
|
*fParam->code = code;
|
||||||
|
|
||||||
|
tsem_post(&schdRspSem);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -856,7 +856,12 @@ _return:
|
||||||
|
|
||||||
void schProcessOnDataFetched(SSchJob *job) {
|
void schProcessOnDataFetched(SSchJob *job) {
|
||||||
atomic_val_compare_exchange_32(&job->remoteFetch, 1, 0);
|
atomic_val_compare_exchange_32(&job->remoteFetch, 1, 0);
|
||||||
|
|
||||||
|
if (job->attr.syncSchedule) {
|
||||||
tsem_post(&job->rspSem);
|
tsem_post(&job->rspSem);
|
||||||
|
} else if (SCH_FETCH_CB == atomic_val_compare_exchange_32(&job->userCb, SCH_FETCH_CB, 0)) {
|
||||||
|
schNotifyUserFetchRes(job);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: no more task error processing, handled in function internal
|
// Note: no more task error processing, handled in function internal
|
||||||
|
|
|
@ -440,6 +440,7 @@ int32_t schHandleExplainCallback(void *param, const SDataBuf *pMsg, int32_t code
|
||||||
int32_t schHandleDropCallback(void *param, const SDataBuf *pMsg, int32_t code) {
|
int32_t schHandleDropCallback(void *param, const SDataBuf *pMsg, int32_t code) {
|
||||||
SSchTaskCallbackParam *pParam = (SSchTaskCallbackParam *)param;
|
SSchTaskCallbackParam *pParam = (SSchTaskCallbackParam *)param;
|
||||||
qDebug("QID:%" PRIx64 ",TID:%" PRIx64 " drop task rsp received, code:%x", pParam->queryId, pParam->taskId, code);
|
qDebug("QID:%" PRIx64 ",TID:%" PRIx64 " drop task rsp received, code:%x", pParam->queryId, pParam->taskId, code);
|
||||||
|
taosMemoryFreeClear(param);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ void schFreeRpcCtxVal(const void *arg) {
|
||||||
|
|
||||||
SMsgSendInfo *pMsgSendInfo = (SMsgSendInfo *)arg;
|
SMsgSendInfo *pMsgSendInfo = (SMsgSendInfo *)arg;
|
||||||
taosMemoryFreeClear(pMsgSendInfo->param);
|
taosMemoryFreeClear(pMsgSendInfo->param);
|
||||||
|
taosMemoryFreeClear(pMsgSendInfo->msgInfo.pData);
|
||||||
taosMemoryFreeClear(pMsgSendInfo);
|
taosMemoryFreeClear(pMsgSendInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ int32_t schedulerAsyncFetchRows(int64_t job, schedulerFetchCallback fp, void* pa
|
||||||
pJob->userRes.fetchFp = fp;
|
pJob->userRes.fetchFp = fp;
|
||||||
pJob->userRes.userParam = param;
|
pJob->userRes.userParam = param;
|
||||||
|
|
||||||
code = schFetchRows(pJob);
|
code = schAsyncFetchRows(pJob);
|
||||||
|
|
||||||
schReleaseJob(job);
|
schReleaseJob(job);
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, void* data, SArray* pRes)
|
||||||
// destroy
|
// destroy
|
||||||
if (pTask->inputType == STREAM_INPUT__DATA_SUBMIT) {
|
if (pTask->inputType == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
streamDataSubmitRefDec((SStreamDataSubmit*)data);
|
streamDataSubmitRefDec((SStreamDataSubmit*)data);
|
||||||
|
taosFreeQitem(data);
|
||||||
} else {
|
} else {
|
||||||
taosArrayDestroyEx(((SStreamDataBlock*)data)->blocks, (FDelete)tDeleteSSDataBlock);
|
taosArrayDestroyEx(((SStreamDataBlock*)data)->blocks, (FDelete)tDeleteSSDataBlock);
|
||||||
taosFreeQitem(data);
|
taosFreeQitem(data);
|
||||||
|
@ -173,6 +174,25 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, void* data, SArray* pRes)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SArray* streamExecForQall(SStreamTask* pTask, SArray* pRes) {
|
||||||
|
while (1) {
|
||||||
|
void* data = NULL;
|
||||||
|
taosGetQitem(pTask->inputQAll, &data);
|
||||||
|
if (data == NULL) break;
|
||||||
|
|
||||||
|
streamTaskExecImpl(pTask, data, pRes);
|
||||||
|
|
||||||
|
if (taosArrayGetSize(pRes) != 0) {
|
||||||
|
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
||||||
|
qRes->type = STREAM_INPUT__DATA_BLOCK;
|
||||||
|
qRes->blocks = pRes;
|
||||||
|
taosWriteQitem(pTask->outputQ, qRes);
|
||||||
|
return taosArrayInit(0, sizeof(SSDataBlock));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pRes;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: handle version
|
// TODO: handle version
|
||||||
int32_t streamExec(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
int32_t streamExec(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
||||||
SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
||||||
|
@ -182,88 +202,21 @@ int32_t streamExec(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
||||||
void* exec = pTask->exec.executor;
|
void* exec = pTask->exec.executor;
|
||||||
if (execStatus == TASK_STATUS__IDLE) {
|
if (execStatus == TASK_STATUS__IDLE) {
|
||||||
// first run, from qall, handle failure from last exec
|
// first run, from qall, handle failure from last exec
|
||||||
while (1) {
|
pRes = streamExecForQall(pTask, pRes);
|
||||||
void* data = NULL;
|
|
||||||
taosGetQitem(pTask->inputQAll, &data);
|
|
||||||
if (data == NULL) break;
|
|
||||||
|
|
||||||
streamTaskExecImpl(pTask, data, pRes);
|
|
||||||
|
|
||||||
/*taosFreeQitem(data);*/
|
|
||||||
|
|
||||||
if (taosArrayGetSize(pRes) != 0) {
|
|
||||||
SStreamDataBlock* resQ = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
|
||||||
resQ->type = STREAM_INPUT__DATA_BLOCK;
|
|
||||||
resQ->blocks = pRes;
|
|
||||||
taosWriteQitem(pTask->outputQ, resQ);
|
|
||||||
pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
|
||||||
if (pRes == NULL) goto FAIL;
|
if (pRes == NULL) goto FAIL;
|
||||||
}
|
|
||||||
}
|
|
||||||
// second run, from inputQ
|
// second run, from inputQ
|
||||||
taosReadAllQitems(pTask->inputQ, pTask->inputQAll);
|
taosReadAllQitems(pTask->inputQ, pTask->inputQAll);
|
||||||
while (1) {
|
pRes = streamExecForQall(pTask, pRes);
|
||||||
void* data = NULL;
|
|
||||||
taosGetQitem(pTask->inputQAll, &data);
|
|
||||||
if (data == NULL) break;
|
|
||||||
|
|
||||||
streamTaskExecImpl(pTask, data, pRes);
|
|
||||||
|
|
||||||
/*taosFreeQitem(data);*/
|
|
||||||
|
|
||||||
if (taosArrayGetSize(pRes) != 0) {
|
|
||||||
SStreamDataBlock* resQ = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
|
||||||
resQ->type = STREAM_INPUT__DATA_BLOCK;
|
|
||||||
resQ->blocks = pRes;
|
|
||||||
taosWriteQitem(pTask->outputQ, resQ);
|
|
||||||
pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
|
||||||
if (pRes == NULL) goto FAIL;
|
if (pRes == NULL) goto FAIL;
|
||||||
}
|
|
||||||
}
|
|
||||||
// set status closing
|
// set status closing
|
||||||
atomic_store_8(&pTask->status, TASK_STATUS__CLOSING);
|
atomic_store_8(&pTask->status, TASK_STATUS__CLOSING);
|
||||||
// third run, make sure all inputQ is cleared
|
|
||||||
|
// third run, make sure inputQ and qall are cleared
|
||||||
taosReadAllQitems(pTask->inputQ, pTask->inputQAll);
|
taosReadAllQitems(pTask->inputQ, pTask->inputQAll);
|
||||||
while (1) {
|
pRes = streamExecForQall(pTask, pRes);
|
||||||
void* data = NULL;
|
|
||||||
taosGetQitem(pTask->inputQAll, &data);
|
|
||||||
if (data == NULL) break;
|
|
||||||
|
|
||||||
streamTaskExecImpl(pTask, data, pRes);
|
|
||||||
|
|
||||||
/*taosFreeQitem(data);*/
|
|
||||||
|
|
||||||
if (taosArrayGetSize(pRes) != 0) {
|
|
||||||
SStreamDataBlock* resQ = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
|
||||||
resQ->type = STREAM_INPUT__DATA_BLOCK;
|
|
||||||
resQ->blocks = pRes;
|
|
||||||
taosWriteQitem(pTask->outputQ, resQ);
|
|
||||||
pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
|
||||||
if (pRes == NULL) goto FAIL;
|
if (pRes == NULL) goto FAIL;
|
||||||
}
|
|
||||||
}
|
|
||||||
// set status closing
|
|
||||||
atomic_store_8(&pTask->status, TASK_STATUS__CLOSING);
|
|
||||||
// third run, make sure all inputQ is cleared
|
|
||||||
taosReadAllQitems(pTask->inputQ, pTask->inputQAll);
|
|
||||||
while (1) {
|
|
||||||
void* data = NULL;
|
|
||||||
taosGetQitem(pTask->inputQAll, &data);
|
|
||||||
if (data == NULL) break;
|
|
||||||
|
|
||||||
streamTaskExecImpl(pTask, data, pRes);
|
|
||||||
|
|
||||||
taosFreeQitem(data);
|
|
||||||
|
|
||||||
if (taosArrayGetSize(pRes) != 0) {
|
|
||||||
SStreamDataBlock* resQ = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
|
||||||
resQ->type = STREAM_INPUT__DATA_BLOCK;
|
|
||||||
resQ->blocks = pRes;
|
|
||||||
taosWriteQitem(pTask->outputQ, resQ);
|
|
||||||
pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
|
||||||
if (pRes == NULL) goto FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic_store_8(&pTask->status, TASK_STATUS__IDLE);
|
atomic_store_8(&pTask->status, TASK_STATUS__IDLE);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,169 +0,0 @@
|
||||||
###################################################################
|
|
||||||
# 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 threading
|
|
||||||
import taos
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
import time
|
|
||||||
import random
|
|
||||||
# query sql
|
|
||||||
query_sql = [
|
|
||||||
# first supertable
|
|
||||||
"select count(*) from test.meters ;",
|
|
||||||
"select count(*) from test.meters where t3 > 2;",
|
|
||||||
"select count(*) from test.meters where ts <> '2020-05-13 10:00:00.002';",
|
|
||||||
"select count(*) from test.meters where t7 like 'taos_1%';",
|
|
||||||
"select count(*) from test.meters where t7 like '_____2';",
|
|
||||||
"select count(*) from test.meters where t8 like '%思%';",
|
|
||||||
"select count(*) from test.meters interval(1n) order by ts desc;",
|
|
||||||
#"select max(c0) from test.meters group by tbname",
|
|
||||||
"select first(ts) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select last(ts) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select last_row(*) from test.meters;",
|
|
||||||
"select twa(c1) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c1, 2) from test.t1;",
|
|
||||||
"select diff(c1) from test.t1;",
|
|
||||||
"select leastsquares(c1, 1, 1) from test.t1 ;",
|
|
||||||
"select max(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select c1 + c2 + c1 / c5 + c4 + c2 from test.t1;",
|
|
||||||
"select percentile(c1, 50) from test.t1;",
|
|
||||||
"select spread(c1) from test.t1 ;",
|
|
||||||
"select stddev(c1) from test.t1;",
|
|
||||||
"select sum(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c1, 2) from test.meters where t5 >5000 and t5<5100;"
|
|
||||||
"select twa(c4) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c4, 2) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select diff(c4) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select leastsquares(c4, 1, 1) from test.t1 ;",
|
|
||||||
"select max(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select c5 + c2 + c4 / c5 + c4 + c2 from test.t1 ;",
|
|
||||||
"select percentile(c5, 50) from test.t1;",
|
|
||||||
"select spread(c5) from test.t1 ;",
|
|
||||||
"select stddev(c5) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select sum(c5) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c5, 2) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
#all vnode
|
|
||||||
"select count(*) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select sum(c5),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),min(c5) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select min(c0),avg(c5) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
# second supertable
|
|
||||||
"select count(*) from test.meters1 where t3 > 2;",
|
|
||||||
"select count(*) from test.meters1 where ts <> '2020-05-13 10:00:00.002';",
|
|
||||||
"select count(*) from test.meters where t7 like 'taos_1%';",
|
|
||||||
"select count(*) from test.meters where t7 like '_____2';",
|
|
||||||
"select count(*) from test.meters where t8 like '%思%';",
|
|
||||||
"select count(*) from test.meters1 interval(1n) order by ts desc;",
|
|
||||||
#"select max(c0) from test.meters1 group by tbname",
|
|
||||||
"select first(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select last(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select last_row(*) from test.meters1 ;",
|
|
||||||
"select twa(c1) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c1, 2) from test.m1 where t5 >5000 and t5<5100;",
|
|
||||||
"select diff(c1) from test.m1 ;",
|
|
||||||
"select leastsquares(c1, 1, 1) from test.m1 ;",
|
|
||||||
"select max(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select c1 + c2 + c1 / c0 + c2 from test.m1 ;",
|
|
||||||
"select percentile(c1, 50) from test.m1;",
|
|
||||||
"select spread(c1) from test.m1 ;",
|
|
||||||
"select stddev(c1) from test.m1;",
|
|
||||||
"select sum(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c1, 2) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select twa(c5) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c5, 2) from test.m1;",
|
|
||||||
"select diff(c5) from test.m1;",
|
|
||||||
"select leastsquares(c5, 1, 1) from test.m1 ;",
|
|
||||||
"select max(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select c5 + c2 + c4 / c5 + c0 from test.m1;",
|
|
||||||
"select percentile(c4, 50) from test.m1;",
|
|
||||||
"select spread(c4) from test.m1 ;",
|
|
||||||
"select stddev(c4) from test.m1;",
|
|
||||||
"select sum(c4) from test.meters1 where t5 >5100 and t5<5300;",
|
|
||||||
"select top(c4, 2) from test.meters1 where t5 >5100 and t5<5300;",
|
|
||||||
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
|
||||||
#all vnode
|
|
||||||
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
|
||||||
"select max(c0),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select sum(c5),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),min(c5) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select min(c0),avg(c5) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
#join
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t5 = meters1.t5",
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t7 = meters1.t7",
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8",
|
|
||||||
# "select meters.ts,meters1.c2 from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8"
|
|
||||||
]
|
|
||||||
|
|
||||||
class ConcurrentInquiry:
|
|
||||||
def initConnection(self):
|
|
||||||
self.numOfTherads = 50
|
|
||||||
self.ts=1500000001000
|
|
||||||
|
|
||||||
def SetThreadsNum(self,num):
|
|
||||||
self.numOfTherads=num
|
|
||||||
def query_thread(self,threadID):
|
|
||||||
host = "10.211.55.14"
|
|
||||||
user = "root"
|
|
||||||
password = "taosdata"
|
|
||||||
conn = taos.connect(
|
|
||||||
host,
|
|
||||||
user,
|
|
||||||
password,
|
|
||||||
)
|
|
||||||
cl = conn.cursor()
|
|
||||||
cl.execute("use test;")
|
|
||||||
|
|
||||||
print("Thread %d: starting" % threadID)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
ran_query_sql=query_sql
|
|
||||||
random.shuffle(ran_query_sql)
|
|
||||||
for i in ran_query_sql:
|
|
||||||
print("Thread %d : %s"% (threadID,i))
|
|
||||||
try:
|
|
||||||
start = time.time()
|
|
||||||
cl.execute(i)
|
|
||||||
cl.fetchall()
|
|
||||||
end = time.time()
|
|
||||||
print("time cost :",end-start)
|
|
||||||
except Exception as e:
|
|
||||||
print(
|
|
||||||
"Failure thread%d, sql: %s,exception: %s" %
|
|
||||||
(threadID, str(i),str(e)))
|
|
||||||
exit(-1)
|
|
||||||
|
|
||||||
|
|
||||||
print("Thread %d: finishing" % threadID)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
|
|
||||||
threads = []
|
|
||||||
for i in range(self.numOfTherads):
|
|
||||||
thread = threading.Thread(target=self.query_thread, args=(i,))
|
|
||||||
threads.append(thread)
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
q = ConcurrentInquiry()
|
|
||||||
q.initConnection()
|
|
||||||
q.run()
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.common import tdCom
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
#for i in range(100):
|
||||||
|
tdSql.prepare()
|
||||||
|
dbname = tdCom.getLongName(10, "letters")
|
||||||
|
tdSql.execute('show databases')
|
||||||
|
tdSql.execute('drop database if exists ttxkbrzmpo')
|
||||||
|
tdSql.execute('create database if not exists ttxkbrzmpo vgroups 1')
|
||||||
|
tdSql.execute('use ttxkbrzmpo')
|
||||||
|
tdSql.execute('create table if not exists downsampling_stb (ts timestamp, c1 int, c2 double, c3 varchar(100), c4 bool) tags (t1 int, t2 double, t3 varchar(100), t4 bool);')
|
||||||
|
tdSql.execute('create table downsampling_ct1 using downsampling_stb tags(10, 10.1, "Beijing", True);')
|
||||||
|
tdSql.execute('create table if not exists scalar_stb (ts timestamp, c1 int, c2 double, c3 binary(20), c4 nchar(20), c5 nchar(20)) tags (t1 int);')
|
||||||
|
tdSql.execute('create table scalar_ct1 using scalar_stb tags(10);')
|
||||||
|
tdSql.execute('create stream downsampling_stream into output_downsampling_stb as select _wstartts AS start, min(c1), max(c2), sum(c1) from downsampling_stb interval(10m);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591, 100, 100.1, "Beijing", True);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591+1s, -100, -100.1, "Tianjin", False);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591+2s, 50, 50.3, "HeBei", False);')
|
||||||
|
tdSql.execute('select * from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select start, `min(c1)`, `max(c2)`, `sum(c1)` from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select _wstartts AS start, min(c1), max(c2), sum(c1) from downsampling_stb interval(10m);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591+10m, 60, 60.3, "heilongjiang", True);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591+11m, 70, 70.3, "JiLin", True);')
|
||||||
|
tdSql.execute('select * from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select start, `min(c1)`, `max(c2)`, `sum(c1)` from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select _wstartts AS start, min(c1), max(c2), sum(c1) from downsampling_stb interval(10m);')
|
||||||
|
tdSql.execute('insert into downsampling_ct1 values (1653547828591+21m, 70, 70.3, "JiLin", True);')
|
||||||
|
tdSql.execute('select * from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select * from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select start, `min(c1)`, `max(c2)`, `sum(c1)` from output_downsampling_stb;')
|
||||||
|
tdSql.execute('select _wstartts AS start, min(c1), max(c2), sum(c1) from downsampling_stb interval(10m);')
|
||||||
|
tdSql.execute('create stream abs_stream into output_abs_stb as select ts, abs(c1), abs(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_abs_stb')
|
||||||
|
tdSql.execute('create stream acos_stream into output_acos_stb as select ts, acos(c1), acos(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_acos_stb')
|
||||||
|
tdSql.execute('create stream asin_stream into output_asin_stb as select ts, asin(c1), asin(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_asin_stb')
|
||||||
|
tdSql.execute('create stream atan_stream into output_atan_stb as select ts, atan(c1), atan(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_atan_stb')
|
||||||
|
tdSql.execute('create stream ceil_stream into output_ceil_stb as select ts, ceil(c1), ceil(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_ceil_stb')
|
||||||
|
tdSql.execute('create stream cos_stream into output_cos_stb as select ts, cos(c1), cos(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_cos_stb')
|
||||||
|
tdSql.execute('create stream floor_stream into output_floor_stb as select ts, floor(c1), floor(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_floor_stb')
|
||||||
|
tdSql.execute('create stream log_stream into output_log_stb as select ts, log(c1, 2), log(c2, 2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_log_stb')
|
||||||
|
tdSql.execute('create stream pow_stream into output_pow_stb as select ts, pow(c1, 2), pow(c2, 2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_pow_stb')
|
||||||
|
tdSql.execute('create stream round_stream into output_round_stb as select ts, round(c1), round(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_round_stb')
|
||||||
|
tdSql.execute('create stream sin_stream into output_sin_stb as select ts, sin(c1), sin(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_sin_stb')
|
||||||
|
tdSql.execute('create stream sqrt_stream into output_sqrt_stb as select ts, sqrt(c1), sqrt(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_sqrt_stb')
|
||||||
|
tdSql.execute('create stream tan_stream into output_tan_stb as select ts, tan(c1), tan(c2), c3 from scalar_stb;')
|
||||||
|
tdSql.query('describe output_tan_stb')
|
||||||
|
tdSql.execute('create stream char_length_stream into output_char_length_stb as select ts, char_length(c3), char_length(c4), char_length(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_char_length_stb')
|
||||||
|
tdSql.execute('create stream concat_stream into output_concat_stb as select ts, concat(c3, c4), concat(c3, c5), concat(c4, c5), concat(c3, c4, c5) from scalar_stb;')
|
||||||
|
tdSql.execute('create stream concat_ws_stream into output_concat_ws_stb as select ts, concat_ws("aND", c3, c4), concat_ws("and", c3, c5), concat_ws("And", c4, c5), concat_ws("AND", c3, c4, c5) from scalar_stb;')
|
||||||
|
tdSql.execute('create stream length_stream into output_length_stb as select ts, length(c3), length(c4), length(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_length_stb')
|
||||||
|
tdSql.execute('create stream lower_stream into output_lower_stb as select ts, lower(c3), lower(c4), lower(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_lower_stb')
|
||||||
|
tdSql.execute('create stream ltrim_stream into output_ltrim_stb as select ts, ltrim(c3), ltrim(c4), ltrim(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_ltrim_stb')
|
||||||
|
tdSql.execute('create stream rtrim_stream into output_rtrim_stb as select ts, rtrim(c3), rtrim(c4), rtrim(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_rtrim_stb')
|
||||||
|
tdSql.execute('create stream substr_stream into output_substr_stb as select ts, substr(c3, 2), substr(c3, 2, 2), substr(c4, 5, 1), substr(c5, 3, 4) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_substr_stb')
|
||||||
|
tdSql.execute('create stream upper_stream into output_upper_stb as select ts, upper(c3), upper(c4), upper(c5) from scalar_stb;')
|
||||||
|
tdSql.query('describe output_upper_stb')
|
||||||
|
tdSql.execute('insert into scalar_ct1 values (1653560440733, 100, 100.1, "beijing", "taos", "Taos");')
|
||||||
|
tdSql.execute('insert into scalar_ct1 values (1653560440733+1s, -50, -50.1, "tianjin", "taosdata", "Taosdata");')
|
||||||
|
tdSql.execute('insert into scalar_ct1 values (1653560440733+2s, 0, Null, "hebei", "TDengine", Null);')
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -97,7 +97,7 @@
|
||||||
./test.sh -f tsim/stable/values.sim
|
./test.sh -f tsim/stable/values.sim
|
||||||
./test.sh -f tsim/stable/vnode3.sim
|
./test.sh -f tsim/stable/vnode3.sim
|
||||||
./test.sh -f tsim/stable/column_add.sim
|
./test.sh -f tsim/stable/column_add.sim
|
||||||
#./test.sh -f tsim/stable/column_drop.sim
|
./test.sh -f tsim/stable/column_drop.sim
|
||||||
#./test.sh -f tsim/stable/column_modify.sim
|
#./test.sh -f tsim/stable/column_modify.sim
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ sql connect
|
||||||
|
|
||||||
# select */column from information_schema.xxxx; xxxx include:
|
# select */column from information_schema.xxxx; xxxx include:
|
||||||
# dnodes, mnodes, modules, qnodes,
|
# dnodes, mnodes, modules, qnodes,
|
||||||
# user_databases, user_functions, user_indexes, user_stables, user_streams,
|
# user_databases, user_functions, user_indexes, user_stables, streams,
|
||||||
# user_tables, user_table_distributed, user_users, vgroups,
|
# user_tables, user_table_distributed, user_users, vgroups,
|
||||||
|
|
||||||
print =============== add dnode2 into cluster
|
print =============== add dnode2 into cluster
|
||||||
|
@ -96,7 +96,7 @@ sql select * from information_schema.user_stables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql select * from information_schema.user_streams
|
#sql select * from information_schema.`streams`
|
||||||
sql select * from information_schema.user_tables
|
sql select * from information_schema.user_tables
|
||||||
if $rows != 28 then
|
if $rows != 28 then
|
||||||
return -1
|
return -1
|
||||||
|
@ -194,7 +194,7 @@ sql select * from information_schema.user_stables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql select * from information_schema.user_streams
|
#sql select * from performance_schema.`streams`
|
||||||
sql select * from information_schema.user_tables
|
sql select * from information_schema.user_tables
|
||||||
if $rows != 28 then
|
if $rows != 28 then
|
||||||
return -1
|
return -1
|
||||||
|
|
|
@ -0,0 +1,481 @@
|
||||||
|
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import socket
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.dnodes import *
|
||||||
|
|
||||||
|
class actionType(Enum):
|
||||||
|
CREATE_DATABASE = 0
|
||||||
|
CREATE_STABLE = 1
|
||||||
|
CREATE_CTABLE = 2
|
||||||
|
INSERT_DATA = 3
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
#rpcDebugFlagVal = '143'
|
||||||
|
#clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
#clientCfgDict["rpcDebugFlag"] = rpcDebugFlagVal
|
||||||
|
#updatecfgDict = {'clientCfg': {}, 'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
#updatecfgDict["rpcDebugFlag"] = rpcDebugFlagVal
|
||||||
|
#print ("===================: ", updatecfgDict)
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
#tdSql.init(conn.cursor())
|
||||||
|
tdSql.init(conn.cursor(), logSql) # output sql.txt file
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root) - len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
|
def newcur(self,cfg,host,port):
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
con=taos.connect(host=host, user=user, password=password, config=cfg ,port=port)
|
||||||
|
cur=con.cursor()
|
||||||
|
print(cur)
|
||||||
|
return cur
|
||||||
|
|
||||||
|
def initConsumerTable(self,cdbName='cdb'):
|
||||||
|
tdLog.info("create consume database, and consume info table, and consume result table")
|
||||||
|
tdSql.query("create database if not exists %s vgroups 1"%(cdbName))
|
||||||
|
tdSql.query("drop table if exists %s.consumeinfo "%(cdbName))
|
||||||
|
tdSql.query("drop table if exists %s.consumeresult "%(cdbName))
|
||||||
|
|
||||||
|
tdSql.query("create table %s.consumeinfo (ts timestamp, consumerid int, topiclist binary(1024), keylist binary(1024), expectmsgcnt bigint, ifcheckdata int, ifmanualcommit int)"%cdbName)
|
||||||
|
tdSql.query("create table %s.consumeresult (ts timestamp, consumerid int, consummsgcnt bigint, consumrowcnt bigint, checkresult int)"%cdbName)
|
||||||
|
|
||||||
|
def initConsumerInfoTable(self,cdbName='cdb'):
|
||||||
|
tdLog.info("drop consumeinfo table")
|
||||||
|
tdSql.query("drop table if exists %s.consumeinfo "%(cdbName))
|
||||||
|
tdSql.query("create table %s.consumeinfo (ts timestamp, consumerid int, topiclist binary(1024), keylist binary(1024), expectmsgcnt bigint, ifcheckdata int, ifmanualcommit int)"%cdbName)
|
||||||
|
|
||||||
|
def insertConsumerInfo(self,consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifmanualcommit,cdbName='cdb'):
|
||||||
|
sql = "insert into %s.consumeinfo values "%cdbName
|
||||||
|
sql += "(now, %d, '%s', '%s', %d, %d, %d)"%(consumerId, topicList, keyList, expectrowcnt, ifcheckdata, ifmanualcommit)
|
||||||
|
tdLog.info("consume info sql: %s"%sql)
|
||||||
|
tdSql.query(sql)
|
||||||
|
|
||||||
|
def selectConsumeResult(self,expectRows,cdbName='cdb'):
|
||||||
|
resultList=[]
|
||||||
|
while 1:
|
||||||
|
tdSql.query("select * from %s.consumeresult"%cdbName)
|
||||||
|
#tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3))
|
||||||
|
if tdSql.getRows() == expectRows:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
for i in range(expectRows):
|
||||||
|
tdLog.info ("consume id: %d, consume msgs: %d, consume rows: %d"%(tdSql.getData(i , 1), tdSql.getData(i , 2), tdSql.getData(i , 3)))
|
||||||
|
resultList.append(tdSql.getData(i , 3))
|
||||||
|
|
||||||
|
return resultList
|
||||||
|
|
||||||
|
def startTmqSimProcess(self,buildPath,cfgPath,pollDelay,dbName,showMsg=1,showRow=1,cdbName='cdb',valgrind=0):
|
||||||
|
shellCmd = 'nohup '
|
||||||
|
if valgrind == 1:
|
||||||
|
logFile = cfgPath + '/../log/valgrind-tmq.log'
|
||||||
|
shellCmd = 'nohup valgrind --log-file=' + logFile
|
||||||
|
shellCmd += '--tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all --num-callers=20 -v --workaround-gcc296-bugs=yes '
|
||||||
|
|
||||||
|
shellCmd += buildPath + '/build/bin/tmq_sim -c ' + cfgPath
|
||||||
|
shellCmd += " -y %d -d %s -g %d -r %d -w %s "%(pollDelay, dbName, showMsg, showRow, cdbName)
|
||||||
|
shellCmd += "> /dev/null 2>&1 &"
|
||||||
|
tdLog.info(shellCmd)
|
||||||
|
os.system(shellCmd)
|
||||||
|
|
||||||
|
def create_database(self,tsql, dbName,dropFlag=1,vgroups=4,replica=1):
|
||||||
|
if dropFlag == 1:
|
||||||
|
tsql.execute("drop database if exists %s"%(dbName))
|
||||||
|
|
||||||
|
tsql.execute("create database if not exists %s vgroups %d replica %d"%(dbName, vgroups, replica))
|
||||||
|
tdLog.debug("complete to create database %s"%(dbName))
|
||||||
|
return
|
||||||
|
|
||||||
|
def create_stable(self,tsql, dbName,stbName):
|
||||||
|
tsql.execute("create table if not exists %s.%s (ts timestamp, c1 bigint, c2 binary(16)) tags(t1 int)"%(dbName, stbName))
|
||||||
|
tdLog.debug("complete to create %s.%s" %(dbName, stbName))
|
||||||
|
return
|
||||||
|
|
||||||
|
def create_ctables(self,tsql, dbName,stbName,ctbPrefix,ctbNum):
|
||||||
|
tsql.execute("use %s" %dbName)
|
||||||
|
pre_create = "create table"
|
||||||
|
sql = pre_create
|
||||||
|
#tdLog.debug("doing create one stable %s and %d child table in %s ..." %(stbname, count ,dbname))
|
||||||
|
for i in range(ctbNum):
|
||||||
|
sql += " %s_%d using %s tags(%d)"%(ctbPrefix,i,stbName,i+1)
|
||||||
|
if (i > 0) and (i%100 == 0):
|
||||||
|
tsql.execute(sql)
|
||||||
|
sql = pre_create
|
||||||
|
if sql != pre_create:
|
||||||
|
tsql.execute(sql)
|
||||||
|
|
||||||
|
tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName))
|
||||||
|
return
|
||||||
|
|
||||||
|
def insert_data_interlaceByMultiTbl(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs=0):
|
||||||
|
tdLog.debug("start to insert data ............")
|
||||||
|
tsql.execute("use %s" %dbName)
|
||||||
|
pre_insert = "insert into "
|
||||||
|
sql = pre_insert
|
||||||
|
|
||||||
|
if startTs == 0:
|
||||||
|
t = time.time()
|
||||||
|
startTs = int(round(t * 1000))
|
||||||
|
|
||||||
|
ctbDict = {}
|
||||||
|
for i in range(ctbNum):
|
||||||
|
ctbDict[i] = 0
|
||||||
|
|
||||||
|
#tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
|
||||||
|
rowsOfCtb = 0
|
||||||
|
while rowsOfCtb < rowsPerTbl:
|
||||||
|
for i in range(ctbNum):
|
||||||
|
sql += " %s.%s_%d values "%(dbName,ctbPrefix,i)
|
||||||
|
for k in range(batchNum):
|
||||||
|
sql += "(%d, %d, 'tmqrow_%d') "%(startTs + ctbDict[i], ctbDict[i], ctbDict[i])
|
||||||
|
ctbDict[i] += 1
|
||||||
|
if (0 == ctbDict[i]%batchNum) or (ctbDict[i] == rowsPerTbl):
|
||||||
|
tsql.execute(sql)
|
||||||
|
sql = "insert into "
|
||||||
|
break
|
||||||
|
rowsOfCtb = ctbDict[0]
|
||||||
|
|
||||||
|
tdLog.debug("insert data ............ [OK]")
|
||||||
|
return
|
||||||
|
|
||||||
|
def insert_data(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs=0):
|
||||||
|
tdLog.debug("start to insert data ............")
|
||||||
|
tsql.execute("use %s" %dbName)
|
||||||
|
pre_insert = "insert into "
|
||||||
|
sql = pre_insert
|
||||||
|
|
||||||
|
if startTs == 0:
|
||||||
|
t = time.time()
|
||||||
|
startTs = int(round(t * 1000))
|
||||||
|
|
||||||
|
#tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
|
||||||
|
rowsOfSql = 0
|
||||||
|
for i in range(ctbNum):
|
||||||
|
sql += " %s_%d values "%(ctbPrefix,i)
|
||||||
|
for j in range(rowsPerTbl):
|
||||||
|
sql += "(%d, %d, 'tmqrow_%d') "%(startTs + j, j, j)
|
||||||
|
rowsOfSql += 1
|
||||||
|
if (j > 0) and ((rowsOfSql == batchNum) or (j == rowsPerTbl - 1)):
|
||||||
|
tsql.execute(sql)
|
||||||
|
rowsOfSql = 0
|
||||||
|
if j < rowsPerTbl - 1:
|
||||||
|
sql = "insert into %s_%d values " %(ctbPrefix,i)
|
||||||
|
else:
|
||||||
|
sql = "insert into "
|
||||||
|
#end sql
|
||||||
|
if sql != pre_insert:
|
||||||
|
#print("insert sql:%s"%sql)
|
||||||
|
tsql.execute(sql)
|
||||||
|
tdLog.debug("insert data ............ [OK]")
|
||||||
|
return
|
||||||
|
|
||||||
|
def insert_data_with_autoCreateTbl(self,tsql,dbName,stbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs=0):
|
||||||
|
tdLog.debug("start to insert data wiht auto create child table ............")
|
||||||
|
tsql.execute("use %s" %dbName)
|
||||||
|
pre_insert = "insert into "
|
||||||
|
sql = pre_insert
|
||||||
|
|
||||||
|
if startTs == 0:
|
||||||
|
t = time.time()
|
||||||
|
startTs = int(round(t * 1000))
|
||||||
|
|
||||||
|
#tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
|
||||||
|
rowsOfSql = 0
|
||||||
|
for i in range(ctbNum):
|
||||||
|
sql += " %s.%s_%d using %s.%s tags (%d) values "%(dbName,ctbPrefix,i,dbName,stbName,i)
|
||||||
|
for j in range(rowsPerTbl):
|
||||||
|
sql += "(%d, %d, 'autodata_%d') "%(startTs + j, j, j)
|
||||||
|
rowsOfSql += 1
|
||||||
|
if (j > 0) and ((rowsOfSql == batchNum) or (j == rowsPerTbl - 1)):
|
||||||
|
tsql.execute(sql)
|
||||||
|
rowsOfSql = 0
|
||||||
|
if j < rowsPerTbl - 1:
|
||||||
|
sql = "insert into %s.%s_%d using %s.%s tags (%d) values " %(dbName,ctbPrefix,i,dbName,stbName,i)
|
||||||
|
else:
|
||||||
|
sql = "insert into "
|
||||||
|
#end sql
|
||||||
|
if sql != pre_insert:
|
||||||
|
#print("insert sql:%s"%sql)
|
||||||
|
tsql.execute(sql)
|
||||||
|
tdLog.debug("insert data ............ [OK]")
|
||||||
|
return
|
||||||
|
|
||||||
|
def prepareEnv(self, **parameterDict):
|
||||||
|
# create new connector for my thread
|
||||||
|
tsql=self.newcur(parameterDict['cfg'], 'localhost', 6030)
|
||||||
|
|
||||||
|
if parameterDict["actionType"] == actionType.CREATE_DATABASE:
|
||||||
|
self.create_database(tsql, parameterDict["dbName"])
|
||||||
|
elif parameterDict["actionType"] == actionType.CREATE_STABLE:
|
||||||
|
self.create_stable(tsql, parameterDict["dbName"], parameterDict["stbName"])
|
||||||
|
elif parameterDict["actionType"] == actionType.CREATE_CTABLE:
|
||||||
|
self.create_ctables(tsql, parameterDict["dbName"], parameterDict["stbName"], parameterDict["stbName"], parameterDict["ctbNum"])
|
||||||
|
elif parameterDict["actionType"] == actionType.INSERT_DATA:
|
||||||
|
self.insert_data(tsql, parameterDict["dbName"], parameterDict["stbName"], parameterDict["ctbNum"],\
|
||||||
|
parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
else:
|
||||||
|
tdLog.exit("not support's action: ", parameterDict["actionType"])
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def tmqCase1(self, cfgPath, buildPath):
|
||||||
|
tdLog.printNoPrefix("======== test case 1: ")
|
||||||
|
|
||||||
|
self.initConsumerTable()
|
||||||
|
|
||||||
|
# create and start thread
|
||||||
|
parameterDict = {'cfg': '', \
|
||||||
|
'actionType': 0, \
|
||||||
|
'dbName': 'db1', \
|
||||||
|
'dropFlag': 1, \
|
||||||
|
'vgroups': 4, \
|
||||||
|
'replica': 1, \
|
||||||
|
'stbName': 'stb1', \
|
||||||
|
'ctbPrefix': 'stb1', \
|
||||||
|
'ctbNum': 10, \
|
||||||
|
'rowsPerTbl': 10000, \
|
||||||
|
'batchNum': 23, \
|
||||||
|
'startTs': 1640966400000} # 2022-01-01 00:00:00.000
|
||||||
|
parameterDict['cfg'] = cfgPath
|
||||||
|
|
||||||
|
self.create_database(tdSql, parameterDict["dbName"])
|
||||||
|
self.create_stable(tdSql, parameterDict["dbName"], parameterDict["stbName"])
|
||||||
|
self.create_ctables(tdSql, parameterDict["dbName"], parameterDict["stbName"], parameterDict["ctbPrefix"], parameterDict["ctbNum"])
|
||||||
|
self.insert_data_interlaceByMultiTbl(tdSql,parameterDict["dbName"],parameterDict["stbName"],parameterDict["ctbNum"],parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
|
||||||
|
tdLog.info("create topics from stb1")
|
||||||
|
topicFromStb1 = 'topic_stb1'
|
||||||
|
|
||||||
|
tdSql.execute("create topic %s as select ts, c1, c2 from %s.%s" %(topicFromStb1, parameterDict['dbName'], parameterDict['stbName']))
|
||||||
|
consumerId = 0
|
||||||
|
expectrowcnt = parameterDict["rowsPerTbl"] * parameterDict["ctbNum"]
|
||||||
|
topicList = topicFromStb1
|
||||||
|
ifcheckdata = 0
|
||||||
|
ifManualCommit = 0
|
||||||
|
keyList = 'group.id:cgrp1,\
|
||||||
|
enable.auto.commit:false,\
|
||||||
|
auto.commit.interval.ms:6000,\
|
||||||
|
auto.offset.reset:earliest'
|
||||||
|
self.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
pollDelay = 10
|
||||||
|
showMsg = 1
|
||||||
|
showRow = 1
|
||||||
|
self.startTmqSimProcess(buildPath,cfgPath,pollDelay,parameterDict["dbName"],showMsg, showRow)
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
tdLog.info("================= restart dnode ===========================")
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
tdLog.info("insert process end, and start to check consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = self.selectConsumeResult(expectRows)
|
||||||
|
totalConsumeRows = 0
|
||||||
|
for i in range(expectRows):
|
||||||
|
totalConsumeRows += resultList[i]
|
||||||
|
|
||||||
|
if totalConsumeRows != expectrowcnt:
|
||||||
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
tdLog.exit("tmq consume rows error!")
|
||||||
|
|
||||||
|
tdSql.query("drop topic %s"%topicFromStb1)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======== test case 1 end ...... ")
|
||||||
|
|
||||||
|
def tmqCase2(self, cfgPath, buildPath):
|
||||||
|
tdLog.printNoPrefix("======== test case 2: ")
|
||||||
|
|
||||||
|
self.initConsumerTable()
|
||||||
|
|
||||||
|
# create and start thread
|
||||||
|
parameterDict = {'cfg': '', \
|
||||||
|
'actionType': 0, \
|
||||||
|
'dbName': 'db2', \
|
||||||
|
'dropFlag': 1, \
|
||||||
|
'vgroups': 4, \
|
||||||
|
'replica': 1, \
|
||||||
|
'stbName': 'stb1', \
|
||||||
|
'ctbPrefix': 'stb1', \
|
||||||
|
'ctbNum': 10, \
|
||||||
|
'rowsPerTbl': 10000, \
|
||||||
|
'batchNum': 40, \
|
||||||
|
'startTs': 1640966400000} # 2022-01-01 00:00:00.000
|
||||||
|
parameterDict['cfg'] = cfgPath
|
||||||
|
|
||||||
|
self.create_database(tdSql, parameterDict["dbName"])
|
||||||
|
self.create_stable(tdSql, parameterDict["dbName"], parameterDict["stbName"])
|
||||||
|
self.create_ctables(tdSql, parameterDict["dbName"], parameterDict["stbName"], parameterDict["ctbPrefix"], parameterDict["ctbNum"])
|
||||||
|
self.insert_data_interlaceByMultiTbl(tdSql,parameterDict["dbName"],parameterDict["stbName"],parameterDict["ctbNum"],parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
|
||||||
|
tdLog.info("create topics from stb1")
|
||||||
|
topicFromStb1 = 'topic_stb1'
|
||||||
|
|
||||||
|
tdSql.execute("create topic %s as select ts, c1, c2 from %s.%s" %(topicFromStb1, parameterDict['dbName'], parameterDict['stbName']))
|
||||||
|
consumerId = 0
|
||||||
|
expectrowcnt = parameterDict["rowsPerTbl"] * parameterDict["ctbNum"] * 2
|
||||||
|
topicList = topicFromStb1
|
||||||
|
ifcheckdata = 0
|
||||||
|
ifManualCommit = 0
|
||||||
|
keyList = 'group.id:cgrp1,\
|
||||||
|
enable.auto.commit:false,\
|
||||||
|
auto.commit.interval.ms:6000,\
|
||||||
|
auto.offset.reset:earliest'
|
||||||
|
self.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
pollDelay = 50
|
||||||
|
showMsg = 1
|
||||||
|
showRow = 1
|
||||||
|
self.startTmqSimProcess(buildPath,cfgPath,pollDelay,parameterDict["dbName"],showMsg, showRow)
|
||||||
|
|
||||||
|
tdLog.info("create some new child table and insert data ")
|
||||||
|
parameterDict['batchNum'] = 100
|
||||||
|
self.insert_data_with_autoCreateTbl(tdSql,parameterDict["dbName"],parameterDict["stbName"],"ctb",parameterDict["ctbNum"],parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
|
||||||
|
tdLog.info("================= restart dnode ===========================")
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
tdLog.info("insert process end, and start to check consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = self.selectConsumeResult(expectRows)
|
||||||
|
totalConsumeRows = 0
|
||||||
|
for i in range(expectRows):
|
||||||
|
totalConsumeRows += resultList[i]
|
||||||
|
|
||||||
|
if totalConsumeRows != expectrowcnt:
|
||||||
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
tdLog.exit("tmq consume rows error!")
|
||||||
|
|
||||||
|
tdSql.query("drop topic %s"%topicFromStb1)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======== test case 2 end ...... ")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 自动建表完成数据插入,启动消费
|
||||||
|
def tmqCase3(self, cfgPath, buildPath):
|
||||||
|
tdLog.printNoPrefix("======== test case 3: ")
|
||||||
|
|
||||||
|
self.initConsumerTable()
|
||||||
|
|
||||||
|
# create and start thread
|
||||||
|
parameterDict = {'cfg': '', \
|
||||||
|
'actionType': 0, \
|
||||||
|
'dbName': 'db3', \
|
||||||
|
'dropFlag': 1, \
|
||||||
|
'vgroups': 4, \
|
||||||
|
'replica': 1, \
|
||||||
|
'stbName': 'stb1', \
|
||||||
|
'ctbPrefix': 'stb1', \
|
||||||
|
'ctbNum': 10, \
|
||||||
|
'rowsPerTbl': 10000, \
|
||||||
|
'batchNum': 40, \
|
||||||
|
'startTs': 1640966400000} # 2022-01-01 00:00:00.000
|
||||||
|
parameterDict['cfg'] = cfgPath
|
||||||
|
|
||||||
|
self.create_database(tdSql, parameterDict["dbName"])
|
||||||
|
self.create_stable(tdSql, parameterDict["dbName"], parameterDict["stbName"])
|
||||||
|
#self.create_ctables(tdSql, parameterDict["dbName"], parameterDict["stbName"], parameterDict["ctbPrefix"], parameterDict["ctbNum"])
|
||||||
|
#self.insert_data_interlaceByMultiTbl(tdSql,parameterDict["dbName"],parameterDict["stbName"],parameterDict["ctbNum"],parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
self.insert_data_with_autoCreateTbl(tdSql,parameterDict["dbName"],parameterDict["stbName"],"ctb",parameterDict["ctbNum"],parameterDict["rowsPerTbl"],parameterDict["batchNum"])
|
||||||
|
|
||||||
|
tdLog.info("create topics from stb1")
|
||||||
|
topicFromStb1 = 'topic_stb1'
|
||||||
|
|
||||||
|
tdSql.execute("create topic %s as select ts, c1, c2 from %s.%s" %(topicFromStb1, parameterDict['dbName'], parameterDict['stbName']))
|
||||||
|
consumerId = 0
|
||||||
|
expectrowcnt = parameterDict["rowsPerTbl"] * parameterDict["ctbNum"]
|
||||||
|
topicList = topicFromStb1
|
||||||
|
ifcheckdata = 0
|
||||||
|
ifManualCommit = 0
|
||||||
|
keyList = 'group.id:cgrp1,\
|
||||||
|
enable.auto.commit:false,\
|
||||||
|
auto.commit.interval.ms:6000,\
|
||||||
|
auto.offset.reset:earliest'
|
||||||
|
self.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
pollDelay = 10
|
||||||
|
showMsg = 1
|
||||||
|
showRow = 1
|
||||||
|
self.startTmqSimProcess(buildPath,cfgPath,pollDelay,parameterDict["dbName"],showMsg, showRow)
|
||||||
|
|
||||||
|
# tdLog.info("================= restart dnode ===========================")
|
||||||
|
# tdDnodes.stop(1)
|
||||||
|
# tdDnodes.start(1)
|
||||||
|
# time.sleep(2)
|
||||||
|
|
||||||
|
tdLog.info("insert process end, and start to check consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = self.selectConsumeResult(expectRows)
|
||||||
|
totalConsumeRows = 0
|
||||||
|
for i in range(expectRows):
|
||||||
|
totalConsumeRows += resultList[i]
|
||||||
|
|
||||||
|
if totalConsumeRows != expectrowcnt:
|
||||||
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
tdLog.exit("tmq consume rows error!")
|
||||||
|
|
||||||
|
tdSql.query("drop topic %s"%topicFromStb1)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======== test case 3 end ...... ")
|
||||||
|
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
if (buildPath == ""):
|
||||||
|
tdLog.exit("taosd not found!")
|
||||||
|
else:
|
||||||
|
tdLog.info("taosd found in %s" % buildPath)
|
||||||
|
cfgPath = buildPath + "/../sim/psim/cfg"
|
||||||
|
tdLog.info("cfgPath: %s" % cfgPath)
|
||||||
|
|
||||||
|
# self.tmqCase1(cfgPath, buildPath)
|
||||||
|
# self.tmqCase2(cfgPath, buildPath)
|
||||||
|
self.tmqCase3(cfgPath, buildPath)
|
||||||
|
# self.tmqCase4(cfgPath, buildPath)
|
||||||
|
# self.tmqCase5(cfgPath, buildPath)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
event = threading.Event()
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -110,7 +110,6 @@ void dumpStb(SSdb *pSdb, SJson *json) {
|
||||||
tjsonAddStringToObject(item, "updateTime", i642str(pObj->updateTime));
|
tjsonAddStringToObject(item, "updateTime", i642str(pObj->updateTime));
|
||||||
tjsonAddStringToObject(item, "uid", i642str(pObj->uid));
|
tjsonAddStringToObject(item, "uid", i642str(pObj->uid));
|
||||||
tjsonAddStringToObject(item, "dbUid", i642str(pObj->dbUid));
|
tjsonAddStringToObject(item, "dbUid", i642str(pObj->dbUid));
|
||||||
tjsonAddIntegerToObject(item, "version", pObj->version);
|
|
||||||
tjsonAddIntegerToObject(item, "tagVer", pObj->tagVer);
|
tjsonAddIntegerToObject(item, "tagVer", pObj->tagVer);
|
||||||
tjsonAddIntegerToObject(item, "colVer", pObj->colVer);
|
tjsonAddIntegerToObject(item, "colVer", pObj->colVer);
|
||||||
tjsonAddIntegerToObject(item, "nextColId", pObj->nextColId);
|
tjsonAddIntegerToObject(item, "nextColId", pObj->nextColId);
|
||||||
|
|
Loading…
Reference in New Issue