tsclient.h 16.6 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_TSCLIENT_H
#define TDENGINE_TSCLIENT_H

#ifdef __cplusplus
extern "C" {
#endif

S
slguan 已提交
23
#include "os.h"
24

H
hzcheng 已提交
25
#include "taos.h"
26
#include "taosdef.h"
H
hzcheng 已提交
27
#include "taosmsg.h"
H
hjxilinx 已提交
28
#include "tarray.h"
S
slguan 已提交
29
#include "tglobal.h"
30
#include "tsqlfunction.h"
H
hjxilinx 已提交
31
#include "tutil.h"
H
Haojun Liao 已提交
32
#include "tcache.h"
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
33
#include "tref.h"
H
hjxilinx 已提交
34

H
Haojun Liao 已提交
35
#include "qExecutor.h"
36
#include "qSqlparser.h"
H
Haojun Liao 已提交
37
#include "qTsbuf.h"
H
Haojun Liao 已提交
38
#include "tcmdtype.h"
H
hzcheng 已提交
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
#if 0
static UNUSED_FUNC void *u_malloc (size_t __size) {
  uint32_t v = rand();

  if (v % 5000 <= 0) {
    return NULL;
  } else {
    return malloc(__size);
  }
}

static UNUSED_FUNC void* u_calloc(size_t num, size_t __size) {
  uint32_t v = rand();
  if (v % 5000 <= 0) {
    return NULL;
  } else {
    return calloc(num, __size);
  }
}

static UNUSED_FUNC void* u_realloc(void* p, size_t __size) {
  uint32_t v = rand();
  if (v % 5000 <= 0) {
    return NULL;
  } else {
    return realloc(p, __size);
  }
}

#define calloc  u_calloc
#define malloc  u_malloc
#define realloc u_realloc
#endif

H
hzcheng 已提交
74 75
// forward declaration
struct SSqlInfo;
H
hjxilinx 已提交
76 77 78 79 80 81 82
struct SLocalReducer;

// data source from sql string or from file
enum {
  DATA_FROM_SQL_STRING = 1,
  DATA_FROM_DATA_FILE = 2,
};
H
hzcheng 已提交
83

H
Haojun Liao 已提交
84 85
typedef void (*__async_cb_func_t)(void *param, TAOS_RES *tres, int32_t numOfRows);

H
hjxilinx 已提交
86
typedef struct STableComInfo {
H
hjxilinx 已提交
87 88 89
  uint8_t numOfTags;
  uint8_t precision;
  int16_t numOfColumns;
B
Bomin Zhang 已提交
90
  int32_t rowSize;
H
hjxilinx 已提交
91
} STableComInfo;
H
hjxilinx 已提交
92

S
Shengliang Guan 已提交
93 94 95 96 97 98
typedef struct SCorVgroupInfo {
  int32_t  version;
  int8_t   inUse;
  int8_t   numOfEps;
  SEpAddr1 epAddr[TSDB_MAX_REPLICA];
} SCorVgroupInfo;
dengyihao's avatar
bugfix  
dengyihao 已提交
99

H
hjxilinx 已提交
100
typedef struct STableMeta {
101 102 103 104
  STableComInfo  tableInfo;
  uint8_t        tableType;
  int16_t        sversion;
  int16_t        tversion;
105
  char           sTableId[TSDB_TABLE_FNAME_LEN];
S
TD-1732  
Shengliang Guan 已提交
106
  SVgroupInfo    vgroupInfo;
S
Shengliang Guan 已提交
107
  SCorVgroupInfo corVgroupInfo;
108 109
  STableId       id;
  SSchema        schema[];  // if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
H
hjxilinx 已提交
110 111 112
} STableMeta;

typedef struct STableMetaInfo {
H
Haojun Liao 已提交
113
  STableMeta   *pTableMeta;      // table meta, cached in client side and acquired by name
H
hjxilinx 已提交
114
  SVgroupsInfo *vgroupList;
115 116
  SArray       *pVgroupTables;   // SArray<SVgroupTableInfo>
  
H
hjxilinx 已提交
117
  /*
H
hjxilinx 已提交
118 119
   * 1. keep the vgroup index during the multi-vnode super table projection query
   * 2. keep the vgroup index for multi-vnode insertion
H
hjxilinx 已提交
120
   */
H
hjxilinx 已提交
121
  int32_t vgroupIndex;
H
Haojun Liao 已提交
122 123 124
  char    name[TSDB_TABLE_FNAME_LEN];        // (super) table name
  char    aliasName[TSDB_TABLE_NAME_LEN];    // alias name of table specified in query sql
  SArray* tagColList;                        // SArray<SColumn*>, involved tag columns
H
hjxilinx 已提交
125
} STableMetaInfo;
H
hzcheng 已提交
126

S
slguan 已提交
127 128
/* the structure for sql function in select clause */
typedef struct SSqlExpr {
H
hjxilinx 已提交
129 130
  char      aliasName[TSDB_COL_NAME_LEN];  // as aliasName
  SColIndex colInfo;
H
Haojun Liao 已提交
131
  uint64_t  uid;            // refactor use the pointer
H
hjxilinx 已提交
132 133 134
  int16_t   functionId;     // function id in aAgg array
  int16_t   resType;        // return value type
  int16_t   resBytes;       // length of return value
H
Haojun Liao 已提交
135
  int32_t   interBytes;     // inter result buffer size
H
hjxilinx 已提交
136 137 138
  int16_t   numOfParams;    // argument value of each function
  tVariant  param[3];       // parameters are not more than 3
  int32_t   offset;         // sub result column value of arithmetic expression.
H
Haojun Liao 已提交
139
  int16_t   resColId;       // result column id
H
hzcheng 已提交
140 141
} SSqlExpr;

H
hjxilinx 已提交
142 143 144 145 146
typedef struct SColumnIndex {
  int16_t tableIndex;
  int16_t columnIndex;
} SColumnIndex;

H
Haojun Liao 已提交
147 148
typedef struct SInternalField {
  TAOS_FIELD      field;
H
hjxilinx 已提交
149
  bool            visible;
H
hjxilinx 已提交
150
  SExprInfo      *pArithExprInfo;
H
Haojun Liao 已提交
151
  SSqlExpr       *pSqlExpr;
H
Haojun Liao 已提交
152
} SInternalField;
S
slguan 已提交
153

H
hjxilinx 已提交
154
typedef struct SFieldInfo {
H
Haojun Liao 已提交
155 156 157
  int16_t      numOfOutput;   // number of column in result
  TAOS_FIELD*  final;
  SArray      *internalField; // SArray<SInternalField>
H
hzcheng 已提交
158 159
} SFieldInfo;

160
typedef struct SColumn {
S
slguan 已提交
161 162 163
  SColumnIndex       colIndex;
  int32_t            numOfFilters;
  SColumnFilterInfo *filterInfo;
164
} SColumn;
H
hzcheng 已提交
165

S
slguan 已提交
166 167
typedef struct SCond {
  uint64_t uid;
H
hjxilinx 已提交
168
  int32_t  len;  // length of tag query condition data
H
hjxilinx 已提交
169
  char *   cond;
S
slguan 已提交
170 171 172
} SCond;

typedef struct SJoinNode {
H
Haojun Liao 已提交
173
  char     tableId[TSDB_TABLE_FNAME_LEN];
S
slguan 已提交
174
  uint64_t uid;
H
Haojun Liao 已提交
175
  int16_t  tagColId;
S
slguan 已提交
176 177 178 179 180 181 182 183
} SJoinNode;

typedef struct SJoinInfo {
  bool      hasJoin;
  SJoinNode left;
  SJoinNode right;
} SJoinInfo;

H
hzcheng 已提交
184
typedef struct STagCond {
S
slguan 已提交
185 186 187 188 189 190 191 192 193 194
  // relation between tbname list and query condition, including : TK_AND or TK_OR
  int16_t relType;

  // tbname query condition, only support tbname query condition on one table
  SCond tbnameCond;

  // join condition, only support two tables join currently
  SJoinInfo joinInfo;

  // for different table, the query condition must be seperated
H
hjxilinx 已提交
195
  SArray *pCond;
H
hzcheng 已提交
196 197
} STagCond;

S
slguan 已提交
198
typedef struct SParamInfo {
H
hjxilinx 已提交
199 200 201
  int32_t  idx;
  char     type;
  uint8_t  timePrec;
202
  int16_t  bytes;
S
slguan 已提交
203 204 205
  uint32_t offset;
} SParamInfo;

S
slguan 已提交
206
typedef struct STableDataBlocks {
H
Haojun Liao 已提交
207
  char     tableId[TSDB_TABLE_FNAME_LEN];
H
Haojun Liao 已提交
208 209 210 211 212 213
  int8_t   tsSource;     // where does the UNIX timestamp come from, server or client
  bool     ordered;      // if current rows are ordered or not
  int64_t  vgId;         // virtual group id
  int64_t  prevTS;       // previous timestamp, recorded to decide if the records array is ts ascending
  int32_t  numOfTables;  // number of tables in current submit block
  int32_t  rowSize;      // row size for current table
S
slguan 已提交
214
  uint32_t nAllocSize;
H
Haojun Liao 已提交
215
  uint32_t headerSize;   // header for table info (uid, tid, submit metadata)
S
slguan 已提交
216
  uint32_t size;
217

H
hjxilinx 已提交
218
  /*
H
Haojun Liao 已提交
219
   * the table meta of table, the table meta will be used during submit, keep a ref
H
hjxilinx 已提交
220 221
   * to avoid it to be removed from cache
   */
H
hjxilinx 已提交
222
  STableMeta *pTableMeta;
H
Haojun Liao 已提交
223
  char       *pData;
S
slguan 已提交
224 225

  // for parameter ('?') binding
H
hjxilinx 已提交
226 227 228
  uint32_t    numOfAllocedParams;
  uint32_t    numOfParams;
  SParamInfo *params;
S
slguan 已提交
229
} STableDataBlocks;
H
hzcheng 已提交
230

231
typedef struct SQueryInfo {
H
Haojun Liao 已提交
232
  int16_t          command;       // the command may be different for each subclause, so keep it seperately.
233
  uint32_t         type;          // query/insert type
H
Haojun Liao 已提交
234

235
  STimeWindow      window;        // query time window
236
  SInterval        interval;
237

238
  SSqlGroupbyExpr  groupbyExpr;   // group by tags info
H
Haojun Liao 已提交
239
  SArray *         colList;       // SArray<SColumn*>
240
  SFieldInfo       fieldsInfo;
H
Haojun Liao 已提交
241
  SArray *         exprList;      // SArray<SSqlExpr*>
242 243 244 245
  SLimitVal        limit;
  SLimitVal        slimit;
  STagCond         tagCond;
  SOrderVal        order;
H
Haojun Liao 已提交
246
  int16_t          fillType;      // final result fill type
247
  int16_t          numOfTables;
H
hjxilinx 已提交
248
  STableMetaInfo **pTableMetaInfo;
H
Haojun Liao 已提交
249
  struct STSBuf   *tsBuf;
H
Haojun Liao 已提交
250 251 252
  int64_t *        fillVal;       // default value for fill
  char *           msg;           // pointer to the pCmd->payload to keep error message temporarily
  int64_t          clauseLimit;   // limit for current sub clause
H
Haojun Liao 已提交
253

H
Haojun Liao 已提交
254
  int64_t          prjOffset;     // offset value in the original sql expression, only applied at client side
H
Haojun Liao 已提交
255
  int64_t          vgroupLimit;    // table limit in case of super table projection query + global order + limit
H
Haojun Liao 已提交
256

257
  int32_t          udColumnId;    // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
H
Haojun Liao 已提交
258
  int16_t          resColumnId;   // result column id
259 260
} SQueryInfo;

H
hzcheng 已提交
261
typedef struct {
262 263
  int     command;
  uint8_t msgType;
264
  bool    autoCreated;        // create table if it is not existed during retrieve table meta in mnode
H
hjxilinx 已提交
265

266 267 268 269
  union {
    int32_t count;
    int32_t numOfTablesInSubmit;
  };
H
hzcheng 已提交
270

271
  int32_t      insertType;
B
Bomin Zhang 已提交
272
  int32_t      clauseIndex;  // index of multiple subclause query
273 274

  char *       curSql;       // current sql, resume position of sql after parsing paused
275
  int8_t       parseFinished;
276

277
  int16_t      numOfCols;
278 279 280
  uint32_t     allocSize;
  char *       payload;
  int32_t      payloadLen;
281 282
  SQueryInfo **pQueryInfo;
  int32_t      numOfClause;
283 284
  int32_t      batchSize;    // for parameter ('?') binding and batch processing
  int32_t      numOfParams;
285 286

  int8_t       dataSourceType;     // load data from file or not
B
Bomin Zhang 已提交
287
  int8_t       submitSchema; // submit block is built with table schema
288
  STagData    *pTagData;     // NOTE: pTagData->data is used as a variant length array
289
  SHashObj    *pTableList;   // referred table involved in sql
290
  SArray      *pDataBlocks;  // SArray<STableDataBlocks*> submit data blocks after parsing sql
H
hzcheng 已提交
291 292 293 294 295 296 297 298
} SSqlCmd;

typedef struct SResRec {
  int numOfRows;
  int numOfTotal;
} SResRec;

typedef struct {
H
Haojun Liao 已提交
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
  int32_t        numOfRows;                  // num of results in current retrieval
  int64_t        numOfRowsGroup;             // num of results of current group
  int64_t        numOfTotal;                 // num of total results
  int64_t        numOfClauseTotal;           // num of total result in current subclause
  char *         pRsp;
  int32_t        rspType;
  int32_t        rspLen;
  uint64_t       qhandle;
  int64_t        useconds;
  int64_t        offset;  // offset value from vnode during projection query of stable
  int32_t        row;
  int16_t        numOfCols;
  int16_t        precision;
  bool           completed;
  int32_t        code;
  int32_t        numOfGroups;
  SResRec *      pGroupRec;
  char *         data;
  TAOS_ROW       tsrow;
  TAOS_ROW       urow;
  int32_t*       length;  // length for each field for current row
  char **        buffer;  // Buffer used to put multibytes encoded using unicode (wchar_t)
  SColumnIndex*  pColumnIndex;

323
  SArithmeticSupport*   pArithSup;   // support the arithmetic expression calculation on agg functions
H
Haojun Liao 已提交
324
  struct SLocalReducer* pLocalReducer;
H
hzcheng 已提交
325 326
} SSqlRes;

H
hjxilinx 已提交
327
typedef struct STscObj {
H
hjxilinx 已提交
328 329 330 331
  void *             signature;
  void *             pTimer;
  char               user[TSDB_USER_LEN];
  char               pass[TSDB_KEY_LEN];
B
Bomin Zhang 已提交
332
  char               acctId[TSDB_ACCT_LEN];
B
Bomin Zhang 已提交
333
  char               db[TSDB_ACCT_LEN + TSDB_DB_NAME_LEN];
H
hjxilinx 已提交
334 335 336
  char               sversion[TSDB_VERSION_LEN];
  char               writeAuth : 1;
  char               superAuth : 1;
S
Shengliang Guan 已提交
337
  uint32_t           connId;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
338
  uint64_t           rid;      // ref ID returned by taosAddRef
339
  int64_t            hbrid;
H
hjxilinx 已提交
340
  struct SSqlObj *   sqlList;
H
hjxilinx 已提交
341
  struct SSqlStream *streamList;
dengyihao's avatar
TD-2257  
dengyihao 已提交
342
  SRpcCorEpSet       *tscCorMgmtEpSet;
343
  void*              pDnodeConn;
H
hjxilinx 已提交
344
  pthread_mutex_t    mutex;
S
Shengliang Guan 已提交
345
  T_REF_DECLARE()
H
hzcheng 已提交
346 347
} STscObj;

H
Haojun Liao 已提交
348
typedef struct SSubqueryState {
349 350 351
  int32_t  numOfRemain;         // the number of remain unfinished subquery
  int32_t  numOfSub;            // the number of total sub-queries
  uint64_t numOfRetrievedRows;  // total number of points in this query
H
Haojun Liao 已提交
352 353
} SSubqueryState;

354
typedef struct SSqlObj {
355
  void            *signature;
356
  pthread_t        owner;        // owner of sql object, by which it is executed
357
  STscObj         *pTscObj;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
358
  int64_t          rpcRid;
359 360 361
  void            (*fp)();
  void            (*fetchFp)();
  void            *param;
H
hjxilinx 已提交
362 363 364 365 366
  int64_t          stime;
  uint32_t         queryId;
  void *           pStream;
  void *           pSubscription;
  char *           sqlstr;
367
  char             parseRetry;
H
hjxilinx 已提交
368 369
  char             retry;
  char             maxRetry;
370
  SRpcEpSet        epSet;
H
Haojun Liao 已提交
371
  char             listed;
H
hjxilinx 已提交
372 373 374
  tsem_t           rspSem;
  SSqlCmd          cmd;
  SSqlRes          res;
H
Haojun Liao 已提交
375 376

  SSubqueryState   subState;
377
  struct SSqlObj **pSubs;
H
Haojun Liao 已提交
378

H
Haojun Liao 已提交
379
  struct SSqlObj  *prev, *next;
380
  int64_t          self;
H
hzcheng 已提交
381 382
} SSqlObj;

H
hjxilinx 已提交
383
typedef struct SSqlStream {
H
hzcheng 已提交
384 385 386
  SSqlObj *pSql;
  uint32_t streamId;
  char     listed;
387 388
  bool     isProject;
  int16_t  precision;
H
hzcheng 已提交
389 390 391
  int64_t  num;  // number of computing count

  /*
S
slguan 已提交
392
   * keep the number of current result in computing,
H
hzcheng 已提交
393 394 395 396 397 398 399
   * the value will be set to 0 before set timer for next computing
   */
  int64_t numOfRes;

  int64_t useconds;  // total  elapsed time
  int64_t ctime;     // stream created time
  int64_t stime;     // stream next executed time
S
slguan 已提交
400
  int64_t etime;     // stream end query time, when time is larger then etime, the stream will be closed
B
Bomin Zhang 已提交
401
  SInterval interval;
H
hzcheng 已提交
402 403 404 405 406
  void *  pTimer;

  void (*fp)();
  void *param;

S
slguan 已提交
407
  void (*callback)(void *);  // Callback function when stream is stopped from client level
H
hjxilinx 已提交
408
  struct SSqlStream *prev, *next;
H
hzcheng 已提交
409 410
} SSqlStream;

411
int32_t tscInitRpc(const char *user, const char *secret, void** pDnodeConn);
H
hjxilinx 已提交
412
void    tscInitMsgsFp();
S
slguan 已提交
413

H
Haojun Liao 已提交
414
int tsParseSql(SSqlObj *pSql, bool initial);
H
hzcheng 已提交
415

416
void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet);
S
slguan 已提交
417
int  tscProcessSql(SSqlObj *pSql);
H
hzcheng 已提交
418

B
Bomin Zhang 已提交
419
int  tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex);
H
hzcheng 已提交
420
void tscQueueAsyncRes(SSqlObj *pSql);
S
slguan 已提交
421

H
[td-99]  
hjxilinx 已提交
422
void tscQueueAsyncError(void(*fp), void *param, int32_t code);
H
hzcheng 已提交
423 424 425 426 427

int tscProcessLocalCmd(SSqlObj *pSql);
int tscCfgDynamicOptions(char *msg);
int taos_retrieve(TAOS_RES *res);

H
hjxilinx 已提交
428 429
int32_t tscTansformSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
void    tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
H
hzcheng 已提交
430

431
int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo);
432
void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo);
H
hzcheng 已提交
433

B
Bomin Zhang 已提交
434
void tscResetSqlCmdObj(SSqlCmd *pCmd, bool removeFromCache);
H
hzcheng 已提交
435

weixin_48148422's avatar
weixin_48148422 已提交
436 437 438 439
/**
 * free query result of the sql object
 * @param pObj
 */
H
hjxilinx 已提交
440
void tscFreeSqlResult(SSqlObj *pSql);
weixin_48148422's avatar
weixin_48148422 已提交
441

H
hzcheng 已提交
442 443
/**
 * free sql object, release allocated resource
H
Haojun Liao 已提交
444
 * @param pObj
H
hzcheng 已提交
445
 */
H
Haojun Liao 已提交
446
void tscFreeSqlObj(SSqlObj *pSql);
H
Haojun Liao 已提交
447
void tscFreeRegisteredSqlObj(void *pSql);
H
Haojun Liao 已提交
448
void tscFreeTableMetaHelper(void *pTableMeta);
H
hzcheng 已提交
449

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
450
void tscCloseTscObj(void *pObj);
H
hzcheng 已提交
451

H
Haojun Liao 已提交
452
// todo move to taos? or create a new file: taos_internal.h
H
hjxilinx 已提交
453
TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void (*fp)(void *, TAOS_RES *, int),
454
                     void *param, TAOS **taos);
H
Haojun Liao 已提交
455 456
TAOS_RES* taos_query_h(TAOS* taos, const char *sqlstr, TAOS_RES** res);
void waitForQueryRsp(void *param, TAOS_RES *tres, int code);
H
hjxilinx 已提交
457

H
Haojun Liao 已提交
458
void doAsyncQuery(STscObj *pObj, SSqlObj *pSql, __async_cb_func_t fp, void *param, const char *sqlstr, size_t sqlLen);
459

H
Haojun Liao 已提交
460
void tscProcessMultiVnodesImportFromFile(SSqlObj *pSql);
461
void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen);
H
Haojun Liao 已提交
462
bool tscIsUpdateQuery(SSqlObj* pSql);
463
bool tscHasReachLimitation(SQueryInfo *pQueryInfo, SSqlRes *pRes);
H
Haojun Liao 已提交
464

465
char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
466

H
hjxilinx 已提交
467
int32_t tscInvalidSQLErrMsg(char *msg, const char *additionalInfo, const char *sql);
Y
TD-934  
yihaoDeng 已提交
468
int32_t tscSQLSyntaxErrMsg(char* msg, const char* additionalInfo,  const char* sql);
H
hzcheng 已提交
469

H
hjxilinx 已提交
470
int32_t tscToSQLCmd(SSqlObj *pSql, struct SSqlInfo *pInfo);
H
Haojun Liao 已提交
471

H
Haojun Liao 已提交
472
static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex, int32_t offset) {
H
Haojun Liao 已提交
473
  SInternalField* pInfo = (SInternalField*) TARRAY_GET_ELEM(pFieldInfo->internalField, columnIndex);
H
Haojun Liao 已提交
474

H
Haojun Liao 已提交
475 476
  int32_t type = pInfo->field.type;
  int32_t bytes = pInfo->field.bytes;
H
Haojun Liao 已提交
477

H
Haojun Liao 已提交
478
  char* pData = pRes->data + (int32_t)(offset * pRes->numOfRows + bytes * pRes->row);
479
  UNUSED(pData);
H
Haojun Liao 已提交
480

481
//   user defined constant value output columns
H
Haojun Liao 已提交
482
  if (pInfo->pSqlExpr != NULL && TSDB_COL_IS_UD_COL(pInfo->pSqlExpr->colInfo.flag)) {
H
Haojun Liao 已提交
483 484 485
    if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
      pData = pInfo->pSqlExpr->param[1].pz;
      pRes->length[columnIndex] = pInfo->pSqlExpr->param[1].nLen;
486
      pRes->tsrow[columnIndex] = (pInfo->pSqlExpr->param[1].nType == TSDB_DATA_TYPE_NULL) ? NULL : (unsigned char*)pData;
H
Haojun Liao 已提交
487
    } else {
H
Haojun Liao 已提交
488
      assert(bytes == tDataTypeDesc[type].nSize);
H
Haojun Liao 已提交
489

490
      pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : (unsigned char*)&pInfo->pSqlExpr->param[1].i64Key;
H
Haojun Liao 已提交
491
      pRes->length[columnIndex] = bytes;
H
Haojun Liao 已提交
492 493
    }
  } else {
H
Haojun Liao 已提交
494 495 496 497
    if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
      int32_t realLen = varDataLen(pData);
      assert(realLen <= bytes - VARSTR_HEADER_SIZE);

498
      pRes->tsrow[columnIndex] = (isNull(pData, type)) ? NULL : (unsigned char*)((tstr *)pData)->data;
H
Haojun Liao 已提交
499 500 501
      if (realLen < pInfo->pSqlExpr->resBytes - VARSTR_HEADER_SIZE) {  // todo refactor
        *(pData + realLen + VARSTR_HEADER_SIZE) = 0;
      }
H
Haojun Liao 已提交
502

H
Haojun Liao 已提交
503
      pRes->length[columnIndex] = realLen;
H
Haojun Liao 已提交
504
    } else {
H
Haojun Liao 已提交
505
      assert(bytes == tDataTypeDesc[type].nSize);
H
Haojun Liao 已提交
506

507
      pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : (unsigned char*)pData;
H
Haojun Liao 已提交
508 509
      pRes->length[columnIndex] = bytes;
    }
H
Haojun Liao 已提交
510 511
  }
}
H
hjxilinx 已提交
512

H
Haojun Liao 已提交
513
extern SCacheObj*    tscMetaCache;
514
extern int           tscObjRef;
H
hjxilinx 已提交
515 516 517 518 519
extern void *    tscTmr;
extern void *    tscQhandle;
extern int       tscKeepConn[];
extern int       tsInsertHeadSize;
extern int       tscNumOfThreads;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
520
extern int       tscRefId;
521
  
H
hjxilinx 已提交
522 523

extern int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo);
H
hzcheng 已提交
524

H
Haojun Liao 已提交
525
void tscBuildVgroupTableInfo(SSqlObj* pSql, STableMetaInfo* pTableMetaInfo, SArray* tables);
H
Haojun Liao 已提交
526
int16_t getNewResColId(SQueryInfo* pQueryInfo);
weixin_48148422's avatar
weixin_48148422 已提交
527

H
hzcheng 已提交
528 529 530 531 532
#ifdef __cplusplus
}
#endif

#endif