tsclient.h 16.2 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 32
#include "tutil.h"

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

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

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

dengyihao's avatar
bugfix  
dengyihao 已提交
89 90 91
typedef struct SCMCorVgroupInfo {
  int32_t version;
  int8_t inUse;
dengyihao's avatar
dengyihao 已提交
92 93
  int8_t  numOfEps;
  SEpAddr epAddr[TSDB_MAX_REPLICA];
dengyihao's avatar
bugfix  
dengyihao 已提交
94 95
} SCMCorVgroupInfo;

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

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

S
slguan 已提交
122 123
/* the structure for sql function in select clause */
typedef struct SSqlExpr {
H
hjxilinx 已提交
124 125 126 127 128 129
  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 已提交
130
  int32_t   interBytes;     // inter result buffer size
H
hjxilinx 已提交
131 132 133
  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 已提交
134 135
} SSqlExpr;

H
hjxilinx 已提交
136 137 138 139 140
typedef struct SColumnIndex {
  int16_t tableIndex;
  int16_t columnIndex;
} SColumnIndex;

H
hjxilinx 已提交
141 142
typedef struct SFieldSupInfo {
  bool            visible;
H
hjxilinx 已提交
143
  SExprInfo      *pArithExprInfo;
H
Haojun Liao 已提交
144
  SSqlExpr       *pSqlExpr;
H
hjxilinx 已提交
145
} SFieldSupInfo;
S
slguan 已提交
146

H
hjxilinx 已提交
147
typedef struct SFieldInfo {
H
hjxilinx 已提交
148 149 150
  int16_t numOfOutput;   // number of column in result
  SArray *pFields;       // SArray<TAOS_FIELD>
  SArray *pSupportInfo;  // SArray<SFieldSupInfo>
H
hzcheng 已提交
151 152
} SFieldInfo;

153
typedef struct SColumn {
S
slguan 已提交
154 155 156
  SColumnIndex       colIndex;
  int32_t            numOfFilters;
  SColumnFilterInfo *filterInfo;
157
} SColumn;
H
hzcheng 已提交
158

S
slguan 已提交
159 160
typedef struct SCond {
  uint64_t uid;
H
hjxilinx 已提交
161
  int32_t  len;  // length of tag query condition data
H
hjxilinx 已提交
162
  char *   cond;
S
slguan 已提交
163 164 165
} SCond;

typedef struct SJoinNode {
H
Haojun Liao 已提交
166
  char     tableId[TSDB_TABLE_FNAME_LEN];
S
slguan 已提交
167
  uint64_t uid;
H
Haojun Liao 已提交
168
  int16_t  tagColId;
S
slguan 已提交
169 170 171 172 173 174 175 176
} SJoinNode;

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

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

S
slguan 已提交
191
typedef struct SParamInfo {
H
hjxilinx 已提交
192 193 194
  int32_t  idx;
  char     type;
  uint8_t  timePrec;
195
  int16_t  bytes;
S
slguan 已提交
196 197 198
  uint32_t offset;
} SParamInfo;

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

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

  // for parameter ('?') binding
H
hjxilinx 已提交
219 220 221
  uint32_t    numOfAllocedParams;
  uint32_t    numOfParams;
  SParamInfo *params;
S
slguan 已提交
222
} STableDataBlocks;
H
hzcheng 已提交
223

224 225 226 227 228
//typedef struct SDataBlockList {  // todo remove
//  uint32_t           nSize;
//  uint32_t           nAlloc;
//  STableDataBlocks **pData;
//} SDataBlockList;
H
hzcheng 已提交
229

230
typedef struct SQueryInfo {
H
Haojun Liao 已提交
231
  int16_t          command;       // the command may be different for each subclause, so keep it seperately.
B
Bomin Zhang 已提交
232
  char             intervalTimeUnit;
233
  char             slidingTimeUnit;
B
Bomin Zhang 已提交
234
  uint32_t         type;          // query/insert type
235
  STimeWindow      window;        // query time window
236 237 238
  int64_t          intervalTime;  // aggregation time interval
  int64_t          slidingTime;   // sliding window in mseconds
  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;
249
  struct STSBuf *  tsBuf;
H
Haojun Liao 已提交
250 251 252 253
  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
254
  int32_t          udColumnId;    // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
255 256
} SQueryInfo;

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

262 263 264 265
  union {
    int32_t count;
    int32_t numOfTablesInSubmit;
  };
H
hzcheng 已提交
266

267
  int32_t      insertType;
268 269 270
  int32_t      clauseIndex;   // index of multiple subclause query

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

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

  int8_t       dataSourceType;     // load data from file or not
  int8_t       submitSchema;  // submit block is built with table schema
  SHashObj    *pTableList;   // referred table involved in sql
285
  SArray      *pDataBlocks;  // SArray<STableDataBlocks*> submit data blocks after parsing sql
H
hzcheng 已提交
286 287 288 289 290 291 292 293
} SSqlCmd;

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

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

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

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

H
hjxilinx 已提交
365
typedef struct SSqlStream {
H
hzcheng 已提交
366 367 368
  SSqlObj *pSql;
  uint32_t streamId;
  char     listed;
369 370
  bool     isProject;
  int16_t  precision;
H
hzcheng 已提交
371 372 373
  int64_t  num;  // number of computing count

  /*
S
slguan 已提交
374
   * keep the number of current result in computing,
H
hzcheng 已提交
375 376 377 378 379 380 381
   * 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 已提交
382
  int64_t etime;     // stream end query time, when time is larger then etime, the stream will be closed
H
hzcheng 已提交
383 384 385 386 387 388 389
  int64_t interval;
  int64_t slidingTime;
  void *  pTimer;

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

S
slguan 已提交
390
  void (*callback)(void *);  // Callback function when stream is stopped from client level
H
hjxilinx 已提交
391
  struct SSqlStream *prev, *next;
H
hzcheng 已提交
392 393
} SSqlStream;

394
int32_t tscInitRpc(const char *user, const char *secret, void** pDnodeConn);
H
hjxilinx 已提交
395
void    tscInitMsgsFp();
S
slguan 已提交
396

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

399
void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet);
S
slguan 已提交
400
int  tscProcessSql(SSqlObj *pSql);
H
hzcheng 已提交
401

H
Haojun Liao 已提交
402
int  tscRenewTableMeta(SSqlObj *pSql, char *tableId);
H
hzcheng 已提交
403
void tscQueueAsyncRes(SSqlObj *pSql);
S
slguan 已提交
404

H
[td-99]  
hjxilinx 已提交
405
void tscQueueAsyncError(void(*fp), void *param, int32_t code);
H
hzcheng 已提交
406 407 408 409 410

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

H
hjxilinx 已提交
411 412
int32_t tscTansformSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
void    tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
H
hzcheng 已提交
413

414
int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo);
H
hjxilinx 已提交
415
void    tscDestroyResPointerInfo(SSqlRes *pRes);
H
hzcheng 已提交
416

417
void tscResetSqlCmdObj(SSqlCmd *pCmd);
H
hzcheng 已提交
418

weixin_48148422's avatar
weixin_48148422 已提交
419 420 421 422
/**
 * free query result of the sql object
 * @param pObj
 */
H
hjxilinx 已提交
423
void tscFreeSqlResult(SSqlObj *pSql);
weixin_48148422's avatar
weixin_48148422 已提交
424

H
hzcheng 已提交
425 426 427 428 429
/**
 * only free part of resources allocated during query.
 * Note: this function is multi-thread safe.
 * @param pObj
 */
H
hjxilinx 已提交
430
void tscPartiallyFreeSqlObj(SSqlObj *pObj);
H
hzcheng 已提交
431 432 433 434 435 436 437 438 439 440

/**
 * free sql object, release allocated resource
 * @param pObj  Free metric/meta information, dynamically allocated payload, and
 * response buffer, object itself
 */
void tscFreeSqlObj(SSqlObj *pObj);

void tscCloseTscObj(STscObj *pObj);

H
hjxilinx 已提交
441 442
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
Hui Li 已提交
443
void waitForQueryRsp(void *param, TAOS_RES *tres, int code) ;
H
hjxilinx 已提交
444 445

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

H
Haojun Liao 已提交
447
void tscProcessMultiVnodesImportFromFile(SSqlObj *pSql);
H
hjxilinx 已提交
448
void tscKillSTableQuery(SSqlObj *pSql);
449
void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen);
H
Haojun Liao 已提交
450
bool tscIsUpdateQuery(SSqlObj* pSql);
451
bool tscHasReachLimitation(SQueryInfo *pQueryInfo, SSqlRes *pRes);
H
Haojun Liao 已提交
452 453

// todo remove this function.
454
bool tscResultsetFetchCompleted(TAOS_RES *result);
H
hjxilinx 已提交
455

456
char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
457

H
hjxilinx 已提交
458
int32_t tscInvalidSQLErrMsg(char *msg, const char *additionalInfo, const char *sql);
H
hzcheng 已提交
459

H
hjxilinx 已提交
460
int32_t tscToSQLCmd(SSqlObj *pSql, struct SSqlInfo *pInfo);
H
Haojun Liao 已提交
461 462

static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex) {
H
Haojun Liao 已提交
463
  SFieldSupInfo* pInfo = (SFieldSupInfo*) TARRAY_GET_ELEM(pFieldInfo->pSupportInfo, columnIndex);
H
Haojun Liao 已提交
464 465 466 467 468 469 470
  assert(pInfo->pSqlExpr != NULL);

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

  char* pData = pRes->data + pInfo->pSqlExpr->offset * pRes->numOfRows + bytes * pRes->row;

H
Haojun Liao 已提交
471 472 473 474 475 476
  // user defined constant value output columns
  if (pInfo->pSqlExpr->colInfo.flag == TSDB_COL_UDC) {
    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 已提交
477
    } else {
H
Haojun Liao 已提交
478
      assert(bytes == tDataTypeDesc[type].nSize);
H
Haojun Liao 已提交
479

H
Haojun Liao 已提交
480 481
      pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : &pInfo->pSqlExpr->param[1].i64Key;
      pRes->length[columnIndex] = bytes;
H
Haojun Liao 已提交
482 483
    }
  } else {
H
Haojun Liao 已提交
484 485 486 487 488 489 490 491
    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 已提交
492

H
Haojun Liao 已提交
493
      pRes->length[columnIndex] = realLen;
H
Haojun Liao 已提交
494
    } else {
H
Haojun Liao 已提交
495
      assert(bytes == tDataTypeDesc[type].nSize);
H
Haojun Liao 已提交
496

H
Haojun Liao 已提交
497 498 499
      pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : pData;
      pRes->length[columnIndex] = bytes;
    }
H
Haojun Liao 已提交
500 501
  }
}
H
hjxilinx 已提交
502 503 504 505 506 507 508

extern void *    tscCacheHandle;
extern void *    tscTmr;
extern void *    tscQhandle;
extern int       tscKeepConn[];
extern int       tsInsertHeadSize;
extern int       tscNumOfThreads;
509 510
  
extern SRpcCorEpSet tscMgmtEpSet;
H
hjxilinx 已提交
511 512

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

514 515
typedef void (*__async_cb_func_t)(void *param, TAOS_RES *tres, int numOfRows);

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

H
hzcheng 已提交
519 520 521 522 523
#ifdef __cplusplus
}
#endif

#endif