Merge pull request #9929 from taosdata/feature/3.0_liaohj
Feature/3.0 liaohj
This commit is contained in:
commit
e2534b6a63
|
@ -7,3 +7,4 @@ FROM mcr.microsoft.com/vscode/devcontainers/cpp:0-${VARIANT}
|
||||||
# [Optional] Uncomment this section to install additional packages.
|
# [Optional] Uncomment this section to install additional packages.
|
||||||
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
||||||
|
RUN apt-get update && apt-get -y install tree vim
|
||||||
|
|
|
@ -80,6 +80,13 @@ extern "C" {
|
||||||
|
|
||||||
#define FUNCTION_COV 38
|
#define FUNCTION_COV 38
|
||||||
|
|
||||||
|
typedef struct SResultRowEntryInfo {
|
||||||
|
int8_t hasResult; // result generated, not NULL value
|
||||||
|
bool initialized; // output buffer has been initialized
|
||||||
|
bool complete; // query has completed
|
||||||
|
uint32_t numOfRes; // num of output result in current buffer
|
||||||
|
} SResultRowEntryInfo;
|
||||||
|
|
||||||
// determine the real data need to calculated the result
|
// determine the real data need to calculated the result
|
||||||
enum {
|
enum {
|
||||||
BLK_DATA_NO_NEEDED = 0x0,
|
BLK_DATA_NO_NEEDED = 0x0,
|
||||||
|
@ -127,6 +134,8 @@ typedef struct SFunctionFpSet {
|
||||||
void (*combine)(struct SQLFunctionCtx *pCtx);
|
void (*combine)(struct SQLFunctionCtx *pCtx);
|
||||||
} SFunctionFpSet;
|
} SFunctionFpSet;
|
||||||
|
|
||||||
|
extern SFunctionFpSet fpSet[1];
|
||||||
|
|
||||||
// sql function runtime context
|
// sql function runtime context
|
||||||
typedef struct SQLFunctionCtx {
|
typedef struct SQLFunctionCtx {
|
||||||
int32_t size; // number of rows
|
int32_t size; // number of rows
|
||||||
|
@ -156,6 +165,7 @@ typedef struct SQLFunctionCtx {
|
||||||
SPoint1 start;
|
SPoint1 start;
|
||||||
SPoint1 end;
|
SPoint1 end;
|
||||||
|
|
||||||
|
int32_t columnIndex;
|
||||||
SFunctionFpSet* fpSet;
|
SFunctionFpSet* fpSet;
|
||||||
} SQLFunctionCtx;
|
} SQLFunctionCtx;
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@ SSchema *getOneColumnSchema(const STableMeta* pTableMeta, int32_t colIndex);
|
||||||
|
|
||||||
int32_t getNewResColId();
|
int32_t getNewResColId();
|
||||||
void addIntoSourceParam(SSourceParam* pSourceParam, tExprNode* pNode, SColumn* pColumn);
|
void addIntoSourceParam(SSourceParam* pSourceParam, tExprNode* pNode, SColumn* pColumn);
|
||||||
|
SExprInfo* createBinaryExprInfo(struct tExprNode* pNode, SSchema* pResSchema);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,10 +114,16 @@ typedef struct SProjectPhyNode {
|
||||||
SPhyNode node;
|
SPhyNode node;
|
||||||
} SProjectPhyNode;
|
} SProjectPhyNode;
|
||||||
|
|
||||||
|
typedef struct SDownstreamSource {
|
||||||
|
SQueryNodeAddr addr;
|
||||||
|
uint64_t taskId;
|
||||||
|
uint64_t schedId;
|
||||||
|
} SDownstreamSource;
|
||||||
|
|
||||||
typedef struct SExchangePhyNode {
|
typedef struct SExchangePhyNode {
|
||||||
SPhyNode node;
|
SPhyNode node;
|
||||||
uint64_t srcTemplateId; // template id of datasource suplans
|
uint64_t srcTemplateId; // template id of datasource suplans
|
||||||
SArray *pSrcEndPoints; // SEpAddr, scheduler fill by calling qSetSuplanExecutionNode
|
SArray *pSrcEndPoints; // SArray<SDownstreamSource>, scheduler fill by calling qSetSuplanExecutionNode
|
||||||
} SExchangePhyNode;
|
} SExchangePhyNode;
|
||||||
|
|
||||||
typedef enum EAggAlgo {
|
typedef enum EAggAlgo {
|
||||||
|
@ -178,7 +184,7 @@ int32_t qCreateQueryDag(const struct SQueryNode* pQueryInfo, struct SQueryDag**
|
||||||
// @subplan subplan to be schedule
|
// @subplan subplan to be schedule
|
||||||
// @templateId templateId of a group of datasource subplans of this @subplan
|
// @templateId templateId of a group of datasource subplans of this @subplan
|
||||||
// @ep one execution location of this group of datasource subplans
|
// @ep one execution location of this group of datasource subplans
|
||||||
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SQueryNodeAddr* ep);
|
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource);
|
||||||
|
|
||||||
int32_t qExplainQuery(const struct SQueryNode* pQueryInfo, struct SEpSet* pQnode, char** str);
|
int32_t qExplainQuery(const struct SQueryNode* pQueryInfo, struct SEpSet* pQnode, char** str);
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ extern int32_t clientConnRefPool;
|
||||||
|
|
||||||
extern int (*handleRequestRspFp[TDMT_MAX])(void*, const SDataBuf* pMsg, int32_t code);
|
extern int (*handleRequestRspFp[TDMT_MAX])(void*, const SDataBuf* pMsg, int32_t code);
|
||||||
int genericRspCallback(void* param, const SDataBuf* pMsg, int32_t code);
|
int genericRspCallback(void* param, const SDataBuf* pMsg, int32_t code);
|
||||||
SMsgSendInfo* buildMsgInfoImpl(SRequestObj*);
|
SMsgSendInfo* buildMsgInfoImpl(SRequestObj* pReqObj);
|
||||||
|
|
||||||
int taos_init();
|
int taos_init();
|
||||||
|
|
||||||
|
|
|
@ -195,8 +195,7 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) {
|
||||||
}
|
}
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pDcl->epSet, &transporterId, pSendMsg);
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pDcl->epSet, &transporterId, pSendMsg);
|
||||||
} else {
|
} else {
|
||||||
SEpSet* pEpSet = &pTscObj->pAppInfo->mgmtEp.epSet;
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pDcl->epSet, &transporterId, pSendMsg);
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, pEpSet, &transporterId, pSendMsg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
@ -257,7 +256,14 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag) {
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
return scheduleAsyncExecJob(pRequest->pTscObj->pAppInfo->pTransporter, NULL, pDag, &pRequest->body.pQueryJob);
|
SArray *execNode = taosArrayInit(4, sizeof(SQueryNodeAddr));
|
||||||
|
|
||||||
|
SQueryNodeAddr addr = {.numOfEps = 1, .inUse = 0, .nodeId = 2};
|
||||||
|
addr.epAddr[0].port = 7100;
|
||||||
|
strcpy(addr.epAddr[0].fqdn, "localhost");
|
||||||
|
|
||||||
|
taosArrayPush(execNode, &addr);
|
||||||
|
return scheduleAsyncExecJob(pRequest->pTscObj->pAppInfo->pTransporter, execNode, pDag, &pRequest->body.pQueryJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tmq_t tmq_t;
|
typedef struct tmq_t tmq_t;
|
||||||
|
@ -699,6 +705,8 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
assert(pRequest != NULL);
|
assert(pRequest != NULL);
|
||||||
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
||||||
|
|
||||||
|
SEpSet epSet = {0};
|
||||||
|
|
||||||
if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
|
if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
|
||||||
if (pRequest->type == TDMT_VND_QUERY) {
|
if (pRequest->type == TDMT_VND_QUERY) {
|
||||||
// All data has returned to App already, no need to try again
|
// All data has returned to App already, no need to try again
|
||||||
|
@ -706,9 +714,13 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleFetchRows(pRequest->body.pQueryJob, (void **)&pRequest->body.resInfo.pData);
|
int32_t code = scheduleFetchRows(pRequest->body.pQueryJob, (void **)&pRequest->body.resInfo.pData);
|
||||||
setQueryResultByRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pRequest->body.resInfo.pData);
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
pRequest->code = code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
setQueryResultByRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pRequest->body.resInfo.pData);
|
||||||
if (pResultInfo->numOfRows == 0) {
|
if (pResultInfo->numOfRows == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -716,8 +728,20 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
goto _return;
|
goto _return;
|
||||||
} else if (pRequest->type == TDMT_MND_SHOW) {
|
} else if (pRequest->type == TDMT_MND_SHOW) {
|
||||||
pRequest->type = TDMT_MND_SHOW_RETRIEVE;
|
pRequest->type = TDMT_MND_SHOW_RETRIEVE;
|
||||||
|
epSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
||||||
} else if (pRequest->type == TDMT_VND_SHOW_TABLES) {
|
} else if (pRequest->type == TDMT_VND_SHOW_TABLES) {
|
||||||
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
||||||
|
SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo;
|
||||||
|
SVgroupInfo* pVgroupInfo = taosArrayGet(pShowReqInfo->pArray, pShowReqInfo->currentIndex);
|
||||||
|
|
||||||
|
epSet.numOfEps = pVgroupInfo->numOfEps;
|
||||||
|
epSet.inUse = pVgroupInfo->inUse;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
||||||
|
strncpy(epSet.fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(epSet.fqdn[i]));
|
||||||
|
epSet.port[i] = pVgroupInfo->epAddr[i].port;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (pRequest->type == TDMT_VND_SHOW_TABLES_FETCH) {
|
} else if (pRequest->type == TDMT_VND_SHOW_TABLES_FETCH) {
|
||||||
pRequest->type = TDMT_VND_SHOW_TABLES;
|
pRequest->type = TDMT_VND_SHOW_TABLES;
|
||||||
SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo;
|
SShowReqInfo* pShowReqInfo = &pRequest->body.showInfo;
|
||||||
|
@ -735,19 +759,29 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
||||||
|
|
||||||
|
epSet.numOfEps = pVgroupInfo->numOfEps;
|
||||||
|
epSet.inUse = pVgroupInfo->inUse;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
||||||
|
strncpy(epSet.fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(epSet.fqdn[i]));
|
||||||
|
epSet.port[i] = pVgroupInfo->epAddr[i].port;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
STscObj *pTscObj = pRequest->pTscObj;
|
STscObj *pTscObj = pRequest->pTscObj;
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body);
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, body);
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
||||||
|
} else if (pRequest->type == TDMT_MND_SHOW_RETRIEVE && pResultInfo->pData != NULL) {
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
STscObj *pTscObj = pRequest->pTscObj;
|
STscObj *pTscObj = pRequest->pTscObj;
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body);
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, body);
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <taoserror.h>
|
#include <taoserror.h>
|
||||||
|
#include <tglobal.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
|
||||||
|
@ -46,17 +47,19 @@ int main(int argc, char** argv) {
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, driverInit_Test) { taos_init(); }
|
TEST(testCase, driverInit_Test) {
|
||||||
|
taosInitGlobalCfg();
|
||||||
TEST(testCase, connect_Test) {
|
// taos_init();
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", "abc1", 0);
|
|
||||||
if (pConn == NULL) {
|
|
||||||
printf("failed to connect to server, reason:%s\n", taos_errstr(NULL));
|
|
||||||
}
|
|
||||||
sleep(3);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TEST(testCase, connect_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// if (pConn == NULL) {
|
||||||
|
// printf("failed to connect to server, reason:%s\n", taos_errstr(NULL));
|
||||||
|
// }
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, create_user_Test) {
|
//TEST(testCase, create_user_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
@ -148,30 +151,30 @@ TEST(testCase, connect_Test) {
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
//
|
//
|
||||||
TEST(testCase, create_db_Test) {
|
//TEST(testCase, create_db_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
ASSERT_TRUE(pFields == NULL);
|
// ASSERT_TRUE(pFields == NULL);
|
||||||
|
//
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
ASSERT_EQ(numOfFields, 0);
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
// pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, create_dnode_Test) {
|
//TEST(testCase, create_dnode_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
@ -254,7 +257,7 @@ TEST(testCase, create_db_Test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, create_stable_Test) {
|
//TEST(testCase, create_stable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
@ -275,17 +278,14 @@ TEST(testCase, create_db_Test) {
|
||||||
//
|
//
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
|
||||||
//}
|
|
||||||
//
|
//
|
||||||
// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// pRes = taos_query(pConn, "use abc1");
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// pRes = taos_query(pConn, "drop stable `123_$^)`");
|
// pRes = taos_query(pConn, "drop stable `123_$^)`");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
@ -294,26 +294,26 @@ TEST(testCase, create_db_Test) {
|
||||||
//
|
//
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, create_table_Test) {
|
//TEST(testCase, create_table_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)");
|
// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)");
|
||||||
ASSERT_EQ(taos_errno(pRes), 0);
|
// ASSERT_EQ(taos_errno(pRes), 0);
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)");
|
// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)");
|
||||||
ASSERT_NE(taos_errno(pRes), 0);
|
// ASSERT_NE(taos_errno(pRes), 0);
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, create_ctable_Test) {
|
//TEST(testCase, create_ctable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
@ -324,6 +324,12 @@ TEST(testCase, create_table_Test) {
|
||||||
// }
|
// }
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
//
|
//
|
||||||
|
// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("failed to create stable, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
// pRes = taos_query(pConn, "create table tm0 using st1 tags(1)");
|
// pRes = taos_query(pConn, "create table tm0 using st1 tags(1)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
||||||
|
@ -332,37 +338,31 @@ TEST(testCase, create_table_Test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, show_stable_Test) {
|
//TEST(testCase, show_stable_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != nullptr);
|
// assert(pConn != nullptr);
|
||||||
|
//
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "show abc1.stables");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
// ASSERT_TRUE(false);
|
||||||
TAOS_RES* pRes = taos_query(pConn, "show abc1.stables");
|
// }
|
||||||
if (taos_errno(pRes) != 0) {
|
//
|
||||||
printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
// TAOS_ROW pRow = NULL;
|
||||||
taos_free_result(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
ASSERT_TRUE(false);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
}
|
//
|
||||||
|
// char str[512] = {0};
|
||||||
TAOS_ROW pRow = NULL;
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// printf("%s\n", str);
|
||||||
|
// }
|
||||||
char str[512] = {0};
|
//
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// taos_free_result(pRes);
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// taos_close(pConn);
|
||||||
printf("%s\n", str);
|
//}
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
//TEST(testCase, show_vgroup_Test) {
|
//TEST(testCase, show_vgroup_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
@ -456,24 +456,28 @@ TEST(testCase, show_stable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
//
|
//
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "show tables");
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "show tables");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pRes = taos_query(pConn, "show abc1.tables");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// TAOS_ROW pRow = NULL;
|
// TAOS_ROW pRow = NULL;
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
//
|
||||||
|
// int32_t count = 0;
|
||||||
// char str[512] = {0};
|
// char str[512] = {0};
|
||||||
|
//
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
// printf("%d: %s\n", ++count, str);
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
@ -521,30 +525,30 @@ TEST(testCase, show_stable_Test) {
|
||||||
// taosHashCleanup(phash);
|
// taosHashCleanup(phash);
|
||||||
//}
|
//}
|
||||||
//
|
//
|
||||||
TEST(testCase, create_topic_Test) {
|
//TEST(testCase, create_topic_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
ASSERT_TRUE(pFields == nullptr);
|
// ASSERT_TRUE(pFields == nullptr);
|
||||||
|
//
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
ASSERT_EQ(numOfFields, 0);
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
char* sql = "select * from tu";
|
// char* sql = "select * from tu";
|
||||||
pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
// pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, insert_test) {
|
//TEST(testCase, insert_test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// ASSERT_NE(pConn, nullptr);
|
// ASSERT_NE(pConn, nullptr);
|
||||||
|
@ -562,7 +566,7 @@ TEST(testCase, create_topic_Test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, projection_query_tables) {
|
//TEST(testCase, projection_query_tables) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// ASSERT_NE(pConn, nullptr);
|
// ASSERT_NE(pConn, nullptr);
|
||||||
|
@ -613,7 +617,7 @@ TEST(testCase, create_topic_Test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
//
|
||||||
//TEST(testCase, projection_query_stables) {
|
//TEST(testCase, projection_query_stables) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// ASSERT_NE(pConn, nullptr);
|
// ASSERT_NE(pConn, nullptr);
|
||||||
|
@ -621,7 +625,7 @@ TEST(testCase, create_topic_Test) {
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
//
|
//
|
||||||
// pRes = taos_query(pConn, "select ts,k from m1");
|
// pRes = taos_query(pConn, "select ts from m1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
@ -641,3 +645,31 @@ TEST(testCase, create_topic_Test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
TEST(testCase, agg_query_tables) {
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
ASSERT_NE(pConn, nullptr);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "select count(*) from tu");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
||||||
|
taos_free_result(pRes);
|
||||||
|
ASSERT_TRUE(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_ROW pRow = NULL;
|
||||||
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
|
||||||
|
char str[512] = {0};
|
||||||
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
|
printf("%s\n", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
taos_close(pConn);
|
||||||
|
}
|
|
@ -230,7 +230,7 @@ typedef struct {
|
||||||
char acct[TSDB_USER_LEN];
|
char acct[TSDB_USER_LEN];
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
int64_t uid;
|
uint64_t uid;
|
||||||
int32_t cfgVersion;
|
int32_t cfgVersion;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
int8_t hashMethod; // default is 1
|
int8_t hashMethod; // default is 1
|
||||||
|
|
|
@ -855,6 +855,10 @@ static int32_t mndRetrieveStb(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) break;
|
||||||
|
|
||||||
if (pStb->dbUid != pDb->uid) {
|
if (pStb->dbUid != pDb->uid) {
|
||||||
|
if (strncmp(pStb->db, pDb->name, tListLen(pStb->db)) == 0) {
|
||||||
|
mError("Inconsistent table data, name:%s, db:%s, dbUid:%"PRIu64, pStb->name, pDb->name, pDb->uid);
|
||||||
|
}
|
||||||
|
|
||||||
sdbRelease(pSdb, pStb);
|
sdbRelease(pSdb, pStb);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ typedef struct {
|
||||||
} SSchemaWrapper;
|
} SSchemaWrapper;
|
||||||
|
|
||||||
typedef struct SMTbCursor SMTbCursor;
|
typedef struct SMTbCursor SMTbCursor;
|
||||||
|
typedef struct SMCtbCursor SMCtbCursor;
|
||||||
|
|
||||||
typedef SVCreateTbReq STbCfg;
|
typedef SVCreateTbReq STbCfg;
|
||||||
|
|
||||||
|
@ -64,6 +65,10 @@ SMTbCursor *metaOpenTbCursor(SMeta *pMeta);
|
||||||
void metaCloseTbCursor(SMTbCursor *pTbCur);
|
void metaCloseTbCursor(SMTbCursor *pTbCur);
|
||||||
char * metaTbCursorNext(SMTbCursor *pTbCur);
|
char * metaTbCursorNext(SMTbCursor *pTbCur);
|
||||||
|
|
||||||
|
SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid);
|
||||||
|
void metaCloseCtbCurosr(SMCtbCursor *pCtbCur);
|
||||||
|
tb_uid_t metaCtbCursorNext(SMCtbCursor *pCtbCur);
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
void metaOptionsInit(SMetaCfg *pMetaCfg);
|
void metaOptionsInit(SMetaCfg *pMetaCfg);
|
||||||
void metaOptionsClear(SMetaCfg *pMetaCfg);
|
void metaOptionsClear(SMetaCfg *pMetaCfg);
|
||||||
|
|
|
@ -93,6 +93,7 @@ int tsdbOptionsInit(STsdbCfg *);
|
||||||
void tsdbOptionsClear(STsdbCfg *);
|
void tsdbOptionsClear(STsdbCfg *);
|
||||||
|
|
||||||
typedef void* tsdbReadHandleT;
|
typedef void* tsdbReadHandleT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the data block iterator, starting from position according to the query condition
|
* Get the data block iterator, starting from position according to the query condition
|
||||||
*
|
*
|
||||||
|
@ -124,6 +125,24 @@ tsdbReadHandleT tsdbQueryCacheLast(STsdb *tsdb, STsdbQueryCond *pCond, STableGro
|
||||||
|
|
||||||
bool isTsdbCacheLastRow(tsdbReadHandleT* pTsdbReadHandle);
|
bool isTsdbCacheLastRow(tsdbReadHandleT* pTsdbReadHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param tsdb
|
||||||
|
* @param uid
|
||||||
|
* @param skey
|
||||||
|
* @param pTagCond
|
||||||
|
* @param len
|
||||||
|
* @param tagNameRelType
|
||||||
|
* @param tbnameCond
|
||||||
|
* @param pGroupInfo
|
||||||
|
* @param pColIndex
|
||||||
|
* @param numOfCols
|
||||||
|
* @param reqId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int32_t tsdbQuerySTableByTagCond(STsdb* tsdb, uint64_t uid, TSKEY skey, const char* pTagCond, size_t len,
|
||||||
|
int16_t tagNameRelType, const char* tbnameCond, STableGroupInfo* pGroupInfo,
|
||||||
|
SColIndex* pColIndex, int32_t numOfCols, uint64_t reqId);
|
||||||
/**
|
/**
|
||||||
* get num of rows in mem table
|
* get num of rows in mem table
|
||||||
*
|
*
|
||||||
|
|
|
@ -374,22 +374,27 @@ static int metaCtbIdxCb(DB *pIdx, const DBT *pKey, const DBT *pValue, DBT *pSKey
|
||||||
DBT * pDbt;
|
DBT * pDbt;
|
||||||
|
|
||||||
if (pTbCfg->type == META_CHILD_TABLE) {
|
if (pTbCfg->type == META_CHILD_TABLE) {
|
||||||
pDbt = calloc(2, sizeof(DBT));
|
// pDbt = calloc(2, sizeof(DBT));
|
||||||
|
|
||||||
// First key is suid
|
// // First key is suid
|
||||||
pDbt[0].data = &(pTbCfg->ctbCfg.suid);
|
// pDbt[0].data = &(pTbCfg->ctbCfg.suid);
|
||||||
pDbt[0].size = sizeof(pTbCfg->ctbCfg.suid);
|
// pDbt[0].size = sizeof(pTbCfg->ctbCfg.suid);
|
||||||
|
|
||||||
// Second key is the first tag
|
// // Second key is the first tag
|
||||||
void *pTagVal = tdGetKVRowValOfCol(pTbCfg->ctbCfg.pTag, (kvRowColIdx(pTbCfg->ctbCfg.pTag))[0].colId);
|
// void *pTagVal = tdGetKVRowValOfCol(pTbCfg->ctbCfg.pTag, (kvRowColIdx(pTbCfg->ctbCfg.pTag))[0].colId);
|
||||||
pDbt[1].data = pTagVal;
|
// pDbt[1].data = pTagVal;
|
||||||
pDbt[1].size = sizeof(int32_t);
|
// pDbt[1].size = sizeof(int32_t);
|
||||||
|
|
||||||
// Set index key
|
// Set index key
|
||||||
memset(pSKey, 0, sizeof(*pSKey));
|
memset(pSKey, 0, sizeof(*pSKey));
|
||||||
|
#if 0
|
||||||
pSKey->flags = DB_DBT_MULTIPLE | DB_DBT_APPMALLOC;
|
pSKey->flags = DB_DBT_MULTIPLE | DB_DBT_APPMALLOC;
|
||||||
pSKey->data = pDbt;
|
pSKey->data = pDbt;
|
||||||
pSKey->size = 2;
|
pSKey->size = 2;
|
||||||
|
#else
|
||||||
|
pSKey->data = &(pTbCfg->ctbCfg.suid);
|
||||||
|
pSKey->size = sizeof(pTbCfg->ctbCfg.suid);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -622,3 +627,60 @@ STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) {
|
||||||
|
|
||||||
return pTSchema;
|
return pTSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SMCtbCursor {
|
||||||
|
DBC * pCur;
|
||||||
|
tb_uid_t suid;
|
||||||
|
};
|
||||||
|
|
||||||
|
SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) {
|
||||||
|
SMCtbCursor *pCtbCur = NULL;
|
||||||
|
SMetaDB * pDB = pMeta->pDB;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
pCtbCur = (SMCtbCursor *)calloc(1, sizeof(*pCtbCur));
|
||||||
|
if (pCtbCur == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCtbCur->suid = uid;
|
||||||
|
ret = pDB->pCtbIdx->cursor(pDB->pCtbIdx, NULL, &(pCtbCur->pCur), 0);
|
||||||
|
if (ret != 0) {
|
||||||
|
free(pCtbCur);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pCtbCur;
|
||||||
|
}
|
||||||
|
|
||||||
|
void metaCloseCtbCurosr(SMCtbCursor *pCtbCur) {
|
||||||
|
if (pCtbCur) {
|
||||||
|
if (pCtbCur->pCur) {
|
||||||
|
pCtbCur->pCur->close(pCtbCur->pCur);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pCtbCur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tb_uid_t metaCtbCursorNext(SMCtbCursor *pCtbCur) {
|
||||||
|
DBT skey = {0};
|
||||||
|
DBT pkey = {0};
|
||||||
|
DBT pval = {0};
|
||||||
|
void * pBuf;
|
||||||
|
STbCfg tbCfg;
|
||||||
|
|
||||||
|
// Set key
|
||||||
|
skey.data = &(pCtbCur->suid);
|
||||||
|
skey.size = sizeof(pCtbCur->suid);
|
||||||
|
|
||||||
|
if (pCtbCur->pCur->pget(pCtbCur->pCur, &skey, &pkey, &pval, DB_NEXT) == 0) {
|
||||||
|
tb_uid_t id = *(tb_uid_t *)pkey.data;
|
||||||
|
assert(id != 0);
|
||||||
|
return id;
|
||||||
|
// metaDecodeTbInfo(pBuf, &tbCfg);
|
||||||
|
// return tbCfg.;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -152,7 +152,7 @@ typedef struct STsdbReadHandle {
|
||||||
typedef struct STableGroupSupporter {
|
typedef struct STableGroupSupporter {
|
||||||
int32_t numOfCols;
|
int32_t numOfCols;
|
||||||
SColIndex* pCols;
|
SColIndex* pCols;
|
||||||
STSchema* pTagSchema;
|
SSchema* pTagSchema;
|
||||||
} STableGroupSupporter;
|
} STableGroupSupporter;
|
||||||
|
|
||||||
static STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList);
|
static STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList);
|
||||||
|
@ -466,7 +466,7 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
|
||||||
return (tsdbReadHandleT)pReadHandle;
|
return (tsdbReadHandleT)pReadHandle;
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
// tsdbCleanupQueryHandle(pTsdbReadHandle);
|
tsdbCleanupQueryHandle(pReadHandle);
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2630,18 +2630,20 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getAllTableList(STable* pSuperTable, SArray* list) {
|
static int32_t getAllTableList(SMeta* pMeta, uint64_t uid, SArray* list) {
|
||||||
SSkipListIterator* iter = NULL;//tSkipListCreateIter(pSuperTable->pIndex);
|
SMCtbCursor* pCur = metaOpenCtbCursor(pMeta, uid);
|
||||||
while (tSkipListIterNext(iter)) {
|
|
||||||
SSkipListNode* pNode = tSkipListIterGet(iter);
|
|
||||||
|
|
||||||
STable* pTable = (STable*) SL_GET_NODE_DATA((SSkipListNode*) pNode);
|
while (1) {
|
||||||
|
tb_uid_t id = metaCtbCursorNext(pCur);
|
||||||
|
if (id == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
STableKeyInfo info = {.pTable = pTable, .lastKey = TSKEY_INITIAL_VAL};
|
STableKeyInfo info = {.pTable = NULL, .lastKey = TSKEY_INITIAL_VAL, uid = id};
|
||||||
taosArrayPush(list, &info);
|
taosArrayPush(list, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
tSkipListDestroyIter(iter);
|
metaCloseCtbCurosr(pCur);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3553,7 +3555,7 @@ void createTableGroupImpl(SArray* pGroups, SArray* pTableList, size_t numOfTable
|
||||||
taosArrayPush(pGroups, &g);
|
taosArrayPush(pGroups, &g);
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* createTableGroup(SArray* pTableList, STSchema* pTagSchema, SColIndex* pCols, int32_t numOfOrderCols, TSKEY skey) {
|
SArray* createTableGroup(SArray* pTableList, SSchemaWrapper* pTagSchema, SColIndex* pCols, int32_t numOfOrderCols, TSKEY skey) {
|
||||||
assert(pTableList != NULL);
|
assert(pTableList != NULL);
|
||||||
SArray* pTableGroup = taosArrayInit(1, POINTER_BYTES);
|
SArray* pTableGroup = taosArrayInit(1, POINTER_BYTES);
|
||||||
|
|
||||||
|
@ -3564,25 +3566,18 @@ SArray* createTableGroup(SArray* pTableList, STSchema* pTagSchema, SColIndex* pC
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfOrderCols == 0 || size == 1) { // no group by tags clause or only one table
|
if (numOfOrderCols == 0 || size == 1) { // no group by tags clause or only one table
|
||||||
SArray* sa = taosArrayInit(size, sizeof(STableKeyInfo));
|
SArray* sa = taosArrayDup(pTableList);
|
||||||
if (sa == NULL) {
|
if (sa == NULL) {
|
||||||
taosArrayDestroy(pTableGroup);
|
taosArrayDestroy(pTableGroup);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int32_t i = 0; i < size; ++i) {
|
|
||||||
STableKeyInfo *pKeyInfo = taosArrayGet(pTableList, i);
|
|
||||||
|
|
||||||
STableKeyInfo info = {.pTable = pKeyInfo->pTable, .lastKey = skey};
|
|
||||||
taosArrayPush(sa, &info);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayPush(pTableGroup, &sa);
|
taosArrayPush(pTableGroup, &sa);
|
||||||
tsdbDebug("all %" PRIzu " tables belong to one group", size);
|
tsdbDebug("all %" PRIzu " tables belong to one group", size);
|
||||||
} else {
|
} else {
|
||||||
STableGroupSupporter sup = {0};
|
STableGroupSupporter sup = {0};
|
||||||
sup.numOfCols = numOfOrderCols;
|
sup.numOfCols = numOfOrderCols;
|
||||||
sup.pTagSchema = pTagSchema;
|
sup.pTagSchema = pTagSchema->pSchema;
|
||||||
sup.pCols = pCols;
|
sup.pCols = pCols;
|
||||||
|
|
||||||
// taosqsort(pTableList->pData, size, sizeof(STableKeyInfo), &sup, tableGroupComparFn);
|
// taosqsort(pTableList->pData, size, sizeof(STableKeyInfo), &sup, tableGroupComparFn);
|
||||||
|
@ -3710,12 +3705,11 @@ int32_t tsdbQuerySTableByTagCond(STsdb* tsdb, uint64_t uid, TSKEY skey, const ch
|
||||||
|
|
||||||
//NOTE: not add ref count for super table
|
//NOTE: not add ref count for super table
|
||||||
SArray* res = taosArrayInit(8, sizeof(STableKeyInfo));
|
SArray* res = taosArrayInit(8, sizeof(STableKeyInfo));
|
||||||
STSchema* pTagSchema = metaGetTableSchema(tsdb->pMeta, uid, 0, true);
|
SSchemaWrapper* pTagSchema = metaGetTableSchema(tsdb->pMeta, uid, 0, true);
|
||||||
|
|
||||||
// no tags and tbname condition, all child tables of this stable are involved
|
// no tags and tbname condition, all child tables of this stable are involved
|
||||||
if (tbnameCond == NULL && (pTagCond == NULL || len == 0)) {
|
if (tbnameCond == NULL && (pTagCond == NULL || len == 0)) {
|
||||||
assert(false);
|
int32_t ret = getAllTableList(tsdb->pMeta, uid, res);
|
||||||
int32_t ret = 0;//getAllTableList(pTable, res);
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -3854,7 +3848,7 @@ int32_t tsdbGetTableGroupFromIdList(STsdb* tsdb, SArray* pTableIdList, STableGro
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
static void* doFreeColumnInfoData(SArray* pColumnInfoData) {
|
static void* doFreeColumnInfoData(SArray* pColumnInfoData) {
|
||||||
if (pColumnInfoData == NULL) {
|
if (pColumnInfoData == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3883,6 +3877,7 @@ static void* destroyTableCheckInfo(SArray* pTableCheckInfo) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
|
void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
|
||||||
STsdbReadHandle* pTsdbReadHandle = (STsdbReadHandle*)queryHandle;
|
STsdbReadHandle* pTsdbReadHandle = (STsdbReadHandle*)queryHandle;
|
||||||
if (pTsdbReadHandle == NULL) {
|
if (pTsdbReadHandle == NULL) {
|
||||||
|
@ -3921,6 +3916,7 @@ void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
|
||||||
tfree(pTsdbReadHandle);
|
tfree(pTsdbReadHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
void tsdbDestroyTableGroup(STableGroupInfo *pGroupList) {
|
void tsdbDestroyTableGroup(STableGroupInfo *pGroupList) {
|
||||||
assert(pGroupList != NULL);
|
assert(pGroupList != NULL);
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ struct SUdfInfo;
|
||||||
|
|
||||||
int32_t getOutputInterResultBufSize(struct STaskAttr* pQueryAttr);
|
int32_t getOutputInterResultBufSize(struct STaskAttr* pQueryAttr);
|
||||||
|
|
||||||
size_t getResultRowSize(struct STaskRuntimeEnv* pRuntimeEnv);
|
size_t getResultRowSize(SArray* pExprInfo);
|
||||||
int32_t initResultRowInfo(SResultRowInfo* pResultRowInfo, int32_t size, int16_t type);
|
int32_t initResultRowInfo(SResultRowInfo* pResultRowInfo, int32_t size, int16_t type);
|
||||||
void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo);
|
void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo);
|
||||||
|
|
||||||
|
|
|
@ -375,9 +375,12 @@ typedef struct STaskParam {
|
||||||
} STaskParam;
|
} STaskParam;
|
||||||
|
|
||||||
typedef struct SExchangeInfo {
|
typedef struct SExchangeInfo {
|
||||||
int32_t numOfSources;
|
SArray *pSources;
|
||||||
SEpSet *pEpset;
|
|
||||||
int32_t bytes; // total load bytes from remote
|
int32_t bytes; // total load bytes from remote
|
||||||
|
tsem_t ready;
|
||||||
|
void *pTransporter;
|
||||||
|
SRetrieveTableRsp *pRsp;
|
||||||
|
SSDataBlock *pResult;
|
||||||
} SExchangeInfo;
|
} SExchangeInfo;
|
||||||
|
|
||||||
typedef struct STableScanInfo {
|
typedef struct STableScanInfo {
|
||||||
|
@ -411,11 +414,16 @@ typedef struct STagScanInfo {
|
||||||
int32_t curPos;
|
int32_t curPos;
|
||||||
} STagScanInfo;
|
} STagScanInfo;
|
||||||
|
|
||||||
|
typedef struct SStreamBlockScanInfo {
|
||||||
|
|
||||||
|
} SStreamBlockScanInfo;
|
||||||
|
|
||||||
typedef struct SOptrBasicInfo {
|
typedef struct SOptrBasicInfo {
|
||||||
SResultRowInfo resultRowInfo;
|
SResultRowInfo resultRowInfo;
|
||||||
int32_t *rowCellInfoOffset; // offset value for each row result cell info
|
int32_t *rowCellInfoOffset; // offset value for each row result cell info
|
||||||
SQLFunctionCtx *pCtx;
|
SQLFunctionCtx *pCtx;
|
||||||
SSDataBlock *pRes;
|
SSDataBlock *pRes;
|
||||||
|
void *keyBuf;
|
||||||
} SOptrBasicInfo;
|
} SOptrBasicInfo;
|
||||||
|
|
||||||
typedef struct SOptrBasicInfo STableIntervalOperatorInfo;
|
typedef struct SOptrBasicInfo STableIntervalOperatorInfo;
|
||||||
|
@ -423,6 +431,13 @@ typedef struct SOptrBasicInfo STableIntervalOperatorInfo;
|
||||||
typedef struct SAggOperatorInfo {
|
typedef struct SAggOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
uint32_t seed;
|
uint32_t seed;
|
||||||
|
SDiskbasedResultBuf *pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
|
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
||||||
|
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
||||||
|
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
||||||
|
char* keyBuf; // window key buffer
|
||||||
|
SResultRowPool* pool; // The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
||||||
|
STableQueryInfo *current;
|
||||||
} SAggOperatorInfo;
|
} SAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct SProjectOperatorInfo {
|
typedef struct SProjectOperatorInfo {
|
||||||
|
@ -543,15 +558,14 @@ typedef struct SOrderOperatorInfo {
|
||||||
SSDataBlock *pDataBlock;
|
SSDataBlock *pDataBlock;
|
||||||
} SOrderOperatorInfo;
|
} SOrderOperatorInfo;
|
||||||
|
|
||||||
void appendUpstream(SOperatorInfo* p, SOperatorInfo* pUpstream);
|
SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray* pSchema, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createExchangeOperatorInfo(const SVgroupInfo* pVgroups, int32_t numOfSources, int32_t numOfOutput, SExecTaskInfo* pTaskInfo);
|
|
||||||
|
|
||||||
SOperatorInfo* createDataBlocksOptScanInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createDataBlocksOptScanInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableSeqScanOperator(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
SOperatorInfo* createTableSeqScanOperator(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
||||||
|
SOperatorInfo* createSubmitBlockScanOperatorInfo(void *pSubmitBlockReadHandle, int32_t numOfOutput, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput);
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createProjectOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput);
|
SOperatorInfo* createProjectOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
||||||
SOperatorInfo* createTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput);
|
SOperatorInfo* createTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
|
|
@ -168,16 +168,14 @@ void clearResultRow(STaskRuntimeEnv *pRuntimeEnv, SResultRow *pResultRow, int16_
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO refactor: use macro
|
// TODO refactor: use macro
|
||||||
struct SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset) {
|
SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset) {
|
||||||
assert(index >= 0 && offset != NULL);
|
assert(index >= 0 && offset != NULL);
|
||||||
// return (SResultRowEntryInfo*)((char*) pRow->pCellInfo + offset[index]);
|
return (SResultRowEntryInfo*)((char*) pRow->pEntryInfo + offset[index]);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getResultRowSize(STaskRuntimeEnv* pRuntimeEnv) {
|
size_t getResultRowSize(SArray* pExprInfo) {
|
||||||
STaskAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
size_t numOfOutput = taosArrayGetSize(pExprInfo);
|
||||||
return 0;
|
return (numOfOutput * sizeof(SResultRowEntryInfo)) + /*pQueryAttr->interBufSize +*/ sizeof(SResultRow);
|
||||||
// return (pQueryAttr->numOfOutput * sizeof(SResultRowEntryInfo)) + pQueryAttr->interBufSize + sizeof(SResultRow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size) {
|
SResultRowPool* initResultRowPool(size_t size) {
|
||||||
|
|
|
@ -13,10 +13,11 @@
|
||||||
* 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 "os.h"
|
#include <tsdb.h>
|
||||||
#include "tarray.h"
|
|
||||||
#include "dataSinkMgt.h"
|
#include "dataSinkMgt.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
#include "os.h"
|
||||||
|
#include "tarray.h"
|
||||||
#include "tcache.h"
|
#include "tcache.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
@ -141,6 +142,11 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
int64_t threadId = taosGetSelfPthreadId();
|
int64_t threadId = taosGetSelfPthreadId();
|
||||||
|
|
||||||
|
// todo: remove it.
|
||||||
|
if (tinfo == NULL) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
*pRes = NULL;
|
*pRes = NULL;
|
||||||
|
|
||||||
int64_t curOwner = 0;
|
int64_t curOwner = 0;
|
||||||
|
|
|
@ -12,11 +12,12 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "os.h"
|
#include <parser.h>
|
||||||
#include "tmsg.h"
|
|
||||||
#include "tglobal.h"
|
|
||||||
#include "ttime.h"
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
#include "os.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
#include "executorimpl.h"
|
#include "executorimpl.h"
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
|
@ -176,7 +177,7 @@ static void setResultOutputBuf(STaskRuntimeEnv* pRuntimeEnv, SResultRow* pResult
|
||||||
void setResultRowOutputBufInitCtx(STaskRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowCellInfoOffset);
|
void setResultRowOutputBufInitCtx(STaskRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowCellInfoOffset);
|
||||||
static bool functionNeedToExecute(STaskRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx);
|
static bool functionNeedToExecute(STaskRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx);
|
||||||
|
|
||||||
static void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColIndex* pColIndex);
|
static void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColumn* pColumn);
|
||||||
|
|
||||||
static void destroyTableQueryInfoImpl(STableQueryInfo *pTableQueryInfo);
|
static void destroyTableQueryInfoImpl(STableQueryInfo *pTableQueryInfo);
|
||||||
static bool hasMainOutput(STaskAttr *pQueryAttr);
|
static bool hasMainOutput(STaskAttr *pQueryAttr);
|
||||||
|
@ -309,6 +310,31 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSDataBlock* createOutputBuf_rv(SArray* pExprInfo, int32_t numOfRows) {
|
||||||
|
const static int32_t minSize = 8;
|
||||||
|
|
||||||
|
size_t numOfOutput = taosArrayGetSize(pExprInfo);
|
||||||
|
|
||||||
|
SSDataBlock *res = calloc(1, sizeof(SSDataBlock));
|
||||||
|
res->info.numOfCols = numOfOutput;
|
||||||
|
res->pDataBlock = taosArrayInit(numOfOutput, sizeof(SColumnInfoData));
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
|
SColumnInfoData idata = {{0}};
|
||||||
|
SExprInfo* pExpr = taosArrayGetP(pExprInfo, i);
|
||||||
|
|
||||||
|
idata.info.type = pExpr->base.resSchema.type;
|
||||||
|
idata.info.bytes = pExpr->base.resSchema.bytes;
|
||||||
|
idata.info.colId = pExpr->base.resSchema.colId;
|
||||||
|
|
||||||
|
int32_t size = MAX(idata.info.bytes * numOfRows, minSize);
|
||||||
|
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void* destroyOutputBuf(SSDataBlock* pBlock) {
|
void* destroyOutputBuf(SSDataBlock* pBlock) {
|
||||||
if (pBlock == NULL) {
|
if (pBlock == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -357,8 +383,8 @@ static bool isProjQuery(STaskAttr *pQueryAttr) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasNull(SColIndex* pColIndex, SColumnDataAgg *pStatis) {
|
static bool hasNull(SColumn* pColumn, SColumnDataAgg *pStatis) {
|
||||||
if (TSDB_COL_IS_TAG(pColIndex->flag) || TSDB_COL_IS_UD_COL(pColIndex->flag) || pColIndex->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (TSDB_COL_IS_TAG(pColumn->flag) || TSDB_COL_IS_UD_COL(pColumn->flag) || pColumn->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +395,7 @@ static bool hasNull(SColIndex* pColIndex, SColumnDataAgg *pStatis) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepareResultListBuffer(SResultRowInfo* pResultRowInfo, STaskRuntimeEnv* pRuntimeEnv) {
|
static void prepareResultListBuffer(SResultRowInfo* pResultRowInfo, jmp_buf env) {
|
||||||
// more than the capacity, reallocate the resources
|
// more than the capacity, reallocate the resources
|
||||||
if (pResultRowInfo->size < pResultRowInfo->capacity) {
|
if (pResultRowInfo->size < pResultRowInfo->capacity) {
|
||||||
return;
|
return;
|
||||||
|
@ -384,7 +410,7 @@ static void prepareResultListBuffer(SResultRowInfo* pResultRowInfo, STaskRuntime
|
||||||
|
|
||||||
char *t = realloc(pResultRowInfo->pResult, (size_t)(newCapacity * POINTER_BYTES));
|
char *t = realloc(pResultRowInfo->pResult, (size_t)(newCapacity * POINTER_BYTES));
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pResultRowInfo->pResult = (SResultRow **)t;
|
pResultRowInfo->pResult = (SResultRow **)t;
|
||||||
|
@ -473,7 +499,7 @@ static SResultRow* doSetResultOutBufByKey(STaskRuntimeEnv* pRuntimeEnv, SResultR
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!existed) {
|
if (!existed) {
|
||||||
prepareResultListBuffer(pResultRowInfo, pRuntimeEnv);
|
// prepareResultListBuffer(pResultRowInfo, pRuntimeEnv);
|
||||||
|
|
||||||
SResultRow *pResult = NULL;
|
SResultRow *pResult = NULL;
|
||||||
if (p1 == NULL) {
|
if (p1 == NULL) {
|
||||||
|
@ -507,6 +533,80 @@ static SResultRow* doSetResultOutBufByKey(STaskRuntimeEnv* pRuntimeEnv, SResultR
|
||||||
return pResultRowInfo->pResult[pResultRowInfo->curPos];
|
return pResultRowInfo->pResult[pResultRowInfo->curPos];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SResultRow* doSetResultOutBufByKey_rv(SResultRowInfo* pResultRowInfo, int64_t tid, char* pData, int16_t bytes,
|
||||||
|
bool masterscan, uint64_t tableGroupId, SExecTaskInfo* pTaskInfo, bool isIntervalQuery, SAggOperatorInfo* pAggInfo) {
|
||||||
|
bool existed = false;
|
||||||
|
SET_RES_WINDOW_KEY(pAggInfo->keyBuf, pData, bytes, tableGroupId);
|
||||||
|
|
||||||
|
SResultRow **p1 =
|
||||||
|
(SResultRow **)taosHashGet(pAggInfo->pResultRowHashTable, pAggInfo->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
||||||
|
|
||||||
|
// in case of repeat scan/reverse scan, no new time window added.
|
||||||
|
if (isIntervalQuery) {
|
||||||
|
if (!masterscan) { // the *p1 may be NULL in case of sliding+offset exists.
|
||||||
|
return (p1 != NULL)? *p1:NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p1 != NULL) {
|
||||||
|
if (pResultRowInfo->size == 0) {
|
||||||
|
existed = false;
|
||||||
|
assert(pResultRowInfo->curPos == -1);
|
||||||
|
} else if (pResultRowInfo->size == 1) {
|
||||||
|
existed = (pResultRowInfo->pResult[0] == (*p1));
|
||||||
|
pResultRowInfo->curPos = 0;
|
||||||
|
} else { // check if current pResultRowInfo contains the existed pResultRow
|
||||||
|
SET_RES_EXT_WINDOW_KEY(pAggInfo->keyBuf, pData, bytes, tid, pResultRowInfo);
|
||||||
|
int64_t* index = taosHashGet(pAggInfo->pResultRowListSet, pAggInfo->keyBuf, GET_RES_EXT_WINDOW_KEY_LEN(bytes));
|
||||||
|
if (index != NULL) {
|
||||||
|
pResultRowInfo->curPos = (int32_t) *index;
|
||||||
|
existed = true;
|
||||||
|
} else {
|
||||||
|
existed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// In case of group by column query, the required SResultRow object must be existed in the pResultRowInfo object.
|
||||||
|
if (p1 != NULL) {
|
||||||
|
return *p1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!existed) {
|
||||||
|
prepareResultListBuffer(pResultRowInfo, pTaskInfo->env);
|
||||||
|
|
||||||
|
SResultRow *pResult = NULL;
|
||||||
|
if (p1 == NULL) {
|
||||||
|
pResult = getNewResultRow(pAggInfo->pool);
|
||||||
|
int32_t ret = initResultRow(pResult);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new result set for a new group
|
||||||
|
taosHashPut(pAggInfo->pResultRowHashTable, pAggInfo->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &pResult, POINTER_BYTES);
|
||||||
|
SResultRowCell cell = {.groupId = tableGroupId, .pRow = pResult};
|
||||||
|
taosArrayPush(pAggInfo->pResultRowArrayList, &cell);
|
||||||
|
} else {
|
||||||
|
pResult = *p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pResultRowInfo->curPos = pResultRowInfo->size;
|
||||||
|
pResultRowInfo->pResult[pResultRowInfo->size++] = pResult;
|
||||||
|
|
||||||
|
int64_t index = pResultRowInfo->curPos;
|
||||||
|
SET_RES_EXT_WINDOW_KEY(pAggInfo->keyBuf, pData, bytes, tid, pResultRowInfo);
|
||||||
|
taosHashPut(pAggInfo->pResultRowListSet, pAggInfo->keyBuf, GET_RES_EXT_WINDOW_KEY_LEN(bytes), &index, POINTER_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
// too many time window in query
|
||||||
|
if (pResultRowInfo->size > MAX_INTERVAL_TIME_WINDOW) {
|
||||||
|
longjmp(pTaskInfo->env, TSDB_CODE_QRY_TOO_MANY_TIMEWINDOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pResultRowInfo->pResult[pResultRowInfo->curPos];
|
||||||
|
}
|
||||||
|
|
||||||
static void getInitialStartTimeWindow(STaskAttr* pQueryAttr, TSKEY ts, STimeWindow* w) {
|
static void getInitialStartTimeWindow(STaskAttr* pQueryAttr, TSKEY ts, STimeWindow* w) {
|
||||||
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
||||||
getAlignQueryTimeWindow(pQueryAttr, ts, ts, pQueryAttr->window.ekey, w);
|
getAlignQueryTimeWindow(pQueryAttr, ts, ts, pQueryAttr->window.ekey, w);
|
||||||
|
@ -1023,43 +1123,52 @@ static void doSetInputDataBlockInfo(SOperatorInfo* pOperator, SQLFunctionCtx* pC
|
||||||
}
|
}
|
||||||
|
|
||||||
void setInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order) {
|
void setInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order) {
|
||||||
if (pCtx[0].functionId == FUNCTION_ARITHM) {
|
// if (pCtx[0].functionId == FUNCTION_ARITHM) {
|
||||||
// SScalar* pSupport = (SScalarFunctionSupport*) pCtx[0].param[1].pz;
|
// SScalar* pSupport = (SScalarFunctionSupport*) pCtx[0].param[1].pz;
|
||||||
// if (pSupport->colList == NULL) {
|
// if (pSupport->colList == NULL) {
|
||||||
// doSetInputDataBlock(pOperator, pCtx, pBlock, order);
|
// doSetInputDataBlock(pOperator, pCtx, pBlock, order);
|
||||||
// } else {
|
// } else {
|
||||||
// doSetInputDataBlockInfo(pOperator, pCtx, pBlock, order);
|
// doSetInputDataBlockInfo(pOperator, pCtx, pBlock, order);
|
||||||
// }
|
// }
|
||||||
} else {
|
// } else {
|
||||||
if (pBlock->pDataBlock != NULL) {
|
if (pBlock->pDataBlock != NULL) {
|
||||||
doSetInputDataBlock(pOperator, pCtx, pBlock, order);
|
doSetInputDataBlock(pOperator, pCtx, pBlock, order);
|
||||||
} else {
|
} else {
|
||||||
doSetInputDataBlockInfo(pOperator, pCtx, pBlock, order);
|
doSetInputDataBlockInfo(pOperator, pCtx, pBlock, order);
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order) {
|
static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order) {
|
||||||
#if 0
|
|
||||||
for (int32_t i = 0; i < pOperator->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pOperator->numOfOutput; ++i) {
|
||||||
pCtx[i].order = order;
|
pCtx[i].order = order;
|
||||||
pCtx[i].size = pBlock->info.rows;
|
pCtx[i].size = pBlock->info.rows;
|
||||||
pCtx[i].currentStage = (uint8_t)pOperator->pRuntimeEnv->scanFlag;
|
pCtx[i].currentStage = MAIN_SCAN/*(uint8_t)pOperator->pRuntimeEnv->scanFlag*/;
|
||||||
|
|
||||||
setBlockStatisInfo(&pCtx[i], pBlock, &pOperator->pExpr[i].base.colInfo);
|
setBlockStatisInfo(&pCtx[i], pBlock, pOperator->pExpr[i].base.pColumns);
|
||||||
|
|
||||||
if (pCtx[i].functionId == FUNCTION_ARITHM) {
|
if (pCtx[i].functionId == FUNCTION_ARITHM) {
|
||||||
// setArithParams((SScalarFunctionSupport*)pCtx[i].param[1].pz, &pOperator->pExpr[i], pBlock);
|
// setArithParams((SScalarFunctionSupport*)pCtx[i].param[1].pz, &pOperator->pExpr[i], pBlock);
|
||||||
} else {
|
} else {
|
||||||
SColIndex* pCol = &pOperator->pExpr[i].base.pColumns->info.;
|
uint32_t flag = pOperator->pExpr[i].base.pColumns->flag;
|
||||||
if (TSDB_COL_IS_NORMAL_COL(pCol->flag) || (pCtx[i].functionId == FUNCTION_BLKINFO) ||
|
if (TSDB_COL_IS_NORMAL_COL(flag) /*|| (pCtx[i].functionId == FUNCTION_BLKINFO) ||
|
||||||
(TSDB_COL_IS_TAG(pCol->flag) && pOperator->pRuntimeEnv->scanFlag == MERGE_STAGE)) {
|
(TSDB_COL_IS_TAG(flag) && pOperator->pRuntimeEnv->scanFlag == MERGE_STAGE)*/) {
|
||||||
SColIndex* pColIndex = &pOperator->pExpr[i].base.colInfo;
|
|
||||||
SColumnInfoData* p = taosArrayGet(pBlock->pDataBlock, pColIndex->colIndex);
|
|
||||||
|
|
||||||
|
SColumn* pCol = pOperator->pExpr[i].base.pColumns;
|
||||||
|
if (pCtx[i].columnIndex == -1) {
|
||||||
|
for(int32_t j = 0; j < pBlock->info.numOfCols; ++j) {
|
||||||
|
SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, j);
|
||||||
|
if (pColData->info.colId == pCol->info.colId) {
|
||||||
|
pCtx[i].columnIndex = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SColumnInfoData* p = taosArrayGet(pBlock->pDataBlock, pCtx[i].columnIndex);
|
||||||
// in case of the block distribution query, the inputBytes is not a constant value.
|
// in case of the block distribution query, the inputBytes is not a constant value.
|
||||||
pCtx[i].pInput = p->pData;
|
pCtx[i].pInput = p->pData;
|
||||||
assert(p->info.colId == pColIndex->info.colId && pCtx[i].inputType == p->info.type);
|
assert(p->info.colId == pCol->info.colId);
|
||||||
|
|
||||||
if (pCtx[i].functionId < 0) {
|
if (pCtx[i].functionId < 0) {
|
||||||
SColumnInfoData* tsInfo = taosArrayGet(pBlock->pDataBlock, 0);
|
SColumnInfoData* tsInfo = taosArrayGet(pBlock->pDataBlock, 0);
|
||||||
|
@ -1070,37 +1179,33 @@ static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx,
|
||||||
|
|
||||||
// uint32_t status = aAggs[pCtx[i].functionId].status;
|
// uint32_t status = aAggs[pCtx[i].functionId].status;
|
||||||
// if ((status & (FUNCSTATE_SELECTIVITY | FUNCSTATE_NEED_TS)) != 0) {
|
// if ((status & (FUNCSTATE_SELECTIVITY | FUNCSTATE_NEED_TS)) != 0) {
|
||||||
// SColumnInfoData* tsInfo = taosArrayGet(pBlock->pDataBlock, 0);
|
SColumnInfoData* tsInfo = taosArrayGet(pBlock->pDataBlock, 0);
|
||||||
// // In case of the top/bottom query again the nest query result, which has no timestamp column
|
// In case of the top/bottom query again the nest query result, which has no timestamp column
|
||||||
// // don't set the ptsList attribute.
|
// don't set the ptsList attribute.
|
||||||
// if (tsInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (tsInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
// pCtx[i].ptsList = (int64_t*) tsInfo->pData;
|
pCtx[i].ptsList = (int64_t*) tsInfo->pData;
|
||||||
// } else {
|
} else {
|
||||||
// pCtx[i].ptsList = NULL;
|
pCtx[i].ptsList = NULL;
|
||||||
|
}
|
||||||
// }
|
// }
|
||||||
|
// } else if (TSDB_COL_IS_UD_COL(pCol->flag) && (pOperator->pRuntimeEnv->scanFlag == MERGE_STAGE)) {
|
||||||
|
// SColIndex* pColIndex = &pOperator->pExpr[i].base.colInfo;
|
||||||
|
// SColumnInfoData* p = taosArrayGet(pBlock->pDataBlock, pColIndex->colIndex);
|
||||||
|
//
|
||||||
|
// pCtx[i].pInput = p->pData;
|
||||||
|
// assert(p->info.colId == pColIndex->info.colId && pCtx[i].inputType == p->info.type);
|
||||||
|
// for(int32_t j = 0; j < pBlock->info.rows; ++j) {
|
||||||
|
// char* dst = p->pData + j * p->info.bytes;
|
||||||
|
// taosVariantDump(&pOperator->pExpr[i].base.param[1], dst, p->info.type, true);
|
||||||
// }
|
// }
|
||||||
} else if (TSDB_COL_IS_UD_COL(pCol->flag) && (pOperator->pRuntimeEnv->scanFlag == MERGE_STAGE)) {
|
|
||||||
SColIndex* pColIndex = &pOperator->pExpr[i].base.colInfo;
|
|
||||||
SColumnInfoData* p = taosArrayGet(pBlock->pDataBlock, pColIndex->colIndex);
|
|
||||||
|
|
||||||
pCtx[i].pInput = p->pData;
|
|
||||||
assert(p->info.colId == pColIndex->info.colId && pCtx[i].inputType == p->info.type);
|
|
||||||
for(int32_t j = 0; j < pBlock->info.rows; ++j) {
|
|
||||||
char* dst = p->pData + j * p->info.bytes;
|
|
||||||
taosVariantDump(&pOperator->pExpr[i].base.param[1], dst, p->info.type, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doAggregateImpl(SOperatorInfo* pOperator, TSKEY startTs, SQLFunctionCtx* pCtx, SSDataBlock* pSDataBlock) {
|
static void doAggregateImpl(SOperatorInfo* pOperator, TSKEY startTs, SQLFunctionCtx* pCtx, SSDataBlock* pSDataBlock) {
|
||||||
STaskRuntimeEnv* pRuntimeEnv = pOperator->pRuntimeEnv;
|
|
||||||
|
|
||||||
for (int32_t k = 0; k < pOperator->numOfOutput; ++k) {
|
for (int32_t k = 0; k < pOperator->numOfOutput; ++k) {
|
||||||
if (functionNeedToExecute(pRuntimeEnv, &pCtx[k])) {
|
if (functionNeedToExecute(NULL, &pCtx[k])) {
|
||||||
pCtx[k].startTs = startTs;// this can be set during create the struct
|
pCtx[k].startTs = startTs;// this can be set during create the struct
|
||||||
pCtx[k].fpSet->addInput(&pCtx[k]);
|
pCtx[k].fpSet->addInput(&pCtx[k]);
|
||||||
}
|
}
|
||||||
|
@ -1719,7 +1824,6 @@ static int32_t getGroupbyColumnIndex(SGroupbyExpr *pGroupbyExpr, SSDataBlock* pD
|
||||||
|
|
||||||
static bool functionNeedToExecute(STaskRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx) {
|
static bool functionNeedToExecute(STaskRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx) {
|
||||||
struct SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
struct SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STaskAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
|
||||||
|
|
||||||
// in case of timestamp column, always generated results.
|
// in case of timestamp column, always generated results.
|
||||||
int32_t functionId = pCtx->functionId;
|
int32_t functionId = pCtx->functionId;
|
||||||
|
@ -1732,28 +1836,28 @@ static bool functionNeedToExecute(STaskRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *
|
||||||
}
|
}
|
||||||
|
|
||||||
if (functionId == FUNCTION_FIRST_DST || functionId == FUNCTION_FIRST) {
|
if (functionId == FUNCTION_FIRST_DST || functionId == FUNCTION_FIRST) {
|
||||||
return QUERY_IS_ASC_QUERY(pQueryAttr);
|
// return QUERY_IS_ASC_QUERY(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// denote the order type
|
// denote the order type
|
||||||
if ((functionId == FUNCTION_LAST_DST || functionId == FUNCTION_LAST)) {
|
if ((functionId == FUNCTION_LAST_DST || functionId == FUNCTION_LAST)) {
|
||||||
return pCtx->param[0].i == pQueryAttr->order.order;
|
// return pCtx->param[0].i == pQueryAttr->order.order;
|
||||||
}
|
}
|
||||||
|
|
||||||
// in the reverse table scan, only the following functions need to be executed
|
// in the reverse table scan, only the following functions need to be executed
|
||||||
if (IS_REVERSE_SCAN(pRuntimeEnv) ||
|
// if (IS_REVERSE_SCAN(pRuntimeEnv) ||
|
||||||
(pRuntimeEnv->scanFlag == REPEAT_SCAN && functionId != FUNCTION_STDDEV && functionId != FUNCTION_PERCT)) {
|
// (pRuntimeEnv->scanFlag == REPEAT_SCAN && functionId != FUNCTION_STDDEV && functionId != FUNCTION_PERCT)) {
|
||||||
return false;
|
// return false;
|
||||||
}
|
// }
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColIndex* pColIndex) {
|
void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColumn* pColumn) {
|
||||||
SColumnDataAgg *pAgg = NULL;
|
SColumnDataAgg *pAgg = NULL;
|
||||||
|
|
||||||
if (pSDataBlock->pBlockAgg != NULL && TSDB_COL_IS_NORMAL_COL(pColIndex->flag)) {
|
if (pSDataBlock->pBlockAgg != NULL && TSDB_COL_IS_NORMAL_COL(pColumn->flag)) {
|
||||||
pAgg = &pSDataBlock->pBlockAgg[pColIndex->colIndex];
|
pAgg = &pSDataBlock->pBlockAgg[pCtx->columnIndex];
|
||||||
|
|
||||||
pCtx->agg = *pAgg;
|
pCtx->agg = *pAgg;
|
||||||
pCtx->isAggSet = true;
|
pCtx->isAggSet = true;
|
||||||
|
@ -1762,10 +1866,10 @@ void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColInde
|
||||||
pCtx->isAggSet = false;
|
pCtx->isAggSet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->hasNull = hasNull(pColIndex, pAgg);
|
pCtx->hasNull = hasNull(pColumn, pAgg);
|
||||||
|
|
||||||
// set the statistics data for primary time stamp column
|
// set the statistics data for primary time stamp column
|
||||||
if (pCtx->functionId == FUNCTION_SPREAD && pColIndex->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pCtx->functionId == FUNCTION_SPREAD && pColumn->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
pCtx->isAggSet = true;
|
pCtx->isAggSet = true;
|
||||||
pCtx->agg.min = pSDataBlock->info.window.skey;
|
pCtx->agg.min = pSDataBlock->info.window.skey;
|
||||||
pCtx->agg.max = pSDataBlock->info.window.ekey;
|
pCtx->agg.max = pSDataBlock->info.window.ekey;
|
||||||
|
@ -1918,7 +2022,9 @@ static SQLFunctionCtx* createSqlFunctionCtx(STaskRuntimeEnv* pRuntimeEnv, SExprI
|
||||||
return pFuncCtx;
|
return pFuncCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SQLFunctionCtx* createSqlFunctionCtx_rv(SExprInfo* pExpr, int32_t numOfOutput, int32_t** rowCellInfoOffset) {
|
static SQLFunctionCtx* createSqlFunctionCtx_rv(SArray* pExprInfo, int32_t** rowCellInfoOffset) {
|
||||||
|
size_t numOfOutput = taosArrayGetSize(pExprInfo);
|
||||||
|
|
||||||
SQLFunctionCtx * pFuncCtx = (SQLFunctionCtx *)calloc(numOfOutput, sizeof(SQLFunctionCtx));
|
SQLFunctionCtx * pFuncCtx = (SQLFunctionCtx *)calloc(numOfOutput, sizeof(SQLFunctionCtx));
|
||||||
if (pFuncCtx == NULL) {
|
if (pFuncCtx == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1931,8 +2037,11 @@ static SQLFunctionCtx* createSqlFunctionCtx_rv(SExprInfo* pExpr, int32_t numOfOu
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfOutput; ++i) {
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
SSqlExpr *pSqlExpr = &pExpr[i].base;
|
SExprInfo* pExpr = taosArrayGetP(pExprInfo, i);
|
||||||
|
|
||||||
|
SSqlExpr *pSqlExpr = &pExpr->base;
|
||||||
SQLFunctionCtx* pCtx = &pFuncCtx[i];
|
SQLFunctionCtx* pCtx = &pFuncCtx[i];
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
SColIndex *pIndex = &pSqlExpr->colInfo;
|
SColIndex *pIndex = &pSqlExpr->colInfo;
|
||||||
|
|
||||||
|
@ -1943,15 +2052,16 @@ static SQLFunctionCtx* createSqlFunctionCtx_rv(SExprInfo* pExpr, int32_t numOfOu
|
||||||
pCtx->requireNull = false;
|
pCtx->requireNull = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// pCtx->inputBytes = pSqlExpr->colBytes;
|
// pCtx->inputBytes = pSqlExpr->;
|
||||||
// pCtx->inputType = pSqlExpr->colType;
|
// pCtx->inputType = pSqlExpr->colType;
|
||||||
|
|
||||||
pCtx->ptsOutputBuf = NULL;
|
pCtx->ptsOutputBuf = NULL;
|
||||||
|
pCtx->fpSet = fpSet;
|
||||||
|
pCtx->columnIndex = -1;
|
||||||
pCtx->resDataInfo.bytes = pSqlExpr->resSchema.bytes;
|
pCtx->resDataInfo.bytes = pSqlExpr->resSchema.bytes;
|
||||||
pCtx->resDataInfo.type = pSqlExpr->resSchema.type;
|
pCtx->resDataInfo.type = pSqlExpr->resSchema.type;
|
||||||
|
|
||||||
// pCtx->order = pQueryAttr->order.order;
|
pCtx->order = TSDB_ORDER_ASC;
|
||||||
// pCtx->functionId = pSqlExpr->functionId;
|
// pCtx->functionId = pSqlExpr->functionId;
|
||||||
// pCtx->stableQuery = pQueryAttr->stableQuery;
|
// pCtx->stableQuery = pQueryAttr->stableQuery;
|
||||||
pCtx->resDataInfo.intermediateBytes = pSqlExpr->interBytes;
|
pCtx->resDataInfo.intermediateBytes = pSqlExpr->interBytes;
|
||||||
|
@ -2007,12 +2117,12 @@ static SQLFunctionCtx* createSqlFunctionCtx_rv(SExprInfo* pExpr, int32_t numOfOu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for(int32_t i = 1; i < numOfOutput; ++i) {
|
for(int32_t i = 1; i < numOfOutput; ++i) {
|
||||||
// (*rowCellInfoOffset)[i] = (int32_t)((*rowCellInfoOffset)[i - 1] + sizeof(SResultRowEntryInfo) + pExpr[i - 1].base.interBytes);
|
SExprInfo* pExpr = taosArrayGetP(pExprInfo, i - 1);
|
||||||
// }
|
(*rowCellInfoOffset)[i] = (int32_t)((*rowCellInfoOffset)[i - 1] + sizeof(SResultRowEntryInfo) + pExpr->base.interBytes);
|
||||||
|
}
|
||||||
|
|
||||||
setCtxTagColumnInfo(pFuncCtx, numOfOutput);
|
setCtxTagColumnInfo(pFuncCtx, numOfOutput);
|
||||||
|
|
||||||
return pFuncCtx;
|
return pFuncCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2044,7 +2154,7 @@ static int32_t setupQueryRuntimeEnv(STaskRuntimeEnv *pRuntimeEnv, int32_t numOfT
|
||||||
pRuntimeEnv->pResultRowHashTable = taosHashInit(numOfTables, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
pRuntimeEnv->pResultRowHashTable = taosHashInit(numOfTables, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
pRuntimeEnv->pResultRowListSet = taosHashInit(numOfTables * 10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
pRuntimeEnv->pResultRowListSet = taosHashInit(numOfTables * 10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
pRuntimeEnv->keyBuf = malloc(pQueryAttr->maxTableColumnWidth + sizeof(int64_t) + POINTER_BYTES);
|
pRuntimeEnv->keyBuf = malloc(pQueryAttr->maxTableColumnWidth + sizeof(int64_t) + POINTER_BYTES);
|
||||||
pRuntimeEnv->pool = initResultRowPool(getResultRowSize(pRuntimeEnv));
|
// pRuntimeEnv->pool = initResultRowPool(getResultRowSize(pRuntimeEnv));
|
||||||
pRuntimeEnv->pResultRowArrayList = taosArrayInit(numOfTables, sizeof(SResultRowCell));
|
pRuntimeEnv->pResultRowArrayList = taosArrayInit(numOfTables, sizeof(SResultRowCell));
|
||||||
|
|
||||||
pRuntimeEnv->prevRow = malloc(POINTER_BYTES * pQueryAttr->numOfCols + pQueryAttr->srcRowSize);
|
pRuntimeEnv->prevRow = malloc(POINTER_BYTES * pQueryAttr->numOfCols + pQueryAttr->srcRowSize);
|
||||||
|
@ -3457,6 +3567,43 @@ void setDefaultOutputBuf(STaskRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo, in
|
||||||
initCtxOutputBuffer(pCtx, pDataBlock->info.numOfCols);
|
initCtxOutputBuffer(pCtx, pDataBlock->info.numOfCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDefaultOutputBuf_rv(SAggOperatorInfo* pAggInfo, int64_t uid, int32_t stage, SExecTaskInfo* pTaskInfo) {
|
||||||
|
SOptrBasicInfo *pInfo = &pAggInfo->binfo;
|
||||||
|
|
||||||
|
SQLFunctionCtx* pCtx = pInfo->pCtx;
|
||||||
|
SSDataBlock* pDataBlock = pInfo->pRes;
|
||||||
|
int32_t* rowCellInfoOffset = pInfo->rowCellInfoOffset;
|
||||||
|
SResultRowInfo* pResultRowInfo = &pInfo->resultRowInfo;
|
||||||
|
|
||||||
|
int64_t tid = 0;
|
||||||
|
pInfo->keyBuf = realloc(pInfo->keyBuf, sizeof(tid) + sizeof(int64_t) + POINTER_BYTES);
|
||||||
|
SResultRow* pRow = doSetResultOutBufByKey_rv(pResultRowInfo, tid, (char *)&tid, sizeof(tid), true, uid, pTaskInfo, false, pAggInfo);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
||||||
|
SColumnInfoData* pData = taosArrayGet(pDataBlock->pDataBlock, i);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set the output buffer information and intermediate buffer
|
||||||
|
* not all queries require the interResultBuf, such as COUNT/TAGPRJ/PRJ/TAG etc.
|
||||||
|
*/
|
||||||
|
struct SResultRowEntryInfo* pEntry = getResultCell(pRow, i, rowCellInfoOffset);
|
||||||
|
cleanupResultRowEntry(pEntry);
|
||||||
|
|
||||||
|
pCtx[i].resultInfo = pEntry;
|
||||||
|
pCtx[i].pOutput = pData->pData;
|
||||||
|
pCtx[i].currentStage = stage;
|
||||||
|
assert(pCtx[i].pOutput != NULL);
|
||||||
|
|
||||||
|
// set the timestamp output buffer for top/bottom/diff query
|
||||||
|
int32_t fid = pCtx[i].functionId;
|
||||||
|
if (fid == FUNCTION_TOP || fid == FUNCTION_BOTTOM || fid == FUNCTION_DIFF || fid == FUNCTION_DERIVATIVE) {
|
||||||
|
if (i > 0) pCtx[i].ptsOutputBuf = pCtx[i-1].pOutput;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initCtxOutputBuffer(pCtx, pDataBlock->info.numOfCols);
|
||||||
|
}
|
||||||
|
|
||||||
void updateOutputBuf(SOptrBasicInfo* pBInfo, int32_t *bufCapacity, int32_t numOfInputRows) {
|
void updateOutputBuf(SOptrBasicInfo* pBInfo, int32_t *bufCapacity, int32_t numOfInputRows) {
|
||||||
SSDataBlock* pDataBlock = pBInfo->pRes;
|
SSDataBlock* pDataBlock = pBInfo->pRes;
|
||||||
|
|
||||||
|
@ -3579,49 +3726,49 @@ static void setupEnvForReverseScan(STableScanInfo *pTableScanInfo, SQLFunctionCt
|
||||||
|
|
||||||
void finalizeQueryResult(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset) {
|
void finalizeQueryResult(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset) {
|
||||||
STaskRuntimeEnv *pRuntimeEnv = pOperator->pRuntimeEnv;
|
STaskRuntimeEnv *pRuntimeEnv = pOperator->pRuntimeEnv;
|
||||||
STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
|
// STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
|
||||||
|
|
||||||
int32_t numOfOutput = pOperator->numOfOutput;
|
int32_t numOfOutput = pOperator->numOfOutput;
|
||||||
if (pQueryAttr->groupbyColumn || QUERY_IS_INTERVAL_QUERY(pQueryAttr) || pQueryAttr->sw.gap > 0 || pQueryAttr->stateWindow) {
|
// if (pQueryAttr->groupbyColumn || QUERY_IS_INTERVAL_QUERY(pQueryAttr) || pQueryAttr->sw.gap > 0 || pQueryAttr->stateWindow) {
|
||||||
// for each group result, call the finalize function for each column
|
// // for each group result, call the finalize function for each column
|
||||||
if (pQueryAttr->groupbyColumn) {
|
// if (pQueryAttr->groupbyColumn) {
|
||||||
closeAllResultRows(pResultRowInfo);
|
// closeAllResultRows(pResultRowInfo);
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
|
||||||
SResultRow *buf = pResultRowInfo->pResult[i];
|
|
||||||
if (!isResultRowClosed(pResultRowInfo, i)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
setResultOutputBuf(pRuntimeEnv, buf, pCtx, numOfOutput, rowCellInfoOffset);
|
|
||||||
|
|
||||||
for (int32_t j = 0; j < numOfOutput; ++j) {
|
|
||||||
// pCtx[j].startTs = buf->win.skey;
|
|
||||||
// if (pCtx[j].functionId < 0) {
|
|
||||||
// doInvokeUdf(pRuntimeEnv->pUdfInfo, &pCtx[j], 0, TSDB_UDF_FUNC_FINALIZE);
|
|
||||||
// } else {
|
|
||||||
// aAggs[pCtx[j].functionId].xFinalize(&pCtx[j]);
|
|
||||||
// }
|
// }
|
||||||
}
|
//
|
||||||
|
// for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
||||||
|
// SResultRow *buf = pResultRowInfo->pResult[i];
|
||||||
/*
|
// if (!isResultRowClosed(pResultRowInfo, i)) {
|
||||||
* set the number of output results for group by normal columns, the number of output rows usually is 1 except
|
// continue;
|
||||||
* the top and bottom query
|
// }
|
||||||
*/
|
//
|
||||||
buf->numOfRows = (uint16_t)getNumOfResult(pCtx, numOfOutput);
|
// setResultOutputBuf(pRuntimeEnv, buf, pCtx, numOfOutput, rowCellInfoOffset);
|
||||||
}
|
//
|
||||||
|
// for (int32_t j = 0; j < numOfOutput; ++j) {
|
||||||
} else {
|
//// pCtx[j].startTs = buf->win.skey;
|
||||||
|
//// if (pCtx[j].functionId < 0) {
|
||||||
|
//// doInvokeUdf(pRuntimeEnv->pUdfInfo, &pCtx[j], 0, TSDB_UDF_FUNC_FINALIZE);
|
||||||
|
//// } else {
|
||||||
|
//// aAggs[pCtx[j].functionId].xFinalize(&pCtx[j]);
|
||||||
|
//// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /*
|
||||||
|
// * set the number of output results for group by normal columns, the number of output rows usually is 1 except
|
||||||
|
// * the top and bottom query
|
||||||
|
// */
|
||||||
|
// buf->numOfRows = (uint16_t)getNumOfResult(pCtx, numOfOutput);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
for (int32_t j = 0; j < numOfOutput; ++j) {
|
for (int32_t j = 0; j < numOfOutput; ++j) {
|
||||||
// if (pCtx[j].functionId < 0) {
|
// if (pCtx[j].functionId < 0) {
|
||||||
// doInvokeUdf(pRuntimeEnv->pUdfInfo, &pCtx[j], 0, TSDB_UDF_FUNC_FINALIZE);
|
// doInvokeUdf(pRuntimeEnv->pUdfInfo, &pCtx[j], 0, TSDB_UDF_FUNC_FINALIZE);
|
||||||
// } else {
|
// } else {
|
||||||
// aAggs[pCtx[j].functionId].xFinalize(&pCtx[j]);
|
pCtx[j].fpSet->finalize(&pCtx[j]);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasMainOutput(STaskAttr *pQueryAttr) {
|
static bool hasMainOutput(STaskAttr *pQueryAttr) {
|
||||||
|
@ -4558,6 +4705,7 @@ void appendDownstream(SOperatorInfo* p, SOperatorInfo* pUpstream) {
|
||||||
|
|
||||||
static void doDestroyTableQueryInfo(STableGroupInfo* pTableqinfoGroupInfo);
|
static void doDestroyTableQueryInfo(STableGroupInfo* pTableqinfoGroupInfo);
|
||||||
|
|
||||||
|
void createResultBlock(const SArray* pExprInfo, SExchangeInfo* pInfo, const SOperatorInfo* pOperator, size_t size);
|
||||||
static int32_t setupQueryHandle(void* tsdb, STaskRuntimeEnv* pRuntimeEnv, int64_t qId, bool isSTableQuery) {
|
static int32_t setupQueryHandle(void* tsdb, STaskRuntimeEnv* pRuntimeEnv, int64_t qId, bool isSTableQuery) {
|
||||||
STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
|
STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -4914,7 +5062,41 @@ static SSDataBlock* doBlockInfoScan(void* param, bool* newgroup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t loadRemoteDataCallback(void* param, const SDataBuf* pMsg, int32_t code) {
|
int32_t loadRemoteDataCallback(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
SExchangeInfo* pEx = (SExchangeInfo*) param;
|
||||||
|
pEx->pRsp = pMsg->pData;
|
||||||
|
|
||||||
|
pEx->pRsp->numOfRows = htonl(pEx->pRsp->numOfRows);
|
||||||
|
pEx->pRsp->useconds = htobe64(pEx->pRsp->useconds);
|
||||||
|
pEx->pRsp->compLen = htonl(pEx->pRsp->compLen);
|
||||||
|
|
||||||
|
tsem_post(&pEx->ready);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
|
||||||
|
assert(pMsgBody != NULL);
|
||||||
|
tfree(pMsgBody->msgInfo.pData);
|
||||||
|
tfree(pMsgBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
||||||
|
SMsgSendInfo *pSendInfo = (SMsgSendInfo *) pMsg->ahandle;
|
||||||
|
assert(pMsg->ahandle != NULL);
|
||||||
|
|
||||||
|
SDataBuf buf = {.len = pMsg->contLen, .pData = NULL};
|
||||||
|
|
||||||
|
if (pMsg->contLen > 0) {
|
||||||
|
buf.pData = calloc(1, pMsg->contLen);
|
||||||
|
if (buf.pData == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
memcpy(buf.pData, pMsg->pCont, pMsg->contLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pSendInfo->fp(pSendInfo->param, &buf, pMsg->code);
|
||||||
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
destroySendMsgInfo(pSendInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
|
static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
|
||||||
|
@ -4924,47 +5106,83 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
|
||||||
SExecTaskInfo *pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo *pTaskInfo = pOperator->pTaskInfo;
|
||||||
|
|
||||||
*newgroup = false;
|
*newgroup = false;
|
||||||
|
if (pExchangeInfo->pRsp != NULL && pExchangeInfo->pRsp->completed == 1) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SResFetchReq *pMsg = calloc(1, sizeof(SResFetchReq));
|
SResFetchReq *pMsg = calloc(1, sizeof(SResFetchReq));
|
||||||
if (NULL == pMsg) { // todo handle malloc error
|
if (NULL == pMsg) { // todo handle malloc error
|
||||||
|
pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEpSet epSet;
|
SDownstreamSource* pSource = taosArrayGet(pExchangeInfo->pSources, 0);
|
||||||
|
SEpSet epSet = {0};
|
||||||
|
|
||||||
int64_t sId = -1, queryId = 0, taskId = 1, vgId = 1;
|
epSet.numOfEps = pSource->addr.numOfEps;
|
||||||
pMsg->header.vgId = htonl(vgId);
|
epSet.port[0] = pSource->addr.epAddr[0].port;
|
||||||
|
tstrncpy(epSet.fqdn[0], pSource->addr.epAddr[0].fqdn, tListLen(epSet.fqdn[0]));
|
||||||
|
|
||||||
pMsg->sId = htobe64(sId);
|
pMsg->header.vgId = htonl(pSource->addr.nodeId);
|
||||||
pMsg->taskId = htobe64(taskId);
|
pMsg->sId = htobe64(pSource->schedId);
|
||||||
pMsg->queryId = htobe64(queryId);
|
pMsg->taskId = htobe64(pSource->taskId);
|
||||||
|
pMsg->queryId = htobe64(pTaskInfo->id.queryId);
|
||||||
|
|
||||||
// send the fetch remote task result reques
|
// send the fetch remote task result reques
|
||||||
SMsgSendInfo* pMsgSendInfo = calloc(1, sizeof(SMsgSendInfo));
|
SMsgSendInfo* pMsgSendInfo = calloc(1, sizeof(SMsgSendInfo));
|
||||||
if (NULL == pMsgSendInfo) {
|
if (NULL == pMsgSendInfo) {
|
||||||
qError("QID:%"PRIx64 ",TID:%"PRIx64 " calloc %d failed", queryId, taskId, (int32_t)sizeof(SMsgSendInfo));
|
qError("QID:%"PRIx64" calloc %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
|
||||||
|
pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsgSendInfo->param = NULL;
|
pMsgSendInfo->param = pExchangeInfo;
|
||||||
pMsgSendInfo->msgInfo.pData = pMsg;
|
pMsgSendInfo->msgInfo.pData = pMsg;
|
||||||
pMsgSendInfo->msgInfo.len = sizeof(SResFetchReq);
|
pMsgSendInfo->msgInfo.len = sizeof(SResFetchReq);
|
||||||
pMsgSendInfo->msgType = TDMT_VND_FETCH;
|
pMsgSendInfo->msgType = TDMT_VND_FETCH;
|
||||||
pMsgSendInfo->fp = loadRemoteDataCallback;
|
pMsgSendInfo->fp = loadRemoteDataCallback;
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
void* pTransporter = NULL;
|
int32_t code = asyncSendMsgToServer(pExchangeInfo->pTransporter, &epSet, &transporterId, pMsgSendInfo);
|
||||||
int32_t code = asyncSendMsgToServer(pTransporter, &epSet, &transporterId, pMsgSendInfo);
|
tsem_wait(&pExchangeInfo->ready);
|
||||||
|
|
||||||
printf("abc\n");
|
|
||||||
getchar();
|
|
||||||
|
|
||||||
// add it into the sink node
|
|
||||||
|
|
||||||
|
if (pExchangeInfo->pRsp->numOfRows == 0) {
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createExchangeOperatorInfo(const SVgroupInfo* pVgroups, int32_t numOfSources, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
SSDataBlock* pRes = pExchangeInfo->pResult;
|
||||||
assert(numOfSources > 0);
|
char* pData = pExchangeInfo->pRsp->data;
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < pOperator->numOfOutput; ++i) {
|
||||||
|
SColumnInfoData* pColInfoData = taosArrayGet(pRes->pDataBlock, i);
|
||||||
|
char* tmp = realloc(pColInfoData->pData, pColInfoData->info.bytes * pExchangeInfo->pRsp->numOfRows);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t len = pExchangeInfo->pRsp->numOfRows * pColInfoData->info.bytes;
|
||||||
|
memcpy(tmp, pData, len);
|
||||||
|
|
||||||
|
pColInfoData->pData = tmp;
|
||||||
|
pData += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes->info.numOfCols = pOperator->numOfOutput;
|
||||||
|
pRes->info.rows = pExchangeInfo->pRsp->numOfRows;
|
||||||
|
|
||||||
|
return pExchangeInfo->pResult;
|
||||||
|
|
||||||
|
_error:
|
||||||
|
tfree(pMsg);
|
||||||
|
tfree(pMsgSendInfo);
|
||||||
|
|
||||||
|
terrno = pTaskInfo->code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SSDataBlock* createResultDataBlock(const SArray* pExprInfo);
|
||||||
|
|
||||||
|
SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray* pExprInfo, SExecTaskInfo* pTaskInfo) {
|
||||||
SExchangeInfo* pInfo = calloc(1, sizeof(SExchangeInfo));
|
SExchangeInfo* pInfo = calloc(1, sizeof(SExchangeInfo));
|
||||||
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
||||||
|
|
||||||
|
@ -4975,21 +5193,71 @@ SOperatorInfo* createExchangeOperatorInfo(const SVgroupInfo* pVgroups, int32_t n
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->numOfSources = numOfSources;
|
pInfo->pSources = taosArrayDup(pSources);
|
||||||
|
assert(taosArrayGetSize(pInfo->pSources) > 0);
|
||||||
|
|
||||||
|
size_t size = taosArrayGetSize(pExprInfo);
|
||||||
|
pInfo->pResult = createResultDataBlock(pExprInfo);
|
||||||
|
|
||||||
pOperator->name = "ExchangeOperator";
|
pOperator->name = "ExchangeOperator";
|
||||||
pOperator->operatorType = OP_Exchange;
|
pOperator->operatorType = OP_Exchange;
|
||||||
pOperator->blockingOptr = false;
|
pOperator->blockingOptr = false;
|
||||||
pOperator->status = OP_IN_EXECUTING;
|
pOperator->status = OP_IN_EXECUTING;
|
||||||
pOperator->info = pInfo;
|
pOperator->info = pInfo;
|
||||||
pOperator->numOfOutput = numOfOutput;
|
pOperator->numOfOutput = size;
|
||||||
pOperator->pRuntimeEnv = NULL;
|
pOperator->pRuntimeEnv = NULL;
|
||||||
pOperator->exec = doLoadRemoteData;
|
pOperator->exec = doLoadRemoteData;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
|
{ // todo refactor
|
||||||
|
SRpcInit rpcInit;
|
||||||
|
memset(&rpcInit, 0, sizeof(rpcInit));
|
||||||
|
rpcInit.localPort = 0;
|
||||||
|
rpcInit.label = "TSC";
|
||||||
|
rpcInit.numOfThreads = 1;
|
||||||
|
rpcInit.cfp = processRspMsg;
|
||||||
|
rpcInit.sessions = tsMaxConnections;
|
||||||
|
rpcInit.connType = TAOS_CONN_CLIENT;
|
||||||
|
rpcInit.user = (char *)"root";
|
||||||
|
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
||||||
|
rpcInit.ckey = "key";
|
||||||
|
// rpcInit.spi = 1;
|
||||||
|
rpcInit.secret = (char *)"dcc5bed04851fec854c035b2e40263b6";
|
||||||
|
|
||||||
|
pInfo->pTransporter = rpcOpen(&rpcInit);
|
||||||
|
if (pInfo->pTransporter == NULL) {
|
||||||
|
return NULL; // todo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return pOperator;
|
return pOperator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSDataBlock* createResultDataBlock(const SArray* pExprInfo) {
|
||||||
|
SSDataBlock* pResBlock = calloc(1, sizeof(SSDataBlock));
|
||||||
|
if (pResBlock == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t numOfCols = taosArrayGetSize(pExprInfo);
|
||||||
|
pResBlock->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
|
||||||
|
|
||||||
|
SArray* pResult = pResBlock->pDataBlock;
|
||||||
|
for(int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
SColumnInfoData colInfoData = {0};
|
||||||
|
SExprInfo* p = taosArrayGetP(pExprInfo, i);
|
||||||
|
|
||||||
|
SSchema* pSchema = &p->base.resSchema;
|
||||||
|
colInfoData.info.type = pSchema->type;
|
||||||
|
colInfoData.info.colId = pSchema->colId;
|
||||||
|
colInfoData.info.bytes = pSchema->bytes;
|
||||||
|
|
||||||
|
taosArrayPush(pResult, &colInfoData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pResBlock;
|
||||||
|
}
|
||||||
|
|
||||||
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, SExecTaskInfo* pTaskInfo) {
|
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput, int32_t repeatTime, SExecTaskInfo* pTaskInfo) {
|
||||||
assert(repeatTime > 0 && numOfOutput > 0);
|
assert(repeatTime > 0 && numOfOutput > 0);
|
||||||
|
|
||||||
|
@ -5016,7 +5284,6 @@ SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order,
|
||||||
pOperator->status = OP_IN_EXECUTING;
|
pOperator->status = OP_IN_EXECUTING;
|
||||||
pOperator->info = pInfo;
|
pOperator->info = pInfo;
|
||||||
pOperator->numOfOutput = numOfOutput;
|
pOperator->numOfOutput = numOfOutput;
|
||||||
pOperator->pRuntimeEnv = NULL;
|
|
||||||
pOperator->exec = doTableScan;
|
pOperator->exec = doTableScan;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
|
@ -5049,7 +5316,6 @@ SOperatorInfo* createDataBlocksOptScanInfo(void* pTsdbReadHandle, int32_t order,
|
||||||
pOperator->status = OP_IN_EXECUTING;
|
pOperator->status = OP_IN_EXECUTING;
|
||||||
pOperator->info = pInfo;
|
pOperator->info = pInfo;
|
||||||
pOperator->numOfOutput = numOfOutput;
|
pOperator->numOfOutput = numOfOutput;
|
||||||
pOperator->pRuntimeEnv = NULL;
|
|
||||||
pOperator->exec = doTableScan;
|
pOperator->exec = doTableScan;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
|
@ -5105,6 +5371,11 @@ SOperatorInfo* createTableBlockInfoScanOperator(void* pTsdbReadHandle, STaskRunt
|
||||||
return pOperator;
|
return pOperator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SOperatorInfo* createSubmitBlockScanOperatorInfo(void *pSubmitBlockReadHandle, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setTableScanFilterOperatorInfo(STableScanInfo* pTableScanInfo, SOperatorInfo* pDownstream) {
|
void setTableScanFilterOperatorInfo(STableScanInfo* pTableScanInfo, SOperatorInfo* pDownstream) {
|
||||||
assert(pTableScanInfo != NULL && pDownstream != NULL);
|
assert(pTableScanInfo != NULL && pDownstream != NULL);
|
||||||
|
|
||||||
|
@ -5483,11 +5754,7 @@ static SSDataBlock* doAggregate(void* param, bool* newgroup) {
|
||||||
SAggOperatorInfo* pAggInfo = pOperator->info;
|
SAggOperatorInfo* pAggInfo = pOperator->info;
|
||||||
SOptrBasicInfo* pInfo = &pAggInfo->binfo;
|
SOptrBasicInfo* pInfo = &pAggInfo->binfo;
|
||||||
|
|
||||||
STaskRuntimeEnv* pRuntimeEnv = pOperator->pRuntimeEnv;
|
int32_t order = TSDB_ORDER_ASC;
|
||||||
|
|
||||||
STaskAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
|
||||||
int32_t order = pQueryAttr->order.order;
|
|
||||||
|
|
||||||
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
|
@ -5499,18 +5766,13 @@ static SSDataBlock* doAggregate(void* param, bool* newgroup) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRuntimeEnv->current != NULL) {
|
// if (pAggInfo->current != NULL) {
|
||||||
setTagValue(pOperator, pRuntimeEnv->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
// setTagValue(pOperator, pAggInfo->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||||
}
|
|
||||||
|
|
||||||
// if (downstream->operatorType == OP_DataBlocksOptScan) {
|
|
||||||
// STableScanInfo* pScanInfo = downstream->info;
|
|
||||||
// order = getTableScanOrder(pScanInfo);
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// the pDataBlock are always the same one, no need to call this again
|
// the pDataBlock are always the same one, no need to call this again
|
||||||
setInputDataBlock(pOperator, pInfo->pCtx, pBlock, order);
|
setInputDataBlock(pOperator, pInfo->pCtx, pBlock, order);
|
||||||
doAggregateImpl(pOperator, pQueryAttr->window.skey, pInfo->pCtx, pBlock);
|
doAggregateImpl(pOperator, 0, pInfo->pCtx, pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
|
@ -6397,19 +6659,31 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator) {
|
||||||
tfree(pOperator);
|
tfree(pOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfOutput) {
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo) {
|
||||||
SAggOperatorInfo* pInfo = calloc(1, sizeof(SAggOperatorInfo));
|
SAggOperatorInfo* pInfo = calloc(1, sizeof(SAggOperatorInfo));
|
||||||
|
|
||||||
// STaskAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
|
||||||
int32_t numOfRows = 1;//(int32_t)(getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery));
|
int32_t numOfRows = 1;//(int32_t)(getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery));
|
||||||
|
|
||||||
pInfo->binfo.pRes = createOutputBuf(pExpr, numOfOutput, numOfRows);
|
size_t numOfOutput = taosArrayGetSize(pExprInfo);
|
||||||
pInfo->binfo.pCtx = createSqlFunctionCtx_rv(pExpr, numOfOutput, &pInfo->binfo.rowCellInfoOffset);
|
pInfo->binfo.pRes = createOutputBuf_rv(pExprInfo, numOfRows);
|
||||||
|
pInfo->binfo.pCtx = createSqlFunctionCtx_rv(pExprInfo, &pInfo->binfo.rowCellInfoOffset);
|
||||||
|
|
||||||
|
pInfo->pResultRowHashTable = taosHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
|
pInfo->pResultRowListSet = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
|
pInfo->keyBuf = malloc(1024 + sizeof(int64_t) + POINTER_BYTES); // TODO:
|
||||||
|
pInfo->pool = initResultRowPool(getResultRowSize(pExprInfo));
|
||||||
|
pInfo->pResultRowArrayList = taosArrayInit(10, sizeof(SResultRowCell));
|
||||||
|
|
||||||
initResultRowInfo(&pInfo->binfo.resultRowInfo, 8, TSDB_DATA_TYPE_INT);
|
initResultRowInfo(&pInfo->binfo.resultRowInfo, 8, TSDB_DATA_TYPE_INT);
|
||||||
|
|
||||||
pInfo->seed = rand();
|
pInfo->seed = rand();
|
||||||
// setDefaultOutputBuf(pRuntimeEnv, &pInfo->binfo, pInfo->seed, MAIN_SCAN);
|
setDefaultOutputBuf_rv(pInfo, pInfo->seed, MAIN_SCAN, pTaskInfo);
|
||||||
|
|
||||||
|
SExprInfo* p = calloc(numOfOutput, sizeof(SExprInfo));
|
||||||
|
for(int32_t i = 0; i < taosArrayGetSize(pExprInfo); ++i) {
|
||||||
|
SExprInfo* pExpr = taosArrayGetP(pExprInfo, i);
|
||||||
|
assignExprInfo(&p[i], pExpr);
|
||||||
|
}
|
||||||
|
|
||||||
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = calloc(1, sizeof(SOperatorInfo));
|
||||||
pOperator->name = "TableAggregate";
|
pOperator->name = "TableAggregate";
|
||||||
|
@ -6417,10 +6691,11 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo*
|
||||||
pOperator->blockingOptr = true;
|
pOperator->blockingOptr = true;
|
||||||
pOperator->status = OP_IN_EXECUTING;
|
pOperator->status = OP_IN_EXECUTING;
|
||||||
pOperator->info = pInfo;
|
pOperator->info = pInfo;
|
||||||
pOperator->pExpr = pExpr;
|
pOperator->pExpr = p;
|
||||||
pOperator->numOfOutput = numOfOutput;
|
pOperator->numOfOutput = numOfOutput;
|
||||||
pOperator->pRuntimeEnv = NULL;
|
pOperator->pRuntimeEnv = NULL;
|
||||||
|
|
||||||
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
pOperator->exec = doAggregate;
|
pOperator->exec = doAggregate;
|
||||||
pOperator->cleanup = destroyAggOperatorInfo;
|
pOperator->cleanup = destroyAggOperatorInfo;
|
||||||
appendDownstream(pOperator, downstream);
|
appendDownstream(pOperator, downstream);
|
||||||
|
@ -7353,31 +7628,46 @@ static SExecTaskInfo* createExecTaskInfo(uint64_t queryId) {
|
||||||
return pTaskInfo;
|
return pTaskInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* doCreateOperatorTreeNode(SPhyNode* pPhyNode, SExecTaskInfo* pTaskInfo, void* param) {
|
static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode, void* readerHandle, uint64_t queryId);
|
||||||
|
|
||||||
|
SOperatorInfo* doCreateOperatorTreeNode(SPhyNode* pPhyNode, SExecTaskInfo* pTaskInfo, void* readerHandle, uint64_t queryId) {
|
||||||
if (pPhyNode->pChildren == NULL || taosArrayGetSize(pPhyNode->pChildren) == 0) {
|
if (pPhyNode->pChildren == NULL || taosArrayGetSize(pPhyNode->pChildren) == 0) {
|
||||||
if (pPhyNode->info.type == OP_TableScan) {
|
if (pPhyNode->info.type == OP_TableScan) {
|
||||||
|
|
||||||
SScanPhyNode* pScanPhyNode = (SScanPhyNode*)pPhyNode;
|
SScanPhyNode* pScanPhyNode = (SScanPhyNode*)pPhyNode;
|
||||||
size_t numOfCols = taosArrayGetSize(pPhyNode->pTargets);
|
size_t numOfCols = taosArrayGetSize(pPhyNode->pTargets);
|
||||||
return createTableScanOperatorInfo(param, pScanPhyNode->order, numOfCols, pScanPhyNode->count, pTaskInfo);
|
|
||||||
|
tsdbReadHandleT tReaderHandle = doCreateDataReadHandle((STableScanPhyNode*) pPhyNode, readerHandle, (uint64_t) queryId);
|
||||||
|
|
||||||
|
return createTableScanOperatorInfo(tReaderHandle, pScanPhyNode->order, numOfCols, pScanPhyNode->count, pTaskInfo);
|
||||||
} else if (pPhyNode->info.type == OP_DataBlocksOptScan) {
|
} else if (pPhyNode->info.type == OP_DataBlocksOptScan) {
|
||||||
SScanPhyNode* pScanPhyNode = (SScanPhyNode*)pPhyNode;
|
SScanPhyNode* pScanPhyNode = (SScanPhyNode*)pPhyNode;
|
||||||
size_t numOfCols = taosArrayGetSize(pPhyNode->pTargets);
|
size_t numOfCols = taosArrayGetSize(pPhyNode->pTargets);
|
||||||
return createDataBlocksOptScanInfo(param, pScanPhyNode->order, numOfCols, pScanPhyNode->count, pScanPhyNode->reverse, pTaskInfo);
|
|
||||||
} else {
|
tsdbReadHandleT tReaderHandle = doCreateDataReadHandle((STableScanPhyNode*) pPhyNode, readerHandle, (uint64_t) queryId);
|
||||||
assert(0);
|
|
||||||
|
return createDataBlocksOptScanInfo(tReaderHandle, pScanPhyNode->order, numOfCols, pScanPhyNode->count, pScanPhyNode->reverse, pTaskInfo);
|
||||||
|
} else if (pPhyNode->info.type == OP_Exchange) {
|
||||||
|
SExchangePhyNode* pEx = (SExchangePhyNode*) pPhyNode;
|
||||||
|
return createExchangeOperatorInfo(pEx->pSrcEndPoints, pEx->node.pTargets, pTaskInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPhyNode->info.type == OP_Aggregate) {
|
||||||
|
size_t size = taosArrayGetSize(pPhyNode->pChildren);
|
||||||
|
assert(size == 1);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
|
SPhyNode* pChildNode = taosArrayGetP(pPhyNode->pChildren, i);
|
||||||
|
SOperatorInfo* op = doCreateOperatorTreeNode(pChildNode, pTaskInfo, readerHandle, queryId);
|
||||||
|
return createAggregateOperatorInfo(op, pPhyNode->pTargets, pTaskInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t doCreateExecTaskInfo(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, void* readerHandle) {
|
static tsdbReadHandleT createDataReadHandle(STableScanPhyNode* pTableScanNode, STableGroupInfo* pGroupInfo, void* readerHandle, uint64_t queryId) {
|
||||||
STsdbQueryCond cond = {.loadExternalRows = false};
|
STsdbQueryCond cond = {.loadExternalRows = false};
|
||||||
|
|
||||||
uint64_t uid = 0;
|
|
||||||
SPhyNode* pPhyNode = pPlan->pNode;
|
|
||||||
if (pPhyNode->info.type == OP_TableScan || pPhyNode->info.type == OP_DataBlocksOptScan) {
|
|
||||||
|
|
||||||
STableScanPhyNode* pTableScanNode = (STableScanPhyNode*) pPhyNode;
|
|
||||||
uid = pTableScanNode->scan.uid;
|
|
||||||
cond.order = pTableScanNode->scan.order;
|
cond.order = pTableScanNode->scan.order;
|
||||||
cond.numOfCols = taosArrayGetSize(pTableScanNode->scan.node.pTargets);
|
cond.numOfCols = taosArrayGetSize(pTableScanNode->scan.node.pTargets);
|
||||||
cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
|
cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
|
||||||
|
@ -7393,21 +7683,58 @@ int32_t doCreateExecTaskInfo(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, void* r
|
||||||
cond.colList[i].bytes = pSchema->bytes;
|
cond.colList[i].bytes = pSchema->bytes;
|
||||||
cond.colList[i].colId = pSchema->colId;
|
cond.colList[i].colId = pSchema->colId;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assert(0);
|
return tsdbQueryTables(readerHandle, &cond, pGroupInfo, queryId, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
STableGroupInfo group = {.numOfTables = 1, .pGroupList = taosArrayInit(1, POINTER_BYTES)};
|
static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode, void* readerHandle, uint64_t queryId) {
|
||||||
|
int32_t code = 0;
|
||||||
|
STableGroupInfo groupInfo = {0};
|
||||||
|
|
||||||
|
uint64_t uid = pTableScanNode->scan.uid;
|
||||||
|
STimeWindow window = pTableScanNode->window;
|
||||||
|
int32_t tableType = pTableScanNode->scan.tableType;
|
||||||
|
|
||||||
|
if (tableType == TSDB_SUPER_TABLE) {
|
||||||
|
code =
|
||||||
|
tsdbQuerySTableByTagCond(readerHandle, uid, window.skey, NULL, 0, 0, NULL, &groupInfo, NULL, 0, queryId);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
} else { // Create one table group.
|
||||||
|
groupInfo.numOfTables = 1;
|
||||||
|
groupInfo.pGroupList = taosArrayInit(1, POINTER_BYTES);
|
||||||
|
|
||||||
SArray* pa = taosArrayInit(1, sizeof(STableKeyInfo));
|
SArray* pa = taosArrayInit(1, sizeof(STableKeyInfo));
|
||||||
|
|
||||||
STableKeyInfo info = {.pTable = NULL, .lastKey = 0, .uid = uid};
|
STableKeyInfo info = {.pTable = NULL, .lastKey = 0, .uid = uid};
|
||||||
taosArrayPush(pa, &info);
|
taosArrayPush(pa, &info);
|
||||||
|
taosArrayPush(groupInfo.pGroupList, &pa);
|
||||||
|
}
|
||||||
|
|
||||||
taosArrayPush(group.pGroupList, &pa);
|
if (groupInfo.numOfTables == 0) {
|
||||||
|
code = 0;
|
||||||
|
// qDebug("no table qualified for query, reqId:0x%"PRIx64, (*pTask)->id.queryId);
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
*pTaskInfo = createExecTaskInfo((uint64_t)pPlan->id.queryId);
|
return createDataReadHandle(pTableScanNode, &groupInfo, readerHandle, queryId);
|
||||||
tsdbReadHandleT tsdbReadHandle = tsdbQueryTables(readerHandle, &cond, &group, (*pTaskInfo)->id.queryId, NULL);
|
_error:
|
||||||
|
terrno = code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
(*pTaskInfo)->pRoot = doCreateOperatorTreeNode(pPlan->pNode, *pTaskInfo, tsdbReadHandle);
|
int32_t doCreateExecTaskInfo(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, void* readerHandle) {
|
||||||
|
tsdbReadHandleT tReaderHandle = NULL;
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
uint64_t queryId = pPlan->id.queryId;
|
||||||
|
|
||||||
|
SPhyNode* pPhyNode = pPlan->pNode;
|
||||||
|
|
||||||
|
*pTaskInfo = createExecTaskInfo(queryId);
|
||||||
|
|
||||||
|
(*pTaskInfo)->pRoot = doCreateOperatorTreeNode(pPlan->pNode, *pTaskInfo, readerHandle, queryId);
|
||||||
if ((*pTaskInfo)->pRoot == NULL) {
|
if ((*pTaskInfo)->pRoot == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,14 +28,8 @@ extern "C" {
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
#include "tudf.h"
|
#include "tudf.h"
|
||||||
|
|
||||||
extern SAggFunctionInfo aggFunc[35];
|
|
||||||
|
|
||||||
typedef struct SResultRowEntryInfo {
|
extern SAggFunctionInfo aggFunc[35];
|
||||||
int8_t hasResult; // result generated, not NULL value
|
|
||||||
bool initialized; // output buffer has been initialized
|
|
||||||
bool complete; // query has completed
|
|
||||||
uint32_t numOfRes; // num of output result in current buffer
|
|
||||||
} SResultRowEntryInfo;
|
|
||||||
|
|
||||||
#define FUNCSTATE_SO 0x0u
|
#define FUNCSTATE_SO 0x0u
|
||||||
#define FUNCSTATE_MO 0x1u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
|
#define FUNCSTATE_MO 0x1u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
|
||||||
|
|
|
@ -4379,6 +4379,24 @@ int32_t functionCompatList[] = {
|
||||||
6, 8, 7,
|
6, 8, 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//typedef struct SFunctionFpSet {
|
||||||
|
// bool (*init)(struct SQLFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo); // setup the execute environment
|
||||||
|
// void (*addInput)(struct SQLFunctionCtx *pCtx);
|
||||||
|
//
|
||||||
|
// // finalizer must be called after all exec has been executed to generated final result.
|
||||||
|
// void (*finalize)(struct SQLFunctionCtx *pCtx);
|
||||||
|
// void (*combine)(struct SQLFunctionCtx *pCtx);
|
||||||
|
//} SFunctionFpSet;
|
||||||
|
|
||||||
|
SFunctionFpSet fpSet[1] = {
|
||||||
|
{
|
||||||
|
.init = function_setup,
|
||||||
|
.addInput = count_function,
|
||||||
|
.finalize = doFinalizer,
|
||||||
|
.combine = count_func_merge,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
SAggFunctionInfo aggFunc[35] = {{
|
SAggFunctionInfo aggFunc[35] = {{
|
||||||
// 0, count function does not invoke the finalize function
|
// 0, count function does not invoke the finalize function
|
||||||
"count",
|
"count",
|
||||||
|
|
|
@ -30,7 +30,6 @@ SSchema *getTableTagSchema(const STableMeta* pTableMeta);
|
||||||
|
|
||||||
SArray *getCurrentExprList(SQueryStmtInfo* pQueryInfo);
|
SArray *getCurrentExprList(SQueryStmtInfo* pQueryInfo);
|
||||||
size_t getNumOfExprs(SQueryStmtInfo* pQueryInfo);
|
size_t getNumOfExprs(SQueryStmtInfo* pQueryInfo);
|
||||||
SExprInfo* createBinaryExprInfo(struct tExprNode* pNode, SSchema* pResSchema);
|
|
||||||
|
|
||||||
void addExprInfo(SArray* pExprList, int32_t index, SExprInfo* pExprInfo, int32_t level);
|
void addExprInfo(SArray* pExprList, int32_t index, SExprInfo* pExprInfo, int32_t level);
|
||||||
void updateExprInfo(SExprInfo* pExprInfo, int16_t functionId, int32_t colId, int16_t srcColumnIndex, int16_t resType, int16_t resSize);
|
void updateExprInfo(SExprInfo* pExprInfo, int16_t functionId, int32_t colId, int16_t srcColumnIndex, int16_t resType, int16_t resSize);
|
||||||
|
|
|
@ -2080,7 +2080,7 @@ static int32_t setColumnIndex(SQueryStmtInfo* pQueryInfo, SArray* pParamList, SC
|
||||||
STableMeta* pTableMeta = getMetaInfo(pQueryInfo, 0)->pTableMeta;
|
STableMeta* pTableMeta = getMetaInfo(pQueryInfo, 0)->pTableMeta;
|
||||||
if (pParamList == NULL) {
|
if (pParamList == NULL) {
|
||||||
// count(*) is equalled to count(primary_timestamp_key)
|
// count(*) is equalled to count(primary_timestamp_key)
|
||||||
*index = (SColumnIndex) {0, PRIMARYKEY_TIMESTAMP_COL_ID, false};
|
*index = (SColumnIndex) {0, 0, false};
|
||||||
*columnSchema = *(SSchema*) getOneColumnSchema(pTableMeta, index->columnIndex);
|
*columnSchema = *(SSchema*) getOneColumnSchema(pTableMeta, index->columnIndex);
|
||||||
} else {
|
} else {
|
||||||
tSqlExprItem* pParamElem = taosArrayGet(pParamList, 0);
|
tSqlExprItem* pParamElem = taosArrayGet(pParamList, 0);
|
||||||
|
@ -3955,6 +3955,7 @@ int32_t qParserValidateSqlNode(SParseContext *pCtx, SSqlInfo* pInfo, SQueryStmtI
|
||||||
pQueryInfo->pTableMetaInfo[0]->name = *name;
|
pQueryInfo->pTableMetaInfo[0]->name = *name;
|
||||||
pQueryInfo->numOfTables = 1;
|
pQueryInfo->numOfTables = 1;
|
||||||
pQueryInfo->pTableMetaInfo[0]->tagColList = taosArrayInit(4, POINTER_BYTES);
|
pQueryInfo->pTableMetaInfo[0]->tagColList = taosArrayInit(4, POINTER_BYTES);
|
||||||
|
strcpy(pQueryInfo->pTableMetaInfo[0]->aliasName, name->tname);
|
||||||
|
|
||||||
code = setTableVgroupList(pCtx, name, &pQueryInfo->pTableMetaInfo[0]->vgroupList);
|
code = setTableVgroupList(pCtx, name, &pQueryInfo->pTableMetaInfo[0]->vgroupList);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
|
|
@ -26,18 +26,26 @@ static int32_t setShowInfo(SShowInfo* pShowInfo, SParseContext* pCtx, void** out
|
||||||
const char* msg4 = "pattern is invalid";
|
const char* msg4 = "pattern is invalid";
|
||||||
const char* msg5 = "database name is empty";
|
const char* msg5 = "database name is empty";
|
||||||
const char* msg6 = "pattern string is empty";
|
const char* msg6 = "pattern string is empty";
|
||||||
|
const char* msg7 = "db is not specified";
|
||||||
/*
|
/*
|
||||||
* database prefix in pInfo->pMiscInfo->a[0]
|
* database prefix in pInfo->pMiscInfo->a[0]
|
||||||
* wildcard in like clause in pInfo->pMiscInfo->a[1]
|
* wildcard in like clause in pInfo->pMiscInfo->a[1]
|
||||||
*/
|
*/
|
||||||
int16_t showType = pShowInfo->showType;
|
int16_t showType = pShowInfo->showType;
|
||||||
if (showType == TSDB_MGMT_TABLE_TABLE) {
|
if (showType == TSDB_MGMT_TABLE_TABLE) {
|
||||||
SVShowTablesReq* pShowReq = calloc(1, sizeof(SVShowTablesReq));
|
|
||||||
|
|
||||||
SArray* array = NULL;
|
SArray* array = NULL;
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
|
|
||||||
|
if (pCtx->db == NULL && pShowInfo->prefix.n == 0) {
|
||||||
|
return buildInvalidOperationMsg(pMsgBuf, msg7);
|
||||||
|
}
|
||||||
|
|
||||||
|
SVShowTablesReq* pShowReq = calloc(1, sizeof(SVShowTablesReq));
|
||||||
|
if (pShowInfo->prefix.n > 0) {
|
||||||
|
tNameSetDbName(&name, pCtx->acctId, pShowInfo->prefix.z, pShowInfo->prefix.n);
|
||||||
|
} else {
|
||||||
tNameSetDbName(&name, pCtx->acctId, pCtx->db, strlen(pCtx->db));
|
tNameSetDbName(&name, pCtx->acctId, pCtx->db, strlen(pCtx->db));
|
||||||
|
}
|
||||||
|
|
||||||
char dbFname[TSDB_DB_FNAME_LEN] = {0};
|
char dbFname[TSDB_DB_FNAME_LEN] = {0};
|
||||||
tNameGetFullDbName(&name, dbFname);
|
tNameGetFullDbName(&name, dbFname);
|
||||||
|
@ -715,6 +723,8 @@ SDclStmtInfo* qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseContext* pCtx, ch
|
||||||
SMsgBuf m = {.buf = msgBuf, .len = msgBufLen};
|
SMsgBuf m = {.buf = msgBuf, .len = msgBufLen};
|
||||||
SMsgBuf* pMsgBuf = &m;
|
SMsgBuf* pMsgBuf = &m;
|
||||||
|
|
||||||
|
pDcl->epSet = pCtx->mgmtEpSet;
|
||||||
|
|
||||||
switch (pInfo->type) {
|
switch (pInfo->type) {
|
||||||
case TSDB_SQL_CREATE_USER:
|
case TSDB_SQL_CREATE_USER:
|
||||||
case TSDB_SQL_ALTER_USER: {
|
case TSDB_SQL_ALTER_USER: {
|
||||||
|
|
|
@ -1947,6 +1947,7 @@ int32_t KvRowAppend(const void *value, int32_t len, void *param) {
|
||||||
int32_t createSName(SName* pName, SToken* pTableName, SParseContext* pParseCtx, SMsgBuf* pMsgBuf) {
|
int32_t createSName(SName* pName, SToken* pTableName, SParseContext* pParseCtx, SMsgBuf* pMsgBuf) {
|
||||||
const char* msg1 = "name too long";
|
const char* msg1 = "name too long";
|
||||||
const char* msg2 = "invalid database name";
|
const char* msg2 = "invalid database name";
|
||||||
|
const char* msg3 = "db is not specified";
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
char* p = strnchr(pTableName->z, TS_PATH_DELIMITER[0], pTableName->n, true);
|
char* p = strnchr(pTableName->z, TS_PATH_DELIMITER[0], pTableName->n, true);
|
||||||
|
@ -1984,6 +1985,10 @@ int32_t createSName(SName* pName, SToken* pTableName, SParseContext* pParseCtx,
|
||||||
strncpy(name, pTableName->z, pTableName->n);
|
strncpy(name, pTableName->z, pTableName->n);
|
||||||
strdequote(name);
|
strdequote(name);
|
||||||
|
|
||||||
|
if (pParseCtx->db == NULL) {
|
||||||
|
return buildInvalidOperationMsg(pMsgBuf, msg3);
|
||||||
|
}
|
||||||
|
|
||||||
code = tNameSetDbName(pName, pParseCtx->acctId, pParseCtx->db, strlen(pParseCtx->db));
|
code = tNameSetDbName(pName, pParseCtx->acctId, pParseCtx->db, strlen(pParseCtx->db));
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
code = buildInvalidOperationMsg(pMsgBuf, msg2);
|
code = buildInvalidOperationMsg(pMsgBuf, msg2);
|
||||||
|
|
|
@ -106,7 +106,7 @@ int32_t queryPlanToString(struct SQueryPlanNode* pQueryNode, char** str);
|
||||||
int32_t queryPlanToSql(struct SQueryPlanNode* pQueryNode, char** sql);
|
int32_t queryPlanToSql(struct SQueryPlanNode* pQueryNode, char** sql);
|
||||||
|
|
||||||
int32_t createDag(SQueryPlanNode* pQueryNode, struct SCatalog* pCatalog, SQueryDag** pDag, uint64_t requestId);
|
int32_t createDag(SQueryPlanNode* pQueryNode, struct SCatalog* pCatalog, SQueryDag** pDag, uint64_t requestId);
|
||||||
void setSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SQueryNodeAddr* ep);
|
void setSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource);
|
||||||
int32_t subPlanToString(const SSubplan *pPhyNode, char** str, int32_t* len);
|
int32_t subPlanToString(const SSubplan *pPhyNode, char** str, int32_t* len);
|
||||||
int32_t stringToSubplan(const char* str, SSubplan** subplan);
|
int32_t stringToSubplan(const char* str, SSubplan** subplan);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <function.h>
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
@ -197,23 +198,23 @@ static SQueryPlanNode* doAddTableColumnNode(const SQueryStmtInfo* pQueryInfo, SQ
|
||||||
SQueryPlanNode* pNode = createQueryNode(QNODE_TABLESCAN, "TableScan", NULL, 0, NULL, 0, info);
|
SQueryPlanNode* pNode = createQueryNode(QNODE_TABLESCAN, "TableScan", NULL, 0, NULL, 0, info);
|
||||||
|
|
||||||
if (!pQueryInfo->info.projectionQuery) {
|
if (!pQueryInfo->info.projectionQuery) {
|
||||||
STableMetaInfo* pTableMetaInfo1 = getMetaInfo(pQueryInfo, 0);
|
SArray* p = pQueryInfo->exprList[0];
|
||||||
|
|
||||||
// table source column projection, generate the projection expr
|
// table source column projection, generate the projection expr
|
||||||
int32_t numOfCols = (int32_t) taosArrayGetSize(tableCols);
|
int32_t numOfCols = (int32_t) taosArrayGetSize(tableCols);
|
||||||
SExprInfo** pExpr = calloc(numOfCols, POINTER_BYTES);
|
|
||||||
|
pNode->numOfExpr = numOfCols;
|
||||||
|
pNode->pExpr = taosArrayInit(numOfCols, POINTER_BYTES);
|
||||||
for(int32_t i = 0; i < numOfCols; ++i) {
|
for(int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColumn* pCol = taosArrayGetP(tableCols, i);
|
SExprInfo* pExprInfo = taosArrayGetP(p, i);
|
||||||
|
SColumn* pCol = pExprInfo->base.pColumns;
|
||||||
|
|
||||||
SSourceParam param = {0};
|
SSchema schema = createSchema(pCol->info.type, pCol->info.bytes, pCol->info.colId, pCol->name);
|
||||||
addIntoSourceParam(¶m, NULL, pCol);
|
|
||||||
SSchema s = createSchema(pCol->info.type, pCol->info.bytes, pCol->info.colId, pCol->name);
|
tExprNode* pExprNode = pExprInfo->pExpr->_function.pChild[0];
|
||||||
SExprInfo* p = createExprInfo(pTableMetaInfo1, "project", ¶m, &s, 0);
|
SExprInfo* px = createBinaryExprInfo(pExprNode, &schema);
|
||||||
pExpr[i] = p;
|
taosArrayPush(pNode->pExpr, &px);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pNode = createQueryNode(QNODE_PROJECT, "Projection", &pNode, 1, pExpr, numOfCols, NULL);
|
|
||||||
tfree(pExpr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return pNode;
|
return pNode;
|
||||||
|
|
|
@ -278,7 +278,7 @@ static uint64_t splitSubplanByTable(SPlanContext* pCxt, SQueryPlanNode* pPlanNod
|
||||||
static SPhyNode* createExchangeNode(SPlanContext* pCxt, SQueryPlanNode* pPlanNode, uint64_t srcTemplateId) {
|
static SPhyNode* createExchangeNode(SPlanContext* pCxt, SQueryPlanNode* pPlanNode, uint64_t srcTemplateId) {
|
||||||
SExchangePhyNode* node = (SExchangePhyNode*)initPhyNode(pPlanNode, OP_Exchange, sizeof(SExchangePhyNode));
|
SExchangePhyNode* node = (SExchangePhyNode*)initPhyNode(pPlanNode, OP_Exchange, sizeof(SExchangePhyNode));
|
||||||
node->srcTemplateId = srcTemplateId;
|
node->srcTemplateId = srcTemplateId;
|
||||||
node->pSrcEndPoints = validPointer(taosArrayInit(TARRAY_MIN_SIZE, sizeof(SQueryNodeAddr)));
|
node->pSrcEndPoints = validPointer(taosArrayInit(TARRAY_MIN_SIZE, sizeof(SDownstreamSource)));
|
||||||
return (SPhyNode*)node;
|
return (SPhyNode*)node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,24 +409,25 @@ int32_t createDag(SQueryPlanNode* pQueryNode, struct SCatalog* pCatalog, SQueryD
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setExchangSourceNode(uint64_t templateId, SQueryNodeAddr* pEp, SPhyNode* pNode) {
|
void setExchangSourceNode(uint64_t templateId, SDownstreamSource *pSource, SPhyNode* pNode) {
|
||||||
if (NULL == pNode) {
|
if (NULL == pNode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (OP_Exchange == pNode->info.type) {
|
if (OP_Exchange == pNode->info.type) {
|
||||||
SExchangePhyNode* pExchange = (SExchangePhyNode*)pNode;
|
SExchangePhyNode* pExchange = (SExchangePhyNode*)pNode;
|
||||||
if (templateId == pExchange->srcTemplateId) {
|
if (templateId == pExchange->srcTemplateId) {
|
||||||
taosArrayPush(pExchange->pSrcEndPoints, pEp);
|
taosArrayPush(pExchange->pSrcEndPoints, pSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pNode->pChildren != NULL) {
|
if (pNode->pChildren != NULL) {
|
||||||
size_t size = taosArrayGetSize(pNode->pChildren);
|
size_t size = taosArrayGetSize(pNode->pChildren);
|
||||||
for(int32_t i = 0; i < size; ++i) {
|
for(int32_t i = 0; i < size; ++i) {
|
||||||
setExchangSourceNode(templateId, pEp, taosArrayGetP(pNode->pChildren, i));
|
setExchangSourceNode(templateId, pSource, taosArrayGetP(pNode->pChildren, i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SQueryNodeAddr* pEp) {
|
void setSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource) {
|
||||||
setExchangSourceNode(templateId, pEp, subplan->pNode);
|
setExchangSourceNode(templateId, pSource, subplan->pNode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,14 @@ static void copyString(const cJSON* json, const char* name, char* dst) {
|
||||||
strcpy(dst, cJSON_GetStringValue(cJSON_GetObjectItem(json, name)));
|
strcpy(dst, cJSON_GetStringValue(cJSON_GetObjectItem(json, name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint64_t getBigintFromString(const cJSON* json, const char* name) {
|
||||||
|
char* val = getString(json, name);
|
||||||
|
uint64_t intVal = strtoul(val, NULL, 10);
|
||||||
|
tfree(val);
|
||||||
|
|
||||||
|
return intVal;
|
||||||
|
}
|
||||||
|
|
||||||
static int64_t getNumber(const cJSON* json, const char* name) {
|
static int64_t getNumber(const cJSON* json, const char* name) {
|
||||||
double d = cJSON_GetNumberValue(cJSON_GetObjectItem(json, name));
|
double d = cJSON_GetNumberValue(cJSON_GetObjectItem(json, name));
|
||||||
return (int64_t) d;
|
return (int64_t) d;
|
||||||
|
@ -400,7 +408,7 @@ static bool functionToJson(const void* obj, cJSON* jFunc) {
|
||||||
const tExprNode* exprInfo = (const tExprNode*)obj;
|
const tExprNode* exprInfo = (const tExprNode*)obj;
|
||||||
bool res = cJSON_AddStringToObject(jFunc, jkFunctionName, exprInfo->_function.functionName);
|
bool res = cJSON_AddStringToObject(jFunc, jkFunctionName, exprInfo->_function.functionName);
|
||||||
if (res && NULL != exprInfo->_function.pChild) {
|
if (res && NULL != exprInfo->_function.pChild) {
|
||||||
res = addRawArray(jFunc, jkFunctionChild, exprNodeToJson, *(exprInfo->_function.pChild), sizeof(tExprNode*), exprInfo->_function.num);
|
res = addRawArray(jFunc, jkFunctionChild, exprNodeToJson, exprInfo->_function.pChild, sizeof(tExprNode*), exprInfo->_function.num);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -459,7 +467,7 @@ static const char* jkExprNodeColumn = "Column";
|
||||||
static const char* jkExprNodeValue = "Value";
|
static const char* jkExprNodeValue = "Value";
|
||||||
|
|
||||||
static bool exprNodeToJson(const void* obj, cJSON* jExprInfo) {
|
static bool exprNodeToJson(const void* obj, cJSON* jExprInfo) {
|
||||||
const tExprNode* exprInfo = (const tExprNode*)obj;
|
const tExprNode* exprInfo = *(const tExprNode**)obj;
|
||||||
bool res = cJSON_AddNumberToObject(jExprInfo, jkExprNodeType, exprInfo->nodeType);
|
bool res = cJSON_AddNumberToObject(jExprInfo, jkExprNodeType, exprInfo->nodeType);
|
||||||
if (res) {
|
if (res) {
|
||||||
switch (exprInfo->nodeType) {
|
switch (exprInfo->nodeType) {
|
||||||
|
@ -547,7 +555,7 @@ static bool exprInfoToJson(const void* obj, cJSON* jExprInfo) {
|
||||||
const SExprInfo* exprInfo = (const SExprInfo*)obj;
|
const SExprInfo* exprInfo = (const SExprInfo*)obj;
|
||||||
bool res = addObject(jExprInfo, jkExprInfoBase, sqlExprToJson, &exprInfo->base);
|
bool res = addObject(jExprInfo, jkExprInfoBase, sqlExprToJson, &exprInfo->base);
|
||||||
if (res) {
|
if (res) {
|
||||||
res = addObject(jExprInfo, jkExprInfoExpr, exprNodeToJson, exprInfo->pExpr);
|
res = addObject(jExprInfo, jkExprInfoExpr, exprNodeToJson, &exprInfo->pExpr);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -567,13 +575,13 @@ static const char* jkTimeWindowEndKey = "EndKey";
|
||||||
static bool timeWindowToJson(const void* obj, cJSON* json) {
|
static bool timeWindowToJson(const void* obj, cJSON* json) {
|
||||||
const STimeWindow* win = (const STimeWindow*)obj;
|
const STimeWindow* win = (const STimeWindow*)obj;
|
||||||
|
|
||||||
char tmp[32] = {0};
|
char tmp[40] = {0};
|
||||||
sprintf(tmp, "%"PRId64, win->skey);
|
snprintf(tmp, tListLen(tmp),"%"PRId64, win->skey);
|
||||||
|
|
||||||
bool res = cJSON_AddStringToObject(json, jkTimeWindowStartKey, tmp);
|
bool res = cJSON_AddStringToObject(json, jkTimeWindowStartKey, tmp);
|
||||||
if (res) {
|
if (res) {
|
||||||
memset(tmp, 0, tListLen(tmp));
|
memset(tmp, 0, tListLen(tmp));
|
||||||
sprintf(tmp, "%"PRId64, win->ekey);
|
snprintf(tmp, tListLen(tmp),"%"PRId64, win->ekey);
|
||||||
res = cJSON_AddStringToObject(json, jkTimeWindowEndKey, tmp);
|
res = cJSON_AddStringToObject(json, jkTimeWindowEndKey, tmp);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
@ -581,12 +589,8 @@ static bool timeWindowToJson(const void* obj, cJSON* json) {
|
||||||
|
|
||||||
static bool timeWindowFromJson(const cJSON* json, void* obj) {
|
static bool timeWindowFromJson(const cJSON* json, void* obj) {
|
||||||
STimeWindow* win = (STimeWindow*)obj;
|
STimeWindow* win = (STimeWindow*)obj;
|
||||||
|
win->skey = getBigintFromString(json, jkTimeWindowStartKey);
|
||||||
char* p = getString(json, jkTimeWindowStartKey);
|
win->ekey = getBigintFromString(json, jkTimeWindowEndKey);
|
||||||
win->skey = strtoll(p, NULL, 10);
|
|
||||||
|
|
||||||
p = getString(json, jkTimeWindowEndKey);
|
|
||||||
win->ekey = strtoll(p, NULL, 10);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -598,14 +602,19 @@ static const char* jkScanNodeTableRevCount = "Reverse";
|
||||||
|
|
||||||
static bool scanNodeToJson(const void* obj, cJSON* json) {
|
static bool scanNodeToJson(const void* obj, cJSON* json) {
|
||||||
const SScanPhyNode* pNode = (const SScanPhyNode*)obj;
|
const SScanPhyNode* pNode = (const SScanPhyNode*)obj;
|
||||||
bool res = cJSON_AddNumberToObject(json, jkScanNodeTableId, pNode->uid);
|
|
||||||
|
char uid[40] = {0};
|
||||||
|
snprintf(uid, tListLen(uid), "%"PRIu64, pNode->uid);
|
||||||
|
bool res = cJSON_AddStringToObject(json, jkScanNodeTableId, uid);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(json, jkScanNodeTableType, pNode->tableType);
|
res = cJSON_AddNumberToObject(json, jkScanNodeTableType, pNode->tableType);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(json, jkScanNodeTableOrder, pNode->order);
|
res = cJSON_AddNumberToObject(json, jkScanNodeTableOrder, pNode->order);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(json, jkScanNodeTableCount, pNode->count);
|
res = cJSON_AddNumberToObject(json, jkScanNodeTableCount, pNode->count);
|
||||||
}
|
}
|
||||||
|
@ -613,12 +622,14 @@ static bool scanNodeToJson(const void* obj, cJSON* json) {
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(json, jkScanNodeTableRevCount, pNode->reverse);
|
res = cJSON_AddNumberToObject(json, jkScanNodeTableRevCount, pNode->reverse);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool scanNodeFromJson(const cJSON* json, void* obj) {
|
static bool scanNodeFromJson(const cJSON* json, void* obj) {
|
||||||
SScanPhyNode* pNode = (SScanPhyNode*)obj;
|
SScanPhyNode* pNode = (SScanPhyNode*)obj;
|
||||||
pNode->uid = getNumber(json, jkScanNodeTableId);
|
|
||||||
|
pNode->uid = getBigintFromString(json, jkScanNodeTableId);
|
||||||
pNode->tableType = getNumber(json, jkScanNodeTableType);
|
pNode->tableType = getNumber(json, jkScanNodeTableType);
|
||||||
pNode->count = getNumber(json, jkScanNodeTableCount);
|
pNode->count = getNumber(json, jkScanNodeTableCount);
|
||||||
pNode->order = getNumber(json, jkScanNodeTableOrder);
|
pNode->order = getNumber(json, jkScanNodeTableOrder);
|
||||||
|
@ -741,38 +752,70 @@ static bool epAddrFromJson(const cJSON* json, void* obj) {
|
||||||
|
|
||||||
static const char* jkNodeAddrId = "NodeId";
|
static const char* jkNodeAddrId = "NodeId";
|
||||||
static const char* jkNodeAddrInUse = "InUse";
|
static const char* jkNodeAddrInUse = "InUse";
|
||||||
static const char* jkNodeAddrEpAddrs = "EpAddrs";
|
static const char* jkNodeAddrEpAddrs = "Ep";
|
||||||
|
static const char* jkNodeAddr = "NodeAddr";
|
||||||
|
static const char* jkNodeTaskId = "TaskId";
|
||||||
|
static const char* jkNodeTaskSchedId = "SchedId";
|
||||||
|
|
||||||
|
static bool queryNodeAddrToJson(const void* obj, cJSON* json) {
|
||||||
|
const SQueryNodeAddr* pAddr = (const SQueryNodeAddr*) obj;
|
||||||
|
bool res = cJSON_AddNumberToObject(json, jkNodeAddrId, pAddr->nodeId);
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
res = cJSON_AddNumberToObject(json, jkNodeAddrInUse, pAddr->inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
res = addRawArray(json, jkNodeAddrEpAddrs, epAddrToJson, pAddr->epAddr, sizeof(SEpAddr), pAddr->numOfEps);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool queryNodeAddrFromJson(const cJSON* json, void* obj) {
|
||||||
|
SQueryNodeAddr* pAddr = (SQueryNodeAddr*) obj;
|
||||||
|
|
||||||
|
pAddr->nodeId = getNumber(json, jkNodeAddrId);
|
||||||
|
pAddr->inUse = getNumber(json, jkNodeAddrInUse);
|
||||||
|
|
||||||
|
int32_t numOfEps = 0;
|
||||||
|
bool res = fromRawArray(json, jkNodeAddrEpAddrs, epAddrFromJson, pAddr->epAddr, sizeof(SEpAddr), &numOfEps);
|
||||||
|
pAddr->numOfEps = numOfEps;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static bool nodeAddrToJson(const void* obj, cJSON* json) {
|
static bool nodeAddrToJson(const void* obj, cJSON* json) {
|
||||||
const SQueryNodeAddr* ep = (const SQueryNodeAddr*)obj;
|
const SDownstreamSource* pSource = (const SDownstreamSource*) obj;
|
||||||
bool res = cJSON_AddNumberToObject(json, jkNodeAddrId, ep->nodeId);
|
bool res = cJSON_AddNumberToObject(json, jkNodeTaskId, pSource->taskId);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(json, jkNodeAddrInUse, ep->inUse);
|
char t[30] = {0};
|
||||||
|
snprintf(t, tListLen(t), "%"PRIu64, pSource->schedId);
|
||||||
|
res = cJSON_AddStringToObject(json, jkNodeTaskSchedId, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
res = addRawArray(json, jkNodeAddrEpAddrs, epAddrToJson, ep->epAddr, ep->numOfEps, sizeof(SEpAddr));
|
res = addObject(json, jkNodeAddr, queryNodeAddrToJson, &pSource->addr);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool nodeAddrFromJson(const cJSON* json, void* obj) {
|
static bool nodeAddrFromJson(const cJSON* json, void* obj) {
|
||||||
SQueryNodeAddr* ep = (SQueryNodeAddr*)obj;
|
SDownstreamSource* pSource = (SDownstreamSource*)obj;
|
||||||
ep->nodeId = getNumber(json, jkNodeAddrId);
|
pSource->taskId = getNumber(json, jkNodeTaskId);
|
||||||
ep->inUse = getNumber(json, jkNodeAddrInUse);
|
|
||||||
int32_t numOfEps = 0;
|
pSource->schedId = getBigintFromString(json, jkNodeTaskSchedId);
|
||||||
bool res = fromRawArray(json, jkNodeAddrEpAddrs, nodeAddrFromJson, &ep->epAddr, sizeof(SEpAddr), &numOfEps);
|
bool res = fromObject(json, jkNodeAddr, queryNodeAddrFromJson, &pSource->addr, true);
|
||||||
ep->numOfEps = numOfEps;
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* jkExchangeNodeSrcTemplateId = "SrcTemplateId";
|
static const char* jkExchangeNodeSrcTemplateId = "SrcTemplateId";
|
||||||
static const char* jkExchangeNodeSrcEndPoints = "SrcEndPoints";
|
static const char* jkExchangeNodeSrcEndPoints = "SrcAddrs";
|
||||||
|
|
||||||
static bool exchangeNodeToJson(const void* obj, cJSON* json) {
|
static bool exchangeNodeToJson(const void* obj, cJSON* json) {
|
||||||
const SExchangePhyNode* exchange = (const SExchangePhyNode*)obj;
|
const SExchangePhyNode* exchange = (const SExchangePhyNode*)obj;
|
||||||
bool res = cJSON_AddNumberToObject(json, jkExchangeNodeSrcTemplateId, exchange->srcTemplateId);
|
bool res = cJSON_AddNumberToObject(json, jkExchangeNodeSrcTemplateId, exchange->srcTemplateId);
|
||||||
if (res) {
|
if (res) {
|
||||||
res = addInlineArray(json, jkExchangeNodeSrcEndPoints, nodeAddrToJson, exchange->pSrcEndPoints);
|
res = addRawArray(json, jkExchangeNodeSrcEndPoints, nodeAddrToJson, exchange->pSrcEndPoints->pData, sizeof(SDownstreamSource), taosArrayGetSize(exchange->pSrcEndPoints));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -780,7 +823,7 @@ static bool exchangeNodeToJson(const void* obj, cJSON* json) {
|
||||||
static bool exchangeNodeFromJson(const cJSON* json, void* obj) {
|
static bool exchangeNodeFromJson(const cJSON* json, void* obj) {
|
||||||
SExchangePhyNode* exchange = (SExchangePhyNode*)obj;
|
SExchangePhyNode* exchange = (SExchangePhyNode*)obj;
|
||||||
exchange->srcTemplateId = getNumber(json, jkExchangeNodeSrcTemplateId);
|
exchange->srcTemplateId = getNumber(json, jkExchangeNodeSrcTemplateId);
|
||||||
return fromInlineArray(json, jkExchangeNodeSrcEndPoints, nodeAddrFromJson, &exchange->pSrcEndPoints, sizeof(SQueryNodeAddr));
|
return fromInlineArray(json, jkExchangeNodeSrcEndPoints, nodeAddrFromJson, &exchange->pSrcEndPoints, sizeof(SDownstreamSource));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool specificPhyNodeToJson(const void* obj, cJSON* json) {
|
static bool specificPhyNodeToJson(const void* obj, cJSON* json) {
|
||||||
|
@ -989,7 +1032,11 @@ static const char* jkIdSubplanId = "SubplanId";
|
||||||
|
|
||||||
static bool subplanIdToJson(const void* obj, cJSON* jId) {
|
static bool subplanIdToJson(const void* obj, cJSON* jId) {
|
||||||
const SSubplanId* id = (const SSubplanId*)obj;
|
const SSubplanId* id = (const SSubplanId*)obj;
|
||||||
bool res = cJSON_AddNumberToObject(jId, jkIdQueryId, id->queryId);
|
|
||||||
|
char ids[40] = {0};
|
||||||
|
snprintf(ids, tListLen(ids), "%"PRIu64, id->queryId);
|
||||||
|
|
||||||
|
bool res = cJSON_AddStringToObject(jId, jkIdQueryId, ids);
|
||||||
if (res) {
|
if (res) {
|
||||||
res = cJSON_AddNumberToObject(jId, jkIdTemplateId, id->templateId);
|
res = cJSON_AddNumberToObject(jId, jkIdTemplateId, id->templateId);
|
||||||
}
|
}
|
||||||
|
@ -1001,7 +1048,8 @@ static bool subplanIdToJson(const void* obj, cJSON* jId) {
|
||||||
|
|
||||||
static bool subplanIdFromJson(const cJSON* json, void* obj) {
|
static bool subplanIdFromJson(const cJSON* json, void* obj) {
|
||||||
SSubplanId* id = (SSubplanId*)obj;
|
SSubplanId* id = (SSubplanId*)obj;
|
||||||
id->queryId = getNumber(json, jkIdQueryId);
|
|
||||||
|
id->queryId = getBigintFromString(json, jkIdQueryId);
|
||||||
id->templateId = getNumber(json, jkIdTemplateId);
|
id->templateId = getNumber(json, jkIdTemplateId);
|
||||||
id->subplanId = getNumber(json, jkIdSubplanId);
|
id->subplanId = getNumber(json, jkIdSubplanId);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -87,8 +87,8 @@ int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SQueryNodeAddr* ep) {
|
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource) {
|
||||||
setSubplanExecutionNode(subplan, templateId, ep);
|
setSubplanExecutionNode(subplan, templateId, pSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qSubPlanToString(const SSubplan *subplan, char** str, int32_t* len) {
|
int32_t qSubPlanToString(const SSubplan *subplan, char** str, int32_t* len) {
|
||||||
|
|
|
@ -1,15 +1,4 @@
|
||||||
aux_source_directory(src QWORKER_SRC)
|
aux_source_directory(src QWORKER_SRC)
|
||||||
#add_library(qworker ${QWORKER_SRC})
|
|
||||||
#target_include_directories(
|
|
||||||
# qworker
|
|
||||||
# PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/qworker"
|
|
||||||
# PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
#)
|
|
||||||
#
|
|
||||||
#target_link_libraries(
|
|
||||||
# qworker
|
|
||||||
# PRIVATE os util transport planner qcom executor
|
|
||||||
#)
|
|
||||||
|
|
||||||
add_library(qworker STATIC ${QWORKER_SRC})
|
add_library(qworker STATIC ${QWORKER_SRC})
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
|
@ -18,11 +7,6 @@ target_include_directories(
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
#set_target_properties(qworker PROPERTIES
|
|
||||||
# IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/libqworker.a"
|
|
||||||
# INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libs/qworker"
|
|
||||||
# )
|
|
||||||
|
|
||||||
target_link_libraries(qworker
|
target_link_libraries(qworker
|
||||||
PRIVATE os util transport planner qcom executor
|
PRIVATE os util transport planner qcom executor
|
||||||
)
|
)
|
||||||
|
|
|
@ -258,6 +258,8 @@ int32_t qwAddTaskCtxImpl(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_
|
||||||
char id[sizeof(qId) + sizeof(tId)] = {0};
|
char id[sizeof(qId) + sizeof(tId)] = {0};
|
||||||
QW_SET_QTID(id, qId, tId);
|
QW_SET_QTID(id, qId, tId);
|
||||||
|
|
||||||
|
printf("%"PRIx64", tid:%"PRIx64"\n", qId, tId);
|
||||||
|
|
||||||
SQWTaskCtx nctx = {0};
|
SQWTaskCtx nctx = {0};
|
||||||
|
|
||||||
QW_LOCK(QW_WRITE, &mgmt->ctxLock);
|
QW_LOCK(QW_WRITE, &mgmt->ctxLock);
|
||||||
|
|
|
@ -29,7 +29,7 @@ extern "C" {
|
||||||
#define SCHEDULE_DEFAULT_JOB_NUMBER 1000
|
#define SCHEDULE_DEFAULT_JOB_NUMBER 1000
|
||||||
#define SCHEDULE_DEFAULT_TASK_NUMBER 1000
|
#define SCHEDULE_DEFAULT_TASK_NUMBER 1000
|
||||||
|
|
||||||
#define SCH_MAX_CONDIDATE_EP_NUM TSDB_MAX_REPLICA
|
#define SCH_MAX_CANDIDATE_EP_NUM TSDB_MAX_REPLICA
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SCH_READ = 1,
|
SCH_READ = 1,
|
||||||
|
|
|
@ -52,9 +52,9 @@ int32_t schInitTask(SSchJob* pJob, SSchTask *pTask, SSubplan* pPlan, SSchLevel *
|
||||||
pTask->level = pLevel;
|
pTask->level = pLevel;
|
||||||
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_NOT_START);
|
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_NOT_START);
|
||||||
pTask->taskId = schGenTaskId();
|
pTask->taskId = schGenTaskId();
|
||||||
pTask->execAddrs = taosArrayInit(SCH_MAX_CONDIDATE_EP_NUM, sizeof(SQueryNodeAddr));
|
pTask->execAddrs = taosArrayInit(SCH_MAX_CANDIDATE_EP_NUM, sizeof(SQueryNodeAddr));
|
||||||
if (NULL == pTask->execAddrs) {
|
if (NULL == pTask->execAddrs) {
|
||||||
SCH_TASK_ELOG("taosArrayInit %d exec addrs failed", SCH_MAX_CONDIDATE_EP_NUM);
|
SCH_TASK_ELOG("taosArrayInit %d exec addrs failed", SCH_MAX_CANDIDATE_EP_NUM);
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,9 +408,9 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pTask->candidateIdx = 0;
|
pTask->candidateIdx = 0;
|
||||||
pTask->candidateAddrs = taosArrayInit(SCH_MAX_CONDIDATE_EP_NUM, sizeof(SQueryNodeAddr));
|
pTask->candidateAddrs = taosArrayInit(SCH_MAX_CANDIDATE_EP_NUM, sizeof(SQueryNodeAddr));
|
||||||
if (NULL == pTask->candidateAddrs) {
|
if (NULL == pTask->candidateAddrs) {
|
||||||
SCH_TASK_ELOG("taosArrayInit %d condidate addrs failed", SCH_MAX_CONDIDATE_EP_NUM);
|
SCH_TASK_ELOG("taosArrayInit %d condidate addrs failed", SCH_MAX_CANDIDATE_EP_NUM);
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,10 +430,10 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) {
|
||||||
if (pJob->nodeList) {
|
if (pJob->nodeList) {
|
||||||
nodeNum = taosArrayGetSize(pJob->nodeList);
|
nodeNum = taosArrayGetSize(pJob->nodeList);
|
||||||
|
|
||||||
for (int32_t i = 0; i < nodeNum && addNum < SCH_MAX_CONDIDATE_EP_NUM; ++i) {
|
for (int32_t i = 0; i < nodeNum && addNum < SCH_MAX_CANDIDATE_EP_NUM; ++i) {
|
||||||
SQueryNodeAddr *naddr = taosArrayGet(pJob->nodeList, i);
|
SQueryNodeAddr *naddr = taosArrayGet(pJob->nodeList, i);
|
||||||
|
|
||||||
if (NULL == taosArrayPush(pTask->candidateAddrs, &pTask->plan->execNode)) {
|
if (NULL == taosArrayPush(pTask->candidateAddrs, naddr)) {
|
||||||
SCH_TASK_ELOG("taosArrayPush execNode to candidate addrs failed, addNum:%d, errno:%d", addNum, errno);
|
SCH_TASK_ELOG("taosArrayPush execNode to candidate addrs failed, addNum:%d, errno:%d", addNum, errno);
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
@ -443,12 +443,12 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addNum <= 0) {
|
if (addNum <= 0) {
|
||||||
SCH_TASK_ELOG("no available execNode as condidate addr, nodeNum:%d", nodeNum);
|
SCH_TASK_ELOG("no available execNode as candidate addr, nodeNum:%d", nodeNum);
|
||||||
return TSDB_CODE_QRY_INVALID_INPUT;
|
return TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
for (int32_t i = 0; i < job->dataSrcEps.numOfEps && addNum < SCH_MAX_CONDIDATE_EP_NUM; ++i) {
|
for (int32_t i = 0; i < job->dataSrcEps.numOfEps && addNum < SCH_MAX_CANDIDATE_EP_NUM; ++i) {
|
||||||
strncpy(epSet->fqdn[epSet->numOfEps], job->dataSrcEps.fqdn[i], sizeof(job->dataSrcEps.fqdn[i]));
|
strncpy(epSet->fqdn[epSet->numOfEps], job->dataSrcEps.fqdn[i], sizeof(job->dataSrcEps.fqdn[i]));
|
||||||
epSet->port[epSet->numOfEps] = job->dataSrcEps.port[i];
|
epSet->port[epSet->numOfEps] = job->dataSrcEps.port[i];
|
||||||
|
|
||||||
|
@ -767,7 +767,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (SCH_IS_DATA_SRC_TASK(task) && job->dataSrcEps.numOfEps < SCH_MAX_CONDIDATE_EP_NUM) {
|
if (SCH_IS_DATA_SRC_TASK(task) && job->dataSrcEps.numOfEps < SCH_MAX_CANDIDATE_EP_NUM) {
|
||||||
strncpy(job->dataSrcEps.fqdn[job->dataSrcEps.numOfEps], task->execAddr.fqdn, sizeof(task->execAddr.fqdn));
|
strncpy(job->dataSrcEps.fqdn[job->dataSrcEps.numOfEps], task->execAddr.fqdn, sizeof(task->execAddr.fqdn));
|
||||||
job->dataSrcEps.port[job->dataSrcEps.numOfEps] = task->execAddr.port;
|
job->dataSrcEps.port[job->dataSrcEps.numOfEps] = task->execAddr.port;
|
||||||
|
|
||||||
|
@ -782,7 +782,8 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
atomic_add_fetch_32(&par->childReady, 1);
|
atomic_add_fetch_32(&par->childReady, 1);
|
||||||
|
|
||||||
SCH_LOCK(SCH_WRITE, &par->lock);
|
SCH_LOCK(SCH_WRITE, &par->lock);
|
||||||
qSetSubplanExecutionNode(par->plan, pTask->plan->id.templateId, &pTask->succeedAddr);
|
SDownstreamSource source = {.taskId = pTask->taskId, .schedId = schMgmt.sId, .addr = pTask->succeedAddr};
|
||||||
|
qSetSubplanExecutionNode(par->plan, pTask->plan->id.templateId, &source);
|
||||||
SCH_UNLOCK(SCH_WRITE, &par->lock);
|
SCH_UNLOCK(SCH_WRITE, &par->lock);
|
||||||
|
|
||||||
if (SCH_TASK_READY_TO_LUNCH(par)) {
|
if (SCH_TASK_READY_TO_LUNCH(par)) {
|
||||||
|
@ -853,7 +854,7 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t msgType, ch
|
||||||
SResReadyRsp *rsp = (SResReadyRsp *)msg;
|
SResReadyRsp *rsp = (SResReadyRsp *)msg;
|
||||||
|
|
||||||
if (rspCode != TSDB_CODE_SUCCESS || NULL == msg || rsp->code != TSDB_CODE_SUCCESS) {
|
if (rspCode != TSDB_CODE_SUCCESS || NULL == msg || rsp->code != TSDB_CODE_SUCCESS) {
|
||||||
SCH_ERR_RET(schProcessOnTaskFailure(pJob, pTask, rsp->code));
|
SCH_ERR_RET(schProcessOnTaskFailure(pJob, pTask, rspCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
||||||
|
@ -1214,6 +1215,8 @@ int32_t schLaunchTask(SSchJob *pJob, SSchTask *pTask) {
|
||||||
SCH_TASK_ELOG("subplanToString error, code:%x, msg:%p, len:%d", code, pTask->msg, pTask->msgLen);
|
SCH_TASK_ELOG("subplanToString error, code:%x, msg:%p, len:%d", code, pTask->msg, pTask->msgLen);
|
||||||
SCH_ERR_JRET(code);
|
SCH_ERR_JRET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printf("physical plan:%s\n", pTask->msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_JRET(schSetTaskCandidateAddrs(pJob, pTask));
|
SCH_ERR_JRET(schSetTaskCandidateAddrs(pJob, pTask));
|
||||||
|
@ -1477,7 +1480,7 @@ int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks) {
|
||||||
SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubQueryMsg *pMsg = msg;
|
SSubQueryMsg *pMsg = (SSubQueryMsg*) msg;
|
||||||
|
|
||||||
pMsg->header.vgId = htonl(tInfo.addr.nodeId);
|
pMsg->header.vgId = htonl(tInfo.addr.nodeId);
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ typedef struct {
|
||||||
|
|
||||||
// TDB Operations
|
// TDB Operations
|
||||||
TDB_EXTERN int tdbCreateDB(TDB** dbpp, tdb_db_t type);
|
TDB_EXTERN int tdbCreateDB(TDB** dbpp, tdb_db_t type);
|
||||||
TDB_EXTERN int tdbOpenDB(TDB* dbp, uint32_t flags);
|
TDB_EXTERN int tdbOpenDB(TDB* dbp, const char* fname, const char* dbname, uint32_t flags);
|
||||||
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags);
|
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -56,9 +56,28 @@ _err:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TDB_EXTERN int tdbOpenDB(TDB* dbp, uint32_t flags) {
|
TDB_EXTERN int tdbOpenDB(TDB* dbp, const char* fname, const char* dbname, uint32_t flags) {
|
||||||
// TODO
|
int ret = 0;
|
||||||
return 0;
|
|
||||||
|
if ((dbp->fname = strdup(fname)) == NULL) {
|
||||||
|
ret = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the backup file if the file not exists
|
||||||
|
|
||||||
|
// Open the file as a sub-db or a master-db
|
||||||
|
if (dbname) {
|
||||||
|
if ((dbp->dbname = strdup(dbname)) == NULL) {
|
||||||
|
ret = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// TODO: Open the DB as a SUB-DB in this file
|
||||||
|
} else {
|
||||||
|
// TODO: Open the DB as a MASTER-DB in this file
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags) {
|
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags) {
|
||||||
|
|
|
@ -25,6 +25,14 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
// TODO
|
||||||
|
} TDB_MPOOL;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int fd;
|
||||||
|
} TDB_FH;
|
||||||
|
|
||||||
struct TDB {
|
struct TDB {
|
||||||
pgsize_t pageSize;
|
pgsize_t pageSize;
|
||||||
tdb_db_t type;
|
tdb_db_t type;
|
||||||
|
@ -35,6 +43,9 @@ struct TDB {
|
||||||
TDB_HASH * hash;
|
TDB_HASH * hash;
|
||||||
TDB_HEAP * heap;
|
TDB_HEAP * heap;
|
||||||
} dbam; // db access method
|
} dbam; // db access method
|
||||||
|
|
||||||
|
TDB_FH * fhp; // The backup file handle
|
||||||
|
TDB_MPOOL *mph; // The memory pool handle
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -6,9 +6,9 @@ TEST(tdb_api_test, tdb_create_open_close_db_test) {
|
||||||
int ret;
|
int ret;
|
||||||
TDB *dbp;
|
TDB *dbp;
|
||||||
|
|
||||||
tdbCreateDB(&dbp, TDB_BTREE_T);
|
// tdbCreateDB(&dbp, TDB_BTREE_T);
|
||||||
|
|
||||||
tdbOpenDB(dbp, 0);
|
// tdbOpenDB(dbp, 0);
|
||||||
|
|
||||||
tdbCloseDB(dbp, 0);
|
// tdbCloseDB(dbp, 0);
|
||||||
}
|
}
|
|
@ -16,8 +16,8 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
#include "ulog.h"
|
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
#include "ulog.h"
|
||||||
|
|
||||||
SGlobalCfg tsGlobalConfig[TSDB_CFG_MAX_NUM] = {{0}};
|
SGlobalCfg tsGlobalConfig[TSDB_CFG_MAX_NUM] = {{0}};
|
||||||
int32_t tsGlobalConfigNum = 0;
|
int32_t tsGlobalConfigNum = 0;
|
||||||
|
|
Loading…
Reference in New Issue