Merge branch '3.0' of github.com:taosdata/TDengine into feature/udf
This commit is contained in:
commit
ed1a71f1a0
|
@ -252,24 +252,31 @@ STSRow* tGetSubmitBlkNext(SSubmitBlkIter* pIter);
|
||||||
int32_t tPrintFixedSchemaSubmitReq(const SSubmitReq* pReq, STSchema* pSchema);
|
int32_t tPrintFixedSchemaSubmitReq(const SSubmitReq* pReq, STSchema* pSchema);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t index; // index of failed block in submit blocks
|
int8_t hashMeta;
|
||||||
int32_t vnode; // vnode index of failed block
|
int64_t uid;
|
||||||
int32_t sid; // table index of failed block
|
char* tblFName;
|
||||||
int32_t code; // errorcode while write data to vnode, such as not created, dropped, no space, invalid table
|
int32_t numOfRows;
|
||||||
} SSubmitRspBlock;
|
int32_t affectedRows;
|
||||||
|
} SSubmitBlkRsp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t code; // 0-success, > 0 error code
|
int32_t numOfRows;
|
||||||
int32_t numOfRows; // number of records the client is trying to write
|
int32_t affectedRows;
|
||||||
int32_t affectedRows; // number of records actually written
|
int32_t nBlocks;
|
||||||
int32_t failedRows; // number of failed records (exclude duplicate records)
|
union {
|
||||||
int32_t numOfFailedBlocks;
|
SArray* pArray;
|
||||||
SSubmitRspBlock failedBlocks[];
|
SSubmitBlkRsp* pBlocks;
|
||||||
|
};
|
||||||
} SSubmitRsp;
|
} SSubmitRsp;
|
||||||
|
|
||||||
|
int32_t tEncodeSSubmitRsp(SEncoder* pEncoder, const SSubmitRsp* pRsp);
|
||||||
|
int32_t tDecodeSSubmitRsp(SDecoder* pDecoder, SSubmitRsp* pRsp);
|
||||||
|
void tFreeSSubmitRsp(SSubmitRsp *pRsp);
|
||||||
|
|
||||||
#define COL_SMA_ON ((int8_t)0x1)
|
#define COL_SMA_ON ((int8_t)0x1)
|
||||||
#define COL_IDX_ON ((int8_t)0x2)
|
#define COL_IDX_ON ((int8_t)0x2)
|
||||||
#define COL_VAL_SET ((int8_t)0x4)
|
#define COL_VAL_SET ((int8_t)0x4)
|
||||||
|
|
||||||
typedef struct SSchema {
|
typedef struct SSchema {
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int8_t flags;
|
int8_t flags;
|
||||||
|
@ -476,6 +483,7 @@ typedef struct {
|
||||||
int32_t acctId;
|
int32_t acctId;
|
||||||
int64_t clusterId;
|
int64_t clusterId;
|
||||||
uint32_t connId;
|
uint32_t connId;
|
||||||
|
int32_t dnodeNum;
|
||||||
int8_t superUser;
|
int8_t superUser;
|
||||||
int8_t connType;
|
int8_t connType;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
|
|
|
@ -36,12 +36,11 @@ typedef struct SVariant {
|
||||||
};
|
};
|
||||||
} SVariant;
|
} SVariant;
|
||||||
|
|
||||||
int32_t toInteger(const char *z, int32_t n, int32_t base, int64_t *value, bool *issigned);
|
int32_t toInteger(const char *z, int32_t n, int32_t base, int64_t *value);
|
||||||
|
int32_t toUInteger(const char *z, int32_t n, int32_t base, uint64_t *value);
|
||||||
|
|
||||||
bool taosVariantIsValid(SVariant *pVar);
|
bool taosVariantIsValid(SVariant *pVar);
|
||||||
|
|
||||||
void taosVariantCreate(SVariant *pVar, const char *z, int32_t n, int32_t type);
|
|
||||||
|
|
||||||
void taosVariantCreateFromBinary(SVariant *pVar, const char *pz, size_t len, uint32_t type);
|
void taosVariantCreateFromBinary(SVariant *pVar, const char *pz, size_t len, uint32_t type);
|
||||||
|
|
||||||
void taosVariantDestroy(SVariant *pV);
|
void taosVariantDestroy(SVariant *pV);
|
||||||
|
@ -59,10 +58,10 @@ int32_t taosVariantDumpEx(SVariant *pVariant, char *payload, int16_t type, bool
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t taosVariantTypeSetType(SVariant *pVariant, char type);
|
int32_t taosVariantTypeSetType(SVariant *pVariant, char type);
|
||||||
char * taosVariantGet(SVariant *pVar, int32_t type);
|
char *taosVariantGet(SVariant *pVar, int32_t type);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_COMMON_VARIANT_H_*/
|
#endif /*_TD_COMMON_VARIANT_H_*/
|
||||||
|
|
|
@ -26,8 +26,7 @@ extern "C" {
|
||||||
typedef struct SStmtCallback {
|
typedef struct SStmtCallback {
|
||||||
TAOS_STMT* pStmt;
|
TAOS_STMT* pStmt;
|
||||||
int32_t (*getTbNameFn)(TAOS_STMT*, char**);
|
int32_t (*getTbNameFn)(TAOS_STMT*, char**);
|
||||||
int32_t (*setBindInfoFn)(TAOS_STMT*, STableMeta*, void*);
|
int32_t (*setInfoFn)(TAOS_STMT*, STableMeta*, void*, char*, bool, SHashObj*, SHashObj*);
|
||||||
int32_t (*setExecInfoFn)(TAOS_STMT*, SHashObj*, SHashObj*);
|
|
||||||
int32_t (*getExecInfoFn)(TAOS_STMT*, SHashObj**, SHashObj**);
|
int32_t (*getExecInfoFn)(TAOS_STMT*, SHashObj**, SHashObj**);
|
||||||
} SStmtCallback;
|
} SStmtCallback;
|
||||||
|
|
||||||
|
@ -59,8 +58,9 @@ int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash
|
||||||
int32_t qResetStmtDataBlock(void* block, bool keepBuf);
|
int32_t qResetStmtDataBlock(void* block, bool keepBuf);
|
||||||
int32_t qCloneStmtDataBlock(void** pDst, void* pSrc);
|
int32_t qCloneStmtDataBlock(void** pDst, void* pSrc);
|
||||||
void qFreeStmtDataBlock(void* pDataBlock);
|
void qFreeStmtDataBlock(void* pDataBlock);
|
||||||
int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc);
|
int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc, uint64_t uid, int32_t vgId);
|
||||||
void qDestroyStmtDataBlock(void* pBlock);
|
void qDestroyStmtDataBlock(void* pBlock);
|
||||||
|
STableMeta *qGetTableMetaInDataBlock(void* pDataBlock);
|
||||||
|
|
||||||
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen);
|
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen);
|
||||||
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
||||||
|
|
|
@ -48,7 +48,8 @@ int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNo
|
||||||
// @pSource one execution location of this group of datasource subplans
|
// @pSource one execution location of this group of datasource subplans
|
||||||
int32_t qSetSubplanExecutionNode(SSubplan* pSubplan, int32_t groupId, SDownstreamSourceNode* pSource);
|
int32_t qSetSubplanExecutionNode(SSubplan* pSubplan, int32_t groupId, SDownstreamSourceNode* pSource);
|
||||||
|
|
||||||
int32_t qStmtBindParam(SQueryPlan* pPlan, TAOS_MULTI_BIND* pParams, int32_t colIdx, uint64_t queryId);
|
int32_t qStmtBindParam(SQueryPlan* pPlan, TAOS_MULTI_BIND* pParams, int32_t colIdx, uint64_t queryId,
|
||||||
|
bool* pEmptyResult);
|
||||||
|
|
||||||
// Convert to subplan to string for the scheduler to send to the executor
|
// Convert to subplan to string for the scheduler to send to the executor
|
||||||
int32_t qSubPlanToString(const SSubplan* pSubplan, char** pStr, int32_t* pLen);
|
int32_t qSubPlanToString(const SSubplan* pSubplan, char** pStr, int32_t* pLen);
|
||||||
|
|
|
@ -56,6 +56,7 @@ typedef struct SQueryResult {
|
||||||
uint64_t numOfRows;
|
uint64_t numOfRows;
|
||||||
int32_t msgSize;
|
int32_t msgSize;
|
||||||
char *msg;
|
char *msg;
|
||||||
|
void *res;
|
||||||
} SQueryResult;
|
} SQueryResult;
|
||||||
|
|
||||||
typedef struct STaskInfo {
|
typedef struct STaskInfo {
|
||||||
|
@ -71,7 +72,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg);
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, int64_t *pJob, const char *sql, int64_t startTs, SQueryResult *pRes);
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, int64_t *pJob, const char *sql, int64_t startTs, bool needRes, SQueryResult *pRes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the query job, generated according to the query physical plan.
|
* Process the query job, generated according to the query physical plan.
|
||||||
|
|
|
@ -307,9 +307,9 @@ int hbAddConnInfo(SAppHbMgr* pAppHbMgr, SClientHbKey connKey, void* key, void* v
|
||||||
// --- mq
|
// --- mq
|
||||||
void hbMgrInitMqHbRspHandle();
|
void hbMgrInitMqHbRspHandle();
|
||||||
|
|
||||||
SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, int32_t code, bool keepQuery);
|
SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, int32_t code, bool keepQuery, void** res);
|
||||||
int32_t getQueryPlan(SRequestObj* pRequest, SQuery* pQuery, SArray** pNodeList);
|
int32_t getQueryPlan(SRequestObj* pRequest, SQuery* pQuery, SArray** pNodeList);
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList);
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList, void** res);
|
||||||
int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest);
|
int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -55,6 +55,7 @@ typedef struct SStmtQueryResInfo {
|
||||||
|
|
||||||
typedef struct SStmtBindInfo {
|
typedef struct SStmtBindInfo {
|
||||||
bool needParse;
|
bool needParse;
|
||||||
|
bool inExecCache;
|
||||||
uint64_t tbUid;
|
uint64_t tbUid;
|
||||||
uint64_t tbSuid;
|
uint64_t tbSuid;
|
||||||
int32_t sBindRowNum;
|
int32_t sBindRowNum;
|
||||||
|
@ -62,7 +63,9 @@ typedef struct SStmtBindInfo {
|
||||||
int8_t tbType;
|
int8_t tbType;
|
||||||
bool tagsCached;
|
bool tagsCached;
|
||||||
void* boundTags;
|
void* boundTags;
|
||||||
char* tbName;
|
char tbName[TSDB_TABLE_FNAME_LEN];;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
char stbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
SName sname;
|
SName sname;
|
||||||
} SStmtBindInfo;
|
} SStmtBindInfo;
|
||||||
|
|
||||||
|
@ -71,12 +74,12 @@ typedef struct SStmtExecInfo {
|
||||||
SRequestObj* pRequest;
|
SRequestObj* pRequest;
|
||||||
SHashObj* pVgHash;
|
SHashObj* pVgHash;
|
||||||
SHashObj* pBlockHash;
|
SHashObj* pBlockHash;
|
||||||
|
bool autoCreateTbl;
|
||||||
} SStmtExecInfo;
|
} SStmtExecInfo;
|
||||||
|
|
||||||
typedef struct SStmtSQLInfo {
|
typedef struct SStmtSQLInfo {
|
||||||
STMT_TYPE type;
|
STMT_TYPE type;
|
||||||
STMT_STATUS status;
|
STMT_STATUS status;
|
||||||
bool autoCreate;
|
|
||||||
uint64_t runTimes;
|
uint64_t runTimes;
|
||||||
SHashObj* pTableCache; //SHash<SStmtTableCache>
|
SHashObj* pTableCache; //SHash<SStmtTableCache>
|
||||||
SQuery* pQuery;
|
SQuery* pQuery;
|
||||||
|
@ -85,6 +88,7 @@ typedef struct SStmtSQLInfo {
|
||||||
SArray* nodeList;
|
SArray* nodeList;
|
||||||
SQueryPlan* pQueryPlan;
|
SQueryPlan* pQueryPlan;
|
||||||
SStmtQueryResInfo queryRes;
|
SStmtQueryResInfo queryRes;
|
||||||
|
bool autoCreateTbl;
|
||||||
} SStmtSQLInfo;
|
} SStmtSQLInfo;
|
||||||
|
|
||||||
typedef struct STscStmt {
|
typedef struct STscStmt {
|
||||||
|
|
|
@ -286,12 +286,12 @@ void setResPrecision(SReqResultInfo* pResInfo, int32_t precision) {
|
||||||
pResInfo->precision = precision;
|
pResInfo->precision = precision;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList) {
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList, void** pRes) {
|
||||||
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
|
||||||
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
||||||
int32_t code = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr,
|
int32_t code = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr,
|
||||||
pRequest->metric.start, &res);
|
pRequest->metric.start, NULL != pRes, &res);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
if (pRequest->body.queryJob != 0) {
|
if (pRequest->body.queryJob != 0) {
|
||||||
schedulerFreeJob(pRequest->body.queryJob);
|
schedulerFreeJob(pRequest->body.queryJob);
|
||||||
|
@ -310,6 +310,10 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pRes) {
|
||||||
|
*pRes = res.res;
|
||||||
|
}
|
||||||
|
|
||||||
pRequest->code = res.code;
|
pRequest->code = res.code;
|
||||||
terrno = res.code;
|
terrno = res.code;
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
|
@ -320,7 +324,7 @@ int32_t getQueryPlan(SRequestObj* pRequest, SQuery* pQuery, SArray** pNodeList)
|
||||||
return getPlan(pRequest, pQuery, &pRequest->body.pDag, *pNodeList);
|
return getPlan(pRequest, pQuery, &pRequest->body.pDag, *pNodeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, int32_t code, bool keepQuery) {
|
SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, int32_t code, bool keepQuery, void** res) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
switch (pQuery->execMode) {
|
switch (pQuery->execMode) {
|
||||||
case QUERY_EXEC_MODE_LOCAL:
|
case QUERY_EXEC_MODE_LOCAL:
|
||||||
|
@ -333,7 +337,7 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, int32_t code
|
||||||
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
||||||
code = getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList);
|
code = getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = scheduleQuery(pRequest, pRequest->body.pDag, pNodeList);
|
code = scheduleQuery(pRequest, pRequest->body.pDag, pNodeList, res);
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pNodeList);
|
taosArrayDestroy(pNodeList);
|
||||||
break;
|
break;
|
||||||
|
@ -373,7 +377,7 @@ SRequestObj* launchQuery(STscObj* pTscObj, const char* sql, int sqlLen) {
|
||||||
return pRequest;
|
return pRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
return launchQueryImpl(pRequest, pQuery, code, false);
|
return launchQueryImpl(pRequest, pQuery, code, false, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) {
|
int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) {
|
||||||
|
|
|
@ -58,7 +58,7 @@ int32_t processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEpsetEqual(&pTscObj->pAppInfo->mgmtEp.epSet, &connectRsp.epSet)) {
|
if (connectRsp.dnodeNum > 1 && !isEpsetEqual(&pTscObj->pAppInfo->mgmtEp.epSet, &connectRsp.epSet)) {
|
||||||
updateEpSet_s(&pTscObj->pAppInfo->mgmtEp, &connectRsp.epSet);
|
updateEpSet_s(&pTscObj->pAppInfo->mgmtEp, &connectRsp.epSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -402,7 +402,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle* info) {
|
||||||
code = catalogGetSTableMeta(info->pCatalog, info->taos->pAppInfo->pTransporter, &ep, &pName, &pTableMeta);
|
code = catalogGetSTableMeta(info->pCatalog, info->taos->pAppInfo->pTransporter, &ep, &pName, &pTableMeta);
|
||||||
|
|
||||||
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_MND_INVALID_STB) {
|
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_MND_INVALID_STB) {
|
||||||
SSchemaAction schemaAction = {.action = SCHEMA_ACTION_CREATE_STABLE};
|
SSchemaAction schemaAction = { SCHEMA_ACTION_CREATE_STABLE, 0};
|
||||||
memcpy(schemaAction.createSTable.sTableName, superTable, superTableLen);
|
memcpy(schemaAction.createSTable.sTableName, superTable, superTableLen);
|
||||||
schemaAction.createSTable.tags = sTableData->tags;
|
schemaAction.createSTable.tags = sTableData->tags;
|
||||||
schemaAction.createSTable.fields = sTableData->cols;
|
schemaAction.createSTable.fields = sTableData->cols;
|
||||||
|
@ -1505,8 +1505,8 @@ static int32_t smlParseLine(SSmlHandle* info, const char* sql) {
|
||||||
|
|
||||||
tinfo->sTableName = elements.measure;
|
tinfo->sTableName = elements.measure;
|
||||||
tinfo->sTableNameLen = elements.measureLen;
|
tinfo->sTableNameLen = elements.measureLen;
|
||||||
RandTableName rName = {.tags=tinfo->tags, .sTableName=tinfo->sTableName, .sTableNameLen=tinfo->sTableNameLen,
|
RandTableName rName = { tinfo->tags, tinfo->sTableName, tinfo->sTableNameLen,
|
||||||
.childTableName=tinfo->childTableName};
|
tinfo->childTableName, 0 };
|
||||||
buildChildTableName(&rName);
|
buildChildTableName(&rName);
|
||||||
tinfo->uid = rName.uid;
|
tinfo->uid = rName.uid;
|
||||||
|
|
||||||
|
@ -1660,7 +1660,7 @@ static int32_t smlInsertData(SSmlHandle* info) {
|
||||||
smlBuildOutput(info->exec, info->pVgHash);
|
smlBuildOutput(info->exec, info->pVgHash);
|
||||||
info->cost.insertRpcTime = taosGetTimestampUs();
|
info->cost.insertRpcTime = taosGetTimestampUs();
|
||||||
|
|
||||||
launchQueryImpl(info->pRequest, info->pQuery, TSDB_CODE_SUCCESS, true);
|
launchQueryImpl(info->pRequest, info->pQuery, TSDB_CODE_SUCCESS, true, NULL);
|
||||||
|
|
||||||
info->affectedRows = taos_affected_rows(info->pRequest);
|
info->affectedRows = taos_affected_rows(info->pRequest);
|
||||||
return info->pRequest->code;
|
return info->pRequest->code;
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
|
||||||
#include "clientInt.h"
|
#include "clientInt.h"
|
||||||
#include "clientLog.h"
|
#include "clientLog.h"
|
||||||
#include "clientStmt.h"
|
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
|
||||||
|
#include "clientStmt.h"
|
||||||
|
|
||||||
int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
switch (newStatus) {
|
switch (newStatus) {
|
||||||
case STMT_PREPARE:
|
case STMT_PREPARE:
|
||||||
break;
|
break;
|
||||||
|
@ -29,11 +30,11 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
||||||
if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND_COL)) {
|
if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND_COL)) {
|
||||||
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
if ((pStmt->sql.type == STMT_TYPE_MULTI_INSERT) && ()) {
|
if ((pStmt->sql.type == STMT_TYPE_MULTI_INSERT) && ()) {
|
||||||
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
case STMT_BIND_COL:
|
case STMT_BIND_COL:
|
||||||
if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND)) {
|
if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND)) {
|
||||||
|
@ -62,13 +63,12 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t stmtGetTbName(TAOS_STMT* stmt, char** tbName) {
|
||||||
int32_t stmtGetTbName(TAOS_STMT *stmt, char **tbName) {
|
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
pStmt->sql.type = STMT_TYPE_MULTI_INSERT;
|
pStmt->sql.type = STMT_TYPE_MULTI_INSERT;
|
||||||
|
|
||||||
if (NULL == pStmt->bInfo.tbName) {
|
if ('\0' == pStmt->bInfo.tbName[0]) {
|
||||||
tscError("no table name set");
|
tscError("no table name set");
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_TBNAME_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_STMT_TBNAME_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -79,10 +79,10 @@ int32_t stmtGetTbName(TAOS_STMT *stmt, char **tbName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtBackupQueryFields(STscStmt* pStmt) {
|
int32_t stmtBackupQueryFields(STscStmt* pStmt) {
|
||||||
SStmtQueryResInfo *pRes = &pStmt->sql.queryRes;
|
SStmtQueryResInfo* pRes = &pStmt->sql.queryRes;
|
||||||
pRes->numOfCols = pStmt->exec.pRequest->body.resInfo.numOfCols;
|
pRes->numOfCols = pStmt->exec.pRequest->body.resInfo.numOfCols;
|
||||||
pRes->precision = pStmt->exec.pRequest->body.resInfo.precision;
|
pRes->precision = pStmt->exec.pRequest->body.resInfo.precision;
|
||||||
|
|
||||||
int32_t size = pRes->numOfCols * sizeof(TAOS_FIELD);
|
int32_t size = pRes->numOfCols * sizeof(TAOS_FIELD);
|
||||||
pRes->fields = taosMemoryMalloc(size);
|
pRes->fields = taosMemoryMalloc(size);
|
||||||
pRes->userFields = taosMemoryMalloc(size);
|
pRes->userFields = taosMemoryMalloc(size);
|
||||||
|
@ -96,9 +96,9 @@ int32_t stmtBackupQueryFields(STscStmt* pStmt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
|
int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
|
||||||
SStmtQueryResInfo *pRes = &pStmt->sql.queryRes;
|
SStmtQueryResInfo* pRes = &pStmt->sql.queryRes;
|
||||||
int32_t size = pRes->numOfCols * sizeof(TAOS_FIELD);
|
int32_t size = pRes->numOfCols * sizeof(TAOS_FIELD);
|
||||||
|
|
||||||
pStmt->exec.pRequest->body.resInfo.numOfCols = pRes->numOfCols;
|
pStmt->exec.pRequest->body.resInfo.numOfCols = pRes->numOfCols;
|
||||||
pStmt->exec.pRequest->body.resInfo.precision = pRes->precision;
|
pStmt->exec.pRequest->body.resInfo.precision = pRes->precision;
|
||||||
|
|
||||||
|
@ -121,9 +121,12 @@ int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtSetBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags) {
|
int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
strncpy(pStmt->bInfo.tbFName, tbFName, sizeof(pStmt->bInfo.tbFName) - 1);
|
||||||
|
pStmt->bInfo.tbFName[sizeof(pStmt->bInfo.tbFName) - 1] = 0;
|
||||||
|
|
||||||
pStmt->bInfo.tbUid = pTableMeta->uid;
|
pStmt->bInfo.tbUid = pTableMeta->uid;
|
||||||
pStmt->bInfo.tbSuid = pTableMeta->suid;
|
pStmt->bInfo.tbSuid = pTableMeta->suid;
|
||||||
pStmt->bInfo.tbType = pTableMeta->tableType;
|
pStmt->bInfo.tbType = pTableMeta->tableType;
|
||||||
|
@ -133,15 +136,28 @@ int32_t stmtSetBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtSetExecInfo(TAOS_STMT* stmt, SHashObj* pVgHash, SHashObj* pBlockHash) {
|
int32_t stmtUpdateExecInfo(TAOS_STMT* stmt, SHashObj* pVgHash, SHashObj* pBlockHash, bool autoCreateTbl) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
pStmt->exec.pVgHash = pVgHash;
|
pStmt->exec.pVgHash = pVgHash;
|
||||||
pStmt->exec.pBlockHash = pBlockHash;
|
pStmt->exec.pBlockHash = pBlockHash;
|
||||||
|
pStmt->exec.autoCreateTbl = autoCreateTbl;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t stmtUpdateInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName, bool autoCreateTbl, SHashObj* pVgHash, SHashObj* pBlockHash) {
|
||||||
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtUpdateBindInfo(stmt, pTableMeta, tags, tbFName));
|
||||||
|
STMT_ERR_RET(stmtUpdateExecInfo(stmt, pVgHash, pBlockHash, autoCreateTbl));
|
||||||
|
|
||||||
|
pStmt->sql.autoCreateTbl = autoCreateTbl;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t stmtGetExecInfo(TAOS_STMT* stmt, SHashObj** pVgHash, SHashObj** pBlockHash) {
|
int32_t stmtGetExecInfo(TAOS_STMT* stmt, SHashObj** pVgHash, SHashObj** pBlockHash) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
@ -151,34 +167,38 @@ int32_t stmtGetExecInfo(TAOS_STMT* stmt, SHashObj** pVgHash, SHashObj** pBlockHa
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtCacheBlock(STscStmt *pStmt) {
|
int32_t stmtCacheBlock(STscStmt* pStmt) {
|
||||||
if (pStmt->sql.type != STMT_TYPE_MULTI_INSERT) {
|
if (pStmt->sql.type != STMT_TYPE_MULTI_INSERT) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t uid = pStmt->bInfo.tbUid;
|
uint64_t uid = pStmt->bInfo.tbUid;
|
||||||
uint64_t tuid = (TSDB_CHILD_TABLE == pStmt->bInfo.tbType) ? pStmt->bInfo.tbSuid : uid;
|
uint64_t cacheUid = (TSDB_CHILD_TABLE == pStmt->bInfo.tbType) ? pStmt->bInfo.tbSuid : uid;
|
||||||
|
|
||||||
if (taosHashGet(pStmt->sql.pTableCache, &tuid, sizeof(tuid))) {
|
if (taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid))) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataBlocks** pSrc = taosHashGet(pStmt->exec.pBlockHash, &uid, sizeof(uid));
|
STableDataBlocks** pSrc = taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
STableDataBlocks* pDst = NULL;
|
STableDataBlocks* pDst = NULL;
|
||||||
|
|
||||||
STMT_ERR_RET(qCloneStmtDataBlock(&pDst, *pSrc));
|
STMT_ERR_RET(qCloneStmtDataBlock(&pDst, *pSrc));
|
||||||
|
|
||||||
SStmtTableCache cache = {
|
SStmtTableCache cache = {
|
||||||
.pDataBlock = pDst,
|
.pDataBlock = pDst,
|
||||||
.boundTags = pStmt->bInfo.boundTags,
|
.boundTags = pStmt->bInfo.boundTags,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (taosHashPut(pStmt->sql.pTableCache, &tuid, sizeof(tuid), &cache, sizeof(cache))) {
|
if (taosHashPut(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid), &cache, sizeof(cache))) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStmt->bInfo.boundTags = NULL;
|
if (pStmt->sql.autoCreateTbl) {
|
||||||
|
pStmt->bInfo.tagsCached = true;
|
||||||
|
} else {
|
||||||
|
pStmt->bInfo.boundTags = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,19 +206,18 @@ int32_t stmtParseSql(STscStmt* pStmt) {
|
||||||
SStmtCallback stmtCb = {
|
SStmtCallback stmtCb = {
|
||||||
.pStmt = pStmt,
|
.pStmt = pStmt,
|
||||||
.getTbNameFn = stmtGetTbName,
|
.getTbNameFn = stmtGetTbName,
|
||||||
.setBindInfoFn = stmtSetBindInfo,
|
.setInfoFn = stmtUpdateInfo,
|
||||||
.setExecInfoFn = stmtSetExecInfo,
|
|
||||||
.getExecInfoFn = stmtGetExecInfo,
|
.getExecInfoFn = stmtGetExecInfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (NULL == pStmt->exec.pRequest) {
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(parseSql(pStmt->exec.pRequest, false, &pStmt->sql.pQuery, &stmtCb));
|
STMT_ERR_RET(parseSql(pStmt->exec.pRequest, false, &pStmt->sql.pQuery, &stmtCb));
|
||||||
|
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
|
|
||||||
switch (nodeType(pStmt->sql.pQuery->pRoot)) {
|
switch (nodeType(pStmt->sql.pQuery->pRoot)) {
|
||||||
case QUERY_NODE_VNODE_MODIF_STMT:
|
case QUERY_NODE_VNODE_MODIF_STMT:
|
||||||
if (0 == pStmt->sql.type) {
|
if (0 == pStmt->sql.type) {
|
||||||
|
@ -221,8 +240,10 @@ int32_t stmtCleanBindInfo(STscStmt* pStmt) {
|
||||||
pStmt->bInfo.tbSuid = 0;
|
pStmt->bInfo.tbSuid = 0;
|
||||||
pStmt->bInfo.tbType = 0;
|
pStmt->bInfo.tbType = 0;
|
||||||
pStmt->bInfo.needParse = true;
|
pStmt->bInfo.needParse = true;
|
||||||
|
pStmt->bInfo.inExecCache = false;
|
||||||
|
|
||||||
taosMemoryFreeClear(pStmt->bInfo.tbName);
|
pStmt->bInfo.tbName[0] = 0;
|
||||||
|
pStmt->bInfo.tbFName[0] = 0;
|
||||||
if (!pStmt->bInfo.tagsCached) {
|
if (!pStmt->bInfo.tagsCached) {
|
||||||
destroyBoundColumnInfo(pStmt->bInfo.boundTags);
|
destroyBoundColumnInfo(pStmt->bInfo.boundTags);
|
||||||
taosMemoryFreeClear(pStmt->bInfo.boundTags);
|
taosMemoryFreeClear(pStmt->bInfo.boundTags);
|
||||||
|
@ -237,24 +258,28 @@ int32_t stmtCleanExecInfo(STscStmt* pStmt, bool keepTable, bool freeRequest) {
|
||||||
pStmt->exec.pRequest = NULL;
|
pStmt->exec.pRequest = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t keyLen = 0;
|
||||||
void *pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
|
void *pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
STableDataBlocks* pBlocks = *(STableDataBlocks**)pIter;
|
STableDataBlocks* pBlocks = *(STableDataBlocks**)pIter;
|
||||||
uint64_t *key = taosHashGetKey(pIter, NULL);
|
char *key = taosHashGetKey(pIter, &keyLen);
|
||||||
|
STableMeta* pMeta = qGetTableMetaInDataBlock(pBlocks);
|
||||||
|
|
||||||
if (keepTable && (*key == pStmt->bInfo.tbUid)) {
|
if (keepTable && (strlen(pStmt->bInfo.tbFName) == keyLen) && strncmp(pStmt->bInfo.tbFName, key, keyLen) == 0) {
|
||||||
STMT_ERR_RET(qResetStmtDataBlock(pBlocks, true));
|
STMT_ERR_RET(qResetStmtDataBlock(pBlocks, true));
|
||||||
|
|
||||||
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
qFreeStmtDataBlock(pBlocks);
|
qFreeStmtDataBlock(pBlocks);
|
||||||
taosHashRemove(pStmt->exec.pBlockHash, key, sizeof(*key));
|
taosHashRemove(pStmt->exec.pBlockHash, key, keyLen);
|
||||||
|
|
||||||
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pStmt->exec.autoCreateTbl = false;
|
||||||
|
|
||||||
if (keepTable) {
|
if (keepTable) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -274,15 +299,15 @@ int32_t stmtCleanSQLInfo(STscStmt* pStmt) {
|
||||||
qDestroyQuery(pStmt->sql.pQuery);
|
qDestroyQuery(pStmt->sql.pQuery);
|
||||||
qDestroyQueryPlan(pStmt->sql.pQueryPlan);
|
qDestroyQueryPlan(pStmt->sql.pQueryPlan);
|
||||||
taosArrayDestroy(pStmt->sql.nodeList);
|
taosArrayDestroy(pStmt->sql.nodeList);
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pStmt->sql.pTableCache, NULL);
|
void* pIter = taosHashIterate(pStmt->sql.pTableCache, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SStmtTableCache* pCache = (SStmtTableCache*)pIter;
|
SStmtTableCache* pCache = (SStmtTableCache*)pIter;
|
||||||
|
|
||||||
qDestroyStmtDataBlock(pCache->pDataBlock);
|
qDestroyStmtDataBlock(pCache->pDataBlock);
|
||||||
destroyBoundColumnInfo(pCache->boundTags);
|
destroyBoundColumnInfo(pCache->boundTags);
|
||||||
taosMemoryFreeClear(pCache->boundTags);
|
taosMemoryFreeClear(pCache->boundTags);
|
||||||
|
|
||||||
pIter = taosHashIterate(pStmt->sql.pTableCache, pIter);
|
pIter = taosHashIterate(pStmt->sql.pTableCache, pIter);
|
||||||
}
|
}
|
||||||
taosHashCleanup(pStmt->sql.pTableCache);
|
taosHashCleanup(pStmt->sql.pTableCache);
|
||||||
|
@ -296,10 +321,39 @@ int32_t stmtCleanSQLInfo(STscStmt* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t stmtRebuildDataBlock(STscStmt* pStmt, STableDataBlocks *pDataBlock, STableDataBlocks **newBlock, uint64_t uid) {
|
||||||
|
SEpSet ep = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp);
|
||||||
|
SVgroupInfo vgInfo = {0};
|
||||||
|
|
||||||
|
STMT_ERR_RET(catalogGetTableHashVgroup(pStmt->pCatalog, pStmt->taos->pAppInfo->pTransporter, &ep, &pStmt->bInfo.sname, &vgInfo));
|
||||||
|
STMT_ERR_RET(taosHashPut(pStmt->exec.pVgHash, (const char*)&vgInfo.vgId, sizeof(vgInfo.vgId), (char*)&vgInfo, sizeof(vgInfo)));
|
||||||
|
|
||||||
|
STMT_ERR_RET(qRebuildStmtDataBlock(newBlock, pDataBlock, uid, vgInfo.vgId));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t stmtGetFromCache(STscStmt* pStmt) {
|
int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
pStmt->bInfo.needParse = true;
|
pStmt->bInfo.needParse = true;
|
||||||
|
pStmt->bInfo.inExecCache = false;
|
||||||
|
|
||||||
|
STableDataBlocks *pBlockInExec = taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
|
if (pBlockInExec) {
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
pStmt->bInfo.inExecCache = true;
|
||||||
|
|
||||||
|
if (pStmt->sql.autoCreateTbl) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (NULL == pStmt->sql.pTableCache || taosHashGetSize(pStmt->sql.pTableCache) <= 0) {
|
if (NULL == pStmt->sql.pTableCache || taosHashGetSize(pStmt->sql.pTableCache) <= 0) {
|
||||||
|
if (pStmt->bInfo.inExecCache) {
|
||||||
|
ASSERT(taosHashGetSize(pStmt->exec.pBlockHash) == 1);
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,21 +361,44 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
STMT_ERR_RET(catalogGetHandle(pStmt->taos->pAppInfo->clusterId, &pStmt->pCatalog));
|
STMT_ERR_RET(catalogGetHandle(pStmt->taos->pAppInfo->clusterId, &pStmt->pCatalog));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pStmt->sql.autoCreateTbl) {
|
||||||
|
SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &pStmt->bInfo.tbSuid, sizeof(pStmt->bInfo.tbSuid));
|
||||||
|
if (pCache) {
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
pStmt->exec.autoCreateTbl = true;
|
||||||
|
|
||||||
|
pStmt->bInfo.tbUid = 0;
|
||||||
|
|
||||||
|
STableDataBlocks* pNewBlock = NULL;
|
||||||
|
STMT_ERR_RET(stmtRebuildDataBlock(pStmt, pCache->pDataBlock, &pNewBlock, 0));
|
||||||
|
|
||||||
|
if (taosHashPut(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName), &pNewBlock, POINTER_BYTES)) {
|
||||||
|
STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_RET(stmtCleanBindInfo(pStmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
STableMeta *pTableMeta = NULL;
|
STableMeta *pTableMeta = NULL;
|
||||||
SEpSet ep = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp);
|
SEpSet ep = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp);
|
||||||
int32_t code = catalogGetTableMeta(pStmt->pCatalog, pStmt->taos->pAppInfo->pTransporter, &ep, &pStmt->bInfo.sname, &pTableMeta);
|
int32_t code = catalogGetTableMeta(pStmt->pCatalog, pStmt->taos->pAppInfo->pTransporter, &ep, &pStmt->bInfo.sname, &pTableMeta);
|
||||||
if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
|
if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
|
||||||
STMT_ERR_RET(stmtCleanBindInfo(pStmt));
|
STMT_ERR_RET(stmtCleanBindInfo(pStmt));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(code);
|
STMT_ERR_RET(code);
|
||||||
|
|
||||||
uint64_t uid = pTableMeta->uid;
|
uint64_t uid = pTableMeta->uid;
|
||||||
uint64_t suid = pTableMeta->suid;
|
uint64_t suid = pTableMeta->suid;
|
||||||
int8_t tableType = pTableMeta->tableType;
|
int8_t tableType = pTableMeta->tableType;
|
||||||
taosMemoryFree(pTableMeta);
|
taosMemoryFree(pTableMeta);
|
||||||
|
uint64_t cacheUid = (TSDB_CHILD_TABLE == tableType) ? suid : uid;
|
||||||
|
|
||||||
if (uid == pStmt->bInfo.tbUid) {
|
if (uid == pStmt->bInfo.tbUid) {
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
|
@ -329,16 +406,16 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosHashGet(pStmt->exec.pBlockHash, &uid, sizeof(uid))) {
|
if (pStmt->bInfo.inExecCache) {
|
||||||
SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &uid, sizeof(uid));
|
SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid));
|
||||||
if (NULL == pCache) {
|
if (NULL == pCache) {
|
||||||
tscError("table uid %" PRIx64 "found in exec blockHash, but not in sql blockHash", uid);
|
tscError("table [%s, %" PRIx64 ", %" PRIx64 "] found in exec blockHash, but not in sql blockHash", pStmt->bInfo.tbFName, uid, cacheUid);
|
||||||
|
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
|
|
||||||
pStmt->bInfo.tbUid = uid;
|
pStmt->bInfo.tbUid = uid;
|
||||||
pStmt->bInfo.tbSuid = suid;
|
pStmt->bInfo.tbSuid = suid;
|
||||||
pStmt->bInfo.tbType = tableType;
|
pStmt->bInfo.tbType = tableType;
|
||||||
|
@ -348,7 +425,7 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &uid, sizeof(uid));
|
SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid));
|
||||||
if (pCache) {
|
if (pCache) {
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
|
|
||||||
|
@ -359,12 +436,12 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
pStmt->bInfo.tagsCached = true;
|
pStmt->bInfo.tagsCached = true;
|
||||||
|
|
||||||
STableDataBlocks* pNewBlock = NULL;
|
STableDataBlocks* pNewBlock = NULL;
|
||||||
STMT_ERR_RET(qRebuildStmtDataBlock(&pNewBlock, pCache->pDataBlock));
|
STMT_ERR_RET(stmtRebuildDataBlock(pStmt, pCache->pDataBlock, &pNewBlock, uid));
|
||||||
|
|
||||||
if (taosHashPut(pStmt->exec.pBlockHash, &pStmt->bInfo.tbUid, sizeof(pStmt->bInfo.tbUid), &pNewBlock, POINTER_BYTES)) {
|
if (taosHashPut(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName), &pNewBlock, POINTER_BYTES)) {
|
||||||
STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,9 +464,8 @@ int32_t stmtResetStmt(STscStmt* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TAOS_STMT* stmtInit(TAOS* taos) {
|
||||||
TAOS_STMT *stmtInit(TAOS *taos) {
|
STscObj* pObj = (STscObj*)taos;
|
||||||
STscObj* pObj = (STscObj*)taos;
|
|
||||||
STscStmt* pStmt = NULL;
|
STscStmt* pStmt = NULL;
|
||||||
|
|
||||||
pStmt = taosMemoryCalloc(1, sizeof(STscStmt));
|
pStmt = taosMemoryCalloc(1, sizeof(STscStmt));
|
||||||
|
@ -408,11 +484,11 @@ TAOS_STMT *stmtInit(TAOS *taos) {
|
||||||
pStmt->taos = pObj;
|
pStmt->taos = pObj;
|
||||||
pStmt->bInfo.needParse = true;
|
pStmt->bInfo.needParse = true;
|
||||||
pStmt->sql.status = STMT_INIT;
|
pStmt->sql.status = STMT_INIT;
|
||||||
|
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtPrepare(TAOS_STMT *stmt, const char *sql, unsigned long length) {
|
int stmtPrepare(TAOS_STMT* stmt, const char* sql, unsigned long length) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
if (pStmt->sql.status >= STMT_PREPARE) {
|
if (pStmt->sql.status >= STMT_PREPARE) {
|
||||||
|
@ -424,15 +500,14 @@ int stmtPrepare(TAOS_STMT *stmt, const char *sql, unsigned long length) {
|
||||||
if (length <= 0) {
|
if (length <= 0) {
|
||||||
length = strlen(sql);
|
length = strlen(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
pStmt->sql.sqlStr = strndup(sql, length);
|
pStmt->sql.sqlStr = strndup(sql, length);
|
||||||
pStmt->sql.sqlLen = length;
|
pStmt->sql.sqlLen = length;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) {
|
||||||
int stmtSetTbName(TAOS_STMT *stmt, const char *tbName) {
|
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTBNAME));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTBNAME));
|
||||||
|
@ -449,49 +524,52 @@ int stmtSetTbName(TAOS_STMT *stmt, const char *tbName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(qCreateSName(&pStmt->bInfo.sname, tbName, pStmt->taos->acctId, pStmt->exec.pRequest->pDb, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
|
STMT_ERR_RET(qCreateSName(&pStmt->bInfo.sname, tbName, pStmt->taos->acctId, pStmt->exec.pRequest->pDb, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
|
||||||
|
tNameExtractFullName(&pStmt->bInfo.sname, pStmt->bInfo.tbFName);
|
||||||
|
|
||||||
STMT_ERR_RET(stmtGetFromCache(pStmt));
|
STMT_ERR_RET(stmtGetFromCache(pStmt));
|
||||||
|
|
||||||
if (pStmt->bInfo.needParse) {
|
if (pStmt->bInfo.needParse) {
|
||||||
taosMemoryFree(pStmt->bInfo.tbName);
|
strncpy(pStmt->bInfo.tbName, tbName, sizeof(pStmt->bInfo.tbName) - 1);
|
||||||
pStmt->bInfo.tbName = strdup(tbName);
|
pStmt->bInfo.tbName[sizeof(pStmt->bInfo.tbName) - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtSetTbTags(TAOS_STMT *stmt, TAOS_MULTI_BIND *tags) {
|
int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS));
|
||||||
|
|
||||||
if (!pStmt->bInfo.needParse) {
|
if (pStmt->bInfo.needParse) {
|
||||||
|
STMT_ERR_RET(stmtParseSql(pStmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->bInfo.inExecCache) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(stmtParseSql(pStmt));
|
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
|
|
||||||
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, (const char*)&pStmt->bInfo.tbUid, sizeof(pStmt->bInfo.tbUid));
|
|
||||||
if (NULL == pDataBlock) {
|
if (NULL == pDataBlock) {
|
||||||
tscError("table uid %" PRIx64 "not found in exec blockHash", pStmt->bInfo.tbUid);
|
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
|
||||||
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(qBindStmtTagsValue(*pDataBlock, pStmt->bInfo.boundTags, pStmt->bInfo.tbSuid, pStmt->bInfo.sname.tname, tags, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
|
STMT_ERR_RET(qBindStmtTagsValue(*pDataBlock, pStmt->bInfo.boundTags, pStmt->bInfo.tbSuid, pStmt->bInfo.sname.tname,
|
||||||
|
tags, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD** fields) {
|
||||||
int32_t stmtFetchTagFields(STscStmt* pStmt, int32_t *fieldNum, TAOS_FIELD** fields) {
|
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
tscError("invalid operation to get query tag fileds");
|
tscError("invalid operation to get query tag fileds");
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, (const char*)&pStmt->bInfo.tbUid, sizeof(pStmt->bInfo.tbUid));
|
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
if (NULL == pDataBlock) {
|
if (NULL == pDataBlock) {
|
||||||
tscError("table uid %" PRIx64 "not found in exec blockHash", pStmt->bInfo.tbUid);
|
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
|
||||||
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,27 +578,28 @@ int32_t stmtFetchTagFields(STscStmt* pStmt, int32_t *fieldNum, TAOS_FIELD** fiel
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtFetchColFields(STscStmt* pStmt, int32_t *fieldNum, TAOS_FIELD** fields) {
|
int32_t stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD** fields) {
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
tscError("invalid operation to get query column fileds");
|
tscError("invalid operation to get query column fileds");
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, (const char*)&pStmt->bInfo.tbUid, sizeof(pStmt->bInfo.tbUid));
|
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
if (NULL == pDataBlock) {
|
if (NULL == pDataBlock) {
|
||||||
tscError("table uid %" PRIx64 "not found in exec blockHash", pStmt->bInfo.tbUid);
|
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
|
||||||
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_RET(qBuildStmtColFields(*pDataBlock, fieldNum, fields));
|
STMT_ERR_RET(qBuildStmtColFields(*pDataBlock, fieldNum, fields));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx) {
|
int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 && STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
|
||||||
|
STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +607,7 @@ int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx) {
|
||||||
taos_free_result(pStmt->exec.pRequest);
|
taos_free_result(pStmt->exec.pRequest);
|
||||||
pStmt->exec.pRequest = NULL;
|
pStmt->exec.pRequest = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == pStmt->exec.pRequest) {
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
}
|
}
|
||||||
|
@ -548,13 +627,14 @@ int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx) {
|
||||||
} else {
|
} else {
|
||||||
STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_RET(qStmtBindParam(pStmt->sql.pQueryPlan, bind, colIdx, pStmt->exec.pRequest->requestId));
|
bool emptyResult = false;
|
||||||
|
STMT_RET(qStmtBindParam(pStmt->sql.pQueryPlan, bind, colIdx, pStmt->exec.pRequest->requestId, &emptyResult));
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, (const char*)&pStmt->bInfo.tbUid, sizeof(pStmt->bInfo.tbUid));
|
STableDataBlocks **pDataBlock = (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
|
||||||
if (NULL == pDataBlock) {
|
if (NULL == pDataBlock) {
|
||||||
tscError("table uid %" PRIx64 "not found in exec blockHash", pStmt->bInfo.tbUid);
|
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
|
||||||
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,39 +651,95 @@ int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pStmt->bInfo.sBindLastIdx = colIdx;
|
pStmt->bInfo.sBindLastIdx = colIdx;
|
||||||
|
|
||||||
if (0 == colIdx) {
|
if (0 == colIdx) {
|
||||||
pStmt->bInfo.sBindRowNum = bind->num;
|
pStmt->bInfo.sBindRowNum = bind->num;
|
||||||
}
|
}
|
||||||
|
|
||||||
qBindStmtSingleColValue(*pDataBlock, bind, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen, colIdx, pStmt->bInfo.sBindRowNum);
|
qBindStmtSingleColValue(*pDataBlock, bind, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen, colIdx,
|
||||||
|
pStmt->bInfo.sBindRowNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stmtAddBatch(TAOS_STMT* stmt) {
|
||||||
int stmtAddBatch(TAOS_STMT *stmt) {
|
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_ADD_BATCH));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_ADD_BATCH));
|
||||||
|
|
||||||
STMT_ERR_RET(stmtCacheBlock(pStmt));
|
STMT_ERR_RET(stmtCacheBlock(pStmt));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp *pRsp) {
|
||||||
|
if (pRsp->nBlocks <= 0) {
|
||||||
|
tscError("invalid submit resp block number %d", pRsp->nBlocks);
|
||||||
|
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t keyLen = 0;
|
||||||
|
STableDataBlocks **pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
|
||||||
|
while (pIter) {
|
||||||
|
STableDataBlocks *pBlock = *pIter;
|
||||||
|
char *key = taosHashGetKey(pIter, &keyLen);
|
||||||
|
|
||||||
|
STableMeta *pMeta = qGetTableMetaInDataBlock(pBlock);
|
||||||
|
if (pMeta->uid != pStmt->bInfo.tbUid) {
|
||||||
|
tscError("table uid %" PRIx64 " mis-match with current table uid %" PRIx64, pMeta->uid, pStmt->bInfo.tbUid);
|
||||||
|
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMeta->uid) {
|
||||||
|
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSubmitBlkRsp *blkRsp = NULL;
|
||||||
|
int32_t i = 0;
|
||||||
|
for (; i < pRsp->nBlocks; ++i) {
|
||||||
|
blkRsp = pRsp->pBlocks + i;
|
||||||
|
if (strlen(blkRsp->tblFName) != keyLen) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(blkRsp->tblFName, key, keyLen)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < pRsp->nBlocks) {
|
||||||
|
tscDebug("auto created table %s uid updated from %" PRIx64 " to %" PRIx64, blkRsp->tblFName, pMeta->uid, blkRsp->uid);
|
||||||
|
|
||||||
|
pMeta->uid = blkRsp->uid;
|
||||||
|
pStmt->bInfo.tbUid = blkRsp->uid;
|
||||||
|
} else {
|
||||||
|
tscError("table %s not found in submit rsp", pStmt->bInfo.tbFName);
|
||||||
|
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtExec(TAOS_STMT *stmt) {
|
int stmtExec(TAOS_STMT *stmt) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
SSubmitRsp *pRsp = NULL;
|
||||||
|
bool autoCreateTbl = pStmt->exec.autoCreateTbl;
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_EXECUTE));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_EXECUTE));
|
||||||
|
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
scheduleQuery(pStmt->exec.pRequest, pStmt->sql.pQueryPlan, pStmt->sql.nodeList);
|
scheduleQuery(pStmt->exec.pRequest, pStmt->sql.pQueryPlan, pStmt->sql.nodeList, NULL);
|
||||||
} else {
|
} else {
|
||||||
STMT_ERR_RET(qBuildStmtOutput(pStmt->sql.pQuery, pStmt->exec.pVgHash, pStmt->exec.pBlockHash));
|
STMT_ERR_RET(qBuildStmtOutput(pStmt->sql.pQuery, pStmt->exec.pVgHash, pStmt->exec.pBlockHash));
|
||||||
launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, TSDB_CODE_SUCCESS, true);
|
launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, TSDB_CODE_SUCCESS, true, (autoCreateTbl ? (void**)&pRsp : NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pStmt->exec.pRequest->code && NEED_CLIENT_HANDLE_ERROR(pStmt->exec.pRequest->code)) {
|
if (pStmt->exec.pRequest->code && NEED_CLIENT_HANDLE_ERROR(pStmt->exec.pRequest->code)) {
|
||||||
|
@ -615,7 +751,7 @@ int stmtExec(TAOS_STMT *stmt) {
|
||||||
STMT_ERR_RET(TSDB_CODE_NEED_RETRY);
|
STMT_ERR_RET(TSDB_CODE_NEED_RETRY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STMT_ERR_JRET(pStmt->exec.pRequest->code);
|
STMT_ERR_JRET(pStmt->exec.pRequest->code);
|
||||||
|
|
||||||
pStmt->exec.affectedRows = taos_affected_rows(pStmt->exec.pRequest);
|
pStmt->exec.affectedRows = taos_affected_rows(pStmt->exec.pRequest);
|
||||||
|
@ -624,14 +760,22 @@ int stmtExec(TAOS_STMT *stmt) {
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
stmtCleanExecInfo(pStmt, (code ? false : true), false);
|
stmtCleanExecInfo(pStmt, (code ? false : true), false);
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code && autoCreateTbl) {
|
||||||
|
if (NULL == pRsp) {
|
||||||
|
tscError("no submit resp got for auto create table");
|
||||||
|
STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtUpdateTableUid(pStmt, pRsp));
|
||||||
|
}
|
||||||
|
|
||||||
++pStmt->sql.runTimes;
|
++pStmt->sql.runTimes;
|
||||||
|
|
||||||
STMT_RET(code);
|
STMT_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stmtClose(TAOS_STMT* stmt) {
|
||||||
int stmtClose(TAOS_STMT *stmt) {
|
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
STMT_RET(stmtCleanSQLInfo(pStmt));
|
STMT_RET(stmtCleanSQLInfo(pStmt));
|
||||||
|
@ -639,11 +783,11 @@ int stmtClose(TAOS_STMT *stmt) {
|
||||||
taosMemoryFree(stmt);
|
taosMemoryFree(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *stmtErrstr(TAOS_STMT *stmt) {
|
const char* stmtErrstr(TAOS_STMT* stmt) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
if (stmt == NULL || NULL == pStmt->exec.pRequest) {
|
if (stmt == NULL || NULL == pStmt->exec.pRequest) {
|
||||||
return (char*) tstrerror(terrno);
|
return (char*)tstrerror(terrno);
|
||||||
}
|
}
|
||||||
|
|
||||||
pStmt->exec.pRequest->code = terrno;
|
pStmt->exec.pRequest->code = terrno;
|
||||||
|
@ -651,15 +795,11 @@ const char *stmtErrstr(TAOS_STMT *stmt) {
|
||||||
return taos_errstr(pStmt->exec.pRequest);
|
return taos_errstr(pStmt->exec.pRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtAffectedRows(TAOS_STMT *stmt) {
|
int stmtAffectedRows(TAOS_STMT* stmt) { return ((STscStmt*)stmt)->affectedRows; }
|
||||||
return ((STscStmt*)stmt)->affectedRows;
|
|
||||||
}
|
|
||||||
|
|
||||||
int stmtAffectedRowsOnce(TAOS_STMT *stmt) {
|
int stmtAffectedRowsOnce(TAOS_STMT* stmt) { return ((STscStmt*)stmt)->exec.affectedRows; }
|
||||||
return ((STscStmt*)stmt)->exec.affectedRows;
|
|
||||||
}
|
|
||||||
|
|
||||||
int stmtIsInsert(TAOS_STMT *stmt, int *insert) {
|
int stmtIsInsert(TAOS_STMT* stmt, int* insert) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
if (pStmt->sql.type) {
|
if (pStmt->sql.type) {
|
||||||
|
@ -667,16 +807,17 @@ int stmtIsInsert(TAOS_STMT *stmt, int *insert) {
|
||||||
} else {
|
} else {
|
||||||
*insert = isInsertSql(pStmt->sql.sqlStr, 0);
|
*insert = isInsertSql(pStmt->sql.sqlStr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stmtGetParamNum(TAOS_STMT *stmt, int *nums) {
|
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));
|
||||||
|
|
||||||
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 && STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
|
||||||
|
STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
||||||
pStmt->bInfo.needParse = false;
|
pStmt->bInfo.needParse = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -684,7 +825,7 @@ int stmtGetParamNum(TAOS_STMT *stmt, int *nums) {
|
||||||
taos_free_result(pStmt->exec.pRequest);
|
taos_free_result(pStmt->exec.pRequest);
|
||||||
pStmt->exec.pRequest = NULL;
|
pStmt->exec.pRequest = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == pStmt->exec.pRequest) {
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
}
|
}
|
||||||
|
@ -702,16 +843,16 @@ int stmtGetParamNum(TAOS_STMT *stmt, int *nums) {
|
||||||
} else {
|
} else {
|
||||||
STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
*nums = taosArrayGetSize(pStmt->sql.pQueryPlan->pPlaceholderValues);
|
*nums = taosArrayGetSize(pStmt->sql.pQueryPlan->pPlaceholderValues);
|
||||||
} else {
|
} else {
|
||||||
STMT_ERR_RET(stmtFetchColFields(stmt, nums, NULL));
|
STMT_ERR_RET(stmtFetchColFields(stmt, nums, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RES *stmtUseResult(TAOS_STMT *stmt) {
|
TAOS_RES* stmtUseResult(TAOS_STMT* stmt) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
if (STMT_TYPE_QUERY != pStmt->sql.type) {
|
if (STMT_TYPE_QUERY != pStmt->sql.type) {
|
||||||
|
@ -721,6 +862,3 @@ TAOS_RES *stmtUseResult(TAOS_STMT *stmt) {
|
||||||
|
|
||||||
return pStmt->exec.pRequest;
|
return pStmt->exec.pRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2764,6 +2764,7 @@ int32_t tSerializeSConnectRsp(void *buf, int32_t bufLen, SConnectRsp *pRsp) {
|
||||||
if (tEncodeI32(&encoder, pRsp->acctId) < 0) return -1;
|
if (tEncodeI32(&encoder, pRsp->acctId) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pRsp->clusterId) < 0) return -1;
|
if (tEncodeI64(&encoder, pRsp->clusterId) < 0) return -1;
|
||||||
if (tEncodeU32(&encoder, pRsp->connId) < 0) return -1;
|
if (tEncodeU32(&encoder, pRsp->connId) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->dnodeNum) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRsp->superUser) < 0) return -1;
|
if (tEncodeI8(&encoder, pRsp->superUser) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pRsp->connType) < 0) return -1;
|
if (tEncodeI8(&encoder, pRsp->connType) < 0) return -1;
|
||||||
if (tEncodeSEpSet(&encoder, &pRsp->epSet) < 0) return -1;
|
if (tEncodeSEpSet(&encoder, &pRsp->epSet) < 0) return -1;
|
||||||
|
@ -2783,6 +2784,7 @@ int32_t tDeserializeSConnectRsp(void *buf, int32_t bufLen, SConnectRsp *pRsp) {
|
||||||
if (tDecodeI32(&decoder, &pRsp->acctId) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->acctId) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pRsp->clusterId) < 0) return -1;
|
if (tDecodeI64(&decoder, &pRsp->clusterId) < 0) return -1;
|
||||||
if (tDecodeU32(&decoder, &pRsp->connId) < 0) return -1;
|
if (tDecodeU32(&decoder, &pRsp->connId) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->dnodeNum) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->superUser) < 0) return -1;
|
if (tDecodeI8(&decoder, &pRsp->superUser) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->connType) < 0) return -1;
|
if (tDecodeI8(&decoder, &pRsp->connType) < 0) return -1;
|
||||||
if (tDecodeSEpSet(&decoder, &pRsp->epSet) < 0) return -1;
|
if (tDecodeSEpSet(&decoder, &pRsp->epSet) < 0) return -1;
|
||||||
|
@ -4026,3 +4028,84 @@ int32_t tDecodeSVSubmitReq(SDecoder *pCoder, SVSubmitReq *pReq) {
|
||||||
tEndDecode(pCoder);
|
tEndDecode(pCoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t tEncodeSSubmitBlkRsp(SEncoder *pEncoder, const SSubmitBlkRsp *pBlock) {
|
||||||
|
if (tStartEncode(pEncoder) < 0) return -1;
|
||||||
|
|
||||||
|
if (tEncodeI8(pEncoder, pBlock->hashMeta) < 0) return -1;
|
||||||
|
if (pBlock->hashMeta) {
|
||||||
|
if (tEncodeI64(pEncoder, pBlock->uid) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, pBlock->tblFName) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (tEncodeI32v(pEncoder, pBlock->numOfRows) < 0) return -1;
|
||||||
|
if (tEncodeI32v(pEncoder, pBlock->affectedRows) < 0) return -1;
|
||||||
|
|
||||||
|
tEndEncode(pEncoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tDecodeSSubmitBlkRsp(SDecoder *pDecoder, SSubmitBlkRsp *pBlock) {
|
||||||
|
if (tStartDecode(pDecoder) < 0) return -1;
|
||||||
|
|
||||||
|
if (tDecodeI8(pDecoder, &pBlock->hashMeta) < 0) return -1;
|
||||||
|
if (pBlock->hashMeta) {
|
||||||
|
if (tDecodeI64(pDecoder, &pBlock->uid) < 0) return -1;
|
||||||
|
pBlock->tblFName= taosMemoryCalloc(TSDB_TABLE_FNAME_LEN, 1);
|
||||||
|
if (NULL == pBlock->tblFName) return -1;
|
||||||
|
if (tDecodeCStrTo(pDecoder, pBlock->tblFName) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (tDecodeI32v(pDecoder, &pBlock->numOfRows) < 0) return -1;
|
||||||
|
if (tDecodeI32v(pDecoder, &pBlock->affectedRows) < 0) return -1;
|
||||||
|
|
||||||
|
tEndDecode(pDecoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tEncodeSSubmitRsp(SEncoder *pEncoder, const SSubmitRsp *pRsp) {
|
||||||
|
int32_t nBlocks = taosArrayGetSize(pRsp->pArray);
|
||||||
|
|
||||||
|
if (tStartEncode(pEncoder) < 0) return -1;
|
||||||
|
|
||||||
|
if (tEncodeI32v(pEncoder, pRsp->numOfRows) < 0) return -1;
|
||||||
|
if (tEncodeI32v(pEncoder, pRsp->affectedRows) < 0) return -1;
|
||||||
|
if (tEncodeI32v(pEncoder, nBlocks) < 0) return -1;
|
||||||
|
for (int32_t iBlock = 0; iBlock < nBlocks; iBlock++) {
|
||||||
|
if (tEncodeSSubmitBlkRsp(pEncoder, (SSubmitBlkRsp *)taosArrayGet(pRsp->pArray, iBlock)) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tEndEncode(pEncoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDecodeSSubmitRsp(SDecoder *pDecoder, SSubmitRsp *pRsp) {
|
||||||
|
if (tStartDecode(pDecoder) < 0) return -1;
|
||||||
|
|
||||||
|
if (tDecodeI32v(pDecoder, &pRsp->numOfRows) < 0) return -1;
|
||||||
|
if (tDecodeI32v(pDecoder, &pRsp->affectedRows) < 0) return -1;
|
||||||
|
if (tDecodeI32v(pDecoder, &pRsp->nBlocks) < 0) return -1;
|
||||||
|
pRsp->pBlocks = taosMemoryCalloc(pRsp->nBlocks, sizeof(*pRsp->pBlocks));
|
||||||
|
if (pRsp->pBlocks == NULL) return -1;
|
||||||
|
for (int32_t iBlock = 0; iBlock < pRsp->nBlocks; iBlock++) {
|
||||||
|
if (tDecodeSSubmitBlkRsp(pDecoder, pRsp->pBlocks + iBlock) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tEndDecode(pDecoder);
|
||||||
|
tDecoderClear(pDecoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSSubmitRsp(SSubmitRsp *pRsp) {
|
||||||
|
if (NULL == pRsp) return;
|
||||||
|
|
||||||
|
if (pRsp->pBlocks) {
|
||||||
|
for (int32_t i = 0; i < pRsp->nBlocks; ++i) {
|
||||||
|
SSubmitBlkRsp *sRsp = pRsp->pBlocks + i;
|
||||||
|
taosMemoryFree(sRsp->tblFName);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pRsp->pBlocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pRsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1159,7 +1159,7 @@ bool tdGetKvRowValOfColEx(STSRowIter *pIter, col_id_t colId, col_type_t colType,
|
||||||
|
|
||||||
#ifdef TD_SUPPORT_BITMAP
|
#ifdef TD_SUPPORT_BITMAP
|
||||||
int16_t colIdx = -1;
|
int16_t colIdx = -1;
|
||||||
if (pKvIdx) colIdx = POINTER_DISTANCE(TD_ROW_COL_IDX(pRow), pKvIdx) / sizeof(SKvRowIdx);
|
if (pKvIdx) colIdx = POINTER_DISTANCE(pKvIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx);
|
||||||
if (tdGetBitmapValType(pIter->pBitmap, colIdx, &pVal->valType, 0) != TSDB_CODE_SUCCESS) {
|
if (tdGetBitmapValType(pIter->pBitmap, colIdx, &pVal->valType, 0) != TSDB_CODE_SUCCESS) {
|
||||||
pVal->valType = TD_VTYPE_NONE;
|
pVal->valType = TD_VTYPE_NONE;
|
||||||
}
|
}
|
||||||
|
@ -1226,7 +1226,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell
|
||||||
compareKvRowColId, TD_EQ);
|
compareKvRowColId, TD_EQ);
|
||||||
#ifdef TD_SUPPORT_BITMAP
|
#ifdef TD_SUPPORT_BITMAP
|
||||||
if (pIdx) {
|
if (pIdx) {
|
||||||
colIdx = POINTER_DISTANCE(TD_ROW_COL_IDX(pRow), pIdx) / sizeof(SKvRowIdx);
|
colIdx = POINTER_DISTANCE(pIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
tdGetKvRowValOfCol(pVal, pRow, pIter->pBitmap, pIdx ? pIdx->offset : -1, colIdx);
|
tdGetKvRowValOfCol(pVal, pRow, pIter->pBitmap, pIdx ? pIdx->offset : -1, colIdx);
|
||||||
|
|
|
@ -35,104 +35,36 @@
|
||||||
assert(0); \
|
assert(0); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
int32_t toInteger(const char *z, int32_t n, int32_t base, int64_t *value, bool *isSigned) {
|
int32_t toInteger(const char *z, int32_t n, int32_t base, int64_t *value) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
char *endPtr = NULL;
|
char *endPtr = NULL;
|
||||||
|
|
||||||
int32_t index = 0;
|
*value = strtoll(z, &endPtr, base);
|
||||||
|
if (errno == ERANGE || errno == EINVAL || endPtr - z != n) {
|
||||||
bool specifiedSign = (z[0] == '+' || z[0] == '-');
|
|
||||||
if (specifiedSign) {
|
|
||||||
*isSigned = true;
|
|
||||||
index = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t val = strtoull(&z[index], &endPtr, base);
|
|
||||||
if (errno == ERANGE || errno == EINVAL) {
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (specifiedSign && val > INT64_MAX) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endPtr - &z[index] != n - index) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*isSigned = specifiedSign || (val <= INT64_MAX);
|
|
||||||
if (*isSigned) {
|
|
||||||
*value = (z[0] == '-') ? -val : val;
|
|
||||||
} else {
|
|
||||||
*(uint64_t *)value = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosVariantCreate(SVariant *pVar, const char *z, int32_t n, int32_t type) {
|
int32_t toUInteger(const char *z, int32_t n, int32_t base, uint64_t *value) {
|
||||||
int32_t ret = 0;
|
errno = 0;
|
||||||
memset(pVar, 0, sizeof(SVariant));
|
char *endPtr = NULL;
|
||||||
|
|
||||||
switch (type) {
|
const char *p = z;
|
||||||
case TSDB_DATA_TYPE_BOOL: {
|
while (*p != 0 && *p == ' ') p++;
|
||||||
if (strncasecmp(z, "true", 4) == 0) {
|
if (*p != 0 && *p == '-') {
|
||||||
pVar->i = TSDB_TRUE;
|
return -1;
|
||||||
} else if (strncasecmp(z, "false", 5) == 0) {
|
|
||||||
pVar->i = TSDB_FALSE;
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
|
||||||
bool sign = true;
|
|
||||||
|
|
||||||
int32_t base = 10;
|
|
||||||
if (type == TK_NK_HEX) {
|
|
||||||
base = 16;
|
|
||||||
} else if (type == TK_NK_OCT) {
|
|
||||||
base = 8;
|
|
||||||
} else if (type == TK_NK_BIN) {
|
|
||||||
base = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = toInteger(z, n, base, &pVar->i, &sign);
|
|
||||||
if (ret != 0) {
|
|
||||||
pVar->nType = -1; // -1 means error type
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pVar->nType = (sign) ? TSDB_DATA_TYPE_BIGINT : TSDB_DATA_TYPE_UBIGINT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
pVar->d = strtod(z, NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
|
||||||
pVar->pz = strndup(z, n);
|
|
||||||
//pVar->nLen = strRmquote(pVar->pz, n);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
|
||||||
assert(0);
|
|
||||||
pVar->i = taosGetTimestamp(TSDB_TIME_PRECISION_NANO);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: { // nType == 0 means the null value
|
|
||||||
type = TSDB_DATA_TYPE_NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pVar->nType = type;
|
*value = strtoull(z, &endPtr, base);
|
||||||
|
if (errno == ERANGE || errno == EINVAL || endPtr - z != n) {
|
||||||
|
errno = 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -461,7 +393,7 @@ static int32_t toNchar(SVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
|
|
||||||
if (*pDest == pVariant->pz) {
|
if (*pDest == pVariant->pz) {
|
||||||
TdUcs4 *pWStr = taosMemoryCalloc(1, (nLen + 1) * TSDB_NCHAR_SIZE);
|
TdUcs4 *pWStr = taosMemoryCalloc(1, (nLen + 1) * TSDB_NCHAR_SIZE);
|
||||||
bool ret = taosMbsToUcs4(pDst, nLen, pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL);
|
bool ret = taosMbsToUcs4(pDst, nLen, pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
taosMemoryFreeClear(pWStr);
|
taosMemoryFreeClear(pWStr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -483,7 +415,7 @@ static int32_t toNchar(SVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
} else {
|
} else {
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
|
|
||||||
bool ret = taosMbsToUcs4(pDst, nLen, (TdUcs4*)*pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output);
|
bool ret = taosMbsToUcs4(pDst, nLen, (TdUcs4 *)*pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -518,9 +450,9 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
*result = pVariant->u;
|
*result = pVariant->u;
|
||||||
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
*result = (int64_t) pVariant->d;
|
*result = (int64_t)pVariant->d;
|
||||||
} else {
|
} else {
|
||||||
//TODO: handling var types
|
// TODO: handling var types
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -909,7 +841,7 @@ int32_t tVariantDumpEx(SVariant *pVariant, char *payload, int16_t type, bool inc
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tasoUcs4Copy((TdUcs4*)payload, pVariant->ucs4, pVariant->nLen);
|
tasoUcs4Copy((TdUcs4 *)payload, pVariant->ucs4, pVariant->nLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1026,7 +958,7 @@ int32_t taosVariantTypeSetType(SVariant *pVariant, char type) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char * taosVariantGet(SVariant *pVar, int32_t type) {
|
char *taosVariantGet(SVariant *pVar, int32_t type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
|
|
@ -8,12 +8,11 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "taos.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tcommon.h"
|
|
||||||
#include "taos.h"
|
|
||||||
#include "tvariant.h"
|
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
//
|
//
|
||||||
|
@ -29,72 +28,62 @@ TEST(testCase, toInteger_test) {
|
||||||
uint32_t type = 0;
|
uint32_t type = 0;
|
||||||
|
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
bool sign = true;
|
|
||||||
|
|
||||||
int32_t ret = toInteger(s, strlen(s), 10, &val, &sign);
|
int32_t ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 123);
|
ASSERT_EQ(val, 123);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "9223372036854775807";
|
s = "9223372036854775807";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 9223372036854775807);
|
ASSERT_EQ(val, 9223372036854775807);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "9323372036854775807";
|
s = "9323372036854775807";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 9323372036854775807u);
|
ASSERT_EQ(val, 9323372036854775807u);
|
||||||
ASSERT_EQ(sign, false);
|
|
||||||
|
|
||||||
s = "-9323372036854775807";
|
s = "-9323372036854775807";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, -1);
|
ASSERT_EQ(ret, -1);
|
||||||
|
|
||||||
s = "-1";
|
s = "-1";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, -1);
|
ASSERT_EQ(val, -1);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "-9223372036854775807";
|
s = "-9223372036854775807";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, -9223372036854775807);
|
ASSERT_EQ(val, -9223372036854775807);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "1000u";
|
s = "1000u";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, -1);
|
ASSERT_EQ(ret, -1);
|
||||||
|
|
||||||
s = "0x10";
|
s = "0x10";
|
||||||
ret = toInteger(s, strlen(s), 16, &val, &sign);
|
ret = toInteger(s, strlen(s), 16, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 16);
|
ASSERT_EQ(val, 16);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "110";
|
s = "110";
|
||||||
ret = toInteger(s, strlen(s), 2, &val, &sign);
|
ret = toInteger(s, strlen(s), 2, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 6);
|
ASSERT_EQ(val, 6);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
s = "110";
|
s = "110";
|
||||||
ret = toInteger(s, strlen(s), 8, &val, &sign);
|
ret = toInteger(s, strlen(s), 8, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 72);
|
ASSERT_EQ(val, 72);
|
||||||
ASSERT_EQ(sign, true);
|
|
||||||
|
|
||||||
//18446744073709551615 UINT64_MAX
|
// 18446744073709551615 UINT64_MAX
|
||||||
s = "18446744073709551615";
|
s = "18446744073709551615";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(val, 18446744073709551615u);
|
ASSERT_EQ(val, 18446744073709551615u);
|
||||||
ASSERT_EQ(sign, false);
|
|
||||||
|
|
||||||
s = "18446744073709551616";
|
s = "18446744073709551616";
|
||||||
ret = toInteger(s, strlen(s), 10, &val, &sign);
|
ret = toInteger(s, strlen(s), 10, &val);
|
||||||
ASSERT_EQ(ret, -1);
|
ASSERT_EQ(ret, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,8 +97,8 @@ TEST(testCase, Datablock_test) {
|
||||||
infoData.info.type = TSDB_DATA_TYPE_INT;
|
infoData.info.type = TSDB_DATA_TYPE_INT;
|
||||||
infoData.info.colId = 1;
|
infoData.info.colId = 1;
|
||||||
|
|
||||||
infoData.pData = (char*) taosMemoryCalloc(40, infoData.info.bytes);
|
infoData.pData = (char*)taosMemoryCalloc(40, infoData.info.bytes);
|
||||||
infoData.nullbitmap = (char*) taosMemoryCalloc(1, sizeof(char) * (40/8));
|
infoData.nullbitmap = (char*)taosMemoryCalloc(1, sizeof(char) * (40 / 8));
|
||||||
taosArrayPush(b->pDataBlock, &infoData);
|
taosArrayPush(b->pDataBlock, &infoData);
|
||||||
|
|
||||||
SColumnInfoData infoData1 = {0};
|
SColumnInfoData infoData1 = {0};
|
||||||
|
@ -117,36 +106,36 @@ TEST(testCase, Datablock_test) {
|
||||||
infoData1.info.type = TSDB_DATA_TYPE_BINARY;
|
infoData1.info.type = TSDB_DATA_TYPE_BINARY;
|
||||||
infoData1.info.colId = 2;
|
infoData1.info.colId = 2;
|
||||||
|
|
||||||
infoData1.varmeta.offset = (int32_t*) taosMemoryCalloc(40, sizeof(uint32_t));
|
infoData1.varmeta.offset = (int32_t*)taosMemoryCalloc(40, sizeof(uint32_t));
|
||||||
taosArrayPush(b->pDataBlock, &infoData1);
|
taosArrayPush(b->pDataBlock, &infoData1);
|
||||||
|
|
||||||
char* str = "the value of: %d";
|
char* str = "the value of: %d";
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
char varbuf[128] = {0};
|
char varbuf[128] = {0};
|
||||||
|
|
||||||
for(int32_t i = 0; i < 40; ++i) {
|
for (int32_t i = 0; i < 40; ++i) {
|
||||||
SColumnInfoData* p0 = (SColumnInfoData *) taosArrayGet(b->pDataBlock, 0);
|
SColumnInfoData* p0 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 0);
|
||||||
SColumnInfoData* p1 = (SColumnInfoData *) taosArrayGet(b->pDataBlock, 1);
|
SColumnInfoData* p1 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 1);
|
||||||
|
|
||||||
if (i&0x01) {
|
if (i & 0x01) {
|
||||||
int32_t len = sprintf(buf, str, i);
|
int32_t len = sprintf(buf, str, i);
|
||||||
STR_TO_VARSTR(varbuf, buf)
|
STR_TO_VARSTR(varbuf, buf)
|
||||||
colDataAppend(p0, i, (const char*) &i, false);
|
colDataAppend(p0, i, (const char*)&i, false);
|
||||||
colDataAppend(p1, i, (const char*) varbuf, false);
|
colDataAppend(p1, i, (const char*)varbuf, false);
|
||||||
|
|
||||||
memset(varbuf, 0, sizeof(varbuf));
|
memset(varbuf, 0, sizeof(varbuf));
|
||||||
memset(buf, 0, sizeof(buf));
|
memset(buf, 0, sizeof(buf));
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(p0, i, (const char*) &i, true);
|
colDataAppend(p0, i, (const char*)&i, true);
|
||||||
colDataAppend(p1, i, (const char*) varbuf, true);
|
colDataAppend(p1, i, (const char*)varbuf, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
b->info.rows++;
|
b->info.rows++;
|
||||||
}
|
}
|
||||||
|
|
||||||
SColumnInfoData* p0 = (SColumnInfoData *) taosArrayGet(b->pDataBlock, 0);
|
SColumnInfoData* p0 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 0);
|
||||||
SColumnInfoData* p1 = (SColumnInfoData *) taosArrayGet(b->pDataBlock, 1);
|
SColumnInfoData* p1 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 1);
|
||||||
for(int32_t i = 0; i < 40; ++i) {
|
for (int32_t i = 0; i < 40; ++i) {
|
||||||
if (i & 0x01) {
|
if (i & 0x01) {
|
||||||
ASSERT_EQ(colDataIsNull_f(p0->nullbitmap, i), false);
|
ASSERT_EQ(colDataIsNull_f(p0->nullbitmap, i), false);
|
||||||
ASSERT_EQ(colDataIsNull(p1, b->info.rows, i, nullptr), false);
|
ASSERT_EQ(colDataIsNull(p1, b->info.rows, i, nullptr), false);
|
||||||
|
@ -158,7 +147,7 @@ TEST(testCase, Datablock_test) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("binary column length:%d\n", *(int32_t*) p1->pData);
|
printf("binary column length:%d\n", *(int32_t*)p1->pData);
|
||||||
|
|
||||||
ASSERT_EQ(blockDataGetNumOfCols(b), 2);
|
ASSERT_EQ(blockDataGetNumOfCols(b), 2);
|
||||||
ASSERT_EQ(blockDataGetNumOfRows(b), 40);
|
ASSERT_EQ(blockDataGetNumOfRows(b), 40);
|
||||||
|
@ -166,8 +155,8 @@ TEST(testCase, Datablock_test) {
|
||||||
char* pData = colDataGetData(p1, 3);
|
char* pData = colDataGetData(p1, 3);
|
||||||
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
||||||
|
|
||||||
SArray* pOrderInfo = taosArrayInit(3, sizeof(SBlockOrderInfo));
|
SArray* pOrderInfo = taosArrayInit(3, sizeof(SBlockOrderInfo));
|
||||||
SBlockOrderInfo order = { true, TSDB_ORDER_ASC, 0, NULL };
|
SBlockOrderInfo order = {true, TSDB_ORDER_ASC, 0, NULL};
|
||||||
taosArrayPush(pOrderInfo, &order);
|
taosArrayPush(pOrderInfo, &order);
|
||||||
|
|
||||||
blockDataSort(b, pOrderInfo);
|
blockDataSort(b, pOrderInfo);
|
||||||
|
@ -244,8 +233,8 @@ TEST(testCase, var_dataBlock_split_test) {
|
||||||
infoData.info.type = TSDB_DATA_TYPE_INT;
|
infoData.info.type = TSDB_DATA_TYPE_INT;
|
||||||
infoData.info.colId = 1;
|
infoData.info.colId = 1;
|
||||||
|
|
||||||
infoData.pData = (char*) taosMemoryCalloc(numOfRows, infoData.info.bytes);
|
infoData.pData = (char*)taosMemoryCalloc(numOfRows, infoData.info.bytes);
|
||||||
infoData.nullbitmap = (char*) taosMemoryCalloc(1, sizeof(char) * (numOfRows/8));
|
infoData.nullbitmap = (char*)taosMemoryCalloc(1, sizeof(char) * (numOfRows / 8));
|
||||||
taosArrayPush(b->pDataBlock, &infoData);
|
taosArrayPush(b->pDataBlock, &infoData);
|
||||||
|
|
||||||
SColumnInfoData infoData1 = {0};
|
SColumnInfoData infoData1 = {0};
|
||||||
|
@ -253,13 +242,13 @@ TEST(testCase, var_dataBlock_split_test) {
|
||||||
infoData1.info.type = TSDB_DATA_TYPE_BINARY;
|
infoData1.info.type = TSDB_DATA_TYPE_BINARY;
|
||||||
infoData1.info.colId = 2;
|
infoData1.info.colId = 2;
|
||||||
|
|
||||||
infoData1.varmeta.offset = (int32_t*) taosMemoryCalloc(numOfRows, sizeof(uint32_t));
|
infoData1.varmeta.offset = (int32_t*)taosMemoryCalloc(numOfRows, sizeof(uint32_t));
|
||||||
taosArrayPush(b->pDataBlock, &infoData1);
|
taosArrayPush(b->pDataBlock, &infoData1);
|
||||||
|
|
||||||
char buf[41] = {0};
|
char buf[41] = {0};
|
||||||
char buf1[100] = {0};
|
char buf1[100] = {0};
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfRows; ++i) {
|
for (int32_t i = 0; i < numOfRows; ++i) {
|
||||||
SColumnInfoData* p0 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 0);
|
SColumnInfoData* p0 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 0);
|
||||||
SColumnInfoData* p1 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 1);
|
SColumnInfoData* p1 = (SColumnInfoData*)taosArrayGet(b->pDataBlock, 1);
|
||||||
|
|
||||||
|
@ -278,10 +267,10 @@ TEST(testCase, var_dataBlock_split_test) {
|
||||||
|
|
||||||
int32_t pageSize = 64 * 1024;
|
int32_t pageSize = 64 * 1024;
|
||||||
|
|
||||||
int32_t startIndex= 0;
|
int32_t startIndex = 0;
|
||||||
int32_t stopIndex = 0;
|
int32_t stopIndex = 0;
|
||||||
int32_t count = 1;
|
int32_t count = 1;
|
||||||
while(1) {
|
while (1) {
|
||||||
blockDataSplitRows(b, true, startIndex, &stopIndex, pageSize);
|
blockDataSplitRows(b, true, startIndex, &stopIndex, pageSize);
|
||||||
printf("the %d split, from: %d to %d\n", count++, startIndex, stopIndex);
|
printf("the %d split, from: %d to %d\n", count++, startIndex, stopIndex);
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
#include "mndStb.h"
|
#include "mndStb.h"
|
||||||
#include "mndUser.h"
|
#include "mndUser.h"
|
||||||
|
#include "mndDnode.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
@ -227,6 +228,7 @@ static int32_t mndProcessConnectReq(SNodeMsg *pReq) {
|
||||||
connectRsp.clusterId = pMnode->clusterId;
|
connectRsp.clusterId = pMnode->clusterId;
|
||||||
connectRsp.connId = pConn->id;
|
connectRsp.connId = pConn->id;
|
||||||
connectRsp.connType = connReq.connType;
|
connectRsp.connType = connReq.connType;
|
||||||
|
connectRsp.dnodeNum = mndGetDnodeSize(pMnode);
|
||||||
|
|
||||||
snprintf(connectRsp.sVersion, sizeof(connectRsp.sVersion), "ver:%s\nbuild:%s\ngitinfo:%s", version, buildinfo,
|
snprintf(connectRsp.sVersion, sizeof(connectRsp.sVersion), "ver:%s\nbuild:%s\ngitinfo:%s", version, buildinfo,
|
||||||
gitinfo);
|
gitinfo);
|
||||||
|
|
|
@ -37,6 +37,9 @@ typedef struct SMSmaCursor SMSmaCursor;
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
// metaOpen ==================
|
// metaOpen ==================
|
||||||
|
int32_t metaRLock(SMeta* pMeta);
|
||||||
|
int32_t metaWLock(SMeta* pMeta);
|
||||||
|
int32_t metaULock(SMeta* pMeta);
|
||||||
|
|
||||||
// metaEntry ==================
|
// metaEntry ==================
|
||||||
int metaEncodeEntry(SEncoder* pCoder, const SMetaEntry* pME);
|
int metaEncodeEntry(SEncoder* pCoder, const SMetaEntry* pME);
|
||||||
|
@ -57,6 +60,8 @@ int metaRemoveTableFromIdx(SMeta* pMeta, tb_uid_t uid);
|
||||||
static FORCE_INLINE tb_uid_t metaGenerateUid(SMeta* pMeta) { return tGenIdPI64(); }
|
static FORCE_INLINE tb_uid_t metaGenerateUid(SMeta* pMeta) { return tGenIdPI64(); }
|
||||||
|
|
||||||
struct SMeta {
|
struct SMeta {
|
||||||
|
TdThreadRwlock lock;
|
||||||
|
|
||||||
char* path;
|
char* path;
|
||||||
SVnode* pVnode;
|
SVnode* pVnode;
|
||||||
TENV* pEnv;
|
TENV* pEnv;
|
||||||
|
|
|
@ -102,7 +102,7 @@ int32_t tsdbUpdateSmaWindow(STsdb* pTsdb, SSubmitReq* pMsg, int64_t version
|
||||||
int32_t tsdbCreateTSma(STsdb* pTsdb, char* pMsg);
|
int32_t tsdbCreateTSma(STsdb* pTsdb, char* pMsg);
|
||||||
int32_t tsdbInsertTSmaData(STsdb* pTsdb, int64_t indexUid, const char* msg);
|
int32_t tsdbInsertTSmaData(STsdb* pTsdb, int64_t indexUid, const char* msg);
|
||||||
int tsdbInsertData(STsdb* pTsdb, int64_t version, SSubmitReq* pMsg, SSubmitRsp* pRsp);
|
int tsdbInsertData(STsdb* pTsdb, int64_t version, SSubmitReq* pMsg, SSubmitRsp* pRsp);
|
||||||
int tsdbInsertTableData(STsdb* pTsdb, SSubmitMsgIter* pMsgIter, SSubmitBlk* pBlock, int32_t* pAffectedRows);
|
int tsdbInsertTableData(STsdb* pTsdb, SSubmitMsgIter* pMsgIter, SSubmitBlk* pBlock, SSubmitBlkRsp* pRsp);
|
||||||
tsdbReaderT* tsdbQueryTables(SVnode* pVnode, SQueryTableDataCond* pCond, STableGroupInfo* groupList, uint64_t qId,
|
tsdbReaderT* tsdbQueryTables(SVnode* pVnode, SQueryTableDataCond* pCond, STableGroupInfo* groupList, uint64_t qId,
|
||||||
uint64_t taskId);
|
uint64_t taskId);
|
||||||
tsdbReaderT tsdbQueryCacheLastT(STsdb* tsdb, SQueryTableDataCond* pCond, STableGroupInfo* groupList, uint64_t qId,
|
tsdbReaderT tsdbQueryCacheLastT(STsdb* tsdb, SQueryTableDataCond* pCond, STableGroupInfo* groupList, uint64_t qId,
|
||||||
|
|
|
@ -22,6 +22,9 @@ static int tagIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kL
|
||||||
static int ttlIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2);
|
static int ttlIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2);
|
||||||
static int uidIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2);
|
static int uidIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2);
|
||||||
|
|
||||||
|
static int32_t metaInitLock(SMeta *pMeta) { return taosThreadRwlockInit(&pMeta->lock, NULL); }
|
||||||
|
static int32_t metaDestroyLock(SMeta *pMeta) { return taosThreadRwlockDestroy(&pMeta->lock); }
|
||||||
|
|
||||||
int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
|
int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
|
||||||
SMeta *pMeta = NULL;
|
SMeta *pMeta = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -36,6 +39,7 @@ int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metaInitLock(pMeta);
|
||||||
pMeta->path = (char *)&pMeta[1];
|
pMeta->path = (char *)&pMeta[1];
|
||||||
sprintf(pMeta->path, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP,
|
sprintf(pMeta->path, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP,
|
||||||
VNODE_META_DIR);
|
VNODE_META_DIR);
|
||||||
|
@ -121,6 +125,7 @@ _err:
|
||||||
if (pMeta->pSkmDb) tdbDbClose(pMeta->pSkmDb);
|
if (pMeta->pSkmDb) tdbDbClose(pMeta->pSkmDb);
|
||||||
if (pMeta->pTbDb) tdbDbClose(pMeta->pTbDb);
|
if (pMeta->pTbDb) tdbDbClose(pMeta->pTbDb);
|
||||||
if (pMeta->pEnv) tdbEnvClose(pMeta->pEnv);
|
if (pMeta->pEnv) tdbEnvClose(pMeta->pEnv);
|
||||||
|
metaDestroyLock(pMeta);
|
||||||
taosMemoryFree(pMeta);
|
taosMemoryFree(pMeta);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -136,12 +141,19 @@ int metaClose(SMeta *pMeta) {
|
||||||
if (pMeta->pSkmDb) tdbDbClose(pMeta->pSkmDb);
|
if (pMeta->pSkmDb) tdbDbClose(pMeta->pSkmDb);
|
||||||
if (pMeta->pTbDb) tdbDbClose(pMeta->pTbDb);
|
if (pMeta->pTbDb) tdbDbClose(pMeta->pTbDb);
|
||||||
if (pMeta->pEnv) tdbEnvClose(pMeta->pEnv);
|
if (pMeta->pEnv) tdbEnvClose(pMeta->pEnv);
|
||||||
|
metaDestroyLock(pMeta);
|
||||||
taosMemoryFree(pMeta);
|
taosMemoryFree(pMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t metaRLock(SMeta *pMeta) { return taosThreadRwlockRdlock(&pMeta->lock); }
|
||||||
|
|
||||||
|
int32_t metaWLock(SMeta *pMeta) { return taosThreadRwlockWrlock(&pMeta->lock); }
|
||||||
|
|
||||||
|
int32_t metaULock(SMeta *pMeta) { return taosThreadRwlockUnlock(&pMeta->lock); }
|
||||||
|
|
||||||
static int tbDbKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2) {
|
static int tbDbKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int kLen2) {
|
||||||
STbDbKey *pTbDbKey1 = (STbDbKey *)pKey1;
|
STbDbKey *pTbDbKey1 = (STbDbKey *)pKey1;
|
||||||
STbDbKey *pTbDbKey2 = (STbDbKey *)pKey2;
|
STbDbKey *pTbDbKey2 = (STbDbKey *)pKey2;
|
||||||
|
|
|
@ -19,9 +19,13 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags) {
|
||||||
memset(pReader, 0, sizeof(*pReader));
|
memset(pReader, 0, sizeof(*pReader));
|
||||||
pReader->flags = flags;
|
pReader->flags = flags;
|
||||||
pReader->pMeta = pMeta;
|
pReader->pMeta = pMeta;
|
||||||
|
metaRLock(pMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void metaReaderClear(SMetaReader *pReader) {
|
void metaReaderClear(SMetaReader *pReader) {
|
||||||
|
if (pReader->pMeta) {
|
||||||
|
metaULock(pReader->pMeta);
|
||||||
|
}
|
||||||
tDecoderClear(&pReader->coder);
|
tDecoderClear(&pReader->coder);
|
||||||
tdbFree(pReader->pBuf);
|
tdbFree(pReader->pBuf);
|
||||||
}
|
}
|
||||||
|
@ -264,6 +268,8 @@ STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) {
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
|
||||||
pSW = metaGetTableSchema(pMeta, quid, sver, 0);
|
pSW = metaGetTableSchema(pMeta, quid, sver, 0);
|
||||||
|
if (!pSW) return NULL;
|
||||||
|
|
||||||
tdInitTSchemaBuilder(&sb, 0);
|
tdInitTSchemaBuilder(&sb, 0);
|
||||||
for (int i = 0; i < pSW->nCols; i++) {
|
for (int i = 0; i < pSW->nCols; i++) {
|
||||||
pSchema = pSW->pSchema + i;
|
pSchema = pSW->pSchema + i;
|
||||||
|
|
|
@ -439,29 +439,36 @@ _exit:
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
|
metaWLock(pMeta);
|
||||||
|
|
||||||
// save to table.db
|
// save to table.db
|
||||||
if (metaSaveToTbDb(pMeta, pME) < 0) return -1;
|
if (metaSaveToTbDb(pMeta, pME) < 0) goto _err;
|
||||||
|
|
||||||
// update uid.idx
|
// update uid.idx
|
||||||
if (metaUpdateUidIdx(pMeta, pME) < 0) return -1;
|
if (metaUpdateUidIdx(pMeta, pME) < 0) goto _err;
|
||||||
|
|
||||||
// update name.idx
|
// update name.idx
|
||||||
if (metaUpdateNameIdx(pMeta, pME) < 0) return -1;
|
if (metaUpdateNameIdx(pMeta, pME) < 0) goto _err;
|
||||||
|
|
||||||
if (pME->type == TSDB_CHILD_TABLE) {
|
if (pME->type == TSDB_CHILD_TABLE) {
|
||||||
// update ctb.idx
|
// update ctb.idx
|
||||||
if (metaUpdateCtbIdx(pMeta, pME) < 0) return -1;
|
if (metaUpdateCtbIdx(pMeta, pME) < 0) goto _err;
|
||||||
|
|
||||||
// update tag.idx
|
// update tag.idx
|
||||||
if (metaUpdateTagIdx(pMeta, pME) < 0) return -1;
|
if (metaUpdateTagIdx(pMeta, pME) < 0) goto _err;
|
||||||
} else {
|
} else {
|
||||||
// update schema.db
|
// update schema.db
|
||||||
if (metaSaveToSkmDb(pMeta, pME) < 0) return -1;
|
if (metaSaveToSkmDb(pMeta, pME) < 0) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pME->type != TSDB_SUPER_TABLE) {
|
if (pME->type != TSDB_SUPER_TABLE) {
|
||||||
if (metaUpdateTtlIdx(pMeta, pME) < 0) return -1;
|
if (metaUpdateTtlIdx(pMeta, pME) < 0) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metaULock(pMeta);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
metaULock(pMeta);
|
||||||
|
return -1;
|
||||||
}
|
}
|
|
@ -382,6 +382,7 @@ static int tsdbCommitToFile(SCommitH *pCommith, SDFileSet *pSet, int fid) {
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIter && pIter->pTable && (!pIdx || (pIter->pTable->uid <= pIdx->uid))) {
|
if (pIter && pIter->pTable && (!pIdx || (pIter->pTable->uid <= pIdx->uid))) {
|
||||||
if (tsdbCommitToTable(pCommith, mIter) < 0) {
|
if (tsdbCommitToTable(pCommith, mIter) < 0) {
|
||||||
tsdbCloseCommitFile(pCommith, true);
|
tsdbCloseCommitFile(pCommith, true);
|
||||||
|
@ -394,6 +395,9 @@ static int tsdbCommitToFile(SCommitH *pCommith, SDFileSet *pSet, int fid) {
|
||||||
++fIter;
|
++fIter;
|
||||||
}
|
}
|
||||||
++mIter;
|
++mIter;
|
||||||
|
} else if (pIter && !pIter->pTable) {
|
||||||
|
// When table already dropped during commit, pIter is not NULL but pIter->pTable is NULL.
|
||||||
|
++mIter; // skip the table and do nothing
|
||||||
} else if (pIdx) {
|
} else if (pIdx) {
|
||||||
if (tsdbMoveBlkIdx(pCommith, pIdx) < 0) {
|
if (tsdbMoveBlkIdx(pCommith, pIdx) < 0) {
|
||||||
tsdbCloseCommitFile(pCommith, true);
|
tsdbCloseCommitFile(pCommith, true);
|
||||||
|
@ -439,6 +443,7 @@ static int tsdbCreateCommitIters(SCommitH *pCommith) {
|
||||||
SCommitIter *pCommitIter;
|
SCommitIter *pCommitIter;
|
||||||
SSkipListNode *pNode;
|
SSkipListNode *pNode;
|
||||||
STbData *pTbData;
|
STbData *pTbData;
|
||||||
|
STSchema *pTSchema = NULL;
|
||||||
|
|
||||||
pCommith->niters = SL_SIZE(pMem->pSlIdx);
|
pCommith->niters = SL_SIZE(pMem->pSlIdx);
|
||||||
pCommith->iters = (SCommitIter *)taosMemoryCalloc(pCommith->niters, sizeof(SCommitIter));
|
pCommith->iters = (SCommitIter *)taosMemoryCalloc(pCommith->niters, sizeof(SCommitIter));
|
||||||
|
@ -459,13 +464,17 @@ static int tsdbCreateCommitIters(SCommitH *pCommith) {
|
||||||
pTbData = (STbData *)pNode->pData;
|
pTbData = (STbData *)pNode->pData;
|
||||||
|
|
||||||
pCommitIter = pCommith->iters + i;
|
pCommitIter = pCommith->iters + i;
|
||||||
pCommitIter->pIter = tSkipListCreateIter(pTbData->pData);
|
pTSchema = metaGetTbTSchema(REPO_META(pRepo), pTbData->uid, 0); // TODO: schema version
|
||||||
tSkipListIterNext(pCommitIter->pIter);
|
|
||||||
|
|
||||||
pCommitIter->pTable = (STable *)taosMemoryMalloc(sizeof(STable));
|
if (pTSchema) {
|
||||||
pCommitIter->pTable->uid = pTbData->uid;
|
pCommitIter->pIter = tSkipListCreateIter(pTbData->pData);
|
||||||
pCommitIter->pTable->tid = pTbData->uid;
|
tSkipListIterNext(pCommitIter->pIter);
|
||||||
pCommitIter->pTable->pSchema = metaGetTbTSchema(REPO_META(pRepo), pTbData->uid, 0);
|
|
||||||
|
pCommitIter->pTable = (STable *)taosMemoryMalloc(sizeof(STable));
|
||||||
|
pCommitIter->pTable->uid = pTbData->uid;
|
||||||
|
pCommitIter->pTable->tid = pTbData->uid;
|
||||||
|
pCommitIter->pTable->pSchema = pTSchema; // metaGetTbTSchema(REPO_META(pRepo), pTbData->uid, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -290,7 +290,7 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlock, int32_t *pAffectedRows) {
|
int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlock, SSubmitBlkRsp *pRsp) {
|
||||||
SSubmitBlkIter blkIter = {0};
|
SSubmitBlkIter blkIter = {0};
|
||||||
STsdbMemTable *pMemTable = pTsdb->mem;
|
STsdbMemTable *pMemTable = pTsdb->mem;
|
||||||
void *tptr;
|
void *tptr;
|
||||||
|
@ -344,7 +344,8 @@ int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlo
|
||||||
if (pMemTable->keyMin > keyMin) pMemTable->keyMin = keyMin;
|
if (pMemTable->keyMin > keyMin) pMemTable->keyMin = keyMin;
|
||||||
if (pMemTable->keyMax < keyMax) pMemTable->keyMax = keyMax;
|
if (pMemTable->keyMax < keyMax) pMemTable->keyMax = keyMax;
|
||||||
|
|
||||||
(*pAffectedRows) = pMsgIter->numOfRows;
|
pRsp->numOfRows = pMsgIter->numOfRows;
|
||||||
|
pRsp->affectedRows = pMsgIter->numOfRows;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct SMemTable {
|
||||||
|
|
||||||
struct SMemSkipListNode {
|
struct SMemSkipListNode {
|
||||||
int8_t level;
|
int8_t level;
|
||||||
SMemSkipListNode *forwards[];
|
SMemSkipListNode *forwards[1]; // Windows does not allow 0
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemSkipList {
|
struct SMemSkipList {
|
||||||
|
@ -46,7 +46,7 @@ struct SMemSkipList {
|
||||||
int8_t maxLevel;
|
int8_t maxLevel;
|
||||||
int8_t level;
|
int8_t level;
|
||||||
int32_t size;
|
int32_t size;
|
||||||
SMemSkipListNode pHead[];
|
SMemSkipListNode pHead[1]; // Windows does not allow 0
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemData {
|
struct SMemData {
|
||||||
|
|
|
@ -3870,6 +3870,7 @@ int32_t tsdbQuerySTableByTagCond(void* pMeta, uint64_t uid, TSKEY skey, const ch
|
||||||
|
|
||||||
if (metaGetTableEntryByUid(&mr, uid) < 0) {
|
if (metaGetTableEntryByUid(&mr, uid) < 0) {
|
||||||
tsdbError("%p failed to get stable, uid:%" PRIu64 ", TID:0x%" PRIx64 " QID:0x%" PRIx64, pMeta, uid, taskId, reqId);
|
tsdbError("%p failed to get stable, uid:%" PRIu64 ", TID:0x%" PRIx64 " QID:0x%" PRIx64, pMeta, uid, taskId, reqId);
|
||||||
|
metaReaderClear(&mr);
|
||||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
goto _error;
|
goto _error;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3880,6 +3881,7 @@ int32_t tsdbQuerySTableByTagCond(void* pMeta, uint64_t uid, TSKEY skey, const ch
|
||||||
tsdbError("%p query normal tag not allowed, uid:%" PRIu64 ", TID:0x%" PRIx64 " QID:0x%" PRIx64, pMeta, uid, taskId,
|
tsdbError("%p query normal tag not allowed, uid:%" PRIu64 ", TID:0x%" PRIx64 " QID:0x%" PRIx64, pMeta, uid, taskId,
|
||||||
reqId);
|
reqId);
|
||||||
terrno = TSDB_CODE_OPS_NOT_SUPPORT; // basically, this error is caused by invalid sql issued by client
|
terrno = TSDB_CODE_OPS_NOT_SUPPORT; // basically, this error is caused by invalid sql issued by client
|
||||||
|
metaReaderClear(&mr);
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,10 @@ int tsdbInsertData(STsdb *pTsdb, int64_t version, SSubmitReq *pMsg, SSubmitRsp *
|
||||||
// loop to insert
|
// loop to insert
|
||||||
tInitSubmitMsgIter(pMsg, &msgIter);
|
tInitSubmitMsgIter(pMsg, &msgIter);
|
||||||
while (true) {
|
while (true) {
|
||||||
|
SSubmitBlkRsp r = {0};
|
||||||
tGetSubmitMsgNext(&msgIter, &pBlock);
|
tGetSubmitMsgNext(&msgIter, &pBlock);
|
||||||
if (pBlock == NULL) break;
|
if (pBlock == NULL) break;
|
||||||
if (tsdbInsertTableData(pTsdb, &msgIter, pBlock, &affectedrows) < 0) {
|
if (tsdbInsertTableData(pTsdb, &msgIter, pBlock, &r) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,8 +47,8 @@ int tsdbInsertData(STsdb *pTsdb, int64_t version, SSubmitReq *pMsg, SSubmitRsp *
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRsp != NULL) {
|
if (pRsp != NULL) {
|
||||||
pRsp->affectedRows = affectedrows;
|
// pRsp->affectedRows = affectedrows;
|
||||||
pRsp->numOfRows = numOfRows;
|
// pRsp->numOfRows = numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -119,7 +119,7 @@ _exit:
|
||||||
taosMemoryFree(metaRsp.pSchemas);
|
taosMemoryFree(metaRsp.pSchemas);
|
||||||
metaReaderClear(&mer2);
|
metaReaderClear(&mer2);
|
||||||
metaReaderClear(&mer1);
|
metaReaderClear(&mer1);
|
||||||
return code;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
||||||
|
|
|
@ -502,55 +502,66 @@ _exit:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vnodeDebugPrintSingleSubmitMsg(SMeta *pMeta, SSubmitBlk *pBlock, SSubmitMsgIter *msgIter, const char *tags) {
|
||||||
|
SSubmitBlkIter blkIter = {0};
|
||||||
|
STSchema *pSchema = NULL;
|
||||||
|
tb_uid_t suid = 0;
|
||||||
|
STSRow *row = NULL;
|
||||||
|
|
||||||
|
tInitSubmitBlkIter(msgIter, pBlock, &blkIter);
|
||||||
|
if (blkIter.row == NULL) return 0;
|
||||||
|
if (!pSchema || (suid != msgIter->suid)) {
|
||||||
|
if (pSchema) {
|
||||||
|
taosMemoryFreeClear(pSchema);
|
||||||
|
}
|
||||||
|
pSchema = metaGetTbTSchema(pMeta, msgIter->suid, 0); // TODO: use the real schema
|
||||||
|
if (pSchema) {
|
||||||
|
suid = msgIter->suid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!pSchema) {
|
||||||
|
printf("%s:%d no valid schema\n", tags, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
char __tags[128] = {0};
|
||||||
|
snprintf(__tags, 128, "%s: uid %" PRIi64 " ", tags, msgIter->uid);
|
||||||
|
while ((row = tGetSubmitBlkNext(&blkIter))) {
|
||||||
|
tdSRowPrint(row, pSchema, __tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pSchema);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int vnodeDebugPrintSubmitMsg(SVnode *pVnode, SSubmitReq *pMsg, const char *tags) {
|
static int vnodeDebugPrintSubmitMsg(SVnode *pVnode, SSubmitReq *pMsg, const char *tags) {
|
||||||
ASSERT(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
SSubmitMsgIter msgIter = {0};
|
SSubmitMsgIter msgIter = {0};
|
||||||
SMeta *pMeta = pVnode->pMeta;
|
SMeta *pMeta = pVnode->pMeta;
|
||||||
SSubmitBlk *pBlock = NULL;
|
SSubmitBlk *pBlock = NULL;
|
||||||
SSubmitBlkIter blkIter = {0};
|
|
||||||
STSRow *row = NULL;
|
|
||||||
STSchema *pSchema = NULL;
|
|
||||||
tb_uid_t suid = 0;
|
|
||||||
|
|
||||||
if (tInitSubmitMsgIter(pMsg, &msgIter) < 0) return -1;
|
if (tInitSubmitMsgIter(pMsg, &msgIter) < 0) return -1;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (tGetSubmitMsgNext(&msgIter, &pBlock) < 0) return -1;
|
if (tGetSubmitMsgNext(&msgIter, &pBlock) < 0) return -1;
|
||||||
if (pBlock == NULL) break;
|
if (pBlock == NULL) break;
|
||||||
tInitSubmitBlkIter(&msgIter, pBlock, &blkIter);
|
|
||||||
if (blkIter.row == NULL) continue;
|
vnodeDebugPrintSingleSubmitMsg(pMeta, pBlock, &msgIter, tags);
|
||||||
if (!pSchema || (suid != msgIter.suid)) {
|
|
||||||
if (pSchema) {
|
|
||||||
taosMemoryFreeClear(pSchema);
|
|
||||||
}
|
|
||||||
pSchema = metaGetTbTSchema(pMeta, msgIter.suid, 0); // TODO: use the real schema
|
|
||||||
if (pSchema) {
|
|
||||||
suid = msgIter.suid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!pSchema) {
|
|
||||||
printf("%s:%d no valid schema\n", tags, __LINE__);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
char __tags[128] = {0};
|
|
||||||
snprintf(__tags, 128, "%s: uid %" PRIi64 " ", tags, msgIter.uid);
|
|
||||||
while ((row = tGetSubmitBlkNext(&blkIter))) {
|
|
||||||
tdSRowPrint(row, pSchema, __tags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(pSchema);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) {
|
static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) {
|
||||||
SSubmitReq *pSubmitReq = (SSubmitReq *)pReq;
|
SSubmitReq *pSubmitReq = (SSubmitReq *)pReq;
|
||||||
|
SSubmitRsp submitRsp = {0};
|
||||||
SSubmitMsgIter msgIter = {0};
|
SSubmitMsgIter msgIter = {0};
|
||||||
SSubmitBlk *pBlock;
|
SSubmitBlk *pBlock;
|
||||||
SSubmitRsp rsp = {0};
|
SSubmitRsp rsp = {0};
|
||||||
SVCreateTbReq createTbReq = {0};
|
SVCreateTbReq createTbReq = {0};
|
||||||
SDecoder decoder = {0};
|
SDecoder decoder = {0};
|
||||||
int32_t nRows;
|
int32_t nRows;
|
||||||
|
int32_t tsize, ret;
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
|
||||||
pRsp->code = 0;
|
pRsp->code = 0;
|
||||||
|
|
||||||
|
@ -564,12 +575,17 @@ static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, in
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
submitRsp.pArray = taosArrayInit(pSubmitReq->numOfBlocks, sizeof(SSubmitBlkRsp));
|
||||||
|
for (int i = 0;;) {
|
||||||
tGetSubmitMsgNext(&msgIter, &pBlock);
|
tGetSubmitMsgNext(&msgIter, &pBlock);
|
||||||
if (pBlock == NULL) break;
|
if (pBlock == NULL) break;
|
||||||
|
|
||||||
|
SSubmitBlkRsp submitBlkRsp = {0};
|
||||||
|
|
||||||
// create table for auto create table mode
|
// create table for auto create table mode
|
||||||
if (msgIter.schemaLen > 0) {
|
if (msgIter.schemaLen > 0) {
|
||||||
|
submitBlkRsp.hashMeta = 1;
|
||||||
|
|
||||||
tDecoderInit(&decoder, pBlock->data, msgIter.schemaLen);
|
tDecoderInit(&decoder, pBlock->data, msgIter.schemaLen);
|
||||||
if (tDecodeSVCreateTbReq(&decoder, &createTbReq) < 0) {
|
if (tDecodeSVCreateTbReq(&decoder, &createTbReq) < 0) {
|
||||||
pRsp->code = TSDB_CODE_INVALID_MSG;
|
pRsp->code = TSDB_CODE_INVALID_MSG;
|
||||||
|
@ -585,6 +601,10 @@ static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
submitBlkRsp.uid = createTbReq.uid;
|
||||||
|
submitBlkRsp.tblFName = taosMemoryMalloc(strlen(pVnode->config.dbname) + strlen(createTbReq.name) + 2);
|
||||||
|
sprintf(submitBlkRsp.tblFName, "%s.%s", pVnode->config.dbname, createTbReq.name);
|
||||||
|
|
||||||
msgIter.uid = createTbReq.uid;
|
msgIter.uid = createTbReq.uid;
|
||||||
if (createTbReq.type == TSDB_CHILD_TABLE) {
|
if (createTbReq.type == TSDB_CHILD_TABLE) {
|
||||||
msgIter.suid = createTbReq.ctb.suid;
|
msgIter.suid = createTbReq.ctb.suid;
|
||||||
|
@ -592,22 +612,33 @@ static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, in
|
||||||
msgIter.suid = 0;
|
msgIter.suid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vnodeDebugPrintSingleSubmitMsg(pVnode->pMeta, pBlock, &msgIter, "real uid");
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsdbInsertTableData(pVnode->pTsdb, &msgIter, pBlock, &nRows) < 0) {
|
if (tsdbInsertTableData(pVnode->pTsdb, &msgIter, pBlock, &submitBlkRsp) < 0) {
|
||||||
pRsp->code = terrno;
|
pRsp->code = terrno;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp.affectedRows += nRows;
|
submitRsp.numOfRows += submitBlkRsp.numOfRows;
|
||||||
|
submitRsp.affectedRows += submitBlkRsp.affectedRows;
|
||||||
|
taosArrayPush(submitRsp.pArray, &submitBlkRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
// encode the response (TODO)
|
tEncodeSize(tEncodeSSubmitRsp, &submitRsp, tsize, ret);
|
||||||
pRsp->pCont = rpcMallocCont(sizeof(SSubmitRsp));
|
pRsp->pCont = rpcMallocCont(tsize);
|
||||||
memcpy(pRsp->pCont, &rsp, sizeof(rsp));
|
pRsp->contLen = tsize;
|
||||||
pRsp->contLen = sizeof(SSubmitRsp);
|
tEncoderInit(&encoder, pRsp->pCont, tsize);
|
||||||
|
tEncodeSSubmitRsp(&encoder, &submitRsp);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(submitRsp.pArray); i++) {
|
||||||
|
taosMemoryFree(((SSubmitBlkRsp *)taosArrayGet(submitRsp.pArray, i))[0].tblFName);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(submitRsp.pArray);
|
||||||
|
|
||||||
tsdbTriggerRSma(pVnode->pTsdb, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
tsdbTriggerRSma(pVnode->pTsdb, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,23 @@
|
||||||
* 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 "filter.h"
|
#ifndef _INDEX_OPERATOR_H
|
||||||
|
#define _INDEX_OPERATOR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "nodes.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
|
|
||||||
typedef enum { SFLT_NOT_INDEX, SFLT_COARSE_INDEX, SFLT_ACCURATE_INDEX } SIdxFltStatus;
|
typedef enum { SFLT_NOT_INDEX, SFLT_COARSE_INDEX, SFLT_ACCURATE_INDEX } SIdxFltStatus;
|
||||||
|
|
||||||
SIdxFltStatus idxGetFltStatus(SNode *pFilterNode);
|
SIdxFltStatus idxGetFltStatus(SNode *pFilterNode);
|
||||||
// construct tag filter operator later
|
// construct tag filter operator later
|
||||||
int32_t doFilterTag(const SNode *pFilterNode, SArray *resutl);
|
int32_t doFilterTag(const SNode *pFilterNode, SArray *result);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*INDEX_OPERATOR_*/
|
||||||
|
|
|
@ -583,7 +583,7 @@ int32_t doFilterTag(const SNode *pFilterNode, SArray *result) {
|
||||||
|
|
||||||
SFilterInfo *filter = NULL;
|
SFilterInfo *filter = NULL;
|
||||||
// todo move to the initialization function
|
// todo move to the initialization function
|
||||||
SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
|
// SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
|
||||||
|
|
||||||
SIFParam param = {0};
|
SIFParam param = {0};
|
||||||
SIF_ERR_RET(sifCalculate((SNode *)pFilterNode, ¶m));
|
SIF_ERR_RET(sifCalculate((SNode *)pFilterNode, ¶m));
|
||||||
|
@ -598,9 +598,9 @@ SIdxFltStatus idxGetFltStatus(SNode *pFilterNode) {
|
||||||
if (pFilterNode == NULL) {
|
if (pFilterNode == NULL) {
|
||||||
return SFLT_NOT_INDEX;
|
return SFLT_NOT_INDEX;
|
||||||
}
|
}
|
||||||
SFilterInfo *filter = NULL;
|
// SFilterInfo *filter = NULL;
|
||||||
// todo move to the initialization function
|
// todo move to the initialization function
|
||||||
SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
|
// SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
|
||||||
|
|
||||||
SIF_ERR_RET(sifGetFltHint((SNode *)pFilterNode, &st));
|
SIF_ERR_RET(sifGetFltHint((SNode *)pFilterNode, &st));
|
||||||
return st;
|
return st;
|
||||||
|
|
|
@ -948,10 +948,6 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
code = qCreateExecTask(&handle, 2, 1, plan, (void**)&pTaskInfo, &sinkHandle, OPTR_EXEC_MODEL_BATCH);
|
code = qCreateExecTask(&handle, 2, 1, plan, (void**)&pTaskInfo, &sinkHandle, OPTR_EXEC_MODEL_BATCH);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
}
|
}
|
||||||
TEST(testCase, index_plan_test) {
|
|
||||||
// add later
|
|
||||||
EXPECT_EQ(0, 0);
|
|
||||||
}
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
TEST(testCase, inMem_sort_Test) {
|
TEST(testCase, inMem_sort_Test) {
|
||||||
|
|
|
@ -0,0 +1,253 @@
|
||||||
|
/*
|
||||||
|
* 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 <gtest/gtest.h>
|
||||||
|
#include <tglobal.h>
|
||||||
|
#include <tsort.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
|
||||||
|
#include "executor.h"
|
||||||
|
#include "executorimpl.h"
|
||||||
|
#include "indexoperator.h"
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "stub.h"
|
||||||
|
#include "taos.h"
|
||||||
|
#include "tcompare.h"
|
||||||
|
#include "tdatablock.h"
|
||||||
|
#include "tdef.h"
|
||||||
|
#include "trpc.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
SColumnInfo createColumnInfo(int32_t colId, int32_t type, int32_t bytes) {
|
||||||
|
SColumnInfo info = {0};
|
||||||
|
info.colId = colId;
|
||||||
|
info.type = type;
|
||||||
|
info.bytes = bytes;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t sifLeftV = 21, sifRightV = 10;
|
||||||
|
double sifLeftVd = 21.0, sifRightVd = 10.0;
|
||||||
|
|
||||||
|
void sifFreeDataBlock(void *block) { blockDataDestroy(*(SSDataBlock **)block); }
|
||||||
|
|
||||||
|
void sifInitLogFile() {
|
||||||
|
const char * defaultLogFileNamePrefix = "taoslog";
|
||||||
|
const int32_t maxLogFileNum = 10;
|
||||||
|
|
||||||
|
tsAsyncLog = 0;
|
||||||
|
qDebugFlag = 159;
|
||||||
|
strcpy(tsLogDir, "/tmp/sif");
|
||||||
|
taosRemoveDir(tsLogDir);
|
||||||
|
taosMkDir(tsLogDir);
|
||||||
|
|
||||||
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifAppendReservedSlot(SArray *pBlockList, int16_t *dataBlockId, int16_t *slotId, bool newBlock, int32_t rows,
|
||||||
|
SColumnInfo *colInfo) {
|
||||||
|
if (newBlock) {
|
||||||
|
SSDataBlock *res = (SSDataBlock *)taosMemoryCalloc(1, sizeof(SSDataBlock));
|
||||||
|
res->info.numOfCols = 1;
|
||||||
|
res->info.rows = rows;
|
||||||
|
res->pDataBlock = taosArrayInit(1, sizeof(SColumnInfoData));
|
||||||
|
SColumnInfoData idata = {0};
|
||||||
|
idata.info = *colInfo;
|
||||||
|
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
taosArrayPush(pBlockList, &res);
|
||||||
|
|
||||||
|
blockDataEnsureCapacity(res, rows);
|
||||||
|
|
||||||
|
*dataBlockId = taosArrayGetSize(pBlockList) - 1;
|
||||||
|
res->info.blockId = *dataBlockId;
|
||||||
|
*slotId = 0;
|
||||||
|
} else {
|
||||||
|
SSDataBlock *res = *(SSDataBlock **)taosArrayGetLast(pBlockList);
|
||||||
|
res->info.numOfCols++;
|
||||||
|
SColumnInfoData idata = {0};
|
||||||
|
idata.info = *colInfo;
|
||||||
|
|
||||||
|
colInfoDataEnsureCapacity(&idata, 0, rows);
|
||||||
|
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
|
||||||
|
*dataBlockId = taosArrayGetSize(pBlockList) - 1;
|
||||||
|
*slotId = taosArrayGetSize(res->pDataBlock) - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeValueNode(SNode **pNode, int32_t dataType, void *value) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
|
SValueNode *vnode = (SValueNode *)node;
|
||||||
|
vnode->node.resType.type = dataType;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(dataType)) {
|
||||||
|
vnode->datum.p = (char *)taosMemoryMalloc(varDataTLen(value));
|
||||||
|
varDataCopy(vnode->datum.p, value);
|
||||||
|
vnode->node.resType.bytes = varDataTLen(value);
|
||||||
|
} else {
|
||||||
|
vnode->node.resType.bytes = tDataTypes[dataType].bytes;
|
||||||
|
assignVal((char *)nodesGetValueFromNode(vnode), (const char *)value, 0, dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pNode = (SNode *)vnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeColumnNode(SNode **pNode, const char *db, const char *colName, EColumnType colType, uint8_t colValType) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
|
SColumnNode *rnode = (SColumnNode *)node;
|
||||||
|
memcpy(rnode->dbName, db, strlen(db));
|
||||||
|
memcpy(rnode->colName, colName, strlen(colName));
|
||||||
|
|
||||||
|
rnode->colType = colType;
|
||||||
|
rnode->node.resType.type = colValType;
|
||||||
|
|
||||||
|
*pNode = (SNode *)rnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNode *pLeft, SNode *pRight) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_OPERATOR);
|
||||||
|
SOperatorNode *onode = (SOperatorNode *)node;
|
||||||
|
onode->node.resType.type = resType;
|
||||||
|
onode->node.resType.bytes = tDataTypes[resType].bytes;
|
||||||
|
|
||||||
|
onode->opType = opType;
|
||||||
|
onode->pLeft = pLeft;
|
||||||
|
onode->pRight = pRight;
|
||||||
|
|
||||||
|
*pNode = (SNode *)onode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeListNode(SNode **pNode, SNodeList *list, int32_t resType) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
SNodeListNode *lnode = (SNodeListNode *)node;
|
||||||
|
lnode->dataType.type = resType;
|
||||||
|
lnode->pNodeList = list;
|
||||||
|
|
||||||
|
*pNode = (SNode *)lnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nodeList, int32_t nodeNum) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
|
SLogicConditionNode *onode = (SLogicConditionNode *)node;
|
||||||
|
onode->condType = opType;
|
||||||
|
onode->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
||||||
|
onode->node.resType.bytes = sizeof(bool);
|
||||||
|
|
||||||
|
onode->pParameterList = nodesMakeList();
|
||||||
|
for (int32_t i = 0; i < nodeNum; ++i) {
|
||||||
|
nodesListAppend(onode->pParameterList, nodeList[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pNode = (SNode *)onode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sifMakeTargetNode(SNode **pNode, int16_t dataBlockId, int16_t slotId, SNode *snode) {
|
||||||
|
SNode * node = (SNode *)nodesMakeNode(QUERY_NODE_TARGET);
|
||||||
|
STargetNode *onode = (STargetNode *)node;
|
||||||
|
onode->pExpr = snode;
|
||||||
|
onode->dataBlockId = dataBlockId;
|
||||||
|
onode->slotId = slotId;
|
||||||
|
|
||||||
|
*pNode = (SNode *)onode;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
TEST(testCase, index_filter) {
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_INT, pLeft, pRight);
|
||||||
|
SArray *result = taosArrayInit(4, sizeof(uint64_t));
|
||||||
|
doFilterTag(opNode, result);
|
||||||
|
EXPECT_EQ(1, taosArrayGetSize(result));
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||||
|
|
||||||
|
SArray *result = taosArrayInit(4, sizeof(uint64_t));
|
||||||
|
doFilterTag(opNode, result);
|
||||||
|
EXPECT_EQ(1, taosArrayGetSize(result));
|
||||||
|
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, index_filter_varify) {
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_INT, pLeft, pRight);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
|
||||||
|
SIdxFltStatus st = idxGetFltStatus(opNode);
|
||||||
|
EXPECT_EQ(st, SFLT_ACCURATE_INDEX);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||||
|
|
||||||
|
SIdxFltStatus st = idxGetFltStatus(opNode);
|
||||||
|
EXPECT_EQ(st, SFLT_COARSE_INDEX);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_INT, pLeft, pRight);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
|
||||||
|
SIdxFltStatus st = idxGetFltStatus(opNode);
|
||||||
|
EXPECT_EQ(st, SFLT_ACCURATE_INDEX);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL, *res = NULL;
|
||||||
|
sifMakeColumnNode(&pLeft, "test", "col", COLUMN_TYPE_TAG, TSDB_DATA_TYPE_INT);
|
||||||
|
sifMakeValueNode(&pRight, TSDB_DATA_TYPE_INT, &sifRightV);
|
||||||
|
sifMakeOpNode(&opNode, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||||
|
|
||||||
|
SIdxFltStatus st = idxGetFltStatus(opNode);
|
||||||
|
EXPECT_EQ(st, SFLT_COARSE_INDEX);
|
||||||
|
nodesDestroyNode(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
|
@ -239,7 +239,7 @@ static int32_t translateLeastSQR(SFunctionNode* pFunc, char* pErrBuf, int32_t le
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pFunc->node.resType = (SDataType) { .bytes = 64, .type = TSDB_DATA_TYPE_BINARY };
|
pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1042,26 +1042,6 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.sprocessFunc = timezoneFunction,
|
.sprocessFunc = timezoneFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.name = "_rowts",
|
|
||||||
.type = FUNCTION_TYPE_ROWTS,
|
|
||||||
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
|
|
||||||
.translateFunc = translateTimePseudoColumn,
|
|
||||||
.getEnvFunc = getTimePseudoFuncEnv,
|
|
||||||
.initFunc = NULL,
|
|
||||||
.sprocessFunc = NULL,
|
|
||||||
.finalizeFunc = NULL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.name = "_c0",
|
|
||||||
.type = FUNCTION_TYPE_ROWTS,
|
|
||||||
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
|
|
||||||
.translateFunc = translateTimePseudoColumn,
|
|
||||||
.getEnvFunc = getTimePseudoFuncEnv,
|
|
||||||
.initFunc = NULL,
|
|
||||||
.sprocessFunc = NULL,
|
|
||||||
.finalizeFunc = NULL
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.name = "tbname",
|
.name = "tbname",
|
||||||
.type = FUNCTION_TYPE_TBNAME,
|
.type = FUNCTION_TYPE_TBNAME,
|
||||||
|
|
|
@ -137,7 +137,7 @@ void destroyBlockArrayList(SArray* pDataBlockList);
|
||||||
void destroyBlockHashmap(SHashObj* pDataBlockHash);
|
void destroyBlockHashmap(SHashObj* pDataBlockHash);
|
||||||
int initRowBuilder(SRowBuilder *pBuilder, int16_t schemaVer, SParsedDataColInfo *pColInfo);
|
int initRowBuilder(SRowBuilder *pBuilder, int16_t schemaVer, SParsedDataColInfo *pColInfo);
|
||||||
int32_t allocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int32_t * numOfRows);
|
int32_t allocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int32_t * numOfRows);
|
||||||
int32_t getDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, int32_t startOffset, int32_t rowSize,
|
int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32_t size, int32_t startOffset, int32_t rowSize,
|
||||||
STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList, SVCreateTbReq* pCreateTbReq);
|
STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList, SVCreateTbReq* pCreateTbReq);
|
||||||
int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** pVgDataBlocks);
|
int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** pVgDataBlocks);
|
||||||
int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq);
|
int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq);
|
||||||
|
|
|
@ -350,7 +350,18 @@ SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft,
|
||||||
createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, nodesCloneNode(pExpr), pRight));
|
createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, nodesCloneNode(pExpr), pRight));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt) {
|
||||||
|
SColumnNode* pCol = nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
|
CHECK_OUT_OF_MEM(pCol);
|
||||||
|
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
|
strcpy(pCol->colName, PK_TS_COL_INTERNAL_NAME);
|
||||||
|
return (SNode*)pCol;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNodeList* pParameterList) {
|
SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNodeList* pParameterList) {
|
||||||
|
if (0 == strncasecmp("_rowts", pFuncName->z, pFuncName->n) || 0 == strncasecmp("_c0", pFuncName->z, pFuncName->n)) {
|
||||||
|
return createPrimaryKeyCol(pCxt);
|
||||||
|
}
|
||||||
SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
CHECK_OUT_OF_MEM(func);
|
CHECK_OUT_OF_MEM(func);
|
||||||
strncpy(func->functionName, pFuncName->z, pFuncName->n);
|
strncpy(func->functionName, pFuncName->z, pFuncName->n);
|
||||||
|
@ -467,13 +478,11 @@ SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap
|
||||||
SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
|
SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
|
||||||
SStateWindowNode* state = (SStateWindowNode*)nodesMakeNode(QUERY_NODE_STATE_WINDOW);
|
SStateWindowNode* state = (SStateWindowNode*)nodesMakeNode(QUERY_NODE_STATE_WINDOW);
|
||||||
CHECK_OUT_OF_MEM(state);
|
CHECK_OUT_OF_MEM(state);
|
||||||
state->pCol = nodesMakeNode(QUERY_NODE_COLUMN);
|
state->pCol = createPrimaryKeyCol(pCxt);
|
||||||
if (NULL == state->pCol) {
|
if (NULL == state->pCol) {
|
||||||
nodesDestroyNode(state);
|
nodesDestroyNode(state);
|
||||||
CHECK_OUT_OF_MEM(state->pCol);
|
CHECK_OUT_OF_MEM(state->pCol);
|
||||||
}
|
}
|
||||||
((SColumnNode*)state->pCol)->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
|
||||||
strcpy(((SColumnNode*)state->pCol)->colName, PK_TS_COL_INTERNAL_NAME);
|
|
||||||
state->pExpr = pExpr;
|
state->pExpr = pExpr;
|
||||||
return (SNode*)state;
|
return (SNode*)state;
|
||||||
}
|
}
|
||||||
|
@ -482,13 +491,11 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode
|
||||||
SNode* pFill) {
|
SNode* pFill) {
|
||||||
SIntervalWindowNode* interval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW);
|
SIntervalWindowNode* interval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW);
|
||||||
CHECK_OUT_OF_MEM(interval);
|
CHECK_OUT_OF_MEM(interval);
|
||||||
interval->pCol = nodesMakeNode(QUERY_NODE_COLUMN);
|
interval->pCol = createPrimaryKeyCol(pCxt);
|
||||||
if (NULL == interval->pCol) {
|
if (NULL == interval->pCol) {
|
||||||
nodesDestroyNode(interval);
|
nodesDestroyNode(interval);
|
||||||
CHECK_OUT_OF_MEM(interval->pCol);
|
CHECK_OUT_OF_MEM(interval->pCol);
|
||||||
}
|
}
|
||||||
((SColumnNode*)interval->pCol)->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
|
||||||
strcpy(((SColumnNode*)interval->pCol)->colName, PK_TS_COL_INTERNAL_NAME);
|
|
||||||
interval->pInterval = pInterval;
|
interval->pInterval = pInterval;
|
||||||
interval->pOffset = pOffset;
|
interval->pOffset = pOffset;
|
||||||
interval->pSliding = pSliding;
|
interval->pSliding = pSliding;
|
||||||
|
@ -667,7 +674,7 @@ SNode* setDatabaseOption(SAstCreateContext* pCxt, SNode* pOptions, EDatabaseOpti
|
||||||
case DB_OPTION_DAYS: {
|
case DB_OPTION_DAYS: {
|
||||||
SToken* pToken = pVal;
|
SToken* pToken = pVal;
|
||||||
if (TK_NK_INTEGER == pToken->type) {
|
if (TK_NK_INTEGER == pToken->type) {
|
||||||
((SDatabaseOptions*)pOptions)->daysPerFile = strtol(pToken->z, NULL, 10);
|
((SDatabaseOptions*)pOptions)->daysPerFile = strtol(pToken->z, NULL, 10) * 1440;
|
||||||
} else {
|
} else {
|
||||||
((SDatabaseOptions*)pOptions)->pDaysPerFile = (SValueNode*)createDurationValueNode(pCxt, pToken);
|
((SDatabaseOptions*)pOptions)->pDaysPerFile = (SValueNode*)createDurationValueNode(pCxt, pToken);
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,36 +237,32 @@ static int32_t createSName(SName* pName, SToken* pTableName, int32_t acctId, con
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getTableMetaImpl(SInsertParseContext* pCxt, SToken* pTname, bool isStb) {
|
static int32_t getTableMetaImpl(SInsertParseContext* pCxt, SName* name, char *dbFname, bool isStb) {
|
||||||
SParseContext* pBasicCtx = pCxt->pComCxt;
|
SParseContext* pBasicCtx = pCxt->pComCxt;
|
||||||
SName name = {0};
|
|
||||||
createSName(&name, pTname, pBasicCtx->acctId, pBasicCtx->db, &pCxt->msg);
|
|
||||||
|
|
||||||
char dbFname[TSDB_DB_FNAME_LEN] = {0};
|
|
||||||
tNameGetFullDbName(&name, dbFname);
|
|
||||||
|
|
||||||
bool pass = false;
|
bool pass = false;
|
||||||
CHECK_CODE(catalogChkAuth(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, pBasicCtx->pUser, dbFname, AUTH_TYPE_WRITE, &pass));
|
CHECK_CODE(catalogChkAuth(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, pBasicCtx->pUser,
|
||||||
|
dbFname, AUTH_TYPE_WRITE, &pass));
|
||||||
if (!pass) {
|
if (!pass) {
|
||||||
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
if (isStb) {
|
if (isStb) {
|
||||||
CHECK_CODE(catalogGetSTableMeta(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, &name,
|
CHECK_CODE(catalogGetSTableMeta(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, name,
|
||||||
&pCxt->pTableMeta));
|
&pCxt->pTableMeta));
|
||||||
} else {
|
} else {
|
||||||
CHECK_CODE(catalogGetTableMeta(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, &name,
|
CHECK_CODE(catalogGetTableMeta(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, name,
|
||||||
&pCxt->pTableMeta));
|
&pCxt->pTableMeta));
|
||||||
SVgroupInfo vg;
|
SVgroupInfo vg;
|
||||||
CHECK_CODE(
|
CHECK_CODE(
|
||||||
catalogGetTableHashVgroup(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, &name, &vg));
|
catalogGetTableHashVgroup(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, name, &vg));
|
||||||
CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
|
CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getTableMeta(SInsertParseContext* pCxt, SToken* pTname) { return getTableMetaImpl(pCxt, pTname, false); }
|
static int32_t getTableMeta(SInsertParseContext* pCxt, SName* name, char *dbFname) { return getTableMetaImpl(pCxt, name, dbFname, false); }
|
||||||
|
|
||||||
static int32_t getSTableMeta(SInsertParseContext* pCxt, SToken* pTname) { return getTableMetaImpl(pCxt, pTname, true); }
|
static int32_t getSTableMeta(SInsertParseContext* pCxt, SName* name, char *dbFname) { return getTableMetaImpl(pCxt, name, dbFname, true); }
|
||||||
|
|
||||||
static int32_t findCol(SToken* pColname, int32_t start, int32_t end, SSchema* pSchema) {
|
static int32_t findCol(SToken* pColname, int32_t start, int32_t end, SSchema* pSchema) {
|
||||||
while (start < end) {
|
while (start < end) {
|
||||||
|
@ -349,8 +345,7 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
|
||||||
} else if (pToken->type == TK_TODAY) {
|
} else if (pToken->type == TK_TODAY) {
|
||||||
ts = taosGetTimestampToday(timePrec);
|
ts = taosGetTimestampToday(timePrec);
|
||||||
} else if (pToken->type == TK_NK_INTEGER) {
|
} else if (pToken->type == TK_NK_INTEGER) {
|
||||||
bool isSigned = false;
|
toInteger(pToken->z, pToken->n, 10, &ts);
|
||||||
toInteger(pToken->z, pToken->n, 10, &ts, &isSigned);
|
|
||||||
} else { // parse the RFC-3339/ISO-8601 timestamp format string
|
} else { // parse the RFC-3339/ISO-8601 timestamp format string
|
||||||
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
|
||||||
|
@ -453,9 +448,9 @@ static FORCE_INLINE int32_t toDouble(SToken* pToken, double* value, char** endPt
|
||||||
|
|
||||||
static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, char* tmpTokenBuf,
|
static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, char* tmpTokenBuf,
|
||||||
_row_append_fn_t func, void* param, SMsgBuf* pMsgBuf) {
|
_row_append_fn_t func, void* param, SMsgBuf* pMsgBuf) {
|
||||||
int64_t iv;
|
int64_t iv;
|
||||||
char* endptr = NULL;
|
uint64_t uv;
|
||||||
bool isSigned = false;
|
char* endptr = NULL;
|
||||||
|
|
||||||
int32_t code = checkAndTrimValue(pToken, pSchema->type, tmpTokenBuf, pMsgBuf);
|
int32_t code = checkAndTrimValue(pToken, pSchema->type, tmpTokenBuf, pMsgBuf);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -490,7 +485,7 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid tinyint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid tinyint data", pToken->z);
|
||||||
} else if (!IS_VALID_TINYINT(iv)) {
|
} else if (!IS_VALID_TINYINT(iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "tinyint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "tinyint data overflow", pToken->z);
|
||||||
|
@ -501,17 +496,17 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned tinyint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned tinyint data", pToken->z);
|
||||||
} else if (!IS_VALID_UTINYINT(iv)) {
|
} else if (!IS_VALID_UTINYINT(uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "unsigned tinyint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned tinyint data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
uint8_t tmpVal = (uint8_t)iv;
|
uint8_t tmpVal = (uint8_t)uv;
|
||||||
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid smallint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid smallint data", pToken->z);
|
||||||
} else if (!IS_VALID_SMALLINT(iv)) {
|
} else if (!IS_VALID_SMALLINT(iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "smallint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "smallint data overflow", pToken->z);
|
||||||
|
@ -521,17 +516,17 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned smallint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned smallint data", pToken->z);
|
||||||
} else if (!IS_VALID_USMALLINT(iv)) {
|
} else if (!IS_VALID_USMALLINT(uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "unsigned smallint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned smallint data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
uint16_t tmpVal = (uint16_t)iv;
|
uint16_t tmpVal = (uint16_t)uv;
|
||||||
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid int data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid int data", pToken->z);
|
||||||
} else if (!IS_VALID_INT(iv)) {
|
} else if (!IS_VALID_INT(iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "int data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "int data overflow", pToken->z);
|
||||||
|
@ -541,17 +536,17 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned int data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned int data", pToken->z);
|
||||||
} else if (!IS_VALID_UINT(iv)) {
|
} else if (!IS_VALID_UINT(uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "unsigned int data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned int data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
uint32_t tmpVal = (uint32_t)iv;
|
uint32_t tmpVal = (uint32_t)uv;
|
||||||
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
||||||
} else if (!IS_VALID_BIGINT(iv)) {
|
} else if (!IS_VALID_BIGINT(iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "bigint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "bigint data overflow", pToken->z);
|
||||||
|
@ -560,13 +555,12 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv, &isSigned)) {
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned bigint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned bigint data", pToken->z);
|
||||||
} else if (!IS_VALID_UBIGINT((uint64_t)iv)) {
|
} else if (!IS_VALID_UBIGINT(uv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "unsigned bigint data overflow", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned bigint data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
uint64_t tmpVal = (uint64_t)iv;
|
return func(pMsgBuf, &uv, pSchema->bytes, param);
|
||||||
return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
|
@ -771,7 +765,7 @@ static int32_t KvRowAppend(SMsgBuf* pMsgBuf, const void* value, int32_t len, voi
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildCreateTbReq(SVCreateTbReq *pTbReq, const char* tname, SKVRow row, int64_t suid) {
|
static int32_t buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, SKVRow row, int64_t suid) {
|
||||||
pTbReq->type = TD_CHILD_TABLE;
|
pTbReq->type = TD_CHILD_TABLE;
|
||||||
pTbReq->name = strdup(tname);
|
pTbReq->name = strdup(tname);
|
||||||
pTbReq->ctb.suid = suid;
|
pTbReq->ctb.suid = suid;
|
||||||
|
@ -842,8 +836,9 @@ static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, SName*
|
||||||
catalogGetTableHashVgroup(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, pTableName, &vg));
|
catalogGetTableHashVgroup(pBasicCtx->pCatalog, pBasicCtx->pTransporter, &pBasicCtx->mgmtEpSet, pTableName, &vg));
|
||||||
CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
|
CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
|
||||||
|
|
||||||
pMeta->uid = tGenIdPI64();
|
pMeta->uid = 0;
|
||||||
pMeta->vgId = vg.vgId;
|
pMeta->vgId = vg.vgId;
|
||||||
|
pMeta->tableType = TSDB_CHILD_TABLE;
|
||||||
|
|
||||||
STableMeta* pBackup = NULL;
|
STableMeta* pBackup = NULL;
|
||||||
if (TSDB_CODE_SUCCESS != cloneTableMeta(pMeta, &pBackup)) {
|
if (TSDB_CODE_SUCCESS != cloneTableMeta(pMeta, &pBackup)) {
|
||||||
|
@ -853,11 +848,7 @@ static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, SName*
|
||||||
}
|
}
|
||||||
|
|
||||||
// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
|
// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
|
||||||
static int32_t parseUsingClause(SInsertParseContext* pCxt, SToken* pTbnameToken) {
|
static int32_t parseUsingClause(SInsertParseContext* pCxt, SName* name, char* tbFName) {
|
||||||
SName name;
|
|
||||||
createSName(&name, pTbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
|
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
|
||||||
tNameExtractFullName(&name, tbFName);
|
|
||||||
int32_t len = strlen(tbFName);
|
int32_t len = strlen(tbFName);
|
||||||
STableMeta** pMeta = taosHashGet(pCxt->pSubTableHashObj, tbFName, len);
|
STableMeta** pMeta = taosHashGet(pCxt->pSubTableHashObj, tbFName, len);
|
||||||
if (NULL != pMeta) {
|
if (NULL != pMeta) {
|
||||||
|
@ -867,11 +858,17 @@ static int32_t parseUsingClause(SInsertParseContext* pCxt, SToken* pTbnameToken)
|
||||||
SToken sToken;
|
SToken sToken;
|
||||||
// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
|
// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
|
||||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||||
CHECK_CODE(getSTableMeta(pCxt, &sToken));
|
|
||||||
|
SName sname;
|
||||||
|
createSName(&sname, &sToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
|
||||||
|
char stbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(&sname, stbFName);
|
||||||
|
|
||||||
|
CHECK_CODE(getSTableMeta(pCxt, &sname, stbFName));
|
||||||
if (TSDB_SUPER_TABLE != pCxt->pTableMeta->tableType) {
|
if (TSDB_SUPER_TABLE != pCxt->pTableMeta->tableType) {
|
||||||
return buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed");
|
return buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed");
|
||||||
}
|
}
|
||||||
CHECK_CODE(storeTableMeta(pCxt, pCxt->pSubTableHashObj, &name, tbFName, len, pCxt->pTableMeta));
|
CHECK_CODE(storeTableMeta(pCxt, pCxt->pSubTableHashObj, name, tbFName, len, pCxt->pTableMeta));
|
||||||
|
|
||||||
SSchema* pTagsSchema = getTableTagSchema(pCxt->pTableMeta);
|
SSchema* pTagsSchema = getTableTagSchema(pCxt->pTableMeta);
|
||||||
setBoundColumnInfo(&pCxt->tags, pTagsSchema, getNumOfTags(pCxt->pTableMeta));
|
setBoundColumnInfo(&pCxt->tags, pTagsSchema, getNumOfTags(pCxt->pTableMeta));
|
||||||
|
@ -891,7 +888,7 @@ static int32_t parseUsingClause(SInsertParseContext* pCxt, SToken* pTbnameToken)
|
||||||
if (TK_NK_LP != sToken.type) {
|
if (TK_NK_LP != sToken.type) {
|
||||||
return buildSyntaxErrMsg(&pCxt->msg, "( is expected", sToken.z);
|
return buildSyntaxErrMsg(&pCxt->msg, "( is expected", sToken.z);
|
||||||
}
|
}
|
||||||
CHECK_CODE(parseTagsClause(pCxt, pCxt->pTableMeta->schema, getTableInfo(pCxt->pTableMeta).precision, name.tname));
|
CHECK_CODE(parseTagsClause(pCxt, pCxt->pTableMeta->schema, getTableInfo(pCxt->pTableMeta).precision, name->tname));
|
||||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||||
if (TK_NK_RP != sToken.type) {
|
if (TK_NK_RP != sToken.type) {
|
||||||
return buildSyntaxErrMsg(&pCxt->msg, ") is expected", sToken.z);
|
return buildSyntaxErrMsg(&pCxt->msg, ") is expected", sToken.z);
|
||||||
|
@ -1066,6 +1063,8 @@ static void destroyInsertParseContext(SInsertParseContext* pCxt) {
|
||||||
// [...];
|
// [...];
|
||||||
static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
int32_t tbNum = 0;
|
int32_t tbNum = 0;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
bool autoCreateTbl = false;
|
||||||
|
|
||||||
// for each table
|
// for each table
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -1103,16 +1102,21 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
SToken tbnameToken = sToken;
|
SToken tbnameToken = sToken;
|
||||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||||
|
|
||||||
|
SName name;
|
||||||
|
createSName(&name, &tbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
|
||||||
|
tNameExtractFullName(&name, tbFName);
|
||||||
|
|
||||||
// USING cluase
|
// USING cluase
|
||||||
if (TK_USING == sToken.type) {
|
if (TK_USING == sToken.type) {
|
||||||
CHECK_CODE(parseUsingClause(pCxt, &tbnameToken));
|
CHECK_CODE(parseUsingClause(pCxt, &name, tbFName));
|
||||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||||
|
autoCreateTbl = true;
|
||||||
} else {
|
} else {
|
||||||
CHECK_CODE(getTableMeta(pCxt, &tbnameToken));
|
CHECK_CODE(getTableMeta(pCxt, &name, tbFName));
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataBlocks* dataBuf = NULL;
|
STableDataBlocks* dataBuf = NULL;
|
||||||
CHECK_CODE(getDataBlockFromList(pCxt->pTableBlockHashObj, pCxt->pTableMeta->uid, TSDB_DEFAULT_PAYLOAD_SIZE,
|
CHECK_CODE(getDataBlockFromList(pCxt->pTableBlockHashObj, tbFName, strlen(tbFName), TSDB_DEFAULT_PAYLOAD_SIZE,
|
||||||
sizeof(SSubmitBlk), getTableInfo(pCxt->pTableMeta).rowSize, pCxt->pTableMeta,
|
sizeof(SSubmitBlk), getTableInfo(pCxt->pTableMeta).rowSize, pCxt->pTableMeta,
|
||||||
&dataBuf, NULL, &pCxt->createTblReq));
|
&dataBuf, NULL, &pCxt->createTblReq));
|
||||||
|
|
||||||
|
@ -1154,10 +1158,9 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
memcpy(tags, &pCxt->tags, sizeof(pCxt->tags));
|
memcpy(tags, &pCxt->tags, sizeof(pCxt->tags));
|
||||||
(*pCxt->pStmtCb->setBindInfoFn)(pCxt->pStmtCb->pStmt, pCxt->pTableMeta, tags);
|
(*pCxt->pStmtCb->setInfoFn)(pCxt->pStmtCb->pStmt, pCxt->pTableMeta, tags, tbFName, autoCreateTbl, pCxt->pVgroupsHashObj, pCxt->pTableBlockHashObj);
|
||||||
memset(&pCxt->tags, 0, sizeof(pCxt->tags));
|
|
||||||
|
|
||||||
(*pCxt->pStmtCb->setExecInfoFn)(pCxt->pStmtCb->pStmt, pCxt->pVgroupsHashObj, pCxt->pTableBlockHashObj);
|
memset(&pCxt->tags, 0, sizeof(pCxt->tags));
|
||||||
pCxt->pVgroupsHashObj = NULL;
|
pCxt->pVgroupsHashObj = NULL;
|
||||||
pCxt->pTableBlockHashObj = NULL;
|
pCxt->pTableBlockHashObj = NULL;
|
||||||
pCxt->pTableMeta = NULL;
|
pCxt->pTableMeta = NULL;
|
||||||
|
@ -1194,7 +1197,7 @@ int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery) {
|
||||||
&context.pTableBlockHashObj);
|
&context.pTableBlockHashObj);
|
||||||
} else {
|
} else {
|
||||||
context.pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, false);
|
context.pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, false);
|
||||||
context.pTableBlockHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
context.pTableBlockHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == context.pVgroupsHashObj || NULL == context.pTableBlockHashObj || NULL == context.pSubTableHashObj ||
|
if (NULL == context.pVgroupsHashObj || NULL == context.pTableBlockHashObj || NULL == context.pSubTableHashObj ||
|
||||||
|
@ -1273,9 +1276,10 @@ int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBindStmtTagsValue(void *pBlock, void *boundTags, int64_t suid, char *tName, TAOS_MULTI_BIND *bind, char *msgBuf, int32_t msgBufLen){
|
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tName, TAOS_MULTI_BIND* bind,
|
||||||
STableDataBlocks *pDataBlock = (STableDataBlocks *)pBlock;
|
char* msgBuf, int32_t msgBufLen) {
|
||||||
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
|
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
|
||||||
|
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
|
||||||
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
|
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
|
||||||
if (NULL == tags) {
|
if (NULL == tags) {
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
@ -1389,7 +1393,6 @@ int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, in
|
||||||
tdSRowPrint(row, pSTSchema, __func__);
|
tdSRowPrint(row, pSTSchema, __func__);
|
||||||
taosMemoryFree(pSTSchema);
|
taosMemoryFree(pSTSchema);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pDataBlock->size += extendedRowSize;
|
pDataBlock->size += extendedRowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1476,6 +1479,7 @@ int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBu
|
||||||
taosMemoryFree(pSTSchema);
|
taosMemoryFree(pSTSchema);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rowEnd) {
|
if (rowEnd) {
|
||||||
|
@ -1550,16 +1554,16 @@ int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD** fields
|
||||||
// schemaless logic start
|
// schemaless logic start
|
||||||
|
|
||||||
typedef struct SmlExecHandle {
|
typedef struct SmlExecHandle {
|
||||||
SHashObj* pBlockHash;
|
SHashObj* pBlockHash;
|
||||||
|
|
||||||
SParsedDataColInfo tags; // each table
|
SParsedDataColInfo tags; // each table
|
||||||
SKVRowBuilder tagsBuilder; // each table
|
SKVRowBuilder tagsBuilder; // each table
|
||||||
SVCreateTbReq createTblReq; // each table
|
SVCreateTbReq createTblReq; // each table
|
||||||
|
|
||||||
SQuery* pQuery;
|
SQuery* pQuery;
|
||||||
} SSmlExecHandle;
|
} SSmlExecHandle;
|
||||||
|
|
||||||
static int32_t smlBoundColumnData(SArray *cols, SParsedDataColInfo* pColList, SSchema* pSchema) {
|
static int32_t smlBoundColumnData(SArray* cols, SParsedDataColInfo* pColList, SSchema* pSchema) {
|
||||||
col_id_t nCols = pColList->numOfCols;
|
col_id_t nCols = pColList->numOfCols;
|
||||||
|
|
||||||
pColList->numOfBound = 0;
|
pColList->numOfBound = 0;
|
||||||
|
@ -1572,8 +1576,8 @@ static int32_t smlBoundColumnData(SArray *cols, SParsedDataColInfo* pColList, SS
|
||||||
bool isOrdered = true;
|
bool isOrdered = true;
|
||||||
col_id_t lastColIdx = -1; // last column found
|
col_id_t lastColIdx = -1; // last column found
|
||||||
for (int i = 0; i < taosArrayGetSize(cols); ++i) {
|
for (int i = 0; i < taosArrayGetSize(cols); ++i) {
|
||||||
SSmlKv *kv = taosArrayGetP(cols, i);
|
SSmlKv* kv = taosArrayGetP(cols, i);
|
||||||
SToken sToken = {.n=kv->keyLen, .z=(char*)kv->key};
|
SToken sToken = {.n = kv->keyLen, .z = (char*)kv->key};
|
||||||
col_id_t t = lastColIdx + 1;
|
col_id_t t = lastColIdx + 1;
|
||||||
col_id_t index = findCol(&sToken, t, nCols, pSchema);
|
col_id_t index = findCol(&sToken, t, nCols, pSchema);
|
||||||
if (index < 0 && t > 0) {
|
if (index < 0 && t > 0) {
|
||||||
|
@ -1622,7 +1626,7 @@ static int32_t smlBoundColumnData(SArray *cols, SParsedDataColInfo* pColList, SS
|
||||||
qsort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), boundIdxCompar);
|
qsort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), boundIdxCompar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pColList->numOfCols > pColList->numOfBound){
|
if (pColList->numOfCols > pColList->numOfBound) {
|
||||||
memset(&pColList->boundColumns[pColList->numOfBound], 0,
|
memset(&pColList->boundColumns[pColList->numOfBound], 0,
|
||||||
sizeof(col_id_t) * (pColList->numOfCols - pColList->numOfBound));
|
sizeof(col_id_t) * (pColList->numOfCols - pColList->numOfBound));
|
||||||
}
|
}
|
||||||
|
@ -1630,50 +1634,50 @@ static int32_t smlBoundColumnData(SArray *cols, SParsedDataColInfo* pColList, SS
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlBuildTagRow(SArray *cols, SKVRowBuilder *tagsBuilder, SParsedDataColInfo* tags, SSchema* pSchema, SKVRow *row, SMsgBuf *msg) {
|
static int32_t smlBuildTagRow(SArray* cols, SKVRowBuilder* tagsBuilder, SParsedDataColInfo* tags, SSchema* pSchema,
|
||||||
|
SKVRow* row, SMsgBuf* msg) {
|
||||||
if (tdInitKVRowBuilder(tagsBuilder) < 0) {
|
if (tdInitKVRowBuilder(tagsBuilder) < 0) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
SKvParam param = {.builder = tagsBuilder};
|
SKvParam param = {.builder = tagsBuilder};
|
||||||
for (int i = 0; i < tags->numOfBound; ++i) {
|
for (int i = 0; i < tags->numOfBound; ++i) {
|
||||||
SSchema* pTagSchema = &pSchema[tags->boundColumns[i] - 1]; // colId starts with 1
|
SSchema* pTagSchema = &pSchema[tags->boundColumns[i] - 1]; // colId starts with 1
|
||||||
param.schema = pTagSchema;
|
param.schema = pTagSchema;
|
||||||
SSmlKv *kv = taosArrayGetP(cols, i);
|
SSmlKv* kv = taosArrayGetP(cols, i);
|
||||||
KvRowAppend(msg, kv->value, kv->valueLen, ¶m) ;
|
KvRowAppend(msg, kv->value, kv->valueLen, ¶m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
*row = tdGetKVRowFromBuilder(tagsBuilder);
|
*row = tdGetKVRowFromBuilder(tagsBuilder);
|
||||||
if(*row == NULL){
|
if (*row == NULL) {
|
||||||
return TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
}
|
}
|
||||||
tdSortKVRowByColIdx(*row);
|
tdSortKVRowByColIdx(*row);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *colsSchema, SArray *cols, bool format,
|
int32_t smlBindData(void* handle, SArray* tags, SArray* colsFormat, SArray* colsSchema, SArray* cols, bool format,
|
||||||
STableMeta *pTableMeta, char *tableName, char *msgBuf, int16_t msgBufLen) {
|
STableMeta* pTableMeta, char* tableName, char* msgBuf, int16_t msgBufLen) {
|
||||||
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
|
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
|
||||||
|
|
||||||
SSmlExecHandle *smlHandle = (SSmlExecHandle *)handle;
|
SSmlExecHandle* smlHandle = (SSmlExecHandle*)handle;
|
||||||
SSchema* pTagsSchema = getTableTagSchema(pTableMeta);
|
SSchema* pTagsSchema = getTableTagSchema(pTableMeta);
|
||||||
setBoundColumnInfo(&smlHandle->tags, pTagsSchema, getNumOfTags(pTableMeta));
|
setBoundColumnInfo(&smlHandle->tags, pTagsSchema, getNumOfTags(pTableMeta));
|
||||||
int ret = smlBoundColumnData(tags, &smlHandle->tags, pTagsSchema);
|
int ret = smlBoundColumnData(tags, &smlHandle->tags, pTagsSchema);
|
||||||
if(ret != TSDB_CODE_SUCCESS){
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SKVRow row = NULL;
|
SKVRow row = NULL;
|
||||||
ret = smlBuildTagRow(tags, &smlHandle->tagsBuilder, &smlHandle->tags, pTagsSchema, &row, &pBuf);
|
ret = smlBuildTagRow(tags, &smlHandle->tagsBuilder, &smlHandle->tags, pTagsSchema, &row, &pBuf);
|
||||||
if(ret != TSDB_CODE_SUCCESS){
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildCreateTbReq(&smlHandle->createTblReq, tableName, row, pTableMeta->suid);
|
buildCreateTbReq(&smlHandle->createTblReq, tableName, row, pTableMeta->suid);
|
||||||
|
|
||||||
STableDataBlocks* pDataBlock = NULL;
|
STableDataBlocks* pDataBlock = NULL;
|
||||||
ret = getDataBlockFromList(smlHandle->pBlockHash, pTableMeta->uid, TSDB_DEFAULT_PAYLOAD_SIZE,
|
ret = getDataBlockFromList(smlHandle->pBlockHash, &pTableMeta->uid, sizeof(pTableMeta->uid), TSDB_DEFAULT_PAYLOAD_SIZE,
|
||||||
sizeof(SSubmitBlk), getTableInfo(pTableMeta).rowSize, pTableMeta,
|
sizeof(SSubmitBlk), getTableInfo(pTableMeta).rowSize, pTableMeta,
|
||||||
&pDataBlock, NULL, &smlHandle->createTblReq);
|
&pDataBlock, NULL, &smlHandle->createTblReq);
|
||||||
if(ret != TSDB_CODE_SUCCESS){
|
if(ret != TSDB_CODE_SUCCESS){
|
||||||
|
@ -1684,35 +1688,35 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
SSchema* pSchema = getTableColumnSchema(pTableMeta);
|
SSchema* pSchema = getTableColumnSchema(pTableMeta);
|
||||||
|
|
||||||
ret = smlBoundColumnData(colsSchema, &pDataBlock->boundColumnInfo, pSchema);
|
ret = smlBoundColumnData(colsSchema, &pDataBlock->boundColumnInfo, pSchema);
|
||||||
if(ret != TSDB_CODE_SUCCESS){
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
buildInvalidOperationMsg(&pBuf, "bound cols error");
|
buildInvalidOperationMsg(&pBuf, "bound cols error");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
int32_t extendedRowSize = getExtendedRowSize(pDataBlock);
|
int32_t extendedRowSize = getExtendedRowSize(pDataBlock);
|
||||||
SParsedDataColInfo* spd = &pDataBlock->boundColumnInfo;
|
SParsedDataColInfo* spd = &pDataBlock->boundColumnInfo;
|
||||||
SRowBuilder* pBuilder = &pDataBlock->rowBuilder;
|
SRowBuilder* pBuilder = &pDataBlock->rowBuilder;
|
||||||
SMemParam param = {.rb = pBuilder};
|
SMemParam param = {.rb = pBuilder};
|
||||||
|
|
||||||
initRowBuilder(&pDataBlock->rowBuilder, pDataBlock->pTableMeta->sversion, &pDataBlock->boundColumnInfo);
|
initRowBuilder(&pDataBlock->rowBuilder, pDataBlock->pTableMeta->sversion, &pDataBlock->boundColumnInfo);
|
||||||
|
|
||||||
int32_t rowNum = format ? taosArrayGetSize(colsFormat) : taosArrayGetSize(cols);
|
int32_t rowNum = format ? taosArrayGetSize(colsFormat) : taosArrayGetSize(cols);
|
||||||
if(rowNum <= 0) {
|
if (rowNum <= 0) {
|
||||||
return buildInvalidOperationMsg(&pBuf, "cols size <= 0");
|
return buildInvalidOperationMsg(&pBuf, "cols size <= 0");
|
||||||
}
|
}
|
||||||
ret = allocateMemForSize(pDataBlock, extendedRowSize * rowNum);
|
ret = allocateMemForSize(pDataBlock, extendedRowSize * rowNum);
|
||||||
if(ret != TSDB_CODE_SUCCESS){
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
buildInvalidOperationMsg(&pBuf, "allocate memory error");
|
buildInvalidOperationMsg(&pBuf, "allocate memory error");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
for (int32_t r = 0; r < rowNum; ++r) {
|
for (int32_t r = 0; r < rowNum; ++r) {
|
||||||
STSRow* row = (STSRow*)(pDataBlock->pData + pDataBlock->size); // skip the SSubmitBlk header
|
STSRow* row = (STSRow*)(pDataBlock->pData + pDataBlock->size); // skip the SSubmitBlk header
|
||||||
tdSRowResetBuf(pBuilder, row);
|
tdSRowResetBuf(pBuilder, row);
|
||||||
void *rowData = NULL;
|
void* rowData = NULL;
|
||||||
size_t rowDataSize = 0;
|
size_t rowDataSize = 0;
|
||||||
if(format){
|
if (format) {
|
||||||
rowData = taosArrayGetP(colsFormat, r);
|
rowData = taosArrayGetP(colsFormat, r);
|
||||||
rowDataSize = taosArrayGetSize(rowData);
|
rowDataSize = taosArrayGetSize(rowData);
|
||||||
}else{
|
} else {
|
||||||
rowData = taosArrayGetP(cols, r);
|
rowData = taosArrayGetP(cols, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1723,19 +1727,20 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
param.schema = pColSchema;
|
param.schema = pColSchema;
|
||||||
getSTSRowAppendInfo(pBuilder->rowType, spd, c, ¶m.toffset, ¶m.colIdx);
|
getSTSRowAppendInfo(pBuilder->rowType, spd, c, ¶m.toffset, ¶m.colIdx);
|
||||||
|
|
||||||
SSmlKv *kv = NULL;
|
SSmlKv* kv = NULL;
|
||||||
if(format){
|
if (format) {
|
||||||
if(j < rowDataSize){
|
if (j < rowDataSize) {
|
||||||
kv = taosArrayGetP(rowData, j);
|
kv = taosArrayGetP(rowData, j);
|
||||||
if (rowDataSize != spd->numOfBound && (kv->keyLen != strlen(pColSchema->name) || strncmp(kv->key, pColSchema->name, kv->keyLen) != 0)){
|
if (rowDataSize != spd->numOfBound &&
|
||||||
|
(kv->keyLen != strlen(pColSchema->name) || strncmp(kv->key, pColSchema->name, kv->keyLen) != 0)) {
|
||||||
kv = NULL;
|
kv = NULL;
|
||||||
}else{
|
} else {
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
void **p =taosHashGet(rowData, pColSchema->name, strlen(pColSchema->name));
|
void** p = taosHashGet(rowData, pColSchema->name, strlen(pColSchema->name));
|
||||||
if(p) kv = *p;
|
if (p) kv = *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kv || kv->length == 0) {
|
if (!kv || kv->length == 0) {
|
||||||
|
@ -1744,7 +1749,7 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
int32_t colLen = pColSchema->bytes;
|
int32_t colLen = pColSchema->bytes;
|
||||||
if (IS_VAR_DATA_TYPE(pColSchema->type)) {
|
if (IS_VAR_DATA_TYPE(pColSchema->type)) {
|
||||||
colLen = kv->length;
|
colLen = kv->length;
|
||||||
} else if(pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP){
|
} else if (pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
kv->i = convertTimePrecision(kv->i, TSDB_TIME_PRECISION_NANO, pTableMeta->tableInfo.precision);
|
kv->i = convertTimePrecision(kv->i, TSDB_TIME_PRECISION_NANO, pTableMeta->tableInfo.precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1753,7 +1758,7 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
|
|
||||||
if (PRIMARYKEY_TIMESTAMP_COL_ID == pColSchema->colId) {
|
if (PRIMARYKEY_TIMESTAMP_COL_ID == pColSchema->colId) {
|
||||||
TSKEY tsKey = TD_ROW_KEY(row);
|
TSKEY tsKey = TD_ROW_KEY(row);
|
||||||
checkTimestamp(pDataBlock, (const char *)&tsKey);
|
checkTimestamp(pDataBlock, (const char*)&tsKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1770,7 +1775,7 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
pDataBlock->size += extendedRowSize;
|
pDataBlock->size += extendedRowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitBlk *pBlocks = (SSubmitBlk *)(pDataBlock->pData);
|
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
||||||
if (TSDB_CODE_SUCCESS != setBlockInfo(pBlocks, pDataBlock, rowNum)) {
|
if (TSDB_CODE_SUCCESS != setBlockInfo(pBlocks, pDataBlock, rowNum)) {
|
||||||
return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than 32767");
|
return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than 32767");
|
||||||
}
|
}
|
||||||
|
@ -1778,25 +1783,24 @@ int32_t smlBindData(void *handle, SArray *tags, SArray *colsFormat, SArray *cols
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* smlInitHandle(SQuery *pQuery){
|
void* smlInitHandle(SQuery* pQuery) {
|
||||||
SSmlExecHandle *handle = taosMemoryCalloc(1, sizeof(SSmlExecHandle));
|
SSmlExecHandle* handle = taosMemoryCalloc(1, sizeof(SSmlExecHandle));
|
||||||
if(!handle) return NULL;
|
if (!handle) return NULL;
|
||||||
handle->pBlockHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
handle->pBlockHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
||||||
handle->pQuery = pQuery;
|
handle->pQuery = pQuery;
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smlDestroyHandle(void *pHandle){
|
void smlDestroyHandle(void* pHandle) {
|
||||||
if(!pHandle) return;
|
if (!pHandle) return;
|
||||||
SSmlExecHandle *handle = (SSmlExecHandle *)pHandle;
|
SSmlExecHandle* handle = (SSmlExecHandle*)pHandle;
|
||||||
destroyBlockHashmap(handle->pBlockHash);
|
destroyBlockHashmap(handle->pBlockHash);
|
||||||
taosMemoryFree(handle);
|
taosMemoryFree(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smlBuildOutput(void* handle, SHashObj* pVgHash) {
|
int32_t smlBuildOutput(void* handle, SHashObj* pVgHash) {
|
||||||
SSmlExecHandle *smlHandle = (SSmlExecHandle *)handle;
|
SSmlExecHandle* smlHandle = (SSmlExecHandle*)handle;
|
||||||
return qBuildStmtOutput(smlHandle->pQuery, pVgHash, smlHandle->pBlockHash);
|
return qBuildStmtOutput(smlHandle->pQuery, pVgHash, smlHandle->pBlockHash);
|
||||||
}
|
}
|
||||||
// schemaless logic end
|
// schemaless logic end
|
||||||
|
|
||||||
|
|
|
@ -185,11 +185,11 @@ int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq)
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, int32_t startOffset, int32_t rowSize,
|
int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32_t size, int32_t startOffset, int32_t rowSize,
|
||||||
STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList,
|
STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList,
|
||||||
SVCreateTbReq* pCreateTbReq) {
|
SVCreateTbReq* pCreateTbReq) {
|
||||||
*dataBlocks = NULL;
|
*dataBlocks = NULL;
|
||||||
STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pHashList, (const char*)&id, sizeof(id));
|
STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pHashList, (const char*)id, idLen);
|
||||||
if (t1 != NULL) {
|
if (t1 != NULL) {
|
||||||
*dataBlocks = *t1;
|
*dataBlocks = *t1;
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ int32_t getDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, int3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pHashList, (const char*)&id, sizeof(int64_t), (char*)dataBlocks, POINTER_BYTES);
|
taosHashPut(pHashList, (const char*)id, idLen, (char*)dataBlocks, POINTER_BYTES);
|
||||||
if (pBlockList) {
|
if (pBlockList) {
|
||||||
taosArrayPush(pBlockList, dataBlocks);
|
taosArrayPush(pBlockList, dataBlocks);
|
||||||
}
|
}
|
||||||
|
@ -445,7 +445,7 @@ int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** p
|
||||||
const int INSERT_HEAD_SIZE = sizeof(SSubmitReq);
|
const int INSERT_HEAD_SIZE = sizeof(SSubmitReq);
|
||||||
int code = 0;
|
int code = 0;
|
||||||
bool isRawPayload = IS_RAW_PAYLOAD(payloadType);
|
bool isRawPayload = IS_RAW_PAYLOAD(payloadType);
|
||||||
SHashObj* pVnodeDataBlockHashList = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
SHashObj* pVnodeDataBlockHashList = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, false);
|
||||||
SArray* pVnodeDataBlockList = taosArrayInit(8, POINTER_BYTES);
|
SArray* pVnodeDataBlockList = taosArrayInit(8, POINTER_BYTES);
|
||||||
|
|
||||||
STableDataBlocks** p = taosHashIterate(pHashObj, NULL);
|
STableDataBlocks** p = taosHashIterate(pHashObj, NULL);
|
||||||
|
@ -457,7 +457,7 @@ int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** p
|
||||||
STableDataBlocks* dataBuf = NULL;
|
STableDataBlocks* dataBuf = NULL;
|
||||||
pOneTableBlock->pTableMeta->vgId = pOneTableBlock->vgId; // for schemaless, restore origin vgId
|
pOneTableBlock->pTableMeta->vgId = pOneTableBlock->vgId; // for schemaless, restore origin vgId
|
||||||
int32_t ret =
|
int32_t ret =
|
||||||
getDataBlockFromList(pVnodeDataBlockHashList, pOneTableBlock->vgId, TSDB_PAYLOAD_SIZE, INSERT_HEAD_SIZE, 0,
|
getDataBlockFromList(pVnodeDataBlockHashList, &pOneTableBlock->vgId, sizeof(pOneTableBlock->vgId), TSDB_PAYLOAD_SIZE, INSERT_HEAD_SIZE, 0,
|
||||||
pOneTableBlock->pTableMeta, &dataBuf, pVnodeDataBlockList, NULL);
|
pOneTableBlock->pTableMeta, &dataBuf, pVnodeDataBlockList, NULL);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
taosHashCleanup(pVnodeDataBlockHashList);
|
taosHashCleanup(pVnodeDataBlockHashList);
|
||||||
|
@ -620,7 +620,7 @@ int32_t qCloneStmtDataBlock(void** pDst, void* pSrc) {
|
||||||
return qResetStmtDataBlock(*pDst, false);
|
return qResetStmtDataBlock(*pDst, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc) {
|
int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc, uint64_t uid, int32_t vgId) {
|
||||||
int32_t code = qCloneStmtDataBlock(pDst, pSrc);
|
int32_t code = qCloneStmtDataBlock(pDst, pSrc);
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -633,11 +633,22 @@ int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pBlock->vgId = vgId;
|
||||||
|
|
||||||
|
if (pBlock->pTableMeta) {
|
||||||
|
pBlock->pTableMeta->uid = uid;
|
||||||
|
pBlock->pTableMeta->vgId = vgId;
|
||||||
|
}
|
||||||
|
|
||||||
memset(pBlock->pData, 0, sizeof(SSubmitBlk));
|
memset(pBlock->pData, 0, sizeof(SSubmitBlk));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STableMeta *qGetTableMetaInDataBlock(void* pDataBlock) {
|
||||||
|
return ((STableDataBlocks*)pDataBlock)->pTableMeta;
|
||||||
|
}
|
||||||
|
|
||||||
void qFreeStmtDataBlock(void* pDataBlock) {
|
void qFreeStmtDataBlock(void* pDataBlock) {
|
||||||
if (pDataBlock == NULL) {
|
if (pDataBlock == NULL) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1886,6 +1886,9 @@ static int32_t checkDbKeepOption(STranslateContext* pCxt, SDatabaseOptions* pOpt
|
||||||
TIME_UNIT_DAY != pVal->unit) {
|
TIME_UNIT_DAY != pVal->unit) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_KEEP_UNIT, pVal->unit);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_KEEP_UNIT, pVal->unit);
|
||||||
}
|
}
|
||||||
|
if (!pVal->isDuration) {
|
||||||
|
pVal->datum.i = pVal->datum.i * 1440;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pOptions->keep[0] = getBigintFromValueNode((SValueNode*)nodesListGetNode(pOptions->pKeep, 0));
|
pOptions->keep[0] = getBigintFromValueNode((SValueNode*)nodesListGetNode(pOptions->pKeep, 0));
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
* 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
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
* or later ("AGPL"), AS published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "parTestUtil.h"
|
#include "parTestUtil.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -26,72 +27,226 @@ class ParserInitialCTest : public ParserDdlTest {};
|
||||||
TEST_F(ParserInitialCTest, createAccount) {
|
TEST_F(ParserInitialCTest, createAccount) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create account ac_wxy pass '123456'", TSDB_CODE_PAR_EXPRIE_STATEMENT);
|
run("CREATE ACCOUNT ac_wxy PASS '123456'", TSDB_CODE_PAR_EXPRIE_STATEMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createBnode) {
|
TEST_F(ParserInitialCTest, createBnode) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create bnode on dnode 1");
|
run("CREATE BNODE ON DNODE 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
|
||||||
|
*
|
||||||
|
* database_options:
|
||||||
|
* database_option ...
|
||||||
|
*
|
||||||
|
* database_option: {
|
||||||
|
* BUFFER value
|
||||||
|
* | CACHELAST value
|
||||||
|
* | COMP {0 | 1 | 2}
|
||||||
|
* | DAYS value
|
||||||
|
* | FSYNC value
|
||||||
|
* | MAXROWS value
|
||||||
|
* | MINROWS value
|
||||||
|
* | KEEP value
|
||||||
|
* | PAGES value
|
||||||
|
* | PAGESIZE value
|
||||||
|
* | PRECISION {'ms' | 'us' | 'ns'}
|
||||||
|
* | REPLICA value
|
||||||
|
* | RETENTIONS ingestion_duration:keep_duration ...
|
||||||
|
* | STRICT value
|
||||||
|
* | WAL value
|
||||||
|
* | VGROUPS value
|
||||||
|
* | SINGLE_STABLE {0 | 1}
|
||||||
|
* }
|
||||||
|
*/
|
||||||
TEST_F(ParserInitialCTest, createDatabase) {
|
TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create database wxy_db");
|
SCreateDbReq expect = {0};
|
||||||
|
|
||||||
run("create database if not exists wxy_db "
|
auto setCreateDbReqFunc = [&](const char* pDbname, int8_t igExists = 0) {
|
||||||
"cachelast 2 "
|
memset(&expect, 0, sizeof(SCreateDbReq));
|
||||||
"comp 1 "
|
int32_t len = snprintf(expect.db, sizeof(expect.db), "0.%s", pDbname);
|
||||||
"days 100 "
|
expect.db[len] = '\0';
|
||||||
"fsync 100 "
|
expect.ignoreExist = igExists;
|
||||||
"maxrows 1000 "
|
expect.buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
|
||||||
"minrows 100 "
|
expect.cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW;
|
||||||
"keep 1440 "
|
expect.compression = TSDB_DEFAULT_COMP_LEVEL;
|
||||||
"precision 'ms' "
|
expect.daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE;
|
||||||
"replica 3 "
|
expect.fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
||||||
"wal 2 "
|
expect.maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
|
||||||
"vgroups 100 "
|
expect.minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
|
||||||
"single_stable 0 "
|
expect.daysToKeep0 = TSDB_DEFAULT_KEEP;
|
||||||
"retentions 15s:7d,1m:21d,15m:5y");
|
expect.daysToKeep1 = TSDB_DEFAULT_KEEP;
|
||||||
|
expect.daysToKeep2 = TSDB_DEFAULT_KEEP;
|
||||||
|
expect.pages = TSDB_DEFAULT_PAGES_PER_VNODE;
|
||||||
|
expect.pageSize = TSDB_DEFAULT_PAGESIZE_PER_VNODE;
|
||||||
|
expect.precision = TSDB_DEFAULT_PRECISION;
|
||||||
|
expect.replications = TSDB_DEFAULT_DB_REPLICA;
|
||||||
|
expect.strict = TSDB_DEFAULT_DB_STRICT;
|
||||||
|
expect.walLevel = TSDB_DEFAULT_WAL_LEVEL;
|
||||||
|
expect.numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
|
||||||
|
expect.numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
|
||||||
|
};
|
||||||
|
|
||||||
run("create database if not exists wxy_db "
|
auto setDbBufferFunc = [&](int32_t buffer) { expect.buffer = buffer; };
|
||||||
"days 100m "
|
auto setDbCachelastFunc = [&](int8_t CACHELAST) { expect.cacheLastRow = CACHELAST; };
|
||||||
"keep 1440m,300h,400d ");
|
auto setDbCompressionFunc = [&](int8_t compressionLevel) { expect.compression = compressionLevel; };
|
||||||
|
auto setDbDaysFunc = [&](int32_t daysPerFile) { expect.daysPerFile = daysPerFile; };
|
||||||
|
auto setDbFsyncFunc = [&](int32_t fsyncPeriod) { expect.fsyncPeriod = fsyncPeriod; };
|
||||||
|
auto setDbMaxRowsFunc = [&](int32_t maxRowsPerBlock) { expect.maxRows = maxRowsPerBlock; };
|
||||||
|
auto setDbMinRowsFunc = [&](int32_t minRowsPerBlock) { expect.minRows = minRowsPerBlock; };
|
||||||
|
auto setDbKeepFunc = [&](int32_t keep0, int32_t keep1 = 0, int32_t keep2 = 0) {
|
||||||
|
expect.daysToKeep0 = keep0;
|
||||||
|
expect.daysToKeep1 = 0 == keep1 ? expect.daysToKeep0 : keep1;
|
||||||
|
expect.daysToKeep2 = 0 == keep2 ? expect.daysToKeep1 : keep2;
|
||||||
|
};
|
||||||
|
auto setDbPagesFunc = [&](int32_t pages) { expect.pages = pages; };
|
||||||
|
auto setDbPageSizeFunc = [&](int32_t pagesize) { expect.pageSize = pagesize; };
|
||||||
|
auto setDbPrecisionFunc = [&](int8_t precision) { expect.precision = precision; };
|
||||||
|
auto setDbReplicaFunc = [&](int8_t replica) { expect.replications = replica; };
|
||||||
|
auto setDbStrictaFunc = [&](int8_t strict) { expect.strict = strict; };
|
||||||
|
auto setDbWalLevelFunc = [&](int8_t walLevel) { expect.walLevel = walLevel; };
|
||||||
|
auto setDbVgroupsFunc = [&](int32_t numOfVgroups) { expect.numOfVgroups = numOfVgroups; };
|
||||||
|
auto setDbSingleStableFunc = [&](int8_t singleStable) { expect.numOfStables = singleStable; };
|
||||||
|
auto addDbRetentionFunc = [&](int64_t freq, int64_t keep, int8_t freqUnit, int8_t keepUnit) {
|
||||||
|
SRetention retention = {0};
|
||||||
|
retention.freq = freq;
|
||||||
|
retention.keep = keep;
|
||||||
|
retention.freqUnit = freqUnit;
|
||||||
|
retention.keepUnit = keepUnit;
|
||||||
|
if (NULL == expect.pRetensions) {
|
||||||
|
expect.pRetensions = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SRetention));
|
||||||
|
}
|
||||||
|
taosArrayPush(expect.pRetensions, &retention);
|
||||||
|
++expect.numOfRetensions;
|
||||||
|
};
|
||||||
|
|
||||||
|
setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
|
||||||
|
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_DATABASE_STMT);
|
||||||
|
SCreateDbReq req = {0};
|
||||||
|
ASSERT_TRUE(TSDB_CODE_SUCCESS == tDeserializeSCreateDbReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req));
|
||||||
|
|
||||||
|
ASSERT_EQ(std::string(req.db), std::string(expect.db));
|
||||||
|
ASSERT_EQ(req.numOfVgroups, expect.numOfVgroups);
|
||||||
|
ASSERT_EQ(req.numOfStables, expect.numOfStables);
|
||||||
|
ASSERT_EQ(req.buffer, expect.buffer);
|
||||||
|
ASSERT_EQ(req.pageSize, expect.pageSize);
|
||||||
|
ASSERT_EQ(req.pages, expect.pages);
|
||||||
|
ASSERT_EQ(req.daysPerFile, expect.daysPerFile);
|
||||||
|
ASSERT_EQ(req.daysToKeep0, expect.daysToKeep0);
|
||||||
|
ASSERT_EQ(req.daysToKeep1, expect.daysToKeep1);
|
||||||
|
ASSERT_EQ(req.daysToKeep2, expect.daysToKeep2);
|
||||||
|
ASSERT_EQ(req.minRows, expect.minRows);
|
||||||
|
ASSERT_EQ(req.maxRows, expect.maxRows);
|
||||||
|
ASSERT_EQ(req.fsyncPeriod, expect.fsyncPeriod);
|
||||||
|
ASSERT_EQ(req.walLevel, expect.walLevel);
|
||||||
|
ASSERT_EQ(req.precision, expect.precision);
|
||||||
|
ASSERT_EQ(req.compression, expect.compression);
|
||||||
|
ASSERT_EQ(req.replications, expect.replications);
|
||||||
|
ASSERT_EQ(req.strict, expect.strict);
|
||||||
|
ASSERT_EQ(req.cacheLastRow, expect.cacheLastRow);
|
||||||
|
ASSERT_EQ(req.ignoreExist, expect.ignoreExist);
|
||||||
|
ASSERT_EQ(req.numOfRetensions, expect.numOfRetensions);
|
||||||
|
if (expect.numOfRetensions > 0) {
|
||||||
|
ASSERT_EQ(taosArrayGetSize(req.pRetensions), expect.numOfRetensions);
|
||||||
|
ASSERT_EQ(taosArrayGetSize(req.pRetensions), taosArrayGetSize(expect.pRetensions));
|
||||||
|
for (int32_t i = 0; i < expect.numOfRetensions; ++i) {
|
||||||
|
SRetention* pReten = (SRetention*)taosArrayGet(req.pRetensions, i);
|
||||||
|
SRetention* pExpectReten = (SRetention*)taosArrayGet(expect.pRetensions, i);
|
||||||
|
ASSERT_EQ(pReten->freq, pExpectReten->freq);
|
||||||
|
ASSERT_EQ(pReten->keep, pExpectReten->keep);
|
||||||
|
ASSERT_EQ(pReten->freqUnit, pExpectReten->freqUnit);
|
||||||
|
ASSERT_EQ(pReten->keepUnit, pExpectReten->keepUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setCreateDbReqFunc("wxy_db");
|
||||||
|
run("CREATE DATABASE wxy_db");
|
||||||
|
|
||||||
|
setCreateDbReqFunc("wxy_db", 1);
|
||||||
|
setDbBufferFunc(64);
|
||||||
|
setDbCachelastFunc(2);
|
||||||
|
setDbCompressionFunc(1);
|
||||||
|
setDbDaysFunc(100 * 1440);
|
||||||
|
setDbFsyncFunc(100);
|
||||||
|
setDbMaxRowsFunc(1000);
|
||||||
|
setDbMinRowsFunc(100);
|
||||||
|
setDbKeepFunc(1440 * 1440);
|
||||||
|
setDbPagesFunc(96);
|
||||||
|
setDbPageSizeFunc(8);
|
||||||
|
setDbPrecisionFunc(TSDB_TIME_PRECISION_NANO);
|
||||||
|
setDbReplicaFunc(3);
|
||||||
|
addDbRetentionFunc(15 * MILLISECOND_PER_SECOND, 7 * MILLISECOND_PER_DAY, TIME_UNIT_SECOND, TIME_UNIT_DAY);
|
||||||
|
addDbRetentionFunc(1 * MILLISECOND_PER_MINUTE, 21 * MILLISECOND_PER_DAY, TIME_UNIT_MINUTE, TIME_UNIT_DAY);
|
||||||
|
addDbRetentionFunc(15 * MILLISECOND_PER_MINUTE, 5, TIME_UNIT_MINUTE, TIME_UNIT_YEAR);
|
||||||
|
setDbStrictaFunc(1);
|
||||||
|
setDbWalLevelFunc(2);
|
||||||
|
setDbVgroupsFunc(100);
|
||||||
|
setDbSingleStableFunc(1);
|
||||||
|
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
||||||
|
"BUFFER 64 "
|
||||||
|
"CACHELAST 2 "
|
||||||
|
"COMP 1 "
|
||||||
|
"DAYS 100 "
|
||||||
|
"FSYNC 100 "
|
||||||
|
"MAXROWS 1000 "
|
||||||
|
"MINROWS 100 "
|
||||||
|
"KEEP 1440 "
|
||||||
|
"PAGES 96 "
|
||||||
|
"PAGESIZE 8 "
|
||||||
|
"PRECISION 'ns' "
|
||||||
|
"REPLICA 3 "
|
||||||
|
"RETENTIONS 15s:7d,1m:21d,15m:5y "
|
||||||
|
"STRICT 1 "
|
||||||
|
"WAL 2 "
|
||||||
|
"VGROUPS 100 "
|
||||||
|
"SINGLE_STABLE 1 ");
|
||||||
|
|
||||||
|
setCreateDbReqFunc("wxy_db", 1);
|
||||||
|
setDbDaysFunc(100);
|
||||||
|
setDbKeepFunc(1440, 300 * 60, 400 * 1440);
|
||||||
|
run("CREATE DATABASE IF NOT EXISTS wxy_db "
|
||||||
|
"DAYS 100m "
|
||||||
|
"KEEP 1440m,300h,400d ");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createDnode) {
|
TEST_F(ParserInitialCTest, createDnode) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create dnode abc1 port 7000");
|
run("CREATE DNODE abc1 PORT 7000");
|
||||||
|
|
||||||
run("create dnode 1.1.1.1 port 9000");
|
run("CREATE DNODE 1.1.1.1 PORT 9000");
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo create function
|
// todo CREATE FUNCTION
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createIndexSma) {
|
TEST_F(ParserInitialCTest, createIndexSma) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create sma index index1 on t1 function(max(c1), min(c3 + 10), sum(c4)) INTERVAL(10s)");
|
run("CREATE SMA INDEX index1 ON t1 FUNCTION(MAX(c1), MIN(c3 + 10), SUM(c4)) INTERVAL(10s)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createMnode) {
|
TEST_F(ParserInitialCTest, createMnode) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create mnode on dnode 1");
|
run("CREATE MNODE ON DNODE 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createQnode) {
|
TEST_F(ParserInitialCTest, createQnode) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create qnode on dnode 1");
|
run("CREATE QNODE ON DNODE 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createSnode) {
|
TEST_F(ParserInitialCTest, createSnode) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create snode on dnode 1");
|
run("CREATE SNODE ON DNODE 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createStable) {
|
TEST_F(ParserInitialCTest, createStable) {
|
||||||
|
@ -194,7 +349,7 @@ TEST_F(ParserInitialCTest, createStable) {
|
||||||
addFieldToCreateStbReqFunc(true, "ts", TSDB_DATA_TYPE_TIMESTAMP);
|
addFieldToCreateStbReqFunc(true, "ts", TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
addFieldToCreateStbReqFunc(true, "c1", TSDB_DATA_TYPE_INT);
|
addFieldToCreateStbReqFunc(true, "c1", TSDB_DATA_TYPE_INT);
|
||||||
addFieldToCreateStbReqFunc(false, "id", TSDB_DATA_TYPE_INT);
|
addFieldToCreateStbReqFunc(false, "id", TSDB_DATA_TYPE_INT);
|
||||||
run("create stable t1(ts timestamp, c1 int) TAGS(id int)");
|
run("CREATE STABLE t1(ts TIMESTAMP, c1 INT) TAGS(id INT)");
|
||||||
|
|
||||||
setCreateStbReqFunc("t1", 1, 0.1, 2, 100, "test create table");
|
setCreateStbReqFunc("t1", 1, 0.1, 2, 100, "test create table");
|
||||||
addFieldToCreateStbReqFunc(true, "ts", TSDB_DATA_TYPE_TIMESTAMP, 0, 0);
|
addFieldToCreateStbReqFunc(true, "ts", TSDB_DATA_TYPE_TIMESTAMP, 0, 0);
|
||||||
|
@ -227,80 +382,72 @@ TEST_F(ParserInitialCTest, createStable) {
|
||||||
addFieldToCreateStbReqFunc(false, "a13", TSDB_DATA_TYPE_BOOL);
|
addFieldToCreateStbReqFunc(false, "a13", TSDB_DATA_TYPE_BOOL);
|
||||||
addFieldToCreateStbReqFunc(false, "a14", TSDB_DATA_TYPE_NCHAR, 30 * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE);
|
addFieldToCreateStbReqFunc(false, "a14", TSDB_DATA_TYPE_NCHAR, 30 * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE);
|
||||||
addFieldToCreateStbReqFunc(false, "a15", TSDB_DATA_TYPE_VARCHAR, 50 + VARSTR_HEADER_SIZE);
|
addFieldToCreateStbReqFunc(false, "a15", TSDB_DATA_TYPE_VARCHAR, 50 + VARSTR_HEADER_SIZE);
|
||||||
run("create stable if not exists test.t1("
|
run("CREATE STABLE IF NOT EXISTS test.t1("
|
||||||
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), "
|
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), "
|
||||||
"c8 SMALLINT, c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, "
|
"c8 SMALLINT, c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, "
|
||||||
"c13 NCHAR(30), c14 VARCHAR(50)) "
|
"c13 NCHAR(30), c14 VARCHAR(50)) "
|
||||||
"TAGS (a1 TIMESTAMP, a2 INT, a3 INT UNSIGNED, a4 BIGINT, a5 BIGINT UNSIGNED, a6 FLOAT, a7 DOUBLE, "
|
"TAGS (a1 TIMESTAMP, a2 INT, a3 INT UNSIGNED, a4 BIGINT, a5 BIGINT UNSIGNED, a6 FLOAT, a7 DOUBLE, "
|
||||||
"a8 BINARY(20), a9 SMALLINT, a10 SMALLINT UNSIGNED COMMENT 'test column comment', a11 TINYINT, "
|
"a8 BINARY(20), a9 SMALLINT, a10 SMALLINT UNSIGNED COMMENT 'test column comment', a11 TINYINT, "
|
||||||
"a12 TINYINT UNSIGNED, a13 BOOL, a14 NCHAR(30), a15 VARCHAR(50)) "
|
"a12 TINYINT UNSIGNED, a13 BOOL, a14 NCHAR(30), a15 VARCHAR(50)) "
|
||||||
"TTL 100 COMMENT 'test create table' SMA(c1, c2, c3) ROLLUP (min) FILE_FACTOR 0.1 DELAY 2");
|
"TTL 100 COMMENT 'test create table' SMA(c1, c2, c3) ROLLUP (MIN) FILE_FACTOR 0.1 DELAY 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createStream) {
|
TEST_F(ParserInitialCTest, createStream) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create stream s1 as select * from t1");
|
run("CREATE STREAM s1 AS SELECT * FROM t1");
|
||||||
|
|
||||||
run("create stream if not exists s1 as select * from t1");
|
run("CREATE STREAM IF NOT EXISTS s1 AS SELECT * FROM t1");
|
||||||
|
|
||||||
run("create stream s1 into st1 as select * from t1");
|
run("CREATE STREAM s1 INTO st1 AS SELECT * FROM t1");
|
||||||
|
|
||||||
run("create stream if not exists s1 trigger window_close watermark 10s into st1 as select * from t1");
|
run("CREATE STREAM IF NOT EXISTS s1 TRIGGER WINDOW_CLOSE WATERMARK 10s INTO st1 AS SELECT * FROM t1");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createTable) {
|
TEST_F(ParserInitialCTest, createTable) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create table t1(ts timestamp, c1 int)");
|
run("CREATE TABLE t1(ts TIMESTAMP, c1 INT)");
|
||||||
|
|
||||||
run("create table if not exists test.t1("
|
run("CREATE TABLE IF NOT EXISTS test.t1("
|
||||||
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), c8 "
|
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), "
|
||||||
"SMALLINT, "
|
"c8 SMALLINT, c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, "
|
||||||
"c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, c13 "
|
"c13 NCHAR(30), c15 VARCHAR(50)) "
|
||||||
"NCHAR(30), "
|
|
||||||
"c15 VARCHAR(50)) "
|
|
||||||
"TTL 100 COMMENT 'test create table' SMA(c1, c2, c3)");
|
"TTL 100 COMMENT 'test create table' SMA(c1, c2, c3)");
|
||||||
|
|
||||||
run("create table if not exists test.t1("
|
run("CREATE TABLE IF NOT EXISTS test.t1("
|
||||||
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), c8 "
|
"ts TIMESTAMP, c1 INT, c2 INT UNSIGNED, c3 BIGINT, c4 BIGINT UNSIGNED, c5 FLOAT, c6 DOUBLE, c7 BINARY(20), "
|
||||||
"SMALLINT, "
|
"c8 SMALLINT, c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, "
|
||||||
"c9 SMALLINT UNSIGNED COMMENT 'test column comment', c10 TINYINT, c11 TINYINT UNSIGNED, c12 BOOL, c13 "
|
"c13 NCHAR(30), c14 VARCHAR(50)) "
|
||||||
"NCHAR(30), "
|
"TAGS (a1 TIMESTAMP, a2 INT, a3 INT UNSIGNED, a4 BIGINT, a5 BIGINT UNSIGNED, a6 FLOAT, a7 DOUBLE, a8 BINARY(20), "
|
||||||
"c15 VARCHAR(50)) "
|
"a9 SMALLINT, a10 SMALLINT UNSIGNED COMMENT 'test column comment', a11 TINYINT, a12 TINYINT UNSIGNED, a13 BOOL, "
|
||||||
"TAGS (tsa TIMESTAMP, a1 INT, a2 INT UNSIGNED, a3 BIGINT, a4 BIGINT UNSIGNED, "
|
"a14 NCHAR(30), a15 VARCHAR(50)) "
|
||||||
"a5 FLOAT, a6 DOUBLE, a7 "
|
"TTL 100 COMMENT 'test create table' SMA(c1, c2, c3) ROLLUP (MIN) FILE_FACTOR 0.1 DELAY 2");
|
||||||
"BINARY(20), a8 SMALLINT, "
|
|
||||||
"a9 SMALLINT UNSIGNED COMMENT 'test column comment', a10 "
|
|
||||||
"TINYINT, a11 TINYINT UNSIGNED, a12 BOOL, a13 NCHAR(30), "
|
|
||||||
"a15 VARCHAR(50)) "
|
|
||||||
"TTL 100 COMMENT 'test create "
|
|
||||||
"table' SMA(c1, c2, c3) ROLLUP (min) FILE_FACTOR 0.1 DELAY 2");
|
|
||||||
|
|
||||||
run("create table if not exists t1 using st1 tags(1, 'wxy')");
|
run("CREATE TABLE IF NOT EXISTS t1 USING st1 TAGS(1, 'wxy')");
|
||||||
|
|
||||||
run("create table "
|
run("CREATE TABLE "
|
||||||
"if not exists test.t1 using test.st1 (tag1, tag2) tags(1, 'abc') "
|
"IF NOT EXISTS test.t1 USING test.st1 (tag1, tag2) TAGS(1, 'abc') "
|
||||||
"if not exists test.t2 using test.st1 (tag1, tag2) tags(2, 'abc') "
|
"IF NOT EXISTS test.t2 USING test.st1 (tag1, tag2) TAGS(2, 'abc') "
|
||||||
"if not exists test.t3 using test.st1 (tag1, tag2) tags(3, 'abc') ");
|
"IF NOT EXISTS test.t3 USING test.st1 (tag1, tag2) TAGS(3, 'abc') ");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createTopic) {
|
TEST_F(ParserInitialCTest, createTopic) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create topic tp1 as select * from t1");
|
run("CREATE TOPIC tp1 AS SELECT * FROM t1");
|
||||||
|
|
||||||
run("create topic if not exists tp1 as select * from t1");
|
run("CREATE TOPIC IF NOT EXISTS tp1 AS SELECT * FROM t1");
|
||||||
|
|
||||||
run("create topic tp1 as test");
|
run("CREATE TOPIC tp1 AS test");
|
||||||
|
|
||||||
run("create topic if not exists tp1 as test");
|
run("CREATE TOPIC IF NOT EXISTS tp1 AS test");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserInitialCTest, createUser) {
|
TEST_F(ParserInitialCTest, createUser) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create user wxy pass '123456'");
|
run("CREATE USER wxy PASS '123456'");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ParserTest
|
} // namespace ParserTest
|
||||||
|
|
|
@ -16,9 +16,10 @@
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
|
|
||||||
#include "planInt.h"
|
#include "planInt.h"
|
||||||
|
#include "scalar.h"
|
||||||
|
|
||||||
typedef struct SCollectPlaceholderValuesCxt {
|
typedef struct SCollectPlaceholderValuesCxt {
|
||||||
int32_t errCode;
|
int32_t errCode;
|
||||||
SArray* pValues;
|
SArray* pValues;
|
||||||
} SCollectPlaceholderValuesCxt;
|
} SCollectPlaceholderValuesCxt;
|
||||||
|
|
||||||
|
@ -144,9 +145,10 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
if (NULL == pVal->datum.p) {
|
if (NULL == pVal->datum.p) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(pParam->buffer, inputSize, (TdUcs4*)varDataVal(pVal->datum.p), pVal->node.resType.bytes, &output)) {
|
if (!taosMbsToUcs4(pParam->buffer, inputSize, (TdUcs4*)varDataVal(pVal->datum.p), pVal->node.resType.bytes,
|
||||||
|
&output)) {
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
varDataSetLen(pVal->datum.p, output);
|
varDataSetLen(pVal->datum.p, output);
|
||||||
|
@ -181,8 +183,8 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes updatePlanQueryId(SNode* pNode, void* pContext) {
|
static EDealRes updatePlanQueryId(SNode* pNode, void* pContext) {
|
||||||
int64_t queryId = *(uint64_t *)pContext;
|
int64_t queryId = *(uint64_t*)pContext;
|
||||||
|
|
||||||
if (QUERY_NODE_PHYSICAL_PLAN == nodeType(pNode)) {
|
if (QUERY_NODE_PHYSICAL_PLAN == nodeType(pNode)) {
|
||||||
SQueryPlan* planNode = (SQueryPlan*)pNode;
|
SQueryPlan* planNode = (SQueryPlan*)pNode;
|
||||||
planNode->queryId = queryId;
|
planNode->queryId = queryId;
|
||||||
|
@ -194,10 +196,130 @@ static EDealRes updatePlanQueryId(SNode* pNode, void* pContext) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qStmtBindParam(SQueryPlan* pPlan, TAOS_MULTI_BIND* pParams, int32_t colIdx, uint64_t queryId) {
|
static int32_t calcConstNode(SNode** pNode) {
|
||||||
|
if (NULL == *pNode) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* pNew = NULL;
|
||||||
|
int32_t code = scalarCalculateConstants(*pNode, &pNew);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pNode = pNew;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t calcConstList(SNodeList* pList) {
|
||||||
|
SNode* pNode = NULL;
|
||||||
|
FOREACH(pNode, pList) {
|
||||||
|
SNode* pNew = NULL;
|
||||||
|
int32_t code = scalarCalculateConstants(pNode, &pNew);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
REPLACE_NODE(pNew);
|
||||||
|
} else {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isEmptyResultCond(SNode** pCond) {
|
||||||
|
if (QUERY_NODE_VALUE != nodeType(*pCond)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (((SValueNode*)*pCond)->datum.b) {
|
||||||
|
nodesDestroyNode(*pCond);
|
||||||
|
*pCond = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t calcConstSpecificPhysiNode(SPhysiNode* pPhyNode) {
|
||||||
|
switch (nodeType(pPhyNode)) {
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_FILL:
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
|
||||||
|
return calcConstList(((SProjectPhysiNode*)pPhyNode)->pProjections);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_JOIN:
|
||||||
|
return calcConstNode(&(((SJoinPhysiNode*)pPhyNode)->pOnConditions));
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_AGG:
|
||||||
|
return calcConstList(((SAggPhysiNode*)pPhyNode)->pExprs);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SORT:
|
||||||
|
return calcConstList(((SSortPhysiNode*)pPhyNode)->pExprs);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_INTERVAL:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW:
|
||||||
|
return calcConstList(((SWinodwPhysiNode*)pPhyNode)->pExprs);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
|
return calcConstList(((SPartitionPhysiNode*)pPhyNode)->pExprs);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t calcConstSubplan(SPhysiNode* pPhyNode, bool* pEmptyResult) {
|
||||||
|
int32_t code = calcConstNode(&pPhyNode->pConditions);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = calcConstSpecificPhysiNode(pPhyNode);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pEmptyResult = isEmptyResultCond(&pPhyNode->pConditions);
|
||||||
|
if (*pEmptyResult) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pEmptyResult = true;
|
||||||
|
|
||||||
|
bool subEmptyResult = false;
|
||||||
|
SNode* pChild = NULL;
|
||||||
|
FOREACH(pChild, pPhyNode->pChildren) {
|
||||||
|
code = calcConstSubplan((SPhysiNode*)pChild, &subEmptyResult);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
if (!subEmptyResult) {
|
||||||
|
*pEmptyResult = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t calcConstPhysiPlan(SQueryPlan* pPlan, bool* pEmptyResult) {
|
||||||
|
*pEmptyResult = true;
|
||||||
|
|
||||||
|
bool subEmptyResult = false;
|
||||||
|
SNodeListNode* pNode = nodesListGetNode(pPlan->pSubplans, 0);
|
||||||
|
SNode* pSubplan = NULL;
|
||||||
|
FOREACH(pSubplan, pNode->pNodeList) {
|
||||||
|
int32_t code = calcConstSubplan(((SSubplan*)pSubplan)->pNode, pEmptyResult);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
if (!subEmptyResult) {
|
||||||
|
*pEmptyResult = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t qStmtBindParam(SQueryPlan* pPlan, TAOS_MULTI_BIND* pParams, int32_t colIdx, uint64_t queryId,
|
||||||
|
bool* pEmptyResult) {
|
||||||
int32_t size = taosArrayGetSize(pPlan->pPlaceholderValues);
|
int32_t size = taosArrayGetSize(pPlan->pPlaceholderValues);
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (colIdx < 0) {
|
if (colIdx < 0) {
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
code = setValueByBindParam((SValueNode*)taosArrayGetP(pPlan->pPlaceholderValues, i), pParams + i);
|
code = setValueByBindParam((SValueNode*)taosArrayGetP(pPlan->pPlaceholderValues, i), pParams + i);
|
||||||
|
@ -214,9 +336,10 @@ int32_t qStmtBindParam(SQueryPlan* pPlan, TAOS_MULTI_BIND* pParams, int32_t colI
|
||||||
|
|
||||||
if (colIdx < 0 || ((colIdx + 1) == size)) {
|
if (colIdx < 0 || ((colIdx + 1) == size)) {
|
||||||
nodesWalkPhysiPlan((SNode*)pPlan, updatePlanQueryId, &queryId);
|
nodesWalkPhysiPlan((SNode*)pPlan, updatePlanQueryId, &queryId);
|
||||||
|
code = calcConstPhysiPlan(pPlan, pEmptyResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qSubPlanToString(const SSubplan* pSubplan, char** pStr, int32_t* pLen) {
|
int32_t qSubPlanToString(const SSubplan* pSubplan, char** pStr, int32_t* pLen) {
|
||||||
|
|
|
@ -260,7 +260,7 @@ int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
|
||||||
comparFn = 20;
|
comparFn = 20;
|
||||||
} else if (optr == OP_TYPE_LIKE) {
|
} else if (optr == OP_TYPE_LIKE) {
|
||||||
comparFn = 9;
|
comparFn = 9;
|
||||||
} else if (optr == OP_TYPE_LIKE) {
|
} else if (optr == OP_TYPE_NOT_LIKE) {
|
||||||
comparFn = 27;
|
comparFn = 27;
|
||||||
} else if (optr == OP_TYPE_IN) {
|
} else if (optr == OP_TYPE_IN) {
|
||||||
comparFn = 8;
|
comparFn = 8;
|
||||||
|
@ -3512,7 +3512,8 @@ void fltConvertToTsValueNode(SFltTreeStat *stat, SValueNode* valueNode) {
|
||||||
valueNode->datum.i = 0;
|
valueNode->datum.i = 0;
|
||||||
}
|
}
|
||||||
taosMemoryFree(timeStr);
|
taosMemoryFree(timeStr);
|
||||||
|
|
||||||
|
valueNode->typeData = valueNode->datum.i;
|
||||||
valueNode->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP;
|
valueNode->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||||
valueNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes;
|
valueNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,8 +92,9 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
len = varDataLen(out.columnData->pData);
|
char* data = colDataGetVarData(out.columnData, 0);
|
||||||
buf = varDataVal(out.columnData->pData);
|
len = varDataLen(data);
|
||||||
|
buf = varDataVal(data);
|
||||||
} else {
|
} else {
|
||||||
len = tDataTypes[type].bytes;
|
len = tDataTypes[type].bytes;
|
||||||
buf = out.columnData->pData;
|
buf = out.columnData->pData;
|
||||||
|
@ -109,7 +110,7 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosHashPut(pObj, buf, (size_t)len, NULL, 0)) {
|
if (taosHashPut(pObj, buf, (size_t)len, NULL, 0)) {
|
||||||
sclError("taosHashPut failed");
|
sclError("taosHashPut to set failed");
|
||||||
SCL_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCL_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -328,9 +328,10 @@ static FORCE_INLINE void varToBool(char *buf, SScalarParam* pOut, int32_t rowInd
|
||||||
static FORCE_INLINE void varToNchar(char* buf, SScalarParam* pOut, int32_t rowIndex) {
|
static FORCE_INLINE void varToNchar(char* buf, SScalarParam* pOut, int32_t rowIndex) {
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
int32_t inputLen = varDataLen(buf);
|
int32_t inputLen = varDataLen(buf);
|
||||||
|
int32_t outputMaxLen = (inputLen + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
|
||||||
|
|
||||||
char* t = taosMemoryCalloc(1,(inputLen + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE);
|
char* t = taosMemoryCalloc(1, outputMaxLen);
|
||||||
/*int32_t resLen = */taosMbsToUcs4(varDataVal(buf), inputLen, (TdUcs4*) varDataVal(t), pOut->columnData->info.bytes, &len);
|
/*int32_t resLen = */taosMbsToUcs4(varDataVal(buf), inputLen, (TdUcs4*) varDataVal(t), outputMaxLen, &len);
|
||||||
varDataSetLen(t, len);
|
varDataSetLen(t, len);
|
||||||
|
|
||||||
colDataAppend(pOut->columnData, rowIndex, t, false);
|
colDataAppend(pOut->columnData, rowIndex, t, false);
|
||||||
|
@ -512,7 +513,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1
|
||||||
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
varToNchar(tmp, pOut, i);
|
varToNchar(tmp, pOut, i);
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pOutputCol, i, (char *)&value, false);
|
colDataAppend(pOutputCol, i, (char *)tmp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(inType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(inType)) {
|
||||||
|
@ -529,7 +530,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1
|
||||||
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
varToNchar(tmp, pOut, i);
|
varToNchar(tmp, pOut, i);
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pOutputCol, i, (char *)&value, false);
|
colDataAppend(pOutputCol, i, (char *)tmp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (IS_FLOAT_TYPE(inType)) {
|
} else if (IS_FLOAT_TYPE(inType)) {
|
||||||
|
@ -546,7 +547,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1
|
||||||
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
if (outType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
varToNchar(tmp, pOut, i);
|
varToNchar(tmp, pOut, i);
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pOutputCol, i, (char *)&value, false);
|
colDataAppend(pOutputCol, i, (char *)tmp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -159,6 +159,7 @@ typedef struct SSchTask {
|
||||||
|
|
||||||
typedef struct SSchJobAttr {
|
typedef struct SSchJobAttr {
|
||||||
EExplainMode explainMode;
|
EExplainMode explainMode;
|
||||||
|
bool needRes;
|
||||||
bool syncSchedule;
|
bool syncSchedule;
|
||||||
bool queryJob;
|
bool queryJob;
|
||||||
bool needFlowCtrl;
|
bool needFlowCtrl;
|
||||||
|
@ -190,6 +191,7 @@ typedef struct SSchJob {
|
||||||
SSchTask *fetchTask;
|
SSchTask *fetchTask;
|
||||||
int32_t errCode;
|
int32_t errCode;
|
||||||
SArray *errList; // SArray<SQueryErrorInfo>
|
SArray *errList; // SArray<SQueryErrorInfo>
|
||||||
|
SRWLatch resLock;
|
||||||
void *resData; //TODO free it or not
|
void *resData; //TODO free it or not
|
||||||
int32_t resNumOfRows;
|
int32_t resNumOfRows;
|
||||||
const char *sql;
|
const char *sql;
|
||||||
|
|
|
@ -70,7 +70,7 @@ int32_t schInitTask(SSchJob *pJob, SSchTask *pTask, SSubplan *pPlan, SSchLevel *
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schInitJob(SSchJob **pSchJob, SQueryPlan *pDag, void *transport, SArray *pNodeList, const char *sql,
|
int32_t schInitJob(SSchJob **pSchJob, SQueryPlan *pDag, void *transport, SArray *pNodeList, const char *sql,
|
||||||
int64_t startTs, bool syncSchedule) {
|
int64_t startTs, bool needRes, bool syncSchedule) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int64_t refId = -1;
|
int64_t refId = -1;
|
||||||
SSchJob *pJob = taosMemoryCalloc(1, sizeof(SSchJob));
|
SSchJob *pJob = taosMemoryCalloc(1, sizeof(SSchJob));
|
||||||
|
@ -81,6 +81,7 @@ int32_t schInitJob(SSchJob **pSchJob, SQueryPlan *pDag, void *transport, SArray
|
||||||
|
|
||||||
pJob->attr.explainMode = pDag->explainInfo.mode;
|
pJob->attr.explainMode = pDag->explainInfo.mode;
|
||||||
pJob->attr.syncSchedule = syncSchedule;
|
pJob->attr.syncSchedule = syncSchedule;
|
||||||
|
pJob->attr.needRes = needRes;
|
||||||
pJob->transport = transport;
|
pJob->transport = transport;
|
||||||
pJob->sql = sql;
|
pJob->sql = sql;
|
||||||
|
|
||||||
|
@ -1133,16 +1134,39 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t msgType, ch
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TDMT_VND_SUBMIT_RSP: {
|
case TDMT_VND_SUBMIT_RSP: {
|
||||||
if (msg) {
|
|
||||||
SSubmitRsp *rsp = (SSubmitRsp *)msg;
|
|
||||||
SCH_ERR_JRET(rsp->code);
|
|
||||||
}
|
|
||||||
|
|
||||||
SCH_ERR_JRET(rspCode);
|
SCH_ERR_JRET(rspCode);
|
||||||
|
|
||||||
SSubmitRsp *rsp = (SSubmitRsp *)msg;
|
if (msg) {
|
||||||
if (rsp) {
|
SDecoder coder = {0};
|
||||||
pJob->resNumOfRows += rsp->affectedRows;
|
SSubmitRsp *rsp = taosMemoryMalloc(sizeof(*rsp));
|
||||||
|
tDecoderInit(&coder, msg, msgSize);
|
||||||
|
code = tDecodeSSubmitRsp(&coder, rsp);
|
||||||
|
if (code) {
|
||||||
|
SCH_TASK_ELOG("decode submitRsp failed, code:%d", code);
|
||||||
|
tFreeSSubmitRsp(rsp);
|
||||||
|
SCH_ERR_JRET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic_add_fetch_32(&pJob->resNumOfRows, rsp->affectedRows);
|
||||||
|
SCH_TASK_DLOG("submit succeed, affectedRows:%d", rsp->affectedRows);
|
||||||
|
|
||||||
|
if (pJob->attr.needRes) {
|
||||||
|
SCH_LOCK(SCH_WRITE, &pJob->resLock);
|
||||||
|
if (pJob->resData) {
|
||||||
|
SSubmitRsp *sum = pJob->resData;
|
||||||
|
sum->affectedRows += rsp->affectedRows;
|
||||||
|
sum->nBlocks += rsp->nBlocks;
|
||||||
|
sum->pBlocks = taosMemoryRealloc(sum->pBlocks, sum->nBlocks * sizeof(*sum->pBlocks));
|
||||||
|
memcpy(sum->pBlocks + sum->nBlocks - rsp->nBlocks, rsp->pBlocks, rsp->nBlocks * sizeof(*sum->pBlocks));
|
||||||
|
taosMemoryFree(rsp->pBlocks);
|
||||||
|
taosMemoryFree(rsp);
|
||||||
|
} else {
|
||||||
|
pJob->resData = rsp;
|
||||||
|
}
|
||||||
|
SCH_UNLOCK(SCH_WRITE, &pJob->resLock);
|
||||||
|
} else {
|
||||||
|
tFreeSSubmitRsp(rsp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
||||||
|
@ -2350,7 +2374,7 @@ void schFreeJobImpl(void *job) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryPlan *pDag, int64_t *job, const char *sql,
|
static int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryPlan *pDag, int64_t *job, const char *sql,
|
||||||
int64_t startTs, bool syncSchedule) {
|
int64_t startTs, bool needRes, bool syncSchedule) {
|
||||||
qDebug("QID:0x%" PRIx64 " job started", pDag->queryId);
|
qDebug("QID:0x%" PRIx64 " job started", pDag->queryId);
|
||||||
|
|
||||||
if (pNodeList == NULL || taosArrayGetSize(pNodeList) <= 0) {
|
if (pNodeList == NULL || taosArrayGetSize(pNodeList) <= 0) {
|
||||||
|
@ -2359,7 +2383,7 @@ static int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryPlan *pD
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSchJob *pJob = NULL;
|
SSchJob *pJob = NULL;
|
||||||
SCH_ERR_JRET(schInitJob(&pJob, pDag, transport, pNodeList, sql, startTs, syncSchedule));
|
SCH_ERR_JRET(schInitJob(&pJob, pDag, transport, pNodeList, sql, startTs, needRes, syncSchedule));
|
||||||
|
|
||||||
SCH_ERR_JRET(schLaunchJob(pJob));
|
SCH_ERR_JRET(schLaunchJob(pJob));
|
||||||
|
|
||||||
|
@ -2473,7 +2497,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, int64_t *pJob, const char *sql,
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, int64_t *pJob, const char *sql,
|
||||||
int64_t startTs, SQueryResult *pRes) {
|
int64_t startTs, bool needRes, SQueryResult *pRes) {
|
||||||
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob || NULL == pRes) {
|
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob || NULL == pRes) {
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
@ -2481,13 +2505,17 @@ int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, in
|
||||||
if (EXPLAIN_MODE_STATIC == pDag->explainInfo.mode) {
|
if (EXPLAIN_MODE_STATIC == pDag->explainInfo.mode) {
|
||||||
SCH_ERR_RET(schExecStaticExplain(transport, nodeList, pDag, pJob, sql, true));
|
SCH_ERR_RET(schExecStaticExplain(transport, nodeList, pDag, pJob, sql, true));
|
||||||
} else {
|
} else {
|
||||||
SCH_ERR_RET(schExecJobImpl(transport, nodeList, pDag, pJob, sql, startTs, true));
|
SCH_ERR_RET(schExecJobImpl(transport, nodeList, pDag, pJob, sql, startTs, needRes, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchJob *job = schAcquireJob(*pJob);
|
SSchJob *job = schAcquireJob(*pJob);
|
||||||
|
|
||||||
pRes->code = atomic_load_32(&job->errCode);
|
pRes->code = atomic_load_32(&job->errCode);
|
||||||
pRes->numOfRows = job->resNumOfRows;
|
pRes->numOfRows = job->resNumOfRows;
|
||||||
|
if (needRes) {
|
||||||
|
pRes->res = job->resData;
|
||||||
|
job->resData = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
schReleaseJob(*pJob);
|
schReleaseJob(*pJob);
|
||||||
|
|
||||||
|
@ -2502,7 +2530,7 @@ int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryPlan *pD
|
||||||
if (EXPLAIN_MODE_STATIC == pDag->explainInfo.mode) {
|
if (EXPLAIN_MODE_STATIC == pDag->explainInfo.mode) {
|
||||||
SCH_ERR_RET(schExecStaticExplain(transport, pNodeList, pDag, pJob, sql, false));
|
SCH_ERR_RET(schExecStaticExplain(transport, pNodeList, pDag, pJob, sql, false));
|
||||||
} else {
|
} else {
|
||||||
SCH_ERR_RET(schExecJobImpl(transport, pNodeList, pDag, pJob, sql, 0, false));
|
SCH_ERR_RET(schExecJobImpl(transport, pNodeList, pDag, pJob, sql, 0, false, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -985,7 +985,7 @@ TEST(insertTest, normalCase) {
|
||||||
taosThreadCreate(&(thread1), &thattr, schtSendRsp, &insertJobRefId);
|
taosThreadCreate(&(thread1), &thattr, schtSendRsp, &insertJobRefId);
|
||||||
|
|
||||||
SQueryResult res = {0};
|
SQueryResult res = {0};
|
||||||
code = schedulerExecJob(mockPointer, qnodeList, &dag, &insertJobRefId, "insert into tb values(now,1)", 0, &res);
|
code = schedulerExecJob(mockPointer, qnodeList, &dag, &insertJobRefId, "insert into tb values(now,1)", 0, false, &res);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(res.numOfRows, 20);
|
ASSERT_EQ(res.numOfRows, 20);
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
|
||||||
const char *errStr = tstrerror(err);
|
const char *errStr = tstrerror(err);
|
||||||
int32_t linuxErr = errno;
|
int32_t linuxErr = errno;
|
||||||
const char *linuxErrMsg = strerror(errno);
|
const char *linuxErrMsg = strerror(errno);
|
||||||
sError("walWriteWithSyncInfo error, err:%d, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, errStr, linuxErr, linuxErrMsg);
|
sError("walWriteWithSyncInfo error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr, linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
//assert(code == 0);
|
//assert(code == 0);
|
||||||
|
@ -83,7 +83,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
const char *errStr = tstrerror(err);
|
const char *errStr = tstrerror(err);
|
||||||
int32_t linuxErr = errno;
|
int32_t linuxErr = errno;
|
||||||
const char *linuxErrMsg = strerror(errno);
|
const char *linuxErrMsg = strerror(errno);
|
||||||
sError("walReadWithHandle error, err:%d, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, errStr, linuxErr, linuxErrMsg);
|
sError("walReadWithHandle error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr, linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
//assert(walReadWithHandle(pWalHandle, index) == 0);
|
//assert(walReadWithHandle(pWalHandle, index) == 0);
|
||||||
|
@ -119,7 +119,7 @@ int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
||||||
const char *errStr = tstrerror(err);
|
const char *errStr = tstrerror(err);
|
||||||
int32_t linuxErr = errno;
|
int32_t linuxErr = errno;
|
||||||
const char *linuxErrMsg = strerror(errno);
|
const char *linuxErrMsg = strerror(errno);
|
||||||
sError("walRollback error, err:%d, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, errStr, linuxErr, linuxErrMsg);
|
sError("walRollback error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr, linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
return 0; // to avoid compiler error
|
return 0; // to avoid compiler error
|
||||||
|
@ -152,7 +152,7 @@ int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
const char *errStr = tstrerror(err);
|
const char *errStr = tstrerror(err);
|
||||||
int32_t linuxErr = errno;
|
int32_t linuxErr = errno;
|
||||||
const char *linuxErrMsg = strerror(errno);
|
const char *linuxErrMsg = strerror(errno);
|
||||||
sError("walCommit error, err:%d, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, errStr, linuxErr, linuxErrMsg);
|
sError("walCommit error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr, linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
return 0; // to avoid compiler error
|
return 0; // to avoid compiler error
|
||||||
|
|
|
@ -103,7 +103,8 @@ Dwarf_Debug tDbg;
|
||||||
static TdThreadOnce traceThreadInit = PTHREAD_ONCE_INIT;
|
static TdThreadOnce traceThreadInit = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
void endTrace() {
|
void endTrace() {
|
||||||
if (traceThreadInit != PTHREAD_ONCE_INIT) {
|
TdThreadOnce tmp = PTHREAD_ONCE_INIT;
|
||||||
|
if (memcmp(&traceThreadInit, &tmp, sizeof(TdThreadOnce)) != 0) {
|
||||||
delete_lookup_table(&lookup_table);
|
delete_lookup_table(&lookup_table);
|
||||||
dwarf_finish(tDbg);
|
dwarf_finish(tDbg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -911,7 +911,8 @@ void taosCacheRefresh(SCacheObj *pCacheObj, __cache_trav_fn_t fp, void *param1)
|
||||||
|
|
||||||
void taosStopCacheRefreshWorker(void) {
|
void taosStopCacheRefreshWorker(void) {
|
||||||
stopRefreshWorker = true;
|
stopRefreshWorker = true;
|
||||||
if(cacheThreadInit != PTHREAD_ONCE_INIT) taosThreadJoin(cacheRefreshWorker, NULL);
|
TdThreadOnce tmp = PTHREAD_ONCE_INIT;
|
||||||
|
if (memcmp(&cacheRefreshWorker, &tmp, sizeof(TdThreadOnce)) != 0) taosThreadJoin(cacheRefreshWorker, NULL);
|
||||||
taosArrayDestroy(pCacheArrayList);
|
taosArrayDestroy(pCacheArrayList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,10 +48,18 @@ int64_t tGenIdPI64(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t ts = taosGetTimestampMs();
|
int64_t id;
|
||||||
uint64_t pid = taosGetPId();
|
|
||||||
int32_t val = atomic_add_fetch_32(&tUUIDSerialNo, 1);
|
while (true) {
|
||||||
|
int64_t ts = taosGetTimestampMs();
|
||||||
|
uint64_t pid = taosGetPId();
|
||||||
|
int32_t val = atomic_add_fetch_32(&tUUIDSerialNo, 1);
|
||||||
|
|
||||||
|
id = ((tUUIDHashId & 0x07FF) << 52) | ((pid & 0x0FFF) << 40) | ((ts & 0xFFFFFF) << 16) | (val & 0xFFFF);
|
||||||
|
if (id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int64_t id = ((tUUIDHashId & 0x07FF) << 52) | ((pid & 0x0FFF) << 40) | ((ts & 0xFFFFFF) << 16) | (val & 0xFFFF);
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -66,7 +66,7 @@ print ============= create database
|
||||||
# | REPLICA value [1 | 3]
|
# | REPLICA value [1 | 3]
|
||||||
# | WAL value [1 | 2]
|
# | WAL value [1 | 2]
|
||||||
|
|
||||||
sql create database db CACHELAST 3 COMP 0 DAYS 345600 FSYNC 1000 MAXROWS 8000 MINROWS 10 KEEP 1440000 PRECISION 'ns' REPLICA 3 WAL 2 VGROUPS 6 SINGLE_STABLE 1
|
sql create database db CACHELAST 3 COMP 0 DAYS 240 FSYNC 1000 MAXROWS 8000 MINROWS 10 KEEP 1000 PRECISION 'ns' REPLICA 3 WAL 2 VGROUPS 6 SINGLE_STABLE 1
|
||||||
sql show databases
|
sql show databases
|
||||||
print rows: $rows
|
print rows: $rows
|
||||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
|
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
|
||||||
|
@ -229,7 +229,7 @@ sql_error alter database db days 0
|
||||||
sql_error alter database db days 14400 # set over than keep
|
sql_error alter database db days 14400 # set over than keep
|
||||||
|
|
||||||
print ============== modify keep
|
print ============== modify keep
|
||||||
sql alter database db keep 3456000
|
sql alter database db keep 2400
|
||||||
sql show databases
|
sql show databases
|
||||||
print keep $data7_db
|
print keep $data7_db
|
||||||
if $data7_db != 3456000,3456000,3456000 then
|
if $data7_db != 3456000,3456000,3456000 then
|
||||||
|
|
|
@ -15,8 +15,7 @@ $tb = $tbPrefix . $i
|
||||||
|
|
||||||
print =============== step1
|
print =============== step1
|
||||||
# quorum presicion
|
# quorum presicion
|
||||||
#sql create database $db vgroups 8 replica 1 days 2880 keep 3650 cache 32 blocks 12 minrows 80 maxrows 10000 wal 2 fsync 1000 comp 0 cachelast 2 precision 'us'
|
sql create database $db vgroups 8 replica 1 days 2 keep 10 minrows 80 maxrows 10000 wal 2 fsync 1000 comp 0 cachelast 2 precision 'us'
|
||||||
sql create database $db vgroups 8 replica 1 days 2880 keep 3650 minrows 80 maxrows 10000 wal 2 fsync 1000 comp 0 cachelast 2 precision 'us'
|
|
||||||
sql show databases
|
sql show databases
|
||||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
|
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
|
||||||
|
|
||||||
|
@ -38,7 +37,7 @@ endi
|
||||||
if $data26 != 2880 then
|
if $data26 != 2880 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data27 != 3650,3650,3650 then
|
if $data27 != 14400,14400,14400 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#if $data28 != 32 then
|
#if $data28 != 32 then
|
||||||
|
@ -67,7 +66,7 @@ print =============== step4
|
||||||
sql_error drop database $db
|
sql_error drop database $db
|
||||||
|
|
||||||
print =============== step5
|
print =============== step5
|
||||||
sql create database $db replica 1 days 21600 keep 2160000
|
sql create database $db replica 1 days 15 keep 1500
|
||||||
sql show databases
|
sql show databases
|
||||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07
|
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07
|
||||||
if $data20 != $db then
|
if $data20 != $db then
|
||||||
|
|
Loading…
Reference in New Issue