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

taosdata / TDengine / #4473

08 Jul 2025 09:38AM UTC coverage: 62.922% (+0.7%) from 62.22%
#4473

push

travis-ci

web-flow
Merge pull request #31712 from taosdata/merge/mainto3.0

merge: from main to 3.0 branch

158525 of 321496 branches covered (49.31%)

Branch coverage included in aggregate %.

56 of 60 new or added lines in 13 files covered. (93.33%)

1333 existing lines in 67 files now uncovered.

245526 of 320647 relevant lines covered (76.57%)

17689640.25 hits per line

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

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

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

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

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

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

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

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

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

80
  // file set iterate
81
  struct SFileSetReader* pFileSetReader;
82
} SSysTableScanInfo;
83

84
typedef struct {
85
  const char* name;
86
  __sys_check chkFunc;
87
  __sys_filte fltFunc;
88
} SSTabFltFuncDef;
89

90
typedef struct MergeIndex {
91
  int idx;
92
  int len;
93
} MergeIndex;
94

95
typedef struct SBlockDistInfo {
96
  SSDataBlock*    pResBlock;
97
  STsdbReader*    pHandle;
98
  SReadHandle     readHandle;
99
  STableListInfo* pTableListInfo;
100
  uint64_t        uid;  // table uid
101
} SBlockDistInfo;
102

103
typedef struct {
104
  int8_t   type;
105
  tb_uid_t uid;
106
} STableId;
107

108
static int32_t sysChkFilter__Comm(SNode* pNode);
109
static int32_t sysChkFilter__DBName(SNode* pNode);
110
static int32_t sysChkFilter__VgroupId(SNode* pNode);
111
static int32_t sysChkFilter__TableName(SNode* pNode);
112
static int32_t sysChkFilter__CreateTime(SNode* pNode);
113
static int32_t sysChkFilter__Ncolumn(SNode* pNode);
114
static int32_t sysChkFilter__Ttl(SNode* pNode);
115
static int32_t sysChkFilter__STableName(SNode* pNode);
116
static int32_t sysChkFilter__Uid(SNode* pNode);
117
static int32_t sysChkFilter__Type(SNode* pNode);
118

119
static int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result);
120
static int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result);
121
static int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result);
122
static int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result);
123
static int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result);
124
static int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result);
125
static int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result);
126
static int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result);
127
static int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result);
128

129
const SSTabFltFuncDef filterDict[] = {
130
    {.name = "table_name", .chkFunc = sysChkFilter__TableName, .fltFunc = sysFilte__TableName},
131
    {.name = "db_name", .chkFunc = sysChkFilter__DBName, .fltFunc = sysFilte__DbName},
132
    {.name = "create_time", .chkFunc = sysChkFilter__CreateTime, .fltFunc = sysFilte__CreateTime},
133
    {.name = "columns", .chkFunc = sysChkFilter__Ncolumn, .fltFunc = sysFilte__Ncolumn},
134
    {.name = "ttl", .chkFunc = sysChkFilter__Ttl, .fltFunc = sysFilte__Ttl},
135
    {.name = "stable_name", .chkFunc = sysChkFilter__STableName, .fltFunc = sysFilte__STableName},
136
    {.name = "vgroup_id", .chkFunc = sysChkFilter__VgroupId, .fltFunc = sysFilte__VgroupId},
137
    {.name = "uid", .chkFunc = sysChkFilter__Uid, .fltFunc = sysFilte__Uid},
138
    {.name = "type", .chkFunc = sysChkFilter__Type, .fltFunc = sysFilte__Type}};
139

140
#define SYSTAB_FILTER_DICT_SIZE (sizeof(filterDict) / sizeof(filterDict[0]))
141

142
static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta,
143
                                     size_t size, const char* dbName, int64_t* pRows);
144

145
static char* SYSTABLE_SPECIAL_COL[] = {"db_name", "vgroup_id"};
146

147
static int32_t        buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity);
148
static SSDataBlock*   buildInfoSchemaTableMetaBlock(char* tableName);
149
static void           destroySysScanOperator(void* param);
150
static int32_t        loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code);
151
static __optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal);
152

153
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
154
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
155
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock);
156

157
static int32_t sysTableUserColsFillOneTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
158
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
159
                                                char* tableType, SColRefWrapper *colRef);
160

161
static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
162
                                               SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo);
163

164
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStatisInfo);
165

166
int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result) {
1,496✔
167
  SSTabFltArg* pArg = arg;
1,496✔
168
  void*        pVnode = pArg->pVnode;
1,496✔
169

170
  const char* db = NULL;
1,496✔
171
  pArg->pAPI->metaFn.getBasicInfo(pVnode, &db, NULL, NULL, NULL);
1,496✔
172

173
  SName   sn = {0};
1,514✔
174
  char    dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,514✔
175
  int32_t code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1,514✔
176
  if (code != TSDB_CODE_SUCCESS) {
1,513!
177
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
178
    return code;
×
179
  }
180

181
  code = tNameGetDbName(&sn, varDataVal(dbname));
1,513✔
182
  if (code != TSDB_CODE_SUCCESS) {
1,512!
183
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
184
    return code;
×
185
  }
186
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1,512✔
187

188
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,512✔
189
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
1,512✔
190

191
  bool           reverse = false;
1,512✔
192
  bool           equal = false;
1,512✔
193
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
1,512✔
194
  if (func == NULL) return -1;
1,511!
195

196
  int ret = func(dbname, pVal->datum.p, TSDB_DATA_TYPE_VARCHAR);
1,511✔
197
  if (ret == 0) return 0;
1,511✔
198

199
  return -2;
8✔
200
}
201

202
int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result) {
×
203
  SSTabFltArg* pArg = arg;
×
204
  void*        pVnode = ((SSTabFltArg*)arg)->pVnode;
×
205

206
  int64_t vgId = 0;
×
207
  pArg->pAPI->metaFn.getBasicInfo(pVnode, NULL, (int32_t*)&vgId, NULL, NULL);
×
208

209
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
210
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
211

212
  bool           reverse = false;
×
213
  bool           equal = false;
×
214
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
×
215
  if (func == NULL) return -1;
×
216

217
  int ret = func(&vgId, &pVal->datum.i, TSDB_DATA_TYPE_BIGINT);
×
218
  if (ret == 0) return 0;
×
219

220
  return -1;
×
221
}
222

223
int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) {
897✔
224
  SSTabFltArg* pArg = arg;
897✔
225

226
  SOperatorNode* pOper = (SOperatorNode*)pNode;
897✔
227
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
897✔
228

229
  bool           reverse = false, equal = false;
897✔
230
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
897✔
231
  if (func == NULL) return -1;
897!
232

233
  SMetaFltParam param = {.suid = 0,
897✔
234
                         .cid = 0,
235
                         .type = TSDB_DATA_TYPE_VARCHAR,
236
                         .val = pVal->datum.p,
897✔
237
                         .reverse = reverse,
238
                         .equal = equal,
239
                         .filterFunc = func};
240
  return -1;
897✔
241
}
242

243
int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) {
11✔
244
  SSTabFltArg* pArg = arg;
11✔
245
  SStorageAPI* pAPI = pArg->pAPI;
11✔
246

247
  SOperatorNode* pOper = (SOperatorNode*)pNode;
11✔
248
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
11✔
249

250
  bool           reverse = false, equal = false;
11✔
251
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
11✔
252
  if (func == NULL) return -1;
11!
253

254
  SMetaFltParam param = {.suid = 0,
11✔
255
                         .cid = 0,
256
                         .type = TSDB_DATA_TYPE_BIGINT,
257
                         .val = &pVal->datum.i,
11✔
258
                         .reverse = reverse,
259
                         .equal = equal,
260
                         .filterFunc = func};
261

262
  int32_t ret = pAPI->metaFilter.metaFilterCreateTime(pArg->pVnode, &param, result);
11✔
263
  return ret;
12✔
264
}
265

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

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

278
int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result) {
×
279
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
280

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

290
int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result) {
618✔
291
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
618✔
292

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

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

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

314
int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result) {
×
315
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
316

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

326
int optSysDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) {
76,936✔
327
  int32_t cmp = func(a, b);
76,936✔
328
  switch (comparType) {
76,814!
329
    case OP_TYPE_LOWER_THAN:
56,349✔
330
      if (cmp < 0) return 0;
56,349!
331
      break;
×
332
    case OP_TYPE_LOWER_EQUAL: {
×
333
      if (cmp <= 0) return 0;
×
334
      break;
×
335
    }
336
    case OP_TYPE_GREATER_THAN: {
18,989✔
337
      if (cmp > 0) return 0;
18,989!
338
      break;
×
339
    }
340
    case OP_TYPE_GREATER_EQUAL: {
×
341
      if (cmp >= 0) return 0;
×
342
      break;
×
343
    }
344
    case OP_TYPE_EQUAL: {
1,496✔
345
      if (cmp == 0) return 0;
1,496!
346
      break;
×
347
    }
348
    default:
×
349
      return -1;
×
350
  }
351
  return cmp;
×
352
}
353

354
static int optSysFilterFuncImpl__LowerThan(void* a, void* b, int16_t dtype) {
56,750✔
355
  __compar_fn_t func = getComparFunc(dtype, 0);
56,750✔
356
  if (func == NULL) {
56,069!
357
    return -1;
×
358
  }
359
  return optSysDoCompare(func, OP_TYPE_LOWER_THAN, a, b);
56,069✔
360
}
361
static int optSysFilterFuncImpl__LowerEqual(void* a, void* b, int16_t dtype) {
×
362
  __compar_fn_t func = getComparFunc(dtype, 0);
×
363
  if (func == NULL) {
×
364
    return -1;
×
365
  }
366
  return optSysDoCompare(func, OP_TYPE_LOWER_EQUAL, a, b);
×
367
}
368
static int optSysFilterFuncImpl__GreaterThan(void* a, void* b, int16_t dtype) {
18,759✔
369
  __compar_fn_t func = getComparFunc(dtype, 0);
18,759✔
370
  if (func == NULL) {
18,994!
371
    return -1;
×
372
  }
373
  return optSysDoCompare(func, OP_TYPE_GREATER_THAN, a, b);
18,994✔
374
}
375
static int optSysFilterFuncImpl__GreaterEqual(void* a, void* b, int16_t dtype) {
×
376
  __compar_fn_t func = getComparFunc(dtype, 0);
×
377
  if (func == NULL) {
×
378
    return -1;
×
379
  }
380
  return optSysDoCompare(func, OP_TYPE_GREATER_EQUAL, a, b);
×
381
}
382
static int optSysFilterFuncImpl__Equal(void* a, void* b, int16_t dtype) {
1,500✔
383
  __compar_fn_t func = getComparFunc(dtype, 0);
1,500✔
384
  if (func == NULL) {
1,504!
385
    return -1;
×
386
  }
387
  return optSysDoCompare(func, OP_TYPE_EQUAL, a, b);
1,504✔
388
}
389

390
static int optSysFilterFuncImpl__NoEqual(void* a, void* b, int16_t dtype) {
8✔
391
  __compar_fn_t func = getComparFunc(dtype, 0);
8✔
392
  if (func == NULL) {
8!
393
    return -1;
×
394
  }
395
  return optSysDoCompare(func, OP_TYPE_NOT_EQUAL, a, b);
8✔
396
}
397

398
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result);
399
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result);
400
static int32_t optSysCheckOper(SNode* pOpear);
401
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt);
402

403
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
404
                                          SExecTaskInfo* pTaskInfo);
405
void                extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode);
406

407
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
408
                                   SSDataBlock* pBlock);
409

410
__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal) {
3,037✔
411
  if (ctype == OP_TYPE_LOWER_EQUAL || ctype == OP_TYPE_LOWER_THAN) {
3,037!
412
    *reverse = true;
7✔
413
  }
414
  if (ctype == OP_TYPE_EQUAL) {
3,037✔
415
    *equal = true;
3,022✔
416
  }
417
  if (ctype == OP_TYPE_LOWER_THAN)
3,037✔
418
    return optSysFilterFuncImpl__LowerThan;
7✔
419
  else if (ctype == OP_TYPE_LOWER_EQUAL)
3,030!
420
    return optSysFilterFuncImpl__LowerEqual;
×
421
  else if (ctype == OP_TYPE_GREATER_THAN)
3,030✔
422
    return optSysFilterFuncImpl__GreaterThan;
3✔
423
  else if (ctype == OP_TYPE_GREATER_EQUAL)
3,027!
424
    return optSysFilterFuncImpl__GreaterEqual;
×
425
  else if (ctype == OP_TYPE_EQUAL)
3,027✔
426
    return optSysFilterFuncImpl__Equal;
3,021✔
427
  else if (ctype == OP_TYPE_NOT_EQUAL)
6!
428
    return optSysFilterFuncImpl__NoEqual;
8✔
429
  return NULL;
×
430
}
431

432
static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) {
34,645✔
433
  SOperatorNode* node = (SOperatorNode*)pCond;
34,645✔
434
  if (node->opType == OP_TYPE_EQUAL) {
34,645✔
435
    if (nodeType(node->pLeft) == QUERY_NODE_COLUMN &&
7,679!
436
        strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 &&
7,681!
437
        nodeType(node->pRight) == QUERY_NODE_VALUE) {
×
438
      SValueNode* pValue = (SValueNode*)node->pRight;
×
439
      if (pValue->node.resType.type == TSDB_DATA_TYPE_NCHAR || pValue->node.resType.type == TSDB_DATA_TYPE_VARCHAR) {
×
440
        char* value = nodesGetValueFromNode(pValue);
2✔
441
        tstrncpy(condTable, varDataVal(value), TSDB_TABLE_NAME_LEN);
×
442
        return true;
×
443
      }
444
    }
445
  }
446
  return false;
34,642✔
447
}
448

449
static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) {
818,496✔
450
  if (pCond == NULL) {
818,496✔
451
    return false;
785,887✔
452
  }
453
  if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) {
32,609✔
454
    SLogicConditionNode* node = (SLogicConditionNode*)pCond;
1,659✔
455
    if (LOGIC_COND_TYPE_AND == node->condType) {
1,659✔
456
      SNode* pChild = NULL;
1,654✔
457
      FOREACH(pChild, node->pParameterList) {
4,962!
458
        if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) {
3,308!
459
          return true;
×
460
        }
461
      }
462
    }
463
  }
464

465
  if (QUERY_NODE_OPERATOR == nodeType(pCond)) {
32,609✔
466
    return sysTableIsOperatorCondOnOneTable(pCond, condTable);
31,335✔
467
  }
468

469
  return false;
1,274✔
470
}
471

472
static SSDataBlock* doOptimizeTableNameFilter(SOperatorInfo* pOperator, SSDataBlock* dataBlock, char* dbname) {
×
473
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
474
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
×
475
  SSysTableScanInfo* pInfo = pOperator->info;
×
476
  int32_t            numOfRows = 0;
×
477

478
  char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
479
  STR_TO_VARSTR(tableName, pInfo->req.filterTb);
×
480

481
  SMetaReader smrTable = {0};
×
482
  pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
483
  int32_t code = pAPI->metaReaderFn.getTableEntryByName(&smrTable, pInfo->req.filterTb);
×
484
  if (code != TSDB_CODE_SUCCESS) {
×
485
    // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
486
    pAPI->metaReaderFn.clearReader(&smrTable);
×
487
    pInfo->loadInfo.totalRows = 0;
×
488
    return NULL;
×
489
  }
490

491
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
492
    pAPI->metaReaderFn.clearReader(&smrTable);
×
493
    pInfo->loadInfo.totalRows = 0;
×
494
    return NULL;
×
495
  }
496

497
  if (smrTable.me.type == TSDB_CHILD_TABLE) {
×
498
    int64_t suid = smrTable.me.ctbEntry.suid;
×
499
    pAPI->metaReaderFn.clearReader(&smrTable);
×
500
    pAPI->metaReaderFn.initReader(&smrTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
×
501
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrTable, suid);
×
502
    if (code != TSDB_CODE_SUCCESS) {
×
503
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
504
      pAPI->metaReaderFn.clearReader(&smrTable);
×
505
      pInfo->loadInfo.totalRows = 0;
×
506
      return NULL;
×
507
    }
508
  }
509

510
  char            typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
511
  SSchemaWrapper* schemaRow = NULL;
×
512
  SColRefWrapper* colRef = NULL;
×
513
  if (smrTable.me.type == TSDB_SUPER_TABLE) {
×
514
    schemaRow = &smrTable.me.stbEntry.schemaRow;
×
515
    STR_TO_VARSTR(typeName, "CHILD_TABLE");
×
516
  } else if (smrTable.me.type == TSDB_NORMAL_TABLE) {
×
517
    schemaRow = &smrTable.me.ntbEntry.schemaRow;
×
518
    STR_TO_VARSTR(typeName, "NORMAL_TABLE");
×
519
  } else if (smrTable.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
×
520
    schemaRow = &smrTable.me.ntbEntry.schemaRow;
×
521
    colRef = &smrTable.me.colRef;
×
522
    STR_TO_VARSTR(typeName, "VIRTUAL_NORMAL_TABLE");
×
523
  } else if (smrTable.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
×
524
    colRef = &smrTable.me.colRef;
×
525
    STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
×
526
  }
527

528
  code = sysTableUserColsFillOneTableCols(pInfo, dbname, &numOfRows, dataBlock, tableName, schemaRow, typeName, colRef);
×
529
  if (code != TSDB_CODE_SUCCESS) {
×
530
    pAPI->metaReaderFn.clearReader(&smrTable);
×
531
    pInfo->loadInfo.totalRows = 0;
×
532
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
533
    pTaskInfo->code = code;
×
534
    T_LONG_JMP(pTaskInfo->env, code);
×
535
  }
536
  pAPI->metaReaderFn.clearReader(&smrTable);
×
537

538
  if (numOfRows > 0) {
×
539
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
540
    numOfRows = 0;
×
541
  }
542

543
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
544
  setOperatorCompleted(pOperator);
×
545

546
  qDebug("get cols success, total rows:%" PRIu64 ", current:%" PRId64 " %s", pInfo->loadInfo.totalRows,
×
547
         pInfo->pRes->info.rows, GET_TASKID(pTaskInfo));
548
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
549
}
550

551
int32_t doExtractDbName(char* dbname, SSysTableScanInfo* pInfo, SStorageAPI* pAPI) {
407,277✔
552
  int32_t     code = TSDB_CODE_SUCCESS;
407,277✔
553
  int32_t     lino = 0;
407,277✔
554
  SName       sn = {0};
407,277✔
555
  const char* db = NULL;
407,277✔
556
  int32_t     vgId = 0;
407,277✔
557
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
407,277✔
558
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
407,612✔
559
  QUERY_CHECK_CODE(code, lino, _end);
407,453!
560

561
  code = tNameGetDbName(&sn, varDataVal(dbname));
407,453✔
562
  QUERY_CHECK_CODE(code, lino, _end);
407,262!
563

564
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
407,262✔
565

566
_end:
407,262✔
567
  if (code != TSDB_CODE_SUCCESS) {
407,262!
568
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
569
  }
570
  return code;
407,101✔
571
}
572

573
static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
793,794✔
574
  int32_t            code = TSDB_CODE_SUCCESS;
793,794✔
575
  int32_t            lino = 0;
793,794✔
576
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
793,794✔
577
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
793,794✔
578
  SSysTableScanInfo* pInfo = pOperator->info;
793,794✔
579
  int32_t            numOfRows = 0;
793,794✔
580
  int32_t            ret = 0;
793,794✔
581
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
793,794✔
582
  SSDataBlock*       pDataBlock = NULL;
793,794✔
583

584
  if (pOperator->status == OP_EXEC_DONE) {
793,794✔
585
    return NULL;
387,372✔
586
  }
587

588
  blockDataCleanup(pInfo->pRes);
406,422✔
589

590
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_COLS);
407,317✔
591
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
406,912!
592

593
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
406,912✔
594
  QUERY_CHECK_CODE(code, lino, _end);
407,194!
595

596
  code = doExtractDbName(dbname, pInfo, pAPI);
407,194✔
597
  QUERY_CHECK_CODE(code, lino, _end);
407,272!
598

599
  // optimize when sql like where table_name='tablename' and xxx.
600
  if (pInfo->req.filterTb[0]) {
407,272!
601
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
602
    blockDataDestroy(pDataBlock);
×
603
    return p;
×
604
  }
605

606
  if (pInfo->pCur == NULL) {
407,272✔
607
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
406,656✔
608
  } else {
609
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
616✔
610
    if (code != 0) {
514!
611
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
612
      pInfo->pCur = NULL;
×
613
      QUERY_CHECK_CODE(code, lino, _end);
×
614
    }
615
  }
616

617
  if (pInfo->pSchema == NULL) {
407,205✔
618
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
406,690✔
619
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
406,671✔
620
  }
621

622
  if (!pInfo->pCur || !pInfo->pSchema) {
407,152!
623
    qError("sysTableScanUserCols failed since %s", terrstr());
×
624
    blockDataDestroy(pDataBlock);
×
625
    pInfo->loadInfo.totalRows = 0;
×
626
    return NULL;
×
627
  }
628

629
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
5,152,740✔
630
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,776,831✔
631
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,776,831✔
632

633
    SSchemaWrapper* schemaRow = NULL;
4,776,831✔
634
    SColRefWrapper* colRef = NULL;
4,776,831✔
635

636
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
4,776,831✔
637
      qDebug("sysTableScanUserCols cursor get super table, %s", GET_TASKID(pTaskInfo));
1,656,548✔
638
      void* schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
1,656,548✔
639
      if (schema == NULL) {
1,656,561✔
640
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&pInfo->pCur->mr.me.stbEntry.schemaRow);
672,961!
641
        if (pInfo->pCur->mr.me.stbEntry.schemaRow.pSchema) {
672,677!
642
          QUERY_CHECK_NULL(schemaWrapper, code, lino, _end, terrno);
673,056!
643
        }
644
        code = taosHashPut(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
672,677✔
645
        if (code == TSDB_CODE_DUP_KEY) {
672,983!
646
          code = TSDB_CODE_SUCCESS;
×
647
        }
648
        QUERY_CHECK_CODE(code, lino, _end);
672,983!
649
      }
650
      continue;
1,656,583✔
651
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
3,120,283✔
652
      qDebug("sysTableScanUserCols cursor get child table, %s", GET_TASKID(pTaskInfo));
2,476,751✔
653

654
      STR_TO_VARSTR(typeName, "CHILD_TABLE");
2,476,780✔
655
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
2,476,780✔
656
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
2,476,780✔
657
      void*   schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.ctbEntry.suid, sizeof(int64_t));
2,476,780✔
658
      if (schema != NULL) {
2,477,995✔
659
        schemaRow = *(SSchemaWrapper**)schema;
1,496,183✔
660
      } else {
661
        SMetaReader smrSuperTable = {0};
981,812✔
662
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
981,812✔
663
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
984,220✔
664
        if (code != TSDB_CODE_SUCCESS) {
983,480!
665
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
666
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
667
                 GET_TASKID(pTaskInfo));
668

669
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
670
          blockDataDestroy(pDataBlock);
×
671
          pInfo->loadInfo.totalRows = 0;
×
672
          return NULL;
×
673
        }
674
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
983,454✔
675
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
983,454!
676
          if (schemaWrapper == NULL) {
983,703!
677
            code = terrno;
×
678
            lino = __LINE__;
×
679
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
680
            goto _end;
×
681
          }
682
        }
683
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
983,454✔
684
        if (code == TSDB_CODE_DUP_KEY) {
984,012!
685
          code = TSDB_CODE_SUCCESS;
×
686
        }
687
        schemaRow = schemaWrapper;
984,012✔
688
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
984,012✔
689
        QUERY_CHECK_CODE(code, lino, _end);
984,169!
690
      }
691
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
643,532!
692
      qDebug("sysTableScanUserCols cursor get normal table, %s", GET_TASKID(pTaskInfo));
646,005✔
693
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
646,236✔
694
      STR_TO_VARSTR(typeName, "NORMAL_TABLE");
646,236✔
695
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
646,236✔
UNCOV
696
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
×
697
      qDebug("sysTableScanUserCols cursor get virtual normal table, %s", GET_TASKID(pTaskInfo));
30!
698
      schemaRow = &pInfo->pCur->mr.me.ntbEntry.schemaRow;
30✔
699
      STR_TO_VARSTR(typeName, "VIRTUAL_NORMAL_TABLE");
30✔
700
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
30✔
701
      colRef = &pInfo->pCur->mr.me.colRef;
30✔
UNCOV
702
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
×
703
      qDebug("sysTableScanUserCols cursor get virtual child table, %s", GET_TASKID(pTaskInfo));
30!
704

705
      STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
30✔
706
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
30✔
707
      colRef = &pInfo->pCur->mr.me.colRef;
30✔
708
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
30✔
709
      void*   schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.ctbEntry.suid, sizeof(int64_t));
30✔
710
      if (schema != NULL) {
30✔
711
        schemaRow = *(SSchemaWrapper**)schema;
28✔
712
      } else {
713
        SMetaReader smrSuperTable = {0};
2✔
714
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
2✔
715
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
2✔
716
        if (code != TSDB_CODE_SUCCESS) {
2!
717
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
718
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
719
                 GET_TASKID(pTaskInfo));
720

721
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
722
          blockDataDestroy(pDataBlock);
×
723
          pInfo->loadInfo.totalRows = 0;
×
724
          return NULL;
×
725
        }
726
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
2✔
727
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
2!
728
          if (schemaWrapper == NULL) {
2!
729
            code = terrno;
×
730
            lino = __LINE__;
×
731
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
732
            goto _end;
×
733
          }
734
        }
735
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
2✔
736
        if (code == TSDB_CODE_DUP_KEY) {
2!
737
          code = TSDB_CODE_SUCCESS;
×
738
        }
739
        schemaRow = schemaWrapper;
2✔
740
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
2✔
741
        QUERY_CHECK_CODE(code, lino, _end);
2!
742
      }
743
    } else {
UNCOV
744
      qDebug("sysTableScanUserCols cursor get invalid table, %s", GET_TASKID(pTaskInfo));
×
745
      continue;
×
746
    }
747

748
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
3,126,648✔
749
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
1,304✔
750
      numOfRows = 0;
1,304✔
751

752
      if (pInfo->pRes->info.rows > 0) {
1,304✔
753
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
514✔
754
        break;
514✔
755
      }
756
    }
757
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
758
    code = sysTableUserColsFillOneTableCols(pInfo, dbname, &numOfRows, pDataBlock, tableName, schemaRow, typeName, colRef);
3,126,134✔
759
    QUERY_CHECK_CODE(code, lino, _end);
3,088,971!
760
  }
761

762
  if (numOfRows > 0) {
400,230✔
763
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
376,781✔
764
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
376,691✔
765
    numOfRows = 0;
376,674✔
766
  }
767

768
  blockDataDestroy(pDataBlock);
400,123✔
769
  pDataBlock = NULL;
407,647✔
770
  if (ret != 0) {
407,647✔
771
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
407,155✔
772
    pInfo->pCur = NULL;
407,161✔
773
    setOperatorCompleted(pOperator);
407,161✔
774
  }
775

776
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
407,597✔
777
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
407,597✔
778

779
_end:
406,077✔
780
  if (code != TSDB_CODE_SUCCESS) {
407,527!
781
    blockDataDestroy(pDataBlock);
×
782
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
783
    pTaskInfo->code = code;
×
784
    T_LONG_JMP(pTaskInfo->env, code);
×
785
  }
786
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
407,527✔
787
}
788

789
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
467,358✔
790
  int32_t        code = TSDB_CODE_SUCCESS;
467,358✔
791
  int32_t        lino = 0;
467,358✔
792
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
467,358✔
793
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
467,358✔
794
  SSDataBlock*   dataBlock = NULL;
467,358✔
795

796
  SSysTableScanInfo* pInfo = pOperator->info;
467,358✔
797
  if (pOperator->status == OP_EXEC_DONE) {
467,358✔
798
    return NULL;
231,264✔
799
  }
800

801
  blockDataCleanup(pInfo->pRes);
236,094✔
802
  int32_t numOfRows = 0;
236,611✔
803

804
  dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS);
236,611✔
805
  QUERY_CHECK_NULL(dataBlock, code, lino, _end, terrno);
236,275!
806

807
  code = blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity);
236,275✔
808
  QUERY_CHECK_CODE(code, lino, _end);
236,608!
809

810
  const char* db = NULL;
236,608✔
811
  int32_t     vgId = 0;
236,608✔
812
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
236,608✔
813

814
  SName sn = {0};
236,769✔
815
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
236,769✔
816
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
236,769✔
817
  QUERY_CHECK_CODE(code, lino, _end);
236,769!
818

819
  code = tNameGetDbName(&sn, varDataVal(dbname));
236,769✔
820
  QUERY_CHECK_CODE(code, lino, _end);
236,535!
821

822
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
236,535✔
823

824
  char condTableName[TSDB_TABLE_NAME_LEN] = {0};
236,535✔
825
  // optimize when sql like where table_name='tablename' and xxx.
826
  if (pInfo->pCondition && sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) {
236,535✔
827
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
103✔
828
    STR_TO_VARSTR(tableName, condTableName);
103✔
829

830
    SMetaReader smrChildTable = {0};
103✔
831
    pAPI->metaReaderFn.initReader(&smrChildTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
103✔
832
    code = pAPI->metaReaderFn.getTableEntryByName(&smrChildTable, condTableName);
×
833
    if (code != TSDB_CODE_SUCCESS) {
×
834
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
835
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
836
      blockDataDestroy(dataBlock);
×
837
      pInfo->loadInfo.totalRows = 0;
×
838
      return NULL;
×
839
    }
840

841
    if (smrChildTable.me.type != TSDB_CHILD_TABLE && smrChildTable.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
×
842
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
843
      blockDataDestroy(dataBlock);
×
844
      pInfo->loadInfo.totalRows = 0;
×
845
      return NULL;
×
846
    }
847

848
    SMetaReader smrSuperTable = {0};
×
849
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
×
850
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid);
×
851
    if (code != TSDB_CODE_SUCCESS) {
×
852
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByUid
853
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
854
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
855
      blockDataDestroy(dataBlock);
×
856
      return NULL;
×
857
    }
858

859
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows,
×
860
                                            dataBlock);
861

862
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
863
    pAPI->metaReaderFn.clearReader(&smrChildTable);
×
864

865
    QUERY_CHECK_CODE(code, lino, _end);
×
866

867
    if (numOfRows > 0) {
×
868
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
869
      numOfRows = 0;
×
870
    }
871
    blockDataDestroy(dataBlock);
×
872
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
873
    setOperatorCompleted(pOperator);
×
874
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
875
  }
876

877
  int32_t ret = 0;
236,430✔
878
  if (pInfo->pCur == NULL) {
236,430✔
879
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
236,022✔
880
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
236,172!
881
  } else {
882
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
408✔
883
    QUERY_CHECK_CODE(code, lino, _end);
408!
884
  }
885

886
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
2,212,001✔
887
    if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE && pInfo->pCur->mr.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
1,968,609!
888
      continue;
373,777✔
889
    }
890

891
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,594,832✔
892
    STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
1,594,832✔
893

894
    SMetaReader smrSuperTable = {0};
1,594,832✔
895
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
1,594,832✔
896
    uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
1,600,942✔
897
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
1,600,942✔
898
    if (code != TSDB_CODE_SUCCESS) {
1,586,803!
899
      qError("failed to get super table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno),
×
900
             GET_TASKID(pTaskInfo));
901
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
902
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
903
      pInfo->pCur = NULL;
×
904
      blockDataDestroy(dataBlock);
×
905
      dataBlock = NULL;
×
906
      T_LONG_JMP(pTaskInfo->env, terrno);
×
907
    }
908

909
    if ((smrSuperTable.me.stbEntry.schemaTag.nCols + numOfRows) > pOperator->resultInfo.capacity) {
1,586,803✔
910
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
999✔
911
      numOfRows = 0;
1,000✔
912

913
      if (pInfo->pRes->info.rows > 0) {
1,000✔
914
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
408✔
915
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
408✔
916
        break;
408✔
917
      }
918
    }
919

920
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
921
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &pInfo->pCur->mr, dbname, tableName, &numOfRows,
1,586,396✔
922
                                            dataBlock);
923

924
    if (code != TSDB_CODE_SUCCESS) {
1,598,866!
925
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
926
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
927
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
928
      pInfo->pCur = NULL;
×
929
      blockDataDestroy(dataBlock);
×
930
      dataBlock = NULL;
×
931
      T_LONG_JMP(pTaskInfo->env, terrno);
×
932
    }
933
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
1,598,866✔
934
  }
935

936
  if (numOfRows > 0) {
235,919✔
937
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
218,480✔
938
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
218,457✔
939
    numOfRows = 0;
218,441✔
940
  }
941

942
  blockDataDestroy(dataBlock);
235,880✔
943
  dataBlock = NULL;
236,819✔
944
  if (ret != 0) {
236,819✔
945
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
236,414✔
946
    pInfo->pCur = NULL;
236,433✔
947
    setOperatorCompleted(pOperator);
236,433✔
948
  }
949

950
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
236,819✔
951

952
_end:
236,819✔
953
  if (code != TSDB_CODE_SUCCESS) {
236,819!
954
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
955
    blockDataDestroy(dataBlock);
×
956
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
957
    pInfo->pCur = NULL;
×
958
    pTaskInfo->code = code;
×
959
    T_LONG_JMP(pTaskInfo->env, code);
×
960
  }
961
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
236,819✔
962
}
963

964
void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
597,458✔
965
                                        SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo) {
966
  int32_t code = TSDB_CODE_SUCCESS;
597,458✔
967
  int32_t lino = 0;
597,458✔
968
  dataBlock->info.rows = numOfRows;
597,458✔
969
  pInfo->pRes->info.rows = numOfRows;
597,458✔
970

971
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, dataBlock->pDataBlock, false);
597,458✔
972
  QUERY_CHECK_CODE(code, lino, _end);
597,392!
973

974
  code = doFilter(pInfo->pRes, pFilterInfo, NULL);
597,392✔
975
  QUERY_CHECK_CODE(code, lino, _end);
597,407!
976

977
  blockDataCleanup(dataBlock);
597,407✔
978

979
_end:
597,430✔
980
  if (code != TSDB_CODE_SUCCESS) {
597,430!
981
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
982
    pTaskInfo->code = code;
×
983
    T_LONG_JMP(pTaskInfo->env, code);
×
984
  }
985
}
597,430✔
986

987
int32_t convertTagDataToStr(char* str, int32_t strBuffLen, int type, void* buf, int32_t bufSize, int32_t* len) {
23,604,476✔
988
  int32_t n = 0;
23,604,476✔
989

990
  switch (type) {
23,604,476!
991
    case TSDB_DATA_TYPE_NULL:
×
992
      n = tsnprintf(str, strBuffLen, "null");
×
993
      break;
×
994

995
    case TSDB_DATA_TYPE_BOOL:
5,220,657✔
996
      n = tsnprintf(str, strBuffLen, (*(int8_t*)buf) ? "true" : "false");
5,220,657✔
997
      break;
5,255,576✔
998

999
    case TSDB_DATA_TYPE_TINYINT:
1,268,796✔
1000
      n = tsnprintf(str, strBuffLen, "%d", *(int8_t*)buf);
1,268,796✔
1001
      break;
1,268,231✔
1002

1003
    case TSDB_DATA_TYPE_SMALLINT:
1,268,180✔
1004
      n = tsnprintf(str, strBuffLen, "%d", *(int16_t*)buf);
1,268,180✔
1005
      break;
1,268,943✔
1006

1007
    case TSDB_DATA_TYPE_INT:
1,608,993✔
1008
      n = tsnprintf(str, strBuffLen, "%d", *(int32_t*)buf);
1,608,993✔
1009
      break;
1,610,108✔
1010

1011
    case TSDB_DATA_TYPE_BIGINT:
2,779,895✔
1012
    case TSDB_DATA_TYPE_TIMESTAMP:
1013
      n = tsnprintf(str, strBuffLen, "%" PRId64, *(int64_t*)buf);
2,779,895✔
1014
      break;
2,781,098✔
1015

1016
    case TSDB_DATA_TYPE_FLOAT:
1,518,314✔
1017
      n = tsnprintf(str, strBuffLen, "%.5f", GET_FLOAT_VAL(buf));
1,518,314✔
1018
      break;
1,518,572✔
1019

1020
    case TSDB_DATA_TYPE_DOUBLE:
1,517,621✔
1021
      n = tsnprintf(str, strBuffLen, "%.9f", GET_DOUBLE_VAL(buf));
1,517,621✔
1022
      break;
1,519,020✔
1023

1024
    case TSDB_DATA_TYPE_BINARY:
1,313,571✔
1025
    case TSDB_DATA_TYPE_VARBINARY:
1026
    case TSDB_DATA_TYPE_GEOMETRY:
1027
      if (bufSize < 0) {
1,313,571!
1028
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1029
      }
1030

1031
      memcpy(str, buf, bufSize);
1,313,571✔
1032
      n = bufSize;
1,313,571✔
1033
      break;
1,313,571✔
1034
    case TSDB_DATA_TYPE_NCHAR:
2,535,475✔
1035
      if (bufSize < 0) {
2,535,475!
1036
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1037
      }
1038

1039
      int32_t length = taosUcs4ToMbs((TdUcs4*)buf, bufSize, str, NULL);
2,535,475✔
1040
      if (length <= 0) {
2,541,470!
1041
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1042
      }
1043
      n = length;
2,541,470✔
1044
      break;
2,541,470✔
1045
    case TSDB_DATA_TYPE_UTINYINT:
1,267,764✔
1046
      n = tsnprintf(str, strBuffLen, "%u", *(uint8_t*)buf);
1,267,764✔
1047
      break;
1,268,671✔
1048

1049
    case TSDB_DATA_TYPE_USMALLINT:
1,267,945✔
1050
      n = tsnprintf(str, strBuffLen, "%u", *(uint16_t*)buf);
1,267,945✔
1051
      break;
1,268,387✔
1052

1053
    case TSDB_DATA_TYPE_UINT:
1,270,946✔
1054
      n = tsnprintf(str, strBuffLen, "%u", *(uint32_t*)buf);
1,270,946✔
1055
      break;
1,271,458✔
1056

1057
    case TSDB_DATA_TYPE_UBIGINT:
1,280,598✔
1058
      n = tsnprintf(str, strBuffLen, "%" PRIu64, *(uint64_t*)buf);
1,280,598✔
1059
      break;
1,281,324✔
1060

1061
    default:
×
1062
      return TSDB_CODE_TSC_INVALID_VALUE;
×
1063
  }
1064

1065
  if (len) *len = n;
24,166,429✔
1066

1067
  return TSDB_CODE_SUCCESS;
24,166,429✔
1068
}
1069

1070
static int32_t sysTableGetGeomText(char* iGeom, int32_t nGeom, char** output, int32_t* nOutput) {
128✔
1071
#ifdef USE_GEOS
1072
  int32_t code = 0;
128✔
1073
  char*   outputWKT = NULL;
128✔
1074

1075
  if (nGeom == 0) {
128!
1076
    if (!(*output = taosStrdup(""))) code = terrno;
×
1077
    *nOutput = 0;
×
1078
    return code;
×
1079
  }
1080

1081
  if (TSDB_CODE_SUCCESS != (code = initCtxAsText()) ||
256!
1082
      TSDB_CODE_SUCCESS != (code = doAsText(iGeom, nGeom, &outputWKT))) {
128✔
1083
    qError("geo text for systable failed:%s", getGeosErrMsg(code));
×
1084
    *output = NULL;
×
1085
    *nOutput = 0;
×
1086
    return code;
×
1087
  }
1088

1089
  *output = outputWKT;
128✔
1090
  *nOutput = strlen(outputWKT);
128✔
1091

1092
  return code;
128✔
1093
#else
1094
  TAOS_RETURN(TSDB_CODE_OPS_NOT_SUPPORT);
1095
#endif
1096
}
1097

1098
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
1,598,508✔
1099
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
1100
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock) {
1101
  int32_t code = TSDB_CODE_SUCCESS;
1,598,508✔
1102
  int32_t lino = 0;
1,598,508✔
1103
  char    stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,598,508✔
1104
  STR_TO_VARSTR(stableName, (*smrSuperTable).me.name);
1,598,508✔
1105

1106
  int32_t numOfRows = *pNumOfRows;
1,598,508✔
1107

1108
  int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols;
1,598,508✔
1109
  for (int32_t i = 0; i < numOfTags; ++i) {
25,389,945✔
1110
    SColumnInfoData* pColInfoData = NULL;
23,799,107✔
1111

1112
    // table name
1113
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
23,799,107✔
1114
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,988,016!
1115
    code = colDataSetVal(pColInfoData, numOfRows, tableName, false);
22,988,016✔
1116
    QUERY_CHECK_CODE(code, lino, _end);
21,572,733!
1117

1118
    // database name
1119
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
21,572,733✔
1120
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
21,215,945!
1121
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
21,215,945✔
1122
    QUERY_CHECK_CODE(code, lino, _end);
21,509,179!
1123

1124
    // super table name
1125
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
21,509,179✔
1126
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
21,166,423!
1127
    code = colDataSetVal(pColInfoData, numOfRows, stableName, false);
21,166,423✔
1128
    QUERY_CHECK_CODE(code, lino, _end);
21,647,223!
1129

1130
    // tag name
1131
    char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
21,647,223✔
1132
    STR_TO_VARSTR(tagName, (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].name);
21,647,223✔
1133
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
21,647,223✔
1134
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,921,948!
1135
    code = colDataSetVal(pColInfoData, numOfRows, tagName, false);
22,921,948✔
1136
    QUERY_CHECK_CODE(code, lino, _end);
21,701,052!
1137

1138
    // tag type
1139
    int8_t tagType = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].type;
21,701,052✔
1140
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
21,701,052✔
1141
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
21,358,097!
1142
    int32_t tagStrBufflen = 32;
21,358,097✔
1143
    char    tagTypeStr[VARSTR_HEADER_SIZE + 32];
1144
    int     tagTypeLen = tsnprintf(varDataVal(tagTypeStr), tagStrBufflen, "%s", tDataTypes[tagType].name);
21,358,097✔
1145
    tagStrBufflen -= tagTypeLen;
23,847,053✔
1146
    if (tagStrBufflen <= 0) {
23,847,053!
1147
      code = TSDB_CODE_INVALID_PARA;
×
1148
      QUERY_CHECK_CODE(code, lino, _end);
×
1149
    }
1150

1151
    if (tagType == TSDB_DATA_TYPE_NCHAR) {
23,847,053✔
1152
      tagTypeLen += tsnprintf(
2,541,001✔
1153
          varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
2,544,205✔
1154
          (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
2,544,205✔
1155
    } else if (IS_VAR_DATA_TYPE(tagType)) {
21,302,848!
1156
      tagTypeLen += tsnprintf(varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
1,315,686✔
1157
                              (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE));
1,156,569✔
1158
    }
1159
    varDataSetLen(tagTypeStr, tagTypeLen);
24,002,966✔
1160
    code = colDataSetVal(pColInfoData, numOfRows, (char*)tagTypeStr, false);
24,002,966✔
1161
    QUERY_CHECK_CODE(code, lino, _end);
21,947,709!
1162

1163
    STagVal tagVal = {0};
21,947,709✔
1164
    tagVal.cid = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].colId;
21,947,709✔
1165
    char*    tagData = NULL;
21,947,709✔
1166
    uint32_t tagLen = 0;
21,947,709✔
1167

1168
    if (tagType == TSDB_DATA_TYPE_JSON) {
21,947,709✔
1169
      tagData = (char*)smrChildTable->me.ctbEntry.pTags;
366✔
1170
    } else {
1171
      bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal);
21,947,343✔
1172
      if (exist) {
23,682,612!
1173
        if (tagType == TSDB_DATA_TYPE_GEOMETRY) {
23,785,597✔
1174
          code = sysTableGetGeomText(tagVal.pData, tagVal.nData, &tagData, &tagLen);
128✔
1175
          QUERY_CHECK_CODE(code, lino, _end);
128!
1176
        } else if (tagType == TSDB_DATA_TYPE_VARBINARY) {
23,785,469✔
1177
          code = taosAscii2Hex(tagVal.pData, tagVal.nData, (void**)&tagData, &tagLen);
4,915✔
1178
          if (code < 0) {
4,915!
1179
            qError("varbinary for systable failed since %s", tstrerror(code));
×
1180
          }
1181
        } else if (IS_VAR_DATA_TYPE(tagType)) {
23,780,554!
1182
          tagData = (char*)tagVal.pData;
3,753,006✔
1183
          tagLen = tagVal.nData;
3,753,006✔
1184
        } else {
1185
          tagData = (char*)&tagVal.i64;
20,027,548✔
1186
          tagLen = tDataTypes[tagType].bytes;
20,027,548✔
1187
        }
1188
      }
1189
    }
1190

1191
    char* tagVarChar = NULL;
23,682,978✔
1192
    if (tagData != NULL) {
23,682,978!
1193
      if (tagType == TSDB_DATA_TYPE_JSON) {
23,788,957✔
1194
        char* tagJson = NULL;
366✔
1195
        parseTagDatatoJson(tagData, &tagJson, NULL);
366✔
1196
        if (tagJson == NULL) {
366!
1197
          code = terrno;
×
1198
          goto _end;
×
1199
        }
1200
        tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE);
366!
1201
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
366!
1202
        memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson));
366✔
1203
        varDataSetLen(tagVarChar, strlen(tagJson));
366✔
1204
        taosMemoryFree(tagJson);
366!
1205
      } else {
1206
        int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE)
23,788,591!
1207
                                                    : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE);
1208
        tagVarChar = taosMemoryCalloc(1, bufSize + 1);
23,788,591!
1209
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
23,706,039!
1210
        int32_t len = -1;
23,706,039✔
1211
        if (tagLen > 0)
23,706,039!
1212
          convertTagDataToStr(varDataVal(tagVarChar), bufSize + 1 - VARSTR_HEADER_SIZE, tagType, tagData, tagLen, &len);
23,735,893✔
1213
        else
UNCOV
1214
          len = 0;
×
1215
        varDataSetLen(tagVarChar, len);
23,560,303✔
1216
      }
1217
    }
1218
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
23,454,690✔
1219
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,811,910!
1220
    code = colDataSetVal(pColInfoData, numOfRows, tagVarChar,
22,859,906✔
1221
                         (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData)));
22,859,906!
1222
    QUERY_CHECK_CODE(code, lino, _end);
21,782,220!
1223

1224
    if (tagType == TSDB_DATA_TYPE_GEOMETRY || tagType == TSDB_DATA_TYPE_VARBINARY) taosMemoryFreeClear(tagData);
21,782,220!
1225
    taosMemoryFree(tagVarChar);
21,782,220!
1226
    ++numOfRows;
23,791,437✔
1227
  }
1228

1229
  *pNumOfRows = numOfRows;
1,590,838✔
1230

1231
_end:
1,590,838✔
1232
  if (code != TSDB_CODE_SUCCESS) {
1,590,838!
1233
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1234
  }
1235
  return code;
1,599,591✔
1236
}
1237

1238
static int32_t sysTableUserColsFillOneTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
3,120,241✔
1239
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
1240
                                                char* tableType, SColRefWrapper *colRef) {
1241
  int32_t code = TSDB_CODE_SUCCESS;
3,120,241✔
1242
  int32_t lino = 0;
3,120,241✔
1243
  if (schemaRow == NULL) {
3,120,241!
1244
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1245
    return TSDB_CODE_SUCCESS;
×
1246
  }
1247
  int32_t numOfRows = *pNumOfRows;
3,120,241✔
1248

1249
  int32_t numOfCols = schemaRow->nCols;
3,120,241✔
1250
  for (int32_t i = 0; i < numOfCols; ++i) {
61,026,573✔
1251
    SColumnInfoData* pColInfoData = NULL;
59,276,656✔
1252

1253
    // table name
1254
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
59,276,656✔
1255
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
53,069,647!
1256
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
53,069,647✔
1257
    QUERY_CHECK_CODE(code, lino, _end);
49,292,052!
1258

1259
    // database name
1260
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
49,292,052✔
1261
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
46,665,608!
1262
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
46,665,608✔
1263
    QUERY_CHECK_CODE(code, lino, _end);
48,186,337!
1264

1265
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
48,186,337✔
1266
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
45,684,126!
1267
    code = colDataSetVal(pColInfoData, numOfRows, tableType, false);
45,684,126✔
1268
    QUERY_CHECK_CODE(code, lino, _end);
48,872,681!
1269

1270
    // col name
1271
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
48,872,681✔
1272
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
48,872,681✔
1273
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
48,872,681✔
1274
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
61,895,438!
1275
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
61,895,438✔
1276
    QUERY_CHECK_CODE(code, lino, _end);
49,642,979!
1277

1278
    // col type
1279
    int8_t colType = schemaRow->pSchema[i].type;
49,642,979✔
1280
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
49,642,979✔
1281
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
47,286,277!
1282
    int32_t colStrBufflen = 32;
47,286,277✔
1283
    char    colTypeStr[VARSTR_HEADER_SIZE + 32];
1284
    int     colTypeLen = tsnprintf(varDataVal(colTypeStr), colStrBufflen, "%s", tDataTypes[colType].name);
47,286,277✔
1285
    colStrBufflen -= colTypeLen;
70,783,587✔
1286
    if (colStrBufflen <= 0) {
70,783,587!
1287
      code = TSDB_CODE_INVALID_PARA;
×
1288
      QUERY_CHECK_CODE(code, lino, _end);
×
1289
    }
1290
    if (colType == TSDB_DATA_TYPE_VARCHAR) {
70,783,587✔
1291
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
5,532,627✔
1292
                              (int32_t)(schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE));
5,550,131✔
1293
    } else if (colType == TSDB_DATA_TYPE_NCHAR) {
65,233,456✔
1294
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
5,509,934✔
1295
                              (int32_t)((schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
5,519,003✔
1296
    }
1297
    varDataSetLen(colTypeStr, colTypeLen);
70,757,014✔
1298
    code = colDataSetVal(pColInfoData, numOfRows, (char*)colTypeStr, false);
70,757,014✔
1299
    QUERY_CHECK_CODE(code, lino, _end);
49,886,904!
1300

1301
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
49,886,904✔
1302
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
47,228,760!
1303
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].bytes, false);
47,228,760✔
1304
    QUERY_CHECK_CODE(code, lino, _end);
46,888,856!
1305

1306
    for (int32_t j = 6; j <= 8; ++j) {
160,638,166✔
1307
      pColInfoData = taosArrayGet(dataBlock->pDataBlock, j);
114,000,707✔
1308
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
110,237,706!
1309
      colDataSetNULL(pColInfoData, numOfRows);
113,749,310✔
1310
    }
1311

1312
    // col data source
1313
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 9);
46,637,459✔
1314
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
55,716,259!
1315
    if (!colRef || !colRef->pColRef[i].hasRef) {
57,906,332✔
1316
      colDataSetNULL(pColInfoData, numOfRows);
57,905,893!
1317
    } else {
1318
      char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
439✔
1319
      char tmpColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
439✔
1320
      strcat(tmpColName, colRef->pColRef[i].refDbName);
439✔
1321
      strcat(tmpColName, ".");
439✔
1322
      strcat(tmpColName, colRef->pColRef[i].refTableName);
439✔
1323
      strcat(tmpColName, ".");
439✔
1324
      strcat(tmpColName, colRef->pColRef[i].refColName);
439✔
1325
      STR_TO_VARSTR(refColName, tmpColName);
439✔
1326

1327
      code = colDataSetVal(pColInfoData, numOfRows, (char *)refColName, false);
439✔
1328
      QUERY_CHECK_CODE(code, lino, _end);
439!
1329
    }
1330
    ++numOfRows;
57,906,332✔
1331
  }
1332

1333
  *pNumOfRows = numOfRows;
1,749,917✔
1334

1335
_end:
1,749,917✔
1336
  if (code != TSDB_CODE_SUCCESS) {
1,749,917!
1337
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1338
  }
1339
  return code;
3,090,121✔
1340
}
1341

1342
static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName) {
1,060,285✔
1343
  size_t               size = 0;
1,060,285✔
1344
  const SSysTableMeta* pMeta = NULL;
1,060,285✔
1345
  getInfosDbMeta(&pMeta, &size);
1,060,285✔
1346

1347
  int32_t index = 0;
1,060,541✔
1348
  for (int32_t i = 0; i < size; ++i) {
12,719,685!
1349
    if (strcmp(pMeta[i].name, tableName) == 0) {
12,721,072✔
1350
      index = i;
1,061,928✔
1351
      break;
1,061,928✔
1352
    }
1353
  }
1354

1355
  SSDataBlock* pBlock = NULL;
1,060,541✔
1356
  int32_t      code = createDataBlock(&pBlock);
1,060,541✔
1357
  if (code) {
1,061,109!
1358
    terrno = code;
×
1359
    return NULL;
×
1360
  }
1361

1362
  for (int32_t i = 0; i < pMeta[index].colNum; ++i) {
10,691,635✔
1363
    SColumnInfoData colInfoData =
1364
        createColumnInfoData(pMeta[index].schema[i].type, pMeta[index].schema[i].bytes, i + 1);
9,629,823✔
1365
    code = blockDataAppendColInfo(pBlock, &colInfoData);
9,675,421✔
1366
    if (code != TSDB_CODE_SUCCESS) {
9,630,429!
1367
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1368
      blockDataDestroy(pBlock);
×
1369
      pBlock = NULL;
×
1370
      terrno = code;
×
1371
      break;
×
1372
    }
1373
  }
1374

1375
  return pBlock;
1,061,061✔
1376
}
1377

1378
int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta, size_t size,
15,584✔
1379
                              const char* dbName, int64_t* pRows) {
1380
  int32_t code = TSDB_CODE_SUCCESS;
15,584✔
1381
  int32_t lino = 0;
15,584✔
1382
  char    n[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
15,584✔
1383
  int32_t numOfRows = p->info.rows;
15,584✔
1384

1385
  for (int32_t i = 0; i < size; ++i) {
358,356✔
1386
    const SSysTableMeta* pm = &pSysDbTableMeta[i];
342,770✔
1387
    if (!sysInfo && pm->sysInfo) {
342,770✔
1388
      continue;
80✔
1389
    }
1390

1391
    if (strcmp(pm->name, TSDB_INS_TABLE_USERS_FULL) == 0) {
342,690✔
1392
      continue;
7,787✔
1393
    }
1394

1395
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
334,903✔
1396
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
334,862!
1397

1398
    STR_TO_VARSTR(n, pm->name);
334,862✔
1399
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
334,862✔
1400
    QUERY_CHECK_CODE(code, lino, _end);
334,886!
1401

1402
    // database name
1403
    STR_TO_VARSTR(n, dbName);
334,886✔
1404
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
334,886✔
1405
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
334,856!
1406
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
334,856✔
1407
    QUERY_CHECK_CODE(code, lino, _end);
334,878!
1408

1409
    // create time
1410
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
334,878✔
1411
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
334,840!
1412
    colDataSetNULL(pColInfoData, numOfRows);
334,844✔
1413

1414
    // number of columns
1415
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
334,844✔
1416
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
334,838!
1417
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&pm->colNum, false);
334,838✔
1418
    QUERY_CHECK_CODE(code, lino, _end);
334,857!
1419

1420
    for (int32_t j = 4; j <= 8; ++j) {
2,008,509✔
1421
      pColInfoData = taosArrayGet(p->pDataBlock, j);
1,673,110✔
1422
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,672,901!
1423
      colDataSetNULL(pColInfoData, numOfRows);
1,673,652✔
1424
    }
1425

1426
    STR_TO_VARSTR(n, "SYSTEM_TABLE");
335,399✔
1427

1428
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
335,399✔
1429
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
334,825!
1430
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
334,825✔
1431
    QUERY_CHECK_CODE(code, lino, _end);
334,905!
1432

1433
    numOfRows += 1;
334,905✔
1434
  }
1435

1436
  *pRows = numOfRows;
15,586✔
1437

1438
_end:
15,586✔
1439
  if (code != TSDB_CODE_SUCCESS) {
15,586!
1440
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1441
  }
1442
  return code;
15,583✔
1443
}
1444

1445
int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
7,792✔
1446
  int32_t      code = TSDB_CODE_SUCCESS;
7,792✔
1447
  int32_t      lino = 0;
7,792✔
1448
  SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
7,792✔
1449
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
7,792!
1450

1451
  code = blockDataEnsureCapacity(p, capacity);
7,792✔
1452
  QUERY_CHECK_CODE(code, lino, _end);
7,792!
1453

1454
  size_t               size = 0;
7,792✔
1455
  const SSysTableMeta* pSysDbTableMeta = NULL;
7,792✔
1456

1457
  getInfosDbMeta(&pSysDbTableMeta, &size);
7,792✔
1458
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, &p->info.rows);
7,792✔
1459
  QUERY_CHECK_CODE(code, lino, _end);
7,791!
1460

1461
  getPerfDbMeta(&pSysDbTableMeta, &size);
7,791✔
1462
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, &p->info.rows);
7,791✔
1463
  QUERY_CHECK_CODE(code, lino, _end);
7,792!
1464

1465
  pInfo->pRes->info.rows = p->info.rows;
7,792✔
1466
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
7,792✔
1467
  QUERY_CHECK_CODE(code, lino, _end);
7,792!
1468

1469
  blockDataDestroy(p);
7,792✔
1470
  p = NULL;
7,792✔
1471

1472
_end:
7,792✔
1473
  if (code != TSDB_CODE_SUCCESS) {
7,792!
1474
    blockDataDestroy(p);
×
1475
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1476
  }
1477
  return code;
7,792✔
1478
}
1479

1480
static int32_t doSetUserTableMetaInfo(SStoreMetaReader* pMetaReaderFn, SStoreMeta* pMetaFn, void* pVnode,
79,993✔
1481
                                      SMetaReader* pMReader, int64_t uid, const char* dbname, int32_t vgId,
1482
                                      SSDataBlock* p, int32_t rowIndex, const char* idStr) {
1483
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
79,993✔
1484
  int32_t lino = 0;
79,993✔
1485
  int32_t code = pMetaReaderFn->getTableEntryByUid(pMReader, uid);
79,993✔
1486
  if (code < 0) {
79,982!
1487
    qError("failed to get table meta, uid:%" PRId64 ", code:%s, %s", uid, tstrerror(terrno), idStr);
×
1488
    return code;
×
1489
  }
1490

1491
  STR_TO_VARSTR(n, pMReader->me.name);
79,982✔
1492

1493
  // table name
1494
  SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
79,982✔
1495
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,982!
1496

1497
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
79,982✔
1498
  QUERY_CHECK_CODE(code, lino, _end);
79,980!
1499

1500
  // database name
1501
  pColInfoData = taosArrayGet(p->pDataBlock, 1);
79,980✔
1502
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,979!
1503
  code = colDataSetVal(pColInfoData, rowIndex, dbname, false);
79,979✔
1504
  QUERY_CHECK_CODE(code, lino, _end);
79,976!
1505

1506
  // vgId
1507
  pColInfoData = taosArrayGet(p->pDataBlock, 6);
79,976✔
1508
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,981!
1509
  code = colDataSetVal(pColInfoData, rowIndex, (char*)&vgId, false);
79,981✔
1510
  QUERY_CHECK_CODE(code, lino, _end);
79,983!
1511

1512
  int32_t tableType = pMReader->me.type;
79,983✔
1513
  if (tableType == TSDB_CHILD_TABLE) {
79,983!
1514
    // create time
1515
    int64_t ts = pMReader->me.ctbEntry.btime;
79,983✔
1516
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
79,983✔
1517
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,983!
1518
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
79,983✔
1519
    QUERY_CHECK_CODE(code, lino, _end);
79,982!
1520

1521
    SMetaReader mr1 = {0};
79,982✔
1522
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
79,982✔
1523

1524
    int64_t suid = pMReader->me.ctbEntry.suid;
79,989✔
1525
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
79,989✔
1526
    if (code != TSDB_CODE_SUCCESS) {
79,988!
1527
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
1528
             tstrerror(code), idStr);
1529
      pMetaReaderFn->clearReader(&mr1);
×
1530
      QUERY_CHECK_CODE(code, lino, _end);
×
1531
    }
1532

1533
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
79,988✔
1534
    if (pColInfoData == NULL) {
79,982!
1535
      pMetaReaderFn->clearReader(&mr1);
×
1536
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1537
    }
1538

1539
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
79,982✔
1540
    if (code != 0) {
79,989!
1541
      pMetaReaderFn->clearReader(&mr1);
×
1542
      QUERY_CHECK_CODE(code, lino, _end);
×
1543
    }
1544

1545
    // super table name
1546
    STR_TO_VARSTR(n, mr1.me.name);
79,989✔
1547
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
79,989✔
1548
    if (pColInfoData == NULL) {
79,995!
1549
      pMetaReaderFn->clearReader(&mr1);
×
1550
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1551
    }
1552

1553
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
79,995✔
1554
    pMetaReaderFn->clearReader(&mr1);
79,988✔
1555
    QUERY_CHECK_CODE(code, lino, _end);
79,997!
1556

1557
    // table comment
1558
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
79,997✔
1559
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,997!
1560
    if (pMReader->me.ctbEntry.commentLen > 0) {
79,997!
1561
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1562
      STR_TO_VARSTR(comment, pMReader->me.ctbEntry.comment);
×
1563
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1564
      QUERY_CHECK_CODE(code, lino, _end);
×
1565
    } else if (pMReader->me.ctbEntry.commentLen == 0) {
79,997!
1566
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1567
      STR_TO_VARSTR(comment, "");
×
1568
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1569
      QUERY_CHECK_CODE(code, lino, _end);
×
1570
    } else {
1571
      colDataSetNULL(pColInfoData, rowIndex);
79,997!
1572
    }
1573

1574
    // uid
1575
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
79,997✔
1576
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,983!
1577
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
79,983✔
1578
    QUERY_CHECK_CODE(code, lino, _end);
79,992!
1579

1580
    // ttl
1581
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
79,992✔
1582
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,992!
1583
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ctbEntry.ttlDays, false);
79,992✔
1584
    QUERY_CHECK_CODE(code, lino, _end);
79,990!
1585

1586
    STR_TO_VARSTR(n, "CHILD_TABLE");
79,990✔
1587

1588
  } else if (tableType == TSDB_NORMAL_TABLE) {
×
1589
    // create time
1590
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1591
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1592
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1593
    QUERY_CHECK_CODE(code, lino, _end);
×
1594

1595
    // number of columns
1596
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1597
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1598

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

1602
    // super table name
1603
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1604
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1605
    colDataSetNULL(pColInfoData, rowIndex);
×
1606

1607
    // table comment
1608
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1609
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1610
    if (pMReader->me.ntbEntry.commentLen > 0) {
×
1611
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1612
      STR_TO_VARSTR(comment, pMReader->me.ntbEntry.comment);
×
1613
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1614
      QUERY_CHECK_CODE(code, lino, _end);
×
1615
    } else if (pMReader->me.ntbEntry.commentLen == 0) {
×
1616
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1617
      STR_TO_VARSTR(comment, "");
×
1618
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1619
      QUERY_CHECK_CODE(code, lino, _end);
×
1620
    } else {
1621
      colDataSetNULL(pColInfoData, rowIndex);
×
1622
    }
1623

1624
    // uid
1625
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
1626
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1627
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
1628
    QUERY_CHECK_CODE(code, lino, _end);
×
1629

1630
    // ttl
1631
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
1632
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1633
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.ttlDays, false);
×
1634
    QUERY_CHECK_CODE(code, lino, _end);
×
1635

1636
    STR_TO_VARSTR(n, "NORMAL_TABLE");
×
1637
    // impl later
1638
  } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
×
1639
    // create time
1640
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1641
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1642
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1643
    QUERY_CHECK_CODE(code, lino, _end);
×
1644

1645
    // number of columns
1646
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1647
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1648

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

1652
    // super table name
1653
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1654
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1655
    colDataSetNULL(pColInfoData, rowIndex);
×
1656

1657
    // table comment
1658
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1659
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1660
    colDataSetNULL(pColInfoData, rowIndex);
×
1661

1662
    // uid
1663
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
1664
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1665
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
1666
    QUERY_CHECK_CODE(code, lino, _end);
×
1667

1668
    // ttl
1669
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
1670
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1671
    colDataSetNULL(pColInfoData, rowIndex);
×
1672

1673
    STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
×
1674
    // impl later
1675
  } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
×
1676
    // create time
1677
    int64_t ts = pMReader->me.ctbEntry.btime;
×
1678
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1679
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1680
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
×
1681
    QUERY_CHECK_CODE(code, lino, _end);
×
1682

1683
    SMetaReader mr1 = {0};
×
1684
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
×
1685

1686
    int64_t suid = pMReader->me.ctbEntry.suid;
×
1687
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
×
1688
    if (code != TSDB_CODE_SUCCESS) {
×
1689
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
1690
             tstrerror(code), idStr);
1691
      pMetaReaderFn->clearReader(&mr1);
×
1692
      QUERY_CHECK_CODE(code, lino, _end);
×
1693
    }
1694

1695
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1696
    if (pColInfoData == NULL) {
×
1697
      pMetaReaderFn->clearReader(&mr1);
×
1698
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1699
    }
1700

1701
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
×
1702
    if (code != 0) {
×
1703
      pMetaReaderFn->clearReader(&mr1);
×
1704
      QUERY_CHECK_CODE(code, lino, _end);
×
1705
    }
1706

1707
    // super table name
1708
    STR_TO_VARSTR(n, mr1.me.name);
×
1709
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1710
    if (pColInfoData == NULL) {
×
1711
      pMetaReaderFn->clearReader(&mr1);
×
1712
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1713
    }
1714

1715
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
×
1716
    pMetaReaderFn->clearReader(&mr1);
×
1717
    QUERY_CHECK_CODE(code, lino, _end);
×
1718

1719
    // table comment
1720
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1721
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1722
    colDataSetNULL(pColInfoData, rowIndex);
×
1723

1724
    // uid
1725
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
1726
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1727
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
1728
    QUERY_CHECK_CODE(code, lino, _end);
×
1729

1730
    // ttl
1731
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
1732
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1733
    colDataSetNULL(pColInfoData, rowIndex);
×
1734

1735
    STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
×
1736
  }
1737

1738
_end:
×
1739
  qError("%s failed at line %d since %s, %s", __func__, lino, tstrerror(code), idStr);
79,990!
1740
  return code;
80,000✔
1741
}
1742

1743
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
28✔
1744
  int32_t            code = TSDB_CODE_SUCCESS;
28✔
1745
  int32_t            lino = 0;
28✔
1746
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
28✔
1747
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
28✔
1748
  SSysTableScanInfo* pInfo = pOperator->info;
28✔
1749
  SSysTableIndex*    pIdx = pInfo->pIdx;
28✔
1750
  SSDataBlock*       p = NULL;
28✔
1751
  blockDataCleanup(pInfo->pRes);
28✔
1752
  int32_t numOfRows = 0;
28✔
1753

1754
  int ret = 0;
28✔
1755

1756
  const char* db = NULL;
28✔
1757
  int32_t     vgId = 0;
28✔
1758
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
28✔
1759

1760
  SName sn = {0};
28✔
1761
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
1762
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
28✔
1763
  QUERY_CHECK_CODE(code, lino, _end);
28!
1764

1765
  code = tNameGetDbName(&sn, varDataVal(dbname));
28✔
1766
  QUERY_CHECK_CODE(code, lino, _end);
28!
1767

1768
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
28✔
1769

1770
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
28✔
1771
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
28!
1772

1773
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
28✔
1774
  QUERY_CHECK_CODE(code, lino, _end);
28!
1775

1776
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
1777
  int32_t i = pIdx->lastIdx;
28✔
1778
  for (; i < taosArrayGetSize(pIdx->uids); i++) {
80,006✔
1779
    tb_uid_t* uid = taosArrayGet(pIdx->uids, i);
79,993✔
1780
    QUERY_CHECK_NULL(uid, code, lino, _end, terrno);
79,993!
1781

1782
    SMetaReader mr = {0};
79,993✔
1783
    pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
79,993✔
1784

1785
    code = doSetUserTableMetaInfo(&pAPI->metaReaderFn, &pAPI->metaFn, pInfo->readHandle.vnode, &mr, *uid, dbname, vgId,
79,993✔
1786
                                  p, numOfRows, GET_TASKID(pTaskInfo));
79,993✔
1787

1788
    pAPI->metaReaderFn.clearReader(&mr);
80,000✔
1789
    QUERY_CHECK_CODE(code, lino, _end);
79,999!
1790

1791
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 9);
79,999✔
1792
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
79,999!
1793

1794
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
79,999✔
1795
    QUERY_CHECK_CODE(code, lino, _end);
79,994!
1796

1797
    if (++numOfRows >= pOperator->resultInfo.capacity) {
79,994✔
1798
      p->info.rows = numOfRows;
16✔
1799
      pInfo->pRes->info.rows = numOfRows;
16✔
1800

1801
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
16✔
1802
      QUERY_CHECK_CODE(code, lino, _end);
16!
1803

1804
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
16✔
1805
      QUERY_CHECK_CODE(code, lino, _end);
16!
1806

1807
      blockDataCleanup(p);
16✔
1808
      numOfRows = 0;
16✔
1809

1810
      if (pInfo->pRes->info.rows > 0) {
16!
1811
        break;
16✔
1812
      }
1813
    }
1814
  }
1815

1816
  if (numOfRows > 0) {
28✔
1817
    p->info.rows = numOfRows;
12✔
1818
    pInfo->pRes->info.rows = numOfRows;
12✔
1819

1820
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
12✔
1821
    QUERY_CHECK_CODE(code, lino, _end);
12!
1822

1823
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
12✔
1824
    QUERY_CHECK_CODE(code, lino, _end);
12!
1825

1826
    blockDataCleanup(p);
12✔
1827
    numOfRows = 0;
12✔
1828
  }
1829

1830
  if (i >= taosArrayGetSize(pIdx->uids)) {
28✔
1831
    setOperatorCompleted(pOperator);
12✔
1832
  } else {
1833
    pIdx->lastIdx = i + 1;
16✔
1834
  }
1835

1836
  blockDataDestroy(p);
28✔
1837
  p = NULL;
28✔
1838

1839
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
28✔
1840

1841
_end:
28✔
1842
  if (code != TSDB_CODE_SUCCESS) {
28!
1843
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1844
    blockDataDestroy(p);
×
1845
    pTaskInfo->code = code;
×
1846
    T_LONG_JMP(pTaskInfo->env, code);
×
1847
  }
1848
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
28!
1849
}
1850

1851
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
409,379✔
1852
  int32_t        code = TSDB_CODE_SUCCESS;
409,379✔
1853
  int32_t        lino = 0;
409,379✔
1854
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
409,379✔
1855
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
409,379✔
1856
  int8_t         firstMetaCursor = 0;
409,379✔
1857
  SSDataBlock*   p = NULL;
409,379✔
1858

1859
  SSysTableScanInfo* pInfo = pOperator->info;
409,379✔
1860
  if (pInfo->pCur == NULL) {
409,379!
1861
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
409,821✔
1862
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
410,159!
1863
    firstMetaCursor = 1;
410,215✔
1864
  }
1865
  if (!firstMetaCursor) {
409,773!
1866
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
×
1867
    if (code != 0) {
×
1868
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1869
      pInfo->pCur = NULL;
×
1870
      QUERY_CHECK_CODE(code, lino, _end);
×
1871
    }
1872
  }
1873

1874
  blockDataCleanup(pInfo->pRes);
409,773✔
1875
  int32_t numOfRows = 0;
410,360✔
1876

1877
  const char* db = NULL;
410,360✔
1878
  int32_t     vgId = 0;
410,360✔
1879
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
410,360✔
1880

1881
  SName sn = {0};
410,587✔
1882
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
410,587✔
1883
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
410,587✔
1884
  QUERY_CHECK_CODE(code, lino, _end);
410,352!
1885

1886
  code = tNameGetDbName(&sn, varDataVal(dbname));
410,352✔
1887
  QUERY_CHECK_CODE(code, lino, _end);
409,539!
1888

1889
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
409,539✔
1890

1891
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
409,539✔
1892
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
409,780!
1893

1894
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
409,780✔
1895
  QUERY_CHECK_CODE(code, lino, _end);
410,365!
1896

1897
  char n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
410,365✔
1898

1899
  int32_t ret = 0;
410,365✔
1900
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
3,629,073✔
1901
    STR_TO_VARSTR(n, pInfo->pCur->mr.me.name);
3,216,529✔
1902

1903
    // table name
1904
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
3,216,529✔
1905
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,207,844!
1906
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
3,207,844✔
1907
    QUERY_CHECK_CODE(code, lino, _end);
3,214,059!
1908

1909
    // database name
1910
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
3,214,059✔
1911
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,203,895!
1912
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
3,203,895✔
1913
    QUERY_CHECK_CODE(code, lino, _end);
3,215,471!
1914

1915
    // vgId
1916
    pColInfoData = taosArrayGet(p->pDataBlock, 6);
3,215,471✔
1917
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,206,423!
1918
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
3,206,423✔
1919
    QUERY_CHECK_CODE(code, lino, _end);
3,209,616!
1920

1921
    int32_t tableType = pInfo->pCur->mr.me.type;
3,209,616✔
1922
    if (tableType == TSDB_CHILD_TABLE) {
3,209,616✔
1923
      // create time
1924
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
2,531,164✔
1925
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
2,531,164✔
1926
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,524,673!
1927
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
2,524,673✔
1928
      QUERY_CHECK_CODE(code, lino, _end);
2,529,516!
1929

1930
      SMetaReader mr = {0};
2,529,516✔
1931
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
2,529,516✔
1932

1933
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
2,545,051✔
1934
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
2,545,051✔
1935
      if (code != TSDB_CODE_SUCCESS) {
2,508,359!
1936
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
1937
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
1938
        pAPI->metaReaderFn.clearReader(&mr);
×
1939
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1940
        pInfo->pCur = NULL;
×
1941
        blockDataDestroy(p);
×
1942
        T_LONG_JMP(pTaskInfo->env, terrno);
×
1943
      }
1944

1945
      if (isTsmaResSTb(mr.me.name)) {
2,508,359!
1946
        pAPI->metaReaderFn.clearReader(&mr);
×
1947
        continue;
×
1948
      }
1949

1950
      // number of columns
1951
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
2,537,315✔
1952
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,533,782!
1953
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
2,533,782✔
1954
      QUERY_CHECK_CODE(code, lino, _end);
2,533,653!
1955

1956
      // super table name
1957
      STR_TO_VARSTR(n, mr.me.name);
2,533,653✔
1958
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
2,533,653✔
1959
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,529,692!
1960
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
2,529,692✔
1961
      QUERY_CHECK_CODE(code, lino, _end);
2,537,868!
1962
      pAPI->metaReaderFn.clearReader(&mr);
2,537,868✔
1963

1964
      // table comment
1965
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
2,544,368✔
1966
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,536,046!
1967
      if (pInfo->pCur->mr.me.ctbEntry.commentLen > 0) {
2,536,046✔
1968
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
109✔
1969
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ctbEntry.comment);
109✔
1970
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
109✔
1971
        QUERY_CHECK_CODE(code, lino, _end);
109!
1972
      } else if (pInfo->pCur->mr.me.ctbEntry.commentLen == 0) {
2,535,937✔
1973
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
204,750✔
1974
        STR_TO_VARSTR(comment, "");
204,750✔
1975
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
204,750✔
1976
        QUERY_CHECK_CODE(code, lino, _end);
204,324!
1977
      } else {
1978
        colDataSetNULL(pColInfoData, numOfRows);
2,331,187!
1979
      }
1980

1981
      // uid
1982
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
2,535,620✔
1983
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,529,641!
1984
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
2,529,641✔
1985
      QUERY_CHECK_CODE(code, lino, _end);
2,531,497!
1986

1987
      // ttl
1988
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
2,531,497✔
1989
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2,526,139!
1990
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ctbEntry.ttlDays, false);
2,526,139✔
1991
      QUERY_CHECK_CODE(code, lino, _end);
2,533,246!
1992

1993
      STR_TO_VARSTR(n, "CHILD_TABLE");
2,533,246✔
1994
    } else if (tableType == TSDB_NORMAL_TABLE) {
678,452!
1995
      // create time
1996
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
685,419✔
1997
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
685,001!
1998
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
685,001✔
1999
      QUERY_CHECK_CODE(code, lino, _end);
685,347!
2000

2001
      // number of columns
2002
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
685,347✔
2003
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
684,959!
2004
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
684,959✔
2005
      QUERY_CHECK_CODE(code, lino, _end);
685,405!
2006

2007
      // super table name
2008
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
685,405✔
2009
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
684,992✔
2010
      colDataSetNULL(pColInfoData, numOfRows);
684,970!
2011

2012
      // table comment
2013
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
684,970✔
2014
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
684,517!
2015
      if (pInfo->pCur->mr.me.ntbEntry.commentLen > 0) {
684,540✔
2016
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
96✔
2017
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ntbEntry.comment);
96✔
2018
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
96✔
2019
        QUERY_CHECK_CODE(code, lino, _end);
96!
2020
      } else if (pInfo->pCur->mr.me.ntbEntry.commentLen == 0) {
684,444✔
2021
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
104✔
2022
        STR_TO_VARSTR(comment, "");
104✔
2023
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
104✔
2024
        QUERY_CHECK_CODE(code, lino, _end);
104!
2025
      } else {
2026
        colDataSetNULL(pColInfoData, numOfRows);
684,340!
2027
      }
2028

2029
      // uid
2030
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
684,540✔
2031
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
684,778!
2032
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
684,778✔
2033
      QUERY_CHECK_CODE(code, lino, _end);
685,359!
2034

2035
      // ttl
2036
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
685,359✔
2037
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
684,901!
2038
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.ttlDays, false);
684,901✔
2039
      QUERY_CHECK_CODE(code, lino, _end);
685,390!
2040

2041
      STR_TO_VARSTR(n, "NORMAL_TABLE");
685,390✔
UNCOV
2042
    } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
×
2043
      // create time
2044
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
259✔
2045
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2046
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
259✔
2047
      QUERY_CHECK_CODE(code, lino, _end);
259!
2048

2049
      // number of columns
2050
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
259✔
2051
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2052
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
259✔
2053
      QUERY_CHECK_CODE(code, lino, _end);
259!
2054

2055
      // super table name
2056
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
259✔
2057
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2058
      colDataSetNULL(pColInfoData, numOfRows);
259!
2059

2060
      // table comment
2061
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
259✔
2062
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2063
      colDataSetNULL(pColInfoData, numOfRows);
259!
2064

2065
      // uid
2066
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
259✔
2067
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2068
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
259✔
2069
      QUERY_CHECK_CODE(code, lino, _end);
259!
2070

2071
      // ttl
2072
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
259✔
2073
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
259!
2074
      colDataSetNULL(pColInfoData, numOfRows);
259!
2075

2076
      STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
259✔
UNCOV
2077
    } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
×
2078
      // create time
2079
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
254✔
2080
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
254✔
2081
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
254!
2082
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
254✔
2083
      QUERY_CHECK_CODE(code, lino, _end);
253!
2084

2085
      SMetaReader mr = {0};
253✔
2086
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
253✔
2087

2088
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
256✔
2089
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
256✔
2090
      if (code != TSDB_CODE_SUCCESS) {
256!
2091
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
2092
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
2093
        pAPI->metaReaderFn.clearReader(&mr);
×
2094
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2095
        pInfo->pCur = NULL;
×
2096
        blockDataDestroy(p);
×
2097
        T_LONG_JMP(pTaskInfo->env, terrno);
×
2098
      }
2099

2100
      if (isTsmaResSTb(mr.me.name)) {
256!
2101
        pAPI->metaReaderFn.clearReader(&mr);
×
2102
        continue;
×
2103
      }
2104

2105
      // number of columns
2106
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
256✔
2107
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
256!
2108
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
256✔
2109
      QUERY_CHECK_CODE(code, lino, _end);
256!
2110

2111
      // super table name
2112
      STR_TO_VARSTR(n, mr.me.name);
256✔
2113
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
256✔
2114
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
256!
2115
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
256✔
2116
      QUERY_CHECK_CODE(code, lino, _end);
256!
2117
      pAPI->metaReaderFn.clearReader(&mr);
256✔
2118

2119
      // table comment
2120
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
257✔
2121
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
257!
2122
      colDataSetNULL(pColInfoData, numOfRows);
257!
2123

2124
      // uid
2125
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
257✔
2126
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
257!
2127
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
257✔
2128
      QUERY_CHECK_CODE(code, lino, _end);
257!
2129

2130
      // ttl
2131
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
257✔
2132
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
257!
2133
      colDataSetNULL(pColInfoData, numOfRows);
257!
2134

2135
      STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
257✔
2136
    }
2137

2138
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
3,211,672✔
2139
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3,205,840!
2140
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
3,205,840✔
2141
    QUERY_CHECK_CODE(code, lino, _end);
3,218,708!
2142

2143
    if (++numOfRows >= pOperator->resultInfo.capacity) {
3,218,708!
2144
      p->info.rows = numOfRows;
×
2145
      pInfo->pRes->info.rows = numOfRows;
×
2146

2147
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
2148
      QUERY_CHECK_CODE(code, lino, _end);
×
2149

2150
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
2151
      QUERY_CHECK_CODE(code, lino, _end);
×
2152

2153
      blockDataCleanup(p);
×
2154
      numOfRows = 0;
×
2155

2156
      if (pInfo->pRes->info.rows > 0) {
×
2157
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
2158
        break;
×
2159
      }
2160
    }
2161
  }
2162

2163
  if (numOfRows > 0) {
408,623✔
2164
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
376,006✔
2165
    p->info.rows = numOfRows;
375,918✔
2166
    pInfo->pRes->info.rows = numOfRows;
375,918✔
2167

2168
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
375,918✔
2169
    QUERY_CHECK_CODE(code, lino, _end);
375,767!
2170

2171
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
375,767✔
2172
    QUERY_CHECK_CODE(code, lino, _end);
375,801!
2173

2174
    blockDataCleanup(p);
375,801✔
2175
    numOfRows = 0;
375,915✔
2176
  }
2177

2178
  blockDataDestroy(p);
408,532✔
2179
  p = NULL;
410,731✔
2180

2181
  // todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
2182
  if (ret != 0) {
410,731!
2183
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
410,737✔
2184
    pInfo->pCur = NULL;
410,727✔
2185
    setOperatorCompleted(pOperator);
410,727✔
2186
  }
2187

2188
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
410,690✔
2189

2190
_end:
410,690✔
2191
  if (code != TSDB_CODE_SUCCESS) {
410,690!
2192
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2193
    blockDataDestroy(p);
×
2194
    pTaskInfo->code = code;
×
2195
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2196
    pInfo->pCur = NULL;
×
2197
    T_LONG_JMP(pTaskInfo->env, code);
×
2198
  }
2199
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
410,690✔
2200
}
2201

2202
static int32_t buildVgDiskUsage(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticsInfo) {
46✔
2203
  int32_t            code = TSDB_CODE_SUCCESS;
46✔
2204
  int32_t            lino = 0;
46✔
2205
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
46✔
2206
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
46✔
2207
  SSysTableScanInfo* pInfo = pOperator->info;
46✔
2208
  int32_t            vgId = 0;
46✔
2209
  const char*        db = NULL;
46✔
2210
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &pStaticsInfo->dbname, &vgId, NULL, NULL);
46✔
2211

2212
  pStaticsInfo->vgId = vgId;
47✔
2213

2214
  code = pAPI->metaFn.getDBSize(pInfo->readHandle.vnode, pStaticsInfo);
47✔
2215
  QUERY_CHECK_CODE(code, lino, _end);
48!
2216

2217
  code = vnodeEstimateRawDataSize(pOperator, pStaticsInfo);
48✔
2218
  QUERY_CHECK_CODE(code, lino, _end);
47!
2219

2220
  pStaticsInfo->memSize = pStaticsInfo->memSize >> 10;
47✔
2221
  pStaticsInfo->l1Size = pStaticsInfo->l1Size >> 10;
47✔
2222
  pStaticsInfo->l2Size = pStaticsInfo->l2Size >> 10;
47✔
2223
  pStaticsInfo->l3Size = pStaticsInfo->l3Size >> 10;
47✔
2224
  pStaticsInfo->cacheSize = pStaticsInfo->cacheSize >> 10;
47✔
2225
  pStaticsInfo->walSize = pStaticsInfo->walSize >> 10;
47✔
2226
  pStaticsInfo->metaSize = pStaticsInfo->metaSize >> 10;
47✔
2227
  pStaticsInfo->rawDataSize = pStaticsInfo->rawDataSize >> 10;
47✔
2228
  pStaticsInfo->s3Size = pStaticsInfo->s3Size >> 10;
47✔
2229

2230
_end:
47✔
2231
  return code;
47✔
2232
}
2233
static SSDataBlock* sysTableBuildVgUsage(SOperatorInfo* pOperator) {
64✔
2234
  int32_t            code = TSDB_CODE_SUCCESS;
64✔
2235
  int32_t            lino = 0;
64✔
2236
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
64✔
2237
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
64✔
2238
  SSysTableScanInfo* pInfo = pOperator->info;
64✔
2239
  SDbSizeStatisInfo  staticsInfo = {0};
64✔
2240

2241
  char*        buf = NULL;
64✔
2242
  SSDataBlock* p = NULL;
64✔
2243

2244
  const char* db = NULL;
64✔
2245
  int32_t     numOfCols = 0;
64✔
2246
  int32_t     numOfRows = 0;
64✔
2247

2248
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2249
  if (pInfo->readHandle.mnd != NULL) {
64✔
2250
    setOperatorCompleted(pOperator);
20✔
2251
    return NULL;
20✔
2252
  }
2253
  if (pInfo->pCur == NULL) {
44!
2254
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
48✔
2255
    if (pInfo->pCur == NULL) {
47!
2256
      code = terrno;
×
2257
      QUERY_CHECK_CODE(code, lino, _end);
×
2258
    }
2259
  }
2260

2261
  SSDataBlock* pBlock = pInfo->pRes;
43✔
2262

2263
  code = buildVgDiskUsage(pOperator, &staticsInfo);
43✔
2264
  QUERY_CHECK_CODE(code, lino, _end);
47!
2265

2266
  if (pInfo->showRewrite) {
47✔
2267
    SSDataBlock*      pBlock = pInfo->pRes;
5✔
2268
    SDBBlockUsageInfo usageInfo = {0};
5✔
2269
    int32_t           len = tSerializeBlockDbUsage(NULL, 0, &usageInfo);
5✔
2270

2271
    usageInfo.dataInDiskSize = staticsInfo.l1Size + staticsInfo.l2Size + staticsInfo.l3Size;
5✔
2272
    usageInfo.walInDiskSize = staticsInfo.walSize;
5✔
2273
    usageInfo.rawDataSize = staticsInfo.rawDataSize;
5✔
2274

2275
    buf = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
5!
2276
    QUERY_CHECK_NULL(buf, code, lino, _end, terrno);
6!
2277

2278
    int32_t tempRes = tSerializeBlockDbUsage(varDataVal(buf), len, &usageInfo);
6✔
2279
    if (tempRes != len) {
6!
2280
      QUERY_CHECK_CODE(TSDB_CODE_INVALID_MSG, lino, _end);
×
2281
    }
2282

2283
    varDataSetLen(buf, len);
6✔
2284

2285
    int32_t          slotId = 1;
6✔
2286
    SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, 1);
6✔
2287
    QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
6!
2288
    code = colDataSetVal(pColInfo, 0, buf, false);
6✔
2289
    QUERY_CHECK_CODE(code, lino, _end);
5!
2290
    taosMemoryFreeClear(buf);
5!
2291
    if (slotId != 0) {
5!
2292
      SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
6✔
2293
      QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
6!
2294
    }
2295

2296
    pBlock->info.rows = 1;
5✔
2297
    pOperator->status = OP_EXEC_DONE;
5✔
2298
    pInfo->pRes->info.rows = pBlock->info.rows;
5✔
2299
    QUERY_CHECK_CODE(code, lino, _end);
5!
2300
  } else {
2301
    SName sn = {0};
42✔
2302
    char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
42✔
2303
    code = tNameFromString(&sn, staticsInfo.dbname, T_NAME_ACCT | T_NAME_DB);
42✔
2304
    QUERY_CHECK_CODE(code, lino, _end);
42!
2305

2306
    code = tNameGetDbName(&sn, varDataVal(dbname));
42✔
2307
    QUERY_CHECK_CODE(code, lino, _end);
42!
2308

2309
    varDataSetLen(dbname, strlen(varDataVal(dbname)));
42✔
2310

2311
    p = buildInfoSchemaTableMetaBlock(TSDB_INS_DISK_USAGE);
42✔
2312
    QUERY_CHECK_NULL(p, code, lino, _end, terrno);
42!
2313

2314
    code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
42✔
2315
    QUERY_CHECK_CODE(code, lino, _end);
42!
2316

2317
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2318
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
42✔
2319
    QUERY_CHECK_CODE(code, lino, _end);
42!
2320

2321
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2322
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.vgId, false);
42✔
2323
    QUERY_CHECK_CODE(code, lino, _end);
42!
2324

2325
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2326
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.walSize, false);  // wal
42✔
2327
    QUERY_CHECK_CODE(code, lino, _end);
42!
2328

2329
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2330
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l1Size, false);  // l1_size
42✔
2331
    QUERY_CHECK_CODE(code, lino, _end);
42!
2332

2333
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2334
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l2Size, false);  // l2_size
42✔
2335
    QUERY_CHECK_CODE(code, lino, _end);
42!
2336

2337
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2338
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l3Size, false);  // l3_size
42✔
2339
    QUERY_CHECK_CODE(code, lino, _end);
42!
2340

2341
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2342
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.cacheSize, false);  // cache_size
42✔
2343
    QUERY_CHECK_CODE(code, lino, _end);
42!
2344

2345
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2346
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.metaSize, false);  // meta_size
42✔
2347
    QUERY_CHECK_CODE(code, lino, _end);
42!
2348

2349
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2350
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.s3Size, false);  // s3_size
42✔
2351
    QUERY_CHECK_CODE(code, lino, _end);
42!
2352

2353
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
42✔
2354
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.rawDataSize, false);  // estimate_size
42✔
2355
    QUERY_CHECK_CODE(code, lino, _end);
42!
2356
    numOfRows += 1;
42✔
2357

2358
    if (numOfRows > 0) {
42!
2359
      p->info.rows = numOfRows;
42✔
2360
      pInfo->pRes->info.rows = numOfRows;
42✔
2361

2362
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
42✔
2363
      QUERY_CHECK_CODE(code, lino, _end);
42!
2364

2365
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
42✔
2366
      QUERY_CHECK_CODE(code, lino, _end);
42!
2367
    }
2368

2369
    blockDataDestroy(p);
42✔
2370
    p = NULL;
42✔
2371

2372
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
42✔
2373
    setOperatorCompleted(pOperator);
42✔
2374
  }
2375
_end:
47✔
2376
  taosMemoryFree(buf);
47!
2377
  if (pInfo->pCur) {
47!
2378
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2379
    pInfo->pCur = NULL;
×
2380
  }
2381
  if (code != TSDB_CODE_SUCCESS) {
47!
2382
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2383
    blockDataDestroy(p);
×
2384
    pTaskInfo->code = code;
×
2385
    T_LONG_JMP(pTaskInfo->env, code);
×
2386
  }
2387
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
47!
2388
}
2389

2390
static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
820,001✔
2391
  int32_t            code = TSDB_CODE_SUCCESS;
820,001✔
2392
  int32_t            lino = 0;
820,001✔
2393
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
820,001✔
2394
  SSysTableScanInfo* pInfo = pOperator->info;
820,001✔
2395

2396
  SNode* pCondition = pInfo->pCondition;
820,001✔
2397
  if (pOperator->status == OP_EXEC_DONE) {
820,001✔
2398
    return NULL;
402,611✔
2399
  }
2400

2401
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2402
  if (pInfo->readHandle.mnd != NULL) {
417,390✔
2403
    code = buildSysDbTableInfo(pInfo, pOperator->resultInfo.capacity);
7,792✔
2404
    QUERY_CHECK_CODE(code, lino, _end);
7,792!
2405

2406
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
7,792✔
2407
    QUERY_CHECK_CODE(code, lino, _end);
7,792!
2408
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
7,792✔
2409

2410
    setOperatorCompleted(pOperator);
7,792✔
2411
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
7,792✔
2412
  } else {
2413
    if (pInfo->showRewrite == false) {
409,598✔
2414
      if (pCondition != NULL && pInfo->pIdx == NULL) {
401,661✔
2415
        SSTabFltArg arg = {
3,153✔
2416
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
3,153✔
2417

2418
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
3,153!
2419
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
3,157!
2420
        idx->init = 0;
3,157✔
2421
        idx->uids = taosArrayInit(128, sizeof(int64_t));
3,157✔
2422
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
3,157!
2423
        idx->lastIdx = 0;
3,157✔
2424

2425
        pInfo->pIdx = idx;  // set idx arg
3,157✔
2426

2427
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
3,157✔
2428
        if (flt == 0) {
3,150✔
2429
          pInfo->pIdx->init = 1;
12✔
2430
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
12✔
2431
          return blk;
12✔
2432
        } else if ((flt == -1) || (flt == -2)) {
3,138!
2433
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
3,138✔
2434
        }
2435
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
395,395!
2436
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
16✔
2437
        return blk;
16✔
2438
      }
2439
    }
2440

2441
    return sysTableBuildUserTables(pOperator);
409,542✔
2442
  }
2443

2444
_end:
×
2445
  if (code != TSDB_CODE_SUCCESS) {
×
2446
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2447
    pTaskInfo->code = code;
×
2448
    T_LONG_JMP(pTaskInfo->env, code);
×
2449
  }
2450
  return NULL;
×
2451
}
2452
static SSDataBlock* sysTableScanUsage(SOperatorInfo* pOperator) {
112✔
2453
  int32_t            code = TSDB_CODE_SUCCESS;
112✔
2454
  int32_t            lino = 0;
112✔
2455
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
112✔
2456
  SSysTableScanInfo* pInfo = pOperator->info;
112✔
2457

2458
  SNode* pCondition = pInfo->pCondition;
112✔
2459
  if (pOperator->status == OP_EXEC_DONE) {
112✔
2460
    return NULL;
47✔
2461
  }
2462
  return sysTableBuildVgUsage(pOperator);
65✔
2463

2464
_end:
2465
  if (code != TSDB_CODE_SUCCESS) {
2466
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
2467
    pTaskInfo->code = code;
2468
    T_LONG_JMP(pTaskInfo->env, code);
2469
  }
2470
  return NULL;
2471
}
2472

2473
static SSDataBlock* sysTableScanUserSTables(SOperatorInfo* pOperator) {
×
2474
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
2475
  SSysTableScanInfo* pInfo = pOperator->info;
×
2476
  if (pOperator->status == OP_EXEC_DONE) {
×
2477
    return NULL;
×
2478
  }
2479

2480
  pInfo->pRes->info.rows = 0;
×
2481
  pOperator->status = OP_EXEC_DONE;
×
2482

2483
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
2484
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
2485
}
2486

2487
static int32_t doSetQueryFileSetRow() {
×
2488
  int32_t code = TSDB_CODE_SUCCESS;
×
2489
  int32_t lino = 0;
×
2490

2491
  // TODO
2492

2493
_exit:
×
2494
  return code;
×
2495
}
2496

2497
static SSDataBlock* sysTableBuildUserFileSets(SOperatorInfo* pOperator) {
1✔
2498
  int32_t            code = TSDB_CODE_SUCCESS;
1✔
2499
  int32_t            lino = 0;
1✔
2500
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
1✔
2501
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
1✔
2502
  SSysTableScanInfo* pInfo = pOperator->info;
1✔
2503
  SSDataBlock*       p = NULL;
1✔
2504

2505
  // open cursor if not opened
2506
  if (pInfo->pFileSetReader == NULL) {
1!
2507
    code = pAPI->tsdReader.fileSetReaderOpen(pInfo->readHandle.vnode, &pInfo->pFileSetReader);
1✔
2508
    QUERY_CHECK_CODE(code, lino, _end);
1!
2509
  }
2510

2511
  blockDataCleanup(pInfo->pRes);
1✔
2512
  int32_t numOfRows = 0;
1✔
2513

2514
  const char* db = NULL;
1✔
2515
  int32_t     vgId = 0;
1✔
2516
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
1✔
2517

2518
  SName sn = {0};
1✔
2519
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1✔
2520
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1✔
2521
  QUERY_CHECK_CODE(code, lino, _end);
1!
2522

2523
  code = tNameGetDbName(&sn, varDataVal(dbname));
1✔
2524
  QUERY_CHECK_CODE(code, lino, _end);
1!
2525

2526
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1✔
2527

2528
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_FILESETS);
1✔
2529
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
1!
2530

2531
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
1✔
2532
  QUERY_CHECK_CODE(code, lino, _end);
1!
2533

2534
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1✔
2535
  int32_t ret = 0;
1✔
2536

2537
  // loop to query each entry
2538
  for (;;) {
1✔
2539
    int32_t ret = pAPI->tsdReader.fileSetReadNext(pInfo->pFileSetReader);
2✔
2540
    if (ret) {
2✔
2541
      if (ret == TSDB_CODE_NOT_FOUND) {
1!
2542
        // no more scan entry
2543
        setOperatorCompleted(pOperator);
1✔
2544
        pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
1✔
2545
        break;
1✔
2546
      } else {
2547
        code = ret;
×
2548
        QUERY_CHECK_CODE(code, lino, _end);
×
2549
      }
2550
    }
2551

2552
    // fill the data block
2553
    {
2554
      SColumnInfoData* pColInfoData;
2555
      int32_t          index = 0;
1✔
2556

2557
      // db_name
2558
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2559
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2560
      code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
1✔
2561
      QUERY_CHECK_CODE(code, lino, _end);
1!
2562

2563
      // vgroup_id
2564
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2565
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2566
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
1✔
2567
      QUERY_CHECK_CODE(code, lino, _end);
1!
2568

2569
      // fileset_id
2570
      int32_t filesetId = 0;
1✔
2571
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "fileset_id", &filesetId);
1✔
2572
      QUERY_CHECK_CODE(code, lino, _end);
1!
2573
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2574
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2575
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&filesetId, false);
1✔
2576
      QUERY_CHECK_CODE(code, lino, _end);
1!
2577

2578
      // start_time
2579
      int64_t startTime = 0;
1✔
2580
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "start_time", &startTime);
1✔
2581
      QUERY_CHECK_CODE(code, lino, _end);
1!
2582
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2583
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2584
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&startTime, false);
1✔
2585
      QUERY_CHECK_CODE(code, lino, _end);
1!
2586

2587
      // end_time
2588
      int64_t endTime = 0;
1✔
2589
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "end_time", &endTime);
1✔
2590
      QUERY_CHECK_CODE(code, lino, _end);
1!
2591
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2592
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2593
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&endTime, false);
1✔
2594
      QUERY_CHECK_CODE(code, lino, _end);
1!
2595

2596
      // total_size
2597
      int64_t totalSize = 0;
1✔
2598
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "total_size", &totalSize);
1✔
2599
      QUERY_CHECK_CODE(code, lino, _end);
1!
2600
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2601
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2602
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&totalSize, false);
1✔
2603
      QUERY_CHECK_CODE(code, lino, _end);
1!
2604

2605
      // last_compact
2606
      int64_t lastCompact = 0;
1✔
2607
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "last_compact_time", &lastCompact);
1✔
2608
      QUERY_CHECK_CODE(code, lino, _end);
1!
2609
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2610
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2611
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&lastCompact, false);
1✔
2612
      QUERY_CHECK_CODE(code, lino, _end);
1!
2613

2614
      // should_compact
2615
      bool shouldCompact = false;
1✔
2616
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "should_compact", &shouldCompact);
1✔
2617
      QUERY_CHECK_CODE(code, lino, _end);
1!
2618
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
1✔
2619
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1!
2620
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&shouldCompact, false);
1✔
2621
      QUERY_CHECK_CODE(code, lino, _end);
1!
2622

2623
      // // details
2624
      // const char* details = NULL;
2625
      // code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "details", &details);
2626
      // QUERY_CHECK_CODE(code, lino, _end);
2627
      // pColInfoData = taosArrayGet(p->pDataBlock, index++);
2628
      // QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
2629
      // code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
2630
      // QUERY_CHECK_CODE(code, lino, _end);
2631
    }
2632

2633
    // check capacity
2634
    if (++numOfRows >= pOperator->resultInfo.capacity) {
1!
2635
      p->info.rows = numOfRows;
×
2636
      pInfo->pRes->info.rows = numOfRows;
×
2637

2638
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
2639
      QUERY_CHECK_CODE(code, lino, _end);
×
2640

2641
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
2642
      QUERY_CHECK_CODE(code, lino, _end);
×
2643

2644
      blockDataCleanup(p);
×
2645
      numOfRows = 0;
×
2646

2647
      if (pInfo->pRes->info.rows > 0) {
×
2648
        break;
×
2649
      }
2650
    }
2651
  }
2652

2653
  if (numOfRows > 0) {
1!
2654
    p->info.rows = numOfRows;
1✔
2655
    pInfo->pRes->info.rows = numOfRows;
1✔
2656

2657
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
1✔
2658
    QUERY_CHECK_CODE(code, lino, _end);
1!
2659

2660
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
1✔
2661
    QUERY_CHECK_CODE(code, lino, _end);
1!
2662

2663
    blockDataCleanup(p);
1✔
2664
    numOfRows = 0;
1✔
2665
  }
2666

2667
  blockDataDestroy(p);
1✔
2668
  p = NULL;
1✔
2669

2670
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
1✔
2671

2672
_end:
1✔
2673
  if (code != TSDB_CODE_SUCCESS) {
1!
2674
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2675
    blockDataDestroy(p);
×
2676
    pTaskInfo->code = code;
×
2677
    pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
×
2678
    T_LONG_JMP(pTaskInfo->env, code);
×
2679
  }
2680
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
1!
2681
}
2682

2683
static SSDataBlock* sysTableScanUserFileSets(SOperatorInfo* pOperator) {
3✔
2684
  int32_t            code = TSDB_CODE_SUCCESS;
3✔
2685
  int32_t            lino = 0;
3✔
2686
  SSysTableScanInfo* pInfo = pOperator->info;
3✔
2687
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
3✔
2688
  SNode*             pCondition = pInfo->pCondition;
3✔
2689

2690
  if (pOperator->status == OP_EXEC_DONE) {
3✔
2691
    return NULL;
1✔
2692
  }
2693

2694
  if (pInfo->readHandle.mnd != NULL) {
2✔
2695
    // do nothing on mnode
2696
    qTrace("This operator do nothing on mnode, task id:%s", GET_TASKID(pTaskInfo));
1!
2697
    return NULL;
1✔
2698
  } else {
2699
#if 0
2700
    if (pInfo->showRewrite == false) {
2701
      if (pCondition != NULL && pInfo->pIdx == NULL) {
2702
        SSTabFltArg arg = {
2703
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
2704

2705
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
2706
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
2707
        idx->init = 0;
2708
        idx->uids = taosArrayInit(128, sizeof(int64_t));
2709
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
2710
        idx->lastIdx = 0;
2711

2712
        pInfo->pIdx = idx;  // set idx arg
2713

2714
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
2715
        if (flt == 0) {
2716
          pInfo->pIdx->init = 1;
2717
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
2718
          return blk;
2719
        } else if ((flt == -1) || (flt == -2)) {
2720
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
2721
        }
2722
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
2723
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
2724
        return blk;
2725
      }
2726
    }
2727
#endif
2728

2729
    return sysTableBuildUserFileSets(pOperator);
1✔
2730
  }
2731

2732
_end:
2733
  if (code != TSDB_CODE_SUCCESS) {
2734
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
2735
    pTaskInfo->code = code;
2736
    T_LONG_JMP(pTaskInfo->env, code);
2737
  }
2738
  return NULL;
2739
}
2740

2741
static int32_t getSysTableDbNameColId(const char* pTable) {
30,301✔
2742
  // if (0 == strcmp(TSDB_INS_TABLE_INDEXES, pTable)) {
2743
  //   return 1;
2744
  // }
2745
  return TSDB_INS_USER_STABLES_DBNAME_COLID;
30,301✔
2746
}
2747

2748
static EDealRes getDBNameFromConditionWalker(SNode* pNode, void* pContext) {
142,599✔
2749
  int32_t   code = TSDB_CODE_SUCCESS;
142,599✔
2750
  ENodeType nType = nodeType(pNode);
142,599✔
2751

2752
  switch (nType) {
142,599✔
2753
    case QUERY_NODE_OPERATOR: {
57,346✔
2754
      SOperatorNode* node = (SOperatorNode*)pNode;
57,346✔
2755
      if (OP_TYPE_EQUAL == node->opType) {
57,346✔
2756
        *(int32_t*)pContext = 1;
30,338✔
2757
        return DEAL_RES_CONTINUE;
30,338✔
2758
      }
2759

2760
      *(int32_t*)pContext = 0;
27,008✔
2761
      return DEAL_RES_IGNORE_CHILD;
27,008✔
2762
    }
2763
    case QUERY_NODE_COLUMN: {
30,328✔
2764
      if (1 != *(int32_t*)pContext) {
30,328!
2765
        return DEAL_RES_CONTINUE;
×
2766
      }
2767

2768
      SColumnNode* node = (SColumnNode*)pNode;
30,328✔
2769
      if (getSysTableDbNameColId(node->tableName) == node->colId) {
30,328✔
2770
        *(int32_t*)pContext = 2;
28,271✔
2771
        return DEAL_RES_CONTINUE;
28,271✔
2772
      }
2773

2774
      *(int32_t*)pContext = 0;
2,045✔
2775
      return DEAL_RES_CONTINUE;
2,045✔
2776
    }
2777
    case QUERY_NODE_VALUE: {
30,322✔
2778
      if (2 != *(int32_t*)pContext) {
30,322✔
2779
        return DEAL_RES_CONTINUE;
2,046✔
2780
      }
2781

2782
      SValueNode* node = (SValueNode*)pNode;
28,276✔
2783
      char*       dbName = nodesGetValueFromNode(node);
28,276✔
2784
      tstrncpy((char*)pContext, varDataVal(dbName), TSDB_DB_NAME_LEN);
28,250✔
2785
      return DEAL_RES_END;  // stop walk
28,250✔
2786
    }
2787
    default:
24,603✔
2788
      break;
24,603✔
2789
  }
2790
  return DEAL_RES_CONTINUE;
24,603✔
2791
}
2792

2793
static void getDBNameFromCondition(SNode* pCondition, const char* dbName) {
848,752✔
2794
  if (NULL == pCondition) {
848,752✔
2795
    return;
791,565✔
2796
  }
2797
  nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName);
57,187✔
2798
}
2799

2800
static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
2,557,969✔
2801
  // build message and send to mnode to fetch the content of system tables.
2802
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
2,557,969✔
2803
  SSysTableScanInfo* pInfo = pOperator->info;
2,557,969✔
2804
  char               dbName[TSDB_DB_NAME_LEN] = {0};
2,557,969✔
2805

2806
  while (1) {
2✔
2807
    if (isTaskKilled(pOperator->pTaskInfo)) {
2,557,971✔
2808
      setOperatorCompleted(pOperator);
24✔
2809
      (*ppRes) = NULL;
24✔
2810
      break;
24✔
2811
    }
2812

2813
    blockDataCleanup(pInfo->pRes);
2,558,936✔
2814

2815
    const char* name = tNameGetTableName(&pInfo->name);
2,560,662✔
2816
    if (pInfo->showRewrite) {
2,561,041✔
2817
      getDBNameFromCondition(pInfo->pCondition, dbName);
33,676✔
2818
      if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
33,650✔
2819
          strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
33,505!
2820
          strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
33,516✔
2821
        TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
33,515✔
2822
      }
2823
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
2,527,365✔
2824
      getDBNameFromCondition(pInfo->pCondition, dbName);
815,248✔
2825
      if (dbName[0]) TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
815,369✔
2826
      (void)sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
815,369✔
2827
    }
2828
    bool         filter = true;
2,559,559✔
2829
    SSDataBlock* pBlock = NULL;
2,559,559✔
2830
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
2,559,559✔
2831
      pBlock = sysTableScanUserTables(pOperator);
820,050✔
2832
    } else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
1,739,509✔
2833
      pBlock = sysTableScanUserTags(pOperator);
467,822✔
2834
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
1,271,687✔
2835
      pBlock = sysTableScanUserCols(pOperator);
794,729✔
2836
    } else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
476,958✔
2837
               IS_SYS_DBNAME(dbName)) {
1,875!
2838
      pBlock = sysTableScanUserSTables(pOperator);
×
2839
    } else if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
477,845✔
2840
      pBlock = sysTableScanUsage(pOperator);
112✔
2841
    } else if (strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
477,733✔
2842
      pBlock = sysTableScanUserFileSets(pOperator);
3✔
2843
    } else {  // load the meta from mnode of the given epset
2844
      pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
477,730✔
2845
    }
2846

2847
    if (!pInfo->skipFilterTable) sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
2,562,017!
2848
    if (pBlock != NULL) {
2,562,118✔
2849
      bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
1,163,705✔
2850
      if (limitReached) {
1,163,735✔
2851
        setOperatorCompleted(pOperator);
80✔
2852
      }
2853

2854
      if (pBlock->info.rows == 0) {
1,163,677✔
2855
        continue;
2✔
2856
      }
2857
      (*ppRes) = pBlock;
1,163,675✔
2858
    } else {
2859
      (*ppRes) = NULL;
1,398,413✔
2860
    }
2861
    break;
2,562,088✔
2862
  }
2863

2864
_end:
2,562,112✔
2865
  if (pTaskInfo->code) {
2,562,112✔
2866
    qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code));
28,930!
2867
    T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
28,937!
2868
  }
2869
  return pTaskInfo->code;
2,533,182✔
2870
}
2871

2872
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
2,561,938✔
2873
                                   SSDataBlock* pBlock) {
2874
  int32_t        code = TSDB_CODE_SUCCESS;
2,561,938✔
2875
  int32_t        lino = 0;
2,561,938✔
2876
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
2,561,938✔
2877
  if (pBlock == NULL) {
2,561,938✔
2878
    return;
1,398,458✔
2879
  }
2880

2881
  if (pInfo->tbnameSlotId != -1) {
1,163,480✔
2882
    SColumnInfoData* pColumnInfoData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, pInfo->tbnameSlotId);
32✔
2883
    QUERY_CHECK_NULL(pColumnInfoData, code, lino, _end, terrno);
32!
2884
    char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
32✔
2885
    STR_TO_VARSTR(varTbName, name);
32✔
2886

2887
    code = colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, true);
32✔
2888
    QUERY_CHECK_CODE(code, lino, _end);
32!
2889
  }
2890

2891
  code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
1,163,480✔
2892
  QUERY_CHECK_CODE(code, lino, _end);
1,163,733!
2893

2894
_end:
1,163,733✔
2895
  if (code != TSDB_CODE_SUCCESS) {
1,163,733!
2896
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2897
    pTaskInfo->code = code;
×
2898
    T_LONG_JMP(pTaskInfo->env, code);
×
2899
  }
2900
}
2901

2902
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
477,650✔
2903
                                          SExecTaskInfo* pTaskInfo) {
2904
  int32_t code = TSDB_CODE_SUCCESS;
477,650✔
2905
  int32_t lino = 0;
477,650✔
2906
  if (pOperator->status == OP_EXEC_DONE) {
477,650✔
2907
    return NULL;
230,304✔
2908
  }
2909

2910
  while (1) {
25✔
2911
    int64_t startTs = taosGetTimestampUs();
247,700✔
2912
    tstrncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
247,700✔
2913
    tstrncpy(pInfo->req.user, pInfo->pUser, tListLen(pInfo->req.user));
247,789✔
2914

2915
    int32_t contLen = tSerializeSRetrieveTableReq(NULL, 0, &pInfo->req);
247,789✔
2916
    char*   buf1 = taosMemoryCalloc(1, contLen);
246,926!
2917
    if (!buf1) {
247,646!
2918
      return NULL;
247,981✔
2919
    }
2920
    int32_t tempRes = tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req);
247,646✔
2921
    if (tempRes < 0) {
247,479!
2922
      code = terrno;
×
2923
      taosMemoryFree(buf1);
×
2924
      return NULL;
×
2925
    }
2926

2927
    // send the fetch remote task result reques
2928
    SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
247,479!
2929
    if (NULL == pMsgSendInfo) {
247,318!
2930
      qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
×
2931
      pTaskInfo->code = terrno;
×
2932
      taosMemoryFree(buf1);
×
2933
      return NULL;
×
2934
    }
2935

2936
    int32_t msgType = (strcasecmp(name, TSDB_INS_TABLE_DNODE_VARIABLES) == 0) ? TDMT_DND_SYSTABLE_RETRIEVE
494,636✔
2937
                                                                              : TDMT_MND_SYSTABLE_RETRIEVE;
247,318✔
2938

2939
    pMsgSendInfo->param = pOperator;
247,318✔
2940
    pMsgSendInfo->msgInfo.pData = buf1;
247,318✔
2941
    pMsgSendInfo->msgInfo.len = contLen;
247,318✔
2942
    pMsgSendInfo->msgType = msgType;
247,318✔
2943
    pMsgSendInfo->fp = loadSysTableCallback;
247,318✔
2944
    pMsgSendInfo->requestId = pTaskInfo->id.queryId;
247,318✔
2945

2946
    code = asyncSendMsgToServer(pInfo->readHandle.pMsgCb->clientRpc, &pInfo->epSet, NULL, pMsgSendInfo);
247,318✔
2947
    if (code != TSDB_CODE_SUCCESS) {
247,905!
2948
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2949
      pTaskInfo->code = code;
×
2950
      T_LONG_JMP(pTaskInfo->env, code);
×
2951
    }
2952

2953
    code = tsem_wait(&pInfo->ready);
247,905✔
2954
    if (code != TSDB_CODE_SUCCESS) {
248,018✔
2955
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
26!
2956
      pTaskInfo->code = code;
26✔
2957
      T_LONG_JMP(pTaskInfo->env, code);
26!
2958
    }
2959

2960
    if (pTaskInfo->code) {
247,992✔
2961
      qError("%s load meta data from mnode failed, totalRows:%" PRIu64 ", code:%s", GET_TASKID(pTaskInfo),
429!
2962
             pInfo->loadInfo.totalRows, tstrerror(pTaskInfo->code));
2963
      return NULL;
429✔
2964
    }
2965

2966
    SRetrieveMetaTableRsp* pRsp = pInfo->pRsp;
247,563✔
2967
    pInfo->req.showId = pRsp->handle;
247,563✔
2968

2969
    if (pRsp->numOfRows == 0 || pRsp->completed) {
247,563✔
2970
      pOperator->status = OP_EXEC_DONE;
238,129✔
2971
      qDebug("%s load meta data from mnode completed, rowsOfSource:%d, totalRows:%" PRIu64, GET_TASKID(pTaskInfo),
238,129✔
2972
             pRsp->numOfRows, pInfo->loadInfo.totalRows);
2973

2974
      if (pRsp->numOfRows == 0) {
238,129✔
2975
        taosMemoryFree(pRsp);
48,813!
2976
        return NULL;
48,812✔
2977
      }
2978
    }
2979

2980
    char* pStart = pRsp->data;
198,750✔
2981
    code = extractDataBlockFromFetchRsp(pInfo->pRes, pRsp->data, pInfo->matchInfo.pList, &pStart);
198,750✔
2982
    if (code != TSDB_CODE_SUCCESS) {
198,752!
2983
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2984
      pTaskInfo->code = code;
×
2985
      taosMemoryFreeClear(pRsp);
×
2986
      T_LONG_JMP(pTaskInfo->env, code);
×
2987
    }
2988
    updateLoadRemoteInfo(&pInfo->loadInfo, pRsp->numOfRows, pRsp->compLen, startTs, pOperator);
198,752✔
2989

2990
    // todo log the filter info
2991
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
198,735✔
2992
    if (code != TSDB_CODE_SUCCESS) {
198,698!
2993
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
2994
      pTaskInfo->code = code;
×
2995
      taosMemoryFreeClear(pRsp);
×
2996
      T_LONG_JMP(pTaskInfo->env, code);
×
2997
    }
2998
    taosMemoryFree(pRsp);
198,698!
2999
    if (pInfo->pRes->info.rows > 0) {
198,765✔
3000
      return pInfo->pRes;
191,572✔
3001
    } else if (pOperator->status == OP_EXEC_DONE) {
7,193✔
3002
      return NULL;
7,168✔
3003
    }
3004
  }
3005
}
3006

3007
int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, const char* pUser,
1,298,047✔
3008
                                       SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) {
3009
  QRY_PARAM_CHECK(pOptrInfo);
1,298,047!
3010

3011
  int32_t            code = TSDB_CODE_SUCCESS;
1,298,047✔
3012
  int32_t            lino = 0;
1,298,047✔
3013
  SSysTableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SSysTableScanInfo));
1,298,047!
3014
  SOperatorInfo*     pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
1,299,242!
3015
  if (pInfo == NULL || pOperator == NULL) {
1,299,357!
3016
    code = terrno;
×
3017
    lino = __LINE__;
×
3018
    goto _error;
×
3019
  }
3020

3021
  SScanPhysiNode*     pScanNode = &pScanPhyNode->scan;
1,299,422✔
3022
  SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
1,299,422✔
3023
  QUERY_CHECK_CODE(code, lino, _error);
1,299,422!
3024

3025
  int32_t num = 0;
1,299,422✔
3026
  code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &num, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
1,299,422✔
3027
  QUERY_CHECK_CODE(code, lino, _error);
1,295,944!
3028

3029
  extractTbnameSlotId(pInfo, pScanNode);
1,295,944✔
3030

3031
  pInfo->pAPI = &pTaskInfo->storageAPI;
1,296,045✔
3032

3033
  pInfo->accountId = pScanPhyNode->accountId;
1,296,045✔
3034
  pInfo->pUser = taosStrdup((void*)pUser);
1,296,045!
3035
  QUERY_CHECK_NULL(pInfo->pUser, code, lino, _error, terrno);
1,298,496!
3036
  pInfo->sysInfo = pScanPhyNode->sysInfo;
1,298,496✔
3037
  pInfo->showRewrite = pScanPhyNode->showRewrite;
1,298,496✔
3038
  pInfo->pRes = createDataBlockFromDescNode(pDescNode);
1,298,496✔
3039
  QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno);
1,299,386!
3040

3041
  pInfo->pCondition = pScanNode->node.pConditions;
1,299,386✔
3042

3043
  tNameAssign(&pInfo->name, &pScanNode->tableName);
1,299,386✔
3044
  const char* name = tNameGetTableName(&pInfo->name);
1,298,822✔
3045
  if (pInfo->showRewrite == false) {
1,299,610✔
3046
    code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
1,281,895✔
3047
  } else {
3048
    if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
17,715✔
3049
      pInfo->skipFilterTable = true;
6✔
3050
      code = filterInitFromNode(NULL, &pOperator->exprSupp.pFilterInfo, 0);
6✔
3051
    } else {
3052
      code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
17,709✔
3053
    }
3054
  }
3055
  QUERY_CHECK_CODE(code, lino, _error);
1,298,921!
3056

3057
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
1,298,921✔
3058
  initResultSizeInfo(&pOperator->resultInfo, 4096);
1,299,642✔
3059
  code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
1,298,169✔
3060
  QUERY_CHECK_CODE(code, lino, _error);
1,299,999!
3061

3062
  if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
1,299,999✔
3063
      strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
881,518✔
3064
      strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
645,455✔
3065
    pInfo->readHandle = *(SReadHandle*)readHandle;
654,600✔
3066
  } else {
3067
    if (tsem_init(&pInfo->ready, 0, 0) != TSDB_CODE_SUCCESS) {
645,399!
3068
      code = TSDB_CODE_FAILED;
×
3069
      goto _error;
×
3070
    }
3071
    pInfo->epSet = pScanPhyNode->mgmtEpSet;
645,283✔
3072
    pInfo->readHandle = *(SReadHandle*)readHandle;
645,283✔
3073
  }
3074

3075
  setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
1,299,883✔
3076
                  pInfo, pTaskInfo);
3077
  pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
1,299,597✔
3078
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doSysTableScanNext, NULL, destroySysScanOperator,
1,298,662✔
3079
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
3080
  *pOptrInfo = pOperator;
1,298,608✔
3081
  return code;
1,298,608✔
3082

3083
_error:
×
3084
  if (pInfo != NULL) {
×
3085
    destroySysScanOperator(pInfo);
×
3086
  }
3087
  if (code != TSDB_CODE_SUCCESS) {
×
3088
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3089
  }
3090
  if (pOperator != NULL) {
×
3091
    pOperator->info = NULL;
×
3092
    destroyOperator(pOperator);
×
3093
  }
3094
  pTaskInfo->code = code;
×
3095
  return code;
×
3096
}
3097

3098
void extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode) {
1,295,583✔
3099
  pInfo->tbnameSlotId = -1;
1,295,583✔
3100
  if (pScanNode->pScanPseudoCols != NULL) {
1,295,583✔
3101
    SNode* pNode = NULL;
40✔
3102
    FOREACH(pNode, pScanNode->pScanPseudoCols) {
80!
3103
      STargetNode* pTargetNode = NULL;
40✔
3104
      if (nodeType(pNode) == QUERY_NODE_TARGET) {
40!
3105
        pTargetNode = (STargetNode*)pNode;
40✔
3106
        SNode* expr = pTargetNode->pExpr;
40✔
3107
        if (nodeType(expr) == QUERY_NODE_FUNCTION) {
40!
3108
          SFunctionNode* pFuncNode = (SFunctionNode*)expr;
40✔
3109
          if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) {
40✔
3110
            pInfo->tbnameSlotId = pTargetNode->slotId;
34✔
3111
          }
3112
        }
3113
      }
3114
    }
3115
  }
3116
}
1,295,583✔
3117

3118
void destroySysScanOperator(void* param) {
1,299,392✔
3119
  SSysTableScanInfo* pInfo = (SSysTableScanInfo*)param;
1,299,392✔
3120
  int32_t            code = tsem_destroy(&pInfo->ready);
1,299,392✔
3121
  if (code != TSDB_CODE_SUCCESS) {
1,299,963!
3122
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3123
  }
3124
  blockDataDestroy(pInfo->pRes);
1,299,963✔
3125

3126
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
1,300,426!
3127
    const char* name = tNameGetTableName(&pInfo->name);
1,300,471✔
3128
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
1,300,480✔
3129
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
881,988✔
3130
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 || pInfo->pCur != NULL) {
645,666!
3131
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
1,076,090!
3132
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
1,054,226✔
3133
      }
3134

3135
      pInfo->pCur = NULL;
1,075,901✔
3136
    }
3137
  } else {
3138
    qError("pInfo->name is not initialized");
×
3139
  }
3140

3141
  if (pInfo->pIdx) {
1,300,246✔
3142
    taosArrayDestroy(pInfo->pIdx->uids);
3,159✔
3143
    taosMemoryFree(pInfo->pIdx);
3,158!
3144
    pInfo->pIdx = NULL;
3,159✔
3145
  }
3146

3147
  if (pInfo->pSchema) {
1,300,246✔
3148
    taosHashCleanup(pInfo->pSchema);
406,998✔
3149
    pInfo->pSchema = NULL;
407,125✔
3150
  }
3151

3152
  taosArrayDestroy(pInfo->matchInfo.pList);
1,300,373✔
3153
  taosMemoryFreeClear(pInfo->pUser);
1,300,166!
3154

3155
  taosMemoryFreeClear(param);
1,300,165!
3156
}
1,300,423✔
3157

3158
int32_t loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code) {
247,948✔
3159
  SOperatorInfo*     operator=(SOperatorInfo*) param;
247,948✔
3160
  SSysTableScanInfo* pScanResInfo = (SSysTableScanInfo*)operator->info;
247,948✔
3161
  if (TSDB_CODE_SUCCESS == code) {
247,948!
3162
    pScanResInfo->pRsp = pMsg->pData;
248,002✔
3163

3164
    SRetrieveMetaTableRsp* pRsp = pScanResInfo->pRsp;
248,002✔
3165
    pRsp->numOfRows = htonl(pRsp->numOfRows);
248,002✔
3166
    pRsp->useconds = htobe64(pRsp->useconds);
248,002✔
3167
    pRsp->handle = htobe64(pRsp->handle);
247,816✔
3168
    pRsp->compLen = htonl(pRsp->compLen);
247,854✔
3169
  } else {
UNCOV
3170
    operator->pTaskInfo->code = rpcCvtErrCode(code);
×
3171
    if (operator->pTaskInfo->code != code) {
11!
3172
      qError("load systable rsp received, error:%s, cvted error:%s", tstrerror(code),
×
3173
             tstrerror(operator->pTaskInfo->code));
3174
    } else {
3175
      qError("load systable rsp received, error:%s", tstrerror(code));
11!
3176
    }
3177
  }
3178

3179
  int32_t res = tsem_post(&pScanResInfo->ready);
247,865✔
3180
  if (res != TSDB_CODE_SUCCESS) {
248,003!
3181
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(res));
×
3182
  }
3183
  return TSDB_CODE_SUCCESS;
247,979✔
3184
}
3185

3186
static int32_t sysChkFilter__Comm(SNode* pNode) {
1,527✔
3187
  // impl
3188
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,527✔
3189
  EOperatorType  opType = pOper->opType;
1,527✔
3190
  if (opType != OP_TYPE_EQUAL && opType != OP_TYPE_LOWER_EQUAL && opType != OP_TYPE_LOWER_THAN &&
1,527!
3191
      opType != OP_TYPE_GREATER_EQUAL && opType != OP_TYPE_GREATER_THAN) {
4!
3192
    return -1;
×
3193
  }
3194
  return 0;
1,527✔
3195
}
3196

3197
static int32_t sysChkFilter__DBName(SNode* pNode) {
1,514✔
3198
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,514✔
3199

3200
  if (pOper->opType != OP_TYPE_EQUAL && pOper->opType != OP_TYPE_NOT_EQUAL) {
1,514!
3201
    return -1;
×
3202
  }
3203

3204
  SValueNode* pVal = (SValueNode*)pOper->pRight;
1,514✔
3205
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
1,514!
3206
    return -1;
×
3207
  }
3208

3209
  return 0;
1,514✔
3210
}
3211
static int32_t sysChkFilter__VgroupId(SNode* pNode) {
×
3212
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3213
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3214
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3215
    return -1;
×
3216
  }
3217
  return sysChkFilter__Comm(pNode);
×
3218
}
3219
static int32_t sysChkFilter__TableName(SNode* pNode) {
897✔
3220
  SOperatorNode* pOper = (SOperatorNode*)pNode;
897✔
3221
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
897✔
3222
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
897!
3223
    return -1;
×
3224
  }
3225
  return sysChkFilter__Comm(pNode);
897✔
3226
}
3227
static int32_t sysChkFilter__CreateTime(SNode* pNode) {
11✔
3228
  SOperatorNode* pOper = (SOperatorNode*)pNode;
11✔
3229
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
11✔
3230

3231
  if (!IS_TIMESTAMP_TYPE(pVal->node.resType.type)) {
11!
3232
    return -1;
×
3233
  }
3234
  return sysChkFilter__Comm(pNode);
11✔
3235
}
3236

3237
static int32_t sysChkFilter__Ncolumn(SNode* pNode) {
×
3238
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3239
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3240

3241
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3242
    return -1;
×
3243
  }
3244
  return sysChkFilter__Comm(pNode);
×
3245
}
3246
static int32_t sysChkFilter__Ttl(SNode* pNode) {
×
3247
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3248
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3249

3250
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3251
    return -1;
×
3252
  }
3253
  return sysChkFilter__Comm(pNode);
×
3254
}
3255
static int32_t sysChkFilter__STableName(SNode* pNode) {
619✔
3256
  SOperatorNode* pOper = (SOperatorNode*)pNode;
619✔
3257
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
619✔
3258
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
619!
3259
    return -1;
×
3260
  }
3261
  return sysChkFilter__Comm(pNode);
619✔
3262
}
3263
static int32_t sysChkFilter__Uid(SNode* pNode) {
×
3264
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3265
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3266
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3267
    return -1;
×
3268
  }
3269
  return sysChkFilter__Comm(pNode);
×
3270
}
3271
static int32_t sysChkFilter__Type(SNode* pNode) {
43✔
3272
  SOperatorNode* pOper = (SOperatorNode*)pNode;
43✔
3273
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
43✔
3274
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
43!
3275
    return -1;
42✔
3276
  }
3277
  return sysChkFilter__Comm(pNode);
1✔
3278
}
3279
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result) {
4,597✔
3280
  if (optSysCheckOper(cond) != 0) return -1;
4,597✔
3281

3282
  SOperatorNode* pNode = (SOperatorNode*)cond;
3,091✔
3283

3284
  int8_t i = 0;
3,091✔
3285
  for (; i < SYSTAB_FILTER_DICT_SIZE; i++) {
8,070!
3286
    if (strcmp(filterDict[i].name, ((SColumnNode*)(pNode->pLeft))->colName) == 0) {
8,071✔
3287
      break;
3,092✔
3288
    }
3289
  }
3290
  if (i >= SYSTAB_FILTER_DICT_SIZE) return -1;
3,091!
3291

3292
  if (filterDict[i].chkFunc(cond) != 0) return -1;
3,091✔
3293

3294
  return filterDict[i].fltFunc(arg, cond, result);
3,040✔
3295
}
3296

3297
static int32_t optSysCheckOper(SNode* pOpear) {
4,596✔
3298
  if (nodeType(pOpear) != QUERY_NODE_OPERATOR) return -1;
4,596!
3299

3300
  SOperatorNode* pOper = (SOperatorNode*)pOpear;
4,596✔
3301
  if (pOper->opType < OP_TYPE_GREATER_THAN || pOper->opType > OP_TYPE_NOT_EQUAL) {
4,596!
3302
    return -1;
1,507✔
3303
  }
3304

3305
  if (nodeType(pOper->pLeft) != QUERY_NODE_COLUMN || nodeType(pOper->pRight) != QUERY_NODE_VALUE) {
3,089!
3306
    return -1;
×
3307
  }
3308
  return 0;
3,091✔
3309
}
3310

3311
static FORCE_INLINE int optSysBinarySearch(SArray* arr, int s, int e, uint64_t k) {
3312
  uint64_t v;
3313
  int32_t  m;
3314
  while (s <= e) {
×
3315
    m = s + (e - s) / 2;
×
3316
    v = *(uint64_t*)taosArrayGet(arr, m);
×
3317
    if (v >= k) {
×
3318
      e = m - 1;
×
3319
    } else {
3320
      s = m + 1;
×
3321
    }
3322
  }
3323
  return s;
×
3324
}
3325

3326
int32_t optSysIntersection(SArray* in, SArray* out) {
1,134✔
3327
  int32_t     code = TSDB_CODE_SUCCESS;
1,134✔
3328
  int32_t     lino = 0;
1,134✔
3329
  MergeIndex* mi = NULL;
1,134✔
3330
  int32_t     sz = (int32_t)taosArrayGetSize(in);
1,134✔
3331
  if (sz <= 0) {
1,134✔
3332
    goto _end;
1,124✔
3333
  }
3334
  mi = taosMemoryCalloc(sz, sizeof(MergeIndex));
10!
3335
  QUERY_CHECK_NULL(mi, code, lino, _end, terrno);
12!
3336
  for (int i = 0; i < sz; i++) {
24✔
3337
    SArray* t = taosArrayGetP(in, i);
12✔
3338
    mi[i].len = (int32_t)taosArrayGetSize(t);
12✔
3339
    mi[i].idx = 0;
12✔
3340
  }
3341

3342
  SArray* base = taosArrayGetP(in, 0);
12✔
3343
  for (int i = 0; i < taosArrayGetSize(base); i++) {
61,943!
3344
    uint64_t tgt = *(uint64_t*)taosArrayGet(base, i);
61,962✔
3345
    bool     has = true;
62,034✔
3346
    for (int j = 1; j < taosArrayGetSize(in); j++) {
62,034!
3347
      SArray* oth = taosArrayGetP(in, j);
×
3348
      int     mid = optSysBinarySearch(oth, mi[j].idx, mi[j].len - 1, tgt);
×
3349
      if (mid >= 0 && mid < mi[j].len) {
×
3350
        uint64_t val = *(uint64_t*)taosArrayGet(oth, mid);
×
3351
        has = (val == tgt ? true : false);
×
3352
        mi[j].idx = mid;
×
3353
      } else {
3354
        has = false;
×
3355
      }
3356
    }
3357
    if (has == true) {
62,280✔
3358
      void* tmp = taosArrayPush(out, &tgt);
61,604✔
3359
      if (!tmp) {
61,604!
3360
        code = terrno;
×
3361
        goto _end;
×
3362
      }
3363
    }
3364
  }
3365

3366
_end:
×
3367
  taosMemoryFreeClear(mi);
1,096!
3368
  if (code != TSDB_CODE_SUCCESS) {
1,096!
3369
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3370
  }
3371
  return code;
1,133✔
3372
}
3373

3374
static int tableUidCompare(const void* a, const void* b) {
355,342✔
3375
  int64_t u1 = *(int64_t*)a;
355,342✔
3376
  int64_t u2 = *(int64_t*)b;
355,342✔
3377
  if (u1 == u2) {
355,342!
3378
    return 0;
×
3379
  }
3380
  return u1 < u2 ? -1 : 1;
355,342✔
3381
}
3382

3383
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt) {
1,134✔
3384
  // TODO, find comm mem from mRslt
3385
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
1,146✔
3386
    SArray* arslt = taosArrayGetP(mRslt, i);
12✔
3387
    taosArraySort(arslt, tableUidCompare);
12✔
3388
  }
3389
  return optSysIntersection(mRslt, rslt);
1,134✔
3390
}
3391

3392
static int32_t optSysSpecialColumn(SNode* cond) {
1,144✔
3393
  SOperatorNode* pOper = (SOperatorNode*)cond;
1,144✔
3394
  SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
1,144✔
3395
  for (int i = 0; i < sizeof(SYSTABLE_SPECIAL_COL) / sizeof(SYSTABLE_SPECIAL_COL[0]); i++) {
1,168✔
3396
    if (0 == strcmp(pCol->colName, SYSTABLE_SPECIAL_COL[i])) {
1,156✔
3397
      return 1;
1,132✔
3398
    }
3399
  }
3400
  return 0;
12✔
3401
}
3402

3403
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result) {
3,137✔
3404
  int ret = TSDB_CODE_FAILED;
3,137✔
3405
  if (nodeType(cond) == QUERY_NODE_OPERATOR) {
3,137✔
3406
    ret = optSysTabFilteImpl(arg, cond, result);
1,712✔
3407
    if (ret == 0) {
1,707✔
3408
      SOperatorNode* pOper = (SOperatorNode*)cond;
368✔
3409
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
368✔
3410
      if (0 == strcmp(pCol->colName, "create_time")) {
368!
3411
        return 0;
×
3412
      }
3413
      return -1;
368✔
3414
    }
3415
    return ret;
1,339✔
3416
  }
3417

3418
  if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) {
1,425!
3419
    return ret;
×
3420
  }
3421

3422
  SLogicConditionNode* pNode = (SLogicConditionNode*)cond;
1,444✔
3423
  SNodeList*           pList = (SNodeList*)pNode->pParameterList;
1,444✔
3424

3425
  int32_t len = LIST_LENGTH(pList);
1,444!
3426

3427
  bool    hasIdx = false;
1,444✔
3428
  bool    hasRslt = true;
1,444✔
3429
  SArray* mRslt = taosArrayInit(len, POINTER_BYTES);
1,444✔
3430
  if (!mRslt) {
1,444✔
3431
    return terrno;
1✔
3432
  }
3433

3434
  SListCell* cell = pList->pHead;
1,443✔
3435
  for (int i = 0; i < len; i++) {
4,327✔
3436
    if (cell == NULL) break;
2,882!
3437

3438
    SArray* aRslt = taosArrayInit(16, sizeof(int64_t));
2,882✔
3439
    if (!aRslt) {
2,887!
3440
      return terrno;
×
3441
    }
3442

3443
    ret = optSysTabFilteImpl(arg, cell->pNode, aRslt);
2,887✔
3444
    if (ret == 0) {
2,882✔
3445
      // has index
3446
      hasIdx = true;
1,145✔
3447
      if (optSysSpecialColumn(cell->pNode) == 0) {
1,145✔
3448
        void* tmp = taosArrayPush(mRslt, &aRslt);
12✔
3449
        if (!tmp) {
12!
3450
          return TSDB_CODE_FAILED;
×
3451
        }
3452
      } else {
3453
        // db_name/vgroup not result
3454
        taosArrayDestroy(aRslt);
1,134✔
3455
      }
3456
    } else if (ret == -2) {
1,737!
3457
      // current vg
3458
      hasIdx = true;
×
3459
      hasRslt = false;
×
3460
      taosArrayDestroy(aRslt);
×
3461
      break;
×
3462
    } else {
3463
      taosArrayDestroy(aRslt);
1,737✔
3464
    }
3465
    cell = cell->pNext;
2,884✔
3466
  }
3467
  if (hasRslt && hasIdx) {
1,445✔
3468
    int32_t code = optSysMergeRslt(mRslt, result);
1,138✔
3469
    if (code != TSDB_CODE_SUCCESS) {
1,134!
3470
      return code;
×
3471
    }
3472
  }
3473

3474
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
1,453✔
3475
    SArray* aRslt = taosArrayGetP(mRslt, i);
12✔
3476
    taosArrayDestroy(aRslt);
12✔
3477
  }
3478
  taosArrayDestroy(mRslt);
1,440✔
3479
  if (hasRslt == false) {
1,443!
3480
    return -2;
×
3481
  }
3482
  if (hasRslt && hasIdx) {
1,443!
3483
    cell = pList->pHead;
1,137✔
3484
    for (int i = 0; i < len; i++) {
3,397✔
3485
      if (cell == NULL) break;
2,272!
3486
      SOperatorNode* pOper = (SOperatorNode*)cell->pNode;
2,272✔
3487
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
2,272✔
3488
      if (0 == strcmp(pCol->colName, "create_time")) {
2,272✔
3489
        return 0;
12✔
3490
      }
3491
      cell = cell->pNext;
2,260✔
3492
    }
3493
    return -1;
1,125✔
3494
  }
3495
  return -1;
306✔
3496
}
3497

3498
static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
3,309✔
3499
  *rowLen = 0;
3,309✔
3500

3501
  SMetaReader mr = {0};
3,309✔
3502
  pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn);
3,309✔
3503
  int32_t code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, uid);
3,317✔
3504
  if (code != TSDB_CODE_SUCCESS) {
3,309!
3505
    qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", uid, tstrerror(terrno), idstr);
×
3506
    pHandle->api.metaReaderFn.clearReader(&mr);
×
3507
    return terrno;
×
3508
  }
3509

3510
  if (mr.me.type == TSDB_SUPER_TABLE) {
3,309✔
3511
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
3,284✔
3512
    for (int32_t i = 0; i < numOfCols; ++i) {
84,103✔
3513
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
80,819✔
3514
    }
3515
  } else if (mr.me.type == TSDB_CHILD_TABLE) {
25!
3516
    uint64_t suid = mr.me.ctbEntry.suid;
×
3517
    tDecoderClear(&mr.coder);
×
3518
    code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, suid);
×
3519
    if (code != TSDB_CODE_SUCCESS) {
×
3520
      qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno), idstr);
×
3521
      pHandle->api.metaReaderFn.clearReader(&mr);
×
3522
      return terrno;
×
3523
    }
3524

3525
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
×
3526

3527
    for (int32_t i = 0; i < numOfCols; ++i) {
×
3528
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
×
3529
    }
3530
  } else if (mr.me.type == TSDB_NORMAL_TABLE) {
25!
3531
    int32_t numOfCols = mr.me.ntbEntry.schemaRow.nCols;
25✔
3532
    for (int32_t i = 0; i < numOfCols; ++i) {
75✔
3533
      (*rowLen) += mr.me.ntbEntry.schemaRow.pSchema[i].bytes;
50✔
3534
    }
3535
  }
3536

3537
  pHandle->api.metaReaderFn.clearReader(&mr);
3,309✔
3538
  return TSDB_CODE_SUCCESS;
3,327✔
3539
}
3540

3541
static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
6,498✔
3542
  int32_t code = TSDB_CODE_SUCCESS;
6,498✔
3543
  int32_t lino = 0;
6,498✔
3544
  if (pOperator->status == OP_EXEC_DONE) {
6,498✔
3545
    (*ppRes) = NULL;
3,258✔
3546
    return code;
3,258✔
3547
  }
3548

3549
  SBlockDistInfo* pBlockScanInfo = pOperator->info;
3,240✔
3550
  SExecTaskInfo*  pTaskInfo = pOperator->pTaskInfo;
3,240✔
3551
  SStorageAPI*    pAPI = &pTaskInfo->storageAPI;
3,240✔
3552

3553
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
3,240✔
3554
  code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
3,240✔
3555
                           GET_TASKID(pTaskInfo));
3,240✔
3556
  QUERY_CHECK_CODE(code, lino, _end);
3,256!
3557

3558
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
3,256✔
3559
  QUERY_CHECK_CODE(code, lino, _end);
3,257!
3560

3561
  code = (int32_t)pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle, &blockDistInfo.numOfInmemRows);
3,257✔
3562
  QUERY_CHECK_CODE(code, lino, _end);
3,258!
3563

3564
  SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
3,258✔
3565

3566
  int32_t          slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
3,258✔
3567
  SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
3,258✔
3568
  QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
3,257!
3569

3570
  int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
3,257✔
3571
  char*   p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
3,249!
3572
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
3,255!
3573

3574
  int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
3,255✔
3575
  if (tempRes < 0) {
3,258!
3576
    code = terrno;
×
3577
    QUERY_CHECK_CODE(code, lino, _end);
×
3578
  }
3579
  varDataSetLen(p, len);
3,258✔
3580

3581
  code = colDataSetVal(pColInfo, 0, p, false);
3,258✔
3582
  QUERY_CHECK_CODE(code, lino, _end);
3,247!
3583

3584
  taosMemoryFree(p);
3,247!
3585

3586
  // make the valgrind happy that all memory buffer has been initialized already.
3587
  if (slotId != 0) {
3,259✔
3588
    SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
3,258✔
3589
    QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
3,254!
3590
    int64_t v = 0;
3,255✔
3591
    colDataSetInt64(p1, 0, &v);
3592
  }
3593

3594
  pBlock->info.rows = 1;
3,256✔
3595
  pOperator->status = OP_EXEC_DONE;
3,256✔
3596

3597
_end:
3,256✔
3598
  if (code != TSDB_CODE_SUCCESS) {
3,256!
3599
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3600
    pTaskInfo->code = code;
×
3601
    T_LONG_JMP(pTaskInfo->env, code);
×
3602
  }
3603
  (*ppRes) = pBlock;
3,256✔
3604
  return code;
3,256✔
3605
}
3606

3607
static void destroyBlockDistScanOperatorInfo(void* param) {
3,248✔
3608
  SBlockDistInfo* pDistInfo = (SBlockDistInfo*)param;
3,248✔
3609
  blockDataDestroy(pDistInfo->pResBlock);
3,248✔
3610
  if (pDistInfo->readHandle.api.tsdReader.tsdReaderClose != NULL) {
3,258!
3611
    pDistInfo->readHandle.api.tsdReader.tsdReaderClose(pDistInfo->pHandle);
3,258✔
3612
  }
3613
  tableListDestroy(pDistInfo->pTableListInfo);
3,258✔
3614
  taosMemoryFreeClear(param);
3,256!
3615
}
3,258✔
3616

3617
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
3,324✔
3618
  memset(pCond, 0, sizeof(SQueryTableDataCond));
3,324✔
3619

3620
  pCond->order = TSDB_ORDER_ASC;
3,324✔
3621
  pCond->numOfCols = 1;
3,324✔
3622
  pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
3,324!
3623
  pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t));
3,327!
3624
  if (pCond->colList == NULL || pCond->pSlotList == NULL) {
3,324!
3625
    taosMemoryFree(pCond->colList);
×
3626
    taosMemoryFree(pCond->pSlotList);
×
3627
    return terrno;
×
3628
  }
3629

3630
  pCond->colList->colId = 1;
3,324✔
3631
  pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
3,324✔
3632
  pCond->colList->bytes = sizeof(TSKEY);
3,324✔
3633
  pCond->colList->pk = 0;
3,324✔
3634

3635
  pCond->pSlotList[0] = 0;
3,324✔
3636

3637
  pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
3,324✔
3638
  pCond->suid = uid;
3,324✔
3639
  pCond->type = TIMEWINDOW_RANGE_CONTAINED;
3,324✔
3640
  pCond->startVersion = -1;
3,324✔
3641
  pCond->endVersion = -1;
3,324✔
3642

3643
  return TSDB_CODE_SUCCESS;
3,324✔
3644
}
3645

3646
int32_t createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
3,253✔
3647
                                        STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo,
3648
                                        SOperatorInfo** pOptrInfo) {
3649
  QRY_PARAM_CHECK(pOptrInfo);
3,253!
3650

3651
  int32_t         code = 0;
3,253✔
3652
  int32_t         lino = 0;
3,253✔
3653
  SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
3,253!
3654
  SOperatorInfo*  pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
3,254!
3655
  if (pInfo == NULL || pOperator == NULL) {
3,258!
3656
    pTaskInfo->code = code = terrno;
×
3657
    goto _error;
×
3658
  }
3659

3660
  pInfo->pResBlock = createDataBlockFromDescNode(pBlockScanNode->node.pOutputDataBlockDesc);
3,258✔
3661
  QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, terrno);
3,259!
3662
  code = blockDataEnsureCapacity(pInfo->pResBlock, 1);
3,259✔
3663
  QUERY_CHECK_CODE(code, lino, _error);
3,257!
3664

3665
  {
3666
    SQueryTableDataCond cond = {0};
3,257✔
3667
    code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
3,257✔
3668
    QUERY_CHECK_CODE(code, lino, _error);
3,254!
3669

3670
    pInfo->pTableListInfo = pTableListInfo;
3,254✔
3671
    int32_t num = 0;
3,254✔
3672
    code = tableListGetSize(pTableListInfo, &num);
3,254✔
3673
    QUERY_CHECK_CODE(code, lino, _error);
3,245!
3674

3675
    void* pList = tableListGetInfo(pTableListInfo, 0);
3,245✔
3676

3677
    code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock,
3,240✔
3678
                                                   (void**)&pInfo->pHandle, pTaskInfo->id.str, NULL);
3,240✔
3679
    cleanupQueryTableDataCond(&cond);
3,255✔
3680
    QUERY_CHECK_CODE(code, lino, _error);
3,255!
3681
  }
3682

3683
  pInfo->readHandle = *readHandle;
3,255✔
3684
  pInfo->uid = (pBlockScanNode->suid != 0) ? pBlockScanNode->suid : pBlockScanNode->uid;
3,255✔
3685

3686
  int32_t    numOfCols = 0;
3,255✔
3687
  SExprInfo* pExprInfo = NULL;
3,255✔
3688
  code = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &pExprInfo, &numOfCols);
3,255✔
3689
  QUERY_CHECK_CODE(code, lino, _error);
3,254!
3690

3691
  code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols, &pTaskInfo->storageAPI.functionStore);
3,254✔
3692
  QUERY_CHECK_CODE(code, lino, _error);
3,254!
3693

3694
  setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
3,254✔
3695
                  OP_NOT_OPENED, pInfo, pTaskInfo);
3696
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doBlockInfoScanNext, NULL, destroyBlockDistScanOperatorInfo,
3,249✔
3697
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
3698
  *pOptrInfo = pOperator;
3,250✔
3699
  return code;
3,250✔
3700

3701
_error:
×
3702
  if (pInfo) {
×
3703
    pInfo->pTableListInfo = NULL;
×
3704
    destroyBlockDistScanOperatorInfo(pInfo);
×
3705
  }
3706
  if (pOperator != NULL) {
×
3707
    pOperator->info = NULL;
×
3708
    destroyOperator(pOperator);
×
3709
  }
3710
  return code;
×
3711
}
3712

3713
static int32_t buildTableListInfo(SOperatorInfo* pOperator, STableId* id, STableListInfo** ppTableListInfo) {
69✔
3714
  int32_t            code = TSDB_CODE_SUCCESS;
69✔
3715
  int32_t            line = 0;
69✔
3716
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
69✔
3717
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
69✔
3718
  SSysTableScanInfo* pInfo = pOperator->info;
69✔
3719
  SReadHandle*       pReadHandle = &pInfo->readHandle;
69✔
3720
  SArray*            pList = NULL;
69✔
3721

3722
  STableListInfo* pTableListInfo = tableListCreate();
69✔
3723
  QUERY_CHECK_NULL(ppTableListInfo, code, line, _end, terrno);
69!
3724

3725
  if (id->type == TSDB_SUPER_TABLE) {
69✔
3726
    pList = taosArrayInit(4, sizeof(uint64_t));
46✔
3727
    QUERY_CHECK_NULL(pList, code, line, _end, terrno);
46!
3728

3729
    code = pReadHandle->api.metaFn.getChildTableList(pReadHandle->vnode, id->uid, pList);
46✔
3730
    QUERY_CHECK_CODE(code, line, _end);
46!
3731

3732
    size_t num = taosArrayGetSize(pList);
46✔
3733
    for (int32_t i = 0; i < num; ++i) {
69✔
3734
      uint64_t* id = taosArrayGet(pList, i);
23✔
3735
      if (id == NULL) {
23!
3736
        continue;
×
3737
      }
3738
      code = tableListAddTableInfo(pTableListInfo, *id, 0);
23✔
3739
      QUERY_CHECK_CODE(code, line, _end);
23!
3740
    }
3741
    taosArrayDestroy(pList);
46✔
3742
    pList = NULL;
46✔
3743

3744
  } else if (id->type == TSDB_NORMAL_TABLE) {
23!
3745
    code = tableListAddTableInfo(pTableListInfo, id->uid, 0);
23✔
3746
    QUERY_CHECK_CODE(code, line, _end);
23!
3747
  }
3748
  *ppTableListInfo = pTableListInfo;
69✔
3749
  return code;
69✔
3750
_end:
×
3751
  taosArrayDestroy(pList);
×
3752
  tableListDestroy(pTableListInfo);
×
3753
  return code;
×
3754
}
3755
static int32_t vnodeEstimateDataSizeByUid(SOperatorInfo* pOperator, STableId* id, SDbSizeStatisInfo* pStaticInfo) {
69✔
3756
  int32_t             code = TSDB_CODE_SUCCESS;
69✔
3757
  int32_t             line = 0;
69✔
3758
  SExecTaskInfo*      pTaskInfo = pOperator->pTaskInfo;
69✔
3759
  SStorageAPI*        pAPI = &pTaskInfo->storageAPI;
69✔
3760
  SSysTableScanInfo*  pInfo = pOperator->info;
69✔
3761
  SQueryTableDataCond cond = {0};
69✔
3762

3763
  SReadHandle* pReadHandle = &pInfo->readHandle;
69✔
3764

3765
  STableListInfo* pTableListInfo = NULL;
69✔
3766
  code = buildTableListInfo(pOperator, id, &pTableListInfo);
69✔
3767
  QUERY_CHECK_CODE(code, line, _end);
69!
3768

3769
  tb_uid_t tbId = id->type == TSDB_SUPER_TABLE ? id->uid : 0;
69✔
3770

3771
  code = initTableblockDistQueryCond(tbId, &cond);
69✔
3772
  QUERY_CHECK_CODE(code, line, _end);
69!
3773

3774
  pInfo->pTableListInfo = pTableListInfo;
69✔
3775

3776
  int32_t num = 0;
69✔
3777
  code = tableListGetSize(pTableListInfo, &num);
69✔
3778
  QUERY_CHECK_CODE(code, line, _end);
69!
3779

3780
  void* pList = tableListGetInfo(pTableListInfo, 0);
69✔
3781

3782
  code = pReadHandle->api.tsdReader.tsdReaderOpen(pReadHandle->vnode, &cond, pList, num, NULL, (void**)&pInfo->pHandle,
69✔
3783
                                                  pTaskInfo->id.str, NULL);
69✔
3784
  cleanupQueryTableDataCond(&cond);
69✔
3785
  QUERY_CHECK_CODE(code, line, _end);
69!
3786

3787
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
69✔
3788
  code = doGetTableRowSize(pReadHandle, id->uid, (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
69✔
3789
  QUERY_CHECK_CODE(code, line, _end);
69!
3790

3791
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pInfo->pHandle, &blockDistInfo);
69✔
3792
  QUERY_CHECK_CODE(code, line, _end);
69!
3793

3794
  code = pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pInfo->pHandle, &blockDistInfo.numOfInmemRows);
69✔
3795
  QUERY_CHECK_CODE(code, line, _end);
69!
3796

3797
  int64_t rawDiskSize = 0, rawCacheSize = 0;
69✔
3798
  rawDiskSize = (blockDistInfo.totalRows + blockDistInfo.numOfSttRows) * blockDistInfo.rowSize;
69✔
3799
  rawCacheSize = blockDistInfo.numOfInmemRows * blockDistInfo.rowSize;
69✔
3800
  pStaticInfo->rawDataSize += rawDiskSize;
69✔
3801
  pStaticInfo->cacheSize += rawCacheSize;
69✔
3802

3803
  if (pInfo->pHandle != NULL) {
69!
3804
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
69✔
3805
    pInfo->pHandle = NULL;
69✔
3806
  }
3807

3808
  tableListDestroy(pInfo->pTableListInfo);
69✔
3809
  pInfo->pTableListInfo = NULL;
69✔
3810
  return code;
69✔
3811
_end:
×
3812

3813
  if (pInfo->pHandle != NULL) {
×
3814
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
×
3815
    pInfo->pHandle = NULL;
×
3816
  }
3817

3818
  tableListDestroy(pInfo->pTableListInfo);
×
3819
  pInfo->pTableListInfo = NULL;
×
3820
  if (code) {
×
3821
    pTaskInfo->code = code;
×
3822
    return code;
×
3823
  }
3824
  cleanupQueryTableDataCond(&cond);
×
3825
  return code;
×
3826
}
3827

3828
static int32_t vnodeEstimateRawDataSizeImpl(SOperatorInfo* pOperator, SArray* pTableList,
48✔
3829
                                            SDbSizeStatisInfo* pStaticInfo) {
3830
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
48✔
3831
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
48✔
3832
  SSysTableScanInfo* pInfo = pOperator->info;
48✔
3833

3834
  int32_t rowLen = 0;
48✔
3835
  int32_t code = TSDB_CODE_SUCCESS;
48✔
3836
  for (int i = 0; i < taosArrayGetSize(pTableList); i++) {
117✔
3837
    STableId* id = (STableId*)taosArrayGet(pTableList, i);
69✔
3838
    code = vnodeEstimateDataSizeByUid(pOperator, id, pStaticInfo);
69✔
3839
    if (code != TSDB_CODE_SUCCESS) {
69!
3840
      return code;
×
3841
    }
3842
  }
3843
  return code;
47✔
3844
}
3845

3846
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticInfo) {
47✔
3847
  int32_t code = TSDB_CODE_SUCCESS;
47✔
3848

3849
  int32_t line = 0;
47✔
3850

3851
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
47✔
3852
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
47✔
3853
  SSysTableScanInfo* pInfo = pOperator->info;
47✔
3854
  int32_t            numOfRows = 0;
47✔
3855
  int32_t            ret = 0;
47✔
3856

3857
  if (pInfo->pCur == NULL) {
47!
3858
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
×
3859
    if (pInfo->pCur == NULL) {
×
3860
      TAOS_CHECK_GOTO(terrno, &line, _exit);
×
3861
    }
3862
  }
3863

3864
  SArray* pIdList = taosArrayInit(16, sizeof(STableId));
47✔
3865
  if (pIdList == NULL) {
48!
3866
    TAOS_CHECK_GOTO(terrno, &line, _exit);
×
3867
  }
3868

3869
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_CHILD_TABLE)) == 0)) {
117✔
3870
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
69✔
3871
      STableId id = {.type = TSDB_SUPER_TABLE, .uid = pInfo->pCur->mr.me.uid};
46✔
3872
      if (taosArrayPush(pIdList, &id) == NULL) {
46!
3873
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
3874
      }
3875
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
23!
3876
      continue;
×
3877
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
23!
3878
      STableId id = {.type = TSDB_NORMAL_TABLE, .uid = pInfo->pCur->mr.me.uid};
23✔
3879
      if (taosArrayPush(pIdList, &id) == NULL) {
23!
3880
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
3881
      }
3882
    }
3883
  }
3884
  if (pInfo->pCur) {
47!
3885
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
48✔
3886
    pInfo->pCur = NULL;
48✔
3887
  }
3888

3889
  code = vnodeEstimateRawDataSizeImpl(pOperator, pIdList, pStaticInfo);
47✔
3890

3891
_exit:
47✔
3892
  if (pInfo->pCur) {
47!
3893
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
3894
    pInfo->pCur = NULL;
×
3895
  }
3896
  if (code != TSDB_CODE_SUCCESS) {
47!
3897
    qError("%s failed at line %d since %s", __func__, line, tstrerror(code));
×
3898
    pTaskInfo->code = code;
×
3899
  }
3900

3901
  taosArrayDestroy(pIdList);
47✔
3902
  return code;
48✔
3903
}
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

© 2025 Coveralls, Inc