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

taosdata / TDengine / #3621

22 Feb 2025 11:44AM UTC coverage: 2.037% (-61.5%) from 63.573%
#3621

push

travis-ci

web-flow
Merge pull request #29874 from taosdata/merge/mainto3.0

merge: from main to 3.0 branch

4357 of 287032 branches covered (1.52%)

Branch coverage included in aggregate %.

0 of 174 new or added lines in 18 files covered. (0.0%)

213359 existing lines in 469 files now uncovered.

7260 of 283369 relevant lines covered (2.56%)

23737.72 hits per line

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

0.0
/source/libs/parser/src/parser.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 "parser.h"
17
#include "os.h"
18

19
#include "parInt.h"
20
#include "parToken.h"
21

UNCOV
22
bool qIsInsertValuesSql(const char* pStr, size_t length) {
×
UNCOV
23
  if (NULL == pStr) {
×
UNCOV
24
    return false;
×
25
  }
26

UNCOV
27
  const char* pSql = pStr;
×
28

UNCOV
29
  int32_t index = 0;
×
UNCOV
30
  SToken  t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
31
  if (TK_INSERT != t.type && TK_IMPORT != t.type) {
×
UNCOV
32
    return false;
×
33
  }
34

35
  do {
UNCOV
36
    pStr += index;
×
UNCOV
37
    index = 0;
×
UNCOV
38
    t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
39
    if (TK_USING == t.type || TK_VALUES == t.type || TK_FILE == t.type) {
×
UNCOV
40
      return true;
×
UNCOV
41
    } else if (TK_SELECT == t.type) {
×
UNCOV
42
      return false;
×
43
    }
UNCOV
44
    if (0 == t.type || 0 == t.n) {
×
45
      break;
46
    }
UNCOV
47
  } while (pStr - pSql < length);
×
UNCOV
48
  return false;
×
49
}
50

UNCOV
51
bool qIsCreateTbFromFileSql(const char* pStr, size_t length) {
×
UNCOV
52
  if (NULL == pStr) {
×
53
    return false;
×
54
  }
55

UNCOV
56
  const char* pSql = pStr;
×
57

UNCOV
58
  int32_t index = 0;
×
UNCOV
59
  SToken  t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
60
  if (TK_CREATE != t.type) {
×
UNCOV
61
    return false;
×
62
  }
63

64
  do {
UNCOV
65
    pStr += index;
×
UNCOV
66
    index = 0;
×
UNCOV
67
    t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
68
    if (TK_FILE == t.type) {
×
69
      return true;
×
70
    }
UNCOV
71
    if (0 == t.type || 0 == t.n) {
×
72
      break;
73
    }
UNCOV
74
  } while (pStr - pSql < length);
×
UNCOV
75
  return false;
×
76
}
77

UNCOV
78
bool qParseDbName(const char* pStr, size_t length, char** pDbName) {
×
79
  (void)length;
UNCOV
80
  int32_t index = 0;
×
81
  SToken  t;
82

UNCOV
83
  if (NULL == pStr) {
×
84
    *pDbName = NULL;
×
85
    return false;
×
86
  }
87

UNCOV
88
  t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
89
  if (TK_INSERT != t.type && TK_IMPORT != t.type) {
×
UNCOV
90
    *pDbName = NULL;
×
UNCOV
91
    return false;
×
92
  }
93

UNCOV
94
  t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
95
  if (TK_INTO != t.type) {
×
96
    *pDbName = NULL;
×
97
    return false;
×
98
  }
99

UNCOV
100
  t = tStrGetToken((char*)pStr, &index, false, NULL);
×
UNCOV
101
  if (t.n == 0 || t.z == NULL) {
×
UNCOV
102
    *pDbName = NULL;
×
UNCOV
103
    return false;
×
104
  }
UNCOV
105
  char* dotPos = strnchr(t.z, '.', t.n, true);
×
UNCOV
106
  if (dotPos != NULL) {
×
UNCOV
107
    int dbNameLen = dotPos - t.z;
×
UNCOV
108
    *pDbName = taosMemoryMalloc(dbNameLen + 1);
×
UNCOV
109
    if (*pDbName == NULL) {
×
110
      return false;
×
111
    }
UNCOV
112
    strncpy(*pDbName, t.z, dbNameLen);
×
UNCOV
113
    (*pDbName)[dbNameLen] = '\0';
×
UNCOV
114
    return true;
×
115
  }
UNCOV
116
  return false;
×
117
}
118

UNCOV
119
static int32_t analyseSemantic(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
×
UNCOV
120
  int32_t code = authenticate(pCxt, pQuery, pMetaCache);
×
121

UNCOV
122
  if (pCxt->parseOnly) {
×
UNCOV
123
    return code;
×
124
  }
125

UNCOV
126
  if (TSDB_CODE_SUCCESS == code && pQuery->placeholderNum > 0) {
×
UNCOV
127
    TSWAP(pQuery->pPrepareRoot, pQuery->pRoot);
×
UNCOV
128
    return TSDB_CODE_SUCCESS;
×
129
  }
130

UNCOV
131
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
132
    code = translate(pCxt, pQuery, pMetaCache);
×
133
  }
UNCOV
134
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
135
    code = calculateConstant(pCxt, pQuery);
×
136
  }
UNCOV
137
  return code;
×
138
}
139

UNCOV
140
static int32_t parseSqlIntoAst(SParseContext* pCxt, SQuery** pQuery) {
×
UNCOV
141
  int32_t code = parse(pCxt, pQuery);
×
UNCOV
142
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
143
    code = analyseSemantic(pCxt, *pQuery, NULL);
×
144
  }
UNCOV
145
  return code;
×
146
}
147

UNCOV
148
static int32_t parseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, SParseMetaCache* pMetaCache) {
×
UNCOV
149
  int32_t code = parse(pCxt, pQuery);
×
UNCOV
150
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
151
    code = collectMetaKey(pCxt, *pQuery, pMetaCache);
×
152
  }
UNCOV
153
  return code;
×
154
}
155

UNCOV
156
static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam, void *charsetCxt) {
×
UNCOV
157
  if (!pParam || IS_NULL_TYPE(pParam->buffer_type)) {
×
158
    return TSDB_CODE_APP_ERROR;
×
159
  }
UNCOV
160
  if (IS_VAR_DATA_TYPE(pVal->node.resType.type)) {
×
UNCOV
161
    taosMemoryFreeClear(pVal->datum.p);
×
162
  }
163

UNCOV
164
  if (pParam->is_null && 1 == *(pParam->is_null)) {
×
UNCOV
165
    pVal->node.resType.type = TSDB_DATA_TYPE_NULL;
×
UNCOV
166
    pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
×
UNCOV
167
    return TSDB_CODE_SUCCESS;
×
168
  }
169

UNCOV
170
  int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
×
UNCOV
171
  pVal->node.resType.type = pParam->buffer_type;
×
UNCOV
172
  pVal->node.resType.bytes = inputSize;
×
173

UNCOV
174
  switch (pParam->buffer_type) {
×
UNCOV
175
    case TSDB_DATA_TYPE_VARBINARY:
×
UNCOV
176
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
UNCOV
177
      if (NULL == pVal->datum.p) {
×
178
        return terrno;
×
179
      }
UNCOV
180
      varDataSetLen(pVal->datum.p, pVal->node.resType.bytes);
×
UNCOV
181
      memcpy(varDataVal(pVal->datum.p), pParam->buffer, pVal->node.resType.bytes);
×
UNCOV
182
      pVal->node.resType.bytes += VARSTR_HEADER_SIZE;
×
UNCOV
183
      break;
×
UNCOV
184
    case TSDB_DATA_TYPE_VARCHAR:
×
185
    case TSDB_DATA_TYPE_GEOMETRY:
UNCOV
186
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
UNCOV
187
      if (NULL == pVal->datum.p) {
×
188
        return terrno;
×
189
      }
UNCOV
190
      varDataSetLen(pVal->datum.p, pVal->node.resType.bytes);
×
UNCOV
191
      strncpy(varDataVal(pVal->datum.p), (const char*)pParam->buffer, pVal->node.resType.bytes);
×
UNCOV
192
      pVal->node.resType.bytes += VARSTR_HEADER_SIZE;
×
UNCOV
193
      break;
×
UNCOV
194
    case TSDB_DATA_TYPE_NCHAR: {
×
UNCOV
195
      pVal->node.resType.bytes *= TSDB_NCHAR_SIZE;
×
UNCOV
196
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
UNCOV
197
      if (NULL == pVal->datum.p) {
×
198
        return terrno;
×
199
      }
200

UNCOV
201
      int32_t output = 0;
×
UNCOV
202
      if (!taosMbsToUcs4(pParam->buffer, inputSize, (TdUcs4*)varDataVal(pVal->datum.p), pVal->node.resType.bytes,
×
203
                         &output, charsetCxt)) {
204
        return terrno;
×
205
      }
UNCOV
206
      varDataSetLen(pVal->datum.p, output);
×
UNCOV
207
      pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
×
UNCOV
208
      break;
×
209
    }
UNCOV
210
    default: {
×
UNCOV
211
      int32_t code = nodesSetValueNodeValue(pVal, pParam->buffer);
×
UNCOV
212
      if (code) {
×
213
        return code;
×
214
      }
UNCOV
215
      break;
×
216
    }
217
  }
UNCOV
218
  pVal->translate = true;
×
UNCOV
219
  return TSDB_CODE_SUCCESS;
×
220
}
221

UNCOV
222
static EDealRes rewriteQueryExprAliasImpl(SNode* pNode, void* pContext) {
×
UNCOV
223
  if (nodesIsExprNode(pNode) && QUERY_NODE_COLUMN != nodeType(pNode)) {
×
UNCOV
224
    snprintf(((SExprNode*)pNode)->aliasName, TSDB_COL_NAME_LEN, "#%d", *(int32_t*)pContext);
×
UNCOV
225
    ++(*(int32_t*)pContext);
×
226
  }
UNCOV
227
  return DEAL_RES_CONTINUE;
×
228
}
229

UNCOV
230
static void rewriteQueryExprAlias(SNode* pRoot, int32_t* pNo) {
×
UNCOV
231
  switch (nodeType(pRoot)) {
×
UNCOV
232
    case QUERY_NODE_SELECT_STMT:
×
UNCOV
233
      nodesWalkSelectStmt((SSelectStmt*)pRoot, SQL_CLAUSE_FROM, rewriteQueryExprAliasImpl, pNo);
×
UNCOV
234
      break;
×
235
    case QUERY_NODE_SET_OPERATOR: {
×
236
      SSetOperator* pSetOper = (SSetOperator*)pRoot;
×
237
      rewriteQueryExprAlias(pSetOper->pLeft, pNo);
×
238
      rewriteQueryExprAlias(pSetOper->pRight, pNo);
×
239
      break;
×
240
    }
241
    default:
×
242
      break;
×
243
  }
UNCOV
244
}
×
245

UNCOV
246
static void rewriteExprAlias(SNode* pRoot) {
×
UNCOV
247
  int32_t no = 1;
×
UNCOV
248
  rewriteQueryExprAlias(pRoot, &no);
×
UNCOV
249
}
×
250

UNCOV
251
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
×
UNCOV
252
  int32_t code = TSDB_CODE_SUCCESS;
×
UNCOV
253
  if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
×
UNCOV
254
    code = parseInsertSql(pCxt, pQuery, NULL, NULL);
×
255
  } else {
UNCOV
256
    code = parseSqlIntoAst(pCxt, pQuery);
×
257
  }
UNCOV
258
  terrno = code;
×
UNCOV
259
  return code;
×
260
}
261

UNCOV
262
static int32_t parseQuerySyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
×
UNCOV
263
  SParseMetaCache metaCache = {0};
×
UNCOV
264
  int32_t         code = parseSqlSyntax(pCxt, pQuery, &metaCache);
×
UNCOV
265
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
266
    code = buildCatalogReq(&metaCache, pCatalogReq);
×
267
  }
UNCOV
268
  destoryParseMetaCache(&metaCache, true);
×
UNCOV
269
  return code;
×
270
}
271

272
static int32_t parseCreateTbFromFileSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
×
273
  if (NULL == *pQuery) return parseQuerySyntax(pCxt, pQuery, pCatalogReq);
×
274

275
  return continueCreateTbFromFile(pCxt, pQuery);
×
276
}
277

UNCOV
278
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
×
UNCOV
279
  int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
×
UNCOV
280
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
281
    if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
×
UNCOV
282
      code = parseInsertSql(pCxt, pQuery, pCatalogReq, NULL);
×
UNCOV
283
    } else if (qIsCreateTbFromFileSql(pCxt->pSql, pCxt->sqlLen)) {
×
284
      code = parseCreateTbFromFileSyntax(pCxt, pQuery, pCatalogReq);
×
285
    } else {
UNCOV
286
      code = parseQuerySyntax(pCxt, pQuery, pCatalogReq);
×
287
    }
288
  }
UNCOV
289
  (void)nodesReleaseAllocator(pCxt->allocatorId);
×
UNCOV
290
  terrno = code;
×
UNCOV
291
  return code;
×
292
}
293

UNCOV
294
int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCatalogReq,
×
295
                            const struct SMetaData* pMetaData, SQuery* pQuery) {
UNCOV
296
  SParseMetaCache metaCache = {0};
×
UNCOV
297
  int32_t         code = nodesAcquireAllocator(pCxt->allocatorId);
×
UNCOV
298
  if (TSDB_CODE_SUCCESS == code && pCatalogReq) {
×
UNCOV
299
    code = putMetaDataToCache(pCatalogReq, pMetaData, &metaCache);
×
300
  }
UNCOV
301
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
302
    code = analyseSemantic(pCxt, pQuery, &metaCache);
×
303
  }
UNCOV
304
  (void)nodesReleaseAllocator(pCxt->allocatorId);
×
UNCOV
305
  destoryParseMetaCache(&metaCache, false);
×
UNCOV
306
  terrno = code;
×
UNCOV
307
  return code;
×
308
}
309

UNCOV
310
int32_t qContinueParseSql(SParseContext* pCxt, struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData,
×
311
                          SQuery* pQuery) {
UNCOV
312
  return parseInsertSql(pCxt, &pQuery, pCatalogReq, pMetaData);
×
313
}
314

UNCOV
315
int32_t qContinueParsePostQuery(SParseContext* pCxt, SQuery* pQuery, SSDataBlock* pBlock) {
×
UNCOV
316
  int32_t code = TSDB_CODE_SUCCESS;
×
UNCOV
317
  switch (nodeType(pQuery->pRoot)) {
×
UNCOV
318
    case QUERY_NODE_CREATE_STREAM_STMT: {
×
UNCOV
319
      code = translatePostCreateStream(pCxt, pQuery, pBlock);
×
UNCOV
320
      break;
×
321
    }
UNCOV
322
    case QUERY_NODE_CREATE_INDEX_STMT: {
×
UNCOV
323
      code = translatePostCreateSmaIndex(pCxt, pQuery, pBlock);
×
UNCOV
324
      break;
×
325
    }
UNCOV
326
    case QUERY_NODE_CREATE_TSMA_STMT: {
×
UNCOV
327
      code = translatePostCreateTSMA(pCxt, pQuery, pBlock);
×
UNCOV
328
      break;
×
329
    }
330
    default:
×
331
      break;
×
332
  }
333

UNCOV
334
  return code;
×
335
}
336

UNCOV
337
static void destoryTablesReq(void* p) {
×
UNCOV
338
  STablesReq* pRes = (STablesReq*)p;
×
UNCOV
339
  taosArrayDestroy(pRes->pTables);
×
UNCOV
340
}
×
341

UNCOV
342
void destoryCatalogReq(SCatalogReq* pCatalogReq) {
×
UNCOV
343
  if (NULL == pCatalogReq) {
×
UNCOV
344
    return;
×
345
  }
UNCOV
346
  taosArrayDestroy(pCatalogReq->pDbVgroup);
×
UNCOV
347
  taosArrayDestroy(pCatalogReq->pDbCfg);
×
UNCOV
348
  taosArrayDestroy(pCatalogReq->pDbInfo);
×
UNCOV
349
  if (pCatalogReq->cloned) {
×
UNCOV
350
    taosArrayDestroy(pCatalogReq->pTableMeta);
×
UNCOV
351
    taosArrayDestroy(pCatalogReq->pTableHash);
×
352
#ifdef TD_ENTERPRISE
UNCOV
353
    taosArrayDestroy(pCatalogReq->pView);
×
354
#endif
UNCOV
355
    taosArrayDestroy(pCatalogReq->pTableTSMAs);
×
UNCOV
356
    taosArrayDestroy(pCatalogReq->pTSMAs);
×
UNCOV
357
    taosArrayDestroy(pCatalogReq->pTableName);
×
358
  } else {
UNCOV
359
    taosArrayDestroyEx(pCatalogReq->pTableMeta, destoryTablesReq);
×
UNCOV
360
    taosArrayDestroyEx(pCatalogReq->pTableHash, destoryTablesReq);
×
361
#ifdef TD_ENTERPRISE
UNCOV
362
    taosArrayDestroyEx(pCatalogReq->pView, destoryTablesReq);
×
363
#endif
UNCOV
364
    taosArrayDestroyEx(pCatalogReq->pTableTSMAs, destoryTablesReq);
×
UNCOV
365
    taosArrayDestroyEx(pCatalogReq->pTSMAs, destoryTablesReq);
×
UNCOV
366
    taosArrayDestroyEx(pCatalogReq->pTableName, destoryTablesReq);
×
367
  }
UNCOV
368
  taosArrayDestroy(pCatalogReq->pUdf);
×
UNCOV
369
  taosArrayDestroy(pCatalogReq->pIndex);
×
UNCOV
370
  taosArrayDestroy(pCatalogReq->pUser);
×
UNCOV
371
  taosArrayDestroy(pCatalogReq->pTableIndex);
×
UNCOV
372
  taosArrayDestroy(pCatalogReq->pTableCfg);
×
UNCOV
373
  taosArrayDestroy(pCatalogReq->pTableTag);
×
374
}
375

UNCOV
376
void tfreeSParseQueryRes(void* p) {
×
UNCOV
377
  if (NULL == p) {
×
378
    return;
×
379
  }
380

UNCOV
381
  SParseQueryRes* pRes = p;
×
UNCOV
382
  destoryCatalogReq(pRes->pCatalogReq);
×
UNCOV
383
  taosMemoryFree(pRes->pCatalogReq);
×
UNCOV
384
  catalogFreeMetaData(&pRes->meta);
×
385
}
386

UNCOV
387
void qDestroyParseContext(SParseContext* pCxt) {
×
UNCOV
388
  if (NULL == pCxt) {
×
389
    return;
×
390
  }
391

UNCOV
392
  taosArrayDestroyEx(pCxt->pSubMetaList, tfreeSParseQueryRes);
×
UNCOV
393
  taosArrayDestroy(pCxt->pTableMetaPos);
×
UNCOV
394
  taosArrayDestroy(pCxt->pTableVgroupPos);
×
UNCOV
395
  taosMemoryFree(pCxt);
×
396
}
397

UNCOV
398
void qDestroyQuery(SQuery* pQueryNode) { nodesDestroyNode((SNode*)pQueryNode); }
×
399

UNCOV
400
int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema) {
×
UNCOV
401
  return extractResultSchema(pRoot, numOfCols, pSchema);
×
402
}
403

UNCOV
404
int32_t qSetSTableIdForRsma(SNode* pStmt, int64_t uid) {
×
UNCOV
405
  if (QUERY_NODE_SELECT_STMT == nodeType(pStmt)) {
×
UNCOV
406
    SNode* pTable = ((SSelectStmt*)pStmt)->pFromTable;
×
UNCOV
407
    if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
×
UNCOV
408
      ((SRealTableNode*)pTable)->pMeta->uid = uid;
×
UNCOV
409
      ((SRealTableNode*)pTable)->pMeta->suid = uid;
×
UNCOV
410
      return TSDB_CODE_SUCCESS;
×
411
    }
412
  }
413
  return TSDB_CODE_FAILED;
×
414
}
415

UNCOV
416
int32_t qInitKeywordsTable() { return taosInitKeywordsTable(); }
×
417

UNCOV
418
void qCleanupKeywordsTable() { taosCleanupKeywordsTable(); }
×
419

UNCOV
420
int32_t qStmtBindParams(SQuery* pQuery, TAOS_MULTI_BIND* pParams, int32_t colIdx, void *charsetCxt) {
×
UNCOV
421
  int32_t code = TSDB_CODE_SUCCESS;
×
422

UNCOV
423
  if (colIdx < 0) {
×
UNCOV
424
    int32_t size = taosArrayGetSize(pQuery->pPlaceholderValues);
×
UNCOV
425
    for (int32_t i = 0; i < size; ++i) {
×
UNCOV
426
      code = setValueByBindParam((SValueNode*)taosArrayGetP(pQuery->pPlaceholderValues, i), pParams + i, charsetCxt);
×
UNCOV
427
      if (TSDB_CODE_SUCCESS != code) {
×
428
        return code;
×
429
      }
430
    }
431
  } else {
UNCOV
432
    code = setValueByBindParam((SValueNode*)taosArrayGetP(pQuery->pPlaceholderValues, colIdx), pParams, charsetCxt);
×
433
  }
434

UNCOV
435
  if (TSDB_CODE_SUCCESS == code && (colIdx < 0 || colIdx + 1 == pQuery->placeholderNum)) {
×
UNCOV
436
    nodesDestroyNode(pQuery->pRoot);
×
UNCOV
437
    pQuery->pRoot = NULL;
×
UNCOV
438
    code = nodesCloneNode(pQuery->pPrepareRoot, &pQuery->pRoot);
×
439
  }
UNCOV
440
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
441
    rewriteExprAlias(pQuery->pRoot);
×
442
  }
UNCOV
443
  return code;
×
444
}
445

UNCOV
446
static int32_t setValueByBindParam2(SValueNode* pVal, TAOS_STMT2_BIND* pParam, void* charsetCxt) {
×
UNCOV
447
  if (!pParam || IS_NULL_TYPE(pParam->buffer_type)) {
×
448
    return TSDB_CODE_APP_ERROR;
×
449
  }
UNCOV
450
  if (IS_VAR_DATA_TYPE(pVal->node.resType.type)) {
×
451
    taosMemoryFreeClear(pVal->datum.p);
×
452
  }
453

UNCOV
454
  if (pParam->is_null && 1 == *(pParam->is_null)) {
×
455
    pVal->node.resType.type = TSDB_DATA_TYPE_NULL;
×
456
    pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
×
457
    return TSDB_CODE_SUCCESS;
×
458
  }
459

UNCOV
460
  int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
×
UNCOV
461
  pVal->node.resType.type = pParam->buffer_type;
×
UNCOV
462
  pVal->node.resType.bytes = inputSize;
×
463

UNCOV
464
  switch (pParam->buffer_type) {
×
465
    case TSDB_DATA_TYPE_VARBINARY:
×
466
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
467
      if (NULL == pVal->datum.p) {
×
468
        return terrno;
×
469
      }
470
      varDataSetLen(pVal->datum.p, pVal->node.resType.bytes);
×
471
      memcpy(varDataVal(pVal->datum.p), pParam->buffer, pVal->node.resType.bytes);
×
472
      pVal->node.resType.bytes += VARSTR_HEADER_SIZE;
×
473
      break;
×
474
    case TSDB_DATA_TYPE_VARCHAR:
×
475
    case TSDB_DATA_TYPE_GEOMETRY:
476
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
477
      if (NULL == pVal->datum.p) {
×
478
        return terrno;
×
479
      }
480
      varDataSetLen(pVal->datum.p, pVal->node.resType.bytes);
×
481
      strncpy(varDataVal(pVal->datum.p), (const char*)pParam->buffer, pVal->node.resType.bytes);
×
482
      pVal->node.resType.bytes += VARSTR_HEADER_SIZE;
×
483
      break;
×
484
    case TSDB_DATA_TYPE_NCHAR: {
×
485
      pVal->node.resType.bytes *= TSDB_NCHAR_SIZE;
×
486
      pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
×
487
      if (NULL == pVal->datum.p) {
×
488
        return terrno;
×
489
      }
490

491
      int32_t output = 0;
×
492
      if (!taosMbsToUcs4(pParam->buffer, inputSize, (TdUcs4*)varDataVal(pVal->datum.p), pVal->node.resType.bytes,
×
493
                         &output, charsetCxt)) {
494
        return terrno;
×
495
      }
496
      varDataSetLen(pVal->datum.p, output);
×
497
      pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
×
498
      break;
×
499
    }
UNCOV
500
    default: {
×
UNCOV
501
      int32_t code = nodesSetValueNodeValue(pVal, pParam->buffer);
×
UNCOV
502
      if (code) {
×
503
        return code;
×
504
      }
UNCOV
505
      break;
×
506
    }
507
  }
UNCOV
508
  pVal->translate = true;
×
UNCOV
509
  return TSDB_CODE_SUCCESS;
×
510
}
511

UNCOV
512
int32_t qStmtBindParams2(SQuery* pQuery, TAOS_STMT2_BIND* pParams, int32_t colIdx, void* charsetCxt) {
×
UNCOV
513
  int32_t code = TSDB_CODE_SUCCESS;
×
514

UNCOV
515
  if (colIdx < 0) {
×
UNCOV
516
    int32_t size = taosArrayGetSize(pQuery->pPlaceholderValues);
×
UNCOV
517
    for (int32_t i = 0; i < size; ++i) {
×
UNCOV
518
      code = setValueByBindParam2((SValueNode*)taosArrayGetP(pQuery->pPlaceholderValues, i), pParams + i, charsetCxt);
×
UNCOV
519
      if (TSDB_CODE_SUCCESS != code) {
×
520
        return code;
×
521
      }
522
    }
523
  } else {
524
    code = setValueByBindParam2((SValueNode*)taosArrayGetP(pQuery->pPlaceholderValues, colIdx), pParams, charsetCxt);
×
525
  }
526

UNCOV
527
  if (TSDB_CODE_SUCCESS == code && (colIdx < 0 || colIdx + 1 == pQuery->placeholderNum)) {
×
UNCOV
528
    nodesDestroyNode(pQuery->pRoot);
×
UNCOV
529
    pQuery->pRoot = NULL;
×
UNCOV
530
    code = nodesCloneNode(pQuery->pPrepareRoot, &pQuery->pRoot);
×
531
  }
UNCOV
532
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
533
    rewriteExprAlias(pQuery->pRoot);
×
534
  }
UNCOV
535
  return code;
×
536
}
537

UNCOV
538
int32_t qStmtParseQuerySql(SParseContext* pCxt, SQuery* pQuery) {
×
UNCOV
539
  int32_t code = translate(pCxt, pQuery, NULL);
×
UNCOV
540
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
541
    code = calculateConstant(pCxt, pQuery);
×
542
  }
UNCOV
543
  return code;
×
544
}
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