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

taosdata / TDengine / #4103

17 May 2025 02:18AM UTC coverage: 63.264% (+0.4%) from 62.905%
#4103

push

travis-ci

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

merge 3.0

158149 of 318142 branches covered (49.71%)

Branch coverage included in aggregate %.

3 of 5 new or added lines in 1 file covered. (60.0%)

1725 existing lines in 138 files now uncovered.

243642 of 316962 relevant lines covered (76.87%)

16346281.8 hits per line

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

74.79
/source/libs/parser/src/parInsertSml.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 "parInsertUtil.h"
17
#include "parInt.h"
18
#include "parToken.h"
19
#include "ttime.h"
20

21
int32_t qCreateSName(SName* pName, const char* pTableName, int32_t acctId, char* dbName, char* msgBuf,
52,832✔
22
                     int32_t msgBufLen) {
23
  SMsgBuf    msg = {.buf = msgBuf, .len = msgBufLen};
52,832✔
24
  SToken  sToken = {0};
52,832✔
25
  int      code  = TSDB_CODE_SUCCESS;
52,832✔
26
  int32_t  lino  = 0;
52,832✔
27

28
  NEXT_TOKEN(pTableName, sToken);
52,832✔
29
  TSDB_CHECK_CONDITION(sToken.n != 0, code, lino, end, TSDB_CODE_TSC_INVALID_OPERATION);
52,898✔
30
  code = insCreateSName(pName, &sToken, acctId, dbName, &msg);
52,897✔
31
  TSDB_CHECK_CODE(code, lino, end);
52,870!
32
  NEXT_TOKEN(pTableName, sToken);
52,870✔
33
  TSDB_CHECK_CONDITION(sToken.n <= 0, code, lino, end, TSDB_CODE_TSC_INVALID_OPERATION);
52,881!
34

35
end:
52,881✔
36
  if (code != 0){
52,882✔
37
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
1!
38
  }
39
  return TSDB_CODE_SUCCESS;
52,852✔
40
}
41

42
static int32_t smlBoundColumnData(SArray* cols, SBoundColInfo* pBoundInfo, SSchema* pSchema, bool isTag) {
4,421✔
43
  int      code = TSDB_CODE_SUCCESS;
4,421✔
44
  int32_t  lino = 0;
4,421✔
45
  bool* pUseCols = taosMemoryCalloc(pBoundInfo->numOfCols, sizeof(bool));
4,421!
46
  TSDB_CHECK_NULL(pUseCols, code, lino, end, terrno);
4,424!
47
  pBoundInfo->numOfBound = 0;
4,424✔
48
  int16_t lastColIdx = -1;  // last column found
4,424✔
49

50
  for (int i = 0; i < taosArrayGetSize(cols); ++i) {
40,651✔
51
    SSmlKv*  kv = taosArrayGet(cols, i);
36,231✔
52
    SToken   sToken = {.n = kv->keyLen, .z = (char*)kv->key};
36,228✔
53
    col_id_t t = lastColIdx + 1;
36,228✔
54
    col_id_t index = ((t == 0 && !isTag) ? 0 : insFindCol(&sToken, t, pBoundInfo->numOfCols, pSchema));
36,228✔
55
    uTrace("SML, index:%d, t:%d, ncols:%d", index, t, pBoundInfo->numOfCols);
36,228!
56
    if (index < 0 && t > 0) {
36,228!
57
      index = insFindCol(&sToken, 0, t, pSchema);
72✔
58
    }
59

60
    TSDB_CHECK_CONDITION(index >= 0, code, lino, end, TSDB_CODE_SML_INVALID_DATA);
36,227!
61
    TSDB_CHECK_CONDITION(!pUseCols[index], code, lino, end, TSDB_CODE_SML_INVALID_DATA);
36,227!
62

63
    lastColIdx = index;
36,227✔
64
    pUseCols[index] = true;
36,227✔
65
    pBoundInfo->pColIndex[pBoundInfo->numOfBound] = index;
36,227✔
66
    ++pBoundInfo->numOfBound;
36,227✔
67
  }
68

69
end:
4,419✔
70
  if (code != 0){
4,419!
71
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
×
72
  }
73
  taosMemoryFree(pUseCols);
4,419!
74
  return code;
4,424✔
75
}
76

77
static int32_t smlMbsToUcs4(const char* mbs, size_t mbsLen, void** result, int32_t* resultLen, int32_t maxLen, void* charsetCxt){
13,769✔
78
  int      code = TSDB_CODE_SUCCESS;
13,769✔
79
  void*    pUcs4 = NULL;
13,769✔
80
  int32_t  lino = 0;
13,769✔
81
  pUcs4 = taosMemoryCalloc(1, maxLen);
13,769!
82
  TSDB_CHECK_NULL(pUcs4, code, lino, end, terrno);
13,777!
83
  TSDB_CHECK_CONDITION(taosMbsToUcs4(mbs, mbsLen, (TdUcs4*)pUcs4, maxLen, resultLen, charsetCxt), code, lino, end, terrno);
13,777!
84
  *result = pUcs4;
13,780✔
85
  pUcs4 = NULL;
13,780✔
86

87
end:
13,780✔
88
  if (code != 0){
13,780!
89
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
×
90
  }
91
  taosMemoryFree(pUcs4);
13,780!
92
  return code;
13,775✔
93
}
94
/**
95
 * @brief No json tag for schemaless
96
 *
97
 * @param cols
98
 * @param tags
99
 * @param pSchema
100
 * @param ppTag
101
 * @param msg
102
 * @return int32_t
103
 */
104
static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchema, STag** ppTag, SArray** tagName,
2,514✔
105
                              SMsgBuf* msg, void* charsetCxt) {
106
  int      code = TSDB_CODE_SUCCESS;
2,514✔
107
  int32_t  lino = 0;
2,514✔
108
  SArray*  pTagArray = taosArrayInit(tags->numOfBound, sizeof(STagVal));
2,514✔
109
  TSDB_CHECK_NULL(pTagArray, code, lino, end, terrno);
2,520!
110
  *tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
2,520✔
111
  TSDB_CHECK_NULL(*tagName, code, lino, end, terrno);
2,519!
112

113
  for (int i = 0; i < tags->numOfBound; ++i) {
21,706✔
114
    SSchema* pTagSchema = &pSchema[tags->pColIndex[i]];
19,184✔
115
    SSmlKv*  kv = taosArrayGet(cols, i);
19,184✔
116
    TSDB_CHECK_NULL(kv, code, lino, end, terrno);
19,187✔
117
    bool cond = (kv->keyLen == strlen(pTagSchema->name) && memcmp(kv->key, pTagSchema->name, kv->keyLen) == 0 && kv->type == pTagSchema->type);
19,186!
118
    TSDB_CHECK_CONDITION(cond, code, lino, end, TSDB_CODE_SML_INVALID_DATA);
19,186!
119
    TSDB_CHECK_NULL(taosArrayPush(*tagName, pTagSchema->name), code, lino, end, terrno);
38,364!
120
    STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
19,178✔
121
    if (pTagSchema->type == TSDB_DATA_TYPE_BINARY || pTagSchema->type == TSDB_DATA_TYPE_VARBINARY ||
19,178!
122
        pTagSchema->type == TSDB_DATA_TYPE_GEOMETRY) {
17,708!
123
      val.pData = (uint8_t*)kv->value;
1,469✔
124
      val.nData = kv->length;
1,469✔
125
    } else if (pTagSchema->type == TSDB_DATA_TYPE_NCHAR) {
17,709✔
126
      code = smlMbsToUcs4(kv->value, kv->length, (void**)&val.pData, (int32_t*)&val.nData, kv->length * TSDB_NCHAR_SIZE, charsetCxt);
12,095✔
127
      TSDB_CHECK_CODE(code, lino, end);
12,101!
128
    } else {
129
      (void)memcpy(&val.i64, &(kv->value), kv->length);
5,614✔
130
    }
131
    TSDB_CHECK_NULL(taosArrayPush(pTagArray, &val), code, lino, end, terrno);
19,186!
132
  }
133
  code = tTagNew(pTagArray, 1, false, ppTag);
2,522✔
134

135
end:
2,520✔
136
  if (code != 0){
2,520!
137
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
×
138
  }
139
  for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
21,683✔
140
    STagVal* p = (STagVal*)taosArrayGet(pTagArray, i);
19,166✔
141
    if (p->type == TSDB_DATA_TYPE_NCHAR) {
19,161✔
142
      taosMemoryFree(p->pData);
12,095!
143
    }
144
  }
145
  taosArrayDestroy(pTagArray);
2,515✔
146
  return code;
2,520✔
147
}
148

149
int32_t smlInitTableDataCtx(SQuery* query, STableMeta* pTableMeta, STableDataCxt** cxt) {
771✔
150
  int      ret = TSDB_CODE_SUCCESS;
771✔
151
  int32_t  lino = 0;
771✔
152
  SVCreateTbReq* pCreateTbReq = NULL;
771✔
153
  ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
771✔
154
                                          sizeof(pTableMeta->uid), pTableMeta, &pCreateTbReq, cxt, false, false);
155
  TSDB_CHECK_CODE(ret, lino, end);
776!
156
  ret = initTableColSubmitData(*cxt);
776✔
157
  TSDB_CHECK_CODE(ret, lino, end);
773!
158

159
end:
773✔
160
  if (ret != 0){
773!
161
    uError("%s failed at %d since %s", __func__, lino, tstrerror(ret));
×
162
  }
163
  return ret;
772✔
164
}
165

166
void clearColValArraySml(SArray* pCols) {
96,436✔
167
  int32_t num = taosArrayGetSize(pCols);
96,436✔
168
  for (int32_t i = 0; i < num; ++i) {
427,276✔
169
    SColVal* pCol = taosArrayGet(pCols, i);
335,445✔
170
    if (TSDB_DATA_TYPE_NCHAR == pCol->value.type || TSDB_DATA_TYPE_GEOMETRY == pCol->value.type ||
331,634✔
171
        TSDB_DATA_TYPE_VARBINARY == pCol->value.type) {
330,002✔
172
      taosMemoryFreeClear(pCol->value.pData);
1,650!
173
    }
174
    pCol->flag = CV_FLAG_NONE;
331,633✔
175
    pCol->value.val = 0;
331,633✔
176
  }
177
}
91,831✔
178

179
int32_t smlBuildRow(STableDataCxt* pTableCxt) {
5,077✔
180
  int      ret = TSDB_CODE_SUCCESS;
5,077✔
181
  int32_t  lino = 0;
5,077✔
182
  SRow**   pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
5,077✔
183
  TSDB_CHECK_NULL(pRow, ret, lino, end, terrno);
5,078!
184
  ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
5,078✔
185
  TSDB_CHECK_CODE(ret, lino, end);
5,082!
186
  SRowKey key;
187
  tRowGetKey(*pRow, &key);
10,164!
188
  insCheckTableDataOrder(pTableCxt, &key);
5,082✔
189
end:
5,084✔
190
  if (ret != 0){
5,084!
191
    uError("%s failed at %d since %s", __func__, lino, tstrerror(ret));
×
192
  }
193
  return ret;
5,087✔
194
}
195

196
int32_t smlBuildCol(STableDataCxt* pTableCxt, SSchema* schema, void* data, int32_t index, void* charsetCxt) {
10,271✔
197
  int      ret = TSDB_CODE_SUCCESS;
10,271✔
198
  int32_t  lino = 0;
10,271✔
199
  SSchema* pColSchema = schema + index;
10,271✔
200
  SColVal* pVal = taosArrayGet(pTableCxt->pValues, index);
10,271✔
201
  TSDB_CHECK_NULL(pVal, ret, lino, end, TSDB_CODE_SUCCESS);
10,268!
202
  SSmlKv*  kv = (SSmlKv*)data;
10,268✔
203
  if (kv->keyLen != strlen(pColSchema->name) || memcmp(kv->key, pColSchema->name, kv->keyLen) != 0 ||
10,268!
204
      kv->type != pColSchema->type) {
10,275✔
UNCOV
205
    ret = TSDB_CODE_SML_INVALID_DATA;
×
UNCOV
206
    char* tmp = taosMemoryCalloc(kv->keyLen + 1, 1);
×
207
    TSDB_CHECK_NULL(tmp, ret, lino, end, terrno);
14!
208
    (void)memcpy(tmp, kv->key, kv->keyLen);
14✔
209
    uInfo("SML data(name:%s type:%s) is not same like the db data(name:%s type:%s)", tmp, tDataTypes[kv->type].name,
14!
210
          pColSchema->name, tDataTypes[pColSchema->type].name);
211
    taosMemoryFree(tmp);
14!
212
    goto end;
14✔
213
  }
214
  if (kv->type == TSDB_DATA_TYPE_NCHAR) {
10,273✔
215
    ret = smlMbsToUcs4(kv->value, kv->length, (void**)&pVal->value.pData, &pVal->value.nData, pColSchema->bytes - VARSTR_HEADER_SIZE, charsetCxt);
240✔
216
    TSDB_CHECK_CODE(ret, lino, end);
237!
217
  } else if (kv->type == TSDB_DATA_TYPE_BINARY) {
10,033✔
218
    pVal->value.nData = kv->length;
731✔
219
    pVal->value.pData = (uint8_t*)kv->value;
731✔
220
  } else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
9,302!
221
    pVal->value.nData = kv->length;
×
222
    pVal->value.pData = taosMemoryMalloc(kv->length);
×
223
    TSDB_CHECK_NULL(pVal->value.pData, ret, lino, end, terrno);
×
224

225
    (void)memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
×
226
  } else {
227
    valueSetDatum(&pVal->value, kv->type, &(kv->value), kv->length);
9,307✔
228
  }
229
  pVal->flag = CV_FLAG_VALUE;
10,276✔
230

231
end:
10,290✔
232
  if (ret != 0){
10,290✔
233
    uError("%s failed at %d since %s", __func__, lino, tstrerror(ret));
14!
234
  }
235
  return ret;
10,292✔
236
}
237

238
int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSchema, SArray* cols,
2,514✔
239
                    STableMeta* pTableMeta, char* tableName, const char* sTableName, int32_t sTableNameLen, int32_t ttl,
240
                    char* msgBuf, int32_t msgBufLen, void* charsetCxt) {
241
  int32_t lino = 0;
2,514✔
242
  int32_t ret = 0;
2,514✔
243
  SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
2,514✔
244

245
  SSchema*       pTagsSchema = getTableTagSchema(pTableMeta);
2,514✔
246
  SBoundColInfo  bindTags = {0};
2,518✔
247
  SVCreateTbReq* pCreateTblReq = NULL;
2,518✔
248
  SArray*        tagName = NULL;
2,518✔
249

250
  ret = insInitBoundColsInfo(getNumOfTags(pTableMeta), &bindTags);
2,518✔
251
  TSDB_CHECK_CODE(ret, lino, end);
2,520!
252

253
  ret = smlBoundColumnData(tags, &bindTags, pTagsSchema, true);
2,520✔
254
  TSDB_CHECK_CODE(ret, lino, end);
2,519!
255

256
  STag* pTag = NULL;
2,519✔
257
  ret = smlBuildTagRow(tags, &bindTags, pTagsSchema, &pTag, &tagName, &pBuf, charsetCxt);
2,519✔
258
  TSDB_CHECK_CODE(ret, lino, end);
2,518!
259

260
  pCreateTblReq = taosMemoryCalloc(1, sizeof(SVCreateTbReq));
2,518!
261
  TSDB_CHECK_NULL(pCreateTblReq, ret, lino, end, terrno);
2,519!
262

263
  ret = insBuildCreateTbReq(pCreateTblReq, tableName, pTag, pTableMeta->suid, NULL, tagName,
2,519✔
264
                            pTableMeta->tableInfo.numOfTags, ttl);
2,519✔
265
  TSDB_CHECK_CODE(ret, lino, end);
2,520!
266

267
  pCreateTblReq->ctb.stbName = taosMemoryCalloc(1, sTableNameLen + 1);
2,520!
268
  TSDB_CHECK_NULL(pCreateTblReq->ctb.stbName, ret, lino, end, terrno);
2,520!
269

270
  (void)memcpy(pCreateTblReq->ctb.stbName, sTableName, sTableNameLen);
2,520✔
271

272
  if (dataFormat) {
2,520✔
273
    STableDataCxt** pTableCxt = (STableDataCxt**)taosHashGet(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj,
613✔
274
                                                             &pTableMeta->uid, sizeof(pTableMeta->uid));
613✔
275
    TSDB_CHECK_NULL(pTableCxt, ret, lino, end, TSDB_CODE_TSC_INVALID_OPERATION);
614!
276
    (*pTableCxt)->pData->flags |= SUBMIT_REQ_AUTO_CREATE_TABLE;
614✔
277
    (*pTableCxt)->pData->pCreateTbReq = pCreateTblReq;
614✔
278
    (*pTableCxt)->pMeta->uid = pTableMeta->uid;
614✔
279
    (*pTableCxt)->pMeta->vgId = pTableMeta->vgId;
614✔
280
    pCreateTblReq = NULL;
614✔
281
    goto end;
614✔
282
  }
283

284
  STableDataCxt* pTableCxt = NULL;
1,907✔
285
  ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
1,907✔
286
                           sizeof(pTableMeta->uid), pTableMeta, &pCreateTblReq, &pTableCxt, false, false);
287
  TSDB_CHECK_CODE(ret, lino, end);
1,904!
288

289
  SSchema* pSchema = getTableColumnSchema(pTableMeta);
1,904✔
290
  ret = smlBoundColumnData(colsSchema, &pTableCxt->boundColsInfo, pSchema, false);
1,904✔
291
  TSDB_CHECK_CODE(ret, lino, end);
1,905!
292

293
  ret = initTableColSubmitData(pTableCxt);
1,905✔
294
  TSDB_CHECK_CODE(ret, lino, end);
1,904!
295

296
  int32_t rowNum = taosArrayGetSize(cols);
1,904✔
297
  TSDB_CHECK_CONDITION(rowNum > 0, ret, lino, end, TSDB_CODE_TSC_INVALID_OPERATION);
1,905!
298

299
  for (int32_t r = 0; r < rowNum; ++r) {
80,543✔
300
    void* rowData = taosArrayGetP(cols, r);
78,638✔
301
    TSDB_CHECK_NULL(rowData, ret, lino, end, terrno);
77,562!
302

303
    // 1. set the parsed value from sql string
304
    for (int c = 0; c < pTableCxt->boundColsInfo.numOfBound; ++c) {
363,053✔
305
      SSchema* pColSchema = &pSchema[pTableCxt->boundColsInfo.pColIndex[c]];
276,783✔
306
      SColVal* pVal = taosArrayGet(pTableCxt->pValues, pTableCxt->boundColsInfo.pColIndex[c]);
276,783✔
307
      TSDB_CHECK_NULL(pVal, ret, lino, end, terrno);
269,834!
308
      void**   p = taosHashGet(rowData, pColSchema->name, strlen(pColSchema->name));
269,834✔
309
      if (p == NULL) {
290,028✔
310
        continue;
295✔
311
      }
312
      SSmlKv* kv = *(SSmlKv**)p;
289,733✔
313
      TSDB_CHECK_CONDITION(kv->type == pColSchema->type, ret, lino, end, TSDB_CODE_TSC_INVALID_OPERATION);
289,733!
314

315
      if (pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP) {
289,733✔
316
        kv->i = convertTimePrecision(kv->i, TSDB_TIME_PRECISION_NANO, pTableMeta->tableInfo.precision);
84,235✔
317
      }
318
      if (kv->type == TSDB_DATA_TYPE_NCHAR) {
289,572✔
319
        ret = smlMbsToUcs4(kv->value, kv->length, (void**)&pVal->value.pData, (int32_t*)&pVal->value.nData, pColSchema->bytes - VARSTR_HEADER_SIZE, charsetCxt);
1,437✔
320
        TSDB_CHECK_CODE(ret, lino, end);
1,438!
321
      } else if (kv->type == TSDB_DATA_TYPE_BINARY) {
288,135✔
322
        pVal->value.nData = kv->length;
1,852✔
323
        pVal->value.pData = (uint8_t*)kv->value;
1,852✔
324
      } else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
286,283!
325
        pVal->value.nData = kv->length;
1,917✔
326
        pVal->value.pData = taosMemoryMalloc(kv->length);
1,917!
327
        TSDB_CHECK_NULL(pVal->value.pData, ret, lino, end, terrno);
48!
328
        (void)memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
48✔
329
      } else {
330
        valueSetDatum(&pVal->value, kv->type, &(kv->value), kv->length);
284,366✔
331
      }
332
      pVal->flag = CV_FLAG_VALUE;
285,190✔
333
    }
334

335
    SRow** pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
86,270✔
336
    TSDB_CHECK_NULL(pRow, ret, lino, end, terrno);
85,284!
337
    ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
85,284✔
338
    TSDB_CHECK_CODE(ret, lino, end);
92,851!
339
    SRowKey key = {0};
92,851✔
340
    tRowGetKey(*pRow, &key);
185,702!
341
    insCheckTableDataOrder(pTableCxt, &key);
92,851✔
342
    clearColValArraySml(pTableCxt->pValues);
92,330✔
343
  }
344

345
end:
1,905✔
346
  if (ret != 0){
2,519!
347
    uError("%s failed at %d since %s", __func__, lino, tstrerror(ret));
×
348
    ret = buildInvalidOperationMsg(&pBuf, tstrerror(ret));
×
349
  }
350
  insDestroyBoundColInfo(&bindTags);
2,519✔
351
  tdDestroySVCreateTbReq(pCreateTblReq);
2,518✔
352
  taosMemoryFree(pCreateTblReq);
2,518!
353
  taosArrayDestroy(tagName);
2,517✔
354
  return ret;
2,518✔
355
}
356

357
int32_t smlInitHandle(SQuery** query) {
1,974✔
358
  int32_t lino = 0;
1,974✔
359
  int32_t code = 0;
1,974✔
360
  SQuery* pQuery = NULL;
1,974✔
361
  SVnodeModifyOpStmt* stmt = NULL;
1,974✔
362
  TSDB_CHECK_NULL(query, code, lino, end, TSDB_CODE_INVALID_PARA);
1,974✔
363

364
  *query = NULL;
1,973✔
365
  code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery);
1,973✔
366
  TSDB_CHECK_CODE(code, lino, end);
1,984!
367
  pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
1,984✔
368
  pQuery->haveResultSet = false;
1,984✔
369
  pQuery->msgType = TDMT_VND_SUBMIT;
1,984✔
370
  code = nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT, (SNode**)&stmt);
1,984✔
371
  TSDB_CHECK_CODE(code, lino, end);
1,985!
372
  stmt->pTableBlockHashObj = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
1,985✔
373
  TSDB_CHECK_NULL(stmt->pTableBlockHashObj, code, lino, end, terrno);
1,986!
374
  stmt->freeHashFunc = insDestroyTableDataCxtHashMap;
1,986✔
375
  stmt->freeArrayFunc = insDestroyVgroupDataCxtList;
1,986✔
376

377
  pQuery->pRoot = (SNode*)stmt;
1,986✔
378
  *query = pQuery;
1,986✔
379
  return code;
1,986✔
380

381
end:
1✔
382
  if (code != 0) {
1!
383
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
1!
384
  }
385
  nodesDestroyNode((SNode*)stmt);
1✔
386
  qDestroyQuery(pQuery);
1✔
387
  return code;
1✔
388
}
389

390
int32_t smlBuildOutput(SQuery* handle, SHashObj* pVgHash) {
1,653✔
391
  int32_t lino = 0;
1,653✔
392
  int32_t code = 0;
1,653✔
393

394
  SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)(handle)->pRoot;
1,653✔
395
  code = insMergeTableDataCxt(pStmt->pTableBlockHashObj, &pStmt->pVgDataBlocks, true);
1,653✔
396
  TSDB_CHECK_CODE(code, lino, end);
1,657!
397
  code = insBuildVgDataBlocks(pVgHash, pStmt->pVgDataBlocks, &pStmt->pDataBlocks, false);
1,657✔
398
  TSDB_CHECK_CODE(code, lino, end);
1,655!
399

400
end:
1,655✔
401
  if (code != 0) {
1,655!
402
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
×
403
  }
404
  return code;
1,652✔
405
}
406

407
int32_t smlBuildOutputRaw(SQuery* handle, SHashObj* pVgHash) {
17✔
408
  int32_t lino = 0;
17✔
409
  int32_t code = 0;
17✔
410

411
  SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)(handle)->pRoot;
17✔
412
  code = insBuildVgDataBlocks(pVgHash, pStmt->pVgDataBlocks, &pStmt->pDataBlocks, false);
17✔
413
  TSDB_CHECK_CODE(code, lino, end);
17!
414

415
  end:
17✔
416
  if (code != 0) {
17!
417
    uError("%s failed at %d since %s", __func__, lino, tstrerror(code));
×
418
  }
419
  return code;
17✔
420
}
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