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

taosdata / TDengine / #3526

10 Nov 2024 03:50AM UTC coverage: 60.225% (-0.6%) from 60.818%
#3526

push

travis-ci

web-flow
Merge pull request #28709 from taosdata/main

merge: from main to 3.0 branch

117031 of 249004 branches covered (47.0%)

Branch coverage included in aggregate %.

130 of 169 new or added lines in 23 files covered. (76.92%)

4149 existing lines in 176 files now uncovered.

197577 of 273386 relevant lines covered (72.27%)

5840219.36 hits per line

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

65.06
/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) {
76,507✔
38
  if (NULL == pBlock || NULL == pRsp) {
76,507!
NEW
39
    return TSDB_CODE_INVALID_PARA;
×
40
  }
41
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
76,507✔
42
  size_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
76,507✔
43
  *pRsp = taosMemoryCalloc(1, rspSize);
76,507✔
44
  if (NULL == *pRsp) {
76,506!
UNCOV
45
    return terrno;
×
46
  }
47

48
  (*pRsp)->useconds = 0;
76,506✔
49
  (*pRsp)->completed = 1;
76,506✔
50
  (*pRsp)->precision = 0;
76,506✔
51
  (*pRsp)->compressed = 0;
76,506✔
52

53
  (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
76,506✔
54
  (*pRsp)->numOfCols = htonl(numOfCols);
76,505✔
55

56
  int32_t len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, numOfCols);
76,505✔
57
  if(len < 0) {
76,506!
UNCOV
58
    taosMemoryFree(*pRsp);
×
UNCOV
59
    return terrno;
×
60
  }
61
  SET_PAYLOAD_LEN((*pRsp)->data, len, len);
76,506✔
62

63
  int32_t payloadLen = len + PAYLOAD_PREFIX_LEN;
76,506✔
64
  (*pRsp)->payloadLen = htonl(payloadLen);
76,506✔
65
  (*pRsp)->compLen = htonl(payloadLen);
76,506✔
66

67
  return TSDB_CODE_SUCCESS;
76,506✔
68
}
69

70
static int32_t getSchemaBytes(const SSchema* pSchema) {
118,515✔
71
  switch (pSchema->type) {
118,515✔
72
    case TSDB_DATA_TYPE_BINARY:
8,297✔
73
    case TSDB_DATA_TYPE_VARBINARY:
74
    case TSDB_DATA_TYPE_GEOMETRY:
75
      return (pSchema->bytes - VARSTR_HEADER_SIZE);
8,297✔
76
    case TSDB_DATA_TYPE_NCHAR:
8,843✔
77
    case TSDB_DATA_TYPE_JSON:
78
      return (pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE;
8,843✔
79
    default:
101,375✔
80
      return pSchema->bytes;
101,375✔
81
  }
82
}
83

84
static int32_t buildDescResultDataBlock(SSDataBlock** pOutput) {
2,863✔
85
  QRY_PARAM_CHECK(pOutput);
2,863!
86

87
  SSDataBlock* pBlock = NULL;
2,863✔
88
  int32_t      code = createDataBlock(&pBlock);
2,863✔
89
  if (code) {
2,863!
UNCOV
90
    return code;
×
91
  }
92

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

120
  if (TSDB_CODE_SUCCESS == code) {
2,863!
121
    *pOutput = pBlock;
2,863✔
122
  } else {
UNCOV
123
    (void)blockDataDestroy(pBlock);
×
124
  }
125
  return code;
2,863✔
126
}
127

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

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

154
  int32_t fillTagCol = 0;
2,863✔
155
  char    buf[DESCRIBE_RESULT_FIELD_LEN] = {0};
2,863✔
156
  for (int32_t i = 0; i < numOfRows; ++i) {
121,378✔
157
    if (invisibleColumn(sysInfoUser, pMeta->tableType, pMeta->schema[i].flags)) {
118,515!
UNCOV
158
      continue;
×
159
    }
160
    STR_TO_VARSTR(buf, pMeta->schema[i].name);
118,515✔
161
    COL_DATA_SET_VAL_AND_CHECK(pCol1, pBlock->info.rows, buf, false);
118,515!
162

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

198
    fillTagCol = 0;
118,515✔
199

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

220
static int32_t execDescribe(bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode) {
2,863✔
221
  SDescribeStmt* pDesc = (SDescribeStmt*)pStmt;
2,863✔
222
  if (NULL == pDesc || NULL == pDesc->pMeta) {
2,863!
NEW
223
    return TSDB_CODE_INVALID_PARA;
×
224
  }
225
  int32_t        numOfRows = TABLE_TOTAL_COL_NUM(pDesc->pMeta);
2,863✔
226

227
  SSDataBlock* pBlock = NULL;
2,863✔
228
  int32_t      code = buildDescResultDataBlock(&pBlock);
2,863✔
229
  if (TSDB_CODE_SUCCESS == code) {
2,863!
230
    code = setDescResultIntoDataBlock(sysInfoUser, pBlock, numOfRows, pDesc->pMeta, biMode);
2,863✔
231
  }
232
  if (TSDB_CODE_SUCCESS == code) {
2,863!
233
    if (pDesc->pMeta && useCompress(pDesc->pMeta->tableType) && pDesc->pMeta->schemaExt) {
2,863!
234
      code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS_COMPRESS, pRsp);
2,846✔
235
    } else {
236
      code = buildRetrieveTableRsp(pBlock, DESCRIBE_RESULT_COLS, pRsp);
17✔
237
    }
238
  }
239
  (void)blockDataDestroy(pBlock);
2,862✔
240
  return code;
2,863✔
241
}
242

243
static int32_t execResetQueryCache() { return catalogClearCache(); }
7,731✔
244

245
static int32_t buildCreateDBResultDataBlock(SSDataBlock** pOutput) {
21✔
246
  QRY_PARAM_CHECK(pOutput);
21!
247

248
  SSDataBlock* pBlock = NULL;
21✔
249
  int32_t      code = createDataBlock(&pBlock);
21✔
250
  if (code) {
21!
UNCOV
251
    return code;
×
252
  }
253

254
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_COLS, 1);
21✔
255
  code = blockDataAppendColInfo(pBlock, &infoData);
21✔
256
  if (TSDB_CODE_SUCCESS == code) {
21!
257
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_DB_RESULT_FIELD2_LEN, 2);
21✔
258
    code = blockDataAppendColInfo(pBlock, &infoData);
21✔
259
  }
260

261
  if (TSDB_CODE_SUCCESS == code) {
21!
262
    *pOutput = pBlock;
21✔
263
  } else {
UNCOV
264
    (void)blockDataDestroy(pBlock);
×
265
  }
266
  return code;
21✔
267
}
268

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

291
  return v;
×
292
}
293

294
static int32_t buildRetension(SArray* pRetension, char** ppRetentions) {
21✔
295
  size_t size = taosArrayGetSize(pRetension);
21✔
296
  if (size == 0) {
21!
297
    *ppRetentions = NULL;
21✔
298
    return TSDB_CODE_SUCCESS;
21✔
299
  }
300

UNCOV
301
  const int lMaxLen = 128;
×
UNCOV
302
  char*     p1 = taosMemoryCalloc(1, lMaxLen);
×
UNCOV
303
  if (NULL == p1) {
×
UNCOV
304
    return terrno;
×
305
  }
UNCOV
306
  int32_t len = 0;
×
307

308
  for (int32_t i = 0; i < size; ++i) {
×
309
    SRetention* p = TARRAY_GET_ELEM(pRetension, i);
×
310
    int64_t     v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
UNCOV
311
    int64_t     v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
312
    if (i == 0) {
×
UNCOV
313
      len += tsnprintf(p1 + len, lMaxLen - len, "-:%" PRId64 "%c", v2, p->keepUnit);
×
314
    } else {
315
      len += tsnprintf(p1 + len, lMaxLen - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
316
    }
317

318
    if (i < size - 1) {
×
319
      len += tsnprintf(p1 + len, lMaxLen - len, ",");
×
320
    }
321
  }
322

UNCOV
323
  *ppRetentions = p1;
×
324
  return TSDB_CODE_SUCCESS;
×
325
}
326

327
static const char* cacheModelStr(int8_t cacheModel) {
19✔
328
  switch (cacheModel) {
19!
329
    case TSDB_CACHE_MODEL_NONE:
19✔
330
      return TSDB_CACHE_MODEL_NONE_STR;
19✔
UNCOV
331
    case TSDB_CACHE_MODEL_LAST_ROW:
×
UNCOV
332
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
×
UNCOV
333
    case TSDB_CACHE_MODEL_LAST_VALUE:
×
UNCOV
334
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
×
UNCOV
335
    case TSDB_CACHE_MODEL_BOTH:
×
UNCOV
336
      return TSDB_CACHE_MODEL_BOTH_STR;
×
337
    default:
×
338
      break;
×
339
  }
340
  return TSDB_CACHE_MODEL_NONE_STR;
×
341
}
342

343
static const char* encryptAlgorithmStr(int8_t encryptAlgorithm) {
19✔
344
  switch (encryptAlgorithm) {
19!
345
    case TSDB_ENCRYPT_ALGO_NONE:
19✔
346
      return TSDB_ENCRYPT_ALGO_NONE_STR;
19✔
UNCOV
347
    case TSDB_ENCRYPT_ALGO_SM4:
×
UNCOV
348
      return TSDB_ENCRYPT_ALGO_SM4_STR;
×
UNCOV
349
    default:
×
UNCOV
350
      break;
×
351
  }
UNCOV
352
  return TSDB_CACHE_MODEL_NONE_STR;
×
353
}
354

355
int32_t formatDurationOrKeep(char* buffer, int64_t bufSize, int32_t timeInMinutes) {
4,284✔
356
  if (buffer == NULL || bufSize <= 0) {
4,284!
UNCOV
357
    return 0;
×
358
  }
359
  int32_t len = 0;
4,284✔
360
  if (timeInMinutes % 1440 == 0) {
4,284!
361
    int32_t days = timeInMinutes / 1440;
4,284✔
362
    len = tsnprintf(buffer, bufSize, "%dd", days);
4,284✔
363
  } else if (timeInMinutes % 60 == 0) {
×
UNCOV
364
    int32_t hours = timeInMinutes / 60;
×
UNCOV
365
    len = tsnprintf(buffer, bufSize, "%dh", hours);
×
366
  } else {
UNCOV
367
    len = tsnprintf(buffer, bufSize, "%dm", timeInMinutes);
×
368
  }
369
  return len;
4,284✔
370
}
371

372
static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, char* dbFName, SDbCfgInfo* pCfg) {
21✔
373
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
21!
374
  pBlock->info.rows = 1;
21✔
375

376
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
21✔
377
  char             buf1[SHOW_CREATE_DB_RESULT_FIELD1_LEN] = {0};
21✔
378
  STR_TO_VARSTR(buf1, dbName);
21✔
379
  COL_DATA_SET_VAL_AND_CHECK(pCol1, 0, buf1, false);
21!
380

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

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

414
  int32_t lenDuration = formatDurationOrKeep(durationStr, sizeof(durationStr), pCfg->daysPerFile);
21✔
415
  int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pCfg->daysToKeep0);
21✔
416
  int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pCfg->daysToKeep1);
21✔
417
  int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pCfg->daysToKeep2);
21✔
418

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

438
    if (pRetentions) {
19!
UNCOV
439
      len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
×
440
                       " RETENTIONS %s", pRetentions);
441
    }
442
  }
443

444
  taosMemoryFree(pRetentions);
21✔
445

446
  (varDataLen(buf2)) = len;
21✔
447

448
  COL_DATA_SET_VAL_AND_CHECK(pCol2, 0, buf2, false);
21!
449

450
  return TSDB_CODE_SUCCESS;
21✔
451
}
452

453
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
21✔
454
  SSDataBlock* pBlock = NULL;
21✔
455
  int32_t      code = buildCreateDBResultDataBlock(&pBlock);
21✔
456
  if (TSDB_CODE_SUCCESS == code) {
21!
457
    code = setCreateDBResultIntoDataBlock(pBlock, pStmt->dbName, pStmt->dbFName, pStmt->pCfg);
21✔
458
  }
459
  if (TSDB_CODE_SUCCESS == code) {
21!
460
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_DB_RESULT_COLS, pRsp);
21✔
461
  }
462
  (void)blockDataDestroy(pBlock);
21✔
463
  return code;
21✔
464
}
465

466
static int32_t buildCreateTbResultDataBlock(SSDataBlock** pOutput) {
115✔
467
  QRY_PARAM_CHECK(pOutput);
115!
468

469
  SSDataBlock* pBlock = NULL;
115✔
470
  int32_t      code = createDataBlock(&pBlock);
115✔
471
  if (code) {
115!
UNCOV
472
    return code;
×
473
  }
474

475
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD1_LEN, 1);
115✔
476
  code = blockDataAppendColInfo(pBlock, &infoData);
115✔
477
  if (TSDB_CODE_SUCCESS == code) {
115!
478
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_TB_RESULT_FIELD2_LEN, 2);
115✔
479
    code = blockDataAppendColInfo(pBlock, &infoData);
115✔
480
  }
481

482
  if (TSDB_CODE_SUCCESS == code) {
115!
483
    *pOutput = pBlock;
115✔
484
  } else {
UNCOV
485
    (void)blockDataDestroy(pBlock);
×
486
  }
487
  return code;
115✔
488
}
489

490
static int32_t buildCreateViewResultDataBlock(SSDataBlock** pOutput) {
11✔
491
  QRY_PARAM_CHECK(pOutput);
11!
492

493
  SSDataBlock* pBlock = NULL;
11✔
494
  int32_t      code = createDataBlock(&pBlock);
11✔
495
  if (code) {
11!
UNCOV
496
    return code;
×
497
  }
498

499
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD1_LEN, 1);
11✔
500
  code = blockDataAppendColInfo(pBlock, &infoData);
11✔
501
  if (TSDB_CODE_SUCCESS == code) {
11!
502
    infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, SHOW_CREATE_VIEW_RESULT_FIELD2_LEN, 2);
11✔
503
    code = blockDataAppendColInfo(pBlock, &infoData);
11✔
504
  }
505

506
  if (TSDB_CODE_SUCCESS == code) {
11!
507
    *pOutput = pBlock;
11✔
508
  } else {
UNCOV
509
    (void)blockDataDestroy(pBlock);
×
510
  }
511
  return code;
11✔
512
}
513

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

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

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

562
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
66✔
563
                      "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
66✔
564
  }
565
}
30✔
566

567
static void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
38✔
568
  for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
99✔
569
    SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
61✔
570
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
61✔
571
                      "%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
61✔
572
  }
573
}
38✔
574

575
static int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
38✔
576
  int32_t code = TSDB_CODE_SUCCESS;
38✔
577
  SArray* pTagVals = NULL;
38✔
578
  STag*   pTag = (STag*)pCfg->pTags;
38✔
579

580
  if (NULL == pCfg->pTags || pCfg->numOfTags <= 0) {
38!
UNCOV
581
    qError("tag missed in table cfg, pointer:%p, numOfTags:%d", pCfg->pTags, pCfg->numOfTags);
×
UNCOV
582
    return TSDB_CODE_APP_ERROR;
×
583
  }
584

585
  if (tTagIsJson(pTag)) {
38✔
586
    char* pJson = NULL;
4✔
587
    parseTagDatatoJson(pTag, &pJson);
4✔
588
    if (NULL == pJson) {
4!
UNCOV
589
      qError("failed to parse tag to json, pJson is NULL");
×
UNCOV
590
      return terrno;
×
591
    }
592
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
4✔
593
                      "%s", pJson);
594
    taosMemoryFree(pJson);
4✔
595

596
    return TSDB_CODE_SUCCESS;
4✔
597
  }
598

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

610
    if (j >= valueNum) {
57✔
611
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
21✔
612
                        "NULL");
613
      continue;
21✔
614
    }
615

616
    STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
36✔
617
    if (pSchema->colId > pTagVal->cid) {
36!
UNCOV
618
      qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
×
UNCOV
619
      code = TSDB_CODE_APP_ERROR;
×
UNCOV
620
      TAOS_CHECK_ERRNO(code);
×
621
    } else if (pSchema->colId == pTagVal->cid) {
36✔
622
      char    type = pTagVal->type;
34✔
623
      int32_t tlen = 0;
34✔
624

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

649
  return code;
34✔
650
}
651

652
static void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg* pCfg) {
115✔
653
  if (pCfg->commentLen > 0) {
115!
UNCOV
654
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
655
                      " COMMENT '%s'", pCfg->pComment);
656
  } else if (0 == pCfg->commentLen) {
115✔
657
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
30✔
658
                      " COMMENT ''");
659
  }
660

661
  if (NULL != pDbCfg->pRetensions && pCfg->watermark1 > 0) {
115!
UNCOV
662
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
663
                      " WATERMARK %" PRId64 "a", pCfg->watermark1);
UNCOV
664
    if (pCfg->watermark2 > 0) {
×
UNCOV
665
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
666
                        ", %" PRId64 "a", pCfg->watermark2);
667
    }
668
  }
669

670
  if (NULL != pDbCfg->pRetensions && pCfg->delay1 > 0) {
115!
671
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
672
                      " MAX_DELAY %" PRId64 "a", pCfg->delay1);
UNCOV
673
    if (pCfg->delay2 > 0) {
×
UNCOV
674
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
675
                        ", %" PRId64 "a", pCfg->delay2);
676
    }
677
  }
678

679
  int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
115✔
680
  if (NULL != pDbCfg->pRetensions && funcNum > 0) {
115!
UNCOV
681
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
682
                      " ROLLUP(");
UNCOV
683
    for (int32_t i = 0; i < funcNum; ++i) {
×
UNCOV
684
      char* pFunc = taosArrayGet(pCfg->pFuncs, i);
×
UNCOV
685
      *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
686
                        "%s%s", ((i > 0) ? ", " : ""), pFunc);
687
    }
UNCOV
688
    *len +=
×
689
        snprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ")");
×
690
  }
691

692
  if (pCfg->ttl > 0) {
115!
UNCOV
693
    *len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
×
694
                      " TTL %d", pCfg->ttl);
695
  }
696

697
  if (TSDB_SUPER_TABLE == pCfg->tableType || TSDB_NORMAL_TABLE == pCfg->tableType) {
115✔
698
    int32_t nSma = 0;
47✔
699
    for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
215✔
700
      if (IS_BSMA_ON(pCfg->pSchemas + i)) {
168!
701
        ++nSma;
168✔
702
      }
703
    }
704

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

728
static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* pDbCfg, char* tbName, STableCfg* pCfg) {
115✔
729
  int32_t code = TSDB_CODE_SUCCESS;
115✔
730
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
115!
731
  pBlock->info.rows = 1;
115✔
732

733
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
115✔
734
  char             buf1[SHOW_CREATE_TB_RESULT_FIELD1_LEN] = {0};
115✔
735
  STR_TO_VARSTR(buf1, tbName);
115✔
736
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
115!
737

738
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
115✔
739
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_TB_RESULT_FIELD2_LEN);
115✔
740
  if (NULL == buf2) {
115!
UNCOV
741
    QRY_ERR_RET(terrno);
×
742
  }
743

744
  int32_t len = 0;
115✔
745

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

776
  varDataLen(buf2) = (len > 65535) ? 65535 : len;
115✔
777

778
  code = colDataSetVal(pCol2, 0, buf2, false);
115✔
779
  TAOS_CHECK_ERRNO(code);
115!
780

781
_exit:
115✔
782
  taosMemoryFree(buf2);
115✔
783

784
  return code;
115✔
785
}
786

787
static int32_t setCreateViewResultIntoDataBlock(SSDataBlock* pBlock, SShowCreateViewStmt* pStmt) {
11✔
788
  int32_t code = 0;
11✔
789
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
11!
790
  pBlock->info.rows = 1;
11✔
791

792
  SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
11✔
793
  char             buf1[SHOW_CREATE_VIEW_RESULT_FIELD1_LEN + 1] = {0};
11✔
794
  snprintf(varDataVal(buf1), TSDB_VIEW_FNAME_LEN + 4, "`%s`.`%s`", pStmt->dbName, pStmt->viewName);
11✔
795
  varDataSetLen(buf1, strlen(varDataVal(buf1)));
11✔
796
  QRY_ERR_RET(colDataSetVal(pCol1, 0, buf1, false));
11!
797

798
  SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
11✔
799
  char*            buf2 = taosMemoryMalloc(SHOW_CREATE_VIEW_RESULT_FIELD2_LEN);
11✔
800
  if (NULL == buf2) {
11!
UNCOV
801
    return terrno;
×
802
  }
803

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

816
  return code;
11✔
817
}
818

819
static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
115✔
820
  SSDataBlock* pBlock = NULL;
115✔
821
  int32_t      code = buildCreateTbResultDataBlock(&pBlock);
115✔
822
  if (TSDB_CODE_SUCCESS == code) {
115!
823
    code = setCreateTBResultIntoDataBlock(pBlock, pStmt->pDbCfg, pStmt->tableName, pStmt->pTableCfg);
115✔
824
  }
825
  if (TSDB_CODE_SUCCESS == code) {
115!
826
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_TB_RESULT_COLS, pRsp);
115✔
827
  }
828
  (void)blockDataDestroy(pBlock);
115✔
829
  return code;
115✔
830
}
831

832
static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
3✔
833
  STableCfg* pCfg = (STableCfg*)pStmt->pTableCfg;
3✔
834
  if (TSDB_SUPER_TABLE != pCfg->tableType) {
3✔
835
    terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR;
1✔
836
    return terrno;
1✔
837
  }
838

839
  return execShowCreateTable(pStmt, pRsp);
2✔
840
}
841

842
static int32_t execAlterCmd(char* cmd, char* value, bool* processed) {
15,881✔
843
  int32_t code = 0;
15,881✔
844

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

885
  *processed = true;
40✔
886

887
_return:
15,881✔
888

889
  if (code) {
15,881!
UNCOV
890
    terrno = code;
×
891
  }
892

893
  return code;
15,881✔
894
}
895

896
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) {
15,881✔
897
  bool processed = false;
15,881✔
898

899
  if (execAlterCmd(pStmt->config, pStmt->value, &processed)) {
15,881!
UNCOV
900
    return terrno;
×
901
  }
902

903
  if (processed) {
15,881✔
904
    goto _return;
40✔
905
  }
906

907
  if (cfgCheckRangeForDynUpdate(tsCfg, pStmt->config, pStmt->value, false)) {
15,841✔
908
    return terrno;
11✔
909
  }
910

911
  if (cfgSetItem(tsCfg, pStmt->config, pStmt->value, CFG_STYPE_ALTER_CMD, true)) {
15,830!
UNCOV
912
    return terrno;
×
913
  }
914

915
  TAOS_CHECK_RETURN(taosCfgDynamicOptions(tsCfg, pStmt->config, false));
15,830✔
916

917
_return:
15,829✔
918

919
  return TSDB_CODE_SUCCESS;
15,869✔
920
}
921

922
static int32_t buildLocalVariablesResultDataBlock(SSDataBlock** pOutput) {
443✔
923
  SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
443✔
924
  if (NULL == pBlock) {
443!
UNCOV
925
    return terrno;
×
926
  }
927

928
  pBlock->info.hasVarCol = true;
443✔
929

930
  pBlock->pDataBlock = taosArrayInit(SHOW_LOCAL_VARIABLES_RESULT_COLS, sizeof(SColumnInfoData));
443✔
931
  if (NULL == pBlock->pDataBlock) {
443!
UNCOV
932
    taosMemoryFree(pBlock);
×
UNCOV
933
    return terrno;
×
934
  }
935

936
  SColumnInfoData infoData = {0};
443✔
937

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

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

950
  infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
443✔
951
  infoData.info.bytes = SHOW_LOCAL_VARIABLES_RESULT_FIELD3_LEN;
443✔
952
  if (taosArrayPush(pBlock->pDataBlock, &infoData) == NULL) {
886!
953
    goto _exit;
×
954
  }
955

956
  *pOutput = pBlock;
443✔
957

958
_exit:
443✔
959
  if (terrno != TSDB_CODE_SUCCESS) {
443!
UNCOV
960
    taosMemoryFree(pBlock);
×
UNCOV
961
    taosArrayDestroy(pBlock->pDataBlock);
×
962
  }
963
  return terrno;
443✔
964
}
965

966
static int32_t execShowLocalVariables(SRetrieveTableRsp** pRsp) {
443✔
967
  SSDataBlock* pBlock = NULL;
443✔
968
  int32_t      code = buildLocalVariablesResultDataBlock(&pBlock);
443✔
969
  if (TSDB_CODE_SUCCESS == code) {
443!
970
    code = dumpConfToDataBlock(pBlock, 0);
443✔
971
  }
972
  if (TSDB_CODE_SUCCESS == code) {
443!
973
    code = buildRetrieveTableRsp(pBlock, SHOW_LOCAL_VARIABLES_RESULT_COLS, pRsp);
443✔
974
  }
975
  (void)blockDataDestroy(pBlock);
443✔
976
  return code;
443✔
977
}
978

979
static int32_t createSelectResultDataBlock(SNodeList* pProjects, SSDataBlock** pOutput) {
73,054✔
980
  QRY_PARAM_CHECK(pOutput);
73,054!
981

982
  SSDataBlock* pBlock = NULL;
73,054✔
983
  int32_t      code = createDataBlock(&pBlock);
73,054✔
984
  if (code) {
73,054!
UNCOV
985
    return code;
×
986
  }
987

988
  SNode* pProj = NULL;
73,054✔
989
  FOREACH(pProj, pProjects) {
146,145!
990
    SExprNode*      pExpr = (SExprNode*)pProj;
73,091✔
991
    SColumnInfoData infoData = {0};
73,091✔
992
    if (TSDB_DATA_TYPE_NULL == pExpr->resType.type) {
73,091!
UNCOV
993
      infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
×
UNCOV
994
      infoData.info.bytes = 0;
×
995
    } else {
996
      infoData.info.type = pExpr->resType.type;
73,091✔
997
      infoData.info.bytes = pExpr->resType.bytes;
73,091✔
998
    }
999
    QRY_ERR_RET(blockDataAppendColInfo(pBlock, &infoData));
73,091!
1000
  }
1001

1002
  *pOutput = pBlock;
73,054✔
1003
  return code;
73,054✔
1004
}
1005

1006
static int32_t buildSelectResultDataBlock(SNodeList* pProjects, SSDataBlock* pBlock) {
73,054✔
1007
  QRY_ERR_RET(blockDataEnsureCapacity(pBlock, 1));
73,054!
1008

1009
  int32_t index = 0;
73,054✔
1010
  SNode*  pProj = NULL;
73,054✔
1011
  FOREACH(pProj, pProjects) {
146,145!
1012
    if (QUERY_NODE_VALUE != nodeType(pProj)) {
73,091!
UNCOV
1013
      return TSDB_CODE_PAR_INVALID_SELECTED_EXPR;
×
1014
    } else {
1015
      if (((SValueNode*)pProj)->isNull) {
73,091✔
1016
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0, NULL, true));
128!
1017
      } else {
1018
        QRY_ERR_RET(colDataSetVal(taosArrayGet(pBlock->pDataBlock, index++), 0,
72,963!
1019
                                  nodesGetValueFromNode((SValueNode*)pProj), false));
1020
      }
1021
    }
1022
  }
1023

1024
  pBlock->info.rows = 1;
73,054✔
1025
  return TSDB_CODE_SUCCESS;
73,054✔
1026
}
1027

1028
static int32_t execSelectWithoutFrom(SSelectStmt* pSelect, SRetrieveTableRsp** pRsp) {
73,054✔
1029
  SSDataBlock* pBlock = NULL;
73,054✔
1030
  int32_t      code = createSelectResultDataBlock(pSelect->pProjectionList, &pBlock);
73,054✔
1031
  if (TSDB_CODE_SUCCESS == code) {
73,054!
1032
    code = buildSelectResultDataBlock(pSelect->pProjectionList, pBlock);
73,054✔
1033
  }
1034
  if (TSDB_CODE_SUCCESS == code) {
73,054!
1035
    code = buildRetrieveTableRsp(pBlock, LIST_LENGTH(pSelect->pProjectionList), pRsp);
73,054!
1036
  }
1037
  (void)blockDataDestroy(pBlock);
73,054✔
1038
  return code;
73,054✔
1039
}
1040

1041
static int32_t execShowCreateView(SShowCreateViewStmt* pStmt, SRetrieveTableRsp** pRsp) {
11✔
1042
  SSDataBlock* pBlock = NULL;
11✔
1043
  int32_t      code = buildCreateViewResultDataBlock(&pBlock);
11✔
1044
  if (TSDB_CODE_SUCCESS == code) {
11!
1045
    code = setCreateViewResultIntoDataBlock(pBlock, pStmt);
11✔
1046
  }
1047
  if (TSDB_CODE_SUCCESS == code) {
11!
1048
    code = buildRetrieveTableRsp(pBlock, SHOW_CREATE_VIEW_RESULT_COLS, pRsp);
11✔
1049
  }
1050
  (void)blockDataDestroy(pBlock);
11✔
1051
  return code;
11✔
1052
}
1053

1054
int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode* pStmt, SRetrieveTableRsp** pRsp, int8_t biMode) {
100,120✔
1055
  switch (nodeType(pStmt)) {
100,120!
1056
    case QUERY_NODE_DESCRIBE_STMT:
2,863✔
1057
      return execDescribe(sysInfoUser, pStmt, pRsp, biMode);
2,863✔
1058
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
7,731✔
1059
      return execResetQueryCache();
7,731✔
1060
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
21✔
1061
      return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt, pRsp);
21✔
1062
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
113✔
1063
      return execShowCreateTable((SShowCreateTableStmt*)pStmt, pRsp);
113✔
1064
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
3✔
1065
      return execShowCreateSTable((SShowCreateTableStmt*)pStmt, pRsp);
3✔
1066
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
11✔
1067
      return execShowCreateView((SShowCreateViewStmt*)pStmt, pRsp);
11✔
1068
    case QUERY_NODE_ALTER_LOCAL_STMT:
15,881✔
1069
      return execAlterLocal((SAlterLocalStmt*)pStmt);
15,881✔
1070
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
443✔
1071
      return execShowLocalVariables(pRsp);
443✔
1072
    case QUERY_NODE_SELECT_STMT:
73,054✔
1073
      return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp);
73,054✔
UNCOV
1074
    default:
×
UNCOV
1075
      break;
×
1076
  }
UNCOV
1077
  return TSDB_CODE_FAILED;
×
1078
}
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