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

taosdata / TDengine / #3531

19 Nov 2024 10:42AM UTC coverage: 60.213% (-0.006%) from 60.219%
#3531

push

travis-ci

web-flow
Merge pull request #28777 from taosdata/fix/3.0/TD-32366

fix:TD-32366/stmt add geometry datatype check

118529 of 252344 branches covered (46.97%)

Branch coverage included in aggregate %.

7 of 48 new or added lines in 3 files covered. (14.58%)

2282 existing lines in 115 files now uncovered.

199096 of 275161 relevant lines covered (72.36%)

6067577.83 hits per line

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

87.71
/utils/tsim/src/simExe.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
#define _DEFAULT_SOURCE
17
#include "simInt.h"
18

19
void simLogSql(char *sql, bool useSharp) {
442,493✔
20
  static TdFilePtr pFile = NULL;
21
  char             filename[256];
22
  sprintf(filename, "%s/sim.sql", simScriptDir);
442,493✔
23
  if (pFile == NULL) {
442,493✔
24
    pFile = taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM);
487✔
25
  }
26

27
  if (pFile != NULL) {
442,493!
28
    if (useSharp) {
442,493✔
29
      taosFprintfFile(pFile, "# %s;\n", sql);
6,243✔
30
    } else {
31
      taosFprintfFile(pFile, "%s;\n", sql);
436,250✔
32
    }
33

34
    UNUSED(taosFsyncFile(pFile));
442,493✔
35
  }
36
}
442,493✔
37

38
char *simParseHostName(char *varName) {
167✔
39
  static char hostName[140];
40
  //#ifdef WINDOWS
41
  //  hostName[0] = '\"';
42
  //  taosGetFqdn(&hostName[1]);
43
  //  int strEndIndex = strlen(hostName);
44
  //  hostName[strEndIndex] = '\"';
45
  //  hostName[strEndIndex + 1] = '\0';
46
  //#else
47
  sprintf(hostName, "%s", "localhost");
167✔
48
  //#endif
49
  return hostName;
167✔
50
}
51

52
static void simFindFirstNum(const char *begin, int32_t beginLen, int32_t *num) {
11,519✔
53
  *num = 0;
11,519✔
54

55
  if (beginLen > 5) {
11,519!
56
    *num = atoi(begin + 5);
11,519✔
57
  }
58
}
11,519✔
59

60
static void simFindSecondNum(const char *begin, int32_t beginLen, int32_t *num) {
11,519✔
61
  *num = 0;
11,519✔
62

63
  const char *number = strstr(begin, "][");
11,519✔
64
  if (number != NULL) {
11,519!
65
    *num = atoi(number + 2);
11,519✔
66
  }
67
}
11,519✔
68

69
static void simFindFirstKeyVal(const char *begin, int32_t beginLen, char *key, int32_t keyLen) {
1,540✔
70
  key[0] = 0;
1,540✔
71
  for (int32_t i = 5; i < beginLen && i - 5 < keyLen; ++i) {
10,161!
72
    if (begin[i] != 0 && begin[i] != ']' && begin[i] != ')') {
8,621!
73
      key[i - 5] = begin[i];
5,541✔
74
    }
75
  }
76
}
1,540✔
77

78
static void simFindSecondKeyNum(const char *begin, int32_t beginLen, int32_t *num) {
1,540✔
79
  *num = 0;
1,540✔
80

81
  const char *number = strstr(begin, ")[");
1,540✔
82
  if (number != NULL) {
1,540!
83
    *num = atoi(number + 2);
1,540✔
84
  }
85
}
1,540✔
86

87
char *simGetVariable(SScript *script, char *varName, int32_t varLen) {
19,163,344✔
88
  if (strncmp(varName, "hostname", 8) == 0) {
19,163,344✔
89
    return simParseHostName(varName);
167✔
90
  }
91

92
  if (strncmp(varName, "error", varLen) == 0) return script->error;
19,163,177✔
93

94
  if (strncmp(varName, "rows", varLen) == 0) return script->rows;
19,163,099✔
95

96
  if (strncmp(varName, "cols", varLen) == 0) return script->cols;
19,148,610✔
97

98
  if (strncmp(varName, "system_exit", varLen) == 0) return script->system_exit_code;
16,531,965!
99

100
  if (strncmp(varName, "system_content", varLen) == 0) return script->system_ret_content;
16,531,965✔
101

102
  if (strncmp(varName, "data", 4) == 0) {
16,531,947✔
103
    if (varLen < 6) {
52,796✔
104
      return "null";
1✔
105
    }
106

107
    int32_t row = 0;
52,795✔
108
    int32_t col = 0;
52,795✔
109
    char    keyVal[1024] = {0};
52,795✔
110
    int32_t keyLen = 1024;
52,795✔
111

112
    if (varName[4] == '[') {
52,795✔
113
      // $data[0][1]
114
      simFindFirstNum(varName, varLen, &row);
11,519✔
115
      simFindSecondNum(varName, varLen, &col);
11,519✔
116
      if (row < 0 || row >= MAX_QUERY_ROW_NUM) {
11,519!
117
        return "null";
2✔
118
      }
119
      if (col < 0 || col >= MAX_QUERY_COL_NUM) {
11,517!
120
        return "null";
1✔
121
      }
122
      simDebug("script:%s, data[%d][%d]=%s", script->fileName, row, col, script->data[row][col]);
11,516!
123
      return script->data[row][col];
11,516✔
124
    } else if (varName[4] == '(') {
41,276✔
125
      // $data(db)[0]
126
      simFindFirstKeyVal(varName, varLen, keyVal, keyLen);
1,540✔
127
      simFindSecondKeyNum(varName, varLen, &col);
1,540✔
128
      for (int32_t i = 0; i < MAX_QUERY_ROW_NUM; ++i) {
9,309✔
129
        if (strncmp(keyVal, script->data[i][0], keyLen) == 0) {
9,252✔
130
          simDebug("script:%s, keyName:%s, keyValue:%s", script->fileName, script->data[i][0], script->data[i][col]);
1,483!
131
          return script->data[i][col];
1,483✔
132
        }
133
      }
134
    } else if (varName[5] == '_') {
39,736✔
135
      // data2_db
136
      int32_t col = varName[4] - '0';
237✔
137
      col = col % MAX_QUERY_COL_NUM;
237✔
138

139
      char   *keyName;
140
      int32_t keyLen;
141
      paGetToken(varName + 6, &keyName, &keyLen);
237✔
142

143
      for (int32_t i = 0; i < MAX_QUERY_ROW_NUM; ++i) {
806✔
144
        if (strncmp(keyName, script->data[i][0], keyLen) == 0) {
805✔
145
          simDebug("script:%s, keyName:%s, keyValue:%s", script->fileName, script->data[i][0], script->data[i][col]);
236!
146
          return script->data[i][col];
236✔
147
        }
148
      }
149
      return "null";
1✔
150
    } else if (varName[6] == '_') {
39,499✔
151
      // data21_db
152
      int32_t col = (varName[4] - '0') * 10 + (varName[5] - '0');
228✔
153
      col = col % MAX_QUERY_COL_NUM;
228✔
154

155
      char   *keyName;
156
      int32_t keyLen;
157
      paGetToken(varName + 7, &keyName, &keyLen);
228✔
158

159
      for (int32_t i = 0; i < MAX_QUERY_ROW_NUM; ++i) {
684!
160
        if (strncmp(keyName, script->data[i][0], keyLen) == 0) {
684✔
161
          simTrace("script:%s, keyName:%s, keyValue:%s", script->fileName, script->data[i][0], script->data[i][col]);
228!
162
          return script->data[i][col];
228✔
163
        }
164
      }
165
    } else {
166
      // $data00
167
      int32_t row = varName[4] - '0';
39,271✔
168
      int32_t col = varName[5] - '0';
39,271✔
169
      row = row % MAX_QUERY_ROW_NUM;
39,271✔
170
      col = col % MAX_QUERY_COL_NUM;
39,271✔
171

172
      simDebug("script:%s, data[%d][%d]=%s", script->fileName, row, col, script->data[row][col]);
39,271!
173
      return script->data[row][col];
39,271✔
174
    }
175

176
    return "null";
57✔
177
  }
178

179
  for (int32_t i = 0; i < script->varLen; ++i) {
273,915,106✔
180
    SVariable *var = &script->variables[i];
273,911,300✔
181
    if (var->varNameLen != varLen) {
273,911,300✔
182
      continue;
237,119,998✔
183
    }
184
    if (strncmp(varName, var->varName, varLen) == 0) {
36,791,302✔
185
      return var->varValue;
16,475,345✔
186
    }
187
  }
188

189
  if (script->varLen >= MAX_VAR_LEN) {
3,806!
190
    simError("script:%s, too many varialbes:%d", script->fileName, script->varLen);
×
191
    exit(0);
×
192
  }
193

194
  SVariable *var = &script->variables[script->varLen];
3,806✔
195
  script->varLen++;
3,806✔
196
  strncpy(var->varName, varName, varLen);
3,806✔
197
  var->varNameLen = varLen;
3,806✔
198
  var->varValue[0] = 0;
3,806✔
199
  return var->varValue;
3,806✔
200
}
201

202
int32_t simExecuteExpression(SScript *script, char *exp) {
5,548,705✔
203
  char   *op1 = NULL;
5,548,705✔
204
  char   *op2 = NULL;
5,548,705✔
205
  char   *var1 = NULL;
5,548,705✔
206
  char   *var2 = NULL;
5,548,705✔
207
  char   *var3 = NULL;
5,548,705✔
208
  char   *rest = NULL;
5,548,705✔
209
  int32_t op1Len = 0;
5,548,705✔
210
  int32_t op2Len = 0;
5,548,705✔
211
  int32_t var1Len = 0;
5,548,705✔
212
  int32_t var2Len = 0;
5,548,705✔
213
  int32_t var3Len = 0;
5,548,705✔
214
  int32_t val0 = 0;
5,548,705✔
215
  int32_t val1 = 0;
5,548,705✔
216
  char    t0[2048] = {0};
5,548,705✔
217
  char    t1[2048] = {0};
5,548,705✔
218
  char    t2[2048] = {0};
5,548,705✔
219
  char    t3[2048] = {0};
5,548,705✔
220
  int32_t result = 0;
5,548,705✔
221

222
  rest = paGetToken(exp, &var1, &var1Len);
5,548,705✔
223
  rest = paGetToken(rest, &op1, &op1Len);
5,548,705✔
224
  rest = paGetToken(rest, &var2, &var2Len);
5,548,705✔
225
  rest = paGetToken(rest, &op2, &op2Len);
5,548,705✔
226

227
  if (var1[0] == '$')
5,548,705!
228
    tstrncpy(t0, simGetVariable(script, var1 + 1, var1Len - 1), sizeof(t0));
5,548,705✔
229
  else {
230
    tstrncpy(t0, var1, var1Len);
×
231
    t0[var1Len] = 0;
×
232
  }
233

234
  if (var2[0] == '$') {
5,548,705✔
235
    tstrncpy(t1, simGetVariable(script, var2 + 1, var2Len - 1), sizeof(t1));
4,236,267✔
236
  } else {
237
    memcpy(t1, var2, var2Len);
1,312,438✔
238
    t1[var2Len] = 0;
1,312,438✔
239
  }
240

241
  if (op2Len != 0) {
5,548,705✔
242
    rest = paGetToken(rest, &var3, &var3Len);
3,896,507✔
243

244
    if (var3[0] == '$')
3,896,507✔
245
      tstrncpy(t2, simGetVariable(script, var3 + 1, var3Len - 1), sizeof(t2));
2,073,327✔
246
    else {
247
      memcpy(t2, var3, var3Len);
1,823,180✔
248
      t2[var3Len] = 0;
1,823,180✔
249
    }
250

251
    int64_t t1l = atoll(t1);
3,896,507✔
252
    int64_t t2l = atoll(t2);
3,896,507✔
253

254
    if (op2[0] == '+') {
3,896,507✔
255
      sprintf(t3, "%" PRId64, t1l + t2l);
1,141,799✔
256
    } else if (op2[0] == '-') {
2,754,708✔
257
      sprintf(t3, "%" PRId64, t1l - t2l);
572,024✔
258
    } else if (op2[0] == '*') {
2,182,684✔
259
      sprintf(t3, "%" PRId64, t1l * t2l);
767,462✔
260
    } else if (op2[0] == '/') {
1,415,222✔
261
      if (t2l == 0) {
599,847✔
262
        sprintf(t3, "%" PRId64, INT64_MAX);
1✔
263
      } else {
264
        sprintf(t3, "%" PRId64, t1l / t2l);
599,846✔
265
      }
266
    } else if (op2[0] == '.') {
815,375!
267
      snprintf(t3, sizeof(t3), "%s%s", t1, t2);
815,375✔
268
    }
269
  } else {
270
    tstrncpy(t3, t1, sizeof(t3));
1,652,198✔
271
  }
272

273
  result = 0;
5,548,705✔
274

275
  if (op1Len == 1) {
5,548,705✔
276
    if (op1[0] == '=') {
4,712,748✔
277
      strcpy(simGetVariable(script, var1 + 1, var1Len - 1), t3);
3,960,944✔
278
    } else if (op1[0] == '<') {
751,804✔
279
      int64_t val0 = atoll(t0);
750,389✔
280
      int64_t val1 = atoll(t3);
750,389✔
281
      // val0 = atoi(t0);
282
      // val1 = atoi(t3);
283
      if (val0 >= val1) result = -1;
750,389✔
284
    } else if (op1[0] == '>') {
1,415!
285
      int64_t val0 = atoll(t0);
1,415✔
286
      int64_t val1 = atoll(t3);
1,415✔
287
      // val0 = atoi(t0);
288
      // val1 = atoi(t3);
289
      if (val0 <= val1) result = -1;
1,415✔
290
    }
291
  } else {
292
    if (op1[0] == '=' && op1[1] == '=') {
835,957!
293
      if (strcmp(t0, t3) != 0) result = -1;
404,028✔
294
    } else if (op1[0] == '!' && op1[1] == '=') {
431,929!
295
      if (strcmp(t0, t3) == 0) result = -1;
31,838✔
296
    } else if (op1[0] == '<' && op1[1] == '=') {
400,091!
297
      val0 = atoi(t0);
400,069✔
298
      val1 = atoi(t3);
400,069✔
299
      if (val0 > val1) result = -1;
400,069✔
300
    } else if (op1[0] == '>' && op1[1] == '=') {
22!
301
      val0 = atoi(t0);
22✔
302
      val1 = atoi(t3);
22✔
303
      if (val0 < val1) result = -1;
22!
304
    }
305
  }
306

307
  return result;
5,548,705✔
308
}
309

310
bool simExecuteExpCmd(SScript *script, char *option) {
3,949,423✔
311
  simExecuteExpression(script, option);
3,949,423✔
312
  script->linePos++;
3,949,423✔
313
  return true;
3,949,423✔
314
}
315

316
bool simExecuteTestCmd(SScript *script, char *option) {
1,599,282✔
317
  int32_t result;
318
  result = simExecuteExpression(script, option);
1,599,282✔
319

320
  if (result >= 0)
1,599,282✔
321
    script->linePos++;
762,900✔
322
  else
323
    script->linePos = script->lines[script->linePos].jump;
836,382✔
324

325
  return true;
1,599,282✔
326
}
327

328
bool simExecuteGotoCmd(SScript *script, char *option) {
769,155✔
329
  script->linePos = script->lines[script->linePos].jump;
769,155✔
330
  return true;
769,155✔
331
}
332

333
bool simExecuteRunCmd(SScript *script, char *option) {
275✔
334
  char *fileName = option;
275✔
335
  if (fileName == NULL || strlen(fileName) == 0) {
275!
336
    sprintf(script->error, "lineNum:%d. script file is null", script->lines[script->linePos].lineNum);
×
337
    return false;
×
338
  }
339

340
  SScript *newScript = simParseScript(option);
275✔
341
  if (newScript == NULL) {
275!
342
    sprintf(script->error, "lineNum:%d. parse file:%s error", script->lines[script->linePos].lineNum, fileName);
×
343
    return false;
×
344
  }
345

346
  simInfo("script:%s, start to execute", newScript->fileName);
275!
347

348
  newScript->type = SIM_SCRIPT_TYPE_MAIN;
275✔
349
  simScriptPos++;
275✔
350
  simScriptList[simScriptPos] = newScript;
275✔
351

352
  script->linePos++;
275✔
353
  return true;
275✔
354
}
355

356
bool simExecuteRunBackCmd(SScript *script, char *option) {
5✔
357
  char *fileName = option;
5✔
358
  if (fileName == NULL || strlen(fileName) == 0) {
5!
359
    sprintf(script->error, "lineNum:%d. script file is null", script->lines[script->linePos].lineNum);
×
360
    return false;
×
361
  }
362

363
  SScript *newScript = simParseScript(option);
5✔
364
  if (newScript == NULL) {
5!
365
    sprintf(script->error, "lineNum:%d. parse file:%s error", script->lines[script->linePos].lineNum, fileName);
×
366
    return false;
×
367
  }
368

369
  newScript->type = SIM_SCRIPT_TYPE_BACKGROUND;
5✔
370
  script->bgScripts[script->bgScriptLen++] = newScript;
5✔
371
  simInfo("script:%s, start to execute in background,", newScript->fileName);
5!
372

373
  if (taosThreadCreate(&newScript->bgPid, NULL, simExecuteScript, (void *)newScript) != 0) {
5!
374
    sprintf(script->error, "lineNum:%d. create background thread failed", script->lines[script->linePos].lineNum);
×
375
    return false;
×
376
  } else {
377
    simDebug("script:%s, background thread:0x%08" PRIx64 " is created", newScript->fileName,
5!
378
             taosGetPthreadId(newScript->bgPid));
379
  }
380

381
  script->linePos++;
5✔
382
  return true;
5✔
383
}
384

385
void simReplaceDirSep(char *buf) {
×
386
#ifdef WINDOWS
387
  int i = 0;
388
  while (buf[i] != '\0') {
389
    if (buf[i] == '/') {
390
      buf[i] = '\\';
391
    }
392
    i++;
393
  }
394
#endif
395
}
×
396

397
bool simReplaceStr(char *buf, char *src, char *dst) {
4✔
398
  bool  replaced = false;
4✔
399
  char *begin = strstr(buf, src);
4✔
400
  if (begin != NULL) {
4✔
401
    int32_t srcLen = (int32_t)strlen(src);
1✔
402
    int32_t dstLen = (int32_t)strlen(dst);
1✔
403
    int32_t interval = (dstLen - srcLen);
1✔
404
    int32_t remainLen = (int32_t)strlen(buf);
1✔
405
    char   *end = buf + remainLen;
1✔
406
    *(end + interval) = 0;
1✔
407

408
    for (char *p = end; p >= begin; p--) {
28✔
409
      *(p + interval) = *p;
27✔
410
    }
411

412
    memcpy(begin, dst, dstLen);
1✔
413
    replaced = true;
1✔
414
  }
415

416
  simInfo("system cmd is %s", buf);
4!
417
  return replaced;
4✔
418
}
419

420
bool simExecuteSystemCmd(SScript *script, char *option) {
3,057✔
421
  char buf[4096] = {0};
3,057✔
422
  bool replaced = false;
3,057✔
423

424
#ifndef WINDOWS
425
  sprintf(buf, "cd %s; ", simScriptDir);
3,057✔
426
  simVisuallizeOption(script, option, buf + strlen(buf));
3,057✔
427
#else
428
  sprintf(buf, "cd %s && ", simScriptDir);
429
  simVisuallizeOption(script, option, buf + strlen(buf));
430
  simReplaceStr(buf, ".sh", ".bat");
431
  simReplaceDirSep(buf);
432
#endif
433

434
  if (useValgrind) {
3,057✔
435
    replaced = simReplaceStr(buf, "exec.sh", "exec.sh -v");
4✔
436
  }
437

438
  simLogSql(buf, true);
3,057✔
439
  int32_t code = system(buf);
3,057✔
440
  int32_t repeatTimes = 0;
3,057✔
441
  while (code != 0) {
3,077✔
442
    simError("script:%s, failed to execute %s , code %d, errno:%d %s, repeatTimes:%d", script->fileName, buf, code,
22!
443
             errno, strerror(errno), repeatTimes);
444
    taosMsleep(1000);
22✔
445
    taosDflSignal(SIGCHLD);
22✔
446
    if (repeatTimes++ >= 10) {
22✔
447
      exit(0);
2✔
448
    }
449
  }
450

451
  sprintf(script->system_exit_code, "%d", code);
3,055✔
452
  script->linePos++;
3,055✔
453
  if (replaced && strstr(buf, "start") != NULL) {
3,055!
454
    simInfo("====> startup is slow in valgrind mode, so sleep 5 seconds after exec.sh -s start");
1!
455
    taosMsleep(5000);
1✔
456
  }
457

458
  return true;
3,055✔
459
}
460

461
void simStoreSystemContentResult(SScript *script, char *filename) {
11✔
462
  memset(script->system_ret_content, 0, MAX_SYSTEM_RESULT_LEN);
11✔
463

464
  TdFilePtr pFile;
465
  // if ((fd = fopen(filename, "r")) != NULL) {
466
  if ((pFile = taosOpenFile(filename, TD_FILE_READ)) != NULL) {
11✔
467
    taosReadFile(pFile, script->system_ret_content, MAX_SYSTEM_RESULT_LEN - 1);
10✔
468
    int32_t len = strlen(script->system_ret_content);
10✔
469
    for (int32_t i = 0; i < len; ++i) {
14✔
470
      if (script->system_ret_content[i] == '\n' || script->system_ret_content[i] == '\r') {
4!
471
        script->system_ret_content[i] = 0;
2✔
472
      }
473
    }
474
    taosCloseFile(&pFile);
10✔
475
    char rmCmd[MAX_FILE_NAME_LEN] = {0};
10✔
476
    sprintf(rmCmd, "rm -f %s", filename);
10✔
477
#pragma GCC diagnostic push
478
#pragma GCC diagnostic ignored "-Wunused-result"
479
    system(rmCmd);
10✔
480
#pragma GCC diagnostic pop
481
  }
482
}
11✔
483

484
bool simExecuteSystemContentCmd(SScript *script, char *option) {
11✔
485
  char buf[4096] = {0};
11✔
486
  char buf1[4096 + 512] = {0};
11✔
487
  char filename[400] = {0};
11✔
488
  sprintf(filename, "%s" TD_DIRSEP "%s.tmp", simScriptDir, script->fileName);
11✔
489

490
#ifdef WINDOWS
491
  sprintf(buf, "cd %s && ", simScriptDir);
492
  simVisuallizeOption(script, option, buf + strlen(buf));
493
  simReplaceStr(buf, ".sh", ".bat");
494
  simReplaceDirSep(buf);
495
  sprintf(buf1, "%s > %s 2>nul", buf, filename);
496
#else
497
  sprintf(buf, "cd %s; ", simScriptDir);
11✔
498
  simVisuallizeOption(script, option, buf + strlen(buf));
11✔
499
  sprintf(buf1, "%s > %s 2>/dev/null", buf, filename);
11✔
500
#endif
501

502
  sprintf(script->system_exit_code, "%d", system(buf1));
11✔
503
  simStoreSystemContentResult(script, filename);
11✔
504

505
  script->linePos++;
11✔
506
  return true;
11✔
507
}
508

509
bool simExecuteSetBIModeCmd(SScript *script, char *option) {
4✔
510
  char buf[1024];
511

512
  simVisuallizeOption(script, option, buf);
4✔
513
  option = buf;
4✔
514

515
  int32_t mode = atoi(option);
4✔
516

517
  simInfo("script:%s, set bi mode %d", script->fileName, mode);
4!
518

519
  if (mode != 0) {
4✔
520
    taos_set_conn_mode(script->taos, TAOS_CONN_MODE_BI, 1);
3✔
521
  } else {
522
    taos_set_conn_mode(script->taos, TAOS_CONN_MODE_BI, 0);
1✔
523
  }
524

525
  script->linePos++;
4✔
526
  return true;
4✔
527
}
528

529
bool simExecutePrintCmd(SScript *script, char *rest) {
17,006✔
530
  char buf[65536];
531

532
  simVisuallizeOption(script, rest, buf);
17,006✔
533
  rest = buf;
17,006✔
534

535
  simInfo("script:%s, %s", script->fileName, rest);
17,006!
536
  script->linePos++;
17,006✔
537
  return true;
17,006✔
538
}
539

540
bool simExecuteSleepCmd(SScript *script, char *option) {
3,186✔
541
  int32_t delta;
542
  char    buf[1024];
543

544
  simVisuallizeOption(script, option, buf);
3,186✔
545
  option = buf;
3,186✔
546

547
  delta = atoi(option);
3,186✔
548
  if (delta <= 0) delta = 5;
3,186!
549

550
  simInfo("script:%s, sleep %dms begin", script->fileName, delta);
3,186!
551
  taosMsleep(delta);
3,186✔
552
  simInfo("script:%s, sleep %dms finished", script->fileName, delta);
3,186!
553

554
  char sleepStr[32] = {0};
3,186✔
555
  sprintf(sleepStr, "sleep %d", delta);
3,186✔
556
  simLogSql(sleepStr, true);
3,186✔
557

558
  script->linePos++;
3,186✔
559
  return true;
3,186✔
560
}
561

562
bool simExecuteReturnCmd(SScript *script, char *option) {
752✔
563
  char buf[1024];
564

565
  simVisuallizeOption(script, option, buf);
752✔
566
  option = buf;
752✔
567

568
  int32_t ret = 1;
752✔
569
  if (option && option[0] != 0) ret = atoi(option);
752!
570

571
  if (ret < 0) {
752!
UNCOV
572
    sprintf(script->error, "lineNum:%d. error return %s", script->lines[script->linePos].lineNum, option);
×
UNCOV
573
    return false;
×
574
  } else {
575
    simInfo("script:%s, return cmd execute with:%d", script->fileName, ret);
752!
576
    script->linePos = script->numOfLines;
752✔
577
  }
578

579
  script->linePos++;
752✔
580
  return true;
752✔
581
}
582

583
void simVisuallizeOption(SScript *script, char *src, char *dst) {
465,764✔
584
  char   *var, *token, *value;
585
  int32_t dstLen, srcLen, tokenLen;
586

587
  dst[0] = 0, dstLen = 0;
465,764✔
588

589
  while (1) {
590
    var = strchr(src, '$');
7,153,966✔
591
    if (var == NULL) break;
3,809,865✔
592

593
#if 0
594
    if (var && ((var - src - 1) > 0) && *(var - 1) == '\\') {
595
      srcLen = (int32_t)(var - src - 1);
596
      memcpy(dst + dstLen, src, srcLen);
597
      dstLen += srcLen;
598
      src = var;
599
      break;
600
    }
601
#endif
602

603
    srcLen = (int32_t)(var - src);
3,344,101✔
604
    memcpy(dst + dstLen, src, srcLen);
3,344,101✔
605
    dstLen += srcLen;
3,344,101✔
606

607
    src = paGetToken(var + 1, &token, &tokenLen);
3,344,101✔
608
    value = simGetVariable(script, token, tokenLen);
3,344,101✔
609

610
    strcpy(dst + dstLen, value);
3,344,101✔
611
    dstLen += (int32_t)strlen(value);
3,344,101✔
612
  }
613

614
  strcpy(dst + dstLen, src);
465,764✔
615
}
465,764✔
616

617
void simCloseNativeConnect(SScript *script) {
1,717✔
618
  if (script->taos == NULL) return;
1,717✔
619

620
  simDebug("script:%s, taos:%p closed", script->fileName, script->taos);
905!
621
  taos_close(script->taos);
905✔
622

623
  script->taos = NULL;
905✔
624
}
625

626
void simCloseTaosdConnect(SScript *script) { simCloseNativeConnect(script); }
1,717✔
627

628
bool simCreateNativeConnect(SScript *script, char *user, char *pass) {
920✔
629
  simCloseTaosdConnect(script);
920✔
630
  void *taos = NULL;
920✔
631
  for (int32_t attempt = 0; attempt < 10; ++attempt) {
1,000✔
632
    if (abortExecution) {
992!
633
      script->killed = true;
×
634
      return false;
×
635
    }
636

637
    taos = taos_connect(NULL, user, pass, NULL, 0);
992✔
638
    if (taos == NULL) {
992✔
639
      simDebug("script:%s, user:%s connect taosd failed:%s, attempt:%d", script->fileName, user, taos_errstr(NULL),
80!
640
               attempt);
641
      taosMsleep(1000);
80✔
642
    } else {
643
      simDebug("script:%s, user:%s connect taosd successed, attempt:%d", script->fileName, user, attempt);
912!
644
      break;
912✔
645
    }
646
  }
647

648
  if (taos == NULL) {
920✔
649
    sprintf(script->error, "lineNum:%d. connect taosd failed:%s", script->lines[script->linePos].lineNum,
8✔
650
            taos_errstr(NULL));
651
    return false;
8✔
652
  }
653

654
  script->taos = taos;
912✔
655
  simDebug("script:%s, connect taosd successed, taos:%p", script->fileName, taos);
912!
656

657
  return true;
912✔
658
}
659

660
bool simCreateTaosdConnect(SScript *script, char *rest) {
920✔
661
  char   *user = TSDB_DEFAULT_USER;
920✔
662
  char   *token;
663
  int32_t tokenLen;
664
  rest = paGetToken(rest, &token, &tokenLen);
920✔
665
  rest = paGetToken(rest, &token, &tokenLen);
920✔
666
  if (tokenLen != 0) {
920✔
667
    user = token;
270✔
668
  }
669

670
  return simCreateNativeConnect(script, user, TSDB_DEFAULT_PASS);
920✔
671
}
672

673
bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
435,812✔
674
  char      timeStr[80] = {0};
435,812✔
675
  time_t    tt;
676
  struct tm tp;
677
  SCmdLine *line = &script->lines[script->linePos];
435,812✔
678
  int32_t   ret = -1;
435,812✔
679

680
  TAOS_RES *pSql = NULL;
435,812✔
681

682
  for (int32_t attempt = 0; attempt < 10; ++attempt) {
436,250!
683
    if (abortExecution) {
436,250!
684
      script->killed = true;
×
685
      return false;
×
686
    }
687

688
    simLogSql(rest, false);
436,250✔
689
    pSql = taos_query(script->taos, rest);
436,250✔
690
    ret = taos_errno(pSql);
436,250✔
691

692
    if (ret == TSDB_CODE_MND_STB_ALREADY_EXIST || ret == TSDB_CODE_MND_DB_ALREADY_EXIST) {
436,250✔
693
      simDebug("script:%s, taos:%p, %s success, ret:%d:%s", script->fileName, script->taos, rest, ret & 0XFFFF,
11!
694
               tstrerror(ret));
695
      ret = 0;
11✔
696
      break;
11✔
697
    } else if (ret != 0) {
436,239✔
698
      simDebug("script:%s, taos:%p, %s failed, ret:%d:%s", script->fileName, script->taos, rest, ret & 0XFFFF,
981!
699
               tstrerror(ret));
700

701
      if (line->errorJump == SQL_JUMP_TRUE) {
981✔
702
        script->linePos = line->jump;
543✔
703
        taos_free_result(pSql);
543✔
704
        return true;
543✔
705
      }
706
      taosMsleep(1000);
438✔
707
    } else {
708
      break;
435,258✔
709
    }
710

711
    taos_free_result(pSql);
438✔
712
  }
713

714
  if (ret) {
435,269!
715
    sprintf(script->error, "lineNum:%d. sql:%s failed, ret:%d:%s", line->lineNum, rest, ret & 0XFFFF, tstrerror(ret));
×
716
    return false;
×
717
  }
718

719
  int32_t numOfRows = 0;
435,269✔
720
  int32_t num_fields = taos_field_count(pSql);
435,269✔
721
  if (num_fields != 0) {
435,269✔
722
    TAOS_ROW row;
723

724
    while ((row = taos_fetch_row(pSql))) {
2,420,546✔
725
      if (numOfRows < MAX_QUERY_ROW_NUM) {
2,401,937✔
726
        TAOS_FIELD *fields = taos_fetch_fields(pSql);
329,730✔
727
        int32_t    *length = taos_fetch_lengths(pSql);
329,730✔
728

729
        for (int32_t i = 0; i < num_fields; i++) {
2,063,819✔
730
          char *value = NULL;
1,734,089✔
731
          if (i < MAX_QUERY_COL_NUM) {
1,734,089✔
732
            value = script->data[numOfRows][i];
1,715,515✔
733
          }
734
          if (value == NULL) {
1,734,089✔
735
            continue;
18,574✔
736
          }
737

738
          if (row[i] == 0) {
1,715,515✔
739
            strcpy(value, TSDB_DATA_NULL_STR);
130,365✔
740
            continue;
130,365✔
741
          }
742

743
          switch (fields[i].type) {
1,585,150✔
744
            case TSDB_DATA_TYPE_BOOL:
50,337✔
745
              sprintf(value, "%s", ((((int32_t)(*((char *)row[i]))) == 1) ? "1" : "0"));
50,337✔
746
              break;
50,337✔
747
            case TSDB_DATA_TYPE_TINYINT:
100,333✔
748
              sprintf(value, "%d", *((int8_t *)row[i]));
100,333✔
749
              break;
100,333✔
750
            case TSDB_DATA_TYPE_UTINYINT:
170✔
751
              sprintf(value, "%u", *((uint8_t *)row[i]));
170✔
752
              break;
170✔
753
            case TSDB_DATA_TYPE_SMALLINT:
97,821✔
754
              sprintf(value, "%d", *((int16_t *)row[i]));
97,821✔
755
              break;
97,821✔
756
            case TSDB_DATA_TYPE_USMALLINT:
168✔
757
              sprintf(value, "%u", *((uint16_t *)row[i]));
168✔
758
              break;
168✔
759
            case TSDB_DATA_TYPE_INT:
341,808✔
760
              sprintf(value, "%d", *((int32_t *)row[i]));
341,808✔
761
              break;
341,808✔
762
            case TSDB_DATA_TYPE_UINT:
548✔
763
              sprintf(value, "%u", *((uint32_t *)row[i]));
548✔
764
              break;
548✔
765
            case TSDB_DATA_TYPE_BIGINT:
189,755✔
766
              sprintf(value, "%" PRId64, *((int64_t *)row[i]));
189,755✔
767
              break;
189,755✔
768
            case TSDB_DATA_TYPE_UBIGINT:
4,834✔
769
              sprintf(value, "%" PRIu64, *((uint64_t *)row[i]));
4,834✔
770
              break;
4,834✔
771
            case TSDB_DATA_TYPE_FLOAT:
72,640✔
772
              sprintf(value, "%.5f", GET_FLOAT_VAL(row[i]));
72,640✔
773
              break;
72,640✔
774
            case TSDB_DATA_TYPE_DOUBLE:
107,570✔
775
              sprintf(value, "%.9lf", GET_DOUBLE_VAL(row[i]));
107,570✔
776
              break;
107,570✔
777
            case TSDB_DATA_TYPE_BINARY:
374,767✔
778
            case TSDB_DATA_TYPE_NCHAR:
779
            case TSDB_DATA_TYPE_GEOMETRY:
780
              if (length[i] < 0 || length[i] > 1 << 20) {
374,767!
781
                fprintf(stderr, "Invalid length(%d) of BINARY or NCHAR\n", length[i]);
×
782
                exit(-1);
×
783
              }
784

785
              memset(value, 0, MAX_QUERY_VALUE_LEN);
374,767✔
786
              memcpy(value, row[i], length[i]);
374,767✔
787
              value[length[i]] = 0;
374,767✔
788
              // snprintf(value, fields[i].bytes, "%s", (char *)row[i]);
789
              break;
374,767✔
790
            case TSDB_DATA_TYPE_TIMESTAMP: {
244,116✔
791
              int32_t precision = taos_result_precision(pSql);
244,116✔
792
              if (precision == TSDB_TIME_PRECISION_MILLI) {
244,116✔
793
                tt = (*(int64_t *)row[i]) / 1000;
243,690✔
794
              } else if (precision == TSDB_TIME_PRECISION_MICRO) {
426✔
795
                tt = (*(int64_t *)row[i]) / 1000000;
213✔
796
              } else {
797
                tt = (*(int64_t *)row[i]) / 1000000000;
213✔
798
              }
799

800
              if (taosLocalTime(&tt, &tp, timeStr, sizeof(timeStr)) == NULL) {
244,116!
801
                break;
×
802
              }
803
              strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", &tp);
244,116✔
804
              if (precision == TSDB_TIME_PRECISION_MILLI) {
244,116✔
805
                sprintf(value, "%s.%03d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000));
243,690✔
806
              } else if (precision == TSDB_TIME_PRECISION_MICRO) {
426✔
807
                sprintf(value, "%s.%06d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000000));
213✔
808
              } else {
809
                sprintf(value, "%s.%09d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000000000));
213✔
810
              }
811

812
              break;
244,116✔
813
            }
814
            default:
283✔
815
              break;
283✔
816
          }  // end of switch
817
        }    // end of for
818
      }      // end of if
819
      numOfRows++;
2,401,937✔
820
      if (isSlow && numOfRows % 100 == 0) {
2,401,937✔
821
        taosMsleep(200);
2✔
822
      }
823
      if (numOfRows > 2000000000) {
2,401,937!
824
        simError("script:%s, too many rows return from query", script->fileName);
×
825
        break;
×
826
      }
827
    }
828

829
  } else {
830
    numOfRows = taos_affected_rows(pSql);
416,660✔
831
  }
832

833
  taos_free_result(pSql);
435,269✔
834
  sprintf(script->rows, "%d", numOfRows);
435,269✔
835
  sprintf(script->cols, "%d", num_fields);
435,269✔
836

837
  script->linePos++;
435,269✔
838
  return true;
435,269✔
839
}
840

841
bool simExecuteSqlImpCmd(SScript *script, char *rest, bool isSlow) {
436,588✔
842
  char      buf[3000];
843
  SCmdLine *line = &script->lines[script->linePos];
436,588✔
844

845
  simVisuallizeOption(script, rest, buf);
436,588✔
846
  rest = buf;
436,588✔
847

848
  simDebug("script:%s, exec:%s", script->fileName, rest);
436,588!
849
  strcpy(script->rows, "-1");
436,588✔
850
  strcpy(script->cols, "-1");
436,588✔
851
  for (int32_t row = 0; row < MAX_QUERY_ROW_NUM; ++row) {
44,095,347✔
852
    for (int32_t col = 0; col < MAX_QUERY_COL_NUM; ++col) {
2,147,483,647✔
853
      strcpy(script->data[row][col], "null");
2,147,483,647✔
854
    }
855
  }
856

857
  if (strncmp(rest, "connect", 7) == 0) {
436,588✔
858
    if (!simCreateTaosdConnect(script, rest)) {
739✔
859
      return false;
8✔
860
    }
861
    script->linePos++;
731✔
862
    return true;
731✔
863
  }
864

865
  if (script->taos == NULL) {
435,849✔
866
    if (!simCreateTaosdConnect(script, "connect root")) {
181!
867
      if (line->errorJump == SQL_JUMP_TRUE) {
×
868
        script->linePos = line->jump;
×
869
        return true;
×
870
      }
871
      return false;
×
872
    }
873
  }
874

875
  if (strncmp(rest, "close", 5) == 0) {
435,849✔
876
    simCloseTaosdConnect(script);
37✔
877
    script->linePos++;
37✔
878
    return true;
37✔
879
  }
880

881
  return simExecuteNativeSqlCommand(script, rest, isSlow);
435,812✔
882
}
883

884
bool simExecuteSqlCmd(SScript *script, char *rest) {
436,587✔
885
  bool isSlow = false;
436,587✔
886
  return simExecuteSqlImpCmd(script, rest, isSlow);
436,587✔
887
}
888

889
bool simExecuteSqlSlowCmd(SScript *script, char *rest) {
1✔
890
  bool isSlow = true;
1✔
891
  return simExecuteSqlImpCmd(script, rest, isSlow);
1✔
892
}
893

894
#if 0
895
bool simExecuteRestfulCmd(SScript *script, char *rest) {
896
  TdFilePtr pFile = NULL;
897
  char      filename[256];
898
  sprintf(filename, "%s/tmp.sql", simScriptDir);
899
  // fp = fopen(filename, "w");
900
  pFile = taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM);
901
  if (pFile == NULL) {
902
    fprintf(stderr, "ERROR: failed to open file: %s\n", filename);
903
    return false;
904
  }
905

906
  char    db[64] = {0};
907
  char    tb[64] = {0};
908
  char    gzip[32] = {0};
909
  int32_t ts;
910
  int32_t times;
911
  sscanf(rest, "%s %s %d %d %s", db, tb, &ts, &times, gzip);
912

913
  taosFprintfFile(pFile, "insert into %s.%s values ", db, tb);
914
  for (int32_t i = 0; i < times; ++i) {
915
    taosFprintfFile(pFile, "(%d000, %d)", ts + i, ts);
916
  }
917
  taosFprintfFile(pFile, "  \n");
918
  taosFsyncFile(pFile);
919
  taosCloseFile(&pFile);
920

921
  char cmd[1024] = {0};
922
  if (strcmp(gzip, "gzip") == 0) {
923
    sprintf(cmd,
924
            "curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' --header "
925
            "--compressed --data-ascii @%s 127.0.0.1:7111/rest/sql",
926
            filename);
927
  } else {
928
    sprintf(cmd,
929
            "curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' --header "
930
            "'Transfer-Encoding: chunked' --data-ascii @%s 127.0.0.1:7111/rest/sql",
931
            filename);
932
  }
933

934
  return simExecuteSystemCmd(script, cmd);
935
}
936
#endif
937

938
bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
5,160✔
939
  char      buf[3000];
940
  SCmdLine *line = &script->lines[script->linePos];
5,160✔
941

942
  simVisuallizeOption(script, rest, buf);
5,160✔
943
  rest = buf;
5,160✔
944

945
  simDebug("script:%s, exec:%s", script->fileName, rest);
5,160!
946
  strcpy(script->rows, "-1");
5,160✔
947
  strcpy(script->cols, "-1");
5,160✔
948
  for (int32_t row = 0; row < MAX_QUERY_ROW_NUM; ++row) {
521,160✔
949
    for (int32_t col = 0; col < MAX_QUERY_COL_NUM; ++col) {
52,116,000✔
950
      strcpy(script->data[row][col], "null");
51,600,000✔
951
    }
952
  }
953

954
  TAOS_RES *pSql = taos_query(script->taos, rest);
5,160✔
955
  int32_t   ret = taos_errno(pSql);
5,160✔
956
  taos_free_result(pSql);
5,160✔
957

958
  if (ret != TSDB_CODE_SUCCESS) {
5,160!
959
    simDebug("script:%s, taos:%p, %s execute, expect failed, so success, ret:%d:%s", script->fileName, script->taos,
5,160!
960
             rest, ret & 0XFFFF, tstrerror(ret));
961
    script->linePos++;
5,160✔
962
    return true;
5,160✔
963
  }
964

965
  sprintf(script->error, "lineNum:%d. sql:%s expect failed, but success, ret:%d:%s", line->lineNum, rest, ret & 0XFFFF,
×
966
          tstrerror(ret));
967

968
  return false;
×
969
}
970

971
#if 0
972
bool simExecuteLineInsertCmd(SScript *script, char *rest) {
973
  char buf[TSDB_MAX_BINARY_LEN] = {0};
974

975
  simVisuallizeOption(script, rest, buf);
976
  rest = buf;
977

978
  SCmdLine *line = &script->lines[script->linePos];
979

980
  simInfo("script:%s, %s", script->fileName, rest);
981
  simLogSql(buf, true);
982
  char *lines[] = {rest};
983
#if 0
984
  int32_t ret = taos_insert_lines(script->taos, lines, 1);
985
    if (ret == TSDB_CODE_SUCCESS) {
986
    simDebug("script:%s, taos:%p, %s executed. success.", script->fileName, script->taos, rest);
987
    script->linePos++;
988
    return true;
989
  } else {
990
    sprintf(script->error, "lineNum: %d. line: %s failed, ret:%d:%s", line->lineNum, rest, ret & 0XFFFF,
991
            tstrerror(ret));
992
    return false;
993
  }
994
#else
995
  simDebug("script:%s, taos:%p, %s executed. success.", script->fileName, script->taos, rest);
996
  script->linePos++;
997
  return true;
998
#endif
999
}
1000

1001
bool simExecuteLineInsertErrorCmd(SScript *script, char *rest) {
1002
  char buf[TSDB_MAX_BINARY_LEN];
1003

1004
  simVisuallizeOption(script, rest, buf);
1005
  rest = buf;
1006

1007
  SCmdLine *line = &script->lines[script->linePos];
1008

1009
  simInfo("script:%s, %s", script->fileName, rest);
1010
  simLogSql(buf, true);
1011
  char *lines[] = {rest};
1012
#if 0
1013
  int32_t ret = taos_insert_lines(script->taos, lines, 1);
1014
#else
1015
  int32_t ret = 0;
1016
#endif
1017
  if (ret == TSDB_CODE_SUCCESS) {
1018
    sprintf(script->error, "script:%s, taos:%p, %s executed. expect failed, but success.", script->fileName,
1019
            script->taos, rest);
1020
    script->linePos++;
1021
    return false;
1022
  } else {
1023
    simDebug("lineNum: %d. line: %s failed, ret:%d:%s. Expect failed, so success", line->lineNum, rest, ret & 0XFFFF,
1024
             tstrerror(ret));
1025
    return true;
1026
  }
1027
}
1028
#endif
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