tsqlfunction.h 9.4 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * 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_TSQLFUNCTION_H
#define TDENGINE_TSQLFUNCTION_H

#ifdef __cplusplus
extern "C" {
#endif

23
#include "os.h"
H
hzcheng 已提交
24

S
slguan 已提交
25
#include "../../common/inc/tname.h"
H
hzcheng 已提交
26
#include "taosdef.h"
27
#include "trpc.h"
28
#include "tvariant.h"
H
hzcheng 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41

#define TSDB_FUNC_INVALID_ID  -1
#define TSDB_FUNC_COUNT        0
#define TSDB_FUNC_SUM          1
#define TSDB_FUNC_AVG          2
#define TSDB_FUNC_MIN          3
#define TSDB_FUNC_MAX          4
#define TSDB_FUNC_STDDEV       5
#define TSDB_FUNC_PERCT        6
#define TSDB_FUNC_APERCT       7
#define TSDB_FUNC_FIRST        8
#define TSDB_FUNC_LAST         9
#define TSDB_FUNC_LAST_ROW     10
S
slguan 已提交
42 43 44 45 46 47
#define TSDB_FUNC_TOP          11
#define TSDB_FUNC_BOTTOM       12
#define TSDB_FUNC_SPREAD       13
#define TSDB_FUNC_TWA          14
#define TSDB_FUNC_LEASTSQR     15

H
hzcheng 已提交
48 49
#define TSDB_FUNC_TS           16
#define TSDB_FUNC_TS_DUMMY     17
S
slguan 已提交
50 51
#define TSDB_FUNC_TAG_DUMMY    18
#define TSDB_FUNC_TS_COMP      19
H
hzcheng 已提交
52

S
slguan 已提交
53 54
#define TSDB_FUNC_TAG          20
#define TSDB_FUNC_PRJ          21
H
hzcheng 已提交
55

S
slguan 已提交
56 57 58
#define TSDB_FUNC_TAGPRJ       22
#define TSDB_FUNC_ARITHM       23
#define TSDB_FUNC_DIFF         24
H
hzcheng 已提交
59

S
slguan 已提交
60 61 62
#define TSDB_FUNC_FIRST_DST    25
#define TSDB_FUNC_LAST_DST     26
#define TSDB_FUNC_INTERP       27
H
hzcheng 已提交
63

L
lihui 已提交
64 65 66 67 68 69 70
#define TSDB_FUNC_RATE         28
#define TSDB_FUNC_IRATE        29
#define TSDB_FUNC_SUM_RATE     30
#define TSDB_FUNC_SUM_IRATE    31
#define TSDB_FUNC_AVG_RATE     32
#define TSDB_FUNC_AVG_IRATE    33

71 72 73 74 75 76 77 78 79 80 81 82
#define TSDB_FUNC_TID_TAG      34

#define TSDB_FUNCSTATE_SO           0x1u    // single output
#define TSDB_FUNCSTATE_MO           0x2u    // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
#define TSDB_FUNCSTATE_STREAM       0x4u    // function avail for stream
#define TSDB_FUNCSTATE_STABLE       0x8u    // function avail for metric
#define TSDB_FUNCSTATE_OF           0x10u   // outer forward
#define TSDB_FUNCSTATE_NEED_TS      0x20u   // timestamp is required during query processing
#define TSDB_FUNCSTATE_SELECTIVITY  0x40u   // selectivity functions, can exists along with tag columns

#define TSDB_BASE_FUNC_SO TSDB_FUNCSTATE_SO | TSDB_FUNCSTATE_STREAM | TSDB_FUNCSTATE_STABLE | TSDB_FUNCSTATE_OF
#define TSDB_BASE_FUNC_MO TSDB_FUNCSTATE_MO | TSDB_FUNCSTATE_STREAM | TSDB_FUNCSTATE_STABLE | TSDB_FUNCSTATE_OF
H
hzcheng 已提交
83 84


S
slguan 已提交
85
#define TSDB_FUNCTIONS_NAME_MAX_LENGTH 16
H
hzcheng 已提交
86 87 88
#define TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE 50

#define DATA_SET_FLAG ','  // to denote the output area has data, not null value
S
slguan 已提交
89 90 91 92
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)

#define QUERY_COND_REL_PREFIX_IN "IN|"
#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
H
hzcheng 已提交
93

S
slguan 已提交
94 95 96 97
#define QUERY_COND_REL_PREFIX_IN_LEN 3
#define QUERY_COND_REL_PREFIX_LIKE_LEN 5

#define QUERY_ASC_FORWARD_STEP 1
H
hzcheng 已提交
98
#define QUERY_DESC_FORWARD_STEP -1
S
slguan 已提交
99

100
#define GET_FORWARD_DIRECTION_FACTOR(ord) (((ord) == TSDB_ORDER_ASC) ? QUERY_ASC_FORWARD_STEP : QUERY_DESC_FORWARD_STEP)
H
hzcheng 已提交
101

S
slguan 已提交
102 103 104
#define MAX_RETRIEVE_ROWS_IN_INTERVAL_QUERY 10000000
#define TOP_BOTTOM_QUERY_LIMIT 100

H
hzcheng 已提交
105
enum {
H
hjxilinx 已提交
106
  MASTER_SCAN           = 0x0u,
H
hjxilinx 已提交
107
  REVERSE_SCAN          = 0x1u,
H
hjxilinx 已提交
108 109 110
  REPEAT_SCAN           = 0x2u,  //repeat scan belongs to the master scan
  FIRST_STAGE_MERGE     = 0x10u,
  SECONDARY_STAGE_MERGE = 0x20u,
H
hzcheng 已提交
111 112
};

H
hjxilinx 已提交
113 114
#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))
H
Haojun Liao 已提交
115
#define QUERY_IS_PROJECTION_QUERY(type)  (((type)&TSDB_QUERY_TYPE_PROJECTION_QUERY) != 0)
H
hjxilinx 已提交
116
#define QUERY_IS_FREE_RESOURCE(type)     (((type)&TSDB_QUERY_TYPE_FREE_RESOURCE) != 0)
S
slguan 已提交
117 118

typedef struct SArithmeticSupport {
H
hjxilinx 已提交
119
  SExprInfo   *pArithExpr;
H
hjxilinx 已提交
120 121
  int32_t      numOfCols;
  SColumnInfo *colList;
122
  SArray*      exprList;   // client side used
H
hjxilinx 已提交
123 124
  int32_t      offset;
  char**       data;
H
hzcheng 已提交
125 126 127
} SArithmeticSupport;

typedef struct SQLPreAggVal {
H
Haojun Liao 已提交
128 129
  bool        isSet;             // statistics info set or not
  bool        dataBlockLoaded;   // data block is loaded or not
130
  SDataStatis statis;
H
hzcheng 已提交
131 132
} SQLPreAggVal;

S
slguan 已提交
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
typedef struct SInterpInfoDetail {
  TSKEY  ts;  // interp specified timestamp
  int8_t hasResult;
  int8_t type;
  int8_t primaryCol;
} SInterpInfoDetail;

typedef struct SInterpInfo { SInterpInfoDetail *pInterpDetail; } SInterpInfo;

typedef struct SResultInfo {
  int8_t  hasResult;       // result generated, not NULL value
  bool    initialized;     // output buffer has been initialized
  bool    complete;        // query has completed
  bool    superTableQ;     // is super table query
  int32_t numOfRes;        // num of output result in current buffer
  int32_t bufLen;          // buffer size
  void *  interResultBuf;  // output result buffer
} SResultInfo;

struct SQLFunctionCtx;

/**
 * for selectivity query, the corresponding tag value is assigned if the data is qualified
 */
typedef struct SExtTagsInfo {
  int16_t                 tagsLen;      // keep the tags data for top/bottom query result
  int16_t                 numOfTagCols;
  struct SQLFunctionCtx **pTagCtxList;
} SExtTagsInfo;

// sql function runtime context
H
hzcheng 已提交
164
typedef struct SQLFunctionCtx {
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
  int32_t      startOffset;
  int32_t      size;      // number of rows
  uint32_t     order;     // asc|desc
  int16_t      inputType;
  int16_t      inputBytes;
  
  int16_t      outputType;
  int16_t      outputBytes;  // size of results, determined by function and input column data type
  bool         hasNull;      // null value exist in current block
  int16_t      functionId;   // function id
  void *       aInputElemBuf;
  char *       aOutputBuf;            // final result output buffer, point to sdata->data
  uint8_t      currentStage;          // record current running step, default: 0
  int64_t      nStartQueryTimestamp;  // timestamp range of current query when function is executed on a specific data block
  int32_t      numOfParams;
  tVariant     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*/
H
hzcheng 已提交
183
  SQLPreAggVal preAggVals;
S
slguan 已提交
184 185 186 187
  tVariant     tag;
  SResultInfo *resultInfo;

  SExtTagsInfo tagInfo;
H
hzcheng 已提交
188 189 190
} SQLFunctionCtx;

typedef struct SQLAggFuncElem {
H
Haojun Liao 已提交
191
  char     aName[TSDB_FUNCTIONS_NAME_MAX_LENGTH];
H
hzcheng 已提交
192

S
slguan 已提交
193 194
  uint8_t  nAggIdx;       // index of function in aAggs
  int8_t   stableFuncId;  // transfer function for super table query
H
hzcheng 已提交
195 196
  uint16_t nStatus;

S
slguan 已提交
197
  bool (*init)(SQLFunctionCtx *pCtx);  // setup the execute environment
H
hzcheng 已提交
198

S
slguan 已提交
199 200
  void (*xFunction)(SQLFunctionCtx *pCtx);                     // blocks version function
  void (*xFunctionF)(SQLFunctionCtx *pCtx, int32_t position);  // single-row function version
H
hzcheng 已提交
201

S
slguan 已提交
202 203
  // some sql function require scan data twice or more, e.g.,stddev
  void (*xNextStep)(SQLFunctionCtx *pCtx);
H
hzcheng 已提交
204 205 206

  /*
   * finalizer must be called after all xFunction has been executed to
S
slguan 已提交
207
   * generated final result. Otherwise, the value in aOutputBuf is a intern result.
H
hzcheng 已提交
208 209 210 211 212 213 214
   */
  void (*xFinalize)(SQLFunctionCtx *pCtx);

  void (*distMergeFunc)(SQLFunctionCtx *pCtx);

  void (*distSecondaryMergeFunc)(SQLFunctionCtx *pCtx);

215
  int32_t (*dataReqFunc)(SQLFunctionCtx *pCtx, TSKEY start, TSKEY end, int32_t colId);
H
hzcheng 已提交
216 217
} SQLAggFuncElem;

S
slguan 已提交
218 219 220
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)

int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, int16_t *type,
221
                          int16_t *len, int32_t *interBytes, int16_t extLength, bool isSuperTable);
H
hzcheng 已提交
222

S
slguan 已提交
223 224 225 226
#define IS_STREAM_QUERY_VALID(x)  (((x)&TSDB_FUNCSTATE_STREAM) != 0)
#define IS_MULTIOUTPUT(x)         (((x)&TSDB_FUNCSTATE_MO) != 0)
#define IS_SINGLEOUTPUT(x)        (((x)&TSDB_FUNCSTATE_SO) != 0)
#define IS_OUTER_FORWARD(x)       (((x)&TSDB_FUNCSTATE_OF) != 0)
H
hzcheng 已提交
227 228 229

/* determine the real data need to calculated the result */
enum {
H
Haojun Liao 已提交
230
  BLK_DATA_NO_NEEDED     = 0x0,
H
Haojun Liao 已提交
231
  BLK_DATA_STATIS_NEEDED = 0x1,
H
Haojun Liao 已提交
232 233
  BLK_DATA_ALL_NEEDED    = 0x3,
  BLK_DATA_DISCARD       = 0x4,   // discard current data block since it is not qualified for filter
H
hzcheng 已提交
234 235
};

S
slguan 已提交
236 237 238 239 240 241
typedef struct STwaInfo {
  TSKEY   lastKey;
  int8_t  hasResult;  // flag to denote has value
  int16_t type;       // source data type
  TSKEY   SKey;
  TSKEY   EKey;
H
hzcheng 已提交
242 243 244 245 246 247 248 249 250 251

  union {
    double  dOutput;
    int64_t iOutput;
  };

  union {
    double  dLastValue;
    int64_t iLastValue;
  };
S
slguan 已提交
252
} STwaInfo;
H
hzcheng 已提交
253 254

/* global sql function array */
L
lihui 已提交
255
extern struct SQLAggFuncElem aAggs[];
H
hzcheng 已提交
256

H
Haojun Liao 已提交
257
extern int32_t functionCompatList[]; // compatible check array list
H
hzcheng 已提交
258

H
Haojun Liao 已提交
259
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, int32_t functionId, const char *minval, const char *maxval);
H
hjxilinx 已提交
260

S
slguan 已提交
261
void resetResultInfo(SResultInfo *pResInfo);
H
Haojun Liao 已提交
262
void setResultInfoBuf(SResultInfo *pResInfo, int32_t size, bool superTable, char* buf);
S
slguan 已提交
263

H
Haojun Liao 已提交
264 265 266 267 268 269 270 271 272 273
static FORCE_INLINE void initResultInfo(SResultInfo *pResInfo) {
  pResInfo->initialized = true;  // the this struct has been initialized flag
  
  pResInfo->complete = false;
  pResInfo->hasResult = false;
  pResInfo->numOfRes = 0;
  
  memset(pResInfo->interResultBuf, 0, (size_t)pResInfo->bufLen);
}

H
hzcheng 已提交
274 275 276 277 278
#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_TSQLFUNCTION_H