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

taosdata / TDengine / #4908

30 Dec 2025 10:52AM UTC coverage: 65.386% (-0.2%) from 65.541%
#4908

push

travis-ci

web-flow
enh: drop multi-stream (#33962)

60 of 106 new or added lines in 4 files covered. (56.6%)

1330 existing lines in 113 files now uncovered.

193461 of 295877 relevant lines covered (65.39%)

115765274.47 hits per line

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

79.91
/source/dnode/vnode/src/tsdb/tsdbUtil.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 "tcompression.h"
17
#include "tdataformat.h"
18
#include "tsdb.h"
19
#include "tsdbDef.h"
20

21
int32_t tsdbGetColCmprAlgFromSet(SHashObj *set, int16_t colId, uint32_t *alg);
22

23
static int32_t tBlockDataCompressKeyPart(SBlockData *bData, SDiskDataHdr *hdr, SBuffer *buffer, SBuffer *assist,
24
                                         SColCompressInfo *pCompressExt);
25

26
// SMapData =======================================================================
27
void tMapDataReset(SMapData *pMapData) {
×
28
  pMapData->nItem = 0;
×
29
  pMapData->nData = 0;
×
30
}
×
31

32
void tMapDataClear(SMapData *pMapData) {
×
33
  tFree(pMapData->aOffset);
×
34
  tFree(pMapData->pData);
×
35
  pMapData->pData = NULL;
×
36
  pMapData->aOffset = NULL;
×
37
}
×
38

39
#ifdef BUILD_NO_CALL
40
int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(uint8_t *, void *)) {
41
  int32_t code = 0;
42
  int32_t offset = pMapData->nData;
43
  int32_t nItem = pMapData->nItem;
44

45
  pMapData->nItem++;
46
  pMapData->nData += tPutItemFn(NULL, pItem);
47

48
  // alloc
49
  code = tRealloc((uint8_t **)&pMapData->aOffset, sizeof(int32_t) * pMapData->nItem);
50
  if (code) goto _exit;
51
  code = tRealloc(&pMapData->pData, pMapData->nData);
52
  if (code) goto _exit;
53

54
  // put
55
  pMapData->aOffset[nItem] = offset;
56
  tPutItemFn(pMapData->pData + offset, pItem);
57

58
_exit:
59
  return code;
60
}
61

62
int32_t tMapDataCopy(SMapData *pFrom, SMapData *pTo) {
63
  int32_t code = 0;
64

65
  pTo->nItem = pFrom->nItem;
66
  pTo->nData = pFrom->nData;
67
  code = tRealloc((uint8_t **)&pTo->aOffset, sizeof(int32_t) * pFrom->nItem);
68
  if (code) goto _exit;
69
  code = tRealloc(&pTo->pData, pFrom->nData);
70
  if (code) goto _exit;
71
  memcpy(pTo->aOffset, pFrom->aOffset, sizeof(int32_t) * pFrom->nItem);
72
  memcpy(pTo->pData, pFrom->pData, pFrom->nData);
73

74
_exit:
75
  return code;
76
}
77

78
int32_t tMapDataSearch(SMapData *pMapData, void *pSearchItem, int32_t (*tGetItemFn)(uint8_t *, void *),
79
                       int32_t (*tItemCmprFn)(const void *, const void *), void *pItem) {
80
  int32_t code = 0;
81
  int32_t lidx = 0;
82
  int32_t ridx = pMapData->nItem - 1;
83
  int32_t midx;
84
  int32_t c;
85

86
  while (lidx <= ridx) {
87
    midx = (lidx + ridx) / 2;
88

89
    tMapDataGetItemByIdx(pMapData, midx, pItem, tGetItemFn);
90

91
    c = tItemCmprFn(pSearchItem, pItem);
92
    if (c == 0) {
93
      goto _exit;
94
    } else if (c < 0) {
95
      ridx = midx - 1;
96
    } else {
97
      lidx = midx + 1;
98
    }
99
  }
100

101
  code = TSDB_CODE_NOT_FOUND;
102

103
_exit:
104
  return code;
105
}
106
#endif
107

108
void tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t (*tGetItemFn)(uint8_t *, void *)) {
×
109
  int32_t r = tGetItemFn(pMapData->pData + pMapData->aOffset[idx], pItem);
×
110
}
×
111

112
#ifdef BUILD_NO_CALL
113
int32_t tMapDataToArray(SMapData *pMapData, int32_t itemSize, int32_t (*tGetItemFn)(uint8_t *, void *),
114
                        SArray **ppArray) {
115
  int32_t code = 0;
116

117
  SArray *pArray = taosArrayInit(pMapData->nItem, itemSize);
118
  if (pArray == NULL) {
119
    code = terrno;
120
    goto _exit;
121
  }
122

123
  for (int32_t i = 0; i < pMapData->nItem; i++) {
124
    tMapDataGetItemByIdx(pMapData, i, taosArrayReserve(pArray, 1), tGetItemFn);
125
  }
126

127
_exit:
128
  *ppArray = pArray;
129
  return code;
130
}
131

132
int32_t tPutMapData(uint8_t *p, SMapData *pMapData) {
133
  int32_t n = 0;
134

135
  n += tPutI32v(p ? p + n : p, pMapData->nItem);
136
  if (pMapData->nItem) {
137
    int32_t lOffset = 0;
138
    for (int32_t iItem = 0; iItem < pMapData->nItem; iItem++) {
139
      n += tPutI32v(p ? p + n : p, pMapData->aOffset[iItem] - lOffset);
140
      lOffset = pMapData->aOffset[iItem];
141
    }
142

143
    n += tPutI32v(p ? p + n : p, pMapData->nData);
144
    if (p) {
145
      memcpy(p + n, pMapData->pData, pMapData->nData);
146
    }
147
    n += pMapData->nData;
148
  }
149

150
  return n;
151
}
152
#endif
153

154
int32_t tGetMapData(uint8_t *p, SMapData *pMapData, int32_t *decodedSize) {
×
155
  int32_t n = 0;
×
156
  int32_t code;
157
  int32_t offset;
158

159
  tMapDataReset(pMapData);
×
160

161
  n += tGetI32v(p + n, &pMapData->nItem);
×
162
  if (pMapData->nItem) {
×
163
    code = tRealloc((uint8_t **)&pMapData->aOffset, sizeof(int32_t) * pMapData->nItem);
×
164
    if (code) {
×
165
      return code;
×
166
    }
167

168
    int32_t lOffset = 0;
×
169
    for (int32_t iItem = 0; iItem < pMapData->nItem; iItem++) {
×
170
      n += tGetI32v(p + n, &pMapData->aOffset[iItem]);
×
171
      pMapData->aOffset[iItem] += lOffset;
×
172
      lOffset = pMapData->aOffset[iItem];
×
173
    }
174

175
    n += tGetI32v(p + n, &pMapData->nData);
×
176
    code = tRealloc(&pMapData->pData, pMapData->nData);
×
177
    if (code) {
×
178
      return code;
×
179
    }
180
    memcpy(pMapData->pData, p + n, pMapData->nData);
×
181
    n += pMapData->nData;
×
182
  }
183

184
  if (decodedSize) {
×
185
    *decodedSize = n;
×
186
  }
187

188
  return 0;
×
189
}
190

191
#ifdef BUILD_NO_CALL
192
// TABLEID =======================================================================
193
int32_t tTABLEIDCmprFn(const void *p1, const void *p2) {
194
  TABLEID *pId1 = (TABLEID *)p1;
195
  TABLEID *pId2 = (TABLEID *)p2;
196

197
  if (pId1->suid < pId2->suid) {
198
    return -1;
199
  } else if (pId1->suid > pId2->suid) {
200
    return 1;
201
  }
202

203
  if (pId1->uid < pId2->uid) {
204
    return -1;
205
  } else if (pId1->uid > pId2->uid) {
206
    return 1;
207
  }
208

209
  return 0;
210
}
211

212
// SBlockIdx ======================================================
213
int32_t tPutBlockIdx(uint8_t *p, void *ph) {
214
  int32_t    n = 0;
215
  SBlockIdx *pBlockIdx = (SBlockIdx *)ph;
216

217
  n += tPutI64(p ? p + n : p, pBlockIdx->suid);
218
  n += tPutI64(p ? p + n : p, pBlockIdx->uid);
219
  n += tPutI64v(p ? p + n : p, pBlockIdx->offset);
220
  n += tPutI64v(p ? p + n : p, pBlockIdx->size);
221

222
  return n;
223
}
224
#endif
225

226
int32_t tGetBlockIdx(uint8_t *p, void *ph) {
×
227
  int32_t    n = 0;
×
228
  SBlockIdx *pBlockIdx = (SBlockIdx *)ph;
×
229

230
  n += tGetI64(p + n, &pBlockIdx->suid);
×
231
  n += tGetI64(p + n, &pBlockIdx->uid);
×
232
  n += tGetI64v(p + n, &pBlockIdx->offset);
×
233
  n += tGetI64v(p + n, &pBlockIdx->size);
×
234

235
  return n;
×
236
}
237

238
#ifdef BUILD_NO_CALL
239
int32_t tCmprBlockIdx(void const *lhs, void const *rhs) {
240
  SBlockIdx *lBlockIdx = (SBlockIdx *)lhs;
241
  SBlockIdx *rBlockIdx = (SBlockIdx *)rhs;
242

243
  if (lBlockIdx->suid < rBlockIdx->suid) {
244
    return -1;
245
  } else if (lBlockIdx->suid > rBlockIdx->suid) {
246
    return 1;
247
  }
248

249
  if (lBlockIdx->uid < rBlockIdx->uid) {
250
    return -1;
251
  } else if (lBlockIdx->uid > rBlockIdx->uid) {
252
    return 1;
253
  }
254

255
  return 0;
256
}
257

258
int32_t tCmprBlockL(void const *lhs, void const *rhs) {
259
  SBlockIdx *lBlockIdx = (SBlockIdx *)lhs;
260
  SSttBlk   *rBlockL = (SSttBlk *)rhs;
261

262
  if (lBlockIdx->suid < rBlockL->suid) {
263
    return -1;
264
  } else if (lBlockIdx->suid > rBlockL->suid) {
265
    return 1;
266
  }
267

268
  if (lBlockIdx->uid < rBlockL->minUid) {
269
    return -1;
270
  } else if (lBlockIdx->uid > rBlockL->maxUid) {
271
    return 1;
272
  }
273

274
  return 0;
275
}
276

277
// SDataBlk ======================================================
278
void tDataBlkReset(SDataBlk *pDataBlk) {
279
  *pDataBlk = (SDataBlk){.minKey = TSDBKEY_MAX, .maxKey = TSDBKEY_MIN, .minVer = VERSION_MAX, .maxVer = VERSION_MIN};
280
}
281

282
int32_t tPutDataBlk(uint8_t *p, void *ph) {
283
  int32_t   n = 0;
284
  SDataBlk *pDataBlk = (SDataBlk *)ph;
285

286
  n += tPutI64v(p ? p + n : p, pDataBlk->minKey.version);
287
  n += tPutI64v(p ? p + n : p, pDataBlk->minKey.ts);
288
  n += tPutI64v(p ? p + n : p, pDataBlk->maxKey.version);
289
  n += tPutI64v(p ? p + n : p, pDataBlk->maxKey.ts);
290
  n += tPutI64v(p ? p + n : p, pDataBlk->minVer);
291
  n += tPutI64v(p ? p + n : p, pDataBlk->maxVer);
292
  n += tPutI32v(p ? p + n : p, pDataBlk->nRow);
293
  n += tPutI8(p ? p + n : p, pDataBlk->hasDup);
294
  n += tPutI8(p ? p + n : p, pDataBlk->nSubBlock);
295
  for (int8_t iSubBlock = 0; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) {
296
    n += tPutI64v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].offset);
297
    n += tPutI32v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].szBlock);
298
    n += tPutI32v(p ? p + n : p, pDataBlk->aSubBlock[iSubBlock].szKey);
299
  }
300
  if (pDataBlk->nSubBlock == 1 && !pDataBlk->hasDup) {
301
    n += tPutI64v(p ? p + n : p, pDataBlk->smaInfo.offset);
302
    n += tPutI32v(p ? p + n : p, pDataBlk->smaInfo.size);
303
  }
304

305
  return n;
306
}
307
#endif
308

309
int32_t tGetDataBlk(uint8_t *p, void *ph) {
×
310
  int32_t   n = 0;
×
311
  SDataBlk *pDataBlk = (SDataBlk *)ph;
×
312

313
  n += tGetI64v(p + n, &pDataBlk->minKey.version);
×
314
  n += tGetI64v(p + n, &pDataBlk->minKey.ts);
×
315
  n += tGetI64v(p + n, &pDataBlk->maxKey.version);
×
316
  n += tGetI64v(p + n, &pDataBlk->maxKey.ts);
×
317
  n += tGetI64v(p + n, &pDataBlk->minVer);
×
318
  n += tGetI64v(p + n, &pDataBlk->maxVer);
×
319
  n += tGetI32v(p + n, &pDataBlk->nRow);
×
320
  n += tGetI8(p + n, &pDataBlk->hasDup);
×
321
  n += tGetI8(p + n, &pDataBlk->nSubBlock);
×
322
  for (int8_t iSubBlock = 0; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) {
×
323
    n += tGetI64v(p + n, &pDataBlk->aSubBlock[iSubBlock].offset);
×
324
    n += tGetI32v(p + n, &pDataBlk->aSubBlock[iSubBlock].szBlock);
×
325
    n += tGetI32v(p + n, &pDataBlk->aSubBlock[iSubBlock].szKey);
×
326
  }
327
  if (pDataBlk->nSubBlock == 1 && !pDataBlk->hasDup) {
×
328
    n += tGetI64v(p + n, &pDataBlk->smaInfo.offset);
×
329
    n += tGetI32v(p + n, &pDataBlk->smaInfo.size);
×
330
  } else {
331
    pDataBlk->smaInfo.offset = 0;
×
332
    pDataBlk->smaInfo.size = 0;
×
333
  }
334

335
  return n;
×
336
}
337

338
#ifdef BUILD_NO_CALL
339
int32_t tDataBlkCmprFn(const void *p1, const void *p2) {
340
  SDataBlk *pBlock1 = (SDataBlk *)p1;
341
  SDataBlk *pBlock2 = (SDataBlk *)p2;
342

343
  if (tsdbKeyCmprFn(&pBlock1->maxKey, &pBlock2->minKey) < 0) {
344
    return -1;
345
  } else if (tsdbKeyCmprFn(&pBlock1->minKey, &pBlock2->maxKey) > 0) {
346
    return 1;
347
  }
348

349
  return 0;
350
}
351

352
bool tDataBlkHasSma(SDataBlk *pDataBlk) {
353
  if (pDataBlk->nSubBlock > 1) return false;
354
  if (pDataBlk->hasDup) return false;
355

356
  return pDataBlk->smaInfo.size > 0;
357
}
358

359
// SSttBlk ======================================================
360
int32_t tPutSttBlk(uint8_t *p, void *ph) {
361
  int32_t  n = 0;
362
  SSttBlk *pSttBlk = (SSttBlk *)ph;
363

364
  n += tPutI64(p ? p + n : p, pSttBlk->suid);
365
  n += tPutI64(p ? p + n : p, pSttBlk->minUid);
366
  n += tPutI64(p ? p + n : p, pSttBlk->maxUid);
367
  n += tPutI64v(p ? p + n : p, pSttBlk->minKey);
368
  n += tPutI64v(p ? p + n : p, pSttBlk->maxKey);
369
  n += tPutI64v(p ? p + n : p, pSttBlk->minVer);
370
  n += tPutI64v(p ? p + n : p, pSttBlk->maxVer);
371
  n += tPutI32v(p ? p + n : p, pSttBlk->nRow);
372
  n += tPutI64v(p ? p + n : p, pSttBlk->bInfo.offset);
373
  n += tPutI32v(p ? p + n : p, pSttBlk->bInfo.szBlock);
374
  n += tPutI32v(p ? p + n : p, pSttBlk->bInfo.szKey);
375

376
  return n;
377
}
378
#endif
379

380
int32_t tGetSttBlk(uint8_t *p, void *ph) {
×
381
  int32_t  n = 0;
×
382
  SSttBlk *pSttBlk = (SSttBlk *)ph;
×
383

384
  n += tGetI64(p + n, &pSttBlk->suid);
×
385
  n += tGetI64(p + n, &pSttBlk->minUid);
×
386
  n += tGetI64(p + n, &pSttBlk->maxUid);
×
387
  n += tGetI64v(p + n, &pSttBlk->minKey);
×
388
  n += tGetI64v(p + n, &pSttBlk->maxKey);
×
389
  n += tGetI64v(p + n, &pSttBlk->minVer);
×
390
  n += tGetI64v(p + n, &pSttBlk->maxVer);
×
391
  n += tGetI32v(p + n, &pSttBlk->nRow);
×
392
  n += tGetI64v(p + n, &pSttBlk->bInfo.offset);
×
393
  n += tGetI32v(p + n, &pSttBlk->bInfo.szBlock);
×
394
  n += tGetI32v(p + n, &pSttBlk->bInfo.szKey);
×
395

396
  return n;
×
397
}
398

399
// SBlockCol ======================================================
400

401
static const int32_t BLOCK_WITH_ALG_VER = 2;
402

403
int32_t tPutBlockCol(SBuffer *buffer, const SBlockCol *pBlockCol, int32_t ver, uint32_t defaultCmprAlg) {
386,707,764✔
404
  int32_t code;
405

406
  if ((code = tBufferPutI16v(buffer, pBlockCol->cid))) return code;
773,414,622✔
407
  if ((code = tBufferPutI8(buffer, pBlockCol->type))) return code;
773,413,306✔
408
  if ((code = tBufferPutI8(buffer, pBlockCol->cflag))) return code;
773,424,889✔
409
  if ((code = tBufferPutI8(buffer, pBlockCol->flag))) return code;
773,434,032✔
410
  if ((code = tBufferPutI32v(buffer, pBlockCol->szOrigin))) return code;
773,432,740✔
411

412
  if (pBlockCol->flag != HAS_NULL) {
386,717,149✔
413
    if (pBlockCol->flag != HAS_VALUE) {
370,646,043✔
414
      if ((code = tBufferPutI32v(buffer, pBlockCol->szBitmap))) return code;
49,356,310✔
415
    }
416

417
    if (IS_VAR_DATA_TYPE(pBlockCol->type)) {
370,644,823✔
418
      if ((code = tBufferPutI32v(buffer, pBlockCol->szOffset))) return code;
94,774,588✔
419
    }
420

421
    if (pBlockCol->flag != (HAS_NULL | HAS_NONE)) {
370,661,502✔
422
      if ((code = tBufferPutI32v(buffer, pBlockCol->szValue))) return code;
741,077,125✔
423
    }
424

425
    if ((code = tBufferPutI32v(buffer, pBlockCol->offset))) return code;
741,232,590✔
426
  }
427
  if (ver >= BLOCK_WITH_ALG_VER) {
386,692,677✔
428
    if ((code = tBufferPutU32(buffer, pBlockCol->alg))) return code;
773,410,958✔
429
  } else {
430
    if ((code = tBufferPutU32(buffer, defaultCmprAlg))) return code;
×
431
  }
432
  return 0;
386,718,281✔
433
}
434

435
int32_t tGetBlockCol(SBufferReader *br, SBlockCol *pBlockCol, int32_t ver, uint32_t defaultCmprAlg) {
1,283,658,917✔
436
  int32_t code;
437

438
  if ((code = tBufferGetI16v(br, &pBlockCol->cid))) return code;
1,283,658,917✔
439
  if ((code = tBufferGetI8(br, &pBlockCol->type))) return code;
1,283,827,906✔
440
  if ((code = tBufferGetI8(br, &pBlockCol->cflag))) return code;
1,283,884,748✔
441
  if ((code = tBufferGetI8(br, &pBlockCol->flag))) return code;
1,283,900,474✔
442
  if ((code = tBufferGetI32v(br, &pBlockCol->szOrigin))) return code;
1,283,923,639✔
443

444
  pBlockCol->szBitmap = 0;
1,283,900,501✔
445
  pBlockCol->szOffset = 0;
1,283,898,530✔
446
  pBlockCol->szValue = 0;
1,283,872,219✔
447
  pBlockCol->offset = 0;
1,283,863,011✔
448

449
  if (pBlockCol->flag != HAS_NULL) {
1,283,836,776✔
450
    if (pBlockCol->flag != HAS_VALUE) {
1,199,510,246✔
451
      if ((code = tBufferGetI32v(br, &pBlockCol->szBitmap))) return code;
323,228,524✔
452
    }
453

454
    if (IS_VAR_DATA_TYPE(pBlockCol->type)) {
1,199,480,588✔
455
      if ((code = tBufferGetI32v(br, &pBlockCol->szOffset))) return code;
180,763,515✔
456
    }
457

458
    if (pBlockCol->flag != (HAS_NULL | HAS_NONE)) {
1,199,522,105✔
459
      if ((code = tBufferGetI32v(br, &pBlockCol->szValue))) return code;
1,199,208,459✔
460
    }
461

462
    if ((code = tBufferGetI32v(br, &pBlockCol->offset))) return code;
1,199,491,143✔
463
  }
464

465
  if (ver >= BLOCK_WITH_ALG_VER) {
1,283,899,387✔
466
    if ((code = tBufferGetU32(br, &pBlockCol->alg))) return code;
1,283,899,387✔
467
  } else {
468
    pBlockCol->alg = defaultCmprAlg;
×
469
  }
470

471
  return 0;
1,283,923,236✔
472
}
473

474
#ifdef BUILD_NO_CALL
475
int32_t tBlockColCmprFn(const void *p1, const void *p2) {
476
  if (((SBlockCol *)p1)->cid < ((SBlockCol *)p2)->cid) {
477
    return -1;
478
  } else if (((SBlockCol *)p1)->cid > ((SBlockCol *)p2)->cid) {
479
    return 1;
480
  }
481

482
  return 0;
483
}
484

485
// SDelIdx ======================================================
486
int32_t tCmprDelIdx(void const *lhs, void const *rhs) {
487
  SDelIdx *lDelIdx = (SDelIdx *)lhs;
488
  SDelIdx *rDelIdx = (SDelIdx *)rhs;
489

490
  if (lDelIdx->suid < rDelIdx->suid) {
491
    return -1;
492
  } else if (lDelIdx->suid > rDelIdx->suid) {
493
    return 1;
494
  }
495

496
  if (lDelIdx->uid < rDelIdx->uid) {
497
    return -1;
498
  } else if (lDelIdx->uid > rDelIdx->uid) {
499
    return 1;
500
  }
501

502
  return 0;
503
}
504

505
int32_t tPutDelIdx(uint8_t *p, void *ph) {
506
  SDelIdx *pDelIdx = (SDelIdx *)ph;
507
  int32_t  n = 0;
508

509
  n += tPutI64(p ? p + n : p, pDelIdx->suid);
510
  n += tPutI64(p ? p + n : p, pDelIdx->uid);
511
  n += tPutI64v(p ? p + n : p, pDelIdx->offset);
512
  n += tPutI64v(p ? p + n : p, pDelIdx->size);
513

514
  return n;
515
}
516
#endif
517

518
int32_t tGetDelIdx(uint8_t *p, void *ph) {
×
519
  SDelIdx *pDelIdx = (SDelIdx *)ph;
×
520
  int32_t  n = 0;
×
521

522
  n += tGetI64(p + n, &pDelIdx->suid);
×
523
  n += tGetI64(p + n, &pDelIdx->uid);
×
524
  n += tGetI64v(p + n, &pDelIdx->offset);
×
525
  n += tGetI64v(p + n, &pDelIdx->size);
×
526

527
  return n;
×
528
}
529

530
#ifdef BUILD_NO_CALL
531
// SDelData ======================================================
532
int32_t tPutDelData(uint8_t *p, void *ph) {
533
  SDelData *pDelData = (SDelData *)ph;
534
  int32_t   n = 0;
535

536
  n += tPutI64v(p ? p + n : p, pDelData->version);
537
  n += tPutI64(p ? p + n : p, pDelData->sKey);
538
  n += tPutI64(p ? p + n : p, pDelData->eKey);
539

540
  return n;
541
}
542
#endif
543

544
int32_t tGetDelData(uint8_t *p, void *ph) {
×
545
  SDelData *pDelData = (SDelData *)ph;
×
546
  int32_t   n = 0;
×
547

548
  n += tGetI64v(p + n, &pDelData->version);
×
549
  n += tGetI64(p + n, &pDelData->sKey);
×
550
  n += tGetI64(p + n, &pDelData->eKey);
×
551

552
  return n;
×
553
}
554

555
int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision) {
150,614,828✔
556
  int64_t fid;
557
  if (key < 0) {
150,614,828✔
558
    fid = ((key + 1) / tsTickPerMin[precision] / minutes - 1);
1,108,665✔
559
    return (fid < INT32_MIN) ? INT32_MIN : (int32_t)fid;
1,109,910✔
560
  } else {
561
    fid = ((key / tsTickPerMin[precision] / minutes));
149,506,163✔
562
    return (fid > INT32_MAX) ? INT32_MAX : (int32_t)fid;
149,594,075✔
563
  }
564
}
565

566
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey) {
502,544,128✔
567
  *minKey = tsTickPerMin[precision] * fid * minutes;
502,544,128✔
568
  *maxKey = *minKey + tsTickPerMin[precision] * minutes - 1;
502,602,651✔
569
}
502,623,408✔
570

571
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t nowSec) {
17,237,658✔
572
  int32_t aFid[3];
573
  TSKEY   key;
574

575
  if (pKeepCfg->precision == TSDB_TIME_PRECISION_MILLI) {
17,237,658✔
576
    nowSec = nowSec * 1000;
17,211,517✔
577
  } else if (pKeepCfg->precision == TSDB_TIME_PRECISION_MICRO) {
33,114✔
578
    nowSec = nowSec * 1000000l;
18,700✔
579
  } else if (pKeepCfg->precision == TSDB_TIME_PRECISION_NANO) {
18,122✔
580
    nowSec = nowSec * 1000000000l;
18,122✔
581
  } else {
UNCOV
582
    tsdbError("invalid time precision:%d", pKeepCfg->precision);
×
583
    return 0;
×
584
  }
585

586
  nowSec = nowSec - pKeepCfg->keepTimeOffset * tsTickPerHour[pKeepCfg->precision];
17,248,339✔
587

588
  key = nowSec - pKeepCfg->keep0 * tsTickPerMin[pKeepCfg->precision];
17,249,359✔
589
  aFid[0] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision);
17,252,991✔
590
  key = nowSec - pKeepCfg->keep1 * tsTickPerMin[pKeepCfg->precision];
17,254,015✔
591
  aFid[1] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision);
17,255,837✔
592
  key = nowSec - pKeepCfg->keep2 * tsTickPerMin[pKeepCfg->precision];
17,258,187✔
593
  aFid[2] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision);
17,257,223✔
594

595
  if (fid >= aFid[0]) {
17,259,804✔
596
    return 0;
17,055,817✔
597
  } else if (fid >= aFid[1]) {
203,987✔
598
    return 1;
113,768✔
599
  } else if (fid >= aFid[2]) {
90,219✔
600
    return 2;
87,419✔
601
  } else {
602
    return -1;
2,800✔
603
  }
604
}
605

606
// TSDBROW ======================================================
607
void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
2,147,483,647✔
608
  int32_t   code = 0;
2,147,483,647✔
609
  STColumn *pTColumn = &pTSchema->columns[iCol];
2,147,483,647✔
610
  SValue    value;
611

612
  if (pRow->type == TSDBROW_ROW_FMT) {
2,147,483,647✔
613
    int32_t ret = tRowGet(pRow->pTSRow, pTSchema, iCol, pColVal);
2,147,483,647✔
614
    if (ret != 0) {
2,147,483,647✔
615
      tsdbError("failed to get column value, code:%d", ret);
×
616
    }
617
  } else if (pRow->type == TSDBROW_COL_FMT) {
2,147,483,647✔
618
    if (iCol == 0) {
2,147,483,647✔
619
      SValue val = {.type = TSDB_DATA_TYPE_TIMESTAMP};
×
620
      VALUE_SET_TRIVIAL_DATUM(&val, pRow->pBlockData->aTSKEY[pRow->iRow]);
×
621
      *pColVal = COL_VAL_VALUE(PRIMARYKEY_TIMESTAMP_COL_ID, val);
×
622
    } else {
623
      SColData *pColData = tBlockDataGetColData(pRow->pBlockData, pTColumn->colId);
2,147,483,647✔
624
      if (pColData) {
2,147,483,647✔
625
        if (tColDataGetValue(pColData, pRow->iRow, pColVal) != 0) {
2,147,483,647✔
626
          tsdbError("failed to tColDataGetValue");
×
627
        }
628
      } else {
629
        *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
2,147,483,647✔
630
      }
631
    }
632
  }
633
}
2,147,483,647✔
634

635
void tsdbRowGetKey(TSDBROW *row, STsdbRowKey *key) {
2,147,483,647✔
636
  if (row->type == TSDBROW_ROW_FMT) {
2,147,483,647✔
637
    key->version = row->version;
2,147,483,647✔
638
    tRowGetKey(row->pTSRow, &key->key);
2,147,483,647✔
639
  } else {
640
    key->version = row->pBlockData->aVersion[row->iRow];
2,147,483,647✔
641
    tColRowGetKey(row->pBlockData, row->iRow, &key->key);
2,147,483,647✔
642
  }
643
}
2,147,483,647✔
644

645
void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
2,147,483,647✔
646
  for (int32_t i = 0; i < pBlock->nColData; i++) {
2,147,483,647✔
647
    SColData *pColData = &pBlock->aColData[i];
2,147,483,647✔
648
    if (pColData->cflag & COL_IS_KEY) {
2,147,483,647✔
649
      SColVal cv;
124,525,556✔
650
      if (tColDataGetValue(pColData, irow, &cv) != 0) {
124,526,060✔
651
        break;
×
652
      }
653
      key->pks[key->numOfPKs] = cv.value;
124,526,892✔
654
      key->numOfPKs++;
124,528,110✔
655
    } else {
656
      break;
2,147,483,647✔
657
    }
658
  }
659
}
2,147,483,647✔
660

661
int32_t tsdbRowKeyCmpr(const STsdbRowKey *key1, const STsdbRowKey *key2) {
2,147,483,647✔
662
  int32_t c = tRowKeyCompare(&key1->key, &key2->key);
2,147,483,647✔
663

664
  if (c) {
2,147,483,647✔
665
    return c;
2,147,483,647✔
666
  }
667

668
  if (key1->version < key2->version) {
2,147,483,647✔
669
    return -1;
2,147,483,647✔
670
  } else if (key1->version > key2->version) {
2,147,483,647✔
671
    return 1;
2,147,483,647✔
672
  }
673
  return 0;
128,288✔
674
}
675

676
int32_t tsdbRowCompare(const void *p1, const void *p2) {
2,147,483,647✔
677
  STsdbRowKey key1, key2;
2,147,483,647✔
678

679
  tsdbRowGetKey((TSDBROW *)p1, &key1);
2,147,483,647✔
680
  tsdbRowGetKey((TSDBROW *)p2, &key2);
2,147,483,647✔
681
  return tsdbRowKeyCmpr(&key1, &key2);
2,147,483,647✔
682
}
683

684
int32_t tsdbRowCompareWithoutVersion(const void *p1, const void *p2) {
2,147,483,647✔
685
  STsdbRowKey key1, key2;
2,147,483,647✔
686

687
  tsdbRowGetKey((TSDBROW *)p1, &key1);
2,147,483,647✔
688
  tsdbRowGetKey((TSDBROW *)p2, &key2);
2,147,483,647✔
689
  return tRowKeyCompare(&key1.key, &key2.key);
2,147,483,647✔
690
}
691

692
// STSDBRowIter ======================================================
693
int32_t tsdbRowIterOpen(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
7,568,838✔
694
  pIter->pRow = pRow;
7,568,838✔
695
  if (pRow->type == TSDBROW_ROW_FMT) {
7,568,838✔
696
    int32_t code = tRowIterOpen(pRow->pTSRow, pTSchema, &pIter->pIter);
4,557,058✔
697
    if (code) return code;
4,557,437✔
698
  } else if (pRow->type == TSDBROW_COL_FMT) {
3,011,780✔
699
    pIter->iColData = 0;
3,011,780✔
700
  }
701

702
  return 0;
7,569,217✔
703
}
704

705
void tsdbRowClose(STSDBRowIter *pIter) {
7,569,217✔
706
  if (pIter->pRow && pIter->pRow->type == TSDBROW_ROW_FMT) {
7,569,217✔
707
    tRowIterClose(&pIter->pIter);
4,557,437✔
708
  }
709
  pIter->pRow = NULL;
7,569,217✔
710
  pIter->pIter = NULL;
7,569,217✔
711
}
7,569,217✔
712

713
SColVal *tsdbRowIterNext(STSDBRowIter *pIter) {
96,304,936✔
714
  if (pIter->pRow->type == TSDBROW_ROW_FMT) {
96,304,936✔
715
    return tRowIterNext(pIter->pIter);
84,261,116✔
716
  } else if (pIter->pRow->type == TSDBROW_COL_FMT) {
12,044,120✔
717
    if (pIter->iColData == 0) {
12,044,120✔
718
      SValue val = {.type = TSDB_DATA_TYPE_TIMESTAMP};
3,011,780✔
719
      VALUE_SET_TRIVIAL_DATUM(&val, pIter->pRow->pBlockData->aTSKEY[pIter->pRow->iRow]);
3,011,780✔
720
      pIter->cv = COL_VAL_VALUE(PRIMARYKEY_TIMESTAMP_COL_ID, val);
3,011,780✔
721
      ++pIter->iColData;
3,011,480✔
722
      return &pIter->cv;
3,011,780✔
723
    }
724

725
    if (pIter->iColData <= pIter->pRow->pBlockData->nColData) {
9,033,540✔
726
      if (tColDataGetValue(&pIter->pRow->pBlockData->aColData[pIter->iColData - 1], pIter->pRow->iRow, &pIter->cv) !=
6,022,960✔
727
          0) {
728
        return NULL;
×
729
      }
730
      ++pIter->iColData;
6,022,360✔
731
      return &pIter->cv;
6,022,360✔
732
    } else {
733
      return NULL;
3,011,780✔
734
    }
735
  } else {
736
    tsdbError("invalid row type:%d", pIter->pRow->type);
×
737
    return NULL;
×
738
  }
739
}
740

741
// SRowMerger ======================================================
742
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
2,147,483,647✔
743
  int32_t   code = 0;
2,147,483,647✔
744
  TSDBKEY   key = TSDBROW_KEY(pRow);
2,147,483,647✔
745
  SColVal  *pColVal = &(SColVal){0};
2,147,483,647✔
746
  STColumn *pTColumn;
747
  int32_t   iCol, jCol = 1;
2,147,483,647✔
748
  pRow->arg = pMerger->arg;
2,147,483,647✔
749

750
  if (NULL == pTSchema) {
2,147,483,647✔
751
    pTSchema = pMerger->pTSchema;
2,147,483,647✔
752
  }
753

754
  if (taosArrayGetSize(pMerger->pArray) == 0) {
2,147,483,647✔
755
    // ts
756
    jCol = 0;
2,147,483,647✔
757
    pTColumn = &pTSchema->columns[jCol++];
2,147,483,647✔
758
    SValue val = {.type = pTColumn->type};
2,147,483,647✔
759
    VALUE_SET_TRIVIAL_DATUM(&val, key.ts);
2,147,483,647✔
760
    *pColVal = COL_VAL_VALUE(pTColumn->colId, val);
2,147,483,647✔
761
    if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
2,147,483,647✔
762
      code = terrno;
×
763
      return code;
×
764
    }
765

766
    // other
767
    for (iCol = 1; jCol < pTSchema->numOfCols && iCol < pMerger->pTSchema->numOfCols; ++iCol) {
2,147,483,647✔
768
      pTColumn = &pMerger->pTSchema->columns[iCol];
2,147,483,647✔
769
      if (pTSchema->columns[jCol].colId < pTColumn->colId) {
2,147,483,647✔
770
        ++jCol;
×
771
        --iCol;
×
772
        continue;
×
773
      } else if (pTSchema->columns[jCol].colId > pTColumn->colId) {
2,147,483,647✔
774
        if (taosArrayPush(pMerger->pArray, &COL_VAL_NONE(pTColumn->colId, pTColumn->type)) == NULL) {
×
775
          return terrno;
×
776
        }
777
        continue;
×
778
      }
779

780
      tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
2,147,483,647✔
781
      bool usepData = IS_VAR_DATA_TYPE(pColVal->value.type) || pColVal->value.type == TSDB_DATA_TYPE_DECIMAL;
2,147,483,647✔
782
      if ((!COL_VAL_IS_NONE(pColVal)) && (!COL_VAL_IS_NULL(pColVal)) && usepData) {
2,147,483,647✔
783
        uint8_t *pVal = pColVal->value.pData;
2,147,483,647✔
784

785
        pColVal->value.pData = NULL;
2,147,483,647✔
786
        code = tRealloc(&pColVal->value.pData, pColVal->value.nData);
2,147,483,647✔
787
        if (code) {
2,147,483,647✔
788
          return code;
×
789
        }
790

791
        if (pColVal->value.nData) {
2,147,483,647✔
792
          memcpy(pColVal->value.pData, pVal, pColVal->value.nData);
2,147,483,647✔
793
        }
794
      }
795

796
      if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
2,147,483,647✔
797
        return terrno;
×
798
      }
799
    }
800

801
    for (; iCol < pMerger->pTSchema->numOfCols; ++iCol) {
2,147,483,647✔
802
      pTColumn = &pMerger->pTSchema->columns[iCol];
4,712✔
803
      if (taosArrayPush(pMerger->pArray, &COL_VAL_NONE(pTColumn->colId, pTColumn->type)) == NULL) {
9,424✔
804
        return terrno;
×
805
      }
806
    }
807

808
    pMerger->version = key.version;
2,147,483,647✔
809
    return 0;
2,147,483,647✔
810
  } else {
811
    for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
2,147,483,647✔
812
      pTColumn = &pMerger->pTSchema->columns[iCol];
2,147,483,647✔
813
      if (pTSchema->columns[jCol].colId < pTColumn->colId) {
2,147,483,647✔
814
        ++jCol;
×
815
        --iCol;
×
816
        continue;
×
817
      } else if (pTSchema->columns[jCol].colId > pTColumn->colId) {
2,147,483,647✔
818
        continue;
×
819
      }
820

821
      tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
2,147,483,647✔
822

823
      if (key.version > pMerger->version) {
2,147,483,647✔
824
        if (!COL_VAL_IS_NONE(pColVal)) {
2,147,483,647✔
825
          if (IS_VAR_DATA_TYPE(pColVal->value.type) || pColVal->value.type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
826
            SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
2,147,483,647✔
827
            if (!pTColVal) return terrno;
2,147,483,647✔
828
            if (!COL_VAL_IS_NULL(pColVal)) {
2,147,483,647✔
829
              code = tRealloc(&pTColVal->value.pData, pColVal->value.nData);
2,147,483,647✔
830
              if (code) return code;
2,147,483,647✔
831

832
              pTColVal->value.nData = pColVal->value.nData;
2,147,483,647✔
833
              if (pTColVal->value.nData) {
2,147,483,647✔
834
                memcpy(pTColVal->value.pData, pColVal->value.pData, pTColVal->value.nData);
2,147,483,647✔
835
              }
836
              pTColVal->flag = 0;
2,147,483,647✔
837
            } else {
838
              tFree(pTColVal->value.pData);
4,961,215✔
839
              taosArraySet(pMerger->pArray, iCol, pColVal);
4,962,305✔
840
            }
841
          } else {
842
            taosArraySet(pMerger->pArray, iCol, pColVal);
2,147,483,647✔
843
          }
844
        }
845
      } else if (key.version < pMerger->version) {
1,492,108✔
846
        SColVal *tColVal = (SColVal *)taosArrayGet(pMerger->pArray, iCol);
1,492,108✔
847
        if (COL_VAL_IS_NONE(tColVal) && !COL_VAL_IS_NONE(pColVal)) {
1,492,108✔
848
          bool usepData = IS_VAR_DATA_TYPE(pColVal->value.type) || pColVal->value.type == TSDB_DATA_TYPE_DECIMAL;
153,720✔
849
          if ((!COL_VAL_IS_NULL(pColVal)) && usepData) {
153,720✔
850
            code = tRealloc(&tColVal->value.pData, pColVal->value.nData);
51,240✔
851
            if (code) return code;
51,240✔
852

853
            tColVal->value.nData = pColVal->value.nData;
51,240✔
854
            if (pColVal->value.nData) {
51,240✔
855
              memcpy(tColVal->value.pData, pColVal->value.pData, pColVal->value.nData);
51,240✔
856
            }
857
            tColVal->flag = 0;
51,240✔
858
          } else {
859
            taosArraySet(pMerger->pArray, iCol, pColVal);
102,480✔
860
          }
861
        }
862
      } else {
863
        return TSDB_CODE_SUCCESS;  // same version, no need to merge
×
864
      }
865
    }
866

867
    pMerger->version = key.version;
2,147,483,647✔
868
    return code;
2,147,483,647✔
869
  }
870
}
871

872
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pSchema) {
235,274,590✔
873
  pMerger->pTSchema = pSchema;
235,274,590✔
874
  pMerger->pArray = taosArrayInit(pSchema->numOfCols, sizeof(SColVal));
235,319,248✔
875
  if (pMerger->pArray == NULL) {
235,217,302✔
876
    return terrno;
×
877
  } else {
878
    return TSDB_CODE_SUCCESS;
235,194,382✔
879
  }
880
}
881

882
void tsdbRowMergerClear(SRowMerger *pMerger) {
2,147,483,647✔
883
  for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
2,147,483,647✔
884
    SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
2,147,483,647✔
885
    if (IS_VAR_DATA_TYPE(pTColVal->value.type) || pTColVal->value.type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
886
      tFree(pTColVal->value.pData);
2,147,483,647✔
887
    }
888
  }
889

890
  taosArrayClear(pMerger->pArray);
2,147,483,647✔
891
}
2,147,483,647✔
892

893
void tsdbRowMergerCleanup(SRowMerger *pMerger) {
237,241,760✔
894
  int32_t numOfCols = taosArrayGetSize(pMerger->pArray);
237,241,760✔
895
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
237,262,384✔
896
    SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
×
897
    if (IS_VAR_DATA_TYPE(pTColVal->value.type) || pTColVal->value.type == TSDB_DATA_TYPE_DECIMAL) {
×
898
      tFree(pTColVal->value.pData);
×
899
    }
900
  }
901

902
  taosArrayDestroy(pMerger->pArray);
237,262,384✔
903
}
237,178,767✔
904

905
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow) {
2,147,483,647✔
906
  SRowBuildScanInfo scanInfo = {.hasBlob = 0};
2,147,483,647✔
907
  return tRowBuild(pMerger->pArray, pMerger->pTSchema, ppRow, &scanInfo);
2,147,483,647✔
908
}
909

910
// delete skyline ======================================================
911
static void tsdbMergeSkyline(SArray *pSkyline1, SArray *pSkyline2, SArray *pSkyline) {
50,222,455✔
912
  int32_t  i1 = 0;
50,222,455✔
913
  int32_t  n1 = taosArrayGetSize(pSkyline1);
50,222,455✔
914
  int32_t  i2 = 0;
50,222,455✔
915
  int32_t  n2 = taosArrayGetSize(pSkyline2);
50,222,455✔
916
  TSDBKEY *pKey1;
917
  TSDBKEY *pKey2;
918
  int64_t  version1 = 0;
50,222,455✔
919
  int64_t  version2 = 0;
50,222,455✔
920

921
  taosArrayClear(pSkyline);
50,222,455✔
922
  TSDBKEY **pItem = TARRAY_GET_ELEM(pSkyline, 0);
50,222,455✔
923

924
  while (i1 < n1 && i2 < n2) {
217,049,521✔
925
    pKey1 = (TSDBKEY *)taosArrayGetP(pSkyline1, i1);
166,826,424✔
926
    pKey2 = (TSDBKEY *)taosArrayGetP(pSkyline2, i2);
166,826,224✔
927

928
    if (pKey1->ts < pKey2->ts) {
166,826,224✔
929
      version1 = pKey1->version;
52,364,707✔
930
      *pItem = pKey1;
52,364,707✔
931
      i1++;
52,364,707✔
932
    } else if (pKey1->ts > pKey2->ts) {
114,461,075✔
933
      version2 = pKey2->version;
32,222,022✔
934
      *pItem = pKey2;
32,222,022✔
935
      i2++;
32,222,022✔
936
    } else {
937
      version1 = pKey1->version;
82,239,053✔
938
      version2 = pKey2->version;
82,239,053✔
939
      *pItem = pKey1;
82,239,053✔
940
      i1++;
82,239,053✔
941
      i2++;
82,239,053✔
942
    }
943

944
    (*pItem)->version = TMAX(version1, version2);
166,825,782✔
945
    pItem++;
166,825,982✔
946
  }
947

948
  while (i1 < n1) {
70,136,573✔
949
    pKey1 = (TSDBKEY *)taosArrayGetP(pSkyline1, i1);
19,914,118✔
950
    *pItem = pKey1;
19,914,118✔
951
    pItem++;
19,914,118✔
952
    i1++;
19,913,508✔
953
  }
954

955
  while (i2 < n2) {
73,094,024✔
956
    pKey2 = (TSDBKEY *)taosArrayGetP(pSkyline2, i2);
22,870,927✔
957
    *pItem = pKey2;
22,871,569✔
958
    pItem++;
22,871,569✔
959
    i2++;
22,871,569✔
960
  }
961

962
  pSkyline->size = TARRAY_ELEM_IDX(pSkyline, pItem);
50,223,097✔
963
}
50,222,455✔
964

965
int32_t tsdbBuildDeleteSkylineImpl(SArray *aSkyline, int32_t sidx, int32_t eidx, SArray *pSkyline) {
106,521,077✔
966
  int32_t   code = 0;
106,521,077✔
967
  SDelData *pDelData;
968
  int32_t   midx;
969

970
  taosArrayClear(pSkyline);
106,521,077✔
971
  if (sidx == eidx) {
106,523,203✔
972
    TSDBKEY *pItem1 = taosArrayGet(aSkyline, sidx * 2);
56,300,948✔
973
    TSDBKEY *pItem2 = taosArrayGet(aSkyline, sidx * 2 + 1);
56,300,306✔
974
    if (taosArrayPush(pSkyline, &pItem1) == NULL) {
56,300,306✔
975
      return terrno;
×
976
    }
977

978
    if (taosArrayPush(pSkyline, &pItem2) == NULL) {
56,300,306✔
979
      return terrno;
×
980
    }
981
  } else {
982
    SArray *pSkyline1 = NULL;
50,222,255✔
983
    SArray *pSkyline2 = NULL;
50,222,255✔
984
    midx = (sidx + eidx) / 2;
50,222,255✔
985

986
    pSkyline1 = taosArrayInit((midx - sidx + 1) * 2, POINTER_BYTES);
50,222,255✔
987
    if (pSkyline1 == NULL) {
50,223,097✔
988
      return terrno;
×
989
    }
990
    pSkyline2 = taosArrayInit((eidx - midx) * 2, POINTER_BYTES);
50,223,097✔
991
    if (pSkyline2 == NULL) {
50,222,897✔
992
      taosArrayDestroy(pSkyline1);
×
993
      return terrno;
×
994
    }
995

996
    code = tsdbBuildDeleteSkylineImpl(aSkyline, sidx, midx, pSkyline1);
50,222,897✔
997
    if (code) goto _clear;
50,222,255✔
998

999
    code = tsdbBuildDeleteSkylineImpl(aSkyline, midx + 1, eidx, pSkyline2);
50,222,255✔
1000
    if (code) goto _clear;
50,223,097✔
1001

1002
    tsdbMergeSkyline(pSkyline1, pSkyline2, pSkyline);
50,223,097✔
1003

1004
  _clear:
50,222,455✔
1005
    taosArrayDestroy(pSkyline1);
50,222,455✔
1006
    taosArrayDestroy(pSkyline2);
50,223,097✔
1007
  }
1008

1009
  return code;
106,522,561✔
1010
}
1011

1012
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline) {
6,076,567✔
1013
  SDelData *pDelData;
1014
  int32_t   code = 0;
6,076,567✔
1015
  int32_t   dataNum = eidx - sidx + 1;
6,076,567✔
1016
  SArray   *aTmpSkyline = taosArrayInit(dataNum * 2, sizeof(TSDBKEY));
6,076,567✔
1017
  if (aTmpSkyline == NULL) {
6,076,367✔
1018
    return terrno;
×
1019
  }
1020

1021
  SArray *pSkyline = taosArrayInit(dataNum * 2, POINTER_BYTES);
6,076,367✔
1022
  if (pSkyline == NULL) {
6,077,009✔
1023
    taosArrayDestroy(aTmpSkyline);
×
1024
    return terrno;
×
1025
  }
1026

1027
  taosArrayClear(aSkyline);
6,077,009✔
1028
  for (int32_t i = sidx; i <= eidx; ++i) {
62,376,031✔
1029
    pDelData = (SDelData *)taosArrayGet(aDelData, i);
56,299,464✔
1030
    if (taosArrayPush(aTmpSkyline, &(TSDBKEY){.ts = pDelData->sKey, .version = pDelData->version}) == NULL) {
112,600,212✔
1031
      code = terrno;
×
1032
      goto _clear;
×
1033
    }
1034

1035
    if (taosArrayPush(aTmpSkyline, &(TSDBKEY){.ts = pDelData->eKey, .version = 0}) == NULL) {
112,599,970✔
1036
      code = terrno;
×
1037
      goto _clear;
×
1038
    }
1039
  }
1040

1041
  code = tsdbBuildDeleteSkylineImpl(aTmpSkyline, sidx, eidx, pSkyline);
6,076,567✔
1042
  if (code) goto _clear;
6,076,567✔
1043

1044
  int32_t skylineNum = taosArrayGetSize(pSkyline);
6,076,567✔
1045
  for (int32_t i = 0; i < skylineNum; ++i) {
36,438,126✔
1046
    TSDBKEY *p = taosArrayGetP(pSkyline, i);
30,360,917✔
1047
    if (taosArrayPush(aSkyline, p) == NULL) {
30,361,559✔
1048
      code = terrno;
×
1049
      goto _clear;
×
1050
    }
1051
  }
1052

1053
_clear:
6,077,209✔
1054
  taosArrayDestroy(aTmpSkyline);
6,078,693✔
1055
  taosArrayDestroy(pSkyline);
6,077,209✔
1056

1057
  return code;
6,076,567✔
1058
}
1059

1060
/*
1061
int32_t tsdbBuildDeleteSkyline2(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline) {
1062
  int32_t   code = 0;
1063
  SDelData *pDelData;
1064
  int32_t   midx;
1065

1066
  taosArrayClear(aSkyline);
1067
  if (sidx == eidx) {
1068
    pDelData = (SDelData *)taosArrayGet(aDelData, sidx);
1069
    taosArrayPush(aSkyline, &(TSDBKEY){.ts = pDelData->sKey, .version = pDelData->version});
1070
    taosArrayPush(aSkyline, &(TSDBKEY){.ts = pDelData->eKey, .version = 0});
1071
  } else {
1072
    SArray *aSkyline1 = NULL;
1073
    SArray *aSkyline2 = NULL;
1074

1075
    aSkyline1 = taosArrayInit(0, sizeof(TSDBKEY));
1076
    aSkyline2 = taosArrayInit(0, sizeof(TSDBKEY));
1077
    if (aSkyline1 == NULL || aSkyline2 == NULL) {
1078
      code = TSDB_CODE_OUT_OF_MEMORY;
1079
      goto _clear;
1080
    }
1081
    midx = (sidx + eidx) / 2;
1082

1083
    code = tsdbBuildDeleteSkyline(aDelData, sidx, midx, aSkyline1);
1084
    if (code) goto _clear;
1085

1086
    code = tsdbBuildDeleteSkyline(aDelData, midx + 1, eidx, aSkyline2);
1087
    if (code) goto _clear;
1088

1089
    code = tsdbMergeSkyline(aSkyline1, aSkyline2, aSkyline);
1090

1091
  _clear:
1092
    taosArrayDestroy(aSkyline1);
1093
    taosArrayDestroy(aSkyline2);
1094
  }
1095

1096
  return code;
1097
}
1098
*/
1099

1100
// SBlockData ======================================================
1101
int32_t tBlockDataCreate(SBlockData *pBlockData) {
971,241,427✔
1102
  pBlockData->suid = 0;
971,241,427✔
1103
  pBlockData->uid = 0;
971,361,261✔
1104
  pBlockData->nRow = 0;
971,345,491✔
1105
  pBlockData->aUid = NULL;
971,358,645✔
1106
  pBlockData->aVersion = NULL;
971,279,278✔
1107
  pBlockData->aTSKEY = NULL;
971,273,719✔
1108
  pBlockData->nColData = 0;
971,224,532✔
1109
  pBlockData->aColData = NULL;
971,248,693✔
1110
  return 0;
971,338,184✔
1111
}
1112

1113
void tBlockDataDestroy(SBlockData *pBlockData) {
1,023,439,645✔
1114
  tFree(pBlockData->aUid);
1,023,439,645✔
1115
  tFree(pBlockData->aVersion);
1,023,692,634✔
1116
  tFree(pBlockData->aTSKEY);
1,023,633,449✔
1117

1118
  for (int32_t i = 0; i < pBlockData->nColData; i++) {
1,616,568,656✔
1119
    tColDataDestroy(&pBlockData->aColData[i]);
593,001,494✔
1120
  }
1121

1122
  if (pBlockData->aColData) {
1,023,599,864✔
1123
    taosMemoryFree(pBlockData->aColData);
150,931,126✔
1124
    pBlockData->aColData = NULL;
150,898,044✔
1125
  }
1126
}
1,023,654,630✔
1127

1128
static int32_t tBlockDataAdjustColData(SBlockData *pBlockData, int32_t nColData) {
97,405,537✔
1129
  int32_t code = 0;
97,405,537✔
1130

1131
  if (pBlockData->nColData > nColData) {
97,405,537✔
1132
    for (int32_t i = nColData; i < pBlockData->nColData; i++) {
5,458,851✔
1133
      tColDataDestroy(&pBlockData->aColData[i]);
5,313,843✔
1134
    }
1135
  } else if (pBlockData->nColData < nColData) {
97,274,413✔
1136
    SColData *aColData = taosMemoryRealloc(pBlockData->aColData, sizeof(SBlockData) * nColData);
71,177,252✔
1137
    if (aColData == NULL) {
71,116,842✔
1138
      code = terrno;
×
1139
      goto _exit;
×
1140
    }
1141

1142
    pBlockData->aColData = aColData;
71,116,842✔
1143
    memset(&pBlockData->aColData[pBlockData->nColData], 0, sizeof(SBlockData) * (nColData - pBlockData->nColData));
71,117,123✔
1144
  }
1145
  pBlockData->nColData = nColData;
97,402,107✔
1146

1147
_exit:
97,434,695✔
1148
  return code;
97,434,695✔
1149
}
1150
int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid) {
97,396,865✔
1151
  int32_t code = 0;
97,396,865✔
1152

1153
  if (!pId->suid && !pId->uid) {
97,396,865✔
1154
    return TSDB_CODE_INVALID_PARA;
×
1155
  }
1156

1157
  pBlockData->suid = pId->suid;
97,422,263✔
1158
  pBlockData->uid = pId->uid;
97,427,385✔
1159
  pBlockData->nRow = 0;
97,437,986✔
1160

1161
  if (aCid) {
97,407,078✔
1162
    code = tBlockDataAdjustColData(pBlockData, nCid);
×
1163
    if (code) goto _exit;
×
1164

1165
    int32_t   iColumn = 1;
×
1166
    STColumn *pTColumn = &pTSchema->columns[iColumn];
×
1167
    for (int32_t iCid = 0; iCid < nCid; iCid++) {
×
1168
      // aCid array (from taos client catalog) contains columns that does not exist in the pTSchema. the pTSchema is
1169
      // newer
1170
      if (pTColumn == NULL) {
×
1171
        continue;
×
1172
      }
1173

1174
      while (pTColumn->colId < aCid[iCid]) {
×
1175
        iColumn++;
×
1176
        if (!(iColumn < pTSchema->numOfCols)) {
×
1177
          return TSDB_CODE_INVALID_PARA;
×
1178
        }
1179
        pTColumn = &pTSchema->columns[iColumn];
×
1180
      }
1181

1182
      if (pTColumn->colId != aCid[iCid]) {
×
1183
        continue;
×
1184
      }
1185

1186
      tColDataInit(&pBlockData->aColData[iCid], pTColumn->colId, pTColumn->type, pTColumn->flags);
×
1187

1188
      iColumn++;
×
1189
      pTColumn = (iColumn < pTSchema->numOfCols) ? &pTSchema->columns[iColumn] : NULL;
×
1190
    }
1191
  } else {
1192
    code = tBlockDataAdjustColData(pBlockData, pTSchema->numOfCols - 1);
97,407,078✔
1193
    if (code) goto _exit;
97,416,040✔
1194

1195
    for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
681,021,565✔
1196
      STColumn *pTColumn = &pTSchema->columns[iColData + 1];
583,583,312✔
1197
      tColDataInit(&pBlockData->aColData[iColData], pTColumn->colId, pTColumn->type, pTColumn->flags);
583,580,641✔
1198
    }
1199
  }
1200

1201
_exit:
97,444,558✔
1202
  return code;
97,444,558✔
1203
}
1204

1205
void tBlockDataReset(SBlockData *pBlockData) {
685,560,090✔
1206
  pBlockData->suid = 0;
685,560,090✔
1207
  pBlockData->uid = 0;
685,726,168✔
1208
  pBlockData->nRow = 0;
685,759,963✔
1209
  for (int32_t i = 0; i < pBlockData->nColData; i++) {
1,190,364,369✔
1210
    tColDataDestroy(&pBlockData->aColData[i]);
504,532,365✔
1211
  }
1212
  pBlockData->nColData = 0;
685,646,507✔
1213
  taosMemoryFreeClear(pBlockData->aColData);
685,839,720✔
1214
}
685,856,360✔
1215

1216
void tBlockDataClear(SBlockData *pBlockData) {
97,644,905✔
1217
  pBlockData->nRow = 0;
97,644,905✔
1218
  for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
588,222,980✔
1219
    tColDataClear(tBlockDataGetColDataByIdx(pBlockData, iColData));
490,573,712✔
1220
  }
1221
}
97,665,249✔
1222

1223
int32_t tBlockDataAddColData(SBlockData *pBlockData, int16_t cid, int8_t type, int8_t cflag, SColData **ppColData) {
626,343,416✔
1224
  if (pBlockData->nColData != 0 && pBlockData->aColData[pBlockData->nColData - 1].cid >= cid) {
626,343,416✔
1225
    return TSDB_CODE_INVALID_PARA;
×
1226
  }
1227

1228
  SColData *newColData = taosMemoryRealloc(pBlockData->aColData, sizeof(SColData) * (pBlockData->nColData + 1));
626,422,447✔
1229
  if (newColData == NULL) {
626,328,307✔
1230
    return terrno;
×
1231
  }
1232

1233
  pBlockData->aColData = newColData;
626,328,307✔
1234
  pBlockData->nColData++;
626,381,161✔
1235

1236
  *ppColData = &pBlockData->aColData[pBlockData->nColData - 1];
626,410,061✔
1237
  memset(*ppColData, 0, sizeof(SColData));
626,428,155✔
1238
  tColDataInit(*ppColData, cid, type, cflag);
626,412,635✔
1239

1240
  return 0;
626,384,225✔
1241
}
1242

1243
/* flag > 0: forward update
1244
 * flag == 0: insert
1245
 * flag < 0: backward update
1246
 */
1247
static int32_t tBlockDataUpsertBlockRow(SBlockData *pBlockData, SBlockData *pBlockDataFrom, int32_t iRow,
2,147,483,647✔
1248
                                        int32_t flag) {
1249
  int32_t code = 0;
2,147,483,647✔
1250

1251
  SColVal   cv = {0};
2,147,483,647✔
1252
  int32_t   iColDataFrom = 0;
2,147,483,647✔
1253
  SColData *pColDataFrom = (iColDataFrom < pBlockDataFrom->nColData) ? &pBlockDataFrom->aColData[iColDataFrom] : NULL;
2,147,483,647✔
1254

1255
  for (int32_t iColDataTo = 0; iColDataTo < pBlockData->nColData; iColDataTo++) {
2,147,483,647✔
1256
    SColData *pColDataTo = &pBlockData->aColData[iColDataTo];
2,147,483,647✔
1257

1258
    while (pColDataFrom && pColDataFrom->cid < pColDataTo->cid) {
2,147,483,647✔
1259
      pColDataFrom = (++iColDataFrom < pBlockDataFrom->nColData) ? &pBlockDataFrom->aColData[iColDataFrom] : NULL;
7,013,698✔
1260
    }
1261

1262
    if (pColDataFrom == NULL || pColDataFrom->cid > pColDataTo->cid) {
2,147,483,647✔
1263
      cv = COL_VAL_NONE(pColDataTo->cid, pColDataTo->type);
2,147,483,647✔
1264
      if (flag == 0 && (code = tColDataAppendValue(pColDataTo, &cv))) goto _exit;
2,147,483,647✔
1265
    } else {
1266
      code = tColDataGetValue(pColDataFrom, iRow, &cv);
2,147,483,647✔
1267
      if (code) goto _exit;
2,147,483,647✔
1268

1269
      if (flag) {
2,147,483,647✔
1270
        code = tColDataUpdateValue(pColDataTo, &cv, flag > 0);
2,147,483,647✔
1271
      } else {
1272
        code = tColDataAppendValue(pColDataTo, &cv);
2,147,483,647✔
1273
      }
1274
      if (code) goto _exit;
2,147,483,647✔
1275

1276
      pColDataFrom = (++iColDataFrom < pBlockDataFrom->nColData) ? &pBlockDataFrom->aColData[iColDataFrom] : NULL;
2,147,483,647✔
1277
    }
1278
  }
1279

1280
_exit:
2,147,483,647✔
1281
  return code;
2,147,483,647✔
1282
}
1283

1284
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) {
2,147,483,647✔
1285
  int32_t code = 0;
2,147,483,647✔
1286

1287
  if (!(pBlockData->suid || pBlockData->uid)) {
2,147,483,647✔
1288
    return TSDB_CODE_INVALID_PARA;
×
1289
  }
1290

1291
  // uid
1292
  if (pBlockData->uid == 0) {
2,147,483,647✔
1293
    if (!uid) {
2,147,483,647✔
1294
      return TSDB_CODE_INVALID_PARA;
×
1295
    }
1296
    code = tRealloc((uint8_t **)&pBlockData->aUid, sizeof(int64_t) * (pBlockData->nRow + 1));
2,147,483,647✔
1297
    if (code) goto _exit;
2,147,483,647✔
1298
    pBlockData->aUid[pBlockData->nRow] = uid;
2,147,483,647✔
1299
  }
1300
  // version
1301
  code = tRealloc((uint8_t **)&pBlockData->aVersion, sizeof(int64_t) * (pBlockData->nRow + 1));
2,147,483,647✔
1302
  if (code) goto _exit;
2,147,483,647✔
1303
  pBlockData->aVersion[pBlockData->nRow] = TSDBROW_VERSION(pRow);
2,147,483,647✔
1304
  // timestamp
1305
  code = tRealloc((uint8_t **)&pBlockData->aTSKEY, sizeof(TSKEY) * (pBlockData->nRow + 1));
2,147,483,647✔
1306
  if (code) goto _exit;
2,147,483,647✔
1307
  pBlockData->aTSKEY[pBlockData->nRow] = TSDBROW_TS(pRow);
2,147,483,647✔
1308

1309
  if (pRow->type == TSDBROW_ROW_FMT) {
2,147,483,647✔
1310
    code = tRowUpsertColData(pRow->pTSRow, pTSchema, pBlockData->aColData, pBlockData->nColData, 0 /* append */);
2,147,483,647✔
1311
    if (code) goto _exit;
2,147,483,647✔
1312
  } else if (pRow->type == TSDBROW_COL_FMT) {
2,147,483,647✔
1313
    code = tBlockDataUpsertBlockRow(pBlockData, pRow->pBlockData, pRow->iRow, 0 /* append */);
2,147,483,647✔
1314
    if (code) goto _exit;
2,147,483,647✔
1315
  } else {
UNCOV
1316
    return TSDB_CODE_INVALID_PARA;
×
1317
  }
1318
  pBlockData->nRow++;
2,147,483,647✔
1319

1320
_exit:
2,147,483,647✔
1321
  return code;
2,147,483,647✔
1322
}
1323
int32_t tBlockDataUpdateRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema) {
2,147,483,647✔
1324
  int32_t code = 0;
2,147,483,647✔
1325

1326
  // version
1327
  int64_t lversion = pBlockData->aVersion[pBlockData->nRow - 1];
2,147,483,647✔
1328
  int64_t rversion = TSDBROW_VERSION(pRow);
2,147,483,647✔
1329
  if (lversion == rversion) {
2,147,483,647✔
1330
    return TSDB_CODE_SUCCESS;
×
1331
  }
1332
  if (rversion > lversion) {
2,147,483,647✔
1333
    pBlockData->aVersion[pBlockData->nRow - 1] = rversion;
2,147,483,647✔
1334
  }
1335

1336
  // update other rows
1337
  if (pRow->type == TSDBROW_ROW_FMT) {
2,147,483,647✔
1338
    code = tRowUpsertColData(pRow->pTSRow, pTSchema, pBlockData->aColData, pBlockData->nColData,
55,417,471✔
1339
                             (rversion > lversion) ? 1 : -1 /* update */);
1340
    if (code) goto _exit;
55,443,564✔
1341
  } else if (pRow->type == TSDBROW_COL_FMT) {
2,147,483,647✔
1342
    code = tBlockDataUpsertBlockRow(pBlockData, pRow->pBlockData, pRow->iRow, (rversion > lversion) ? 1 : -1);
2,147,483,647✔
1343
    if (code) goto _exit;
2,147,483,647✔
1344
  } else {
1345
    code = TSDB_CODE_INVALID_PARA;
×
1346
    goto _exit;
×
1347
  }
1348

1349
_exit:
2,147,483,647✔
1350
  return code;
2,147,483,647✔
1351
}
1352

1353
#ifdef BUILD_NO_CALL
1354
int32_t tBlockDataTryUpsertRow(SBlockData *pBlockData, TSDBROW *pRow, int64_t uid) {
1355
  if (pBlockData->nRow == 0) {
1356
    return 1;
1357
  } else if (pBlockData->aTSKEY[pBlockData->nRow - 1] == TSDBROW_TS(pRow)) {
1358
    return pBlockData->nRow;
1359
  } else {
1360
    return pBlockData->nRow + 1;
1361
  }
1362
}
1363

1364
int32_t tBlockDataUpsertRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) {
1365
  if (pBlockData->nRow > 0 && pBlockData->aTSKEY[pBlockData->nRow - 1] == TSDBROW_TS(pRow)) {
1366
    return tBlockDataUpdateRow(pBlockData, pRow, pTSchema);
1367
  } else {
1368
    return tBlockDataAppendRow(pBlockData, pRow, pTSchema, uid);
1369
  }
1370
}
1371
#endif
1372

1373
SColData *tBlockDataGetColData(SBlockData *pBlockData, int16_t cid) {
2,147,483,647✔
1374
  int32_t lidx = 0;
2,147,483,647✔
1375
  int32_t ridx = pBlockData->nColData - 1;
2,147,483,647✔
1376

1377
  while (lidx <= ridx) {
2,147,483,647✔
1378
    int32_t   midx = (lidx + ridx) >> 1;
2,147,483,647✔
1379
    SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, midx);
2,147,483,647✔
1380
    int32_t   c = (pColData->cid == cid) ? 0 : ((pColData->cid > cid) ? 1 : -1);
2,147,483,647✔
1381

1382
    if (c == 0) {
2,147,483,647✔
1383
      return pColData;
2,147,483,647✔
1384
    } else if (c < 0) {
2,147,483,647✔
1385
      lidx = midx + 1;
2,147,483,647✔
1386
    } else {
1387
      ridx = midx - 1;
2,147,483,647✔
1388
    }
1389
  }
1390

1391
  return NULL;
2,147,483,647✔
1392
}
1393

1394
/* buffers[0]: SDiskDataHdr
1395
 * buffers[1]: key part: uid + version + ts + primary keys
1396
 * buffers[2]: SBlockCol part
1397
 * buffers[3]: regular column part
1398
 */
1399
int32_t tBlockDataCompress(SBlockData *bData, void *pCompr, SBuffer *buffers, SBuffer *assist) {
71,563,755✔
1400
  int32_t code = 0;
71,563,755✔
1401
  int32_t lino = 0;
71,563,755✔
1402

1403
  SColCompressInfo *pInfo = pCompr;
71,563,755✔
1404
  code = tsdbGetColCmprAlgFromSet(pInfo->pColCmpr, 1, &pInfo->defaultCmprAlg);
71,563,755✔
1405
  TAOS_UNUSED(code);
1406

1407
  SDiskDataHdr hdr = {
71,568,593✔
1408
      .delimiter = TSDB_FILE_DLMT,
1409
      .fmtVer = 2,
1410
      .suid = bData->suid,
71,570,436✔
1411
      .uid = bData->uid,
71,577,348✔
1412
      .szUid = 0,     // filled by compress key
1413
      .szVer = 0,     // filled by compress key
1414
      .szKey = 0,     // filled by compress key
1415
      .szBlkCol = 0,  // filled by this func
1416
      .nRow = bData->nRow,
71,573,500✔
1417
      .cmprAlg = pInfo->defaultCmprAlg,
71,571,334✔
1418
      .numOfPKs = 0,  // filled by compress key
1419
  };
1420
  // Key part
1421

1422
  tBufferClear(&buffers[1]);
71,562,797✔
1423
  code = tBlockDataCompressKeyPart(bData, &hdr, &buffers[1], assist, (SColCompressInfo *)pInfo);
71,568,971✔
1424
  TSDB_CHECK_CODE(code, lino, _exit);
71,575,068✔
1425

1426
  // Regulart column part
1427
  tBufferClear(&buffers[2]);
71,575,068✔
1428
  tBufferClear(&buffers[3]);
71,571,409✔
1429
  for (int i = 0; i < bData->nColData; i++) {
470,430,318✔
1430
    SColData *colData = tBlockDataGetColDataByIdx(bData, i);
398,871,362✔
1431

1432
    if (colData->cflag & COL_IS_KEY) {
398,870,105✔
1433
      continue;
378,303✔
1434
    }
1435
    if (colData->flag == HAS_NONE) {
398,486,519✔
1436
      continue;
12,150,237✔
1437
    }
1438

1439
    SColDataCompressInfo cinfo = {
386,332,377✔
1440
        .cmprAlg = pInfo->defaultCmprAlg,
386,342,084✔
1441
    };
1442
    code = tsdbGetColCmprAlgFromSet(pInfo->pColCmpr, colData->cid, &cinfo.cmprAlg);
386,343,352✔
1443
    if (code < 0) {
1444
      //
1445
    }
1446

1447
    int32_t offset = buffers[3].size;
386,327,850✔
1448
    code = tColDataCompress(colData, &cinfo, &buffers[3], assist);
386,333,972✔
1449
    TSDB_CHECK_CODE(code, lino, _exit);
386,280,800✔
1450

1451
    SBlockCol blockCol = (SBlockCol){.cid = cinfo.columnId,
386,280,800✔
1452
                                     .type = cinfo.dataType,
386,317,923✔
1453
                                     .cflag = cinfo.columnFlag,
386,317,923✔
1454
                                     .flag = cinfo.flag,
386,317,923✔
1455
                                     .szOrigin = cinfo.dataOriginalSize,
386,317,923✔
1456
                                     .szBitmap = cinfo.bitmapCompressedSize,
386,317,923✔
1457
                                     .szOffset = cinfo.offsetCompressedSize,
386,317,923✔
1458
                                     .szValue = cinfo.dataCompressedSize,
386,317,923✔
1459
                                     .offset = offset,
1460
                                     .alg = cinfo.cmprAlg};
386,317,923✔
1461

1462
    code = tPutBlockCol(&buffers[2], &blockCol, hdr.fmtVer, hdr.cmprAlg);
386,317,923✔
1463
    TSDB_CHECK_CODE(code, lino, _exit);
386,283,534✔
1464
  }
1465
  hdr.szBlkCol = buffers[2].size;
71,580,001✔
1466

1467
  // SDiskDataHdr part
1468
  tBufferClear(&buffers[0]);
1469
  code = tPutDiskDataHdr(&buffers[0], &hdr);
71,575,837✔
1470
  TSDB_CHECK_CODE(code, lino, _exit);
71,551,820✔
1471

1472
_exit:
71,554,826✔
1473
  if (code) {
71,555,732✔
1474
    tsdbError("tBlockDataCompress failed: code=%d, line=%d", code, lino);
×
1475
  }
1476
  return code;
71,555,732✔
1477
}
1478

1479
int32_t tBlockDataDecompress(SBufferReader *br, SBlockData *blockData, SBuffer *assist) {
17,270,266✔
1480
  int32_t       code = 0;
17,270,266✔
1481
  int32_t       lino = 0;
17,270,266✔
1482
  SDiskDataHdr  hdr = {0};
17,270,266✔
1483
  SCompressInfo cinfo;
1484

1485
  // SDiskDataHdr
1486
  code = tGetDiskDataHdr(br, &hdr);
17,270,266✔
1487
  TSDB_CHECK_CODE(code, lino, _exit);
17,270,266✔
1488

1489
  tBlockDataReset(blockData);
17,270,266✔
1490
  blockData->suid = hdr.suid;
17,269,663✔
1491
  blockData->uid = hdr.uid;
17,269,663✔
1492
  blockData->nRow = hdr.nRow;
17,270,266✔
1493

1494
  // Key part
1495
  code = tBlockDataDecompressKeyPart(&hdr, br, blockData, assist);
17,269,663✔
1496
  TSDB_CHECK_CODE(code, lino, _exit);
17,269,066✔
1497

1498
  // Column part
1499
  SBufferReader br2 = *br;
17,269,066✔
1500
  br->offset += hdr.szBlkCol;
17,269,666✔
1501
  for (uint32_t startOffset = br2.offset; br2.offset - startOffset < hdr.szBlkCol;) {
83,359,299✔
1502
    SBlockCol blockCol;
66,087,476✔
1503

1504
    code = tGetBlockCol(&br2, &blockCol, hdr.fmtVer, hdr.cmprAlg);
66,090,236✔
1505
    TSDB_CHECK_CODE(code, lino, _exit);
66,090,711✔
1506
    if (blockCol.alg == 0) blockCol.alg = hdr.cmprAlg;
66,090,711✔
1507
    code = tBlockDataDecompressColData(&hdr, &blockCol, br, blockData, assist);
66,090,711✔
1508
    TSDB_CHECK_CODE(code, lino, _exit);
66,089,523✔
1509
  }
1510

1511
_exit:
17,269,553✔
1512
  return code;
17,269,663✔
1513
}
1514

1515
// SDiskDataHdr ==============================
1516
int32_t tPutDiskDataHdr(SBuffer *buffer, const SDiskDataHdr *pHdr) {
71,559,807✔
1517
  int32_t code;
1518

1519
  if ((code = tBufferPutU32(buffer, pHdr->delimiter))) return code;
143,134,376✔
1520
  if ((code = tBufferPutU32v(buffer, pHdr->fmtVer))) return code;
143,143,514✔
1521
  if ((code = tBufferPutI64(buffer, pHdr->suid))) return code;
143,125,801✔
1522
  if ((code = tBufferPutI64(buffer, pHdr->uid))) return code;
143,121,730✔
1523
  if ((code = tBufferPutI32v(buffer, pHdr->szUid))) return code;
143,138,936✔
1524
  if ((code = tBufferPutI32v(buffer, pHdr->szVer))) return code;
143,145,312✔
1525
  if ((code = tBufferPutI32v(buffer, pHdr->szKey))) return code;
143,136,905✔
1526
  if ((code = tBufferPutI32v(buffer, pHdr->szBlkCol))) return code;
143,129,357✔
1527
  if ((code = tBufferPutI32v(buffer, pHdr->nRow))) return code;
143,130,740✔
1528
  if (pHdr->fmtVer < 2) {
71,567,038✔
1529
    if ((code = tBufferPutI8(buffer, pHdr->cmprAlg))) return code;
×
1530
  } else if (pHdr->fmtVer == 2) {
71,544,319✔
1531
    if ((code = tBufferPutU32(buffer, pHdr->cmprAlg))) return code;
143,118,446✔
1532
  } else {
1533
    // more data fmt ver
1534
  }
1535
  if (pHdr->fmtVer >= 1) {
71,553,567✔
1536
    if ((code = tBufferPutI8(buffer, pHdr->numOfPKs))) return code;
143,128,497✔
1537
    for (int i = 0; i < pHdr->numOfPKs; i++) {
71,946,620✔
1538
      if ((code = tPutBlockCol(buffer, &pHdr->primaryBlockCols[i], pHdr->fmtVer, pHdr->cmprAlg))) return code;
378,759✔
1539
    }
1540
  }
1541

1542
  return 0;
71,548,879✔
1543
}
1544

1545
int32_t tGetDiskDataHdr(SBufferReader *br, SDiskDataHdr *pHdr) {
226,143,003✔
1546
  int32_t code;
1547

1548
  if ((code = tBufferGetU32(br, &pHdr->delimiter))) return code;
226,143,003✔
1549
  if ((code = tBufferGetU32v(br, &pHdr->fmtVer))) return code;
226,154,419✔
1550
  if ((code = tBufferGetI64(br, &pHdr->suid))) return code;
226,155,709✔
1551
  if ((code = tBufferGetI64(br, &pHdr->uid))) return code;
226,104,633✔
1552
  if ((code = tBufferGetI32v(br, &pHdr->szUid))) return code;
226,232,305✔
1553
  if ((code = tBufferGetI32v(br, &pHdr->szVer))) return code;
226,228,265✔
1554
  if ((code = tBufferGetI32v(br, &pHdr->szKey))) return code;
226,283,023✔
1555
  if ((code = tBufferGetI32v(br, &pHdr->szBlkCol))) return code;
226,286,522✔
1556
  if ((code = tBufferGetI32v(br, &pHdr->nRow))) return code;
226,283,396✔
1557
  if (pHdr->fmtVer < 2) {
226,287,111✔
1558
    int8_t cmprAlg = 0;
×
1559
    if ((code = tBufferGetI8(br, &cmprAlg))) return code;
×
1560
    pHdr->cmprAlg = cmprAlg;
×
1561
  } else if (pHdr->fmtVer == 2) {
226,174,768✔
1562
    if ((code = tBufferGetU32(br, &pHdr->cmprAlg))) return code;
226,196,386✔
1563
  } else {
1564
    // more data fmt ver
1565
  }
1566
  if (pHdr->fmtVer >= 1) {
226,258,203✔
1567
    if ((code = tBufferGetI8(br, &pHdr->numOfPKs))) return code;
226,238,185✔
1568
    for (int i = 0; i < pHdr->numOfPKs; i++) {
259,733,479✔
1569
      if ((code = tGetBlockCol(br, &pHdr->primaryBlockCols[i], pHdr->fmtVer, pHdr->cmprAlg))) {
33,546,186✔
1570
        return code;
×
1571
      }
1572
    }
1573
  } else {
1574
    pHdr->numOfPKs = 0;
30✔
1575
  }
1576

1577
  return 0;
226,135,163✔
1578
}
1579

1580
// ALGORITHM ==============================
1581
int32_t tPutColumnDataAgg(SBuffer *buffer, SColumnDataAgg *pColAgg) {
121,987,056✔
1582
  int32_t code;
1583

1584
  if (pColAgg->colId & DECIMAL_AGG_FLAG) {
121,987,056✔
1585
    if ((code = tBufferPutI32v(buffer, pColAgg->colId))) return code;
132,356✔
1586
    if ((code = tBufferPutI16v(buffer, pColAgg->numOfNull))) return code;
132,356✔
1587
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Sum[0]))) return code;
132,356✔
1588
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Sum[1]))) return code;
132,356✔
1589
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Max[0]))) return code;
132,356✔
1590
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Max[1]))) return code;
132,356✔
1591
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Min[0]))) return code;
132,356✔
1592
    if ((code = tBufferPutU64(buffer, pColAgg->decimal128Min[1]))) return code;
132,356✔
1593
    if ((code = tBufferPutU8(buffer, pColAgg->overflow))) return code;
132,356✔
1594
  } else {
1595
    if ((code = tBufferPutI32v(buffer, pColAgg->colId))) return code;
243,842,597✔
1596
    if ((code = tBufferPutI16v(buffer, pColAgg->numOfNull))) return code;
243,839,572✔
1597
    if ((code = tBufferPutI64(buffer, pColAgg->sum))) return code;
243,838,860✔
1598
    if ((code = tBufferPutI64(buffer, pColAgg->max))) return code;
243,840,202✔
1599
    if ((code = tBufferPutI64(buffer, pColAgg->min))) return code;
243,834,763✔
1600
  }
1601

1602
  return 0;
121,981,042✔
1603
}
1604

1605
int32_t tGetColumnDataAgg(SBufferReader *br, SColumnDataAgg *pColAgg) {
116,171,239✔
1606
  int32_t code;
1607

1608
  if ((code = tBufferGetI32v(br, &pColAgg->colId))) return code;
116,171,239✔
1609
  if ((code = tBufferGetI16v(br, &pColAgg->numOfNull))) return code;
116,171,939✔
1610
  if (pColAgg->colId & DECIMAL_AGG_FLAG) {
116,173,875✔
1611
    pColAgg->colId &= 0xFFFF;
7,293,398✔
1612
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Sum[0]))) return code;
7,292,698✔
1613
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Sum[1]))) return code;
7,293,398✔
1614
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Max[0]))) return code;
7,293,398✔
1615
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Max[1]))) return code;
7,292,698✔
1616
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Min[0]))) return code;
7,292,698✔
1617
    if ((code = tBufferGetU64(br, &pColAgg->decimal128Min[1]))) return code;
7,293,398✔
1618
    if ((code = tBufferGetU8(br, &pColAgg->overflow))) return code;
7,293,398✔
1619
  } else {
1620
    if ((code = tBufferGetI64(br, &pColAgg->sum))) return code;
108,880,477✔
1621
    if ((code = tBufferGetI64(br, &pColAgg->max))) return code;
108,879,159✔
1622
    if ((code = tBufferGetI64(br, &pColAgg->min))) return code;
108,879,941✔
1623
  }
1624

1625
  return 0;
116,171,075✔
1626
}
1627

1628
static int32_t tBlockDataCompressKeyPart(SBlockData *bData, SDiskDataHdr *hdr, SBuffer *buffer, SBuffer *assist,
71,558,386✔
1629
                                         SColCompressInfo *compressInfo) {
1630
  int32_t       code = 0;
71,558,386✔
1631
  int32_t       lino = 0;
71,558,386✔
1632
  SCompressInfo cinfo;
71,556,745✔
1633

1634
  // uid
1635
  if (bData->uid == 0) {
71,559,909✔
1636
    cinfo = (SCompressInfo){
31,471,999✔
1637
        .cmprAlg = hdr->cmprAlg,
31,471,548✔
1638
        .dataType = TSDB_DATA_TYPE_BIGINT,
1639
        .originalSize = sizeof(int64_t) * bData->nRow,
31,471,034✔
1640
    };
1641
    code = tCompressDataToBuffer(bData->aUid, &cinfo, buffer, assist);
31,471,999✔
1642
    TSDB_CHECK_CODE(code, lino, _exit);
31,472,449✔
1643
    hdr->szUid = cinfo.compressedSize;
31,472,449✔
1644
  }
1645

1646
  // version
1647
  cinfo = (SCompressInfo){
71,568,806✔
1648
      .cmprAlg = hdr->cmprAlg,
71,572,089✔
1649
      .dataType = TSDB_DATA_TYPE_BIGINT,
1650
      .originalSize = sizeof(int64_t) * bData->nRow,
71,565,587✔
1651
  };
1652
  code = tCompressDataToBuffer((uint8_t *)bData->aVersion, &cinfo, buffer, assist);
71,568,806✔
1653
  TSDB_CHECK_CODE(code, lino, _exit);
71,572,725✔
1654
  hdr->szVer = cinfo.compressedSize;
71,572,725✔
1655

1656
  // ts
1657
  cinfo = (SCompressInfo){
71,562,969✔
1658
      .cmprAlg = hdr->cmprAlg,
71,573,960✔
1659
      .dataType = TSDB_DATA_TYPE_TIMESTAMP,
1660
      .originalSize = sizeof(TSKEY) * bData->nRow,
71,574,260✔
1661
  };
1662

1663
  code = tCompressDataToBuffer((uint8_t *)bData->aTSKEY, &cinfo, buffer, assist);
71,562,969✔
1664
  TSDB_CHECK_CODE(code, lino, _exit);
71,580,410✔
1665
  hdr->szKey = cinfo.compressedSize;
71,580,410✔
1666

1667
  // primary keys
1668
  for (hdr->numOfPKs = 0; hdr->numOfPKs < bData->nColData; hdr->numOfPKs++) {
71,959,149✔
1669
    if (!(hdr->numOfPKs <= TD_MAX_PK_COLS)) {
71,950,062✔
1670
      return TSDB_CODE_INVALID_PARA;
×
1671
    }
1672

1673
    SBlockCol *blockCol = &hdr->primaryBlockCols[hdr->numOfPKs];
71,951,753✔
1674
    SColData  *colData = tBlockDataGetColDataByIdx(bData, hdr->numOfPKs);
71,949,192✔
1675

1676
    if ((colData->cflag & COL_IS_KEY) == 0) {
71,951,521✔
1677
      break;
71,577,025✔
1678
    }
1679

1680
    SColDataCompressInfo info = {
378,759✔
1681
        .cmprAlg = hdr->cmprAlg,
378,149✔
1682
    };
1683
    code = tsdbGetColCmprAlgFromSet(compressInfo->pColCmpr, colData->cid, &info.cmprAlg);
378,149✔
1684
    if (code < 0) {
1685
      // do nothing
1686
    } else {
1687
    }
1688

1689
    code = tColDataCompress(colData, &info, buffer, assist);
378,149✔
1690
    TSDB_CHECK_CODE(code, lino, _exit);
378,149✔
1691

1692
    *blockCol = (SBlockCol){
378,759✔
1693
        .cid = info.columnId,
378,149✔
1694
        .type = info.dataType,
378,149✔
1695
        .cflag = info.columnFlag,
378,149✔
1696
        .flag = info.flag,
378,149✔
1697
        .szOrigin = info.dataOriginalSize,
378,149✔
1698
        .szBitmap = info.bitmapCompressedSize,
378,149✔
1699
        .szOffset = info.offsetCompressedSize,
378,149✔
1700
        .szValue = info.dataCompressedSize,
378,149✔
1701
        .offset = 0,
1702
        .alg = info.cmprAlg,
378,149✔
1703
    };
1704
  }
1705

1706
_exit:
71,574,797✔
1707
  return code;
71,575,927✔
1708
}
1709

1710
int32_t tBlockDataDecompressColData(const SDiskDataHdr *hdr, const SBlockCol *blockCol, SBufferReader *br,
626,342,552✔
1711
                                    SBlockData *blockData, SBuffer *assist) {
1712
  int32_t code = 0;
626,342,552✔
1713
  int32_t lino = 0;
626,342,552✔
1714

1715
  SColData *colData;
626,338,262✔
1716

1717
  code = tBlockDataAddColData(blockData, blockCol->cid, blockCol->type, blockCol->cflag, &colData);
626,372,586✔
1718
  TSDB_CHECK_CODE(code, lino, _exit);
626,384,489✔
1719

1720
  SColDataCompressInfo info = {
1,132,191,117✔
1721
      .cmprAlg = blockCol->alg,
626,378,276✔
1722
      .columnFlag = blockCol->cflag,
626,393,096✔
1723
      .flag = blockCol->flag,
626,413,308✔
1724
      .dataType = blockCol->type,
626,405,517✔
1725
      .columnId = blockCol->cid,
626,362,046✔
1726
      .numOfData = hdr->nRow,
626,410,700✔
1727
      .bitmapOriginalSize = 0,
1728
      .bitmapCompressedSize = blockCol->szBitmap,
626,324,333✔
1729
      .offsetOriginalSize = blockCol->szOffset ? sizeof(int32_t) * hdr->nRow : 0,
626,363,341✔
1730
      .offsetCompressedSize = blockCol->szOffset,
626,314,558✔
1731
      .dataOriginalSize = blockCol->szOrigin,
626,340,720✔
1732
      .dataCompressedSize = blockCol->szValue,
626,347,099✔
1733
  };
1734

1735
  switch (blockCol->flag) {
626,362,784✔
1736
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
299,956✔
1737
      info.bitmapOriginalSize = BIT2_SIZE(hdr->nRow);
299,956✔
1738
      break;
300,501✔
1739
    case (HAS_NONE | HAS_NULL):
115,842,287✔
1740
    case (HAS_NONE | HAS_VALUE):
1741
    case (HAS_NULL | HAS_VALUE):
1742
      info.bitmapOriginalSize = BIT1_SIZE(hdr->nRow);
115,842,287✔
1743
      break;
115,843,913✔
1744
  }
1745

1746
  code = tColDataDecompress(BR_PTR(br), &info, colData, assist);
626,378,375✔
1747
  TSDB_CHECK_CODE(code, lino, _exit);
626,270,113✔
1748
  br->offset += blockCol->szBitmap + blockCol->szOffset + blockCol->szValue;
626,270,113✔
1749

1750
_exit:
626,378,556✔
1751
  return code;
626,400,987✔
1752
}
1753

1754
int32_t tBlockDataDecompressKeyPart(const SDiskDataHdr *hdr, SBufferReader *br, SBlockData *blockData,
226,093,314✔
1755
                                    SBuffer *assist) {
1756
  int32_t       code = 0;
226,093,314✔
1757
  int32_t       lino = 0;
226,093,314✔
1758
  SCompressInfo cinfo;
226,091,304✔
1759

1760
  // uid
1761
  if (hdr->szUid > 0) {
226,135,813✔
1762
    cinfo = (SCompressInfo){
341,667,594✔
1763
        .cmprAlg = hdr->cmprAlg,
170,843,999✔
1764
        .dataType = TSDB_DATA_TYPE_BIGINT,
1765
        .compressedSize = hdr->szUid,
170,841,459✔
1766
        .originalSize = sizeof(int64_t) * hdr->nRow,
170,879,864✔
1767
    };
1768

1769
    code = tRealloc((uint8_t **)&blockData->aUid, cinfo.originalSize);
170,841,963✔
1770
    TSDB_CHECK_CODE(code, lino, _exit);
170,844,458✔
1771
    code = tDecompressData(BR_PTR(br), &cinfo, blockData->aUid, cinfo.originalSize, assist);
170,844,458✔
1772
    TSDB_CHECK_CODE(code, lino, _exit);
170,866,378✔
1773
    br->offset += cinfo.compressedSize;
170,866,378✔
1774
  }
1775

1776
  // version
1777
  cinfo = (SCompressInfo){
452,319,008✔
1778
      .cmprAlg = hdr->cmprAlg,
226,256,862✔
1779
      .dataType = TSDB_DATA_TYPE_BIGINT,
1780
      .compressedSize = hdr->szVer,
226,197,059✔
1781
      .originalSize = sizeof(int64_t) * hdr->nRow,
226,201,662✔
1782
  };
1783
  code = tRealloc((uint8_t **)&blockData->aVersion, cinfo.originalSize);
226,206,883✔
1784
  TSDB_CHECK_CODE(code, lino, _exit);
226,228,745✔
1785
  code = tDecompressData(BR_PTR(br), &cinfo, blockData->aVersion, cinfo.originalSize, assist);
226,228,745✔
1786
  TSDB_CHECK_CODE(code, lino, _exit);
226,273,087✔
1787
  br->offset += cinfo.compressedSize;
226,273,087✔
1788

1789
  // ts
1790
  cinfo = (SCompressInfo){
452,404,149✔
1791
      .cmprAlg = hdr->cmprAlg,
226,242,889✔
1792
      .dataType = TSDB_DATA_TYPE_TIMESTAMP,
1793
      .compressedSize = hdr->szKey,
226,249,518✔
1794
      .originalSize = sizeof(TSKEY) * hdr->nRow,
226,248,624✔
1795
  };
1796
  code = tRealloc((uint8_t **)&blockData->aTSKEY, cinfo.originalSize);
226,225,102✔
1797
  TSDB_CHECK_CODE(code, lino, _exit);
226,227,516✔
1798
  code = tDecompressData(BR_PTR(br), &cinfo, blockData->aTSKEY, cinfo.originalSize, assist);
226,227,516✔
1799
  TSDB_CHECK_CODE(code, lino, _exit);
226,253,261✔
1800
  br->offset += cinfo.compressedSize;
226,253,261✔
1801

1802
  // primary keys
1803
  for (int i = 0; i < hdr->numOfPKs; i++) {
259,765,986✔
1804
    const SBlockCol *blockCol = &hdr->primaryBlockCols[i];
33,549,215✔
1805

1806
    if (!(blockCol->flag == HAS_VALUE)) {
33,551,620✔
1807
      TSDB_CHECK_CODE(code = TSDB_CODE_FILE_CORRUPTED, lino, _exit);
×
1808
    }
1809
    if (!(blockCol->cflag & COL_IS_KEY)) {
33,547,981✔
1810
      TSDB_CHECK_CODE(code = TSDB_CODE_FILE_CORRUPTED, lino, _exit);
×
1811
    }
1812

1813
    code = tBlockDataDecompressColData(hdr, blockCol, br, blockData, assist);
33,551,606✔
1814
    TSDB_CHECK_CODE(code, lino, _exit);
33,536,517✔
1815
  }
1816

1817
_exit:
226,126,619✔
1818
  return code;
226,161,200✔
1819
}
1820

1821
int32_t tsdbGetColCmprAlgFromSet(SHashObj *set, int16_t colId, uint32_t *alg) {
458,251,916✔
1822
  if (set == NULL) return -1;
458,251,916✔
1823

1824
  uint32_t *ret = taosHashGet(set, &colId, sizeof(colId));
458,031,776✔
1825
  if (ret == NULL) {
458,045,392✔
1826
    return TSDB_CODE_NOT_FOUND;
1,420✔
1827
  }
1828

1829
  *alg = *ret;
458,043,972✔
1830
  return 0;
458,041,149✔
1831
}
1832
uint32_t tsdbCvtTimestampAlg(uint32_t alg) {
×
1833
  DEFINE_VAR(alg)
×
1834

1835
  return 0;
×
1836
}
1837

1838
int32_t tsdbAllocateDisk(STsdb *tsdb, const char *label, int32_t expLevel, SDiskID *diskId) {
18,875,698✔
1839
  int32_t code = 0;
18,875,698✔
1840
  int32_t lino = 0;
18,875,698✔
1841
  SDiskID did = {0};
18,875,698✔
1842
  STfs   *tfs = tsdb->pVnode->pTfs;
18,892,849✔
1843

1844
  code = tfsAllocDisk(tfs, expLevel, label, &did);
18,900,223✔
1845
  if (code) {
18,908,146✔
1846
    tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(tsdb->pVnode), __func__, __FILE__, __LINE__,
×
1847
              tstrerror(code));
1848
    return code;
×
1849
  }
1850

1851
  if (tfsMkdirRecurAt(tfs, tsdb->path, did) != 0) {
18,908,146✔
1852
    tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(tsdb->pVnode), __func__, __FILE__, __LINE__,
×
1853
              tstrerror(code));
1854
  }
1855

1856
  if (diskId) {
18,882,955✔
1857
    *diskId = did;
18,881,402✔
1858
  }
1859
  return code;
18,890,883✔
1860
}
1861

1862
int32_t tsdbAllocateDiskAtLevel(STsdb *tsdb, int32_t level, const char *label, SDiskID *diskId) {
65,531✔
1863
  int32_t code = 0;
65,531✔
1864
  SDiskID did = {0};
65,531✔
1865
  STfs   *tfs = tsdb->pVnode->pTfs;
65,531✔
1866

1867
  code = tfsAllocDiskAtLevel(tfs, level, label, &did);
65,531✔
1868
  if (code) {
65,531✔
1869
    return code;
×
1870
  }
1871

1872
  if (tfsMkdirRecurAt(tfs, tsdb->path, did) != 0) {
65,531✔
1873
    tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(tsdb->pVnode), __func__, __FILE__, __LINE__,
×
1874
              tstrerror(code));
1875
  }
1876

1877
  if (diskId) {
65,531✔
1878
    *diskId = did;
65,531✔
1879
  }
1880
  return 0;
65,531✔
1881
}
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