function.h 11.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

16 17
#ifndef TDENGINE_FUNCTION_H
#define TDENGINE_FUNCTION_H
18 19 20 21 22

#ifdef __cplusplus
extern "C" {
#endif

H
Haojun Liao 已提交
23
#include "tbuffer.h"
S
common  
Shengliang Guan 已提交
24
#include "tcommon.h"
H
Haojun Liao 已提交
25
#include "tvariant.h"
H
Haojun Liao 已提交
26 27 28 29

struct SqlFunctionCtx;
struct SResultRowEntryInfo;

30 31
struct SFunctionNode;
typedef struct SScalarParam SScalarParam;
H
Haojun Liao 已提交
32 33 34 35 36

typedef struct SFuncExecEnv {
  int32_t calcMemSize;
} SFuncExecEnv;

37
typedef bool (*FExecGetEnv)(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
H
Haojun Liao 已提交
38 39 40
typedef bool (*FExecInit)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);
typedef void (*FExecProcess)(struct SqlFunctionCtx *pCtx);
typedef void (*FExecFinalize)(struct SqlFunctionCtx *pCtx);
41 42 43
typedef int32_t (*FScalarExecProcess)(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);

typedef struct SScalarFuncExecFuncs {
44
  FExecGetEnv getEnv;
45 46
  FScalarExecProcess process;
} SScalarFuncExecFuncs;
H
Haojun Liao 已提交
47 48 49 50 51 52 53

typedef struct SFuncExecFuncs {
  FExecGetEnv getEnv;
  FExecInit init;
  FExecProcess process;
  FExecFinalize finalize;
} SFuncExecFuncs;
54

55 56
#define MAX_INTERVAL_TIME_WINDOW 1000000  // maximum allowed time windows in final results

H
Haojun Liao 已提交
57 58
#define FUNCTION_TYPE_SCALAR       1
#define FUNCTION_TYPE_AGG          2
59

60
#define TOP_BOTTOM_QUERY_LIMIT    100
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
#define FUNCTIONS_NAME_MAX_LENGTH 16

#define FUNCTION_INVALID_ID  -1
#define FUNCTION_COUNT        0
#define FUNCTION_SUM          1
#define FUNCTION_AVG          2
#define FUNCTION_MIN          3
#define FUNCTION_MAX          4
#define FUNCTION_STDDEV       5
#define FUNCTION_PERCT        6
#define FUNCTION_APERCT       7
#define FUNCTION_FIRST        8
#define FUNCTION_LAST         9
#define FUNCTION_LAST_ROW     10
#define FUNCTION_TOP          11
#define FUNCTION_BOTTOM       12
#define FUNCTION_SPREAD       13
#define FUNCTION_TWA          14
#define FUNCTION_LEASTSQR     15

#define FUNCTION_TS           16
#define FUNCTION_TS_DUMMY     17
#define FUNCTION_TAG_DUMMY    18
#define FUNCTION_TS_COMP      19

#define FUNCTION_TAG          20
#define FUNCTION_PRJ          21

#define FUNCTION_TAGPRJ       22
#define FUNCTION_ARITHM       23
#define FUNCTION_DIFF         24

#define FUNCTION_FIRST_DST    25
#define FUNCTION_LAST_DST     26
#define FUNCTION_STDDEV_DST   27
#define FUNCTION_INTERP       28

#define FUNCTION_RATE         29
#define FUNCTION_IRATE        30
#define FUNCTION_TID_TAG      31
#define FUNCTION_DERIVATIVE   32
#define FUNCTION_BLKINFO      33

#define FUNCTION_HISTOGRAM    34
#define FUNCTION_HLL          35
#define FUNCTION_MODE         36
#define FUNCTION_SAMPLE       37

109 110
#define FUNCTION_COV          38

H
Haojun Liao 已提交
111 112 113 114 115 116 117
typedef struct SResultRowEntryInfo {
  int8_t   hasResult;       // result generated, not NULL value
  bool     initialized;     // output buffer has been initialized
  bool     complete;        // query has completed
  uint32_t numOfRes;        // num of output result in current buffer
} SResultRowEntryInfo;

118 119 120 121 122 123 124 125 126
// 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 {
H
Haojun Liao 已提交
127
  MAIN_SCAN     = 0x0u,
128 129 130 131 132
  REVERSE_SCAN  = 0x1u,
  REPEAT_SCAN   = 0x2u,  //repeat scan belongs to the master scan
  MERGE_STAGE   = 0x20u,
};

133 134 135 136 137
typedef struct SPoint1 {
  int64_t   key;
  union{double  val; char* ptr;};
} SPoint1;

H
Haojun Liao 已提交
138
struct SqlFunctionCtx;
139
struct SResultRowEntryInfo;
140 141

//for selectivity query, the corresponding tag value is assigned if the data is qualified
142 143 144 145 146
typedef struct SSubsidiaryResInfo {
  int16_t                 bufLen;      // keep the tags data for top/bottom query result
  int16_t                 numOfCols;
  struct SqlFunctionCtx **pCtx;
} SSubsidiaryResInfo;
147

H
Haojun Liao 已提交
148
typedef struct SResultDataInfo {
H
Haojun Liao 已提交
149 150
  int16_t precision;
  int16_t scale;
H
Haojun Liao 已提交
151 152
  int16_t type;
  int16_t bytes;
H
Haojun Liao 已提交
153
  int32_t interBufSize;
H
Haojun Liao 已提交
154 155
} SResultDataInfo;

156 157
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)

H
Haojun Liao 已提交
158 159 160 161 162 163 164 165 166 167
typedef struct SInputColumnInfoData {
  int32_t           totalRows;      // total rows in current columnar data
  int32_t           startRowIndex;  // handle started row index
  int32_t           numOfRows;      // the number of rows needs to be handled
  int32_t           numOfInputCols; // PTS is not included
  bool              colDataAggIsSet;// if agg is set or not
  SColumnInfoData  *pPTS;           // primary timestamp column
  SColumnInfoData **pData;
  SColumnDataAgg  **pColumnDataAgg;
} SInputColumnInfoData;
H
Haojun Liao 已提交
168

169
// sql function runtime context
H
Haojun Liao 已提交
170
typedef struct SqlFunctionCtx {
H
Haojun Liao 已提交
171 172
  SInputColumnInfoData input;
  SResultDataInfo      resDataInfo;
H
Haojun Liao 已提交
173
  uint32_t             order;  // data block scanner order: asc|desc
H
Haojun Liao 已提交
174 175 176
  ////////////////////////////////////////////////////////////////
  int32_t          startRow;   // start row index
  int32_t          size;       // handled processed row number
177
  SColumnInfoData* pInput;
H
Haojun Liao 已提交
178 179 180 181 182 183 184 185
  SColumnDataAgg   agg;
  int16_t          inputType;    // TODO remove it
  int16_t          inputBytes;   // TODO remove it
  bool             hasNull;      // null value exist in current block, TODO remove it
  bool             requireNull;  // require null in some function, TODO remove it
  int32_t          columnIndex;  // TODO remove it
  uint8_t          currentStage;  // record current running step, default: 0
  bool             isAggSet;
186
  int64_t          startTs;       // timestamp range of current query when function is executed on a specific data block, TODO remove it
H
Haojun Liao 已提交
187 188 189 190 191 192 193 194 195
  /////////////////////////////////////////////////////////////////
  bool             stableQuery;
  int16_t          functionId;    // function id
  char *           pOutput;       // final result output buffer, point to sdata->data
  int32_t          numOfParams;
  SVariant         param[4];      // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
  int64_t         *ptsList;       // corresponding timestamp array list
  void            *ptsOutputBuf;  // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
  SVariant         tag;
196
  struct  SResultRowEntryInfo *resultInfo;
197
  SSubsidiaryResInfo     subsidiaryRes;
H
Haojun Liao 已提交
198 199 200
  SPoint1          start;
  SPoint1          end;
  SFuncExecFuncs   fpSet;
201
  SScalarFuncExecFuncs sfp;
H
Haojun Liao 已提交
202
} SqlFunctionCtx;
203

204 205 206 207
enum {
  TEXPR_NODE_DUMMY     = 0x0,
  TEXPR_BINARYEXPR_NODE= 0x1,
  TEXPR_UNARYEXPR_NODE = 0x2,
208
  TEXPR_FUNCTION_NODE  = 0x3,
209 210 211 212 213
  TEXPR_COL_NODE       = 0x4,
  TEXPR_VALUE_NODE     = 0x8,
};

typedef struct tExprNode {
H
Haojun Liao 已提交
214
  int32_t nodeType;
215 216
  union {
    struct {
217
      int32_t           optr;   // binary operator
218 219 220 221 222 223 224
      void             *info;   // support filter operation on this expression only available for leaf node
      struct tExprNode *pLeft;  // left child pointer
      struct tExprNode *pRight; // right child pointer
    } _node;

    SSchema            *pSchema;// column node
    struct SVariant    *pVal;   // value node
225 226

    struct {// function node
H
Haojun Liao 已提交
227 228
      char              functionName[FUNCTIONS_NAME_MAX_LENGTH];  // todo refactor
      int32_t           functionId;
229
      int32_t           num;
230
      struct SFunctionNode    *pFunctNode;
231 232 233 234 235 236 237
      // Note that the attribute of pChild is not the parameter of function, it is the columns that involved in the
      // calculation instead.
      // E.g., Cov(col1, col2), the column information, w.r.t. the col1 and col2, is kept in pChild nodes.
      //  The concat function, concat(col1, col2), is a binary scalar
      //  operator and is kept in the attribute of _node.
      struct tExprNode **pChild;
    } _function;
238 239 240 241

    struct {
      struct SNode* pRootNode;
    } _optrRoot;
242 243 244 245 246
  };
} tExprNode;

void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *));

247
typedef struct SAggFunctionInfo {
248 249 250 251 252
  char      name[FUNCTIONS_NAME_MAX_LENGTH];
  int8_t    type;         // Scalar function or aggregation function
  uint32_t  functionId;   // Function Id
  int8_t    sFunctionId;  // Transfer function for super table query
  uint16_t  status;
253

H
Haojun Liao 已提交
254 255
  bool (*init)(SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);  // setup the execute environment
  void (*addInput)(SqlFunctionCtx *pCtx);
256 257

  // finalizer must be called after all exec has been executed to generated final result.
H
Haojun Liao 已提交
258 259
  void (*finalize)(SqlFunctionCtx *pCtx);
  void (*combine)(SqlFunctionCtx *pCtx);
260

H
Haojun Liao 已提交
261
  int32_t (*dataReqFunc)(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t colId);
262 263
} SAggFunctionInfo;

264
struct SScalarParam {
265 266 267
  SColumnInfoData   *columnData;
  SHashObj          *pHashFilter;
  int32_t            numOfRows;
268
};
269

270 271
int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, SResultDataInfo* pInfo, int16_t extLength,
                          bool isSuperTable);
272

273 274
bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* functionId);

275 276
tExprNode* exprTreeFromBinary(const void* data, size_t size);

H
Haojun Liao 已提交
277 278
tExprNode* exprdup(tExprNode* pTree);

H
Haojun Liao 已提交
279
void resetResultRowEntryResult(SqlFunctionCtx* pCtx, int32_t num);
280
void cleanupResultRowEntry(struct SResultRowEntryInfo* pCell);
H
Haojun Liao 已提交
281
int32_t getNumOfResult(SqlFunctionCtx* pCtx, int32_t num, SSDataBlock* pResBlock);
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
bool isRowEntryCompleted(struct SResultRowEntryInfo* pEntry);
bool isRowEntryInitialized(struct SResultRowEntryInfo* pEntry);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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,
H
Haojun Liao 已提交
303
                              struct SFillColInfo* pFillCol, const char* id);
304 305 306 307 308 309 310

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);

H
Haojun Liao 已提交
311 312 313 314 315 316 317
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// udf api
struct SUdfInfo;

void qAddUdfInfo(uint64_t id, struct SUdfInfo* pUdfInfo);
void qRemoveUdfInfo(uint64_t id, struct SUdfInfo* pUdfInfo);

318 319 320 321
#ifdef __cplusplus
}
#endif

322
#endif  // TDENGINE_FUNCTION_H