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

taosdata / TDengine / #3519

05 Nov 2024 11:19AM UTC coverage: 57.706% (+8.4%) from 49.32%
#3519

push

travis-ci

web-flow
Merge pull request #28652 from taosdata/fix/3_liaohj

refactor: always successfully put the retrieve msg

109445 of 245179 branches covered (44.64%)

Branch coverage included in aggregate %.

187435 of 269288 relevant lines covered (69.6%)

12869818.21 hits per line

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

65.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 "scheduler.h"
20
#include "systable.h"
21
#include "taosdef.h"
22
#include "tdatablock.h"
23
#include "tglobal.h"
24
#include "tgrant.h"
25

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

35
extern SConfig* tsCfg;
36

37
static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRetrieveTableRsp** pRsp) {
74,731✔
38
  size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock) + PAYLOAD_PREFIX_LEN;
74,731✔
39
  *pRsp = taosMemoryCalloc(1, rspSize);
74,729✔
40
  if (NULL == *pRsp) {
74,731!
41
    return terrno;
×
42
  }
43

44
  (*pRsp)->useconds = 0;
74,731✔
45
  (*pRsp)->completed = 1;
74,731✔
46
  (*pRsp)->precision = 0;
74,731✔
47
  (*pRsp)->compressed = 0;
74,731✔
48

49
  (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
74,731✔
50
  (*pRsp)->numOfCols = htonl(numOfCols);
74,731✔
51

52
  int32_t len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, numOfCols);
74,731✔
53
  if (len < 0) {
74,731!
54
    taosMemoryFree(*pRsp);
×
55
    return terrno;
×
56
  }
57
  SET_PAYLOAD_LEN((*pRsp)->data, len, len);
74,731✔
58

59
  int32_t payloadLen = len + PAYLOAD_PREFIX_LEN;
74,731✔
60
  (*pRsp)->payloadLen = htonl(payloadLen);
74,731✔
61
  (*pRsp)->compLen = htonl(payloadLen);
74,731✔
62

63
  return TSDB_CODE_SUCCESS;
74,731✔
64
}
65

66
static int32_t getSchemaBytes(const SSchema* pSchema) {
118,560✔
67
  switch (pSchema->type) {
118,560✔
68
    case TSDB_DATA_TYPE_BINARY:
8,264✔
69
    case TSDB_DATA_TYPE_VARBINARY:
70
    case TSDB_DATA_TYPE_GEOMETRY:
71
      return (pSchema->bytes - VARSTR_HEADER_SIZE);
8,264✔
72
    case TSDB_DATA_TYPE_NCHAR:
8,849✔
73
    case TSDB_DATA_TYPE_JSON:
74
      return (pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE;
8,849✔
75
    default:
101,447✔
76
      return pSchema->bytes;
101,447✔
77
  }
78
}
79

80
static int32_t buildDescResultDataBlock(SSDataBlock** pOutput) {
2,864✔
81
  QRY_PARAM_CHECK(pOutput);
2,864!
82

83
  SSDataBlock* pBlock = NULL;
2,864✔
84
  int32_t      code = createDataBlock(&pBlock);
2,864✔
85
  if (code) {
2,864!
86
    return code;
×
87
  }
88

89
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_FIELD_LEN, 1);
2,864✔
90
  code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
91
  if (TSDB_CODE_SUCCESS == code) {
2,864!
92
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_TYPE_LEN, 2);
2,864✔
93
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
94
  }
95
  if (TSDB_CODE_SUCCESS == code) {
2,864!
96
    infoData = createColumnInfoData(TSDB_DATA_TYPE_INT, tDataTypes[TSDB_DATA_TYPE_INT].bytes, 3);
2,864✔
97
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
98
  }
99
  if (TSDB_CODE_SUCCESS == code) {
2,864!
100
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_NOTE_LEN, 4);
2,864✔
101
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
102
  }
103
  if (TSDB_CODE_SUCCESS == code) {
2,864!
104
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 5);
2,864✔
105
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
106
  }
107
  if (TSDB_CODE_SUCCESS == code) {
2,864!
108
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 6);
2,864✔
109
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
110
  }
111
  if (TSDB_CODE_SUCCESS == code) {
2,864!
112
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, DESCRIBE_RESULT_COPRESS_OPTION_LEN, 7);
2,864✔
113
    code = blockDataAppendColInfo(pBlock, &infoData);
2,864✔
114
  }
115

116
  if (TSDB_CODE_SUCCESS == code) {
2,864!
117
    *pOutput = pBlock;
2,864✔
118
  } else {
119
    (void)blockDataDestroy(pBlock);
×
120
  }
121
  return code;
2,864✔
122
}
123

124
static int32_t setDescResultIntoDataBlock(bool sysInfoUser, SSDataBlock* pBlock, int32_t numOfRows, STableMeta* pMeta,
2,864✔
125
                                          int8_t biMode) {
126
  int32_t blockCap = (biMode != 0) ? numOfRows + 1 : numOfRows;
2,864!
127
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, blockCap));
2,864!
128
  pBlock->info.rows = 0;
2,863✔
129

130
  // field
131
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
2,863✔
132
  // Type
133
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
2,862✔
134
  // Length
135
  SColumnInfoData* pCol3 = taosArrayGet(pBlock->pDataBlock, 2);
2,863✔
136
  // Note
137
  SColumnInfoData* pCol4 = taosArrayGet(pBlock->pDataBlock, 3);
2,863✔
138
  // encode
139
  SColumnInfoData* pCol5 = NULL;
2,863✔
140
  // compress
141
  SColumnInfoData* pCol6 = NULL;
2,863✔
142
  // level
143
  SColumnInfoData* pCol7 = NULL;
2,863✔
144
  if (useCompress(pMeta->tableType)) {
2,863✔
145
    pCol5 = taosArrayGet(pBlock->pDataBlock, 4);
2,846✔
146
    pCol6 = taosArrayGet(pBlock->pDataBlock, 5);
2,846✔
147
    pCol7 = taosArrayGet(pBlock->pDataBlock, 6);
2,846✔
148
  }
149

150
  int32_t fillTagCol = 0;
2,862✔
151
  char    buf[DESCRIBE_RESULT_FIELD_LEN] = {0};
2,862✔
152
  for (int32_t i = 0; i < numOfRows; ++i) {
121,424✔
153
    if (invisibleColumn(sysInfoUser, pMeta->tableType, pMeta->schema[i].flags)) {
118,560!
154
      continue;
×
155
    }
156
    STR_TO_VARSTR(buf, pMeta->schema[i].name);
118,561✔
157
    COL_DATA_SET_VAL_AND_CHECK(pCol1, pBlock->info.rows, buf, false);
118,561!
158

159
    STR_TO_VARSTR(buf, tDataTypes[pMeta->schema[i].type].name);
118,559✔
160
    COL_DATA_SET_VAL_AND_CHECK(pCol2, pBlock->info.rows, buf, false);
118,559!
161
    int32_t bytes = getSchemaBytes(pMeta->schema + i);
118,560✔
162
    COL_DATA_SET_VAL_AND_CHECK(pCol3, pBlock->info.rows, (const char*)&bytes, false);
118,560!
163
    if (TSDB_VIEW_TABLE != pMeta->tableType) {
118,560✔
164
      if (i >= pMeta->tableInfo.numOfColumns) {
118,500✔
165
        STR_TO_VARSTR(buf, "TAG");
7,136✔
166
        fillTagCol = 1;
7,136✔
167
      } else if (i == 1 && pMeta->schema[i].flags & COL_IS_KEY) {
111,364✔
168
        STR_TO_VARSTR(buf, "PRIMARY KEY")
12✔
169
      } else {
170
        STR_TO_VARSTR(buf, "");
111,352✔
171
      }
172
    } else {
173
      STR_TO_VARSTR(buf, "VIEW COL");
60✔
174
    }
175
    COL_DATA_SET_VAL_AND_CHECK(pCol4, pBlock->info.rows, buf, false);
118,560!
176
    if (useCompress(pMeta->tableType) && pMeta->schemaExt) {
118,561!
177
      if (i < pMeta->tableInfo.numOfColumns) {
118,494✔
178
        STR_TO_VARSTR(buf, columnEncodeStr(COMPRESS_L1_TYPE_U32(pMeta->schemaExt[i].compress)));
111,357✔
179
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
111,355!
180
        STR_TO_VARSTR(buf, columnCompressStr(COMPRESS_L2_TYPE_U32(pMeta->schemaExt[i].compress)));
111,357✔
181
        COL_DATA_SET_VAL_AND_CHECK(pCol6, pBlock->info.rows, buf, false);
111,357!
182
        STR_TO_VARSTR(buf, columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pMeta->schemaExt[i].compress)));
111,355✔
183
        COL_DATA_SET_VAL_AND_CHECK(pCol7, pBlock->info.rows, buf, false);
111,353!
184
      } else {
185
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
7,137!
186
        COL_DATA_SET_VAL_AND_CHECK(pCol5, pBlock->info.rows, buf, false);
7,137!
187
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
7,137!
188
        COL_DATA_SET_VAL_AND_CHECK(pCol6, pBlock->info.rows, buf, false);
7,137!
189
        STR_TO_VARSTR(buf, fillTagCol == 0 ? "" : "disabled");
7,137!
190
        COL_DATA_SET_VAL_AND_CHECK(pCol7, pBlock->info.rows, buf, false);
7,137!
191
      }
192
    }
193

194
    fillTagCol = 0;
118,562✔
195

196
    ++(pBlock->info.rows);
118,562✔
197
  }
198
  if (pMeta->tableType == TSDB_SUPER_TABLE && biMode != 0) {
2,864!
199
    STR_TO_VARSTR(buf, "tbname");
×
200
    COL_DATA_SET_VAL_AND_CHECK(pCol1, pBlock->info.rows, buf, false);
×
201
    STR_TO_VARSTR(buf, "VARCHAR");
×
202
    COL_DATA_SET_VAL_AND_CHECK(pCol2, pBlock->info.rows, buf, false);
×
203
    int32_t bytes = TSDB_TABLE_NAME_LEN - 1;
×
204
    COL_DATA_SET_VAL_AND_CHECK(pCol3, pBlock->info.rows, (const char*)&bytes, false);
×
205
    STR_TO_VARSTR(buf, "TAG");
×
206
    COL_DATA_SET_VAL_AND_CHECK(pCol4, pBlock->info.rows, buf, false);
×
207
    ++(pBlock->info.rows);
×
208
  }
209
  if (pBlock->info.rows <= 0) {
2,864!
210
    qError("no permission to view any columns");
×
211
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
212
  }
213
  return TSDB_CODE_SUCCESS;
2,864✔
214
}
215

216
static int32_t execDescribe(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode) {
2,863✔
217
  SDescribeStmt* pDesc = (SDescribeStmt*)pStmt;
2,863✔
218
  int32_t        numOfRows = TABLE_TOTAL_COL_NUM(pDesc->pMeta);
2,863✔
219

220
  SSDataBlock* pBlock = NULL;
2,863✔
221
  int32_t      code = buildDescResultDataBlock(&pBlock);
2,863✔
222
  if (TSDB_CODE_SUCCESS == code) {
2,864!
223
    code = setDescResultIntoDataBlock(sysInfoUser, pBlock, numOfRows, pDesc->pMeta, biMode);
2,864✔
224
  }
225
  if (TSDB_CODE_SUCCESS == code) {
2,863!
226
    if (pDesc->pMeta && useCompress(pDesc->pMeta->tableType) && pDesc->pMeta->schemaExt) {
2,864!
227
      code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS_COMPRESS, pRsp);
2,847✔
228
    } else {
229
      code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS, pRsp);
18✔
230
    }
231
  }
232
  (void)blockDataDestroy(pBlock);
2,862✔
233
  return code;
2,864✔
234
}
235

236
static int32_t execResetQueryCache() { return catalogClearCache(); }
7,743✔
237

238
static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
27✔
239
  QRY_PARAM_CHECK(pOutput);
27!
240

241
  SSDataBlock* pBlock = NULL;
27✔
242
  int32_t      code = createDataBlock(&pBlock);
27✔
243
  if (code) {
27!
244
    return code;
×
245
  }
246

247
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_COLS, 1);
27✔
248
  code = blockDataAppendColInfo(pBlock, &infoData);
27✔
249
  if (TSDB_CODE_SUCCESS == code) {
27!
250
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_FIELD2_LEN, 2);
27✔
251
    code = blockDataAppendColInfo(pBlock, &infoData);
27✔
252
  }
253

254
  if (TSDB_CODE_SUCCESS == code) {
27!
255
    *pOutput = pBlock;
27✔
256
  } else {
257
    (void)blockDataDestroy(pBlock);
×
258
  }
259
  return code;
27✔
260
}
261

262
int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
×
263
  int64_t v = 0;
×
264
  switch (unit) {
×
265
    case 's':
×
266
      v = val / 1000;
×
267
      break;
×
268
    case 'm':
×
269
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
×
270
      break;
×
271
    case 'h':
×
272
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
×
273
      break;
×
274
    case 'd':
×
275
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
×
276
      break;
×
277
    case 'w':
×
278
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
×
279
      break;
×
280
    default:
×
281
      break;
×
282
  }
283

284
  return v;
×
285
}
286

287
static int32_t buildRetension(SArray* pRetension, char** ppRetentions) {
27✔
288
  size_t size = taosArrayGetSize(pRetension);
27✔
289
  if (size == 0) {
27!
290
    *ppRetentions = NULL;
27✔
291
    return TSDB_CODE_SUCCESS;
27✔
292
  }
293

294
  const int lMaxLen = 128;
×
295
  char*     p1 = taosMemoryCalloc(1, lMaxLen);
×
296
  if (NULL == p1) {
×
297
    return terrno;
×
298
  }
299
  int32_t len = 0;
×
300

301
  for (int32_t i = 0; i < size; ++i) {
×
302
    SRetention* p = TARRAY_GET_ELEM(pRetension, i);
×
303
    int64_t     v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
304
    int64_t     v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
305
    if (i == 0) {
×
306
      len += tsnprintf(p1 + len, lMaxLen - len, "-:%" PRId64 "%c", v2, p->keepUnit);
×
307
    } else {
308
      len += tsnprintf(p1 + len, lMaxLen - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
309
    }
310

311
    if (i < size - 1) {
×
312
      len += tsnprintf(p1 + len, lMaxLen - len, ",");
×
313
    }
314
  }
315

316
  *ppRetentions = p1;
×
317
  return TSDB_CODE_SUCCESS;
×
318
}
319

320
static const char* cacheModelStr(int8_t cacheModel) {
25✔
321
  switch (cacheModel) {
25!
322
    case TSDB_CACHE_MODEL_NONE:
25✔
323
      return TSDB_CACHE_MODEL_NONE_STR;
25✔
324
    case TSDB_CACHE_MODEL_LAST_ROW:
×
325
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
×
326
    case TSDB_CACHE_MODEL_LAST_VALUE:
×
327
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
×
328
    case TSDB_CACHE_MODEL_BOTH:
×
329
      return TSDB_CACHE_MODEL_BOTH_STR;
×
330
    default:
×
331
      break;
×
332
  }
333
  return TSDB_CACHE_MODEL_NONE_STR;
×
334
}
335

336
static const char* encryptAlgorithmStr(int8_t encryptAlgorithm) {
25✔
337
  switch (encryptAlgorithm) {
25!
338
    case TSDB_ENCRYPT_ALGO_NONE:
25✔
339
      return TSDB_ENCRYPT_ALGO_NONE_STR;
25✔
340
    case TSDB_ENCRYPT_ALGO_SM4:
×
341
      return TSDB_ENCRYPT_ALGO_SM4_STR;
×
342
    default:
×
343
      break;
×
344
  }
345
  return TSDB_CACHE_MODEL_NONE_STR;
×
346
}
347

348
int32_t formatDurationOrKeep(char* buffer, int64_t bufSize, int32_t timeInMinutes) {
2,256✔
349
  if (buffer == NULL || bufSize <= 0) {
2,256!
350
    return 0;
×
351
  }
352
  int32_t len = 0;
2,256✔
353
  if (timeInMinutes % 1440 == 0) {
2,256!
354
    int32_t days = timeInMinutes / 1440;
2,256✔
355
    len = tsnprintf(buffer, bufSize, "%dd", days);
2,256✔
356
  } else if (timeInMinutes % 60 == 0) {
×
357
    int32_t hours = timeInMinutes / 60;
×
358
    len = tsnprintf(buffer, bufSize, "%dh", hours);
×
359
  } else {
360
    len = tsnprintf(buffer, bufSize, "%dm", timeInMinutes);
×
361
  }
362
  return len;
2,256✔
363
}
364

365
static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, char* dbFName, SDbCfgInfo* pCfg) {
27✔
366
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
27!
367
  pBlock->info.rows = 1;
27✔
368

369
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
27✔
370
  char             buf1[SHOW_CREATE_DB_RESULT_FIELD1_LEN] = {0};
27✔
371
  STR_TO_VARSTR(buf1, dbName);
27✔
372
  COL_DATA_SET_VAL_AND_CHECK(pCol1, 0, buf1, false);
27!
373

374
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
27✔
375
  char             buf2[SHOW_CREATE_DB_RESULT_FIELD2_LEN] = {0};
27✔
376
  int32_t          len = 0;
27✔
377
  char*            prec = NULL;
27✔
378
  switch (pCfg->precision) {
27!
379
    case TSDB_TIME_PRECISION_MILLI:
27✔
380
      prec = TSDB_TIME_PRECISION_MILLI_STR;
27✔
381
      break;
27✔
382
    case TSDB_TIME_PRECISION_MICRO:
×
383
      prec = TSDB_TIME_PRECISION_MICRO_STR;
×
384
      break;
×
385
    case TSDB_TIME_PRECISION_NANO:
×
386
      prec = TSDB_TIME_PRECISION_NANO_STR;
×
387
      break;
×
388
    default:
×
389
      prec = "none";
×
390
      break;
×
391
  }
392

393
  char* pRetentions = NULL;
27✔
394
  QRY_ERR_RET(buildRetension(pCfg->pRetensions, &pRetentions));
27!
395
  int32_t dbFNameLen = strlen(dbFName);
27✔
396
  int32_t hashPrefix = 0;
27✔
397
  if (pCfg->hashPrefix > 0) {
27✔
398
    hashPrefix = pCfg->hashPrefix - dbFNameLen - 1;
2✔
399
  } else if (pCfg->hashPrefix < 0) {
25✔
400
    hashPrefix = pCfg->hashPrefix + dbFNameLen + 1;
3✔
401
  }
402
  char durationStr[128] = {0};
27✔
403
  char keep0Str[128] = {0};
27✔
404
  char keep1Str[128] = {0};
27✔
405
  char keep2Str[128] = {0};
27✔
406

407
  int32_t lenDuration = formatDurationOrKeep(durationStr, sizeof(durationStr), pCfg->daysPerFile);
27✔
408
  int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pCfg->daysToKeep0);
27✔
409
  int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pCfg->daysToKeep1);
27✔
410
  int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pCfg->daysToKeep2);
27✔
411

412
  if (IS_SYS_DBNAME(dbName)) {
27!
413
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
2✔
414
                     "CREATE DATABASE `%s`", dbName);
2✔
415
  } else {
416
    len +=
25✔
417
        tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
25✔
418
                  "CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %s "
419
                  "WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d STT_TRIGGER %d KEEP %s,%s,%s PAGES %d PAGESIZE %d "
420
                  "PRECISION '%s' REPLICA %d "
421
                  "WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d "
422
                  "WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE %" PRId64
423
                  " KEEP_TIME_OFFSET %d ENCRYPT_ALGORITHM '%s' S3_CHUNKPAGES %d S3_KEEPLOCAL %dm S3_COMPACT %d",
424
                  dbName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, durationStr,
25✔
425
                  pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->sstTrigger, keep0Str, keep1Str, keep2Str,
25✔
426
                  pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->walLevel, pCfg->numOfVgroups,
25✔
427
                  1 == pCfg->numOfStables, hashPrefix, pCfg->hashSuffix, pCfg->tsdbPageSize, pCfg->walRetentionPeriod,
25✔
428
                  pCfg->walRetentionSize, pCfg->keepTimeOffset, encryptAlgorithmStr(pCfg->encryptAlgorithm),
25✔
429
                  pCfg->s3ChunkSize, pCfg->s3KeepLocal, pCfg->s3Compact);
25✔
430

431
    if (pRetentions) {
25!
432
      len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
433
                       " RETENTIONS %s", pRetentions);
434
    }
435
  }
436

437
  taosMemoryFree(pRetentions);
27✔
438

439
  (varDataLen(buf2)) = len;
27✔
440

441
  COL_DATA_SET_VAL_AND_CHECK(pCol2, 0, buf2, false);
27!
442

443
  return TSDB_CODE_SUCCESS;
27✔
444
}
445

446
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
27✔
447
  SSDataBlock* pBlock = NULL;
27✔
448
  int32_t      code = buildCreateDBResultDataBlock(&pBlock);
27✔
449
  if (TSDB_CODE_SUCCESS == code) {
27!
450
    code = setCreateDBResultIntoDataBlock(pBlock, pStmt->dbName, pStmt->dbFName, pStmt->pCfg);
27✔
451
  }
452
  if (TSDB_CODE_SUCCESS == code) {
27!
453
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_DB_RESULT_COLS, pRsp);
27✔
454
  }
455
  (void)blockDataDestroy(pBlock);
27✔
456
  return code;
27✔
457
}
458

459
static int32_t buildCreateTbResultDataBlock(SSDataBlock** pOutput) {
115✔
460
  QRY_PARAM_CHECK(pOutput);
115!
461

462
  SSDataBlock* pBlock = NULL;
115✔
463
  int32_t      code = createDataBlock(&pBlock);
115✔
464
  if (code) {
115!
465
    return code;
×
466
  }
467

468
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD1_LEN, 1);
115✔
469
  code = blockDataAppendColInfo(pBlock, &infoData);
115✔
470
  if (TSDB_CODE_SUCCESS == code) {
115!
471
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD2_LEN, 2);
115✔
472
    code = blockDataAppendColInfo(pBlock, &infoData);
115✔
473
  }
474

475
  if (TSDB_CODE_SUCCESS == code) {
115!
476
    *pOutput = pBlock;
115✔
477
  } else {
478
    (void)blockDataDestroy(pBlock);
×
479
  }
480
  return code;
115✔
481
}
482

483
static int32_t buildCreateViewResultDataBlock(SSDataBlock** pOutput) {
11✔
484
  QRY_PARAM_CHECK(pOutput);
11!
485

486
  SSDataBlock* pBlock = NULL;
11✔
487
  int32_t      code = createDataBlock(&pBlock);
11✔
488
  if (code) {
11!
489
    return code;
×
490
  }
491

492
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD1_LEN, 1);
11✔
493
  code = blockDataAppendColInfo(pBlock, &infoData);
11✔
494
  if (TSDB_CODE_SUCCESS == code) {
11!
495
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD2_LEN, 2);
11✔
496
    code = blockDataAppendColInfo(pBlock, &infoData);
11✔
497
  }
498

499
  if (TSDB_CODE_SUCCESS == code) {
11!
500
    *pOutput = pBlock;
11✔
501
  } else {
502
    (void)blockDataDestroy(pBlock);
×
503
  }
504
  return code;
11✔
505
}
506

507
void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
77✔
508
  for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
515✔
509
    SSchema* pSchema = pCfg->pSchemas + i;
438✔
510
#define LTYPE_LEN (32 + 60)  // 60 byte for compress info
511
    char type[LTYPE_LEN];
512
    snprintf(type, LTYPE_LEN, "%s", tDataTypes[pSchema->type].name);
438✔
513
    int typeLen = strlen(type);
438✔
514
    if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
438!
515
        TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
271!
516
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
167✔
517
    } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
271✔
518
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)",
10✔
519
                           (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
10✔
520
    }
521

522
    if (useCompress(pCfg->tableType) && pCfg->pSchemaExt) {
438!
523
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " ENCODE \'%s\'",
168✔
524
                           columnEncodeStr(COMPRESS_L1_TYPE_U32(pCfg->pSchemaExt[i].compress)));
168✔
525
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " COMPRESS \'%s\'",
168✔
526
                           columnCompressStr(COMPRESS_L2_TYPE_U32(pCfg->pSchemaExt[i].compress)));
168✔
527
      typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " LEVEL \'%s\'",
168✔
528
                           columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pCfg->pSchemaExt[i].compress)));
168✔
529
    }
530
    if (!(pSchema->flags & COL_IS_KEY)) {
438✔
531
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
426✔
532
                        "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
426✔
533
    } else {
534
      char* pk = "PRIMARY KEY";
12✔
535
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
12✔
536
                        "%s`%s` %s %s", ((i > 0) ? ", " : ""), pSchema->name, type, pk);
12!
537
    }
538
  }
539
}
77✔
540

541
void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
30✔
542
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
96✔
543
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
66✔
544
    char     type[32];
545
    snprintf(type, sizeof(type), "%s", tDataTypes[pSchema->type].name);
66✔
546
    if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
66!
547
        TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
58!
548
      snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
8✔
549
               (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
8✔
550
    } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
58✔
551
      snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
5✔
552
               (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
5✔
553
    }
554

555
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
66✔
556
                      "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
66✔
557
  }
558
}
30✔
559

560
void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
38✔
561
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
99✔
562
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
61✔
563
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
61✔
564
                      "%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
61✔
565
  }
566
}
38✔
567

568
int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
38✔
569
  int32_t code = TSDB_CODE_SUCCESS;
38✔
570
  SArray* pTagVals = NULL;
38✔
571
  STag*   pTag = (STag*)pCfg->pTags;
38✔
572

573
  if (NULL == pCfg->pTags || pCfg->numOfTags <= 0) {
38!
574
    qError("tag missed in table cfg, pointer:%p, numOfTags:%d", pCfg->pTags, pCfg->numOfTags);
×
575
    return TSDB_CODE_APP_ERROR;
×
576
  }
577

578
  if (tTagIsJson(pTag)) {
38✔
579
    char* pJson = NULL;
4✔
580
    parseTagDatatoJson(pTag, &pJson);
4✔
581
    if (NULL == pJson) {
4!
582
      qError("failed to parse tag to json, pJson is NULL");
×
583
      return terrno;
×
584
    }
585
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
4✔
586
                      "%s", pJson);
587
    taosMemoryFree(pJson);
4✔
588

589
    return TSDB_CODE_SUCCESS;
4✔
590
  }
591

592
  QRY_ERR_RET(tTagToValArray((const STag*)pCfg->pTags, &pTagVals));
34!
593
  int16_t valueNum = taosArrayGetSize(pTagVals);
34✔
594
  int32_t num = 0;
34✔
595
  int32_t j = 0;
34✔
596
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
91✔
597
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
57✔
598
    if (i > 0) {
57✔
599
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
23✔
600
                        ", ");
601
    }
602

603
    if (j >= valueNum) {
57✔
604
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
21✔
605
                        "NULL");
606
      continue;
21✔
607
    }
608

609
    STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
36✔
610
    if (pSchema->colId > pTagVal->cid) {
36!
611
      qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
×
612
      code = TSDB_CODE_APP_ERROR;
×
613
      TAOS_CHECK_ERRNO(code);
×
614
    } else if (pSchema->colId == pTagVal->cid) {
36✔
615
      char    type = pTagVal->type;
34✔
616
      int32_t tlen = 0;
34✔
617

618
      int64_t leftSize = SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len);
34✔
619
      if (leftSize <= 0) {
34!
620
        qError("no enough space to store tag value, leftSize:%" PRId64, leftSize);
×
621
        code = TSDB_CODE_APP_ERROR;
×
622
        TAOS_CHECK_ERRNO(code);
×
623
      }
624
      if (IS_VAR_DATA_TYPE(type)) {
34!
625
        code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, pTagVal->pData, pTagVal->nData, &tlen);
6✔
626
        TAOS_CHECK_ERRNO(code);
6!
627
      } else {
628
        code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, &pTagVal->i64, tDataTypes[type].bytes,
28✔
629
                               &tlen);
630
        TAOS_CHECK_ERRNO(code);
28!
631
      }
632
      *len += tlen;
34✔
633
      j++;
34✔
634
    } else {
635
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
2✔
636
                        "NULL");
637
    }
638
  }
639
_exit:
34✔
640
  taosArrayDestroy(pTagVals);
34✔
641

642
  return code;
34✔
643
}
644

645
void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg* pCfg) {
115✔
646
  if (pCfg->commentLen > 0) {
115!
647
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
648
                      " COMMENT '%s'", pCfg->pComment);
649
  } else if (0 == pCfg->commentLen) {
115✔
650
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
30✔
651
                      " COMMENT ''");
652
  }
653

654
  if (NULL != pDbCfg->pRetensions && pCfg->watermark1 > 0) {
115!
655
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
656
                      " WATERMARK %" PRId64 "a", pCfg->watermark1);
657
    if (pCfg->watermark2 > 0) {
×
658
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
659
                        ", %" PRId64 "a", pCfg->watermark2);
660
    }
661
  }
662

663
  if (NULL != pDbCfg->pRetensions && pCfg->delay1 > 0) {
115!
664
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
665
                      " MAX_DELAY %" PRId64 "a", pCfg->delay1);
666
    if (pCfg->delay2 > 0) {
×
667
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
668
                        ", %" PRId64 "a", pCfg->delay2);
669
    }
670
  }
671

672
  int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
115✔
673
  if (NULL != pDbCfg->pRetensions && funcNum > 0) {
115!
674
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
675
                      " ROLLUP(");
676
    for (int32_t i = 0; i < funcNum; ++i) {
×
677
      char* pFunc = taosArrayGet(pCfg->pFuncs, i);
×
678
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
679
                        "%s%s", ((i > 0) ? ", " : ""), pFunc);
680
    }
681
    *len +=
×
682
        snprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ")");
×
683
  }
684

685
  if (pCfg->ttl > 0) {
115!
686
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
687
                      " TTL %d", pCfg->ttl);
688
  }
689

690
  if (TSDB_SUPER_TABLE == pCfg->tableType || TSDB_NORMAL_TABLE == pCfg->tableType) {
115✔
691
    int32_t nSma = 0;
47✔
692
    for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
215✔
693
      if (IS_BSMA_ON(pCfg->pSchemas + i)) {
168!
694
        ++nSma;
168✔
695
      }
696
    }
697

698
    if (nSma < pCfg->numOfColumns && nSma > 0) {
47!
699
      bool smaOn = false;
×
700
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
701
                        " SMA(");
702
      for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
×
703
        if (IS_BSMA_ON(pCfg->pSchemas + i)) {
×
704
          if (smaOn) {
×
705
            *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
×
706
                              SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ",`%s`",
×
707
                              (pCfg->pSchemas + i)->name);
×
708
          } else {
709
            smaOn = true;
×
710
            *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
×
711
                              SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "`%s`",
×
712
                              (pCfg->pSchemas + i)->name);
×
713
          }
714
        }
715
      }
716
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, ")");
×
717
    }
718
  }
719
}
115✔
720

721
static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* pDbCfg, char* tbName, STableCfg* pCfg) {
115✔
722
  int32_t code = TSDB_CODE_SUCCESS;
115✔
723
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
115!
724
  pBlock->info.rows = 1;
115✔
725

726
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
115✔
727
  char             buf1[SHOW_CREATE_TB_RESULT_FIELD1_LEN] = {0};
115✔
728
  STR_TO_VARSTR(buf1, tbName);
115✔
729
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
115!
730

731
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
115✔
732
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_TB_RESULT_FIELD2_LEN);
115✔
733
  if (NULL == buf2) {
115!
734
    QRY_ERR_RET(terrno);
×
735
  }
736

737
  int32_t len = 0;
115✔
738

739
  if (TSDB_SUPER_TABLE == pCfg->tableType) {
115✔
740
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
30✔
741
                     "CREATE STABLE `%s` (", tbName);
742
    appendColumnFields(buf2, &len, pCfg);
30✔
743
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
30✔
744
                     ") TAGS (");
745
    appendTagFields(buf2, &len, pCfg);
30✔
746
    len +=
30✔
747
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
30✔
748
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
30✔
749
  } else if (TSDB_CHILD_TABLE == pCfg->tableType) {
85✔
750
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
76✔
751
                     "CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
38✔
752
    appendTagNameFields(buf2, &len, pCfg);
38✔
753
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
38✔
754
                     ") TAGS (");
755
    code = appendTagValues(buf2, &len, pCfg);
38✔
756
    TAOS_CHECK_ERRNO(code);
38!
757
    len +=
38✔
758
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
38✔
759
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
38✔
760
  } else {
761
    len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
47✔
762
                     "CREATE TABLE `%s` (", tbName);
763
    appendColumnFields(buf2, &len, pCfg);
47✔
764
    len +=
47✔
765
        snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
47✔
766
    appendTableOptions(buf2, &len, pDbCfg, pCfg);
47✔
767
  }
768

769
  varDataLen(buf2) = (len > 65535) ? 65535 : len;
115✔
770

771
  code = colDataSetVal(pCol2, 0, buf2, false);
115✔
772
  TAOS_CHECK_ERRNO(code);
115!
773

774
_exit:
115✔
775
  taosMemoryFree(buf2);
115✔
776

777
  return code;
115✔
778
}
779

780
static int32_t setCreateViewResultIntoDataBlock(SSDataBlock* pBlock, SShowCreateViewStmt* pStmt) {
11✔
781
  int32_t code = 0;
11✔
782
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
11!
783
  pBlock->info.rows = 1;
11✔
784

785
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
11✔
786
  char             buf1[SHOW_CREATE_VIEW_RESULT_FIELD1_LEN + 1] = {0};
11✔
787
  snprintf(varDataVal(buf1), TSDB_VIEW_FNAME_LEN + 4, "`%s`.`%s`", pStmt->dbName, pStmt->viewName);
11✔
788
  varDataSetLen(buf1, strlen(varDataVal(buf1)));
11✔
789
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
11!
790

791
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
11✔
792
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_VIEW_RESULT_FIELD2_LEN);
11✔
793
  if (NULL == buf2) {
11!
794
    return terrno;
×
795
  }
796

797
  SViewMeta* pMeta = pStmt->pViewMeta;
11✔
798
  if (NULL == pMeta) {
11!
799
    qError("exception: view meta is null");
×
800
    return TSDB_CODE_APP_ERROR;
×
801
  }
802
  snprintf(varDataVal(buf2), SHOW_CREATE_VIEW_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, "CREATE VIEW `%s`.`%s` AS %s",
11✔
803
           pStmt->dbName, pStmt->viewName, pMeta->querySql);
11✔
804
  int32_t len = strlen(varDataVal(buf2));
11✔
805
  varDataLen(buf2) = (len > 65535) ? 65535 : len;
11✔
806
  code = colDataSetVal(pCol2, 0, buf2, false);
11✔
807
  taosMemoryFree(buf2);
11✔
808

809
  return code;
11✔
810
}
811

812
static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
115✔
813
  SSDataBlock* pBlock = NULL;
115✔
814
  int32_t      code = buildCreateTbResultDataBlock(&pBlock);
115✔
815
  if (TSDB_CODE_SUCCESS == code) {
115!
816
    code = setCreateTBResultIntoDataBlock(pBlock, pStmt->pDbCfg, pStmt->tableName, pStmt->pTableCfg);
115✔
817
  }
818
  if (TSDB_CODE_SUCCESS == code) {
115!
819
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_TB_RESULT_COLS, pRsp);
115✔
820
  }
821
  (void)blockDataDestroy(pBlock);
115✔
822
  return code;
115✔
823
}
824

825
static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
3✔
826
  STableCfg* pCfg = (STableCfg*)pStmt->pTableCfg;
3✔
827
  if (TSDB_SUPER_TABLE != pCfg->tableType) {
3✔
828
    terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR;
1✔
829
    return terrno;
1✔
830
  }
831

832
  return execShowCreateTable(pStmt, pRsp);
2✔
833
}
834

835
static int32_t execAlterCmd(char* cmd, char* value, bool* processed) {
15,813✔
836
  int32_t code = 0;
15,813✔
837

838
  if (0 == strcasecmp(cmd, COMMAND_RESET_LOG)) {
15,813!
839
    taosResetLog();
×
840
    cfgDumpCfg(tsCfg, 0, false);
×
841
  } else if (0 == strcasecmp(cmd, COMMAND_SCHEDULE_POLICY)) {
15,813✔
842
    int32_t tmp = 0;
40✔
843
    code = taosStr2int32(value, &tmp);
40✔
844
    if (code) {
40!
845
      qError("invalid value:%s, error:%s", value, tstrerror(code));
×
846
      return code;
×
847
    }
848
    code = schedulerUpdatePolicy(tmp);
40✔
849
  } else if (0 == strcasecmp(cmd, COMMAND_ENABLE_RESCHEDULE)) {
15,773!
850
    int32_t tmp = 0;
×
851
    code = taosStr2int32(value, &tmp);
×
852
    if (code) {
×
853
      qError("invalid value:%s, error:%s", value, tstrerror(code));
×
854
      return code;
×
855
    }
856
    code = schedulerEnableReSchedule(tmp != 0);
×
857
  } else if (0 == strcasecmp(cmd, COMMAND_CATALOG_DEBUG)) {
15,773!
858
    code = ctgdHandleDbgCommand(value);
×
859
  } else if (0 == strcasecmp(cmd, COMMAND_ENABLE_MEM_DEBUG)) {
15,773!
860
    code = taosMemoryDbgInit();
×
861
    if (code) {
×
862
      qError("failed to init memory dbg, error:%s", tstrerror(code));
×
863
      return code;
×
864
    }
865
    tsAsyncLog = false;
×
866
    qInfo("memory dbg enabled");
×
867
  } else if (0 == strcasecmp(cmd, COMMAND_DISABLE_MEM_DEBUG)) {
15,773!
868
    code = taosMemoryDbgInitRestore();
×
869
    if (code) {
×
870
      qError("failed to restore from memory dbg, error:%s", tstrerror(code));
×
871
      return code;
×
872
    }
873
    qInfo("memory dbg disabled");
×
874
  } else {
875
    goto _return;
15,773✔
876
  }
877

878
  *processed = true;
40✔
879

880
_return:
15,813✔
881

882
  if (code) {
15,813!
883
    terrno = code;
×
884
  }
885

886
  return code;
15,813✔
887
}
888

889
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) {
15,813✔
890
  bool processed = false;
15,813✔
891

892
  if (execAlterCmd(pStmt->config, pStmt->value, &processed)) {
15,813!
893
    return terrno;
×
894
  }
895

896
  if (processed) {
15,813✔
897
    goto _return;
40✔
898
  }
899

900
  if (cfgCheckRangeForDynUpdate(tsCfg, pStmt->config, pStmt->value, false)) {
15,773✔
901
    return terrno;
11✔
902
  }
903

904
  if (cfgSetItem(tsCfg, pStmt->config, pStmt->value, CFG_STYPE_ALTER_CMD, true)) {
15,762!
905
    return terrno;
×
906
  }
907

908
  TAOS_CHECK_RETURN(taosCfgDynamicOptions(tsCfg, pStmt->config, false));
15,762✔
909

910
_return:
15,761✔
911

912
  return TSDB_CODE_SUCCESS;
15,801✔
913
}
914

915
static int32_t buildLocalVariablesResultDataBlock(SSDataBlock** pOutput) {
443✔
916
  SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
443✔
917
  if (NULL == pBlock) {
443!
918
    return terrno;
×
919
  }
920

921
  pBlock->info.hasVarCol = true;
443✔
922

923
  pBlock->pDataBlock = taosArrayInit(SHOW_LOCAL_VARIABLES_RESULT_COLS, sizeof(SColumnInfoData));
443✔
924
  if (NULL == pBlock->pDataBlock) {
443!
925
    taosMemoryFree(pBlock);
×
926
    return terrno;
×
927
  }
928

929
  SColumnInfoData infoData = {0};
443✔
930

931
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
443✔
932
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD1_LEN;
443✔
933
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
886!
934
    goto _exit;
×
935
  }
936

937
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
443✔
938
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD2_LEN;
443✔
939
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
886!
940
    goto _exit;
×
941
  }
942

943
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
443✔
944
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD3_LEN;
443✔
945
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
886!
946
    goto _exit;
×
947
  }
948

949
  *pOutput = pBlock;
443✔
950

951
_exit:
443✔
952
  if (terrno != TSDB_CODE_SUCCESS) {
443!
953
    taosMemoryFree(pBlock);
×
954
    taosArrayDestroy(pBlock->pDataBlock);
×
955
  }
956
  return terrno;
443✔
957
}
958

959
static int32_t execShowLocalVariables(SRetrieveTableRsp** pRsp) {
443✔
960
  SSDataBlock* pBlock = NULL;
443✔
961
  int32_t      code = buildLocalVariablesResultDataBlock(&pBlock);
443✔
962
  if (TSDB_CODE_SUCCESS == code) {
443!
963
    code = dumpConfToDataBlock(pBlock, 0);
443✔
964
  }
965
  if (TSDB_CODE_SUCCESS == code) {
443!
966
    code = buildRetrieveTableRsp(pBlock, SHOW_LOCAL_VARIABLES_RESULT_COLS, pRsp);
443✔
967
  }
968
  (void)blockDataDestroy(pBlock);
443✔
969
  return code;
443✔
970
}
971

972
static int32_t createSelectResultDataBlock(SNodeList* pProjects, SSDataBlock** pOutput) {
71,272✔
973
  QRY_PARAM_CHECK(pOutput);
71,272!
974

975
  SSDataBlock* pBlock = NULL;
71,272✔
976
  int32_t      code = createDataBlock(&pBlock);
71,272✔
977
  if (code) {
71,272!
978
    return code;
×
979
  }
980

981
  SNode* pProj = NULL;
71,272✔
982
  FOREACH(pProj, pProjects) {
142,581!
983
    SExprNode*      pExpr = (SExprNode*)pProj;
71,309✔
984
    SColumnInfoData infoData = {0};
71,309✔
985
    if (TSDB_DATA_TYPE_NULL == pExpr->resType.type) {
71,309!
986
      infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
×
987
      infoData.info.bytes = 0;
×
988
    } else {
989
      infoData.info.type = pExpr->resType.type;
71,309✔
990
      infoData.info.bytes = pExpr->resType.bytes;
71,309✔
991
    }
992
    QRY_ERR_RET(blockDataAppendColInfo(pBlock, &infoData));
71,309!
993
  }
994

995
  *pOutput = pBlock;
71,272✔
996
  return code;
71,272✔
997
}
998

999
int32_t buildSelectResultDataBlock(SNodeList* pProjects, SSDataBlock* pBlock) {
71,272✔
1000
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
71,272!
1001

1002
  int32_t index = 0;
71,272✔
1003
  SNode*  pProj = NULL;
71,272✔
1004
  FOREACH(pProj, pProjects) {
142,581!
1005
    if (QUERY_NODE_VALUE != nodeType(pProj)) {
71,309!
1006
      return TSDB_CODE_PAR_INVALID_SELECTED_EXPR;
×
1007
    } else {
1008
      if (((SValueNode*)pProj)->isNull) {
71,309✔
1009
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0, NULL, true));
128!
1010
      } else {
1011
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0,
71,181!
1012
                                  nodesGetValueFromNode((SValueNode*)pProj), false));
1013
      }
1014
    }
1015
  }
1016

1017
  pBlock->info.rows = 1;
71,272✔
1018
  return TSDB_CODE_SUCCESS;
71,272✔
1019
}
1020

1021
static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** pRsp) {
71,272✔
1022
  SSDataBlock* pBlock = NULL;
71,272✔
1023
  int32_t      code = createSelectResultDataBlock(pSelect->pProjectionList, &pBlock);
71,272✔
1024
  if (TSDB_CODE_SUCCESS == code) {
71,272!
1025
    code = buildSelectResultDataBlock(pSelect->pProjectionList, pBlock);
71,272✔
1026
  }
1027
  if (TSDB_CODE_SUCCESS == code) {
71,272!
1028
    code = buildRetrieveTableRsp(pBlock, LIST_LENGTH(pSelect->pProjectionList), pRsp);
71,272!
1029
  }
1030
  (void)blockDataDestroy(pBlock);
71,272✔
1031
  return code;
71,272✔
1032
}
1033

1034
static int32_t execShowCreateView(SShowCreateViewStmt* pStmt, SRetrieveTableRsp** pRsp) {
11✔
1035
  SSDataBlock* pBlock = NULL;
11✔
1036
  int32_t      code = buildCreateViewResultDataBlock(&pBlock);
11✔
1037
  if (TSDB_CODE_SUCCESS == code) {
11!
1038
    code = setCreateViewResultIntoDataBlock(pBlock, pStmt);
11✔
1039
  }
1040
  if (TSDB_CODE_SUCCESS == code) {
11!
1041
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_VIEW_RESULT_COLS, pRsp);
11✔
1042
  }
1043
  (void)blockDataDestroy(pBlock);
11✔
1044
  return code;
11✔
1045
}
1046

1047
int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode) {
98,289✔
1048
  switch (nodeType(pStmt)) {
98,289!
1049
    case QUERY_NODE_DESCRIBE_STMT:
2,864✔
1050
      return execDescribe(sysInfoUser, pStmt, pRsp, biMode);
2,864✔
1051
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
7,743✔
1052
      return execResetQueryCache();
7,743✔
1053
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
27✔
1054
      return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt, pRsp);
27✔
1055
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
113✔
1056
      return execShowCreateTable((SShowCreateTableStmt*)pStmt, pRsp);
113✔
1057
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
3✔
1058
      return execShowCreateSTable((SShowCreateTableStmt*)pStmt, pRsp);
3✔
1059
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
11✔
1060
      return execShowCreateView((SShowCreateViewStmt*)pStmt, pRsp);
11✔
1061
    case QUERY_NODE_ALTER_LOCAL_STMT:
15,813✔
1062
      return execAlterLocal((SAlterLocalStmt*)pStmt);
15,813✔
1063
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
443✔
1064
      return execShowLocalVariables(pRsp);
443✔
1065
    case QUERY_NODE_SELECT_STMT:
71,272✔
1066
      return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp);
71,272✔
1067
    default:
×
1068
      break;
×
1069
  }
1070
  return TSDB_CODE_FAILED;
×
1071
}
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