qAggMain.h 10.5 KB
Newer Older
H
hzcheng 已提交
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/>.
 */

H
Haojun Liao 已提交
16 17
#ifndef TDENGINE_QAGGMAIN_H
#define TDENGINE_QAGGMAIN_H
H
hzcheng 已提交
18 19 20 21 22

#ifdef __cplusplus
extern "C" {
#endif

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

H
Haojun Liao 已提交
25
#include "tname.h"
26
#include "texpr.h"
H
hzcheng 已提交
27
#include "taosdef.h"
28
#include "trpc.h"
29
#include "tvariant.h"
H
Haojun Liao 已提交
30
#include "tsdb.h"
D
dapan1121 已提交
31
#include "qUdf.h"
H
hzcheng 已提交
32

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 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
#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
#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

#define TSDB_FUNC_TS              16
#define TSDB_FUNC_TS_DUMMY        17
#define TSDB_FUNC_TAG_DUMMY       18
#define TSDB_FUNC_TS_COMP         19

#define TSDB_FUNC_TAG             20
#define TSDB_FUNC_PRJ             21

#define TSDB_FUNC_TAGPRJ          22
#define TSDB_FUNC_SCALAR_EXPR     23
#define TSDB_FUNC_DIFF            24

#define TSDB_FUNC_FIRST_DST       25
#define TSDB_FUNC_LAST_DST        26
#define TSDB_FUNC_STDDEV_DST      27
#define TSDB_FUNC_INTERP          28

#define TSDB_FUNC_RATE            29
#define TSDB_FUNC_IRATE           30
#define TSDB_FUNC_TID_TAG         31
#define TSDB_FUNC_DERIVATIVE      32

#define TSDB_FUNC_CSUM            33
#define TSDB_FUNC_MAVG            34
#define TSDB_FUNC_SAMPLE          35

#define TSDB_FUNC_BLKINFO         36

#define TSDB_FUNC_ELAPSED         37
#define TSDB_FUNC_HISTOGRAM       38
#define TSDB_FUNC_UNIQUE          39
#define TSDB_FUNC_MODE            40
#define TSDB_FUNC_TAIL            41
#define TSDB_FUNC_STATE_COUNT     42
#define TSDB_FUNC_STATE_DURATION  43
#define TSDB_FUNC_WSTART          44
#define TSDB_FUNC_WSTOP           45
#define TSDB_FUNC_WDURATION       46
89 90 91
#define TSDB_FUNC_QSTART          47
#define TSDB_FUNC_QSTOP           48
#define TSDB_FUNC_QDURATION       49
92

93
#define TSDB_FUNC_MAX_NUM         50
94 95 96 97

#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
H
Haojun Liao 已提交
98
#define TSDB_FUNCSTATE_STABLE       0x8u    // function avail for super table
99 100 101 102 103 104
#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 已提交
105

S
slguan 已提交
106
#define TSDB_FUNCTIONS_NAME_MAX_LENGTH 16
H
hzcheng 已提交
107 108 109
#define TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE 50

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

112
#define QUERY_ASC_FORWARD_STEP   1
H
hzcheng 已提交
113
#define QUERY_DESC_FORWARD_STEP -1
S
slguan 已提交
114

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

H
Haojun Liao 已提交
117
#define MAX_INTERVAL_TIME_WINDOW 1000000  // maximum allowed time windows in final results
118
#define TOP_BOTTOM_QUERY_LIMIT   100
S
slguan 已提交
119

A
AlexDuan 已提交
120 121 122 123
// apercentile(arg1,agr2,arg3) param arg3 value is below:
#define ALGO_DEFAULT 0
#define ALGO_TDIGEST 1

H
hzcheng 已提交
124
enum {
H
Haojun Liao 已提交
125 126 127 128
  MASTER_SCAN   = 0x0u,
  REVERSE_SCAN  = 0x1u,
  REPEAT_SCAN   = 0x2u,  //repeat scan belongs to the master scan
  MERGE_STAGE   = 0x20u,
H
hzcheng 已提交
129 130
};

H
hjxilinx 已提交
131 132
#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 已提交
133
#define QUERY_IS_PROJECTION_QUERY(type)  (((type)&TSDB_QUERY_TYPE_PROJECTION_QUERY) != 0)
H
hjxilinx 已提交
134
#define QUERY_IS_FREE_RESOURCE(type)     (((type)&TSDB_QUERY_TYPE_FREE_RESOURCE) != 0)
S
slguan 已提交
135

S
shenglian zhou 已提交
136
typedef struct SScalarExprSupport {
H
Haojun Liao 已提交
137
  SExprInfo   *pExprInfo;
H
hjxilinx 已提交
138 139
  int32_t      numOfCols;
  SColumnInfo *colList;
H
Haojun Liao 已提交
140
  void        *exprList;   // client side used
H
hjxilinx 已提交
141 142
  int32_t      offset;
  char**       data;
S
shenglian zhou 已提交
143
} SScalarExprSupport;
H
hzcheng 已提交
144 145

typedef struct SQLPreAggVal {
H
Haojun Liao 已提交
146 147
  bool        isSet;             // statistics info set or not
  bool        dataBlockLoaded;   // data block is loaded or not
148
  SDataStatis statis;
H
hzcheng 已提交
149 150
} SQLPreAggVal;

S
slguan 已提交
151 152 153 154 155 156
typedef struct SInterpInfoDetail {
  TSKEY  ts;  // interp specified timestamp
  int8_t type;
  int8_t primaryCol;
} SInterpInfoDetail;

H
Haojun Liao 已提交
157
typedef struct SResultRowCellInfo {
158
  int8_t   hasResult;       // result generated, not NULL value
H
Haojun Liao 已提交
159 160
  bool     initialized;     // output buffer has been initialized
  bool     complete;        // query has completed
wmmhello's avatar
wmmhello 已提交
161
  int32_t  numOfRes;        // num of output result in current buffer
H
Haojun Liao 已提交
162 163
} SResultRowCellInfo;

164 165
typedef struct SPoint1 {
  int64_t key;
166
  union{double  val; char* ptr;};
167 168
} SPoint1;

H
Haojun Liao 已提交
169
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowCellInfo)))
S
slguan 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182

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 已提交
183
typedef struct SQLFunctionCtx {
184
  int32_t      size;      // number of rows
H
Haojun Liao 已提交
185
  void *       pInput;    // input data buffer
186 187
  uint32_t     order;     // asc|desc
  int16_t      inputType;
wmmhello's avatar
wmmhello 已提交
188
  int32_t      inputBytes;
189

190
  int16_t      outputType;
191
  int32_t      outputBytes;   // size of results, determined by function and input column data type
H
Haojun Liao 已提交
192 193
  int32_t      interBufBytes; // internal buffer size
  bool         hasNull;       // null value exist in current block
194
  bool         requireNull;   // require null in some function
H
Haojun Liao 已提交
195
  bool         stableQuery;
196 197 198 199
  int16_t      functionId;    // function id
  char *       pOutput;       // final result output buffer, point to sdata->data
  uint8_t      currentStage;  // record current running step, default: 0
  int64_t      startTs;       // timestamp range of current query when function is executed on a specific data block
D
dapan1121 已提交
200
  int64_t      endTs;
201
  int32_t      numOfParams;
H
Haojun Liao 已提交
202
  tVariant     param[4];      // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
203 204
  int64_t     *ptsList;       // corresponding timestamp array list
  void        *ptsOutputBuf;  // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
H
hzcheng 已提交
205
  SQLPreAggVal preAggVals;
S
slguan 已提交
206
  tVariant     tag;
H
Haojun Liao 已提交
207 208

  SResultRowCellInfo *resultInfo;
S
slguan 已提交
209

wmmhello's avatar
wmmhello 已提交
210
  int16_t      colId;         // used for user-specified constant value
S
slguan 已提交
211
  SExtTagsInfo tagInfo;
212 213
  SPoint1      start;
  SPoint1      end;
wmmhello's avatar
wmmhello 已提交
214

wmmhello's avatar
wmmhello 已提交
215
  SHashObj     **pUniqueSet;   // for unique function
wmmhello's avatar
wmmhello 已提交
216
  SHashObj     **pModeSet;     // for mode function
217
  STimeWindow  qWindow;        // for _qstart/_qstop/_qduration column
H
hzcheng 已提交
218 219
} SQLFunctionCtx;

220 221 222
typedef struct SAggFunctionInfo {
  char     name[TSDB_FUNCTIONS_NAME_MAX_LENGTH];
  uint8_t  index;       // index of function in aAggs
S
slguan 已提交
223
  int8_t   stableFuncId;  // transfer function for super table query
224
  uint16_t status;
H
hzcheng 已提交
225

H
Haojun Liao 已提交
226
  bool (*init)(SQLFunctionCtx *pCtx, SResultRowCellInfo* pResultCellInfo);  // setup the execute environment
S
slguan 已提交
227
  void (*xFunction)(SQLFunctionCtx *pCtx);                     // blocks version function
H
hzcheng 已提交
228

H
Haojun Liao 已提交
229
  // finalizer must be called after all xFunction has been executed to generated final result.
H
hzcheng 已提交
230
  void (*xFinalize)(SQLFunctionCtx *pCtx);
H
Haojun Liao 已提交
231
  void (*mergeFunc)(SQLFunctionCtx *pCtx);
H
hzcheng 已提交
232

H
Haojun Liao 已提交
233
  int32_t (*dataReqFunc)(SQLFunctionCtx *pCtx, STimeWindow* w, int32_t colId);
234
} SAggFunctionInfo;
H
hzcheng 已提交
235

S
slguan 已提交
236 237 238
#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,
239
                          int32_t *len, int32_t *interBytes, int16_t extLength, bool isSuperTable, SUdfInfo* pUdfInfo);
240
int16_t getTimeWindowFunctionID(int16_t colIndex);
H
hzcheng 已提交
241

242
bool isTimeWindowFunction(int32_t functionId);
H
Haojun Liao 已提交
243
int32_t isValidFunction(const char* name, int32_t len);
wmmhello's avatar
wmmhello 已提交
244
bool isValidStateOper(char *oper, int32_t len);
H
hzcheng 已提交
245

246

S
slguan 已提交
247 248 249 250
#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 已提交
251

H
Haojun Liao 已提交
252
// determine the real data need to calculated the result
H
hzcheng 已提交
253
enum {
H
Haojun Liao 已提交
254
  BLK_DATA_NO_NEEDED     = 0x0,
H
Haojun Liao 已提交
255
  BLK_DATA_STATIS_NEEDED = 0x1,
H
Haojun Liao 已提交
256 257
  BLK_DATA_ALL_NEEDED    = 0x3,
  BLK_DATA_DISCARD       = 0x4,   // discard current data block since it is not qualified for filter
H
hzcheng 已提交
258 259
};

S
slguan 已提交
260
typedef struct STwaInfo {
261 262
  int8_t      hasResult;  // flag to denote has value
  double      dOutput;
263
  SPoint1     p;
264
  STimeWindow win;
S
slguan 已提交
265
} STwaInfo;
H
hzcheng 已提交
266

H
Haojun Liao 已提交
267 268 269 270
struct SBufferWriter;
void blockDistInfoToBinary(STableBlockDist* pDist, struct SBufferWriter* bw);
void blockDistInfoFromBinary(const char* data, int32_t len, STableBlockDist* pDist);

H
hzcheng 已提交
271
/* global sql function array */
wmmhello's avatar
wmmhello 已提交
272
extern struct SAggFunctionInfo aAggs[TSDB_FUNC_MAX_NUM];
H
hzcheng 已提交
273

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

H
Haojun Liao 已提交
276
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const char *maxval);
H
hjxilinx 已提交
277

278 279 280 281 282 283 284 285 286
/**
 * the numOfRes should be kept, since it may be used later
 * and allow the ResultInfo to be re initialized
 */
#define RESET_RESULT_INFO(_r)  \
  do {                         \
    (_r)->initialized = false; \
  } while (0)

287
static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, int32_t bufLen) {
H
Haojun Liao 已提交
288
  pResInfo->initialized = true;  // the this struct has been initialized flag
289

H
Haojun Liao 已提交
290
  pResInfo->complete  = false;
H
Haojun Liao 已提交
291
  pResInfo->hasResult = false;
H
Haojun Liao 已提交
292
  pResInfo->numOfRes  = 0;
293

294
  memset(GET_ROWCELL_INTERBUF(pResInfo), 0, bufLen);
H
Haojun Liao 已提交
295 296
}

H
hzcheng 已提交
297 298 299 300
#ifdef __cplusplus
}
#endif

H
Haojun Liao 已提交
301
#endif  // TDENGINE_QAGGMAIN_H