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

taosdata / TDengine / #3903

24 Apr 2025 11:36AM UTC coverage: 55.307% (+0.09%) from 55.213%
#3903

push

travis-ci

happyguoxy
Sync branches at 2025-04-24 19:35

175024 of 316459 relevant lines covered (55.31%)

1151858.11 hits per line

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

199
  return -2;
×
200
}
201

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

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

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

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

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

220
  return -1;
×
221
}
222

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

449
static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) {
×
450
  if (pCond == NULL) {
×
451
    return false;
×
452
  }
453
  if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) {
×
454
    SLogicConditionNode* node = (SLogicConditionNode*)pCond;
×
455
    if (LOGIC_COND_TYPE_AND == node->condType) {
×
456
      SNode* pChild = NULL;
×
457
      FOREACH(pChild, node->pParameterList) {
×
458
        if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) {
×
459
          return true;
×
460
        }
461
      }
462
    }
463
  }
464

465
  if (QUERY_NODE_OPERATOR == nodeType(pCond)) {
×
466
    return sysTableIsOperatorCondOnOneTable(pCond, condTable);
×
467
  }
468

469
  return false;
×
470
}
471

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

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

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

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

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

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

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

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

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

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

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

561
  code = tNameGetDbName(&sn, varDataVal(dbname));
×
562
  QUERY_CHECK_CODE(code, lino, _end);
×
563

564
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
565

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

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

584
  if (pOperator->status == OP_EXEC_DONE) {
×
585
    return NULL;
×
586
  }
587

588
  blockDataCleanup(pInfo->pRes);
×
589

590
  pDataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_COLS);
×
591
  QUERY_CHECK_NULL(pDataBlock, code, lino, _end, terrno);
×
592

593
  code = blockDataEnsureCapacity(pDataBlock, pOperator->resultInfo.capacity);
×
594
  QUERY_CHECK_CODE(code, lino, _end);
×
595

596
  code = doExtractDbName(dbname, pInfo, pAPI);
×
597
  QUERY_CHECK_CODE(code, lino, _end);
×
598

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

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

617
  if (pInfo->pSchema == NULL) {
×
618
    pInfo->pSchema = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
×
619
    taosHashSetFreeFp(pInfo->pSchema, tDeleteSSchemaWrapperForHash);
×
620
  }
621

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

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

633
    SSchemaWrapper* schemaRow = NULL;
×
634
    SColRefWrapper* colRef = NULL;
×
635

636
    if (pInfo->pCur->mr.me.type == TSDB_SUPER_TABLE) {
×
637
      qDebug("sysTableScanUserCols cursor get super table, %s", GET_TASKID(pTaskInfo));
×
638
      void* schema = taosHashGet(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t));
×
639
      if (schema == NULL) {
×
640
        SSchemaWrapper* schemaWrapper = tCloneSSchemaWrapper(&pInfo->pCur->mr.me.stbEntry.schemaRow);
×
641
        if (pInfo->pCur->mr.me.stbEntry.schemaRow.pSchema) {
×
642
          QUERY_CHECK_NULL(schemaWrapper, code, lino, _end, terrno);
×
643
        }
644
        code = taosHashPut(pInfo->pSchema, &pInfo->pCur->mr.me.uid, sizeof(int64_t), &schemaWrapper, POINTER_BYTES);
×
645
        if (code == TSDB_CODE_DUP_KEY) {
×
646
          code = TSDB_CODE_SUCCESS;
×
647
        }
648
        QUERY_CHECK_CODE(code, lino, _end);
×
649
      }
650
      continue;
×
651
    } else if (pInfo->pCur->mr.me.type == TSDB_CHILD_TABLE) {
×
652
      qDebug("sysTableScanUserCols cursor get child table, %s", GET_TASKID(pTaskInfo));
×
653

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

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

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

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

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

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

762
  if (numOfRows > 0) {
×
763
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
764
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, pDataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
765
    numOfRows = 0;
×
766
  }
767

768
  blockDataDestroy(pDataBlock);
×
769
  pDataBlock = NULL;
×
770
  if (ret != 0) {
×
771
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
772
    pInfo->pCur = NULL;
×
773
    setOperatorCompleted(pOperator);
×
774
  }
775

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

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

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

796
  SSysTableScanInfo* pInfo = pOperator->info;
×
797
  if (pOperator->status == OP_EXEC_DONE) {
×
798
    return NULL;
×
799
  }
800

801
  blockDataCleanup(pInfo->pRes);
×
802
  int32_t numOfRows = 0;
×
803

804
  dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS);
×
805
  QUERY_CHECK_NULL(dataBlock, code, lino, _end, terrno);
×
806

807
  code = blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity);
×
808
  QUERY_CHECK_CODE(code, lino, _end);
×
809

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

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

819
  code = tNameGetDbName(&sn, varDataVal(dbname));
×
820
  QUERY_CHECK_CODE(code, lino, _end);
×
821

822
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
823

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

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

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

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

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

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

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

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

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

886
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
×
887
    if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE && pInfo->pCur->mr.me.type != TSDB_VIRTUAL_CHILD_TABLE) {
×
888
      continue;
×
889
    }
890

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

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

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

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

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

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

936
  if (numOfRows > 0) {
×
937
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
×
938
    relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo, pTaskInfo);
×
939
    numOfRows = 0;
×
940
  }
941

942
  blockDataDestroy(dataBlock);
×
943
  dataBlock = NULL;
×
944
  if (ret != 0) {
×
945
    pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
×
946
    pInfo->pCur = NULL;
×
947
    setOperatorCompleted(pOperator);
×
948
  }
949

950
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
×
951

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

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

971
  code = relocateColumnData(pInfo->pRes, pInfo->matchInfo.pList, dataBlock->pDataBlock, false);
×
972
  QUERY_CHECK_CODE(code, lino, _end);
×
973

974
  code = doFilter(pInfo->pRes, pFilterInfo, NULL);
×
975
  QUERY_CHECK_CODE(code, lino, _end);
×
976

977
  blockDataCleanup(dataBlock);
×
978

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

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

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

995
    case TSDB_DATA_TYPE_BOOL:
×
996
      n = tsnprintf(str, strBuffLen, (*(int8_t*)buf) ? "true" : "false");
×
997
      break;
×
998

999
    case TSDB_DATA_TYPE_TINYINT:
×
1000
      n = tsnprintf(str, strBuffLen, "%d", *(int8_t*)buf);
×
1001
      break;
×
1002

1003
    case TSDB_DATA_TYPE_SMALLINT:
×
1004
      n = tsnprintf(str, strBuffLen, "%d", *(int16_t*)buf);
×
1005
      break;
×
1006

1007
    case TSDB_DATA_TYPE_INT:
×
1008
      n = tsnprintf(str, strBuffLen, "%d", *(int32_t*)buf);
×
1009
      break;
×
1010

1011
    case TSDB_DATA_TYPE_BIGINT:
×
1012
    case TSDB_DATA_TYPE_TIMESTAMP:
1013
      n = tsnprintf(str, strBuffLen, "%" PRId64, *(int64_t*)buf);
×
1014
      break;
×
1015

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

1020
    case TSDB_DATA_TYPE_DOUBLE:
×
1021
      n = tsnprintf(str, strBuffLen, "%.9f", GET_DOUBLE_VAL(buf));
×
1022
      break;
×
1023

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

1031
      memcpy(str, buf, bufSize);
×
1032
      n = bufSize;
×
1033
      break;
×
1034
    case TSDB_DATA_TYPE_NCHAR:
×
1035
      if (bufSize < 0) {
×
1036
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1037
      }
1038

1039
      int32_t length = taosUcs4ToMbs((TdUcs4*)buf, bufSize, str, NULL);
×
1040
      if (length <= 0) {
×
1041
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1042
      }
1043
      n = length;
×
1044
      break;
×
1045
    case TSDB_DATA_TYPE_UTINYINT:
×
1046
      n = tsnprintf(str, strBuffLen, "%u", *(uint8_t*)buf);
×
1047
      break;
×
1048

1049
    case TSDB_DATA_TYPE_USMALLINT:
×
1050
      n = tsnprintf(str, strBuffLen, "%u", *(uint16_t*)buf);
×
1051
      break;
×
1052

1053
    case TSDB_DATA_TYPE_UINT:
×
1054
      n = tsnprintf(str, strBuffLen, "%u", *(uint32_t*)buf);
×
1055
      break;
×
1056

1057
    case TSDB_DATA_TYPE_UBIGINT:
×
1058
      n = tsnprintf(str, strBuffLen, "%" PRIu64, *(uint64_t*)buf);
×
1059
      break;
×
1060

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

1065
  if (len) *len = n;
×
1066

1067
  return TSDB_CODE_SUCCESS;
×
1068
}
1069

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

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

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

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

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

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

1106
  int32_t numOfRows = *pNumOfRows;
×
1107

1108
  int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols;
×
1109
  for (int32_t i = 0; i < numOfTags; ++i) {
×
1110
    SColumnInfoData* pColInfoData = NULL;
×
1111

1112
    // table name
1113
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
×
1114
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1115
    code = colDataSetVal(pColInfoData, numOfRows, tableName, false);
×
1116
    QUERY_CHECK_CODE(code, lino, _end);
×
1117

1118
    // database name
1119
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
×
1120
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1121
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
×
1122
    QUERY_CHECK_CODE(code, lino, _end);
×
1123

1124
    // super table name
1125
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
×
1126
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1127
    code = colDataSetVal(pColInfoData, numOfRows, stableName, false);
×
1128
    QUERY_CHECK_CODE(code, lino, _end);
×
1129

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

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

1151
    if (tagType == TSDB_DATA_TYPE_NCHAR) {
×
1152
      tagTypeLen += tsnprintf(
×
1153
          varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
×
1154
          (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
1155
    } else if (IS_VAR_DATA_TYPE(tagType)) {
×
1156
      tagTypeLen += tsnprintf(varDataVal(tagTypeStr) + tagTypeLen, tagStrBufflen, "(%d)",
×
1157
                              (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE));
×
1158
    }
1159
    varDataSetLen(tagTypeStr, tagTypeLen);
×
1160
    code = colDataSetVal(pColInfoData, numOfRows, (char*)tagTypeStr, false);
×
1161
    QUERY_CHECK_CODE(code, lino, _end);
×
1162

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

1168
    if (tagType == TSDB_DATA_TYPE_JSON) {
×
1169
      tagData = (char*)smrChildTable->me.ctbEntry.pTags;
×
1170
    } else {
1171
      bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal);
×
1172
      if (exist) {
×
1173
        if (tagType == TSDB_DATA_TYPE_GEOMETRY) {
×
1174
          code = sysTableGetGeomText(tagVal.pData, tagVal.nData, &tagData, &tagLen);
×
1175
          QUERY_CHECK_CODE(code, lino, _end);
×
1176
        } else if (tagType == TSDB_DATA_TYPE_VARBINARY) {
×
1177
          code = taosAscii2Hex(tagVal.pData, tagVal.nData, (void**)&tagData, &tagLen);
×
1178
          if (code < 0) {
×
1179
            qError("varbinary for systable failed since %s", tstrerror(code));
×
1180
          }
1181
        } else if (IS_VAR_DATA_TYPE(tagType)) {
×
1182
          tagData = (char*)tagVal.pData;
×
1183
          tagLen = tagVal.nData;
×
1184
        } else {
1185
          tagData = (char*)&tagVal.i64;
×
1186
          tagLen = tDataTypes[tagType].bytes;
×
1187
        }
1188
      }
1189
    }
1190

1191
    char* tagVarChar = NULL;
×
1192
    if (tagData != NULL) {
×
1193
      if (tagType == TSDB_DATA_TYPE_JSON) {
×
1194
        char* tagJson = NULL;
×
1195
        parseTagDatatoJson(tagData, &tagJson, NULL);
×
1196
        if (tagJson == NULL) {
×
1197
          code = terrno;
×
1198
          goto _end;
×
1199
        }
1200
        tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE);
×
1201
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
×
1202
        memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson));
×
1203
        varDataSetLen(tagVarChar, strlen(tagJson));
×
1204
        taosMemoryFree(tagJson);
×
1205
      } else {
1206
        int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE)
×
1207
                                                    : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE);
1208
        tagVarChar = taosMemoryCalloc(1, bufSize + 1);
×
1209
        QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno);
×
1210
        int32_t len = -1;
×
1211
        if (tagLen > 0)
×
1212
          convertTagDataToStr(varDataVal(tagVarChar), bufSize + 1 - VARSTR_HEADER_SIZE, tagType, tagData, tagLen, &len);
×
1213
        else
1214
          len = 0;
×
1215
        varDataSetLen(tagVarChar, len);
×
1216
      }
1217
    }
1218
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
×
1219
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1220
    code = colDataSetVal(pColInfoData, numOfRows, tagVarChar,
×
1221
                         (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData)));
×
1222
    QUERY_CHECK_CODE(code, lino, _end);
×
1223

1224
    if (tagType == TSDB_DATA_TYPE_GEOMETRY || tagType == TSDB_DATA_TYPE_VARBINARY) taosMemoryFreeClear(tagData);
×
1225
    taosMemoryFree(tagVarChar);
×
1226
    ++numOfRows;
×
1227
  }
1228

1229
  *pNumOfRows = numOfRows;
×
1230

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

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

1249
  int32_t numOfCols = schemaRow->nCols;
×
1250
  for (int32_t i = 0; i < numOfCols; ++i) {
×
1251
    SColumnInfoData* pColInfoData = NULL;
×
1252

1253
    // table name
1254
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0);
×
1255
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1256
    code = colDataSetVal(pColInfoData, numOfRows, tName, false);
×
1257
    QUERY_CHECK_CODE(code, lino, _end);
×
1258

1259
    // database name
1260
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1);
×
1261
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1262
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
×
1263
    QUERY_CHECK_CODE(code, lino, _end);
×
1264

1265
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2);
×
1266
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1267
    code = colDataSetVal(pColInfoData, numOfRows, tableType, false);
×
1268
    QUERY_CHECK_CODE(code, lino, _end);
×
1269

1270
    // col name
1271
    char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
×
1272
    STR_TO_VARSTR(colName, schemaRow->pSchema[i].name);
×
1273
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3);
×
1274
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1275
    code = colDataSetVal(pColInfoData, numOfRows, colName, false);
×
1276
    QUERY_CHECK_CODE(code, lino, _end);
×
1277

1278
    // col type
1279
    int8_t colType = schemaRow->pSchema[i].type;
×
1280
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4);
×
1281
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1282
    int32_t colStrBufflen = 32;
×
1283
    char    colTypeStr[VARSTR_HEADER_SIZE + 32];
1284
    int     colTypeLen = tsnprintf(varDataVal(colTypeStr), colStrBufflen, "%s", tDataTypes[colType].name);
×
1285
    colStrBufflen -= colTypeLen;
×
1286
    if (colStrBufflen <= 0) {
×
1287
      code = TSDB_CODE_INVALID_PARA;
×
1288
      QUERY_CHECK_CODE(code, lino, _end);
×
1289
    }
1290
    if (colType == TSDB_DATA_TYPE_VARCHAR) {
×
1291
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
×
1292
                              (int32_t)(schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE));
×
1293
    } else if (colType == TSDB_DATA_TYPE_NCHAR) {
×
1294
      colTypeLen += tsnprintf(varDataVal(colTypeStr) + colTypeLen, colStrBufflen, "(%d)",
×
1295
                              (int32_t)((schemaRow->pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
×
1296
    }
1297
    varDataSetLen(colTypeStr, colTypeLen);
×
1298
    code = colDataSetVal(pColInfoData, numOfRows, (char*)colTypeStr, false);
×
1299
    QUERY_CHECK_CODE(code, lino, _end);
×
1300

1301
    pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5);
×
1302
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1303
    code = colDataSetVal(pColInfoData, numOfRows, (const char*)&schemaRow->pSchema[i].bytes, false);
×
1304
    QUERY_CHECK_CODE(code, lino, _end);
×
1305

1306
    for (int32_t j = 6; j <= 8; ++j) {
×
1307
      pColInfoData = taosArrayGet(dataBlock->pDataBlock, j);
×
1308
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
×
1309
      colDataSetNULL(pColInfoData, numOfRows);
×
1310
    }
1311

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

1327
      code = colDataSetVal(pColInfoData, numOfRows, (char *)refColName, false);
×
1328
      QUERY_CHECK_CODE(code, lino, _end);
×
1329
    }
1330
    ++numOfRows;
×
1331
  }
1332

1333
  *pNumOfRows = numOfRows;
×
1334

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

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

1347
  int32_t index = 0;
38✔
1348
  for (int32_t i = 0; i < size; ++i) {
380✔
1349
    if (strcmp(pMeta[i].name, tableName) == 0) {
380✔
1350
      index = i;
38✔
1351
      break;
38✔
1352
    }
1353
  }
1354

1355
  SSDataBlock* pBlock = NULL;
38✔
1356
  int32_t      code = createDataBlock(&pBlock);
38✔
1357
  if (code) {
38✔
1358
    terrno = code;
×
1359
    return NULL;
×
1360
  }
1361

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

1375
  return pBlock;
38✔
1376
}
1377

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

1385
  for (int32_t i = 0; i < size; ++i) {
225✔
1386
    const SSysTableMeta* pm = &pSysDbTableMeta[i];
215✔
1387
    if (!sysInfo && pm->sysInfo) {
215✔
1388
      continue;
×
1389
    }
1390

1391
    if (strcmp(pm->name, TSDB_INS_TABLE_USERS_FULL) == 0) {
215✔
1392
      continue;
5✔
1393
    }
1394

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

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

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

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

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

1420
    for (int32_t j = 4; j <= 8; ++j) {
1,260✔
1421
      pColInfoData = taosArrayGet(p->pDataBlock, j);
1,050✔
1422
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
1,050✔
1423
      colDataSetNULL(pColInfoData, numOfRows);
1,050✔
1424
    }
1425

1426
    STR_TO_VARSTR(n, "SYSTEM_TABLE");
210✔
1427

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

1433
    numOfRows += 1;
210✔
1434
  }
1435

1436
  *pRows = numOfRows;
10✔
1437

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

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

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

1454
  size_t               size = 0;
5✔
1455
  const SSysTableMeta* pSysDbTableMeta = NULL;
5✔
1456

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

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

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

1469
  blockDataDestroy(p);
5✔
1470
  p = NULL;
5✔
1471

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

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

1491
  STR_TO_VARSTR(n, pMReader->me.name);
×
1492

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

1497
  code = colDataSetVal(pColInfoData, rowIndex, n, false);
×
1498
  QUERY_CHECK_CODE(code, lino, _end);
×
1499

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

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

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

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

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

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

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

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

1553
    code = colDataSetVal(pColInfoData, rowIndex, n, false);
×
1554
    pMetaReaderFn->clearReader(&mr1);
×
1555
    QUERY_CHECK_CODE(code, lino, _end);
×
1556

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

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

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

1586
    STR_TO_VARSTR(n, "CHILD_TABLE");
×
1587

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1754
  int ret = 0;
×
1755

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

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

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

1768
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
1769

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

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

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

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

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

1788
    pAPI->metaReaderFn.clearReader(&mr);
×
1789
    QUERY_CHECK_CODE(code, lino, _end);
×
1790

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

1794
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
×
1795
    QUERY_CHECK_CODE(code, lino, _end);
×
1796

1797
    if (++numOfRows >= pOperator->resultInfo.capacity) {
×
1798
      p->info.rows = numOfRows;
×
1799
      pInfo->pRes->info.rows = numOfRows;
×
1800

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

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

1807
      blockDataCleanup(p);
×
1808
      numOfRows = 0;
×
1809

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

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

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

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

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

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

1836
  blockDataDestroy(p);
×
1837
  p = NULL;
×
1838

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

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

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

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

1874
  blockDataCleanup(pInfo->pRes);
33✔
1875
  int32_t numOfRows = 0;
33✔
1876

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

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

1886
  code = tNameGetDbName(&sn, varDataVal(dbname));
33✔
1887
  QUERY_CHECK_CODE(code, lino, _end);
33✔
1888

1889
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
33✔
1890

1891
  p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES);
33✔
1892
  QUERY_CHECK_NULL(p, code, lino, _end, terrno);
33✔
1893

1894
  code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity);
33✔
1895
  QUERY_CHECK_CODE(code, lino, _end);
33✔
1896

1897
  char n[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
33✔
1898

1899
  int32_t ret = 0;
33✔
1900
  while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) {
439✔
1901
    STR_TO_VARSTR(n, pInfo->pCur->mr.me.name);
406✔
1902

1903
    // table name
1904
    SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0);
406✔
1905
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
406✔
1906
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
406✔
1907
    QUERY_CHECK_CODE(code, lino, _end);
406✔
1908

1909
    // database name
1910
    pColInfoData = taosArrayGet(p->pDataBlock, 1);
406✔
1911
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
406✔
1912
    code = colDataSetVal(pColInfoData, numOfRows, dbname, false);
406✔
1913
    QUERY_CHECK_CODE(code, lino, _end);
406✔
1914

1915
    // vgId
1916
    pColInfoData = taosArrayGet(p->pDataBlock, 6);
406✔
1917
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
406✔
1918
    code = colDataSetVal(pColInfoData, numOfRows, (char*)&vgId, false);
406✔
1919
    QUERY_CHECK_CODE(code, lino, _end);
406✔
1920

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

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

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

1945
      if (isTsmaResSTb(mr.me.name)) {
403✔
1946
        pAPI->metaReaderFn.clearReader(&mr);
×
1947
        continue;
×
1948
      }
1949

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

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

1964
      // table comment
1965
      pColInfoData = taosArrayGet(p->pDataBlock, 8);
402✔
1966
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
402✔
1967
      if (pInfo->pCur->mr.me.ctbEntry.commentLen > 0) {
402✔
1968
        char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
×
1969
        STR_TO_VARSTR(comment, pInfo->pCur->mr.me.ctbEntry.comment);
×
1970
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
×
1971
        QUERY_CHECK_CODE(code, lino, _end);
×
1972
      } else if (pInfo->pCur->mr.me.ctbEntry.commentLen == 0) {
402✔
1973
        char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
×
1974
        STR_TO_VARSTR(comment, "");
×
1975
        code = colDataSetVal(pColInfoData, numOfRows, comment, false);
×
1976
        QUERY_CHECK_CODE(code, lino, _end);
×
1977
      } else {
1978
        colDataSetNULL(pColInfoData, numOfRows);
402✔
1979
      }
1980

1981
      // uid
1982
      pColInfoData = taosArrayGet(p->pDataBlock, 5);
402✔
1983
      QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
402✔
1984
      code = colDataSetVal(pColInfoData, numOfRows, (char*)&pInfo->pCur->mr.me.uid, false);
402✔
1985
      QUERY_CHECK_CODE(code, lino, _end);
403✔
1986

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2138
    pColInfoData = taosArrayGet(p->pDataBlock, 9);
406✔
2139
    QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno);
405✔
2140
    code = colDataSetVal(pColInfoData, numOfRows, n, false);
405✔
2141
    QUERY_CHECK_CODE(code, lino, _end);
406✔
2142

2143
    if (++numOfRows >= pOperator->resultInfo.capacity) {
406✔
2144
      p->info.rows = numOfRows;
×
2145
      pInfo->pRes->info.rows = numOfRows;
×
2146

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

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

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

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

2163
  if (numOfRows > 0) {
33✔
2164
    pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
27✔
2165
    p->info.rows = numOfRows;
27✔
2166
    pInfo->pRes->info.rows = numOfRows;
27✔
2167

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

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

2174
    blockDataCleanup(p);
27✔
2175
    numOfRows = 0;
27✔
2176
  }
2177

2178
  blockDataDestroy(p);
33✔
2179
  p = NULL;
33✔
2180

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

2188
  pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
33✔
2189

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

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

2212
  pStaticsInfo->vgId = vgId;
×
2213

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

2217
  code = vnodeEstimateRawDataSize(pOperator, pStaticsInfo);
×
2218
  QUERY_CHECK_CODE(code, lino, _end);
×
2219

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

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

2241
  char*        buf = NULL;
×
2242
  SSDataBlock* p = NULL;
×
2243

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

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

2261
  SSDataBlock* pBlock = pInfo->pRes;
×
2262

2263
  code = buildVgDiskUsage(pOperator, &staticsInfo);
×
2264
  QUERY_CHECK_CODE(code, lino, _end);
×
2265

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

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

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

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

2283
    varDataSetLen(buf, len);
×
2284

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

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

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

2309
    varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
2310

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2369
    blockDataDestroy(p);
×
2370
    p = NULL;
×
2371

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

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

2396
  SNode* pCondition = pInfo->pCondition;
69✔
2397
  if (pOperator->status == OP_EXEC_DONE) {
69✔
2398
    return NULL;
32✔
2399
  }
2400

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

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

2410
    setOperatorCompleted(pOperator);
5✔
2411
    return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
5✔
2412
  } else {
2413
    if (pInfo->showRewrite == false) {
32✔
2414
      if (pCondition != NULL && pInfo->pIdx == NULL) {
23✔
2415
        SSTabFltArg arg = {
6✔
2416
            .pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
6✔
2417

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

2425
        pInfo->pIdx = idx;  // set idx arg
6✔
2426

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

2441
    return sysTableBuildUserTables(pOperator);
32✔
2442
  }
2443

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

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

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

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

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

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

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

2491
  // TODO
2492

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

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

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

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

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

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

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

2526
  varDataSetLen(dbname, strlen(varDataVal(dbname)));
×
2527

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2667
  blockDataDestroy(p);
×
2668
  p = NULL;
×
2669

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

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

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

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

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

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

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

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

2729
    return sysTableBuildUserFileSets(pOperator);
×
2730
  }
2731

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

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

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

2752
  switch (nType) {
972✔
2753
    case QUERY_NODE_OPERATOR: {
311✔
2754
      SOperatorNode* node = (SOperatorNode*)pNode;
311✔
2755
      if (OP_TYPE_EQUAL == node->opType) {
311✔
2756
        *(int32_t*)pContext = 1;
311✔
2757
        return DEAL_RES_CONTINUE;
311✔
2758
      }
2759

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

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

2774
      *(int32_t*)pContext = 0;
×
2775
      return DEAL_RES_CONTINUE;
×
2776
    }
2777
    case QUERY_NODE_VALUE: {
311✔
2778
      if (2 != *(int32_t*)pContext) {
311✔
2779
        return DEAL_RES_CONTINUE;
×
2780
      }
2781

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

2793
static void getDBNameFromCondition(SNode* pCondition, const char* dbName) {
397✔
2794
  if (NULL == pCondition) {
397✔
2795
    return;
86✔
2796
  }
2797
  nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName);
311✔
2798
}
2799

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

2806
  while (1) {
×
2807
    if (isTaskKilled(pOperator->pTaskInfo)) {
549✔
2808
      setOperatorCompleted(pOperator);
×
2809
      (*ppRes) = NULL;
×
2810
      break;
×
2811
    }
2812

2813
    blockDataCleanup(pInfo->pRes);
549✔
2814

2815
    const char* name = tNameGetTableName(&pInfo->name);
549✔
2816
    if (pInfo->showRewrite) {
549✔
2817
      getDBNameFromCondition(pInfo->pCondition, dbName);
397✔
2818
      if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
397✔
2819
          strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
397✔
2820
          strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
397✔
2821
        TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
397✔
2822
      }
2823
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
152✔
2824
      getDBNameFromCondition(pInfo->pCondition, dbName);
×
2825
      if (dbName[0]) TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
×
2826
      (void)sysTableIsCondOnOneTable(pInfo->pCondition, pInfo->req.filterTb);
×
2827
    }
2828
    bool         filter = true;
548✔
2829
    SSDataBlock* pBlock = NULL;
548✔
2830
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
548✔
2831
      pBlock = sysTableScanUserTables(pOperator);
69✔
2832
    } else if (strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0) {
479✔
2833
      pBlock = sysTableScanUserTags(pOperator);
×
2834
    } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->readHandle.mnd == NULL) {
479✔
2835
      pBlock = sysTableScanUserCols(pOperator);
×
2836
    } else if (strncasecmp(name, TSDB_INS_TABLE_STABLES, TSDB_TABLE_FNAME_LEN) == 0 && pInfo->showRewrite &&
479✔
2837
               IS_SYS_DBNAME(dbName)) {
40✔
2838
      pBlock = sysTableScanUserSTables(pOperator);
×
2839
    } else if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
479✔
2840
      pBlock = sysTableScanUsage(pOperator);
×
2841
    } else if (strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
479✔
2842
      pBlock = sysTableScanUserFileSets(pOperator);
×
2843
    } else {  // load the meta from mnode of the given epset
2844
      pBlock = sysTableScanFromMNode(pOperator, pInfo, name, pTaskInfo);
479✔
2845
    }
2846

2847
    if (!pInfo->skipFilterTable) sysTableScanFillTbName(pOperator, pInfo, name, pBlock);
549✔
2848
    if (pBlock != NULL) {
549✔
2849
      bool limitReached = applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo);
263✔
2850
      if (limitReached) {
263✔
2851
        setOperatorCompleted(pOperator);
×
2852
      }
2853

2854
      if (pBlock->info.rows == 0) {
263✔
2855
        continue;
×
2856
      }
2857
      (*ppRes) = pBlock;
263✔
2858
    } else {
2859
      (*ppRes) = NULL;
286✔
2860
    }
2861
    break;
549✔
2862
  }
2863

2864
_end:
549✔
2865
  if (pTaskInfo->code) {
549✔
2866
    qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code));
×
2867
    T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
×
2868
  }
2869
  return pTaskInfo->code;
549✔
2870
}
2871

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

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

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

2891
  code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
263✔
2892
  QUERY_CHECK_CODE(code, lino, _end);
263✔
2893

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

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

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

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

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

2936
    int32_t msgType = (strcasecmp(name, TSDB_INS_TABLE_DNODE_VARIABLES) == 0) ? TDMT_DND_SYSTABLE_RETRIEVE
496✔
2937
                                                                              : TDMT_MND_SYSTABLE_RETRIEVE;
248✔
2938

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

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

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

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

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

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

2974
      if (pRsp->numOfRows == 0) {
248✔
2975
        taosMemoryFree(pRsp);
16✔
2976
        return NULL;
16✔
2977
      }
2978
    }
2979

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

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

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

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

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

3025
  int32_t num = 0;
286✔
3026
  code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &num, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
286✔
3027
  QUERY_CHECK_CODE(code, lino, _error);
286✔
3028

3029
  extractTbnameSlotId(pInfo, pScanNode);
286✔
3030

3031
  pInfo->pAPI = &pTaskInfo->storageAPI;
286✔
3032

3033
  pInfo->accountId = pScanPhyNode->accountId;
286✔
3034
  pInfo->pUser = taosStrdup((void*)pUser);
286✔
3035
  QUERY_CHECK_NULL(pInfo->pUser, code, lino, _error, terrno);
286✔
3036
  pInfo->sysInfo = pScanPhyNode->sysInfo;
286✔
3037
  pInfo->showRewrite = pScanPhyNode->showRewrite;
286✔
3038
  pInfo->pRes = createDataBlockFromDescNode(pDescNode);
286✔
3039
  QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno);
286✔
3040

3041
  pInfo->pCondition = pScanNode->node.pConditions;
286✔
3042

3043
  tNameAssign(&pInfo->name, &pScanNode->tableName);
286✔
3044
  const char* name = tNameGetTableName(&pInfo->name);
286✔
3045
  if (pInfo->showRewrite == false) {
286✔
3046
    code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
77✔
3047
  } else {
3048
    if (strncasecmp(name, TSDB_INS_DISK_USAGE, TSDB_TABLE_FNAME_LEN) == 0) {
209✔
3049
      pInfo->skipFilterTable = true;
×
3050
      code = filterInitFromNode(NULL, &pOperator->exprSupp.pFilterInfo, 0);
×
3051
    } else {
3052
      code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
209✔
3053
    }
3054
  }
3055
  QUERY_CHECK_CODE(code, lino, _error);
286✔
3056

3057
  initLimitInfo(pScanPhyNode->scan.node.pLimit, pScanPhyNode->scan.node.pSlimit, &pInfo->limitInfo);
286✔
3058
  initResultSizeInfo(&pOperator->resultInfo, 4096);
286✔
3059
  code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
286✔
3060
  QUERY_CHECK_CODE(code, lino, _error);
286✔
3061

3062
  if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
286✔
3063
      strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
248✔
3064
      strncasecmp(name, TSDB_INS_TABLE_FILESETS, TSDB_TABLE_FNAME_LEN) == 0) {
248✔
3065
    pInfo->readHandle = *(SReadHandle*)readHandle;
38✔
3066
  } else {
3067
    if (tsem_init(&pInfo->ready, 0, 0) != TSDB_CODE_SUCCESS) {
248✔
3068
      code = TSDB_CODE_FAILED;
×
3069
      goto _error;
×
3070
    }
3071
    pInfo->epSet = pScanPhyNode->mgmtEpSet;
248✔
3072
    pInfo->readHandle = *(SReadHandle*)readHandle;
248✔
3073
  }
3074

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

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

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

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

3126
  if (pInfo->name.type == TSDB_TABLE_NAME_T) {
285✔
3127
    const char* name = tNameGetTableName(&pInfo->name);
285✔
3128
    if (strncasecmp(name, TSDB_INS_TABLE_TABLES, TSDB_TABLE_FNAME_LEN) == 0 ||
285✔
3129
        strncasecmp(name, TSDB_INS_TABLE_TAGS, TSDB_TABLE_FNAME_LEN) == 0 ||
248✔
3130
        strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0 || pInfo->pCur != NULL) {
248✔
3131
      if (pInfo->pAPI != NULL && pInfo->pAPI->metaFn.closeTableMetaCursor != NULL) {
37✔
3132
        pInfo->pAPI->metaFn.closeTableMetaCursor(pInfo->pCur);
32✔
3133
      }
3134

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

3141
  if (pInfo->pIdx) {
285✔
3142
    taosArrayDestroy(pInfo->pIdx->uids);
6✔
3143
    taosMemoryFree(pInfo->pIdx);
6✔
3144
    pInfo->pIdx = NULL;
6✔
3145
  }
3146

3147
  if (pInfo->pSchema) {
285✔
3148
    taosHashCleanup(pInfo->pSchema);
×
3149
    pInfo->pSchema = NULL;
×
3150
  }
3151

3152
  taosArrayDestroy(pInfo->matchInfo.pList);
285✔
3153
  taosMemoryFreeClear(pInfo->pUser);
286✔
3154

3155
  taosMemoryFreeClear(param);
286✔
3156
}
286✔
3157

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

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

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

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

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

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

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

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

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

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

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

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

3282
  SOperatorNode* pNode = (SOperatorNode*)cond;
8✔
3283

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

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

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

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

3300
  SOperatorNode* pOper = (SOperatorNode*)pOpear;
8✔
3301
  if (pOper->opType < OP_TYPE_GREATER_THAN || pOper->opType > OP_TYPE_NOT_EQUAL) {
8✔
3302
    return -1;
×
3303
  }
3304

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

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

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

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

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

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

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

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

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

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

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

3425
  int32_t len = LIST_LENGTH(pList);
2✔
3426

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3564
  SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
5✔
3565

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

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

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

3581
  code = colDataSetVal(pColInfo, 0, p, false);
5✔
3582
  QUERY_CHECK_CODE(code, lino, _end);
5✔
3583

3584
  taosMemoryFree(p);
5✔
3585

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

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

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

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

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

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

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

3635
  pCond->pSlotList[0] = 0;
5✔
3636

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

3643
  return TSDB_CODE_SUCCESS;
5✔
3644
}
3645

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3774
  pInfo->pTableListInfo = pTableListInfo;
×
3775

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3849
  int32_t line = 0;
×
3850

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

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

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

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

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

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

3901
  taosArrayDestroy(pIdList);
×
3902
  return code;
×
3903
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc