tsclient.h 16.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_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"
H
hjxilinx 已提交
33

H
Haojun Liao 已提交
34
#include "qExecutor.h"
35
#include "qSqlparser.h"
H
Haojun Liao 已提交
36
#include "qTsbuf.h"
H
Haojun Liao 已提交
37
#include "tcmdtype.h"
H
hzcheng 已提交
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
#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 已提交
73 74
// forward declaration
struct SSqlInfo;
H
hjxilinx 已提交
75 76 77 78 79 80 81
struct SLocalReducer;

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

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

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

dengyihao's avatar
bugfix  
dengyihao 已提交
92
typedef struct SCMCorVgroupInfo {
H
Haojun Liao 已提交
93 94 95 96
  int32_t    version;
  int8_t     inUse;
  int8_t     numOfEps;
  SEpAddr1   epAddr[TSDB_MAX_REPLICA];
dengyihao's avatar
bugfix  
dengyihao 已提交
97 98
} SCMCorVgroupInfo;

H
hjxilinx 已提交
99
typedef struct STableMeta {
100 101 102 103
  STableComInfo  tableInfo;
  uint8_t        tableType;
  int16_t        sversion;
  int16_t        tversion;
104
  char           sTableId[TSDB_TABLE_FNAME_LEN];
dengyihao's avatar
bugfix  
dengyihao 已提交
105 106
  SCMVgroupInfo  vgroupInfo;
  SCMCorVgroupInfo  corVgroupInfo;
107 108
  STableId       id;
  SSchema        schema[];  // if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
H
hjxilinx 已提交
109 110 111
} STableMeta;

typedef struct STableMetaInfo {
H
Haojun Liao 已提交
112
  STableMeta   *pTableMeta;      // table meta, cached in client side and acquired by name
H
hjxilinx 已提交
113
  SVgroupsInfo *vgroupList;
114 115
  SArray       *pVgroupTables;   // SArray<SVgroupTableInfo>
  
H
hjxilinx 已提交
116
  /*
H
hjxilinx 已提交
117 118
   * 1. keep the vgroup index during the multi-vnode super table projection query
   * 2. keep the vgroup index for multi-vnode insertion
H
hjxilinx 已提交
119
   */
H
hjxilinx 已提交
120
  int32_t vgroupIndex;
H
Haojun Liao 已提交
121 122 123
  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 已提交
124
} STableMetaInfo;
H
hzcheng 已提交
125

S
slguan 已提交
126 127
/* the structure for sql function in select clause */
typedef struct SSqlExpr {
H
hjxilinx 已提交
128 129 130 131 132 133
  char      aliasName[TSDB_COL_NAME_LEN];  // as aliasName
  SColIndex colInfo;
  int64_t   uid;            // refactor use the pointer
  int16_t   functionId;     // function id in aAgg array
  int16_t   resType;        // return value type
  int16_t   resBytes;       // length of return value
H
Haojun Liao 已提交
134
  int32_t   interBytes;     // inter result buffer size
H
hjxilinx 已提交
135 136 137
  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
hzcheng 已提交
138 139
} SSqlExpr;

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

H
hjxilinx 已提交
145 146
typedef struct SFieldSupInfo {
  bool            visible;
H
hjxilinx 已提交
147
  SExprInfo      *pArithExprInfo;
H
Haojun Liao 已提交
148
  SSqlExpr       *pSqlExpr;
H
hjxilinx 已提交
149
} SFieldSupInfo;
S
slguan 已提交
150

H
hjxilinx 已提交
151
typedef struct SFieldInfo {
H
hjxilinx 已提交
152 153 154
  int16_t numOfOutput;   // number of column in result
  SArray *pFields;       // SArray<TAOS_FIELD>
  SArray *pSupportInfo;  // SArray<SFieldSupInfo>
H
hzcheng 已提交
155 156
} SFieldInfo;

157
typedef struct SColumn {
S
slguan 已提交
158 159 160
  SColumnIndex       colIndex;
  int32_t            numOfFilters;
  SColumnFilterInfo *filterInfo;
161
} SColumn;
H
hzcheng 已提交
162

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

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

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

H
hzcheng 已提交
181
typedef struct STagCond {
S
slguan 已提交
182 183 184 185 186 187 188 189 190 191
  // 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 已提交
192
  SArray *pCond;
H
hzcheng 已提交
193 194
} STagCond;

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

S
slguan 已提交
203
typedef struct STableDataBlocks {
H
Haojun Liao 已提交
204
  char     tableId[TSDB_TABLE_FNAME_LEN];
H
Haojun Liao 已提交
205 206 207 208 209 210
  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 已提交
211
  uint32_t nAllocSize;
H
Haojun Liao 已提交
212
  uint32_t headerSize;   // header for table info (uid, tid, submit metadata)
S
slguan 已提交
213
  uint32_t size;
214

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

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

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

232
  STimeWindow      window;        // query time window
233
  SInterval        interval;
234

235
  SSqlGroupbyExpr  groupbyExpr;   // group by tags info
H
Haojun Liao 已提交
236
  SArray *         colList;       // SArray<SColumn*>
237
  SFieldInfo       fieldsInfo;
H
Haojun Liao 已提交
238
  SArray *         exprList;      // SArray<SSqlExpr*>
239 240 241 242
  SLimitVal        limit;
  SLimitVal        slimit;
  STagCond         tagCond;
  SOrderVal        order;
H
Haojun Liao 已提交
243
  int16_t          fillType;      // final result fill type
244
  int16_t          numOfTables;
H
hjxilinx 已提交
245
  STableMetaInfo **pTableMetaInfo;
246
  struct STSBuf *  tsBuf;
H
Haojun Liao 已提交
247 248 249 250
  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
  int64_t          prjOffset;     // offset value in the original sql expression, only applied at client side
251
  int32_t          udColumnId;    // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
252 253
} SQueryInfo;

H
hzcheng 已提交
254
typedef struct {
255 256
  int     command;
  uint8_t msgType;
257
  bool    autoCreated;        // create table if it is not existed during retrieve table meta in mnode
H
hjxilinx 已提交
258

259 260 261 262
  union {
    int32_t count;
    int32_t numOfTablesInSubmit;
  };
H
hzcheng 已提交
263

264
  int32_t      insertType;
B
Bomin Zhang 已提交
265
  int32_t      clauseIndex;  // index of multiple subclause query
266 267

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

270
  int16_t      numOfCols;
271 272 273
  uint32_t     allocSize;
  char *       payload;
  int32_t      payloadLen;
274 275
  SQueryInfo **pQueryInfo;
  int32_t      numOfClause;
276 277
  int32_t      batchSize;    // for parameter ('?') binding and batch processing
  int32_t      numOfParams;
278 279

  int8_t       dataSourceType;     // load data from file or not
B
Bomin Zhang 已提交
280 281
  int8_t       submitSchema; // submit block is built with table schema
  STagData     tagData;
282
  SHashObj    *pTableList;   // referred table involved in sql
283
  SArray      *pDataBlocks;  // SArray<STableDataBlocks*> submit data blocks after parsing sql
H
hzcheng 已提交
284 285 286 287 288 289 290 291
} SSqlCmd;

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

typedef struct {
H
hjxilinx 已提交
292
  int64_t               numOfRows;                  // num of results in current retrieved
H
Haojun Liao 已提交
293
  int64_t               numOfRowsGroup;             // num of results of current group
H
hjxilinx 已提交
294
  int64_t               numOfTotal;                 // num of total results
H
Haojun Liao 已提交
295
  int64_t               numOfClauseTotal;           // num of total result in current subclause
H
hjxilinx 已提交
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
  char *                pRsp;
  int32_t               rspType;
  int32_t               rspLen;
  uint64_t              qhandle;
  int64_t               uid;
  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;
  void **               tsrow;
312
  int32_t*              length;  // length for each field for current row
H
hjxilinx 已提交
313 314
  char **               buffer;  // Buffer used to put multibytes encoded using unicode (wchar_t)
  SColumnIndex *        pColumnIndex;
315 316
  SArithmeticSupport*   pArithSup;   // support the arithmetic expression calculation on agg functions
  
H
hzcheng 已提交
317 318 319
  struct SLocalReducer *pLocalReducer;
} SSqlRes;

H
hjxilinx 已提交
320
typedef struct STscObj {
H
hjxilinx 已提交
321 322 323 324
  void *             signature;
  void *             pTimer;
  char               user[TSDB_USER_LEN];
  char               pass[TSDB_KEY_LEN];
B
Bomin Zhang 已提交
325
  char               acctId[TSDB_ACCT_LEN];
B
Bomin Zhang 已提交
326
  char               db[TSDB_ACCT_LEN + TSDB_DB_NAME_LEN];
H
hjxilinx 已提交
327 328 329
  char               sversion[TSDB_VERSION_LEN];
  char               writeAuth : 1;
  char               superAuth : 1;
S
Shengliang Guan 已提交
330
  uint32_t           connId;
H
hjxilinx 已提交
331 332
  struct SSqlObj *   pHb;
  struct SSqlObj *   sqlList;
H
hjxilinx 已提交
333
  struct SSqlStream *streamList;
334
  void*              pDnodeConn;
H
hjxilinx 已提交
335
  pthread_mutex_t    mutex;
S
Shengliang Guan 已提交
336
  T_REF_DECLARE()
H
hzcheng 已提交
337 338
} STscObj;

H
Haojun Liao 已提交
339 340 341 342 343 344
typedef struct SSubqueryState {
  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
} SSubqueryState;

345
typedef struct SSqlObj {
346
  void            *signature;
347
  pthread_t        owner;        // owner of sql object, by which it is executed
348
  STscObj         *pTscObj;
H
Haojun Liao 已提交
349
  void            *pRpcCtx;
350 351 352
  void            (*fp)();
  void            (*fetchFp)();
  void            *param;
H
hjxilinx 已提交
353 354 355 356 357
  int64_t          stime;
  uint32_t         queryId;
  void *           pStream;
  void *           pSubscription;
  char *           sqlstr;
358
  char             parseRetry;
H
hjxilinx 已提交
359 360
  char             retry;
  char             maxRetry;
361
  SRpcEpSet        epSet;
H
Haojun Liao 已提交
362
  char             listed;
H
hjxilinx 已提交
363 364 365
  tsem_t           rspSem;
  SSqlCmd          cmd;
  SSqlRes          res;
H
Haojun Liao 已提交
366 367

  SSubqueryState   subState;
368
  struct SSqlObj **pSubs;
H
Haojun Liao 已提交
369

H
Haojun Liao 已提交
370
  struct SSqlObj  *prev, *next;
H
Haojun Liao 已提交
371
  struct SSqlObj **self;
H
hzcheng 已提交
372 373
} SSqlObj;

H
hjxilinx 已提交
374
typedef struct SSqlStream {
H
hzcheng 已提交
375 376 377
  SSqlObj *pSql;
  uint32_t streamId;
  char     listed;
378 379
  bool     isProject;
  int16_t  precision;
H
hzcheng 已提交
380 381 382
  int64_t  num;  // number of computing count

  /*
S
slguan 已提交
383
   * keep the number of current result in computing,
H
hzcheng 已提交
384 385 386 387 388 389 390
   * 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 已提交
391
  int64_t etime;     // stream end query time, when time is larger then etime, the stream will be closed
B
Bomin Zhang 已提交
392
  SInterval interval;
H
hzcheng 已提交
393 394 395 396 397
  void *  pTimer;

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

S
slguan 已提交
398
  void (*callback)(void *);  // Callback function when stream is stopped from client level
H
hjxilinx 已提交
399
  struct SSqlStream *prev, *next;
H
hzcheng 已提交
400 401
} SSqlStream;

402
int32_t tscInitRpc(const char *user, const char *secret, void** pDnodeConn);
H
hjxilinx 已提交
403
void    tscInitMsgsFp();
S
slguan 已提交
404

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

407
void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet);
S
slguan 已提交
408
int  tscProcessSql(SSqlObj *pSql);
H
hzcheng 已提交
409

B
Bomin Zhang 已提交
410
int  tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex);
H
hzcheng 已提交
411
void tscQueueAsyncRes(SSqlObj *pSql);
S
slguan 已提交
412

H
[td-99]  
hjxilinx 已提交
413
void tscQueueAsyncError(void(*fp), void *param, int32_t code);
H
hzcheng 已提交
414 415 416 417 418

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

H
hjxilinx 已提交
419 420
int32_t tscTansformSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
void    tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
H
hzcheng 已提交
421

422
int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo);
H
hzcheng 已提交
423

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

weixin_48148422's avatar
weixin_48148422 已提交
426 427 428 429
/**
 * free query result of the sql object
 * @param pObj
 */
H
hjxilinx 已提交
430
void tscFreeSqlResult(SSqlObj *pSql);
weixin_48148422's avatar
weixin_48148422 已提交
431

H
hzcheng 已提交
432 433
/**
 * only free part of resources allocated during query.
H
Haojun Liao 已提交
434
 * TODO remove it later
H
hzcheng 已提交
435 436 437
 * Note: this function is multi-thread safe.
 * @param pObj
 */
H
Haojun Liao 已提交
438
void tscPartiallyFreeSqlObj(SSqlObj *pSql);
H
hzcheng 已提交
439 440 441

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

void tscCloseTscObj(STscObj *pObj);

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

H
Haojun Liao 已提交
454 455 456
void waitForQueryRsp(void *param, TAOS_RES *tres, int code);

void doAsyncQuery(STscObj *pObj, SSqlObj *pSql, __async_cb_func_t fp, void *param, const char *sqlstr, size_t sqlLen);
457

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

463
char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
464

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

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

static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex) {
H
Haojun Liao 已提交
471
  SFieldSupInfo* pInfo = (SFieldSupInfo*) TARRAY_GET_ELEM(pFieldInfo->pSupportInfo, columnIndex);
H
Haojun Liao 已提交
472 473 474 475 476
  assert(pInfo->pSqlExpr != NULL);

  int32_t type = pInfo->pSqlExpr->resType;
  int32_t bytes = pInfo->pSqlExpr->resBytes;

S
Shengliang Guan 已提交
477
  char* pData = pRes->data + (int32_t)(pInfo->pSqlExpr->offset * pRes->numOfRows + bytes * pRes->row);
H
Haojun Liao 已提交
478

H
Haojun Liao 已提交
479
  // user defined constant value output columns
Y
TD-1230  
yihaoDeng 已提交
480
  if (TSDB_COL_IS_UD_COL(pInfo->pSqlExpr->colInfo.flag)) {
H
Haojun Liao 已提交
481 482 483 484
    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;
      pRes->tsrow[columnIndex] = (pInfo->pSqlExpr->param[1].nType == TSDB_DATA_TYPE_NULL) ? NULL : pData;
H
Haojun Liao 已提交
485
    } else {
H
Haojun Liao 已提交
486
      assert(bytes == tDataTypeDesc[type].nSize);
H
Haojun Liao 已提交
487

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

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

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

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

H
Haojun Liao 已提交
511
extern SCacheObj*    tscMetaCache;
H
Haojun Liao 已提交
512
extern SCacheObj*    tscObjCache;
H
hjxilinx 已提交
513 514 515 516 517
extern void *    tscTmr;
extern void *    tscQhandle;
extern int       tscKeepConn[];
extern int       tsInsertHeadSize;
extern int       tscNumOfThreads;
518 519
  
extern SRpcCorEpSet tscMgmtEpSet;
H
hjxilinx 已提交
520 521

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

weixin_48148422's avatar
weixin_48148422 已提交
523
int32_t tscCompareTidTags(const void* p1, const void* p2);
H
Haojun Liao 已提交
524
void tscBuildVgroupTableInfo(SSqlObj* pSql, STableMetaInfo* pTableMetaInfo, SArray* tables);
weixin_48148422's avatar
weixin_48148422 已提交
525

H
hzcheng 已提交
526 527 528 529 530
#ifdef __cplusplus
}
#endif

#endif