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

taosdata / TDengine / #4720

08 Sep 2025 08:43AM UTC coverage: 58.139% (-0.6%) from 58.762%
#4720

push

travis-ci

web-flow
Merge pull request #32881 from taosdata/enh/add-new-windows-ci

fix(ci): update workflow reference to use new Windows CI YAML

133181 of 292179 branches covered (45.58%)

Branch coverage included in aggregate %.

201691 of 283811 relevant lines covered (71.07%)

5442780.71 hits per line

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

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

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

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

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

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

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

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

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

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

87
typedef struct {
88
  const char* name;
89
  __sys_check chkFunc;
90
  __sys_filte fltFunc;
91
} SSTabFltFuncDef;
92

93
typedef struct MergeIndex {
94
  int idx;
95
  int len;
96
} MergeIndex;
97

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

106
typedef struct {
107
  int8_t   type;
108
  tb_uid_t uid;
109
} STableId;
110

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

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

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

143
#define SYSTAB_FILTER_DICT_SIZE (sizeof(filterDict) / sizeof(filterDict[0]))
144

145
static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta,
146
                                     size_t size, const char* dbName, int64_t* pRows);
147

148
static char* SYSTABLE_SPECIAL_COL[] = {"db_name", "vgroup_id"};
149

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

156
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
157
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
158
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock);
159

160
static int32_t sysTableUserColsFillOneTableCols(const char* dbname, int32_t* pNumOfRows,
161
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
162
                                                SExtSchema* extSchemaRow, char* tableType, SColRefWrapper* colRef);
163

164
static int32_t sysTableUserColsFillOneVirtualChildTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
165
                                                            const SSDataBlock* dataBlock, char* tName, char* stName,
166
                                                            SSchemaWrapper* schemaRow, char* tableType, SColRefWrapper *colRef, tb_uid_t uid, int32_t vgId);
167

168
static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
169
                                               SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo);
170

171
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStatisInfo);
172

173
int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result) {
1,355✔
174
  SSTabFltArg* pArg = arg;
1,355✔
175
  void*        pVnode = pArg->pVnode;
1,355✔
176

177
  const char* db = NULL;
1,355✔
178
  pArg->pAPI->metaFn.getBasicInfo(pVnode, &db, NULL, NULL, NULL);
1,355✔
179

180
  SName   sn = {0};
1,354✔
181
  char    dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,354✔
182
  int32_t code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
1,354✔
183
  if (code != TSDB_CODE_SUCCESS) {
1,354!
184
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
185
    return code;
×
186
  }
187

188
  code = tNameGetDbName(&sn, varDataVal(dbname));
1,354✔
189
  if (code != TSDB_CODE_SUCCESS) {
1,353!
190
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
191
    return code;
×
192
  }
193
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
1,353✔
194

195
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,353✔
196
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
1,353✔
197

198
  bool           reverse = false;
1,353✔
199
  bool           equal = false;
1,353✔
200
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
1,353✔
201
  if (func == NULL) return -1;
1,352!
202

203
  int ret = func(dbname, pVal->datum.p, TSDB_DATA_TYPE_VARCHAR);
1,352✔
204
  if (ret == 0) return 0;
1,354!
205

206
  return -2;
×
207
}
208

209
int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result) {
×
210
  SSTabFltArg* pArg = arg;
×
211
  void*        pVnode = ((SSTabFltArg*)arg)->pVnode;
×
212

213
  int64_t vgId = 0;
×
214
  pArg->pAPI->metaFn.getBasicInfo(pVnode, NULL, (int32_t*)&vgId, NULL, NULL);
×
215

216
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
217
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
218

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

224
  int ret = func(&vgId, &pVal->datum.i, TSDB_DATA_TYPE_BIGINT);
×
225
  if (ret == 0) return 0;
×
226

227
  return -1;
×
228
}
229

230
int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) {
635✔
231
  SSTabFltArg* pArg = arg;
635✔
232

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

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

240
  SMetaFltParam param = {.suid = 0,
635✔
241
                         .cid = 0,
242
                         .type = TSDB_DATA_TYPE_VARCHAR,
243
                         .val = pVal->datum.p,
635✔
244
                         .reverse = reverse,
245
                         .equal = equal,
246
                         .filterFunc = func};
247
  return -1;
635✔
248
}
249

250
int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) {
6✔
251
  SSTabFltArg* pArg = arg;
6✔
252
  SStorageAPI* pAPI = pArg->pAPI;
6✔
253

254
  SOperatorNode* pOper = (SOperatorNode*)pNode;
6✔
255
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
6✔
256

257
  bool           reverse = false, equal = false;
6✔
258
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
6✔
259
  if (func == NULL) return -1;
6!
260

261
  SMetaFltParam param = {.suid = 0,
6✔
262
                         .cid = 0,
263
                         .type = TSDB_DATA_TYPE_BIGINT,
264
                         .val = &pVal->datum.i,
6✔
265
                         .reverse = reverse,
266
                         .equal = equal,
267
                         .filterFunc = func};
268

269
  int32_t ret = pAPI->metaFilter.metaFilterCreateTime(pArg->pVnode, &param, result);
6✔
270
  return ret;
6✔
271
}
272

273
int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result) {
×
274
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
275

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

285
int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result) {
×
286
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
287

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

297
int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result) {
21✔
298
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
21✔
299

300
  SOperatorNode* pOper = (SOperatorNode*)pNode;
21✔
301
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
21✔
302
  bool           reverse = false;
21✔
303
  bool           equal = false;
21✔
304
  __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal);
21✔
305
  if (func == NULL) return -1;
21!
306
  return -1;
21✔
307
}
308

309
int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result) {
×
310
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
311

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

321
int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result) {
×
322
  void* pMeta = ((SSTabFltArg*)arg)->pMeta;
×
323

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

333
int optSysDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) {
33,140✔
334
  int32_t cmp = func(a, b);
33,140✔
335
  switch (comparType) {
33,145!
336
    case OP_TYPE_LOWER_THAN:
22,416✔
337
      if (cmp < 0) return 0;
22,416!
338
      break;
×
339
    case OP_TYPE_LOWER_EQUAL: {
×
340
      if (cmp <= 0) return 0;
×
341
      break;
×
342
    }
343
    case OP_TYPE_GREATER_THAN: {
9,388✔
344
      if (cmp > 0) return 0;
9,388!
345
      break;
×
346
    }
347
    case OP_TYPE_GREATER_EQUAL: {
×
348
      if (cmp >= 0) return 0;
×
349
      break;
×
350
    }
351
    case OP_TYPE_EQUAL: {
1,354✔
352
      if (cmp == 0) return 0;
1,354!
353
      break;
×
354
    }
355
    default:
×
356
      return -1;
×
357
  }
358
  return cmp;
×
359
}
360

361
static int optSysFilterFuncImpl__LowerThan(void* a, void* b, int16_t dtype) {
22,478✔
362
  __compar_fn_t func = getComparFunc(dtype, 0);
22,478✔
363
  if (func == NULL) {
22,392!
364
    return -1;
×
365
  }
366
  return optSysDoCompare(func, OP_TYPE_LOWER_THAN, a, b);
22,392✔
367
}
368
static int optSysFilterFuncImpl__LowerEqual(void* a, void* b, int16_t dtype) {
×
369
  __compar_fn_t func = getComparFunc(dtype, 0);
×
370
  if (func == NULL) {
×
371
    return -1;
×
372
  }
373
  return optSysDoCompare(func, OP_TYPE_LOWER_EQUAL, a, b);
×
374
}
375
static int optSysFilterFuncImpl__GreaterThan(void* a, void* b, int16_t dtype) {
9,390✔
376
  __compar_fn_t func = getComparFunc(dtype, 0);
9,390✔
377
  if (func == NULL) {
9,387!
378
    return -1;
×
379
  }
380
  return optSysDoCompare(func, OP_TYPE_GREATER_THAN, a, b);
9,387✔
381
}
382
static int optSysFilterFuncImpl__GreaterEqual(void* a, void* b, int16_t dtype) {
×
383
  __compar_fn_t func = getComparFunc(dtype, 0);
×
384
  if (func == NULL) {
×
385
    return -1;
×
386
  }
387
  return optSysDoCompare(func, OP_TYPE_GREATER_EQUAL, a, b);
×
388
}
389
static int optSysFilterFuncImpl__Equal(void* a, void* b, int16_t dtype) {
1,352✔
390
  __compar_fn_t func = getComparFunc(dtype, 0);
1,352✔
391
  if (func == NULL) {
1,349!
392
    return -1;
×
393
  }
394
  return optSysDoCompare(func, OP_TYPE_EQUAL, a, b);
1,349✔
395
}
396

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

405
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result);
406
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result);
407
static int32_t optSysCheckOper(SNode* pOpear);
408
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt);
409

410
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
411
                                          SExecTaskInfo* pTaskInfo);
412
void                extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode);
413

414
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
415
                                   SSDataBlock* pBlock);
416

417
__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal) {
2,016✔
418
  if (ctype == OP_TYPE_LOWER_EQUAL || ctype == OP_TYPE_LOWER_THAN) {
2,016!
419
    *reverse = true;
4✔
420
  }
421
  if (ctype == OP_TYPE_EQUAL) {
2,016✔
422
    *equal = true;
2,011✔
423
  }
424
  if (ctype == OP_TYPE_LOWER_THAN)
2,016✔
425
    return optSysFilterFuncImpl__LowerThan;
4✔
426
  else if (ctype == OP_TYPE_LOWER_EQUAL)
2,012!
427
    return optSysFilterFuncImpl__LowerEqual;
×
428
  else if (ctype == OP_TYPE_GREATER_THAN)
2,012✔
429
    return optSysFilterFuncImpl__GreaterThan;
2✔
430
  else if (ctype == OP_TYPE_GREATER_EQUAL)
2,010!
431
    return optSysFilterFuncImpl__GreaterEqual;
×
432
  else if (ctype == OP_TYPE_EQUAL)
2,010✔
433
    return optSysFilterFuncImpl__Equal;
2,009✔
434
  else if (ctype == OP_TYPE_NOT_EQUAL)
1!
435
    return optSysFilterFuncImpl__NoEqual;
×
436
  return NULL;
1✔
437
}
438

439
static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) {
33,780✔
440
  SOperatorNode* node = (SOperatorNode*)pCond;
33,780✔
441
  if (node->opType == OP_TYPE_EQUAL) {
33,780✔
442
    if (nodeType(node->pLeft) == QUERY_NODE_COLUMN &&
6,796!
443
        strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 &&
6,796!
444
        nodeType(node->pRight) == QUERY_NODE_VALUE) {
×
445
      SValueNode* pValue = (SValueNode*)node->pRight;
×
446
      if (pValue->node.resType.type == TSDB_DATA_TYPE_NCHAR || pValue->node.resType.type == TSDB_DATA_TYPE_VARCHAR) {
×
447
        char* value = nodesGetValueFromNode(pValue);
×
448
        tstrncpy(condTable, varDataVal(value), TSDB_TABLE_NAME_LEN);
×
449
        return true;
×
450
      }
451
    }
452
  }
453
  return false;
33,780✔
454
}
455

456
static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) {
32,066✔
457
  if (pCond == NULL) {
32,066✔
458
    return false;
6✔
459
  }
460
  if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) {
32,060✔
461
    SLogicConditionNode* node = (SLogicConditionNode*)pCond;
1,630✔
462
    if (LOGIC_COND_TYPE_AND == node->condType) {
1,630✔
463
      SNode* pChild = NULL;
1,625✔
464
      FOREACH(pChild, node->pParameterList) {
4,976!
465
        if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) {
3,351!
466
          return true;
×
467
        }
468
      }
469
    }
470
  }
471

472
  if (QUERY_NODE_OPERATOR == nodeType(pCond)) {
32,060✔
473
    return sysTableIsOperatorCondOnOneTable(pCond, condTable);
30,430✔
474
  }
475

476
  return false;
1,630✔
477
}
478

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

485
  char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
486
  STR_TO_VARSTR(tableName, pInfo->req.filterTb);
×
487

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

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

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

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

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

546
  if (numOfRows > 0) {
×
547
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
548
    numOfRows = 0;
×
549
  }
550

551
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
552
  setOperatorCompleted(pOperator);
×
553

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

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

569
  code = tNameGetDbName(&sn, varDataVal(dbname));
14,284✔
570
  QUERY_CHECK_CODE(code, lino, _end);
14,283!
571

572
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
14,283✔
573

574
_end:
14,283✔
575
  if (code != TSDB_CODE_SUCCESS) {
14,283!
576
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
577
  }
578
  return code;
14,283✔
579
}
580

581
static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
22,392✔
582
  int32_t            code = TSDB_CODE_SUCCESS;
22,392✔
583
  int32_t            lino = 0;
22,392✔
584
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
22,392✔
585
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
22,392✔
586
  SSysTableScanInfo* pInfo = pOperator->info;
22,392✔
587
  int32_t            numOfRows = 0;
22,392✔
588
  int32_t            ret = 0;
22,392✔
589
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
22,392✔
590
  SSDataBlock*       pDataBlock = NULL;
22,392✔
591

592
  if (pOperator->status == OP_EXEC_DONE) {
22,392✔
593
    return NULL;
8,177✔
594
  }
595

596
  blockDataCleanup(pInfo->pRes);
14,215✔
597

598
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_COLS);
14,217✔
599
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
14,217!
600

601
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
14,217✔
602
  QUERY_CHECK_CODE(code, lino, _end);
14,217!
603

604
  code = doExtractDbName(dbname, pInfo, pAPI);
14,217✔
605
  QUERY_CHECK_CODE(code, lino, _end);
14,216!
606

607
  // optimize when sql like where table_name='tablename' and xxx.
608
  if (pInfo->req.filterTb[0]) {
14,216!
609
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
610
    blockDataDestroy(pDataBlock);
×
611
    return p;
×
612
  }
613

614
  if (pInfo->pCur == NULL) {
14,216✔
615
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
13,703✔
616
  } else {
617
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
513✔
618
    if (code != 0) {
514!
619
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
620
      pInfo->pCur = NULL;
×
621
      QUERY_CHECK_CODE(code, lino, _end);
×
622
    }
623
  }
624

625
  if (pInfo->pSchema == NULL) {
14,216✔
626
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
13,702✔
627
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
13,703✔
628
  }
629
  if (pInfo->pExtSchema == NULL) {
14,216✔
630
    pInfo->pExtSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
13,702✔
631
  }
632

633
  if (!pInfo->pCur || !pInfo->pSchema || !pInfo->pExtSchema) {
14,217!
634
    qError("sysTableScanUserCols failed since %s", terrstr());
×
635
    blockDataDestroy(pDataBlock);
×
636
    pInfo->loadInfo.totalRows = 0;
×
637
    return NULL;
×
638
  }
639

640
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
279,598✔
641
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
266,285✔
642
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
266,285✔
643

644
    SSchemaWrapper* schemaRow = NULL;
266,285✔
645
    SExtSchema*     extSchemaRow = NULL;
266,285✔
646
    SColRefWrapper* colRef = NULL;
266,285✔
647

648
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
266,285✔
649
      qDebug("sysTableScanUserCols cursor get super table, %s", GET_TASKID(pTaskInfo));
1,183!
650
      void* schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
1,183✔
651
      if (schema == NULL) {
1,183✔
652
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&pInfo->pCur->mr.me.stbEntry.schemaRow);
1,149!
653
        if (pInfo->pCur->mr.me.stbEntry.schemaRow.pSchema) {
1,149!
654
          QUERY_CHECK_NULL(schemaWrapper, code, lino, _end, terrno);
1,149!
655
        }
656
        code = taosHashPut(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
1,149✔
657
        if (code == TSDB_CODE_DUP_KEY) {
1,149!
658
          code = TSDB_CODE_SUCCESS;
×
659
        }
660
        QUERY_CHECK_CODE(code, lino, _end);
1,149!
661
      }
662

663
      void *pExtSchema = taosHashGet(pInfo->pExtSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
1,183✔
664
      if (pExtSchema == NULL) {
1,183✔
665
        SExtSchema *pExtSchema = pInfo->pCur->mr.me.pExtSchemas;
1,149✔
666
        code = taosHashPut(pInfo->pExtSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), pExtSchema,
1,149✔
667
          pInfo->pCur->mr.me.stbEntry.schemaRow.nCols * sizeof(SExtSchema));
1,149✔
668
        if (code == TSDB_CODE_DUP_KEY) {
1,149!
669
          code = TSDB_CODE_SUCCESS;
×
670
        }
671
        QUERY_CHECK_CODE(code, lino, _end);
1,149!
672
      }
673

674
      continue;
1,183✔
675
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
265,102✔
676
      qDebug("sysTableScanUserCols cursor get child table, %s", GET_TASKID(pTaskInfo));
251,581!
677

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

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

740
      STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
48✔
741
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
48✔
742

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

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

793
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
265,113✔
794
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
1,304✔
795
      numOfRows = 0;
1,304✔
796

797
      if (pInfo->pRes->info.rows > 0) {
1,304✔
798
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
514✔
799
        break;
514✔
800
      }
801
    }
802
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
803
    code =
804
        sysTableUserColsFillOneTableCols(dbname, &numOfRows, pDataBlock, tableName, schemaRow, extSchemaRow, typeName, colRef);
264,599✔
805
    QUERY_CHECK_CODE(code, lino, _end);
264,198!
806
  }
807

808
  if (numOfRows > 0) {
13,440!
809
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
13,702✔
810
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
13,702✔
811
    numOfRows = 0;
13,702✔
812
  }
813

814
  blockDataDestroy(pDataBlock);
13,440✔
815
  pDataBlock = NULL;
14,217✔
816
  if (ret != 0) {
14,217✔
817
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
13,703✔
818
    pInfo->pCur = NULL;
13,703✔
819
    setOperatorCompleted(pOperator);
13,703✔
820
  }
821

822
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
14,216✔
823
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
14,216!
824

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

835
static SSDataBlock* sysTableScanUserVcCols(SOperatorInfo* pOperator) {
108✔
836
  int32_t            code = TSDB_CODE_SUCCESS;
108✔
837
  int32_t            lino = 0;
108✔
838
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
108✔
839
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
108✔
840
  SSysTableScanInfo* pInfo = pOperator->info;
108✔
841
  int32_t            numOfRows = 0;
108✔
842
  int32_t            ret = 0;
108✔
843
  char               dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
108✔
844
  SSDataBlock*       pDataBlock = NULL;
108✔
845

846
  if (pOperator->status == OP_EXEC_DONE) {
108✔
847
    return NULL;
41✔
848
  }
849

850
  blockDataCleanup(pInfo->pRes);
67✔
851

852
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_VC_COLS);
67✔
853
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
67!
854

855
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
67✔
856
  QUERY_CHECK_CODE(code, lino, _end);
67!
857

858
  code = doExtractDbName(dbname, pInfo, pAPI);
67✔
859
  QUERY_CHECK_CODE(code, lino, _end);
67!
860

861
  // optimize when sql like where table_name='tablename' and xxx.
862
  if (pInfo->req.filterTb[0]) {
67!
863
    SSDataBlock* p = doOptimizeTableNameFilter(pOperator, pDataBlock, dbname);
×
864
    blockDataDestroy(pDataBlock);
×
865
    return p;
×
866
  }
867

868
  if (pInfo->pCur == NULL) {
67!
869
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
67✔
870
  } else {
871
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
×
872
    if (code != 0) {
×
873
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
874
      pInfo->pCur = NULL;
×
875
      QUERY_CHECK_CODE(code, lino, _end);
×
876
    }
877
  }
878

879
  if (pInfo->pSchema == NULL) {
67!
880
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
67✔
881
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
67✔
882
  }
883

884
  if (!pInfo->pCur || !pInfo->pSchema) {
67!
885
    qError("sysTableScanUserCols failed since %s", terrstr());
×
886
    blockDataDestroy(pDataBlock);
×
887
    pInfo->loadInfo.totalRows = 0;
×
888
    return NULL;
×
889
  }
890

891
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
773✔
892
    char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
706✔
893
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
706✔
894
    char stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
706✔
895

896
    SSchemaWrapper* schemaRow = NULL;
706✔
897
    SColRefWrapper* colRef = NULL;
706✔
898

899
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
706✔
900
      continue;
582✔
901
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
567✔
902
      continue;
242✔
903
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
325✔
904
      continue;
148✔
905
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_NORMAL_TABLE) {
177✔
906
      continue;
53✔
907
    } else if (pInfo->pCur->mr.me.type == TSDB_VIRTUAL_CHILD_TABLE) {
124!
908
      qDebug("sysTableScanUserCols cursor get virtual child table, %s", GET_TASKID(pTaskInfo));
124✔
909

910
      STR_TO_VARSTR(typeName, "VIRTUAL_CHILD_TABLE");
124✔
911
      STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
124✔
912

913
      colRef = &pInfo->pCur->mr.me.colRef;
124✔
914
      int64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
124✔
915
      void*   schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.ctbEntry.suid, sizeof(int64_t));
124✔
916
      if (schema != NULL) {
124✔
917
        schemaRow = *(SSchemaWrapper**)schema;
78✔
918
        SMetaReader smrSuperTable = {0};
78✔
919
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
78✔
920
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
78✔
921
        if (code != TSDB_CODE_SUCCESS) {
78!
922
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
923
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
924
                 GET_TASKID(pTaskInfo));
925

926
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
927
          blockDataDestroy(pDataBlock);
×
928
          pInfo->loadInfo.totalRows = 0;
×
929
          return NULL;
×
930
        }
931
        STR_TO_VARSTR(stableName, smrSuperTable.me.name);
78✔
932
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
78✔
933
      } else {
934
        SMetaReader smrSuperTable = {0};
46✔
935
        pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
46✔
936
        code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
46✔
937
        if (code != TSDB_CODE_SUCCESS) {
46!
938
          // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
939
          qError("sysTableScanUserCols get meta by suid:%" PRId64 " error, code:%d, %s", suid, code,
×
940
                 GET_TASKID(pTaskInfo));
941

942
          pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
943
          blockDataDestroy(pDataBlock);
×
944
          pInfo->loadInfo.totalRows = 0;
×
945
          return NULL;
×
946
        }
947
        STR_TO_VARSTR(stableName, smrSuperTable.me.name);
46!
948
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&smrSuperTable.me.stbEntry.schemaRow);
46✔
949
        if (smrSuperTable.me.stbEntry.schemaRow.pSchema) {
46!
950
          if (schemaWrapper == NULL) {
46!
951
            code = terrno;
×
952
            lino = __LINE__;
×
953
            pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
954
            goto _end;
×
955
          }
956
        }
957
        code = taosHashPut(pInfo->pSchema, &suid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
46✔
958
        if (code == TSDB_CODE_DUP_KEY) {
46!
959
          code = TSDB_CODE_SUCCESS;
×
960
        }
961
        schemaRow = schemaWrapper;
46✔
962
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
46✔
963
        QUERY_CHECK_CODE(code, lino, _end);
46!
964
      }
965
    } else {
966
      qDebug("sysTableScanUserCols cursor get invalid table, %s", GET_TASKID(pTaskInfo));
×
967
      continue;
×
968
    }
969

970
    if ((numOfRows + schemaRow->nCols) > pOperator->resultInfo.capacity) {
124!
971
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
972
      numOfRows = 0;
×
973

974
      if (pInfo->pRes->info.rows > 0) {
×
975
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
976
        break;
×
977
      }
978
    }
979
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
980
    code = sysTableUserColsFillOneVirtualChildTableCols(pInfo, dbname, &numOfRows, pDataBlock, tableName, stableName, schemaRow, typeName, colRef, pInfo->pCur->mr.me.uid, pOperator->pTaskInfo->id.vgId);
124✔
981
    QUERY_CHECK_CODE(code, lino, _end);
124!
982
  }
983

984
  if (numOfRows > 0) {
67✔
985
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
41✔
986
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
41✔
987
    numOfRows = 0;
41✔
988
  }
989

990
  blockDataDestroy(pDataBlock);
67✔
991
  pDataBlock = NULL;
67✔
992
  if (ret != 0) {
67!
993
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
67✔
994
    pInfo->pCur = NULL;
67✔
995
    setOperatorCompleted(pOperator);
67✔
996
  }
997

998
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
67✔
999
  qDebug("get cols success, rows:%" PRIu64 " %s", pInfo->loadInfo.totalRows, GET_TASKID(pTaskInfo));
67✔
1000

1001
_end:
55✔
1002
  if (code != TSDB_CODE_SUCCESS) {
67!
1003
    blockDataDestroy(pDataBlock);
×
1004
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1005
    pTaskInfo->code = code;
×
1006
    T_LONG_JMP(pTaskInfo->env, code);
×
1007
  }
1008
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
67✔
1009
}
1010

1011

1012
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
4,168✔
1013
  int32_t        code = TSDB_CODE_SUCCESS;
4,168✔
1014
  int32_t        lino = 0;
4,168✔
1015
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
4,168✔
1016
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
4,168✔
1017
  SSDataBlock*   dataBlock = NULL;
4,168✔
1018

1019
  SSysTableScanInfo* pInfo = pOperator->info;
4,168✔
1020
  if (pOperator->status == OP_EXEC_DONE) {
4,168✔
1021
    return NULL;
1,359✔
1022
  }
1023

1024
  blockDataCleanup(pInfo->pRes);
2,809✔
1025
  int32_t numOfRows = 0;
2,808✔
1026

1027
  dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS);
2,808✔
1028
  QUERY_CHECK_NULL(dataBlock, code, lino, _end, terrno);
2,809!
1029

1030
  code = blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity);
2,809✔
1031
  QUERY_CHECK_CODE(code, lino, _end);
2,809!
1032

1033
  const char* db = NULL;
2,809✔
1034
  int32_t     vgId = 0;
2,809✔
1035
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
2,809✔
1036

1037
  SName sn = {0};
2,809✔
1038
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
2,809✔
1039
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
2,809✔
1040
  QUERY_CHECK_CODE(code, lino, _end);
2,808!
1041

1042
  code = tNameGetDbName(&sn, varDataVal(dbname));
2,808✔
1043
  QUERY_CHECK_CODE(code, lino, _end);
2,809!
1044

1045
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
2,809✔
1046

1047
  char condTableName[TSDB_TABLE_NAME_LEN] = {0};
2,809✔
1048
  // optimize when sql like where table_name='tablename' and xxx.
1049
  if (pInfo->pCondition && sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) {
2,809✔
1050
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
1✔
1051
    STR_TO_VARSTR(tableName, condTableName);
1✔
1052

1053
    SMetaReader smrChildTable = {0};
1✔
1054
    pAPI->metaReaderFn.initReader(&smrChildTable, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
1✔
1055
    code = pAPI->metaReaderFn.getTableEntryByName(&smrChildTable, condTableName);
×
1056
    if (code != TSDB_CODE_SUCCESS) {
×
1057
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByName, therefore, return directly
1058
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1059
      blockDataDestroy(dataBlock);
×
1060
      pInfo->loadInfo.totalRows = 0;
×
1061
      return NULL;
×
1062
    }
1063

1064
    if (smrChildTable.me.type != TSDB_CHILD_TABLE && smrChildTable.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
×
1065
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1066
      blockDataDestroy(dataBlock);
×
1067
      pInfo->loadInfo.totalRows = 0;
×
1068
      return NULL;
×
1069
    }
1070

1071
    SMetaReader smrSuperTable = {0};
×
1072
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
×
1073
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid);
×
1074
    if (code != TSDB_CODE_SUCCESS) {
×
1075
      // terrno has been set by pAPI->metaReaderFn.getTableEntryByUid
1076
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1077
      pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1078
      blockDataDestroy(dataBlock);
×
1079
      return NULL;
×
1080
    }
1081

1082
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows,
×
1083
                                            dataBlock);
1084

1085
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1086
    pAPI->metaReaderFn.clearReader(&smrChildTable);
×
1087

1088
    QUERY_CHECK_CODE(code, lino, _end);
×
1089

1090
    if (numOfRows > 0) {
×
1091
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
1092
      numOfRows = 0;
×
1093
    }
1094
    blockDataDestroy(dataBlock);
×
1095
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
1096
    setOperatorCompleted(pOperator);
×
1097
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
1098
  }
1099

1100
  int32_t ret = 0;
2,809✔
1101
  if (pInfo->pCur == NULL) {
2,809✔
1102
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
2,401✔
1103
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
2,400!
1104
  } else {
1105
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0);
408✔
1106
    QUERY_CHECK_CODE(code, lino, _end);
408!
1107
  }
1108

1109
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
277,588✔
1110
    if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE && pInfo->pCur->mr.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
269,140✔
1111
      continue;
1,109✔
1112
    }
1113

1114
    char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
268,031✔
1115
    STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name);
268,031✔
1116

1117
    SMetaReader smrSuperTable = {0};
268,031✔
1118
    pAPI->metaReaderFn.initReader(&smrSuperTable, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
268,031✔
1119
    uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
273,029✔
1120
    code = pAPI->metaReaderFn.getTableEntryByUid(&smrSuperTable, suid);
273,029✔
1121
    if (code != TSDB_CODE_SUCCESS) {
272,969!
1122
      qError("failed to get super table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno),
×
1123
             GET_TASKID(pTaskInfo));
1124
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1125
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1126
      pInfo->pCur = NULL;
×
1127
      blockDataDestroy(dataBlock);
×
1128
      dataBlock = NULL;
×
1129
      T_LONG_JMP(pTaskInfo->env, terrno);
×
1130
    }
1131

1132
    if ((smrSuperTable.me.stbEntry.schemaTag.nCols + numOfRows) > pOperator->resultInfo.capacity) {
272,969✔
1133
      relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
999✔
1134
      numOfRows = 0;
1,000✔
1135

1136
      if (pInfo->pRes->info.rows > 0) {
1,000✔
1137
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
408✔
1138
        pAPI->metaReaderFn.clearReader(&smrSuperTable);
408✔
1139
        break;
408✔
1140
      }
1141
    }
1142

1143
    // if pInfo->pRes->info.rows == 0, also need to add the meta to pDataBlock
1144
    code = sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &pInfo->pCur->mr, dbname, tableName, &numOfRows,
272,562✔
1145
                                            dataBlock);
1146

1147
    if (code != TSDB_CODE_SUCCESS) {
273,163!
1148
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1149
      pAPI->metaReaderFn.clearReader(&smrSuperTable);
×
1150
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1151
      pInfo->pCur = NULL;
×
1152
      blockDataDestroy(dataBlock);
×
1153
      dataBlock = NULL;
×
1154
      T_LONG_JMP(pTaskInfo->env, terrno);
×
1155
    }
1156
    pAPI->metaReaderFn.clearReader(&smrSuperTable);
273,163✔
1157
  }
1158

1159
  if (numOfRows > 0) {
3,111✔
1160
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
2,320✔
1161
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
2,320✔
1162
    numOfRows = 0;
2,320✔
1163
  }
1164

1165
  blockDataDestroy(dataBlock);
3,111✔
1166
  dataBlock = NULL;
2,809✔
1167
  if (ret != 0) {
2,809✔
1168
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
2,401✔
1169
    pInfo->pCur = NULL;
2,401✔
1170
    setOperatorCompleted(pOperator);
2,401✔
1171
  }
1172

1173
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
2,809✔
1174

1175
_end:
2,809✔
1176
  if (code != TSDB_CODE_SUCCESS) {
2,809!
1177
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1178
    blockDataDestroy(dataBlock);
×
1179
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
1180
    pInfo->pCur = NULL;
×
1181
    pTaskInfo->code = code;
×
1182
    T_LONG_JMP(pTaskInfo->env, code);
×
1183
  }
1184
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
2,809✔
1185
}
1186

1187
void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock,
18,366✔
1188
                                        SFilterInfo* pFilterInfo, SExecTaskInfo* pTaskInfo) {
1189
  int32_t code = TSDB_CODE_SUCCESS;
18,366✔
1190
  int32_t lino = 0;
18,366✔
1191
  dataBlock->info.rows = numOfRows;
18,366✔
1192
  pInfo->pRes->info.rows = numOfRows;
18,366✔
1193

1194
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, dataBlock->pDataBlock, false);
18,366✔
1195
  QUERY_CHECK_CODE(code, lino, _end);
18,368!
1196

1197
  code = doFilter(pInfo->pRes, pFilterInfo, NULL);
18,368✔
1198
  QUERY_CHECK_CODE(code, lino, _end);
18,368!
1199

1200
  blockDataCleanup(dataBlock);
18,368✔
1201

1202
_end:
18,367✔
1203
  if (code != TSDB_CODE_SUCCESS) {
18,367!
1204
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1205
    pTaskInfo->code = code;
×
1206
    T_LONG_JMP(pTaskInfo->env, code);
×
1207
  }
1208
}
18,367✔
1209

1210
int32_t convertTagDataToStr(char* str, int32_t strBuffLen, int type, void* buf, int32_t bufSize, int32_t* len) {
4,977,832✔
1211
  int32_t n = 0;
4,977,832✔
1212

1213
  switch (type) {
4,977,832!
1214
    case TSDB_DATA_TYPE_NULL:
×
1215
      n = tsnprintf(str, strBuffLen, "null");
×
1216
      break;
×
1217

1218
    case TSDB_DATA_TYPE_BOOL:
3,894,202✔
1219
      n = tsnprintf(str, strBuffLen, (*(int8_t*)buf) ? "true" : "false");
3,894,202✔
1220
      break;
3,986,997✔
1221

1222
    case TSDB_DATA_TYPE_TINYINT:
10,320✔
1223
      n = tsnprintf(str, strBuffLen, "%d", *(int8_t*)buf);
10,320✔
1224
      break;
10,333✔
1225

1226
    case TSDB_DATA_TYPE_SMALLINT:
9,961✔
1227
      n = tsnprintf(str, strBuffLen, "%d", *(int16_t*)buf);
9,961✔
1228
      break;
9,974✔
1229

1230
    case TSDB_DATA_TYPE_INT:
259,057✔
1231
      n = tsnprintf(str, strBuffLen, "%d", *(int32_t*)buf);
259,057✔
1232
      break;
260,647✔
1233

1234
    case TSDB_DATA_TYPE_BIGINT:
257,568✔
1235
    case TSDB_DATA_TYPE_TIMESTAMP:
1236
      n = tsnprintf(str, strBuffLen, "%" PRId64, *(int64_t*)buf);
257,568✔
1237
      break;
261,369✔
1238

1239
    case TSDB_DATA_TYPE_FLOAT:
256,474✔
1240
      n = tsnprintf(str, strBuffLen, "%.5f", GET_FLOAT_VAL(buf));
256,474✔
1241
      break;
260,033✔
1242

1243
    case TSDB_DATA_TYPE_DOUBLE:
256,578✔
1244
      n = tsnprintf(str, strBuffLen, "%.9f", GET_DOUBLE_VAL(buf));
256,578✔
1245
      break;
260,364✔
1246

1247
    case TSDB_DATA_TYPE_BINARY:
9,243✔
1248
    case TSDB_DATA_TYPE_VARBINARY:
1249
    case TSDB_DATA_TYPE_GEOMETRY:
1250
      if (bufSize < 0) {
9,243!
1251
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1252
      }
1253

1254
      memcpy(str, buf, bufSize);
9,243✔
1255
      n = bufSize;
9,243✔
1256
      break;
9,243✔
1257
    case TSDB_DATA_TYPE_NCHAR:
9,099✔
1258
      if (bufSize < 0) {
9,099!
1259
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1260
      }
1261

1262
      int32_t length = taosUcs4ToMbs((TdUcs4*)buf, bufSize, str, NULL);
9,099✔
1263
      if (length <= 0) {
9,123!
1264
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1265
      }
1266
      n = length;
9,123✔
1267
      break;
9,123✔
1268
    case TSDB_DATA_TYPE_UTINYINT:
9,938✔
1269
      n = tsnprintf(str, strBuffLen, "%u", *(uint8_t*)buf);
9,938✔
1270
      break;
9,951✔
1271

1272
    case TSDB_DATA_TYPE_USMALLINT:
9,190✔
1273
      n = tsnprintf(str, strBuffLen, "%u", *(uint16_t*)buf);
9,190✔
1274
      break;
9,200✔
1275

1276
    case TSDB_DATA_TYPE_UINT:
10,652✔
1277
      n = tsnprintf(str, strBuffLen, "%u", *(uint32_t*)buf);
10,652✔
1278
      break;
10,675✔
1279

1280
    case TSDB_DATA_TYPE_UBIGINT:
9,294✔
1281
      n = tsnprintf(str, strBuffLen, "%" PRIu64, *(uint64_t*)buf);
9,294✔
1282
      break;
9,320✔
1283

1284
    default:
×
1285
      return TSDB_CODE_TSC_INVALID_VALUE;
×
1286
  }
1287

1288
  if (len) *len = n;
5,107,229✔
1289

1290
  return TSDB_CODE_SUCCESS;
5,107,229✔
1291
}
1292

1293
static int32_t sysTableGetGeomText(char* iGeom, int32_t nGeom, char** output, int32_t* nOutput) {
65✔
1294
#ifdef USE_GEOS
1295
  int32_t code = 0;
65✔
1296
  char*   outputWKT = NULL;
65✔
1297

1298
  if (nGeom == 0) {
65!
1299
    if (!(*output = taosStrdup(""))) code = terrno;
×
1300
    *nOutput = 0;
×
1301
    return code;
×
1302
  }
1303

1304
  if (TSDB_CODE_SUCCESS != (code = initCtxAsText()) ||
130!
1305
      TSDB_CODE_SUCCESS != (code = doAsText(iGeom, nGeom, &outputWKT))) {
65✔
1306
    qError("geo text for systable failed:%s", getGeosErrMsg(code));
×
1307
    *output = NULL;
×
1308
    *nOutput = 0;
×
1309
    return code;
×
1310
  }
1311

1312
  *output = outputWKT;
65✔
1313
  *nOutput = strlen(outputWKT);
65✔
1314

1315
  return code;
65✔
1316
#else
1317
  TAOS_RETURN(TSDB_CODE_OPS_NOT_SUPPORT);
1318
#endif
1319
}
1320

1321
static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable,
272,500✔
1322
                                                SMetaReader* smrChildTable, const char* dbname, const char* tableName,
1323
                                                int32_t* pNumOfRows, const SSDataBlock* dataBlock) {
1324
  int32_t code = TSDB_CODE_SUCCESS;
272,500✔
1325
  int32_t lino = 0;
272,500✔
1326
  char    stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
272,500✔
1327
  STR_TO_VARSTR(stableName, (*smrSuperTable).me.name);
272,500✔
1328

1329
  int32_t numOfRows = *pNumOfRows;
272,500✔
1330

1331
  int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols;
272,500✔
1332
  for (int32_t i = 0; i < numOfTags; ++i) {
5,345,127✔
1333
    SColumnInfoData* pColInfoData = NULL;
5,072,682✔
1334

1335
    // table name
1336
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
5,072,682✔
1337
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,059,246!
1338
    code = colDataSetVal(pColInfoData, numOfRows, tableName, false);
5,059,537✔
1339
    QUERY_CHECK_CODE(code, lino, _end);
5,022,251!
1340

1341
    // database name
1342
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
5,022,251✔
1343
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,007,436!
1344
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
5,007,436✔
1345
    QUERY_CHECK_CODE(code, lino, _end);
4,959,779!
1346

1347
    // super table name
1348
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
4,959,779✔
1349
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,947,770!
1350
    code = colDataSetVal(pColInfoData, numOfRows, stableName, false);
4,947,770✔
1351
    QUERY_CHECK_CODE(code, lino, _end);
4,912,082!
1352

1353
    // tag name
1354
    char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,912,082✔
1355
    STR_TO_VARSTR(tagName, (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].name);
4,912,082✔
1356
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
4,912,082✔
1357
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,908,625!
1358
    code = colDataSetVal(pColInfoData, numOfRows, tagName, false);
4,908,625✔
1359
    QUERY_CHECK_CODE(code, lino, _end);
4,884,402!
1360

1361
    // tag type
1362
    int8_t tagType = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].type;
4,884,402✔
1363

1364
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
4,884,402✔
1365
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
4,879,573!
1366
    int32_t tagStrBufflen = 32;
4,879,573✔
1367
    char    tagTypeStr[VARSTR_HEADER_SIZE + 32];
1368
    int     tagTypeLen = tsnprintf(varDataVal(tagTypeStr), tagStrBufflen, "%s", tDataTypes[tagType].name);
4,879,573✔
1369
    tagStrBufflen -= tagTypeLen;
5,073,650✔
1370
    if (tagStrBufflen <= 0) {
5,073,650!
1371
      code = TSDB_CODE_INVALID_PARA;
×
1372
      QUERY_CHECK_CODE(code, lino, _end);
×
1373
    }
1374

1375
    if (tagType == TSDB_DATA_TYPE_NCHAR) {
5,073,650✔
1376
      tagTypeLen += tsnprintf(
10,397✔
1377
          varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
10,411✔
1378
          (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
10,411✔
1379
    } else if (IS_VAR_DATA_TYPE(tagType)) {
5,063,239!
1380
      if (IS_STR_DATA_BLOB(tagType)) {
11,607!
1381
        code = TSDB_CODE_BLOB_NOT_SUPPORT_TAG;
×
1382
        QUERY_CHECK_CODE(code, lino, _end);
×
1383
      }
1384
      tagTypeLen += tsnprintf(varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
11,666✔
1385
                              (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE));
11,607✔
1386
    }
1387
    varDataSetLen(tagTypeStr, tagTypeLen);
5,073,695✔
1388
    code = colDataSetVal(pColInfoData, numOfRows, (char*)tagTypeStr, false);
5,073,695✔
1389
    QUERY_CHECK_CODE(code, lino, _end);
5,050,395!
1390

1391
    STagVal tagVal = {0};
5,050,395✔
1392
    tagVal.cid = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].colId;
5,050,395✔
1393
    char*    tagData = NULL;
5,050,395✔
1394
    uint32_t tagLen = 0;
5,050,395✔
1395

1396
    if (tagType == TSDB_DATA_TYPE_JSON) {
5,050,395✔
1397
      tagData = (char*)smrChildTable->me.ctbEntry.pTags;
191✔
1398
    } else {
1399
      bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal);
5,050,204✔
1400
      if (exist) {
4,967,290!
1401
        if (tagType == TSDB_DATA_TYPE_GEOMETRY) {
4,967,528✔
1402
          code = sysTableGetGeomText(tagVal.pData, tagVal.nData, &tagData, &tagLen);
65✔
1403
          QUERY_CHECK_CODE(code, lino, _end);
65!
1404
        } else if (tagType == TSDB_DATA_TYPE_VARBINARY) {
4,967,463✔
1405
          code = taosAscii2Hex(tagVal.pData, tagVal.nData, (void**)&tagData, &tagLen);
230✔
1406
          if (code < 0) {
230!
1407
            qError("varbinary for systable failed since %s", tstrerror(code));
×
1408
          }
1409
        } else if (IS_VAR_DATA_TYPE(tagType)) {
4,967,233!
1410
          tagData = (char*)tagVal.pData;
22,053✔
1411
          tagLen = tagVal.nData;
22,053✔
1412
        } else {
1413
          tagData = (char*)&tagVal.i64;
4,945,180✔
1414
          tagLen = tDataTypes[tagType].bytes;
4,945,180✔
1415
        }
1416
      }
1417
    }
1418

1419
    char* tagVarChar = NULL;
4,967,481✔
1420
    if (tagData != NULL) {
4,967,481✔
1421
      if (IS_STR_DATA_BLOB(tagType)) {
4,966,841!
1422
        code = TSDB_CODE_BLOB_NOT_SUPPORT_TAG;
×
1423
        goto _end;
×
1424
      }
1425

1426
      if (tagType == TSDB_DATA_TYPE_JSON) {
4,967,132✔
1427
        char* tagJson = NULL;
191✔
1428
        parseTagDatatoJson(tagData, &tagJson, NULL);
191✔
1429
        if (tagJson == NULL) {
191!
1430
          code = terrno;
×
1431
          goto _end;
×
1432
        }
1433
        tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE);
191!
1434
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
191!
1435
        memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson));
191✔
1436
        varDataSetLen(tagVarChar, strlen(tagJson));
191✔
1437
        taosMemoryFree(tagJson);
191!
1438
      } else {
1439
        int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE)
4,966,941!
1440
                                                    : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE);
1441
        tagVarChar = taosMemoryCalloc(1, bufSize + 1);
4,966,941✔
1442
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
4,985,504!
1443
        int32_t len = -1;
4,985,504✔
1444
        if (tagLen > 0)
4,985,504✔
1445
          convertTagDataToStr(varDataVal(tagVarChar), bufSize + 1 - VARSTR_HEADER_SIZE, tagType, tagData, tagLen, &len);
4,985,419✔
1446
        else
1447
          len = 0;
85✔
1448
        varDataSetLen(tagVarChar, len);
5,074,973✔
1449
      }
1450
    }
1451
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
5,075,804✔
1452
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,068,516✔
1453
    code = colDataSetVal(pColInfoData, numOfRows, tagVarChar,
5,066,473✔
1454
                         (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData)));
5,066,473!
1455
    QUERY_CHECK_CODE(code, lino, _end);
5,036,127!
1456

1457
    if (tagType == TSDB_DATA_TYPE_GEOMETRY || tagType == TSDB_DATA_TYPE_VARBINARY) taosMemoryFreeClear(tagData);
5,036,127!
1458
    taosMemoryFree(tagVarChar);
5,036,127!
1459
    ++numOfRows;
5,072,627✔
1460
  }
1461

1462
  *pNumOfRows = numOfRows;
272,445✔
1463

1464
_end:
272,154✔
1465
  if (code != TSDB_CODE_SUCCESS) {
272,154!
1466
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1467
  }
1468
  return code;
273,187✔
1469
}
1470

1471
static int32_t sysTableUserColsFillOneTableCols(const char* dbname, int32_t* pNumOfRows,
264,598✔
1472
                                                const SSDataBlock* dataBlock, char* tName, SSchemaWrapper* schemaRow,
1473
                                                SExtSchema* extSchemaRow, char* tableType, SColRefWrapper* colRef) {
1474
  int32_t code = TSDB_CODE_SUCCESS;
264,598✔
1475
  int32_t lino = 0;
264,598✔
1476
  if (schemaRow == NULL) {
264,598!
1477
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1478
    return TSDB_CODE_SUCCESS;
×
1479
  }
1480
  int32_t numOfRows = *pNumOfRows;
264,598✔
1481

1482
  int32_t numOfCols = schemaRow->nCols;
264,598✔
1483
  for (int32_t i = 0; i < numOfCols; ++i) {
6,111,145✔
1484
    SColumnInfoData* pColInfoData = NULL;
5,896,127✔
1485

1486
    // table name
1487
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
5,896,127✔
1488
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,890,926!
1489
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
5,890,926✔
1490
    QUERY_CHECK_CODE(code, lino, _end);
5,854,845!
1491

1492
    // database name
1493
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
5,854,845✔
1494
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,847,929!
1495
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
5,847,929✔
1496
    QUERY_CHECK_CODE(code, lino, _end);
5,832,998!
1497

1498
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
5,832,998✔
1499
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,826,322!
1500
    code = colDataSetVal(pColInfoData, numOfRows, tableType, false);
5,826,322✔
1501
    QUERY_CHECK_CODE(code, lino, _end);
5,796,381!
1502

1503
    // col name
1504
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
5,796,381✔
1505
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
5,796,381✔
1506
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
5,796,381✔
1507
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,859,955!
1508
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
5,859,955✔
1509
    QUERY_CHECK_CODE(code, lino, _end);
5,879,729!
1510

1511
    // col type
1512
    int8_t colType = schemaRow->pSchema[i].type;
5,879,729✔
1513
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
5,879,729✔
1514
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,877,277!
1515
    int32_t colStrBufflen = 32;
5,877,277✔
1516
    char    colTypeStr[VARSTR_HEADER_SIZE + 32];
1517
    int     colTypeLen = tsnprintf(varDataVal(colTypeStr), colStrBufflen, "%s", tDataTypes[colType].name);
5,877,277✔
1518
    colStrBufflen -= colTypeLen;
6,280,632✔
1519
    if (colStrBufflen <= 0) {
6,280,632!
1520
      code = TSDB_CODE_INVALID_PARA;
×
1521
      QUERY_CHECK_CODE(code, lino, _end);
×
1522
    }
1523
    if (colType == TSDB_DATA_TYPE_VARCHAR) {
6,280,632✔
1524
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
56,864✔
1525
                              (int32_t)(schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE));
56,864✔
1526
    } else if (colType == TSDB_DATA_TYPE_NCHAR) {
6,223,768✔
1527
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
3,294✔
1528
                              (int32_t)((schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
3,294✔
1529
    } else if (IS_DECIMAL_TYPE(colType)) {
6,220,474!
1530
      QUERY_CHECK_NULL(extSchemaRow, code, lino, _end, TSDB_CODE_INVALID_PARA);
×
1531
      STypeMod typeMod = extSchemaRow[i].typeMod;
×
1532
      uint8_t prec = 0, scale = 0;
×
1533
      decimalFromTypeMod(typeMod, &prec, &scale);
×
1534
      colTypeLen += sprintf(varDataVal(colTypeStr) + colTypeLen, "(%d,%d)", prec, scale);
×
1535
    }
1536
    varDataSetLen(colTypeStr, colTypeLen);
6,280,632✔
1537
    code = colDataSetVal(pColInfoData, numOfRows, (char*)colTypeStr, false);
6,280,632✔
1538
    QUERY_CHECK_CODE(code, lino, _end);
6,187,062!
1539

1540
    // col length
1541
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
6,187,062✔
1542
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
6,178,232!
1543
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].bytes, false);
6,178,232✔
1544
    QUERY_CHECK_CODE(code, lino, _end);
6,118,708!
1545

1546
    // col precision, col scale, col nullable
1547
    for (int32_t j = 6; j <= 8; ++j) {
23,171,596✔
1548
      pColInfoData = taosArrayGet(dataBlock->pDataBlock, j);
17,084,327✔
1549
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
17,058,904✔
1550
      colDataSetNULL(pColInfoData, numOfRows);
17,052,888✔
1551
    }
1552

1553
    // col data source
1554
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 9);
6,087,269✔
1555
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,792,616!
1556
    if (!colRef || !colRef->pColRef[i].hasRef) {
5,797,237✔
1557
      colDataSetNULL(pColInfoData, numOfRows);
5,795,916!
1558
    } else {
1559
      char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
1,321✔
1560
      char tmpColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
1,321✔
1561
      strcat(tmpColName, colRef->pColRef[i].refDbName);
1,321✔
1562
      strcat(tmpColName, ".");
1,321✔
1563
      strcat(tmpColName, colRef->pColRef[i].refTableName);
1,321✔
1564
      strcat(tmpColName, ".");
1,321✔
1565
      strcat(tmpColName, colRef->pColRef[i].refColName);
1,321✔
1566
      STR_TO_VARSTR(refColName, tmpColName);
1,321✔
1567

1568
      code = colDataSetVal(pColInfoData, numOfRows, (char*)refColName, false);
1,321✔
1569
      QUERY_CHECK_CODE(code, lino, _end);
1,321!
1570
    }
1571

1572
    // col id
1573
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 10);
5,797,237✔
1574
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
5,737,944!
1575
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].colId, false);
5,737,944✔
1576
    QUERY_CHECK_CODE(code, lino, _end);
5,846,547!
1577

1578
    ++numOfRows;
5,846,547✔
1579
  }
1580

1581
  *pNumOfRows = numOfRows;
215,018✔
1582

1583
_end:
215,018✔
1584
  if (code != TSDB_CODE_SUCCESS) {
215,018!
1585
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1586
  }
1587
  return code;
264,206✔
1588
}
1589

1590
static int32_t sysTableUserColsFillOneVirtualChildTableCols(const SSysTableScanInfo* pInfo, const char* dbname, int32_t* pNumOfRows,
124✔
1591
                                                            const SSDataBlock* dataBlock, char* tName, char* stName,
1592
                                                            SSchemaWrapper* schemaRow, char* tableType, SColRefWrapper *colRef,
1593
                                                            tb_uid_t uid, int32_t vgId) {
1594
  int32_t code = TSDB_CODE_SUCCESS;
124✔
1595
  int32_t lino = 0;
124✔
1596
  if (schemaRow == NULL) {
124!
1597
    qError("sysTableUserColsFillOneTableCols schemaRow is NULL");
×
1598
    return TSDB_CODE_SUCCESS;
×
1599
  }
1600
  int32_t numOfRows = *pNumOfRows;
124✔
1601

1602
  int32_t numOfCols = schemaRow->nCols;
124✔
1603
  for (int32_t i = 0; i < numOfCols; ++i) {
842✔
1604
    SColumnInfoData* pColInfoData = NULL;
718✔
1605

1606
    // table name
1607
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
718✔
1608
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1609
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
718✔
1610
    QUERY_CHECK_CODE(code, lino, _end);
718!
1611

1612
    // stable name
1613
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
718✔
1614
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1615
    code = colDataSetVal(pColInfoData, numOfRows, stName, false);
718✔
1616
    QUERY_CHECK_CODE(code, lino, _end);
718!
1617

1618
    // database name
1619
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
718✔
1620
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1621
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
718✔
1622
    QUERY_CHECK_CODE(code, lino, _end);
718!
1623

1624
    // col name
1625
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
718✔
1626
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
718✔
1627
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
718✔
1628
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1629
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
718✔
1630
    QUERY_CHECK_CODE(code, lino, _end);
718!
1631

1632
    // uid
1633
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
718✔
1634
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1635
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&uid, false);
718✔
1636
    QUERY_CHECK_CODE(code, lino, _end);
718!
1637

1638

1639
    // col data source
1640
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
718✔
1641
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1642
    if (!colRef || !colRef->pColRef[i].hasRef) {
718!
1643
      colDataSetNULL(pColInfoData, numOfRows);
307!
1644
    } else {
1645
      code = colDataSetVal(pColInfoData, numOfRows, (char *)&colRef->pColRef[i].id, false);
411✔
1646
      QUERY_CHECK_CODE(code, lino, _end);
411!
1647
    }
1648

1649
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 6);
718✔
1650
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1651
    if (!colRef || !colRef->pColRef[i].hasRef) {
718!
1652
      colDataSetNULL(pColInfoData, numOfRows);
307!
1653
    } else {
1654
      char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
411✔
1655
      char tmpColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
411✔
1656
      strcat(tmpColName, colRef->pColRef[i].refDbName);
411✔
1657
      strcat(tmpColName, ".");
411✔
1658
      strcat(tmpColName, colRef->pColRef[i].refTableName);
411✔
1659
      strcat(tmpColName, ".");
411✔
1660
      strcat(tmpColName, colRef->pColRef[i].refColName);
411✔
1661
      STR_TO_VARSTR(refColName, tmpColName);
411✔
1662

1663
      code = colDataSetVal(pColInfoData, numOfRows, (char *)refColName, false);
411✔
1664
      QUERY_CHECK_CODE(code, lino, _end);
411!
1665
    }
1666

1667
    // vgid
1668
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 7);
718✔
1669
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
718!
1670
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
718✔
1671
    QUERY_CHECK_CODE(code, lino, _end);
718!
1672

1673
    ++numOfRows;
718✔
1674
  }
1675

1676
  *pNumOfRows = numOfRows;
124✔
1677

1678
_end:
124✔
1679
  if (code != TSDB_CODE_SUCCESS) {
124!
1680
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1681
  }
1682
  return code;
124✔
1683
}
1684

1685

1686
static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName) {
21,108✔
1687
  size_t               size = 0;
21,108✔
1688
  const SSysTableMeta* pMeta = NULL;
21,108✔
1689
  getInfosDbMeta(&pMeta, &size);
21,108✔
1690

1691
  int32_t index = 0;
21,157✔
1692
  for (int32_t i = 0; i < size; ++i) {
266,038✔
1693
    if (strcmp(pMeta[i].name, tableName) == 0) {
266,036✔
1694
      index = i;
21,155✔
1695
      break;
21,155✔
1696
    }
1697
  }
1698

1699
  SSDataBlock* pBlock = NULL;
21,157✔
1700
  int32_t      code = createDataBlock(&pBlock);
21,157✔
1701
  if (code) {
21,154!
1702
    terrno = code;
×
1703
    return NULL;
×
1704
  }
1705

1706
  for (int32_t i = 0; i < pMeta[index].colNum; ++i) {
235,529✔
1707
    SColumnInfoData colInfoData =
1708
        createColumnInfoData(pMeta[index].schema[i].type, pMeta[index].schema[i].bytes, i + 1);
214,341✔
1709
    code = blockDataAppendColInfo(pBlock, &colInfoData);
214,414✔
1710
    if (code != TSDB_CODE_SUCCESS) {
214,374!
1711
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
1712
      blockDataDestroy(pBlock);
×
1713
      pBlock = NULL;
×
1714
      terrno = code;
×
1715
      break;
×
1716
    }
1717
  }
1718

1719
  return pBlock;
21,159✔
1720
}
1721

1722
int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const SSysTableMeta* pSysDbTableMeta, size_t size,
638✔
1723
                              const char* dbName, int64_t* pRows) {
1724
  int32_t code = TSDB_CODE_SUCCESS;
638✔
1725
  int32_t lino = 0;
638✔
1726
  char    n[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
638✔
1727
  int32_t numOfRows = p->info.rows;
638✔
1728

1729
  for (int32_t i = 0; i < size; ++i) {
15,631✔
1730
    const SSysTableMeta* pm = &pSysDbTableMeta[i];
14,993✔
1731
    if (!sysInfo && pm->sysInfo) {
14,993✔
1732
      continue;
84✔
1733
    }
1734

1735
    if (strcmp(pm->name, TSDB_INS_TABLE_USERS_FULL) == 0) {
14,909✔
1736
      continue;
315✔
1737
    }
1738

1739
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
14,594✔
1740
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
14,594!
1741

1742
    STR_TO_VARSTR(n, pm->name);
14,594✔
1743
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
14,594✔
1744
    QUERY_CHECK_CODE(code, lino, _end);
14,594!
1745

1746
    // database name
1747
    STR_TO_VARSTR(n, dbName);
14,594✔
1748
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
14,594✔
1749
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
14,594!
1750
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
14,594✔
1751
    QUERY_CHECK_CODE(code, lino, _end);
14,594!
1752

1753
    // create time
1754
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
14,594✔
1755
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
14,594!
1756
    colDataSetNULL(pColInfoData, numOfRows);
14,594!
1757

1758
    // number of columns
1759
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
14,594✔
1760
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
14,594!
1761
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&pm->colNum, false);
14,594✔
1762
    QUERY_CHECK_CODE(code, lino, _end);
14,594!
1763

1764
    for (int32_t j = 4; j <= 8; ++j) {
87,564✔
1765
      pColInfoData = taosArrayGet(p->pDataBlock, j);
72,970✔
1766
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
72,970!
1767
      colDataSetNULL(pColInfoData, numOfRows);
72,970✔
1768
    }
1769

1770
    STR_TO_VARSTR(n, "SYSTEM_TABLE");
14,594✔
1771

1772
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
14,594✔
1773
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
14,594!
1774
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
14,594✔
1775
    QUERY_CHECK_CODE(code, lino, _end);
14,594!
1776

1777
    numOfRows += 1;
14,594✔
1778
  }
1779

1780
  *pRows = numOfRows;
638✔
1781

1782
_end:
638✔
1783
  if (code != TSDB_CODE_SUCCESS) {
638!
1784
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1785
  }
1786
  return code;
638✔
1787
}
1788

1789
int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
319✔
1790
  int32_t      code = TSDB_CODE_SUCCESS;
319✔
1791
  int32_t      lino = 0;
319✔
1792
  SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
319✔
1793
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
319!
1794

1795
  code = blockDataEnsureCapacity(p, capacity);
319✔
1796
  QUERY_CHECK_CODE(code, lino, _end);
319!
1797

1798
  size_t               size = 0;
319✔
1799
  const SSysTableMeta* pSysDbTableMeta = NULL;
319✔
1800

1801
  getInfosDbMeta(&pSysDbTableMeta, &size);
319✔
1802
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_INFORMATION_SCHEMA_DB, &p->info.rows);
319✔
1803
  QUERY_CHECK_CODE(code, lino, _end);
319!
1804

1805
  getPerfDbMeta(&pSysDbTableMeta, &size);
319✔
1806
  code = buildDbTableInfoBlock(pInfo->sysInfo, p, pSysDbTableMeta, size, TSDB_PERFORMANCE_SCHEMA_DB, &p->info.rows);
319✔
1807
  QUERY_CHECK_CODE(code, lino, _end);
319!
1808

1809
  pInfo->pRes->info.rows = p->info.rows;
319✔
1810
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
319✔
1811
  QUERY_CHECK_CODE(code, lino, _end);
319!
1812

1813
  blockDataDestroy(p);
319✔
1814
  p = NULL;
319✔
1815

1816
_end:
319✔
1817
  if (code != TSDB_CODE_SUCCESS) {
319!
1818
    blockDataDestroy(p);
×
1819
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
1820
  }
1821
  return code;
319✔
1822
}
1823

1824
static int32_t doSetUserTableMetaInfo(SStoreMetaReader* pMetaReaderFn, SStoreMeta* pMetaFn, void* pVnode,
40,000✔
1825
                                      SMetaReader* pMReader, int64_t uid, const char* dbname, int32_t vgId,
1826
                                      SSDataBlock* p, int32_t rowIndex, const char* idStr) {
1827
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
40,000✔
1828
  int32_t lino = 0;
40,000✔
1829
  int32_t code = pMetaReaderFn->getTableEntryByUid(pMReader, uid);
40,000✔
1830
  if (code < 0) {
39,938!
1831
    qError("failed to get table meta, uid:%" PRId64 ", code:%s, %s", uid, tstrerror(terrno), idStr);
×
1832
    return code;
×
1833
  }
1834

1835
  STR_TO_VARSTR(n, pMReader->me.name);
39,938✔
1836

1837
  // table name
1838
  SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
39,938✔
1839
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,937!
1840

1841
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
39,937✔
1842
  QUERY_CHECK_CODE(code, lino, _end);
39,933!
1843

1844
  // database name
1845
  pColInfoData = taosArrayGet(p->pDataBlock, 1);
39,933✔
1846
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,932!
1847
  code = colDataSetVal(pColInfoData, rowIndex, dbname, false);
39,932✔
1848
  QUERY_CHECK_CODE(code, lino, _end);
39,926!
1849

1850
  // vgId
1851
  pColInfoData = taosArrayGet(p->pDataBlock, 6);
39,926✔
1852
  QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,923!
1853
  code = colDataSetVal(pColInfoData, rowIndex, (char*)&vgId, false);
39,923✔
1854
  QUERY_CHECK_CODE(code, lino, _end);
39,922!
1855

1856
  int32_t tableType = pMReader->me.type;
39,922✔
1857
  if (tableType == TSDB_CHILD_TABLE) {
39,922!
1858
    // create time
1859
    int64_t ts = pMReader->me.ctbEntry.btime;
39,922✔
1860
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
39,922✔
1861
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,917!
1862
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
39,917✔
1863
    QUERY_CHECK_CODE(code, lino, _end);
39,922!
1864

1865
    SMetaReader mr1 = {0};
39,922✔
1866
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
39,922✔
1867

1868
    int64_t suid = pMReader->me.ctbEntry.suid;
39,966✔
1869
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
39,966✔
1870
    if (code != TSDB_CODE_SUCCESS) {
39,885!
1871
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
1872
             tstrerror(code), idStr);
1873
      pMetaReaderFn->clearReader(&mr1);
×
1874
      QUERY_CHECK_CODE(code, lino, _end);
×
1875
    }
1876

1877
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
39,885✔
1878
    if (pColInfoData == NULL) {
39,883!
1879
      pMetaReaderFn->clearReader(&mr1);
×
1880
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1881
    }
1882

1883
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
39,883✔
1884
    if (code != 0) {
39,879!
1885
      pMetaReaderFn->clearReader(&mr1);
×
1886
      QUERY_CHECK_CODE(code, lino, _end);
×
1887
    }
1888

1889
    // super table name
1890
    STR_TO_VARSTR(n, mr1.me.name);
39,879✔
1891
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
39,879✔
1892
    if (pColInfoData == NULL) {
39,873!
1893
      pMetaReaderFn->clearReader(&mr1);
×
1894
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1895
    }
1896

1897
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
39,873✔
1898
    pMetaReaderFn->clearReader(&mr1);
39,873✔
1899
    QUERY_CHECK_CODE(code, lino, _end);
39,994!
1900

1901
    // table comment
1902
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
39,994✔
1903
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,976!
1904
    if (pMReader->me.ctbEntry.commentLen > 0) {
39,976!
1905
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1906
      STR_TO_VARSTR(comment, pMReader->me.ctbEntry.comment);
×
1907
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1908
      QUERY_CHECK_CODE(code, lino, _end);
×
1909
    } else if (pMReader->me.ctbEntry.commentLen == 0) {
39,976!
1910
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1911
      STR_TO_VARSTR(comment, "");
×
1912
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1913
      QUERY_CHECK_CODE(code, lino, _end);
×
1914
    } else {
1915
      colDataSetNULL(pColInfoData, rowIndex);
39,976!
1916
    }
1917

1918
    // uid
1919
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
39,976✔
1920
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,953!
1921
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
39,953✔
1922
    QUERY_CHECK_CODE(code, lino, _end);
39,940!
1923

1924
    // ttl
1925
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
39,940✔
1926
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,939!
1927
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ctbEntry.ttlDays, false);
39,939✔
1928
    QUERY_CHECK_CODE(code, lino, _end);
39,936!
1929

1930
    STR_TO_VARSTR(n, "CHILD_TABLE");
39,936✔
1931

1932
  } else if (tableType == TSDB_NORMAL_TABLE) {
×
1933
    // create time
1934
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1935
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1936
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1937
    QUERY_CHECK_CODE(code, lino, _end);
×
1938

1939
    // number of columns
1940
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1941
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1942

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

1946
    // super table name
1947
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1948
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1949
    colDataSetNULL(pColInfoData, rowIndex);
×
1950

1951
    // table comment
1952
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
1953
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1954
    if (pMReader->me.ntbEntry.commentLen > 0) {
×
1955
      char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1956
      STR_TO_VARSTR(comment, pMReader->me.ntbEntry.comment);
×
1957
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1958
      QUERY_CHECK_CODE(code, lino, _end);
×
1959
    } else if (pMReader->me.ntbEntry.commentLen == 0) {
×
1960
      char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1961
      STR_TO_VARSTR(comment, "");
×
1962
      code = colDataSetVal(pColInfoData, rowIndex, comment, false);
×
1963
      QUERY_CHECK_CODE(code, lino, _end);
×
1964
    } else {
1965
      colDataSetNULL(pColInfoData, rowIndex);
×
1966
    }
1967

1968
    // uid
1969
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
1970
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1971
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
1972
    QUERY_CHECK_CODE(code, lino, _end);
×
1973

1974
    // ttl
1975
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
1976
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1977
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.ttlDays, false);
×
1978
    QUERY_CHECK_CODE(code, lino, _end);
×
1979

1980
    STR_TO_VARSTR(n, "NORMAL_TABLE");
×
1981
    // impl later
1982
  } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
×
1983
    // create time
1984
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
1985
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1986
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.ntbEntry.btime, false);
×
1987
    QUERY_CHECK_CODE(code, lino, _end);
×
1988

1989
    // number of columns
1990
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
1991
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1992

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

1996
    // super table name
1997
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
1998
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1999
    colDataSetNULL(pColInfoData, rowIndex);
×
2000

2001
    // table comment
2002
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
2003
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2004
    colDataSetNULL(pColInfoData, rowIndex);
×
2005

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

2012
    // ttl
2013
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
2014
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2015
    colDataSetNULL(pColInfoData, rowIndex);
×
2016

2017
    STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
×
2018
    // impl later
2019
  } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
×
2020
    // create time
2021
    int64_t ts = pMReader->me.ctbEntry.btime;
×
2022
    pColInfoData = taosArrayGet(p->pDataBlock, 2);
×
2023
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2024
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&ts, false);
×
2025
    QUERY_CHECK_CODE(code, lino, _end);
×
2026

2027
    SMetaReader mr1 = {0};
×
2028
    pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn);
×
2029

2030
    int64_t suid = pMReader->me.ctbEntry.suid;
×
2031
    code = pMetaReaderFn->getTableEntryByUid(&mr1, suid);
×
2032
    if (code != TSDB_CODE_SUCCESS) {
×
2033
      qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pMReader->me.name, suid,
×
2034
             tstrerror(code), idStr);
2035
      pMetaReaderFn->clearReader(&mr1);
×
2036
      QUERY_CHECK_CODE(code, lino, _end);
×
2037
    }
2038

2039
    pColInfoData = taosArrayGet(p->pDataBlock, 3);
×
2040
    if (pColInfoData == NULL) {
×
2041
      pMetaReaderFn->clearReader(&mr1);
×
2042
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2043
    }
2044

2045
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&mr1.me.stbEntry.schemaRow.nCols, false);
×
2046
    if (code != 0) {
×
2047
      pMetaReaderFn->clearReader(&mr1);
×
2048
      QUERY_CHECK_CODE(code, lino, _end);
×
2049
    }
2050

2051
    // super table name
2052
    STR_TO_VARSTR(n, mr1.me.name);
×
2053
    pColInfoData = taosArrayGet(p->pDataBlock, 4);
×
2054
    if (pColInfoData == NULL) {
×
2055
      pMetaReaderFn->clearReader(&mr1);
×
2056
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2057
    }
2058

2059
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
×
2060
    pMetaReaderFn->clearReader(&mr1);
×
2061
    QUERY_CHECK_CODE(code, lino, _end);
×
2062

2063
    // table comment
2064
    pColInfoData = taosArrayGet(p->pDataBlock, 8);
×
2065
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2066
    colDataSetNULL(pColInfoData, rowIndex);
×
2067

2068
    // uid
2069
    pColInfoData = taosArrayGet(p->pDataBlock, 5);
×
2070
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2071
    code = colDataSetVal(pColInfoData, rowIndex, (char*)&pMReader->me.uid, false);
×
2072
    QUERY_CHECK_CODE(code, lino, _end);
×
2073

2074
    // ttl
2075
    pColInfoData = taosArrayGet(p->pDataBlock, 7);
×
2076
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2077
    colDataSetNULL(pColInfoData, rowIndex);
×
2078

2079
    STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
×
2080
  }
2081

2082
_end:
×
2083
  qError("%s failed at line %d since %s, %s", __func__, lino, tstrerror(code), idStr);
39,936!
2084
  return code;
40,000✔
2085
}
2086

2087
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
14✔
2088
  int32_t            code = TSDB_CODE_SUCCESS;
14✔
2089
  int32_t            lino = 0;
14✔
2090
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
14✔
2091
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
14✔
2092
  SSysTableScanInfo* pInfo = pOperator->info;
14✔
2093
  SSysTableIndex*    pIdx = pInfo->pIdx;
14✔
2094
  SSDataBlock*       p = NULL;
14✔
2095
  blockDataCleanup(pInfo->pRes);
14✔
2096
  int32_t numOfRows = 0;
14✔
2097

2098
  int ret = 0;
14✔
2099

2100
  const char* db = NULL;
14✔
2101
  int32_t     vgId = 0;
14✔
2102
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
14✔
2103

2104
  SName sn = {0};
14✔
2105
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
14✔
2106
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
14✔
2107
  QUERY_CHECK_CODE(code, lino, _end);
14!
2108

2109
  code = tNameGetDbName(&sn, varDataVal(dbname));
14✔
2110
  QUERY_CHECK_CODE(code, lino, _end);
14!
2111

2112
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
14✔
2113

2114
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
14✔
2115
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
14!
2116

2117
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
14✔
2118
  QUERY_CHECK_CODE(code, lino, _end);
14!
2119

2120
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
14✔
2121
  int32_t i = pIdx->lastIdx;
14✔
2122
  for (; i < taosArrayGetSize(pIdx->uids); i++) {
40,004✔
2123
    tb_uid_t* uid = taosArrayGet(pIdx->uids, i);
39,998✔
2124
    QUERY_CHECK_NULL(uid, code, lino, _end, terrno);
39,999!
2125

2126
    SMetaReader mr = {0};
39,999✔
2127
    pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_LOCK, &pAPI->metaFn);
39,999✔
2128

2129
    code = doSetUserTableMetaInfo(&pAPI->metaReaderFn, &pAPI->metaFn, pInfo->readHandle.vnode, &mr, *uid, dbname, vgId,
40,000✔
2130
                                  p, numOfRows, GET_TASKID(pTaskInfo));
40,000✔
2131

2132
    pAPI->metaReaderFn.clearReader(&mr);
40,000✔
2133
    QUERY_CHECK_CODE(code, lino, _end);
39,998!
2134

2135
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 9);
39,998✔
2136
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
39,998!
2137

2138
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
39,998✔
2139
    QUERY_CHECK_CODE(code, lino, _end);
39,998!
2140

2141
    if (++numOfRows >= pOperator->resultInfo.capacity) {
39,998✔
2142
      p->info.rows = numOfRows;
8✔
2143
      pInfo->pRes->info.rows = numOfRows;
8✔
2144

2145
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
8✔
2146
      QUERY_CHECK_CODE(code, lino, _end);
8!
2147

2148
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
8✔
2149
      QUERY_CHECK_CODE(code, lino, _end);
8!
2150

2151
      blockDataCleanup(p);
8✔
2152
      numOfRows = 0;
8✔
2153

2154
      if (pInfo->pRes->info.rows > 0) {
8!
2155
        break;
8✔
2156
      }
2157
    }
2158
  }
2159

2160
  if (numOfRows > 0) {
14✔
2161
    p->info.rows = numOfRows;
6✔
2162
    pInfo->pRes->info.rows = numOfRows;
6✔
2163

2164
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
6✔
2165
    QUERY_CHECK_CODE(code, lino, _end);
6!
2166

2167
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
6✔
2168
    QUERY_CHECK_CODE(code, lino, _end);
6!
2169

2170
    blockDataCleanup(p);
6✔
2171
    numOfRows = 0;
6✔
2172
  }
2173

2174
  if (i >= taosArrayGetSize(pIdx->uids)) {
14✔
2175
    setOperatorCompleted(pOperator);
6✔
2176
  } else {
2177
    pIdx->lastIdx = i + 1;
8✔
2178
  }
2179

2180
  blockDataDestroy(p);
14✔
2181
  p = NULL;
14✔
2182

2183
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
14✔
2184

2185
_end:
14✔
2186
  if (code != TSDB_CODE_SUCCESS) {
14!
2187
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2188
    blockDataDestroy(p);
×
2189
    pTaskInfo->code = code;
×
2190
    T_LONG_JMP(pTaskInfo->env, code);
×
2191
  }
2192
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
14!
2193
}
2194

2195
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
3,633✔
2196
  int32_t        code = TSDB_CODE_SUCCESS;
3,633✔
2197
  int32_t        lino = 0;
3,633✔
2198
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
3,633✔
2199
  SStorageAPI*   pAPI = &pTaskInfo->storageAPI;
3,633✔
2200
  int8_t         firstMetaCursor = 0;
3,633✔
2201
  SSDataBlock*   p = NULL;
3,633✔
2202

2203
  SSysTableScanInfo* pInfo = pOperator->info;
3,633✔
2204
  if (pInfo->pCur == NULL) {
3,633!
2205
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
3,665✔
2206
    QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno);
3,658!
2207
    firstMetaCursor = 1;
3,661✔
2208
  }
2209
  if (!firstMetaCursor) {
3,629!
2210
    code = pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1);
×
2211
    if (code != 0) {
×
2212
      pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2213
      pInfo->pCur = NULL;
×
2214
      QUERY_CHECK_CODE(code, lino, _end);
×
2215
    }
2216
  }
2217

2218
  blockDataCleanup(pInfo->pRes);
3,629✔
2219
  int32_t numOfRows = 0;
3,658✔
2220

2221
  const char* db = NULL;
3,658✔
2222
  int32_t     vgId = 0;
3,658✔
2223
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
3,658✔
2224

2225
  SName sn = {0};
3,659✔
2226
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
3,659✔
2227
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
3,659✔
2228
  QUERY_CHECK_CODE(code, lino, _end);
3,661!
2229

2230
  code = tNameGetDbName(&sn, varDataVal(dbname));
3,661✔
2231
  QUERY_CHECK_CODE(code, lino, _end);
3,656!
2232

2233
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
3,656✔
2234

2235
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
3,656✔
2236
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
3,658!
2237

2238
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
3,658✔
2239
  QUERY_CHECK_CODE(code, lino, _end);
3,665!
2240

2241
  char n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
3,665✔
2242

2243
  int32_t ret = 0;
3,665✔
2244
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
87,098✔
2245
    STR_TO_VARSTR(n, pInfo->pCur->mr.me.name);
83,347✔
2246

2247
    // table name
2248
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
83,347✔
2249
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
83,334!
2250
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
83,334✔
2251
    QUERY_CHECK_CODE(code, lino, _end);
83,404!
2252

2253
    // database name
2254
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
83,404✔
2255
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
83,408!
2256
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
83,408✔
2257
    QUERY_CHECK_CODE(code, lino, _end);
83,422!
2258

2259
    // vgId
2260
    pColInfoData = taosArrayGet(p->pDataBlock, 6);
83,422✔
2261
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
83,415!
2262
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
83,415✔
2263
    QUERY_CHECK_CODE(code, lino, _end);
83,420!
2264

2265
    int32_t tableType = pInfo->pCur->mr.me.type;
83,420✔
2266
    if (tableType == TSDB_CHILD_TABLE) {
83,420✔
2267
      // create time
2268
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
58,155✔
2269
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
58,155✔
2270
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,154!
2271
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
58,154✔
2272
      QUERY_CHECK_CODE(code, lino, _end);
58,159!
2273

2274
      SMetaReader mr = {0};
58,159✔
2275
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
58,159✔
2276

2277
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
58,179✔
2278
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
58,179✔
2279
      if (code != TSDB_CODE_SUCCESS) {
58,156!
2280
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
2281
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
2282
        pAPI->metaReaderFn.clearReader(&mr);
×
2283
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2284
        pInfo->pCur = NULL;
×
2285
        blockDataDestroy(p);
×
2286
        T_LONG_JMP(pTaskInfo->env, terrno);
×
2287
      }
2288

2289
      if (isTsmaResSTb(mr.me.name)) {
58,156!
2290
        pAPI->metaReaderFn.clearReader(&mr);
×
2291
        continue;
×
2292
      }
2293

2294
      // number of columns
2295
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
58,154✔
2296
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,153!
2297
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
58,153✔
2298
      QUERY_CHECK_CODE(code, lino, _end);
58,169!
2299

2300
      // super table name
2301
      STR_TO_VARSTR(n, mr.me.name);
58,169✔
2302
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
58,169✔
2303
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,165!
2304
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
58,165✔
2305
      QUERY_CHECK_CODE(code, lino, _end);
58,173!
2306
      pAPI->metaReaderFn.clearReader(&mr);
58,173✔
2307

2308
      // table comment
2309
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
58,199✔
2310
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,192!
2311
      if (pInfo->pCur->mr.me.ctbEntry.commentLen > 0) {
58,192✔
2312
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
109✔
2313
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ctbEntry.comment);
109✔
2314
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
109✔
2315
        QUERY_CHECK_CODE(code, lino, _end);
109!
2316
      } else if (pInfo->pCur->mr.me.ctbEntry.commentLen == 0) {
58,083✔
2317
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
129✔
2318
        STR_TO_VARSTR(comment, "");
129✔
2319
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
129✔
2320
        QUERY_CHECK_CODE(code, lino, _end);
129!
2321
      } else {
2322
        colDataSetNULL(pColInfoData, numOfRows);
57,954!
2323
      }
2324

2325
      // uid
2326
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
58,192✔
2327
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,176!
2328
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
58,176✔
2329
      QUERY_CHECK_CODE(code, lino, _end);
58,188!
2330

2331
      // ttl
2332
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
58,188✔
2333
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
58,183!
2334
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ctbEntry.ttlDays, false);
58,183✔
2335
      QUERY_CHECK_CODE(code, lino, _end);
58,182!
2336

2337
      STR_TO_VARSTR(n, "CHILD_TABLE");
58,182✔
2338
    } else if (tableType == TSDB_NORMAL_TABLE) {
25,265✔
2339
      // create time
2340
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
22,948✔
2341
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,949!
2342
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
22,949✔
2343
      QUERY_CHECK_CODE(code, lino, _end);
22,950!
2344

2345
      // number of columns
2346
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
22,950✔
2347
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,950!
2348
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
22,950✔
2349
      QUERY_CHECK_CODE(code, lino, _end);
22,948!
2350

2351
      // super table name
2352
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
22,948✔
2353
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,948✔
2354
      colDataSetNULL(pColInfoData, numOfRows);
22,946!
2355

2356
      // table comment
2357
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
22,946✔
2358
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,943!
2359
      if (pInfo->pCur->mr.me.ntbEntry.commentLen > 0) {
22,944✔
2360
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
96✔
2361
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ntbEntry.comment);
96✔
2362
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
96✔
2363
        QUERY_CHECK_CODE(code, lino, _end);
96!
2364
      } else if (pInfo->pCur->mr.me.ntbEntry.commentLen == 0) {
22,848✔
2365
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
322✔
2366
        STR_TO_VARSTR(comment, "");
322✔
2367
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
322✔
2368
        QUERY_CHECK_CODE(code, lino, _end);
322!
2369
      } else {
2370
        colDataSetNULL(pColInfoData, numOfRows);
22,526!
2371
      }
2372

2373
      // uid
2374
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
22,944✔
2375
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,940!
2376
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
22,940✔
2377
      QUERY_CHECK_CODE(code, lino, _end);
22,945!
2378

2379
      // ttl
2380
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
22,945✔
2381
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
22,943!
2382
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.ttlDays, false);
22,943✔
2383
      QUERY_CHECK_CODE(code, lino, _end);
22,942!
2384

2385
      STR_TO_VARSTR(n, "NORMAL_TABLE");
22,942✔
2386
    } else if (tableType == TSDB_VIRTUAL_NORMAL_TABLE) {
2,317✔
2387
      // create time
2388
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
839✔
2389
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
839!
2390
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.btime, false);
839✔
2391
      QUERY_CHECK_CODE(code, lino, _end);
839!
2392

2393
      // number of columns
2394
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
839✔
2395
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
840!
2396
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.ntbEntry.schemaRow.nCols, false);
840✔
2397
      QUERY_CHECK_CODE(code, lino, _end);
840!
2398

2399
      // super table name
2400
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
840✔
2401
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
840!
2402
      colDataSetNULL(pColInfoData, numOfRows);
840!
2403

2404
      // table comment
2405
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
840✔
2406
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
839!
2407
      colDataSetNULL(pColInfoData, numOfRows);
839!
2408

2409
      // uid
2410
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
839✔
2411
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
839!
2412
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
839✔
2413
      QUERY_CHECK_CODE(code, lino, _end);
839!
2414

2415
      // ttl
2416
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
839✔
2417
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
839!
2418
      colDataSetNULL(pColInfoData, numOfRows);
839!
2419

2420
      STR_TO_VARSTR(n, "VIRTUAL_NORMAL_TABLE");
839✔
2421
    } else if (tableType == TSDB_VIRTUAL_CHILD_TABLE) {
1,478!
2422
      // create time
2423
      int64_t ts = pInfo->pCur->mr.me.ctbEntry.btime;
1,488✔
2424
      pColInfoData = taosArrayGet(p->pDataBlock, 2);
1,488✔
2425
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,488!
2426
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&ts, false);
1,488✔
2427
      QUERY_CHECK_CODE(code, lino, _end);
1,488!
2428

2429
      SMetaReader mr = {0};
1,488✔
2430
      pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn);
1,488✔
2431

2432
      uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid;
1,488✔
2433
      code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid);
1,488✔
2434
      if (code != TSDB_CODE_SUCCESS) {
1,487!
2435
        qError("failed to get super table meta, cname:%s, suid:0x%" PRIx64 ", code:%s, %s", pInfo->pCur->mr.me.name,
×
2436
               suid, tstrerror(terrno), GET_TASKID(pTaskInfo));
2437
        pAPI->metaReaderFn.clearReader(&mr);
×
2438
        pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2439
        pInfo->pCur = NULL;
×
2440
        blockDataDestroy(p);
×
2441
        T_LONG_JMP(pTaskInfo->env, terrno);
×
2442
      }
2443

2444
      if (isTsmaResSTb(mr.me.name)) {
1,487!
2445
        pAPI->metaReaderFn.clearReader(&mr);
×
2446
        continue;
×
2447
      }
2448

2449
      // number of columns
2450
      pColInfoData = taosArrayGet(p->pDataBlock, 3);
1,487✔
2451
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,487!
2452
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&mr.me.stbEntry.schemaRow.nCols, false);
1,487✔
2453
      QUERY_CHECK_CODE(code, lino, _end);
1,487!
2454

2455
      // super table name
2456
      STR_TO_VARSTR(n, mr.me.name);
1,487✔
2457
      pColInfoData = taosArrayGet(p->pDataBlock, 4);
1,487✔
2458
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,487!
2459
      code = colDataSetVal(pColInfoData, numOfRows, n, false);
1,487✔
2460
      QUERY_CHECK_CODE(code, lino, _end);
1,486!
2461
      pAPI->metaReaderFn.clearReader(&mr);
1,486✔
2462

2463
      // table comment
2464
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
1,488✔
2465
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,488!
2466
      colDataSetNULL(pColInfoData, numOfRows);
1,488!
2467

2468
      // uid
2469
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
1,488✔
2470
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,488!
2471
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
1,488✔
2472
      QUERY_CHECK_CODE(code, lino, _end);
1,488!
2473

2474
      // ttl
2475
      pColInfoData = taosArrayGet(p->pDataBlock, 7);
1,488✔
2476
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,488!
2477
      colDataSetNULL(pColInfoData, numOfRows);
1,488!
2478

2479
      STR_TO_VARSTR(n, "VIRTUAL_CHILD_TABLE");
1,488✔
2480
    }
2481

2482
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
83,441✔
2483
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
83,423!
2484
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
83,423✔
2485
    QUERY_CHECK_CODE(code, lino, _end);
83,433!
2486

2487
    if (++numOfRows >= pOperator->resultInfo.capacity) {
83,433!
2488
      p->info.rows = numOfRows;
×
2489
      pInfo->pRes->info.rows = numOfRows;
×
2490

2491
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
2492
      QUERY_CHECK_CODE(code, lino, _end);
×
2493

2494
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
2495
      QUERY_CHECK_CODE(code, lino, _end);
×
2496

2497
      blockDataCleanup(p);
×
2498
      numOfRows = 0;
×
2499

2500
      if (pInfo->pRes->info.rows > 0) {
×
2501
        pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
2502
        break;
×
2503
      }
2504
    }
2505
  }
2506

2507
  if (numOfRows > 0) {
3,660✔
2508
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
3,097✔
2509
    p->info.rows = numOfRows;
3,098✔
2510
    pInfo->pRes->info.rows = numOfRows;
3,098✔
2511

2512
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
3,098✔
2513
    QUERY_CHECK_CODE(code, lino, _end);
3,098!
2514

2515
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
3,098✔
2516
    QUERY_CHECK_CODE(code, lino, _end);
3,096!
2517

2518
    blockDataCleanup(p);
3,096✔
2519
    numOfRows = 0;
3,095✔
2520
  }
2521

2522
  blockDataDestroy(p);
3,658✔
2523
  p = NULL;
3,662✔
2524

2525
  // todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
2526
  if (ret != 0) {
3,662!
2527
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
3,663✔
2528
    pInfo->pCur = NULL;
3,664✔
2529
    setOperatorCompleted(pOperator);
3,664✔
2530
  }
2531

2532
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
3,663✔
2533

2534
_end:
3,663✔
2535
  if (code != TSDB_CODE_SUCCESS) {
3,663!
2536
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2537
    blockDataDestroy(p);
×
2538
    pTaskInfo->code = code;
×
2539
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
2540
    pInfo->pCur = NULL;
×
2541
    T_LONG_JMP(pTaskInfo->env, code);
×
2542
  }
2543
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
3,663✔
2544
}
2545

2546
static int32_t buildVgDiskUsage(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticsInfo) {
77✔
2547
  int32_t            code = TSDB_CODE_SUCCESS;
77✔
2548
  int32_t            lino = 0;
77✔
2549
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
77✔
2550
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
77✔
2551
  SSysTableScanInfo* pInfo = pOperator->info;
77✔
2552
  int32_t            vgId = 0;
77✔
2553
  const char*        db = NULL;
77✔
2554
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &pStaticsInfo->dbname, &vgId, NULL, NULL);
77✔
2555

2556
  pStaticsInfo->vgId = vgId;
78✔
2557

2558
  code = pAPI->metaFn.getDBSize(pInfo->readHandle.vnode, pStaticsInfo);
78✔
2559
  QUERY_CHECK_CODE(code, lino, _end);
78!
2560

2561
  code = vnodeEstimateRawDataSize(pOperator, pStaticsInfo);
78✔
2562
  QUERY_CHECK_CODE(code, lino, _end);
78!
2563

2564
  pStaticsInfo->memSize = pStaticsInfo->memSize >> 10;
78✔
2565
  pStaticsInfo->l1Size = pStaticsInfo->l1Size >> 10;
78✔
2566
  pStaticsInfo->l2Size = pStaticsInfo->l2Size >> 10;
78✔
2567
  pStaticsInfo->l3Size = pStaticsInfo->l3Size >> 10;
78✔
2568
  pStaticsInfo->cacheSize = pStaticsInfo->cacheSize >> 10;
78✔
2569
  pStaticsInfo->walSize = pStaticsInfo->walSize >> 10;
78✔
2570
  pStaticsInfo->metaSize = pStaticsInfo->metaSize >> 10;
78✔
2571
  pStaticsInfo->rawDataSize = pStaticsInfo->rawDataSize >> 10;
78✔
2572
  pStaticsInfo->ssSize = pStaticsInfo->ssSize >> 10;
78✔
2573

2574
_end:
78✔
2575
  return code;
78✔
2576
}
2577

2578
static int8_t shouldEstimateRawDataSize(SOperatorInfo* pOperator) {
69✔
2579
  int32_t lino = 0;
69✔
2580
  size_t  size = 0;
69✔
2581
  int32_t index = 0;
69✔
2582

2583
  const SSysTableMeta* pMeta = NULL;
69✔
2584
  SExecTaskInfo*       pTaskInfo = pOperator->pTaskInfo;
69✔
2585

2586
  SSysTableScanInfo* pInfo = pOperator->info;
69✔
2587
  getInfosDbMeta(&pMeta, &size);
69✔
2588

2589
  for (int32_t i = 0; i < size; ++i) {
2,730!
2590
    if (strcmp(pMeta[i].name, TSDB_INS_DISK_USAGE) == 0) {
2,730✔
2591
      index = i;
70✔
2592
      break;
70✔
2593
    }
2594
  }
2595
  if (index >= size) {
70!
2596
    return 1;
×
2597
  }
2598
  const SSysTableMeta* pTgtMeta = &pMeta[index];
70✔
2599
  int32_t              colNum = pTgtMeta->colNum;
70✔
2600
  SColumnInfoData      colInfoData =
2601
      createColumnInfoData(pTgtMeta->schema[colNum - 1].type, pTgtMeta->schema[colNum - 1].bytes, colNum);
70✔
2602
  for (int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); i++) {
252✔
2603
    SColMatchItem* pItem = taosArrayGet(pInfo->matchInfo.pList, i);
190✔
2604
    if (pItem->colId == colInfoData.info.colId) {
190✔
2605
      return 1;
8✔
2606
    }
2607
  }
2608
  return 0;
62✔
2609
}
2610
static SSDataBlock* sysTableBuildVgUsage(SOperatorInfo* pOperator) {
92✔
2611
  int32_t            code = TSDB_CODE_SUCCESS;
92✔
2612
  int32_t            lino = 0;
92✔
2613
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
92✔
2614
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
92✔
2615
  SSysTableScanInfo* pInfo = pOperator->info;
92✔
2616
  SDbSizeStatisInfo  staticsInfo = {.estimateRawData = 1};
92✔
2617

2618
  char*        buf = NULL;
92✔
2619
  SSDataBlock* p = NULL;
92✔
2620

2621
  const char* db = NULL;
92✔
2622
  int32_t     numOfCols = 0;
92✔
2623
  int32_t     numOfRows = 0;
92✔
2624

2625
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2626
  if (pInfo->readHandle.mnd != NULL) {
92✔
2627
    setOperatorCompleted(pOperator);
14✔
2628
    return NULL;
14✔
2629
  }
2630
  if (pInfo->pCur == NULL) {
78!
2631
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
78✔
2632
    if (pInfo->pCur == NULL) {
78!
2633
      code = terrno;
×
2634
      QUERY_CHECK_CODE(code, lino, _end);
×
2635
    }
2636
  }
2637

2638
  SSDataBlock* pBlock = pInfo->pRes;
78✔
2639

2640
  if (!pInfo->showRewrite) {
78✔
2641
    staticsInfo.estimateRawData = shouldEstimateRawDataSize(pOperator);
70✔
2642
  }
2643

2644
  code = buildVgDiskUsage(pOperator, &staticsInfo);
78✔
2645
  QUERY_CHECK_CODE(code, lino, _end);
78!
2646

2647
  if (pInfo->showRewrite) {
78✔
2648
    SSDataBlock*      pBlock = pInfo->pRes;
8✔
2649
    SDBBlockUsageInfo usageInfo = {0};
8✔
2650
    int32_t           len = tSerializeBlockDbUsage(NULL, 0, &usageInfo);
8✔
2651

2652
    usageInfo.dataInDiskSize = staticsInfo.l1Size + staticsInfo.l2Size + staticsInfo.l3Size;
8✔
2653
    usageInfo.walInDiskSize = staticsInfo.walSize;
8✔
2654
    usageInfo.rawDataSize = staticsInfo.rawDataSize;
8✔
2655

2656
    buf = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
8!
2657
    QUERY_CHECK_NULL(buf, code, lino, _end, terrno);
8!
2658

2659
    int32_t tempRes = tSerializeBlockDbUsage(varDataVal(buf), len, &usageInfo);
8✔
2660
    if (tempRes != len) {
8!
2661
      QUERY_CHECK_CODE(TSDB_CODE_INVALID_MSG, lino, _end);
×
2662
    }
2663

2664
    varDataSetLen(buf, len);
8✔
2665

2666
    int32_t          slotId = 1;
8✔
2667
    SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, 1);
8✔
2668
    QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
8!
2669
    code = colDataSetVal(pColInfo, 0, buf, false);
8✔
2670
    QUERY_CHECK_CODE(code, lino, _end);
8!
2671
    taosMemoryFreeClear(buf);
8!
2672
    if (slotId != 0) {
8!
2673
      SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
8✔
2674
      QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
8!
2675
    }
2676

2677
    pBlock->info.rows = 1;
8✔
2678
    pOperator->status = OP_EXEC_DONE;
8✔
2679
    pInfo->pRes->info.rows = pBlock->info.rows;
8✔
2680
    QUERY_CHECK_CODE(code, lino, _end);
8!
2681
  } else {
2682
    SName sn = {0};
70✔
2683
    char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
70✔
2684
    code = tNameFromString(&sn, staticsInfo.dbname, T_NAME_ACCT | T_NAME_DB);
70✔
2685
    QUERY_CHECK_CODE(code, lino, _end);
70!
2686

2687
    code = tNameGetDbName(&sn, varDataVal(dbname));
70✔
2688
    QUERY_CHECK_CODE(code, lino, _end);
70!
2689

2690
    varDataSetLen(dbname, strlen(varDataVal(dbname)));
70✔
2691

2692
    p = buildInfoSchemaTableMetaBlock(TSDB_INS_DISK_USAGE);
70✔
2693
    QUERY_CHECK_NULL(p, code, lino, _end, terrno);
70!
2694

2695
    code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
70✔
2696
    QUERY_CHECK_CODE(code, lino, _end);
70!
2697

2698
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2699
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
70✔
2700
    QUERY_CHECK_CODE(code, lino, _end);
70!
2701

2702
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2703
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.vgId, false);
70✔
2704
    QUERY_CHECK_CODE(code, lino, _end);
70!
2705

2706
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2707
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.walSize, false);  // wal
70✔
2708
    QUERY_CHECK_CODE(code, lino, _end);
70!
2709

2710
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2711
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l1Size, false);  // l1_size
70✔
2712
    QUERY_CHECK_CODE(code, lino, _end);
70!
2713

2714
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2715
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l2Size, false);  // l2_size
70✔
2716
    QUERY_CHECK_CODE(code, lino, _end);
70!
2717

2718
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2719
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.l3Size, false);  // l3_size
70✔
2720
    QUERY_CHECK_CODE(code, lino, _end);
70!
2721

2722
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2723
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.cacheSize, false);  // cache_size
70✔
2724
    QUERY_CHECK_CODE(code, lino, _end);
70!
2725

2726
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2727
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.metaSize, false);  // meta_size
70✔
2728
    QUERY_CHECK_CODE(code, lino, _end);
70!
2729

2730
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2731
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.ssSize, false);  // ss_size
70✔
2732
    QUERY_CHECK_CODE(code, lino, _end);
70!
2733

2734
    pColInfoData = taosArrayGet(p->pDataBlock, numOfCols++);
70✔
2735
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&staticsInfo.rawDataSize, false);  // estimate_size
70✔
2736
    QUERY_CHECK_CODE(code, lino, _end);
70!
2737
    numOfRows += 1;
70✔
2738

2739
    if (numOfRows > 0) {
70!
2740
      p->info.rows = numOfRows;
70✔
2741
      pInfo->pRes->info.rows = numOfRows;
70✔
2742

2743
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
70✔
2744
      QUERY_CHECK_CODE(code, lino, _end);
70!
2745

2746
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
70✔
2747
      QUERY_CHECK_CODE(code, lino, _end);
70!
2748
    }
2749

2750
    blockDataDestroy(p);
70✔
2751
    p = NULL;
70✔
2752

2753
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
70✔
2754
    setOperatorCompleted(pOperator);
70✔
2755
  }
2756
_end:
78✔
2757
  taosMemoryFree(buf);
78!
2758
  if (pInfo->pCur) {
78✔
2759
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
62✔
2760
    pInfo->pCur = NULL;
62✔
2761
  }
2762
  if (code != TSDB_CODE_SUCCESS) {
78!
2763
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2764
    blockDataDestroy(p);
×
2765
    pTaskInfo->code = code;
×
2766
    T_LONG_JMP(pTaskInfo->env, code);
×
2767
  }
2768
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
78!
2769
}
2770

2771
static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
6,922✔
2772
  int32_t            code = TSDB_CODE_SUCCESS;
6,922✔
2773
  int32_t            lino = 0;
6,922✔
2774
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
6,922✔
2775
  SSysTableScanInfo* pInfo = pOperator->info;
6,922✔
2776

2777
  SNode* pCondition = pInfo->pCondition;
6,922✔
2778
  if (pOperator->status == OP_EXEC_DONE) {
6,922✔
2779
    return NULL;
2,926✔
2780
  }
2781

2782
  // the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
2783
  if (pInfo->readHandle.mnd != NULL) {
3,996✔
2784
    code = buildSysDbTableInfo(pInfo, pOperator->resultInfo.capacity);
319✔
2785
    QUERY_CHECK_CODE(code, lino, _end);
319!
2786

2787
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
319✔
2788
    QUERY_CHECK_CODE(code, lino, _end);
319!
2789
    pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
319✔
2790

2791
    setOperatorCompleted(pOperator);
319✔
2792
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
319✔
2793
  } else {
2794
    if (pInfo->showRewrite == false) {
3,677✔
2795
      if (pCondition != NULL && pInfo->pIdx == NULL) {
4,413✔
2796
        SSTabFltArg arg = {
2,078✔
2797
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
2,078✔
2798

2799
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
2,078!
2800
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
2,078!
2801
        idx->init = 0;
2,078✔
2802
        idx->uids = taosArrayInit(128, sizeof(int64_t));
2,078✔
2803
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
2,076!
2804
        idx->lastIdx = 0;
2,076✔
2805

2806
        pInfo->pIdx = idx;  // set idx arg
2,076✔
2807

2808
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
2,076✔
2809
        if (flt == 0) {
2,078✔
2810
          pInfo->pIdx->init = 1;
6✔
2811
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
6✔
2812
          return blk;
6✔
2813
        } else if ((flt == -1) || (flt == -2)) {
2,072!
2814
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
2,072✔
2815
        }
2816
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
263!
2817
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
8✔
2818
        return blk;
8✔
2819
      }
2820
    }
2821

2822
    return sysTableBuildUserTables(pOperator);
3,663✔
2823
  }
2824

2825
_end:
×
2826
  if (code != TSDB_CODE_SUCCESS) {
×
2827
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2828
    pTaskInfo->code = code;
×
2829
    T_LONG_JMP(pTaskInfo->env, code);
×
2830
  }
2831
  return NULL;
×
2832
}
2833
static SSDataBlock* sysTableScanUsage(SOperatorInfo* pOperator) {
170✔
2834
  int32_t            code = TSDB_CODE_SUCCESS;
170✔
2835
  int32_t            lino = 0;
170✔
2836
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
170✔
2837
  SSysTableScanInfo* pInfo = pOperator->info;
170✔
2838

2839
  SNode* pCondition = pInfo->pCondition;
170✔
2840
  if (pOperator->status == OP_EXEC_DONE) {
170✔
2841
    return NULL;
78✔
2842
  }
2843
  return sysTableBuildVgUsage(pOperator);
92✔
2844

2845
_end:
2846
  if (code != TSDB_CODE_SUCCESS) {
2847
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
2848
    pTaskInfo->code = code;
2849
    T_LONG_JMP(pTaskInfo->env, code);
2850
  }
2851
  return NULL;
2852
}
2853

2854
static SSDataBlock* sysTableScanUserSTables(SOperatorInfo* pOperator) {
×
2855
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
2856
  SSysTableScanInfo* pInfo = pOperator->info;
×
2857
  if (pOperator->status == OP_EXEC_DONE) {
×
2858
    return NULL;
×
2859
  }
2860

2861
  pInfo->pRes->info.rows = 0;
×
2862
  pOperator->status = OP_EXEC_DONE;
×
2863

2864
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
2865
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
2866
}
2867

2868
static int32_t doSetQueryFileSetRow() {
×
2869
  int32_t code = TSDB_CODE_SUCCESS;
×
2870
  int32_t lino = 0;
×
2871

2872
  // TODO
2873

2874
_exit:
×
2875
  return code;
×
2876
}
2877

2878
static SSDataBlock* sysTableBuildUserFileSets(SOperatorInfo* pOperator) {
×
2879
  int32_t            code = TSDB_CODE_SUCCESS;
×
2880
  int32_t            lino = 0;
×
2881
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
2882
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
×
2883
  SSysTableScanInfo* pInfo = pOperator->info;
×
2884
  SSDataBlock*       p = NULL;
×
2885

2886
  // open cursor if not opened
2887
  if (pInfo->pFileSetReader == NULL) {
×
2888
    code = pAPI->tsdReader.fileSetReaderOpen(pInfo->readHandle.vnode, &pInfo->pFileSetReader);
×
2889
    QUERY_CHECK_CODE(code, lino, _end);
×
2890
  }
2891

2892
  blockDataCleanup(pInfo->pRes);
×
2893
  int32_t numOfRows = 0;
×
2894

2895
  const char* db = NULL;
×
2896
  int32_t     vgId = 0;
×
2897
  pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, &db, &vgId, NULL, NULL);
×
2898

2899
  SName sn = {0};
×
2900
  char  dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
2901
  code = tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
×
2902
  QUERY_CHECK_CODE(code, lino, _end);
×
2903

2904
  code = tNameGetDbName(&sn, varDataVal(dbname));
×
2905
  QUERY_CHECK_CODE(code, lino, _end);
×
2906

2907
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
2908

2909
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_FILESETS);
×
2910
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
×
2911

2912
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
×
2913
  QUERY_CHECK_CODE(code, lino, _end);
×
2914

2915
  char    n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
2916
  int32_t ret = 0;
×
2917

2918
  // loop to query each entry
2919
  for (;;) {
×
2920
    int32_t ret = pAPI->tsdReader.fileSetReadNext(pInfo->pFileSetReader);
×
2921
    if (ret) {
×
2922
      if (ret == TSDB_CODE_NOT_FOUND) {
×
2923
        // no more scan entry
2924
        setOperatorCompleted(pOperator);
×
2925
        pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
×
2926
        break;
×
2927
      } else {
2928
        code = ret;
×
2929
        QUERY_CHECK_CODE(code, lino, _end);
×
2930
      }
2931
    }
2932

2933
    // fill the data block
2934
    {
2935
      SColumnInfoData* pColInfoData;
2936
      int32_t          index = 0;
×
2937

2938
      // db_name
2939
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2940
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2941
      code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
×
2942
      QUERY_CHECK_CODE(code, lino, _end);
×
2943

2944
      // vgroup_id
2945
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2946
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2947
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
×
2948
      QUERY_CHECK_CODE(code, lino, _end);
×
2949

2950
      // fileset_id
2951
      int32_t filesetId = 0;
×
2952
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "fileset_id", &filesetId);
×
2953
      QUERY_CHECK_CODE(code, lino, _end);
×
2954
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2955
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2956
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&filesetId, false);
×
2957
      QUERY_CHECK_CODE(code, lino, _end);
×
2958

2959
      // start_time
2960
      int64_t startTime = 0;
×
2961
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "start_time", &startTime);
×
2962
      QUERY_CHECK_CODE(code, lino, _end);
×
2963
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2964
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2965
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&startTime, false);
×
2966
      QUERY_CHECK_CODE(code, lino, _end);
×
2967

2968
      // end_time
2969
      int64_t endTime = 0;
×
2970
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "end_time", &endTime);
×
2971
      QUERY_CHECK_CODE(code, lino, _end);
×
2972
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2973
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2974
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&endTime, false);
×
2975
      QUERY_CHECK_CODE(code, lino, _end);
×
2976

2977
      // total_size
2978
      int64_t totalSize = 0;
×
2979
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "total_size", &totalSize);
×
2980
      QUERY_CHECK_CODE(code, lino, _end);
×
2981
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2982
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2983
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&totalSize, false);
×
2984
      QUERY_CHECK_CODE(code, lino, _end);
×
2985

2986
      // last_compact
2987
      int64_t lastCompact = 0;
×
2988
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "last_compact_time", &lastCompact);
×
2989
      QUERY_CHECK_CODE(code, lino, _end);
×
2990
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
2991
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
2992
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&lastCompact, false);
×
2993
      QUERY_CHECK_CODE(code, lino, _end);
×
2994

2995
      // should_compact
2996
      bool shouldCompact = false;
×
2997
      code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "should_compact", &shouldCompact);
×
2998
      QUERY_CHECK_CODE(code, lino, _end);
×
2999
      pColInfoData = taosArrayGet(p->pDataBlock, index++);
×
3000
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
3001
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&shouldCompact, false);
×
3002
      QUERY_CHECK_CODE(code, lino, _end);
×
3003

3004
      // // details
3005
      // const char* details = NULL;
3006
      // code = pAPI->tsdReader.fileSetGetEntryField(pInfo->pFileSetReader, "details", &details);
3007
      // QUERY_CHECK_CODE(code, lino, _end);
3008
      // pColInfoData = taosArrayGet(p->pDataBlock, index++);
3009
      // QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
3010
      // code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
3011
      // QUERY_CHECK_CODE(code, lino, _end);
3012
    }
3013

3014
    // check capacity
3015
    if (++numOfRows >= pOperator->resultInfo.capacity) {
×
3016
      p->info.rows = numOfRows;
×
3017
      pInfo->pRes->info.rows = numOfRows;
×
3018

3019
      code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
3020
      QUERY_CHECK_CODE(code, lino, _end);
×
3021

3022
      code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
3023
      QUERY_CHECK_CODE(code, lino, _end);
×
3024

3025
      blockDataCleanup(p);
×
3026
      numOfRows = 0;
×
3027

3028
      if (pInfo->pRes->info.rows > 0) {
×
3029
        break;
×
3030
      }
3031
    }
3032
  }
3033

3034
  if (numOfRows > 0) {
×
3035
    p->info.rows = numOfRows;
×
3036
    pInfo->pRes->info.rows = numOfRows;
×
3037

3038
    code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, p->pDataBlock, false);
×
3039
    QUERY_CHECK_CODE(code, lino, _end);
×
3040

3041
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
×
3042
    QUERY_CHECK_CODE(code, lino, _end);
×
3043

3044
    blockDataCleanup(p);
×
3045
    numOfRows = 0;
×
3046
  }
3047

3048
  blockDataDestroy(p);
×
3049
  p = NULL;
×
3050

3051
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
3052

3053
_end:
×
3054
  if (code != TSDB_CODE_SUCCESS) {
×
3055
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3056
    blockDataDestroy(p);
×
3057
    pTaskInfo->code = code;
×
3058
    pAPI->tsdReader.fileSetReaderClose(&pInfo->pFileSetReader);
×
3059
    T_LONG_JMP(pTaskInfo->env, code);
×
3060
  }
3061
  return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
×
3062
}
3063

3064
static SSDataBlock* sysTableScanUserFileSets(SOperatorInfo* pOperator) {
×
3065
  int32_t            code = TSDB_CODE_SUCCESS;
×
3066
  int32_t            lino = 0;
×
3067
  SSysTableScanInfo* pInfo = pOperator->info;
×
3068
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
×
3069
  SNode*             pCondition = pInfo->pCondition;
×
3070

3071
  if (pOperator->status == OP_EXEC_DONE) {
×
3072
    return NULL;
×
3073
  }
3074

3075
  if (pInfo->readHandle.mnd != NULL) {
×
3076
    // do nothing on mnode
3077
    qTrace("This operator do nothing on mnode, task id:%s", GET_TASKID(pTaskInfo));
×
3078
    return NULL;
×
3079
  } else {
3080
#if 0
3081
    if (pInfo->showRewrite == false) {
3082
      if (pCondition != NULL && pInfo->pIdx == NULL) {
3083
        SSTabFltArg arg = {
3084
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
3085

3086
        SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
3087
        QUERY_CHECK_NULL(idx, code, lino, _end, terrno);
3088
        idx->init = 0;
3089
        idx->uids = taosArrayInit(128, sizeof(int64_t));
3090
        QUERY_CHECK_NULL(idx->uids, code, lino, _end, terrno);
3091
        idx->lastIdx = 0;
3092

3093
        pInfo->pIdx = idx;  // set idx arg
3094

3095
        int flt = optSysTabFilte(&arg, pCondition, idx->uids);
3096
        if (flt == 0) {
3097
          pInfo->pIdx->init = 1;
3098
          SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
3099
          return blk;
3100
        } else if ((flt == -1) || (flt == -2)) {
3101
          qDebug("%s failed to get sys table info by idx, scan sys table one by one", GET_TASKID(pTaskInfo));
3102
        }
3103
      } else if (pCondition != NULL && (pInfo->pIdx != NULL && pInfo->pIdx->init == 1)) {
3104
        SSDataBlock* blk = sysTableBuildUserTablesByUids(pOperator);
3105
        return blk;
3106
      }
3107
    }
3108
#endif
3109

3110
    return sysTableBuildUserFileSets(pOperator);
×
3111
  }
3112

3113
_end:
3114
  if (code != TSDB_CODE_SUCCESS) {
3115
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
3116
    pTaskInfo->code = code;
3117
    T_LONG_JMP(pTaskInfo->env, code);
3118
  }
3119
  return NULL;
3120
}
3121

3122
static int32_t getSysTableDbNameColId(const char* pTable) {
9,377✔
3123
  // if (0 == strcmp(TSDB_INS_TABLE_INDEXES, pTable)) {
3124
  //   return 1;
3125
  // }
3126
  return TSDB_INS_USER_STABLES_DBNAME_COLID;
9,377✔
3127
}
3128

3129
static EDealRes getDBNameFromConditionWalker(SNode* pNode, void* pContext) {
59,660✔
3130
  int32_t   code = TSDB_CODE_SUCCESS;
59,660✔
3131
  ENodeType nType = nodeType(pNode);
59,660✔
3132

3133
  switch (nType) {
59,660✔
3134
    case QUERY_NODE_OPERATOR: {
36,460✔
3135
      SOperatorNode* node = (SOperatorNode*)pNode;
36,460✔
3136
      if (OP_TYPE_EQUAL == node->opType) {
36,460✔
3137
        *(int32_t*)pContext = 1;
9,380✔
3138
        return DEAL_RES_CONTINUE;
9,380✔
3139
      }
3140

3141
      *(int32_t*)pContext = 0;
27,080✔
3142
      return DEAL_RES_IGNORE_CHILD;
27,080✔
3143
    }
3144
    case QUERY_NODE_COLUMN: {
9,378✔
3145
      if (1 != *(int32_t*)pContext) {
9,378!
3146
        return DEAL_RES_CONTINUE;
×
3147
      }
3148

3149
      SColumnNode* node = (SColumnNode*)pNode;
9,378✔
3150
      if (getSysTableDbNameColId(node->tableName) == node->colId) {
9,378✔
3151
        *(int32_t*)pContext = 2;
7,251✔
3152
        return DEAL_RES_CONTINUE;
7,251✔
3153
      }
3154

3155
      *(int32_t*)pContext = 0;
2,126✔
3156
      return DEAL_RES_CONTINUE;
2,126✔
3157
    }
3158
    case QUERY_NODE_VALUE: {
9,376✔
3159
      if (2 != *(int32_t*)pContext) {
9,376✔
3160
        return DEAL_RES_CONTINUE;
2,128✔
3161
      }
3162

3163
      SValueNode* node = (SValueNode*)pNode;
7,248✔
3164
      char*       dbName = nodesGetValueFromNode(node);
7,248✔
3165
      tstrncpy((char*)pContext, varDataVal(dbName), TSDB_DB_NAME_LEN);
7,248✔
3166
      return DEAL_RES_END;  // stop walk
7,248✔
3167
    }
3168
    default:
4,446✔
3169
      break;
4,446✔
3170
  }
3171
  return DEAL_RES_CONTINUE;
4,446✔
3172
}
3173

3174
static void getDBNameFromCondition(SNode* pCondition, const char* dbName) {
47,644✔
3175
  if (NULL == pCondition) {
47,644✔
3176
    return;
11,191✔
3177
  }
3178
  nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName);
36,453✔
3179
}
3180

3181
static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
62,076✔
3182
  // build message and send to mnode to fetch the content of system tables.
3183
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
62,076✔
3184
  SSysTableScanInfo* pInfo = pOperator->info;
62,076✔
3185
  char               dbName[TSDB_DB_NAME_LEN] = {0};
62,076✔
3186

3187
  while (1) {
×
3188
    if (isTaskKilled(pOperator->pTaskInfo)) {
62,076!
3189
      setOperatorCompleted(pOperator);
×
3190
      (*ppRes) = NULL;
×
3191
      break;
×
3192
    }
3193

3194
    blockDataCleanup(pInfo->pRes);
62,075✔
3195

3196
    const char* name = tNameGetTableName(&pInfo->name);
62,081✔
3197
    if (pInfo->showRewrite) {
62,082✔
3198
      getDBNameFromCondition(pInfo->pCondition, dbName);
18,358✔
3199
      if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
18,349✔
3200
          strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
17,187✔
3201
          strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
17,113✔
3202
        TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
17,111✔
3203
      }
3204
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
43,724✔
3205
      getDBNameFromCondition(pInfo->pCondition, dbName);
29,287✔
3206
      if (dbName[0]) TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
29,286✔
3207
      (void)sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
29,286✔
3208
    }
3209
    bool         filter = true;
62,074✔
3210
    SSDataBlock* pBlock = NULL;
62,074✔
3211
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
62,074✔
3212
      pBlock = sysTableScanUserTables(pOperator);
6,920✔
3213
    } else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
55,154✔
3214
      pBlock = sysTableScanUserTags(pOperator);
4,168✔
3215
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
50,986✔
3216
      pBlock = sysTableScanUserCols(pOperator);
22,393✔
3217
    } else if (strncasecmp(name, TSDB_INS_TABLE_VC_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
28,593!
3218
      pBlock = sysTableScanUserVcCols(pOperator);
108✔
3219
    } else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
28,485✔
3220
               IS_SYS_DBNAME(dbName)) {
1,527!
3221
      pBlock = sysTableScanUserSTables(pOperator);
×
3222
    } else if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
28,487✔
3223
      pBlock = sysTableScanUsage(pOperator);
170✔
3224
    } else if (strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
28,317!
3225
      pBlock = sysTableScanUserFileSets(pOperator);
×
3226
    } else {  // load the meta from mnode of the given epset
3227
      pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
28,317✔
3228
    }
3229

3230
    if (!pInfo->skipFilterTable) sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
62,076✔
3231
    if (pBlock != NULL) {
62,071✔
3232
      bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
23,787✔
3233
      if (limitReached) {
23,786✔
3234
        setOperatorCompleted(pOperator);
55✔
3235
      }
3236

3237
      if (pBlock->info.rows == 0) {
23,786!
3238
        continue;
×
3239
      }
3240
      (*ppRes) = pBlock;
23,786✔
3241
    } else {
3242
      (*ppRes) = NULL;
38,284✔
3243
    }
3244
    break;
62,070✔
3245
  }
3246

3247
_end:
62,070✔
3248
  if (pTaskInfo->code) {
62,070✔
3249
    qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code));
11!
3250
    T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
11!
3251
  }
3252
  return pTaskInfo->code;
62,059✔
3253
}
3254

3255
static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name,
62,055✔
3256
                                   SSDataBlock* pBlock) {
3257
  int32_t        code = TSDB_CODE_SUCCESS;
62,055✔
3258
  int32_t        lino = 0;
62,055✔
3259
  SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
62,055✔
3260
  if (pBlock == NULL) {
62,055✔
3261
    return;
38,280✔
3262
  }
3263

3264
  if (pInfo->tbnameSlotId != -1) {
23,775✔
3265
    SColumnInfoData* pColumnInfoData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, pInfo->tbnameSlotId);
20✔
3266
    QUERY_CHECK_NULL(pColumnInfoData, code, lino, _end, terrno);
20!
3267
    char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
20✔
3268
    STR_TO_VARSTR(varTbName, name);
20✔
3269

3270
    code = colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, true);
20✔
3271
    QUERY_CHECK_CODE(code, lino, _end);
20!
3272
  }
3273

3274
  code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
23,775✔
3275
  QUERY_CHECK_CODE(code, lino, _end);
23,783!
3276

3277
_end:
23,783✔
3278
  if (code != TSDB_CODE_SUCCESS) {
23,783!
3279
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3280
    pTaskInfo->code = code;
×
3281
    T_LONG_JMP(pTaskInfo->env, code);
×
3282
  }
3283
}
3284

3285
static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableScanInfo* pInfo, const char* name,
28,317✔
3286
                                          SExecTaskInfo* pTaskInfo) {
3287
  int32_t code = TSDB_CODE_SUCCESS;
28,317✔
3288
  int32_t lino = 0;
28,317✔
3289
  if (pOperator->status == OP_EXEC_DONE) {
28,317✔
3290
    return NULL;
10,235✔
3291
  }
3292

3293
  while (1) {
57✔
3294
    int64_t startTs = taosGetTimestampUs();
18,139✔
3295
    tstrncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
18,139✔
3296
    tstrncpy(pInfo->req.user, pInfo->pUser, tListLen(pInfo->req.user));
18,139✔
3297

3298
    int32_t contLen = tSerializeSRetrieveTableReq(NULL, 0, &pInfo->req);
18,139✔
3299
    char*   buf1 = taosMemoryCalloc(1, contLen);
18,139!
3300
    if (!buf1) {
18,139!
3301
      return NULL;
18,082✔
3302
    }
3303
    int32_t tempRes = tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req);
18,139✔
3304
    if (tempRes < 0) {
18,139!
3305
      code = terrno;
×
3306
      taosMemoryFree(buf1);
×
3307
      return NULL;
×
3308
    }
3309

3310
    // send the fetch remote task result reques
3311
    SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
18,139!
3312
    if (NULL == pMsgSendInfo) {
18,139!
3313
      qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
×
3314
      pTaskInfo->code = terrno;
×
3315
      taosMemoryFree(buf1);
×
3316
      return NULL;
×
3317
    }
3318

3319
    int32_t msgType = (strcasecmp(name, TSDB_INS_TABLE_DNODE_VARIABLES) == 0) ? TDMT_DND_SYSTABLE_RETRIEVE
36,278✔
3320
                                                                              : TDMT_MND_SYSTABLE_RETRIEVE;
18,139✔
3321

3322
    pMsgSendInfo->param = pOperator;
18,139✔
3323
    pMsgSendInfo->msgInfo.pData = buf1;
18,139✔
3324
    pMsgSendInfo->msgInfo.len = contLen;
18,139✔
3325
    pMsgSendInfo->msgType = msgType;
18,139✔
3326
    pMsgSendInfo->fp = loadSysTableCallback;
18,139✔
3327
    pMsgSendInfo->requestId = pTaskInfo->id.queryId;
18,139✔
3328

3329
    code = asyncSendMsgToServer(pInfo->readHandle.pMsgCb->clientRpc, &pInfo->epSet, NULL, pMsgSendInfo);
18,139✔
3330
    if (code != TSDB_CODE_SUCCESS) {
18,139!
3331
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3332
      pTaskInfo->code = code;
×
3333
      T_LONG_JMP(pTaskInfo->env, code);
×
3334
    }
3335

3336
    code = tsem_wait(&pInfo->ready);
18,139✔
3337
    if (code != TSDB_CODE_SUCCESS) {
18,139!
3338
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3339
      pTaskInfo->code = code;
×
3340
      T_LONG_JMP(pTaskInfo->env, code);
×
3341
    }
3342

3343
    if (pTaskInfo->code) {
18,139✔
3344
      qError("%s load meta data from mnode failed, totalRows:%" PRIu64 ", code:%s", GET_TASKID(pTaskInfo),
11!
3345
             pInfo->loadInfo.totalRows, tstrerror(pTaskInfo->code));
3346
      return NULL;
11✔
3347
    }
3348

3349
    SRetrieveMetaTableRsp* pRsp = pInfo->pRsp;
18,128✔
3350
    pInfo->req.showId = pRsp->handle;
18,128✔
3351

3352
    if (pRsp->numOfRows == 0 || pRsp->completed) {
18,128✔
3353
      pOperator->status = OP_EXEC_DONE;
18,024✔
3354
      qDebug("%s load meta data from mnode completed, rowsOfSource:%d, totalRows:%" PRIu64, GET_TASKID(pTaskInfo),
18,024✔
3355
             pRsp->numOfRows, pInfo->loadInfo.totalRows);
3356

3357
      if (pRsp->numOfRows == 0) {
18,024✔
3358
        taosMemoryFree(pRsp);
682!
3359
        return NULL;
682✔
3360
      }
3361
    }
3362

3363
    char* pStart = pRsp->data;
17,446✔
3364
    code = extractDataBlockFromFetchRsp(pInfo->pRes, pRsp->data, pInfo->matchInfo.pList, &pStart);
17,446✔
3365
    if (code != TSDB_CODE_SUCCESS) {
17,446!
3366
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3367
      pTaskInfo->code = code;
×
3368
      taosMemoryFreeClear(pRsp);
×
3369
      T_LONG_JMP(pTaskInfo->env, code);
×
3370
    }
3371
    updateLoadRemoteInfo(&pInfo->loadInfo, pRsp->numOfRows, pRsp->compLen, startTs, pOperator);
17,446✔
3372

3373
    // todo log the filter info
3374
    code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
17,446✔
3375
    if (code != TSDB_CODE_SUCCESS) {
17,446!
3376
      qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3377
      pTaskInfo->code = code;
×
3378
      taosMemoryFreeClear(pRsp);
×
3379
      T_LONG_JMP(pTaskInfo->env, code);
×
3380
    }
3381
    taosMemoryFree(pRsp);
17,446!
3382
    if (pInfo->pRes->info.rows > 0) {
17,446✔
3383
      return pInfo->pRes;
10,252✔
3384
    } else if (pOperator->status == OP_EXEC_DONE) {
7,194✔
3385
      return NULL;
7,137✔
3386
    }
3387
  }
3388
}
3389

3390
// static int32_t resetSysTableScanOperState(SOperatorInfo* pOper) {
3391
//   SSysTableScanInfo* pInfo = pOper->info;
3392
//   SExecTaskInfo*           pTaskInfo = pOper->pTaskInfo;
3393
//   SSystemTableScanPhysiNode* pPhynode = (SSystemTableScanPhysiNode*)pOper->pPhyNode;
3394

3395
//   blockDataEmpty(pInfo->pRes);
3396

3397
//   if (pInfo->name.type == TSDB_TABLE_NAME_T) {
3398
//     const char* name = tNameGetTableName(&pInfo->name);
3399
//     if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
3400
//         strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
3401
//         strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 || pInfo->pCur != NULL) {
3402
//       if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
3403
//         pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
3404
//       }
3405

3406
//       pInfo->pCur = NULL;
3407
//     }
3408
//   } else {
3409
//     qError("pInfo->name is not initialized");
3410
//   }
3411

3412
//   if (pInfo->pIdx) {
3413
//     taosArrayDestroy(pInfo->pIdx->uids);
3414
//     taosMemoryFree(pInfo->pIdx);
3415
//     pInfo->pIdx = NULL;
3416
//   }
3417

3418
//   if (pInfo->pSchema) {
3419
//     taosHashCleanup(pInfo->pSchema);
3420
//     pInfo->pSchema = NULL;
3421
//   }
3422

3423
//   return 0;
3424
// }
3425

3426
int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, const char* pUser,
38,280✔
3427
                                       SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) {
3428
  QRY_PARAM_CHECK(pOptrInfo);
38,280!
3429

3430
  int32_t            code = TSDB_CODE_SUCCESS;
38,280✔
3431
  int32_t            lino = 0;
38,280✔
3432
  SSysTableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SSysTableScanInfo));
38,280!
3433
  SOperatorInfo*     pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
38,288!
3434
  if (pInfo == NULL || pOperator == NULL) {
38,289!
3435
    code = terrno;
×
3436
    lino = __LINE__;
×
3437
    goto _error;
×
3438
  }
3439

3440
  SScanPhysiNode*     pScanNode = &pScanPhyNode->scan;
38,289✔
3441
  SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
38,289✔
3442
  QUERY_CHECK_CODE(code, lino, _error);
38,289!
3443

3444
  int32_t num = 0;
38,289✔
3445
  code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &num, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
38,289✔
3446
  QUERY_CHECK_CODE(code, lino, _error);
38,284!
3447

3448
  extractTbnameSlotId(pInfo, pScanNode);
38,284✔
3449

3450
  pInfo->pAPI = &pTaskInfo->storageAPI;
38,283✔
3451

3452
  pInfo->accountId = pScanPhyNode->accountId;
38,283✔
3453
  pInfo->pUser = taosStrdup((void*)pUser);
38,283!
3454
  QUERY_CHECK_NULL(pInfo->pUser, code, lino, _error, terrno);
38,288!
3455
  pInfo->sysInfo = pScanPhyNode->sysInfo;
38,288✔
3456
  pInfo->showRewrite = pScanPhyNode->showRewrite;
38,288✔
3457
  pInfo->pRes = createDataBlockFromDescNode(pDescNode);
38,288✔
3458
  QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno);
38,289!
3459

3460
  pInfo->pCondition = pScanNode->node.pConditions;
38,289✔
3461

3462
  tNameAssign(&pInfo->name, &pScanNode->tableName);
38,289✔
3463
  const char* name = tNameGetTableName(&pInfo->name);
38,286✔
3464
  if (pInfo->showRewrite == false) {
38,287✔
3465
    code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0,
28,691✔
3466
                              pTaskInfo->pStreamRuntimeInfo);
28,691✔
3467
  } else {
3468
    if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
9,596✔
3469
      pInfo->skipFilterTable = true;
8✔
3470
      code = filterInitFromNode(NULL, &pOperator->exprSupp.pFilterInfo, 0, pTaskInfo->pStreamRuntimeInfo);
8✔
3471
    } else {
3472
      code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0,
9,588✔
3473
                                pTaskInfo->pStreamRuntimeInfo);
9,588✔
3474
    }
3475
  }
3476
  QUERY_CHECK_CODE(code, lino, _error);
38,289!
3477

3478
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
38,289✔
3479
  initResultSizeInfo(&pOperator->resultInfo, 4096);
38,289✔
3480
  code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
38,289✔
3481
  QUERY_CHECK_CODE(code, lino, _error);
38,287!
3482

3483
  if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
38,287✔
3484
      strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
34,299✔
3485
      strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
31,898!
3486
    pInfo->readHandle = *(SReadHandle*)readHandle;
6,389✔
3487
  } else {
3488
    if (tsem_init(&pInfo->ready, 0, 0) != TSDB_CODE_SUCCESS) {
31,898!
3489
      code = TSDB_CODE_FAILED;
×
3490
      goto _error;
×
3491
    }
3492
    pInfo->epSet = pScanPhyNode->mgmtEpSet;
31,898✔
3493
    pInfo->readHandle = *(SReadHandle*)readHandle;
31,898✔
3494
  }
3495

3496
  setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
38,287✔
3497
                  pInfo, pTaskInfo);
3498
  pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
38,287✔
3499
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doSysTableScanNext, NULL, destroySysScanOperator,
38,287✔
3500
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
3501
  // setOperatorResetStateFn(pOperator, resetSysTableScanOperState);
3502
  
3503
  *pOptrInfo = pOperator;
38,288✔
3504
  return code;
38,288✔
3505

3506
_error:
×
3507
  if (pInfo != NULL) {
×
3508
    destroySysScanOperator(pInfo);
×
3509
  }
3510
  if (code != TSDB_CODE_SUCCESS) {
×
3511
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3512
  }
3513
  if (pOperator != NULL) {
×
3514
    pOperator->info = NULL;
×
3515
    destroyOperator(pOperator);
×
3516
  }
3517
  pTaskInfo->code = code;
×
3518
  return code;
×
3519
}
3520

3521
void extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhysiNode* pScanNode) {
38,283✔
3522
  pInfo->tbnameSlotId = -1;
38,283✔
3523
  if (pScanNode->pScanPseudoCols != NULL) {
38,283✔
3524
    SNode* pNode = NULL;
28✔
3525
    FOREACH(pNode, pScanNode->pScanPseudoCols) {
56!
3526
      STargetNode* pTargetNode = NULL;
28✔
3527
      if (nodeType(pNode) == QUERY_NODE_TARGET) {
28!
3528
        pTargetNode = (STargetNode*)pNode;
28✔
3529
        SNode* expr = pTargetNode->pExpr;
28✔
3530
        if (nodeType(expr) == QUERY_NODE_FUNCTION) {
28!
3531
          SFunctionNode* pFuncNode = (SFunctionNode*)expr;
28✔
3532
          if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) {
28✔
3533
            pInfo->tbnameSlotId = pTargetNode->slotId;
20✔
3534
          }
3535
        }
3536
      }
3537
    }
3538
  }
3539
}
38,283✔
3540

3541
void destroySysScanOperator(void* param) {
38,289✔
3542
  SSysTableScanInfo* pInfo = (SSysTableScanInfo*)param;
38,289✔
3543
  int32_t            code = tsem_destroy(&pInfo->ready);
38,289✔
3544
  if (code != TSDB_CODE_SUCCESS) {
38,289!
3545
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
×
3546
  }
3547
  blockDataDestroy(pInfo->pRes);
38,289✔
3548

3549
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
38,289!
3550
    const char* name = tNameGetTableName(&pInfo->name);
38,289✔
3551
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
38,289✔
3552
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
34,299✔
3553
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 ||
31,898✔
3554
        strncasecmp(name, TSDB_INS_TABLE_VC_COLS, TSDB_TABLE_FNAME_LEN) == 0 ||
11,315✔
3555
        pInfo->pCur != NULL) {
11,248!
3556
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
27,041!
3557
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
19,842✔
3558
      }
3559

3560
      pInfo->pCur = NULL;
27,040✔
3561
    }
3562
  } else {
3563
    qError("pInfo->name is not initialized");
×
3564
  }
3565

3566
  if (pInfo->pIdx) {
38,288✔
3567
    taosArrayDestroy(pInfo->pIdx->uids);
2,078✔
3568
    taosMemoryFree(pInfo->pIdx);
2,078!
3569
    pInfo->pIdx = NULL;
2,078✔
3570
  }
3571

3572
  if (pInfo->pSchema) {
38,288✔
3573
    taosHashCleanup(pInfo->pSchema);
13,770✔
3574
    pInfo->pSchema = NULL;
13,770✔
3575
  }
3576
  if (pInfo->pExtSchema) {
38,288✔
3577
    taosHashCleanup(pInfo->pExtSchema);
13,703✔
3578
    pInfo->pExtSchema = NULL;
13,703✔
3579
  }
3580

3581
  taosArrayDestroy(pInfo->matchInfo.pList);
38,288✔
3582
  taosMemoryFreeClear(pInfo->pUser);
38,289!
3583

3584
  taosMemoryFreeClear(param);
38,286!
3585
}
38,288✔
3586

3587
int32_t loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code) {
18,139✔
3588
  SOperatorInfo*     operator=(SOperatorInfo*) param;
18,139✔
3589
  SSysTableScanInfo* pScanResInfo = (SSysTableScanInfo*)operator->info;
18,139✔
3590
  if (TSDB_CODE_SUCCESS == code) {
18,139✔
3591
    pScanResInfo->pRsp = pMsg->pData;
18,128✔
3592

3593
    SRetrieveMetaTableRsp* pRsp = pScanResInfo->pRsp;
18,128✔
3594
    pRsp->numOfRows = htonl(pRsp->numOfRows);
18,128✔
3595
    pRsp->useconds = htobe64(pRsp->useconds);
18,128✔
3596
    pRsp->handle = htobe64(pRsp->handle);
18,128✔
3597
    pRsp->compLen = htonl(pRsp->compLen);
18,128✔
3598
  } else {
3599
    operator->pTaskInfo->code = rpcCvtErrCode(code);
11✔
3600
    if (operator->pTaskInfo->code != code) {
11!
3601
      qError("load systable rsp received, error:%s, cvted error:%s", tstrerror(code),
×
3602
             tstrerror(operator->pTaskInfo->code));
3603
    } else {
3604
      qError("load systable rsp received, error:%s", tstrerror(code));
11!
3605
    }
3606
  }
3607

3608
  int32_t res = tsem_post(&pScanResInfo->ready);
18,139✔
3609
  if (res != TSDB_CODE_SUCCESS) {
18,139!
3610
    qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(res));
×
3611
  }
3612
  return TSDB_CODE_SUCCESS;
18,139✔
3613
}
3614

3615
static int32_t sysChkFilter__Comm(SNode* pNode) {
662✔
3616
  // impl
3617
  SOperatorNode* pOper = (SOperatorNode*)pNode;
662✔
3618
  EOperatorType  opType = pOper->opType;
662✔
3619
  if (opType != OP_TYPE_EQUAL && opType != OP_TYPE_LOWER_EQUAL && opType != OP_TYPE_LOWER_THAN &&
662!
3620
      opType != OP_TYPE_GREATER_EQUAL && opType != OP_TYPE_GREATER_THAN) {
2!
3621
    return -1;
×
3622
  }
3623
  return 0;
662✔
3624
}
3625

3626
static int32_t sysChkFilter__DBName(SNode* pNode) {
1,354✔
3627
  SOperatorNode* pOper = (SOperatorNode*)pNode;
1,354✔
3628

3629
  if (pOper->opType != OP_TYPE_EQUAL && pOper->opType != OP_TYPE_NOT_EQUAL) {
1,354!
3630
    return -1;
×
3631
  }
3632

3633
  SValueNode* pVal = (SValueNode*)pOper->pRight;
1,354✔
3634
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
1,354!
3635
    return -1;
×
3636
  }
3637

3638
  return 0;
1,354✔
3639
}
3640
static int32_t sysChkFilter__VgroupId(SNode* pNode) {
×
3641
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3642
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3643
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3644
    return -1;
×
3645
  }
3646
  return sysChkFilter__Comm(pNode);
×
3647
}
3648
static int32_t sysChkFilter__TableName(SNode* pNode) {
635✔
3649
  SOperatorNode* pOper = (SOperatorNode*)pNode;
635✔
3650
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
635✔
3651
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
635!
3652
    return -1;
×
3653
  }
3654
  return sysChkFilter__Comm(pNode);
635✔
3655
}
3656
static int32_t sysChkFilter__CreateTime(SNode* pNode) {
6✔
3657
  SOperatorNode* pOper = (SOperatorNode*)pNode;
6✔
3658
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
6✔
3659

3660
  if (!IS_TIMESTAMP_TYPE(pVal->node.resType.type)) {
6!
3661
    return -1;
×
3662
  }
3663
  return sysChkFilter__Comm(pNode);
6✔
3664
}
3665

3666
static int32_t sysChkFilter__Ncolumn(SNode* pNode) {
×
3667
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3668
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3669

3670
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3671
    return -1;
×
3672
  }
3673
  return sysChkFilter__Comm(pNode);
×
3674
}
3675
static int32_t sysChkFilter__Ttl(SNode* pNode) {
×
3676
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3677
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3678

3679
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3680
    return -1;
×
3681
  }
3682
  return sysChkFilter__Comm(pNode);
×
3683
}
3684
static int32_t sysChkFilter__STableName(SNode* pNode) {
21✔
3685
  SOperatorNode* pOper = (SOperatorNode*)pNode;
21✔
3686
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
21✔
3687
  if (!IS_STR_DATA_TYPE(pVal->node.resType.type)) {
21!
3688
    return -1;
×
3689
  }
3690
  return sysChkFilter__Comm(pNode);
21✔
3691
}
3692
static int32_t sysChkFilter__Uid(SNode* pNode) {
×
3693
  SOperatorNode* pOper = (SOperatorNode*)pNode;
×
3694
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
×
3695
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
×
3696
    return -1;
×
3697
  }
3698
  return sysChkFilter__Comm(pNode);
×
3699
}
3700
static int32_t sysChkFilter__Type(SNode* pNode) {
12✔
3701
  SOperatorNode* pOper = (SOperatorNode*)pNode;
12✔
3702
  SValueNode*    pVal = (SValueNode*)pOper->pRight;
12✔
3703
  if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
12!
3704
    return -1;
12✔
3705
  }
3706
  return sysChkFilter__Comm(pNode);
×
3707
}
3708
static int32_t optSysTabFilteImpl(void* arg, SNode* cond, SArray* result) {
3,015✔
3709
  if (optSysCheckOper(cond) != 0) return -1;
3,015✔
3710

3711
  SOperatorNode* pNode = (SOperatorNode*)cond;
2,029✔
3712

3713
  int8_t i = 0;
2,029✔
3714
  for (; i < SYSTAB_FILTER_DICT_SIZE; i++) {
3,596✔
3715
    if (strcmp(filterDict[i].name, ((SColumnNode*)(pNode->pLeft))->colName) == 0) {
3,595✔
3716
      break;
2,028✔
3717
    }
3718
  }
3719
  if (i >= SYSTAB_FILTER_DICT_SIZE) return -1;
2,029!
3720

3721
  if (filterDict[i].chkFunc(cond) != 0) return -1;
2,029✔
3722

3723
  return filterDict[i].fltFunc(arg, cond, result);
2,016✔
3724
}
3725

3726
static int32_t optSysCheckOper(SNode* pOpear) {
3,015✔
3727
  if (nodeType(pOpear) != QUERY_NODE_OPERATOR) return -1;
3,015✔
3728

3729
  SOperatorNode* pOper = (SOperatorNode*)pOpear;
3,011✔
3730
  if (pOper->opType < OP_TYPE_GREATER_THAN || pOper->opType > OP_TYPE_NOT_EQUAL) {
3,011!
3731
    return -1;
982✔
3732
  }
3733

3734
  if (nodeType(pOper->pLeft) != QUERY_NODE_COLUMN || nodeType(pOper->pRight) != QUERY_NODE_VALUE) {
2,029!
3735
    return -1;
×
3736
  }
3737
  return 0;
2,029✔
3738
}
3739

3740
static FORCE_INLINE int optSysBinarySearch(SArray* arr, int s, int e, uint64_t k) {
3741
  uint64_t v;
3742
  int32_t  m;
3743
  while (s <= e) {
×
3744
    m = s + (e - s) / 2;
×
3745
    v = *(uint64_t*)taosArrayGet(arr, m);
×
3746
    if (v >= k) {
×
3747
      e = m - 1;
×
3748
    } else {
3749
      s = m + 1;
×
3750
    }
3751
  }
3752
  return s;
×
3753
}
3754

3755
int32_t optSysIntersection(SArray* in, SArray* out) {
903✔
3756
  int32_t     code = TSDB_CODE_SUCCESS;
903✔
3757
  int32_t     lino = 0;
903✔
3758
  MergeIndex* mi = NULL;
903✔
3759
  int32_t     sz = (int32_t)taosArrayGetSize(in);
903✔
3760
  if (sz <= 0) {
903✔
3761
    goto _end;
897✔
3762
  }
3763
  mi = taosMemoryCalloc(sz, sizeof(MergeIndex));
6!
3764
  QUERY_CHECK_NULL(mi, code, lino, _end, terrno);
6!
3765
  for (int i = 0; i < sz; i++) {
12✔
3766
    SArray* t = taosArrayGetP(in, i);
6✔
3767
    mi[i].len = (int32_t)taosArrayGetSize(t);
6✔
3768
    mi[i].idx = 0;
6✔
3769
  }
3770

3771
  SArray* base = taosArrayGetP(in, 0);
6✔
3772
  for (int i = 0; i < taosArrayGetSize(base); i++) {
37,753✔
3773
    uint64_t tgt = *(uint64_t*)taosArrayGet(base, i);
37,723✔
3774
    bool     has = true;
37,727✔
3775
    for (int j = 1; j < taosArrayGetSize(in); j++) {
37,727✔
3776
      SArray* oth = taosArrayGetP(in, j);
61✔
3777
      int     mid = optSysBinarySearch(oth, mi[j].idx, mi[j].len - 1, tgt);
×
3778
      if (mid >= 0 && mid < mi[j].len) {
×
3779
        uint64_t val = *(uint64_t*)taosArrayGet(oth, mid);
×
3780
        has = (val == tgt ? true : false);
×
3781
        mi[j].idx = mid;
×
3782
      } else {
3783
        has = false;
×
3784
      }
3785
    }
3786
    if (has == true) {
37,665!
3787
      void* tmp = taosArrayPush(out, &tgt);
37,808✔
3788
      if (!tmp) {
37,808!
3789
        code = terrno;
×
3790
        goto _end;
×
3791
      }
3792
    }
3793
  }
3794

3795
_end:
3✔
3796
  taosMemoryFreeClear(mi);
900!
3797
  if (code != TSDB_CODE_SUCCESS) {
900!
3798
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3799
  }
3800
  return code;
903✔
3801
}
3802

3803
static int tableUidCompare(const void* a, const void* b) {
172,022✔
3804
  int64_t u1 = *(int64_t*)a;
172,022✔
3805
  int64_t u2 = *(int64_t*)b;
172,022✔
3806
  if (u1 == u2) {
172,022!
3807
    return 0;
×
3808
  }
3809
  return u1 < u2 ? -1 : 1;
172,022✔
3810
}
3811

3812
static int32_t optSysMergeRslt(SArray* mRslt, SArray* rslt) {
903✔
3813
  // TODO, find comm mem from mRslt
3814
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
909✔
3815
    SArray* arslt = taosArrayGetP(mRslt, i);
6✔
3816
    taosArraySort(arslt, tableUidCompare);
6✔
3817
  }
3818
  return optSysIntersection(mRslt, rslt);
903✔
3819
}
3820

3821
static int32_t optSysSpecialColumn(SNode* cond) {
909✔
3822
  SOperatorNode* pOper = (SOperatorNode*)cond;
909✔
3823
  SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
909✔
3824
  for (int i = 0; i < sizeof(SYSTABLE_SPECIAL_COL) / sizeof(SYSTABLE_SPECIAL_COL[0]); i++) {
921✔
3825
    if (0 == strcmp(pCol->colName, SYSTABLE_SPECIAL_COL[i])) {
915✔
3826
      return 1;
903✔
3827
    }
3828
  }
3829
  return 0;
6✔
3830
}
3831

3832
static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result) {
2,068✔
3833
  int ret = TSDB_CODE_FAILED;
2,068✔
3834
  if (nodeType(cond) == QUERY_NODE_OPERATOR) {
2,068✔
3835
    ret = optSysTabFilteImpl(arg, cond, result);
1,173✔
3836
    if (ret == 0) {
1,172✔
3837
      SOperatorNode* pOper = (SOperatorNode*)cond;
451✔
3838
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
451✔
3839
      if (0 == strcmp(pCol->colName, "create_time")) {
451!
3840
        return 0;
×
3841
      }
3842
      return -1;
451✔
3843
    }
3844
    return ret;
721✔
3845
  }
3846

3847
  if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) {
895!
3848
    return ret;
×
3849
  }
3850

3851
  SLogicConditionNode* pNode = (SLogicConditionNode*)cond;
902✔
3852
  SNodeList*           pList = (SNodeList*)pNode->pParameterList;
902✔
3853

3854
  int32_t len = LIST_LENGTH(pList);
902!
3855

3856
  bool    hasIdx = false;
902✔
3857
  bool    hasRslt = true;
902✔
3858
  SArray* mRslt = taosArrayInit(len, POINTER_BYTES);
902✔
3859
  if (!mRslt) {
903!
3860
    return terrno;
×
3861
  }
3862

3863
  SListCell* cell = pList->pHead;
903✔
3864
  for (int i = 0; i < len; i++) {
2,745✔
3865
    if (cell == NULL) break;
1,842!
3866

3867
    SArray* aRslt = taosArrayInit(16, sizeof(int64_t));
1,842✔
3868
    if (!aRslt) {
1,842!
3869
      return terrno;
×
3870
    }
3871

3872
    ret = optSysTabFilteImpl(arg, cell->pNode, aRslt);
1,842✔
3873
    if (ret == 0) {
1,842✔
3874
      // has index
3875
      hasIdx = true;
909✔
3876
      if (optSysSpecialColumn(cell->pNode) == 0) {
909✔
3877
        void* tmp = taosArrayPush(mRslt, &aRslt);
6✔
3878
        if (!tmp) {
6!
3879
          return TSDB_CODE_FAILED;
×
3880
        }
3881
      } else {
3882
        // db_name/vgroup not result
3883
        taosArrayDestroy(aRslt);
903✔
3884
      }
3885
    } else if (ret == -2) {
933!
3886
      // current vg
3887
      hasIdx = true;
×
3888
      hasRslt = false;
×
3889
      taosArrayDestroy(aRslt);
×
3890
      break;
×
3891
    } else {
3892
      taosArrayDestroy(aRslt);
933✔
3893
    }
3894
    cell = cell->pNext;
1,842✔
3895
  }
3896
  if (hasRslt && hasIdx) {
903!
3897
    int32_t code = optSysMergeRslt(mRslt, result);
903✔
3898
    if (code != TSDB_CODE_SUCCESS) {
903!
3899
      return code;
×
3900
    }
3901
  }
3902

3903
  for (int i = 0; i < taosArrayGetSize(mRslt); i++) {
909✔
3904
    SArray* aRslt = taosArrayGetP(mRslt, i);
6✔
3905
    taosArrayDestroy(aRslt);
6✔
3906
  }
3907
  taosArrayDestroy(mRslt);
903✔
3908
  if (hasRslt == false) {
903!
3909
    return -2;
×
3910
  }
3911
  if (hasRslt && hasIdx) {
903!
3912
    cell = pList->pHead;
903✔
3913
    for (int i = 0; i < len; i++) {
2,739✔
3914
      if (cell == NULL) break;
1,842!
3915
      SOperatorNode* pOper = (SOperatorNode*)cell->pNode;
1,842✔
3916
      SColumnNode*   pCol = (SColumnNode*)pOper->pLeft;
1,842✔
3917
      if (nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && 0 == strcmp(pCol->colName, "create_time")) {
1,842✔
3918
        return 0;
6✔
3919
      }
3920
      cell = cell->pNext;
1,836✔
3921
    }
3922
    return -1;
897✔
3923
  }
3924
  return -1;
×
3925
}
3926

3927
static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
40✔
3928
  *rowLen = 0;
40✔
3929

3930
  SMetaReader mr = {0};
40✔
3931
  pHandle->api.metaReaderFn.initReader(&mr, pHandle->vnode, META_READER_LOCK, &pHandle->api.metaFn);
40✔
3932
  int32_t code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, uid);
40✔
3933
  if (code != TSDB_CODE_SUCCESS) {
40!
3934
    qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", uid, tstrerror(terrno), idstr);
×
3935
    pHandle->api.metaReaderFn.clearReader(&mr);
×
3936
    return terrno;
×
3937
  }
3938

3939
  if (mr.me.type == TSDB_SUPER_TABLE) {
40✔
3940
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
35✔
3941
    for (int32_t i = 0; i < numOfCols; ++i) {
189✔
3942
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
154✔
3943
    }
3944
  } else if (mr.me.type == TSDB_CHILD_TABLE) {
5!
3945
    uint64_t suid = mr.me.ctbEntry.suid;
×
3946
    tDecoderClear(&mr.coder);
×
3947
    code = pHandle->api.metaReaderFn.getTableEntryByUid(&mr, suid);
×
3948
    if (code != TSDB_CODE_SUCCESS) {
×
3949
      qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno), idstr);
×
3950
      pHandle->api.metaReaderFn.clearReader(&mr);
×
3951
      return terrno;
×
3952
    }
3953

3954
    int32_t numOfCols = mr.me.stbEntry.schemaRow.nCols;
×
3955

3956
    for (int32_t i = 0; i < numOfCols; ++i) {
×
3957
      (*rowLen) += mr.me.stbEntry.schemaRow.pSchema[i].bytes;
×
3958
    }
3959
  } else if (mr.me.type == TSDB_NORMAL_TABLE) {
5!
3960
    int32_t numOfCols = mr.me.ntbEntry.schemaRow.nCols;
5✔
3961
    for (int32_t i = 0; i < numOfCols; ++i) {
15✔
3962
      (*rowLen) += mr.me.ntbEntry.schemaRow.pSchema[i].bytes;
10✔
3963
    }
3964
  }
3965

3966
  pHandle->api.metaReaderFn.clearReader(&mr);
40✔
3967
  return TSDB_CODE_SUCCESS;
40✔
3968
}
3969

3970
static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) {
40✔
3971
  int32_t code = TSDB_CODE_SUCCESS;
40✔
3972
  int32_t lino = 0;
40✔
3973
  if (pOperator->status == OP_EXEC_DONE) {
40✔
3974
    (*ppRes) = NULL;
20✔
3975
    return code;
20✔
3976
  }
3977

3978
  SBlockDistInfo* pBlockScanInfo = pOperator->info;
20✔
3979
  SExecTaskInfo*  pTaskInfo = pOperator->pTaskInfo;
20✔
3980
  SStorageAPI*    pAPI = &pTaskInfo->storageAPI;
20✔
3981

3982
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
20✔
3983
  code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
20✔
3984
                           GET_TASKID(pTaskInfo));
20✔
3985
  QUERY_CHECK_CODE(code, lino, _end);
20!
3986

3987
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
20✔
3988
  QUERY_CHECK_CODE(code, lino, _end);
20!
3989

3990
  code = (int32_t)pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle, &blockDistInfo.numOfInmemRows);
20✔
3991
  QUERY_CHECK_CODE(code, lino, _end);
20!
3992

3993
  SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
20✔
3994

3995
  int32_t          slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
20✔
3996
  SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
20✔
3997
  QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno);
20!
3998

3999
  int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
20✔
4000
  char*   p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
20!
4001
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
20!
4002

4003
  int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
20✔
4004
  if (tempRes < 0) {
20!
4005
    code = terrno;
×
4006
    QUERY_CHECK_CODE(code, lino, _end);
×
4007
  }
4008
  varDataSetLen(p, len);
20✔
4009

4010
  code = colDataSetVal(pColInfo, 0, p, false);
20✔
4011
  QUERY_CHECK_CODE(code, lino, _end);
20!
4012

4013
  taosMemoryFree(p);
20!
4014

4015
  // make the valgrind happy that all memory buffer has been initialized already.
4016
  if (slotId != 0) {
20!
4017
    SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0);
20✔
4018
    QUERY_CHECK_NULL(p1, code, lino, _end, terrno);
20!
4019
    int64_t v = 0;
20✔
4020
    colDataSetInt64(p1, 0, &v);
4021
  }
4022

4023
  pBlock->info.rows = 1;
20✔
4024
  pOperator->status = OP_EXEC_DONE;
20✔
4025

4026
_end:
20✔
4027
  if (code != TSDB_CODE_SUCCESS) {
20!
4028
    qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
4029
    pTaskInfo->code = code;
×
4030
    T_LONG_JMP(pTaskInfo->env, code);
×
4031
  }
4032
  (*ppRes) = pBlock;
20✔
4033
  return code;
20✔
4034
}
4035

4036
static void destroyBlockDistScanOperatorInfo(void* param) {
20✔
4037
  SBlockDistInfo* pDistInfo = (SBlockDistInfo*)param;
20✔
4038
  blockDataDestroy(pDistInfo->pResBlock);
20✔
4039
  if (pDistInfo->readHandle.api.tsdReader.tsdReaderClose != NULL) {
20!
4040
    pDistInfo->readHandle.api.tsdReader.tsdReaderClose(pDistInfo->pHandle);
20✔
4041
  }
4042
  tableListDestroy(pDistInfo->pTableListInfo);
20✔
4043
  taosMemoryFreeClear(param);
20!
4044
}
20✔
4045

4046
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
40✔
4047
  memset(pCond, 0, sizeof(SQueryTableDataCond));
40✔
4048

4049
  pCond->order = TSDB_ORDER_ASC;
40✔
4050
  pCond->numOfCols = 1;
40✔
4051
  pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
40!
4052
  pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t));
40!
4053
  if (pCond->colList == NULL || pCond->pSlotList == NULL) {
40!
4054
    taosMemoryFree(pCond->colList);
×
4055
    taosMemoryFree(pCond->pSlotList);
×
4056
    return terrno;
×
4057
  }
4058

4059
  pCond->colList->colId = 1;
40✔
4060
  pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
40✔
4061
  pCond->colList->bytes = sizeof(TSKEY);
40✔
4062
  pCond->colList->pk = 0;
40✔
4063

4064
  pCond->pSlotList[0] = 0;
40✔
4065

4066
  pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
40✔
4067
  pCond->suid = uid;
40✔
4068
  pCond->type = TIMEWINDOW_RANGE_CONTAINED;
40✔
4069
  pCond->startVersion = -1;
40✔
4070
  pCond->endVersion = -1;
40✔
4071

4072
  return TSDB_CODE_SUCCESS;
40✔
4073
}
4074

4075
int32_t createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
20✔
4076
                                        STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo,
4077
                                        SOperatorInfo** pOptrInfo) {
4078
  QRY_PARAM_CHECK(pOptrInfo);
20!
4079

4080
  int32_t         code = 0;
20✔
4081
  int32_t         lino = 0;
20✔
4082
  SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
20!
4083
  SOperatorInfo*  pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
20!
4084
  if (pInfo == NULL || pOperator == NULL) {
20!
4085
    pTaskInfo->code = code = terrno;
×
4086
    goto _error;
×
4087
  }
4088

4089
  pInfo->pResBlock = createDataBlockFromDescNode(pBlockScanNode->node.pOutputDataBlockDesc);
20✔
4090
  QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, terrno);
20!
4091
  code = blockDataEnsureCapacity(pInfo->pResBlock, 1);
20✔
4092
  QUERY_CHECK_CODE(code, lino, _error);
20!
4093

4094
  {
4095
    SQueryTableDataCond cond = {0};
20✔
4096
    code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
20✔
4097
    QUERY_CHECK_CODE(code, lino, _error);
20!
4098

4099
    pInfo->pTableListInfo = pTableListInfo;
20✔
4100
    int32_t num = 0;
20✔
4101
    code = tableListGetSize(pTableListInfo, &num);
20✔
4102
    QUERY_CHECK_CODE(code, lino, _error);
20!
4103

4104
    void* pList = tableListGetInfo(pTableListInfo, 0);
20✔
4105

4106
    code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock,
20✔
4107
                                                   (void**)&pInfo->pHandle, pTaskInfo->id.str, NULL);
20✔
4108
    cleanupQueryTableDataCond(&cond);
20✔
4109
    QUERY_CHECK_CODE(code, lino, _error);
20!
4110
  }
4111

4112
  pInfo->readHandle = *readHandle;
20✔
4113
  pInfo->uid = (pBlockScanNode->suid != 0) ? pBlockScanNode->suid : pBlockScanNode->uid;
20✔
4114

4115
  int32_t    numOfCols = 0;
20✔
4116
  SExprInfo* pExprInfo = NULL;
20✔
4117
  code = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &pExprInfo, &numOfCols);
20✔
4118
  QUERY_CHECK_CODE(code, lino, _error);
20!
4119

4120
  code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols, &pTaskInfo->storageAPI.functionStore);
20✔
4121
  QUERY_CHECK_CODE(code, lino, _error);
20!
4122

4123
  setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
20✔
4124
                  OP_NOT_OPENED, pInfo, pTaskInfo);
4125
  pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doBlockInfoScanNext, NULL, destroyBlockDistScanOperatorInfo,
20✔
4126
                                         optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
4127
  *pOptrInfo = pOperator;
20✔
4128
  return code;
20✔
4129

4130
_error:
×
4131
  if (pInfo) {
×
4132
    pInfo->pTableListInfo = NULL;
×
4133
    destroyBlockDistScanOperatorInfo(pInfo);
×
4134
  }
4135
  if (pOperator != NULL) {
×
4136
    pOperator->info = NULL;
×
4137
    destroyOperator(pOperator);
×
4138
  }
4139
  return code;
×
4140
}
4141

4142
static int32_t buildTableListInfo(SOperatorInfo* pOperator, STableId* id, STableListInfo** ppTableListInfo) {
20✔
4143
  int32_t            code = TSDB_CODE_SUCCESS;
20✔
4144
  int32_t            line = 0;
20✔
4145
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
20✔
4146
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
20✔
4147
  SSysTableScanInfo* pInfo = pOperator->info;
20✔
4148
  SReadHandle*       pReadHandle = &pInfo->readHandle;
20✔
4149
  SArray*            pList = NULL;
20✔
4150

4151
  STableListInfo* pTableListInfo = tableListCreate();
20✔
4152
  QUERY_CHECK_NULL(ppTableListInfo, code, line, _end, terrno);
20!
4153

4154
  if (id->type == TSDB_SUPER_TABLE) {
20✔
4155
    pList = taosArrayInit(4, sizeof(uint64_t));
16✔
4156
    QUERY_CHECK_NULL(pList, code, line, _end, terrno);
16!
4157

4158
    code = pReadHandle->api.metaFn.getChildTableList(pReadHandle->vnode, id->uid, pList);
16✔
4159
    QUERY_CHECK_CODE(code, line, _end);
16!
4160

4161
    size_t num = taosArrayGetSize(pList);
16✔
4162
    for (int32_t i = 0; i < num; ++i) {
320✔
4163
      uint64_t* id = taosArrayGet(pList, i);
304✔
4164
      if (id == NULL) {
304!
4165
        continue;
×
4166
      }
4167
      code = tableListAddTableInfo(pTableListInfo, *id, 0);
304✔
4168
      QUERY_CHECK_CODE(code, line, _end);
304!
4169
    }
4170
    taosArrayDestroy(pList);
16✔
4171
    pList = NULL;
16✔
4172

4173
  } else if (id->type == TSDB_NORMAL_TABLE) {
4!
4174
    code = tableListAddTableInfo(pTableListInfo, id->uid, 0);
4✔
4175
    QUERY_CHECK_CODE(code, line, _end);
4!
4176
  }
4177
  *ppTableListInfo = pTableListInfo;
20✔
4178
  return code;
20✔
4179
_end:
×
4180
  taosArrayDestroy(pList);
×
4181
  tableListDestroy(pTableListInfo);
×
4182
  return code;
×
4183
}
4184
static int32_t vnodeEstimateDataSizeByUid(SOperatorInfo* pOperator, STableId* id, SDbSizeStatisInfo* pStaticInfo) {
20✔
4185
  int32_t             code = TSDB_CODE_SUCCESS;
20✔
4186
  int32_t             line = 0;
20✔
4187
  SExecTaskInfo*      pTaskInfo = pOperator->pTaskInfo;
20✔
4188
  SStorageAPI*        pAPI = &pTaskInfo->storageAPI;
20✔
4189
  SSysTableScanInfo*  pInfo = pOperator->info;
20✔
4190
  SQueryTableDataCond cond = {0};
20✔
4191

4192
  SReadHandle* pReadHandle = &pInfo->readHandle;
20✔
4193

4194
  STableListInfo* pTableListInfo = NULL;
20✔
4195
  code = buildTableListInfo(pOperator, id, &pTableListInfo);
20✔
4196
  QUERY_CHECK_CODE(code, line, _end);
20!
4197

4198
  tb_uid_t tbId = id->type == TSDB_SUPER_TABLE ? id->uid : 0;
20✔
4199

4200
  code = initTableblockDistQueryCond(tbId, &cond);
20✔
4201
  QUERY_CHECK_CODE(code, line, _end);
20!
4202

4203
  pInfo->pTableListInfo = pTableListInfo;
20✔
4204

4205
  int32_t num = 0;
20✔
4206
  code = tableListGetSize(pTableListInfo, &num);
20✔
4207
  QUERY_CHECK_CODE(code, line, _end);
20!
4208

4209
  void* pList = tableListGetInfo(pTableListInfo, 0);
20✔
4210

4211
  code = pReadHandle->api.tsdReader.tsdReaderOpen(pReadHandle->vnode, &cond, pList, num, NULL, (void**)&pInfo->pHandle,
20✔
4212
                                                  pTaskInfo->id.str, NULL);
20✔
4213
  cleanupQueryTableDataCond(&cond);
20✔
4214
  QUERY_CHECK_CODE(code, line, _end);
20!
4215

4216
  STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
20✔
4217
  code = doGetTableRowSize(pReadHandle, id->uid, (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
20✔
4218
  QUERY_CHECK_CODE(code, line, _end);
20!
4219

4220
  code = pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pInfo->pHandle, &blockDistInfo);
20✔
4221
  QUERY_CHECK_CODE(code, line, _end);
20!
4222

4223
  code = pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pInfo->pHandle, &blockDistInfo.numOfInmemRows);
20✔
4224
  QUERY_CHECK_CODE(code, line, _end);
20!
4225

4226
  int64_t rawDiskSize = 0, rawCacheSize = 0;
20✔
4227
  rawDiskSize = (blockDistInfo.totalRows + blockDistInfo.numOfSttRows) * blockDistInfo.rowSize;
20✔
4228
  rawCacheSize = blockDistInfo.numOfInmemRows * blockDistInfo.rowSize;
20✔
4229
  pStaticInfo->rawDataSize += rawDiskSize;
20✔
4230
  pStaticInfo->cacheSize += rawCacheSize;
20✔
4231

4232
  if (pInfo->pHandle != NULL) {
20!
4233
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
20✔
4234
    pInfo->pHandle = NULL;
20✔
4235
  }
4236

4237
  tableListDestroy(pInfo->pTableListInfo);
20✔
4238
  pInfo->pTableListInfo = NULL;
20✔
4239
  return code;
20✔
4240
_end:
×
4241

4242
  if (pInfo->pHandle != NULL) {
×
4243
    pReadHandle->api.tsdReader.tsdReaderClose(pInfo->pHandle);
×
4244
    pInfo->pHandle = NULL;
×
4245
  }
4246

4247
  tableListDestroy(pInfo->pTableListInfo);
×
4248
  pInfo->pTableListInfo = NULL;
×
4249
  if (code) {
×
4250
    pTaskInfo->code = code;
×
4251
    return code;
×
4252
  }
4253
  cleanupQueryTableDataCond(&cond);
×
4254
  return code;
×
4255
}
4256

4257
static int32_t vnodeEstimateRawDataSizeImpl(SOperatorInfo* pOperator, SArray* pTableList,
16✔
4258
                                            SDbSizeStatisInfo* pStaticInfo) {
4259
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
16✔
4260
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
16✔
4261
  SSysTableScanInfo* pInfo = pOperator->info;
16✔
4262

4263
  int32_t rowLen = 0;
16✔
4264
  int32_t code = TSDB_CODE_SUCCESS;
16✔
4265
  for (int i = 0; i < taosArrayGetSize(pTableList); i++) {
36✔
4266
    STableId* id = (STableId*)taosArrayGet(pTableList, i);
20✔
4267
    code = vnodeEstimateDataSizeByUid(pOperator, id, pStaticInfo);
20✔
4268
    if (code != TSDB_CODE_SUCCESS) {
20!
4269
      return code;
×
4270
    }
4271
  }
4272
  return code;
16✔
4273
}
4274

4275
static int32_t vnodeEstimateRawDataSize(SOperatorInfo* pOperator, SDbSizeStatisInfo* pStaticInfo) {
78✔
4276
  int32_t code = TSDB_CODE_SUCCESS;
78✔
4277

4278
  int32_t line = 0;
78✔
4279

4280
  SExecTaskInfo*     pTaskInfo = pOperator->pTaskInfo;
78✔
4281
  SStorageAPI*       pAPI = &pTaskInfo->storageAPI;
78✔
4282
  SSysTableScanInfo* pInfo = pOperator->info;
78✔
4283
  int32_t            numOfRows = 0;
78✔
4284
  int32_t            ret = 0;
78✔
4285
  if (pStaticInfo->estimateRawData == 0) {
78✔
4286
    pStaticInfo->rawDataSize = 0;
62✔
4287
    return code;
62✔
4288
  }
4289

4290
  if (pStaticInfo->estimateRawData == 0) {
16!
4291
    pStaticInfo->rawDataSize = 0;
×
4292
    return code;
×
4293
  }
4294

4295
  if (pInfo->pCur == NULL) {
16!
4296
    pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
×
4297
    if (pInfo->pCur == NULL) {
×
4298
      TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4299
    }
4300
  }
4301

4302
  SArray* pIdList = taosArrayInit(16, sizeof(STableId));
16✔
4303
  if (pIdList == NULL) {
16!
4304
    TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4305
  }
4306

4307
  while (((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_CHILD_TABLE)) == 0)) {
36✔
4308
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
20✔
4309
      STableId id = {.type = TSDB_SUPER_TABLE, .uid = pInfo->pCur->mr.me.uid};
16✔
4310
      if (taosArrayPush(pIdList, &id) == NULL) {
16!
4311
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4312
      }
4313
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
4!
4314
      continue;
×
4315
    } else if (pInfo->pCur->mr.me.type == TSDB_NORMAL_TABLE) {
4!
4316
      STableId id = {.type = TSDB_NORMAL_TABLE, .uid = pInfo->pCur->mr.me.uid};
4✔
4317
      if (taosArrayPush(pIdList, &id) == NULL) {
4!
4318
        TAOS_CHECK_GOTO(terrno, &line, _exit);
×
4319
      }
4320
    }
4321
  }
4322
  if (pInfo->pCur) {
16!
4323
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
16✔
4324
    pInfo->pCur = NULL;
16✔
4325
  }
4326

4327
  code = vnodeEstimateRawDataSizeImpl(pOperator, pIdList, pStaticInfo);
16✔
4328

4329
_exit:
16✔
4330
  if (pInfo->pCur) {
16!
4331
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
4332
    pInfo->pCur = NULL;
×
4333
  }
4334
  if (code != TSDB_CODE_SUCCESS) {
16!
4335
    qError("%s failed at line %d since %s", __func__, line, tstrerror(code));
×
4336
    pTaskInfo->code = code;
×
4337
  }
4338

4339
  taosArrayDestroy(pIdList);
16✔
4340
  return code;
16✔
4341
}
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