Merge pull request #10741 from taosdata/feature/3.0_liaohj
Feature/3.0 liaohj
This commit is contained in:
commit
14f8e606f8
|
@ -128,7 +128,7 @@ target_include_directories(
|
||||||
set(CMAKE_PROJECT_INCLUDE_BEFORE "${CMAKE_SUPPORT_DIR}/EnableCMP0048.txt.in")
|
set(CMAKE_PROJECT_INCLUDE_BEFORE "${CMAKE_SUPPORT_DIR}/EnableCMP0048.txt.in")
|
||||||
add_subdirectory(zlib)
|
add_subdirectory(zlib)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
zlib
|
zlibstatic
|
||||||
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/zlib
|
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/zlib
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/zlib
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/zlib
|
||||||
)
|
)
|
||||||
|
|
|
@ -54,10 +54,11 @@ typedef struct SColumnDataAgg {
|
||||||
} SColumnDataAgg;
|
} SColumnDataAgg;
|
||||||
|
|
||||||
typedef struct SDataBlockInfo {
|
typedef struct SDataBlockInfo {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
int32_t rows;
|
int32_t rows;
|
||||||
int32_t rowSize;
|
int32_t rowSize;
|
||||||
int32_t numOfCols;
|
int16_t numOfCols;
|
||||||
|
int16_t hasVarCol;
|
||||||
union {int64_t uid; int64_t blockId;};
|
union {int64_t uid; int64_t blockId;};
|
||||||
} SDataBlockInfo;
|
} SDataBlockInfo;
|
||||||
|
|
||||||
|
@ -96,13 +97,15 @@ typedef struct SColumnInfoData {
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
|
static FORCE_INLINE int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
|
||||||
int64_t tbUid = pBlock->info.uid;
|
int64_t tbUid = pBlock->info.uid;
|
||||||
int32_t numOfCols = pBlock->info.numOfCols;
|
int16_t numOfCols = pBlock->info.numOfCols;
|
||||||
|
int16_t hasVarCol = pBlock->info.hasVarCol;
|
||||||
int32_t rows = pBlock->info.rows;
|
int32_t rows = pBlock->info.rows;
|
||||||
int32_t sz = taosArrayGetSize(pBlock->pDataBlock);
|
int32_t sz = taosArrayGetSize(pBlock->pDataBlock);
|
||||||
|
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI64(buf, tbUid);
|
tlen += taosEncodeFixedI64(buf, tbUid);
|
||||||
tlen += taosEncodeFixedI32(buf, numOfCols);
|
tlen += taosEncodeFixedI16(buf, numOfCols);
|
||||||
|
tlen += taosEncodeFixedI16(buf, hasVarCol);
|
||||||
tlen += taosEncodeFixedI32(buf, rows);
|
tlen += taosEncodeFixedI32(buf, rows);
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
@ -120,7 +123,8 @@ static FORCE_INLINE void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock)
|
||||||
int32_t sz;
|
int32_t sz;
|
||||||
|
|
||||||
buf = taosDecodeFixedI64(buf, &pBlock->info.uid);
|
buf = taosDecodeFixedI64(buf, &pBlock->info.uid);
|
||||||
buf = taosDecodeFixedI32(buf, &pBlock->info.numOfCols);
|
buf = taosDecodeFixedI16(buf, &pBlock->info.numOfCols);
|
||||||
|
buf = taosDecodeFixedI16(buf, &pBlock->info.hasVarCol);
|
||||||
buf = taosDecodeFixedI32(buf, &pBlock->info.rows);
|
buf = taosDecodeFixedI32(buf, &pBlock->info.rows);
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pBlock->pDataBlock = taosArrayInit(sz, sizeof(SColumnInfoData));
|
pBlock->pDataBlock = taosArrayInit(sz, sizeof(SColumnInfoData));
|
||||||
|
|
|
@ -117,7 +117,7 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
|
||||||
|
|
||||||
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
||||||
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
||||||
void blockDataClearup(SSDataBlock* pDataBlock, bool hasVarCol);
|
void blockDataClearup(SSDataBlock* pDataBlock);
|
||||||
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
||||||
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
||||||
void* blockDataDestroy(SSDataBlock* pBlock);
|
void* blockDataDestroy(SSDataBlock* pBlock);
|
||||||
|
|
|
@ -295,19 +295,8 @@ typedef struct SMultiFunctionsDesc {
|
||||||
int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, SResultDataInfo* pInfo, int16_t extLength,
|
int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, SResultDataInfo* pInfo, int16_t extLength,
|
||||||
bool isSuperTable);
|
bool isSuperTable);
|
||||||
|
|
||||||
/**
|
|
||||||
* If the given name is a valid built-in sql function, the value of true will be returned.
|
|
||||||
* @param name
|
|
||||||
* @param len
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t qIsBuiltinFunction(const char* name, int32_t len, bool* scalarFunction);
|
|
||||||
|
|
||||||
bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* functionId);
|
bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* functionId);
|
||||||
|
|
||||||
bool qIsAggregateFunction(const char* functionName);
|
|
||||||
bool qIsSelectivityFunction(const char* functionName);
|
|
||||||
|
|
||||||
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
||||||
|
|
||||||
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
|
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
|
||||||
|
|
|
@ -93,6 +93,8 @@ typedef struct SWindowLogicNode {
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
int64_t sliding;
|
int64_t sliding;
|
||||||
|
int8_t intervalUnit;
|
||||||
|
int8_t slidingUnit;
|
||||||
SFillNode* pFill;
|
SFillNode* pFill;
|
||||||
} SWindowLogicNode;
|
} SWindowLogicNode;
|
||||||
|
|
||||||
|
@ -203,7 +205,7 @@ typedef struct SDownstreamSourceNode {
|
||||||
|
|
||||||
typedef struct SExchangePhysiNode {
|
typedef struct SExchangePhysiNode {
|
||||||
SPhysiNode node;
|
SPhysiNode node;
|
||||||
int32_t srcGroupId; // group id of datasource suplans
|
int32_t srcGroupId; // group id of datasource suplans
|
||||||
SNodeList* pSrcEndPoints; // element is SDownstreamSource, scheduler fill by calling qSetSuplanExecutionNode
|
SNodeList* pSrcEndPoints; // element is SDownstreamSource, scheduler fill by calling qSetSuplanExecutionNode
|
||||||
} SExchangePhysiNode;
|
} SExchangePhysiNode;
|
||||||
|
|
||||||
|
@ -211,9 +213,11 @@ typedef struct SIntervalPhysiNode {
|
||||||
SPhysiNode node;
|
SPhysiNode node;
|
||||||
SNodeList* pExprs; // these are expression list of parameter expression of function
|
SNodeList* pExprs; // these are expression list of parameter expression of function
|
||||||
SNodeList* pFuncs;
|
SNodeList* pFuncs;
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
int64_t sliding;
|
int64_t sliding;
|
||||||
|
int8_t intervalUnit;
|
||||||
|
int8_t slidingUnit;
|
||||||
SFillNode* pFill;
|
SFillNode* pFill;
|
||||||
} SIntervalPhysiNode;
|
} SIntervalPhysiNode;
|
||||||
|
|
||||||
|
|
|
@ -1059,10 +1059,10 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
|
||||||
// destroyTupleIndex(index);
|
// destroyTupleIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockDataClearup(SSDataBlock* pDataBlock, bool hasVarCol) {
|
void blockDataClearup(SSDataBlock* pDataBlock) {
|
||||||
pDataBlock->info.rows = 0;
|
pDataBlock->info.rows = 0;
|
||||||
|
|
||||||
if (hasVarCol) {
|
if (pDataBlock->info.hasVarCol) {
|
||||||
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
||||||
SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
|
SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
|
||||||
|
|
||||||
|
@ -1148,7 +1148,9 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock) {
|
||||||
|
|
||||||
SSDataBlock* pBlock = calloc(1, sizeof(SSDataBlock));
|
SSDataBlock* pBlock = calloc(1, sizeof(SSDataBlock));
|
||||||
pBlock->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
|
pBlock->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
|
||||||
|
|
||||||
pBlock->info.numOfCols = numOfCols;
|
pBlock->info.numOfCols = numOfCols;
|
||||||
|
pBlock->info.hasVarCol = pDataBlock->info.hasVarCol;
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfCols; ++i) {
|
for(int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColumnInfoData colInfo = {0};
|
SColumnInfoData colInfo = {0};
|
||||||
|
|
|
@ -50,7 +50,7 @@ typedef struct SGroupResInfo {
|
||||||
int32_t totalGroup;
|
int32_t totalGroup;
|
||||||
int32_t currentGroup;
|
int32_t currentGroup;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
SArray* pRows; // SArray<SResultRow*>
|
SArray* pRows; // SArray<SResultRowPosition*>
|
||||||
bool ordered;
|
bool ordered;
|
||||||
int32_t position;
|
int32_t position;
|
||||||
} SGroupResInfo;
|
} SGroupResInfo;
|
||||||
|
@ -67,10 +67,15 @@ typedef struct SResultRow {
|
||||||
char *key; // start key of current result row
|
char *key; // start key of current result row
|
||||||
} SResultRow;
|
} SResultRow;
|
||||||
|
|
||||||
|
typedef struct SResultRowPosition {
|
||||||
|
int32_t pageId;
|
||||||
|
int32_t offset;
|
||||||
|
} SResultRowPosition;
|
||||||
|
|
||||||
typedef struct SResultRowInfo {
|
typedef struct SResultRowInfo {
|
||||||
SList* pRows;
|
SList *pRows;
|
||||||
SResultRow** pResult; // result list
|
SResultRowPosition *pPosition;
|
||||||
// int16_t type:8; // data type for hash key
|
SResultRow **pResult; // result list
|
||||||
int32_t size; // number of result set
|
int32_t size; // number of result set
|
||||||
int32_t capacity; // max capacity
|
int32_t capacity; // max capacity
|
||||||
int32_t curPos; // current active result row index of pResult list
|
int32_t curPos; // current active result row index of pResult list
|
||||||
|
@ -131,7 +136,7 @@ static FORCE_INLINE char* getPosInResultPage_rv(SFilePage* page, int32_t rowOffs
|
||||||
assert(rowOffset >= 0);
|
assert(rowOffset >= 0);
|
||||||
|
|
||||||
int32_t numOfRows = 1;//(int32_t)getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery);
|
int32_t numOfRows = 1;//(int32_t)getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery);
|
||||||
return ((char *)page->data) + rowOffset + offset * numOfRows;
|
return (char*) page + rowOffset + offset * numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
//bool isNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
//bool isNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
||||||
|
@ -139,12 +144,7 @@ static FORCE_INLINE char* getPosInResultPage_rv(SFilePage* page, int32_t rowOffs
|
||||||
|
|
||||||
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr);
|
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr);
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size);
|
|
||||||
SResultRow* getNewResultRow(SResultRowPool* p);
|
SResultRow* getNewResultRow(SResultRowPool* p);
|
||||||
int64_t getResultRowPoolMemSize(SResultRowPool* p);
|
|
||||||
void* destroyResultRowPool(SResultRowPool* p);
|
|
||||||
int32_t getNumOfAllocatedResultRows(SResultRowPool* p);
|
|
||||||
int32_t getNumOfUsedResultRows(SResultRowPool* p);
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray* pResult; // SArray<SResPair>
|
SArray* pResult; // SArray<SResPair>
|
||||||
|
|
|
@ -240,12 +240,12 @@ typedef struct STaskAttr {
|
||||||
SArray* pUdfInfo; // no need to free
|
SArray* pUdfInfo; // no need to free
|
||||||
} STaskAttr;
|
} STaskAttr;
|
||||||
|
|
||||||
typedef int32_t (*__optr_open_fn_t)(void* param);
|
|
||||||
typedef SSDataBlock* (*__optr_fn_t)(void* param, bool* newgroup);
|
|
||||||
typedef void (*__optr_close_fn_t)(void* param, int32_t num);
|
|
||||||
|
|
||||||
struct SOperatorInfo;
|
struct SOperatorInfo;
|
||||||
|
|
||||||
|
typedef int32_t (*__optr_open_fn_t)(struct SOperatorInfo* param);
|
||||||
|
typedef SSDataBlock* (*__optr_fn_t)(struct SOperatorInfo* param, bool* newgroup);
|
||||||
|
typedef void (*__optr_close_fn_t)(void* param, int32_t num);
|
||||||
|
|
||||||
typedef struct STaskIdInfo {
|
typedef struct STaskIdInfo {
|
||||||
uint64_t queryId; // this is also a request id
|
uint64_t queryId; // this is also a request id
|
||||||
uint64_t subplanId;
|
uint64_t subplanId;
|
||||||
|
@ -275,36 +275,36 @@ typedef struct SExecTaskInfo {
|
||||||
} SExecTaskInfo;
|
} SExecTaskInfo;
|
||||||
|
|
||||||
typedef struct STaskRuntimeEnv {
|
typedef struct STaskRuntimeEnv {
|
||||||
jmp_buf env;
|
jmp_buf env;
|
||||||
STaskAttr* pQueryAttr;
|
STaskAttr* pQueryAttr;
|
||||||
uint32_t status; // query status
|
uint32_t status; // query status
|
||||||
void* qinfo;
|
void* qinfo;
|
||||||
uint8_t scanFlag; // denotes reversed scan of data or not
|
uint8_t scanFlag; // denotes reversed scan of data or not
|
||||||
void* pTsdbReadHandle;
|
void* pTsdbReadHandle;
|
||||||
|
|
||||||
int32_t prevGroupId; // previous executed group id
|
int32_t prevGroupId; // previous executed group id
|
||||||
bool enableGroupData;
|
bool enableGroupData;
|
||||||
SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
||||||
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
||||||
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
||||||
char* keyBuf; // window key buffer
|
char* keyBuf; // window key buffer
|
||||||
// The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
// The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
||||||
char** prevRow;
|
char** prevRow;
|
||||||
SResultRowPool* pool;
|
SResultRowPool* pool;
|
||||||
|
|
||||||
SArray* prevResult; // intermediate result, SArray<SInterResult>
|
SArray* prevResult; // intermediate result, SArray<SInterResult>
|
||||||
STSBuf* pTsBuf; // timestamp filter list
|
STSBuf* pTsBuf; // timestamp filter list
|
||||||
STSCursor cur;
|
STSCursor cur;
|
||||||
|
|
||||||
char* tagVal; // tag value of current data block
|
char* tagVal; // tag value of current data block
|
||||||
struct SScalarFunctionSupport* scalarSup;
|
struct SScalarFunctionSupport* scalarSup;
|
||||||
|
|
||||||
SSDataBlock* outputBuf;
|
SSDataBlock* outputBuf;
|
||||||
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
||||||
struct SOperatorInfo* proot;
|
struct SOperatorInfo* proot;
|
||||||
SGroupResInfo groupResInfo;
|
SGroupResInfo groupResInfo;
|
||||||
int64_t currentOffset; // dynamic offset value
|
int64_t currentOffset; // dynamic offset value
|
||||||
|
|
||||||
STableQueryInfo* current;
|
STableQueryInfo* current;
|
||||||
SRspResultInfo resultInfo;
|
SRspResultInfo resultInfo;
|
||||||
|
@ -328,7 +328,7 @@ typedef struct SOperatorInfo {
|
||||||
char* name; // name, used to show the query execution plan
|
char* name; // name, used to show the query execution plan
|
||||||
void* info; // extension attribution
|
void* info; // extension attribution
|
||||||
SExprInfo* pExpr;
|
SExprInfo* pExpr;
|
||||||
STaskRuntimeEnv* pRuntimeEnv; // todo remove it
|
STaskRuntimeEnv* pRuntimeEnv; // todo remove it
|
||||||
SExecTaskInfo* pTaskInfo;
|
SExecTaskInfo* pTaskInfo;
|
||||||
SOperatorCostInfo cost;
|
SOperatorCostInfo cost;
|
||||||
|
|
||||||
|
@ -365,28 +365,6 @@ typedef struct SQInfo {
|
||||||
STaskCostInfo summary;
|
STaskCostInfo summary;
|
||||||
} SQInfo;
|
} SQInfo;
|
||||||
|
|
||||||
typedef struct STaskParam {
|
|
||||||
char* sql;
|
|
||||||
char* tagCond;
|
|
||||||
char* colCond;
|
|
||||||
char* tbnameCond;
|
|
||||||
char* prevResult;
|
|
||||||
SArray* pTableIdList;
|
|
||||||
SExprBasicInfo** pExpr;
|
|
||||||
SExprBasicInfo** pSecExpr;
|
|
||||||
SExprInfo* pExprs;
|
|
||||||
SExprInfo* pSecExprs;
|
|
||||||
|
|
||||||
SFilterInfo* pFilters;
|
|
||||||
|
|
||||||
SColIndex* pGroupColIndex;
|
|
||||||
SColumnInfo* pTagColumnInfo;
|
|
||||||
SGroupbyExpr* pGroupbyExpr;
|
|
||||||
int32_t tableScanOperator;
|
|
||||||
SArray* pOperator;
|
|
||||||
struct SUdfInfo* pUdfInfo;
|
|
||||||
} STaskParam;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
EX_SOURCE_DATA_NOT_READY = 0x1,
|
EX_SOURCE_DATA_NOT_READY = 0x1,
|
||||||
EX_SOURCE_DATA_READY = 0x2,
|
EX_SOURCE_DATA_READY = 0x2,
|
||||||
|
@ -472,75 +450,75 @@ typedef struct SSysTableScanInfo {
|
||||||
} SSysTableScanInfo;
|
} SSysTableScanInfo;
|
||||||
|
|
||||||
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;
|
||||||
int32_t capacity;
|
int32_t capacity;
|
||||||
} SOptrBasicInfo;
|
} SOptrBasicInfo;
|
||||||
|
|
||||||
//TODO move the resultrowsiz together with SOptrBasicInfo:rowCellInfoOffset
|
//TODO move the resultrowsiz together with SOptrBasicInfo:rowCellInfoOffset
|
||||||
typedef struct SAggSupporter {
|
typedef struct SAggSupporter {
|
||||||
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
SHashObj* pResultRowHashTable; // quick locate the window object for each result
|
||||||
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
SHashObj* pResultRowListSet; // used to check if current ResultRowInfo has ResultRow object or not
|
||||||
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
SArray* pResultRowArrayList; // The array list that contains the Result rows
|
||||||
char* keyBuf; // window key buffer
|
char* keyBuf; // window key buffer
|
||||||
SResultRowPool *pool; // The window result objects pool, all the resultRow Objects are allocated and managed by this object.
|
SDiskbasedBuf *pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
|
int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
|
||||||
} SAggSupporter;
|
} SAggSupporter;
|
||||||
|
|
||||||
typedef struct STableIntervalOperatorInfo {
|
typedef struct STableIntervalOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
SDiskbasedBuf *pResultBuf; // query result buffer based on blocked-wised disk file
|
SGroupResInfo groupResInfo;
|
||||||
SGroupResInfo groupResInfo;
|
SInterval interval;
|
||||||
SInterval interval;
|
STimeWindow win;
|
||||||
STimeWindow win;
|
int32_t precision;
|
||||||
int32_t precision;
|
bool timeWindowInterpo;
|
||||||
bool timeWindowInterpo;
|
char **pRow;
|
||||||
char **pRow;
|
SAggSupporter aggSup;
|
||||||
SAggSupporter aggSup;
|
STableQueryInfo *pCurrent;
|
||||||
STableQueryInfo *pCurrent;
|
int32_t order;
|
||||||
int32_t order;
|
|
||||||
} STableIntervalOperatorInfo;
|
} STableIntervalOperatorInfo;
|
||||||
|
|
||||||
typedef struct SAggOperatorInfo {
|
typedef struct SAggOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
SDiskbasedBuf *pResultBuf; // query result buffer based on blocked-wised disk file
|
SDiskbasedBuf *pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
SAggSupporter aggSup;
|
SAggSupporter aggSup;
|
||||||
STableQueryInfo *current;
|
STableQueryInfo *current;
|
||||||
uint32_t groupId;
|
uint32_t groupId;
|
||||||
SGroupResInfo groupResInfo;
|
SGroupResInfo groupResInfo;
|
||||||
STableQueryInfo *pTableQueryInfo;
|
STableQueryInfo *pTableQueryInfo;
|
||||||
} SAggOperatorInfo;
|
} SAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct SProjectOperatorInfo {
|
typedef struct SProjectOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
SSDataBlock* existDataBlock;
|
SSDataBlock *existDataBlock;
|
||||||
|
int32_t threshold;
|
||||||
|
bool hasVarCol;
|
||||||
} SProjectOperatorInfo;
|
} SProjectOperatorInfo;
|
||||||
|
|
||||||
typedef struct SLimitOperatorInfo {
|
typedef struct SLimitOperatorInfo {
|
||||||
int64_t limit;
|
SLimit limit;
|
||||||
int64_t total;
|
int64_t currentOffset;
|
||||||
|
int64_t currentRows;
|
||||||
} SLimitOperatorInfo;
|
} SLimitOperatorInfo;
|
||||||
|
|
||||||
typedef struct SSLimitOperatorInfo {
|
typedef struct SSLimitOperatorInfo {
|
||||||
int64_t groupTotal;
|
int64_t groupTotal;
|
||||||
int64_t currentGroupOffset;
|
int64_t currentGroupOffset;
|
||||||
|
int64_t rowsTotal;
|
||||||
int64_t rowsTotal;
|
int64_t currentOffset;
|
||||||
int64_t currentOffset;
|
SLimit limit;
|
||||||
SLimit limit;
|
SLimit slimit;
|
||||||
SLimit slimit;
|
char** prevRow;
|
||||||
|
SArray* orderColumnList;
|
||||||
char** prevRow;
|
bool hasPrev;
|
||||||
SArray* orderColumnList;
|
bool ignoreCurrentGroup;
|
||||||
bool hasPrev;
|
bool multigroupResult;
|
||||||
bool ignoreCurrentGroup;
|
SSDataBlock* pRes; // result buffer
|
||||||
bool multigroupResult;
|
SSDataBlock* pPrevBlock;
|
||||||
SSDataBlock* pRes; // result buffer
|
int64_t capacity;
|
||||||
SSDataBlock* pPrevBlock;
|
int64_t threshold;
|
||||||
int64_t capacity;
|
|
||||||
int64_t threshold;
|
|
||||||
} SSLimitOperatorInfo;
|
} SSLimitOperatorInfo;
|
||||||
|
|
||||||
typedef struct SFilterOperatorInfo {
|
typedef struct SFilterOperatorInfo {
|
||||||
|
@ -563,14 +541,15 @@ typedef struct SGroupbyOperatorInfo {
|
||||||
char* prevData; // previous group by value
|
char* prevData; // previous group by value
|
||||||
} SGroupbyOperatorInfo;
|
} SGroupbyOperatorInfo;
|
||||||
|
|
||||||
typedef struct SSWindowOperatorInfo {
|
typedef struct SSessionAggOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
|
SAggSupporter aggSup;
|
||||||
STimeWindow curWindow; // current time window
|
STimeWindow curWindow; // current time window
|
||||||
TSKEY prevTs; // previous timestamp
|
TSKEY prevTs; // previous timestamp
|
||||||
int32_t numOfRows; // number of rows
|
int32_t numOfRows; // number of rows
|
||||||
int32_t start; // start row index
|
int32_t start; // start row index
|
||||||
bool reptScan; // next round scan
|
bool reptScan; // next round scan
|
||||||
} SSWindowOperatorInfo;
|
} SSessionAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct SStateWindowOperatorInfo {
|
typedef struct SStateWindowOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
|
@ -582,23 +561,6 @@ typedef struct SStateWindowOperatorInfo {
|
||||||
bool reptScan;
|
bool reptScan;
|
||||||
} SStateWindowOperatorInfo;
|
} SStateWindowOperatorInfo;
|
||||||
|
|
||||||
typedef struct SDistinctDataInfo {
|
|
||||||
int32_t index;
|
|
||||||
int32_t type;
|
|
||||||
int32_t bytes;
|
|
||||||
} SDistinctDataInfo;
|
|
||||||
|
|
||||||
typedef struct SDistinctOperatorInfo {
|
|
||||||
SHashObj* pSet;
|
|
||||||
SSDataBlock* pRes;
|
|
||||||
bool recordNullVal; // has already record the null value, no need to try again
|
|
||||||
int64_t threshold;
|
|
||||||
int64_t outputCapacity;
|
|
||||||
int32_t totalBytes;
|
|
||||||
char* buf;
|
|
||||||
SArray* pDistinctDataInfo;
|
|
||||||
} SDistinctOperatorInfo;
|
|
||||||
|
|
||||||
typedef struct SSortedMergeOperatorInfo {
|
typedef struct SSortedMergeOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
bool hasVarCol;
|
bool hasVarCol;
|
||||||
|
@ -624,45 +586,61 @@ typedef struct SSortedMergeOperatorInfo {
|
||||||
} SSortedMergeOperatorInfo;
|
} SSortedMergeOperatorInfo;
|
||||||
|
|
||||||
typedef struct SOrderOperatorInfo {
|
typedef struct SOrderOperatorInfo {
|
||||||
uint32_t sortBufSize; // max buffer size for in-memory sort
|
uint32_t sortBufSize; // max buffer size for in-memory sort
|
||||||
SSDataBlock *pDataBlock;
|
SSDataBlock *pDataBlock;
|
||||||
bool hasVarCol; // has variable length column, such as binary/varchar/nchar
|
bool hasVarCol; // has variable length column, such as binary/varchar/nchar
|
||||||
SArray *orderInfo;
|
SArray *orderInfo;
|
||||||
bool nullFirst;
|
bool nullFirst;
|
||||||
SSortHandle *pSortHandle;
|
SSortHandle *pSortHandle;
|
||||||
|
int32_t bufPageSize;
|
||||||
int32_t bufPageSize;
|
int32_t numOfRowsInRes;
|
||||||
int32_t numOfRowsInRes;
|
|
||||||
|
|
||||||
// TODO extact struct
|
// TODO extact struct
|
||||||
int64_t startTs; // sort start time
|
int64_t startTs; // sort start time
|
||||||
uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included.
|
uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included.
|
||||||
uint64_t totalSize; // total load bytes from remote
|
uint64_t totalSize; // total load bytes from remote
|
||||||
uint64_t totalRows; // total number of rows
|
uint64_t totalRows; // total number of rows
|
||||||
uint64_t totalElapsed; // total elapsed time
|
uint64_t totalElapsed; // total elapsed time
|
||||||
} SOrderOperatorInfo;
|
} SOrderOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SDistinctDataInfo {
|
||||||
|
int32_t index;
|
||||||
|
int32_t type;
|
||||||
|
int32_t bytes;
|
||||||
|
} SDistinctDataInfo;
|
||||||
|
|
||||||
|
typedef struct SDistinctOperatorInfo {
|
||||||
|
SHashObj* pSet;
|
||||||
|
SSDataBlock* pRes;
|
||||||
|
bool recordNullVal; // has already record the null value, no need to try again
|
||||||
|
int64_t threshold;
|
||||||
|
int64_t outputCapacity;
|
||||||
|
int32_t totalBytes;
|
||||||
|
char* buf;
|
||||||
|
SArray* pDistinctDataInfo;
|
||||||
|
} SDistinctOperatorInfo;
|
||||||
|
|
||||||
SOperatorInfo* createExchangeOperatorInfo(const SNodeList* pSources, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createExchangeOperatorInfo(const SNodeList* pSources, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput,
|
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput,
|
||||||
int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
int32_t repeatTime, int32_t reverseTime, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock,
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SSDataBlock* pResultBlock, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
||||||
SOperatorInfo* createMultiTableAggOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SSDataBlock* pResultBlock, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
SOperatorInfo* createMultiTableAggOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo, const STableGroupInfo* pTableGroupInfo);
|
||||||
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t num, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createOrderOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SArray* pOrderVal, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createOrderOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SArray* pOrderVal, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t numOfDownstream, SArray* pExprInfo, SArray* pOrderVal, SArray* pGroupInfo, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t numOfDownstream, SExprInfo* pExprInfo, int32_t num, SArray* pOrderVal, SArray* pGroupInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, const SArray* pExprInfo, const SSchema* pSchema,
|
SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, const SArray* pExprInfo, const SSchema* pSchema,
|
||||||
int32_t tableType, SEpSet epset, SExecTaskInfo* pTaskInfo);
|
int32_t tableType, SEpSet epset, SExecTaskInfo* pTaskInfo);
|
||||||
|
SOperatorInfo* createLimitOperatorInfo(SOperatorInfo* downstream, int32_t numOfDownstream, SLimit* pLimit, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval,
|
||||||
SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SArray* pExprInfo, SInterval* pInterval, SExecTaskInfo* pTaskInfo);
|
const STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
|
||||||
|
SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createLimitOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream);
|
|
||||||
|
|
||||||
|
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
|
||||||
SOperatorInfo* createAllTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
SOperatorInfo* createAllTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
|
||||||
SExprInfo* pExpr, int32_t numOfOutput);
|
SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
SOperatorInfo* createSWindowOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
|
||||||
int32_t numOfOutput);
|
|
||||||
SOperatorInfo* createFillOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
SOperatorInfo* createFillOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
||||||
int32_t numOfOutput, bool multigroupResult);
|
int32_t numOfOutput, bool multigroupResult);
|
||||||
SOperatorInfo* createGroupbyOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
SOperatorInfo* createGroupbyOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream, SExprInfo* pExpr,
|
||||||
|
@ -699,16 +677,13 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO
|
||||||
void* doDestroyFilterInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols);
|
void* doDestroyFilterInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols);
|
||||||
|
|
||||||
void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order);
|
void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order);
|
||||||
void finalizeQueryResult(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo,
|
void finalizeQueryResult(SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
int32_t* rowCellInfoOffset);
|
|
||||||
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t* bufCapacity);
|
||||||
void copyTsColoum(SSDataBlock* pRes, SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
void copyTsColoum(SSDataBlock* pRes, SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
|
|
||||||
int32_t createQueryFilter(char* data, uint16_t len, SFilterInfo** pFilters);
|
int32_t createQueryFilter(char* data, uint16_t len, SFilterInfo** pFilters);
|
||||||
|
|
||||||
int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo* pQInfo, STaskParam* param, char* start,
|
|
||||||
int32_t prevResultLen, void* merger);
|
|
||||||
|
|
||||||
int32_t createFilterInfo(STaskAttr* pQueryAttr, uint64_t qId);
|
int32_t createFilterInfo(STaskAttr* pQueryAttr, uint64_t qId);
|
||||||
void freeColumnFilterInfo(SColumnFilterInfo* pFilter, int32_t numOfFilters);
|
void freeColumnFilterInfo(SColumnFilterInfo* pFilter, int32_t numOfFilters);
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,8 @@ static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pBuf->allocSize = sizeof(SRetrieveTableRsp) + pDispatcher->pSchema->resultRowSize * pInput->pData->info.rows;
|
// struct size + data payload + length for each column
|
||||||
|
pBuf->allocSize = sizeof(SRetrieveTableRsp) + pDispatcher->pSchema->resultRowSize * pInput->pData->info.rows + pInput->pData->info.numOfCols * sizeof(int32_t);
|
||||||
pBuf->pData = malloc(pBuf->allocSize);
|
pBuf->pData = malloc(pBuf->allocSize);
|
||||||
if (pBuf->pData == NULL) {
|
if (pBuf->pData == NULL) {
|
||||||
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
||||||
|
|
|
@ -59,7 +59,8 @@ int32_t initResultRowInfo(SResultRowInfo *pResultRowInfo, int32_t size) {
|
||||||
pResultRowInfo->capacity = size;
|
pResultRowInfo->capacity = size;
|
||||||
|
|
||||||
pResultRowInfo->pResult = calloc(pResultRowInfo->capacity, POINTER_BYTES);
|
pResultRowInfo->pResult = calloc(pResultRowInfo->capacity, POINTER_BYTES);
|
||||||
if (pResultRowInfo->pResult == NULL) {
|
pResultRowInfo->pPosition = calloc(pResultRowInfo->capacity, sizeof(SResultRowPosition));
|
||||||
|
if (pResultRowInfo->pResult == NULL || pResultRowInfo->pPosition == NULL) {
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,22 +183,6 @@ size_t getResultRowSize(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||||
return rowSize;
|
return rowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size) {
|
|
||||||
SResultRowPool* p = calloc(1, sizeof(SResultRowPool));
|
|
||||||
if (p == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->numOfElemPerBlock = 128;
|
|
||||||
|
|
||||||
p->elemSize = (int32_t) size;
|
|
||||||
p->blockSize = p->numOfElemPerBlock * p->elemSize;
|
|
||||||
p->position.pos = 0;
|
|
||||||
|
|
||||||
p->pData = taosArrayInit(8, POINTER_BYTES);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
SResultRow* getNewResultRow(SResultRowPool* p) {
|
SResultRow* getNewResultRow(SResultRowPool* p) {
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -221,132 +206,6 @@ SResultRow* getNewResultRow(SResultRowPool* p) {
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t getResultRowPoolMemSize(SResultRowPool* p) {
|
|
||||||
if (p == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return taosArrayGetSize(p->pData) * p->blockSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getNumOfAllocatedResultRows(SResultRowPool* p) {
|
|
||||||
return (int32_t) taosArrayGetSize(p->pData) * p->numOfElemPerBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getNumOfUsedResultRows(SResultRowPool* p) {
|
|
||||||
return getNumOfAllocatedResultRows(p) - p->numOfElemPerBlock + p->position.pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* destroyResultRowPool(SResultRowPool* p) {
|
|
||||||
if (p == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(p->pData);
|
|
||||||
for(int32_t i = 0; i < size; ++i) {
|
|
||||||
void** ptr = taosArrayGet(p->pData, i);
|
|
||||||
tfree(*ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(p->pData);
|
|
||||||
|
|
||||||
tfree(p);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void interResToBinary(SBufferWriter* bw, SArray* pRes, int32_t tagLen) {
|
|
||||||
uint32_t numOfGroup = (uint32_t) taosArrayGetSize(pRes);
|
|
||||||
tbufWriteUint32(bw, numOfGroup);
|
|
||||||
tbufWriteUint16(bw, tagLen);
|
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfGroup; ++i) {
|
|
||||||
SInterResult* pOne = taosArrayGet(pRes, i);
|
|
||||||
if (tagLen > 0) {
|
|
||||||
tbufWriteBinary(bw, pOne->tags, tagLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t numOfCols = (uint32_t) taosArrayGetSize(pOne->pResult);
|
|
||||||
tbufWriteUint32(bw, numOfCols);
|
|
||||||
for(int32_t j = 0; j < numOfCols; ++j) {
|
|
||||||
SStddevInterResult* p = taosArrayGet(pOne->pResult, j);
|
|
||||||
uint32_t numOfRows = (uint32_t) taosArrayGetSize(p->pResult);
|
|
||||||
|
|
||||||
tbufWriteUint16(bw, p->colId);
|
|
||||||
tbufWriteUint32(bw, numOfRows);
|
|
||||||
|
|
||||||
for(int32_t k = 0; k < numOfRows; ++k) {
|
|
||||||
// SResPair v = *(SResPair*) taosArrayGet(p->pResult, k);
|
|
||||||
// tbufWriteDouble(bw, v.avg);
|
|
||||||
// tbufWriteInt64(bw, v.key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* interResFromBinary(const char* data, int32_t len) {
|
|
||||||
SBufferReader br = tbufInitReader(data, len, false);
|
|
||||||
uint32_t numOfGroup = tbufReadUint32(&br);
|
|
||||||
uint16_t tagLen = tbufReadUint16(&br);
|
|
||||||
|
|
||||||
char* tag = NULL;
|
|
||||||
if (tagLen > 0) {
|
|
||||||
tag = calloc(1, tagLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* pResult = taosArrayInit(4, sizeof(SInterResult));
|
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfGroup; ++i) {
|
|
||||||
if (tagLen > 0) {
|
|
||||||
memset(tag, 0, tagLen);
|
|
||||||
tbufReadToBinary(&br, tag, tagLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t numOfCols = tbufReadUint32(&br);
|
|
||||||
|
|
||||||
SArray* p = taosArrayInit(numOfCols, sizeof(SStddevInterResult));
|
|
||||||
for(int32_t j = 0; j < numOfCols; ++j) {
|
|
||||||
// int16_t colId = tbufReadUint16(&br);
|
|
||||||
int32_t numOfRows = tbufReadUint32(&br);
|
|
||||||
|
|
||||||
// SStddevInterResult interRes = {.colId = colId, .pResult = taosArrayInit(4, sizeof(struct SResPair)),};
|
|
||||||
for(int32_t k = 0; k < numOfRows; ++k) {
|
|
||||||
// SResPair px = {0};
|
|
||||||
// px.avg = tbufReadDouble(&br);
|
|
||||||
// px.key = tbufReadInt64(&br);
|
|
||||||
//
|
|
||||||
// taosArrayPush(interRes.pResult, &px);
|
|
||||||
}
|
|
||||||
|
|
||||||
// taosArrayPush(p, &interRes);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* p1 = NULL;
|
|
||||||
if (tagLen > 0) {
|
|
||||||
p1 = malloc(tagLen);
|
|
||||||
memcpy(p1, tag, tagLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
SInterResult d = {.pResult = p, .tags = p1,};
|
|
||||||
taosArrayPush(pResult, &d);
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(tag);
|
|
||||||
return pResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
void freeInterResult(void* param) {
|
|
||||||
SInterResult* pResult = (SInterResult*) param;
|
|
||||||
tfree(pResult->tags);
|
|
||||||
|
|
||||||
int32_t numOfCols = (int32_t) taosArrayGetSize(pResult->pResult);
|
|
||||||
for(int32_t i = 0; i < numOfCols; ++i) {
|
|
||||||
SStddevInterResult *p = taosArrayGet(pResult->pResult, i);
|
|
||||||
taosArrayDestroy(p->pResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(pResult->pResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cleanupGroupResInfo(SGroupResInfo* pGroupResInfo) {
|
void cleanupGroupResInfo(SGroupResInfo* pGroupResInfo) {
|
||||||
assert(pGroupResInfo != NULL);
|
assert(pGroupResInfo != NULL);
|
||||||
|
|
||||||
|
@ -360,7 +219,7 @@ void initGroupResInfo(SGroupResInfo* pGroupResInfo, SResultRowInfo* pResultInfo)
|
||||||
taosArrayDestroy(pGroupResInfo->pRows);
|
taosArrayDestroy(pGroupResInfo->pRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
pGroupResInfo->pRows = taosArrayFromList(pResultInfo->pResult, pResultInfo->size, POINTER_BYTES);
|
pGroupResInfo->pRows = taosArrayFromList(pResultInfo->pPosition, pResultInfo->size, sizeof(SResultRowPosition));
|
||||||
pGroupResInfo->index = 0;
|
pGroupResInfo->index = 0;
|
||||||
assert(pGroupResInfo->index <= getNumOfTotalRes(pGroupResInfo));
|
assert(pGroupResInfo->index <= getNumOfTotalRes(pGroupResInfo));
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -37,7 +37,6 @@ typedef struct SSortHandle {
|
||||||
|
|
||||||
SArray *pOrderInfo;
|
SArray *pOrderInfo;
|
||||||
bool nullFirst;
|
bool nullFirst;
|
||||||
bool hasVarCol;
|
|
||||||
SArray *pOrderedSource;
|
SArray *pOrderedSource;
|
||||||
|
|
||||||
_sort_fetch_block_fn_t fetchfp;
|
_sort_fetch_block_fn_t fetchfp;
|
||||||
|
@ -77,6 +76,10 @@ static SSDataBlock* createDataBlock_rv(SSchema* pSchema, int32_t numOfCols) {
|
||||||
colInfo.info.bytes = pSchema[i].bytes;
|
colInfo.info.bytes = pSchema[i].bytes;
|
||||||
colInfo.info.colId = pSchema[i].colId;
|
colInfo.info.colId = pSchema[i].colId;
|
||||||
taosArrayPush(pBlock->pDataBlock, &colInfo);
|
taosArrayPush(pBlock->pDataBlock, &colInfo);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(colInfo.info.type)) {
|
||||||
|
pBlock->info.hasVarCol = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pBlock;
|
return pBlock;
|
||||||
|
@ -155,7 +158,7 @@ static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) {
|
||||||
|
|
||||||
while(start < pDataBlock->info.rows) {
|
while(start < pDataBlock->info.rows) {
|
||||||
int32_t stop = 0;
|
int32_t stop = 0;
|
||||||
blockDataSplitRows(pDataBlock, pHandle->hasVarCol, start, &stop, pHandle->pageSize);
|
blockDataSplitRows(pDataBlock, pDataBlock->info.hasVarCol, start, &stop, pHandle->pageSize);
|
||||||
SSDataBlock* p = blockDataExtractBlock(pDataBlock, start, stop - start + 1);
|
SSDataBlock* p = blockDataExtractBlock(pDataBlock, start, stop - start + 1);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
|
@ -179,7 +182,7 @@ static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) {
|
||||||
start = stop + 1;
|
start = stop + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockDataClearup(pDataBlock, pHandle->hasVarCol);
|
blockDataClearup(pDataBlock);
|
||||||
|
|
||||||
SSDataBlock* pBlock = createOneDataBlock(pDataBlock);
|
SSDataBlock* pBlock = createOneDataBlock(pDataBlock);
|
||||||
int32_t code = doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId);
|
int32_t code = doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId);
|
||||||
|
@ -309,7 +312,7 @@ static int32_t adjustMergeTreeForNextTuple(SExternalMemSource *pSource, SMultiwa
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SMsortComparParam* cmpParam, int32_t capacity) {
|
static SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SMsortComparParam* cmpParam, int32_t capacity) {
|
||||||
blockDataClearup(pHandle->pDataBlock, pHandle->hasVarCol);
|
blockDataClearup(pHandle->pDataBlock);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
if (cmpParam->numOfSources == pHandle->numOfCompletedSources) {
|
if (cmpParam->numOfSources == pHandle->numOfCompletedSources) {
|
||||||
|
@ -475,7 +478,7 @@ static int32_t doInternalMergeSort(SSortHandle* pHandle) {
|
||||||
setBufPageDirty(pPage, true);
|
setBufPageDirty(pPage, true);
|
||||||
releaseBufPage(pHandle->pBuf, pPage);
|
releaseBufPage(pHandle->pBuf, pPage);
|
||||||
|
|
||||||
blockDataClearup(pDataBlock, pHandle->hasVarCol);
|
blockDataClearup(pDataBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
tMergeTreeDestroy(pHandle->pMergeTree);
|
tMergeTreeDestroy(pHandle->pMergeTree);
|
||||||
|
|
|
@ -55,8 +55,7 @@ typedef struct SDummyInputInfo {
|
||||||
SSDataBlock* pBlock;
|
SSDataBlock* pBlock;
|
||||||
} SDummyInputInfo;
|
} SDummyInputInfo;
|
||||||
|
|
||||||
SSDataBlock* getDummyBlock(void* param, bool* newgroup) {
|
SSDataBlock* getDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
SOperatorInfo* pOperator = static_cast<SOperatorInfo*>(param);
|
|
||||||
SDummyInputInfo* pInfo = static_cast<SDummyInputInfo*>(pOperator->info);
|
SDummyInputInfo* pInfo = static_cast<SDummyInputInfo*>(pOperator->info);
|
||||||
if (pInfo->current >= pInfo->totalPages) {
|
if (pInfo->current >= pInfo->totalPages) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -87,7 +86,7 @@ SSDataBlock* getDummyBlock(void* param, bool* newgroup) {
|
||||||
//
|
//
|
||||||
// taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
// taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
||||||
} else {
|
} else {
|
||||||
blockDataClearup(pInfo->pBlock, true);
|
blockDataClearup(pInfo->pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = pInfo->pBlock;
|
SSDataBlock* pBlock = pInfo->pBlock;
|
||||||
|
@ -122,8 +121,7 @@ SSDataBlock* getDummyBlock(void* param, bool* newgroup) {
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* get2ColsDummyBlock(void* param, bool* newgroup) {
|
SSDataBlock* get2ColsDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
SOperatorInfo* pOperator = static_cast<SOperatorInfo*>(param);
|
|
||||||
SDummyInputInfo* pInfo = static_cast<SDummyInputInfo*>(pOperator->info);
|
SDummyInputInfo* pInfo = static_cast<SDummyInputInfo*>(pOperator->info);
|
||||||
if (pInfo->current >= pInfo->totalPages) {
|
if (pInfo->current >= pInfo->totalPages) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -153,7 +151,7 @@ SSDataBlock* get2ColsDummyBlock(void* param, bool* newgroup) {
|
||||||
|
|
||||||
taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
taosArrayPush(pInfo->pBlock->pDataBlock, &colInfo1);
|
||||||
} else {
|
} else {
|
||||||
blockDataClearup(pInfo->pBlock, false);
|
blockDataClearup(pInfo->pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = pInfo->pBlock;
|
SSDataBlock* pBlock = pInfo->pBlock;
|
||||||
|
|
|
@ -46,13 +46,6 @@ extern SAggFunctionInfo aggFunc[35];
|
||||||
#define DATA_SET_FLAG ',' // to denote the output area has data, not null value
|
#define DATA_SET_FLAG ',' // to denote the output area has data, not null value
|
||||||
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)
|
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)
|
||||||
|
|
||||||
#define TOP_BOTTOM_QUERY_LIMIT 100
|
|
||||||
|
|
||||||
#define QUERY_IS_STABLE_QUERY(type) (((type)&TSDB_QUERY_TYPE_STABLE_QUERY) != 0)
|
|
||||||
#define QUERY_IS_JOIN_QUERY(type) (TSDB_QUERY_HAS_TYPE(type, TSDB_QUERY_TYPE_JOIN_QUERY))
|
|
||||||
#define QUERY_IS_PROJECTION_QUERY(type) (((type)&TSDB_QUERY_TYPE_PROJECTION_QUERY) != 0)
|
|
||||||
#define QUERY_IS_FREE_RESOURCE(type) (((type)&TSDB_QUERY_TYPE_FREE_RESOURCE) != 0)
|
|
||||||
|
|
||||||
typedef struct SInterpInfoDetail {
|
typedef struct SInterpInfoDetail {
|
||||||
TSKEY ts; // interp specified timestamp
|
TSKEY ts; // interp specified timestamp
|
||||||
int8_t type;
|
int8_t type;
|
||||||
|
@ -61,9 +54,6 @@ typedef struct SInterpInfoDetail {
|
||||||
|
|
||||||
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowEntryInfo)))
|
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowEntryInfo)))
|
||||||
|
|
||||||
#define IS_STREAM_QUERY_VALID(x) (((x)&TSDB_FUNCSTATE_STREAM) != 0)
|
|
||||||
#define IS_MULTIOUTPUT(x) (((x)&TSDB_FUNCSTATE_MO) != 0)
|
|
||||||
|
|
||||||
typedef struct STwaInfo {
|
typedef struct STwaInfo {
|
||||||
int8_t hasResult; // flag to denote has value
|
int8_t hasResult; // flag to denote has value
|
||||||
double dOutput;
|
double dOutput;
|
||||||
|
@ -71,8 +61,6 @@ typedef struct STwaInfo {
|
||||||
STimeWindow win;
|
STimeWindow win;
|
||||||
} STwaInfo;
|
} STwaInfo;
|
||||||
|
|
||||||
extern int32_t functionCompatList[]; // compatible check array list
|
|
||||||
|
|
||||||
bool topbot_datablock_filter(SqlFunctionCtx *pCtx, const char *minval, const char *maxval);
|
bool topbot_datablock_filter(SqlFunctionCtx *pCtx, const char *minval, const char *maxval);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -52,10 +52,6 @@ static void doFinalizer(SResultRowEntryInfo* pResInfo) { cleanupResultRowEntry(p
|
||||||
|
|
||||||
void functionFinalizer(SqlFunctionCtx *pCtx) {
|
void functionFinalizer(SqlFunctionCtx *pCtx) {
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
|
||||||
// setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
doFinalizer(pResInfo);
|
doFinalizer(pResInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,7 +394,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx *pCtx, int32_t isMinFunc) {
|
||||||
int32_t *pData = (int32_t*)pCol->pData;
|
int32_t *pData = (int32_t*)pCol->pData;
|
||||||
int32_t *val = (int32_t*) buf;
|
int32_t *val = (int32_t*) buf;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = start; i < start + numOfRows; ++i) {
|
||||||
if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
|
if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,415 +0,0 @@
|
||||||
#include "os.h"
|
|
||||||
#include "tarray.h"
|
|
||||||
#include "function.h"
|
|
||||||
#include "thash.h"
|
|
||||||
#include "taggfunction.h"
|
|
||||||
|
|
||||||
static SHashObj* functionHashTable = NULL;
|
|
||||||
static SHashObj* udfHashTable = NULL;
|
|
||||||
|
|
||||||
static void doInitFunctionHashTable() {
|
|
||||||
int numOfEntries = tListLen(aggFunc);
|
|
||||||
functionHashTable = taosHashInit(numOfEntries, MurmurHash3_32, false, false);
|
|
||||||
for (int32_t i = 0; i < numOfEntries; i++) {
|
|
||||||
int32_t len = (uint32_t)strlen(aggFunc[i].name);
|
|
||||||
|
|
||||||
SAggFunctionInfo* ptr = &aggFunc[i];
|
|
||||||
taosHashPut(functionHashTable, aggFunc[i].name, len, (void*)&ptr, POINTER_BYTES);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
numOfEntries = tListLen(scalarFunc);
|
|
||||||
for(int32_t i = 0; i < numOfEntries; ++i) {
|
|
||||||
int32_t len = (int32_t) strlen(scalarFunc[i].name);
|
|
||||||
SScalarFunctionInfo* ptr = &scalarFunc[i];
|
|
||||||
taosHashPut(functionHashTable, scalarFunc[i].name, len, (void*)&ptr, POINTER_BYTES);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
udfHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pthread_once_t functionHashTableInit = PTHREAD_ONCE_INIT;
|
|
||||||
|
|
||||||
int32_t qIsBuiltinFunction(const char* name, int32_t len, bool* scalarFunction) {
|
|
||||||
pthread_once(&functionHashTableInit, doInitFunctionHashTable);
|
|
||||||
|
|
||||||
SAggFunctionInfo** pInfo = taosHashGet(functionHashTable, name, len);
|
|
||||||
if (pInfo != NULL) {
|
|
||||||
*scalarFunction = ((*pInfo)->type == FUNCTION_TYPE_SCALAR);
|
|
||||||
return (*pInfo)->functionId;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* functionId) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool qIsAggregateFunction(const char* functionName) {
|
|
||||||
assert(functionName != NULL);
|
|
||||||
bool scalarfunc = false;
|
|
||||||
qIsBuiltinFunction(functionName, strlen(functionName), &scalarfunc);
|
|
||||||
|
|
||||||
return !scalarfunc;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool qIsSelectivityFunction(const char* functionName) {
|
|
||||||
assert(functionName != NULL);
|
|
||||||
pthread_once(&functionHashTableInit, doInitFunctionHashTable);
|
|
||||||
|
|
||||||
size_t len = strlen(functionName);
|
|
||||||
SAggFunctionInfo** pInfo = taosHashGet(functionHashTable, functionName, len);
|
|
||||||
if (pInfo != NULL) {
|
|
||||||
return ((*pInfo)->status | FUNCSTATE_SELECTIVITY) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SAggFunctionInfo* qGetFunctionInfo(const char* name, int32_t len) {
|
|
||||||
pthread_once(&functionHashTableInit, doInitFunctionHashTable);
|
|
||||||
|
|
||||||
SAggFunctionInfo** pInfo = taosHashGet(functionHashTable, name, len);
|
|
||||||
if (pInfo != NULL) {
|
|
||||||
return (*pInfo);
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void qAddUdfInfo(uint64_t id, SUdfInfo* pUdfInfo) {
|
|
||||||
int32_t len = (uint32_t)strlen(pUdfInfo->name);
|
|
||||||
taosHashPut(udfHashTable, pUdfInfo->name, len, (void*)&pUdfInfo, POINTER_BYTES);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qRemoveUdfInfo(uint64_t id, SUdfInfo* pUdfInfo) {
|
|
||||||
int32_t len = (uint32_t)strlen(pUdfInfo->name);
|
|
||||||
taosHashRemove(udfHashTable, pUdfInfo->name, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTagsQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
char* f = *(char**) taosArrayGet(pFunctionIdList, i);
|
|
||||||
|
|
||||||
// todo handle count(tbname) query
|
|
||||||
if (strcmp(f, "project") != 0 && strcmp(f, "count") != 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// "select count(tbname)" query
|
|
||||||
// if (functId == FUNCTION_COUNT && pExpr->base.colpDesc->colId == TSDB_TBNAME_COLUMN_INDEX) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//bool tscMultiRoundQuery(SArray* pFunctionIdList, int32_t index) {
|
|
||||||
// if (!UTIL_TABLE_IS_SUPER_TABLE(pQueryInfo->pTableMetaInfo[index])) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// size_t numOfExprs = (int32_t) getNumOfExprs(pQueryInfo);
|
|
||||||
// for(int32_t i = 0; i < numOfExprs; ++i) {
|
|
||||||
// SExprInfo* pExpr = getExprInfo(pQueryInfo, i);
|
|
||||||
// if (pExpr->base.functionId == FUNCTION_STDDEV_DST) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
|
|
||||||
bool isProjectionQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
char* f = *(char**) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (strcmp(f, "project") == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isDiffDerivativeQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_TS_DUMMY) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f == FUNCTION_DIFF || f == FUNCTION_DERIVATIVE) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isInterpQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_TAG || f == FUNCTION_TS) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f != FUNCTION_INTERP) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isArithmeticQueryOnAggResult(SArray* pFunctionIdList) {
|
|
||||||
if (isProjectionQuery(pFunctionIdList)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(0);
|
|
||||||
|
|
||||||
// size_t numOfOutput = getNumOfFields(pQueryInfo);
|
|
||||||
// for(int32_t i = 0; i < numOfOutput; ++i) {
|
|
||||||
// SExprInfo* pExprInfo = tscFieldInfoGetInternalField(&pQueryInfo->fieldsInfo, i)->pExpr;
|
|
||||||
// if (pExprInfo->pExpr != NULL) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isGroupbyColumn(SGroupbyExpr* pGroupby) {
|
|
||||||
return !pGroupby->groupbyTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTopBotQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
char* f = *(char**) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (strcmp(f, "project") == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(f, "top") == 0 || strcmp(f, "bottom") == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTsCompQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
if (num != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, 0);
|
|
||||||
return f == FUNCTION_TS_COMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTWAQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_TWA) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isIrateQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_IRATE) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isStabledev(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_STDDEV_DST) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool needReverseScan(SArray* pFunctionIdList) {
|
|
||||||
assert(0);
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (f == FUNCTION_TS || f == FUNCTION_TS_DUMMY || f == FUNCTION_TAG) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if ((f == FUNCTION_FIRST || f == FUNCTION_FIRST_DST) && pQueryInfo->order.order == TSDB_ORDER_DESC) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (f == FUNCTION_LAST || f == FUNCTION_LAST_DST) {
|
|
||||||
// the scan order to acquire the last result of the specified column
|
|
||||||
// int32_t order = (int32_t)pExpr->base.param[0].i64;
|
|
||||||
// if (order != pQueryInfo->order.order) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isAgg(SArray* pFunctionIdList) {
|
|
||||||
size_t size = taosArrayGetSize(pFunctionIdList);
|
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
|
||||||
char* f = *(char**) taosArrayGet(pFunctionIdList, i);
|
|
||||||
if (strcmp(f, "project") == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qIsAggregateFunction(f)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isBlockDistQuery(SArray* pFunctionIdList) {
|
|
||||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
char* f = *(char**) taosArrayGet(pFunctionIdList, 0);
|
|
||||||
return (num == 1 && strcmp(f, "block_dist") == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTwoStageSTableQuery(SArray* pFunctionIdList, int32_t tableIndex) {
|
|
||||||
// if (pQueryInfo == NULL) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableIndex);
|
|
||||||
// if (pTableMetaInfo == NULL) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if ((pQueryInfo->type & TSDB_QUERY_TYPE_FREE_RESOURCE) == TSDB_QUERY_TYPE_FREE_RESOURCE) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // for ordered projection query, iterate all qualified vnodes sequentially
|
|
||||||
// if (tscNonOrderedProjectionQueryOnSTable(pQueryInfo, tableIndex)) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!TSDB_QUERY_HAS_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_STABLE_SUBQUERY) && pQueryInfo->command == TSDB_SQL_SELECT) {
|
|
||||||
// return UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo);
|
|
||||||
// }
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isProjectionQueryOnSTable(SArray* pFunctionIdList, int32_t tableIndex) {
|
|
||||||
// STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableIndex);
|
|
||||||
//
|
|
||||||
// /*
|
|
||||||
// * In following cases, return false for non ordered project query on super table
|
|
||||||
// * 1. failed to get tableMeta from server; 2. not a super table; 3. limitation is 0;
|
|
||||||
// * 4. show queries, instead of a select query
|
|
||||||
// */
|
|
||||||
// size_t numOfExprs = getNumOfExprs(pQueryInfo);
|
|
||||||
// if (pTableMetaInfo == NULL || !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo) ||
|
|
||||||
// pQueryInfo->command == TSDB_SQL_RETRIEVE_EMPTY_RESULT || numOfExprs == 0) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int32_t i = 0; i < numOfExprs; ++i) {
|
|
||||||
// int32_t functionId = getExprInfo(pQueryInfo, i)->base.functionId;
|
|
||||||
//
|
|
||||||
// if (functionId < 0) {
|
|
||||||
// SUdfInfo* pUdfInfo = taosArrayGet(pQueryInfo->pUdfInfo, -1 * functionId - 1);
|
|
||||||
// if (pUdfInfo->funcType == TSDB_FUNC_TYPE_AGGREGATE) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (functionId != FUNCTION_PRJ &&
|
|
||||||
// functionId != FUNCTION_TAGPRJ &&
|
|
||||||
// functionId != FUNCTION_TAG &&
|
|
||||||
// functionId != FUNCTION_TS &&
|
|
||||||
// functionId != FUNCTION_ARITHM &&
|
|
||||||
// functionId != FUNCTION_TS_COMP &&
|
|
||||||
// functionId != FUNCTION_DIFF &&
|
|
||||||
// functionId != FUNCTION_DERIVATIVE &&
|
|
||||||
// functionId != FUNCTION_TS_DUMMY &&
|
|
||||||
// functionId != FUNCTION_TID_TAG) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasTagValOutput(SArray* pFunctionIdList) {
|
|
||||||
size_t size = taosArrayGetSize(pFunctionIdList);
|
|
||||||
|
|
||||||
// if (numOfExprs == 1 && pExpr1->base.functionId == FUNCTION_TS_COMP) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
|
||||||
int32_t functionId = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
|
|
||||||
// ts_comp column required the tag value for join filter
|
|
||||||
if (functionId == FUNCTION_TAG || functionId == FUNCTION_TAGPRJ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//bool timeWindowInterpoRequired(SArray* pFunctionIdList) {
|
|
||||||
// int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
|
||||||
// for (int32_t i = 0; i < num; ++i) {
|
|
||||||
// int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
|
||||||
// if (f == FUNCTION_TWA || f == FUNCTION_INTERP) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
|
|
||||||
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc) {
|
|
||||||
assert(pFunctionIdList != NULL);
|
|
||||||
|
|
||||||
pDesc->blockDistribution = isBlockDistQuery(pFunctionIdList);
|
|
||||||
if (pDesc->blockDistribution) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// pDesc->projectionQuery = isProjectionQuery(pFunctionIdList);
|
|
||||||
// pDesc->onlyTagQuery = isTagsQuery(pFunctionIdList);
|
|
||||||
pDesc->interpQuery = isInterpQuery(pFunctionIdList);
|
|
||||||
pDesc->topbotQuery = isTopBotQuery(pFunctionIdList);
|
|
||||||
pDesc->agg = isAgg(pFunctionIdList);
|
|
||||||
}
|
|
|
@ -580,6 +580,8 @@ static const char* jkIntervalPhysiPlanFuncs = "Funcs";
|
||||||
static const char* jkIntervalPhysiPlanInterval = "Interval";
|
static const char* jkIntervalPhysiPlanInterval = "Interval";
|
||||||
static const char* jkIntervalPhysiPlanOffset = "Offset";
|
static const char* jkIntervalPhysiPlanOffset = "Offset";
|
||||||
static const char* jkIntervalPhysiPlanSliding = "Sliding";
|
static const char* jkIntervalPhysiPlanSliding = "Sliding";
|
||||||
|
static const char* jkIntervalPhysiPlanIntervalUnit = "intervalUnit";
|
||||||
|
static const char* jkIntervalPhysiPlanSlidingUnit = "slidingUnit";
|
||||||
static const char* jkIntervalPhysiPlanFill = "Fill";
|
static const char* jkIntervalPhysiPlanFill = "Fill";
|
||||||
|
|
||||||
static int32_t physiIntervalNodeToJson(const void* pObj, SJson* pJson) {
|
static int32_t physiIntervalNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
@ -601,6 +603,12 @@ static int32_t physiIntervalNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddIntegerToObject(pJson, jkIntervalPhysiPlanSliding, pNode->sliding);
|
code = tjsonAddIntegerToObject(pJson, jkIntervalPhysiPlanSliding, pNode->sliding);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkIntervalPhysiPlanIntervalUnit, pNode->intervalUnit);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkIntervalPhysiPlanSlidingUnit, pNode->slidingUnit);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddObject(pJson, jkIntervalPhysiPlanFill, nodeToJson, pNode->pFill);
|
code = tjsonAddObject(pJson, jkIntervalPhysiPlanFill, nodeToJson, pNode->pFill);
|
||||||
}
|
}
|
||||||
|
@ -627,6 +635,12 @@ static int32_t jsonToPhysiIntervalNode(const SJson* pJson, void* pObj) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonGetBigIntValue(pJson, jkIntervalPhysiPlanSliding, &pNode->sliding);
|
code = tjsonGetBigIntValue(pJson, jkIntervalPhysiPlanSliding, &pNode->sliding);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetTinyIntValue(pJson, jkIntervalPhysiPlanIntervalUnit, &pNode->intervalUnit);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetTinyIntValue(pJson, jkIntervalPhysiPlanSlidingUnit, &pNode->slidingUnit);
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = jsonToNodeObject(pJson, jkIntervalPhysiPlanFill, (SNode**)&pNode->pFill);
|
code = jsonToNodeObject(pJson, jkIntervalPhysiPlanFill, (SNode**)&pNode->pFill);
|
||||||
}
|
}
|
||||||
|
@ -1644,7 +1658,10 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToSubplan(pJson, pObj);
|
return jsonToSubplan(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN:
|
case QUERY_NODE_PHYSICAL_PLAN:
|
||||||
return jsonToPlan(pJson, pObj);
|
return jsonToPlan(pJson, pObj);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_INTERVAL:
|
||||||
|
return jsonToPhysiIntervalNode(pJson, pObj);
|
||||||
default:
|
default:
|
||||||
|
assert(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
nodesWarn("jsonToSpecificNode unknown node = %s", nodesNodeName(nodeType(pObj)));
|
nodesWarn("jsonToSpecificNode unknown node = %s", nodesNodeName(nodeType(pObj)));
|
||||||
|
|
|
@ -310,9 +310,12 @@ static SLogicNode* createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SInt
|
||||||
pWindow->node.id = pCxt->planNodeId++;
|
pWindow->node.id = pCxt->planNodeId++;
|
||||||
|
|
||||||
pWindow->winType = WINDOW_TYPE_INTERVAL;
|
pWindow->winType = WINDOW_TYPE_INTERVAL;
|
||||||
pWindow->interval = ((SValueNode*)pInterval->pInterval)->datum.i;
|
SValueNode* pIntervalNode = (SValueNode*)((SRawExprNode*)(pInterval->pInterval))->pNode;
|
||||||
|
|
||||||
|
pWindow->interval = pIntervalNode->datum.i;
|
||||||
pWindow->offset = (NULL != pInterval->pOffset ? ((SValueNode*)pInterval->pOffset)->datum.i : 0);
|
pWindow->offset = (NULL != pInterval->pOffset ? ((SValueNode*)pInterval->pOffset)->datum.i : 0);
|
||||||
pWindow->sliding = (NULL != pInterval->pSliding ? ((SValueNode*)pInterval->pSliding)->datum.i : 0);
|
pWindow->sliding = (NULL != pInterval->pSliding ? ((SValueNode*)pInterval->pSliding)->datum.i : pWindow->interval);
|
||||||
|
|
||||||
if (NULL != pInterval->pFill) {
|
if (NULL != pInterval->pFill) {
|
||||||
pWindow->pFill = nodesCloneNode(pInterval->pFill);
|
pWindow->pFill = nodesCloneNode(pInterval->pFill);
|
||||||
CHECK_ALLOC(pWindow->pFill, (SLogicNode*)pWindow);
|
CHECK_ALLOC(pWindow->pFill, (SLogicNode*)pWindow);
|
||||||
|
|
|
@ -480,6 +480,9 @@ static SPhysiNode* createIntervalPhysiNode(SPhysiPlanContext* pCxt, SNodeList* p
|
||||||
pInterval->interval = pWindowLogicNode->interval;
|
pInterval->interval = pWindowLogicNode->interval;
|
||||||
pInterval->offset = pWindowLogicNode->offset;
|
pInterval->offset = pWindowLogicNode->offset;
|
||||||
pInterval->sliding = pWindowLogicNode->sliding;
|
pInterval->sliding = pWindowLogicNode->sliding;
|
||||||
|
pInterval->intervalUnit = pWindowLogicNode->intervalUnit;
|
||||||
|
pInterval->slidingUnit = pWindowLogicNode->slidingUnit;
|
||||||
|
|
||||||
pInterval->pFill = nodesCloneNode(pWindowLogicNode->pFill);
|
pInterval->pFill = nodesCloneNode(pWindowLogicNode->pFill);
|
||||||
|
|
||||||
SNodeList* pPrecalcExprs = NULL;
|
SNodeList* pPrecalcExprs = NULL;
|
||||||
|
|
|
@ -12,7 +12,7 @@ target_link_libraries(
|
||||||
PUBLIC os
|
PUBLIC os
|
||||||
PUBLIC util
|
PUBLIC util
|
||||||
PUBLIC common
|
PUBLIC common
|
||||||
PUBLIC zlib
|
PUBLIC zlibstatic
|
||||||
)
|
)
|
||||||
if (${BUILD_WITH_UV_TRANS})
|
if (${BUILD_WITH_UV_TRANS})
|
||||||
if (${BUILD_WITH_UV})
|
if (${BUILD_WITH_UV})
|
||||||
|
|
Loading…
Reference in New Issue