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

taosdata / TDengine / #4829

30 Oct 2025 09:25AM UTC coverage: 49.734% (-11.3%) from 61.071%
#4829

push

travis-ci

web-flow
Merge pull request #33435 from taosdata/3.0

merge 3.0

123072 of 323930 branches covered (37.99%)

Branch coverage included in aggregate %.

7 of 25 new or added lines in 3 files covered. (28.0%)

35232 existing lines in 327 files now uncovered.

172062 of 269495 relevant lines covered (63.85%)

70709785.06 hits per line

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

48.27
/source/libs/command/src/command.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 "command.h"
17
#include "catalog.h"
18
#include "commandInt.h"
19
#include "decimal.h"
20
#include "scheduler.h"
21
#include "systable.h"
22
#include "taosdef.h"
23
#include "tdatablock.h"
24
#include "tdataformat.h"
25
#include "tglobal.h"
26
#include "tgrant.h"
27

28
#define COL_DATA_SET_VAL_AND_CHECK(pCol, rows, buf, isNull) \
29
  do {                                                      \
30
    int _code = colDataSetVal(pCol, rows, buf, isNull);     \
31
    if (TSDB_CODE_SUCCESS != _code) {                       \
32
      terrno = _code;                                       \
33
      return _code;                                         \
34
    }                                                       \
35
  } while (0)
36

37
extern SConfig* tsCfg;
38

39
static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRetrieveTableRsp** pRsp) {
331,010✔
40
  if (NULL == pBlock || NULL == pRsp) {
331,010!
41
    return TSDB_CODE_INVALID_PARA;
×
42
  }
43
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
331,010✔
44
  size_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
331,010✔
45
  *pRsp = taosMemoryCalloc(1, rspSize);
331,010!
46
  if (NULL == *pRsp) {
331,010!
47
    return terrno;
×
48
  }
49

50
  (*pRsp)->useconds = 0;
331,010✔
51
  (*pRsp)->completed = 1;
331,010✔
52
  (*pRsp)->precision = 0;
331,010✔
53
  (*pRsp)->compressed = 0;
331,010✔
54

55
  (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
331,010✔
56
  (*pRsp)->numOfCols = htonl(numOfCols);
331,010✔
57

58
  int32_t len = 0;
331,010✔
59
  if (pBlock->info.rows > 0) {
331,010✔
60
    len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, numOfCols);
330,504✔
61
    if (len < 0) {
330,504!
62
      taosMemoryFree(*pRsp);
×
63
      *pRsp = NULL;
×
64
      return terrno;
×
65
    }
66
    SET_PAYLOAD_LEN((*pRsp)->data, len, len);
330,504✔
67
  }
68

69
  int32_t payloadLen = len + PAYLOAD_PREFIX_LEN;
331,010✔
70
  (*pRsp)->payloadLen = htonl(payloadLen);
331,010✔
71
  (*pRsp)->compLen = htonl(payloadLen);
331,010✔
72

73
  return TSDB_CODE_SUCCESS;
331,010✔
74
}
75

76
static int32_t getSchemaBytes(const SSchema* pSchema) {
1,715,838✔
77
  switch (pSchema->type) {
1,715,838✔
78
    case TSDB_DATA_TYPE_BINARY:
222,168✔
79
    case TSDB_DATA_TYPE_VARBINARY:
80
    case TSDB_DATA_TYPE_GEOMETRY:
81
      return (pSchema->bytes - VARSTR_HEADER_SIZE);
222,168✔
82
    case TSDB_DATA_TYPE_NCHAR:
82,526✔
83
    case TSDB_DATA_TYPE_JSON:
84
      return (pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE;
82,526✔
85
    default:
1,411,144✔
86
      return pSchema->bytes;
1,411,144✔
87
  }
88
}
89

90
static const char* expandIdentifier(const char* name, char* output) {
126,234✔
91
  if (NULL == name) return "";
126,234!
92
  bool containsEscapeChar = false;
126,234✔
93
  for (const char* p = name; *p != '\0'; ++p) {
807,138✔
94
    if (*p == TS_ESCAPE_CHAR) {
680,904!
UNCOV
95
      containsEscapeChar = true;
×
UNCOV
96
      break;
×
97
    }
98
  }
99
  if (!containsEscapeChar) return name;
126,234!
UNCOV
100
  if (NULL == output) return "";
×
UNCOV
101
  char* out_ptr = output;
×
UNCOV
102
  for (const char* src = name; *src != '\0'; ++src) {
×
UNCOV
103
    if (*src == TS_ESCAPE_CHAR) {
×
UNCOV
104
      *out_ptr++ = TS_ESCAPE_CHAR;
×
UNCOV
105
      *out_ptr++ = TS_ESCAPE_CHAR;
×
106
    } else {
UNCOV
107
      *out_ptr++ = *src;
×
108
    }
109
  }
UNCOV
110
  *out_ptr = '\0';
×
UNCOV
111
  return output;
×
112
}
113

114
static int32_t buildDescResultDataBlock(SSDataBlock** pOutput) {
113,715✔
115
  QRY_PARAM_CHECK(pOutput);
113,715!
116

117
  SSDataBlock* pBlock = NULL;
113,715✔
118
  int32_t      code = createDataBlock(&pBlock);
113,715✔
119
  if (code) {
113,715!
120
    return code;
×
121
  }
122

123
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_FIELD_LEN, 1);
113,715✔
124
  code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
125
  if (TSDB_CODE_SUCCESS == code) {
113,715!
126
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_TYPE_LEN, 2);
113,715✔
127
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
128
  }
129
  if (TSDB_CODE_SUCCESS == code) {
113,715!
130
    infoData = createColumnInfoData(TSDB_DATA_TYPE_INT, tDataTypes[TSDB_DATA_TYPE_INT].bytes, 3);
113,715✔
131
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
132
  }
133
  if (TSDB_CODE_SUCCESS == code) {
113,715!
134
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_NOTE_LEN, 4);
113,715✔
135
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
136
  }
137
  if (TSDB_CODE_SUCCESS == code) {
113,715!
138
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 5);
113,715✔
139
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
140
  }
141
  if (TSDB_CODE_SUCCESS == code) {
113,715!
142
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 6);
113,715✔
143
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
144
  }
145
  if (TSDB_CODE_SUCCESS == code) {
113,715!
146
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 7);
113,715✔
147
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
148
  }
149
  if (TSDB_CODE_SUCCESS == code) {
113,715!
150
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COL_REF_LEN, 8);
113,715✔
151
    code = blockDataAppendColInfo(pBlock, &infoData);
113,715✔
152
  }
153
  if (TSDB_CODE_SUCCESS == code) {
113,715!
154
    *pOutput = pBlock;
113,715✔
155
  } else {
156
    (void)blockDataDestroy(pBlock);
×
157
  }
158
  return code;
113,715✔
159
}
160

161
static int32_t setDescResultIntoDataBlock(bool sysInfoUser, SSDataBlock* pBlock, int32_t numOfRows, STableMeta* pMeta,
113,715✔
162
                                          int8_t biMode) {
163
  int32_t blockCap = (biMode != 0) ? numOfRows + 1 : numOfRows;
113,715!
164
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, blockCap));
113,715!
165
  pBlock->info.rows = 0;
113,715✔
166

167
  // field
168
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
113,715✔
169
  // Type
170
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
113,715✔
171
  // Length
172
  SColumnInfoData* pCol3 = taosArrayGet(pBlock->pDataBlock, 2);
113,715✔
173
  // Note
174
  SColumnInfoData* pCol4 = taosArrayGet(pBlock->pDataBlock, 3);
113,715✔
175
  // encode
176
  SColumnInfoData* pCol5 = NULL;
113,715✔
177
  // compress
178
  SColumnInfoData* pCol6 = NULL;
113,715✔
179
  // level
180
  SColumnInfoData* pCol7 = NULL;
113,715✔
181
  // colref
182
  SColumnInfoData* pCol8 = NULL;
113,715✔
183
  if (withExtSchema(pMeta->tableType)) {
113,715✔
184
    pCol5 = taosArrayGet(pBlock->pDataBlock, 4);
112,985✔
185
    pCol6 = taosArrayGet(pBlock->pDataBlock, 5);
112,985✔
186
    pCol7 = taosArrayGet(pBlock->pDataBlock, 6);
112,985✔
187
  }
188

189
  if (hasRefCol(pMeta->tableType)) {
113,715✔
190
    pCol5 = taosArrayGet(pBlock->pDataBlock, 4);
730✔
191
  }
192

193
  int32_t fillTagCol = 0;
113,715✔
194
  char    buf[DESCRIBE_RESULT_FIELD_LEN] = {0};
113,715✔
195
  for (int32_t i = 0; i < numOfRows; ++i) {
1,829,553✔
196
    if (invisibleColumn(sysInfoUser, pMeta->tableType, pMeta->schema[i].flags)) {
1,715,838!
197
      continue;
×
198
    }
199
    STR_TO_VARSTR(buf, pMeta->schema[i].name);
1,715,838!
200
    COL_DATA_SET_VAL_AND_CHECK(pCol1, pBlock->info.rows, buf, false);
1,715,838!
201

202
    if (IS_DECIMAL_TYPE(pMeta->schema[i].type) && withExtSchema(pMeta->tableType)) {
1,715,838!
203
      uint8_t prec = 0, scale = 0;
123,685✔
204
      decimalFromTypeMod(pMeta->schemaExt[i].typeMod, &prec, &scale);
123,685✔
205
      size_t len = snprintf(buf + VARSTR_HEADER_SIZE, DESCRIBE_RESULT_FIELD_LEN - VARSTR_HEADER_SIZE, "%s(%hhu, %hhu)",
123,685✔
206
                            tDataTypes[pMeta->schema[i].type].name, prec, scale);
123,685✔
207
      varDataSetLen(buf, len);
123,685✔
208
    } else {
209
      STR_TO_VARSTR(buf, tDataTypes[pMeta->schema[i].type].name);
1,592,153!
210
    }
211
    COL_DATA_SET_VAL_AND_CHECK(pCol2, pBlock->info.rows, buf, false);
1,715,838!
212
    int32_t bytes = getSchemaBytes(pMeta->schema + i);
1,715,838✔
213
    COL_DATA_SET_VAL_AND_CHECK(pCol3, pBlock->info.rows, (const char*)&bytes, false);
1,715,838!
214
    if (TSDB_VIEW_TABLE != pMeta->tableType) {
1,715,838!
215
      if (i >= pMeta->tableInfo.numOfColumns) {
1,715,838✔
216
        STR_TO_VARSTR(buf, "TAG");
399,695!
217
        fillTagCol = 1;
399,695✔
218
      } else if (i == 1 && pMeta->schema[i].flags & COL_IS_KEY) {
1,316,143✔
219
        STR_TO_VARSTR(buf, "COMPOSITE KEY")
327!
220
      } else {
221
        STR_TO_VARSTR(buf, "");
1,315,816!
222
      }
223
    } else {
UNCOV
224
      STR_TO_VARSTR(buf, "VIEW COL");
×
225
    }
226
    COL_DATA_SET_VAL_AND_CHECK(pCol4, pBlock->info.rows, buf, false);
1,715,838!
227
    if (withExtSchema(pMeta->tableType) && pMeta->schemaExt) {
1,715,838!
228
      if (i < pMeta->tableInfo.numOfColumns) {
1,699,048✔
229
        STR_TO_VARSTR(buf, columnEncodeStr(COMPRESS_L1_TYPE_U32(pMeta->schemaExt[i].compress)));
1,301,543!
230
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
1,301,543!
231
        STR_TO_VARSTR(buf, columnCompressStr(COMPRESS_L2_TYPE_U32(pMeta->schemaExt[i].compress)));
1,301,543!
232
        COL_DATA_SET_VAL_AND_CHECK(pCol6, pBlock->info.rows, buf, false);
1,301,543!
233
        STR_TO_VARSTR(buf, columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pMeta->schemaExt[i].compress)));
1,301,543!
234
        COL_DATA_SET_VAL_AND_CHECK(pCol7, pBlock->info.rows, buf, false);
1,301,543!
235
      } else {
236
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
397,505!
237
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
397,505!
238
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
397,505!
239
        COL_DATA_SET_VAL_AND_CHECK(pCol6, pBlock->info.rows, buf, false);
397,505!
240
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
397,505!
241
        COL_DATA_SET_VAL_AND_CHECK(pCol7, pBlock->info.rows, buf, false);
397,505!
242
      }
243
    } else if (hasRefCol(pMeta->tableType) && pMeta->colRef) {
16,790!
244
      if (i < pMeta->numOfColRefs) {
16,790✔
245
        if (pMeta->colRef[i].hasRef) {
14,600!
246
          char refColName[TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_COL_FNAME_LEN] = {0};
5,475✔
247
          strcat(refColName, pMeta->colRef[i].refDbName);
5,475!
248
          strcat(refColName, ".");
5,475!
249
          strcat(refColName, pMeta->colRef[i].refTableName);
5,475!
250
          strcat(refColName, ".");
5,475!
251
          strcat(refColName, pMeta->colRef[i].refColName);
5,475!
252
          STR_TO_VARSTR(buf, refColName);
5,475!
253
        } else {
254
          STR_TO_VARSTR(buf, "");
9,125!
255
        }
256
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
14,600!
257
      } else {
258
        STR_TO_VARSTR(buf, "");
2,190!
259
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
2,190!
260
      }
261
    }
262

263
    fillTagCol = 0;
1,715,838✔
264

265
    ++(pBlock->info.rows);
1,715,838✔
266
  }
267
  if (pMeta->tableType == TSDB_SUPER_TABLE && biMode != 0) {
113,715!
268
    STR_TO_VARSTR(buf, "tbname");
×
269
    COL_DATA_SET_VAL_AND_CHECK(pCol1, pBlock->info.rows, buf, false);
×
270
    STR_TO_VARSTR(buf, "VARCHAR");
×
271
    COL_DATA_SET_VAL_AND_CHECK(pCol2, pBlock->info.rows, buf, false);
×
272
    int32_t bytes = TSDB_TABLE_NAME_LEN - 1;
×
273
    COL_DATA_SET_VAL_AND_CHECK(pCol3, pBlock->info.rows, (const char*)&bytes, false);
×
274
    STR_TO_VARSTR(buf, "TAG");
×
275
    COL_DATA_SET_VAL_AND_CHECK(pCol4, pBlock->info.rows, buf, false);
×
276
    ++(pBlock->info.rows);
×
277
  }
278
  if (pBlock->info.rows <= 0) {
113,715!
279
    qError("no permission to view any columns");
×
280
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
281
  }
282
  return TSDB_CODE_SUCCESS;
113,715✔
283
}
284

285
static int32_t execDescribe(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode) {
113,715✔
286
  SDescribeStmt* pDesc = (SDescribeStmt*)pStmt;
113,715✔
287
  if (NULL == pDesc || NULL == pDesc->pMeta) {
113,715!
288
    return TSDB_CODE_INVALID_PARA;
×
289
  }
290
  int32_t numOfRows = TABLE_TOTAL_COL_NUM(pDesc->pMeta);
113,715✔
291

292
  SSDataBlock* pBlock = NULL;
113,715✔
293
  int32_t      code = buildDescResultDataBlock(&pBlock);
113,715✔
294
  if (TSDB_CODE_SUCCESS == code) {
113,715!
295
    code = setDescResultIntoDataBlock(sysInfoUser, pBlock, numOfRows, pDesc->pMeta, biMode);
113,715✔
296
  }
297
  if (TSDB_CODE_SUCCESS == code) {
113,715!
298
    if (pDesc->pMeta) {
113,715!
299
      if (withExtSchema(pDesc->pMeta->tableType) && pDesc->pMeta->schemaExt) {
113,715!
300
        code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS_COMPRESS, pRsp);
112,985✔
301
      } else if (hasRefCol(pDesc->pMeta->tableType) && pDesc->pMeta->colRef) {
730!
302
        code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS_REF, pRsp);
730✔
303
      } else {
UNCOV
304
        code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS, pRsp);
×
305
      }
306
    } else {
307
      code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS, pRsp);
×
308
    }
309
  }
310
  (void)blockDataDestroy(pBlock);
113,715✔
311
  return code;
113,715✔
312
}
313

314
static int32_t execResetQueryCache() { return catalogClearCache(); }
260,170✔
315

UNCOV
316
static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
×
UNCOV
317
  QRY_PARAM_CHECK(pOutput);
×
318

UNCOV
319
  SSDataBlock* pBlock = NULL;
×
UNCOV
320
  int32_t      code = createDataBlock(&pBlock);
×
UNCOV
321
  if (code) {
×
322
    return code;
×
323
  }
324

UNCOV
325
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_COLS, 1);
×
UNCOV
326
  code = blockDataAppendColInfo(pBlock, &infoData);
×
UNCOV
327
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
328
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_FIELD2_LEN, 2);
×
UNCOV
329
    code = blockDataAppendColInfo(pBlock, &infoData);
×
330
  }
331

UNCOV
332
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
333
    *pOutput = pBlock;
×
334
  } else {
335
    (void)blockDataDestroy(pBlock);
×
336
  }
UNCOV
337
  return code;
×
338
}
339

340
int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
×
341
  int64_t v = 0;
×
342
  switch (unit) {
×
343
    case 's':
×
344
      v = val / 1000;
×
345
      break;
×
346
    case 'm':
×
347
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
×
348
      break;
×
349
    case 'h':
×
350
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
×
351
      break;
×
352
    case 'd':
×
353
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
×
354
      break;
×
355
    case 'w':
×
356
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
×
357
      break;
×
358
    default:
×
359
      break;
×
360
  }
361

362
  return v;
×
363
}
364

UNCOV
365
static int32_t buildRetension(SArray* pRetension, char** ppRetentions) {
×
UNCOV
366
  size_t size = taosArrayGetSize(pRetension);
×
UNCOV
367
  if (size == 0) {
×
UNCOV
368
    *ppRetentions = NULL;
×
UNCOV
369
    return TSDB_CODE_SUCCESS;
×
370
  }
371

372
  const int lMaxLen = 128;
×
373
  char*     p1 = taosMemoryCalloc(1, lMaxLen);
×
374
  if (NULL == p1) {
×
375
    return terrno;
×
376
  }
377
  int32_t len = 0;
×
378

379
  for (int32_t i = 0; i < size; ++i) {
×
380
    SRetention* p = TARRAY_GET_ELEM(pRetension, i);
×
381
    int64_t     v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
382
    int64_t     v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
383
    if (i == 0) {
×
384
      len += tsnprintf(p1 + len, lMaxLen - len, "-:%" PRId64 "%c", v2, p->keepUnit);
×
385
    } else {
386
      len += tsnprintf(p1 + len, lMaxLen - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
387
    }
388

389
    if (i < size - 1) {
×
390
      len += tsnprintf(p1 + len, lMaxLen - len, ",");
×
391
    }
392
  }
393

394
  *ppRetentions = p1;
×
395
  return TSDB_CODE_SUCCESS;
×
396
}
397

UNCOV
398
static const char* cacheModelStr(int8_t cacheModel) {
×
UNCOV
399
  switch (cacheModel) {
×
UNCOV
400
    case TSDB_CACHE_MODEL_NONE:
×
UNCOV
401
      return TSDB_CACHE_MODEL_NONE_STR;
×
402
    case TSDB_CACHE_MODEL_LAST_ROW:
×
403
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
×
404
    case TSDB_CACHE_MODEL_LAST_VALUE:
×
405
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
×
406
    case TSDB_CACHE_MODEL_BOTH:
×
407
      return TSDB_CACHE_MODEL_BOTH_STR;
×
408
    default:
×
409
      break;
×
410
  }
411
  return TSDB_CACHE_MODEL_NONE_STR;
×
412
}
413

UNCOV
414
static const char* encryptAlgorithmStr(int8_t encryptAlgorithm) {
×
UNCOV
415
  switch (encryptAlgorithm) {
×
UNCOV
416
    case TSDB_ENCRYPT_ALGO_NONE:
×
UNCOV
417
      return TSDB_ENCRYPT_ALGO_NONE_STR;
×
418
    case TSDB_ENCRYPT_ALGO_SM4:
×
419
      return TSDB_ENCRYPT_ALGO_SM4_STR;
×
420
    default:
×
421
      break;
×
422
  }
423
  return TSDB_CACHE_MODEL_NONE_STR;
×
424
}
425

426
int32_t formatDurationOrKeep(char* buffer, int64_t bufSize, int32_t timeInMinutes) {
515,592✔
427
  if (buffer == NULL || bufSize <= 0) {
515,592!
428
    return 0;
×
429
  }
430
  int32_t len = 0;
515,592✔
431
  if (timeInMinutes % 1440 == 0) {
515,592!
432
    int32_t days = timeInMinutes / 1440;
515,592✔
433
    len = tsnprintf(buffer, bufSize, "%dd", days);
515,592✔
UNCOV
434
  } else if (timeInMinutes % 60 == 0) {
×
UNCOV
435
    int32_t hours = timeInMinutes / 60;
×
UNCOV
436
    len = tsnprintf(buffer, bufSize, "%dh", hours);
×
437
  } else {
UNCOV
438
    len = tsnprintf(buffer, bufSize, "%dm", timeInMinutes);
×
439
  }
440
  return len;
515,592✔
441
}
442

UNCOV
443
static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, char* dbFName, SDbCfgInfo* pCfg) {
×
UNCOV
444
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
×
UNCOV
445
  pBlock->info.rows = 1;
×
446

UNCOV
447
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
×
UNCOV
448
  char             buf1[SHOW_CREATE_DB_RESULT_FIELD1_LEN] = {0};
×
UNCOV
449
  STR_TO_VARSTR(buf1, dbName);
×
UNCOV
450
  COL_DATA_SET_VAL_AND_CHECK(pCol1, 0, buf1, false);
×
451

UNCOV
452
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
×
UNCOV
453
  char             buf2[SHOW_CREATE_DB_RESULT_FIELD2_LEN] = {0};
×
UNCOV
454
  int32_t          len = 0;
×
UNCOV
455
  char*            prec = NULL;
×
UNCOV
456
  switch (pCfg->precision) {
×
UNCOV
457
    case TSDB_TIME_PRECISION_MILLI:
×
UNCOV
458
      prec = TSDB_TIME_PRECISION_MILLI_STR;
×
UNCOV
459
      break;
×
460
    case TSDB_TIME_PRECISION_MICRO:
×
461
      prec = TSDB_TIME_PRECISION_MICRO_STR;
×
462
      break;
×
463
    case TSDB_TIME_PRECISION_NANO:
×
464
      prec = TSDB_TIME_PRECISION_NANO_STR;
×
465
      break;
×
466
    default:
×
467
      prec = "none";
×
468
      break;
×
469
  }
470

UNCOV
471
  char* pRetentions = NULL;
×
UNCOV
472
  QRY_ERR_RET(buildRetension(pCfg->pRetensions, &pRetentions));
×
UNCOV
473
  int32_t dbFNameLen = strlen(dbFName);
×
UNCOV
474
  int32_t hashPrefix = 0;
×
UNCOV
475
  if (pCfg->hashPrefix > 0) {
×
UNCOV
476
    hashPrefix = pCfg->hashPrefix - dbFNameLen - 1;
×
UNCOV
477
  } else if (pCfg->hashPrefix < 0) {
×
UNCOV
478
    hashPrefix = pCfg->hashPrefix + dbFNameLen + 1;
×
479
  }
UNCOV
480
  char durationStr[128] = {0};
×
UNCOV
481
  char keep0Str[128] = {0};
×
UNCOV
482
  char keep1Str[128] = {0};
×
UNCOV
483
  char keep2Str[128] = {0};
×
UNCOV
484
  char compactIntervalStr[13] = {0};
×
UNCOV
485
  char compactStartTimeStr[13] = {0};
×
UNCOV
486
  char compactEndTimeStr[13] = {0};
×
487

UNCOV
488
  int32_t lenDuration = formatDurationOrKeep(durationStr, sizeof(durationStr), pCfg->daysPerFile);
×
UNCOV
489
  int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pCfg->daysToKeep0);
×
UNCOV
490
  int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pCfg->daysToKeep1);
×
UNCOV
491
  int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pCfg->daysToKeep2);
×
UNCOV
492
  UNUSED(formatDurationOrKeep(compactIntervalStr, sizeof(compactIntervalStr), pCfg->compactInterval));
×
UNCOV
493
  UNUSED(formatDurationOrKeep(compactStartTimeStr, sizeof(compactStartTimeStr), pCfg->compactStartTime));
×
UNCOV
494
  UNUSED(formatDurationOrKeep(compactEndTimeStr, sizeof(compactEndTimeStr), pCfg->compactEndTime));
×
495

UNCOV
496
  if (IS_SYS_DBNAME(dbName)) {
×
UNCOV
497
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
UNCOV
498
                     "CREATE DATABASE `%s`", dbName);
×
499
  } else {
UNCOV
500
    len +=
×
UNCOV
501
        tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
502
                  "CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %s "
503
                  "WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d STT_TRIGGER %d KEEP %s,%s,%s PAGES %d PAGESIZE %d "
504
                  "PRECISION '%s' REPLICA %d "
505
                  "WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d "
506
                  "WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE %" PRId64
507
                  " KEEP_TIME_OFFSET %d ENCRYPT_ALGORITHM '%s' SS_CHUNKPAGES %d SS_KEEPLOCAL %dm SS_COMPACT %d "
508
                  "COMPACT_INTERVAL %s COMPACT_TIME_RANGE %s,%s COMPACT_TIME_OFFSET %"PRIi8 "h",
UNCOV
509
                  dbName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, durationStr,
×
UNCOV
510
                  pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->sstTrigger, keep0Str, keep1Str, keep2Str,
×
UNCOV
511
                  pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->walLevel, pCfg->numOfVgroups,
×
UNCOV
512
                  1 == pCfg->numOfStables, hashPrefix, pCfg->hashSuffix, pCfg->tsdbPageSize, pCfg->walRetentionPeriod,
×
UNCOV
513
                  pCfg->walRetentionSize, pCfg->keepTimeOffset, encryptAlgorithmStr(pCfg->encryptAlgorithm),
×
UNCOV
514
                  pCfg->ssChunkSize, pCfg->ssKeepLocal, pCfg->ssCompact, compactIntervalStr, compactStartTimeStr,
×
UNCOV
515
                  compactEndTimeStr, pCfg->compactTimeOffset);
×
516

UNCOV
517
    if (pRetentions) {
×
518
      len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
519
                       " RETENTIONS %s", pRetentions);
520
    }
521
  }
522

UNCOV
523
  taosMemoryFree(pRetentions);
×
524

UNCOV
525
  (varDataLen(buf2)) = len;
×
526

UNCOV
527
  COL_DATA_SET_VAL_AND_CHECK(pCol2, 0, buf2, false);
×
528

UNCOV
529
  return TSDB_CODE_SUCCESS;
×
530
}
531

UNCOV
532
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
×
UNCOV
533
  SSDataBlock* pBlock = NULL;
×
UNCOV
534
  int32_t      code = buildCreateDBResultDataBlock(&pBlock);
×
UNCOV
535
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
536
    code = setCreateDBResultIntoDataBlock(pBlock, pStmt->dbName, pStmt->dbFName, pStmt->pCfg);
×
537
  }
UNCOV
538
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
539
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_DB_RESULT_COLS, pRsp);
×
540
  }
UNCOV
541
  (void)blockDataDestroy(pBlock);
×
UNCOV
542
  return code;
×
543
}
544

545
static int32_t buildCreateTbResultDataBlock(SSDataBlock** pOutput) {
16,286✔
546
  QRY_PARAM_CHECK(pOutput);
16,286!
547

548
  SSDataBlock* pBlock = NULL;
16,286✔
549
  int32_t      code = createDataBlock(&pBlock);
16,286✔
550
  if (code) {
16,286!
551
    return code;
×
552
  }
553

554
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD1_LEN, 1);
16,286✔
555
  code = blockDataAppendColInfo(pBlock, &infoData);
16,286✔
556
  if (TSDB_CODE_SUCCESS == code) {
16,286!
557
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD2_LEN, 2);
16,286✔
558
    code = blockDataAppendColInfo(pBlock, &infoData);
16,286✔
559
  }
560

561
  if (TSDB_CODE_SUCCESS == code) {
16,286!
562
    *pOutput = pBlock;
16,286✔
563
  } else {
564
    (void)blockDataDestroy(pBlock);
×
565
  }
566
  return code;
16,286✔
567
}
568

UNCOV
569
static int32_t buildCreateViewResultDataBlock(SSDataBlock** pOutput) {
×
UNCOV
570
  QRY_PARAM_CHECK(pOutput);
×
571

UNCOV
572
  SSDataBlock* pBlock = NULL;
×
UNCOV
573
  int32_t      code = createDataBlock(&pBlock);
×
UNCOV
574
  if (code) {
×
575
    return code;
×
576
  }
577

UNCOV
578
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD1_LEN, 1);
×
UNCOV
579
  code = blockDataAppendColInfo(pBlock, &infoData);
×
UNCOV
580
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
581
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD2_LEN, 2);
×
UNCOV
582
    code = blockDataAppendColInfo(pBlock, &infoData);
×
583
  }
584

UNCOV
585
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
586
    *pOutput = pBlock;
×
587
  } else {
588
    (void)blockDataDestroy(pBlock);
×
589
  }
UNCOV
590
  return code;
×
591
}
592

593
static void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
7,975✔
594
  char expandName[(SHOW_CREATE_TB_RESULT_FIELD1_LEN << 1) + 1] = {0};
7,975✔
595
  for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
66,505✔
596
    SSchema* pSchema = pCfg->pSchemas + i;
58,530✔
597
    SColRef* pRef = pCfg->pColRefs + i;
58,530✔
598
#define LTYPE_LEN                                    \
599
  (32 + 60 + TSDB_COL_FNAME_LEN + TSDB_DB_NAME_LEN + \
600
   10)  // 60 byte for compress info, TSDB_COL_FNAME_LEN + TSDB_DB_NAME_LEN for column ref
601
    char type[LTYPE_LEN];
49,674✔
602
    snprintf(type, LTYPE_LEN, "%s", tDataTypes[pSchema->type].name);
58,530✔
603
    int typeLen = strlen(type);
58,530✔
604
    if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
58,530✔
605
        TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
51,914✔
606
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
7,767✔
607
    } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
50,763✔
608
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)",
4,195✔
609
                           (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
4,195✔
610
    } else if (IS_DECIMAL_TYPE(pSchema->type)) {
46,568✔
611
      uint8_t precision, scale;
8,600✔
612
      decimalFromTypeMod(pCfg->pSchemaExt[i].typeMod, &precision, &scale);
8,600✔
613
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d,%d)", precision, scale);
8,600✔
614
    }
615

616
    if (withExtSchema(pCfg->tableType) && pCfg->pSchemaExt && tsShowFullCreateTableColumn) {
58,530!
617
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " ENCODE \'%s\'",
1,308✔
618
                           columnEncodeStr(COMPRESS_L1_TYPE_U32(pCfg->pSchemaExt[i].compress)));
1,308✔
619
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " COMPRESS \'%s\'",
1,308✔
620
                           columnCompressStr(COMPRESS_L2_TYPE_U32(pCfg->pSchemaExt[i].compress)));
1,308✔
621
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " LEVEL \'%s\'",
1,308✔
622
                           columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pCfg->pSchemaExt[i].compress)));
1,308✔
623
    }
624

625
    if (hasRefCol(pCfg->tableType) && pCfg->pColRefs && pRef->hasRef) {
58,530!
626
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " FROM `%s`", pRef->refDbName);
3,650✔
627
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, ".");
3,650✔
628
      typeLen +=
3,650✔
629
          tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "`%s`", expandIdentifier(pRef->refTableName, expandName));
3,650✔
630
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, ".");
3,650✔
631
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "`%s`", expandIdentifier(pRef->refColName, expandName));
3,650✔
632
    }
633

634
    if (!(pSchema->flags & COL_IS_KEY)) {
58,530✔
635
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
58,203✔
636
                        "%s`%s` %s", ((i > 0) ? ", " : ""), expandIdentifier(pSchema->name, expandName), type);
58,203✔
637
    } else {
638
      char* pk = "COMPOSITE KEY";
327✔
639
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
327!
640
                        "%s`%s` %s %s", ((i > 0) ? ", " : ""), expandIdentifier(pSchema->name, expandName), type, pk);
327✔
641
    }
642
  }
643
}
7,975✔
644

645
static void appendColRefFields(char* buf, int32_t* len, STableCfg* pCfg) {
365✔
646
  char expandName[(SHOW_CREATE_TB_RESULT_FIELD1_LEN << 1) + 1] = {0};
365✔
647
  for (int32_t i = 1; i < pCfg->numOfColumns; ++i) {
7,300✔
648
    SSchema* pSchema = pCfg->pSchemas + i;
6,935✔
649
    SColRef* pRef = pCfg->pColRefs + i;
6,935✔
650
    char     type[TSDB_COL_NAME_LEN + 10 + TSDB_COL_FNAME_LEN + TSDB_DB_NAME_LEN];
6,935✔
651
    int      typeLen = 0;
6,935✔
652

653
    if (hasRefCol(pCfg->tableType) && pCfg->pColRefs && pRef->hasRef) {
6,935!
654
      typeLen += tsnprintf(type + typeLen, sizeof(type) - typeLen, "FROM `%s`", pRef->refDbName);
1,825✔
655
      typeLen += tsnprintf(type + typeLen, sizeof(type) - typeLen, ".");
1,825✔
656
      typeLen += tsnprintf(type + typeLen, sizeof(type) - typeLen, "`%s`", expandIdentifier(pRef->refTableName, expandName));
1,825✔
657
      typeLen += tsnprintf(type + typeLen, sizeof(type) - typeLen, ".");
1,825✔
658
      typeLen += tsnprintf(type + typeLen, sizeof(type) - typeLen, "`%s`", expandIdentifier(pRef->refColName, expandName));
1,825✔
659
    } else {
660
      continue;
5,110✔
661
    }
662

663
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
1,825✔
664
                      "%s`%s` %s", ((i > 1) ? ", " : ""), expandIdentifier(pSchema->name, expandName), type);
1,825✔
665

666
  }
667
}
365✔
668

669
static void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
6,236✔
670
  char expandName[(TSDB_COL_NAME_LEN << 1) + 1] = {0};
6,236✔
671
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
23,232✔
672
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
16,996✔
673
    char     type[32];
9,846✔
674
    snprintf(type, sizeof(type), "%s", tDataTypes[pSchema->type].name);
16,996✔
675
    if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
16,996✔
676
        TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
12,254✔
677
      snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
5,163✔
678
               (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
5,163✔
679
    } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
11,833✔
680
      snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
715✔
681
               (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
715✔
682
    }
683

684
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
16,996✔
685
                      "%s`%s` %s", ((i > 0) ? ", " : ""), expandIdentifier(pSchema->name, expandName), type);
16,996✔
686
  }
687
}
6,236✔
688

689
static void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
8,311✔
690
  char expandName[(TSDB_COL_NAME_LEN << 1) + 1] = {0};
8,311✔
691
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
21,647✔
692
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
13,336✔
693
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
13,336✔
694
                      "%s`%s`", ((i > 0) ? ", " : ""), expandIdentifier(pSchema->name, expandName));
13,336✔
695
  }
696
}
8,311✔
697

698
static int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg, void* charsetCxt) {
8,311✔
699
  int32_t code = TSDB_CODE_SUCCESS;
8,311✔
700
  SArray* pTagVals = NULL;
8,311✔
701
  STag*   pTag = (STag*)pCfg->pTags;
8,311✔
702

703
  if (NULL == pCfg->pTags || pCfg->numOfTags <= 0) {
8,311!
704
    qError("tag missed in table cfg, pointer:%p, numOfTags:%d", pCfg->pTags, pCfg->numOfTags);
×
705
    return TSDB_CODE_APP_ERROR;
×
706
  }
707

708
  if (tTagIsJson(pTag)) {
8,311✔
709
    char* pJson = NULL;
346✔
710
    parseTagDatatoJson(pTag, &pJson, charsetCxt);
346✔
711
    if (NULL == pJson) {
346!
712
      qError("failed to parse tag to json, pJson is NULL");
×
713
      return terrno;
×
714
    }
715
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
346✔
716
                      "%s", pJson);
717
    taosMemoryFree(pJson);
346!
718

719
    return TSDB_CODE_SUCCESS;
346✔
720
  }
721

722
  QRY_ERR_RET(tTagToValArray((const STag*)pCfg->pTags, &pTagVals));
7,965!
723
  int16_t valueNum = taosArrayGetSize(pTagVals);
7,965✔
724
  int32_t num = 0;
7,965✔
725
  int32_t j = 0;
7,965✔
726
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
20,955✔
727
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
12,990✔
728
    if (i > 0) {
12,990✔
729
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
5,025✔
730
                        ", ");
731
    }
732

733
    if (j >= valueNum) {
12,990✔
734
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
6,800✔
735
                        "NULL");
736
      continue;
6,800✔
737
    }
738

739
    STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
6,190✔
740
    if (pSchema->colId > pTagVal->cid) {
6,190!
741
      qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
×
742
      code = TSDB_CODE_APP_ERROR;
×
743
      TAOS_CHECK_ERRNO(code);
×
744
    } else if (pSchema->colId == pTagVal->cid) {
6,190✔
745
      char    type = pTagVal->type;
5,390✔
746
      int32_t tlen = 0;
5,390✔
747

748
      int64_t leftSize = SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len);
5,390✔
749
      if (leftSize <= 0) {
5,390!
750
        qError("no enough space to store tag value, leftSize:%" PRId64, leftSize);
×
751
        code = TSDB_CODE_APP_ERROR;
×
752
        TAOS_CHECK_ERRNO(code);
×
753
      }
754
      if (IS_VAR_DATA_TYPE(type)) {
5,390!
755
        code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, pTagVal->pData, pTagVal->nData, &tlen);
1,530✔
756
        TAOS_CHECK_ERRNO(code);
1,530!
757
      } else {
758
        code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, &pTagVal->i64, tDataTypes[type].bytes,
3,860✔
759
                               &tlen);
760
        TAOS_CHECK_ERRNO(code);
3,860!
761
      }
762
      *len += tlen;
5,390✔
763
      j++;
5,390✔
764
    } else {
765
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
800✔
766
                        "NULL");
767
    }
768
  }
769
_exit:
7,965✔
770
  taosArrayDestroy(pTagVals);
7,965✔
771

772
  return code;
7,965✔
773
}
774

775
static void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg* pCfg) {
15,556✔
776
  if (pCfg->commentLen > 0) {
15,556!
777
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
778
                      " COMMENT '%s'", pCfg->pComment);
779
  } else if (0 == pCfg->commentLen) {
15,556!
UNCOV
780
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
781
                      " COMMENT ''");
782
  }
783

784
  if (NULL != pDbCfg->pRetensions && pCfg->watermark1 > 0) {
15,556!
785
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
786
                      " WATERMARK %" PRId64 "a", pCfg->watermark1);
787
    if (pCfg->watermark2 > 0) {
×
788
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
789
                        ", %" PRId64 "a", pCfg->watermark2);
790
    }
791
  }
792

793
  if (NULL != pDbCfg->pRetensions && pCfg->delay1 > 0) {
15,556!
794
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
795
                      " MAX_DELAY %" PRId64 "a", pCfg->delay1);
796
    if (pCfg->delay2 > 0) {
×
797
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
798
                        ", %" PRId64 "a", pCfg->delay2);
799
    }
800
  }
801

802
  int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
15,556✔
803
  if (NULL != pDbCfg->pRetensions && funcNum > 0) {
15,556!
804
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
805
                      " ROLLUP(");
806
    for (int32_t i = 0; i < funcNum; ++i) {
×
807
      char* pFunc = taosArrayGet(pCfg->pFuncs, i);
×
808
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
809
                        "%s%s", ((i > 0) ? ", " : ""), pFunc);
810
    }
811
    *len +=
×
812
        snprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ")");
×
813
  }
814

815
  if (pCfg->ttl > 0) {
15,556!
816
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
817
                      " TTL %d", pCfg->ttl);
818
  }
819

820
  if (pCfg->keep > 0) {
15,556!
UNCOV
821
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
822
                      " KEEP %dm", pCfg->keep);
823
  }
824

825
  if (TSDB_SUPER_TABLE == pCfg->tableType || TSDB_NORMAL_TABLE == pCfg->tableType) {
15,556✔
826
    int32_t nSma = 0;
7,610✔
827
    for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
58,840✔
828
      if (IS_BSMA_ON(pCfg->pSchemas + i)) {
51,230!
829
        ++nSma;
51,230✔
830
      }
831
    }
832

833
    if (nSma < pCfg->numOfColumns && nSma > 0) {
7,610!
834
      bool smaOn = false;
×
835
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
836
                        " SMA(");
837
      for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
×
838
        if (IS_BSMA_ON(pCfg->pSchemas + i)) {
×
839
          if (smaOn) {
×
840
            *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
×
841
                              SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ",`%s`",
×
842
                              (pCfg->pSchemas + i)->name);
×
843
          } else {
844
            smaOn = true;
×
845
            *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
×
846
                              SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "`%s`",
×
847
                              (pCfg->pSchemas + i)->name);
×
848
          }
849
        }
850
      }
851
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, ")");
×
852
    }
853
  }
854

855
  if (pCfg->virtualStb) {
15,556!
UNCOV
856
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
UNCOV
857
                      " VIRTUAL %d", pCfg->virtualStb);
×
858
  }
859
}
15,556✔
860

861
static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* pDbCfg, char* tbName, STableCfg* pCfg,
16,286✔
862
                                              void* charsetCxt) {
863
  int32_t code = TSDB_CODE_SUCCESS;
16,286✔
864
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
16,286!
865
  pBlock->info.rows = 1;
16,286✔
866

867
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
16,286✔
868
  char             buf1[(SHOW_CREATE_TB_RESULT_FIELD1_LEN << 1)] = {0};
16,286✔
869
  STR_TO_VARSTR(buf1, tbName);
16,286!
870
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
16,286!
871

872
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
16,286✔
873
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_TB_RESULT_FIELD2_LEN);
16,286!
874
  if (NULL == buf2) {
16,286!
875
    QRY_ERR_RET(terrno);
×
876
  }
877

878
  int32_t len = 0;
16,286✔
879

880
  if (TSDB_SUPER_TABLE == pCfg->tableType) {
16,286✔
881
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
6,236✔
882
                     "CREATE STABLE `%s` (", expandIdentifier(tbName, buf1));
883
    appendColumnFields(buf2, &len, pCfg);
6,236✔
884
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
6,236✔
885
                     ") TAGS (");
886
    appendTagFields(buf2, &len, pCfg);
6,236✔
887
    len +=
6,236✔
888
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
6,236✔
889
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
6,236✔
890
  } else if (TSDB_CHILD_TABLE == pCfg->tableType) {
10,050✔
891
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
7,946✔
892
                     "CREATE TABLE `%s` ", expandIdentifier(tbName, buf1));
893
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
7,946✔
894
                     "USING `%s` (", expandIdentifier(pCfg->stbName, buf1));
7,946✔
895
    appendTagNameFields(buf2, &len, pCfg);
7,946✔
896
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
7,946✔
897
                     ") TAGS (");
898
    code = appendTagValues(buf2, &len, pCfg, charsetCxt);
7,946✔
899
    TAOS_CHECK_ERRNO(code);
7,946!
900
    len +=
7,946✔
901
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
7,946✔
902
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
7,946✔
903
  } else if (TSDB_NORMAL_TABLE == pCfg->tableType) {
2,104✔
904
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
1,374✔
905
                     "CREATE TABLE `%s` (", expandIdentifier(tbName, buf1));
906
    appendColumnFields(buf2, &len, pCfg);
1,374✔
907
    len +=
1,374✔
908
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
1,374✔
909
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
1,374✔
910
  } else if (TSDB_VIRTUAL_NORMAL_TABLE == pCfg->tableType) {
730✔
911
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
365✔
912
                     "CREATE VTABLE `%s` (", expandIdentifier(tbName, buf1));
913
    appendColumnFields(buf2, &len, pCfg);
365✔
914
    len +=
365✔
915
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
365✔
916
  } else if (TSDB_VIRTUAL_CHILD_TABLE == pCfg->tableType) {
365!
917
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
365✔
918
                     "CREATE VTABLE `%s` (", expandIdentifier(tbName, buf1));
919
    appendColRefFields(buf2, &len, pCfg);
365✔
920
    len += snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
365✔
921
                    ") USING `%s` (", expandIdentifier(pCfg->stbName, buf1));
365✔
922
    appendTagNameFields(buf2, &len, pCfg);
365✔
923
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
365✔
924
                     ") TAGS (");
925
    code = appendTagValues(buf2, &len, pCfg, charsetCxt);
365✔
926
    TAOS_CHECK_ERRNO(code);
365!
927
    len +=
365✔
928
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
365✔
929
  }
930

931
  varDataLen(buf2) = (len > 65535) ? 65535 : len;
16,286✔
932

933
  code = colDataSetVal(pCol2, 0, buf2, false);
16,286✔
934
  TAOS_CHECK_ERRNO(code);
16,286!
935

936
_exit:
16,286✔
937
  taosMemoryFree(buf2);
16,286!
938

939
  return code;
16,286✔
940
}
941

UNCOV
942
static int32_t setCreateViewResultIntoDataBlock(SSDataBlock* pBlock, SShowCreateViewStmt* pStmt) {
×
UNCOV
943
  int32_t code = 0;
×
UNCOV
944
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
×
UNCOV
945
  pBlock->info.rows = 1;
×
946

UNCOV
947
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
×
UNCOV
948
  char             buf1[SHOW_CREATE_VIEW_RESULT_FIELD1_LEN + 1] = {0};
×
UNCOV
949
  snprintf(varDataVal(buf1), TSDB_VIEW_FNAME_LEN + 4, "`%s`.`%s`", pStmt->dbName, pStmt->viewName);
×
UNCOV
950
  varDataSetLen(buf1, strlen(varDataVal(buf1)));
×
UNCOV
951
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
×
952

UNCOV
953
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
×
UNCOV
954
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_VIEW_RESULT_FIELD2_LEN);
×
UNCOV
955
  if (NULL == buf2) {
×
956
    return terrno;
×
957
  }
958

UNCOV
959
  SViewMeta* pMeta = pStmt->pViewMeta;
×
UNCOV
960
  if (NULL == pMeta) {
×
961
    qError("exception: view meta is null");
×
962
    taosMemoryFree(buf2);
×
963
    return TSDB_CODE_APP_ERROR;
×
964
  }
UNCOV
965
  snprintf(varDataVal(buf2), SHOW_CREATE_VIEW_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, "CREATE VIEW `%s`.`%s` AS %s",
×
UNCOV
966
           pStmt->dbName, pStmt->viewName, pMeta->querySql);
×
UNCOV
967
  int32_t len = strlen(varDataVal(buf2));
×
UNCOV
968
  varDataLen(buf2) = (len > 65535) ? 65535 : len;
×
UNCOV
969
  code = colDataSetVal(pCol2, 0, buf2, false);
×
UNCOV
970
  taosMemoryFree(buf2);
×
971

UNCOV
972
  return code;
×
973
}
974

975
extern const char* fmGetFuncName(int32_t funcId);
UNCOV
976
static int32_t setCreateRsmaResultIntoDataBlock(SSDataBlock* pBlock, SShowCreateRsmaStmt* pStmt) {
×
UNCOV
977
  int32_t       code = 0, lino = 0;
×
UNCOV
978
  char*         buf2 = NULL;
×
UNCOV
979
  SRsmaInfoRsp* pMeta = pStmt->pRsmaMeta;
×
980

UNCOV
981
  if (pMeta->nFuncs != pMeta->nColNames) {
×
982
    qError("exception: rsma meta is invalid, nFuncs:%d != nColNames:%d", pMeta->nFuncs, pMeta->nColNames);
×
983
    return TSDB_CODE_APP_ERROR;
×
984
  }
985

UNCOV
986
  TAOS_CHECK_EXIT(blockDataEnsureCapacity(pBlock, 1));
×
UNCOV
987
  pBlock->info.rows = 1;
×
988

UNCOV
989
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
×
UNCOV
990
  char             buf1[SHOW_CREATE_TB_RESULT_FIELD1_LEN << 1] = {0};
×
UNCOV
991
  snprintf(varDataVal(buf1), TSDB_TABLE_FNAME_LEN + 4, "`%s`", expandIdentifier(pStmt->rsmaName, buf1));
×
UNCOV
992
  varDataSetLen(buf1, strlen(varDataVal(buf1)));
×
UNCOV
993
  TAOS_CHECK_EXIT(colDataSetVal(pCol1, 0, buf1, false));
×
994

UNCOV
995
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
×
UNCOV
996
  if (!(buf2 = taosMemoryMalloc(SHOW_CREATE_TB_RESULT_FIELD2_LEN))) {
×
997
    return terrno;
×
998
  }
999

UNCOV
1000
  SName name = {0};
×
UNCOV
1001
  TAOS_CHECK_EXIT(tNameFromString(&name, pMeta->tbFName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE));
×
1002

UNCOV
1003
  int32_t len = 0;
×
UNCOV
1004
  len += tsnprintf(varDataVal(buf2), SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
UNCOV
1005
                       "CREATE RSMA `%s` ON `%s`.`%s` FUNCTION(", expandIdentifier(pStmt->rsmaName, buf1),
×
1006
                       expandIdentifier(name.dbname, buf1), expandIdentifier(name.tname, buf1));
UNCOV
1007
  for (int32_t i = 0; i < pMeta->nFuncs; ++i) {
×
UNCOV
1008
    len += tsnprintf(varDataVal(buf2) + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
×
UNCOV
1009
                         "%s%s(`%s`)", (i > 0) ? "," : "", fmGetFuncName(pMeta->funcIds[i]),
×
UNCOV
1010
                         expandIdentifier(*(char**)TARRAY_GET_ELEM(pMeta->colNames, i), buf1));
×
1011
  }
UNCOV
1012
  len += tsnprintf(varDataVal(buf2) + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
×
UNCOV
1013
                       ") INTERVAL(%d%c", pMeta->interval[0], pMeta->intervalUnit);
×
UNCOV
1014
  if (pMeta->interval[1] > 0) {
×
UNCOV
1015
    len += tsnprintf(varDataVal(buf2) + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
×
UNCOV
1016
                         ",%d%c", pMeta->interval[1], pMeta->intervalUnit);
×
1017
  }
UNCOV
1018
  len += tsnprintf(varDataVal(buf2) + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
×
UNCOV
1019
  varDataLen(buf2) = len;
×
UNCOV
1020
  code = colDataSetVal(pCol2, 0, buf2, false);
×
UNCOV
1021
_exit:
×
UNCOV
1022
  taosMemoryFree(buf2);
×
UNCOV
1023
  return code;
×
1024
}
1025

1026
static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp, void* charsetCxt) {
15,556✔
1027
  SSDataBlock* pBlock = NULL;
15,556✔
1028
  int32_t      code = buildCreateTbResultDataBlock(&pBlock);
15,556✔
1029
  if (TSDB_CODE_SUCCESS == code) {
15,556!
1030
    code = setCreateTBResultIntoDataBlock(pBlock, pStmt->pDbCfg, pStmt->tableName, pStmt->pTableCfg, charsetCxt);
15,556✔
1031
  }
1032
  if (TSDB_CODE_SUCCESS == code) {
15,556!
1033
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_TB_RESULT_COLS, pRsp);
15,556✔
1034
  }
1035
  (void)blockDataDestroy(pBlock);
15,556✔
1036
  return code;
15,556✔
1037
}
1038

1039
static int32_t execShowCreateVTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp, void* charsetCxt) {
730✔
1040
  SSDataBlock* pBlock = NULL;
730✔
1041
  int32_t      code = buildCreateTbResultDataBlock(&pBlock);
730✔
1042
  if (TSDB_CODE_SUCCESS == code) {
730!
1043
    code = setCreateTBResultIntoDataBlock(pBlock, pStmt->pDbCfg, pStmt->tableName, pStmt->pTableCfg, charsetCxt);
730✔
1044
  }
1045
  if (TSDB_CODE_SUCCESS == code) {
730!
1046
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_TB_RESULT_COLS, pRsp);
730✔
1047
  }
1048
  (void)blockDataDestroy(pBlock);
730✔
1049
  return code;
730✔
1050
}
1051

UNCOV
1052
static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp, void* charsetCxt) {
×
UNCOV
1053
  STableCfg* pCfg = (STableCfg*)pStmt->pTableCfg;
×
UNCOV
1054
  if (TSDB_SUPER_TABLE != pCfg->tableType) {
×
UNCOV
1055
    terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR;
×
UNCOV
1056
    return terrno;
×
1057
  }
1058

UNCOV
1059
  return execShowCreateTable(pStmt, pRsp, charsetCxt);
×
1060
}
1061

1062
static int32_t execAlterCmd(char* cmd, char* value, bool* processed) {
14,475✔
1063
  int32_t code = 0;
14,475✔
1064

1065
  if (0 == strcasecmp(cmd, COMMAND_RESET_LOG)) {
14,475!
UNCOV
1066
    taosResetLog();
×
UNCOV
1067
    cfgDumpCfg(tsCfg, 0, false);
×
1068
  } else if (0 == strcasecmp(cmd, COMMAND_SCHEDULE_POLICY)) {
14,475✔
1069
    int32_t tmp = 0;
1,152✔
1070
    code = taosStr2int32(value, &tmp);
1,152✔
1071
    if (code) {
1,152!
1072
      qError("invalid value:%s, error:%s", value, tstrerror(code));
×
1073
      return code;
×
1074
    }
1075
    code = schedulerUpdatePolicy(tmp);
1,152✔
1076
  } else if (0 == strcasecmp(cmd, COMMAND_ENABLE_RESCHEDULE)) {
13,323!
1077
    int32_t tmp = 0;
×
1078
    code = taosStr2int32(value, &tmp);
×
1079
    if (code) {
×
1080
      qError("invalid value:%s, error:%s", value, tstrerror(code));
×
1081
      return code;
×
1082
    }
1083
    code = schedulerEnableReSchedule(tmp != 0);
×
1084
  } else if (0 == strcasecmp(cmd, COMMAND_CATALOG_DEBUG)) {
13,323!
1085
    code = ctgdHandleDbgCommand(value);
×
1086
  } else if (0 == strcasecmp(cmd, COMMAND_ENABLE_MEM_DEBUG)) {
13,323!
1087
    code = taosMemoryDbgInit();
×
1088
    if (code) {
×
1089
      qError("failed to init memory dbg, error:%s", tstrerror(code));
×
1090
      return code;
×
1091
    }
1092
    tsAsyncLog = false;
×
1093
    qInfo("memory dbg enabled");
×
1094
  } else if (0 == strcasecmp(cmd, COMMAND_DISABLE_MEM_DEBUG)) {
13,323!
1095
    code = taosMemoryDbgInitRestore();
×
1096
    if (code) {
×
1097
      qError("failed to restore from memory dbg, error:%s", tstrerror(code));
×
1098
      return code;
×
1099
    }
1100
    qInfo("memory dbg disabled");
×
1101
  } else {
1102
    goto _return;
13,323✔
1103
  }
1104

1105
  *processed = true;
1,152✔
1106

1107
_return:
14,475✔
1108

1109
  if (code) {
14,475!
1110
    terrno = code;
×
1111
  }
1112

1113
  return code;
14,475✔
1114
}
1115

1116
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) {
14,475✔
1117
  bool processed = false;
14,475✔
1118

1119
  if (execAlterCmd(pStmt->config, pStmt->value, &processed)) {
14,475!
1120
    return terrno;
×
1121
  }
1122

1123
  if (processed) {
14,475✔
1124
    goto _return;
1,152✔
1125
  }
1126

1127
  if (cfgCheckRangeForDynUpdate(tsCfg, pStmt->config, pStmt->value, false, CFG_ALTER_LOCAL)) {
13,323✔
1128
    return terrno;
324✔
1129
  }
1130

1131
  if (cfgSetItem(tsCfg, pStmt->config, pStmt->value, CFG_STYPE_ALTER_CLIENT_CMD, true)) {
12,999!
1132
    return terrno;
×
1133
  }
1134

1135
  TAOS_CHECK_RETURN(taosCfgDynamicOptions(tsCfg, pStmt->config, false));
12,999!
1136

1137
_return:
14,081✔
1138

1139
  return TSDB_CODE_SUCCESS;
14,151✔
1140
}
1141

1142
static int32_t buildLocalVariablesResultDataBlock(SSDataBlock** pOutput) {
10,103✔
1143
  SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
10,103!
1144
  if (NULL == pBlock) {
10,103!
1145
    return terrno;
×
1146
  }
1147

1148
  pBlock->info.hasVarCol = true;
10,103✔
1149

1150
  pBlock->pDataBlock = taosArrayInit(SHOW_LOCAL_VARIABLES_RESULT_COLS, sizeof(SColumnInfoData));
10,103✔
1151
  if (NULL == pBlock->pDataBlock) {
10,103!
1152
    taosMemoryFree(pBlock);
×
1153
    return terrno;
×
1154
  }
1155

1156
  SColumnInfoData infoData = {0};
10,103✔
1157

1158
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
10,103✔
1159
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN;
10,103✔
1160
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
20,206!
1161
    goto _exit;
×
1162
  }
1163

1164
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
10,103✔
1165
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN;
10,103✔
1166
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
20,206!
1167
    goto _exit;
×
1168
  }
1169

1170
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
10,103✔
1171
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD3_LEN;
10,103✔
1172
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
20,206!
1173
    goto _exit;
×
1174
  }
1175

1176
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
10,103✔
1177
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD4_LEN;
10,103✔
1178
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
20,206!
1179
    goto _exit;
×
1180
  }
1181

1182
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
10,103✔
1183
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD5_LEN;
10,103✔
1184
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
20,206!
1185
    goto _exit;
×
1186
  }
1187

1188
  *pOutput = pBlock;
10,103✔
1189

1190
_exit:
10,103✔
1191
  if (terrno != TSDB_CODE_SUCCESS) {
10,103!
1192
    taosArrayDestroy(pBlock->pDataBlock);
×
1193
    taosMemoryFree(pBlock);
×
1194
  }
1195
  return terrno;
10,103✔
1196
}
1197

1198
static int32_t execShowLocalVariables(SShowStmt* pStmt, SRetrieveTableRsp** pRsp) {
10,103✔
1199
  SSDataBlock* pBlock = NULL;
10,103✔
1200
  char*        likePattern = NULL;
10,103✔
1201
  int32_t      code = buildLocalVariablesResultDataBlock(&pBlock);
10,103✔
1202
  if (TSDB_CODE_SUCCESS == code) {
10,103!
1203
    if (pStmt->tableCondType == OP_TYPE_LIKE) {
10,103✔
1204
      likePattern = ((SValueNode*)pStmt->pTbName)->literal;
1,811✔
1205
    }
1206
  }
1207
  if (TSDB_CODE_SUCCESS == code) {
10,103!
1208
    code = dumpConfToDataBlock(pBlock, 0, likePattern);
10,103✔
1209
  }
1210
  if (TSDB_CODE_SUCCESS == code) {
10,103!
1211
    code = buildRetrieveTableRsp(pBlock, SHOW_LOCAL_VARIABLES_RESULT_COLS, pRsp);
10,103✔
1212
  }
1213
  (void)blockDataDestroy(pBlock);
10,103✔
1214
  return code;
10,103✔
1215
}
1216

1217
static int32_t createSelectResultDataBlock(SNodeList* pProjects, SSDataBlock** pOutput) {
190,906✔
1218
  QRY_PARAM_CHECK(pOutput);
190,906!
1219

1220
  SSDataBlock* pBlock = NULL;
190,906✔
1221
  int32_t      code = createDataBlock(&pBlock);
190,906✔
1222
  if (code) {
190,906!
1223
    return code;
×
1224
  }
1225

1226
  SNode* pProj = NULL;
190,906✔
1227
  FOREACH(pProj, pProjects) {
381,812!
1228
    SExprNode*      pExpr = (SExprNode*)pProj;
190,906✔
1229
    SColumnInfoData infoData = {0};
190,906✔
1230
    if (TSDB_DATA_TYPE_NULL == pExpr->resType.type) {
190,906!
1231
      infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
×
1232
      infoData.info.bytes = 0;
×
1233
    } else {
1234
      infoData.info.type = pExpr->resType.type;
190,906✔
1235
      infoData.info.bytes = pExpr->resType.bytes;
190,906✔
1236
      infoData.info.precision = pExpr->resType.precision;
190,906✔
1237
      infoData.info.scale = pExpr->resType.scale;
190,906✔
1238
    }
1239
    QRY_ERR_RET(blockDataAppendColInfo(pBlock, &infoData));
190,906!
1240
  }
1241

1242
  *pOutput = pBlock;
190,906✔
1243
  return code;
190,906✔
1244
}
1245

1246
static int32_t buildSelectResultDataBlock(SNodeList* pProjects, SSDataBlock* pBlock) {
190,906✔
1247
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
190,906!
1248

1249
  int32_t index = 0;
190,906✔
1250
  SNode*  pProj = NULL;
190,906✔
1251
  FOREACH(pProj, pProjects) {
381,812!
1252
    if (QUERY_NODE_VALUE != nodeType(pProj)) {
190,906!
1253
      return TSDB_CODE_PAR_INVALID_SELECTED_EXPR;
×
1254
    } else {
1255
      if (((SValueNode*)pProj)->isNull) {
190,906!
UNCOV
1256
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0, NULL, true));
×
1257
      } else {
1258
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0,
190,906!
1259
                                  nodesGetValueFromNode((SValueNode*)pProj), false));
1260
      }
1261
    }
1262
  }
1263

1264
  pBlock->info.rows = 1;
190,906✔
1265
  return TSDB_CODE_SUCCESS;
190,906✔
1266
}
1267

1268
static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** pRsp) {
190,906✔
1269
  SSDataBlock* pBlock = NULL;
190,906✔
1270
  int32_t      code = createSelectResultDataBlock(pSelect->pProjectionList, &pBlock);
190,906✔
1271
  if (TSDB_CODE_SUCCESS == code) {
190,906!
1272
    code = buildSelectResultDataBlock(pSelect->pProjectionList, pBlock);
190,906✔
1273
  }
1274
  if (TSDB_CODE_SUCCESS == code) {
190,906!
1275
    code = buildRetrieveTableRsp(pBlock, LIST_LENGTH(pSelect->pProjectionList), pRsp);
190,906!
1276
  }
1277
  (void)blockDataDestroy(pBlock);
190,906✔
1278
  return code;
190,906✔
1279
}
1280

UNCOV
1281
static int32_t execShowCreateView(SShowCreateViewStmt* pStmt, SRetrieveTableRsp** pRsp) {
×
UNCOV
1282
  SSDataBlock* pBlock = NULL;
×
UNCOV
1283
  int32_t      code = buildCreateViewResultDataBlock(&pBlock);
×
UNCOV
1284
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
1285
    code = setCreateViewResultIntoDataBlock(pBlock, pStmt);
×
1286
  }
UNCOV
1287
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
1288
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_VIEW_RESULT_COLS, pRsp);
×
1289
  }
UNCOV
1290
  (void)blockDataDestroy(pBlock);
×
UNCOV
1291
  return code;
×
1292
}
1293

UNCOV
1294
static int32_t execShowCreateRsma(SShowCreateRsmaStmt* pStmt, SRetrieveTableRsp** pRsp) {
×
UNCOV
1295
  SSDataBlock* pBlock = NULL;
×
UNCOV
1296
  int32_t      code = buildCreateTbResultDataBlock(&pBlock);
×
UNCOV
1297
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
1298
    code = setCreateRsmaResultIntoDataBlock(pBlock, pStmt);
×
1299
  }
UNCOV
1300
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
1301
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_TB_RESULT_COLS, pRsp);
×
1302
  }
UNCOV
1303
  (void)blockDataDestroy(pBlock);
×
UNCOV
1304
  return code;
×
1305
}
1306

1307
int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode,
605,655✔
1308
                     void* charsetCxt) {
1309
  switch (nodeType(pStmt)) {
605,655!
1310
    case QUERY_NODE_DESCRIBE_STMT:
113,715✔
1311
      return execDescribe(sysInfoUser, pStmt, pRsp, biMode);
113,715✔
1312
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
260,170✔
1313
      return execResetQueryCache();
260,170✔
UNCOV
1314
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
×
UNCOV
1315
      return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt, pRsp);
×
1316
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
15,556✔
1317
      return execShowCreateTable((SShowCreateTableStmt*)pStmt, pRsp, charsetCxt);
15,556✔
1318
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
730✔
1319
      return execShowCreateVTable((SShowCreateTableStmt*)pStmt, pRsp, charsetCxt);
730✔
UNCOV
1320
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
×
UNCOV
1321
      return execShowCreateSTable((SShowCreateTableStmt*)pStmt, pRsp, charsetCxt);
×
UNCOV
1322
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
×
UNCOV
1323
      return execShowCreateView((SShowCreateViewStmt*)pStmt, pRsp);
×
UNCOV
1324
    case QUERY_NODE_SHOW_CREATE_RSMA_STMT:
×
UNCOV
1325
      return execShowCreateRsma((SShowCreateRsmaStmt*)pStmt, pRsp);
×
1326
    case QUERY_NODE_ALTER_LOCAL_STMT:
14,475✔
1327
      return execAlterLocal((SAlterLocalStmt*)pStmt);
14,475✔
1328
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
10,103✔
1329
      return execShowLocalVariables((SShowStmt*)pStmt, pRsp);
10,103✔
1330
    case QUERY_NODE_SELECT_STMT:
190,906✔
1331
      return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp);
190,906✔
1332
    default:
×
1333
      break;
×
1334
  }
1335
  return TSDB_CODE_FAILED;
×
1336
}
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