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

taosdata / TDengine / #3524

08 Nov 2024 04:27AM UTC coverage: 60.898% (+5.0%) from 55.861%
#3524

push

travis-ci

web-flow
Merge pull request #28647 from taosdata/fix/3.0/TD-32519_drop_ctb

fix TD-32519 drop child table with tsma caused crash

118687 of 248552 branches covered (47.75%)

Branch coverage included in aggregate %.

286 of 337 new or added lines in 18 files covered. (84.87%)

9647 existing lines in 190 files now uncovered.

199106 of 273291 relevant lines covered (72.85%)

15236719.35 hits per line

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

65.38
/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) {
75,967✔
38
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
75,967✔
39
  size_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
75,968✔
40
  *pRsp = taosMemoryCalloc(1, rspSize);
75,968✔
41
  if (NULL == *pRsp) {
75,968!
42
    return terrno;
×
43
  }
44

45
  (*pRsp)->useconds = 0;
75,968✔
46
  (*pRsp)->completed = 1;
75,968✔
47
  (*pRsp)->precision = 0;
75,968✔
48
  (*pRsp)->compressed = 0;
75,968✔
49

50
  (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
75,968✔
51
  (*pRsp)->numOfCols = htonl(numOfCols);
75,968✔
52

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

60
  int32_t payloadLen = len + PAYLOAD_PREFIX_LEN;
75,968✔
61
  (*pRsp)->payloadLen = htonl(payloadLen);
75,968✔
62
  (*pRsp)->compLen = htonl(payloadLen);
75,968✔
63

64
  return TSDB_CODE_SUCCESS;
75,968✔
65
}
66

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

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

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

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

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

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

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

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

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

195
    fillTagCol = 0;
118,527✔
196

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

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

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

237
static int32_t execResetQueryCache() { return catalogClearCache(); }
7,730✔
238

239
static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
21✔
240
  QRY_PARAM_CHECK(pOutput);
21!
241

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

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

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

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

285
  return v;
×
286
}
287

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

438
  taosMemoryFree(pRetentions);
21✔
439

440
  (varDataLen(buf2)) = len;
21✔
441

442
  COL_DATA_SET_VAL_AND_CHECK(pCol2, 0, buf2, false);
21!
443

444
  return TSDB_CODE_SUCCESS;
21✔
445
}
446

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

590
    return TSDB_CODE_SUCCESS;
4✔
591
  }
592

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

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

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

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

643
  return code;
34✔
644
}
645

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

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

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

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

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

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

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

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

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

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

738
  int32_t len = 0;
115✔
739

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

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

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

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

778
  return code;
115✔
779
}
780

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

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

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

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

810
  return code;
11✔
811
}
812

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

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

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

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

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

879
  *processed = true;
40✔
880

881
_return:
15,957✔
882

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

887
  return code;
15,957✔
888
}
889

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

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

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

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

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

909
  TAOS_CHECK_RETURN(taosCfgDynamicOptions(tsCfg, pStmt->config, false));
15,906✔
910

911
_return:
15,905✔
912

913
  return TSDB_CODE_SUCCESS;
15,945✔
914
}
915

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

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

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

930
  SColumnInfoData infoData = {0};
443✔
931

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

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

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

950
  *pOutput = pBlock;
443✔
951

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

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

973
static int32_t createSelectResultDataBlock(SNodeList* pProjects, SSDataBlock** pOutput) {
72,514✔
974
  QRY_PARAM_CHECK(pOutput);
72,514!
975

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

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

996
  *pOutput = pBlock;
72,514✔
997
  return code;
72,514✔
998
}
999

1000
int32_t buildSelectResultDataBlock(SNodeList* pProjects, SSDataBlock* pBlock) {
72,514✔
1001
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
72,514!
1002

1003
  int32_t index = 0;
72,514✔
1004
  SNode*  pProj = NULL;
72,514✔
1005
  FOREACH(pProj, pProjects) {
145,065!
1006
    if (QUERY_NODE_VALUE != nodeType(pProj)) {
72,551!
1007
      return TSDB_CODE_PAR_INVALID_SELECTED_EXPR;
×
1008
    } else {
1009
      if (((SValueNode*)pProj)->isNull) {
72,551✔
1010
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0, NULL, true));
128!
1011
      } else {
1012
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0,
72,423!
1013
                                  nodesGetValueFromNode((SValueNode*)pProj), false));
1014
      }
1015
    }
1016
  }
1017

1018
  pBlock->info.rows = 1;
72,514✔
1019
  return TSDB_CODE_SUCCESS;
72,514✔
1020
}
1021

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

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

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