• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #3531

19 Nov 2024 10:42AM UTC coverage: 60.213% (-0.006%) from 60.219%
#3531

push

travis-ci

web-flow
Merge pull request #28777 from taosdata/fix/3.0/TD-32366

fix:TD-32366/stmt add geometry datatype check

118529 of 252344 branches covered (46.97%)

Branch coverage included in aggregate %.

7 of 48 new or added lines in 3 files covered. (14.58%)

2282 existing lines in 115 files now uncovered.

199096 of 275161 relevant lines covered (72.36%)

6067577.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

61.84
/source/libs/executor/src/sysscanoperator.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "executorInt.h"
17
#include "filter.h"
18
#include "functionMgt.h"
19
#include "geosWrapper.h"
20
#include "querynodes.h"
21
#include "systable.h"
22
#include "tname.h"
23

24
#include "tdatablock.h"
25
#include "tmsg.h"
26

27
#include "index.h"
28
#include "operator.h"
29
#include "query.h"
30
#include "querytask.h"
31
#include "storageapi.h"
32
#include "tcompare.h"
33
#include "thash.h"
34
#include "trpc.h"
35
#include "ttypes.h"
36

37
typedef int (*__optSysFilter)(void* a, void* b, int16_t dtype);
38
typedef int32_t (*__sys_filte)(void* pMeta, SNode* cond, SArray* result);
39
typedef int32_t (*__sys_check)(SNode* cond);
40

41
typedef struct SSTabFltArg {
42
  void*        pMeta;
43
  void*        pVnode;
44
  SStorageAPI* pAPI;
45
} SSTabFltArg;
46

47
typedef struct SSysTableIndex {
48
  int8_t  init;
49
  SArray* uids;
50
  int32_t lastIdx;
51
} SSysTableIndex;
52

53
typedef struct SSysTableScanInfo {
54
  SRetrieveMetaTableRsp* pRsp;
55
  SRetrieveTableReq      req;
56
  SEpSet                 epSet;
57
  tsem_t                 ready;
58
  SReadHandle            readHandle;
59
  int32_t                accountId;
60
  const char*            pUser;
61
  bool                   sysInfo;
62
  bool                   showRewrite;
63
  bool                   restore;
64
  SNode*                 pCondition;  // db_name filter condition, to discard data that are not in current database
65
  SMTbCursor*            pCur;        // cursor for iterate the local table meta store.
66
  SSysTableIndex*        pIdx;        // idx for local table meta
67
  SHashObj*              pSchema;
68
  SColMatchInfo          matchInfo;
69
  SName                  name;
70
  SSDataBlock*           pRes;
71
  int64_t                numOfBlocks;  // extract basic running information.
72
  SLoadRemoteDataInfo    loadInfo;
73
  SLimitInfo             limitInfo;
74
  int32_t                tbnameSlotId;
75
  SStorageAPI*           pAPI;
76
} SSysTableScanInfo;
77

78
typedef struct {
79
  const char* name;
80
  __sys_check chkFunc;
81
  __sys_filte fltFunc;
82
} SSTabFltFuncDef;
83

84
typedef struct MergeIndex {
85
  int idx;
86
  int len;
87
} MergeIndex;
88

89
typedef struct SBlockDistInfo {
90
  SSDataBlock*    pResBlock;
91
  STsdbReader*    pHandle;
92
  SReadHandle     readHandle;
93
  STableListInfo* pTableListInfo;
94
  uint64_t        uid;  // table uid
95
} SBlockDistInfo;
96

97
static int32_t sysChkFilter__Comm(SNode* pNode);
98
static int32_t sysChkFilter__DBName(SNode* pNode);
99
static int32_t sysChkFilter__VgroupId(SNode* pNode);
100
static int32_t sysChkFilter__TableName(SNode* pNode);
101
static int32_t sysChkFilter__CreateTime(SNode* pNode);
102
static int32_t sysChkFilter__Ncolumn(SNode* pNode);
103
static int32_t sysChkFilter__Ttl(SNode* pNode);
104
static int32_t sysChkFilter__STableName(SNode* pNode);
105
static int32_t sysChkFilter__Uid(SNode* pNode);
106
static int32_t sysChkFilter__Type(SNode* pNode);
107

108
static int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result);
109
static int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result);
110
static int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result);
111
static int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result);
112
static int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result);
113
static int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result);
114
static int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result);
115
static int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result);
116
static int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result);
117

118
const SSTabFltFuncDef filterDict[] = {
119
    {.name = "table_name", .chkFunc = sysChkFilter__TableName, .fltFunc = sysFilte__TableName},
120
    {.name = "db_name", .chkFunc = sysChkFilter__DBName, .fltFunc = sysFilte__DbName},
121
    {.name = "create_time", .chkFunc = sysChkFilter__CreateTime, .fltFunc = sysFilte__CreateTime},
122
    {.name = "columns", .chkFunc = sysChkFilter__Ncolumn, .fltFunc = sysFilte__Ncolumn},
123
    {.name = "ttl", .chkFunc = sysChkFilter__Ttl, .fltFunc = sysFilte__Ttl},
124
    {.name = "stable_name", .chkFunc = sysChkFilter__STableName, .fltFunc = sysFilte__STableName},
125
    {.name = "vgroup_id", .chkFunc = sysChkFilter__VgroupId, .fltFunc = sysFilte__VgroupId},
126
    {.name = "uid", .chkFunc = sysChkFilter__Uid, .fltFunc = sysFilte__Uid},
127
    {.name = "type", .chkFunc = sysChkFilter__Type, .fltFunc = sysFilte__Type}};
128

129
#define SYSTAB_FILTER_DICT_SIZE (sizeof(filterDict) / sizeof(filterDict[0]))
130

131
static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta,
132
                                     size_t size, const char* dbName, int64_t* pRows);
133

134
static char* SYSTABLE_SPECIAL_COL[] = {"db_name", "vgroup_id"};
135

136
static int32_t        buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity);
137
static SSDataBlock*   buildInfoSchemaTableMetaBlock(char* tableName);
138
static void           destroySysScanOperator(void* param);
139
static int32_t        loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code);
140
static __optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal);
141

142
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
143
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
144
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock);
145

146
static int32_t sysTableUserColsFillOneTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
147
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
148
                                                char* tableType);
149

150
static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
151
                                               SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo);
152

153
int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result) {
1,586✔
154
  SSTabFltArg* pArg = arg;
1,586✔
155
  void*        pVnode = pArg->pVnode;
1,586✔
156

157
  const char* db = NULL;
1,586✔
158
  pArg->pAPI->metaFn.getBasicInfo(pVnode, &db, NULL, NULL, NULL);
1,586✔
159

160
  SName   sn = {0};
1,598✔
161
  char    dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,598✔
162
  int32_t code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1,598✔
163
  if (code != TSDB_CODE_SUCCESS) {
1,596!
164
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
165
    return code;
×
166
  }
167

168
  code = tNameGetDbName(&sn, varDataVal(dbname));
1,596✔
169
  if (code != TSDB_CODE_SUCCESS) {
1,596!
170
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
171
    return code;
×
172
  }
173
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1,596✔
174

175
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,596✔
176
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
1,596✔
177

178
  bool           reverse = false;
1,596✔
179
  bool           equal = false;
1,596✔
180
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
1,596✔
181
  if (func == NULL) return -1;
1,594!
182

183
  int ret = func(dbname, pVal->datum.p, TSDB_DATA_TYPE_VARCHAR);
1,594✔
184
  if (ret == 0) return 0;
1,593✔
185

186
  return -2;
7✔
187
}
188

189
int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result) {
×
190
  SSTabFltArg* pArg = arg;
×
191
  void*        pVnode = ((SSTabFltArg*)arg)->pVnode;
×
192

193
  int64_t vgId = 0;
×
194
  pArg->pAPI->metaFn.getBasicInfo(pVnode, NULL, (int32_t*)&vgId, NULL, NULL);
×
195

196
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
197
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
198

199
  bool           reverse = false;
×
200
  bool           equal = false;
×
201
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
202
  if (func == NULL) return -1;
×
203

204
  int ret = func(&vgId, &pVal->datum.i, TSDB_DATA_TYPE_BIGINT);
×
205
  if (ret == 0) return 0;
×
206

207
  return -1;
×
208
}
209

210
int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) {
838✔
211
  SSTabFltArg* pArg = arg;
838✔
212

213
  SOperatorNode* pOper = (SOperatorNode*)pNode;
838✔
214
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
838✔
215

216
  bool           reverse = false, equal = false;
838✔
217
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
838✔
218
  if (func == NULL) return -1;
840!
219

220
  SMetaFltParam param = {.suid = 0,
840✔
221
                         .cid = 0,
222
                         .type = TSDB_DATA_TYPE_VARCHAR,
223
                         .val = pVal->datum.p,
840✔
224
                         .reverse = reverse,
225
                         .equal = equal,
226
                         .filterFunc = func};
227
  return -1;
840✔
228
}
229

230
int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) {
6✔
231
  SSTabFltArg* pArg = arg;
6✔
232
  SStorageAPI* pAPI = pArg->pAPI;
6✔
233

234
  SOperatorNode* pOper = (SOperatorNode*)pNode;
6✔
235
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
6✔
236

237
  bool           reverse = false, equal = false;
6✔
238
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
6✔
239
  if (func == NULL) return -1;
6!
240

241
  SMetaFltParam param = {.suid = 0,
6✔
242
                         .cid = 0,
243
                         .type = TSDB_DATA_TYPE_BIGINT,
244
                         .val = &pVal->datum.i,
6✔
245
                         .reverse = reverse,
246
                         .equal = equal,
247
                         .filterFunc = func};
248

249
  int32_t ret = pAPI->metaFilter.metaFilterCreateTime(pArg->pVnode, &param, result);
6✔
250
  return ret;
6✔
251
}
252

253
int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result) {
×
254
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
255

256
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
257
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
258
  bool           reverse = false;
×
259
  bool           equal = false;
×
260
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
261
  if (func == NULL) return -1;
×
262
  return -1;
×
263
}
264

265
int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result) {
×
266
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
267

268
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
269
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
270
  bool           reverse = false;
×
271
  bool           equal = false;
×
272
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
273
  if (func == NULL) return -1;
×
274
  return -1;
×
275
}
276

277
int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result) {
16✔
278
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
16✔
279

280
  SOperatorNode* pOper = (SOperatorNode*)pNode;
16✔
281
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
16✔
282
  bool           reverse = false;
16✔
283
  bool           equal = false;
16✔
284
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
16✔
285
  if (func == NULL) return -1;
16!
286
  return -1;
16✔
287
}
288

289
int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result) {
×
290
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
291

292
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
293
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
294
  bool           reverse = false;
×
295
  bool           equal = false;
×
296
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
297
  if (func == NULL) return -1;
×
298
  return -1;
×
299
}
300

301
int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result) {
×
302
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
303

304
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
305
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
306
  bool           reverse = false;
×
307
  bool           equal = false;
×
308
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
309
  if (func == NULL) return -1;
×
310
  return -1;
×
311
}
312

313
int optSysDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) {
36,549✔
314
  int32_t cmp = func(a, b);
36,549✔
315
  switch (comparType) {
36,514!
316
    case OP_TYPE_LOWER_THAN:
26,209✔
317
      if (cmp < 0) return 0;
26,209!
318
      break;
×
319
    case OP_TYPE_LOWER_EQUAL: {
×
320
      if (cmp <= 0) return 0;
×
321
      break;
×
322
    }
323
    case OP_TYPE_GREATER_THAN: {
8,740✔
324
      if (cmp > 0) return 0;
8,740!
325
      break;
×
326
    }
327
    case OP_TYPE_GREATER_EQUAL: {
×
328
      if (cmp >= 0) return 0;
×
329
      break;
×
330
    }
331
    case OP_TYPE_EQUAL: {
1,583✔
332
      if (cmp == 0) return 0;
1,583!
333
      break;
×
334
    }
335
    default:
×
336
      return -1;
×
337
  }
338
  return cmp;
×
339
}
340

341
static int optSysFilterFuncImpl__LowerThan(void* a, void* b, int16_t dtype) {
26,441✔
342
  __compar_fn_t func = getComparFunc(dtype, 0);
26,441✔
343
  if (func == NULL) {
25,888!
344
    return -1;
×
345
  }
346
  return optSysDoCompare(func, OP_TYPE_LOWER_THAN, a, b);
25,888✔
347
}
348
static int optSysFilterFuncImpl__LowerEqual(void* a, void* b, int16_t dtype) {
×
349
  __compar_fn_t func = getComparFunc(dtype, 0);
×
350
  if (func == NULL) {
×
351
    return -1;
×
352
  }
353
  return optSysDoCompare(func, OP_TYPE_LOWER_EQUAL, a, b);
×
354
}
355
static int optSysFilterFuncImpl__GreaterThan(void* a, void* b, int16_t dtype) {
8,754✔
356
  __compar_fn_t func = getComparFunc(dtype, 0);
8,754✔
357
  if (func == NULL) {
8,754!
358
    return -1;
×
359
  }
360
  return optSysDoCompare(func, OP_TYPE_GREATER_THAN, a, b);
8,754✔
361
}
362
static int optSysFilterFuncImpl__GreaterEqual(void* a, void* b, int16_t dtype) {
×
363
  __compar_fn_t func = getComparFunc(dtype, 0);
×
364
  if (func == NULL) {
×
365
    return -1;
×
366
  }
367
  return optSysDoCompare(func, OP_TYPE_GREATER_EQUAL, a, b);
×
368
}
369
static int optSysFilterFuncImpl__Equal(void* a, void* b, int16_t dtype) {
1,586✔
370
  __compar_fn_t func = getComparFunc(dtype, 0);
1,586✔
371
  if (func == NULL) {
1,586!
372
    return -1;
×
373
  }
374
  return optSysDoCompare(func, OP_TYPE_EQUAL, a, b);
1,586✔
375
}
376

377
static int optSysFilterFuncImpl__NoEqual(void* a, void* b, int16_t dtype) {
8✔
378
  __compar_fn_t func = getComparFunc(dtype, 0);
8✔
379
  if (func == NULL) {
8!
380
    return -1;
×
381
  }
382
  return optSysDoCompare(func, OP_TYPE_NOT_EQUAL, a, b);
8✔
383
}
384

385
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result);
386
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result);
387
static int32_t optSysCheckOper(SNode* pOpear);
388
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt);
389

390
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
391
                                          SExecTaskInfo* pTaskInfo);
392
void                extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode);
393

394
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
395
                                   SSDataBlock* pBlock);
396

397
__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal) {
2,457✔
398
  if (ctype == OP_TYPE_LOWER_EQUAL || ctype == OP_TYPE_LOWER_THAN) {
2,457!
399
    *reverse = true;
4✔
400
  }
401
  if (ctype == OP_TYPE_EQUAL) {
2,457✔
402
    *equal = true;
2,444✔
403
  }
404
  if (ctype == OP_TYPE_LOWER_THAN)
2,457✔
405
    return optSysFilterFuncImpl__LowerThan;
4✔
406
  else if (ctype == OP_TYPE_LOWER_EQUAL)
2,453!
407
    return optSysFilterFuncImpl__LowerEqual;
×
408
  else if (ctype == OP_TYPE_GREATER_THAN)
2,453✔
409
    return optSysFilterFuncImpl__GreaterThan;
2✔
410
  else if (ctype == OP_TYPE_GREATER_EQUAL)
2,451!
411
    return optSysFilterFuncImpl__GreaterEqual;
×
412
  else if (ctype == OP_TYPE_EQUAL)
2,451✔
413
    return optSysFilterFuncImpl__Equal;
2,444✔
414
  else if (ctype == OP_TYPE_NOT_EQUAL)
7!
415
    return optSysFilterFuncImpl__NoEqual;
8✔
416
  return NULL;
×
417
}
418

419
static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) {
32,311✔
420
  SOperatorNode* node = (SOperatorNode*)pCond;
32,311✔
421
  if (node->opType == OP_TYPE_EQUAL) {
32,311✔
422
    if (nodeType(node->pLeft) == QUERY_NODE_COLUMN &&
5,343!
423
        strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 &&
5,343!
424
        nodeType(node->pRight) == QUERY_NODE_VALUE) {
×
425
      SValueNode* pValue = (SValueNode*)node->pRight;
×
426
      if (pValue->node.resType.type == TSDB_DATA_TYPE_NCHAR || pValue->node.resType.type == TSDB_DATA_TYPE_VARCHAR) {
×
427
        char* value = nodesGetValueFromNode(pValue);
×
428
        tstrncpy(condTable, varDataVal(value), TSDB_TABLE_NAME_LEN);
×
429
        return true;
×
430
      }
431
    }
432
  }
433
  return false;
32,315✔
434
}
435

436
static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) {
31,358✔
437
  if (pCond == NULL) {
31,358✔
438
    return false;
6✔
439
  }
440
  if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) {
31,352✔
441
    SLogicConditionNode* node = (SLogicConditionNode*)pCond;
948✔
442
    if (LOGIC_COND_TYPE_AND == node->condType) {
948!
443
      SNode* pChild = NULL;
948✔
444
      FOREACH(pChild, node->pParameterList) {
2,844!
445
        if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) {
1,896!
446
          return true;
×
447
        }
448
      }
449
    }
450
  }
451

452
  if (QUERY_NODE_OPERATOR == nodeType(pCond)) {
31,352✔
453
    return sysTableIsOperatorCondOnOneTable(pCond, condTable);
30,418✔
454
  }
455

456
  return false;
934✔
457
}
458

459
static SSDataBlock* doOptimizeTableNameFilter(SOperatorInfo* pOperator, SSDataBlock* dataBlock, char* dbname) {
×
460
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
461
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
×
462
  SSysTableScanInfo* pInfo = pOperator->info;
×
463
  int32_t            numOfRows = 0;
×
464

465
  char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
466
  STR_TO_VARSTR(tableName, pInfo->req.filterTb);
×
467

468
  SMetaReader smrTable = {0};
×
469
  pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
470
  int32_t code = pAPI->metaReaderFn.getTableEntryByName(&smrTable, pInfo->req.filterTb);
×
471
  if (code != TSDB_CODE_SUCCESS) {
×
472
    // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
473
    pAPI->metaReaderFn.clearReader(&smrTable);
×
474
    pInfo->loadInfo.totalRows = 0;
×
475
    return NULL;
×
476
  }
477

478
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
479
    pAPI->metaReaderFn.clearReader(&smrTable);
×
480
    pInfo->loadInfo.totalRows = 0;
×
481
    return NULL;
×
482
  }
483

484
  if (smrTable.me.type == TSDB_CHILD_TABLE) {
×
485
    int64_t suid = smrTable.me.ctbEntry.suid;
×
486
    pAPI->metaReaderFn.clearReader(&smrTable);
×
487
    pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
488
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrTable, suid);
×
489
    if (code != TSDB_CODE_SUCCESS) {
×
490
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
491
      pAPI->metaReaderFn.clearReader(&smrTable);
×
492
      pInfo->loadInfo.totalRows = 0;
×
493
      return NULL;
×
494
    }
495
  }
496

497
  char            typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
498
  SSchemaWrapper* schemaRow = NULL;
×
499
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
500
    schemaRow = &smrTable.me.stbEntry.schemaRow;
×
501
    STR_TO_VARSTR(typeName, "CHILD_TABLE");
×
502
  } else if (smrTable.me.type == TSDB_NORMAL_TABLE) {
×
503
    schemaRow = &smrTable.me.ntbEntry.schemaRow;
×
504
    STR_TO_VARSTR(typeName, "NORMAL_TABLE");
×
505
  }
506

507
  code = sysTableUserColsFillOneTableCols(pInfo, dbname, &numOfRows, dataBlock, tableName, schemaRow, typeName);
×
508
  if (code != TSDB_CODE_SUCCESS) {
×
509
    pAPI->metaReaderFn.clearReader(&smrTable);
×
510
    pInfo->loadInfo.totalRows = 0;
×
511
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
512
    pTaskInfo->code = code;
×
513
    T_LONG_JMP(pTaskInfo->env, code);
×
514
  }
515
  pAPI->metaReaderFn.clearReader(&smrTable);
×
516

517
  if (numOfRows > 0) {
×
518
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
519
    numOfRows = 0;
×
520
  }
521

522
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
523
  setOperatorCompleted(pOperator);
×
524

525
  qDebug("get cols success, total rows:%" PRIu64 ", current:%" PRId64 " %s", pInfo->loadInfo.totalRows,
×
526
         pInfo->pRes->info.rows, GET_TASKID(pTaskInfo));
527
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
528
}
529

530
int32_t doExtractDbName(char* dbname, SSysTableScanInfo* pInfo, SStorageAPI* pAPI) {
14,167✔
531
  int32_t     code = TSDB_CODE_SUCCESS;
14,167✔
532
  int32_t     lino = 0;
14,167✔
533
  SName       sn = {0};
14,167✔
534
  const char* db = NULL;
14,167✔
535
  int32_t     vgId = 0;
14,167✔
536
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
14,167✔
537
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
14,168✔
538
  QUERY_CHECK_CODE(code, lino, _end);
14,168!
539

540
  code = tNameGetDbName(&sn, varDataVal(dbname));
14,168✔
541
  QUERY_CHECK_CODE(code, lino, _end);
14,163!
542

543
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
14,163✔
544

545
_end:
14,163✔
546
  if (code != TSDB_CODE_SUCCESS) {
14,163!
547
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
548
  }
549
  return code;
14,165✔
550
}
551

552
static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
22,286✔
553
  int32_t            code = TSDB_CODE_SUCCESS;
22,286✔
554
  int32_t            lino = 0;
22,286✔
555
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
22,286✔
556
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
22,286✔
557
  SSysTableScanInfo* pInfo = pOperator->info;
22,286✔
558
  int32_t            numOfRows = 0;
22,286✔
559
  int32_t            ret = 0;
22,286✔
560
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
22,286✔
561
  SSDataBlock*       pDataBlock = NULL;
22,286✔
562

563
  if (pOperator->status == OP_EXEC_DONE) {
22,286✔
564
    return NULL;
8,127✔
565
  }
566

567
  blockDataCleanup(pInfo->pRes);
14,159✔
568

569
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_COLS);
14,168✔
570
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
14,166!
571

572
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
14,166✔
573
  QUERY_CHECK_CODE(code, lino, _end);
14,168!
574

575
  code = doExtractDbName(dbname, pInfo, pAPI);
14,168✔
576
  QUERY_CHECK_CODE(code, lino, _end);
14,164!
577

578
  // optimize when sql like where table_name='tablename' and xxx.
579
  if (pInfo->req.filterTb[0]) {
14,164!
580
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
581
    blockDataDestroy(pDataBlock);
×
582
    return p;
×
583
  }
584

585
  if (pInfo->pCur == NULL) {
14,164✔
586
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
13,653✔
587
  } else {
588
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
511✔
589
    if (code != 0) {
514!
590
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
591
      pInfo->pCur = NULL;
×
592
      QUERY_CHECK_CODE(code, lino, _end);
×
593
    }
594
  }
595

596
  if (pInfo->pSchema == NULL) {
14,164✔
597
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
13,650✔
598
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
13,651✔
599
  }
600

601
  if (!pInfo->pCur || !pInfo->pSchema) {
14,164!
602
    terrno = TSDB_CODE_OUT_OF_MEMORY;
2✔
603
    qError("sysTableScanUserCols failed since %s", terrstr());
×
604
    blockDataDestroy(pDataBlock);
×
605
    pInfo->loadInfo.totalRows = 0;
×
606
    return NULL;
×
607
  }
608

609
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
277,804✔
610
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
264,412✔
611
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
264,412✔
612

613
    SSchemaWrapper* schemaRow = NULL;
264,412✔
614

615
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
264,412✔
616
      qDebug("sysTableScanUserCols cursor get super table, %s", GET_TASKID(pTaskInfo));
1,038✔
617
      void* schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
1,038✔
618
      if (schema == NULL) {
1,038✔
619
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&pInfo->pCur->mr.me.stbEntry.schemaRow);
1,008!
620
        if (pInfo->pCur->mr.me.stbEntry.schemaRow.pSchema) {
1,008!
621
          QUERY_CHECK_NULL(schemaWrapper, code, lino, _end, terrno);
1,008!
622
        }
623
        code = taosHashPut(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
1,008✔
624
        if (code == TSDB_CODE_DUP_KEY) {
1,008!
625
          code = TSDB_CODE_SUCCESS;
×
626
        }
627
        QUERY_CHECK_CODE(code, lino, _end);
1,008!
628
      }
629
      continue;
1,038✔
630
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
263,374✔
631
      qDebug("sysTableScanUserCols cursor get child table, %s", GET_TASKID(pTaskInfo));
250,735!
632

633
      STR_TO_VARSTR(typeName, "CHILD_TABLE");
250,787✔
634
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
250,787✔
635
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
250,787✔
636
      void*   schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.ctbEntry.suid, sizeof(int64_t));
250,787✔
637
      if (schema != NULL) {
250,797✔
638
        schemaRow = *(SSchemaWrapper**)schema;
250,767✔
639
      } else {
640
        SMetaReader smrSuperTable = {0};
30✔
641
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
30✔
642
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
30✔
643
        if (code != TSDB_CODE_SUCCESS) {
30!
644
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
645
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
646
                 GET_TASKID(pTaskInfo));
647

648
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
649
          blockDataDestroy(pDataBlock);
×
UNCOV
650
          pInfo->loadInfo.totalRows = 0;
×
UNCOV
651
          return NULL;
×
652
        }
653
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
30✔
654
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
30!
655
          if (schemaWrapper == NULL) {
30!
656
            code = terrno;
×
657
            lino = __LINE__;
×
658
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
659
            goto _end;
×
660
          }
661
        }
662
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
30✔
663
        if (code == TSDB_CODE_DUP_KEY) {
30!
664
          code = TSDB_CODE_SUCCESS;
×
665
        }
666
        schemaRow = schemaWrapper;
30✔
667
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
30✔
668
        QUERY_CHECK_CODE(code, lino, _end);
30!
669
      }
670
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
12,639!
671
      qDebug("sysTableScanUserCols cursor get normal table, %s", GET_TASKID(pTaskInfo));
12,654✔
672
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
12,659✔
673
      STR_TO_VARSTR(typeName, "NORMAL_TABLE");
12,659✔
674
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
12,659✔
675
    } else {
676
      qDebug("sysTableScanUserCols cursor get invalid table, %s", GET_TASKID(pTaskInfo));
×
677
      continue;
×
678
    }
679

680
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
263,456✔
681
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
1,304✔
682
      numOfRows = 0;
1,304✔
683

684
      if (pInfo->pRes->info.rows > 0) {
1,304✔
685
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
514✔
686
        break;
514✔
687
      }
688
    }
689
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
690
    code = sysTableUserColsFillOneTableCols(pInfo, dbname, &numOfRows, pDataBlock, tableName, schemaRow, typeName);
262,942✔
691
    QUERY_CHECK_CODE(code, lino, _end);
262,604!
692
  }
693

694
  if (numOfRows > 0) {
13,298!
695
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
13,651✔
696
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
13,654✔
697
    numOfRows = 0;
13,649✔
698
  }
699

700
  blockDataDestroy(pDataBlock);
13,296✔
701
  pDataBlock = NULL;
14,165✔
702
  if (ret != 0) {
14,165✔
703
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
13,651✔
704
    pInfo->pCur = NULL;
13,654✔
705
    setOperatorCompleted(pOperator);
13,654✔
706
  }
707

708
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
14,166✔
709
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
14,166✔
710

711
_end:
12,646✔
712
  if (code != TSDB_CODE_SUCCESS) {
14,164!
713
    blockDataDestroy(pDataBlock);
×
714
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
715
    pTaskInfo->code = code;
×
716
    T_LONG_JMP(pTaskInfo->env, code);
×
717
  }
718
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
14,164✔
719
}
720

721
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
3,199✔
722
  int32_t        code = TSDB_CODE_SUCCESS;
3,199✔
723
  int32_t        lino = 0;
3,199✔
724
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
3,199✔
725
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
3,199✔
726
  SSDataBlock*   dataBlock = NULL;
3,199✔
727

728
  SSysTableScanInfo* pInfo = pOperator->info;
3,199✔
729
  if (pOperator->status == OP_EXEC_DONE) {
3,199✔
730
    return NULL;
920✔
731
  }
732

733
  blockDataCleanup(pInfo->pRes);
2,279✔
734
  int32_t numOfRows = 0;
2,279✔
735

736
  dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS);
2,279✔
737
  QUERY_CHECK_NULL(dataBlock, code, lino, _end, terrno);
2,279!
738

739
  code = blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity);
2,279✔
740
  QUERY_CHECK_CODE(code, lino, _end);
2,279!
741

742
  const char* db = NULL;
2,279✔
743
  int32_t     vgId = 0;
2,279✔
744
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
2,279✔
745

746
  SName sn = {0};
2,279✔
747
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
2,279✔
748
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
2,279✔
749
  QUERY_CHECK_CODE(code, lino, _end);
2,279!
750

751
  code = tNameGetDbName(&sn, varDataVal(dbname));
2,279✔
752
  QUERY_CHECK_CODE(code, lino, _end);
2,279!
753

754
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
2,279✔
755

756
  char condTableName[TSDB_TABLE_NAME_LEN] = {0};
2,279✔
757
  // optimize when sql like where table_name='tablename' and xxx.
758
  if (pInfo->pCondition && sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) {
2,279!
759
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
760
    STR_TO_VARSTR(tableName, condTableName);
×
761

762
    SMetaReader smrChildTable = {0};
×
763
    pAPI->metaReaderFn.initReader(&smrChildTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
764
    code = pAPI->metaReaderFn.getTableEntryByName(&smrChildTable, condTableName);
×
765
    if (code != TSDB_CODE_SUCCESS) {
×
766
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
767
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
768
      blockDataDestroy(dataBlock);
×
769
      pInfo->loadInfo.totalRows = 0;
×
770
      return NULL;
×
771
    }
772

773
    if (smrChildTable.me.type != TSDB_CHILD_TABLE) {
×
774
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
775
      blockDataDestroy(dataBlock);
×
776
      pInfo->loadInfo.totalRows = 0;
×
777
      return NULL;
×
778
    }
779

780
    SMetaReader smrSuperTable = {0};
×
781
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
×
782
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid);
×
783
    if (code != TSDB_CODE_SUCCESS) {
×
784
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByUid
785
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
786
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
787
      blockDataDestroy(dataBlock);
×
788
      return NULL;
×
789
    }
790

791
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows,
×
792
                                            dataBlock);
793

794
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
795
    pAPI->metaReaderFn.clearReader(&smrChildTable);
×
796

797
    QUERY_CHECK_CODE(code, lino, _end);
×
798

799
    if (numOfRows > 0) {
×
800
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
801
      numOfRows = 0;
×
802
    }
803
    blockDataDestroy(dataBlock);
×
804
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
805
    setOperatorCompleted(pOperator);
×
806
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
807
  }
808

809
  int32_t ret = 0;
2,279✔
810
  if (pInfo->pCur == NULL) {
2,279✔
811
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
1,871✔
812
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
1,871!
813
  } else {
814
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
408✔
815
    QUERY_CHECK_CODE(code, lino, _end);
408!
816
  }
817

818
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
265,695✔
819
    if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE) {
262,367✔
820
      continue;
44✔
821
    }
822

823
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
262,323✔
824
    STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
262,323✔
825

826
    SMetaReader smrSuperTable = {0};
262,323✔
827
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
262,323✔
828
    uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
263,424✔
829
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
263,424✔
830
    if (code != TSDB_CODE_SUCCESS) {
263,476!
831
      qError("failed to get super table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno),
×
832
             GET_TASKID(pTaskInfo));
833
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
834
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
835
      pInfo->pCur = NULL;
×
836
      blockDataDestroy(dataBlock);
×
837
      dataBlock = NULL;
×
838
      T_LONG_JMP(pTaskInfo->env, terrno);
×
839
    }
840

841
    if ((smrSuperTable.me.stbEntry.schemaTag.nCols + numOfRows) > pOperator->resultInfo.capacity) {
263,476✔
842
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
1,000✔
843
      numOfRows = 0;
1,000✔
844

845
      if (pInfo->pRes->info.rows > 0) {
1,000✔
846
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
408✔
847
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
408✔
848
        break;
408✔
849
      }
850
    }
851
    // if pInfo->pRes->info.rows == 0, also need to add this meta into datablock.
852
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &pInfo->pCur->mr, dbname, tableName, &numOfRows,
263,068✔
853
                                            dataBlock);
854
    if (code != TSDB_CODE_SUCCESS) {
263,092!
855
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
856
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
857
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
858
      pInfo->pCur = NULL;
×
859
      blockDataDestroy(dataBlock);
×
860
      dataBlock = NULL;
×
861
      T_LONG_JMP(pTaskInfo->env, terrno);
×
862
    }
863
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
263,092✔
864
  }
865

866
  if (numOfRows > 0) {
2,293✔
867
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
1,838✔
868
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
1,838✔
869
    numOfRows = 0;
1,838✔
870
  }
871

872
  blockDataDestroy(dataBlock);
2,293✔
873
  dataBlock = NULL;
2,279✔
874
  if (ret != 0) {
2,279✔
875
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
1,871✔
876
    pInfo->pCur = NULL;
1,871✔
877
    setOperatorCompleted(pOperator);
1,871✔
878
  }
879

880
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
2,279✔
881

882
_end:
2,279✔
883
  if (code != TSDB_CODE_SUCCESS) {
2,279!
884
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
885
    blockDataDestroy(dataBlock);
×
886
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
887
    pInfo->pCur = NULL;
×
888
    pTaskInfo->code = code;
×
889
    T_LONG_JMP(pTaskInfo->env, code);
×
890
  }
891
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
2,279✔
892
}
893

894
void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
17,790✔
895
                                        SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo) {
896
  int32_t code = TSDB_CODE_SUCCESS;
17,790✔
897
  int32_t lino = 0;
17,790✔
898
  dataBlock->info.rows = numOfRows;
17,790✔
899
  pInfo->pRes->info.rows = numOfRows;
17,790✔
900

901
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, dataBlock->pDataBlock, false);
17,790✔
902
  QUERY_CHECK_CODE(code, lino, _end);
17,795!
903

904
  code = doFilter(pInfo->pRes, pFilterInfo, NULL);
17,795✔
905
  QUERY_CHECK_CODE(code, lino, _end);
17,793!
906

907
  blockDataCleanup(dataBlock);
17,793✔
908

909
_end:
17,792✔
910
  if (code != TSDB_CODE_SUCCESS) {
17,792!
911
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
912
    pTaskInfo->code = code;
×
913
    T_LONG_JMP(pTaskInfo->env, code);
×
914
  }
915
}
17,792✔
916

917
int32_t convertTagDataToStr(char* str, int32_t strBuffLen, int type, void* buf, int32_t bufSize, int32_t* len) {
4,985,202✔
918
  int32_t n = 0;
4,985,202✔
919

920
  switch (type) {
4,985,202!
921
    case TSDB_DATA_TYPE_NULL:
×
922
      n = tsnprintf(str, strBuffLen, "null");
×
923
      break;
×
924

925
    case TSDB_DATA_TYPE_BOOL:
3,980,527✔
926
      n = tsnprintf(str, strBuffLen, (*(int8_t*)buf) ? "true" : "false");
3,980,527✔
927
      break;
3,975,853✔
928

929
    case TSDB_DATA_TYPE_TINYINT:
102✔
930
      n = tsnprintf(str, strBuffLen, "%d", *(int8_t*)buf);
102✔
931
      break;
102✔
932

933
    case TSDB_DATA_TYPE_SMALLINT:
102✔
934
      n = tsnprintf(str, strBuffLen, "%d", *(int16_t*)buf);
102✔
935
      break;
102✔
936

937
    case TSDB_DATA_TYPE_INT:
256,350✔
938
      n = tsnprintf(str, strBuffLen, "%d", *(int32_t*)buf);
256,350✔
939
      break;
256,099✔
940

941
    case TSDB_DATA_TYPE_BIGINT:
252,173✔
942
    case TSDB_DATA_TYPE_TIMESTAMP:
943
      n = tsnprintf(str, strBuffLen, "%" PRId64, *(int64_t*)buf);
252,173✔
944
      break;
251,915✔
945

946
    case TSDB_DATA_TYPE_FLOAT:
250,701✔
947
      n = tsnprintf(str, strBuffLen, "%.5f", GET_FLOAT_VAL(buf));
250,701✔
948
      break;
250,279✔
949

950
    case TSDB_DATA_TYPE_DOUBLE:
250,444✔
951
      n = tsnprintf(str, strBuffLen, "%.9f", GET_DOUBLE_VAL(buf));
250,444✔
952
      break;
250,311✔
953

954
    case TSDB_DATA_TYPE_BINARY:
582✔
955
    case TSDB_DATA_TYPE_VARBINARY:
956
    case TSDB_DATA_TYPE_GEOMETRY:
957
      if (bufSize < 0) {
582!
958
        return TSDB_CODE_TSC_INVALID_VALUE;
×
959
      }
960

961
      memcpy(str, buf, bufSize);
582✔
962
      n = bufSize;
582✔
963
      break;
582✔
964
    case TSDB_DATA_TYPE_NCHAR:
307✔
965
      if (bufSize < 0) {
307!
966
        return TSDB_CODE_TSC_INVALID_VALUE;
×
967
      }
968

969
      int32_t length = taosUcs4ToMbs((TdUcs4*)buf, bufSize, str);
307✔
970
      if (length <= 0) {
307!
971
        return TSDB_CODE_TSC_INVALID_VALUE;
×
972
      }
973
      n = length;
307✔
974
      break;
307✔
975
    case TSDB_DATA_TYPE_UTINYINT:
×
976
      n = tsnprintf(str, strBuffLen, "%u", *(uint8_t*)buf);
×
977
      break;
×
978

979
    case TSDB_DATA_TYPE_USMALLINT:
×
980
      n = tsnprintf(str, strBuffLen, "%u", *(uint16_t*)buf);
×
981
      break;
×
982

983
    case TSDB_DATA_TYPE_UINT:
1,638✔
984
      n = tsnprintf(str, strBuffLen, "%u", *(uint32_t*)buf);
1,638✔
985
      break;
1,638✔
986

987
    case TSDB_DATA_TYPE_UBIGINT:
2✔
988
      n = tsnprintf(str, strBuffLen, "%" PRIu64, *(uint64_t*)buf);
2✔
989
      break;
2✔
990

991
    default:
×
992
      return TSDB_CODE_TSC_INVALID_VALUE;
×
993
  }
994

995
  if (len) *len = n;
4,987,190✔
996

997
  return TSDB_CODE_SUCCESS;
4,987,190✔
998
}
999

1000
static int32_t sysTableGetGeomText(char* iGeom, int32_t nGeom, char** output, int32_t* nOutput) {
65✔
1001
  int32_t code = 0;
65✔
1002
  char*   outputWKT = NULL;
65✔
1003

1004
  if (nGeom == 0) {
65!
1005
    if (!(*output = taosStrdup(""))) code = TSDB_CODE_OUT_OF_MEMORY;
×
1006
    *nOutput = 0;
×
1007
    return code;
×
1008
  }
1009

1010
  if (TSDB_CODE_SUCCESS != (code = initCtxAsText()) ||
130!
1011
      TSDB_CODE_SUCCESS != (code = doAsText(iGeom, nGeom, &outputWKT))) {
65✔
1012
    qError("geo text for systable failed:%s", getGeosErrMsg(code));
×
1013
    *output = NULL;
×
1014
    *nOutput = 0;
×
1015
    return code;
×
1016
  }
1017

1018
  *output = outputWKT;
65✔
1019
  *nOutput = strlen(outputWKT);
65✔
1020

1021
  return code;
65✔
1022
}
1023

1024
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
263,050✔
1025
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
1026
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock) {
1027
  int32_t code = TSDB_CODE_SUCCESS;
263,050✔
1028
  int32_t lino = 0;
263,050✔
1029
  char    stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
263,050✔
1030
  STR_TO_VARSTR(stableName, (*smrSuperTable).me.name);
263,050✔
1031

1032
  int32_t numOfRows = *pNumOfRows;
263,050✔
1033

1034
  int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols;
263,050✔
1035
  for (int32_t i = 0; i < numOfTags; ++i) {
5,207,507✔
1036
    SColumnInfoData* pColInfoData = NULL;
4,948,736✔
1037

1038
    // table name
1039
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
4,948,736✔
1040
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,935,524!
1041
    code = colDataSetVal(pColInfoData, numOfRows, tableName, false);
4,935,524✔
1042
    QUERY_CHECK_CODE(code, lino, _end);
4,913,247!
1043

1044
    // database name
1045
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
4,913,247✔
1046
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,896,281!
1047
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
4,896,281✔
1048
    QUERY_CHECK_CODE(code, lino, _end);
4,883,308!
1049

1050
    // super table name
1051
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
4,883,308✔
1052
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,880,406!
1053
    code = colDataSetVal(pColInfoData, numOfRows, stableName, false);
4,880,406✔
1054
    QUERY_CHECK_CODE(code, lino, _end);
4,874,542!
1055

1056
    // tag name
1057
    char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,874,542✔
1058
    STR_TO_VARSTR(tagName, (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].name);
4,874,542✔
1059
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
4,874,542✔
1060
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,865,884!
1061
    code = colDataSetVal(pColInfoData, numOfRows, tagName, false);
4,865,884✔
1062
    QUERY_CHECK_CODE(code, lino, _end);
4,845,317!
1063

1064
    // tag type
1065
    int8_t tagType = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].type;
4,845,317✔
1066
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
4,845,317✔
1067
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,839,510!
1068
    int32_t tagStrBufflen = 32;
4,839,510✔
1069
    char tagTypeStr[VARSTR_HEADER_SIZE + 32];
1070
    int  tagTypeLen = tsnprintf(varDataVal(tagTypeStr), tagStrBufflen, "%s", tDataTypes[tagType].name);
4,839,510✔
1071
    tagStrBufflen -= tagTypeLen;
4,973,466✔
1072
    if (tagStrBufflen <= 0) {
4,973,466!
1073
      code = TSDB_CODE_INVALID_PARA;
×
1074
      QUERY_CHECK_CODE(code, lino, _end);
×
1075
    }
1076

1077
    if (tagType == TSDB_DATA_TYPE_NCHAR) {
4,973,466✔
1078
      tagTypeLen += tsnprintf(
380✔
1079
          varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
380✔
1080
          (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
380✔
1081
    } else if (IS_VAR_DATA_TYPE(tagType)) {
4,973,086!
1082
      tagTypeLen += tsnprintf(varDataVal(tagTypeStr) + tagTypeLen,  tagStrBufflen, "(%d)",
1,008✔
1083
                            (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE));
5,163✔
1084
    }
1085
    varDataSetLen(tagTypeStr, tagTypeLen);
4,969,311✔
1086
    code = colDataSetVal(pColInfoData, numOfRows, (char*)tagTypeStr, false);
4,969,311✔
1087
    QUERY_CHECK_CODE(code, lino, _end);
4,939,612!
1088

1089
    STagVal tagVal = {0};
4,939,612✔
1090
    tagVal.cid = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].colId;
4,939,612✔
1091
    char*    tagData = NULL;
4,939,612✔
1092
    uint32_t tagLen = 0;
4,939,612✔
1093

1094
    if (tagType == TSDB_DATA_TYPE_JSON) {
4,939,612✔
1095
      tagData = (char*)smrChildTable->me.ctbEntry.pTags;
183✔
1096
    } else {
1097
      bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal);
4,939,429✔
1098
      if (exist) {
4,912,835✔
1099
        if (tagType == TSDB_DATA_TYPE_GEOMETRY) {
4,910,788✔
1100
          code = sysTableGetGeomText(tagVal.pData, tagVal.nData, &tagData, &tagLen);
65✔
1101
          QUERY_CHECK_CODE(code, lino, _end);
65!
1102
        } else if (tagType == TSDB_DATA_TYPE_VARBINARY) {
4,910,723✔
1103
          if (taosAscii2Hex(tagVal.pData, tagVal.nData, (void**)&tagData, &tagLen) < 0) {
229!
1104
            qError("varbinary for systable failed since %s", tstrerror(TSDB_CODE_OUT_OF_MEMORY));
×
1105
          }
1106
        } else if (IS_VAR_DATA_TYPE(tagType)) {
4,910,494!
1107
          tagData = (char*)tagVal.pData;
1,125✔
1108
          tagLen = tagVal.nData;
1,125✔
1109
        } else {
1110
          tagData = (char*)&tagVal.i64;
4,909,369✔
1111
          tagLen = tDataTypes[tagType].bytes;
4,909,369✔
1112
        }
1113
      }
1114
    }
1115

1116
    char* tagVarChar = NULL;
4,913,018✔
1117
    if (tagData != NULL) {
4,913,018✔
1118
      if (tagType == TSDB_DATA_TYPE_JSON) {
4,910,656✔
1119
        char* tagJson = NULL;
183✔
1120
        parseTagDatatoJson(tagData, &tagJson);
183✔
1121
        if (tagJson == NULL) {
183!
1122
          code = terrno;
×
1123
          goto _end;
×
1124
        }
1125
        tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE);
183✔
1126
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
183!
1127
        memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson));
183✔
1128
        varDataSetLen(tagVarChar, strlen(tagJson));
183✔
1129
        taosMemoryFree(tagJson);
183✔
1130
      } else {
1131
        int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE)
4,910,473✔
1132
                                                    : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE);
1133
        tagVarChar = taosMemoryCalloc(1, bufSize + 1);
4,910,473✔
1134
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
4,990,191!
1135
        int32_t len = -1;
4,990,943✔
1136
        if (tagLen > 0)
4,990,943✔
1137
          convertTagDataToStr(varDataVal(tagVarChar), bufSize + 1 - VARSTR_HEADER_SIZE, tagType, tagData, tagLen, &len);
4,990,922✔
1138
        else
1139
          len = 0;
21✔
1140
        varDataSetLen(tagVarChar, len);
4,957,205✔
1141
      }
1142
    }
1143
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
4,959,750✔
1144
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,949,288!
1145
    code = colDataSetVal(pColInfoData, numOfRows, tagVarChar,
4,949,624✔
1146
                         (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData)));
4,949,624✔
1147
    QUERY_CHECK_CODE(code, lino, _end);
4,917,379!
1148

1149
    if (tagType == TSDB_DATA_TYPE_GEOMETRY || tagType == TSDB_DATA_TYPE_VARBINARY) taosMemoryFreeClear(tagData);
4,917,379!
1150
    taosMemoryFree(tagVarChar);
4,917,379✔
1151
    ++numOfRows;
4,944,457✔
1152
  }
1153

1154
  *pNumOfRows = numOfRows;
258,771✔
1155

1156
_end:
258,771✔
1157
  if (code != TSDB_CODE_SUCCESS) {
258,771!
1158
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1159
  }
1160
  return code;
263,102✔
1161
}
1162

1163
static int32_t sysTableUserColsFillOneTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
262,934✔
1164
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
1165
                                                char* tableType) {
1166
  int32_t code = TSDB_CODE_SUCCESS;
262,934✔
1167
  int32_t lino = 0;
262,934✔
1168
  if (schemaRow == NULL) {
262,934!
1169
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1170
    return TSDB_CODE_SUCCESS;
×
1171
  }
1172
  int32_t numOfRows = *pNumOfRows;
262,934✔
1173

1174
  int32_t numOfCols = schemaRow->nCols;
262,934✔
1175
  for (int32_t i = 0; i < numOfCols; ++i) {
6,367,873✔
1176
    SColumnInfoData* pColInfoData = NULL;
5,979,328✔
1177

1178
    // table name
1179
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
5,979,328✔
1180
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,979,635!
1181
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
5,979,635✔
1182
    QUERY_CHECK_CODE(code, lino, _end);
5,997,184!
1183

1184
    // database name
1185
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
5,997,184✔
1186
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,981,883!
1187
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
5,981,883✔
1188
    QUERY_CHECK_CODE(code, lino, _end);
5,975,954!
1189

1190
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
5,975,954✔
1191
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,967,003!
1192
    code = colDataSetVal(pColInfoData, numOfRows, tableType, false);
5,967,003✔
1193
    QUERY_CHECK_CODE(code, lino, _end);
5,931,469!
1194

1195
    // col name
1196
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
5,931,469✔
1197
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
5,931,469✔
1198
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
5,931,469✔
1199
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,002,370!
1200
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
6,002,370✔
1201
    QUERY_CHECK_CODE(code, lino, _end);
6,012,496!
1202

1203
    // col type
1204
    int8_t colType = schemaRow->pSchema[i].type;
6,012,496✔
1205
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
6,012,496✔
1206
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,011,129!
1207
    int32_t colStrBufflen = 32;
6,011,129✔
1208
    char colTypeStr[VARSTR_HEADER_SIZE + 32];
1209
    int  colTypeLen = tsnprintf(varDataVal(colTypeStr), colStrBufflen, "%s", tDataTypes[colType].name);
6,011,129✔
1210
    colStrBufflen -= colTypeLen;
6,267,257✔
1211
    if (colStrBufflen <= 0) {
6,267,257!
1212
      code = TSDB_CODE_INVALID_PARA;
×
1213
      QUERY_CHECK_CODE(code, lino, _end);
×
1214
    }
1215
    if (colType == TSDB_DATA_TYPE_VARCHAR) {
6,267,257✔
1216
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
53,574✔
1217
                            (int32_t)(schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE));
53,577✔
1218
    } else if (colType == TSDB_DATA_TYPE_NCHAR) {
6,213,680✔
1219
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
8✔
1220
                            (int32_t)((schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
8✔
1221
    }
1222
    varDataSetLen(colTypeStr, colTypeLen);
6,267,254✔
1223
    code = colDataSetVal(pColInfoData, numOfRows, (char*)colTypeStr, false);
6,267,254✔
1224
    QUERY_CHECK_CODE(code, lino, _end);
6,200,447!
1225

1226
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
6,200,447✔
1227
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,190,380!
1228
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].bytes, false);
6,190,380✔
1229
    QUERY_CHECK_CODE(code, lino, _end);
6,128,312!
1230

1231
    for (int32_t j = 6; j <= 8; ++j) {
23,568,464✔
1232
      pColInfoData = taosArrayGet(dataBlock->pDataBlock, j);
17,463,525✔
1233
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
17,437,161!
1234
      colDataSetNULL(pColInfoData, numOfRows);
17,440,152!
1235
    }
1236
    ++numOfRows;
6,104,939✔
1237
  }
1238

1239
  *pNumOfRows = numOfRows;
388,545✔
1240

1241
_end:
388,545✔
1242
  if (code != TSDB_CODE_SUCCESS) {
388,545!
1243
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1244
  }
1245
  return code;
262,602✔
1246
}
1247

1248
static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName) {
21,734✔
1249
  size_t               size = 0;
21,734✔
1250
  const SSysTableMeta* pMeta = NULL;
21,734✔
1251
  getInfosDbMeta(&pMeta, &size);
21,734✔
1252

1253
  int32_t index = 0;
21,769✔
1254
  for (int32_t i = 0; i < size; ++i) {
248,194!
1255
    if (strcmp(pMeta[i].name, tableName) == 0) {
248,195✔
1256
      index = i;
21,770✔
1257
      break;
21,770✔
1258
    }
1259
  }
1260

1261
  SSDataBlock* pBlock = NULL;
21,769✔
1262
  int32_t      code = createDataBlock(&pBlock);
21,769✔
1263
  if (code) {
21,770!
1264
    terrno = code;
×
1265
    return NULL;
×
1266
  }
1267

1268
  for (int32_t i = 0; i < pMeta[index].colNum; ++i) {
216,097✔
1269
    SColumnInfoData colInfoData =
1270
        createColumnInfoData(pMeta[index].schema[i].type, pMeta[index].schema[i].bytes, i + 1);
194,312✔
1271
    code = blockDataAppendColInfo(pBlock, &colInfoData);
194,426✔
1272
    if (code != TSDB_CODE_SUCCESS) {
194,324!
1273
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1274
      blockDataDestroy(pBlock);
×
1275
      pBlock = NULL;
×
1276
      terrno = code;
×
1277
      break;
×
1278
    }
1279
  }
1280

1281
  return pBlock;
21,772✔
1282
}
1283

1284
int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta, size_t size,
596✔
1285
                              const char* dbName, int64_t* pRows) {
1286
  int32_t code = TSDB_CODE_SUCCESS;
596✔
1287
  int32_t lino = 0;
596✔
1288
  char    n[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
596✔
1289
  int32_t numOfRows = p->info.rows;
596✔
1290

1291
  for (int32_t i = 0; i < size; ++i) {
12,516✔
1292
    const SSysTableMeta* pm = &pSysDbTableMeta[i];
11,920✔
1293
    if (!sysInfo && pm->sysInfo) {
11,920✔
1294
      continue;
76✔
1295
    }
1296

1297
    if (strcmp(pm->name, TSDB_INS_TABLE_USERS_FULL) == 0) {
11,844✔
1298
      continue;
294✔
1299
    }
1300

1301
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
11,550✔
1302
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
11,550!
1303

1304
    STR_TO_VARSTR(n, pm->name);
11,550✔
1305
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
11,550✔
1306
    QUERY_CHECK_CODE(code, lino, _end);
11,550!
1307

1308
    // database name
1309
    STR_TO_VARSTR(n, dbName);
11,550✔
1310
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
11,550✔
1311
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
11,550!
1312
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
11,550✔
1313
    QUERY_CHECK_CODE(code, lino, _end);
11,550!
1314

1315
    // create time
1316
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
11,550✔
1317
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
11,550!
1318
    colDataSetNULL(pColInfoData, numOfRows);
11,550!
1319

1320
    // number of columns
1321
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
11,550✔
1322
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
11,550!
1323
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&pm->colNum, false);
11,550✔
1324
    QUERY_CHECK_CODE(code, lino, _end);
11,550!
1325

1326
    for (int32_t j = 4; j <= 8; ++j) {
69,300✔
1327
      pColInfoData = taosArrayGet(p->pDataBlock, j);
57,750✔
1328
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
57,750!
1329
      colDataSetNULL(pColInfoData, numOfRows);
57,750✔
1330
    }
1331

1332
    STR_TO_VARSTR(n, "SYSTEM_TABLE");
11,550✔
1333

1334
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
11,550✔
1335
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
11,550!
1336
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
11,550✔
1337
    QUERY_CHECK_CODE(code, lino, _end);
11,550!
1338

1339
    numOfRows += 1;
11,550✔
1340
  }
1341

1342
  *pRows = numOfRows;
596✔
1343

1344
_end:
596✔
1345
  if (code != TSDB_CODE_SUCCESS) {
596!
1346
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1347
  }
1348
  return code;
596✔
1349
}
1350

1351
int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
298✔
1352
  int32_t      code = TSDB_CODE_SUCCESS;
298✔
1353
  int32_t      lino = 0;
298✔
1354
  SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
298✔
1355
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
298!
1356

1357
  code = blockDataEnsureCapacity(p, capacity);
298✔
1358
  QUERY_CHECK_CODE(code, lino, _end);
298!
1359

1360
  size_t               size = 0;
298✔
1361
  const SSysTableMeta* pSysDbTableMeta = NULL;
298✔
1362

1363
  getInfosDbMeta(&pSysDbTableMeta, &size);
298✔
1364
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, &p->info.rows);
298✔
1365
  QUERY_CHECK_CODE(code, lino, _end);
298!
1366

1367
  getPerfDbMeta(&pSysDbTableMeta, &size);
298✔
1368
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, &p->info.rows);
298✔
1369
  QUERY_CHECK_CODE(code, lino, _end);
298!
1370

1371
  pInfo->pRes->info.rows = p->info.rows;
298✔
1372
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
298✔
1373
  QUERY_CHECK_CODE(code, lino, _end);
298!
1374

1375
  blockDataDestroy(p);
298✔
1376
  p = NULL;
298✔
1377

1378
_end:
298✔
1379
  if (code != TSDB_CODE_SUCCESS) {
298!
1380
    blockDataDestroy(p);
×
1381
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1382
  }
1383
  return code;
298✔
1384
}
1385

1386
static int32_t doSetUserTableMetaInfo(SStoreMetaReader* pMetaReaderFn, SStoreMeta* pMetaFn, void* pVnode,
40,000✔
1387
                                      SMetaReader* pMReader, int64_t uid, const char* dbname, int32_t vgId,
1388
                                      SSDataBlock* p, int32_t rowIndex, const char* idStr) {
1389
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
40,000✔
1390
  int32_t lino = 0;
40,000✔
1391
  int32_t code = pMetaReaderFn->getTableEntryByUid(pMReader, uid);
40,000✔
1392
  if (code < 0) {
39,990!
1393
    qError("failed to get table meta, uid:%" PRId64 ", code:%s, %s", uid, tstrerror(terrno), idStr);
×
1394
    return code;
×
1395
  }
1396

1397
  STR_TO_VARSTR(n, pMReader->me.name);
39,990✔
1398

1399
  // table name
1400
  SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
39,990✔
1401
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,990!
1402

1403
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
39,990✔
1404
  QUERY_CHECK_CODE(code, lino, _end);
39,988!
1405

1406
  // database name
1407
  pColInfoData = taosArrayGet(p->pDataBlock, 1);
39,988✔
1408
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,988!
1409
  code = colDataSetVal(pColInfoData, rowIndex, dbname, false);
39,988✔
1410
  QUERY_CHECK_CODE(code, lino, _end);
39,984!
1411

1412
  // vgId
1413
  pColInfoData = taosArrayGet(p->pDataBlock, 6);
39,984✔
1414
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,984!
1415
  code = colDataSetVal(pColInfoData, rowIndex, (char*)&vgId, false);
39,984✔
1416
  QUERY_CHECK_CODE(code, lino, _end);
39,983!
1417

1418
  int32_t tableType = pMReader->me.type;
39,983✔
1419
  if (tableType == TSDB_CHILD_TABLE) {
39,983!
1420
    // create time
1421
    int64_t ts = pMReader->me.ctbEntry.btime;
39,985✔
1422
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
39,985✔
1423
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,983!
1424
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
39,983✔
1425
    QUERY_CHECK_CODE(code, lino, _end);
39,982!
1426

1427
    SMetaReader mr1 = {0};
39,982✔
1428
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
39,982✔
1429

1430
    int64_t suid = pMReader->me.ctbEntry.suid;
39,995✔
1431
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
39,995✔
1432
    if (code != TSDB_CODE_SUCCESS) {
39,987!
1433
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
1434
             tstrerror(code), idStr);
1435
      pMetaReaderFn->clearReader(&mr1);
×
1436
      QUERY_CHECK_CODE(code, lino, _end);
×
1437
    }
1438

1439
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
39,987✔
1440
    if (pColInfoData == NULL) {
39,986!
1441
      pMetaReaderFn->clearReader(&mr1);
×
1442
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1443
    }
1444

1445
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
39,986✔
1446
    if (code != 0) {
39,983!
1447
      pMetaReaderFn->clearReader(&mr1);
×
1448
      QUERY_CHECK_CODE(code, lino, _end);
×
1449
    }
1450

1451
    // super table name
1452
    STR_TO_VARSTR(n, mr1.me.name);
39,983✔
1453
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
39,983✔
1454
    if (pColInfoData == NULL) {
39,976!
1455
      pMetaReaderFn->clearReader(&mr1);
×
1456
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1457
    }
1458

1459
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
39,976✔
1460
    pMetaReaderFn->clearReader(&mr1);
39,973✔
1461
    QUERY_CHECK_CODE(code, lino, _end);
39,997!
1462

1463
    // table comment
1464
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
39,997✔
1465
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,997!
1466
    if (pMReader->me.ctbEntry.commentLen > 0) {
39,997!
1467
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1468
      STR_TO_VARSTR(comment, pMReader->me.ctbEntry.comment);
×
1469
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1470
      QUERY_CHECK_CODE(code, lino, _end);
×
1471
    } else if (pMReader->me.ctbEntry.commentLen == 0) {
39,997!
1472
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1473
      STR_TO_VARSTR(comment, "");
×
1474
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1475
      QUERY_CHECK_CODE(code, lino, _end);
×
1476
    } else {
1477
      colDataSetNULL(pColInfoData, rowIndex);
39,997!
1478
    }
1479

1480
    // uid
1481
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
39,997✔
1482
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,987!
1483
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
39,987✔
1484
    QUERY_CHECK_CODE(code, lino, _end);
39,983!
1485

1486
    // ttl
1487
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
39,983✔
1488
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,984!
1489
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ctbEntry.ttlDays, false);
39,984✔
1490
    QUERY_CHECK_CODE(code, lino, _end);
39,985!
1491

1492
    STR_TO_VARSTR(n, "CHILD_TABLE");
39,985✔
1493

1494
  } else if (tableType == TSDB_NORMAL_TABLE) {
×
1495
    // create time
1496
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1497
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1498
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1499
    QUERY_CHECK_CODE(code, lino, _end);
×
1500

1501
    // number of columns
1502
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1503
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1504

1505
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.schemaRow.nCols, false);
×
1506
    QUERY_CHECK_CODE(code, lino, _end);
×
1507

1508
    // super table name
1509
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1510
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1511
    colDataSetNULL(pColInfoData, rowIndex);
×
1512

1513
    // table comment
1514
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1515
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1516
    if (pMReader->me.ntbEntry.commentLen > 0) {
×
1517
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1518
      STR_TO_VARSTR(comment, pMReader->me.ntbEntry.comment);
×
1519
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1520
      QUERY_CHECK_CODE(code, lino, _end);
×
1521
    } else if (pMReader->me.ntbEntry.commentLen == 0) {
×
1522
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1523
      STR_TO_VARSTR(comment, "");
×
1524
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1525
      QUERY_CHECK_CODE(code, lino, _end);
×
1526
    } else {
1527
      colDataSetNULL(pColInfoData, rowIndex);
×
1528
    }
1529

1530
    // uid
1531
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
1532
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1533
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
1534
    QUERY_CHECK_CODE(code, lino, _end);
×
1535

1536
    // ttl
1537
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
1538
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1539
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.ttlDays, false);
×
1540
    QUERY_CHECK_CODE(code, lino, _end);
×
1541

1542
    STR_TO_VARSTR(n, "NORMAL_TABLE");
×
1543
    // impl later
1544
  }
1545

1546
_end:
×
1547
  qError("%s failed at line %d since %s, %s", __func__, lino, tstrerror(code), idStr);
39,983!
1548
  return code;
40,000✔
1549
}
1550

1551
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
14✔
1552
  int32_t            code = TSDB_CODE_SUCCESS;
14✔
1553
  int32_t            lino = 0;
14✔
1554
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
14✔
1555
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
14✔
1556
  SSysTableScanInfo* pInfo = pOperator->info;
14✔
1557
  SSysTableIndex*    pIdx = pInfo->pIdx;
14✔
1558
  SSDataBlock*       p = NULL;
14✔
1559
  blockDataCleanup(pInfo->pRes);
14✔
1560
  int32_t numOfRows = 0;
14✔
1561

1562
  int ret = 0;
14✔
1563

1564
  const char* db = NULL;
14✔
1565
  int32_t     vgId = 0;
14✔
1566
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
14✔
1567

1568
  SName sn = {0};
14✔
1569
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
14✔
1570
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
14✔
1571
  QUERY_CHECK_CODE(code, lino, _end);
14!
1572

1573
  code = tNameGetDbName(&sn, varDataVal(dbname));
14✔
1574
  QUERY_CHECK_CODE(code, lino, _end);
14!
1575

1576
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
14✔
1577

1578
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
14✔
1579
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
14!
1580

1581
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
14✔
1582
  QUERY_CHECK_CODE(code, lino, _end);
14!
1583

1584
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
14✔
1585
  int32_t i = pIdx->lastIdx;
14✔
1586
  for (; i < taosArrayGetSize(pIdx->uids); i++) {
40,006✔
1587
    tb_uid_t* uid = taosArrayGet(pIdx->uids, i);
40,000✔
1588
    QUERY_CHECK_NULL(uid, code, lino, _end, terrno);
40,000!
1589

1590
    SMetaReader mr = {0};
40,000✔
1591
    pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
40,000✔
1592
    code = doSetUserTableMetaInfo(&pAPI->metaReaderFn, &pAPI->metaFn, pInfo->readHandle.vnode, &mr, *uid, dbname, vgId,
40,000✔
1593
                                  p, numOfRows, GET_TASKID(pTaskInfo));
40,000✔
1594

1595
    pAPI->metaReaderFn.clearReader(&mr);
40,000✔
1596
    QUERY_CHECK_CODE(code, lino, _end);
40,000!
1597

1598
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 9);
40,000✔
1599
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
40,000!
1600

1601
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
40,000✔
1602
    QUERY_CHECK_CODE(code, lino, _end);
40,000!
1603

1604
    if (++numOfRows >= pOperator->resultInfo.capacity) {
40,000✔
1605
      p->info.rows = numOfRows;
8✔
1606
      pInfo->pRes->info.rows = numOfRows;
8✔
1607

1608
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
8✔
1609
      QUERY_CHECK_CODE(code, lino, _end);
8!
1610

1611
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
8✔
1612
      QUERY_CHECK_CODE(code, lino, _end);
8!
1613

1614
      blockDataCleanup(p);
8✔
1615
      numOfRows = 0;
8✔
1616

1617
      if (pInfo->pRes->info.rows > 0) {
8!
1618
        break;
8✔
1619
      }
1620
    }
1621
  }
1622

1623
  if (numOfRows > 0) {
14✔
1624
    p->info.rows = numOfRows;
6✔
1625
    pInfo->pRes->info.rows = numOfRows;
6✔
1626

1627
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
6✔
1628
    QUERY_CHECK_CODE(code, lino, _end);
6!
1629

1630
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
6✔
1631
    QUERY_CHECK_CODE(code, lino, _end);
6!
1632

1633
    blockDataCleanup(p);
6✔
1634
    numOfRows = 0;
6✔
1635
  }
1636

1637
  if (i >= taosArrayGetSize(pIdx->uids)) {
14✔
1638
    setOperatorCompleted(pOperator);
6✔
1639
  } else {
1640
    pIdx->lastIdx = i + 1;
8✔
1641
  }
1642

1643
  blockDataDestroy(p);
14✔
1644
  p = NULL;
14✔
1645

1646
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
14✔
1647

1648
_end:
14✔
1649
  if (code != TSDB_CODE_SUCCESS) {
14!
1650
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1651
    blockDataDestroy(p);
×
1652
    pTaskInfo->code = code;
×
1653
    T_LONG_JMP(pTaskInfo->env, code);
×
1654
  }
1655
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
14!
1656
}
1657

1658
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
5,001✔
1659
  int32_t        code = TSDB_CODE_SUCCESS;
5,001✔
1660
  int32_t        lino = 0;
5,001✔
1661
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
5,001✔
1662
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
5,001✔
1663
  int8_t         firstMetaCursor = 0;
5,001✔
1664
  SSDataBlock*   p = NULL;
5,001✔
1665

1666
  SSysTableScanInfo* pInfo = pOperator->info;
5,001✔
1667
  if (pInfo->pCur == NULL) {
5,001!
1668
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
5,002✔
1669
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
5,003!
1670
    firstMetaCursor = 1;
5,008✔
1671
  }
1672
  if (!firstMetaCursor) {
5,007!
1673
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
×
1674
    if (code != 0) {
×
1675
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1676
      pInfo->pCur = NULL;
×
1677
      QUERY_CHECK_CODE(code, lino, _end);
×
1678
    }
1679
  }
1680

1681
  blockDataCleanup(pInfo->pRes);
5,007✔
1682
  int32_t numOfRows = 0;
5,011✔
1683

1684
  const char* db = NULL;
5,011✔
1685
  int32_t     vgId = 0;
5,011✔
1686
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
5,011✔
1687

1688
  SName sn = {0};
5,011✔
1689
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
5,011✔
1690
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
5,011✔
1691
  QUERY_CHECK_CODE(code, lino, _end);
5,009!
1692

1693
  code = tNameGetDbName(&sn, varDataVal(dbname));
5,009✔
1694
  QUERY_CHECK_CODE(code, lino, _end);
5,009!
1695

1696
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
5,009✔
1697

1698
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
5,009✔
1699
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
5,006!
1700

1701
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
5,006✔
1702
  QUERY_CHECK_CODE(code, lino, _end);
5,008!
1703

1704
  char n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
5,008✔
1705

1706
  int32_t ret = 0;
5,008✔
1707
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
130,563✔
1708
    STR_TO_VARSTR(n, pInfo->pCur->mr.me.name);
125,499✔
1709

1710
    // table name
1711
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
125,499✔
1712
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
125,499!
1713
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
125,499✔
1714
    QUERY_CHECK_CODE(code, lino, _end);
125,505!
1715

1716
    // database name
1717
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
125,505✔
1718
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
125,500!
1719
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
125,500✔
1720
    QUERY_CHECK_CODE(code, lino, _end);
125,511!
1721

1722
    // vgId
1723
    pColInfoData = taosArrayGet(p->pDataBlock, 6);
125,511✔
1724
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
125,510!
1725
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
125,510✔
1726
    QUERY_CHECK_CODE(code, lino, _end);
125,501!
1727

1728
    int32_t tableType = pInfo->pCur->mr.me.type;
125,501✔
1729
    if (tableType == TSDB_CHILD_TABLE) {
125,501✔
1730
      // create time
1731
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
90,607✔
1732
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
90,607✔
1733
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,608!
1734
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
90,608✔
1735
      QUERY_CHECK_CODE(code, lino, _end);
90,602!
1736

1737
      SMetaReader mr = {0};
90,602✔
1738
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
90,602✔
1739

1740
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
90,631✔
1741
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
90,631✔
1742
      if (code != TSDB_CODE_SUCCESS) {
90,623!
1743
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
1744
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
1745
        pAPI->metaReaderFn.clearReader(&mr);
×
1746
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1747
        pInfo->pCur = NULL;
×
1748
        blockDataDestroy(p);
×
1749
        T_LONG_JMP(pTaskInfo->env, terrno);
×
1750
      }
1751

1752
      if (isTsmaResSTb(mr.me.name)) {
90,623!
1753
        pAPI->metaReaderFn.clearReader(&mr);
×
1754
        continue;
×
1755
      }
1756

1757
      // number of columns
1758
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
90,621✔
1759
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,619!
1760
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
90,619✔
1761
      QUERY_CHECK_CODE(code, lino, _end);
90,623!
1762

1763
      // super table name
1764
      STR_TO_VARSTR(n, mr.me.name);
90,623✔
1765
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
90,623✔
1766
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,623!
1767
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
90,623✔
1768
      QUERY_CHECK_CODE(code, lino, _end);
90,630!
1769
      pAPI->metaReaderFn.clearReader(&mr);
90,630✔
1770

1771
      // table comment
1772
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
90,647✔
1773
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,645!
1774
      if (pInfo->pCur->mr.me.ctbEntry.commentLen > 0) {
90,645✔
1775
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
109✔
1776
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ctbEntry.comment);
109✔
1777
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
109✔
1778
        QUERY_CHECK_CODE(code, lino, _end);
109!
1779
      } else if (pInfo->pCur->mr.me.ctbEntry.commentLen == 0) {
90,536✔
1780
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
11,610✔
1781
        STR_TO_VARSTR(comment, "");
11,610✔
1782
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
11,610✔
1783
        QUERY_CHECK_CODE(code, lino, _end);
11,610!
1784
      } else {
1785
        colDataSetNULL(pColInfoData, numOfRows);
78,926!
1786
      }
1787

1788
      // uid
1789
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
90,645✔
1790
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,633!
1791
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
90,633✔
1792
      QUERY_CHECK_CODE(code, lino, _end);
90,638!
1793

1794
      // ttl
1795
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
90,638✔
1796
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
90,636!
1797
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ctbEntry.ttlDays, false);
90,636✔
1798
      QUERY_CHECK_CODE(code, lino, _end);
90,634!
1799

1800
      STR_TO_VARSTR(n, "CHILD_TABLE");
90,634✔
1801
    } else if (tableType == TSDB_NORMAL_TABLE) {
34,894!
1802
      // create time
1803
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
34,927✔
1804
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,927!
1805
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
34,927✔
1806
      QUERY_CHECK_CODE(code, lino, _end);
34,926!
1807

1808
      // number of columns
1809
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
34,926✔
1810
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,926!
1811
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
34,926✔
1812
      QUERY_CHECK_CODE(code, lino, _end);
34,926!
1813

1814
      // super table name
1815
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
34,926✔
1816
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,926!
1817
      colDataSetNULL(pColInfoData, numOfRows);
34,926!
1818

1819
      // table comment
1820
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
34,926✔
1821
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,926!
1822
      if (pInfo->pCur->mr.me.ntbEntry.commentLen > 0) {
34,926✔
1823
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
96✔
1824
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ntbEntry.comment);
96✔
1825
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
96✔
1826
        QUERY_CHECK_CODE(code, lino, _end);
96!
1827
      } else if (pInfo->pCur->mr.me.ntbEntry.commentLen == 0) {
34,830✔
1828
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
104✔
1829
        STR_TO_VARSTR(comment, "");
104✔
1830
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
104✔
1831
        QUERY_CHECK_CODE(code, lino, _end);
104!
1832
      } else {
1833
        colDataSetNULL(pColInfoData, numOfRows);
34,726!
1834
      }
1835

1836
      // uid
1837
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
34,926✔
1838
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,926!
1839
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
34,926✔
1840
      QUERY_CHECK_CODE(code, lino, _end);
34,925!
1841

1842
      // ttl
1843
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
34,925✔
1844
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
34,925!
1845
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.ttlDays, false);
34,925✔
1846
      QUERY_CHECK_CODE(code, lino, _end);
34,925!
1847

1848
      STR_TO_VARSTR(n, "NORMAL_TABLE");
34,925✔
1849
    }
1850

1851
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
125,526✔
1852
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
125,542!
1853
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
125,542✔
1854
    QUERY_CHECK_CODE(code, lino, _end);
125,555!
1855

1856
    if (++numOfRows >= pOperator->resultInfo.capacity) {
125,555!
1857
      p->info.rows = numOfRows;
×
1858
      pInfo->pRes->info.rows = numOfRows;
×
1859

1860
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
1861
      QUERY_CHECK_CODE(code, lino, _end);
×
1862

1863
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
1864
      QUERY_CHECK_CODE(code, lino, _end);
×
1865

1866
      blockDataCleanup(p);
×
1867
      numOfRows = 0;
×
1868

1869
      if (pInfo->pRes->info.rows > 0) {
×
1870
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
1871
        break;
×
1872
      }
1873
    }
1874
  }
1875

1876
  if (numOfRows > 0) {
5,008✔
1877
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
4,509✔
1878
    p->info.rows = numOfRows;
4,509✔
1879
    pInfo->pRes->info.rows = numOfRows;
4,509✔
1880

1881
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
4,509✔
1882
    QUERY_CHECK_CODE(code, lino, _end);
4,509!
1883

1884
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
4,509✔
1885
    QUERY_CHECK_CODE(code, lino, _end);
4,508!
1886

1887
    blockDataCleanup(p);
4,508✔
1888
    numOfRows = 0;
4,507✔
1889
  }
1890

1891
  blockDataDestroy(p);
5,006✔
1892
  p = NULL;
5,014✔
1893

1894
  // todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
1895
  if (ret != 0) {
5,014!
1896
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
5,014✔
1897
    pInfo->pCur = NULL;
5,015✔
1898
    setOperatorCompleted(pOperator);
5,015✔
1899
  }
1900

1901
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
5,014✔
1902

1903
_end:
5,014✔
1904
  if (code != TSDB_CODE_SUCCESS) {
5,014!
1905
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1906
    blockDataDestroy(p);
×
1907
    pTaskInfo->code = code;
×
1908
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1909
    pInfo->pCur = NULL;
×
1910
    T_LONG_JMP(pTaskInfo->env, code);
×
1911
  }
1912
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
5,014✔
1913
}
1914

1915
static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
9,604✔
1916
  int32_t            code = TSDB_CODE_SUCCESS;
9,604✔
1917
  int32_t            lino = 0;
9,604✔
1918
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
9,604✔
1919
  SSysTableScanInfo* pInfo = pOperator->info;
9,604✔
1920

1921
  SNode* pCondition = pInfo->pCondition;
9,604✔
1922
  if (pOperator->status == OP_EXEC_DONE) {
9,604✔
1923
    return NULL;
4,286✔
1924
  }
1925

1926
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
1927
  if (pInfo->readHandle.mnd != NULL) {
5,318✔
1928
    code = buildSysDbTableInfo(pInfo, pOperator->resultInfo.capacity);
298✔
1929
    QUERY_CHECK_CODE(code, lino, _end);
298!
1930

1931
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
298✔
1932
    QUERY_CHECK_CODE(code, lino, _end);
298!
1933
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
298✔
1934

1935
    setOperatorCompleted(pOperator);
298✔
1936
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
298✔
1937
  } else {
1938
    if (pInfo->showRewrite == false) {
5,020✔
1939
      if (pCondition != NULL && pInfo->pIdx == NULL) {
4,709✔
1940
        SSTabFltArg arg = {
2,322✔
1941
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
2,322✔
1942

1943
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
2,322✔
1944
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
2,322!
1945
        idx->init = 0;
2,322✔
1946
        idx->uids = taosArrayInit(128, sizeof(int64_t));
2,322✔
1947
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
2,322!
1948
        idx->lastIdx = 0;
2,322✔
1949

1950
        pInfo->pIdx = idx;  // set idx arg
2,322✔
1951

1952
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
2,322✔
1953
        if (flt == 0) {
2,317✔
1954
          pInfo->pIdx->init = 1;
6✔
1955
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
6✔
1956
          return blk;
6✔
1957
        } else if ((flt == -1) || (flt == -2)) {
2,311!
1958
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
2,311✔
1959
        }
1960
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
79!
1961
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
8✔
1962
        return blk;
8✔
1963
      }
1964
    }
1965

1966
    return sysTableBuildUserTables(pOperator);
4,998✔
1967
  }
1968

1969
_end:
×
1970
  if (code != TSDB_CODE_SUCCESS) {
×
1971
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1972
    pTaskInfo->code = code;
×
1973
    T_LONG_JMP(pTaskInfo->env, code);
×
1974
  }
1975
  return NULL;
×
1976
}
1977

1978
static SSDataBlock* sysTableScanUserSTables(SOperatorInfo* pOperator) {
×
1979
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
1980
  SSysTableScanInfo* pInfo = pOperator->info;
×
1981
  if (pOperator->status == OP_EXEC_DONE) {
×
1982
    return NULL;
×
1983
  }
1984

1985
  pInfo->pRes->info.rows = 0;
×
1986
  pOperator->status = OP_EXEC_DONE;
×
1987

1988
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
1989
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
1990
}
1991

1992
static int32_t getSysTableDbNameColId(const char* pTable) {
11,881✔
1993
  // if (0 == strcmp(TSDB_INS_TABLE_INDEXES, pTable)) {
1994
  //   return 1;
1995
  // }
1996
  return TSDB_INS_USER_STABLES_DBNAME_COLID;
11,881✔
1997
}
1998

1999
static EDealRes getDBNameFromConditionWalker(SNode* pNode, void* pContext) {
64,941✔
2000
  int32_t   code = TSDB_CODE_SUCCESS;
64,941✔
2001
  ENodeType nType = nodeType(pNode);
64,941✔
2002

2003
  switch (nType) {
64,941✔
2004
    case QUERY_NODE_OPERATOR: {
38,914✔
2005
      SOperatorNode* node = (SOperatorNode*)pNode;
38,914✔
2006
      if (OP_TYPE_EQUAL == node->opType) {
38,914✔
2007
        *(int32_t*)pContext = 1;
11,881✔
2008
        return DEAL_RES_CONTINUE;
11,881✔
2009
      }
2010

2011
      *(int32_t*)pContext = 0;
27,033✔
2012
      return DEAL_RES_IGNORE_CHILD;
27,033✔
2013
    }
2014
    case QUERY_NODE_COLUMN: {
11,882✔
2015
      if (1 != *(int32_t*)pContext) {
11,882!
2016
        return DEAL_RES_CONTINUE;
×
2017
      }
2018

2019
      SColumnNode* node = (SColumnNode*)pNode;
11,882✔
2020
      if (getSysTableDbNameColId(node->tableName) == node->colId) {
11,882✔
2021
        *(int32_t*)pContext = 2;
9,699✔
2022
        return DEAL_RES_CONTINUE;
9,699✔
2023
      }
2024

2025
      *(int32_t*)pContext = 0;
2,182✔
2026
      return DEAL_RES_CONTINUE;
2,182✔
2027
    }
2028
    case QUERY_NODE_VALUE: {
11,883✔
2029
      if (2 != *(int32_t*)pContext) {
11,883✔
2030
        return DEAL_RES_CONTINUE;
2,183✔
2031
      }
2032

2033
      SValueNode* node = (SValueNode*)pNode;
9,700✔
2034
      char*       dbName = nodesGetValueFromNode(node);
9,700✔
2035
      tstrncpy((char*)pContext, varDataVal(dbName), TSDB_DB_NAME_LEN);
9,700✔
2036
      return DEAL_RES_END;  // stop walk
9,700✔
2037
    }
2038
    default:
2,262✔
2039
      break;
2,262✔
2040
  }
2041
  return DEAL_RES_CONTINUE;
2,262✔
2042
}
2043

2044
static void getDBNameFromCondition(SNode* pCondition, const char* dbName) {
42,259✔
2045
  if (NULL == pCondition) {
42,259✔
2046
    return;
3,402✔
2047
  }
2048
  nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName);
38,857✔
2049
}
2050

2051
static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
56,701✔
2052
  // build message and send to mnode to fetch the content of system tables.
2053
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
56,701✔
2054
  SSysTableScanInfo* pInfo = pOperator->info;
56,701✔
2055
  char               dbName[TSDB_DB_NAME_LEN] = {0};
56,701✔
2056

2057
  while (1) {
2✔
2058
    if (isTaskKilled(pOperator->pTaskInfo)) {
56,703!
2059
      setOperatorCompleted(pOperator);
×
2060
      (*ppRes) = NULL;
×
2061
      break;
×
2062
    }
2063

2064
    blockDataCleanup(pInfo->pRes);
56,738✔
2065

2066
    const char* name = tNameGetTableName(&pInfo->name);
56,757✔
2067
    if (pInfo->showRewrite) {
56,760✔
2068
      getDBNameFromCondition(pInfo->pCondition, dbName);
13,131✔
2069
      if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
13,129✔
2070
          strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
13,020!
2071
        TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
13,024✔
2072
      }
2073
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
43,629✔
2074
      getDBNameFromCondition(pInfo->pCondition, dbName);
29,133✔
2075
      if (dbName[0]) TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
29,132✔
2076
      (void)sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
29,132✔
2077
    }
2078

2079
    SSDataBlock* pBlock = NULL;
56,745✔
2080
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
56,745✔
2081
      pBlock = sysTableScanUserTables(pOperator);
9,603✔
2082
    } else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
47,142✔
2083
      pBlock = sysTableScanUserTags(pOperator);
3,199✔
2084
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
43,943✔
2085
      pBlock = sysTableScanUserCols(pOperator);
22,293✔
2086
    } else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
21,650✔
2087
               IS_SYS_DBNAME(dbName)) {
1,361!
2088
      pBlock = sysTableScanUserSTables(pOperator);
×
2089
    } else {  // load the meta from mnode of the given epset
2090
      pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
21,650✔
2091
    }
2092

2093
    sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
56,756✔
2094
    if (pBlock != NULL) {
56,757✔
2095
      bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
21,461✔
2096
      if (limitReached) {
21,460✔
2097
        setOperatorCompleted(pOperator);
103✔
2098
      }
2099

2100
      if (pBlock->info.rows == 0) {
21,460✔
2101
        continue;
2✔
2102
      }
2103
      (*ppRes) = pBlock;
21,458✔
2104
    } else {
2105
      (*ppRes) = NULL;
35,296✔
2106
    }
2107
    break;
56,754✔
2108
  }
2109

2110
_end:
56,754✔
2111
  if (pTaskInfo->code) {
56,754✔
2112
    qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code));
11!
2113
    T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
11!
2114
  }
2115
  return pTaskInfo->code;
56,743✔
2116
}
2117

2118
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
56,755✔
2119
                                   SSDataBlock* pBlock) {
2120
  int32_t        code = TSDB_CODE_SUCCESS;
56,755✔
2121
  int32_t        lino = 0;
56,755✔
2122
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
56,755✔
2123
  if (pBlock == NULL) {
56,755✔
2124
    return;
35,299✔
2125
  }
2126

2127
  if (pInfo->tbnameSlotId != -1) {
21,456✔
2128
    SColumnInfoData* pColumnInfoData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, pInfo->tbnameSlotId);
32✔
2129
    QUERY_CHECK_NULL(pColumnInfoData, code, lino, _end, terrno);
32!
2130
    char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
32✔
2131
    STR_TO_VARSTR(varTbName, name);
32✔
2132

2133
    code = colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, true);
32✔
2134
    QUERY_CHECK_CODE(code, lino, _end);
32!
2135
  }
2136

2137
  code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
21,456✔
2138
  QUERY_CHECK_CODE(code, lino, _end);
21,462!
2139

2140
_end:
21,462✔
2141
  if (code != TSDB_CODE_SUCCESS) {
21,462!
2142
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2143
    pTaskInfo->code = code;
×
2144
    T_LONG_JMP(pTaskInfo->env, code);
×
2145
  }
2146
}
2147

2148
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
21,655✔
2149
                                          SExecTaskInfo* pTaskInfo) {
2150
  int32_t code = TSDB_CODE_SUCCESS;
21,655✔
2151
  int32_t lino = 0;
21,655✔
2152
  if (pOperator->status == OP_EXEC_DONE) {
21,655✔
2153
    return NULL;
7,057✔
2154
  }
2155

2156
  while (1) {
24✔
2157
    int64_t startTs = taosGetTimestampUs();
14,622✔
2158
    tstrncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
14,622✔
2159
    tstrncpy(pInfo->req.user, pInfo->pUser, tListLen(pInfo->req.user));
14,622✔
2160

2161
    int32_t contLen = tSerializeSRetrieveTableReq(NULL, 0, &pInfo->req);
14,622✔
2162
    char*   buf1 = taosMemoryCalloc(1, contLen);
14,622✔
2163
    if (!buf1) {
14,622!
2164
      return NULL;
14,598✔
2165
    }
2166
    int32_t tempRes = tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req);
14,622✔
2167
    if (tempRes < 0) {
14,622!
2168
      code = terrno;
×
2169
      taosMemoryFree(buf1);
×
2170
      return NULL;
×
2171
    }
2172

2173
    // send the fetch remote task result reques
2174
    SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
14,622✔
2175
    if (NULL == pMsgSendInfo) {
14,622!
2176
      qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
×
2177
      pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
×
2178
      taosMemoryFree(buf1);
×
2179
      return NULL;
×
2180
    }
2181

2182
    int32_t msgType = (strcasecmp(name, TSDB_INS_TABLE_DNODE_VARIABLES) == 0) ? TDMT_DND_SYSTABLE_RETRIEVE
29,244✔
2183
                                                                              : TDMT_MND_SYSTABLE_RETRIEVE;
14,622✔
2184

2185
    pMsgSendInfo->param = pOperator;
14,622✔
2186
    pMsgSendInfo->msgInfo.pData = buf1;
14,622✔
2187
    pMsgSendInfo->msgInfo.len = contLen;
14,622✔
2188
    pMsgSendInfo->msgType = msgType;
14,622✔
2189
    pMsgSendInfo->fp = loadSysTableCallback;
14,622✔
2190
    pMsgSendInfo->requestId = pTaskInfo->id.queryId;
14,622✔
2191

2192
    code = asyncSendMsgToServer(pInfo->readHandle.pMsgCb->clientRpc, &pInfo->epSet, NULL, pMsgSendInfo);
14,622✔
2193
    if (code != TSDB_CODE_SUCCESS) {
14,622!
2194
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2195
      pTaskInfo->code = code;
×
2196
      T_LONG_JMP(pTaskInfo->env, code);
×
2197
    }
2198

2199
    code = tsem_wait(&pInfo->ready);
14,622✔
2200
    if (code != TSDB_CODE_SUCCESS) {
14,622!
2201
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2202
      pTaskInfo->code = code;
×
2203
      T_LONG_JMP(pTaskInfo->env, code);
×
2204
    }
2205

2206
    if (pTaskInfo->code) {
14,622✔
2207
      qError("%s load meta data from mnode failed, totalRows:%" PRIu64 ", code:%s", GET_TASKID(pTaskInfo),
11!
2208
             pInfo->loadInfo.totalRows, tstrerror(pTaskInfo->code));
2209
      return NULL;
11✔
2210
    }
2211

2212
    SRetrieveMetaTableRsp* pRsp = pInfo->pRsp;
14,611✔
2213
    pInfo->req.showId = pRsp->handle;
14,611✔
2214

2215
    if (pRsp->numOfRows == 0 || pRsp->completed) {
14,611✔
2216
      pOperator->status = OP_EXEC_DONE;
14,538✔
2217
      qDebug("%s load meta data from mnode completed, rowsOfSource:%d, totalRows:%" PRIu64, GET_TASKID(pTaskInfo),
14,538✔
2218
             pRsp->numOfRows, pInfo->loadInfo.totalRows);
2219

2220
      if (pRsp->numOfRows == 0) {
14,538✔
2221
        taosMemoryFree(pRsp);
443✔
2222
        return NULL;
443✔
2223
      }
2224
    }
2225

2226
    char* pStart = pRsp->data;
14,168✔
2227
    code = extractDataBlockFromFetchRsp(pInfo->pRes, pRsp->data, pInfo->matchInfo.pList, &pStart);
14,168✔
2228
    if (code != TSDB_CODE_SUCCESS) {
14,168!
2229
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2230
      pTaskInfo->code = code;
×
2231
      taosMemoryFreeClear(pRsp);
×
2232
      T_LONG_JMP(pTaskInfo->env, code);
×
2233
    }
2234
    updateLoadRemoteInfo(&pInfo->loadInfo, pRsp->numOfRows, pRsp->compLen, startTs, pOperator);
14,168✔
2235

2236
    // todo log the filter info
2237
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
14,168✔
2238
    if (code != TSDB_CODE_SUCCESS) {
14,168!
2239
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2240
      pTaskInfo->code = code;
×
2241
      taosMemoryFreeClear(pRsp);
×
2242
      T_LONG_JMP(pTaskInfo->env, code);
×
2243
    }
2244
    taosMemoryFree(pRsp);
14,168✔
2245
    if (pInfo->pRes->info.rows > 0) {
14,168✔
2246
      return pInfo->pRes;
7,102✔
2247
    } else if (pOperator->status == OP_EXEC_DONE) {
7,066✔
2248
      return NULL;
7,042✔
2249
    }
2250
  }
2251
}
2252

2253
int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, const char* pUser,
35,340✔
2254
                                       SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) {
2255
  QRY_PARAM_CHECK(pOptrInfo);
35,340!
2256

2257
  int32_t            code = TSDB_CODE_SUCCESS;
35,340✔
2258
  int32_t            lino = 0;
35,340✔
2259
  SSysTableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SSysTableScanInfo));
35,340✔
2260
  SOperatorInfo*     pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
35,384✔
2261
  if (pInfo == NULL || pOperator == NULL) {
35,390!
2262
    code = terrno;
×
2263
    lino = __LINE__;
×
2264
    goto _error;
×
2265
  }
2266

2267
  SScanPhysiNode*     pScanNode = &pScanPhyNode->scan;
35,390✔
2268
  SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
35,390✔
2269

2270
  int32_t num = 0;
35,390✔
2271
  code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &num, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
35,390✔
2272
  QUERY_CHECK_CODE(code, lino, _error);
35,383!
2273

2274
  extractTbnameSlotId(pInfo, pScanNode);
35,383✔
2275

2276
  pInfo->pAPI = &pTaskInfo->storageAPI;
35,380✔
2277

2278
  pInfo->accountId = pScanPhyNode->accountId;
35,380✔
2279
  pInfo->pUser = taosStrdup((void*)pUser);
35,380✔
2280
  QUERY_CHECK_NULL(pInfo->pUser, code, lino, _error, terrno);
35,388!
2281
  pInfo->sysInfo = pScanPhyNode->sysInfo;
35,388✔
2282
  pInfo->showRewrite = pScanPhyNode->showRewrite;
35,388✔
2283
  pInfo->pRes = createDataBlockFromDescNode(pDescNode);
35,388✔
2284
  QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno);
35,386!
2285
  pInfo->pCondition = pScanNode->node.pConditions;
35,386✔
2286
  code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
35,386✔
2287
  QUERY_CHECK_CODE(code, lino, _error);
35,363!
2288

2289
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
35,363✔
2290
  initResultSizeInfo(&pOperator->resultInfo, 4096);
35,384✔
2291
  code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
35,375✔
2292
  QUERY_CHECK_CODE(code, lino, _error);
35,390!
2293

2294
  tNameAssign(&pInfo->name, &pScanNode->tableName);
35,390✔
2295
  const char* name = tNameGetTableName(&pInfo->name);
35,387✔
2296

2297
  if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
35,383✔
2298
      strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
30,069✔
2299
    pInfo->readHandle = *(SReadHandle*)readHandle;
7,187✔
2300
  } else {
2301
    if (tsem_init(&pInfo->ready, 0, 0) != TSDB_CODE_SUCCESS) {
28,196!
2302
      code = TSDB_CODE_FAILED;
×
2303
      goto _error;
×
2304
    }
2305
    pInfo->epSet = pScanPhyNode->mgmtEpSet;
28,195✔
2306
    pInfo->readHandle = *(SReadHandle*)readHandle;
28,195✔
2307
  }
2308

2309
  setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
35,382✔
2310
                  pInfo, pTaskInfo);
2311
  pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
35,392✔
2312
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doSysTableScanNext, NULL, destroySysScanOperator,
35,392✔
2313
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
2314
  *pOptrInfo = pOperator;
35,389✔
2315
  return code;
35,389✔
2316

2317
_error:
×
2318
  if (pInfo != NULL) {
×
2319
    destroySysScanOperator(pInfo);
×
2320
  }
2321
  if (code != TSDB_CODE_SUCCESS) {
×
2322
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2323
  }
2324
  if (pOperator != NULL) {
×
2325
    pOperator->info = NULL;
×
2326
    destroyOperator(pOperator);
×
2327
  }
2328
  pTaskInfo->code = code;
×
2329
  return code;
×
2330
}
2331

2332
void extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode) {
35,376✔
2333
  pInfo->tbnameSlotId = -1;
35,376✔
2334
  if (pScanNode->pScanPseudoCols != NULL) {
35,376✔
2335
    SNode* pNode = NULL;
34✔
2336
    FOREACH(pNode, pScanNode->pScanPseudoCols) {
68!
2337
      STargetNode* pTargetNode = NULL;
34✔
2338
      if (nodeType(pNode) == QUERY_NODE_TARGET) {
34!
2339
        pTargetNode = (STargetNode*)pNode;
34✔
2340
        SNode* expr = pTargetNode->pExpr;
34✔
2341
        if (nodeType(expr) == QUERY_NODE_FUNCTION) {
34!
2342
          SFunctionNode* pFuncNode = (SFunctionNode*)expr;
34✔
2343
          if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) {
34!
2344
            pInfo->tbnameSlotId = pTargetNode->slotId;
34✔
2345
          }
2346
        }
2347
      }
2348
    }
2349
  }
2350
}
35,376✔
2351

2352
void destroySysScanOperator(void* param) {
35,394✔
2353
  SSysTableScanInfo* pInfo = (SSysTableScanInfo*)param;
35,394✔
2354
  int32_t            code = tsem_destroy(&pInfo->ready);
35,394✔
2355
  if (code != TSDB_CODE_SUCCESS) {
35,394!
2356
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2357
  }
2358
  blockDataDestroy(pInfo->pRes);
35,394✔
2359

2360
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
35,394!
2361
    const char* name = tNameGetTableName(&pInfo->name);
35,394✔
2362
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
35,394✔
2363
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
30,075✔
2364
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 || pInfo->pCur != NULL) {
28,204!
2365
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
27,676!
2366
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
20,546✔
2367
      }
2368

2369
      pInfo->pCur = NULL;
27,676✔
2370
    }
2371
  } else {
2372
    qError("pInfo->name is not initialized");
×
2373
  }
2374

2375
  if (pInfo->pIdx) {
35,394✔
2376
    taosArrayDestroy(pInfo->pIdx->uids);
2,324✔
2377
    taosMemoryFree(pInfo->pIdx);
2,324✔
2378
    pInfo->pIdx = NULL;
2,324✔
2379
  }
2380

2381
  if (pInfo->pSchema) {
35,394✔
2382
    taosHashCleanup(pInfo->pSchema);
13,654✔
2383
    pInfo->pSchema = NULL;
13,654✔
2384
  }
2385

2386
  taosArrayDestroy(pInfo->matchInfo.pList);
35,394✔
2387
  taosMemoryFreeClear(pInfo->pUser);
35,394!
2388

2389
  taosMemoryFreeClear(param);
35,394!
2390
}
35,394✔
2391

2392
int32_t loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code) {
14,622✔
2393
  SOperatorInfo*     operator=(SOperatorInfo*) param;
14,622✔
2394
  SSysTableScanInfo* pScanResInfo = (SSysTableScanInfo*)operator->info;
14,622✔
2395
  if (TSDB_CODE_SUCCESS == code) {
14,622✔
2396
    pScanResInfo->pRsp = pMsg->pData;
14,611✔
2397

2398
    SRetrieveMetaTableRsp* pRsp = pScanResInfo->pRsp;
14,611✔
2399
    pRsp->numOfRows = htonl(pRsp->numOfRows);
14,611✔
2400
    pRsp->useconds = htobe64(pRsp->useconds);
14,611✔
2401
    pRsp->handle = htobe64(pRsp->handle);
14,611✔
2402
    pRsp->compLen = htonl(pRsp->compLen);
14,611✔
2403
  } else {
2404
    operator->pTaskInfo->code = rpcCvtErrCode(code);
11✔
2405
    if (operator->pTaskInfo->code != code) {
11!
2406
      qError("load systable rsp received, error:%s, cvted error:%s", tstrerror(code),
×
2407
             tstrerror(operator->pTaskInfo->code));
2408
    } else {
2409
      qError("load systable rsp received, error:%s", tstrerror(code));
11!
2410
    }
2411
  }
2412

2413
  int32_t res = tsem_post(&pScanResInfo->ready);
14,622✔
2414
  if (res != TSDB_CODE_SUCCESS) {
14,622!
2415
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(res));
×
2416
  }
2417
  return TSDB_CODE_SUCCESS;
14,622✔
2418
}
2419

2420
static int32_t sysChkFilter__Comm(SNode* pNode) {
861✔
2421
  // impl
2422
  SOperatorNode* pOper = (SOperatorNode*)pNode;
861✔
2423
  EOperatorType  opType = pOper->opType;
861✔
2424
  if (opType != OP_TYPE_EQUAL && opType != OP_TYPE_LOWER_EQUAL && opType != OP_TYPE_LOWER_THAN &&
861!
2425
      opType != OP_TYPE_GREATER_EQUAL && opType != OP_TYPE_GREATER_THAN) {
2!
2426
    return -1;
×
2427
  }
2428
  return 0;
861✔
2429
}
2430

2431
static int32_t sysChkFilter__DBName(SNode* pNode) {
1,597✔
2432
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,597✔
2433

2434
  if (pOper->opType != OP_TYPE_EQUAL && pOper->opType != OP_TYPE_NOT_EQUAL) {
1,597!
2435
    return -1;
×
2436
  }
2437

2438
  SValueNode* pVal = (SValueNode*)pOper->pRight;
1,597✔
2439
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
1,597!
2440
    return -1;
×
2441
  }
2442

2443
  return 0;
1,597✔
2444
}
2445
static int32_t sysChkFilter__VgroupId(SNode* pNode) {
×
2446
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
2447
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
2448
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
2449
    return -1;
×
2450
  }
2451
  return sysChkFilter__Comm(pNode);
×
2452
}
2453
static int32_t sysChkFilter__TableName(SNode* pNode) {
839✔
2454
  SOperatorNode* pOper = (SOperatorNode*)pNode;
839✔
2455
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
839✔
2456
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
839!
2457
    return -1;
×
2458
  }
2459
  return sysChkFilter__Comm(pNode);
839✔
2460
}
2461
static int32_t sysChkFilter__CreateTime(SNode* pNode) {
6✔
2462
  SOperatorNode* pOper = (SOperatorNode*)pNode;
6✔
2463
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
6✔
2464

2465
  if (!IS_TIMESTAMP_TYPE(pVal->node.resType.type)) {
6!
2466
    return -1;
×
2467
  }
2468
  return sysChkFilter__Comm(pNode);
6✔
2469
}
2470

2471
static int32_t sysChkFilter__Ncolumn(SNode* pNode) {
×
2472
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
2473
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
2474

2475
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
2476
    return -1;
×
2477
  }
2478
  return sysChkFilter__Comm(pNode);
×
2479
}
2480
static int32_t sysChkFilter__Ttl(SNode* pNode) {
×
2481
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
2482
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
2483

2484
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
2485
    return -1;
×
2486
  }
2487
  return sysChkFilter__Comm(pNode);
×
2488
}
2489
static int32_t sysChkFilter__STableName(SNode* pNode) {
16✔
2490
  SOperatorNode* pOper = (SOperatorNode*)pNode;
16✔
2491
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
16✔
2492
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
16!
2493
    return -1;
×
2494
  }
2495
  return sysChkFilter__Comm(pNode);
16✔
2496
}
2497
static int32_t sysChkFilter__Uid(SNode* pNode) {
×
2498
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
2499
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
2500
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
2501
    return -1;
×
2502
  }
2503
  return sysChkFilter__Comm(pNode);
×
2504
}
2505
static int32_t sysChkFilter__Type(SNode* pNode) {
44✔
2506
  SOperatorNode* pOper = (SOperatorNode*)pNode;
44✔
2507
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
44✔
2508
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
44!
2509
    return -1;
44✔
2510
  }
2511
  return sysChkFilter__Comm(pNode);
×
2512
}
2513
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result) {
3,557✔
2514
  if (optSysCheckOper(cond) != 0) return -1;
3,557✔
2515

2516
  SOperatorNode* pNode = (SOperatorNode*)cond;
2,504✔
2517

2518
  int8_t i = 0;
2,504✔
2519
  for (; i < SYSTAB_FILTER_DICT_SIZE; i++) {
4,544✔
2520
    if (strcmp(filterDict[i].name, ((SColumnNode*)(pNode->pLeft))->colName) == 0) {
4,540✔
2521
      break;
2,500✔
2522
    }
2523
  }
2524
  if (i >= SYSTAB_FILTER_DICT_SIZE) return -1;
2,504!
2525

2526
  if (filterDict[i].chkFunc(cond) != 0) return -1;
2,504✔
2527

2528
  return filterDict[i].fltFunc(arg, cond, result);
2,456✔
2529
}
2530

2531
static int32_t optSysCheckOper(SNode* pOpear) {
3,555✔
2532
  if (nodeType(pOpear) != QUERY_NODE_OPERATOR) return -1;
3,555!
2533

2534
  SOperatorNode* pOper = (SOperatorNode*)pOpear;
3,555✔
2535
  if (pOper->opType < OP_TYPE_GREATER_THAN || pOper->opType > OP_TYPE_NOT_EQUAL) {
3,555!
2536
    return -1;
1,051✔
2537
  }
2538

2539
  if (nodeType(pOper->pLeft) != QUERY_NODE_COLUMN || nodeType(pOper->pRight) != QUERY_NODE_VALUE) {
2,504!
2540
    return -1;
×
2541
  }
2542
  return 0;
2,504✔
2543
}
2544

2545
static FORCE_INLINE int optSysBinarySearch(SArray* arr, int s, int e, uint64_t k) {
2546
  uint64_t v;
2547
  int32_t  m;
2548
  while (s <= e) {
×
2549
    m = s + (e - s) / 2;
×
2550
    v = *(uint64_t*)taosArrayGet(arr, m);
×
2551
    if (v >= k) {
×
2552
      e = m - 1;
×
2553
    } else {
2554
      s = m + 1;
×
2555
    }
2556
  }
2557
  return s;
×
2558
}
2559

2560
int32_t optSysIntersection(SArray* in, SArray* out) {
1,236✔
2561
  int32_t     code = TSDB_CODE_SUCCESS;
1,236✔
2562
  int32_t     lino = 0;
1,236✔
2563
  MergeIndex* mi = NULL;
1,236✔
2564
  int32_t     sz = (int32_t)taosArrayGetSize(in);
1,236✔
2565
  if (sz <= 0) {
1,236✔
2566
    goto _end;
1,230✔
2567
  }
2568
  mi = taosMemoryCalloc(sz, sizeof(MergeIndex));
6✔
2569
  QUERY_CHECK_NULL(mi, code, lino, _end, terrno);
6!
2570
  for (int i = 0; i < sz; i++) {
12✔
2571
    SArray* t = taosArrayGetP(in, i);
6✔
2572
    mi[i].len = (int32_t)taosArrayGetSize(t);
6✔
2573
    mi[i].idx = 0;
6✔
2574
  }
2575

2576
  SArray* base = taosArrayGetP(in, 0);
6✔
2577
  for (int i = 0; i < taosArrayGetSize(base); i++) {
26,577✔
2578
    uint64_t tgt = *(uint64_t*)taosArrayGet(base, i);
26,496✔
2579
    bool     has = true;
26,508✔
2580
    for (int j = 1; j < taosArrayGetSize(in); j++) {
26,508!
2581
      SArray* oth = taosArrayGetP(in, j);
×
2582
      int     mid = optSysBinarySearch(oth, mi[j].idx, mi[j].len - 1, tgt);
×
2583
      if (mid >= 0 && mid < mi[j].len) {
×
2584
        uint64_t val = *(uint64_t*)taosArrayGet(oth, mid);
×
2585
        has = (val == tgt ? true : false);
×
2586
        mi[j].idx = mid;
×
2587
      } else {
2588
        has = false;
×
2589
      }
2590
    }
2591
    if (has == true) {
26,501✔
2592
      void* tmp = taosArrayPush(out, &tgt);
26,569✔
2593
      if (!tmp) {
26,569!
2594
        code = terrno;
×
2595
        goto _end;
×
2596
      }
2597
    }
2598
  }
2599

2600
_end:
1✔
2601
  taosMemoryFreeClear(mi);
1,231✔
2602
  if (code != TSDB_CODE_SUCCESS) {
1,231!
2603
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2604
  }
2605
  return code;
1,235✔
2606
}
2607

2608
static int tableUidCompare(const void* a, const void* b) {
179,302✔
2609
  int64_t u1 = *(int64_t*)a;
179,302✔
2610
  int64_t u2 = *(int64_t*)b;
179,302✔
2611
  if (u1 == u2) {
179,302!
2612
    return 0;
×
2613
  }
2614
  return u1 < u2 ? -1 : 1;
179,302✔
2615
}
2616

2617
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt) {
1,236✔
2618
  // TODO, find comm mem from mRslt
2619
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
1,242✔
2620
    SArray* arslt = taosArrayGetP(mRslt, i);
6✔
2621
    taosArraySort(arslt, tableUidCompare);
6✔
2622
  }
2623
  return optSysIntersection(mRslt, rslt);
1,236✔
2624
}
2625

2626
static int32_t optSysSpecialColumn(SNode* cond) {
1,240✔
2627
  SOperatorNode* pOper = (SOperatorNode*)cond;
1,240✔
2628
  SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
1,240✔
2629
  for (int i = 0; i < sizeof(SYSTABLE_SPECIAL_COL) / sizeof(SYSTABLE_SPECIAL_COL[0]); i++) {
1,252✔
2630
    if (0 == strcmp(pCol->colName, SYSTABLE_SPECIAL_COL[i])) {
1,247✔
2631
      return 1;
1,235✔
2632
    }
2633
  }
2634
  return 0;
5✔
2635
}
2636

2637
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result) {
2,321✔
2638
  int ret = TSDB_CODE_FAILED;
2,321✔
2639
  if (nodeType(cond) == QUERY_NODE_OPERATOR) {
2,321✔
2640
    ret = optSysTabFilteImpl(arg, cond, result);
1,086✔
2641
    if (ret == 0) {
1,082✔
2642
      SOperatorNode* pOper = (SOperatorNode*)cond;
352✔
2643
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
352✔
2644
      if (0 == strcmp(pCol->colName, "create_time")) {
352!
2645
        return 0;
×
2646
      }
2647
      return -1;
352✔
2648
    }
2649
    return ret;
730✔
2650
  }
2651

2652
  if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) {
1,235!
2653
    return ret;
×
2654
  }
2655

2656
  SLogicConditionNode* pNode = (SLogicConditionNode*)cond;
1,236✔
2657
  SNodeList*           pList = (SNodeList*)pNode->pParameterList;
1,236✔
2658

2659
  int32_t len = LIST_LENGTH(pList);
1,236!
2660

2661
  bool    hasIdx = false;
1,236✔
2662
  bool    hasRslt = true;
1,236✔
2663
  SArray* mRslt = taosArrayInit(len, POINTER_BYTES);
1,236✔
2664
  if (!mRslt) {
1,236!
2665
    return terrno;
×
2666
  }
2667

2668
  SListCell* cell = pList->pHead;
1,236✔
2669
  for (int i = 0; i < len; i++) {
3,708✔
2670
    if (cell == NULL) break;
2,472!
2671

2672
    SArray* aRslt = taosArrayInit(16, sizeof(int64_t));
2,472✔
2673
    if (!aRslt) {
2,472!
2674
      return terrno;
×
2675
    }
2676

2677
    ret = optSysTabFilteImpl(arg, cell->pNode, aRslt);
2,472✔
2678
    if (ret == 0) {
2,471✔
2679
      // has index
2680
      hasIdx = true;
1,241✔
2681
      if (optSysSpecialColumn(cell->pNode) == 0) {
1,241✔
2682
        void* tmp = taosArrayPush(mRslt, &aRslt);
6✔
2683
        if (!tmp) {
6!
2684
          return TSDB_CODE_FAILED;
×
2685
        }
2686
      } else {
2687
        // db_name/vgroup not result
2688
        taosArrayDestroy(aRslt);
1,235✔
2689
      }
2690
    } else if (ret == -2) {
1,230!
2691
      // current vg
2692
      hasIdx = true;
×
2693
      hasRslt = false;
×
2694
      taosArrayDestroy(aRslt);
×
2695
      break;
×
2696
    } else {
2697
      taosArrayDestroy(aRslt);
1,230✔
2698
    }
2699
    cell = cell->pNext;
2,472✔
2700
  }
2701
  if (hasRslt && hasIdx) {
1,236!
2702
    int32_t code = optSysMergeRslt(mRslt, result);
1,236✔
2703
    if (code != TSDB_CODE_SUCCESS) {
1,236!
2704
      return code;
×
2705
    }
2706
  }
2707

2708
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
1,242✔
2709
    SArray* aRslt = taosArrayGetP(mRslt, i);
6✔
2710
    taosArrayDestroy(aRslt);
6✔
2711
  }
2712
  taosArrayDestroy(mRslt);
1,236✔
2713
  if (hasRslt == false) {
1,235!
2714
    return -2;
×
2715
  }
2716
  if (hasRslt && hasIdx) {
1,235!
2717
    cell = pList->pHead;
1,235✔
2718
    for (int i = 0; i < len; i++) {
3,699✔
2719
      if (cell == NULL) break;
2,470!
2720
      SOperatorNode* pOper = (SOperatorNode*)cell->pNode;
2,470✔
2721
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
2,470✔
2722
      if (0 == strcmp(pCol->colName, "create_time")) {
2,470✔
2723
        return 0;
6✔
2724
      }
2725
      cell = cell->pNext;
2,464✔
2726
    }
2727
    return -1;
1,229✔
2728
  }
2729
  return -1;
×
2730
}
2731

2732
static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
10✔
2733
  *rowLen = 0;
10✔
2734

2735
  SMetaReader mr = {0};
10✔
2736
  pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn);
10✔
2737
  int32_t code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, uid);
9✔
2738
  if (code != TSDB_CODE_SUCCESS) {
10!
2739
    qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", uid, tstrerror(terrno), idstr);
×
2740
    pHandle->api.metaReaderFn.clearReader(&mr);
×
2741
    return terrno;
×
2742
  }
2743

2744
  if (mr.me.type == TSDB_SUPER_TABLE) {
10✔
2745
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
9✔
2746
    for (int32_t i = 0; i < numOfCols; ++i) {
33✔
2747
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
24✔
2748
    }
2749
  } else if (mr.me.type == TSDB_CHILD_TABLE) {
1!
2750
    uint64_t suid = mr.me.ctbEntry.suid;
×
2751
    tDecoderClear(&mr.coder);
×
2752
    code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, suid);
×
2753
    if (code != TSDB_CODE_SUCCESS) {
×
2754
      qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno), idstr);
×
2755
      pHandle->api.metaReaderFn.clearReader(&mr);
×
2756
      return terrno;
×
2757
    }
2758

2759
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
×
2760

2761
    for (int32_t i = 0; i < numOfCols; ++i) {
×
2762
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
×
2763
    }
2764
  } else if (mr.me.type == TSDB_NORMAL_TABLE) {
1!
2765
    int32_t numOfCols = mr.me.ntbEntry.schemaRow.nCols;
1✔
2766
    for (int32_t i = 0; i < numOfCols; ++i) {
3✔
2767
      (*rowLen) += mr.me.ntbEntry.schemaRow.pSchema[i].bytes;
2✔
2768
    }
2769
  }
2770

2771
  pHandle->api.metaReaderFn.clearReader(&mr);
10✔
2772
  return TSDB_CODE_SUCCESS;
10✔
2773
}
2774

2775
static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
20✔
2776
  int32_t code = TSDB_CODE_SUCCESS;
20✔
2777
  int32_t lino = 0;
20✔
2778
  if (pOperator->status == OP_EXEC_DONE) {
20✔
2779
    (*ppRes) = NULL;
10✔
2780
    return code;
10✔
2781
  }
2782

2783
  SBlockDistInfo* pBlockScanInfo = pOperator->info;
10✔
2784
  SExecTaskInfo*  pTaskInfo = pOperator->pTaskInfo;
10✔
2785
  SStorageAPI*    pAPI = &pTaskInfo->storageAPI;
10✔
2786

2787
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
10✔
2788
  code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
10✔
2789
                           GET_TASKID(pTaskInfo));
10✔
2790
  QUERY_CHECK_CODE(code, lino, _end);
10!
2791

2792
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
10✔
2793
  QUERY_CHECK_CODE(code, lino, _end);
10!
2794

2795
  blockDistInfo.numOfInmemRows = 0;
10✔
2796
  code = pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle, &blockDistInfo.numOfInmemRows);
10✔
2797
  QUERY_CHECK_CODE(code, lino, _end);
10!
2798

2799
  SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
10✔
2800

2801
  int32_t          slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
10✔
2802
  SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
10✔
2803
  QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
10!
2804

2805
  int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
10✔
2806
  char*   p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
10✔
2807
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
10!
2808

2809
  int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
10✔
2810
  if (tempRes < 0) {
10!
2811
    code = terrno;
×
2812
    QUERY_CHECK_CODE(code, lino, _end);
×
2813
  }
2814
  varDataSetLen(p, len);
10✔
2815

2816
  code = colDataSetVal(pColInfo, 0, p, false);
10✔
2817
  QUERY_CHECK_CODE(code, lino, _end);
10!
2818

2819
  taosMemoryFree(p);
10✔
2820

2821
  // make the valgrind happy that all memory buffer has been initialized already.
2822
  if (slotId != 0) {
10!
2823
    SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
10✔
2824
    QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
10!
2825
    int64_t v = 0;
10✔
2826
    colDataSetInt64(p1, 0, &v);
2827
  }
2828

2829
  pBlock->info.rows = 1;
10✔
2830
  pOperator->status = OP_EXEC_DONE;
10✔
2831

2832
_end:
10✔
2833
  if (code != TSDB_CODE_SUCCESS) {
10!
2834
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2835
    pTaskInfo->code = code;
×
2836
    T_LONG_JMP(pTaskInfo->env, code);
×
2837
  }
2838
  (*ppRes) = pBlock;
10✔
2839
  return code;
10✔
2840
}
2841

2842
static void destroyBlockDistScanOperatorInfo(void* param) {
10✔
2843
  SBlockDistInfo* pDistInfo = (SBlockDistInfo*)param;
10✔
2844
  blockDataDestroy(pDistInfo->pResBlock);
10✔
2845
  if (pDistInfo->readHandle.api.tsdReader.tsdReaderClose != NULL) {
10!
2846
    pDistInfo->readHandle.api.tsdReader.tsdReaderClose(pDistInfo->pHandle);
10✔
2847
  }
2848
  tableListDestroy(pDistInfo->pTableListInfo);
10✔
2849
  taosMemoryFreeClear(param);
10!
2850
}
10✔
2851

2852
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
10✔
2853
  memset(pCond, 0, sizeof(SQueryTableDataCond));
10✔
2854

2855
  pCond->order = TSDB_ORDER_ASC;
10✔
2856
  pCond->numOfCols = 1;
10✔
2857
  pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
10✔
2858
  pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t));
10✔
2859
  if (pCond->colList == NULL || pCond->pSlotList == NULL) {
10!
2860
    taosMemoryFree(pCond->colList);
×
2861
    taosMemoryFree(pCond->pSlotList);
×
2862
    return terrno;
×
2863
  }
2864

2865
  pCond->colList->colId = 1;
10✔
2866
  pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
10✔
2867
  pCond->colList->bytes = sizeof(TSKEY);
10✔
2868
  pCond->colList->pk = 0;
10✔
2869

2870
  pCond->pSlotList[0] = 0;
10✔
2871

2872
  pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
10✔
2873
  pCond->suid = uid;
10✔
2874
  pCond->type = TIMEWINDOW_RANGE_CONTAINED;
10✔
2875
  pCond->startVersion = -1;
10✔
2876
  pCond->endVersion = -1;
10✔
2877

2878
  return TSDB_CODE_SUCCESS;
10✔
2879
}
2880

2881
int32_t createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
9✔
2882
                                        STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo,
2883
                                        SOperatorInfo** pOptrInfo) {
2884
  QRY_PARAM_CHECK(pOptrInfo);
9!
2885

2886
  int32_t         code = 0;
9✔
2887
  int32_t         lino = 0;
9✔
2888
  SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
9✔
2889
  SOperatorInfo*  pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
10✔
2890
  if (pInfo == NULL || pOperator == NULL) {
10!
2891
    pTaskInfo->code = code = terrno;
×
2892
    goto _error;
×
2893
  }
2894

2895
  pInfo->pResBlock = createDataBlockFromDescNode(pBlockScanNode->node.pOutputDataBlockDesc);
10✔
2896
  QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, terrno);
10!
2897
  code = blockDataEnsureCapacity(pInfo->pResBlock, 1);
10✔
2898
  QUERY_CHECK_CODE(code, lino, _error);
10!
2899

2900
  {
2901
    SQueryTableDataCond cond = {0};
10✔
2902
    code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
10✔
2903
    QUERY_CHECK_CODE(code, lino, _error);
10!
2904

2905
    pInfo->pTableListInfo = pTableListInfo;
10✔
2906
    int32_t num = 0;
10✔
2907
    code = tableListGetSize(pTableListInfo, &num);
10✔
2908
    QUERY_CHECK_CODE(code, lino, _error);
10!
2909

2910
    void* pList = tableListGetInfo(pTableListInfo, 0);
10✔
2911

2912
    code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock,
10✔
2913
                                                   (void**)&pInfo->pHandle, pTaskInfo->id.str, NULL);
10✔
2914
    cleanupQueryTableDataCond(&cond);
10✔
2915
    QUERY_CHECK_CODE(code, lino, _error);
10!
2916
  }
2917

2918
  pInfo->readHandle = *readHandle;
10✔
2919
  pInfo->uid = (pBlockScanNode->suid != 0) ? pBlockScanNode->suid : pBlockScanNode->uid;
10✔
2920

2921
  int32_t    numOfCols = 0;
10✔
2922
  SExprInfo* pExprInfo = NULL;
10✔
2923
  code = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &pExprInfo, &numOfCols);
10✔
2924
  QUERY_CHECK_CODE(code, lino, _error);
10!
2925

2926
  code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols, &pTaskInfo->storageAPI.functionStore);
10✔
2927
  QUERY_CHECK_CODE(code, lino, _error);
10!
2928

2929
  setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
10✔
2930
                  OP_NOT_OPENED, pInfo, pTaskInfo);
2931
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doBlockInfoScanNext, NULL, destroyBlockDistScanOperatorInfo,
10✔
2932
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
2933
  *pOptrInfo = pOperator;
10✔
2934
  return code;
10✔
2935

2936
_error:
×
2937
  if (pInfo) {
×
2938
    pInfo->pTableListInfo = NULL;
×
2939
    destroyBlockDistScanOperatorInfo(pInfo);
×
2940
  }
2941
  if (pOperator != NULL) {
×
2942
    pOperator->info = NULL;
×
2943
    destroyOperator(pOperator);
×
2944
  }
2945
  return code;
×
2946
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc