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

taosdata / TDengine / #3655

14 Mar 2025 08:10AM UTC coverage: 59.532% (+22.6%) from 36.951%
#3655

push

travis-ci

web-flow
feat(keep): support keep on super table level. (#30097)

* Feat: support use keep while create super table.

* Test(keep): add test for create super table with keep option.

* Feat(keep): Add tmsg for create keep.

* Feat(keep): support alter table option keep.

* Fix(keep): Add baisc test for alter table option.

* Fix(keep): memory leek.

* Feat(keep): add keep to metaEntry&metaCache and fix earliestTs with stn keep.

* Test(keep): add some cases for select with stb keep.

* Fix: fix ci core while alter stb.

* Feat(keep): delete expired data in super table level.

* Feat: remove get stb keep while query.

* Fix : build error.

* Revert "Fix : build error."

This reverts commit 0ed66e4e8.

* Revert "Feat(keep): delete expired data in super table level."

This reverts commit 36330f6b4.

* Fix : build errors.

* Feat : support restart taosd.

* Fix : alter table comment problems.

* Test : add tests for super table keep.

* Fix: change sdb stb reserve size.

* Test: add more tests.

* Feat: Disable normal tables and sub tables from setting the keep parameter

* Fix: add more checks to avoid unknown address.

* Docs: Add docs for stable keep.

* Fix: some review changes.

* Fix: review errors.

139898 of 302527 branches covered (46.24%)

Branch coverage included in aggregate %.

71 of 99 new or added lines in 12 files covered. (71.72%)

2746 existing lines in 57 files now uncovered.

220499 of 302857 relevant lines covered (72.81%)

5509252.7 hits per line

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

83.69
/source/util/src/tarray.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 "tarray.h"
18
#include "tcoding.h"
19

20
// todo refactor API
21
#define BOUNDARY_SIZE         1024 * 1024 * 1024  // 1G
22
#define BOUNDARY_SMALL_FACTOR 1.2
23
#define BOUNDARY_BIG_FACTOR   2
24

25
SArray* taosArrayInit(size_t size, size_t elemSize) {
378,291,658✔
26
  if (elemSize == 0) {
378,291,658✔
27
    terrno = TSDB_CODE_INVALID_PARA;
1✔
28
    return NULL;
1✔
29
  }
30

31
  if (size < TARRAY_MIN_SIZE) {
378,291,657✔
32
    size = TARRAY_MIN_SIZE;
81,226,166✔
33
  }
34

35
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
378,291,657!
36
  if (pArray == NULL) {
378,290,782!
37
    return NULL;
×
38
  }
39

40
  pArray->size = 0;
378,290,782✔
41
  pArray->pData = taosMemoryCalloc(size, elemSize);
378,290,782!
42
  if (pArray->pData == NULL) {
378,366,964!
43
    taosMemoryFree(pArray);
×
44
    return NULL;
×
45
  }
46

47
  pArray->capacity = size;
378,366,964✔
48
  pArray->elemSize = elemSize;
378,366,964✔
49
  return pArray;
378,366,964✔
50
}
51

52
SArray* taosArrayInit_s(size_t elemSize, size_t initialSize) {
519,695✔
53
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
519,695!
54
  if (pArray == NULL) {
519,696!
55
    return NULL;
×
56
  }
57

58
  pArray->size = initialSize;
519,696✔
59
  pArray->pData = taosMemoryCalloc(initialSize, elemSize);
519,696!
60
  if (pArray->pData == NULL) {
519,696!
61
    taosMemoryFree(pArray);
×
62
    return NULL;
×
63
  }
64

65
  pArray->capacity = initialSize;
519,696✔
66
  pArray->elemSize = elemSize;
519,696✔
67
  return pArray;
519,696✔
68
}
69

70
static int32_t taosArrayResize(SArray* pArray) {
14✔
71
  size_t size = pArray->capacity;
14✔
72
  size = (size << 1u);
14✔
73

74
  void* tmp = taosMemoryRealloc(pArray->pData, size * pArray->elemSize);
14!
75
  if (tmp == NULL) {  // reallocate failed, the original buffer remains
14!
76
    return terrno;
×
77
  }
78

79
  pArray->pData = tmp;
14✔
80
  pArray->capacity = size;
14✔
81

82
  return 0;
14✔
83
}
84

85
int32_t taosArrayEnsureCap(SArray* pArray, size_t newCap) {
1,972,386,039✔
86
  if (newCap > pArray->capacity) {
1,972,386,039✔
87
    float factor = BOUNDARY_BIG_FACTOR;
6,671,787✔
88
    if (newCap * pArray->elemSize > BOUNDARY_SIZE) {
6,671,787!
89
      factor = BOUNDARY_SMALL_FACTOR;
×
90
    }
91

92
    size_t tsize = (pArray->capacity * factor);
6,671,787✔
93
    while (newCap > tsize) {
6,762,441✔
94
      size_t newSize = (tsize * factor);
90,654✔
95
      tsize = (newSize == tsize) ? (tsize + 2) : newSize;
90,654!
96
    }
97

98
    char* p = taosMemoryRealloc(pArray->pData, tsize * pArray->elemSize);
6,671,787!
99
    if (p == NULL) {
6,673,584!
100
      return terrno;
×
101
    }
102

103
    pArray->pData = p;
6,673,584✔
104
    pArray->capacity = tsize;
6,673,584✔
105
  }
106
  return 0;
1,972,387,836✔
107
}
108

109
void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles) {
1,743,251,342✔
110
  if (pData == NULL) {
1,743,251,342✔
111
    terrno = TSDB_CODE_INVALID_PARA;
1✔
112
    return NULL;
1✔
113
  }
114

115
  int32_t code = taosArrayEnsureCap(pArray, pArray->size + nEles);
1,743,251,341✔
116
  if (code) {
1,744,133,618!
117
    terrno = code;
×
118
    return NULL;
×
119
  }
120

121
  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
1,750,570,839✔
122
  memcpy(dst, pData, pArray->elemSize * nEles);
1,750,570,839✔
123

124
  pArray->size += nEles;
1,750,570,839✔
125
  return dst;
1,750,570,839✔
126
}
127

128
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
51,001✔
129
  size_t size = pArray->size;
51,001✔
130
  if (size <= 1) {
51,001✔
131
    return;
44,910✔
132
  }
133

134
  int32_t pos = 0;
6,091✔
135
  for (int32_t i = 1; i < size; ++i) {
626,870✔
136
    char* p1 = taosArrayGet(pArray, pos);
620,778✔
137
    char* p2 = taosArrayGet(pArray, i);
620,778✔
138

139
    if (comparFn(p1, p2) == 0) {
620,779✔
140
      // do nothing
141
    } else {
142
      if (pos + 1 != i) {
523,861✔
143
        void* p = taosArrayGet(pArray, pos + 1);
14,698✔
144
        if (fp != NULL) {
14,698✔
145
          fp(p);
3✔
146
        }
147

148
        taosArraySet(pArray, pos + 1, p2);
14,698✔
149
        memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
14,698✔
150
        pos += 1;
14,698✔
151
      } else {
152
        pos += 1;
509,163✔
153
      }
154
    }
155
  }
156

157
  if (fp != NULL) {
6,092✔
158
    for (int32_t i = pos + 1; i < pArray->size; ++i) {
101✔
159
      void* p = taosArrayGet(pArray, i);
11✔
160
      fp(p);
11✔
161
    }
162
  }
163

164
  pArray->size = pos + 1;
6,137✔
165
}
166

167
void* taosArrayAddAll(SArray* pArray, const SArray* pInput) {
303,276✔
168
  if (pInput) {
303,276✔
169
    return taosArrayAddBatch(pArray, pInput->pData, (int32_t)taosArrayGetSize(pInput));
300,715✔
170
  } else {
171
    terrno = TSDB_CODE_INVALID_PARA;
2,561✔
172
    return NULL;
2,607✔
173
  }
174
}
175

176
void* taosArrayReserve(SArray* pArray, int32_t num) {
229,010,075✔
177
  int32_t code = taosArrayEnsureCap(pArray, pArray->size + num);
229,010,075✔
178
  if (code) {
228,930,860!
179
    terrno = code;
×
180
    return NULL;
×
181
  }
182

183
  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
228,965,469✔
184
  pArray->size += num;
228,965,469✔
185

186
  memset(dst, 0, num * pArray->elemSize);
228,965,469✔
187

188
  return dst;
228,965,469✔
189
}
190

191
void* taosArrayPop(SArray* pArray) {
18,429,787✔
192
  if (pArray->size == 0) {
18,429,787✔
193
    return NULL;
147,070✔
194
  }
195

196
  pArray->size -= 1;
18,282,717✔
197
  return TARRAY_GET_ELEM(pArray, pArray->size);
18,282,717✔
198
}
199

200
void* taosArrayGet(const SArray* pArray, size_t index) {
2,147,483,647✔
201
  if (NULL == pArray) {
2,147,483,647✔
202
    terrno = TSDB_CODE_INVALID_PARA;
52✔
203
    uError("failed to return value from array of null ptr");
52!
204
    return NULL;
52✔
205
  }
206

207
  if (index >= pArray->size) {
2,147,483,647✔
208
    uError("index is out of range, current:%" PRIzu " max:%" PRIzu, index, pArray->size);
1,409!
209
    terrno = TSDB_CODE_OUT_OF_RANGE;
1,409✔
210
    return NULL;
1,409✔
211
  }
212

213
  return TARRAY_GET_ELEM(pArray, index);
2,147,483,647✔
214
}
215

216
void* taosArrayGetP(const SArray* pArray, size_t index) {
347,571,046✔
217
  void** p = taosArrayGet(pArray, index);
347,571,046✔
218
  if (p == NULL) {
348,831,386✔
219
    return NULL;
1✔
220
  }
221
  return *p;
348,831,385✔
222
}
223

224
void* taosArrayGetLast(const SArray* pArray) {
66,661,433✔
225
  if (pArray->size == 0) {
66,661,433✔
226
    terrno = TSDB_CODE_INVALID_PARA;
1✔
227
    return NULL;
1✔
228
  }
229

230
  return TARRAY_GET_ELEM(pArray, pArray->size - 1);
66,661,432✔
231
}
232

233
size_t taosArrayGetSize(const SArray* pArray) {
2,147,483,647✔
234
  if (pArray == NULL) {
2,147,483,647✔
235
    return 0;
57,307,121✔
236
  }
237
  return TARRAY_SIZE(pArray);
2,147,483,647✔
238
}
239

240
void* taosArrayInsert(SArray* pArray, size_t index, const void* pData) {
8,302,886✔
241
  if (pArray == NULL || pData == NULL) {
8,302,886!
UNCOV
242
    terrno = TSDB_CODE_INVALID_PARA;
×
243
    return NULL;
1✔
244
  }
245

246
  if (index >= pArray->size) {
8,302,896✔
247
    return taosArrayPush(pArray, pData);
8,302,200✔
248
  }
249

250
  if (pArray->size >= pArray->capacity) {
690✔
251
    int32_t ret = taosArrayResize(pArray);
14✔
252
    if (ret < 0) {
14!
253
      terrno = ret;
×
254
      return NULL;
×
255
    }
256
  }
257

258
  void* dst = TARRAY_GET_ELEM(pArray, index);
690✔
259

260
  int32_t remain = (int32_t)(pArray->size - index);
690✔
261
  memmove((char*)dst + pArray->elemSize, (char*)dst, pArray->elemSize * remain);
690✔
262
  memcpy(dst, pData, pArray->elemSize);
690✔
263

264
  pArray->size += 1;
690✔
265

266
  return dst;
690✔
267
}
268

269
void taosArraySet(SArray* pArray, size_t index, void* pData) {
18,045,928✔
270
  if (index < pArray->size) {
18,045,928!
271
    memcpy(TARRAY_GET_ELEM(pArray, index), pData, pArray->elemSize);
18,051,233✔
272
  }
273
}
18,045,928✔
274

275
void taosArrayPopFrontBatch(SArray* pArray, size_t cnt) {
21,751✔
276
  if (cnt > pArray->size) {
21,751✔
277
    cnt = pArray->size;
1✔
278
  }
279

280
  pArray->size = pArray->size - cnt;
21,751✔
281
  if (pArray->size == 0 || cnt == 0) {
21,751✔
282
    return;
21,710✔
283
  }
284
  memmove(pArray->pData, (char*)pArray->pData + cnt * pArray->elemSize, pArray->size * pArray->elemSize);
41✔
285
}
286

287
void taosArrayPopTailBatch(SArray* pArray, size_t cnt) {
98,982✔
288
  if (cnt >= pArray->size) {
98,982✔
289
    cnt = pArray->size;
63,526✔
290
  }
291

292
  pArray->size = pArray->size - cnt;
98,982✔
293
}
98,982✔
294

295
void taosArrayRemove(SArray* pArray, size_t index) {
3,171,508✔
296
  if (!(index < pArray->size)) {
3,171,508!
297
    return;
×
298
  }
299

300
  if (index == pArray->size - 1) {
3,171,508✔
301
    void* t = taosArrayPop(pArray);
819,513✔
302
    return;
819,500✔
303
  }
304

305
  size_t remain = pArray->size - index - 1;
2,351,995✔
306
  memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + 1) * pArray->elemSize,
2,351,995✔
307
          remain * pArray->elemSize);
2,351,995✔
308
  pArray->size -= 1;
2,351,995✔
309
}
310

311
void taosArrayRemoveBatch(SArray* pArray, size_t index, size_t num, FDelete fp) {
162,384✔
312
  if (index + num <= pArray->size) {
162,384!
313
    if (fp) {
162,389✔
314
      for (int32_t i = 0; i < num; i++) {
321,619✔
315
        fp(taosArrayGet(pArray, index + i));
161,196✔
316
      }
317
    }
318

319
    memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + num) * pArray->elemSize,
162,394✔
320
            (pArray->size - index - num) * pArray->elemSize);
162,394✔
321
    pArray->size -= num;
162,394✔
322
  }
323
}
162,389✔
324

325
SArray* taosArrayFromList(const void* src, size_t size, size_t elemSize) {
1✔
326
  if (elemSize <= 0) {
1!
327
    terrno = TSDB_CODE_INVALID_PARA;
×
328
    return NULL;
×
329
  }
330

331
  SArray* pDst = taosArrayInit(size, elemSize);
1✔
332
  if (pDst) {
1!
333
    memcpy(pDst->pData, src, elemSize * size);
1✔
334
    pDst->size = size;
1✔
335
  }
336

337
  return pDst;
1✔
338
}
339

340
SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn) {
3,381,808✔
341
  if (NULL == pSrc) {
3,381,808✔
342
    terrno = TSDB_CODE_INVALID_PARA;
8,297✔
343
    return NULL;
8,297✔
344
  }
345

346
  if (pSrc->size == 0) {  // empty array list
3,373,511✔
347
    return taosArrayInit(8, pSrc->elemSize);
53,057✔
348
  }
349

350
  SArray* dst = taosArrayInit(pSrc->size, pSrc->elemSize);
3,320,454✔
351

352
  if (dst) {
3,320,666!
353
    if (fn == NULL) {
3,320,678✔
354
      memcpy(dst->pData, pSrc->pData, pSrc->elemSize * pSrc->size);
3,319,312✔
355
    } else {
356
      for (int32_t i = 0; i < pSrc->size; ++i) {
3,746✔
357
        void* p = fn(taosArrayGetP(pSrc, i));
2,333✔
358
        memcpy(((char*)dst->pData) + i * dst->elemSize, &p, dst->elemSize);
2,380✔
359
      }
360
    }
361

362
    dst->size = pSrc->size;
3,320,725✔
363
  }
364

365
  return dst;
3,320,713✔
366
}
367

368
void taosArrayClear(SArray* pArray) {
109,120,050✔
369
  if (pArray == NULL) return;
109,120,050✔
370
  pArray->size = 0;
92,796,021✔
371
}
372

373
void taosArrayClearEx(SArray* pArray, void (*fp)(void*)) {
3,909,550✔
374
  if (pArray == NULL) return;
3,909,550!
375
  if (fp == NULL) {
3,909,550✔
376
    pArray->size = 0;
1✔
377
    return;
1✔
378
  }
379

380
  for (int32_t i = 0; i < pArray->size; ++i) {
133,274,016✔
381
    fp(TARRAY_GET_ELEM(pArray, i));
129,364,448✔
382
  }
383

384
  pArray->size = 0;
3,909,568✔
385
}
386
void taosArrayClearP(SArray* pArray, void (*fp)(void*)) {
405✔
387
  // if (pArray == NULL) return;
388
  // if (fp == NULL) {
389
  //   pArray->size = 0;
390
  //   return;
391
  // }
392

393
  // for (int32_t i = 0; i < pArray->size; ++i) {
394
  //   fp(TARRAY_GET_ELEM(pArray, i));
395
  // }
396
  if (pArray) {
405!
397
    if (NULL == fp) {
405!
398
      for (int32_t i = 0; i < pArray->size; i++) {
422✔
399
        taosMemoryFree(*(void**)TARRAY_GET_ELEM(pArray, i));
17!
400
      }
401
    } else {
402
      for (int32_t i = 0; i < pArray->size; i++) {
×
403
        fp(*(void**)TARRAY_GET_ELEM(pArray, i));
×
404
      }
405
    }
406
  }
407
  taosArrayClear(pArray);
405✔
408
}
405✔
409

410
void taosArrayDestroy(SArray* pArray) {
661,203,063✔
411
  if (pArray) {
661,203,063✔
412
    taosMemoryFree(pArray->pData);
378,932,015!
413
    taosMemoryFree(pArray);
378,989,045!
414
  }
415
}
661,235,165✔
416

417
void taosArrayDestroyP(SArray* pArray, FDelete fp) {
156,802,311✔
418
  if (pArray) {
156,802,311✔
419
    if (NULL == fp) {
137,396,628✔
420
      for (int32_t i = 0; i < pArray->size; i++) {
6,829,381✔
421
        taosMemoryFree(*(void**)TARRAY_GET_ELEM(pArray, i));
2,137,978!
422
      }
423
    } else {
424
      for (int32_t i = 0; i < pArray->size; i++) {
264,018,070✔
425
        fp(*(void**)TARRAY_GET_ELEM(pArray, i));
131,312,614✔
426
      }
427
    }
428
    taosArrayDestroy(pArray);
137,396,859✔
429
  }
430
}
156,802,712✔
431

432
void taosArrayDestroyEx(SArray* pArray, FDelete fp) {
50,215,721✔
433
  if (pArray == NULL) {
50,215,721✔
434
    return;
27,475,934✔
435
  }
436

437
  if (fp == NULL) {
22,739,787✔
438
    taosArrayDestroy(pArray);
412,117✔
439
    return;
412,117✔
440
  }
441

442
  for (int32_t i = 0; i < pArray->size; ++i) {
94,863,571✔
443
    fp(TARRAY_GET_ELEM(pArray, i));
72,536,204✔
444
  }
445

446
  taosArrayDestroy(pArray);
22,327,367✔
447
}
448

449
void taosArraySort(SArray* pArray, __compar_fn_t compar) {
3,981,731✔
450
  taosSort(pArray->pData, pArray->size, pArray->elemSize, compar);
3,981,731✔
451
}
3,981,872✔
452

453
int32_t taosArrayMSort(SArray* pArray, __compar_fn_t compar) {
1,770✔
454
  return taosMergeSort(pArray->pData, pArray->size, pArray->elemSize, compar);
1,770✔
455
}
456

457
void* taosArraySearch(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
5,337,696✔
458
  return taosbsearch(key, pArray->pData, pArray->size, pArray->elemSize, comparFn, flags);
5,337,696✔
459
}
460

461
int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
1,972,768✔
462
  void* item = taosArraySearch(pArray, key, comparFn, flags);
1,972,768✔
463
  return item == NULL ? -1 : (int32_t)((char*)item - (char*)pArray->pData) / pArray->elemSize;
1,973,233✔
464
}
465

466
#ifdef BUILD_NO_CALL
467
static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) {
468
  void* key = taosArrayGetP(pArray, i);
469
  while (i < j) {
470
    while (i < j && fn(taosArrayGetP(pArray, j), key, userData) >= 0) {
471
      j--;
472
    }
473
    if (i < j) {
474
      void* a = taosArrayGetP(pArray, j);
475
      taosArraySet(pArray, i, &a);
476
    }
477
    while (i < j && fn(taosArrayGetP(pArray, i), key, userData) <= 0) {
478
      i++;
479
    }
480
    if (i < j) {
481
      void* a = taosArrayGetP(pArray, i);
482
      taosArraySet(pArray, j, &a);
483
    }
484
  }
485
  taosArraySet(pArray, i, &key);
486
  return i;
487
}
488

489
static void taosArrayQuicksortImpl(SArray* pArray, int32_t low, int32_t high, __ext_compar_fn_t fn, const void* param) {
490
  if (low < high) {
491
    int32_t idx = taosArrayPartition(pArray, low, high, fn, param);
492
    taosArrayQuicksortImpl(pArray, low, idx - 1, fn, param);
493
    taosArrayQuicksortImpl(pArray, idx + 1, high, fn, param);
494
  }
495
}
496

497
static void taosArrayQuickSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
498
  if (pArray->size <= 1) {
499
    return;
500
  }
501
  taosArrayQuicksortImpl(pArray, 0, (int32_t)(taosArrayGetSize(pArray) - 1), fn, param);
502
}
503

504
static void taosArrayInsertSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
505
  if (pArray->size <= 1) {
506
    return;
507
  }
508

509
  for (int32_t i = 1; i <= pArray->size - 1; ++i) {
510
    for (int32_t j = i; j > 0; --j) {
511
      if (fn(taosArrayGetP(pArray, j), taosArrayGetP(pArray, j - 1), param) == -1) {
512
        void* a = taosArrayGetP(pArray, j);
513
        void* b = taosArrayGetP(pArray, j - 1);
514
        taosArraySet(pArray, j - 1, &a);
515
        taosArraySet(pArray, j, &b);
516
      } else {
517
        break;
518
      }
519
    }
520
  }
521
}
522
#endif
523

524
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode) {
5,018✔
525
  int32_t tlen = 0;
5,018✔
526
  int32_t sz = pArray->size;
5,018✔
527
  tlen += taosEncodeFixedI32(buf, sz);
5,018✔
528
  for (int32_t i = 0; i < sz; i++) {
13,190✔
529
    void* data = taosArrayGetP(pArray, i);
8,172✔
530
    tlen += encode(buf, data);
8,172✔
531
  }
532
  return tlen;
5,018✔
533
}
534

535
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz, int8_t sver) {
1,956!
536
  int32_t sz;
537
  buf = taosDecodeFixedI32(buf, &sz);
1,956✔
538
  *pArray = taosArrayInit(sz, sizeof(void*));
1,956✔
539
  if (*pArray == NULL) {
1,956!
540
    return NULL;
×
541
  }
542
  for (int32_t i = 0; i < sz; i++) {
5,470✔
543
    void* data = taosMemoryCalloc(1, dataSz);
3,514!
544
    if (data == NULL) {
3,514!
545
      return NULL;
×
546
    }
547

548
    buf = decode(buf, data, sver);
3,514✔
549

550
    if (taosArrayPush(*pArray, &data) == NULL) {
7,028!
551
      taosMemoryFree(data);
×
552
      return NULL;
×
553
    }
554
  }
555
  return (void*)buf;
1,956✔
556
}
557

558
// todo remove it
559
// order array<type *>
560
int32_t taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
1✔
561
  return taosqsort(pArray->pData, pArray->size, pArray->elemSize, param, fn);
1✔
562
}
563

564
void taosArraySwap(SArray* a, SArray* b) {
24✔
565
  if (a == NULL || b == NULL) return;
24!
566
  size_t t = a->size;
24✔
567
  a->size = b->size;
24✔
568
  b->size = t;
24✔
569

570
  uint32_t cap = a->capacity;
24✔
571
  a->capacity = b->capacity;
24✔
572
  b->capacity = cap;
24✔
573

574
  uint32_t elem = a->elemSize;
24✔
575
  a->elemSize = b->elemSize;
24✔
576
  b->elemSize = elem;
24✔
577

578
  void* data = a->pData;
24✔
579
  a->pData = b->pData;
24✔
580
  b->pData = data;
24✔
581
}
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