[td-10564]Add implementation in executor.
This commit is contained in:
parent
778dd8a1cc
commit
f69a885da5
|
@ -19,7 +19,7 @@
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
#include "tvariant.h"
|
||||||
//typedef struct STimeWindow {
|
//typedef struct STimeWindow {
|
||||||
// TSKEY skey;
|
// TSKEY skey;
|
||||||
// TSKEY ekey;
|
// TSKEY ekey;
|
||||||
|
@ -66,4 +66,44 @@ typedef struct SColumnInfoData {
|
||||||
char *pData; // the corresponding block data in memory
|
char *pData; // the corresponding block data in memory
|
||||||
} SColumnInfoData;
|
} SColumnInfoData;
|
||||||
|
|
||||||
|
//======================================================================================================================
|
||||||
|
// the following structure shared by parser and executor
|
||||||
|
typedef struct SLimit {
|
||||||
|
int64_t limit;
|
||||||
|
int64_t offset;
|
||||||
|
} SLimit;
|
||||||
|
|
||||||
|
typedef struct SOrder {
|
||||||
|
uint32_t order;
|
||||||
|
int32_t orderColId;
|
||||||
|
} SOrder;
|
||||||
|
|
||||||
|
typedef struct SGroupbyExpr {
|
||||||
|
int16_t tableIndex;
|
||||||
|
SArray* columnInfo; // SArray<SColIndex>, group by columns information
|
||||||
|
int16_t orderIndex; // order by column index
|
||||||
|
int16_t orderType; // order by type: asc/desc
|
||||||
|
} SGroupbyExpr;
|
||||||
|
|
||||||
|
// the structure for sql function in select clause
|
||||||
|
typedef struct SSqlExpr {
|
||||||
|
char token[TSDB_COL_NAME_LEN]; // original token
|
||||||
|
SSchema resSchema;
|
||||||
|
SColIndex colInfo; // there may be mutiple input columns
|
||||||
|
uint64_t uid; // table uid, todo refactor use the pointer
|
||||||
|
int32_t interBytes; // inter result buffer size
|
||||||
|
int16_t numOfParams; // argument value of each function
|
||||||
|
SVariant param[3]; // parameters are not more than 3
|
||||||
|
} SSqlExpr;
|
||||||
|
|
||||||
|
typedef struct SExprInfo {
|
||||||
|
struct SSqlExpr base;
|
||||||
|
struct tExprNode *pExpr;
|
||||||
|
} SExprInfo;
|
||||||
|
|
||||||
|
#define QUERY_ASC_FORWARD_STEP 1
|
||||||
|
#define QUERY_DESC_FORWARD_STEP -1
|
||||||
|
|
||||||
|
#define GET_FORWARD_DIRECTION_FACTOR(ord) (((ord) == TSDB_ORDER_ASC) ? QUERY_ASC_FORWARD_STEP : QUERY_DESC_FORWARD_STEP)
|
||||||
|
|
||||||
#endif // TDENGINE_COMMON_H
|
#endif // TDENGINE_COMMON_H
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#ifndef TDENGINE_TNAME_H
|
#ifndef TDENGINE_TNAME_H
|
||||||
#define TDENGINE_TNAME_H
|
#define TDENGINE_TNAME_H
|
||||||
|
|
||||||
|
#include "taosmsg.h"
|
||||||
|
|
||||||
#define TSDB_DB_NAME_T 1
|
#define TSDB_DB_NAME_T 1
|
||||||
#define TSDB_TABLE_NAME_T 2
|
#define TSDB_TABLE_NAME_T 2
|
||||||
|
|
||||||
|
@ -52,6 +54,8 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type);
|
||||||
|
|
||||||
int32_t tNameSetAcctId(SName* dst, const char* acct);
|
int32_t tNameSetAcctId(SName* dst, const char* acct);
|
||||||
|
|
||||||
|
SSchema* tGetTbnameColumnSchema();
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int32_t tNameSetDbName(SName* dst, const char* acct, SToken* dbToken);
|
int32_t tNameSetDbName(SName* dst, const char* acct, SToken* dbToken);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,7 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosdef.h"
|
#include "tdef.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
|
||||||
#define MEM_BUF_SIZE (1 << 20)
|
#define MEM_BUF_SIZE (1 << 20)
|
|
@ -78,13 +78,28 @@ extern "C" {
|
||||||
#define FUNCTION_MODE 36
|
#define FUNCTION_MODE 36
|
||||||
#define FUNCTION_SAMPLE 37
|
#define FUNCTION_SAMPLE 37
|
||||||
|
|
||||||
|
// determine the real data need to calculated the result
|
||||||
|
enum {
|
||||||
|
BLK_DATA_NO_NEEDED = 0x0,
|
||||||
|
BLK_DATA_STATIS_NEEDED = 0x1,
|
||||||
|
BLK_DATA_ALL_NEEDED = 0x3,
|
||||||
|
BLK_DATA_DISCARD = 0x4, // discard current data block since it is not qualified for filter
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MASTER_SCAN = 0x0u,
|
||||||
|
REVERSE_SCAN = 0x1u,
|
||||||
|
REPEAT_SCAN = 0x2u, //repeat scan belongs to the master scan
|
||||||
|
MERGE_STAGE = 0x20u,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct SPoint1 {
|
typedef struct SPoint1 {
|
||||||
int64_t key;
|
int64_t key;
|
||||||
union{double val; char* ptr;};
|
union{double val; char* ptr;};
|
||||||
} SPoint1;
|
} SPoint1;
|
||||||
|
|
||||||
struct SQLFunctionCtx;
|
struct SQLFunctionCtx;
|
||||||
struct SResultRowCellInfo;
|
struct SResultRowEntryInfo;
|
||||||
|
|
||||||
//for selectivity query, the corresponding tag value is assigned if the data is qualified
|
//for selectivity query, the corresponding tag value is assigned if the data is qualified
|
||||||
typedef struct SExtTagsInfo {
|
typedef struct SExtTagsInfo {
|
||||||
|
@ -93,6 +108,8 @@ typedef struct SExtTagsInfo {
|
||||||
struct SQLFunctionCtx **pTagCtxList;
|
struct SQLFunctionCtx **pTagCtxList;
|
||||||
} SExtTagsInfo;
|
} SExtTagsInfo;
|
||||||
|
|
||||||
|
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
||||||
|
|
||||||
// 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
|
||||||
|
@ -117,9 +134,9 @@ typedef struct SQLFunctionCtx {
|
||||||
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
||||||
SVariant tag;
|
SVariant tag;
|
||||||
|
|
||||||
bool isSmaSet;
|
bool isAggSet;
|
||||||
SColumnDataAgg sma;
|
SColumnDataAgg agg;
|
||||||
struct SResultRowCellInfo *resultInfo;
|
struct SResultRowEntryInfo *resultInfo;
|
||||||
SExtTagsInfo tagInfo;
|
SExtTagsInfo tagInfo;
|
||||||
SPoint1 start;
|
SPoint1 start;
|
||||||
SPoint1 end;
|
SPoint1 end;
|
||||||
|
@ -161,7 +178,7 @@ typedef struct SAggFunctionInfo {
|
||||||
int8_t sFunctionId; // Transfer function for super table query
|
int8_t sFunctionId; // Transfer function for super table query
|
||||||
uint16_t status;
|
uint16_t status;
|
||||||
|
|
||||||
bool (*init)(SQLFunctionCtx *pCtx, struct SResultRowCellInfo* pResultCellInfo); // setup the execute environment
|
bool (*init)(SQLFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo); // setup the execute environment
|
||||||
void (*exec)(SQLFunctionCtx *pCtx);
|
void (*exec)(SQLFunctionCtx *pCtx);
|
||||||
|
|
||||||
// finalizer must be called after all exec has been executed to generated final result.
|
// finalizer must be called after all exec has been executed to generated final result.
|
||||||
|
@ -176,7 +193,7 @@ typedef struct SScalarFunctionInfo {
|
||||||
int8_t type; // scalar function or aggregation function
|
int8_t type; // scalar function or aggregation function
|
||||||
uint8_t functionId; // index of scalar function
|
uint8_t functionId; // index of scalar function
|
||||||
|
|
||||||
bool (*init)(SQLFunctionCtx *pCtx, struct SResultRowCellInfo* pResultCellInfo); // setup the execute environment
|
bool (*init)(SQLFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo); // setup the execute environment
|
||||||
void (*exec)(SQLFunctionCtx *pCtx);
|
void (*exec)(SQLFunctionCtx *pCtx);
|
||||||
} SScalarFunctionInfo;
|
} SScalarFunctionInfo;
|
||||||
|
|
||||||
|
@ -221,10 +238,48 @@ bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* funct
|
||||||
|
|
||||||
const char* qGetFunctionName(int32_t functionId);
|
const char* qGetFunctionName(int32_t functionId);
|
||||||
|
|
||||||
|
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
||||||
|
|
||||||
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
|
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
|
||||||
|
|
||||||
tExprNode* exprdup(tExprNode* pTree);
|
tExprNode* exprdup(tExprNode* pTree);
|
||||||
|
|
||||||
|
void resetResultRowEntryResult(SQLFunctionCtx* pCtx, int32_t num);
|
||||||
|
void cleanupResultRowEntry(struct SResultRowEntryInfo* pCell);
|
||||||
|
int32_t getNumOfResult(SQLFunctionCtx* pCtx, int32_t num);
|
||||||
|
bool isRowEntryCompleted(struct SResultRowEntryInfo* pEntry);
|
||||||
|
bool isRowEntryInitialized(struct SResultRowEntryInfo* pEntry);
|
||||||
|
|
||||||
|
struct SScalarFunctionSupport* createScalarFuncSupport(int32_t num);
|
||||||
|
void destroyScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t num);
|
||||||
|
struct SScalarFunctionSupport* getScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t index);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// fill api
|
||||||
|
struct SFillInfo;
|
||||||
|
struct SFillColInfo;
|
||||||
|
|
||||||
|
typedef struct SPoint {
|
||||||
|
int64_t key;
|
||||||
|
void * val;
|
||||||
|
} SPoint;
|
||||||
|
|
||||||
|
void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
|
||||||
|
void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp);
|
||||||
|
void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
|
||||||
|
struct SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfOutput, const int64_t* fillVal);
|
||||||
|
bool taosFillHasMoreResults(struct SFillInfo* pFillInfo);
|
||||||
|
|
||||||
|
struct SFillInfo* taosCreateFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols,
|
||||||
|
int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType,
|
||||||
|
struct SFillColInfo* pFillCol, void* handle);
|
||||||
|
|
||||||
|
void* taosDestroyFillInfo(struct SFillInfo *pFillInfo);
|
||||||
|
int64_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, void** output, int32_t capacity);
|
||||||
|
int64_t getFillInfoStart(struct SFillInfo *pFillInfo);
|
||||||
|
|
||||||
|
int32_t taosGetLinearInterpolationVal(SPoint* point, int32_t outputType, SPoint* point1, SPoint* point2, int32_t inputType);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,21 +32,7 @@ typedef struct SColumn {
|
||||||
SColumnInfo info;
|
SColumnInfo info;
|
||||||
} SColumn;
|
} SColumn;
|
||||||
|
|
||||||
// the structure for sql function in select clause
|
|
||||||
typedef struct SSqlExpr {
|
|
||||||
char token[TSDB_COL_NAME_LEN]; // original token
|
|
||||||
SSchema resSchema;
|
|
||||||
SColIndex colInfo;
|
|
||||||
uint64_t uid; // table uid, todo refactor use the pointer
|
|
||||||
int32_t interBytes; // inter result buffer size
|
|
||||||
int16_t numOfParams; // argument value of each function
|
|
||||||
SVariant param[3]; // parameters are not more than 3
|
|
||||||
} SSqlExpr;
|
|
||||||
|
|
||||||
typedef struct SExprInfo {
|
|
||||||
SSqlExpr base;
|
|
||||||
struct tExprNode *pExpr;
|
|
||||||
} SExprInfo;
|
|
||||||
|
|
||||||
//typedef struct SInterval {
|
//typedef struct SInterval {
|
||||||
// int32_t tz; // query client timezone
|
// int32_t tz; // query client timezone
|
||||||
|
@ -63,13 +49,6 @@ typedef struct SExprInfo {
|
||||||
// int32_t primaryColId; // primary timestamp column
|
// int32_t primaryColId; // primary timestamp column
|
||||||
//} SSessionWindow;
|
//} SSessionWindow;
|
||||||
|
|
||||||
typedef struct SGroupbyExpr {
|
|
||||||
int16_t tableIndex;
|
|
||||||
SArray* columnInfo; // SArray<SColIndex>, group by columns information
|
|
||||||
int16_t orderIndex; // order by column index
|
|
||||||
int16_t orderType; // order by type: asc/desc
|
|
||||||
} SGroupbyExpr;
|
|
||||||
|
|
||||||
typedef struct SField {
|
typedef struct SField {
|
||||||
char name[TSDB_COL_NAME_LEN];
|
char name[TSDB_COL_NAME_LEN];
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
@ -82,16 +61,6 @@ typedef struct SFieldInfo {
|
||||||
SArray *internalField; // SArray<SInternalField>
|
SArray *internalField; // SArray<SInternalField>
|
||||||
} SFieldInfo;
|
} SFieldInfo;
|
||||||
|
|
||||||
typedef struct SLimit {
|
|
||||||
int64_t limit;
|
|
||||||
int64_t offset;
|
|
||||||
} SLimit;
|
|
||||||
|
|
||||||
typedef struct SOrder {
|
|
||||||
uint32_t order;
|
|
||||||
int32_t orderColId;
|
|
||||||
} SOrder;
|
|
||||||
|
|
||||||
typedef struct SCond {
|
typedef struct SCond {
|
||||||
uint64_t uid;
|
uint64_t uid;
|
||||||
int32_t len; // length of tag query condition data
|
int32_t len; // length of tag query condition data
|
||||||
|
|
|
@ -45,6 +45,8 @@ extern "C" {
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "osAtomic.h"
|
#include "osAtomic.h"
|
||||||
#include "osDef.h"
|
#include "osDef.h"
|
||||||
|
|
|
@ -140,7 +140,8 @@ do { \
|
||||||
#define TSDB_UNARY_OP_ROUND 4503
|
#define TSDB_UNARY_OP_ROUND 4503
|
||||||
|
|
||||||
#define TSDB_UNARY_OP_LEN 4600
|
#define TSDB_UNARY_OP_LEN 4600
|
||||||
|
#define TSDB_UNARY_OP_LTRIM 4601
|
||||||
|
#define TSDB_UNARY_OP_RTRIM 4601
|
||||||
|
|
||||||
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
|
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
|
||||||
#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_REMAINDER))
|
#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_REMAINDER))
|
||||||
|
|
|
@ -8,5 +8,5 @@ target_include_directories(
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
executor
|
executor
|
||||||
PRIVATE os util common
|
PRIVATE os util common function parser
|
||||||
)
|
)
|
|
@ -15,6 +15,8 @@
|
||||||
#ifndef TDENGINE_QUERYUTIL_H
|
#ifndef TDENGINE_QUERYUTIL_H
|
||||||
#define TDENGINE_QUERYUTIL_H
|
#define TDENGINE_QUERYUTIL_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "tpagedfile.h"
|
||||||
#include "tbuffer.h"
|
#include "tbuffer.h"
|
||||||
|
|
||||||
#define SET_RES_WINDOW_KEY(_k, _ori, _len, _uid) \
|
#define SET_RES_WINDOW_KEY(_k, _ori, _len, _uid) \
|
||||||
|
@ -40,42 +42,92 @@
|
||||||
|
|
||||||
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
|
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
|
||||||
|
|
||||||
int32_t getOutputInterResultBufSize(SQueryAttr* pQueryAttr);
|
struct SColumnFilterElem;
|
||||||
|
|
||||||
size_t getResultRowSize(SQueryRuntimeEnv* pRuntimeEnv);
|
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
|
||||||
|
|
||||||
|
typedef struct SGroupResInfo {
|
||||||
|
int32_t totalGroup;
|
||||||
|
int32_t currentGroup;
|
||||||
|
int32_t index;
|
||||||
|
SArray* pRows; // SArray<SResultRow*>
|
||||||
|
bool ordered;
|
||||||
|
int32_t position;
|
||||||
|
} SGroupResInfo;
|
||||||
|
|
||||||
|
typedef struct SResultRow {
|
||||||
|
int32_t pageId; // pageId & rowId is the position of current result in disk-based output buffer
|
||||||
|
int32_t offset:29; // row index in buffer page
|
||||||
|
bool startInterp; // the time window start timestamp has done the interpolation already.
|
||||||
|
bool endInterp; // the time window end timestamp has done the interpolation already.
|
||||||
|
bool closed; // this result status: closed or opened
|
||||||
|
uint32_t numOfRows; // number of rows of current time window
|
||||||
|
struct SResultRowEntryInfo* pEntryInfo; // For each result column, there is a resultInfo
|
||||||
|
STimeWindow win;
|
||||||
|
char *key; // start key of current result row
|
||||||
|
} SResultRow;
|
||||||
|
|
||||||
|
typedef struct SResultRowInfo {
|
||||||
|
SResultRow** pResult; // result list
|
||||||
|
int16_t type:8; // data type for hash key
|
||||||
|
int32_t size:24; // number of result set
|
||||||
|
int32_t capacity; // max capacity
|
||||||
|
int32_t curPos; // current active result row index of pResult list
|
||||||
|
} SResultRowInfo;
|
||||||
|
|
||||||
|
typedef struct SResultRowPool {
|
||||||
|
int32_t elemSize;
|
||||||
|
int32_t blockSize;
|
||||||
|
int32_t numOfElemPerBlock;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int32_t blockIndex;
|
||||||
|
int32_t pos;
|
||||||
|
} position;
|
||||||
|
|
||||||
|
SArray* pData; // SArray<void*>
|
||||||
|
} SResultRowPool;
|
||||||
|
|
||||||
|
struct SQueryAttr;
|
||||||
|
struct SQueryRuntimeEnv;
|
||||||
|
struct SUdfInfo;
|
||||||
|
|
||||||
|
int32_t getOutputInterResultBufSize(struct SQueryAttr* pQueryAttr);
|
||||||
|
|
||||||
|
size_t getResultRowSize(struct SQueryRuntimeEnv* pRuntimeEnv);
|
||||||
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);
|
||||||
|
|
||||||
void resetResultRowInfo(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo);
|
void resetResultRowInfo(struct SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo);
|
||||||
int32_t numOfClosedResultRows(SResultRowInfo* pResultRowInfo);
|
int32_t numOfClosedResultRows(SResultRowInfo* pResultRowInfo);
|
||||||
void closeAllResultRows(SResultRowInfo* pResultRowInfo);
|
void closeAllResultRows(SResultRowInfo* pResultRowInfo);
|
||||||
|
|
||||||
int32_t initResultRow(SResultRow *pResultRow);
|
int32_t initResultRow(SResultRow *pResultRow);
|
||||||
void closeResultRow(SResultRowInfo* pResultRowInfo, int32_t slot);
|
void closeResultRow(SResultRowInfo* pResultRowInfo, int32_t slot);
|
||||||
bool isResultRowClosed(SResultRowInfo *pResultRowInfo, int32_t slot);
|
bool isResultRowClosed(SResultRowInfo *pResultRowInfo, int32_t slot);
|
||||||
void clearResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* pResultRow, int16_t type);
|
void clearResultRow(struct SQueryRuntimeEnv* pRuntimeEnv, SResultRow* pResultRow, int16_t type);
|
||||||
|
|
||||||
SResultRowCellInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset);
|
struct SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset);
|
||||||
|
|
||||||
void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr);
|
void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr);
|
||||||
void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols);
|
void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols);
|
||||||
int32_t getRowNumForMultioutput(SQueryAttr* pQueryAttr, bool topBottomQuery, bool stable);
|
int32_t getRowNumForMultioutput(struct SQueryAttr* pQueryAttr, bool topBottomQuery, bool stable);
|
||||||
|
|
||||||
static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
||||||
assert(pResultRowInfo != NULL && slot >= 0 && slot < pResultRowInfo->size);
|
assert(pResultRowInfo != NULL && slot >= 0 && slot < pResultRowInfo->size);
|
||||||
return pResultRowInfo->pResult[slot];
|
return pResultRowInfo->pResult[slot];
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE char* getPosInResultPage(SQueryAttr* pQueryAttr, tFilePage* page, int32_t rowOffset,
|
static FORCE_INLINE char* getPosInResultPage(struct SQueryAttr* pQueryAttr, SFilePage* page, int32_t rowOffset,
|
||||||
int32_t offset) {
|
int32_t offset) {
|
||||||
assert(rowOffset >= 0 && pQueryAttr != NULL);
|
assert(rowOffset >= 0 && pQueryAttr != NULL);
|
||||||
|
|
||||||
int32_t numOfRows = (int32_t)getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery);
|
// int32_t numOfRows = (int32_t)getRowNumForMultioutput(pQueryAttr, pQueryAttr->topBotQuery, pQueryAttr->stableQuery);
|
||||||
return ((char *)page->data) + rowOffset + offset * numOfRows;
|
// return ((char *)page->data) + 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);
|
||||||
bool notNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
//bool notNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
||||||
|
|
||||||
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr);
|
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr);
|
||||||
|
|
||||||
|
@ -103,8 +155,8 @@ bool hasRemainData(SGroupResInfo* pGroupResInfo);
|
||||||
bool incNextGroup(SGroupResInfo* pGroupResInfo);
|
bool incNextGroup(SGroupResInfo* pGroupResInfo);
|
||||||
int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo);
|
int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo);
|
||||||
|
|
||||||
int32_t mergeIntoGroupResult(SGroupResInfo* pGroupResInfo, SQueryRuntimeEnv *pRuntimeEnv, int32_t* offset);
|
int32_t mergeIntoGroupResult(SGroupResInfo* pGroupResInfo, struct SQueryRuntimeEnv *pRuntimeEnv, int32_t* offset);
|
||||||
|
|
||||||
int32_t initUdfInfo(SUdfInfo* pUdfInfo);
|
int32_t initUdfInfo(struct SUdfInfo* pUdfInfo);
|
||||||
|
|
||||||
#endif // TDENGINE_QUERYUTIL_H
|
#endif // TDENGINE_QUERYUTIL_H
|
|
@ -0,0 +1,645 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef TDENGINE_EXECUTORIMPL_H
|
||||||
|
#define TDENGINE_EXECUTORIMPL_H
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "ttszip.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
|
||||||
|
#include "thash.h"
|
||||||
|
//#include "parser.h"
|
||||||
|
#include "executil.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
#include "tarray.h"
|
||||||
|
#include "tfilter.h"
|
||||||
|
#include "tlockfree.h"
|
||||||
|
#include "tpagedfile.h"
|
||||||
|
|
||||||
|
struct SColumnFilterElem;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t numOfTables;
|
||||||
|
SArray *pGroupList;
|
||||||
|
SHashObj *map; // speedup acquire the tableQueryInfo by table uid
|
||||||
|
} STableGroupInfo;
|
||||||
|
|
||||||
|
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
|
||||||
|
|
||||||
|
#define IS_QUERY_KILLED(_q) ((_q)->code == TSDB_CODE_TSC_QUERY_CANCELLED)
|
||||||
|
#define Q_STATUS_EQUAL(p, s) (((p) & (s)) != 0u)
|
||||||
|
#define QUERY_IS_ASC_QUERY(q) (GET_FORWARD_DIRECTION_FACTOR((q)->order.order) == QUERY_ASC_FORWARD_STEP)
|
||||||
|
|
||||||
|
#define GET_TABLEGROUP(q, _index) ((SArray*) taosArrayGetP((q)->tableqinfoGroupInfo.pGroupList, (_index)))
|
||||||
|
|
||||||
|
#define GET_NUM_OF_RESULTS(_r) (((_r)->outputBuf) == NULL? 0:((_r)->outputBuf)->info.rows)
|
||||||
|
|
||||||
|
#define NEEDTO_COMPRESS_QUERY(size) ((size) > tsCompressColData? 1 : 0)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
// when query starts to execute, this status will set
|
||||||
|
QUERY_NOT_COMPLETED = 0x1u,
|
||||||
|
|
||||||
|
/* query is over
|
||||||
|
* 1. this status is used in one row result query process, e.g., count/sum/first/last/ avg...etc.
|
||||||
|
* 2. when all data within queried time window, it is also denoted as query_completed
|
||||||
|
*/
|
||||||
|
QUERY_COMPLETED = 0x2u,
|
||||||
|
|
||||||
|
/* when the result is not completed return to client, this status will be
|
||||||
|
* usually used in case of interval query with interpolation option
|
||||||
|
*/
|
||||||
|
QUERY_OVER = 0x4u,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct SResultRowCell {
|
||||||
|
uint64_t groupId;
|
||||||
|
SResultRow *pRow;
|
||||||
|
} SResultRowCell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the number of generated results is greater than this value,
|
||||||
|
* query query will be halt and return results to client immediate.
|
||||||
|
*/
|
||||||
|
typedef struct SRspResultInfo {
|
||||||
|
int64_t total; // total generated result size in rows
|
||||||
|
int32_t capacity; // capacity of current result output buffer
|
||||||
|
int32_t threshold; // result size threshold in rows.
|
||||||
|
} SRspResultInfo;
|
||||||
|
|
||||||
|
typedef struct SColumnFilterElem {
|
||||||
|
int16_t bytes; // column length
|
||||||
|
__filter_func_t fp;
|
||||||
|
SColumnFilterInfo filterInfo;
|
||||||
|
void *q;
|
||||||
|
} SColumnFilterElem;
|
||||||
|
|
||||||
|
typedef struct SSingleColumnFilterInfo {
|
||||||
|
void* pData;
|
||||||
|
void* pData2; //used for nchar column
|
||||||
|
int32_t numOfFilters;
|
||||||
|
SColumnInfo info;
|
||||||
|
SColumnFilterElem* pFilters;
|
||||||
|
} SSingleColumnFilterInfo;
|
||||||
|
|
||||||
|
typedef struct STableQueryInfo {
|
||||||
|
TSKEY lastKey;
|
||||||
|
int32_t groupIndex; // group id in table list
|
||||||
|
SVariant tag;
|
||||||
|
STimeWindow win;
|
||||||
|
STSCursor cur;
|
||||||
|
void* pTable; // for retrieve the page id list
|
||||||
|
SResultRowInfo resInfo;
|
||||||
|
} STableQueryInfo;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
QUERY_PROF_BEFORE_OPERATOR_EXEC = 0,
|
||||||
|
QUERY_PROF_AFTER_OPERATOR_EXEC,
|
||||||
|
QUERY_PROF_QUERY_ABORT
|
||||||
|
} EQueryProfEventType;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EQueryProfEventType eventType;
|
||||||
|
int64_t eventTime;
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint8_t operatorType; //for operator event
|
||||||
|
int32_t abortCode; //for query abort event
|
||||||
|
};
|
||||||
|
} SQueryProfEvent;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t operatorType;
|
||||||
|
int64_t sumSelfTime;
|
||||||
|
int64_t sumRunTimes;
|
||||||
|
} SOperatorProfResult;
|
||||||
|
|
||||||
|
typedef struct SQueryCostInfo {
|
||||||
|
uint64_t loadStatisTime;
|
||||||
|
uint64_t loadFileBlockTime;
|
||||||
|
uint64_t loadDataInCacheTime;
|
||||||
|
uint64_t loadStatisSize;
|
||||||
|
uint64_t loadFileBlockSize;
|
||||||
|
uint64_t loadDataInCacheSize;
|
||||||
|
|
||||||
|
uint64_t loadDataTime;
|
||||||
|
uint64_t totalRows;
|
||||||
|
uint64_t totalCheckedRows;
|
||||||
|
uint32_t totalBlocks;
|
||||||
|
uint32_t loadBlocks;
|
||||||
|
uint32_t loadBlockStatis;
|
||||||
|
uint32_t discardBlocks;
|
||||||
|
uint64_t elapsedTime;
|
||||||
|
uint64_t firstStageMergeTime;
|
||||||
|
uint64_t winInfoSize;
|
||||||
|
uint64_t tableInfoSize;
|
||||||
|
uint64_t hashSize;
|
||||||
|
uint64_t numOfTimeWindows;
|
||||||
|
|
||||||
|
SArray* queryProfEvents; //SArray<SQueryProfEvent>
|
||||||
|
SHashObj* operatorProfResults; //map<operator_type, SQueryProfEvent>
|
||||||
|
} SQueryCostInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t vgroupLimit;
|
||||||
|
int64_t ts;
|
||||||
|
} SOrderedPrjQueryInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* tags;
|
||||||
|
SArray* pResult; // SArray<SStddevInterResult>
|
||||||
|
} SInterResult;
|
||||||
|
|
||||||
|
// The basic query information extracted from the SQueryInfo tree to support the
|
||||||
|
// execution of query in a data node.
|
||||||
|
typedef struct SQueryAttr {
|
||||||
|
SLimit limit;
|
||||||
|
SLimit slimit;
|
||||||
|
|
||||||
|
// todo comment it
|
||||||
|
bool stableQuery; // super table query or not
|
||||||
|
bool topBotQuery; // TODO used bitwise flag
|
||||||
|
bool groupbyColumn; // denote if this is a groupby normal column query
|
||||||
|
bool hasTagResults; // if there are tag values in final result or not
|
||||||
|
bool timeWindowInterpo;// if the time window start/end required interpolation
|
||||||
|
bool queryBlockDist; // if query data block distribution
|
||||||
|
bool stabledev; // super table stddev query
|
||||||
|
bool tsCompQuery; // is tscomp query
|
||||||
|
bool diffQuery; // is diff query
|
||||||
|
bool simpleAgg;
|
||||||
|
bool pointInterpQuery; // point interpolation query
|
||||||
|
bool needReverseScan; // need reverse scan
|
||||||
|
bool distinct; // distinct query or not
|
||||||
|
bool stateWindow; // window State on sub/normal table
|
||||||
|
bool createFilterOperator; // if filter operator is needed
|
||||||
|
bool multigroupResult; // multigroup result can exist in one SSDataBlock
|
||||||
|
int32_t interBufSize; // intermediate buffer sizse
|
||||||
|
|
||||||
|
int32_t havingNum; // having expr number
|
||||||
|
|
||||||
|
SOrder order;
|
||||||
|
int16_t numOfCols;
|
||||||
|
int16_t numOfTags;
|
||||||
|
|
||||||
|
STimeWindow window;
|
||||||
|
SInterval interval;
|
||||||
|
SSessionWindow sw;
|
||||||
|
int16_t precision;
|
||||||
|
int16_t numOfOutput;
|
||||||
|
int16_t fillType;
|
||||||
|
|
||||||
|
int32_t srcRowSize; // todo extract struct
|
||||||
|
int32_t resultRowSize;
|
||||||
|
int32_t intermediateResultRowSize; // intermediate result row size, in case of top-k query.
|
||||||
|
int32_t maxTableColumnWidth;
|
||||||
|
int32_t tagLen; // tag value length of current query
|
||||||
|
SGroupbyExpr *pGroupbyExpr;
|
||||||
|
|
||||||
|
SExprInfo* pExpr1;
|
||||||
|
SExprInfo* pExpr2;
|
||||||
|
int32_t numOfExpr2;
|
||||||
|
SExprInfo* pExpr3;
|
||||||
|
int32_t numOfExpr3;
|
||||||
|
|
||||||
|
SColumnInfo* tableCols;
|
||||||
|
SColumnInfo* tagColList;
|
||||||
|
int32_t numOfFilterCols;
|
||||||
|
int64_t* fillVal;
|
||||||
|
SOrderedPrjQueryInfo prjInfo; // limit value for each vgroup, only available in global order projection query.
|
||||||
|
|
||||||
|
SSingleColumnFilterInfo* pFilterInfo;
|
||||||
|
// SFilterInfo *pFilters;
|
||||||
|
|
||||||
|
void* tsdb;
|
||||||
|
// SMemRef memRef;
|
||||||
|
STableGroupInfo tableGroupInfo; // table <tid, last_key> list SArray<STableKeyInfo>
|
||||||
|
int32_t vgId;
|
||||||
|
SArray *pUdfInfo; // no need to free
|
||||||
|
} SQueryAttr;
|
||||||
|
|
||||||
|
typedef SSDataBlock* (*__operator_fn_t)(void* param, bool* newgroup);
|
||||||
|
typedef void (*__optr_cleanup_fn_t)(void* param, int32_t num);
|
||||||
|
|
||||||
|
struct SOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SQueryRuntimeEnv {
|
||||||
|
jmp_buf env;
|
||||||
|
SQueryAttr* pQueryAttr;
|
||||||
|
uint32_t status; // query status
|
||||||
|
void* qinfo;
|
||||||
|
uint8_t scanFlag; // denotes reversed scan of data or not
|
||||||
|
void* pQueryHandle;
|
||||||
|
|
||||||
|
int32_t prevGroupId; // previous executed group id
|
||||||
|
bool enableGroupData;
|
||||||
|
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.
|
||||||
|
char** prevRow;
|
||||||
|
|
||||||
|
SArray* prevResult; // intermediate result, SArray<SInterResult>
|
||||||
|
STSBuf* pTsBuf; // timestamp filter list
|
||||||
|
STSCursor cur;
|
||||||
|
|
||||||
|
char* tagVal; // tag value of current data block
|
||||||
|
struct SScalarFunctionSupport * scalarSup;
|
||||||
|
|
||||||
|
SSDataBlock *outputBuf;
|
||||||
|
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
||||||
|
struct SOperatorInfo *proot;
|
||||||
|
SGroupResInfo groupResInfo;
|
||||||
|
int64_t currentOffset; // dynamic offset value
|
||||||
|
|
||||||
|
STableQueryInfo *current;
|
||||||
|
SRspResultInfo resultInfo;
|
||||||
|
SHashObj *pTableRetrieveTsMap;
|
||||||
|
struct SUdfInfo *pUdfInfo;
|
||||||
|
} SQueryRuntimeEnv;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OP_IN_EXECUTING = 1,
|
||||||
|
OP_RES_TO_RETURN = 2,
|
||||||
|
OP_EXEC_DONE = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OPERATOR_TYPE_E {
|
||||||
|
OP_TableScan = 1,
|
||||||
|
OP_DataBlocksOptScan = 2,
|
||||||
|
OP_TableSeqScan = 3,
|
||||||
|
OP_TagScan = 4,
|
||||||
|
OP_TableBlockInfoScan= 5,
|
||||||
|
OP_Aggregate = 6,
|
||||||
|
OP_Project = 7,
|
||||||
|
OP_Groupby = 8,
|
||||||
|
OP_Limit = 9,
|
||||||
|
OP_SLimit = 10,
|
||||||
|
OP_TimeWindow = 11,
|
||||||
|
OP_SessionWindow = 12,
|
||||||
|
OP_Fill = 13,
|
||||||
|
OP_MultiTableAggregate = 14,
|
||||||
|
OP_MultiTableTimeInterval = 15,
|
||||||
|
OP_DummyInput = 16, //TODO remove it after fully refactor.
|
||||||
|
OP_MultiwayMergeSort = 17, // multi-way data merge into one input stream.
|
||||||
|
OP_GlobalAggregate = 18, // global merge for the multi-way data sources.
|
||||||
|
OP_Filter = 19,
|
||||||
|
OP_Distinct = 20,
|
||||||
|
OP_Join = 21,
|
||||||
|
OP_StateWindow = 22,
|
||||||
|
OP_AllTimeWindow = 23,
|
||||||
|
OP_AllMultiTableTimeInterval = 24,
|
||||||
|
OP_Order = 25,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct SOperatorInfo {
|
||||||
|
uint8_t operatorType;
|
||||||
|
bool blockingOptr; // block operator or not
|
||||||
|
uint8_t status; // denote if current operator is completed
|
||||||
|
int32_t numOfOutput; // number of columns of the current operator results
|
||||||
|
char *name; // name, used to show the query execution plan
|
||||||
|
void *info; // extension attribution
|
||||||
|
SExprInfo *pExpr;
|
||||||
|
SQueryRuntimeEnv *pRuntimeEnv;
|
||||||
|
|
||||||
|
struct SOperatorInfo **upstream; // upstream pointer list
|
||||||
|
int32_t numOfUpstream; // number of upstream. The value is always ONE expect for join operator
|
||||||
|
__operator_fn_t exec;
|
||||||
|
__optr_cleanup_fn_t cleanup;
|
||||||
|
} SOperatorInfo;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
QUERY_RESULT_NOT_READY = 1,
|
||||||
|
QUERY_RESULT_READY = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t numOfTags;
|
||||||
|
int32_t numOfCols;
|
||||||
|
SColumnInfo *colList;
|
||||||
|
} SQueriedTableInfo;
|
||||||
|
|
||||||
|
typedef struct SQInfo {
|
||||||
|
void* signature;
|
||||||
|
uint64_t qId;
|
||||||
|
int32_t code; // error code to returned to client
|
||||||
|
int64_t owner; // if it is in execution
|
||||||
|
|
||||||
|
SQueryRuntimeEnv runtimeEnv;
|
||||||
|
SQueryAttr query;
|
||||||
|
void* pBuf; // allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
|
||||||
|
|
||||||
|
pthread_mutex_t lock; // used to synchronize the rsp/query threads
|
||||||
|
tsem_t ready;
|
||||||
|
int32_t dataReady; // denote if query result is ready or not
|
||||||
|
void* rspContext; // response context
|
||||||
|
int64_t startExecTs; // start to exec timestamp
|
||||||
|
char* sql; // query sql string
|
||||||
|
SQueryCostInfo summary;
|
||||||
|
} SQInfo;
|
||||||
|
|
||||||
|
typedef struct SQueryParam {
|
||||||
|
char *sql;
|
||||||
|
char *tagCond;
|
||||||
|
char *colCond;
|
||||||
|
char *tbnameCond;
|
||||||
|
char *prevResult;
|
||||||
|
SArray *pTableIdList;
|
||||||
|
SSqlExpr **pExpr;
|
||||||
|
SSqlExpr **pSecExpr;
|
||||||
|
SExprInfo *pExprs;
|
||||||
|
SExprInfo *pSecExprs;
|
||||||
|
|
||||||
|
SFilterInfo *pFilters;
|
||||||
|
|
||||||
|
SColIndex *pGroupColIndex;
|
||||||
|
SColumnInfo *pTagColumnInfo;
|
||||||
|
SGroupbyExpr *pGroupbyExpr;
|
||||||
|
int32_t tableScanOperator;
|
||||||
|
SArray *pOperator;
|
||||||
|
struct SUdfInfo *pUdfInfo;
|
||||||
|
} SQueryParam;
|
||||||
|
|
||||||
|
typedef struct STableScanInfo {
|
||||||
|
void *pQueryHandle;
|
||||||
|
int32_t numOfBlocks;
|
||||||
|
int32_t numOfSkipped;
|
||||||
|
int32_t numOfBlockStatis;
|
||||||
|
int64_t numOfRows;
|
||||||
|
|
||||||
|
int32_t order; // scan order
|
||||||
|
int32_t times; // repeat counts
|
||||||
|
int32_t current;
|
||||||
|
int32_t reverseTimes; // 0 by default
|
||||||
|
|
||||||
|
SQLFunctionCtx *pCtx; // next operator query context
|
||||||
|
SResultRowInfo *pResultRowInfo;
|
||||||
|
int32_t *rowCellInfoOffset;
|
||||||
|
SExprInfo *pExpr;
|
||||||
|
SSDataBlock block;
|
||||||
|
int32_t numOfOutput;
|
||||||
|
int64_t elapsedTime;
|
||||||
|
|
||||||
|
int32_t tableIndex;
|
||||||
|
int32_t prevGroupId; // previous table group id
|
||||||
|
} STableScanInfo;
|
||||||
|
|
||||||
|
typedef struct STagScanInfo {
|
||||||
|
SColumnInfo* pCols;
|
||||||
|
SSDataBlock* pRes;
|
||||||
|
int32_t totalTables;
|
||||||
|
int32_t curPos;
|
||||||
|
} STagScanInfo;
|
||||||
|
|
||||||
|
typedef struct SOptrBasicInfo {
|
||||||
|
SResultRowInfo resultRowInfo;
|
||||||
|
int32_t *rowCellInfoOffset; // offset value for each row result cell info
|
||||||
|
SQLFunctionCtx *pCtx;
|
||||||
|
SSDataBlock *pRes;
|
||||||
|
} SOptrBasicInfo;
|
||||||
|
|
||||||
|
typedef struct SOptrBasicInfo STableIntervalOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SAggOperatorInfo {
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
uint32_t seed;
|
||||||
|
} SAggOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SProjectOperatorInfo {
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
int32_t bufCapacity;
|
||||||
|
uint32_t seed;
|
||||||
|
|
||||||
|
SSDataBlock *existDataBlock;
|
||||||
|
} SProjectOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SLimitOperatorInfo {
|
||||||
|
int64_t limit;
|
||||||
|
int64_t total;
|
||||||
|
} SLimitOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SSLimitOperatorInfo {
|
||||||
|
int64_t groupTotal;
|
||||||
|
int64_t currentGroupOffset;
|
||||||
|
|
||||||
|
int64_t rowsTotal;
|
||||||
|
int64_t currentOffset;
|
||||||
|
SLimit limit;
|
||||||
|
SLimit slimit;
|
||||||
|
|
||||||
|
char **prevRow;
|
||||||
|
SArray *orderColumnList;
|
||||||
|
bool hasPrev;
|
||||||
|
bool ignoreCurrentGroup;
|
||||||
|
bool multigroupResult;
|
||||||
|
SSDataBlock *pRes; // result buffer
|
||||||
|
SSDataBlock *pPrevBlock;
|
||||||
|
int64_t capacity;
|
||||||
|
int64_t threshold;
|
||||||
|
} SSLimitOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SFilterOperatorInfo {
|
||||||
|
SSingleColumnFilterInfo *pFilterInfo;
|
||||||
|
int32_t numOfFilterCols;
|
||||||
|
} SFilterOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SFillOperatorInfo {
|
||||||
|
struct SFillInfo *pFillInfo;
|
||||||
|
SSDataBlock *pRes;
|
||||||
|
int64_t totalInputRows;
|
||||||
|
void **p;
|
||||||
|
SSDataBlock *existNewGroupBlock;
|
||||||
|
bool multigroupResult;
|
||||||
|
} SFillOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SGroupbyOperatorInfo {
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
int32_t colIndex;
|
||||||
|
char *prevData; // previous group by value
|
||||||
|
} SGroupbyOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SSWindowOperatorInfo {
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
STimeWindow curWindow; // current time window
|
||||||
|
TSKEY prevTs; // previous timestamp
|
||||||
|
int32_t numOfRows; // number of rows
|
||||||
|
int32_t start; // start row index
|
||||||
|
bool reptScan; // next round scan
|
||||||
|
} SSWindowOperatorInfo;
|
||||||
|
|
||||||
|
typedef struct SStateWindowOperatorInfo {
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
STimeWindow curWindow; // current time window
|
||||||
|
int32_t numOfRows; // number of rows
|
||||||
|
int32_t colIndex; // start row index
|
||||||
|
int32_t start;
|
||||||
|
char* prevData; // previous data
|
||||||
|
bool reptScan;
|
||||||
|
} 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;
|
||||||
|
|
||||||
|
struct SGlobalMerger;
|
||||||
|
|
||||||
|
typedef struct SMultiwayMergeInfo {
|
||||||
|
struct SGlobalMerger *pMerge;
|
||||||
|
SOptrBasicInfo binfo;
|
||||||
|
int32_t bufCapacity;
|
||||||
|
int64_t seed;
|
||||||
|
char **prevRow;
|
||||||
|
SArray *orderColumnList;
|
||||||
|
int32_t resultRowFactor;
|
||||||
|
|
||||||
|
bool hasGroupColData;
|
||||||
|
char **currentGroupColData;
|
||||||
|
SArray *groupColumnList;
|
||||||
|
bool hasDataBlockForNewGroup;
|
||||||
|
SSDataBlock *pExistBlock;
|
||||||
|
|
||||||
|
SArray *udfInfo;
|
||||||
|
bool hasPrev;
|
||||||
|
bool multiGroupResults;
|
||||||
|
} SMultiwayMergeInfo;
|
||||||
|
|
||||||
|
// todo support the disk-based sort
|
||||||
|
typedef struct SOrderOperatorInfo {
|
||||||
|
int32_t colIndex;
|
||||||
|
int32_t order;
|
||||||
|
SSDataBlock *pDataBlock;
|
||||||
|
} SOrderOperatorInfo;
|
||||||
|
|
||||||
|
void appendUpstream(SOperatorInfo* p, SOperatorInfo* pUpstream);
|
||||||
|
|
||||||
|
SOperatorInfo* createDataBlocksOptScanInfo(void* pTsdbQueryHandle, SQueryRuntimeEnv* pRuntimeEnv, int32_t repeatTime, int32_t reverseTime);
|
||||||
|
SOperatorInfo* createTableScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv* pRuntimeEnv, int32_t repeatTime);
|
||||||
|
SOperatorInfo* createTableSeqScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv* pRuntimeEnv);
|
||||||
|
|
||||||
|
SOperatorInfo* createAggregateOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createProjectOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createLimitOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream);
|
||||||
|
SOperatorInfo* createTimeIntervalOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createAllTimeIntervalOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createSWindowOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createFillOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput, bool multigroupResult);
|
||||||
|
SOperatorInfo* createGroupbyOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createMultiTableAggOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createMultiTableTimeIntervalOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createAllMultiTableTimeIntervalOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createTagScanOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createDistinctOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createTableBlockInfoScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv* pRuntimeEnv);
|
||||||
|
SOperatorInfo* createMultiwaySortOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SExprInfo* pExpr, int32_t numOfOutput,
|
||||||
|
int32_t numOfRows, void* merger);
|
||||||
|
SOperatorInfo* createGlobalAggregateOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput, void* param, SArray* pUdfInfo, bool groupResultMixedUp);
|
||||||
|
SOperatorInfo* createStatewindowOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createSLimitOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput, void* merger, bool multigroupResult);
|
||||||
|
SOperatorInfo* createFilterOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr,
|
||||||
|
int32_t numOfOutput, SColumnInfo* pCols, int32_t numOfFilter);
|
||||||
|
|
||||||
|
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pUpstream, int32_t numOfUpstream, SSchema* pSchema, int32_t numOfOutput);
|
||||||
|
SOperatorInfo* createOrderOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorInfo* upstream, SExprInfo* pExpr, int32_t numOfOutput, SOrder* pOrderVal);
|
||||||
|
|
||||||
|
SSDataBlock* doGlobalAggregate(void* param, bool* newgroup);
|
||||||
|
SSDataBlock* doMultiwayMergeSort(void* param, bool* newgroup);
|
||||||
|
SSDataBlock* doSLimit(void* param, bool* newgroup);
|
||||||
|
|
||||||
|
int32_t doCreateFilterInfo(SColumnInfo* pCols, int32_t numOfCols, int32_t numOfFilterCols, SSingleColumnFilterInfo** pFilterInfo, uint64_t qId);
|
||||||
|
void doSetFilterColumnInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, SSDataBlock* pBlock);
|
||||||
|
bool doFilterDataBlock(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols, int32_t numOfRows, int8_t* p);
|
||||||
|
void doCompactSDataBlock(SSDataBlock* pBlock, int32_t numOfRows, int8_t* p);
|
||||||
|
|
||||||
|
SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numOfRows);
|
||||||
|
|
||||||
|
void* destroyOutputBuf(SSDataBlock* pBlock);
|
||||||
|
void* doDestroyFilterInfo(SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols);
|
||||||
|
|
||||||
|
void setInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order);
|
||||||
|
void finalizeQueryResult(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset);
|
||||||
|
void updateOutputBuf(SOptrBasicInfo* pBInfo, int32_t *bufCapacity, int32_t numOfInputRows);
|
||||||
|
void clearOutputBuf(SOptrBasicInfo* pBInfo, int32_t *bufCapacity);
|
||||||
|
void copyTsColoum(SSDataBlock* pRes, SQLFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
|
|
||||||
|
void freeParam(SQueryParam *param);
|
||||||
|
int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param);
|
||||||
|
int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExprInfo** pExprInfo,
|
||||||
|
SSqlExpr** pExprMsg, SColumnInfo* pTagCols, int32_t queryType, void* pMsg, struct SUdfInfo* pUdfInfo);
|
||||||
|
|
||||||
|
int32_t createIndirectQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t numOfOutput, SExprInfo **pExprInfo,
|
||||||
|
SSqlExpr **pExpr, SExprInfo *prevExpr, struct SUdfInfo *pUdfInfo);
|
||||||
|
|
||||||
|
int32_t createQueryFilter(char *data, uint16_t len, SFilterInfo** pFilters);
|
||||||
|
|
||||||
|
SGroupbyExpr *createGroupbyExprFromMsg(SQueryTableMsg *pQueryMsg, SColIndex *pColIndex, int32_t *code);
|
||||||
|
SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SGroupbyExpr *pGroupbyExpr, SExprInfo *pExprs,
|
||||||
|
SExprInfo *pSecExprs, STableGroupInfo *pTableGroupInfo, SColumnInfo* pTagCols, SFilterInfo* pFilters, int32_t vgId, char* sql, uint64_t qId, struct SUdfInfo* pUdfInfo);
|
||||||
|
|
||||||
|
int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo* pQInfo, SQueryParam* param, char* start,
|
||||||
|
int32_t prevResultLen, void* merger);
|
||||||
|
|
||||||
|
int32_t createFilterInfo(SQueryAttr* pQueryAttr, uint64_t qId);
|
||||||
|
void freeColumnFilterInfo(SColumnFilterInfo* pFilter, int32_t numOfFilters);
|
||||||
|
|
||||||
|
STableQueryInfo *createTableQueryInfo(SQueryAttr* pQueryAttr, void* pTable, bool groupbyColumn, STimeWindow win, void* buf);
|
||||||
|
STableQueryInfo* createTmpTableQueryInfo(STimeWindow win);
|
||||||
|
|
||||||
|
int32_t buildArithmeticExprFromMsg(SExprInfo *pArithExprInfo, void *pQueryMsg);
|
||||||
|
|
||||||
|
bool isQueryKilled(SQInfo *pQInfo);
|
||||||
|
int32_t checkForQueryBuf(size_t numOfTables);
|
||||||
|
bool checkNeedToCompressQueryCol(SQInfo *pQInfo);
|
||||||
|
bool doBuildResCheck(SQInfo* pQInfo);
|
||||||
|
void setQueryStatus(SQueryRuntimeEnv *pRuntimeEnv, int8_t status);
|
||||||
|
|
||||||
|
bool onlyQueryTags(SQueryAttr* pQueryAttr);
|
||||||
|
void destroyUdfInfo(struct SUdfInfo* pUdfInfo);
|
||||||
|
|
||||||
|
bool isValidQInfo(void *param);
|
||||||
|
|
||||||
|
int32_t doDumpQueryResult(SQInfo *pQInfo, char *data, int8_t compressed, int32_t *compLen);
|
||||||
|
|
||||||
|
size_t getResultSize(SQInfo *pQInfo, int64_t *numOfRows);
|
||||||
|
void setQueryKilled(SQInfo *pQInfo);
|
||||||
|
|
||||||
|
void publishOperatorProfEvent(SOperatorInfo* operatorInfo, EQueryProfEventType eventType);
|
||||||
|
void publishQueryAbortEvent(SQInfo* pQInfo, int32_t code);
|
||||||
|
void calculateOperatorProfResults(SQInfo* pQInfo);
|
||||||
|
void queryCostStatis(SQInfo *pQInfo);
|
||||||
|
|
||||||
|
void freeQInfo(SQInfo *pQInfo);
|
||||||
|
void freeQueryAttr(SQueryAttr *pQuery);
|
||||||
|
|
||||||
|
int32_t getMaximumIdleDurationSec();
|
||||||
|
|
||||||
|
void doInvokeUdf(struct SUdfInfo* pUdfInfo, SQLFunctionCtx *pCtx, int32_t idx, int32_t type);
|
||||||
|
|
||||||
|
#endif // TDENGINE_EXECUTORIMPL_H
|
|
@ -20,9 +20,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "texpr.h"
|
#include "thash.h"
|
||||||
#include "hash.h"
|
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
#include "function.h"
|
||||||
|
|
||||||
#define FILTER_DEFAULT_GROUP_SIZE 4
|
#define FILTER_DEFAULT_GROUP_SIZE 4
|
||||||
#define FILTER_DEFAULT_UNIT_SIZE 4
|
#define FILTER_DEFAULT_UNIT_SIZE 4
|
||||||
|
@ -105,7 +105,7 @@ typedef struct SFilterColRange {
|
||||||
|
|
||||||
typedef bool (*rangeCompFunc) (const void *, const void *, const void *, const void *, __compar_fn_t);
|
typedef bool (*rangeCompFunc) (const void *, const void *, const void *, const void *, __compar_fn_t);
|
||||||
typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
||||||
typedef bool(*filter_exec_func)(void *, int32_t, int8_t**, SDataStatis *, int16_t);
|
typedef bool(*filter_exec_func)(void *, int32_t, int8_t**, SColumnDataAgg *, int16_t);
|
||||||
|
|
||||||
typedef struct SFilterRangeCompare {
|
typedef struct SFilterRangeCompare {
|
||||||
int64_t s;
|
int64_t s;
|
||||||
|
@ -324,13 +324,13 @@ typedef struct SFilterInfo {
|
||||||
|
|
||||||
|
|
||||||
extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t options);
|
extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t options);
|
||||||
extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t** p, SDataStatis *statis, int16_t numOfCols);
|
extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t** p, SColumnDataAgg *statis, int16_t numOfCols);
|
||||||
extern int32_t filterSetColFieldData(SFilterInfo *info, int32_t numOfCols, SArray* pDataBlock);
|
extern int32_t filterSetColFieldData(SFilterInfo *info, int32_t numOfCols, SArray* pDataBlock);
|
||||||
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
||||||
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
||||||
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
||||||
extern void filterFreeInfo(SFilterInfo *info);
|
extern void filterFreeInfo(SFilterInfo *info);
|
||||||
extern bool filterRangeExecute(SFilterInfo *info, SDataStatis *pDataStatis, int32_t numOfCols, int32_t numOfRows);
|
extern bool filterRangeExecute(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -15,11 +15,11 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "hash.h"
|
#include "thash.h"
|
||||||
|
|
||||||
#include "qExecutor.h"
|
#include "executil.h"
|
||||||
#include "qUtil.h"
|
#include "executorimpl.h"
|
||||||
#include "queryLog.h"
|
//#include "queryLog.h"
|
||||||
#include "tbuffer.h"
|
#include "tbuffer.h"
|
||||||
#include "tcompression.h"
|
#include "tcompression.h"
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
|
@ -33,9 +33,9 @@ typedef struct SCompSupporter {
|
||||||
int32_t getRowNumForMultioutput(SQueryAttr* pQueryAttr, bool topBottomQuery, bool stable) {
|
int32_t getRowNumForMultioutput(SQueryAttr* pQueryAttr, bool topBottomQuery, bool stable) {
|
||||||
if (pQueryAttr && (!stable)) {
|
if (pQueryAttr && (!stable)) {
|
||||||
for (int16_t i = 0; i < pQueryAttr->numOfOutput; ++i) {
|
for (int16_t i = 0; i < pQueryAttr->numOfOutput; ++i) {
|
||||||
if (pQueryAttr->pExpr1[i].base.functionId == TSDB_FUNC_TOP || pQueryAttr->pExpr1[i].base.functionId == TSDB_FUNC_BOTTOM) {
|
// if (pQueryAttr->pExpr1[i].base. == FUNCTION_TOP || pQueryAttr->pExpr1[i].base.functionId == FUNCTION_BOTTOM) {
|
||||||
return (int32_t)pQueryAttr->pExpr1[i].base.param[0].i64;
|
// return (int32_t)pQueryAttr->pExpr1[i].base.param[0].i;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,18 +143,18 @@ void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResultRow, int16
|
||||||
|
|
||||||
// the result does not put into the SDiskbasedResultBuf, ignore it.
|
// the result does not put into the SDiskbasedResultBuf, ignore it.
|
||||||
if (pResultRow->pageId >= 0) {
|
if (pResultRow->pageId >= 0) {
|
||||||
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResultRow->pageId);
|
SFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResultRow->pageId);
|
||||||
|
|
||||||
int16_t offset = 0;
|
int16_t offset = 0;
|
||||||
for (int32_t i = 0; i < pRuntimeEnv->pQueryAttr->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pRuntimeEnv->pQueryAttr->numOfOutput; ++i) {
|
||||||
SResultRowCellInfo *pResultInfo = &pResultRow->pCellInfo[i];
|
struct SResultRowEntryInfo *pEntryInfo = NULL;//pResultRow->pEntryInfo[i];
|
||||||
|
|
||||||
int16_t size = pRuntimeEnv->pQueryAttr->pExpr1[i].base.resType;
|
int16_t size = pRuntimeEnv->pQueryAttr->pExpr1[i].base.resSchema.bytes;
|
||||||
char * s = getPosInResultPage(pRuntimeEnv->pQueryAttr, page, pResultRow->offset, offset);
|
char * s = getPosInResultPage(pRuntimeEnv->pQueryAttr, page, pResultRow->offset, offset);
|
||||||
memset(s, 0, size);
|
memset(s, 0, size);
|
||||||
|
|
||||||
offset += size;
|
offset += size;
|
||||||
RESET_RESULT_INFO(pResultInfo);
|
cleanupResultRowEntry(pEntryInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,14 +168,16 @@ void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResultRow, int16
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO refactor: use macro
|
// TODO refactor: use macro
|
||||||
SResultRowCellInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset) {
|
struct SResultRowEntryInfo* getResultCell(const SResultRow* pRow, int32_t index, int32_t* offset) {
|
||||||
assert(index >= 0 && offset != NULL);
|
assert(index >= 0 && offset != NULL);
|
||||||
return (SResultRowCellInfo*)((char*) pRow->pCellInfo + offset[index]);
|
// return (SResultRowEntryInfo*)((char*) pRow->pCellInfo + offset[index]);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getResultRowSize(SQueryRuntimeEnv* pRuntimeEnv) {
|
size_t getResultRowSize(SQueryRuntimeEnv* pRuntimeEnv) {
|
||||||
SQueryAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
SQueryAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
||||||
return (pQueryAttr->numOfOutput * sizeof(SResultRowCellInfo)) + pQueryAttr->interBufSize + sizeof(SResultRow);
|
return 0;
|
||||||
|
// return (pQueryAttr->numOfOutput * sizeof(SResultRowEntryInfo)) + pQueryAttr->interBufSize + sizeof(SResultRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size) {
|
SResultRowPool* initResultRowPool(size_t size) {
|
||||||
|
@ -271,9 +273,9 @@ void interResToBinary(SBufferWriter* bw, SArray* pRes, int32_t tagLen) {
|
||||||
tbufWriteUint32(bw, numOfRows);
|
tbufWriteUint32(bw, numOfRows);
|
||||||
|
|
||||||
for(int32_t k = 0; k < numOfRows; ++k) {
|
for(int32_t k = 0; k < numOfRows; ++k) {
|
||||||
SResPair v = *(SResPair*) taosArrayGet(p->pResult, k);
|
// SResPair v = *(SResPair*) taosArrayGet(p->pResult, k);
|
||||||
tbufWriteDouble(bw, v.avg);
|
// tbufWriteDouble(bw, v.avg);
|
||||||
tbufWriteInt64(bw, v.key);
|
// tbufWriteInt64(bw, v.key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,19 +303,19 @@ SArray* interResFromBinary(const char* data, int32_t len) {
|
||||||
|
|
||||||
SArray* p = taosArrayInit(numOfCols, sizeof(SStddevInterResult));
|
SArray* p = taosArrayInit(numOfCols, sizeof(SStddevInterResult));
|
||||||
for(int32_t j = 0; j < numOfCols; ++j) {
|
for(int32_t j = 0; j < numOfCols; ++j) {
|
||||||
int16_t colId = tbufReadUint16(&br);
|
// int16_t colId = tbufReadUint16(&br);
|
||||||
int32_t numOfRows = tbufReadUint32(&br);
|
int32_t numOfRows = tbufReadUint32(&br);
|
||||||
|
|
||||||
SStddevInterResult interRes = {.colId = colId, .pResult = taosArrayInit(4, sizeof(struct SResPair)),};
|
// SStddevInterResult interRes = {.colId = colId, .pResult = taosArrayInit(4, sizeof(struct SResPair)),};
|
||||||
for(int32_t k = 0; k < numOfRows; ++k) {
|
for(int32_t k = 0; k < numOfRows; ++k) {
|
||||||
SResPair px = {0};
|
// SResPair px = {0};
|
||||||
px.avg = tbufReadDouble(&br);
|
// px.avg = tbufReadDouble(&br);
|
||||||
px.key = tbufReadInt64(&br);
|
// px.key = tbufReadInt64(&br);
|
||||||
|
//
|
||||||
taosArrayPush(interRes.pResult, &px);
|
// taosArrayPush(interRes.pResult, &px);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(p, &interRes);
|
// taosArrayPush(p, &interRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* p1 = NULL;
|
char* p1 = NULL;
|
||||||
|
@ -395,22 +397,22 @@ static int64_t getNumOfResultWindowRes(SQueryRuntimeEnv* pRuntimeEnv, SResultRow
|
||||||
SQueryAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
SQueryAttr* pQueryAttr = pRuntimeEnv->pQueryAttr;
|
||||||
|
|
||||||
for (int32_t j = 0; j < pQueryAttr->numOfOutput; ++j) {
|
for (int32_t j = 0; j < pQueryAttr->numOfOutput; ++j) {
|
||||||
int32_t functionId = pQueryAttr->pExpr1[j].base.functionId;
|
int32_t functionId = 0;//pQueryAttr->pExpr1[j].base.functionId;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ts, tag, tagprj function can not decide the output number of current query
|
* ts, tag, tagprj function can not decide the output number of current query
|
||||||
* the number of output result is decided by main output
|
* the number of output result is decided by main output
|
||||||
*/
|
*/
|
||||||
if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG || functionId == TSDB_FUNC_TAGPRJ) {
|
if (functionId == FUNCTION_TS || functionId == FUNCTION_TAG || functionId == FUNCTION_TAGPRJ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo *pResultInfo = getResultCell(pResultRow, j, rowCellInfoOffset);
|
// SResultRowEntryInfo *pResultInfo = getResultCell(pResultRow, j, rowCellInfoOffset);
|
||||||
assert(pResultInfo != NULL);
|
// assert(pResultInfo != NULL);
|
||||||
|
//
|
||||||
if (pResultInfo->numOfRes > 0) {
|
// if (pResultInfo->numOfRes > 0) {
|
||||||
return pResultInfo->numOfRes;
|
// return pResultInfo->numOfRes;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -545,7 +547,7 @@ static UNUSED_FUNC int32_t mergeIntoGroupResultImpl(SQueryRuntimeEnv *pRuntimeEn
|
||||||
pTableQueryInfoList = malloc(POINTER_BYTES * size);
|
pTableQueryInfoList = malloc(POINTER_BYTES * size);
|
||||||
|
|
||||||
if (pTableQueryInfoList == NULL || posList == NULL || pGroupResInfo->pRows == NULL || pGroupResInfo->pRows == NULL) {
|
if (pTableQueryInfoList == NULL || posList == NULL || pGroupResInfo->pRows == NULL || pGroupResInfo->pRows == NULL) {
|
||||||
qError("QInfo:%"PRIu64" failed alloc memory", GET_QID(pRuntimeEnv));
|
// qError("QInfo:%"PRIu64" failed alloc memory", GET_QID(pRuntimeEnv));
|
||||||
code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
@ -617,8 +619,8 @@ static UNUSED_FUNC int32_t mergeIntoGroupResultImpl(SQueryRuntimeEnv *pRuntimeEn
|
||||||
|
|
||||||
int64_t endt = taosGetTimestampMs();
|
int64_t endt = taosGetTimestampMs();
|
||||||
|
|
||||||
qDebug("QInfo:%"PRIx64" result merge completed for group:%d, elapsed time:%" PRId64 " ms", GET_QID(pRuntimeEnv),
|
// qDebug("QInfo:%"PRIx64" result merge completed for group:%d, elapsed time:%" PRId64 " ms", GET_QID(pRuntimeEnv),
|
||||||
pGroupResInfo->currentGroup, endt - startt);
|
// pGroupResInfo->currentGroup, endt - startt);
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
tfree(pTableQueryInfoList);
|
tfree(pTableQueryInfoList);
|
||||||
|
@ -639,90 +641,90 @@ int32_t mergeIntoGroupResult(SGroupResInfo* pGroupResInfo, SQueryRuntimeEnv* pRu
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%"PRIu64" no result in group %d, continue", GET_QID(pRuntimeEnv), pGroupResInfo->currentGroup);
|
// qDebug("QInfo:%"PRIu64" no result in group %d, continue", GET_QID(pRuntimeEnv), pGroupResInfo->currentGroup);
|
||||||
cleanupGroupResInfo(pGroupResInfo);
|
cleanupGroupResInfo(pGroupResInfo);
|
||||||
incNextGroup(pGroupResInfo);
|
incNextGroup(pGroupResInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t elapsedTime = taosGetTimestampUs() - st;
|
// int64_t elapsedTime = taosGetTimestampUs() - st;
|
||||||
qDebug("QInfo:%"PRIu64" merge res data into group, index:%d, total group:%d, elapsed time:%" PRId64 "us", GET_QID(pRuntimeEnv),
|
// qDebug("QInfo:%"PRIu64" merge res data into group, index:%d, total group:%d, elapsed time:%" PRId64 "us", GET_QID(pRuntimeEnv),
|
||||||
pGroupResInfo->currentGroup, pGroupResInfo->totalGroup, elapsedTime);
|
// pGroupResInfo->currentGroup, pGroupResInfo->totalGroup, elapsedTime);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockDistInfoToBinary(STableBlockDist* pDist, struct SBufferWriter* bw) {
|
//void blockDistInfoToBinary(STableBlockDist* pDist, struct SBufferWriter* bw) {
|
||||||
tbufWriteUint32(bw, pDist->numOfTables);
|
// tbufWriteUint32(bw, pDist->numOfTables);
|
||||||
tbufWriteUint16(bw, pDist->numOfFiles);
|
// tbufWriteUint16(bw, pDist->numOfFiles);
|
||||||
tbufWriteUint64(bw, pDist->totalSize);
|
// tbufWriteUint64(bw, pDist->totalSize);
|
||||||
tbufWriteUint64(bw, pDist->totalRows);
|
// tbufWriteUint64(bw, pDist->totalRows);
|
||||||
tbufWriteInt32(bw, pDist->maxRows);
|
// tbufWriteInt32(bw, pDist->maxRows);
|
||||||
tbufWriteInt32(bw, pDist->minRows);
|
// tbufWriteInt32(bw, pDist->minRows);
|
||||||
tbufWriteUint32(bw, pDist->numOfRowsInMemTable);
|
// tbufWriteUint32(bw, pDist->numOfRowsInMemTable);
|
||||||
tbufWriteUint32(bw, pDist->numOfSmallBlocks);
|
// tbufWriteUint32(bw, pDist->numOfSmallBlocks);
|
||||||
tbufWriteUint64(bw, taosArrayGetSize(pDist->dataBlockInfos));
|
// tbufWriteUint64(bw, taosArrayGetSize(pDist->dataBlockInfos));
|
||||||
|
//
|
||||||
|
// // compress the binary string
|
||||||
|
// char* p = TARRAY_GET_START(pDist->dataBlockInfos);
|
||||||
|
//
|
||||||
|
// // compress extra bytes
|
||||||
|
// size_t x = taosArrayGetSize(pDist->dataBlockInfos) * pDist->dataBlockInfos->elemSize;
|
||||||
|
// char* tmp = malloc(x + 2);
|
||||||
|
//
|
||||||
|
// bool comp = false;
|
||||||
|
// int32_t len = tsCompressString(p, (int32_t)x, 1, tmp, (int32_t)x, ONE_STAGE_COMP, NULL, 0);
|
||||||
|
// if (len == -1 || len >= x) { // compress failed, do not compress this binary data
|
||||||
|
// comp = false;
|
||||||
|
// len = (int32_t)x;
|
||||||
|
// } else {
|
||||||
|
// comp = true;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// tbufWriteUint8(bw, comp);
|
||||||
|
// tbufWriteUint32(bw, len);
|
||||||
|
// if (comp) {
|
||||||
|
// tbufWriteBinary(bw, tmp, len);
|
||||||
|
// } else {
|
||||||
|
// tbufWriteBinary(bw, p, len);
|
||||||
|
// }
|
||||||
|
// tfree(tmp);
|
||||||
|
//}
|
||||||
|
|
||||||
// compress the binary string
|
//void blockDistInfoFromBinary(const char* data, int32_t len, STableBlockDist* pDist) {
|
||||||
char* p = TARRAY_GET_START(pDist->dataBlockInfos);
|
// SBufferReader br = tbufInitReader(data, len, false);
|
||||||
|
//
|
||||||
// compress extra bytes
|
// pDist->numOfTables = tbufReadUint32(&br);
|
||||||
size_t x = taosArrayGetSize(pDist->dataBlockInfos) * pDist->dataBlockInfos->elemSize;
|
// pDist->numOfFiles = tbufReadUint16(&br);
|
||||||
char* tmp = malloc(x + 2);
|
// pDist->totalSize = tbufReadUint64(&br);
|
||||||
|
// pDist->totalRows = tbufReadUint64(&br);
|
||||||
bool comp = false;
|
// pDist->maxRows = tbufReadInt32(&br);
|
||||||
int32_t len = tsCompressString(p, (int32_t)x, 1, tmp, (int32_t)x, ONE_STAGE_COMP, NULL, 0);
|
// pDist->minRows = tbufReadInt32(&br);
|
||||||
if (len == -1 || len >= x) { // compress failed, do not compress this binary data
|
// pDist->numOfRowsInMemTable = tbufReadUint32(&br);
|
||||||
comp = false;
|
// pDist->numOfSmallBlocks = tbufReadUint32(&br);
|
||||||
len = (int32_t)x;
|
// int64_t numSteps = tbufReadUint64(&br);
|
||||||
} else {
|
//
|
||||||
comp = true;
|
// bool comp = tbufReadUint8(&br);
|
||||||
}
|
// uint32_t compLen = tbufReadUint32(&br);
|
||||||
|
//
|
||||||
tbufWriteUint8(bw, comp);
|
// size_t originalLen = (size_t) (numSteps *sizeof(SFileBlockInfo));
|
||||||
tbufWriteUint32(bw, len);
|
//
|
||||||
if (comp) {
|
// char* outputBuf = NULL;
|
||||||
tbufWriteBinary(bw, tmp, len);
|
// if (comp) {
|
||||||
} else {
|
// outputBuf = malloc(originalLen);
|
||||||
tbufWriteBinary(bw, p, len);
|
//
|
||||||
}
|
// size_t actualLen = compLen;
|
||||||
tfree(tmp);
|
// const char* compStr = tbufReadBinary(&br, &actualLen);
|
||||||
}
|
//
|
||||||
|
// int32_t orignalLen = tsDecompressString(compStr, compLen, 1, outputBuf,
|
||||||
void blockDistInfoFromBinary(const char* data, int32_t len, STableBlockDist* pDist) {
|
// (int32_t)originalLen , ONE_STAGE_COMP, NULL, 0);
|
||||||
SBufferReader br = tbufInitReader(data, len, false);
|
// assert(orignalLen == numSteps *sizeof(SFileBlockInfo));
|
||||||
|
// } else {
|
||||||
pDist->numOfTables = tbufReadUint32(&br);
|
// outputBuf = (char*) tbufReadBinary(&br, &originalLen);
|
||||||
pDist->numOfFiles = tbufReadUint16(&br);
|
// }
|
||||||
pDist->totalSize = tbufReadUint64(&br);
|
//
|
||||||
pDist->totalRows = tbufReadUint64(&br);
|
// pDist->dataBlockInfos = taosArrayFromList(outputBuf, (uint32_t)numSteps, sizeof(SFileBlockInfo));
|
||||||
pDist->maxRows = tbufReadInt32(&br);
|
// if (comp) {
|
||||||
pDist->minRows = tbufReadInt32(&br);
|
// tfree(outputBuf);
|
||||||
pDist->numOfRowsInMemTable = tbufReadUint32(&br);
|
// }
|
||||||
pDist->numOfSmallBlocks = tbufReadUint32(&br);
|
//}
|
||||||
int64_t numSteps = tbufReadUint64(&br);
|
|
||||||
|
|
||||||
bool comp = tbufReadUint8(&br);
|
|
||||||
uint32_t compLen = tbufReadUint32(&br);
|
|
||||||
|
|
||||||
size_t originalLen = (size_t) (numSteps *sizeof(SFileBlockInfo));
|
|
||||||
|
|
||||||
char* outputBuf = NULL;
|
|
||||||
if (comp) {
|
|
||||||
outputBuf = malloc(originalLen);
|
|
||||||
|
|
||||||
size_t actualLen = compLen;
|
|
||||||
const char* compStr = tbufReadBinary(&br, &actualLen);
|
|
||||||
|
|
||||||
int32_t orignalLen = tsDecompressString(compStr, compLen, 1, outputBuf,
|
|
||||||
(int32_t)originalLen , ONE_STAGE_COMP, NULL, 0);
|
|
||||||
assert(orignalLen == numSteps *sizeof(SFileBlockInfo));
|
|
||||||
} else {
|
|
||||||
outputBuf = (char*) tbufReadBinary(&br, &originalLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
pDist->dataBlockInfos = taosArrayFromList(outputBuf, (uint32_t)numSteps, sizeof(SFileBlockInfo));
|
|
||||||
if (comp) {
|
|
||||||
tfree(outputBuf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -30,12 +30,12 @@ extern "C" {
|
||||||
|
|
||||||
extern SAggFunctionInfo aggFunc[34];
|
extern SAggFunctionInfo aggFunc[34];
|
||||||
|
|
||||||
typedef struct SResultRowCellInfo {
|
typedef struct SResultRowEntryInfo {
|
||||||
int8_t hasResult; // result generated, not NULL value
|
int8_t hasResult; // result generated, not NULL value
|
||||||
bool initialized; // output buffer has been initialized
|
bool initialized; // output buffer has been initialized
|
||||||
bool complete; // query has completed
|
bool complete; // query has completed
|
||||||
uint32_t numOfRes; // num of output result in current buffer
|
uint32_t numOfRes; // num of output result in current buffer
|
||||||
} SResultRowCellInfo;
|
} 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
|
||||||
|
@ -52,54 +52,24 @@ typedef struct SResultRowCellInfo {
|
||||||
#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 QUERY_ASC_FORWARD_STEP 1
|
|
||||||
#define QUERY_DESC_FORWARD_STEP -1
|
|
||||||
|
|
||||||
#define GET_FORWARD_DIRECTION_FACTOR(ord) (((ord) == TSDB_ORDER_ASC) ? QUERY_ASC_FORWARD_STEP : QUERY_DESC_FORWARD_STEP)
|
|
||||||
#define TOP_BOTTOM_QUERY_LIMIT 100
|
#define TOP_BOTTOM_QUERY_LIMIT 100
|
||||||
|
|
||||||
enum {
|
|
||||||
MASTER_SCAN = 0x0u,
|
|
||||||
REVERSE_SCAN = 0x1u,
|
|
||||||
REPEAT_SCAN = 0x2u, //repeat scan belongs to the master scan
|
|
||||||
MERGE_STAGE = 0x20u,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define QUERY_IS_STABLE_QUERY(type) (((type)&TSDB_QUERY_TYPE_STABLE_QUERY) != 0)
|
#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_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_PROJECTION_QUERY(type) (((type)&TSDB_QUERY_TYPE_PROJECTION_QUERY) != 0)
|
||||||
#define QUERY_IS_FREE_RESOURCE(type) (((type)&TSDB_QUERY_TYPE_FREE_RESOURCE) != 0)
|
#define QUERY_IS_FREE_RESOURCE(type) (((type)&TSDB_QUERY_TYPE_FREE_RESOURCE) != 0)
|
||||||
|
|
||||||
typedef struct SArithmeticSupport {
|
|
||||||
struct SExprInfo *pExprInfo;
|
|
||||||
int32_t numOfCols;
|
|
||||||
SColumnInfo *colList;
|
|
||||||
void *exprList; // client side used
|
|
||||||
int32_t offset;
|
|
||||||
char** data;
|
|
||||||
} SArithmeticSupport;
|
|
||||||
|
|
||||||
typedef struct SInterpInfoDetail {
|
typedef struct SInterpInfoDetail {
|
||||||
TSKEY ts; // interp specified timestamp
|
TSKEY ts; // interp specified timestamp
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int8_t primaryCol;
|
int8_t primaryCol;
|
||||||
} SInterpInfoDetail;
|
} SInterpInfoDetail;
|
||||||
|
|
||||||
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowCellInfo)))
|
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowEntryInfo)))
|
||||||
|
|
||||||
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
|
||||||
|
|
||||||
#define IS_STREAM_QUERY_VALID(x) (((x)&TSDB_FUNCSTATE_STREAM) != 0)
|
#define IS_STREAM_QUERY_VALID(x) (((x)&TSDB_FUNCSTATE_STREAM) != 0)
|
||||||
#define IS_MULTIOUTPUT(x) (((x)&TSDB_FUNCSTATE_MO) != 0)
|
#define IS_MULTIOUTPUT(x) (((x)&TSDB_FUNCSTATE_MO) != 0)
|
||||||
|
|
||||||
// determine the real data need to calculated the result
|
|
||||||
enum {
|
|
||||||
BLK_DATA_NO_NEEDED = 0x0,
|
|
||||||
BLK_DATA_STATIS_NEEDED = 0x1,
|
|
||||||
BLK_DATA_ALL_NEEDED = 0x3,
|
|
||||||
BLK_DATA_DISCARD = 0x4, // discard current data block since it is not qualified for filter
|
|
||||||
};
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -115,12 +85,7 @@ bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const cha
|
||||||
* the numOfRes should be kept, since it may be used later
|
* the numOfRes should be kept, since it may be used later
|
||||||
* and allow the ResultInfo to be re initialized
|
* and allow the ResultInfo to be re initialized
|
||||||
*/
|
*/
|
||||||
#define RESET_RESULT_INFO(_r) \
|
static FORCE_INLINE void initResultRowEntry(SResultRowEntryInfo *pResInfo, int32_t bufLen) {
|
||||||
do { \
|
|
||||||
(_r)->initialized = false; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, int32_t bufLen) {
|
|
||||||
pResInfo->initialized = true; // the this struct has been initialized flag
|
pResInfo->initialized = true; // the this struct has been initialized flag
|
||||||
|
|
||||||
pResInfo->complete = false;
|
pResInfo->complete = false;
|
||||||
|
|
|
@ -60,7 +60,6 @@ typedef struct SExprTraverseSupp {
|
||||||
void *pExtInfo;
|
void *pExtInfo;
|
||||||
} SExprTraverseSupp;
|
} SExprTraverseSupp;
|
||||||
|
|
||||||
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
|
||||||
tExprNode* exprTreeFromTableName(const char* tbnameCond);
|
tExprNode* exprTreeFromTableName(const char* tbnameCond);
|
||||||
|
|
||||||
bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
|
bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
|
|
||||||
struct SSDataBlock;
|
struct SSDataBlock;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct SFillColInfo {
|
||||||
STColumn col; // column info
|
STColumn col; // column info
|
||||||
int16_t functionId; // sql function id
|
int16_t functionId; // sql function id
|
||||||
int16_t flag; // column flag: TAG COLUMN|NORMAL COLUMN
|
int16_t flag; // column flag: TAG COLUMN|NORMAL COLUMN
|
||||||
|
@ -64,30 +64,11 @@ typedef struct SFillInfo {
|
||||||
void* handle; // for debug purpose
|
void* handle; // for debug purpose
|
||||||
} SFillInfo;
|
} SFillInfo;
|
||||||
|
|
||||||
typedef struct SPoint {
|
|
||||||
int64_t key;
|
|
||||||
void * val;
|
|
||||||
} SPoint;
|
|
||||||
|
|
||||||
SFillInfo* taosCreateFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols,
|
|
||||||
int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType,
|
|
||||||
SFillColInfo* pFillCol, void* handle);
|
|
||||||
|
|
||||||
void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp);
|
|
||||||
|
|
||||||
void* taosDestroyFillInfo(SFillInfo *pFillInfo);
|
|
||||||
|
|
||||||
void taosFillSetStartInfo(SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
|
|
||||||
|
|
||||||
void taosFillSetInputDataBlock(SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
|
|
||||||
|
|
||||||
bool taosFillHasMoreResults(SFillInfo* pFillInfo);
|
|
||||||
|
|
||||||
int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows);
|
int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows);
|
||||||
|
|
||||||
int32_t taosGetLinearInterpolationVal(SPoint* point, int32_t outputType, SPoint* point1, SPoint* point2, int32_t inputType);
|
|
||||||
|
|
||||||
int64_t taosFillResultDataBlock(SFillInfo* pFillInfo, void** output, int32_t capacity);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,16 +28,22 @@ typedef struct SScalarFuncParam {
|
||||||
int32_t bytes;
|
int32_t bytes;
|
||||||
} SScalarFuncParam;
|
} SScalarFuncParam;
|
||||||
|
|
||||||
extern struct SScalarFunctionInfo scalarFunc[1];
|
typedef struct SScalarFunctionSupport {
|
||||||
|
struct SExprInfo *pExprInfo;
|
||||||
|
int32_t numOfCols;
|
||||||
|
SColumnInfo *colList;
|
||||||
|
void *exprList; // client side used
|
||||||
|
int32_t offset;
|
||||||
|
char** data;
|
||||||
|
} SScalarFunctionSupport;
|
||||||
|
|
||||||
#define FUNCTION_CEIL 38
|
extern struct SScalarFunctionInfo scalarFunc[1];
|
||||||
#define FUNCTION_FLOOR 39
|
|
||||||
#define FUNCTION_ROUND 40
|
|
||||||
#define FUNCTION_CONCAT 41
|
|
||||||
|
|
||||||
int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncParam* pOutput,
|
int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncParam* pOutput,
|
||||||
void* param, char* (*getSourceDataBlock)(void*, const char*, int32_t));
|
void* param, char* (*getSourceDataBlock)(void*, const char*, int32_t));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#ifndef TDENGINE_QSCRIPT_H
|
#ifndef TDENGINE_QSCRIPT_H
|
||||||
#define TDENGINE_QSCRIPT_H
|
#define TDENGINE_QSCRIPT_H
|
||||||
|
|
||||||
|
#if 0
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
|
@ -23,7 +24,7 @@
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "tlist.h"
|
#include "tlist.h"
|
||||||
#include "qUdf.h"
|
#include "tudf.h"
|
||||||
|
|
||||||
#define MAX_FUNC_NAME 64
|
#define MAX_FUNC_NAME 64
|
||||||
|
|
||||||
|
@ -78,5 +79,6 @@ void destroyScriptCtx(void *pScriptCtx);
|
||||||
int32_t scriptEnvPoolInit();
|
int32_t scriptEnvPoolInit();
|
||||||
void scriptEnvPoolCleanup();
|
void scriptEnvPoolCleanup();
|
||||||
bool isValidScript(char *script, int32_t len);
|
bool isValidScript(char *script, int32_t len);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif //TDENGINE_QSCRIPT_H
|
#endif //TDENGINE_QSCRIPT_H
|
|
@ -16,6 +16,13 @@
|
||||||
#ifndef TDENGINE_TUDF_H
|
#ifndef TDENGINE_TUDF_H
|
||||||
#define TDENGINE_TUDF_H
|
#define TDENGINE_TUDF_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "taoserror.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TSDB_UDF_FUNC_NORMAL = 0,
|
TSDB_UDF_FUNC_NORMAL = 0,
|
||||||
TSDB_UDF_FUNC_INIT,
|
TSDB_UDF_FUNC_INIT,
|
||||||
|
@ -76,4 +83,8 @@ typedef void (*udfFinalizeFunc)(char* dataOutput, char* interBuf, int32_t* numOf
|
||||||
typedef void (*udfMergeFunc)(char* data, int32_t numOfRows, char* dataOutput, int32_t* numOfOutput, SUdfInit* buf);
|
typedef void (*udfMergeFunc)(char* data, int32_t numOfRows, char* dataOutput, int32_t* numOfOutput, SUdfInit* buf);
|
||||||
typedef void (*udfDestroyFunc)(SUdfInit* buf);
|
typedef void (*udfDestroyFunc)(SUdfInit* buf);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_TUDF_H
|
#endif // TDENGINE_TUDF_H
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
* 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 "tscalarfunction.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
//#include "texpr.h"
|
|
||||||
#include "ttypes.h"
|
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
|
#include "ttypes.h"
|
||||||
|
|
||||||
#include "taggfunction.h"
|
#include "taggfunction.h"
|
||||||
#include "tfill.h"
|
#include "tfill.h"
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
|
|
||||||
void noop1(SQLFunctionCtx *UNUSED_PARAM(pCtx)) {}
|
void noop1(SQLFunctionCtx *UNUSED_PARAM(pCtx)) {}
|
||||||
|
|
||||||
void doFinalizer(SQLFunctionCtx *pCtx) { RESET_RESULT_INFO(GET_RES_INFO(pCtx)); }
|
void doFinalizer(SQLFunctionCtx *pCtx) { cleanupResultRowEntry(GET_RES_INFO(pCtx)); }
|
||||||
|
|
||||||
typedef struct tValuePair {
|
typedef struct tValuePair {
|
||||||
SVariant v;
|
SVariant v;
|
||||||
|
@ -196,6 +196,49 @@ typedef struct SFileBlockInfo {
|
||||||
int32_t numBlocksOfStep;
|
int32_t numBlocksOfStep;
|
||||||
} SFileBlockInfo;
|
} SFileBlockInfo;
|
||||||
|
|
||||||
|
void cleanupResultRowEntry(struct SResultRowEntryInfo* pCell) {
|
||||||
|
pCell->initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getNumOfResult(SQLFunctionCtx* pCtx, int32_t num) {
|
||||||
|
int32_t maxOutput = 0;
|
||||||
|
for (int32_t j = 0; j < num; ++j) {
|
||||||
|
int32_t id = pCtx[j].functionId;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ts, tag, tagprj function can not decide the output number of current query
|
||||||
|
* the number of output result is decided by main output
|
||||||
|
*/
|
||||||
|
if (/*hasMainFunction && */(id == FUNCTION_TS || id == FUNCTION_TAG || id == FUNCTION_TAGPRJ)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(&pCtx[j]);
|
||||||
|
if (pResInfo != NULL && maxOutput < pResInfo->numOfRes) {
|
||||||
|
maxOutput = pResInfo->numOfRes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(maxOutput >= 0);
|
||||||
|
return maxOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resetResultRowEntryResult(SQLFunctionCtx* pCtx, int32_t num) {
|
||||||
|
for (int32_t j = 0; j < num; ++j) {
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(&pCtx[j]);
|
||||||
|
pResInfo->numOfRes = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isRowEntryCompleted(struct SResultRowEntryInfo* pEntry) {
|
||||||
|
assert(pEntry != NULL);
|
||||||
|
return pEntry->complete;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isRowEntryInitialized(struct SResultRowEntryInfo* pEntry) {
|
||||||
|
return pEntry->initialized;
|
||||||
|
}
|
||||||
|
|
||||||
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/*, SUdfInfo* pUdfInfo*/) {
|
bool isSuperTable/*, SUdfInfo* pUdfInfo*/) {
|
||||||
if (!isValidDataType(dataType)) {
|
if (!isValidDataType(dataType)) {
|
||||||
|
@ -430,13 +473,13 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (pResultInfo->initialized) {
|
if (pResultInfo->initialized) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(pCtx->pOutput, 0, (size_t)pCtx->outputBytes);
|
memset(pCtx->pOutput, 0, (size_t)pCtx->outputBytes);
|
||||||
initResultInfo(pResultInfo, pCtx->interBufBytes);
|
initResultRowEntry(pResultInfo, pCtx->interBufBytes);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,7 +491,7 @@ static bool function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
|
||||||
* @param pCtx
|
* @param pCtx
|
||||||
*/
|
*/
|
||||||
static void function_finalizer(SQLFunctionCtx *pCtx) {
|
static void function_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
||||||
setNull(pCtx->pOutput, pCtx->outputType, pCtx->outputBytes);
|
setNull(pCtx->pOutput, pCtx->outputType, pCtx->outputBytes);
|
||||||
}
|
}
|
||||||
|
@ -464,12 +507,12 @@ static void count_function(SQLFunctionCtx *pCtx) {
|
||||||
int32_t numOfElem = 0;
|
int32_t numOfElem = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1. column data missing (schema modified) causes pCtx->hasNull == true. pCtx->isSmaSet == true;
|
* 1. column data missing (schema modified) causes pCtx->hasNull == true. pCtx->isAggSet == true;
|
||||||
* 2. for general non-primary key columns, pCtx->hasNull may be true or false, pCtx->isSmaSet == true;
|
* 2. for general non-primary key columns, pCtx->hasNull may be true or false, pCtx->isAggSet == true;
|
||||||
* 3. for primary key column, pCtx->hasNull always be false, pCtx->isSmaSet == false;
|
* 3. for primary key column, pCtx->hasNull always be false, pCtx->isAggSet == false;
|
||||||
*/
|
*/
|
||||||
if (pCtx->isSmaSet) {
|
if (pCtx->isAggSet) {
|
||||||
numOfElem = pCtx->size - pCtx->sma.numOfNull;
|
numOfElem = pCtx->size - pCtx->agg.numOfNull;
|
||||||
} else {
|
} else {
|
||||||
if (pCtx->hasNull) {
|
if (pCtx->hasNull) {
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
|
@ -596,19 +639,19 @@ static void do_sum(SQLFunctionCtx *pCtx) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
// Only the pre-computing information loaded and actual data does not loaded
|
// Only the pre-computing information loaded and actual data does not loaded
|
||||||
if (pCtx->isSmaSet) {
|
if (pCtx->isAggSet) {
|
||||||
notNullElems = pCtx->size - pCtx->sma.numOfNull;
|
notNullElems = pCtx->size - pCtx->agg.numOfNull;
|
||||||
assert(pCtx->size >= pCtx->sma.numOfNull);
|
assert(pCtx->size >= pCtx->agg.numOfNull);
|
||||||
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
int64_t *retVal = (int64_t *)pCtx->pOutput;
|
int64_t *retVal = (int64_t *)pCtx->pOutput;
|
||||||
*retVal += pCtx->sma.sum;
|
*retVal += pCtx->agg.sum;
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
||||||
*retVal += (uint64_t)pCtx->sma.sum;
|
*retVal += (uint64_t)pCtx->agg.sum;
|
||||||
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
||||||
double *retVal = (double*) pCtx->pOutput;
|
double *retVal = (double*) pCtx->pOutput;
|
||||||
SET_DOUBLE_VAL(retVal, *retVal + GET_DOUBLE_VAL((const char*)&(pCtx->sma.sum)));
|
SET_DOUBLE_VAL(retVal, *retVal + GET_DOUBLE_VAL((const char*)&(pCtx->agg.sum)));
|
||||||
}
|
}
|
||||||
} else { // computing based on the true data block
|
} else { // computing based on the true data block
|
||||||
void *pData = GET_INPUT_DATA_LIST(pCtx);
|
void *pData = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -659,7 +702,7 @@ static void sum_function(SQLFunctionCtx *pCtx) {
|
||||||
do_sum(pCtx);
|
do_sum(pCtx);
|
||||||
|
|
||||||
// keep the result data in output buffer, not in the intermediate buffer
|
// keep the result data in output buffer, not in the intermediate buffer
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo->hasResult == DATA_SET_FLAG && pCtx->stableQuery) {
|
if (pResInfo->hasResult == DATA_SET_FLAG && pCtx->stableQuery) {
|
||||||
// set the flag for super table query
|
// set the flag for super table query
|
||||||
SSumInfo *pSum = (SSumInfo *)pCtx->pOutput;
|
SSumInfo *pSum = (SSumInfo *)pCtx->pOutput;
|
||||||
|
@ -692,7 +735,7 @@ static void sum_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
@ -783,21 +826,21 @@ static void avg_function(SQLFunctionCtx *pCtx) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
// NOTE: keep the intermediate result into the interResultBuf
|
// NOTE: keep the intermediate result into the interResultBuf
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
SAvgInfo *pAvgInfo = (SAvgInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
SAvgInfo *pAvgInfo = (SAvgInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
double *pVal = &pAvgInfo->sum;
|
double *pVal = &pAvgInfo->sum;
|
||||||
|
|
||||||
if (pCtx->isSmaSet) { // Pre-aggregation
|
if (pCtx->isAggSet) { // Pre-aggregation
|
||||||
notNullElems = pCtx->size - pCtx->sma.numOfNull;
|
notNullElems = pCtx->size - pCtx->agg.numOfNull;
|
||||||
assert(notNullElems >= 0);
|
assert(notNullElems >= 0);
|
||||||
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
*pVal += pCtx->sma.sum;
|
*pVal += pCtx->agg.sum;
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
*pVal += (uint64_t) pCtx->sma.sum;
|
*pVal += (uint64_t) pCtx->agg.sum;
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE || pCtx->inputType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE || pCtx->inputType == TSDB_DATA_TYPE_FLOAT) {
|
||||||
*pVal += GET_DOUBLE_VAL((const char *)&(pCtx->sma.sum));
|
*pVal += GET_DOUBLE_VAL((const char *)&(pCtx->agg.sum));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
void *pData = GET_INPUT_DATA_LIST(pCtx);
|
void *pData = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -843,7 +886,7 @@ static void avg_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avg_func_merge(SQLFunctionCtx *pCtx) {
|
static void avg_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
double *sum = (double*) pCtx->pOutput;
|
double *sum = (double*) pCtx->pOutput;
|
||||||
char *input = GET_INPUT_DATA_LIST(pCtx);
|
char *input = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -865,7 +908,7 @@ static void avg_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
* the average value is calculated in finalize routine, since current routine does not know the exact number of points
|
* the average value is calculated in finalize routine, since current routine does not know the exact number of points
|
||||||
*/
|
*/
|
||||||
static void avg_finalizer(SQLFunctionCtx *pCtx) {
|
static void avg_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
if (pCtx->currentStage == MERGE_STAGE) {
|
if (pCtx->currentStage == MERGE_STAGE) {
|
||||||
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
||||||
|
@ -897,8 +940,8 @@ static void avg_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin, int32_t *notNullElems) {
|
static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin, int32_t *notNullElems) {
|
||||||
// data in current data block are qualified to the query
|
// data in current data block are qualified to the query
|
||||||
if (pCtx->isSmaSet) {
|
if (pCtx->isAggSet) {
|
||||||
*notNullElems = pCtx->size - pCtx->sma.numOfNull;
|
*notNullElems = pCtx->size - pCtx->agg.numOfNull;
|
||||||
assert(*notNullElems >= 0);
|
assert(*notNullElems >= 0);
|
||||||
|
|
||||||
if (*notNullElems == 0) {
|
if (*notNullElems == 0) {
|
||||||
|
@ -909,11 +952,11 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
|
||||||
int16_t index = 0;
|
int16_t index = 0;
|
||||||
|
|
||||||
if (isMin) {
|
if (isMin) {
|
||||||
tval = &pCtx->sma.min;
|
tval = &pCtx->agg.min;
|
||||||
index = pCtx->sma.minIndex;
|
index = pCtx->agg.minIndex;
|
||||||
} else {
|
} else {
|
||||||
tval = &pCtx->sma.max;
|
tval = &pCtx->agg.max;
|
||||||
index = pCtx->sma.maxIndex;
|
index = pCtx->agg.maxIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSKEY key = TSKEY_INITIAL_VAL;
|
TSKEY key = TSKEY_INITIAL_VAL;
|
||||||
|
@ -1046,7 +1089,7 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool min_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool min_func_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (!function_setup(pCtx, pResultInfo)) {
|
if (!function_setup(pCtx, pResultInfo)) {
|
||||||
return false; // not initialized since it has been initialized
|
return false; // not initialized since it has been initialized
|
||||||
}
|
}
|
||||||
|
@ -1092,7 +1135,7 @@ static bool min_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool max_func_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool max_func_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (!function_setup(pCtx, pResultInfo)) {
|
if (!function_setup(pCtx, pResultInfo)) {
|
||||||
return false; // not initialized since it has been initialized
|
return false; // not initialized since it has been initialized
|
||||||
}
|
}
|
||||||
|
@ -1148,7 +1191,7 @@ static void min_function(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
|
||||||
// set the flag for super table query
|
// set the flag for super table query
|
||||||
|
@ -1165,7 +1208,7 @@ static void max_function(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
|
||||||
// set the flag for super table query
|
// set the flag for super table query
|
||||||
|
@ -1265,7 +1308,7 @@ static void min_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
|
@ -1276,7 +1319,7 @@ static void max_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
SET_VAL(pCtx, numOfElem, 1);
|
SET_VAL(pCtx, numOfElem, 1);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (numOfElem > 0) {
|
if (numOfElem > 0) {
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
|
@ -1292,7 +1335,7 @@ static void max_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stddev_function(SQLFunctionCtx *pCtx) {
|
static void stddev_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SStddevInfo *pStd = GET_ROWCELL_INTERBUF(pResInfo);
|
SStddevInfo *pStd = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pCtx->currentStage == REPEAT_SCAN && pStd->stage == 0) {
|
if (pCtx->currentStage == REPEAT_SCAN && pStd->stage == 0) {
|
||||||
|
@ -1494,7 +1537,7 @@ static void stddev_dst_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stddev_dst_merge(SQLFunctionCtx *pCtx) {
|
static void stddev_dst_merge(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SStddevdstInfo* pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
SStddevdstInfo* pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
char *input = GET_INPUT_DATA_LIST(pCtx);
|
char *input = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -1525,7 +1568,7 @@ static void stddev_dst_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool first_last_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool first_last_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1558,7 +1601,7 @@ static void first_function(SQLFunctionCtx *pCtx) {
|
||||||
DO_UPDATE_TAG_COLUMNS(pCtx, k);
|
DO_UPDATE_TAG_COLUMNS(pCtx, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo *pInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pInfo = GET_RES_INFO(pCtx);
|
||||||
pInfo->hasResult = DATA_SET_FLAG;
|
pInfo->hasResult = DATA_SET_FLAG;
|
||||||
pInfo->complete = true;
|
pInfo->complete = true;
|
||||||
|
|
||||||
|
@ -1608,7 +1651,7 @@ static void first_dist_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
first_data_assign_impl(pCtx, data, i);
|
first_data_assign_impl(pCtx, data, i);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
|
@ -1653,7 +1696,7 @@ static void last_function(SQLFunctionCtx *pCtx) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
if (pCtx->order == TSDB_ORDER_DESC) {
|
if (pCtx->order == TSDB_ORDER_DESC) {
|
||||||
|
@ -1738,7 +1781,7 @@ static void last_dist_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
last_data_assign_impl(pCtx, data, i);
|
last_data_assign_impl(pCtx, data, i);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
|
@ -1788,7 +1831,7 @@ static void last_row_function(SQLFunctionCtx *pCtx) {
|
||||||
// assign the last element in current data block
|
// assign the last element in current data block
|
||||||
assignVal(pCtx->pOutput, pData + (pCtx->size - 1) * pCtx->inputBytes, pCtx->inputBytes, pCtx->inputType);
|
assignVal(pCtx->pOutput, pData + (pCtx->size - 1) * pCtx->inputBytes, pCtx->inputBytes, pCtx->inputType);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
|
||||||
// set the result to final result buffer in case of super table query
|
// set the result to final result buffer in case of super table query
|
||||||
|
@ -1808,7 +1851,7 @@ static void last_row_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
static void last_row_finalizer(SQLFunctionCtx *pCtx) {
|
static void last_row_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
// do nothing at the first stage
|
// do nothing at the first stage
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
if (pResInfo->hasResult != DATA_SET_FLAG) {
|
||||||
setNull(pCtx->pOutput, pCtx->outputType, pCtx->outputBytes);
|
setNull(pCtx->pOutput, pCtx->outputType, pCtx->outputBytes);
|
||||||
return;
|
return;
|
||||||
|
@ -1981,7 +2024,7 @@ static int32_t resDataAscComparFn(const void *pLeft, const void *pRight) {
|
||||||
static int32_t resDataDescComparFn(const void *pLeft, const void *pRight) { return -resDataAscComparFn(pLeft, pRight); }
|
static int32_t resDataDescComparFn(const void *pLeft, const void *pRight) { return -resDataAscComparFn(pLeft, pRight); }
|
||||||
|
|
||||||
static void copyTopBotRes(SQLFunctionCtx *pCtx, int32_t type) {
|
static void copyTopBotRes(SQLFunctionCtx *pCtx, int32_t type) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STopBotInfo *pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
STopBotInfo *pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
tValuePair **tvp = pRes->res;
|
tValuePair **tvp = pRes->res;
|
||||||
|
@ -2076,7 +2119,7 @@ static void copyTopBotRes(SQLFunctionCtx *pCtx, int32_t type) {
|
||||||
* top/bottom use the intermediate result buffer to keep the intermediate result
|
* top/bottom use the intermediate result buffer to keep the intermediate result
|
||||||
*/
|
*/
|
||||||
static STopBotInfo *getTopBotOutputInfo(SQLFunctionCtx *pCtx) {
|
static STopBotInfo *getTopBotOutputInfo(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
// only the first_stage_merge is directly written data into final output buffer
|
// only the first_stage_merge is directly written data into final output buffer
|
||||||
if (pCtx->stableQuery && pCtx->currentStage != MERGE_STAGE) {
|
if (pCtx->stableQuery && pCtx->currentStage != MERGE_STAGE) {
|
||||||
|
@ -2108,7 +2151,7 @@ static void buildTopBotStruct(STopBotInfo *pTopBotInfo, SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const char *maxval) {
|
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const char *maxval) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo == NULL) {
|
if (pResInfo == NULL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2163,7 +2206,7 @@ bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const cha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool top_bottom_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool top_bottom_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2204,7 +2247,7 @@ static void top_function(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2227,7 +2270,7 @@ static void top_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, pInput->num, pOutput->num);
|
SET_VAL(pCtx, pInput->num, pOutput->num);
|
||||||
|
|
||||||
if (pOutput->num > 0) {
|
if (pOutput->num > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2261,7 +2304,7 @@ static void bottom_function(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2284,13 +2327,13 @@ static void bottom_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
SET_VAL(pCtx, pInput->num, pOutput->num);
|
SET_VAL(pCtx, pInput->num, pOutput->num);
|
||||||
|
|
||||||
if (pOutput->num > 0) {
|
if (pOutput->num > 0) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void top_bottom_func_finalizer(SQLFunctionCtx *pCtx) {
|
static void top_bottom_func_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
// data in temporary list is less than the required number of results, not enough qualified number of results
|
// data in temporary list is less than the required number of results, not enough qualified number of results
|
||||||
STopBotInfo *pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
STopBotInfo *pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -2318,7 +2361,7 @@ static void top_bottom_func_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool percentile_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool percentile_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (!function_setup(pCtx, pResultInfo)) {
|
if (!function_setup(pCtx, pResultInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2335,7 +2378,7 @@ static bool percentile_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo*
|
||||||
static void percentile_function(SQLFunctionCtx *pCtx) {
|
static void percentile_function(SQLFunctionCtx *pCtx) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SPercentileInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SPercentileInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pCtx->currentStage == REPEAT_SCAN && pInfo->stage == 0) {
|
if (pCtx->currentStage == REPEAT_SCAN && pInfo->stage == 0) {
|
||||||
|
@ -2353,17 +2396,17 @@ static void percentile_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
// the first stage, only acquire the min/max value
|
// the first stage, only acquire the min/max value
|
||||||
if (pInfo->stage == 0) {
|
if (pInfo->stage == 0) {
|
||||||
if (pCtx->isSmaSet) {
|
if (pCtx->isAggSet) {
|
||||||
double tmin = 0.0, tmax = 0.0;
|
double tmin = 0.0, tmax = 0.0;
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
tmin = (double)GET_INT64_VAL(&pCtx->sma.min);
|
tmin = (double)GET_INT64_VAL(&pCtx->agg.min);
|
||||||
tmax = (double)GET_INT64_VAL(&pCtx->sma.max);
|
tmax = (double)GET_INT64_VAL(&pCtx->agg.max);
|
||||||
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
||||||
tmin = GET_DOUBLE_VAL(&pCtx->sma.min);
|
tmin = GET_DOUBLE_VAL(&pCtx->agg.min);
|
||||||
tmax = GET_DOUBLE_VAL(&pCtx->sma.max);
|
tmax = GET_DOUBLE_VAL(&pCtx->agg.max);
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
tmin = (double)GET_UINT64_VAL(&pCtx->sma.min);
|
tmin = (double)GET_UINT64_VAL(&pCtx->agg.min);
|
||||||
tmax = (double)GET_UINT64_VAL(&pCtx->sma.max);
|
tmax = (double)GET_UINT64_VAL(&pCtx->agg.max);
|
||||||
} else {
|
} else {
|
||||||
assert(true);
|
assert(true);
|
||||||
}
|
}
|
||||||
|
@ -2376,7 +2419,7 @@ static void percentile_function(SQLFunctionCtx *pCtx) {
|
||||||
SET_DOUBLE_VAL(&pInfo->maxval, tmax);
|
SET_DOUBLE_VAL(&pInfo->maxval, tmax);
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->numOfElems += (pCtx->size - pCtx->sma.numOfNull);
|
pInfo->numOfElems += (pCtx->size - pCtx->agg.numOfNull);
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
char *data = GET_INPUT_DATA(pCtx, i);
|
char *data = GET_INPUT_DATA(pCtx, i);
|
||||||
|
@ -2420,7 +2463,7 @@ static void percentile_function(SQLFunctionCtx *pCtx) {
|
||||||
static void percentile_finalizer(SQLFunctionCtx *pCtx) {
|
static void percentile_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
double v = pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i : pCtx->param[0].d;
|
double v = pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i : pCtx->param[0].d;
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
tMemBucket * pMemBucket = ppInfo->pMemBucket;
|
tMemBucket * pMemBucket = ppInfo->pMemBucket;
|
||||||
|
@ -2442,7 +2485,7 @@ static void buildHistogramInfo(SAPercentileInfo* pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
|
static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SAPercentileInfo* pInfo = NULL;
|
SAPercentileInfo* pInfo = NULL;
|
||||||
|
|
||||||
if (pCtx->stableQuery && pCtx->currentStage != MERGE_STAGE) {
|
if (pCtx->stableQuery && pCtx->currentStage != MERGE_STAGE) {
|
||||||
|
@ -2455,7 +2498,7 @@ static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
|
||||||
return pInfo;
|
return pInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool apercentile_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool apercentile_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (!function_setup(pCtx, pResultInfo)) {
|
if (!function_setup(pCtx, pResultInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2470,7 +2513,7 @@ static bool apercentile_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo*
|
||||||
static void apercentile_function(SQLFunctionCtx *pCtx) {
|
static void apercentile_function(SQLFunctionCtx *pCtx) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SAPercentileInfo *pInfo = getAPerctInfo(pCtx);
|
SAPercentileInfo *pInfo = getAPerctInfo(pCtx);
|
||||||
|
|
||||||
assert(pInfo->pHisto->elems != NULL);
|
assert(pInfo->pHisto->elems != NULL);
|
||||||
|
@ -2524,7 +2567,7 @@ static void apercentile_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
tHistogramDestroy(&pRes);
|
tHistogramDestroy(&pRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
SET_VAL(pCtx, 1, 1);
|
SET_VAL(pCtx, 1, 1);
|
||||||
}
|
}
|
||||||
|
@ -2532,7 +2575,7 @@ static void apercentile_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
static void apercentile_finalizer(SQLFunctionCtx *pCtx) {
|
static void apercentile_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
double v = (pCtx->param[0].nType == TSDB_DATA_TYPE_INT) ? pCtx->param[0].i : pCtx->param[0].d;
|
double v = (pCtx->param[0].nType == TSDB_DATA_TYPE_INT) ? pCtx->param[0].i : pCtx->param[0].d;
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SAPercentileInfo *pOutput = GET_ROWCELL_INTERBUF(pResInfo);
|
SAPercentileInfo *pOutput = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pCtx->currentStage == MERGE_STAGE) {
|
if (pCtx->currentStage == MERGE_STAGE) {
|
||||||
|
@ -2565,7 +2608,7 @@ static void apercentile_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool leastsquares_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool leastsquares_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2596,7 +2639,7 @@ static bool leastsquares_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
double(*param)[3] = pInfo->mat;
|
double(*param)[3] = pInfo->mat;
|
||||||
|
@ -2683,7 +2726,7 @@ static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
// no data in query
|
// no data in query
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pInfo->num == 0) {
|
if (pInfo->num == 0) {
|
||||||
|
@ -2793,7 +2836,7 @@ enum {
|
||||||
INITIAL_VALUE_NOT_ASSIGNED = 0,
|
INITIAL_VALUE_NOT_ASSIGNED = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool diff_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool diff_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2803,7 +2846,7 @@ static bool diff_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResIn
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool deriv_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo) {
|
static bool deriv_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
if (!function_setup(pCtx, pResultInfo)) {
|
if (!function_setup(pCtx, pResultInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2819,7 +2862,7 @@ static bool deriv_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResu
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deriv_function(SQLFunctionCtx *pCtx) {
|
static void deriv_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SDerivInfo* pDerivInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SDerivInfo* pDerivInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
void *data = GET_INPUT_DATA_LIST(pCtx);
|
void *data = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -3179,7 +3222,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *getArithColumnData(void *param, const char* name, int32_t colId) {
|
char *getArithColumnData(void *param, const char* name, int32_t colId) {
|
||||||
SArithmeticSupport *pSupport = (SArithmeticSupport *)param;
|
SScalarFunctionSupport *pSupport = (SScalarFunctionSupport *)param;
|
||||||
|
|
||||||
int32_t index = -1;
|
int32_t index = -1;
|
||||||
for (int32_t i = 0; i < pSupport->numOfCols; ++i) {
|
for (int32_t i = 0; i < pSupport->numOfCols; ++i) {
|
||||||
|
@ -3195,9 +3238,12 @@ char *getArithColumnData(void *param, const char* name, int32_t colId) {
|
||||||
|
|
||||||
static void arithmetic_function(SQLFunctionCtx *pCtx) {
|
static void arithmetic_function(SQLFunctionCtx *pCtx) {
|
||||||
GET_RES_INFO(pCtx)->numOfRes += pCtx->size;
|
GET_RES_INFO(pCtx)->numOfRes += pCtx->size;
|
||||||
SArithmeticSupport *sas = (SArithmeticSupport *)pCtx->param[1].pz;
|
SScalarFunctionSupport *pSup = (SScalarFunctionSupport *)pCtx->param[1].pz;
|
||||||
|
|
||||||
// evaluateExprNodeTree(sas->pExprInfo->pExpr, pCtx->size, pCtx->pOutput, sas, pCtx->order, getArithColumnData);
|
SScalarFuncParam output = {0};
|
||||||
|
output.data = pCtx->pOutput;
|
||||||
|
|
||||||
|
evaluateExprNodeTree(pSup->pExprInfo->pExpr, pCtx->size, &output, pSup, getArithColumnData);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LIST_MINMAX_N(ctx, minOutput, maxOutput, elemCnt, data, type, tsdbType, numOfNotNullElem) \
|
#define LIST_MINMAX_N(ctx, minOutput, maxOutput, elemCnt, data, type, tsdbType, numOfNotNullElem) \
|
||||||
|
@ -3218,7 +3264,7 @@ static void arithmetic_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool spread_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool spread_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3238,15 +3284,15 @@ static bool spread_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pRes
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spread_function(SQLFunctionCtx *pCtx) {
|
static void spread_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SSpreadInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SSpreadInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
int32_t numOfElems = 0;
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
// todo : opt with pre-calculated result
|
// todo : opt with pre-calculated result
|
||||||
// column missing cause the hasNull to be true
|
// column missing cause the hasNull to be true
|
||||||
if (pCtx->isSmaSet) {
|
if (pCtx->isAggSet) {
|
||||||
numOfElems = pCtx->size - pCtx->sma.numOfNull;
|
numOfElems = pCtx->size - pCtx->agg.numOfNull;
|
||||||
|
|
||||||
// all data are null in current data block, ignore current data block
|
// all data are null in current data block, ignore current data block
|
||||||
if (numOfElems == 0) {
|
if (numOfElems == 0) {
|
||||||
|
@ -3255,20 +3301,20 @@ static void spread_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType) || IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType) ||
|
if (IS_SIGNED_NUMERIC_TYPE(pCtx->inputType) || IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType) ||
|
||||||
(pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP)) {
|
(pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP)) {
|
||||||
if (pInfo->min > pCtx->sma.min) {
|
if (pInfo->min > pCtx->agg.min) {
|
||||||
pInfo->min = (double)pCtx->sma.min;
|
pInfo->min = (double)pCtx->agg.min;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInfo->max < pCtx->sma.max) {
|
if (pInfo->max < pCtx->agg.max) {
|
||||||
pInfo->max = (double)pCtx->sma.max;
|
pInfo->max = (double)pCtx->agg.max;
|
||||||
}
|
}
|
||||||
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
||||||
if (pInfo->min > GET_DOUBLE_VAL((const char *)&(pCtx->sma.min))) {
|
if (pInfo->min > GET_DOUBLE_VAL((const char *)&(pCtx->agg.min))) {
|
||||||
pInfo->min = GET_DOUBLE_VAL((const char *)&(pCtx->sma.min));
|
pInfo->min = GET_DOUBLE_VAL((const char *)&(pCtx->agg.min));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInfo->max < GET_DOUBLE_VAL((const char *)&(pCtx->sma.max))) {
|
if (pInfo->max < GET_DOUBLE_VAL((const char *)&(pCtx->agg.max))) {
|
||||||
pInfo->max = GET_DOUBLE_VAL((const char *)&(pCtx->sma.max));
|
pInfo->max = GET_DOUBLE_VAL((const char *)&(pCtx->agg.max));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3344,7 +3390,7 @@ void spread_function_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
* here we do not check the input data types, because in case of metric query,
|
* here we do not check the input data types, because in case of metric query,
|
||||||
* the type of intermediate data is binary
|
* the type of intermediate data is binary
|
||||||
*/
|
*/
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
if (pCtx->currentStage == MERGE_STAGE) {
|
if (pCtx->currentStage == MERGE_STAGE) {
|
||||||
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
||||||
|
@ -3377,7 +3423,7 @@ void spread_function_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
* param[2]: end time
|
* param[2]: end time
|
||||||
* @param pCtx
|
* @param pCtx
|
||||||
*/
|
*/
|
||||||
static bool twa_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool twa_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3400,7 +3446,7 @@ static double twa_get_area(SPoint1 s, SPoint1 e) {
|
||||||
|
|
||||||
static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t index, int32_t size) {
|
static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t index, int32_t size) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
TSKEY *tsList = GET_TS_LIST(pCtx);
|
TSKEY *tsList = GET_TS_LIST(pCtx);
|
||||||
|
@ -3642,7 +3688,7 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t index, int32_t si
|
||||||
static void twa_function(SQLFunctionCtx *pCtx) {
|
static void twa_function(SQLFunctionCtx *pCtx) {
|
||||||
void *data = GET_INPUT_DATA_LIST(pCtx);
|
void *data = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// skip null value
|
// skip null value
|
||||||
|
@ -3675,14 +3721,14 @@ static void twa_function(SQLFunctionCtx *pCtx) {
|
||||||
*/
|
*/
|
||||||
void twa_function_copy(SQLFunctionCtx *pCtx) {
|
void twa_function_copy(SQLFunctionCtx *pCtx) {
|
||||||
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
memcpy(GET_ROWCELL_INTERBUF(pResInfo), pCtx->pInput, (size_t)pCtx->inputBytes);
|
memcpy(GET_ROWCELL_INTERBUF(pResInfo), pCtx->pInput, (size_t)pCtx->inputBytes);
|
||||||
pResInfo->hasResult = ((STwaInfo *)pCtx->pInput)->hasResult;
|
pResInfo->hasResult = ((STwaInfo *)pCtx->pInput)->hasResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
void twa_function_finalizer(SQLFunctionCtx *pCtx) {
|
void twa_function_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
STwaInfo *pInfo = (STwaInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
STwaInfo *pInfo = (STwaInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
if (pInfo->hasResult != DATA_SET_FLAG) {
|
if (pInfo->hasResult != DATA_SET_FLAG) {
|
||||||
|
@ -3872,7 +3918,7 @@ static void interp_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ts_comp_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool ts_comp_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false; // not initialized since it has been initialized
|
return false; // not initialized since it has been initialized
|
||||||
}
|
}
|
||||||
|
@ -3884,7 +3930,7 @@ static bool ts_comp_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pRe
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ts_comp_function(SQLFunctionCtx *pCtx) {
|
static void ts_comp_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STSBuf * pTSbuf = ((STSCompInfo *)(GET_ROWCELL_INTERBUF(pResInfo)))->pTSBuf;
|
STSBuf * pTSbuf = ((STSCompInfo *)(GET_ROWCELL_INTERBUF(pResInfo)))->pTSBuf;
|
||||||
|
|
||||||
const char *input = GET_INPUT_DATA_LIST(pCtx);
|
const char *input = GET_INPUT_DATA_LIST(pCtx);
|
||||||
|
@ -3904,7 +3950,7 @@ static void ts_comp_function(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ts_comp_finalize(SQLFunctionCtx *pCtx) {
|
static void ts_comp_finalize(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
STSCompInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STSCompInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
STSBuf * pTSbuf = pInfo->pTSBuf;
|
STSBuf * pTSbuf = pInfo->pTSBuf;
|
||||||
|
@ -3960,7 +4006,7 @@ static double do_calc_rate(const SRateInfo* pRateInfo, double tickPerSec) {
|
||||||
return (duration > 0)? ((double)diff) / (duration/tickPerSec):0.0;
|
return (duration > 0)? ((double)diff) / (duration/tickPerSec):0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rate_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResInfo) {
|
static bool rate_function_setup(SQLFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3978,7 +4024,7 @@ static bool rate_function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResIn
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rate_function(SQLFunctionCtx *pCtx) {
|
static void rate_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -4033,13 +4079,13 @@ static void rate_function(SQLFunctionCtx *pCtx) {
|
||||||
static void rate_func_copy(SQLFunctionCtx *pCtx) {
|
static void rate_func_copy(SQLFunctionCtx *pCtx) {
|
||||||
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
assert(pCtx->inputType == TSDB_DATA_TYPE_BINARY);
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
memcpy(GET_ROWCELL_INTERBUF(pResInfo), pCtx->pInput, (size_t)pCtx->inputBytes);
|
memcpy(GET_ROWCELL_INTERBUF(pResInfo), pCtx->pInput, (size_t)pCtx->inputBytes);
|
||||||
pResInfo->hasResult = ((SRateInfo*)pCtx->pInput)->hasResult;
|
pResInfo->hasResult = ((SRateInfo*)pCtx->pInput)->hasResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rate_finalizer(SQLFunctionCtx *pCtx) {
|
static void rate_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pRateInfo->hasResult != DATA_SET_FLAG) {
|
if (pRateInfo->hasResult != DATA_SET_FLAG) {
|
||||||
|
@ -4057,7 +4103,7 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void irate_function(SQLFunctionCtx *pCtx) {
|
static void irate_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -4139,7 +4185,7 @@ static void blockDistInfoFromBinary(const char* data, int32_t len, STableBlockDi
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blockInfo_func(SQLFunctionCtx* pCtx) {
|
static void blockInfo_func(SQLFunctionCtx* pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
int32_t len = *(int32_t*) pCtx->pInput;
|
int32_t len = *(int32_t*) pCtx->pInput;
|
||||||
|
@ -4152,7 +4198,7 @@ static void blockInfo_func(SQLFunctionCtx* pCtx) {
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mergeTableBlockDist(SResultRowCellInfo* pResInfo, const STableBlockDist* pSrc) {
|
static void mergeTableBlockDist(SResultRowEntryInfo* pResInfo, const STableBlockDist* pSrc) {
|
||||||
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
assert(pDist != NULL && pSrc != NULL);
|
assert(pDist != NULL && pSrc != NULL);
|
||||||
|
|
||||||
|
@ -4190,7 +4236,7 @@ void block_func_merge(SQLFunctionCtx* pCtx) {
|
||||||
STableBlockDist info = {0};
|
STableBlockDist info = {0};
|
||||||
int32_t len = *(int32_t*) pCtx->pInput;
|
int32_t len = *(int32_t*) pCtx->pInput;
|
||||||
blockDistInfoFromBinary(((char*)pCtx->pInput) + sizeof(int32_t), len, &info);
|
blockDistInfoFromBinary(((char*)pCtx->pInput) + sizeof(int32_t), len, &info);
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
mergeTableBlockDist(pResInfo, &info);
|
mergeTableBlockDist(pResInfo, &info);
|
||||||
taosArrayDestroy(info.dataBlockInfos);
|
taosArrayDestroy(info.dataBlockInfos);
|
||||||
|
|
||||||
|
@ -4293,7 +4339,7 @@ void generateBlockDistResult(STableBlockDist *pTableBlockDist, char* result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockinfo_func_finalizer(SQLFunctionCtx* pCtx) {
|
void blockinfo_func_finalizer(SQLFunctionCtx* pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
pDist->rowSize = (uint16_t)pCtx->param[0].i;
|
pDist->rowSize = (uint16_t)pCtx->param[0].i;
|
||||||
|
|
|
@ -21,9 +21,7 @@
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tbuffer.h"
|
#include "tbuffer.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tname.h"
|
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "tskiplist.h"
|
|
||||||
#include "texpr.h"
|
#include "texpr.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
|
||||||
|
|
|
@ -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 "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
@ -27,7 +28,6 @@
|
||||||
|
|
||||||
#define FILL_IS_ASC_FILL(_f) ((_f)->order == TSDB_ORDER_ASC)
|
#define FILL_IS_ASC_FILL(_f) ((_f)->order == TSDB_ORDER_ASC)
|
||||||
#define DO_INTERPOLATION(_v1, _v2, _k1, _k2, _k) ((_v1) + ((_v2) - (_v1)) * (((double)(_k)) - ((double)(_k1))) / (((double)(_k2)) - ((double)(_k1))))
|
#define DO_INTERPOLATION(_v1, _v2, _k1, _k2, _k) ((_v1) + ((_v2) - (_v1)) * (((double)(_k)) - ((double)(_k1))) / (((double)(_k2)) - ((double)(_k1))))
|
||||||
#define GET_FORWARD_DIRECTION_FACTOR(_ord) (((_ord) == TSDB_ORDER_ASC)? 1:-1)
|
|
||||||
|
|
||||||
static void setTagsValue(SFillInfo* pFillInfo, void** data, int32_t genRows) {
|
static void setTagsValue(SFillInfo* pFillInfo, void** data, int32_t genRows) {
|
||||||
for(int32_t j = 0; j < pFillInfo->numOfCols; ++j) {
|
for(int32_t j = 0; j < pFillInfo->numOfCols; ++j) {
|
||||||
|
@ -340,9 +340,9 @@ static int32_t taosNumOfRemainRows(SFillInfo* pFillInfo) {
|
||||||
return pFillInfo->numOfRows - pFillInfo->index;
|
return pFillInfo->numOfRows - pFillInfo->index;
|
||||||
}
|
}
|
||||||
|
|
||||||
SFillInfo* taosCreateFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols,
|
struct SFillInfo* taosCreateFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols,
|
||||||
int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType,
|
int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType,
|
||||||
SFillColInfo* pCol, void* handle) {
|
struct SFillColInfo* pCol, void* handle) {
|
||||||
if (fillType == TSDB_FILL_NONE) {
|
if (fillType == TSDB_FILL_NONE) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -522,3 +522,33 @@ int64_t taosFillResultDataBlock(SFillInfo* pFillInfo, void** output, int32_t cap
|
||||||
|
|
||||||
return numOfRes;
|
return numOfRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t getFillInfoStart(struct SFillInfo *pFillInfo) {
|
||||||
|
return pFillInfo->start;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfOutput, const int64_t* fillVal) {
|
||||||
|
int32_t offset = 0;
|
||||||
|
|
||||||
|
struct SFillColInfo* pFillCol = calloc(numOfOutput, sizeof(SFillColInfo));
|
||||||
|
if (pFillCol == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
|
SExprInfo* pExprInfo = &pExpr[i];
|
||||||
|
|
||||||
|
pFillCol[i].col.bytes = pExprInfo->base.resSchema.bytes;
|
||||||
|
pFillCol[i].col.type = (int8_t)pExprInfo->base.resSchema.type;
|
||||||
|
pFillCol[i].col.offset = offset;
|
||||||
|
pFillCol[i].col.colId = pExprInfo->base.resSchema.colId;
|
||||||
|
pFillCol[i].tagIndex = -2;
|
||||||
|
pFillCol[i].flag = pExprInfo->base.colInfo.flag; // always be the normal column for table query
|
||||||
|
pFillCol[i].functionId = pExprInfo->pExpr->_node.functionId;
|
||||||
|
pFillCol[i].fillVal.i = fillVal[i];
|
||||||
|
|
||||||
|
offset += pExprInfo->base.resSchema.bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pFillCol;
|
||||||
|
}
|
|
@ -132,9 +132,9 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncPa
|
||||||
void* outputBuf = pOutput->data;
|
void* outputBuf = pOutput->data;
|
||||||
if (isStringOp(pExprs->_node.optr)) {
|
if (isStringOp(pExprs->_node.optr)) {
|
||||||
outputBuf = realloc(pOutput->data, (left.bytes + right.bytes) * left.num);
|
outputBuf = realloc(pOutput->data, (left.bytes + right.bytes) * left.num);
|
||||||
OperatorFn(&left, &right, outputBuf, TSDB_ORDER_ASC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OperatorFn(&left, &right, outputBuf, TSDB_ORDER_ASC);
|
||||||
// Set the result info
|
// Set the result info
|
||||||
setScalarFuncParam(pOutput, TSDB_DATA_TYPE_DOUBLE, sizeof(double), outputBuf, numOfRows);
|
setScalarFuncParam(pOutput, TSDB_DATA_TYPE_DOUBLE, sizeof(double), outputBuf, numOfRows);
|
||||||
} else if (pExprs->nodeType == TEXPR_UNARYEXPR_NODE) {
|
} else if (pExprs->nodeType == TEXPR_UNARYEXPR_NODE) {
|
||||||
|
@ -174,3 +174,44 @@ SScalarFunctionInfo scalarFunc[1] = {
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void setScalarFunctionSupp(struct SScalarFunctionSupport* sas, SExprInfo *pExprInfo, SSDataBlock* pSDataBlock) {
|
||||||
|
sas->numOfCols = (int32_t) pSDataBlock->info.numOfCols;
|
||||||
|
sas->pExprInfo = pExprInfo;
|
||||||
|
if (sas->colList != NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sas->colList = calloc(1, pSDataBlock->info.numOfCols*sizeof(SColumnInfo));
|
||||||
|
for(int32_t i = 0; i < sas->numOfCols; ++i) {
|
||||||
|
SColumnInfoData* pColData = taosArrayGet(pSDataBlock->pDataBlock, i);
|
||||||
|
sas->colList[i] = pColData->info;
|
||||||
|
}
|
||||||
|
|
||||||
|
sas->data = calloc(sas->numOfCols, POINTER_BYTES);
|
||||||
|
|
||||||
|
// set the input column data
|
||||||
|
for (int32_t f = 0; f < pSDataBlock->info.numOfCols; ++f) {
|
||||||
|
SColumnInfoData *pColumnInfoData = taosArrayGet(pSDataBlock->pDataBlock, f);
|
||||||
|
sas->data[f] = pColumnInfoData->pData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SScalarFunctionSupport* createScalarFuncSupport(int32_t num) {
|
||||||
|
SScalarFunctionSupport* pSupp = calloc(num, sizeof(SScalarFunctionSupport));
|
||||||
|
return pSupp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t num) {
|
||||||
|
if (pSupport == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < num; ++i) {
|
||||||
|
SScalarFunctionSupport* pSupp = &pSupport[i];
|
||||||
|
tfree(pSupp->data);
|
||||||
|
tfree(pSupp->colList);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(pSupport);
|
||||||
|
}
|
|
@ -14,12 +14,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qScript.h"
|
#include "tscript.h"
|
||||||
#include "ttype.h"
|
#include "ttypes.h"
|
||||||
#include "tstrbuild.h"
|
#include "tstrbuild.h"
|
||||||
#include "queryLog.h"
|
//#include "queryLog.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
|
#if 0
|
||||||
static ScriptEnvPool *pool = NULL;
|
static ScriptEnvPool *pool = NULL;
|
||||||
|
|
||||||
static ScriptEnv* getScriptEnvFromPool();
|
static ScriptEnv* getScriptEnvFromPool();
|
||||||
|
@ -444,3 +444,4 @@ bool isValidScript(char *script, int32_t len) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,124 @@
|
||||||
|
#include "tudf.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static char* getUdfFuncName(char* funcname, char* name, int type) {
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_UDF_FUNC_NORMAL:
|
||||||
|
strcpy(funcname, name);
|
||||||
|
break;
|
||||||
|
case TSDB_UDF_FUNC_INIT:
|
||||||
|
sprintf(funcname, "%s_init", name);
|
||||||
|
break;
|
||||||
|
case TSDB_UDF_FUNC_FINALIZE:
|
||||||
|
sprintf(funcname, "%s_finalize", name);
|
||||||
|
break;
|
||||||
|
case TSDB_UDF_FUNC_MERGE:
|
||||||
|
sprintf(funcname, "%s_merge", name);
|
||||||
|
break;
|
||||||
|
case TSDB_UDF_FUNC_DESTROY:
|
||||||
|
sprintf(funcname, "%s_destroy", name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return funcname;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t initUdfInfo(SUdfInfo* pUdfInfo) {
|
||||||
|
if (pUdfInfo == NULL) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
////qError("script len: %d", pUdfInfo->contLen);
|
||||||
|
if (isValidScript(pUdfInfo->content, pUdfInfo->contLen)) {
|
||||||
|
pUdfInfo->isScript = 1;
|
||||||
|
pUdfInfo->pScriptCtx = createScriptCtx(pUdfInfo->content, pUdfInfo->resType, pUdfInfo->resBytes);
|
||||||
|
if (pUdfInfo->pScriptCtx == NULL) {
|
||||||
|
return TSDB_CODE_QRY_SYS_ERROR;
|
||||||
|
}
|
||||||
|
tfree(pUdfInfo->content);
|
||||||
|
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_INIT] = taosLoadScriptInit;
|
||||||
|
if (pUdfInfo->funcs[TSDB_UDF_FUNC_INIT] == NULL
|
||||||
|
|| (*(scriptInitFunc)pUdfInfo->funcs[TSDB_UDF_FUNC_INIT])(pUdfInfo->pScriptCtx) != TSDB_CODE_SUCCESS) {
|
||||||
|
return TSDB_CODE_QRY_SYS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_NORMAL] = taosLoadScriptNormal;
|
||||||
|
|
||||||
|
if (pUdfInfo->funcType == TSDB_UDF_TYPE_AGGREGATE) {
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_FINALIZE] = taosLoadScriptFinalize;
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_MERGE] = taosLoadScriptMerge;
|
||||||
|
}
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_DESTROY] = taosLoadScriptDestroy;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
char path[PATH_MAX] = {0};
|
||||||
|
taosGetTmpfilePath("script", path);
|
||||||
|
|
||||||
|
FILE* file = fopen(path, "w+");
|
||||||
|
|
||||||
|
// TODO check for failure of flush to disk
|
||||||
|
/*size_t t = */ fwrite(pUdfInfo->content, pUdfInfo->contLen, 1, file);
|
||||||
|
fclose(file);
|
||||||
|
tfree(pUdfInfo->content);
|
||||||
|
|
||||||
|
pUdfInfo->path = strdup(path);
|
||||||
|
|
||||||
|
pUdfInfo->handle = taosLoadDll(path);
|
||||||
|
|
||||||
|
if (NULL == pUdfInfo->handle) {
|
||||||
|
return TSDB_CODE_QRY_SYS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
char funcname[TSDB_FUNCTIONS_NAME_MAX_LENGTH + 10] = {0};
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_NORMAL] = taosLoadSym(pUdfInfo->handle, getUdfFuncName(funcname, pUdfInfo->name, TSDB_UDF_FUNC_NORMAL));
|
||||||
|
if (NULL == pUdfInfo->funcs[TSDB_UDF_FUNC_NORMAL]) {
|
||||||
|
return TSDB_CODE_QRY_SYS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_INIT] = taosLoadSym(pUdfInfo->handle, getUdfFuncName(funcname, pUdfInfo->name, TSDB_UDF_FUNC_INIT));
|
||||||
|
|
||||||
|
if (pUdfInfo->funcType == TSDB_UDF_TYPE_AGGREGATE) {
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_FINALIZE] = taosLoadSym(pUdfInfo->handle, getUdfFuncName(funcname, pUdfInfo->name, TSDB_UDF_FUNC_FINALIZE));
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_MERGE] = taosLoadSym(pUdfInfo->handle, getUdfFuncName(funcname, pUdfInfo->name, TSDB_UDF_FUNC_MERGE));
|
||||||
|
}
|
||||||
|
|
||||||
|
pUdfInfo->funcs[TSDB_UDF_FUNC_DESTROY] = taosLoadSym(pUdfInfo->handle, getUdfFuncName(funcname, pUdfInfo->name, TSDB_UDF_FUNC_DESTROY));
|
||||||
|
|
||||||
|
if (pUdfInfo->funcs[TSDB_UDF_FUNC_INIT]) {
|
||||||
|
return (*(udfInitFunc)pUdfInfo->funcs[TSDB_UDF_FUNC_INIT])(&pUdfInfo->init);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyUdfInfo(SUdfInfo* pUdfInfo) {
|
||||||
|
if (pUdfInfo == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pUdfInfo->funcs[TSDB_UDF_FUNC_DESTROY]) {
|
||||||
|
if (pUdfInfo->isScript) {
|
||||||
|
(*(scriptDestroyFunc)pUdfInfo->funcs[TSDB_UDF_FUNC_DESTROY])(pUdfInfo->pScriptCtx);
|
||||||
|
tfree(pUdfInfo->content);
|
||||||
|
}else{
|
||||||
|
(*(udfDestroyFunc)pUdfInfo->funcs[TSDB_UDF_FUNC_DESTROY])(&pUdfInfo->init);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(pUdfInfo->name);
|
||||||
|
|
||||||
|
if (pUdfInfo->path) {
|
||||||
|
unlink(pUdfInfo->path);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(pUdfInfo->path);
|
||||||
|
tfree(pUdfInfo->content);
|
||||||
|
taosCloseDll(pUdfInfo->handle);
|
||||||
|
tfree(pUdfInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -47,13 +47,10 @@ int32_t parserValidateIdToken(SToken* pToken);
|
||||||
int32_t buildInvalidOperationMsg(SMsgBuf* pMsgBuf, const char* msg);
|
int32_t buildInvalidOperationMsg(SMsgBuf* pMsgBuf, const char* msg);
|
||||||
int32_t buildSyntaxErrMsg(char* dst, int32_t dstBufLen, const char* additionalInfo, const char* sourceStr);
|
int32_t buildSyntaxErrMsg(char* dst, int32_t dstBufLen, const char* additionalInfo, const char* sourceStr);
|
||||||
|
|
||||||
int32_t createProjectionExpr(SQueryStmtInfo* pQueryInfo, STableMetaInfo* pTableMetaInfo, SExprInfo*** pExpr, int32_t* num);
|
|
||||||
STableMetaInfo* addEmptyMetaInfo(SQueryStmtInfo* pQueryInfo);
|
STableMetaInfo* addEmptyMetaInfo(SQueryStmtInfo* pQueryInfo);
|
||||||
|
|
||||||
void columnListCopyAll(SArray* dst, const SArray* src);
|
void columnListCopyAll(SArray* dst, const SArray* src);
|
||||||
|
|
||||||
void columnListDestroy(SArray* pColumnList);
|
|
||||||
|
|
||||||
SColumn* columnListInsert(SArray* pColumnList, int32_t columnIndex, uint64_t uid, SSchema* pSchema);
|
SColumn* columnListInsert(SArray* pColumnList, int32_t columnIndex, uint64_t uid, SSchema* pSchema);
|
||||||
SColumn* insertPrimaryTsColumn(SArray* pColumnList, uint64_t tableUid);
|
SColumn* insertPrimaryTsColumn(SArray* pColumnList, uint64_t tableUid);
|
||||||
|
|
||||||
|
@ -61,6 +58,7 @@ void cleanupTagCond(STagCond* pTagCond);
|
||||||
void cleanupColumnCond(SArray** pCond);
|
void cleanupColumnCond(SArray** pCond);
|
||||||
|
|
||||||
uint32_t convertRelationalOperator(SToken *pToken);
|
uint32_t convertRelationalOperator(SToken *pToken);
|
||||||
|
int32_t getExprFunctionId(SExprInfo *pExprInfo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@ int32_t copyAllExprInfo(SArray* dst, const SArray* src, bool deepcopy);
|
||||||
|
|
||||||
void addExprInfoParam(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes);
|
void addExprInfoParam(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes);
|
||||||
|
|
||||||
int32_t getExprFunctionId(SExprInfo *pExprInfo);
|
|
||||||
void cleanupFieldInfo(SFieldInfo* pFieldInfo);
|
void cleanupFieldInfo(SFieldInfo* pFieldInfo);
|
||||||
|
|
||||||
STableComInfo getTableInfo(const STableMeta* pTableMeta);
|
STableComInfo getTableInfo(const STableMeta* pTableMeta);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "parserUtil.h"
|
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "ttypes.h"
|
#include "ttypes.h"
|
||||||
|
@ -1482,82 +1481,6 @@ int32_t getNumOfOutput(SFieldInfo* pFieldInfo) {
|
||||||
return pFieldInfo->numOfOutput;
|
return pFieldInfo->numOfOutput;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo move to planner module
|
|
||||||
int32_t createProjectionExpr(SQueryStmtInfo* pQueryInfo, STableMetaInfo* pTableMetaInfo, SExprInfo*** pExpr, int32_t* num) {
|
|
||||||
// if (!pQueryInfo->arithmeticOnAgg) {
|
|
||||||
// return TSDB_CODE_SUCCESS;
|
|
||||||
// }
|
|
||||||
#if 0
|
|
||||||
*num = getNumOfOutput(pQueryInfo);
|
|
||||||
*pExpr = calloc(*(num), POINTER_BYTES);
|
|
||||||
if ((*pExpr) == NULL) {
|
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < (*num); ++i) {
|
|
||||||
SInternalField* pField = getInternalFieldInfo(&pQueryInfo->fieldsInfo, i);
|
|
||||||
SExprInfo* pSource = pField->pExpr;
|
|
||||||
|
|
||||||
SExprInfo* px = calloc(1, sizeof(SExprInfo));
|
|
||||||
(*pExpr)[i] = px;
|
|
||||||
|
|
||||||
SSqlExpr *pse = &px->base;
|
|
||||||
pse->uid = pTableMetaInfo->pTableMeta->uid;
|
|
||||||
memcpy(&pse->resSchema, &pSource->base.resSchema, sizeof(SSchema));
|
|
||||||
|
|
||||||
if (pSource->base.functionId != FUNCTION_ARITHM) { // this should be switched to projection query
|
|
||||||
pse->numOfParams = 0; // no params for projection query
|
|
||||||
pse->functionId = FUNCTION_PRJ;
|
|
||||||
pse->colInfo.colId = pSource->base.resSchema.colId;
|
|
||||||
|
|
||||||
int32_t numOfOutput = (int32_t) taosArrayGetSize(pQueryInfo->exprList);
|
|
||||||
for (int32_t j = 0; j < numOfOutput; ++j) {
|
|
||||||
SExprInfo* p = taosArrayGetP(pQueryInfo->exprList, j);
|
|
||||||
if (p->base.resSchema.colId == pse->colInfo.colId) {
|
|
||||||
pse->colInfo.colIndex = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pse->colInfo.flag = TSDB_COL_NORMAL;
|
|
||||||
strncpy(pse->colInfo.name, pSource->base.resSchema.name, tListLen(pse->colInfo.name));
|
|
||||||
|
|
||||||
// TODO restore refactor
|
|
||||||
int32_t functionId = pSource->base.functionId;
|
|
||||||
if (pSource->base.functionId == FUNCTION_FIRST_DST) {
|
|
||||||
functionId = FUNCTION_FIRST;
|
|
||||||
} else if (pSource->base.functionId == FUNCTION_LAST_DST) {
|
|
||||||
functionId = FUNCTION_LAST;
|
|
||||||
} else if (pSource->base.functionId == FUNCTION_STDDEV_DST) {
|
|
||||||
functionId = FUNCTION_STDDEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t inter = 0;
|
|
||||||
getResultDataInfo(pSource->base.colType, pSource->base.colBytes, functionId, 0, &pse->resSchema.type,
|
|
||||||
&pse->resSchema.bytes, &inter, 0, false/*, NULL*/);
|
|
||||||
pse->colType = pse->resSchema.type;
|
|
||||||
pse->colBytes = pse->resSchema.bytes;
|
|
||||||
|
|
||||||
} else { // arithmetic expression
|
|
||||||
pse->colInfo.colId = pSource->base.colInfo.colId;
|
|
||||||
pse->colType = pSource->base.colType;
|
|
||||||
pse->colBytes = pSource->base.colBytes;
|
|
||||||
pse->resSchema.bytes = sizeof(double);
|
|
||||||
pse->resSchema.type = TSDB_DATA_TYPE_DOUBLE;
|
|
||||||
|
|
||||||
pse->functionId = pSource->base.functionId;
|
|
||||||
pse->numOfParams = pSource->base.numOfParams;
|
|
||||||
|
|
||||||
for (int32_t j = 0; j < pSource->base.numOfParams; ++j) {
|
|
||||||
taosVariantAssign(&pse->param[j], &pSource->base.param[j]);
|
|
||||||
// buildArithmeticExprFromMsg(px, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getColFilterSerializeLen(SQueryStmtInfo* pQueryInfo) {
|
int32_t getColFilterSerializeLen(SQueryStmtInfo* pQueryInfo) {
|
||||||
int16_t numOfCols = (int16_t)taosArrayGetSize(pQueryInfo->colList);
|
int16_t numOfCols = (int16_t)taosArrayGetSize(pQueryInfo->colList);
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
|
|
@ -41,7 +41,7 @@ typedef struct SQueryPlanNode {
|
||||||
SSchema *pSchema; // the schema of the input SSDatablock
|
SSchema *pSchema; // the schema of the input SSDatablock
|
||||||
int32_t numOfCols; // number of input columns
|
int32_t numOfCols; // number of input columns
|
||||||
SArray *pExpr; // the query functions or sql aggregations
|
SArray *pExpr; // the query functions or sql aggregations
|
||||||
int32_t numOfOutput; // number of result columns, which is also the number of pExprs
|
int32_t numOfExpr; // number of result columns, which is also the number of pExprs
|
||||||
void *pExtInfo; // additional information
|
void *pExtInfo; // additional information
|
||||||
// previous operator to generated result for current node to process
|
// previous operator to generated result for current node to process
|
||||||
// in case of join, multiple prev nodes exist.
|
// in case of join, multiple prev nodes exist.
|
||||||
|
@ -50,6 +50,7 @@ typedef struct SQueryPlanNode {
|
||||||
} SQueryPlanNode;
|
} SQueryPlanNode;
|
||||||
|
|
||||||
typedef struct SQueryDistPlanNode {
|
typedef struct SQueryDistPlanNode {
|
||||||
|
SQueryNodeBasicInfo info;
|
||||||
|
|
||||||
} SQueryDistPlanNode;
|
} SQueryDistPlanNode;
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ static SQueryPlanNode* createQueryNode(int32_t type, const char* name, SQueryPla
|
||||||
pNode->tableInfo.tableName = strdup(pTableInfo->tableName);
|
pNode->tableInfo.tableName = strdup(pTableInfo->tableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
pNode->numOfOutput = numOfOutput;
|
pNode->numOfExpr = numOfOutput;
|
||||||
pNode->pExpr = taosArrayInit(numOfOutput, POINTER_BYTES);
|
pNode->pExpr = taosArrayInit(numOfOutput, POINTER_BYTES);
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfOutput; ++i) {
|
for(int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
|
@ -234,8 +234,8 @@ static SQueryPlanNode* doCreateQueryPlanForOneTableImpl(SQueryStmtInfo* pQueryIn
|
||||||
if (pQueryInfo->fillType != TSDB_FILL_NONE) {
|
if (pQueryInfo->fillType != TSDB_FILL_NONE) {
|
||||||
SFillEssInfo* pInfo = calloc(1, sizeof(SFillEssInfo));
|
SFillEssInfo* pInfo = calloc(1, sizeof(SFillEssInfo));
|
||||||
pInfo->fillType = pQueryInfo->fillType;
|
pInfo->fillType = pQueryInfo->fillType;
|
||||||
pInfo->val = calloc(pNode->numOfOutput, sizeof(int64_t));
|
pInfo->val = calloc(pNode->numOfExpr, sizeof(int64_t));
|
||||||
memcpy(pInfo->val, pQueryInfo->fillVal, pNode->numOfOutput);
|
memcpy(pInfo->val, pQueryInfo->fillVal, pNode->numOfExpr);
|
||||||
|
|
||||||
pNode = createQueryNode(QNODE_FILL, "Fill", &pNode, 1, NULL, 0, info, pInfo);
|
pNode = createQueryNode(QNODE_FILL, "Fill", &pNode, 1, NULL, 0, info, pInfo);
|
||||||
}
|
}
|
||||||
|
@ -375,14 +375,14 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
len1 = sprintf(buf + len, "cols: ");
|
len1 = sprintf(buf + len, "cols: ");
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
||||||
|
|
||||||
SSqlExpr* p = &pExprInfo->base;
|
SSqlExpr* p = &pExprInfo->base;
|
||||||
len1 = sprintf(buf + len, "[%s #%d]", p->resSchema.name, p->resSchema.colId);
|
len1 = sprintf(buf + len, "[%s #%d]", p->resSchema.name, p->resSchema.colId);
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len, ", ");
|
len1 = sprintf(buf + len, ", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
@ -398,12 +398,12 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
}
|
}
|
||||||
|
|
||||||
case QNODE_AGGREGATE: {
|
case QNODE_AGGREGATE: {
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
||||||
|
|
||||||
SSqlExpr* pExpr = &pExprInfo->base;
|
SSqlExpr* pExpr = &pExprInfo->base;
|
||||||
len += sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
len += sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len, ", ");
|
len1 = sprintf(buf + len, ", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
@ -415,12 +415,12 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
}
|
}
|
||||||
|
|
||||||
case QNODE_TIMEWINDOW: {
|
case QNODE_TIMEWINDOW: {
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
||||||
|
|
||||||
SSqlExpr* pExpr = &pExprInfo->base;
|
SSqlExpr* pExpr = &pExprInfo->base;
|
||||||
len += sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
len += sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len,", ");
|
len1 = sprintf(buf + len,", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
@ -441,14 +441,14 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
}
|
}
|
||||||
|
|
||||||
case QNODE_GROUPBY: { // todo hide the invisible column
|
case QNODE_GROUPBY: { // todo hide the invisible column
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
||||||
|
|
||||||
SSqlExpr* pExpr = &pExprInfo->base;
|
SSqlExpr* pExpr = &pExprInfo->base;
|
||||||
len1 = sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
len1 = sprintf(buf + len,"%s [%s #%d]", pExpr->token, pExpr->resSchema.name, pExpr->resSchema.colId);
|
||||||
|
|
||||||
len += len1;
|
len += len1;
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len,", ");
|
len1 = sprintf(buf + len,", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
@ -473,11 +473,11 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
// todo get the correct fill data type
|
// todo get the correct fill data type
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
len1 = sprintf(buf + len,"%"PRId64, pEssInfo->val[i]);
|
len1 = sprintf(buf + len,"%"PRId64, pEssInfo->val[i]);
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len,", ");
|
len1 = sprintf(buf + len,", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
@ -501,14 +501,14 @@ static int32_t doPrintPlan(char* buf, SQueryPlanNode* pQueryNode, int32_t level,
|
||||||
len1 = sprintf(buf + len,"cols: ");
|
len1 = sprintf(buf + len,"cols: ");
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
for(int32_t i = 0; i < pQueryNode->numOfOutput; ++i) {
|
for(int32_t i = 0; i < pQueryNode->numOfExpr; ++i) {
|
||||||
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
SExprInfo* pExprInfo = taosArrayGetP(pQueryNode->pExpr, i);
|
||||||
SSchema* resSchema = &pExprInfo->base.resSchema;
|
SSchema* resSchema = &pExprInfo->base.resSchema;
|
||||||
|
|
||||||
len1 = sprintf(buf + len,"[%s #%d]", resSchema->name, resSchema->colId);
|
len1 = sprintf(buf + len,"[%s #%d]", resSchema->name, resSchema->colId);
|
||||||
len += len1;
|
len += len1;
|
||||||
|
|
||||||
if (i < pQueryNode->numOfOutput - 1) {
|
if (i < pQueryNode->numOfExpr - 1) {
|
||||||
len1 = sprintf(buf + len,", ");
|
len1 = sprintf(buf + len,", ");
|
||||||
len += len1;
|
len += len1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,9 +23,7 @@
|
||||||
#include <qSqlparser.h>
|
#include <qSqlparser.h>
|
||||||
#include "../../../include/client/taos.h"
|
#include "../../../include/client/taos.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qFilter.h"
|
|
||||||
#include "qPlan.h"
|
#include "qPlan.h"
|
||||||
#include "qScript.h"
|
|
||||||
#include "qSqlparser.h"
|
#include "qSqlparser.h"
|
||||||
#include "qTableMeta.h"
|
#include "qTableMeta.h"
|
||||||
#include "qUtil.h"
|
#include "qUtil.h"
|
||||||
|
@ -33,10 +31,12 @@
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "texpr.h"
|
#include "texpr.h"
|
||||||
|
#include "tfilter.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "tscLog.h"
|
#include "tscLog.h"
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
#include "tsclient.h"
|
#include "tsclient.h"
|
||||||
|
#include "tscript.h"
|
||||||
#include "tstrbuild.h"
|
#include "tstrbuild.h"
|
||||||
#include "ttoken.h"
|
#include "ttoken.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
|
|
|
@ -15,17 +15,17 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
|
#include "tconfig.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "tnote.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "tnote.h"
|
|
||||||
#include "ttimer.h"
|
|
||||||
#include "tsched.h"
|
|
||||||
#include "tscLog.h"
|
#include "tscLog.h"
|
||||||
|
#include "tsched.h"
|
||||||
#include "tsclient.h"
|
#include "tsclient.h"
|
||||||
#include "tglobal.h"
|
#include "tscript.h"
|
||||||
#include "tconfig.h"
|
#include "ttimer.h"
|
||||||
#include "ttimezone.h"
|
#include "ttimezone.h"
|
||||||
#include "qScript.h"
|
|
||||||
|
|
||||||
// global, not configurable
|
// global, not configurable
|
||||||
#define TSC_VAR_NOT_RELEASE 1
|
#define TSC_VAR_NOT_RELEASE 1
|
||||||
|
|
|
@ -258,7 +258,7 @@ bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const cha
|
||||||
(_r)->initialized = false; \
|
(_r)->initialized = false; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, int32_t bufLen) {
|
static FORCE_INLINE void initResultRowEntry(SResultRowCellInfo *pResInfo, int32_t bufLen) {
|
||||||
pResInfo->initialized = true; // the this struct has been initialized flag
|
pResInfo->initialized = true; // the this struct has been initialized flag
|
||||||
|
|
||||||
pResInfo->complete = false;
|
pResInfo->complete = false;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef TDENGINE_QTABLEUTIL_H
|
#ifndef TDENGINE_QTABLEUTIL_H
|
||||||
#define TDENGINE_QTABLEUTIL_H
|
#define TDENGINE_QTABLEUTIL_H
|
||||||
|
|
||||||
#include "tsdb.h" //todo tsdb should not be here
|
|
||||||
#include "qSqlparser.h"
|
#include "qSqlparser.h"
|
||||||
#include "qFilter.h"
|
#include "tfilter.h"
|
||||||
|
#include "tsdb.h" //todo tsdb should not be here
|
||||||
|
|
||||||
typedef struct SFieldInfo {
|
typedef struct SFieldInfo {
|
||||||
int16_t numOfOutput; // number of column in result
|
int16_t numOfOutput; // number of column in result
|
||||||
|
|
|
@ -425,7 +425,7 @@ static bool function_setup(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(pCtx->pOutput, 0, (size_t)pCtx->outputBytes);
|
memset(pCtx->pOutput, 0, (size_t)pCtx->outputBytes);
|
||||||
initResultInfo(pResultInfo, pCtx->interBufBytes);
|
initResultRowEntry(pResultInfo, pCtx->interBufBytes);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "qExecutor.h"
|
#include "qExecutor.h"
|
||||||
#include "qResultbuf.h"
|
#include "qResultbuf.h"
|
||||||
#include "qScript.h"
|
|
||||||
#include "qUtil.h"
|
#include "qUtil.h"
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
#include "texpr.h"
|
#include "texpr.h"
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
#include "tscLog.h"
|
#include "tscLog.h"
|
||||||
|
#include "tscript.h"
|
||||||
#include "ttype.h"
|
#include "ttype.h"
|
||||||
|
|
||||||
#define IS_MASTER_SCAN(runtime) ((runtime)->scanFlag == MASTER_SCAN)
|
#define IS_MASTER_SCAN(runtime) ((runtime)->scanFlag == MASTER_SCAN)
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
* 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 "hash.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "qFilter.h"
|
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "hash.h"
|
#include "tfilter.h"
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
|
|
||||||
OptrStr gOptrStr[] = {
|
OptrStr gOptrStr[] = {
|
||||||
|
|
Loading…
Reference in New Issue