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

taosdata / TDengine / #4917

07 Jan 2026 03:52PM UTC coverage: 65.42% (+0.02%) from 65.402%
#4917

push

travis-ci

web-flow
merge: from main to 3.0 branch #34204

31 of 34 new or added lines in 2 files covered. (91.18%)

819 existing lines in 129 files now uncovered.

202679 of 309814 relevant lines covered (65.42%)

116724351.99 hits per line

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

74.53
/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 "nodes.h"
21
#include "querynodes.h"
22
#include "systable.h"
23
#include "tcommon.h"
24
#include "tname.h"
25

26
#include "tdatablock.h"
27
#include "tmsg.h"
28

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

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

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

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

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

82
  // file set iterate
83
  struct SFileSetReader* pFileSetReader;
84
  SHashObj*              pExtSchema;
85

86
  // for virtual supertable scan
87
  STableListInfo*        pSubTableListInfo;
88
} SSysTableScanInfo;
89

90
typedef struct {
91
  const char* name;
92
  __sys_check chkFunc;
93
  __sys_filte fltFunc;
94
} SSTabFltFuncDef;
95

96
typedef struct MergeIndex {
97
  int idx;
98
  int len;
99
} MergeIndex;
100

101
typedef struct SBlockDistInfo {
102
  SSDataBlock*    pResBlock;
103
  STsdbReader*    pHandle;
104
  SReadHandle     readHandle;
105
  STableListInfo* pTableListInfo;
106
  uint64_t        uid;  // table uid
107
} SBlockDistInfo;
108

109
typedef struct {
110
  int8_t   type;
111
  tb_uid_t uid;
112
} STableId;
113

114
static int32_t sysChkFilter__Comm(SNode* pNode);
115
static int32_t sysChkFilter__DBName(SNode* pNode);
116
static int32_t sysChkFilter__VgroupId(SNode* pNode);
117
static int32_t sysChkFilter__TableName(SNode* pNode);
118
static int32_t sysChkFilter__CreateTime(SNode* pNode);
119
static int32_t sysChkFilter__Ncolumn(SNode* pNode);
120
static int32_t sysChkFilter__Ttl(SNode* pNode);
121
static int32_t sysChkFilter__STableName(SNode* pNode);
122
static int32_t sysChkFilter__Uid(SNode* pNode);
123
static int32_t sysChkFilter__Type(SNode* pNode);
124

125
static int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result);
126
static int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result);
127
static int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result);
128
static int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result);
129
static int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result);
130
static int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result);
131
static int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result);
132
static int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result);
133
static int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result);
134

135
const SSTabFltFuncDef filterDict[] = {
136
    {.name = "table_name", .chkFunc = sysChkFilter__TableName, .fltFunc = sysFilte__TableName},
137
    {.name = "db_name", .chkFunc = sysChkFilter__DBName, .fltFunc = sysFilte__DbName},
138
    {.name = "create_time", .chkFunc = sysChkFilter__CreateTime, .fltFunc = sysFilte__CreateTime},
139
    {.name = "columns", .chkFunc = sysChkFilter__Ncolumn, .fltFunc = sysFilte__Ncolumn},
140
    {.name = "ttl", .chkFunc = sysChkFilter__Ttl, .fltFunc = sysFilte__Ttl},
141
    {.name = "stable_name", .chkFunc = sysChkFilter__STableName, .fltFunc = sysFilte__STableName},
142
    {.name = "vgroup_id", .chkFunc = sysChkFilter__VgroupId, .fltFunc = sysFilte__VgroupId},
143
    {.name = "uid", .chkFunc = sysChkFilter__Uid, .fltFunc = sysFilte__Uid},
144
    {.name = "type", .chkFunc = sysChkFilter__Type, .fltFunc = sysFilte__Type}};
145

146
#define SYSTAB_FILTER_DICT_SIZE (sizeof(filterDict) / sizeof(filterDict[0]))
147

148
static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta,
149
                                     size_t size, const char* dbName, int64_t* pRows);
150

151
static char* SYSTABLE_SPECIAL_COL[] = {"db_name", "vgroup_id"};
152

153
static int32_t        buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity);
154
static SSDataBlock*   buildInfoSchemaTableMetaBlock(char* tableName);
155
static void           destroySysScanOperator(void* param);
156
static int32_t        loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code);
157
static __optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal);
158

159
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
160
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
161
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock);
162

163
static int32_t sysTableUserColsFillOneTableCols(const char* dbname, int32_t* pNumOfRows,
164
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
165
                                                SExtSchema* extSchemaRow, char* tableType, SColRefWrapper* colRef);
166

167
static int32_t sysTableUserColsFillOneVirtualTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
168
                                                            const SSDataBlock* dataBlock, char* tName, char* stName,
169
                                                            SSchemaWrapper* schemaRow, char* tableType, SColRefWrapper *colRef, tb_uid_t uid, int32_t vgId);
170

171
static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
172
                                               SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo);
173

174
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStatisInfo);
175

176
int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result) {
501,812✔
177
  SSTabFltArg* pArg = arg;
501,812✔
178
  void*        pVnode = pArg->pVnode;
501,812✔
179

180
  const char* db = NULL;
502,515✔
181
  pArg->pAPI->metaFn.getBasicInfo(pVnode, &db, NULL, NULL, NULL);
502,515✔
182

183
  SName   sn = {0};
500,652✔
184
  char    dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
500,652✔
185
  int32_t code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
501,273✔
186
  if (code != TSDB_CODE_SUCCESS) {
501,812✔
187
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
188
    return code;
×
189
  }
190

191
  code = tNameGetDbName(&sn, varDataVal(dbname));
501,812✔
192
  if (code != TSDB_CODE_SUCCESS) {
501,812✔
193
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
194
    return code;
×
195
  }
196
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
501,812✔
197

198
  SOperatorNode* pOper = (SOperatorNode*)pNode;
501,812✔
199
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
501,812✔
200

201
  bool           reverse = false;
501,191✔
202
  bool           equal = false;
502,515✔
203
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
502,515✔
204
  if (func == NULL) return -1;
501,812✔
205

206
  int ret = func(dbname, pVal->datum.p, TSDB_DATA_TYPE_VARCHAR);
501,812✔
207
  if (ret == 0) return 0;
502,515✔
208

209
  return -2;
608✔
210
}
211

212
int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result) {
×
213
  SSTabFltArg* pArg = arg;
×
214
  void*        pVnode = ((SSTabFltArg*)arg)->pVnode;
×
215

216
  int64_t vgId = 0;
×
217
  pArg->pAPI->metaFn.getBasicInfo(pVnode, NULL, (int32_t*)&vgId, NULL, NULL);
×
218

219
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
220
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
221

222
  bool           reverse = false;
×
223
  bool           equal = false;
×
224
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
225
  if (func == NULL) return -1;
×
226

227
  int ret = func(&vgId, &pVal->datum.i, TSDB_DATA_TYPE_BIGINT);
×
228
  if (ret == 0) return 0;
×
229

230
  return -1;
×
231
}
232

233
int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) {
283,801✔
234
  SSTabFltArg* pArg = arg;
283,801✔
235

236
  SOperatorNode* pOper = (SOperatorNode*)pNode;
283,801✔
237
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
283,801✔
238

239
  bool           reverse = false, equal = false;
283,969✔
240
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
283,969✔
241
  if (func == NULL) return -1;
283,969✔
242

243
  SMetaFltParam param = {.suid = 0,
283,969✔
244
                         .cid = 0,
245
                         .type = TSDB_DATA_TYPE_VARCHAR,
246
                         .val = pVal->datum.p,
283,969✔
247
                         .reverse = reverse,
248
                         .equal = equal,
249
                         .filterFunc = func};
250
  return -1;
283,969✔
251
}
252

253
int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) {
1,568✔
254
  SSTabFltArg* pArg = arg;
1,568✔
255
  SStorageAPI* pAPI = pArg->pAPI;
1,568✔
256

257
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,568✔
258
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
1,568✔
259

260
  bool           reverse = false, equal = false;
1,568✔
261
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
1,568✔
262
  if (func == NULL) return -1;
1,568✔
263

264
  SMetaFltParam param = {.suid = 0,
3,136✔
265
                         .cid = 0,
266
                         .type = TSDB_DATA_TYPE_BIGINT,
267
                         .val = &pVal->datum.i,
1,568✔
268
                         .reverse = reverse,
269
                         .equal = equal,
270
                         .filterFunc = func};
271

272
  int32_t ret = pAPI->metaFilter.metaFilterCreateTime(pArg->pVnode, &param, result);
1,568✔
273
  return ret;
1,568✔
274
}
275

276
int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result) {
×
277
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
278

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

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

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

300
int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result) {
3,414✔
301
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
3,414✔
302

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

312
int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result) {
×
313
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
314

315
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
316
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
317
  bool           reverse = false;
×
318
  bool           equal = false;
×
319
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
320
  if (func == NULL) return -1;
×
321
  return -1;
×
322
}
323

324
int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result) {
×
325
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
326

327
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
328
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
329
  bool           reverse = false;
×
330
  bool           equal = false;
×
331
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
332
  if (func == NULL) return -1;
×
333
  return -1;
×
334
}
335

336
int optSysDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) {
6,581,976✔
337
  int32_t cmp = func(a, b);
6,581,976✔
338
  switch (comparType) {
6,582,058✔
339
    case OP_TYPE_LOWER_THAN:
4,560,164✔
340
      if (cmp < 0) return 0;
4,560,164✔
341
      break;
×
342
    case OP_TYPE_LOWER_EQUAL: {
×
343
      if (cmp <= 0) return 0;
×
344
      break;
×
345
    }
346
    case OP_TYPE_GREATER_THAN: {
1,520,000✔
347
      if (cmp > 0) return 0;
1,520,000✔
348
      break;
×
349
    }
350
    case OP_TYPE_GREATER_EQUAL: {
×
351
      if (cmp >= 0) return 0;
×
352
      break;
×
353
    }
354
    case OP_TYPE_EQUAL: {
501,907✔
355
      if (cmp == 0) return 0;
501,907✔
356
      break;
×
357
    }
358
    default:
456✔
359
      return -1;
456✔
360
  }
361
  return cmp;
×
362
}
363

364
static int optSysFilterFuncImpl__LowerThan(void* a, void* b, int16_t dtype) {
4,560,164✔
365
  __compar_fn_t func = getComparFunc(dtype, 0);
4,560,164✔
366
  if (func == NULL) {
4,560,164✔
367
    return -1;
×
368
  }
369
  return optSysDoCompare(func, OP_TYPE_LOWER_THAN, a, b);
4,560,164✔
370
}
371
static int optSysFilterFuncImpl__LowerEqual(void* a, void* b, int16_t dtype) {
×
372
  __compar_fn_t func = getComparFunc(dtype, 0);
×
373
  if (func == NULL) {
×
374
    return -1;
×
375
  }
376
  return optSysDoCompare(func, OP_TYPE_LOWER_EQUAL, a, b);
×
377
}
378
static int optSysFilterFuncImpl__GreaterThan(void* a, void* b, int16_t dtype) {
1,520,000✔
379
  __compar_fn_t func = getComparFunc(dtype, 0);
1,520,000✔
380
  if (func == NULL) {
1,520,000✔
381
    return -1;
×
382
  }
383
  return optSysDoCompare(func, OP_TYPE_GREATER_THAN, a, b);
1,520,000✔
384
}
385
static int optSysFilterFuncImpl__GreaterEqual(void* a, void* b, int16_t dtype) {
×
386
  __compar_fn_t func = getComparFunc(dtype, 0);
×
387
  if (func == NULL) {
×
388
    return -1;
×
389
  }
390
  return optSysDoCompare(func, OP_TYPE_GREATER_EQUAL, a, b);
×
391
}
392
static int optSysFilterFuncImpl__Equal(void* a, void* b, int16_t dtype) {
501,907✔
393
  __compar_fn_t func = getComparFunc(dtype, 0);
501,907✔
394
  if (func == NULL) {
500,583✔
395
    return -1;
×
396
  }
397
  return optSysDoCompare(func, OP_TYPE_EQUAL, a, b);
500,583✔
398
}
399

400
static int optSysFilterFuncImpl__NoEqual(void* a, void* b, int16_t dtype) {
608✔
401
  __compar_fn_t func = getComparFunc(dtype, 0);
608✔
402
  if (func == NULL) {
608✔
403
    return -1;
×
404
  }
405
  return optSysDoCompare(func, OP_TYPE_NOT_EQUAL, a, b);
608✔
406
}
407

408
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result);
409
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result);
410
static int32_t optSysCheckOper(SNode* pOpear);
411
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt);
412

413
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
414
                                          SExecTaskInfo* pTaskInfo);
415
void                extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode);
416

417
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
418
                                   SSDataBlock* pBlock);
419

420
__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal) {
791,466✔
421
  if (ctype == OP_TYPE_LOWER_EQUAL || ctype == OP_TYPE_LOWER_THAN) {
791,466✔
422
    *reverse = true;
1,967✔
423
  }
424
  if (ctype == OP_TYPE_EQUAL) {
790,763✔
425
    *equal = true;
789,290✔
426
  }
427
  if (ctype == OP_TYPE_LOWER_THAN)
790,763✔
428
    return optSysFilterFuncImpl__LowerThan;
1,264✔
429
  else if (ctype == OP_TYPE_LOWER_EQUAL)
789,499✔
430
    return optSysFilterFuncImpl__LowerEqual;
×
431
  else if (ctype == OP_TYPE_GREATER_THAN)
789,499✔
432
    return optSysFilterFuncImpl__GreaterThan;
304✔
433
  else if (ctype == OP_TYPE_GREATER_EQUAL)
789,195✔
434
    return optSysFilterFuncImpl__GreaterEqual;
×
435
  else if (ctype == OP_TYPE_EQUAL)
789,195✔
436
    return optSysFilterFuncImpl__Equal;
789,290✔
437
  else if (ctype == OP_TYPE_NOT_EQUAL)
456✔
438
    return optSysFilterFuncImpl__NoEqual;
608✔
439
  return NULL;
×
440
}
441

442
static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) {
6,815,555✔
443
  SOperatorNode* node = (SOperatorNode*)pCond;
6,815,555✔
444
  if (node->opType == OP_TYPE_EQUAL) {
6,815,555✔
445
    if (nodeType(node->pLeft) == QUERY_NODE_COLUMN &&
2,052,666✔
446
        strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 &&
2,052,666✔
447
        nodeType(node->pRight) == QUERY_NODE_VALUE) {
×
448
      SValueNode* pValue = (SValueNode*)node->pRight;
×
449
      if (pValue->node.resType.type == TSDB_DATA_TYPE_NCHAR || pValue->node.resType.type == TSDB_DATA_TYPE_VARCHAR) {
×
450
        char* value = nodesGetValueFromNode(pValue);
962✔
451
        tstrncpy(condTable, varDataVal(value), TSDB_TABLE_NAME_LEN);
×
452
        return true;
×
453
      }
454
    }
455
  }
456
  return false;
6,815,074✔
457
}
458

459
static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) {
6,009,933✔
460
  if (pCond == NULL) {
6,009,933✔
461
    return false;
2,296✔
462
  }
463
  if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) {
6,007,637✔
464
    SLogicConditionNode* node = (SLogicConditionNode*)pCond;
752,267✔
465
    if (LOGIC_COND_TYPE_AND == node->condType) {
752,267✔
466
      SNode* pChild = NULL;
749,237✔
467
      FOREACH(pChild, node->pParameterList) {
2,309,422✔
468
        if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) {
1,560,185✔
469
          return true;
×
470
        }
471
      }
472
    }
473
  }
474

475
  if (QUERY_NODE_OPERATOR == nodeType(pCond)) {
6,007,637✔
476
    return sysTableIsOperatorCondOnOneTable(pCond, condTable);
5,255,370✔
477
  }
478

479
  return false;
752,267✔
480
}
481

482
static SSDataBlock* doOptimizeTableNameFilter(SOperatorInfo* pOperator, SSDataBlock* dataBlock, char* dbname) {
×
483
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
484
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
×
485
  SSysTableScanInfo* pInfo = pOperator->info;
×
486
  int32_t            numOfRows = 0;
×
487

488
  char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
489
  STR_TO_VARSTR(tableName, pInfo->req.filterTb);
×
490

491
  SMetaReader smrTable = {0};
×
492
  pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
493
  int32_t code = pAPI->metaReaderFn.getTableEntryByName(&smrTable, pInfo->req.filterTb);
×
494
  if (code != TSDB_CODE_SUCCESS) {
×
495
    // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
496
    pAPI->metaReaderFn.clearReader(&smrTable);
×
497
    pInfo->loadInfo.totalRows = 0;
×
498
    return NULL;
×
499
  }
500

501
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
502
    pAPI->metaReaderFn.clearReader(&smrTable);
×
503
    pInfo->loadInfo.totalRows = 0;
×
504
    return NULL;
×
505
  }
506

507
  if (smrTable.me.type == TSDB_CHILD_TABLE) {
×
508
    int64_t suid = smrTable.me.ctbEntry.suid;
×
509
    pAPI->metaReaderFn.clearReader(&smrTable);
×
510
    pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
511
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrTable, suid);
×
512
    if (code != TSDB_CODE_SUCCESS) {
×
513
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
514
      pAPI->metaReaderFn.clearReader(&smrTable);
×
515
      pInfo->loadInfo.totalRows = 0;
×
516
      return NULL;
×
517
    }
518
  }
519

520
  char            typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
521
  SSchemaWrapper* schemaRow = NULL;
×
522
  SExtSchema* extSchemaRow = smrTable.me.pExtSchemas;
×
523
  SColRefWrapper* colRef = NULL;
×
524
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
525
    schemaRow = &smrTable.me.stbEntry.schemaRow;
×
526
    STR_TO_VARSTR(typeName, "CHILD_TABLE");
×
527
  } else if (smrTable.me.type == TSDB_NORMAL_TABLE) {
×
528
    schemaRow = &smrTable.me.ntbEntry.schemaRow;
×
529
    STR_TO_VARSTR(typeName, "NORMAL_TABLE");
×
530
  } else if (smrTable.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
×
531
    schemaRow = &smrTable.me.ntbEntry.schemaRow;
×
532
    colRef = &smrTable.me.colRef;
×
533
    STR_TO_VARSTR(typeName, "VIRTUAL_NORMAL_TABLE");
×
534
  } else if (smrTable.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
×
535
    colRef = &smrTable.me.colRef;
×
536
    STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
×
537
  }
538

539
  code = sysTableUserColsFillOneTableCols(dbname, &numOfRows, dataBlock, tableName, schemaRow, extSchemaRow, typeName, colRef);
×
540
  if (code != TSDB_CODE_SUCCESS) {
×
541
    pAPI->metaReaderFn.clearReader(&smrTable);
×
542
    pInfo->loadInfo.totalRows = 0;
×
543
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
544
    pTaskInfo->code = code;
×
545
    T_LONG_JMP(pTaskInfo->env, code);
×
546
  }
547
  pAPI->metaReaderFn.clearReader(&smrTable);
×
548

549
  if (numOfRows > 0) {
×
550
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
551
    numOfRows = 0;
×
552
  }
553

554
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
555
  setOperatorCompleted(pOperator);
×
556

557
  qDebug("get cols success, total rows:%" PRIu64 ", current:%" PRId64 " %s", pInfo->loadInfo.totalRows,
×
558
         pInfo->pRes->info.rows, GET_TASKID(pTaskInfo));
559
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
560
}
561

562
int32_t doExtractDbName(char* dbname, SSysTableScanInfo* pInfo, SStorageAPI* pAPI) {
4,118,930✔
563
  int32_t     code = TSDB_CODE_SUCCESS;
4,118,930✔
564
  int32_t     lino = 0;
4,118,930✔
565
  SName       sn = {0};
4,118,930✔
566
  const char* db = NULL;
4,118,930✔
567
  int32_t     vgId = 0;
4,118,930✔
568
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
4,118,930✔
569
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
4,118,930✔
570
  QUERY_CHECK_CODE(code, lino, _end);
4,118,930✔
571

572
  code = tNameGetDbName(&sn, varDataVal(dbname));
4,118,930✔
573
  QUERY_CHECK_CODE(code, lino, _end);
4,118,930✔
574

575
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
4,118,930✔
576

577
_end:
4,118,930✔
578
  if (code != TSDB_CODE_SUCCESS) {
4,118,930✔
579
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
580
  }
581
  return code;
4,118,930✔
582
}
583

584
static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
4,313,018✔
585
  int32_t            code = TSDB_CODE_SUCCESS;
4,313,018✔
586
  int32_t            lino = 0;
4,313,018✔
587
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
4,313,018✔
588
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
4,313,018✔
589
  SSysTableScanInfo* pInfo = pOperator->info;
4,313,018✔
590
  int32_t            numOfRows = 0;
4,312,537✔
591
  int32_t            ret = 0;
4,312,537✔
592
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,312,537✔
593
  SSDataBlock*       pDataBlock = NULL;
4,313,018✔
594

595
  if (pOperator->status == OP_EXEC_DONE) {
4,313,018✔
596
    return NULL;
1,078,193✔
597
  }
598

599
  blockDataCleanup(pInfo->pRes);
3,234,825✔
600

601
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_COLS);
3,234,825✔
602
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
3,234,344✔
603

604
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
3,234,344✔
605
  QUERY_CHECK_CODE(code, lino, _end);
3,234,825✔
606

607
  code = doExtractDbName(dbname, pInfo, pAPI);
3,234,825✔
608
  QUERY_CHECK_CODE(code, lino, _end);
3,234,825✔
609

610
  // optimize when sql like where table_name='tablename' and xxx.
611
  if (pInfo->req.filterTb[0]) {
3,234,825✔
612
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
613
    blockDataDestroy(pDataBlock);
×
614
    return p;
×
615
  }
616

617
  if (pInfo->pCur == NULL) {
3,234,825✔
618
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
3,233,097✔
619
  } else {
620
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
1,728✔
621
    if (code != 0) {
1,728✔
622
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
623
      pInfo->pCur = NULL;
×
624
      QUERY_CHECK_CODE(code, lino, _end);
×
625
    }
626
  }
627

628
  if (pInfo->pSchema == NULL) {
3,234,825✔
629
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
3,231,654✔
630
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
3,232,616✔
631
  }
632
  if (pInfo->pExtSchema == NULL) {
3,235,787✔
633
    pInfo->pExtSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
3,232,616✔
634
  }
635

636
  if (!pInfo->pCur || !pInfo->pSchema || !pInfo->pExtSchema) {
3,234,825✔
UNCOV
637
    qError("sysTableScanUserCols failed since %s", terrstr());
×
UNCOV
638
    blockDataDestroy(pDataBlock);
×
639
    pInfo->loadInfo.totalRows = 0;
×
640
    return NULL;
×
641
  }
642

643
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
52,857,022✔
644
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
49,623,925✔
645
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
49,623,925✔
646

647
    SSchemaWrapper* schemaRow = NULL;
49,622,482✔
648
    SExtSchema*     extSchemaRow = NULL;
49,622,482✔
649
    SColRefWrapper* colRef = NULL;
49,622,482✔
650

651
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
49,622,482✔
652
      qDebug("sysTableScanUserCols cursor get super table, %s", GET_TASKID(pTaskInfo));
3,293,263✔
653
      void* schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
3,293,263✔
654
      if (schema == NULL) {
3,293,263✔
655
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&pInfo->pCur->mr.me.stbEntry.schemaRow);
809,354✔
656
        if (pInfo->pCur->mr.me.stbEntry.schemaRow.pSchema) {
809,354✔
657
          QUERY_CHECK_NULL(schemaWrapper, code, lino, _end, terrno);
809,354✔
658
        }
659
        code = taosHashPut(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
809,354✔
660
        if (code == TSDB_CODE_DUP_KEY) {
809,354✔
661
          code = TSDB_CODE_SUCCESS;
×
662
        }
663
        QUERY_CHECK_CODE(code, lino, _end);
809,354✔
664
      }
665

666
      void *pExtSchema = taosHashGet(pInfo->pExtSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
3,293,263✔
667
      if (pExtSchema == NULL) {
3,293,263✔
668
        SExtSchema *pExtSchema = pInfo->pCur->mr.me.pExtSchemas;
809,354✔
669
        code = taosHashPut(pInfo->pExtSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), pExtSchema,
809,354✔
670
          pInfo->pCur->mr.me.stbEntry.schemaRow.nCols * sizeof(SExtSchema));
809,354✔
671
        if (code == TSDB_CODE_DUP_KEY) {
809,354✔
672
          code = TSDB_CODE_SUCCESS;
×
673
        }
674
        QUERY_CHECK_CODE(code, lino, _end);
809,354✔
675
      }
676

677
      continue;
3,293,263✔
678
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
46,330,662✔
679
      qDebug("sysTableScanUserCols cursor get child table, %s", GET_TASKID(pTaskInfo));
44,056,677✔
680

681
      STR_TO_VARSTR(typeName, "CHILD_TABLE");
44,057,639✔
682
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
44,057,639✔
683
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
44,057,639✔
684
      void*   schema = taosHashGet(pInfo->pSchema, &suid, sizeof(int64_t));
44,057,639✔
685
      void*   pExtSchema = taosHashGet(pInfo->pExtSchema, &suid, sizeof(int64_t));
44,057,639✔
686
      if (schema != NULL && pExtSchema != NULL) {
44,057,639✔
687
        schemaRow = *(SSchemaWrapper**)schema;
41,584,728✔
688
        extSchemaRow = (SExtSchema*)pExtSchema;
41,584,728✔
689
      } else {
690
        SMetaReader smrSuperTable = {0};
2,472,911✔
691
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
2,472,911✔
692
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
2,472,911✔
693
        if (code != TSDB_CODE_SUCCESS) {
2,472,430✔
694
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
695
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
696
                 GET_TASKID(pTaskInfo));
697

698
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
699
          blockDataDestroy(pDataBlock);
×
700
          pInfo->loadInfo.totalRows = 0;
×
701
          return NULL;
×
702
        }
703
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
2,472,430✔
704
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
2,472,911✔
705
          if (schemaWrapper == NULL) {
2,472,911✔
706
            code = terrno;
×
707
            lino = __LINE__;
×
708
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
709
            goto _end;
×
710
          }
711
        }
712
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
2,472,911✔
713
        if (code == TSDB_CODE_DUP_KEY) {
2,472,911✔
714
          code = TSDB_CODE_SUCCESS;
×
715
        }
716
        SExtSchema *pExtSchema = smrSuperTable.me.pExtSchemas;
2,472,911✔
717
        code = taosHashPut(pInfo->pExtSchema, &suid, sizeof(int64_t), pExtSchema,
2,472,911✔
718
          smrSuperTable.me.stbEntry.schemaRow.nCols * sizeof(SExtSchema));
2,472,911✔
719
        if (code == TSDB_CODE_DUP_KEY) {
2,472,911✔
720
          code = TSDB_CODE_SUCCESS;
×
721
        }
722
        schemaRow = schemaWrapper;
2,472,911✔
723
        extSchemaRow = taosHashGet(pInfo->pExtSchema, &suid, sizeof(int64_t));
2,472,911✔
724
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
2,472,911✔
725
        QUERY_CHECK_CODE(code, lino, _end);
2,472,911✔
726
      }
727
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
2,273,985✔
728
      qDebug("sysTableScanUserCols cursor get normal table, %s", GET_TASKID(pTaskInfo));
2,208,908✔
729
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
2,208,908✔
730
      extSchemaRow = pInfo->pCur->mr.me.pExtSchemas;
2,208,908✔
731
      STR_TO_VARSTR(typeName, "NORMAL_TABLE");
2,208,908✔
732
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
2,208,908✔
733
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
65,077✔
734
      qDebug("sysTableScanUserCols cursor get virtual normal table, %s", GET_TASKID(pTaskInfo));
35,899✔
735
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
35,899✔
736
      extSchemaRow = pInfo->pCur->mr.me.pExtSchemas;
35,899✔
737
      STR_TO_VARSTR(typeName, "VIRTUAL_NORMAL_TABLE");
35,899✔
738
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
35,899✔
739
      colRef = &pInfo->pCur->mr.me.colRef;
35,899✔
740
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
29,178✔
741
      qDebug("sysTableScanUserCols cursor get virtual child table, %s", GET_TASKID(pTaskInfo));
29,178✔
742

743
      STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
29,178✔
744
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
29,178✔
745

746
      colRef = &pInfo->pCur->mr.me.colRef;
29,178✔
747
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
29,178✔
748
      void*   schema = taosHashGet(pInfo->pSchema, &suid, sizeof(int64_t));
29,178✔
749
      void*   pExtSchema = taosHashGet(pInfo->pExtSchema, &suid, sizeof(int64_t));
29,178✔
750
      if (schema != NULL && pExtSchema != NULL) {
29,178✔
751
        schemaRow = *(SSchemaWrapper**)schema;
18,180✔
752
        extSchemaRow = (SExtSchema*)pExtSchema;
18,180✔
753
      } else {
754
        SMetaReader smrSuperTable = {0};
10,998✔
755
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
10,998✔
756
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
10,998✔
757
        if (code != TSDB_CODE_SUCCESS) {
10,998✔
758
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
759
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
760
                 GET_TASKID(pTaskInfo));
761

762
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
763
          blockDataDestroy(pDataBlock);
×
764
          pInfo->loadInfo.totalRows = 0;
×
765
          return NULL;
×
766
        }
767
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
10,998✔
768
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
10,998✔
769
          if (schemaWrapper == NULL) {
10,998✔
770
            code = terrno;
×
771
            lino = __LINE__;
×
772
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
773
            goto _end;
×
774
          }
775
        }
776
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
10,998✔
777
        if (code == TSDB_CODE_DUP_KEY) {
10,998✔
778
          code = TSDB_CODE_SUCCESS;
×
779
        }
780
        SExtSchema *pExtSchema = smrSuperTable.me.pExtSchemas;
10,998✔
781
        code = taosHashPut(pInfo->pExtSchema, &suid, sizeof(int64_t), pExtSchema,
10,998✔
782
          smrSuperTable.me.stbEntry.schemaRow.nCols * sizeof(SExtSchema));
10,998✔
783
        if (code == TSDB_CODE_DUP_KEY) {
10,998✔
784
          code = TSDB_CODE_SUCCESS;
×
785
        }
786
        schemaRow = schemaWrapper;
10,998✔
787
        extSchemaRow = taosHashGet(pInfo->pExtSchema, &suid, sizeof(int64_t));
10,998✔
788
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
10,998✔
789
        QUERY_CHECK_CODE(code, lino, _end);
10,998✔
790
      }
791
    } else {
792
      qDebug("sysTableScanUserCols cursor get invalid table, %s", GET_TASKID(pTaskInfo));
×
793
      continue;
×
794
    }
795

796
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
46,331,143✔
797
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
5,184✔
798
      numOfRows = 0;
5,184✔
799

800
      if (pInfo->pRes->info.rows > 0) {
5,184✔
801
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
1,728✔
802
        break;
1,728✔
803
      }
804
    }
805
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
806
    code =
807
        sysTableUserColsFillOneTableCols(dbname, &numOfRows, pDataBlock, tableName, schemaRow, extSchemaRow, typeName, colRef);
46,329,415✔
808
    QUERY_CHECK_CODE(code, lino, _end);
46,329,896✔
809
  }
810

811
  if (numOfRows > 0) {
3,234,344✔
812
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
3,231,632✔
813
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
3,232,113✔
814
    numOfRows = 0;
3,232,113✔
815
  }
816

817
  blockDataDestroy(pDataBlock);
3,234,825✔
818
  pDataBlock = NULL;
3,234,825✔
819
  if (ret != 0) {
3,234,825✔
820
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
3,233,097✔
821
    pInfo->pCur = NULL;
3,233,097✔
822
    setOperatorCompleted(pOperator);
3,233,097✔
823
  }
824

825
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
3,234,825✔
826
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
3,234,825✔
827

828
_end:
3,234,825✔
829
  if (code != TSDB_CODE_SUCCESS) {
3,234,825✔
830
    blockDataDestroy(pDataBlock);
×
831
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
832
    pTaskInfo->code = code;
×
833
    T_LONG_JMP(pTaskInfo->env, code);
×
834
  }
835
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
3,234,825✔
836
}
837

838
static bool virtualChildTableNeedCollect(STableListInfo* pTableListInfo, tb_uid_t tableUid) {
2,072,142✔
839
  for (int32_t i = 0; i < taosArrayGetSize(pTableListInfo->pTableList); i++) {
9,019,111✔
840
    tb_uid_t* childUid = taosArrayGet(pTableListInfo->pTableList, i);
8,708,996✔
841
    if (childUid == NULL) {
8,708,996✔
842
      return false;
×
843
    }
844
    if (*childUid == tableUid) {
8,708,996✔
845
      return true;
1,762,027✔
846
    }
847
  }
848
  return false;
310,115✔
849
}
850

851
static SSDataBlock* sysTableScanUserVcCols(SOperatorInfo* pOperator) {
1,290,686✔
852
  int32_t            code = TSDB_CODE_SUCCESS;
1,290,686✔
853
  int32_t            lino = 0;
1,290,686✔
854
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
1,290,686✔
855
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
1,291,244✔
856
  SSysTableScanInfo* pInfo = pOperator->info;
1,291,244✔
857
  int32_t            numOfRows = 0;
1,291,244✔
858
  int32_t            ret = 0;
1,291,244✔
859
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,291,244✔
860
  SSDataBlock*       pDataBlock = NULL;
1,291,244✔
861

862
  if (pOperator->status == OP_EXEC_DONE) {
1,291,244✔
863
    return NULL;
407,139✔
864
  }
865

866
  blockDataCleanup(pInfo->pRes);
884,105✔
867

868
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_VC_COLS);
884,105✔
869
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
884,105✔
870

871
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
884,105✔
872
  QUERY_CHECK_CODE(code, lino, _end);
884,105✔
873

874
  code = doExtractDbName(dbname, pInfo, pAPI);
884,105✔
875
  QUERY_CHECK_CODE(code, lino, _end);
884,105✔
876

877
  // optimize when sql like where table_name='tablename' and xxx.
878
  if (pInfo->req.filterTb[0]) {
884,105✔
879
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
880
    blockDataDestroy(pDataBlock);
×
881
    return p;
×
882
  }
883

884
  if (pInfo->pCur == NULL) {
884,105✔
885
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
883,764✔
886
  } else {
887
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
341✔
888
    if (code != 0) {
341✔
889
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
890
      pInfo->pCur = NULL;
×
891
      QUERY_CHECK_CODE(code, lino, _end);
×
892
    }
893
  }
894

895
  if (pInfo->pSchema == NULL) {
884,105✔
896
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
883,764✔
897
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
883,764✔
898
  }
899

900
  if (!pInfo->pCur || !pInfo->pSchema) {
884,105✔
901
    qError("sysTableScanUserVcCols failed since %s", terrstr());
×
902
    blockDataDestroy(pDataBlock);
×
903
    pInfo->loadInfo.totalRows = 0;
×
904
    return NULL;
×
905
  }
906

907
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
29,426,521✔
908
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,515,942✔
909
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,535,038✔
910
    char stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28,492,971✔
911

912
    SSchemaWrapper* schemaRow = NULL;
28,489,482✔
913
    SColRefWrapper* colRef = NULL;
28,489,482✔
914

915
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
28,489,482✔
916
      continue;
3,116,710✔
917
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
25,459,045✔
918
      continue;
6,824,659✔
919
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
18,622,313✔
920
      continue;
16,269,208✔
921
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
2,343,216✔
922
      qDebug("sysTableScanUserVcCols cursor get virtual normal table, %s", GET_TASKID(pTaskInfo));
271,074✔
923

924
      STR_TO_VARSTR(typeName, "VIRTUAL_NORMAL_TABLE");
271,074✔
925
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
271,074✔
926
      STR_TO_VARSTR(stableName, pInfo->pCur->mr.me.name);
271,074✔
927

928
      colRef = &pInfo->pCur->mr.me.colRef;
271,074✔
929
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
271,074✔
930
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
2,072,142✔
931
      qDebug("sysTableScanUserVcCols cursor get virtual child table, %s", GET_TASKID(pTaskInfo));
2,072,142✔
932

933
      STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
2,072,142✔
934
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
2,072,142✔
935
      if (!virtualChildTableNeedCollect(pInfo->pSubTableListInfo, pInfo->pCur->mr.me.uid)) {
2,072,142✔
936
        qDebug("skip virtual child table:%s uid:%" PRId64 " %s", varDataVal(tableName), pInfo->pCur->mr.me.uid,
310,115✔
937
              GET_TASKID(pTaskInfo));
938
        continue;
310,115✔
939
      }
940
      colRef = &pInfo->pCur->mr.me.colRef;
1,762,027✔
941
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
1,762,027✔
942
      void*   schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.ctbEntry.suid, sizeof(int64_t));
1,762,027✔
943
      if (schema != NULL) {
1,762,027✔
944
        schemaRow = *(SSchemaWrapper**)schema;
1,426,453✔
945
        SMetaReader smrSuperTable = {0};
1,426,453✔
946
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
1,426,453✔
947
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
1,426,453✔
948
        if (code != TSDB_CODE_SUCCESS) {
1,426,453✔
949
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
950
          qError("sysTableScanUserVcCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
951
                 GET_TASKID(pTaskInfo));
952

953
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
954
          blockDataDestroy(pDataBlock);
×
955
          pInfo->loadInfo.totalRows = 0;
×
956
          return NULL;
×
957
        }
958
        STR_TO_VARSTR(stableName, smrSuperTable.me.name);
1,426,453✔
959
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
1,426,453✔
960
      } else {
961
        SMetaReader smrSuperTable = {0};
335,574✔
962
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
335,574✔
963
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
335,574✔
964
        if (code != TSDB_CODE_SUCCESS) {
335,574✔
965
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
966
          qError("sysTableScanUserVcCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
967
                 GET_TASKID(pTaskInfo));
968

969
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
970
          blockDataDestroy(pDataBlock);
×
971
          pInfo->loadInfo.totalRows = 0;
×
972
          return NULL;
×
973
        }
974
        STR_TO_VARSTR(stableName, smrSuperTable.me.name);
335,574✔
975
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
335,574✔
976
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
335,574✔
977
          if (schemaWrapper == NULL) {
335,574✔
978
            code = terrno;
×
979
            lino = __LINE__;
×
980
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
981
            goto _end;
×
982
          }
983
        }
984
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
335,574✔
985
        if (code == TSDB_CODE_DUP_KEY) {
335,574✔
986
          code = TSDB_CODE_SUCCESS;
×
987
        }
988
        schemaRow = schemaWrapper;
335,574✔
989
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
335,574✔
990
        QUERY_CHECK_CODE(code, lino, _end);
335,574✔
991
      }
992
    } else {
993
      qDebug("sysTableScanUserVcCols cursor get invalid table, %s", GET_TASKID(pTaskInfo));
×
994
      continue;
×
995
    }
996

997
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
2,033,101✔
998
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
341✔
999
      numOfRows = 0;
341✔
1000

1001
      if (pInfo->pRes->info.rows > 0) {
341✔
1002
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
341✔
1003
        break;
341✔
1004
      }
1005
    }
1006
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
1007
    code = sysTableUserColsFillOneVirtualTableCols(pInfo, dbname, &numOfRows, pDataBlock, tableName, stableName, schemaRow, typeName, colRef, pInfo->pCur->mr.me.uid, pOperator->pTaskInfo->id.vgId);
2,032,760✔
1008
    QUERY_CHECK_CODE(code, lino, _end);
2,032,760✔
1009
  }
1010

1011
  if (numOfRows > 0) {
884,105✔
1012
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
407,139✔
1013
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
407,139✔
1014
    numOfRows = 0;
407,139✔
1015
  }
1016

1017
  blockDataDestroy(pDataBlock);
884,105✔
1018
  pDataBlock = NULL;
883,547✔
1019
  if (ret != 0) {
883,547✔
1020
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
883,206✔
1021
    pInfo->pCur = NULL;
883,764✔
1022
    setOperatorCompleted(pOperator);
883,764✔
1023
  }
1024

1025
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
884,105✔
1026
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
884,105✔
1027

1028
_end:
884,105✔
1029
  if (code != TSDB_CODE_SUCCESS) {
884,105✔
1030
    blockDataDestroy(pDataBlock);
×
1031
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1032
    pTaskInfo->code = code;
×
1033
    T_LONG_JMP(pTaskInfo->env, code);
×
1034
  }
1035
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
884,105✔
1036
}
1037

1038

1039
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
1,562,700✔
1040
  int32_t        code = TSDB_CODE_SUCCESS;
1,562,700✔
1041
  int32_t        lino = 0;
1,562,700✔
1042
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
1,562,700✔
1043
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
1,562,700✔
1044
  SSDataBlock*   dataBlock = NULL;
1,562,700✔
1045

1046
  SSysTableScanInfo* pInfo = pOperator->info;
1,562,700✔
1047
  if (pOperator->status == OP_EXEC_DONE) {
1,562,700✔
1048
    return NULL;
734,662✔
1049
  }
1050

1051
  blockDataCleanup(pInfo->pRes);
828,038✔
1052
  int32_t numOfRows = 0;
828,038✔
1053

1054
  dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS);
828,038✔
1055
  QUERY_CHECK_NULL(dataBlock, code, lino, _end, terrno);
828,038✔
1056

1057
  code = blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity);
828,038✔
1058
  QUERY_CHECK_CODE(code, lino, _end);
828,038✔
1059

1060
  const char* db = NULL;
828,038✔
1061
  int32_t     vgId = 0;
828,038✔
1062
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
828,038✔
1063

1064
  SName sn = {0};
828,038✔
1065
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
828,038✔
1066
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
828,038✔
1067
  QUERY_CHECK_CODE(code, lino, _end);
828,038✔
1068

1069
  code = tNameGetDbName(&sn, varDataVal(dbname));
828,038✔
1070
  QUERY_CHECK_CODE(code, lino, _end);
828,038✔
1071

1072
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
828,038✔
1073

1074
  char condTableName[TSDB_TABLE_NAME_LEN] = {0};
828,038✔
1075
  // optimize when sql like where table_name='tablename' and xxx.
1076
  if (pInfo->pCondition && sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) {
828,038✔
1077
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
1078
    STR_TO_VARSTR(tableName, condTableName);
×
1079

1080
    SMetaReader smrChildTable = {0};
×
1081
    pAPI->metaReaderFn.initReader(&smrChildTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
1082
    code = pAPI->metaReaderFn.getTableEntryByName(&smrChildTable, condTableName);
×
1083
    if (code != TSDB_CODE_SUCCESS) {
×
1084
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
1085
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1086
      blockDataDestroy(dataBlock);
×
1087
      pInfo->loadInfo.totalRows = 0;
×
1088
      return NULL;
×
1089
    }
1090

1091
    if (smrChildTable.me.type != TSDB_CHILD_TABLE && smrChildTable.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
×
1092
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1093
      blockDataDestroy(dataBlock);
×
1094
      pInfo->loadInfo.totalRows = 0;
×
1095
      return NULL;
×
1096
    }
1097

1098
    SMetaReader smrSuperTable = {0};
×
1099
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
×
1100
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid);
×
1101
    if (code != TSDB_CODE_SUCCESS) {
×
1102
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByUid
1103
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1104
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1105
      blockDataDestroy(dataBlock);
×
1106
      return NULL;
×
1107
    }
1108

1109
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows,
×
1110
                                            dataBlock);
1111

1112
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1113
    pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1114

1115
    QUERY_CHECK_CODE(code, lino, _end);
×
1116

1117
    if (numOfRows > 0) {
×
1118
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
1119
      numOfRows = 0;
×
1120
    }
1121
    blockDataDestroy(dataBlock);
×
1122
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
1123
    setOperatorCompleted(pOperator);
×
1124
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
1125
  }
1126

1127
  int32_t ret = 0;
828,038✔
1128
  if (pInfo->pCur == NULL) {
828,038✔
1129
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
828,038✔
1130
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
828,038✔
1131
  } else {
1132
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
×
1133
    QUERY_CHECK_CODE(code, lino, _end);
×
1134
  }
1135

1136
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
51,860,380✔
1137
    if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE && pInfo->pCur->mr.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
51,032,201✔
1138
      continue;
98,364✔
1139
    }
1140

1141
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
50,934,068✔
1142
    STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
50,933,771✔
1143

1144
    SMetaReader smrSuperTable = {0};
50,933,969✔
1145
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
50,933,936✔
1146
    uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
50,934,035✔
1147
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
50,934,035✔
1148
    if (code != TSDB_CODE_SUCCESS) {
50,933,771✔
1149
      qError("failed to get super table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno),
×
1150
             GET_TASKID(pTaskInfo));
1151
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1152
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1153
      pInfo->pCur = NULL;
×
1154
      blockDataDestroy(dataBlock);
×
1155
      dataBlock = NULL;
×
1156
      T_LONG_JMP(pTaskInfo->env, terrno);
×
1157
    }
1158

1159
    if ((smrSuperTable.me.stbEntry.schemaTag.nCols + numOfRows) > pOperator->resultInfo.capacity) {
50,933,771✔
1160
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
1161
      numOfRows = 0;
×
1162

1163
      if (pInfo->pRes->info.rows > 0) {
×
1164
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
1165
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1166
        break;
×
1167
      }
1168
    }
1169

1170
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
1171
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &pInfo->pCur->mr, dbname, tableName, &numOfRows,
50,933,837✔
1172
                                            dataBlock);
1173

1174
    if (code != TSDB_CODE_SUCCESS) {
50,933,309✔
1175
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1176
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1177
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1178
      pInfo->pCur = NULL;
×
1179
      blockDataDestroy(dataBlock);
×
1180
      dataBlock = NULL;
×
1181
      T_LONG_JMP(pTaskInfo->env, terrno);
×
1182
    }
1183
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
50,933,309✔
1184
  }
1185

1186
  if (numOfRows > 0) {
828,038✔
1187
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
819,750✔
1188
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
819,750✔
1189
    numOfRows = 0;
819,750✔
1190
  }
1191

1192
  blockDataDestroy(dataBlock);
828,038✔
1193
  dataBlock = NULL;
828,038✔
1194
  if (ret != 0) {
828,038✔
1195
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
828,038✔
1196
    pInfo->pCur = NULL;
828,038✔
1197
    setOperatorCompleted(pOperator);
828,038✔
1198
  }
1199

1200
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
828,038✔
1201

1202
_end:
828,038✔
1203
  if (code != TSDB_CODE_SUCCESS) {
828,038✔
1204
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1205
    blockDataDestroy(dataBlock);
×
1206
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1207
    pInfo->pCur = NULL;
×
1208
    pTaskInfo->code = code;
×
1209
    T_LONG_JMP(pTaskInfo->env, code);
×
1210
  }
1211
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
828,038✔
1212
}
1213

1214
void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
4,464,527✔
1215
                                        SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo) {
1216
  int32_t code = TSDB_CODE_SUCCESS;
4,464,527✔
1217
  int32_t lino = 0;
4,464,527✔
1218
  dataBlock->info.rows = numOfRows;
4,464,527✔
1219
  pInfo->pRes->info.rows = numOfRows;
4,464,527✔
1220

1221
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, dataBlock->pDataBlock, false);
4,464,527✔
1222
  QUERY_CHECK_CODE(code, lino, _end);
4,464,046✔
1223

1224
  code = doFilter(pInfo->pRes, pFilterInfo, NULL, NULL);
4,464,046✔
1225
  QUERY_CHECK_CODE(code, lino, _end);
4,464,527✔
1226

1227
  blockDataCleanup(dataBlock);
4,464,527✔
1228

1229
_end:
4,464,527✔
1230
  if (code != TSDB_CODE_SUCCESS) {
4,464,527✔
1231
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1232
    pTaskInfo->code = code;
×
1233
    T_LONG_JMP(pTaskInfo->env, code);
×
1234
  }
1235
}
4,464,527✔
1236

1237
int32_t convertTagDataToStr(char* str, int32_t strBuffLen, int type, void* buf, int32_t bufSize, int32_t* len) {
822,795,574✔
1238
  int32_t n = 0;
822,795,574✔
1239

1240
  switch (type) {
822,795,574✔
1241
    case TSDB_DATA_TYPE_NULL:
×
1242
      n = tsnprintf(str, strBuffLen, "null");
×
1243
      break;
×
1244

1245
    case TSDB_DATA_TYPE_BOOL:
649,396,583✔
1246
      n = tsnprintf(str, strBuffLen, (*(int8_t*)buf) ? "true" : "false");
649,396,583✔
1247
      break;
649,396,583✔
1248

1249
    case TSDB_DATA_TYPE_TINYINT:
538,488✔
1250
      n = tsnprintf(str, strBuffLen, "%d", *(int8_t*)buf);
538,488✔
1251
      break;
538,455✔
1252

1253
    case TSDB_DATA_TYPE_SMALLINT:
461,915✔
1254
      n = tsnprintf(str, strBuffLen, "%d", *(int16_t*)buf);
461,915✔
1255
      break;
461,882✔
1256

1257
    case TSDB_DATA_TYPE_INT:
42,766,838✔
1258
      n = tsnprintf(str, strBuffLen, "%d", *(int32_t*)buf);
42,766,838✔
1259
      break;
42,766,534✔
1260

1261
    case TSDB_DATA_TYPE_BIGINT:
42,620,205✔
1262
    case TSDB_DATA_TYPE_TIMESTAMP:
1263
      n = tsnprintf(str, strBuffLen, "%" PRId64, *(int64_t*)buf);
42,620,205✔
1264
      break;
42,620,172✔
1265

1266
    case TSDB_DATA_TYPE_FLOAT:
41,556,897✔
1267
      n = tsnprintf(str, strBuffLen, "%.5f", GET_FLOAT_VAL(buf));
41,556,897✔
1268
      break;
41,556,765✔
1269

1270
    case TSDB_DATA_TYPE_DOUBLE:
41,438,914✔
1271
      n = tsnprintf(str, strBuffLen, "%.9f", GET_DOUBLE_VAL(buf));
41,438,914✔
1272
      break;
41,438,914✔
1273

1274
    case TSDB_DATA_TYPE_BINARY:
930,495✔
1275
    case TSDB_DATA_TYPE_VARBINARY:
1276
    case TSDB_DATA_TYPE_GEOMETRY:
1277
      if (bufSize < 0) {
930,495✔
1278
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1279
      }
1280

1281
      memcpy(str, buf, bufSize);
930,495✔
1282
      n = bufSize;
930,495✔
1283
      break;
930,495✔
1284
    case TSDB_DATA_TYPE_NCHAR:
651,311✔
1285
      if (bufSize < 0) {
651,311✔
1286
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1287
      }
1288

1289
      int32_t length = taosUcs4ToMbs((TdUcs4*)buf, bufSize, str, NULL);
651,311✔
1290
      if (length <= 0) {
651,245✔
1291
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1292
      }
1293
      n = length;
651,245✔
1294
      break;
651,245✔
1295
    case TSDB_DATA_TYPE_UTINYINT:
330,900✔
1296
      n = tsnprintf(str, strBuffLen, "%u", *(uint8_t*)buf);
330,900✔
1297
      break;
330,834✔
1298

1299
    case TSDB_DATA_TYPE_USMALLINT:
306,018✔
1300
      n = tsnprintf(str, strBuffLen, "%u", *(uint16_t*)buf);
306,018✔
1301
      break;
306,018✔
1302

1303
    case TSDB_DATA_TYPE_UINT:
1,495,752✔
1304
      n = tsnprintf(str, strBuffLen, "%u", *(uint32_t*)buf);
1,495,752✔
1305
      break;
1,495,785✔
1306

1307
    case TSDB_DATA_TYPE_UBIGINT:
307,647✔
1308
      n = tsnprintf(str, strBuffLen, "%" PRIu64, *(uint64_t*)buf);
307,647✔
1309
      break;
306,492✔
1310

UNCOV
1311
    default:
×
UNCOV
1312
      return TSDB_CODE_TSC_INVALID_VALUE;
×
1313
  }
1314

1315
  if (len) *len = n;
822,800,174✔
1316

1317
  return TSDB_CODE_SUCCESS;
822,800,669✔
1318
}
1319

1320
static int32_t sysTableGetGeomText(char* iGeom, int32_t nGeom, char** output, int32_t* nOutput) {
49,157✔
1321
#ifdef USE_GEOS
1322
  int32_t code = 0;
49,157✔
1323
  char*   outputWKT = NULL;
49,157✔
1324

1325
  if (nGeom == 0) {
49,157✔
1326
    if (!(*output = taosStrdup(""))) code = terrno;
×
1327
    *nOutput = 0;
×
1328
    return code;
×
1329
  }
1330

1331
  if (TSDB_CODE_SUCCESS != (code = initCtxAsText()) ||
98,314✔
1332
      TSDB_CODE_SUCCESS != (code = doAsText(iGeom, nGeom, &outputWKT))) {
49,157✔
1333
    qError("geo text for systable failed:%s", getGeosErrMsg(code));
×
1334
    *output = NULL;
×
1335
    *nOutput = 0;
×
1336
    return code;
×
1337
  }
1338

1339
  *output = outputWKT;
49,157✔
1340
  *nOutput = strlen(outputWKT);
49,157✔
1341

1342
  return code;
49,157✔
1343
#else
1344
  TAOS_RETURN(TSDB_CODE_OPS_NOT_SUPPORT);
1345
#endif
1346
}
1347

1348
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
50,933,837✔
1349
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
1350
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock) {
1351
  int32_t code = TSDB_CODE_SUCCESS;
50,933,837✔
1352
  int32_t lino = 0;
50,933,837✔
1353
  char    stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
50,933,837✔
1354
  STR_TO_VARSTR(stableName, (*smrSuperTable).me.name);
50,933,936✔
1355

1356
  int32_t numOfRows = *pNumOfRows;
50,933,672✔
1357

1358
  int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols;
50,933,870✔
1359
  for (int32_t i = 0; i < numOfTags; ++i) {
876,325,147✔
1360
    SColumnInfoData* pColInfoData = NULL;
825,391,046✔
1361

1362
    // table name
1363
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
825,391,046✔
1364
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,391,785✔
1365
    code = colDataSetVal(pColInfoData, numOfRows, tableName, false);
825,391,785✔
1366
    QUERY_CHECK_CODE(code, lino, _end);
825,392,188✔
1367

1368
    // database name
1369
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
825,392,188✔
1370
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,384,895✔
1371
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
825,384,895✔
1372
    QUERY_CHECK_CODE(code, lino, _end);
825,392,419✔
1373

1374
    // super table name
1375
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
825,392,419✔
1376
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,392,089✔
1377
    code = colDataSetVal(pColInfoData, numOfRows, stableName, false);
825,392,089✔
1378
    QUERY_CHECK_CODE(code, lino, _end);
825,392,650✔
1379

1380
    // tag name
1381
    char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
825,392,650✔
1382
    STR_TO_VARSTR(tagName, (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].name);
825,392,650✔
1383
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
825,392,452✔
1384
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,391,990✔
1385
    code = colDataSetVal(pColInfoData, numOfRows, tagName, false);
825,391,990✔
1386
    QUERY_CHECK_CODE(code, lino, _end);
825,392,148✔
1387

1388
    // tag type
1389
    int8_t tagType = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].type;
825,392,148✔
1390

1391
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
825,391,653✔
1392
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,391,917✔
1393
    int32_t tagStrBufflen = 32;
825,391,917✔
1394
    char    tagTypeStr[VARSTR_HEADER_SIZE + 32];
825,391,917✔
1395
    int     tagTypeLen = tsnprintf(varDataVal(tagTypeStr), tagStrBufflen, "%s", tDataTypes[tagType].name);
825,391,983✔
1396
    tagStrBufflen -= tagTypeLen;
825,358,957✔
1397
    if (tagStrBufflen <= 0) {
825,358,957✔
1398
      code = TSDB_CODE_INVALID_PARA;
×
1399
      QUERY_CHECK_CODE(code, lino, _end);
×
1400
    }
1401

1402
    if (tagType == TSDB_DATA_TYPE_NCHAR) {
825,358,957✔
1403
      tagTypeLen += tsnprintf(
728,856✔
1404
          varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
728,889✔
1405
          (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
728,922✔
1406
    } else if (IS_VAR_DATA_TYPE(tagType)) {
824,630,035✔
1407
      if (IS_STR_DATA_BLOB(tagType)) {
1,314,682✔
1408
        code = TSDB_CODE_BLOB_NOT_SUPPORT_TAG;
×
1409
        QUERY_CHECK_CODE(code, lino, _end);
×
1410
      }
1411
      tagTypeLen += tsnprintf(varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
1,347,682✔
1412
                              (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE));
1,314,682✔
1413
    }
1414
    varDataSetLen(tagTypeStr, tagTypeLen);
825,391,924✔
1415
    code = colDataSetVal(pColInfoData, numOfRows, (char*)tagTypeStr, false);
825,391,396✔
1416
    QUERY_CHECK_CODE(code, lino, _end);
825,392,485✔
1417

1418
    STagVal tagVal = {0};
825,392,485✔
1419
    tagVal.cid = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].colId;
825,392,518✔
1420
    char*    tagData = NULL;
825,392,155✔
1421
    uint32_t tagLen = 0;
825,392,188✔
1422

1423
    if (tagType == TSDB_DATA_TYPE_JSON) {
825,392,188✔
1424
      tagData = (char*)smrChildTable->me.ctbEntry.pTags;
134,045✔
1425
    } else {
1426
      bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal);
825,258,143✔
1427
      if (exist) {
825,257,912✔
1428
        if (tagType == TSDB_DATA_TYPE_GEOMETRY) {
822,910,017✔
1429
          code = sysTableGetGeomText(tagVal.pData, tagVal.nData, &tagData, &tagLen);
49,157✔
1430
          QUERY_CHECK_CODE(code, lino, _end);
49,157✔
1431
        } else if (tagType == TSDB_DATA_TYPE_VARBINARY) {
822,860,860✔
1432
          code = taosAscii2Hex(tagVal.pData, tagVal.nData, (void**)&tagData, &tagLen);
317,960✔
1433
          if (code < 0) {
317,960✔
1434
            qError("varbinary for systable failed since %s", tstrerror(code));
×
1435
          }
1436
        } else if (IS_VAR_DATA_TYPE(tagType)) {
822,542,900✔
1437
          tagData = (char*)tagVal.pData;
1,323,139✔
1438
          tagLen = tagVal.nData;
1,323,139✔
1439
        } else {
1440
          tagData = (char*)&tagVal.i64;
821,219,761✔
1441
          tagLen = tDataTypes[tagType].bytes;
821,219,761✔
1442
        }
1443
      }
1444
    }
1445

1446
    char* tagVarChar = NULL;
825,391,858✔
1447
    if (tagData != NULL) {
825,391,858✔
1448
      if (IS_STR_DATA_BLOB(tagType)) {
823,044,227✔
1449
        code = TSDB_CODE_BLOB_NOT_SUPPORT_TAG;
99✔
1450
        goto _end;
99✔
1451
      }
1452

1453
      if (tagType == TSDB_DATA_TYPE_JSON) {
823,044,128✔
1454
        char* tagJson = NULL;
134,045✔
1455
        parseTagDatatoJson(tagData, &tagJson, NULL);
134,045✔
1456
        if (tagJson == NULL) {
134,045✔
1457
          code = terrno;
×
1458
          goto _end;
×
1459
        }
1460
        tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE);
134,045✔
1461
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
134,045✔
1462
        memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson));
134,045✔
1463
        varDataSetLen(tagVarChar, strlen(tagJson));
134,045✔
1464
        taosMemoryFree(tagJson);
134,045✔
1465
      } else {
1466
        int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE)
822,910,083✔
1467
                                                    : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE);
1468
        tagVarChar = taosMemoryCalloc(1, bufSize + 1);
822,910,083✔
1469
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
822,905,383✔
1470
        int32_t len = -1;
822,905,383✔
1471
        if (tagLen > 0)
822,905,350✔
1472
          convertTagDataToStr(varDataVal(tagVarChar), bufSize + 1 - VARSTR_HEADER_SIZE, tagType, tagData, tagLen, &len);
822,796,636✔
1473
        else
1474
          len = 0;
108,714✔
1475
        varDataSetLen(tagVarChar, len);
822,909,185✔
1476
      }
1477
    }
1478
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
825,391,059✔
1479
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
825,391,719✔
1480
    code = colDataSetVal(pColInfoData, numOfRows, tagVarChar,
825,391,719✔
1481
                         (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData)));
825,391,719✔
1482
    QUERY_CHECK_CODE(code, lino, _end);
825,391,897✔
1483

1484
    if (tagType == TSDB_DATA_TYPE_GEOMETRY || tagType == TSDB_DATA_TYPE_VARBINARY) taosMemoryFreeClear(tagData);
825,391,897✔
1485
    taosMemoryFree(tagVarChar);
825,391,897✔
1486
    ++numOfRows;
825,391,389✔
1487
  }
1488

1489
  *pNumOfRows = numOfRows;
50,934,101✔
1490

1491
_end:
50,934,068✔
1492
  if (code != TSDB_CODE_SUCCESS) {
50,934,101✔
1493
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1494
  }
1495
  return code;
50,934,101✔
1496
}
1497

1498
static int32_t sysTableUserColsFillOneTableCols(const char* dbname, int32_t* pNumOfRows,
46,329,896✔
1499
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
1500
                                                SExtSchema* extSchemaRow, char* tableType, SColRefWrapper* colRef) {
1501
  int32_t code = TSDB_CODE_SUCCESS;
46,329,896✔
1502
  int32_t lino = 0;
46,329,896✔
1503
  if (schemaRow == NULL) {
46,329,896✔
1504
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1505
    return TSDB_CODE_SUCCESS;
×
1506
  }
1507
  int32_t numOfRows = *pNumOfRows;
46,329,896✔
1508

1509
  int32_t numOfCols = schemaRow->nCols;
46,329,415✔
1510
  for (int32_t i = 0; i < numOfCols; ++i) {
1,074,016,196✔
1511
    SColumnInfoData* pColInfoData = NULL;
1,027,686,300✔
1512

1513
    // table name
1514
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
1,027,686,300✔
1515
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,688,705✔
1516
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
1,027,688,705✔
1517
    QUERY_CHECK_CODE(code, lino, _end);
1,027,687,618✔
1518

1519
    // database name
1520
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
1,027,687,618✔
1521
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,687,618✔
1522
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
1,027,687,618✔
1523
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,224✔
1524

1525
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
1,027,688,224✔
1526
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,688,224✔
1527
    code = colDataSetVal(pColInfoData, numOfRows, tableType, false);
1,027,688,224✔
1528
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,705✔
1529

1530
    // col name
1531
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,027,688,705✔
1532
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
1,027,688,705✔
1533
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
1,027,688,705✔
1534
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,687,743✔
1535
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
1,027,687,743✔
1536
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,705✔
1537

1538
    // col type
1539
    int8_t colType = schemaRow->pSchema[i].type;
1,027,688,705✔
1540
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
1,027,688,224✔
1541
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,688,224✔
1542
    int32_t colStrBufflen = 32;
1,027,688,224✔
1543
    char    colTypeStr[VARSTR_HEADER_SIZE + 32];
1,027,688,224✔
1544
    int     colTypeLen = tsnprintf(varDataVal(colTypeStr), colStrBufflen, "%s", tDataTypes[colType].name);
1,027,688,705✔
1545
    colStrBufflen -= colTypeLen;
1,027,688,224✔
1546
    if (colStrBufflen <= 0) {
1,027,688,224✔
1547
      code = TSDB_CODE_INVALID_PARA;
×
1548
      QUERY_CHECK_CODE(code, lino, _end);
×
1549
    }
1550
    if (colType == TSDB_DATA_TYPE_VARCHAR) {
1,027,688,224✔
1551
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
11,923,103✔
1552
                              (int32_t)(schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE));
11,923,103✔
1553
    } else if (colType == TSDB_DATA_TYPE_NCHAR) {
1,015,765,121✔
1554
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
2,766,548✔
1555
                              (int32_t)((schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
2,766,548✔
1556
    } else if (IS_DECIMAL_TYPE(colType)) {
1,012,998,573✔
1557
      QUERY_CHECK_NULL(extSchemaRow, code, lino, _end, TSDB_CODE_INVALID_PARA);
×
1558
      STypeMod typeMod = extSchemaRow[i].typeMod;
×
1559
      uint8_t prec = 0, scale = 0;
×
1560
      decimalFromTypeMod(typeMod, &prec, &scale);
×
1561
      colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
1562
    }
1563
    varDataSetLen(colTypeStr, colTypeLen);
1,027,687,743✔
1564
    code = colDataSetVal(pColInfoData, numOfRows, (char*)colTypeStr, false);
1,027,687,262✔
1565
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,705✔
1566

1567
    // col length
1568
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
1,027,688,705✔
1569
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,688,224✔
1570
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].bytes, false);
1,027,688,224✔
1571
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,224✔
1572

1573
    // col precision, col scale, col nullable
1574
    for (int32_t j = 6; j <= 8; ++j) {
2,147,483,647✔
1575
      pColInfoData = taosArrayGet(dataBlock->pDataBlock, j);
2,147,483,647✔
1576
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,147,483,647✔
1577
      colDataSetNULL(pColInfoData, numOfRows);
2,147,483,647✔
1578
    }
1579

1580
    // col data source
1581
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 9);
1,027,691,023✔
1582
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,688,705✔
1583
    if (!colRef || !colRef->pColRef[i].hasRef) {
1,027,688,705✔
1584
      colDataSetNULL(pColInfoData, numOfRows);
1,026,883,213✔
1585
    } else {
1586
      char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
805,492✔
1587
      char tmpColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
805,492✔
1588
      strcat(tmpColName, colRef->pColRef[i].refDbName);
805,492✔
1589
      strcat(tmpColName, ".");
805,492✔
1590
      strcat(tmpColName, colRef->pColRef[i].refTableName);
805,492✔
1591
      strcat(tmpColName, ".");
805,492✔
1592
      strcat(tmpColName, colRef->pColRef[i].refColName);
804,280✔
1593
      STR_TO_VARSTR(refColName, tmpColName);
805,492✔
1594

1595
      code = colDataSetVal(pColInfoData, numOfRows, (char*)refColName, false);
805,492✔
1596
      QUERY_CHECK_CODE(code, lino, _end);
805,492✔
1597
    }
1598

1599
    // col id
1600
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 10);
1,027,687,137✔
1601
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,027,687,137✔
1602
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].colId, false);
1,027,687,137✔
1603
    QUERY_CHECK_CODE(code, lino, _end);
1,027,688,705✔
1604

1605
    ++numOfRows;
1,027,688,705✔
1606
  }
1607

1608
  *pNumOfRows = numOfRows;
46,329,896✔
1609

1610
_end:
46,330,377✔
1611
  if (code != TSDB_CODE_SUCCESS) {
46,330,377✔
1612
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1613
  }
1614
  return code;
46,329,896✔
1615
}
1616

1617
static int32_t sysTableUserColsFillOneVirtualTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
2,032,760✔
1618
                                                       const SSDataBlock* dataBlock, char* tName, char* stName,
1619
                                                       SSchemaWrapper* schemaRow, char* tableType, SColRefWrapper *colRef,
1620
                                                       tb_uid_t uid, int32_t vgId) {
1621
  int32_t code = TSDB_CODE_SUCCESS;
2,032,760✔
1622
  int32_t lino = 0;
2,032,760✔
1623
  if (schemaRow == NULL) {
2,032,760✔
1624
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1625
    return TSDB_CODE_SUCCESS;
×
1626
  }
1627
  int32_t numOfRows = *pNumOfRows;
2,032,760✔
1628

1629
  int32_t numOfCols = schemaRow->nCols;
2,032,760✔
1630
  for (int32_t i = 0; i < numOfCols; ++i) {
39,214,259✔
1631
    SColumnInfoData* pColInfoData = NULL;
37,181,499✔
1632

1633
    // table name
1634
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
37,181,499✔
1635
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,181,499✔
1636
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
37,181,499✔
1637
    QUERY_CHECK_CODE(code, lino, _end);
37,182,057✔
1638

1639
    // stable name
1640
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
37,182,057✔
1641
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,182,057✔
1642
    code = colDataSetVal(pColInfoData, numOfRows, stName, false);
37,182,057✔
1643
    QUERY_CHECK_CODE(code, lino, _end);
37,182,057✔
1644

1645
    // database name
1646
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
37,182,057✔
1647
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,181,499✔
1648
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
37,181,499✔
1649
    QUERY_CHECK_CODE(code, lino, _end);
37,182,057✔
1650

1651
    // col name
1652
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
37,182,057✔
1653
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
37,182,057✔
1654
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
37,182,057✔
1655
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,181,499✔
1656
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
37,181,499✔
1657
    QUERY_CHECK_CODE(code, lino, _end);
37,182,057✔
1658

1659
    // uid
1660
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
37,182,057✔
1661
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,182,057✔
1662
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&uid, false);
37,182,057✔
1663
    QUERY_CHECK_CODE(code, lino, _end);
37,181,499✔
1664

1665

1666
    // col data source
1667
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
37,181,499✔
1668
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,181,499✔
1669
    if (!colRef || !colRef->pColRef[i].hasRef) {
37,181,499✔
1670
      colDataSetNULL(pColInfoData, numOfRows);
4,707,627✔
1671
    } else {
1672
      code = colDataSetVal(pColInfoData, numOfRows, (char *)&colRef->pColRef[i].id, false);
32,473,872✔
1673
      QUERY_CHECK_CODE(code, lino, _end);
32,473,872✔
1674
    }
1675

1676
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 6);
37,182,057✔
1677
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,179,825✔
1678
    if (!colRef || !colRef->pColRef[i].hasRef) {
37,179,825✔
1679
      colDataSetNULL(pColInfoData, numOfRows);
4,705,953✔
1680
    } else {
1681
      char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
32,473,872✔
1682
      char tmpColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
32,473,872✔
1683
      strcat(tmpColName, colRef->pColRef[i].refDbName);
32,473,872✔
1684
      strcat(tmpColName, ".");
32,473,872✔
1685
      strcat(tmpColName, colRef->pColRef[i].refTableName);
32,473,872✔
1686
      strcat(tmpColName, ".");
32,473,872✔
1687
      strcat(tmpColName, colRef->pColRef[i].refColName);
32,473,872✔
1688
      STR_TO_VARSTR(refColName, tmpColName);
32,473,872✔
1689

1690
      code = colDataSetVal(pColInfoData, numOfRows, (char *)refColName, false);
32,473,872✔
1691
      QUERY_CHECK_CODE(code, lino, _end);
32,473,872✔
1692
    }
1693

1694
    // vgid
1695
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 7);
37,182,057✔
1696
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,179,652✔
1697
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
37,179,652✔
1698
    QUERY_CHECK_CODE(code, lino, _end);
37,181,499✔
1699

1700
    // col ref version
1701
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 8);
37,181,499✔
1702
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
37,182,057✔
1703
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&colRef->version, false);
37,182,057✔
1704
    QUERY_CHECK_CODE(code, lino, _end);
37,181,499✔
1705
    ++numOfRows;
37,181,499✔
1706
  }
1707

1708
  *pNumOfRows = numOfRows;
2,032,760✔
1709

1710
_end:
2,032,760✔
1711
  if (code != TSDB_CODE_SUCCESS) {
2,032,760✔
1712
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1713
  }
1714
  return code;
2,032,760✔
1715
}
1716

1717

1718
static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName) {
6,277,787✔
1719
  size_t               size = 0;
6,277,787✔
1720
  const SSysTableMeta* pMeta = NULL;
6,282,046✔
1721
  getInfosDbMeta(&pMeta, &size);
6,282,046✔
1722

1723
  int32_t index = 0;
6,282,267✔
1724
  for (int32_t i = 0; i < size; ++i) {
79,159,730✔
1725
    if (strcmp(pMeta[i].name, tableName) == 0) {
79,175,570✔
1726
      index = i;
6,280,233✔
1727
      break;
6,280,233✔
1728
    }
1729
  }
1730

1731
  SSDataBlock* pBlock = NULL;
6,264,393✔
1732
  int32_t      code = createDataBlock(&pBlock);
6,281,565✔
1733
  if (code) {
6,280,864✔
1734
    terrno = code;
×
1735
    return NULL;
×
1736
  }
1737

1738
  for (int32_t i = 0; i < pMeta[index].colNum; ++i) {
68,137,056✔
1739
    SColumnInfoData colInfoData =
61,852,330✔
1740
        createColumnInfoData(pMeta[index].schema[i].type, pMeta[index].schema[i].bytes, i + 1);
61,850,362✔
1741
    code = blockDataAppendColInfo(pBlock, &colInfoData);
61,861,463✔
1742
    if (code != TSDB_CODE_SUCCESS) {
61,855,366✔
1743
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1744
      blockDataDestroy(pBlock);
×
1745
      pBlock = NULL;
×
1746
      terrno = code;
×
1747
      break;
×
1748
    }
1749
  }
1750

1751
  return pBlock;
6,281,589✔
1752
}
1753

1754
int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta, size_t size,
111,466✔
1755
                              const char* dbName, int64_t* pRows) {
1756
  int32_t code = TSDB_CODE_SUCCESS;
111,466✔
1757
  int32_t lino = 0;
111,466✔
1758
  char    n[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
111,466✔
1759
  int32_t numOfRows = p->info.rows;
111,466✔
1760

1761
  for (int32_t i = 0; i < size; ++i) {
3,678,378✔
1762
    const SSysTableMeta* pm = &pSysDbTableMeta[i];
3,566,912✔
1763
    if (!sysInfo && pm->sysInfo) {
3,566,912✔
1764
      continue;
16,848✔
1765
    }
1766

1767
    if (strcmp(pm->name, TSDB_INS_TABLE_USERS_FULL) == 0) {
3,550,064✔
1768
      continue;
55,109✔
1769
    }
1770

1771
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
3,494,955✔
1772
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,494,955✔
1773

1774
    STR_TO_VARSTR(n, pm->name);
3,494,955✔
1775
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
3,494,955✔
1776
    QUERY_CHECK_CODE(code, lino, _end);
3,494,955✔
1777

1778
    // database name
1779
    STR_TO_VARSTR(n, dbName);
3,494,955✔
1780
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
3,494,955✔
1781
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,494,955✔
1782
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
3,494,955✔
1783
    QUERY_CHECK_CODE(code, lino, _end);
3,494,955✔
1784

1785
    // create time
1786
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
3,494,955✔
1787
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,494,955✔
1788
    colDataSetNULL(pColInfoData, numOfRows);
3,494,955✔
1789

1790
    // number of columns
1791
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
3,494,955✔
1792
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,494,955✔
1793
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&pm->colNum, false);
3,494,955✔
1794
    QUERY_CHECK_CODE(code, lino, _end);
3,494,955✔
1795

1796
    for (int32_t j = 4; j <= 8; ++j) {
20,969,730✔
1797
      pColInfoData = taosArrayGet(p->pDataBlock, j);
17,474,775✔
1798
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
17,474,775✔
1799
      colDataSetNULL(pColInfoData, numOfRows);
17,474,775✔
1800
    }
1801

1802
    STR_TO_VARSTR(n, "SYSTEM_TABLE");
3,494,955✔
1803

1804
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
3,494,955✔
1805
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,494,955✔
1806
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
3,494,955✔
1807
    QUERY_CHECK_CODE(code, lino, _end);
3,494,955✔
1808

1809
    numOfRows += 1;
3,494,955✔
1810
  }
1811

1812
  *pRows = numOfRows;
111,466✔
1813

1814
_end:
111,466✔
1815
  if (code != TSDB_CODE_SUCCESS) {
111,466✔
1816
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1817
  }
1818
  return code;
111,466✔
1819
}
1820

1821
int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
55,733✔
1822
  int32_t      code = TSDB_CODE_SUCCESS;
55,733✔
1823
  int32_t      lino = 0;
55,733✔
1824
  SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
55,733✔
1825
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
55,733✔
1826

1827
  code = blockDataEnsureCapacity(p, capacity);
55,733✔
1828
  QUERY_CHECK_CODE(code, lino, _end);
55,733✔
1829

1830
  size_t               size = 0;
55,733✔
1831
  const SSysTableMeta* pSysDbTableMeta = NULL;
55,733✔
1832

1833
  getInfosDbMeta(&pSysDbTableMeta, &size);
55,733✔
1834
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, &p->info.rows);
55,733✔
1835
  QUERY_CHECK_CODE(code, lino, _end);
55,733✔
1836

1837
  getPerfDbMeta(&pSysDbTableMeta, &size);
55,733✔
1838
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, &p->info.rows);
55,733✔
1839
  QUERY_CHECK_CODE(code, lino, _end);
55,733✔
1840

1841
  pInfo->pRes->info.rows = p->info.rows;
55,733✔
1842
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
55,733✔
1843
  QUERY_CHECK_CODE(code, lino, _end);
55,733✔
1844

1845
  blockDataDestroy(p);
55,733✔
1846
  p = NULL;
55,733✔
1847

1848
_end:
55,733✔
1849
  if (code != TSDB_CODE_SUCCESS) {
55,733✔
1850
    blockDataDestroy(p);
×
1851
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1852
  }
1853
  return code;
55,733✔
1854
}
1855

1856
static int32_t doSetUserTableMetaInfo(SStoreMetaReader* pMetaReaderFn, SStoreMeta* pMetaFn, void* pVnode,
6,079,252✔
1857
                                      SMetaReader* pMReader, int64_t uid, const char* dbname, int32_t vgId,
1858
                                      SSDataBlock* p, int32_t rowIndex, const char* idStr) {
1859
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
6,079,252✔
1860
  int32_t lino = 0;
6,080,012✔
1861
  int32_t code = pMetaReaderFn->getTableEntryByUid(pMReader, uid);
6,080,012✔
1862
  if (code < 0) {
6,078,340✔
1863
    qError("failed to get table meta, uid:%" PRId64 ", code:%s, %s", uid, tstrerror(terrno), idStr);
×
1864
    return code;
×
1865
  }
1866

1867
  STR_TO_VARSTR(n, pMReader->me.name);
6,078,340✔
1868

1869
  // table name
1870
  SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
6,079,708✔
1871
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,080,164✔
1872

1873
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
6,080,164✔
1874
  QUERY_CHECK_CODE(code, lino, _end);
6,079,708✔
1875

1876
  // database name
1877
  pColInfoData = taosArrayGet(p->pDataBlock, 1);
6,079,708✔
1878
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,078,796✔
1879
  code = colDataSetVal(pColInfoData, rowIndex, dbname, false);
6,078,796✔
1880
  QUERY_CHECK_CODE(code, lino, _end);
6,080,164✔
1881

1882
  // vgId
1883
  pColInfoData = taosArrayGet(p->pDataBlock, 6);
6,080,164✔
1884
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,080,012✔
1885
  code = colDataSetVal(pColInfoData, rowIndex, (char*)&vgId, false);
6,080,012✔
1886
  QUERY_CHECK_CODE(code, lino, _end);
6,080,012✔
1887

1888
  int32_t tableType = pMReader->me.type;
6,080,012✔
1889
  if (tableType == TSDB_CHILD_TABLE) {
6,080,012✔
1890
    // create time
1891
    int64_t ts = pMReader->me.ctbEntry.btime;
6,080,012✔
1892
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
6,080,012✔
1893
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,080,012✔
1894
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
6,080,012✔
1895
    QUERY_CHECK_CODE(code, lino, _end);
6,080,164✔
1896

1897
    SMetaReader mr1 = {0};
6,080,164✔
1898
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
6,080,012✔
1899

1900
    int64_t suid = pMReader->me.ctbEntry.suid;
6,079,860✔
1901
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
6,080,012✔
1902
    if (code != TSDB_CODE_SUCCESS) {
6,078,188✔
1903
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
1904
             tstrerror(code), idStr);
1905
      pMetaReaderFn->clearReader(&mr1);
×
1906
      QUERY_CHECK_CODE(code, lino, _end);
×
1907
    }
1908

1909
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
6,078,188✔
1910
    if (pColInfoData == NULL) {
6,079,860✔
1911
      pMetaReaderFn->clearReader(&mr1);
×
1912
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1913
    }
1914

1915
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
6,079,860✔
1916
    if (code != 0) {
6,080,164✔
1917
      pMetaReaderFn->clearReader(&mr1);
×
1918
      QUERY_CHECK_CODE(code, lino, _end);
×
1919
    }
1920

1921
    // super table name
1922
    STR_TO_VARSTR(n, mr1.me.name);
6,080,164✔
1923
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
6,079,100✔
1924
    if (pColInfoData == NULL) {
6,079,708✔
1925
      pMetaReaderFn->clearReader(&mr1);
×
1926
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1927
    }
1928

1929
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
6,079,708✔
1930
    pMetaReaderFn->clearReader(&mr1);
6,079,556✔
1931
    QUERY_CHECK_CODE(code, lino, _end);
6,079,708✔
1932

1933
    // table comment
1934
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
6,079,708✔
1935
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,079,708✔
1936
    if (pMReader->me.ctbEntry.commentLen > 0) {
6,079,708✔
1937
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1938
      STR_TO_VARSTR(comment, pMReader->me.ctbEntry.comment);
×
1939
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1940
      QUERY_CHECK_CODE(code, lino, _end);
×
1941
    } else if (pMReader->me.ctbEntry.commentLen == 0) {
6,078,188✔
1942
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1943
      STR_TO_VARSTR(comment, "");
×
1944
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1945
      QUERY_CHECK_CODE(code, lino, _end);
×
1946
    } else {
1947
      colDataSetNULL(pColInfoData, rowIndex);
6,077,732✔
1948
    }
1949

1950
    // uid
1951
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
6,079,860✔
1952
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,079,860✔
1953
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
6,079,860✔
1954
    QUERY_CHECK_CODE(code, lino, _end);
6,079,860✔
1955

1956
    // ttl
1957
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
6,079,860✔
1958
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,079,860✔
1959
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ctbEntry.ttlDays, false);
6,079,860✔
1960
    QUERY_CHECK_CODE(code, lino, _end);
6,080,164✔
1961

1962
    STR_TO_VARSTR(n, "CHILD_TABLE");
6,080,164✔
1963

1964
  } else if (tableType == TSDB_NORMAL_TABLE) {
×
1965
    // create time
1966
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1967
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1968
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1969
    QUERY_CHECK_CODE(code, lino, _end);
×
1970

1971
    // number of columns
1972
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1973
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1974

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

1978
    // super table name
1979
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1980
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1981
    colDataSetNULL(pColInfoData, rowIndex);
×
1982

1983
    // table comment
1984
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1985
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1986
    if (pMReader->me.ntbEntry.commentLen > 0) {
×
1987
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1988
      STR_TO_VARSTR(comment, pMReader->me.ntbEntry.comment);
×
1989
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1990
      QUERY_CHECK_CODE(code, lino, _end);
×
1991
    } else if (pMReader->me.ntbEntry.commentLen == 0) {
×
1992
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1993
      STR_TO_VARSTR(comment, "");
×
1994
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1995
      QUERY_CHECK_CODE(code, lino, _end);
×
1996
    } else {
1997
      colDataSetNULL(pColInfoData, rowIndex);
×
1998
    }
1999

2000
    // uid
2001
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
2002
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2003
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
2004
    QUERY_CHECK_CODE(code, lino, _end);
×
2005

2006
    // ttl
2007
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
2008
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2009
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.ttlDays, false);
×
2010
    QUERY_CHECK_CODE(code, lino, _end);
×
2011

2012
    STR_TO_VARSTR(n, "NORMAL_TABLE");
×
2013
    // impl later
2014
  } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
×
2015
    // create time
2016
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
2017
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2018
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
2019
    QUERY_CHECK_CODE(code, lino, _end);
×
2020

2021
    // number of columns
2022
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
2023
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2024

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

2028
    // super table name
2029
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
2030
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2031
    colDataSetNULL(pColInfoData, rowIndex);
×
2032

2033
    // table comment
2034
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
2035
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2036
    colDataSetNULL(pColInfoData, rowIndex);
×
2037

2038
    // uid
2039
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
2040
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2041
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
2042
    QUERY_CHECK_CODE(code, lino, _end);
×
2043

2044
    // ttl
2045
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
2046
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2047
    colDataSetNULL(pColInfoData, rowIndex);
×
2048

2049
    STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
×
2050
    // impl later
2051
  } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
×
2052
    // create time
2053
    int64_t ts = pMReader->me.ctbEntry.btime;
×
2054
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
2055
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2056
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
×
2057
    QUERY_CHECK_CODE(code, lino, _end);
×
2058

2059
    SMetaReader mr1 = {0};
×
2060
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
×
2061

2062
    int64_t suid = pMReader->me.ctbEntry.suid;
×
2063
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
×
2064
    if (code != TSDB_CODE_SUCCESS) {
×
2065
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
2066
             tstrerror(code), idStr);
2067
      pMetaReaderFn->clearReader(&mr1);
×
2068
      QUERY_CHECK_CODE(code, lino, _end);
×
2069
    }
2070

2071
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
2072
    if (pColInfoData == NULL) {
×
2073
      pMetaReaderFn->clearReader(&mr1);
×
2074
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2075
    }
2076

2077
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
×
2078
    if (code != 0) {
×
2079
      pMetaReaderFn->clearReader(&mr1);
×
2080
      QUERY_CHECK_CODE(code, lino, _end);
×
2081
    }
2082

2083
    // super table name
2084
    STR_TO_VARSTR(n, mr1.me.name);
×
2085
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
2086
    if (pColInfoData == NULL) {
×
2087
      pMetaReaderFn->clearReader(&mr1);
×
2088
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2089
    }
2090

2091
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
×
2092
    pMetaReaderFn->clearReader(&mr1);
×
2093
    QUERY_CHECK_CODE(code, lino, _end);
×
2094

2095
    // table comment
2096
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
2097
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2098
    colDataSetNULL(pColInfoData, rowIndex);
×
2099

2100
    // uid
2101
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
2102
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2103
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
2104
    QUERY_CHECK_CODE(code, lino, _end);
×
2105

2106
    // ttl
2107
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
2108
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2109
    colDataSetNULL(pColInfoData, rowIndex);
×
2110

2111
    STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
×
2112
  }
2113

2114
  pColInfoData = taosArrayGet(p->pDataBlock, 9);
6,078,188✔
2115
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,079,708✔
2116
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
6,079,708✔
2117
  QUERY_CHECK_CODE(code, lino, _end);
6,080,164✔
2118

2119
_end:
6,080,012✔
2120
  qError("%s failed at line %d since %s, %s", __func__, lino, tstrerror(code), idStr);
6,080,164✔
2121
  return code;
6,079,860✔
2122
}
2123

2124
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
1,568✔
2125
  int32_t            code = TSDB_CODE_SUCCESS;
1,568✔
2126
  int32_t            lino = 0;
1,568✔
2127
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
1,568✔
2128
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
1,568✔
2129
  SSysTableScanInfo* pInfo = pOperator->info;
1,568✔
2130
  SSysTableIndex*    pIdx = pInfo->pIdx;
1,568✔
2131
  SSDataBlock*       p = NULL;
1,568✔
2132
  blockDataCleanup(pInfo->pRes);
1,568✔
2133
  int32_t numOfRows = 0;
1,568✔
2134

2135
  int ret = 0;
1,568✔
2136

2137
  const char* db = NULL;
1,568✔
2138
  int32_t     vgId = 0;
1,568✔
2139
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
1,568✔
2140

2141
  SName sn = {0};
1,568✔
2142
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,568✔
2143
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1,568✔
2144
  QUERY_CHECK_CODE(code, lino, _end);
1,568✔
2145

2146
  code = tNameGetDbName(&sn, varDataVal(dbname));
1,568✔
2147
  QUERY_CHECK_CODE(code, lino, _end);
1,568✔
2148

2149
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1,568✔
2150

2151
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
1,568✔
2152
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
1,568✔
2153

2154
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
1,568✔
2155
  QUERY_CHECK_CODE(code, lino, _end);
1,568✔
2156

2157
  int32_t i = pIdx->lastIdx;
1,568✔
2158
  for (; i < taosArrayGetSize(pIdx->uids); i++) {
6,081,428✔
2159
    tb_uid_t* uid = taosArrayGet(pIdx->uids, i);
6,079,556✔
2160
    QUERY_CHECK_NULL(uid, code, lino, _end, terrno);
6,079,708✔
2161

2162
    SMetaReader mr = {0};
6,079,708✔
2163
    pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
6,078,796✔
2164

2165
    code = doSetUserTableMetaInfo(&pAPI->metaReaderFn, &pAPI->metaFn, pInfo->readHandle.vnode, &mr, *uid, dbname, vgId,
6,079,404✔
2166
                                  p, numOfRows, GET_TASKID(pTaskInfo));
6,078,796✔
2167

2168
    pAPI->metaReaderFn.clearReader(&mr);
6,080,164✔
2169
    QUERY_CHECK_CODE(code, lino, _end);
6,079,100✔
2170

2171
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 9);
6,079,100✔
2172
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,079,100✔
2173

2174
    if (++numOfRows >= pOperator->resultInfo.capacity) {
6,079,100✔
2175
      p->info.rows = numOfRows;
×
2176
      pInfo->pRes->info.rows = numOfRows;
×
2177

2178
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
2179
      QUERY_CHECK_CODE(code, lino, _end);
×
2180

2181
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
×
2182
      QUERY_CHECK_CODE(code, lino, _end);
×
2183

2184
      blockDataCleanup(p);
×
2185
      numOfRows = 0;
×
2186

2187
      if (pInfo->pRes->info.rows > 0) {
×
2188
        break;
×
2189
      }
2190
    }
2191
  }
2192

2193
  if (numOfRows > 0) {
1,568✔
2194
    p->info.rows = numOfRows;
1,076✔
2195
    pInfo->pRes->info.rows = numOfRows;
1,076✔
2196

2197
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
1,076✔
2198
    QUERY_CHECK_CODE(code, lino, _end);
1,076✔
2199

2200
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
1,076✔
2201
    QUERY_CHECK_CODE(code, lino, _end);
1,076✔
2202

2203
    blockDataCleanup(p);
1,076✔
2204
    numOfRows = 0;
1,076✔
2205
  }
2206

2207
  if (i >= taosArrayGetSize(pIdx->uids)) {
1,568✔
2208
    setOperatorCompleted(pOperator);
1,568✔
2209
  } else {
2210
    pIdx->lastIdx = i + 1;
×
2211
  }
2212

2213
  blockDataDestroy(p);
1,568✔
2214
  p = NULL;
1,568✔
2215

2216
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
1,568✔
2217

2218
_end:
200✔
2219
  if (code != TSDB_CODE_SUCCESS) {
1,568✔
2220
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2221
    blockDataDestroy(p);
×
2222
    pTaskInfo->code = code;
×
2223
    T_LONG_JMP(pTaskInfo->env, code);
×
2224
  }
2225
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
1,568✔
2226
}
2227

2228
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
1,273,042✔
2229
  int32_t        code = TSDB_CODE_SUCCESS;
1,273,042✔
2230
  int32_t        lino = 0;
1,273,042✔
2231
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
1,273,042✔
2232
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
1,273,042✔
2233
  int8_t         firstMetaCursor = 0;
1,273,042✔
2234
  SSDataBlock*   p = NULL;
1,273,042✔
2235

2236
  SSysTableScanInfo* pInfo = pOperator->info;
1,273,042✔
2237
  if (pInfo->pCur == NULL) {
1,273,042✔
2238
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
1,273,042✔
2239
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
1,272,688✔
2240
    firstMetaCursor = 1;
1,269,838✔
2241
  }
2242
  if (!firstMetaCursor) {
1,269,838✔
2243
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
×
2244
    if (code != 0) {
×
2245
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2246
      pInfo->pCur = NULL;
×
2247
      QUERY_CHECK_CODE(code, lino, _end);
×
2248
    }
2249
  }
2250

2251
  blockDataCleanup(pInfo->pRes);
1,269,838✔
2252
  int32_t numOfRows = 0;
1,273,042✔
2253

2254
  const char* db = NULL;
1,273,042✔
2255
  int32_t     vgId = 0;
1,273,042✔
2256
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
1,272,874✔
2257

2258
  SName sn = {0};
1,272,633✔
2259
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,272,633✔
2260
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1,272,801✔
2261
  QUERY_CHECK_CODE(code, lino, _end);
1,271,693✔
2262

2263
  code = tNameGetDbName(&sn, varDataVal(dbname));
1,271,693✔
2264
  QUERY_CHECK_CODE(code, lino, _end);
1,271,245✔
2265

2266
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1,271,245✔
2267

2268
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
1,272,562✔
2269
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
1,272,821✔
2270

2271
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
1,272,821✔
2272
  QUERY_CHECK_CODE(code, lino, _end);
1,273,042✔
2273

2274
  char n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,273,042✔
2275

2276
  int32_t ret = 0;
1,273,042✔
2277
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
51,771,774✔
2278
    STR_TO_VARSTR(n, pInfo->pCur->mr.me.name);
50,490,563✔
2279

2280
    // table name
2281
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
50,497,711✔
2282
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
50,496,262✔
2283
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
50,496,262✔
2284
    QUERY_CHECK_CODE(code, lino, _end);
50,497,398✔
2285

2286
    // database name
2287
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
50,497,398✔
2288
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
50,497,912✔
2289
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
50,497,912✔
2290
    QUERY_CHECK_CODE(code, lino, _end);
50,498,941✔
2291

2292
    // vgId
2293
    pColInfoData = taosArrayGet(p->pDataBlock, 6);
50,498,941✔
2294
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
50,497,912✔
2295
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
50,497,912✔
2296
    QUERY_CHECK_CODE(code, lino, _end);
50,498,493✔
2297

2298
    int32_t tableType = pInfo->pCur->mr.me.type;
50,498,493✔
2299
    if (tableType == TSDB_CHILD_TABLE) {
50,498,368✔
2300
      // create time
2301
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
33,302,098✔
2302
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
33,302,149✔
2303
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,301,783✔
2304
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
33,301,783✔
2305
      QUERY_CHECK_CODE(code, lino, _end);
33,303,292✔
2306

2307
      SMetaReader mr = {0};
33,303,292✔
2308
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
33,301,829✔
2309

2310
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
33,300,881✔
2311
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
33,300,740✔
2312
      if (code != TSDB_CODE_SUCCESS) {
33,298,903✔
2313
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
2314
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
2315
        pAPI->metaReaderFn.clearReader(&mr);
×
2316
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2317
        pInfo->pCur = NULL;
×
2318
        blockDataDestroy(p);
×
2319
        T_LONG_JMP(pTaskInfo->env, terrno);
×
2320
      }
2321

2322
      if (isTsmaResSTb(mr.me.name)) {
33,298,903✔
2323
        pAPI->metaReaderFn.clearReader(&mr);
×
2324
        continue;
×
2325
      }
2326

2327
      // number of columns
2328
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
33,302,067✔
2329
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,302,084✔
2330
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
33,302,084✔
2331
      QUERY_CHECK_CODE(code, lino, _end);
33,303,292✔
2332

2333
      // super table name
2334
      STR_TO_VARSTR(n, mr.me.name);
33,303,292✔
2335
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
33,299,379✔
2336
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,302,450✔
2337
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
33,302,450✔
2338
      QUERY_CHECK_CODE(code, lino, _end);
33,301,387✔
2339
      pAPI->metaReaderFn.clearReader(&mr);
33,301,387✔
2340

2341
      // table comment
2342
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
33,302,450✔
2343
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,302,229✔
2344
      if (pInfo->pCur->mr.me.ctbEntry.commentLen > 0) {
33,302,229✔
2345
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
15,814✔
2346
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ctbEntry.comment);
15,814✔
2347
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
15,814✔
2348
        QUERY_CHECK_CODE(code, lino, _end);
15,814✔
2349
      } else if (pInfo->pCur->mr.me.ctbEntry.commentLen == 0) {
33,285,969✔
2350
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
18,350✔
2351
        STR_TO_VARSTR(comment, "");
18,350✔
2352
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
18,350✔
2353
        QUERY_CHECK_CODE(code, lino, _end);
18,350✔
2354
      } else {
2355
        colDataSetNULL(pColInfoData, numOfRows);
33,268,303✔
2356
      }
2357

2358
      // uid
2359
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
33,301,698✔
2360
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,301,987✔
2361
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
33,301,987✔
2362
      QUERY_CHECK_CODE(code, lino, _end);
33,302,225✔
2363

2364
      // ttl
2365
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
33,302,225✔
2366
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
33,302,004✔
2367
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ctbEntry.ttlDays, false);
33,302,004✔
2368
      QUERY_CHECK_CODE(code, lino, _end);
33,303,292✔
2369

2370
      STR_TO_VARSTR(n, "CHILD_TABLE");
33,303,292✔
2371
    } else if (tableType == TSDB_NORMAL_TABLE) {
17,196,270✔
2372
      // create time
2373
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
15,862,170✔
2374
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,861,467✔
2375
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
15,861,467✔
2376
      QUERY_CHECK_CODE(code, lino, _end);
15,862,170✔
2377

2378
      // number of columns
2379
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
15,862,170✔
2380
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,862,170✔
2381
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
15,862,170✔
2382
      QUERY_CHECK_CODE(code, lino, _end);
15,862,170✔
2383

2384
      // super table name
2385
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
15,862,170✔
2386
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,861,467✔
2387
      colDataSetNULL(pColInfoData, numOfRows);
15,861,467✔
2388

2389
      // table comment
2390
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
15,861,467✔
2391
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,862,170✔
2392
      if (pInfo->pCur->mr.me.ntbEntry.commentLen > 0) {
15,862,170✔
2393
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
15,776✔
2394
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ntbEntry.comment);
15,776✔
2395
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
15,776✔
2396
        QUERY_CHECK_CODE(code, lino, _end);
15,776✔
2397
      } else if (pInfo->pCur->mr.me.ntbEntry.commentLen == 0) {
15,845,152✔
2398
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
62,977✔
2399
        STR_TO_VARSTR(comment, "");
62,977✔
2400
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
62,977✔
2401
        QUERY_CHECK_CODE(code, lino, _end);
62,977✔
2402
      } else {
2403
        colDataSetNULL(pColInfoData, numOfRows);
15,781,472✔
2404
      }
2405

2406
      // uid
2407
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
15,862,170✔
2408
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,861,467✔
2409
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
15,861,467✔
2410
      QUERY_CHECK_CODE(code, lino, _end);
15,862,170✔
2411

2412
      // ttl
2413
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
15,862,170✔
2414
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
15,861,549✔
2415
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.ttlDays, false);
15,861,549✔
2416
      QUERY_CHECK_CODE(code, lino, _end);
15,862,170✔
2417

2418
      STR_TO_VARSTR(n, "NORMAL_TABLE");
15,862,170✔
2419
    } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
1,334,100✔
2420
      // create time
2421
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
513,422✔
2422
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2423
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
513,422✔
2424
      QUERY_CHECK_CODE(code, lino, _end);
513,422✔
2425

2426
      // number of columns
2427
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
513,422✔
2428
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2429
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
513,422✔
2430
      QUERY_CHECK_CODE(code, lino, _end);
513,422✔
2431

2432
      // super table name
2433
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
513,422✔
2434
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2435
      colDataSetNULL(pColInfoData, numOfRows);
513,422✔
2436

2437
      // table comment
2438
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
513,422✔
2439
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2440
      colDataSetNULL(pColInfoData, numOfRows);
513,422✔
2441

2442
      // uid
2443
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
513,422✔
2444
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2445
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
513,422✔
2446
      QUERY_CHECK_CODE(code, lino, _end);
513,422✔
2447

2448
      // ttl
2449
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
513,422✔
2450
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
513,422✔
2451
      colDataSetNULL(pColInfoData, numOfRows);
513,422✔
2452

2453
      STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
513,422✔
2454
    } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
820,678✔
2455
      // create time
2456
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
820,678✔
2457
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
820,678✔
2458
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2459
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
820,678✔
2460
      QUERY_CHECK_CODE(code, lino, _end);
820,678✔
2461

2462
      SMetaReader mr = {0};
820,678✔
2463
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
820,678✔
2464

2465
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
820,678✔
2466
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
820,678✔
2467
      if (code != TSDB_CODE_SUCCESS) {
820,678✔
2468
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
2469
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
2470
        pAPI->metaReaderFn.clearReader(&mr);
×
2471
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2472
        pInfo->pCur = NULL;
×
2473
        blockDataDestroy(p);
×
2474
        T_LONG_JMP(pTaskInfo->env, terrno);
×
2475
      }
2476

2477
      if (isTsmaResSTb(mr.me.name)) {
820,678✔
2478
        pAPI->metaReaderFn.clearReader(&mr);
×
2479
        continue;
×
2480
      }
2481

2482
      // number of columns
2483
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
820,678✔
2484
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2485
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
820,678✔
2486
      QUERY_CHECK_CODE(code, lino, _end);
820,678✔
2487

2488
      // super table name
2489
      STR_TO_VARSTR(n, mr.me.name);
820,678✔
2490
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
820,678✔
2491
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2492
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
820,678✔
2493
      QUERY_CHECK_CODE(code, lino, _end);
820,678✔
2494
      pAPI->metaReaderFn.clearReader(&mr);
820,678✔
2495

2496
      // table comment
2497
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
820,678✔
2498
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2499
      colDataSetNULL(pColInfoData, numOfRows);
820,678✔
2500

2501
      // uid
2502
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
820,678✔
2503
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2504
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
820,678✔
2505
      QUERY_CHECK_CODE(code, lino, _end);
820,678✔
2506

2507
      // ttl
2508
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
820,678✔
2509
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
820,678✔
2510
      colDataSetNULL(pColInfoData, numOfRows);
820,678✔
2511

2512
      STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
820,678✔
2513
    }
2514

2515
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
50,494,705✔
2516
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
50,494,094✔
2517
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
50,494,094✔
2518
    QUERY_CHECK_CODE(code, lino, _end);
50,498,290✔
2519

2520
    if (++numOfRows >= pOperator->resultInfo.capacity) {
50,498,290✔
2521
      p->info.rows = numOfRows;
×
2522
      pInfo->pRes->info.rows = numOfRows;
×
2523

2524
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
2525
      QUERY_CHECK_CODE(code, lino, _end);
×
2526

2527
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
×
2528
      QUERY_CHECK_CODE(code, lino, _end);
×
2529

2530
      blockDataCleanup(p);
×
2531
      numOfRows = 0;
×
2532

2533
      if (pInfo->pRes->info.rows > 0) {
×
2534
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
2535
        break;
×
2536
      }
2537
    }
2538
  }
2539

2540
  if (numOfRows > 0) {
1,274,310✔
2541
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
998,428✔
2542
    p->info.rows = numOfRows;
998,428✔
2543
    pInfo->pRes->info.rows = numOfRows;
998,428✔
2544

2545
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
998,428✔
2546
    QUERY_CHECK_CODE(code, lino, _end);
998,428✔
2547

2548
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
998,428✔
2549
    QUERY_CHECK_CODE(code, lino, _end);
998,411✔
2550

2551
    blockDataCleanup(p);
998,411✔
2552
    numOfRows = 0;
998,428✔
2553
  }
2554

2555
  blockDataDestroy(p);
1,274,310✔
2556
  p = NULL;
1,273,042✔
2557

2558
  // todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
2559
  if (ret != 0) {
1,273,042✔
2560
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
1,273,042✔
2561
    pInfo->pCur = NULL;
1,273,042✔
2562
    setOperatorCompleted(pOperator);
1,273,042✔
2563
  }
2564

2565
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
1,272,219✔
2566

2567
_end:
1,272,975✔
2568
  if (code != TSDB_CODE_SUCCESS) {
1,272,215✔
2569
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2570
    blockDataDestroy(p);
×
2571
    pTaskInfo->code = code;
×
2572
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2573
    pInfo->pCur = NULL;
×
2574
    T_LONG_JMP(pTaskInfo->env, code);
×
2575
  }
2576
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
1,272,215✔
2577
}
2578

2579
static int32_t buildVgDiskUsage(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticsInfo) {
5,610✔
2580
  int32_t            code = TSDB_CODE_SUCCESS;
5,610✔
2581
  int32_t            lino = 0;
5,610✔
2582
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
5,610✔
2583
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
5,610✔
2584
  SSysTableScanInfo* pInfo = pOperator->info;
5,610✔
2585
  int32_t            vgId = 0;
5,610✔
2586
  const char*        db = NULL;
5,610✔
2587
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &pStaticsInfo->dbname, &vgId, NULL, NULL);
5,610✔
2588

2589
  pStaticsInfo->vgId = vgId;
5,610✔
2590

2591
  code = pAPI->metaFn.getDBSize(pInfo->readHandle.vnode, pStaticsInfo);
5,610✔
2592
  QUERY_CHECK_CODE(code, lino, _end);
5,610✔
2593

2594
  code = vnodeEstimateRawDataSize(pOperator, pStaticsInfo);
5,610✔
2595
  QUERY_CHECK_CODE(code, lino, _end);
5,610✔
2596

2597
  pStaticsInfo->memSize = pStaticsInfo->memSize >> 10;
5,610✔
2598
  pStaticsInfo->l1Size = pStaticsInfo->l1Size >> 10;
5,610✔
2599
  pStaticsInfo->l2Size = pStaticsInfo->l2Size >> 10;
5,610✔
2600
  pStaticsInfo->l3Size = pStaticsInfo->l3Size >> 10;
5,610✔
2601
  pStaticsInfo->cacheSize = pStaticsInfo->cacheSize >> 10;
5,610✔
2602
  pStaticsInfo->walSize = pStaticsInfo->walSize >> 10;
5,610✔
2603
  pStaticsInfo->metaSize = pStaticsInfo->metaSize >> 10;
5,610✔
2604
  pStaticsInfo->rawDataSize = pStaticsInfo->rawDataSize >> 10;
5,610✔
2605
  pStaticsInfo->ssSize = pStaticsInfo->ssSize >> 10;
5,610✔
2606

2607
_end:
5,610✔
2608
  return code;
5,610✔
2609
}
2610

2611
static int8_t shouldEstimateRawDataSize(SOperatorInfo* pOperator) {
4,832✔
2612
  int32_t lino = 0;
4,832✔
2613
  size_t  size = 0;
4,832✔
2614
  int32_t index = 0;
4,832✔
2615

2616
  const SSysTableMeta* pMeta = NULL;
4,832✔
2617
  SExecTaskInfo*       pTaskInfo = pOperator->pTaskInfo;
4,832✔
2618

2619
  SSysTableScanInfo* pInfo = pOperator->info;
4,972✔
2620
  getInfosDbMeta(&pMeta, &size);
4,972✔
2621

2622
  for (int32_t i = 0; i < size; ++i) {
196,500✔
2623
    if (strcmp(pMeta[i].name, TSDB_INS_DISK_USAGE) == 0) {
196,500✔
2624
      index = i;
4,972✔
2625
      break;
4,972✔
2626
    }
2627
  }
2628
  if (index >= size) {
4,972✔
2629
    return 1;
×
2630
  }
2631
  const SSysTableMeta* pTgtMeta = &pMeta[index];
4,972✔
2632
  int32_t              colNum = pTgtMeta->colNum;
4,972✔
2633
  SColumnInfoData      colInfoData =
2634
      createColumnInfoData(pTgtMeta->schema[colNum - 1].type, pTgtMeta->schema[colNum - 1].bytes, colNum);
4,832✔
2635
  for (int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); i++) {
17,242✔
2636
    SColMatchItem* pItem = taosArrayGet(pInfo->matchInfo.pList, i);
13,514✔
2637
    if (pItem->colId == colInfoData.info.colId) {
13,374✔
2638
      return 1;
964✔
2639
    }
2640
  }
2641
  return 0;
4,008✔
2642
}
2643
static SSDataBlock* sysTableBuildVgUsage(SOperatorInfo* pOperator) {
7,240✔
2644
  int32_t            code = TSDB_CODE_SUCCESS;
7,240✔
2645
  int32_t            lino = 0;
7,240✔
2646
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
7,240✔
2647
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
7,240✔
2648
  SSysTableScanInfo* pInfo = pOperator->info;
7,240✔
2649
  SDbSizeStatisInfo  staticsInfo = {.estimateRawData = 1};
7,240✔
2650

2651
  char*        buf = NULL;
7,240✔
2652
  SSDataBlock* p = NULL;
7,240✔
2653

2654
  const char* db = NULL;
7,240✔
2655
  int32_t     numOfCols = 0;
7,240✔
2656
  int32_t     numOfRows = 0;
7,240✔
2657

2658
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2659
  if (pInfo->readHandle.mnd != NULL) {
7,240✔
2660
    setOperatorCompleted(pOperator);
1,630✔
2661
    return NULL;
1,630✔
2662
  }
2663
  if (pInfo->pCur == NULL) {
5,610✔
2664
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
5,610✔
2665
    if (pInfo->pCur == NULL) {
5,470✔
2666
      code = terrno;
×
2667
      QUERY_CHECK_CODE(code, lino, _end);
×
2668
    }
2669
  }
2670

2671
  SSDataBlock* pBlock = pInfo->pRes;
5,470✔
2672

2673
  if (!pInfo->showRewrite) {
5,470✔
2674
    staticsInfo.estimateRawData = shouldEstimateRawDataSize(pOperator);
4,832✔
2675
  }
2676

2677
  code = buildVgDiskUsage(pOperator, &staticsInfo);
5,750✔
2678
  QUERY_CHECK_CODE(code, lino, _end);
5,610✔
2679

2680
  if (pInfo->showRewrite) {
5,610✔
2681
    SSDataBlock*      pBlock = pInfo->pRes;
638✔
2682
    SDBBlockUsageInfo usageInfo = {0};
638✔
2683
    int32_t           len = tSerializeBlockDbUsage(NULL, 0, &usageInfo);
638✔
2684

2685
    usageInfo.dataInDiskSize = staticsInfo.l1Size + staticsInfo.l2Size + staticsInfo.l3Size;
638✔
2686
    usageInfo.walInDiskSize = staticsInfo.walSize;
638✔
2687
    usageInfo.rawDataSize = staticsInfo.rawDataSize;
638✔
2688

2689
    buf = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
638✔
2690
    QUERY_CHECK_NULL(buf, code, lino, _end, terrno);
638✔
2691

2692
    int32_t tempRes = tSerializeBlockDbUsage(varDataVal(buf), len, &usageInfo);
638✔
2693
    if (tempRes != len) {
638✔
2694
      QUERY_CHECK_CODE(TSDB_CODE_INVALID_MSG, lino, _end);
×
2695
    }
2696

2697
    varDataSetLen(buf, len);
638✔
2698

2699
    int32_t          slotId = 1;
638✔
2700
    SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, 1);
638✔
2701
    QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
638✔
2702
    code = colDataSetVal(pColInfo, 0, buf, false);
638✔
2703
    QUERY_CHECK_CODE(code, lino, _end);
638✔
2704
    taosMemoryFreeClear(buf);
638✔
2705
    if (slotId != 0) {
638✔
2706
      SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
638✔
2707
      QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
638✔
2708
    }
2709

2710
    pBlock->info.rows = 1;
638✔
2711
    pOperator->status = OP_EXEC_DONE;
638✔
2712
    pInfo->pRes->info.rows = pBlock->info.rows;
638✔
2713
    QUERY_CHECK_CODE(code, lino, _end);
638✔
2714
  } else {
2715
    SName sn = {0};
4,972✔
2716
    char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,972✔
2717
    code = tNameFromString(&sn, staticsInfo.dbname, T_NAME_ACCT | T_NAME_DB);
4,972✔
2718
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2719

2720
    code = tNameGetDbName(&sn, varDataVal(dbname));
4,972✔
2721
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2722

2723
    varDataSetLen(dbname, strlen(varDataVal(dbname)));
4,972✔
2724

2725
    p = buildInfoSchemaTableMetaBlock(TSDB_INS_DISK_USAGE);
4,972✔
2726
    QUERY_CHECK_NULL(p, code, lino, _end, terrno);
4,972✔
2727

2728
    code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
4,972✔
2729
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2730

2731
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2732
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
4,972✔
2733
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2734

2735
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2736
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.vgId, false);
4,972✔
2737
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2738

2739
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2740
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.walSize, false);  // wal
4,972✔
2741
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2742

2743
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2744
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l1Size, false);  // l1_size
4,972✔
2745
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2746

2747
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2748
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l2Size, false);  // l2_size
4,972✔
2749
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2750

2751
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2752
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l3Size, false);  // l3_size
4,972✔
2753
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2754

2755
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2756
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.cacheSize, false);  // cache_size
4,972✔
2757
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2758

2759
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2760
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.metaSize, false);  // meta_size
4,972✔
2761
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2762

2763
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2764
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.ssSize, false);  // ss_size
4,972✔
2765
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2766

2767
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
4,972✔
2768
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.rawDataSize, false);  // estimate_size
4,972✔
2769
    QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2770
    numOfRows += 1;
4,972✔
2771

2772
    if (numOfRows > 0) {
4,972✔
2773
      p->info.rows = numOfRows;
4,972✔
2774
      pInfo->pRes->info.rows = numOfRows;
4,972✔
2775

2776
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
4,972✔
2777
      QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2778

2779
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
4,972✔
2780
      QUERY_CHECK_CODE(code, lino, _end);
4,972✔
2781
    }
2782

2783
    blockDataDestroy(p);
4,972✔
2784
    p = NULL;
4,972✔
2785

2786
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
4,972✔
2787
    setOperatorCompleted(pOperator);
4,972✔
2788
  }
2789
_end:
5,610✔
2790
  taosMemoryFree(buf);
5,610✔
2791
  if (pInfo->pCur) {
5,610✔
2792
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
4,008✔
2793
    pInfo->pCur = NULL;
4,008✔
2794
  }
2795
  if (code != TSDB_CODE_SUCCESS) {
5,610✔
2796
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2797
    blockDataDestroy(p);
×
2798
    pTaskInfo->code = code;
×
2799
    T_LONG_JMP(pTaskInfo->env, code);
×
2800
  }
2801
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
5,610✔
2802
}
2803

2804
static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
2,178,650✔
2805
  int32_t            code = TSDB_CODE_SUCCESS;
2,178,650✔
2806
  int32_t            lino = 0;
2,178,650✔
2807
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
2,178,650✔
2808
  SSysTableScanInfo* pInfo = pOperator->info;
2,178,650✔
2809

2810
  SNode* pCondition = pInfo->pCondition;
2,178,650✔
2811
  if (pOperator->status == OP_EXEC_DONE) {
2,178,650✔
2812
    return NULL;
848,349✔
2813
  }
2814

2815
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2816
  if (pInfo->readHandle.mnd != NULL) {
1,330,301✔
2817
    code = buildSysDbTableInfo(pInfo, pOperator->resultInfo.capacity);
55,733✔
2818
    QUERY_CHECK_CODE(code, lino, _end);
55,733✔
2819

2820
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
55,733✔
2821
    QUERY_CHECK_CODE(code, lino, _end);
55,733✔
2822
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
55,733✔
2823

2824
    setOperatorCompleted(pOperator);
55,733✔
2825
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
55,733✔
2826
  } else {
2827
    if (pInfo->showRewrite == false) {
1,274,568✔
2828
      if (pCondition != NULL && pInfo->pIdx == NULL) {
1,519,789✔
2829
        SSTabFltArg arg = {
689,420✔
2830
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
689,420✔
2831

2832
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
689,420✔
2833
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
689,420✔
2834
        idx->init = 0;
689,420✔
2835
        idx->uids = taosArrayInit(128, sizeof(int64_t));
688,799✔
2836
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
688,799✔
2837
        idx->lastIdx = 0;
689,420✔
2838

2839
        pInfo->pIdx = idx;  // set idx arg
689,420✔
2840

2841
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
689,420✔
2842
        if (flt == 0) {
688,717✔
2843
          pInfo->pIdx->init = 1;
1,568✔
2844
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
1,568✔
2845
          return blk;
1,568✔
2846
        } else if ((flt == -1) || (flt == -2)) {
687,149✔
2847
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
687,149✔
2848
        }
2849
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
142,517✔
2850
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
×
2851
        return blk;
×
2852
      }
2853
    }
2854

2855
    return sysTableBuildUserTables(pOperator);
1,270,938✔
2856
  }
2857

2858
_end:
×
2859
  if (code != TSDB_CODE_SUCCESS) {
×
2860
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2861
    pTaskInfo->code = code;
×
2862
    T_LONG_JMP(pTaskInfo->env, code);
×
2863
  }
2864
  return NULL;
×
2865
}
2866
static SSDataBlock* sysTableScanUsage(SOperatorInfo* pOperator) {
12,850✔
2867
  int32_t            code = TSDB_CODE_SUCCESS;
12,850✔
2868
  int32_t            lino = 0;
12,850✔
2869
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
12,850✔
2870
  SSysTableScanInfo* pInfo = pOperator->info;
12,850✔
2871

2872
  SNode* pCondition = pInfo->pCondition;
12,850✔
2873
  if (pOperator->status == OP_EXEC_DONE) {
12,850✔
2874
    return NULL;
5,610✔
2875
  }
2876
  return sysTableBuildVgUsage(pOperator);
7,240✔
2877

2878
_end:
2879
  if (code != TSDB_CODE_SUCCESS) {
2880
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
2881
    pTaskInfo->code = code;
2882
    T_LONG_JMP(pTaskInfo->env, code);
2883
  }
2884
  return NULL;
2885
}
2886

2887
static SSDataBlock* sysTableScanUserSTables(SOperatorInfo* pOperator) {
×
2888
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
2889
  SSysTableScanInfo* pInfo = pOperator->info;
×
2890
  if (pOperator->status == OP_EXEC_DONE) {
×
2891
    return NULL;
×
2892
  }
2893

2894
  pInfo->pRes->info.rows = 0;
×
2895
  pOperator->status = OP_EXEC_DONE;
×
2896

2897
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
2898
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
2899
}
2900

2901
static int32_t doSetQueryFileSetRow() {
×
2902
  int32_t code = TSDB_CODE_SUCCESS;
×
2903
  int32_t lino = 0;
×
2904

2905
  // TODO
2906

2907
_exit:
×
2908
  return code;
×
2909
}
2910

2911
static SSDataBlock* sysTableBuildUserFileSets(SOperatorInfo* pOperator) {
152✔
2912
  int32_t            code = TSDB_CODE_SUCCESS;
152✔
2913
  int32_t            lino = 0;
152✔
2914
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
152✔
2915
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
152✔
2916
  SSysTableScanInfo* pInfo = pOperator->info;
152✔
2917
  SSDataBlock*       p = NULL;
152✔
2918

2919
  // open cursor if not opened
2920
  if (pInfo->pFileSetReader == NULL) {
152✔
2921
    code = pAPI->tsdReader.fileSetReaderOpen(pInfo->readHandle.vnode, &pInfo->pFileSetReader);
152✔
2922
    QUERY_CHECK_CODE(code, lino, _end);
152✔
2923
  }
2924

2925
  blockDataCleanup(pInfo->pRes);
152✔
2926
  int32_t numOfRows = 0;
152✔
2927

2928
  const char* db = NULL;
152✔
2929
  int32_t     vgId = 0;
152✔
2930
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
152✔
2931

2932
  SName sn = {0};
152✔
2933
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
152✔
2934
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
152✔
2935
  QUERY_CHECK_CODE(code, lino, _end);
152✔
2936

2937
  code = tNameGetDbName(&sn, varDataVal(dbname));
152✔
2938
  QUERY_CHECK_CODE(code, lino, _end);
152✔
2939

2940
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
152✔
2941

2942
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_FILESETS);
152✔
2943
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
152✔
2944

2945
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
152✔
2946
  QUERY_CHECK_CODE(code, lino, _end);
152✔
2947

2948
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
152✔
2949
  int32_t ret = 0;
152✔
2950

2951
  // loop to query each entry
2952
  for (;;) {
152✔
2953
    int32_t ret = pAPI->tsdReader.fileSetReadNext(pInfo->pFileSetReader);
304✔
2954
    if (ret) {
304✔
2955
      if (ret == TSDB_CODE_NOT_FOUND) {
152✔
2956
        // no more scan entry
2957
        setOperatorCompleted(pOperator);
152✔
2958
        pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
152✔
2959
        break;
152✔
2960
      } else {
2961
        code = ret;
×
2962
        QUERY_CHECK_CODE(code, lino, _end);
×
2963
      }
2964
    }
2965

2966
    // fill the data block
2967
    {
2968
      SColumnInfoData* pColInfoData;
2969
      int32_t          index = 0;
152✔
2970

2971
      // db_name
2972
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
2973
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
2974
      code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
152✔
2975
      QUERY_CHECK_CODE(code, lino, _end);
152✔
2976

2977
      // vgroup_id
2978
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
2979
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
2980
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
152✔
2981
      QUERY_CHECK_CODE(code, lino, _end);
152✔
2982

2983
      // fileset_id
2984
      int32_t filesetId = 0;
152✔
2985
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "fileset_id", &filesetId);
152✔
2986
      QUERY_CHECK_CODE(code, lino, _end);
152✔
2987
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
2988
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
2989
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&filesetId, false);
152✔
2990
      QUERY_CHECK_CODE(code, lino, _end);
152✔
2991

2992
      // start_time
2993
      int64_t startTime = 0;
152✔
2994
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "start_time", &startTime);
152✔
2995
      QUERY_CHECK_CODE(code, lino, _end);
152✔
2996
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
2997
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
2998
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&startTime, false);
152✔
2999
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3000

3001
      // end_time
3002
      int64_t endTime = 0;
152✔
3003
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "end_time", &endTime);
152✔
3004
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3005
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
3006
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
3007
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&endTime, false);
152✔
3008
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3009

3010
      // total_size
3011
      int64_t totalSize = 0;
152✔
3012
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "total_size", &totalSize);
152✔
3013
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3014
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
3015
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
3016
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&totalSize, false);
152✔
3017
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3018

3019
      // last_compact
3020
      int64_t lastCompact = 0;
152✔
3021
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "last_compact_time", &lastCompact);
152✔
3022
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3023
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
3024
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
3025
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&lastCompact, false);
152✔
3026
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3027

3028
      // should_compact
3029
      bool shouldCompact = false;
152✔
3030
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "should_compact", &shouldCompact);
152✔
3031
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3032
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
152✔
3033
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
152✔
3034
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&shouldCompact, false);
152✔
3035
      QUERY_CHECK_CODE(code, lino, _end);
152✔
3036

3037
      // // details
3038
      // const char* details = NULL;
3039
      // code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "details", &details);
3040
      // QUERY_CHECK_CODE(code, lino, _end);
3041
      // pColInfoData = taosArrayGet(p->pDataBlock, index++);
3042
      // QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3043
      // code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
3044
      // QUERY_CHECK_CODE(code, lino, _end);
3045
    }
3046

3047
    // check capacity
3048
    if (++numOfRows >= pOperator->resultInfo.capacity) {
152✔
3049
      p->info.rows = numOfRows;
×
3050
      pInfo->pRes->info.rows = numOfRows;
×
3051

3052
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
3053
      QUERY_CHECK_CODE(code, lino, _end);
×
3054

3055
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
×
3056
      QUERY_CHECK_CODE(code, lino, _end);
×
3057

3058
      blockDataCleanup(p);
×
3059
      numOfRows = 0;
×
3060

3061
      if (pInfo->pRes->info.rows > 0) {
×
3062
        break;
×
3063
      }
3064
    }
3065
  }
3066

3067
  if (numOfRows > 0) {
152✔
3068
    p->info.rows = numOfRows;
152✔
3069
    pInfo->pRes->info.rows = numOfRows;
152✔
3070

3071
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
152✔
3072
    QUERY_CHECK_CODE(code, lino, _end);
152✔
3073

3074
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
152✔
3075
    QUERY_CHECK_CODE(code, lino, _end);
152✔
3076

3077
    blockDataCleanup(p);
152✔
3078
    numOfRows = 0;
152✔
3079
  }
3080

3081
  blockDataDestroy(p);
152✔
3082
  p = NULL;
152✔
3083

3084
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
152✔
3085

3086
_end:
152✔
3087
  if (code != TSDB_CODE_SUCCESS) {
152✔
3088
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3089
    blockDataDestroy(p);
×
3090
    pTaskInfo->code = code;
×
3091
    pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
×
3092
    T_LONG_JMP(pTaskInfo->env, code);
×
3093
  }
3094
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
152✔
3095
}
3096

3097
static SSDataBlock* sysTableScanUserFileSets(SOperatorInfo* pOperator) {
456✔
3098
  int32_t            code = TSDB_CODE_SUCCESS;
456✔
3099
  int32_t            lino = 0;
456✔
3100
  SSysTableScanInfo* pInfo = pOperator->info;
456✔
3101
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
456✔
3102
  SNode*             pCondition = pInfo->pCondition;
456✔
3103

3104
  if (pOperator->status == OP_EXEC_DONE) {
456✔
3105
    return NULL;
152✔
3106
  }
3107

3108
  if (pInfo->readHandle.mnd != NULL) {
304✔
3109
    // do nothing on mnode
3110
    qTrace("This operator do nothing on mnode, task id:%s", GET_TASKID(pTaskInfo));
152✔
3111
    return NULL;
152✔
3112
  } else {
3113
#if 0
3114
    if (pInfo->showRewrite == false) {
3115
      if (pCondition != NULL && pInfo->pIdx == NULL) {
3116
        SSTabFltArg arg = {
3117
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
3118

3119
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
3120
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
3121
        idx->init = 0;
3122
        idx->uids = taosArrayInit(128, sizeof(int64_t));
3123
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
3124
        idx->lastIdx = 0;
3125

3126
        pInfo->pIdx = idx;  // set idx arg
3127

3128
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
3129
        if (flt == 0) {
3130
          pInfo->pIdx->init = 1;
3131
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
3132
          return blk;
3133
        } else if ((flt == -1) || (flt == -2)) {
3134
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
3135
        }
3136
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
3137
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
3138
        return blk;
3139
      }
3140
    }
3141
#endif
3142

3143
    return sysTableBuildUserFileSets(pOperator);
152✔
3144
  }
3145

3146
_end:
3147
  if (code != TSDB_CODE_SUCCESS) {
3148
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
3149
    pTaskInfo->code = code;
3150
    T_LONG_JMP(pTaskInfo->env, code);
3151
  }
3152
  return NULL;
3153
}
3154

3155
static int32_t getSysTableDbNameColId(const char* pTable) {
3,505,668✔
3156
  // if (0 == strcmp(TSDB_INS_TABLE_INDEXES, pTable)) {
3157
  //   return 1;
3158
  // }
3159
  return TSDB_INS_USER_STABLES_DBNAME_COLID;
3,505,668✔
3160
}
3161

3162
static EDealRes getDBNameFromConditionWalker(SNode* pNode, void* pContext) {
17,457,311✔
3163
  int32_t   code = TSDB_CODE_SUCCESS;
17,457,311✔
3164
  ENodeType nType = nodeType(pNode);
17,457,311✔
3165

3166
  switch (nType) {
17,457,311✔
3167
    case QUERY_NODE_OPERATOR: {
8,286,522✔
3168
      SOperatorNode* node = (SOperatorNode*)pNode;
8,286,522✔
3169
      if (OP_TYPE_EQUAL == node->opType) {
8,286,522✔
3170
        *(int32_t*)pContext = 1;
3,505,710✔
3171
        return DEAL_RES_CONTINUE;
3,505,710✔
3172
      }
3173

3174
      *(int32_t*)pContext = 0;
4,780,812✔
3175
      return DEAL_RES_IGNORE_CHILD;
4,780,331✔
3176
    }
3177
    case QUERY_NODE_COLUMN: {
3,505,710✔
3178
      if (1 != *(int32_t*)pContext) {
3,505,710✔
3179
        return DEAL_RES_CONTINUE;
×
3180
      }
3181

3182
      SColumnNode* node = (SColumnNode*)pNode;
3,505,710✔
3183
      if (getSysTableDbNameColId(node->tableName) == node->colId) {
3,505,710✔
3184
        *(int32_t*)pContext = 2;
3,078,995✔
3185
        return DEAL_RES_CONTINUE;
3,078,953✔
3186
      }
3187

3188
      *(int32_t*)pContext = 0;
426,715✔
3189
      return DEAL_RES_CONTINUE;
426,715✔
3190
    }
3191
    case QUERY_NODE_VALUE: {
3,504,564✔
3192
      if (2 != *(int32_t*)pContext) {
3,504,564✔
3193
        return DEAL_RES_CONTINUE;
426,715✔
3194
      }
3195

3196
      SValueNode* node = (SValueNode*)pNode;
3,078,995✔
3197
      char*       dbName = nodesGetValueFromNode(node);
3,078,995✔
3198
      tstrncpy((char*)pContext, varDataVal(dbName), TSDB_DB_NAME_LEN);
3,078,330✔
3199
      return DEAL_RES_END;  // stop walk
3,078,953✔
3200
    }
3201
    default:
2,160,515✔
3202
      break;
2,160,515✔
3203
  }
3204
  return DEAL_RES_CONTINUE;
2,160,515✔
3205
}
3206

3207
static void getDBNameFromCondition(SNode* pCondition, const char* dbName) {
11,396,492✔
3208
  if (NULL == pCondition) {
11,396,492✔
3209
    return;
3,114,990✔
3210
  }
3211
  nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName);
8,281,502✔
3212
}
3213

3214
static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
17,201,510✔
3215
  // build message and send to mnode to fetch the content of system tables.
3216
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
17,201,510✔
3217
  SSysTableScanInfo* pInfo = pOperator->info;
17,201,417✔
3218
  char               dbName[TSDB_DB_NAME_LEN] = {0};
17,201,857✔
3219

3220
  while (1) {
×
3221
    if (isTaskKilled(pOperator->pTaskInfo)) {
17,199,982✔
3222
      setOperatorCompleted(pOperator);
×
3223
      (*ppRes) = NULL;
×
3224
      break;
×
3225
    }
3226

3227
    blockDataCleanup(pInfo->pRes);
17,201,653✔
3228

3229
    const char* name = tNameGetTableName(&pInfo->name);
17,202,837✔
3230
    if (pInfo->showRewrite) {
17,203,072✔
3231
      getDBNameFromCondition(pInfo->pCondition, dbName);
6,210,478✔
3232
      if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
6,210,478✔
3233
          strncasecmp(name, TSDB_INS_TABLE_SCANS, TSDB_TABLE_FNAME_LEN) != 0 &&
5,588,181✔
3234
          strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
5,584,898✔
3235
          strncasecmp(name, TSDB_INS_TABLE_SSMIGRATES, TSDB_TABLE_FNAME_LEN) != 0 &&
5,524,171✔
3236
          strncasecmp(name, TSDB_INS_TABLE_SCAN_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
5,524,129✔
3237
          strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
5,520,972✔
3238
        TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
5,520,432✔
3239
      }
3240
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
10,992,594✔
3241
      getDBNameFromCondition(pInfo->pCondition, dbName);
5,187,352✔
3242
      if (dbName[0]) TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
5,187,352✔
3243
      (void)sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
5,187,352✔
3244
    }
3245
    bool         filter = true;
17,201,991✔
3246
    SSDataBlock* pBlock = NULL;
17,201,991✔
3247
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
17,201,991✔
3248
      pBlock = sysTableScanUserTables(pOperator);
2,178,650✔
3249
    } else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
15,023,341✔
3250
      pBlock = sysTableScanUserTags(pOperator);
1,562,696✔
3251
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
13,460,645✔
3252
      pBlock = sysTableScanUserCols(pOperator);
4,313,018✔
3253
    } else if (strncasecmp(name, TSDB_INS_TABLE_VC_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
9,148,108✔
3254
      pBlock = sysTableScanUserVcCols(pOperator);
1,291,244✔
3255
    } else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
7,856,306✔
3256
               IS_SYS_DBNAME(dbName)) {
337,763✔
UNCOV
3257
      pBlock = sysTableScanUserSTables(pOperator);
×
3258
    } else if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
7,857,418✔
3259
      pBlock = sysTableScanUsage(pOperator);
12,850✔
3260
    } else if (strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
7,844,568✔
3261
      pBlock = sysTableScanUserFileSets(pOperator);
456✔
3262
    } else {  // load the meta from mnode of the given epset
3263
      pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
7,844,112✔
3264
    }
3265

3266
    if (!pInfo->skipFilterTable) sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
17,203,072✔
3267
    if (pBlock != NULL) {
17,202,481✔
3268
      bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
6,406,275✔
3269
      if (limitReached) {
6,405,607✔
3270
        setOperatorCompleted(pOperator);
28,600✔
3271
      }
3272

3273
      if (pBlock->info.rows == 0) {
6,405,607✔
3274
        continue;
×
3275
      }
3276
      (*ppRes) = pBlock;
6,405,574✔
3277
    } else {
3278
      (*ppRes) = NULL;
10,796,206✔
3279
    }
3280
    break;
17,201,780✔
3281
  }
3282

3283
_end:
17,201,780✔
3284
  if (pTaskInfo->code) {
17,201,780✔
3285
    qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code));
992✔
3286
    T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
992✔
3287
  }
3288
  return pTaskInfo->code;
17,201,566✔
3289
}
3290

3291
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
17,200,056✔
3292
                                   SSDataBlock* pBlock) {
3293
  int32_t        code = TSDB_CODE_SUCCESS;
17,200,056✔
3294
  int32_t        lino = 0;
17,200,056✔
3295
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
17,200,056✔
3296
  if (pBlock == NULL) {
17,200,577✔
3297
    return;
10,795,645✔
3298
  }
3299

3300
  if (pInfo->tbnameSlotId != -1) {
6,404,932✔
3301
    SColumnInfoData* pColumnInfoData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, pInfo->tbnameSlotId);
3,843✔
3302
    QUERY_CHECK_NULL(pColumnInfoData, code, lino, _end, terrno);
3,843✔
3303
    char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
3,843✔
3304
    STR_TO_VARSTR(varTbName, name);
3,843✔
3305

3306
    code = colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, 1, true);
3,843✔
3307
    QUERY_CHECK_CODE(code, lino, _end);
3,843✔
3308
  }
3309

3310
  code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL, NULL);
6,404,231✔
3311
  QUERY_CHECK_CODE(code, lino, _end);
6,405,637✔
3312

3313
_end:
6,405,637✔
3314
  if (code != TSDB_CODE_SUCCESS) {
6,405,637✔
3315
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3316
    pTaskInfo->code = code;
×
3317
    T_LONG_JMP(pTaskInfo->env, code);
×
3318
  }
3319
}
3320

3321
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
7,844,112✔
3322
                                          SExecTaskInfo* pTaskInfo) {
3323
  int32_t code = TSDB_CODE_SUCCESS;
7,844,112✔
3324
  int32_t lino = 0;
7,844,112✔
3325
  if (pOperator->status == OP_EXEC_DONE) {
7,844,112✔
3326
    return NULL;
3,315,654✔
3327
  }
3328

3329
  while (1) {
2,304✔
3330
    int64_t startTs = taosGetTimestampUs();
4,530,762✔
3331
    tstrncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
4,530,762✔
3332
    tstrncpy(pInfo->req.user, pInfo->pUser, tListLen(pInfo->req.user));
4,530,762✔
3333

3334
    int32_t contLen = tSerializeSRetrieveTableReq(NULL, 0, &pInfo->req);
4,530,762✔
3335
    char*   buf1 = taosMemoryCalloc(1, contLen);
4,530,762✔
3336
    if (!buf1) {
4,530,762✔
3337
      return NULL;
1,364✔
3338
    }
3339
    int32_t tempRes = tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req);
4,530,762✔
3340
    if (tempRes < 0) {
4,530,762✔
3341
      code = terrno;
×
3342
      taosMemoryFree(buf1);
×
3343
      return NULL;
×
3344
    }
3345

3346
    // send the fetch remote task result reques
3347
    SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
4,530,762✔
3348
    if (NULL == pMsgSendInfo) {
4,530,762✔
3349
      qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
×
3350
      pTaskInfo->code = terrno;
×
3351
      taosMemoryFree(buf1);
×
3352
      return NULL;
×
3353
    }
3354

3355
    int32_t msgType = (strcasecmp(name, TSDB_INS_TABLE_DNODE_VARIABLES) == 0) ? TDMT_DND_SYSTABLE_RETRIEVE
4,532,126✔
3356
                                                                              : TDMT_MND_SYSTABLE_RETRIEVE;
4,530,762✔
3357

3358
    pMsgSendInfo->param = pOperator;
4,530,762✔
3359
    pMsgSendInfo->msgInfo.pData = buf1;
4,530,762✔
3360
    pMsgSendInfo->msgInfo.len = contLen;
4,530,762✔
3361
    pMsgSendInfo->msgType = msgType;
4,530,762✔
3362
    pMsgSendInfo->fp = loadSysTableCallback;
4,530,762✔
3363
    pMsgSendInfo->requestId = pTaskInfo->id.queryId;
4,530,762✔
3364

3365
    code = asyncSendMsgToServer(pInfo->readHandle.pMsgCb->clientRpc, &pInfo->epSet, NULL, pMsgSendInfo);
4,530,762✔
3366
    if (code != TSDB_CODE_SUCCESS) {
4,530,762✔
3367
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3368
      pTaskInfo->code = code;
×
3369
      T_LONG_JMP(pTaskInfo->env, code);
×
3370
    }
3371

3372
    code = tsem_wait(&pInfo->ready);
4,530,762✔
3373
    if (code != TSDB_CODE_SUCCESS) {
4,530,762✔
3374
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3375
      pTaskInfo->code = code;
×
3376
      T_LONG_JMP(pTaskInfo->env, code);
×
3377
    }
3378

3379
    if (pTaskInfo->code) {
4,530,762✔
3380
      qError("%s load meta data from mnode failed, totalRows:%" PRIu64 ", code:%s", GET_TASKID(pTaskInfo),
992✔
3381
             pInfo->loadInfo.totalRows, tstrerror(pTaskInfo->code));
3382
      return NULL;
992✔
3383
    }
3384

3385
    SRetrieveMetaTableRsp* pRsp = pInfo->pRsp;
4,529,770✔
3386
    pInfo->req.showId = pRsp->handle;
4,529,770✔
3387

3388
    if (pRsp->numOfRows == 0 || pRsp->completed) {
4,529,770✔
3389
      pOperator->status = OP_EXEC_DONE;
4,525,884✔
3390
      qDebug("%s load meta data from mnode completed, rowsOfSource:%d, totalRows:%" PRIu64, GET_TASKID(pTaskInfo),
4,525,884✔
3391
             pRsp->numOfRows, pInfo->loadInfo.totalRows);
3392

3393
      if (pRsp->numOfRows == 0) {
4,525,884✔
3394
        taosMemoryFree(pRsp);
260,050✔
3395
        return NULL;
260,050✔
3396
      }
3397
    }
3398

3399
    char* pStart = pRsp->data;
4,269,720✔
3400
    code = extractDataBlockFromFetchRsp(pInfo->pRes, pRsp->data, pInfo->matchInfo.pList, &pStart);
4,269,720✔
3401
    if (code != TSDB_CODE_SUCCESS) {
4,269,720✔
3402
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3403
      pTaskInfo->code = code;
×
3404
      taosMemoryFreeClear(pRsp);
×
3405
      T_LONG_JMP(pTaskInfo->env, code);
×
3406
    }
3407
    updateLoadRemoteInfo(&pInfo->loadInfo, pRsp->numOfRows, pRsp->compLen, startTs, pOperator);
4,269,720✔
3408
    // todo log the filter info
3409
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL, NULL);
4,269,720✔
3410
    if (code != TSDB_CODE_SUCCESS) {
4,269,720✔
3411
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3412
      pTaskInfo->code = code;
×
3413
      taosMemoryFreeClear(pRsp);
×
3414
      T_LONG_JMP(pTaskInfo->env, code);
×
3415
    }
3416
    taosMemoryFree(pRsp);
4,269,720✔
3417
    if (pInfo->pRes->info.rows > 0) {
4,269,720✔
3418
      return pInfo->pRes;
3,312,060✔
3419
    } else if (pOperator->status == OP_EXEC_DONE) {
957,660✔
3420
      return NULL;
955,356✔
3421
    }
3422
  }
3423
}
3424

3425
static int32_t resetSysTableScanOperState(SOperatorInfo* pOper) {
483,350✔
3426
  SSysTableScanInfo* pInfo = pOper->info;
483,350✔
3427

3428
  SSystemTableScanPhysiNode* pScanPhyNode = (SSystemTableScanPhysiNode*)pOper->pPhyNode;
483,350✔
3429
  pOper->status = OP_NOT_OPENED;
483,350✔
3430
  blockDataEmpty(pInfo->pRes);
483,350✔
3431

3432
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
483,350✔
3433
    const char* name = tNameGetTableName(&pInfo->name);
483,350✔
3434
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
483,350✔
3435
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
483,350✔
3436
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 ||
483,350✔
3437
        strncasecmp(name, TSDB_INS_TABLE_VC_COLS, TSDB_TABLE_FNAME_LEN) == 0 || pInfo->pCur != NULL) {
483,350✔
3438
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
483,350✔
3439
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
483,350✔
3440
      }
3441

3442
      pInfo->pCur = NULL;
483,350✔
3443
    }
3444
  } else {
3445
    qError("pInfo->name is not initialized");
×
3446
  }
3447

3448
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
483,350✔
3449
  pInfo->loadInfo.totalRows = 0;
483,350✔
3450

3451
  if (pScanPhyNode->scan.virtualStableScan) {
483,350✔
3452
    SExecTaskInfo*         pTaskInfo = pOper->pTaskInfo;
483,350✔
3453
    tableListDestroy(pInfo->pSubTableListInfo);
483,350✔
3454
    pInfo->pSubTableListInfo = tableListCreate();
483,350✔
3455
    if (!pInfo->pSubTableListInfo) {
483,350✔
3456
      pTaskInfo->code = terrno;
×
3457
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(terrno));
×
3458
      return terrno;
×
3459
    }
3460

3461
    int32_t code = createScanTableListInfo((SScanPhysiNode*)pScanPhyNode, NULL, false, &pInfo->readHandle, pInfo->pSubTableListInfo, NULL,
483,350✔
3462
                                    NULL, pTaskInfo, NULL);
3463
    if (code != TSDB_CODE_SUCCESS) {
483,350✔
3464
      pTaskInfo->code = code;
×
3465
      tableListDestroy(pInfo->pSubTableListInfo);
×
3466
      return code;
×
3467
    }
3468
  }
3469

3470
  if (pInfo->pIdx) {
483,350✔
3471
    taosArrayDestroy(pInfo->pIdx->uids);
×
3472
    taosMemoryFree(pInfo->pIdx);
×
3473
    pInfo->pIdx = NULL;
×
3474
  }
3475

3476
  if (pInfo->pSchema) {
483,350✔
3477
    taosHashCleanup(pInfo->pSchema);
483,350✔
3478
    pInfo->pSchema = NULL;
483,350✔
3479
  }
3480

3481
  if (pInfo->pExtSchema) {
483,350✔
3482
    taosHashCleanup(pInfo->pExtSchema);
×
3483
    pInfo->pExtSchema = NULL;
×
3484
  }
3485
  pInfo->readHandle.mnd = NULL;
483,350✔
3486

3487
  return 0;
483,350✔
3488
}
3489

3490
int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode,
10,325,113✔
3491
                                       STableListInfo* pTableListInfo, const char* pUser, SExecTaskInfo* pTaskInfo,
3492
                                       SOperatorInfo** pOptrInfo) {
3493
  QRY_PARAM_CHECK(pOptrInfo);
10,325,113✔
3494

3495
  int32_t            code = TSDB_CODE_SUCCESS;
10,325,831✔
3496
  int32_t            lino = 0;
10,325,831✔
3497
  SSysTableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SSysTableScanInfo));
10,325,831✔
3498
  SOperatorInfo*     pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
10,325,831✔
3499
  if (pInfo == NULL || pOperator == NULL) {
10,325,831✔
3500
    code = terrno;
×
3501
    lino = __LINE__;
×
3502
    goto _error;
×
3503
  }
3504

3505
  pOperator->pPhyNode = pScanPhyNode;
10,325,831✔
3506
  SScanPhysiNode*     pScanNode = &pScanPhyNode->scan;
10,325,350✔
3507
  SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
10,325,831✔
3508
  QUERY_CHECK_CODE(code, lino, _error);
10,325,831✔
3509

3510
  int32_t num = 0;
10,325,831✔
3511
  code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &num, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
10,325,831✔
3512
  QUERY_CHECK_CODE(code, lino, _error);
10,325,831✔
3513

3514
  extractTbnameSlotId(pInfo, pScanNode);
10,325,831✔
3515

3516
  pInfo->pAPI = &pTaskInfo->storageAPI;
10,325,831✔
3517

3518
  pInfo->accountId = pScanPhyNode->accountId;
10,325,611✔
3519
  pInfo->pUser = taosStrdup((void*)pUser);
10,326,312✔
3520
  QUERY_CHECK_NULL(pInfo->pUser, code, lino, _error, terrno);
10,325,754✔
3521
  pInfo->sysInfo = pScanPhyNode->sysInfo;
10,325,273✔
3522
  pInfo->showRewrite = pScanPhyNode->showRewrite;
10,325,831✔
3523
  pInfo->pRes = createDataBlockFromDescNode(pDescNode);
10,325,053✔
3524
  QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno);
10,326,312✔
3525

3526
  pInfo->pCondition = pScanNode->node.pConditions;
10,325,053✔
3527

3528
  tNameAssign(&pInfo->name, &pScanNode->tableName);
10,324,572✔
3529
  const char* name = tNameGetTableName(&pInfo->name);
10,325,196✔
3530
  if (pInfo->showRewrite == false) {
10,325,273✔
3531
    code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0,
7,050,545✔
3532
                              pTaskInfo->pStreamRuntimeInfo);
7,050,545✔
3533
  } else {
3534
    if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
3,274,728✔
3535
      pInfo->skipFilterTable = true;
638✔
3536
      code = filterInitFromNode(NULL, &pOperator->exprSupp.pFilterInfo, 0, pTaskInfo->pStreamRuntimeInfo);
638✔
3537
    } else {
3538
      code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0,
3,273,474✔
3539
                                pTaskInfo->pStreamRuntimeInfo);
3,274,090✔
3540
    }
3541
  }
3542
  QUERY_CHECK_CODE(code, lino, _error);
10,325,754✔
3543

3544
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
10,325,754✔
3545
  // since max column changed from 4096 -> 32767, we set the initial result size to 32K
3546
  initResultSizeInfo(&pOperator->resultInfo, 32768);
10,325,754✔
3547
  code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
10,325,721✔
3548
  QUERY_CHECK_CODE(code, lino, _error);
10,325,350✔
3549

3550
  if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
10,325,350✔
3551
      strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
8,995,488✔
3552
      strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
8,167,450✔
3553
    pInfo->readHandle = *(SReadHandle*)readHandle;
2,158,204✔
3554
  } else {
3555
    if (tsem_init(&pInfo->ready, 0, 0) != TSDB_CODE_SUCCESS) {
8,167,146✔
3556
      code = TSDB_CODE_FAILED;
×
3557
      goto _error;
×
3558
    }
3559
    pInfo->epSet = pScanPhyNode->mgmtEpSet;
8,166,665✔
3560
    pInfo->readHandle = *(SReadHandle*)readHandle;
8,167,627✔
3561
  }
3562

3563
  pInfo->pSubTableListInfo = pTableListInfo;
10,325,350✔
3564

3565
  setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
10,325,831✔
3566
                  pInfo, pTaskInfo);
3567
  pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
10,326,312✔
3568
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doSysTableScanNext, NULL, destroySysScanOperator,
10,325,570✔
3569
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
3570
  setOperatorResetStateFn(pOperator, resetSysTableScanOperState);
10,325,350✔
3571
  
3572
  *pOptrInfo = pOperator;
10,325,570✔
3573
  return code;
10,325,350✔
3574

3575
_error:
×
3576
  if (pInfo != NULL) {
×
3577
    destroySysScanOperator(pInfo);
×
3578
  }
3579
  if (code != TSDB_CODE_SUCCESS) {
×
3580
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3581
  }
3582
  if (pOperator != NULL) {
×
3583
    pOperator->info = NULL;
×
3584
    destroyOperator(pOperator);
×
3585
  }
3586
  pTaskInfo->code = code;
×
3587
  return code;
×
3588
}
3589

3590
void extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode) {
10,326,312✔
3591
  pInfo->tbnameSlotId = -1;
10,326,312✔
3592
  if (pScanNode->pScanPseudoCols != NULL) {
10,326,312✔
3593
    SNode* pNode = NULL;
4,785✔
3594
    FOREACH(pNode, pScanNode->pScanPseudoCols) {
9,570✔
3595
      STargetNode* pTargetNode = NULL;
4,785✔
3596
      if (nodeType(pNode) == QUERY_NODE_TARGET) {
4,785✔
3597
        pTargetNode = (STargetNode*)pNode;
4,785✔
3598
        SNode* expr = pTargetNode->pExpr;
4,785✔
3599
        if (nodeType(expr) == QUERY_NODE_FUNCTION) {
4,785✔
3600
          SFunctionNode* pFuncNode = (SFunctionNode*)expr;
4,785✔
3601
          if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) {
4,785✔
3602
            pInfo->tbnameSlotId = pTargetNode->slotId;
4,147✔
3603
          }
3604
        }
3605
      }
3606
    }
3607
  }
3608
}
10,326,312✔
3609

3610
void destroySysScanOperator(void* param) {
10,325,196✔
3611
  SSysTableScanInfo* pInfo = (SSysTableScanInfo*)param;
10,325,196✔
3612
  int32_t            code = tsem_destroy(&pInfo->ready);
10,325,196✔
3613
  if (code != TSDB_CODE_SUCCESS) {
10,325,196✔
3614
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3615
  }
3616
  blockDataDestroy(pInfo->pRes);
10,325,196✔
3617

3618
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
10,326,312✔
3619
    const char* name = tNameGetTableName(&pInfo->name);
10,326,312✔
3620
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
10,326,312✔
3621
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
8,995,411✔
3622
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 ||
8,167,931✔
3623
        strncasecmp(name, TSDB_INS_TABLE_VC_COLS, TSDB_TABLE_FNAME_LEN) == 0 ||
4,061,440✔
3624
        pInfo->pCur != NULL) {
3,662,142✔
3625
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
6,664,170✔
3626
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
5,735,043✔
3627
      }
3628

3629
      pInfo->pCur = NULL;
6,663,054✔
3630
    }
3631
  } else {
3632
    qError("pInfo->name is not initialized");
×
3633
  }
3634

3635
  if (pInfo->pIdx) {
10,325,754✔
3636
    taosArrayDestroy(pInfo->pIdx->uids);
689,420✔
3637
    taosMemoryFree(pInfo->pIdx);
689,420✔
3638
    pInfo->pIdx = NULL;
689,420✔
3639
  }
3640

3641
  if (pInfo->pSchema) {
10,325,196✔
3642
    taosHashCleanup(pInfo->pSchema);
3,632,395✔
3643
    pInfo->pSchema = NULL;
3,633,030✔
3644
  }
3645
  if (pInfo->pExtSchema) {
10,325,831✔
3646
    taosHashCleanup(pInfo->pExtSchema);
3,232,616✔
3647
    pInfo->pExtSchema = NULL;
3,233,097✔
3648
  }
3649
  tableListDestroy(pInfo->pSubTableListInfo);
10,326,312✔
3650

3651
  taosArrayDestroy(pInfo->matchInfo.pList);
10,326,312✔
3652
  taosMemoryFreeClear(pInfo->pUser);
10,326,312✔
3653

3654
  taosMemoryFreeClear(param);
10,326,312✔
3655
}
10,325,831✔
3656

3657
int32_t loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code) {
4,530,762✔
3658
  SOperatorInfo*     operator=(SOperatorInfo*) param;
4,530,762✔
3659
  SSysTableScanInfo* pScanResInfo = (SSysTableScanInfo*)operator->info;
4,530,762✔
3660
  if (TSDB_CODE_SUCCESS == code) {
4,530,762✔
3661
    pScanResInfo->pRsp = pMsg->pData;
4,529,770✔
3662

3663
    SRetrieveMetaTableRsp* pRsp = pScanResInfo->pRsp;
4,529,770✔
3664
    pRsp->numOfRows = htonl(pRsp->numOfRows);
4,529,770✔
3665
    pRsp->useconds = htobe64(pRsp->useconds);
4,529,770✔
3666
    pRsp->handle = htobe64(pRsp->handle);
4,529,770✔
3667
    pRsp->compLen = htonl(pRsp->compLen);
4,529,770✔
3668
  } else {
3669
    operator->pTaskInfo->code = rpcCvtErrCode(code);
992✔
3670
    if (operator->pTaskInfo->code != code) {
992✔
3671
      qError("load systable rsp received, error:%s, cvted error:%s", tstrerror(code),
×
3672
             tstrerror(operator->pTaskInfo->code));
3673
    } else {
3674
      qError("load systable rsp received, error:%s", tstrerror(code));
992✔
3675
    }
3676
  }
3677

3678
  int32_t res = tsem_post(&pScanResInfo->ready);
4,530,762✔
3679
  if (res != TSDB_CODE_SUCCESS) {
4,530,762✔
3680
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(res));
×
3681
  }
3682
  return TSDB_CODE_SUCCESS;
4,530,762✔
3683
}
3684

3685
static int32_t sysChkFilter__Comm(SNode* pNode) {
288,951✔
3686
  // impl
3687
  SOperatorNode* pOper = (SOperatorNode*)pNode;
288,951✔
3688
  EOperatorType  opType = pOper->opType;
288,951✔
3689
  if (opType != OP_TYPE_EQUAL && opType != OP_TYPE_LOWER_EQUAL && opType != OP_TYPE_LOWER_THAN &&
288,951✔
3690
      opType != OP_TYPE_GREATER_EQUAL && opType != OP_TYPE_GREATER_THAN) {
304✔
3691
    return -1;
×
3692
  }
3693
  return 0;
288,951✔
3694
}
3695

3696
static int32_t sysChkFilter__DBName(SNode* pNode) {
502,515✔
3697
  SOperatorNode* pOper = (SOperatorNode*)pNode;
502,515✔
3698

3699
  if (pOper->opType != OP_TYPE_EQUAL && pOper->opType != OP_TYPE_NOT_EQUAL) {
502,515✔
3700
    return -1;
×
3701
  }
3702

3703
  SValueNode* pVal = (SValueNode*)pOper->pRight;
502,515✔
3704
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
501,812✔
3705
    return -1;
×
3706
  }
3707

3708
  return 0;
501,894✔
3709
}
3710
static int32_t sysChkFilter__VgroupId(SNode* pNode) {
×
3711
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3712
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3713
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3714
    return -1;
×
3715
  }
3716
  return sysChkFilter__Comm(pNode);
×
3717
}
3718
static int32_t sysChkFilter__TableName(SNode* pNode) {
283,969✔
3719
  SOperatorNode* pOper = (SOperatorNode*)pNode;
283,969✔
3720
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
283,969✔
3721
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
283,969✔
3722
    return -1;
×
3723
  }
3724
  return sysChkFilter__Comm(pNode);
283,969✔
3725
}
3726
static int32_t sysChkFilter__CreateTime(SNode* pNode) {
1,568✔
3727
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,568✔
3728
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
1,568✔
3729

3730
  if (!IS_TIMESTAMP_TYPE(pVal->node.resType.type)) {
1,568✔
3731
    return -1;
×
3732
  }
3733
  return sysChkFilter__Comm(pNode);
1,568✔
3734
}
3735

3736
static int32_t sysChkFilter__Ncolumn(SNode* pNode) {
×
3737
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3738
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3739

3740
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3741
    return -1;
×
3742
  }
3743
  return sysChkFilter__Comm(pNode);
×
3744
}
3745
static int32_t sysChkFilter__Ttl(SNode* pNode) {
×
3746
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3747
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3748

3749
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3750
    return -1;
×
3751
  }
3752
  return sysChkFilter__Comm(pNode);
×
3753
}
3754
static int32_t sysChkFilter__STableName(SNode* pNode) {
3,414✔
3755
  SOperatorNode* pOper = (SOperatorNode*)pNode;
3,414✔
3756
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
3,414✔
3757
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
3,414✔
3758
    return -1;
×
3759
  }
3760
  return sysChkFilter__Comm(pNode);
3,414✔
3761
}
3762
static int32_t sysChkFilter__Uid(SNode* pNode) {
×
3763
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3764
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3765
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3766
    return -1;
×
3767
  }
3768
  return sysChkFilter__Comm(pNode);
×
3769
}
3770
static int32_t sysChkFilter__Type(SNode* pNode) {
6,172✔
3771
  SOperatorNode* pOper = (SOperatorNode*)pNode;
6,172✔
3772
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
6,172✔
3773
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
6,172✔
3774
    return -1;
6,172✔
3775
  }
3776
  return sysChkFilter__Comm(pNode);
×
3777
}
3778
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result) {
1,052,576✔
3779
  if (optSysCheckOper(cond) != 0) return -1;
1,052,576✔
3780

3781
  SOperatorNode* pNode = (SOperatorNode*)cond;
797,017✔
3782

3783
  int8_t i = 0;
797,017✔
3784
  for (; i < SYSTAB_FILTER_DICT_SIZE; i++) {
1,369,114✔
3785
    if (strcmp(filterDict[i].name, ((SColumnNode*)(pNode->pLeft))->colName) == 0) {
1,369,735✔
3786
      break;
796,314✔
3787
    }
3788
  }
3789
  if (i >= SYSTAB_FILTER_DICT_SIZE) return -1;
795,693✔
3790

3791
  if (filterDict[i].chkFunc(cond) != 0) return -1;
795,693✔
3792

3793
  return filterDict[i].fltFunc(arg, cond, result);
790,224✔
3794
}
3795

3796
static int32_t optSysCheckOper(SNode* pOpear) {
1,052,576✔
3797
  if (nodeType(pOpear) != QUERY_NODE_OPERATOR) return -1;
1,052,576✔
3798

3799
  SOperatorNode* pOper = (SOperatorNode*)pOpear;
1,050,988✔
3800
  if (pOper->opType < OP_TYPE_GREATER_THAN || pOper->opType > OP_TYPE_NOT_EQUAL) {
1,050,988✔
3801
    return -1;
237,363✔
3802
  }
3803

3804
  if (nodeType(pOper->pLeft) != QUERY_NODE_COLUMN || nodeType(pOper->pRight) != QUERY_NODE_VALUE) {
813,625✔
3805
    return -1;
16,608✔
3806
  }
3807
  return 0;
797,017✔
3808
}
3809

3810
static FORCE_INLINE int optSysBinarySearch(SArray* arr, int s, int e, uint64_t k) {
3811
  uint64_t v;
3812
  int32_t  m;
3813
  while (s <= e) {
×
3814
    m = s + (e - s) / 2;
×
3815
    v = *(uint64_t*)taosArrayGet(arr, m);
×
3816
    if (v >= k) {
×
3817
      e = m - 1;
×
3818
    } else {
3819
      s = m + 1;
×
3820
    }
3821
  }
3822
  return s;
×
3823
}
3824

3825
int32_t optSysIntersection(SArray* in, SArray* out) {
361,218✔
3826
  int32_t     code = TSDB_CODE_SUCCESS;
361,218✔
3827
  int32_t     lino = 0;
361,218✔
3828
  MergeIndex* mi = NULL;
361,218✔
3829
  int32_t     sz = (int32_t)taosArrayGetSize(in);
361,218✔
3830
  if (sz <= 0) {
359,976✔
3831
    goto _end;
358,408✔
3832
  }
3833
  mi = taosMemoryCalloc(sz, sizeof(MergeIndex));
1,568✔
3834
  QUERY_CHECK_NULL(mi, code, lino, _end, terrno);
1,568✔
3835
  for (int i = 0; i < sz; i++) {
3,136✔
3836
    SArray* t = taosArrayGetP(in, i);
1,568✔
3837
    mi[i].len = (int32_t)taosArrayGetSize(t);
1,568✔
3838
    mi[i].idx = 0;
1,568✔
3839
  }
3840

3841
  SArray* base = taosArrayGetP(in, 0);
1,568✔
3842
  for (int i = 0; i < taosArrayGetSize(base); i++) {
6,081,732✔
3843
    uint64_t tgt = *(uint64_t*)taosArrayGet(base, i);
6,080,164✔
3844
    bool     has = true;
6,080,164✔
3845
    for (int j = 1; j < taosArrayGetSize(in); j++) {
6,080,164✔
3846
      SArray* oth = taosArrayGetP(in, j);
×
3847
      int     mid = optSysBinarySearch(oth, mi[j].idx, mi[j].len - 1, tgt);
×
3848
      if (mid >= 0 && mid < mi[j].len) {
×
3849
        uint64_t val = *(uint64_t*)taosArrayGet(oth, mid);
×
3850
        has = (val == tgt ? true : false);
×
3851
        mi[j].idx = mid;
×
3852
      } else {
3853
        has = false;
×
3854
      }
3855
    }
3856
    if (has == true) {
6,080,164✔
3857
      void* tmp = taosArrayPush(out, &tgt);
6,080,164✔
3858
      if (!tmp) {
6,080,164✔
3859
        code = terrno;
×
3860
        goto _end;
×
3861
      }
3862
    }
3863
  }
3864

3865
_end:
1,568✔
3866
  taosMemoryFreeClear(mi);
359,976✔
3867
  if (code != TSDB_CODE_SUCCESS) {
359,976✔
3868
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3869
  }
3870
  return code;
361,218✔
3871
}
3872

3873
static int tableUidCompare(const void* a, const void* b) {
45,844,720✔
3874
  int64_t u1 = *(int64_t*)a;
45,844,720✔
3875
  int64_t u2 = *(int64_t*)b;
45,844,720✔
3876
  if (u1 == u2) {
45,844,720✔
3877
    return 0;
×
3878
  }
3879
  return u1 < u2 ? -1 : 1;
45,844,720✔
3880
}
3881

3882
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt) {
360,597✔
3883
  // TODO, find comm mem from mRslt
3884
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
362,165✔
3885
    SArray* arslt = taosArrayGetP(mRslt, i);
1,568✔
3886
    taosArraySort(arslt, tableUidCompare);
1,568✔
3887
  }
3888
  return optSysIntersection(mRslt, rslt);
360,597✔
3889
}
3890

3891
static int32_t optSysSpecialColumn(SNode* cond) {
362,130✔
3892
  SOperatorNode* pOper = (SOperatorNode*)cond;
362,130✔
3893
  SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
362,130✔
3894
  for (int i = 0; i < sizeof(SYSTABLE_SPECIAL_COL) / sizeof(SYSTABLE_SPECIAL_COL[0]); i++) {
364,645✔
3895
    if (0 == strcmp(pCol->colName, SYSTABLE_SPECIAL_COL[i])) {
363,077✔
3896
      return 1;
360,562✔
3897
    }
3898
  }
3899
  return 0;
1,568✔
3900
}
3901

3902
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result) {
688,717✔
3903
  int ret = TSDB_CODE_FAILED;
688,717✔
3904
  if (nodeType(cond) == QUERY_NODE_OPERATOR) {
688,717✔
3905
    ret = optSysTabFilteImpl(arg, cond, result);
326,990✔
3906
    if (ret == 0) {
326,990✔
3907
      SOperatorNode* pOper = (SOperatorNode*)cond;
141,345✔
3908
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
141,345✔
3909
      if (0 == strcmp(pCol->colName, "create_time")) {
141,345✔
3910
        return 0;
×
3911
      }
3912
      return -1;
141,345✔
3913
    }
3914
    return ret;
185,645✔
3915
  }
3916

3917
  if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) {
362,430✔
3918
    return ret;
1,212✔
3919
  }
3920

3921
  SLogicConditionNode* pNode = (SLogicConditionNode*)cond;
361,218✔
3922
  SNodeList*           pList = (SNodeList*)pNode->pParameterList;
361,218✔
3923

3924
  int32_t len = LIST_LENGTH(pList);
361,218✔
3925

3926
  bool    hasIdx = false;
361,218✔
3927
  bool    hasRslt = true;
361,218✔
3928
  SArray* mRslt = taosArrayInit(len, POINTER_BYTES);
361,218✔
3929
  if (!mRslt) {
361,218✔
3930
    return terrno;
×
3931
  }
3932

3933
  SListCell* cell = pList->pHead;
361,218✔
3934
  for (int i = 0; i < len; i++) {
1,086,183✔
3935
    if (cell == NULL) break;
725,586✔
3936

3937
    SArray* aRslt = taosArrayInit(16, sizeof(int64_t));
725,586✔
3938
    if (!aRslt) {
725,586✔
3939
      return terrno;
×
3940
    }
3941

3942
    ret = optSysTabFilteImpl(arg, cell->pNode, aRslt);
725,586✔
3943
    if (ret == 0) {
726,207✔
3944
      // has index
3945
      hasIdx = true;
361,509✔
3946
      if (optSysSpecialColumn(cell->pNode) == 0) {
361,509✔
3947
        void* tmp = taosArrayPush(mRslt, &aRslt);
1,568✔
3948
        if (!tmp) {
1,568✔
3949
          return TSDB_CODE_FAILED;
×
3950
        }
3951
      } else {
3952
        // db_name/vgroup not result
3953
        taosArrayDestroy(aRslt);
359,941✔
3954
      }
3955
    } else if (ret == -2) {
364,698✔
3956
      // current vg
3957
      hasIdx = true;
×
3958
      hasRslt = false;
×
3959
      taosArrayDestroy(aRslt);
×
3960
      break;
×
3961
    } else {
3962
      taosArrayDestroy(aRslt);
364,698✔
3963
    }
3964
    cell = cell->pNext;
724,965✔
3965
  }
3966
  if (hasRslt && hasIdx) {
359,976✔
3967
    int32_t code = optSysMergeRslt(mRslt, result);
359,976✔
3968
    if (code != TSDB_CODE_SUCCESS) {
360,597✔
3969
      return code;
×
3970
    }
3971
  }
3972

3973
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
362,165✔
3974
    SArray* aRslt = taosArrayGetP(mRslt, i);
1,568✔
3975
    taosArrayDestroy(aRslt);
1,568✔
3976
  }
3977
  taosArrayDestroy(mRslt);
360,597✔
3978
  if (hasRslt == false) {
360,597✔
3979
    return -2;
×
3980
  }
3981
  if (hasRslt && hasIdx) {
360,597✔
3982
    cell = pList->pHead;
361,218✔
3983
    for (int i = 0; i < len; i++) {
1,084,615✔
3984
      if (cell == NULL) break;
724,965✔
3985
      SOperatorNode* pOper = (SOperatorNode*)cell->pNode;
724,965✔
3986
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
725,586✔
3987
      if (nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && 0 == strcmp(pCol->colName, "create_time")) {
726,207✔
3988
        return 0;
1,568✔
3989
      }
3990
      cell = cell->pNext;
723,397✔
3991
    }
3992
    return -1;
359,650✔
3993
  }
3994
  return -1;
×
3995
}
3996

3997
static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
6,942✔
3998
  *rowLen = 0;
6,942✔
3999

4000
  SMetaReader mr = {0};
6,942✔
4001
  pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn);
6,942✔
4002
  int32_t code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, uid);
6,942✔
4003
  if (code != TSDB_CODE_SUCCESS) {
6,942✔
4004
    qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", uid, tstrerror(terrno), idstr);
×
4005
    pHandle->api.metaReaderFn.clearReader(&mr);
×
4006
    return terrno;
×
4007
  }
4008

4009
  if (mr.me.type == TSDB_SUPER_TABLE) {
6,942✔
4010
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
5,735✔
4011
    for (int32_t i = 0; i < numOfCols; ++i) {
40,493✔
4012
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
34,758✔
4013
    }
4014
  } else if (mr.me.type == TSDB_CHILD_TABLE) {
1,207✔
4015
    uint64_t suid = mr.me.ctbEntry.suid;
×
4016
    tDecoderClear(&mr.coder);
×
4017
    code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, suid);
×
4018
    if (code != TSDB_CODE_SUCCESS) {
×
4019
      qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno), idstr);
×
4020
      pHandle->api.metaReaderFn.clearReader(&mr);
×
4021
      return terrno;
×
4022
    }
4023

4024
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
×
4025

4026
    for (int32_t i = 0; i < numOfCols; ++i) {
×
4027
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
×
4028
    }
4029
  } else if (mr.me.type == TSDB_NORMAL_TABLE) {
1,207✔
4030
    int32_t numOfCols = mr.me.ntbEntry.schemaRow.nCols;
1,207✔
4031
    for (int32_t i = 0; i < numOfCols; ++i) {
3,621✔
4032
      (*rowLen) += mr.me.ntbEntry.schemaRow.pSchema[i].bytes;
2,414✔
4033
    }
4034
  }
4035

4036
  pHandle->api.metaReaderFn.clearReader(&mr);
6,942✔
4037
  return TSDB_CODE_SUCCESS;
6,942✔
4038
}
4039

4040
static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
10,014✔
4041
  int32_t code = TSDB_CODE_SUCCESS;
10,014✔
4042
  int32_t lino = 0;
10,014✔
4043
  if (pOperator->status == OP_EXEC_DONE) {
10,014✔
4044
    (*ppRes) = NULL;
5,007✔
4045
    return code;
5,007✔
4046
  }
4047

4048
  SBlockDistInfo* pBlockScanInfo = pOperator->info;
5,007✔
4049
  SExecTaskInfo*  pTaskInfo = pOperator->pTaskInfo;
5,007✔
4050
  SStorageAPI*    pAPI = &pTaskInfo->storageAPI;
5,007✔
4051

4052
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
5,007✔
4053
  code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
5,007✔
4054
                           GET_TASKID(pTaskInfo));
5,007✔
4055
  QUERY_CHECK_CODE(code, lino, _end);
5,007✔
4056

4057
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
5,007✔
4058
  QUERY_CHECK_CODE(code, lino, _end);
5,007✔
4059

4060
  code = (int32_t)pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle, &blockDistInfo.numOfInmemRows);
5,007✔
4061
  QUERY_CHECK_CODE(code, lino, _end);
5,007✔
4062

4063
  SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
5,007✔
4064

4065
  int32_t          slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
5,007✔
4066
  SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
5,007✔
4067
  QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
5,007✔
4068

4069
  int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
5,007✔
4070
  char*   p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
5,007✔
4071
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
5,007✔
4072

4073
  int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
5,007✔
4074
  if (tempRes < 0) {
5,007✔
4075
    code = terrno;
×
4076
    QUERY_CHECK_CODE(code, lino, _end);
×
4077
  }
4078
  varDataSetLen(p, len);
5,007✔
4079

4080
  code = colDataSetVal(pColInfo, 0, p, false);
5,007✔
4081
  QUERY_CHECK_CODE(code, lino, _end);
5,007✔
4082

4083
  taosMemoryFree(p);
5,007✔
4084

4085
  // make the valgrind happy that all memory buffer has been initialized already.
4086
  if (slotId != 0) {
5,007✔
4087
    SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
5,007✔
4088
    QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
5,007✔
4089
    int64_t v = 0;
5,007✔
4090
    colDataSetInt64(p1, 0, &v);
4091
  }
4092

4093
  pBlock->info.rows = 1;
5,007✔
4094
  pOperator->status = OP_EXEC_DONE;
5,007✔
4095

4096
_end:
5,007✔
4097
  if (code != TSDB_CODE_SUCCESS) {
5,007✔
4098
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
4099
    pTaskInfo->code = code;
×
4100
    T_LONG_JMP(pTaskInfo->env, code);
×
4101
  }
4102
  (*ppRes) = pBlock;
5,007✔
4103
  return code;
5,007✔
4104
}
4105

4106
static void destroyBlockDistScanOperatorInfo(void* param) {
5,007✔
4107
  SBlockDistInfo* pDistInfo = (SBlockDistInfo*)param;
5,007✔
4108
  blockDataDestroy(pDistInfo->pResBlock);
5,007✔
4109
  if (pDistInfo->readHandle.api.tsdReader.tsdReaderClose != NULL) {
5,007✔
4110
    pDistInfo->readHandle.api.tsdReader.tsdReaderClose(pDistInfo->pHandle);
5,007✔
4111
  }
4112
  tableListDestroy(pDistInfo->pTableListInfo);
5,007✔
4113
  taosMemoryFreeClear(param);
5,007✔
4114
}
5,007✔
4115

4116
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
6,942✔
4117
  memset(pCond, 0, sizeof(SQueryTableDataCond));
6,942✔
4118

4119
  pCond->order = TSDB_ORDER_ASC;
6,942✔
4120
  pCond->numOfCols = 1;
6,942✔
4121
  pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
6,942✔
4122
  pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t));
6,942✔
4123
  if (pCond->colList == NULL || pCond->pSlotList == NULL) {
6,942✔
4124
    taosMemoryFree(pCond->colList);
×
4125
    taosMemoryFree(pCond->pSlotList);
×
4126
    return terrno;
×
4127
  }
4128

4129
  pCond->colList->colId = 1;
6,942✔
4130
  pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
6,942✔
4131
  pCond->colList->bytes = sizeof(TSKEY);
6,942✔
4132
  pCond->colList->pk = 0;
6,942✔
4133

4134
  pCond->pSlotList[0] = 0;
6,942✔
4135

4136
  pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
6,942✔
4137
  pCond->suid = uid;
6,942✔
4138
  pCond->type = TIMEWINDOW_RANGE_CONTAINED;
6,942✔
4139
  pCond->startVersion = -1;
6,942✔
4140
  pCond->endVersion = -1;
6,942✔
4141

4142
  return TSDB_CODE_SUCCESS;
6,942✔
4143
}
4144

4145
int32_t createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
5,007✔
4146
                                        STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo,
4147
                                        SOperatorInfo** pOptrInfo) {
4148
  QRY_PARAM_CHECK(pOptrInfo);
5,007✔
4149

4150
  int32_t         code = 0;
5,007✔
4151
  int32_t         lino = 0;
5,007✔
4152
  SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
5,007✔
4153
  SOperatorInfo*  pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
5,007✔
4154
  if (pInfo == NULL || pOperator == NULL) {
5,007✔
4155
    pTaskInfo->code = code = terrno;
×
4156
    goto _error;
×
4157
  }
4158

4159
  pInfo->pResBlock = createDataBlockFromDescNode(pBlockScanNode->node.pOutputDataBlockDesc);
5,007✔
4160
  QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, terrno);
5,007✔
4161
  code = blockDataEnsureCapacity(pInfo->pResBlock, 1);
5,007✔
4162
  QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4163

4164
  {
4165
    SQueryTableDataCond cond = {0};
5,007✔
4166
    code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
5,007✔
4167
    QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4168

4169
    pInfo->pTableListInfo = pTableListInfo;
5,007✔
4170
    int32_t num = 0;
5,007✔
4171
    code = tableListGetSize(pTableListInfo, &num);
5,007✔
4172
    QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4173

4174
    void* pList = tableListGetInfo(pTableListInfo, 0);
5,007✔
4175

4176
    code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock,
10,014✔
4177
                                                   (void**)&pInfo->pHandle, pTaskInfo->id.str, NULL);
5,007✔
4178
    cleanupQueryTableDataCond(&cond);
5,007✔
4179
    QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4180
  }
4181

4182
  pInfo->readHandle = *readHandle;
5,007✔
4183
  pInfo->uid = (pBlockScanNode->suid != 0) ? pBlockScanNode->suid : pBlockScanNode->uid;
5,007✔
4184

4185
  int32_t    numOfCols = 0;
5,007✔
4186
  SExprInfo* pExprInfo = NULL;
5,007✔
4187
  code = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &pExprInfo, &numOfCols);
5,007✔
4188
  QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4189

4190
  code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols, &pTaskInfo->storageAPI.functionStore);
5,007✔
4191
  QUERY_CHECK_CODE(code, lino, _error);
5,007✔
4192

4193
  setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
5,007✔
4194
                  OP_NOT_OPENED, pInfo, pTaskInfo);
4195
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doBlockInfoScanNext, NULL, destroyBlockDistScanOperatorInfo,
5,007✔
4196
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
4197
  *pOptrInfo = pOperator;
5,007✔
4198
  return code;
5,007✔
4199

4200
_error:
×
4201
  if (pInfo) {
×
4202
    pInfo->pTableListInfo = NULL;
×
4203
    destroyBlockDistScanOperatorInfo(pInfo);
×
4204
  }
4205
  if (pOperator != NULL) {
×
4206
    pOperator->info = NULL;
×
4207
    destroyOperator(pOperator);
×
4208
  }
4209
  return code;
×
4210
}
4211

4212
static int32_t buildTableListInfo(SOperatorInfo* pOperator, STableId* id, STableListInfo** ppTableListInfo) {
1,935✔
4213
  int32_t            code = TSDB_CODE_SUCCESS;
1,935✔
4214
  int32_t            line = 0;
1,935✔
4215
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
1,935✔
4216
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
1,935✔
4217
  SSysTableScanInfo* pInfo = pOperator->info;
1,935✔
4218
  SReadHandle*       pReadHandle = &pInfo->readHandle;
1,935✔
4219
  SArray*            pList = NULL;
1,935✔
4220

4221
  STableListInfo* pTableListInfo = tableListCreate();
1,935✔
4222
  QUERY_CHECK_NULL(ppTableListInfo, code, line, _end, terrno);
1,935✔
4223

4224
  if (id->type == TSDB_SUPER_TABLE) {
1,935✔
4225
    pList = taosArrayInit(4, sizeof(uint64_t));
1,290✔
4226
    QUERY_CHECK_NULL(pList, code, line, _end, terrno);
1,290✔
4227

4228
    code = pReadHandle->api.metaFn.getChildTableList(pReadHandle->vnode, id->uid, pList);
1,290✔
4229
    QUERY_CHECK_CODE(code, line, _end);
1,290✔
4230

4231
    size_t num = taosArrayGetSize(pList);
1,290✔
4232
    for (int32_t i = 0; i < num; ++i) {
1,935✔
4233
      uint64_t* id = taosArrayGet(pList, i);
645✔
4234
      if (id == NULL) {
645✔
4235
        continue;
×
4236
      }
4237
      code = tableListAddTableInfo(pTableListInfo, *id, 0);
645✔
4238
      QUERY_CHECK_CODE(code, line, _end);
645✔
4239
    }
4240
    taosArrayDestroy(pList);
1,290✔
4241
    pList = NULL;
1,290✔
4242

4243
  } else if (id->type == TSDB_NORMAL_TABLE) {
645✔
4244
    code = tableListAddTableInfo(pTableListInfo, id->uid, 0);
645✔
4245
    QUERY_CHECK_CODE(code, line, _end);
645✔
4246
  }
4247
  *ppTableListInfo = pTableListInfo;
1,935✔
4248
  return code;
1,935✔
4249
_end:
×
4250
  taosArrayDestroy(pList);
×
4251
  tableListDestroy(pTableListInfo);
×
4252
  return code;
×
4253
}
4254
static int32_t vnodeEstimateDataSizeByUid(SOperatorInfo* pOperator, STableId* id, SDbSizeStatisInfo* pStaticInfo) {
1,935✔
4255
  int32_t             code = TSDB_CODE_SUCCESS;
1,935✔
4256
  int32_t             line = 0;
1,935✔
4257
  SExecTaskInfo*      pTaskInfo = pOperator->pTaskInfo;
1,935✔
4258
  SStorageAPI*        pAPI = &pTaskInfo->storageAPI;
1,935✔
4259
  SSysTableScanInfo*  pInfo = pOperator->info;
1,935✔
4260
  SQueryTableDataCond cond = {0};
1,935✔
4261

4262
  SReadHandle* pReadHandle = &pInfo->readHandle;
1,935✔
4263

4264
  STableListInfo* pTableListInfo = NULL;
1,935✔
4265
  code = buildTableListInfo(pOperator, id, &pTableListInfo);
1,935✔
4266
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4267

4268
  tb_uid_t tbId = id->type == TSDB_SUPER_TABLE ? id->uid : 0;
1,935✔
4269

4270
  code = initTableblockDistQueryCond(tbId, &cond);
1,935✔
4271
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4272

4273
  pInfo->pTableListInfo = pTableListInfo;
1,935✔
4274

4275
  int32_t num = 0;
1,935✔
4276
  code = tableListGetSize(pTableListInfo, &num);
1,935✔
4277
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4278

4279
  void* pList = tableListGetInfo(pTableListInfo, 0);
1,935✔
4280

4281
  code = pReadHandle->api.tsdReader.tsdReaderOpen(pReadHandle->vnode, &cond, pList, num, NULL, (void**)&pInfo->pHandle,
3,870✔
4282
                                                  pTaskInfo->id.str, NULL);
1,935✔
4283
  cleanupQueryTableDataCond(&cond);
1,935✔
4284
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4285

4286
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
1,935✔
4287
  code = doGetTableRowSize(pReadHandle, id->uid, (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
1,935✔
4288
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4289

4290
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pInfo->pHandle, &blockDistInfo);
1,935✔
4291
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4292

4293
  code = pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pInfo->pHandle, &blockDistInfo.numOfInmemRows);
1,935✔
4294
  QUERY_CHECK_CODE(code, line, _end);
1,935✔
4295

4296
  int64_t rawDiskSize = 0, rawCacheSize = 0;
1,935✔
4297
  rawDiskSize = (blockDistInfo.totalRows + blockDistInfo.numOfSttRows) * blockDistInfo.rowSize;
1,935✔
4298
  rawCacheSize = blockDistInfo.numOfInmemRows * blockDistInfo.rowSize;
1,935✔
4299
  pStaticInfo->rawDataSize += rawDiskSize;
1,935✔
4300
  pStaticInfo->cacheSize += rawCacheSize;
1,935✔
4301

4302
  if (pInfo->pHandle != NULL) {
1,935✔
4303
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
1,935✔
4304
    pInfo->pHandle = NULL;
1,935✔
4305
  }
4306

4307
  tableListDestroy(pInfo->pTableListInfo);
1,935✔
4308
  pInfo->pTableListInfo = NULL;
1,935✔
4309
  return code;
1,935✔
4310
_end:
×
4311

4312
  if (pInfo->pHandle != NULL) {
×
4313
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
×
4314
    pInfo->pHandle = NULL;
×
4315
  }
4316

4317
  tableListDestroy(pInfo->pTableListInfo);
×
4318
  pInfo->pTableListInfo = NULL;
×
4319
  if (code) {
×
4320
    pTaskInfo->code = code;
×
4321
    return code;
×
4322
  }
4323
  cleanupQueryTableDataCond(&cond);
×
4324
  return code;
×
4325
}
4326

4327
static int32_t vnodeEstimateRawDataSizeImpl(SOperatorInfo* pOperator, SArray* pTableList,
1,602✔
4328
                                            SDbSizeStatisInfo* pStaticInfo) {
4329
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
1,602✔
4330
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
1,602✔
4331
  SSysTableScanInfo* pInfo = pOperator->info;
1,602✔
4332

4333
  int32_t rowLen = 0;
1,602✔
4334
  int32_t code = TSDB_CODE_SUCCESS;
1,602✔
4335
  for (int i = 0; i < taosArrayGetSize(pTableList); i++) {
3,537✔
4336
    STableId* id = (STableId*)taosArrayGet(pTableList, i);
1,935✔
4337
    code = vnodeEstimateDataSizeByUid(pOperator, id, pStaticInfo);
1,935✔
4338
    if (code != TSDB_CODE_SUCCESS) {
1,935✔
4339
      return code;
×
4340
    }
4341
  }
4342
  return code;
1,602✔
4343
}
4344

4345
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticInfo) {
5,610✔
4346
  int32_t code = TSDB_CODE_SUCCESS;
5,610✔
4347

4348
  int32_t line = 0;
5,610✔
4349

4350
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
5,610✔
4351
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
5,610✔
4352
  SSysTableScanInfo* pInfo = pOperator->info;
5,610✔
4353
  int32_t            numOfRows = 0;
5,610✔
4354
  int32_t            ret = 0;
5,610✔
4355
  if (pStaticInfo->estimateRawData == 0) {
5,610✔
4356
    pStaticInfo->rawDataSize = 0;
4,008✔
4357
    return code;
4,008✔
4358
  }
4359

4360
  if (pStaticInfo->estimateRawData == 0) {
1,602✔
4361
    pStaticInfo->rawDataSize = 0;
×
4362
    return code;
×
4363
  }
4364

4365
  if (pInfo->pCur == NULL) {
1,602✔
4366
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
×
4367
    if (pInfo->pCur == NULL) {
×
4368
      TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4369
    }
4370
  }
4371

4372
  SArray* pIdList = taosArrayInit(16, sizeof(STableId));
1,602✔
4373
  if (pIdList == NULL) {
1,602✔
4374
    TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4375
  }
4376

4377
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_CHILD_TABLE)) == 0)) {
3,537✔
4378
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
1,935✔
4379
      STableId id = {.type = TSDB_SUPER_TABLE, .uid = pInfo->pCur->mr.me.uid};
1,290✔
4380
      if (taosArrayPush(pIdList, &id) == NULL) {
1,290✔
4381
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4382
      }
4383
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
645✔
4384
      continue;
×
4385
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
645✔
4386
      STableId id = {.type = TSDB_NORMAL_TABLE, .uid = pInfo->pCur->mr.me.uid};
645✔
4387
      if (taosArrayPush(pIdList, &id) == NULL) {
645✔
4388
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4389
      }
4390
    }
4391
  }
4392
  if (pInfo->pCur) {
1,602✔
4393
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
1,602✔
4394
    pInfo->pCur = NULL;
1,602✔
4395
  }
4396

4397
  code = vnodeEstimateRawDataSizeImpl(pOperator, pIdList, pStaticInfo);
1,602✔
4398

4399
_exit:
1,602✔
4400
  if (pInfo->pCur) {
1,602✔
4401
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
4402
    pInfo->pCur = NULL;
×
4403
  }
4404
  if (code != TSDB_CODE_SUCCESS) {
1,602✔
4405
    qError("%s failed at line %d since %s", __func__, line, tstrerror(code));
×
4406
    pTaskInfo->code = code;
×
4407
  }
4408

4409
  taosArrayDestroy(pIdList);
1,602✔
4410
  return code;
1,602✔
4411
}
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