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

taosdata / TDengine / #3564

24 Dec 2024 05:40AM UTC coverage: 62.21% (+1.2%) from 61.045%
#3564

push

travis-ci

web-flow
Merge pull request #29289 from taosdata/fix/TD-33270-2

ci(stream):add stream unit test

138331 of 285924 branches covered (48.38%)

Branch coverage included in aggregate %.

215800 of 283329 relevant lines covered (76.17%)

19198660.97 hits per line

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

61.8
/source/common/src/tdataformat.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 "tdataformat.h"
18
#include "tRealloc.h"
19
#include "tdatablock.h"
20
#include "tlog.h"
21

22
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData);
23
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward);
24

25
// ================================
26
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson);
27

28
// SRow ========================================================================
29
#define KV_FLG_LIT ((uint8_t)0x10)
30
#define KV_FLG_MID ((uint8_t)0x20)
31
#define KV_FLG_BIG ((uint8_t)0x40)
32

33
#define BIT_FLG_NONE  ((uint8_t)0x0)
34
#define BIT_FLG_NULL  ((uint8_t)0x1)
35
#define BIT_FLG_VALUE ((uint8_t)0x2)
36

37
#pragma pack(push, 1)
38
typedef struct {
39
  int16_t nCol;
40
  uint8_t idx[];  // uint8_t * | uint16_t * | uint32_t *
41
} SKVIdx;
42
#pragma pack(pop)
43

44
#define ROW_SET_BITMAP(PB, FLAG, IDX, VAL)      \
45
  do {                                          \
46
    switch (FLAG) {                             \
47
      case (HAS_NULL | HAS_NONE):               \
48
        SET_BIT1(PB, IDX, VAL);                 \
49
        break;                                  \
50
      case (HAS_VALUE | HAS_NONE):              \
51
        SET_BIT1(PB, IDX, (VAL) ? (VAL)-1 : 0); \
52
        break;                                  \
53
      case (HAS_VALUE | HAS_NULL):              \
54
        SET_BIT1(PB, IDX, (VAL)-1);             \
55
        break;                                  \
56
      case (HAS_VALUE | HAS_NULL | HAS_NONE):   \
57
        SET_BIT2(PB, IDX, VAL);                 \
58
        break;                                  \
59
      default:                                  \
60
        break;                                  \
61
    }                                           \
62
  } while (0)
63

64
static int32_t tPutPrimaryKeyIndex(uint8_t *p, const SPrimaryKeyIndex *index) {
641,340,269✔
65
  int32_t n = 0;
641,340,269✔
66
  n += tPutI8(p ? p + n : p, index->type);
641,340,269✔
67
  n += tPutU32v(p ? p + n : p, index->offset);
641,340,269✔
68
  return n;
641,340,269✔
69
}
70

71
static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
2,147,483,647✔
72
  int32_t n = 0;
2,147,483,647✔
73
  n += tGetI8(p + n, &index->type);
2,147,483,647!
74
  n += tGetU32v(p + n, &index->offset);
2,147,483,647!
75
  return n;
2,147,483,647✔
76
}
77

78
typedef struct {
79
  int32_t numOfNone;
80
  int32_t numOfNull;
81
  int32_t numOfValue;
82
  int32_t numOfPKs;
83
  int8_t  flag;
84

85
  // tuple
86
  int8_t           tupleFlag;
87
  SPrimaryKeyIndex tupleIndices[TD_MAX_PK_COLS];
88
  int32_t          tuplePKSize;      // primary key size
89
  int32_t          tupleBitmapSize;  // bitmap size
90
  int32_t          tupleFixedSize;   // fixed part size
91
  int32_t          tupleVarSize;     // var part size
92
  int32_t          tupleRowSize;
93

94
  // key-value
95
  int8_t           kvFlag;
96
  SPrimaryKeyIndex kvIndices[TD_MAX_PK_COLS];
97
  int32_t          kvMaxOffset;
98
  int32_t          kvPKSize;       // primary key size
99
  int32_t          kvIndexSize;    // offset array size
100
  int32_t          kvPayloadSize;  // payload size
101
  int32_t          kvRowSize;
102
} SRowBuildScanInfo;
103

104
static FORCE_INLINE int32_t tRowBuildScanAddNone(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
105
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NONE;
×
106
  sinfo->numOfNone++;
2,147,483,647✔
107
  return 0;
2,147,483,647✔
108
}
109

110
static FORCE_INLINE int32_t tRowBuildScanAddNull(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
111
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
112
  sinfo->numOfNull++;
29,837,344✔
113
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
29,837,344✔
114
  sinfo->kvPayloadSize += tPutI16v(NULL, -pTColumn->colId);
29,837,344✔
115
  return 0;
29,837,344✔
116
}
117

118
static FORCE_INLINE void tRowBuildScanAddValue(SRowBuildScanInfo *sinfo, SColVal *colVal, const STColumn *pTColumn) {
119
  bool isPK = ((pTColumn->flags & COL_IS_KEY) != 0);
2,147,483,647✔
120

121
  if (isPK) {
2,147,483,647✔
122
    sinfo->tupleIndices[sinfo->numOfPKs].type = colVal->value.type;
220,250,366✔
123
    sinfo->tupleIndices[sinfo->numOfPKs].offset =
220,250,366✔
124
        IS_VAR_DATA_TYPE(pTColumn->type) ? sinfo->tupleVarSize + sinfo->tupleFixedSize : pTColumn->offset;
220,250,366!
125
    sinfo->kvIndices[sinfo->numOfPKs].type = colVal->value.type;
220,250,366✔
126
    sinfo->kvIndices[sinfo->numOfPKs].offset = sinfo->kvPayloadSize;
220,250,366✔
127
    sinfo->numOfPKs++;
220,250,366✔
128
  }
129

130
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
2,147,483,647✔
131
  if (IS_VAR_DATA_TYPE(colVal->value.type)) {
2,147,483,647!
132
    sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)  // size
556,671,286✔
133
                           + colVal->value.nData;               // value
556,671,286✔
134

135
    sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
556,671,286✔
136
                            + tPutU32v(NULL, colVal->value.nData)  // size
556,671,286✔
137
                            + colVal->value.nData;                 // value
556,671,286✔
138
  } else {
139
    sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)              // colId
2,147,483,647✔
140
                            + tDataTypes[colVal->value.type].bytes;  // value
2,147,483,647✔
141
  }
142
  sinfo->numOfValue++;
2,147,483,647✔
143
}
2,147,483,647✔
144

145
static int32_t tRowBuildScan(SArray *colVals, const STSchema *schema, SRowBuildScanInfo *sinfo) {
1,059,877,139✔
146
  int32_t  code = 0;
1,059,877,139✔
147
  int32_t  colValIndex = 1;
1,059,877,139✔
148
  int32_t  numOfColVals = TARRAY_SIZE(colVals);
1,059,877,139✔
149
  SColVal *colValArray = (SColVal *)TARRAY_DATA(colVals);
1,059,877,139✔
150

151
  if (!(numOfColVals > 0)) {
1,059,877,139!
152
    return TSDB_CODE_INVALID_PARA;
×
153
  }
154
  if (!(colValArray[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
1,059,877,139!
155
    return TSDB_CODE_INVALID_PARA;
×
156
  }
157
  if (!(colValArray[0].value.type == TSDB_DATA_TYPE_TIMESTAMP)) {
1,059,877,139!
158
    return TSDB_CODE_INVALID_PARA;
×
159
  }
160

161
  *sinfo = (SRowBuildScanInfo){
1,059,877,139✔
162
      .tupleFixedSize = schema->flen,
1,059,877,139✔
163
  };
164

165
  // loop scan
166
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
167
    for (;;) {
168
      if (colValIndex >= numOfColVals) {
2,147,483,647✔
169
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
64!
170
        break;
32✔
171
      }
172

173
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647✔
174
        if (!(colValArray[colValIndex].value.type == schema->columns[i].type)) {
2,147,483,647!
175
          code = TSDB_CODE_INVALID_PARA;
×
176
          goto _exit;
×
177
        }
178

179
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {
2,147,483,647✔
180
          tRowBuildScanAddValue(sinfo, &colValArray[colValIndex], schema->columns + i);
2,147,483,647✔
181
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {
2,147,483,647✔
182
          if ((code = tRowBuildScanAddNull(sinfo, schema->columns + i))) goto _exit;
59,674,688!
183
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {
2,147,483,647!
184
          if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
2,147,483,647!
185
        }
186

187
        colValIndex++;
2,147,483,647✔
188
        break;
2,147,483,647✔
189
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {
4,315,242✔
190
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
62!
191
        break;
31✔
192
      } else {  // skip useless value
193
        colValIndex++;
4,315,211✔
194
      }
195
    }
196
  }
197

198
  if (sinfo->numOfNone) {
1,059,877,139✔
199
    sinfo->flag |= HAS_NONE;
343,144,725✔
200
  }
201
  if (sinfo->numOfNull) {
1,059,877,139✔
202
    sinfo->flag |= HAS_NULL;
21,096,932✔
203
  }
204
  if (sinfo->numOfValue) {
1,059,877,139✔
205
    sinfo->flag |= HAS_VALUE;
1,004,190,493✔
206
  }
207

208
  // Tuple
209
  sinfo->tupleFlag = sinfo->flag;
1,059,877,139✔
210
  switch (sinfo->flag) {
1,059,877,139!
211
    case HAS_NONE:
64,160,993✔
212
    case HAS_NULL:
213
      sinfo->tupleBitmapSize = 0;
64,160,993✔
214
      sinfo->tupleFixedSize = 0;
64,160,993✔
215
      break;
64,160,993✔
216
    case HAS_VALUE:
706,265,202✔
217
      sinfo->tupleBitmapSize = 0;
706,265,202✔
218
      sinfo->tupleFixedSize = schema->flen;
706,265,202✔
219
      break;
706,265,202✔
220
    case (HAS_NONE | HAS_NULL):
24,270✔
221
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
24,270✔
222
      sinfo->tupleFixedSize = 0;
24,270✔
223
      break;
24,270✔
224
    case (HAS_NONE | HAS_VALUE):
299,204,060✔
225
    case (HAS_NULL | HAS_VALUE):
226
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
299,204,060✔
227
      sinfo->tupleFixedSize = schema->flen;
299,204,060✔
228
      break;
299,204,060✔
229
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
449,645✔
230
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
449,645✔
231
      sinfo->tupleFixedSize = schema->flen;
449,645✔
232
      break;
449,645✔
233
  }
234
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
1,277,720,932✔
235
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
219,023,886✔
236
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
219,023,886✔
237
  }
238
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
1,058,697,046✔
239
                        + sinfo->tuplePKSize      // primary keys
1,058,697,046✔
240
                        + sinfo->tupleBitmapSize  // bitmap
1,058,697,046✔
241
                        + sinfo->tupleFixedSize   // fixed part
1,058,697,046✔
242
                        + sinfo->tupleVarSize;    // var part
1,058,697,046✔
243

244
  // Key-Value
245
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
1,058,697,046!
246
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
1,063,307,281✔
247
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
1,063,307,281✔
248
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
×
249
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
4,938,178✔
250
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
4,938,178✔
251
  } else {
252
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
×
253
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
×
254
  }
255
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
1,275,367,661✔
256
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
217,778,229✔
257
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
217,778,229✔
258
  }
259
  sinfo->kvRowSize = sizeof(SRow)             // SRow
1,057,589,432✔
260
                     + sinfo->kvPKSize        // primary keys
1,057,589,432✔
261
                     + sinfo->kvIndexSize     // index array
1,057,589,432✔
262
                     + sinfo->kvPayloadSize;  // payload
1,057,589,432✔
263

264
_exit:
1,057,589,432✔
265
  return code;
1,057,589,432✔
266
}
267

268
static int32_t tRowBuildTupleRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
781,010,297✔
269
                                 SRow **ppRow) {
270
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
781,010,297✔
271

272
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
781,010,297!
273
  if (*ppRow == NULL) {
791,938,890!
274
    return terrno;
×
275
  }
276
  (*ppRow)->flag = sinfo->tupleFlag;
791,938,890✔
277
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
791,938,890✔
278
  (*ppRow)->sver = schema->version;
791,938,890✔
279
  (*ppRow)->len = sinfo->tupleRowSize;
791,938,890✔
280
  (*ppRow)->ts = colValArray[0].value.val;
791,938,890✔
281

282
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
791,938,890✔
283
    return 0;
67,435,018✔
284
  }
285

286
  uint8_t *primaryKeys = (*ppRow)->data;
724,503,872✔
287
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
724,503,872✔
288
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
724,503,872✔
289
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
724,503,872✔
290

291
  // primary keys
292
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
942,358,361✔
293
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
220,888,528✔
294
  }
295

296
  // bitmap + fixed + varlen
297
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
721,469,833✔
298
  int32_t colValIndex = 1;
721,469,833✔
299
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
300
    for (;;) {
301
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647!
302
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
303
        break;
×
304
      }
305

306
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647✔
307
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
2,147,483,647✔
308
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_VALUE);
2,147,483,647!
309

310
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
311
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
166,963,458✔
312
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
166,963,458✔
313
            if (colValArray[colValIndex].value.nData) {
166,963,458!
314
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
171,578,068✔
315
              varlen += colValArray[colValIndex].value.nData;
171,578,068✔
316
            }
317
          } else {
318
            (void)memcpy(fixed + schema->columns[i].offset, &colValArray[colValIndex].value.val,
2,147,483,647✔
319
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
320
          }
321
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
14,030,565!
322
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
16,342,602!
323
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
324
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
467,261!
325
        }
326

327
        colValIndex++;
2,147,483,647✔
328
        break;
2,147,483,647✔
329
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
2,678,297✔
330
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
9!
331
        break;
9✔
332
      } else {
333
        colValIndex++;
2,678,288✔
334
      }
335
    }
336
  }
337

338
  return 0;
721,469,833✔
339
}
340

341
static FORCE_INLINE void tRowBuildKVRowSetIndex(uint8_t flag, SKVIdx *indices, uint32_t offset) {
342
  if (flag & KV_FLG_LIT) {
2,147,483,647✔
343
    ((uint8_t *)indices->idx)[indices->nCol] = (uint8_t)offset;
2,147,483,647✔
344
  } else if (flag & KV_FLG_MID) {
6,662,290!
345
    ((uint16_t *)indices->idx)[indices->nCol] = (uint16_t)offset;
7,550,481✔
346
  } else {
347
    ((uint32_t *)indices->idx)[indices->nCol] = (uint32_t)offset;
×
348
  }
349
  indices->nCol++;
2,147,483,647✔
350
}
2,147,483,647✔
351

352
static int32_t tRowBuildKVRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema, SRow **ppRow) {
285,569,622✔
353
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
285,569,622✔
354

355
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
285,569,622!
356
  if (*ppRow == NULL) {
285,963,190!
357
    return terrno;
×
358
  }
359
  (*ppRow)->flag = sinfo->kvFlag;
285,963,190✔
360
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
285,963,190✔
361
  (*ppRow)->sver = schema->version;
285,963,190✔
362
  (*ppRow)->len = sinfo->kvRowSize;
285,963,190✔
363
  (*ppRow)->ts = colValArray[0].value.val;
285,963,190✔
364

365
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
285,963,190!
366
    return TSDB_CODE_INVALID_PARA;
×
367
  }
368

369
  uint8_t *primaryKeys = (*ppRow)->data;
285,981,537✔
370
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
285,981,537✔
371
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
285,981,537✔
372
  uint32_t payloadSize = 0;
285,981,537✔
373

374
  // primary keys
375
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
287,380,962✔
376
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
1,399,432✔
377
  }
378

379
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
285,981,530✔
380
  int32_t colValIndex = 1;
285,981,530✔
381
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
382
    for (;;) {
383
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
384
        break;
32✔
385
      }
386

387
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
388
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
2,147,483,647✔
389
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
2,147,483,647✔
390
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
391
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
393,075,225✔
392
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
393,075,225✔
393
            if (colValArray[colValIndex].value.nData > 0) {
393,075,225!
394
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
400,341,753✔
395
                           colValArray[colValIndex].value.nData);
400,341,753✔
396
            }
397
            payloadSize += colValArray[colValIndex].value.nData;
393,075,225✔
398
          } else {
399
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,147,483,647✔
400
            (void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
2,147,483,647✔
401
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
402
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,147,483,647✔
403
          }
404
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
2,147,483,647✔
405
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
13,144,780✔
406
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
26,289,560✔
407
        }
408

409
        colValIndex++;
2,147,483,647✔
410
        break;
2,147,483,647✔
411
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
412
        break;
22✔
413
      } else {
414
        colValIndex++;
×
415
      }
416
    }
417
  }
418

419
  return 0;
285,981,530✔
420
}
421

422
int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow) {
1,060,309,112✔
423
  int32_t           code;
424
  SRowBuildScanInfo sinfo;
425

426
  code = tRowBuildScan(aColVal, pTSchema, &sinfo);
1,060,309,112✔
427
  if (code) return code;
1,066,982,959!
428

429
  if (sinfo.tupleRowSize <= sinfo.kvRowSize) {
1,066,982,959✔
430
    code = tRowBuildTupleRow(aColVal, &sinfo, pTSchema, ppRow);
781,743,592✔
431
  } else {
432
    code = tRowBuildKVRow(aColVal, &sinfo, pTSchema, ppRow);
285,239,367✔
433
  }
434
  return code;
1,070,262,374✔
435
}
436

437
static int32_t tBindInfoCompare(const void *p1, const void *p2, const void *param) {
×
438
  if (((SBindInfo *)p1)->columnId < ((SBindInfo *)p2)->columnId) {
×
439
    return -1;
×
440
  } else if (((SBindInfo *)p1)->columnId > ((SBindInfo *)p2)->columnId) {
×
441
    return 1;
×
442
  }
443
  return 0;
×
444
}
445

446
/* build rows to `rowArray` from bind
447
 * `infos` is the bind information array
448
 * `numOfInfos` is the number of bind information
449
 * `infoSorted` is whether the bind information is sorted by column id
450
 * `pTSchema` is the schema of the table
451
 * `rowArray` is the array to store the rows
452
 * `pOrdered` is the pointer to store ordered
453
 * `pDupTs` is the pointer to store duplicateTs
454
 */
455
int32_t tRowBuildFromBind(SBindInfo *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
5,465✔
456
                          SArray *rowArray, bool *pOrdered, bool *pDupTs) {
457
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
5,465!
458
    return TSDB_CODE_INVALID_PARA;
×
459
  }
460

461
  if (!infoSorted) {
5,465!
462
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
463
  }
464

465
  int32_t code = 0;
5,465✔
466
  int32_t numOfRows = infos[0].bind->num;
5,465✔
467
  SArray *colValArray;
468
  SColVal colVal;
469

470
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
5,465!
471
    return terrno;
×
472
  }
473

474
  SRowKey rowKey, lastRowKey;
475
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
16,425✔
476
    taosArrayClear(colValArray);
10,960✔
477

478
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
164,479✔
479
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
153,532✔
480
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
650✔
481
      } else {
482
        SValue value = {
152,882✔
483
            .type = infos[iInfo].type,
152,882✔
484
        };
485
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
152,882!
486
          value.nData = infos[iInfo].bind->length[iRow];
21,819✔
487
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
21,819!
488
            code = TSDB_CODE_INVALID_PARA;
×
489
            goto _exit;
×
490
          }
491
          value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
21,819✔
492
        } else {
493
          (void)memcpy(&value.val, (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
131,063✔
494
                       infos[iInfo].bind->buffer_length);
131,063✔
495
        }
496
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
152,882✔
497
      }
498
      if (taosArrayPush(colValArray, &colVal) == NULL) {
153,519!
499
        code = terrno;
×
500
        goto _exit;
×
501
      }
502
    }
503

504
    SRow *row;
505
    if ((code = tRowBuild(colValArray, pTSchema, &row))) {
10,947!
506
      goto _exit;
×
507
    }
508

509
    if ((taosArrayPush(rowArray, &row)) == NULL) {
10,959!
510
      code = terrno;
×
511
      goto _exit;
×
512
    }
513

514
    if (pOrdered && pDupTs) {
10,959!
515
      tRowGetKey(row, &rowKey);
10,959!
516
      if (iRow == 0) {
10,959✔
517
        *pOrdered = true;
5,466✔
518
        *pDupTs = false;
5,466✔
519
      } else {
520
        // no more compare if we already get disordered or duplicate rows
521
        if (*pOrdered && !*pDupTs) {
5,493!
522
          int32_t code = tRowKeyCompare(&rowKey, &lastRowKey);
5,493✔
523
          *pOrdered = (code >= 0);
5,493✔
524
          *pDupTs = (code == 0);
5,493✔
525
        }
526
      }
527
      lastRowKey = rowKey;
10,959✔
528
    }
529
  }
530

531
_exit:
5,465✔
532
  taosArrayDestroy(colValArray);
5,465✔
533
  return code;
5,466✔
534
}
535

536
int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
2,147,483,647✔
537
  if (!(iCol < pTSchema->numOfCols)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
538
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
539

540
  STColumn *pTColumn = pTSchema->columns + iCol;
2,147,483,647✔
541

542
  if (iCol == 0) {
2,147,483,647✔
543
    pColVal->cid = pTColumn->colId;
67,067,206✔
544
    pColVal->value.type = pTColumn->type;
67,067,206✔
545
    pColVal->flag = CV_FLAG_VALUE;
67,067,206✔
546
    (void)memcpy(&pColVal->value.val, &pRow->ts, sizeof(TSKEY));
67,067,206✔
547
    return 0;
67,067,206✔
548
  }
549

550
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
551
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,916,606✔
552
    return 0;
1,916,606✔
553
  }
554

555
  if (pRow->flag == HAS_NULL) {
2,147,483,647✔
556
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
931,866✔
557
    return 0;
931,866✔
558
  }
559

560
  SPrimaryKeyIndex index;
561
  uint8_t         *data = pRow->data;
2,147,483,647✔
562
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
563
    data += tGetPrimaryKeyIndex(data, &index);
88,169,870✔
564
  }
565

566
  if (pRow->flag >> 4) {  // KV Row
2,147,483,647✔
567
    SKVIdx  *pIdx = (SKVIdx *)data;
2,147,483,647✔
568
    uint8_t *pv = NULL;
2,147,483,647✔
569

570
    if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
571
      pv = pIdx->idx + pIdx->nCol;
2,147,483,647✔
572
    } else if (pRow->flag & KV_FLG_MID) {
68,620,705!
573
      pv = pIdx->idx + (pIdx->nCol << 1);
86,801,980✔
574
    } else {
575
      pv = pIdx->idx + (pIdx->nCol << 2);
×
576
    }
577

578
    int16_t lidx = 0;
2,147,483,647✔
579
    int16_t ridx = pIdx->nCol - 1;
2,147,483,647✔
580
    while (lidx <= ridx) {
2,147,483,647✔
581
      int16_t  mid = (lidx + ridx) >> 1;
2,147,483,647✔
582
      uint8_t *pData = NULL;
2,147,483,647✔
583
      if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
584
        pData = pv + ((uint8_t *)pIdx->idx)[mid];
2,147,483,647✔
585
      } else if (pRow->flag & KV_FLG_MID) {
364,845,286!
586
        pData = pv + ((uint16_t *)pIdx->idx)[mid];
364,917,628✔
587
      } else {
588
        pData = pv + ((uint32_t *)pIdx->idx)[mid];
×
589
      }
590

591
      int16_t cid;
592
      pData += tGetI16v(pData, &cid);
2,147,483,647✔
593

594
      if (TABS(cid) == pTColumn->colId) {
2,147,483,647✔
595
        if (cid < 0) {
2,147,483,647✔
596
          *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
87,796,112✔
597
        } else {
598
          pColVal->cid = pTColumn->colId;
2,147,483,647✔
599
          pColVal->value.type = pTColumn->type;
2,147,483,647✔
600
          pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
601

602
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647!
603
            pData += tGetU32v(pData, &pColVal->value.nData);
664,396,707!
604
            if (pColVal->value.nData > 0) {
664,396,707!
605
              pColVal->value.pData = pData;
751,953,928✔
606
            } else {
607
              pColVal->value.pData = NULL;
×
608
            }
609
          } else {
610
            (void)memcpy(&pColVal->value.val, pData, pTColumn->bytes);
2,147,483,647✔
611
          }
612
        }
613
        return 0;
2,147,483,647✔
614
      } else if (TABS(cid) < pTColumn->colId) {
2,147,483,647✔
615
        lidx = mid + 1;
2,147,483,647✔
616
      } else {
617
        ridx = mid - 1;
2,147,483,647✔
618
      }
619
    }
620

621
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,812,123,052✔
622
  } else {  // Tuple Row
623
    uint8_t *bitmap = data;
808,633,096✔
624
    uint8_t *fixed;
625
    uint8_t *varlen;
626
    uint8_t  bit;
627

628
    if (pRow->flag == HAS_VALUE) {
808,633,096✔
629
      fixed = bitmap;
752,912,333✔
630
      bit = BIT_FLG_VALUE;
752,912,333✔
631
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
55,720,763!
632
      fixed = BIT2_SIZE(pTSchema->numOfCols - 1) + bitmap;
×
633
      bit = GET_BIT2(bitmap, iCol - 1);
×
634
    } else {
635
      fixed = BIT1_SIZE(pTSchema->numOfCols - 1) + bitmap;
55,720,763✔
636
      bit = GET_BIT1(bitmap, iCol - 1);
55,720,763✔
637

638
      if (pRow->flag == (HAS_NONE | HAS_VALUE)) {
55,720,763✔
639
        if (bit) bit++;
20,375✔
640
      } else if (pRow->flag == (HAS_NULL | HAS_VALUE)) {
55,700,388!
641
        bit++;
89,863,698✔
642
      }
643
    }
644
    varlen = fixed + pTSchema->flen;
808,633,096✔
645

646
    if (bit == BIT_FLG_NONE) {
808,633,096✔
647
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
7,239✔
648
      return 0;
7,239✔
649
    } else if (bit == BIT_FLG_NULL) {
808,625,857✔
650
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
9,798,571✔
651
      return 0;
9,798,571✔
652
    }
653

654
    pColVal->cid = pTColumn->colId;
798,827,286✔
655
    pColVal->value.type = pTColumn->type;
798,827,286✔
656
    pColVal->flag = CV_FLAG_VALUE;
798,827,286✔
657
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
798,827,286!
658
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
32,481,458✔
659
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
64,962,916!
660
    } else {
661
      (void)memcpy(&pColVal->value.val, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
766,345,828✔
662
    }
663
  }
664

665
  return 0;
2,147,483,647✔
666
}
667

668
void tRowDestroy(SRow *pRow) {
721,467,057✔
669
  if (pRow) taosMemoryFree(pRow);
721,467,057!
670
}
721,508,172✔
671

672
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
265,100,116✔
673
  SRowKey key1, key2;
674
  tRowGetKey(*(SRow **)p1, &key1);
265,100,116✔
675
  tRowGetKey(*(SRow **)p2, &key2);
250,000,013✔
676
  return tRowKeyCompare(&key1, &key2);
262,659,386✔
677
}
678
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
1,026✔
679
static int32_t tRowMergeImpl(SArray *aRowP, STSchema *pTSchema, int32_t iStart, int32_t iEnd, int8_t flag) {
249✔
680
  int32_t code = 0;
249✔
681

682
  int32_t    nRow = iEnd - iStart;
249✔
683
  SRowIter **aIter = NULL;
249✔
684
  SArray    *aColVal = NULL;
249✔
685
  SRow      *pRow = NULL;
249✔
686

687
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
249!
688
  if (aIter == NULL) {
249!
689
    code = terrno;
×
690
    goto _exit;
×
691
  }
692

693
  for (int32_t i = 0; i < nRow; i++) {
1,275✔
694
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
1,026✔
695

696
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
1,026✔
697
    if (code) goto _exit;
1,026!
698
  }
699

700
  // merge
701
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
249✔
702
  if (aColVal == NULL) {
249!
703
    code = terrno;
×
704
    goto _exit;
×
705
  }
706

707
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
957✔
708
    SColVal *pColVal = NULL;
708✔
709
    for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
842✔
710
      SColVal *pColValT = tRowIterNext(aIter[iRow]);
802✔
711
      while (pColValT->cid < pTSchema->columns[iCol].colId) {
892✔
712
        pColValT = tRowIterNext(aIter[iRow]);
90✔
713
      }
714

715
      // todo: take strategy according to the flag
716
      if (COL_VAL_IS_VALUE(pColValT)) {
802✔
717
        pColVal = pColValT;
668✔
718
        break;
668✔
719
      } else if (COL_VAL_IS_NULL(pColValT)) {
134✔
720
        if (pColVal == NULL) {
2✔
721
          pColVal = pColValT;
1✔
722
        }
723
      }
724
    }
725

726
    if (pColVal) {
708✔
727
      if (taosArrayPush(aColVal, pColVal) == NULL) {
669!
728
        code = terrno;
×
729
        goto _exit;
×
730
      }
731
    }
732
  }
733

734
  // build
735
  code = tRowBuild(aColVal, pTSchema, &pRow);
249✔
736
  if (code) goto _exit;
249!
737

738
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
249✔
739
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
249!
740
    code = terrno;
×
741
    goto _exit;
×
742
  }
743

744
_exit:
249✔
745
  if (aIter) {
249!
746
    for (int32_t i = 0; i < nRow; i++) {
1,275✔
747
      tRowIterClose(&aIter[i]);
1,026✔
748
    }
749
    taosMemoryFree(aIter);
249!
750
  }
751
  if (aColVal) taosArrayDestroy(aColVal);
249!
752
  if (code) tRowDestroy(pRow);
249!
753
  return code;
249✔
754
}
755

756
int32_t tRowSort(SArray *aRowP) {
34,255✔
757
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
34,255✔
758
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
34,252✔
759
  if (code != TSDB_CODE_SUCCESS) {
34,253!
760
    uError("taosArrayMSort failed caused by %d", code);
×
761
  }
762
  return code;
34,253✔
763
}
764

765
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag) {
34,306✔
766
  int32_t code = 0;
34,306✔
767

768
  int32_t iStart = 0;
34,306✔
769
  while (iStart < aRowP->size) {
38,017,573!
770
    SRowKey key1;
771
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
38,017,841✔
772

773
    tRowGetKey(row1, &key1);
38,422,046✔
774

775
    int32_t iEnd = iStart + 1;
37,978,820✔
776
    while (iEnd < aRowP->size) {
37,957,636✔
777
      SRowKey key2;
778
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
37,934,332✔
779
      tRowGetKey(row2, &key2);
38,178,460✔
780

781
      if (tRowKeyCompare(&key1, &key2) != 0) break;
37,938,779!
782

783
      iEnd++;
×
784
    }
785

786
    if (iEnd - iStart > 1) {
37,983,267✔
787
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, flag);
249✔
788
      if (code) return code;
249!
789
    }
790

791
    // the array is also changing, so the iStart just ++ instead of iEnd
792
    iStart++;
37,983,267✔
793
  }
794

795
  return code;
×
796
}
797

798
// SRowIter ========================================
799
struct SRowIter {
800
  SRow     *pRow;
801
  STSchema *pTSchema;
802

803
  int32_t iTColumn;
804
  union {
805
    struct {  // kv
806
      int32_t iCol;
807
      SKVIdx *pIdx;
808
    };
809
    struct {  // tuple
810
      uint8_t *pb;
811
      uint8_t *pf;
812
    };
813
  };
814
  uint8_t *pv;
815
  SColVal  cv;
816
};
817

818
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
1,550,258✔
819
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
1,550,258!
820

821
  int32_t code = 0;
1,550,258✔
822

823
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
1,550,258!
824
  if (pIter == NULL) {
1,626,063!
825
    code = terrno;
×
826
    goto _exit;
×
827
  }
828

829
  pIter->pRow = pRow;
1,626,063✔
830
  pIter->pTSchema = pTSchema;
1,626,063✔
831
  pIter->iTColumn = 0;
1,626,063✔
832

833
  if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
1,626,063!
834

835
  uint8_t         *data = pRow->data;
1,625,692✔
836
  SPrimaryKeyIndex index;
837
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,625,731✔
838
    data += tGetPrimaryKeyIndex(data, &index);
39✔
839
  }
840

841
  if (pRow->flag >> 4) {
1,625,692✔
842
    pIter->iCol = 0;
1,623,066✔
843
    pIter->pIdx = (SKVIdx *)data;
1,623,066✔
844
    if (pRow->flag & KV_FLG_LIT) {
1,623,066✔
845
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
1,622,413✔
846
    } else if (pRow->flag & KV_FLG_MID) {
653!
847
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
2,100✔
848
    } else {
849
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
×
850
    }
851
  } else {
852
    switch (pRow->flag) {
2,626!
853
      case (HAS_NULL | HAS_NONE):
1✔
854
        pIter->pb = data;
1✔
855
        break;
1✔
856
      case HAS_VALUE:
2,406✔
857
        pIter->pf = data;
2,406✔
858
        pIter->pv = pIter->pf + pTSchema->flen;
2,406✔
859
        break;
2,406✔
860
      case (HAS_VALUE | HAS_NONE):
719✔
861
      case (HAS_VALUE | HAS_NULL):
862
        pIter->pb = data;
719✔
863
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
719✔
864
        pIter->pv = pIter->pf + pTSchema->flen;
719✔
865
        break;
719✔
866
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
867
        pIter->pb = data;
×
868
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
869
        pIter->pv = pIter->pf + pTSchema->flen;
×
870
        break;
×
871
      default:
×
872
        break;
×
873
    }
874
  }
875

876
_exit:
1,626,063✔
877
  if (code) {
1,626,063!
878
    *ppIter = NULL;
×
879
  } else {
880
    *ppIter = pIter;
1,626,063✔
881
  }
882
  return code;
1,626,063✔
883
}
884

885
void tRowIterClose(SRowIter **ppIter) {
1,507,789✔
886
  SRowIter *pIter = *ppIter;
1,507,789✔
887
  if (pIter) {
1,507,789!
888
    taosMemoryFree(pIter);
1,508,162!
889
  }
890
  *ppIter = NULL;
1,637,411✔
891
}
1,637,411✔
892

893
SColVal *tRowIterNext(SRowIter *pIter) {
16,301,765✔
894
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
16,301,765✔
895
    return NULL;
1,514,946✔
896
  }
897

898
  STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
14,786,819✔
899

900
  // timestamp
901
  if (0 == pIter->iTColumn) {
14,786,819✔
902
    pIter->cv.cid = pTColumn->colId;
1,576,583✔
903
    pIter->cv.value.type = pTColumn->type;
1,576,583✔
904
    pIter->cv.flag = CV_FLAG_VALUE;
1,576,583✔
905
    (void)memcpy(&pIter->cv.value.val, &pIter->pRow->ts, sizeof(TSKEY));
1,576,583✔
906
    goto _exit;
1,576,583✔
907
  }
908

909
  if (pIter->pRow->flag == HAS_NONE) {
13,210,236✔
910
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1✔
911
    goto _exit;
1✔
912
  }
913

914
  if (pIter->pRow->flag == HAS_NULL) {
13,210,235✔
915
    pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,841✔
916
    goto _exit;
1,841✔
917
  }
918

919
  if (pIter->pRow->flag >> 4) {  // KV
13,208,394!
920
    if (pIter->iCol < pIter->pIdx->nCol) {
14,426,236✔
921
      uint8_t *pData;
922

923
      if (pIter->pRow->flag & KV_FLG_LIT) {
12,481,776✔
924
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
12,439,778✔
925
      } else if (pIter->pRow->flag & KV_FLG_MID) {
41,998!
926
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
63,000✔
927
      } else {
928
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
929
      }
930

931
      int16_t cid;
932
      pData += tGetI16v(pData, &cid);
12,481,776✔
933

934
      if (TABS(cid) == pTColumn->colId) {
12,481,776!
935
        if (cid < 0) {
12,690,448✔
936
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
2,499,017✔
937
        } else {
938
          pIter->cv.cid = pTColumn->colId;
10,191,431✔
939
          pIter->cv.value.type = pTColumn->type;
10,191,431✔
940
          pIter->cv.flag = CV_FLAG_VALUE;
10,191,431✔
941

942
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
10,191,431!
943
            pData += tGetU32v(pData, &pIter->cv.value.nData);
839,526!
944
            if (pIter->cv.value.nData > 0) {
839,526!
945
              pIter->cv.value.pData = pData;
3,039,217✔
946
            } else {
947
              pIter->cv.value.pData = NULL;
×
948
            }
949
          } else {
950
            (void)memcpy(&pIter->cv.value.val, pData, pTColumn->bytes);
9,351,905✔
951
          }
952
        }
953

954
        pIter->iCol++;
12,690,448✔
955
        goto _exit;
12,690,448✔
956
      } else if (TABS(cid) > pTColumn->colId) {
×
957
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
94✔
958
        goto _exit;
94✔
959
      } else {
960
        uError("unexpected column id %d, %d", cid, pTColumn->colId);
×
961
        goto _exit;
×
962
      }
963
    } else {
964
      pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,944,460✔
965
      goto _exit;
1,944,460✔
966
    }
967
  } else {  // Tuple
968
    uint8_t bv = BIT_FLG_VALUE;
×
969
    if (pIter->pb) {
×
970
      switch (pIter->pRow->flag) {
3,002!
971
        case (HAS_NULL | HAS_NONE):
3✔
972
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
3✔
973
          break;
3✔
974
        case (HAS_VALUE | HAS_NONE):
37✔
975
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
37✔
976
          if (bv) bv++;
37✔
977
          break;
37✔
978
        case (HAS_VALUE | HAS_NULL):
2,962✔
979
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
2,962✔
980
          break;
2,962✔
981
        case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
982
          bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
×
983
          break;
×
984
        default:
×
985
          break;
×
986
      }
987

988
      if (bv == BIT_FLG_NONE) {
3,002✔
989
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
13✔
990
        goto _exit;
13✔
991
      } else if (bv == BIT_FLG_NULL) {
2,989✔
992
        pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
325✔
993
        goto _exit;
325✔
994
      }
995
    }
996

997
    pIter->cv.cid = pTColumn->colId;
×
998
    pIter->cv.value.type = pTColumn->type;
×
999
    pIter->cv.flag = CV_FLAG_VALUE;
×
1000
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
1001
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
×
1002
      pData += tGetU32v(pData, &pIter->cv.value.nData);
×
1003
      if (pIter->cv.value.nData > 0) {
×
1004
        pIter->cv.value.pData = pData;
1,960✔
1005
      } else {
1006
        pIter->cv.value.pData = NULL;
×
1007
      }
1008
    } else {
1009
      (void)memcpy(&pIter->cv.value.val, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
27,173✔
1010
    }
1011
    goto _exit;
×
1012
  }
1013

1014
_exit:
14,995,585✔
1015
  pIter->iTColumn++;
14,995,585✔
1016
  return &pIter->cv;
14,995,585✔
1017
}
1018

1019
static int32_t tRowNoneUpsertColData(SColData *aColData, int32_t nColData, int32_t flag) {
1,128✔
1020
  int32_t code = 0;
1,128✔
1021

1022
  if (flag) return code;
1,128!
1023

1024
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
8,013✔
1025
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
6,881✔
1026
    if (code) return code;
6,885!
1027
  }
1028

1029
  return code;
1,132✔
1030
}
1031
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
163,993✔
1032
  int32_t code = 0;
163,993✔
1033

1034
  int32_t   iColData = 0;
163,993✔
1035
  SColData *pColData = &aColData[iColData];
163,993✔
1036
  int32_t   iTColumn = 1;
163,993✔
1037
  STColumn *pTColumn = &pSchema->columns[iTColumn];
163,993✔
1038

1039
  while (pColData) {
594,130✔
1040
    if (pTColumn) {
430,155!
1041
      if (pTColumn->colId == pColData->cid) {  // NULL
430,155✔
1042
        if (flag == 0) {
430,151✔
1043
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
430,079✔
1044
        } else {
1045
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
72✔
1046
        }
1047
        if (code) goto _exit;
430,133!
1048

1049
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
430,133✔
1050
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
430,133✔
1051
      } else if (pTColumn->colId > pColData->cid) {  // NONE
4!
1052
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1053
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1054
      } else {
1055
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
4!
1056
      }
1057
    } else {  // NONE
1058
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1059
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1060
    }
1061
  }
1062

1063
_exit:
163,975✔
1064
  return code;
163,975✔
1065
}
1066
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
693,200,191✔
1067
                                      int32_t flag) {
1068
  int32_t code = 0;
693,200,191✔
1069

1070
  int32_t   iColData = 0;
693,200,191✔
1071
  SColData *pColData = &aColData[iColData];
693,200,191✔
1072
  int32_t   iTColumn = 1;
693,200,191✔
1073
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
693,200,191✔
1074

1075
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
693,200,191✔
1076
  SPrimaryKeyIndex index;
1077
  uint8_t         *data = pRow->data;
693,200,191✔
1078
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
932,071,980✔
1079
    data += tGetPrimaryKeyIndex(data, &index);
239,047,332✔
1080
  }
1081

1082
  switch (pRow->flag) {
693,024,648!
1083
    case HAS_VALUE:
681,311,269✔
1084
      pf = data;  // TODO: fix here
681,311,269✔
1085
      pv = pf + pTSchema->flen;
681,311,269✔
1086
      break;
681,311,269✔
1087
    case (HAS_NULL | HAS_NONE):
1,296✔
1088
      pb = data;
1,296✔
1089
      break;
1,296✔
1090
    case (HAS_VALUE | HAS_NONE):
11,924,278✔
1091
    case (HAS_VALUE | HAS_NULL):
1092
      pb = data;
11,924,278✔
1093
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
11,924,278✔
1094
      pv = pf + pTSchema->flen;
11,924,278✔
1095
      break;
11,924,278✔
1096
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1097
      pb = data;
×
1098
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
×
1099
      pv = pf + pTSchema->flen;
×
1100
      break;
×
1101
    default:
×
1102
      return TSDB_CODE_INVALID_DATA_FMT;
×
1103
  }
1104

1105
  while (pColData) {
2,147,483,647✔
1106
    if (pTColumn) {
2,147,483,647✔
1107
      if (pTColumn->colId == pColData->cid) {
2,147,483,647!
1108
        if (!(pTColumn->type == pColData->type)) {
2,147,483,647!
1109
          return TSDB_CODE_INVALID_PARA;
×
1110
        }
1111
        if (pb) {
2,147,483,647✔
1112
          uint8_t bv;
1113
          switch (pRow->flag) {
69,258,499!
1114
            case (HAS_NULL | HAS_NONE):
25,920✔
1115
              bv = GET_BIT1(pb, iTColumn - 1);
25,920✔
1116
              break;
25,920✔
1117
            case (HAS_VALUE | HAS_NONE):
198,794✔
1118
              bv = GET_BIT1(pb, iTColumn - 1);
198,794✔
1119
              if (bv) bv++;
198,794✔
1120
              break;
198,794✔
1121
            case (HAS_VALUE | HAS_NULL):
69,031,565✔
1122
              bv = GET_BIT1(pb, iTColumn - 1) + 1;
69,031,565✔
1123
              break;
69,031,565✔
1124
            case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1125
              bv = GET_BIT2(pb, iTColumn - 1);
×
1126
              break;
×
1127
            default:
2,220✔
1128
              return TSDB_CODE_INVALID_DATA_FMT;
2,220✔
1129
          }
1130

1131
          if (bv == BIT_FLG_NONE) {
69,256,279✔
1132
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
43,344!
1133
              goto _exit;
×
1134
            goto _continue;
43,335✔
1135
          } else if (bv == BIT_FLG_NULL) {
69,212,935✔
1136
            if (flag == 0) {
13,024,856✔
1137
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
12,852,904✔
1138
            } else {
1139
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
171,952✔
1140
            }
1141
            if (code) goto _exit;
13,027,168!
1142
            goto _continue;
13,027,168✔
1143
          }
1144
        }
1145

1146
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
1147
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
53,269,816!
1148
          uint32_t nData;
1149
          pData += tGetU32v(pData, &nData);
53,269,816✔
1150
          if (flag == 0) {
53,269,816!
1151
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
55,721,625✔
1152
          } else {
1153
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
1154
          }
1155
          if (code) goto _exit;
57,144,940!
1156
        } else {
1157
          if (flag == 0) {
2,147,483,647✔
1158
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
1159
                                                                          TYPE_BYTES[pColData->type]);
2,147,483,647✔
1160
          } else {
1161
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
3,906,995✔
1162
                                                                          TYPE_BYTES[pColData->type], flag > 0);
3,906,995✔
1163
          }
1164
          if (code) goto _exit;
2,147,483,647!
1165
        }
1166

1167
      _continue:
2,147,483,647✔
1168
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
1169
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
1170
      } else if (pTColumn->colId > pColData->cid) {  // NONE
×
1171
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1172
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1173
      } else {
1174
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
×
1175
      }
1176
    } else {
1177
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
420,022!
1178
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
420,017✔
1179
    }
1180
  }
1181

1182
_exit:
696,553,856✔
1183
  return code;
696,553,856✔
1184
}
1185
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
4,545,733✔
1186
  int32_t code = 0;
4,545,733✔
1187

1188
  uint8_t  *pv = NULL;
4,545,733✔
1189
  int32_t   iColData = 0;
4,545,733✔
1190
  SColData *pColData = &aColData[iColData];
4,545,733✔
1191
  int32_t   iTColumn = 1;
4,545,733✔
1192
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
4,545,733✔
1193
  int32_t   iCol = 0;
4,545,733✔
1194

1195
  // primary keys
1196
  uint8_t         *data = pRow->data;
4,545,733✔
1197
  SPrimaryKeyIndex index;
1198
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
4,731,141✔
1199
    data += tGetPrimaryKeyIndex(data, &index);
185,411✔
1200
  }
1201

1202
  SKVIdx *pKVIdx = (SKVIdx *)data;
4,545,730✔
1203
  if (pRow->flag & KV_FLG_LIT) {
4,545,730✔
1204
    pv = pKVIdx->idx + pKVIdx->nCol;
4,484,427✔
1205
  } else if (pRow->flag & KV_FLG_MID) {
61,303!
1206
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
62,883✔
1207
  } else if (pRow->flag & KV_FLG_BIG) {
×
1208
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
1209
  } else {
1210
    return TSDB_CODE_INVALID_PARA;
×
1211
  }
1212

1213
  while (pColData) {
42,423,258✔
1214
    if (pTColumn) {
37,989,096✔
1215
      if (pTColumn->colId == pColData->cid) {
37,590,059✔
1216
        while (iCol < pKVIdx->nCol) {
37,508,635✔
1217
          uint8_t *pData;
1218
          if (pRow->flag & KV_FLG_LIT) {
32,392,504✔
1219
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
30,689,420✔
1220
          } else if (pRow->flag & KV_FLG_MID) {
1,703,084!
1221
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
1,703,140✔
1222
          } else if (pRow->flag & KV_FLG_BIG) {
×
1223
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
1224
          } else {
1225
            return TSDB_CODE_INVALID_DATA_FMT;
×
1226
          }
1227

1228
          int16_t cid;
1229
          pData += tGetI16v(pData, &cid);
32,392,560✔
1230

1231
          if (TABS(cid) == pTColumn->colId) {
32,392,560✔
1232
            if (cid < 0) {
32,024,526✔
1233
              if (flag == 0) {
6,830,990✔
1234
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
6,815,763✔
1235
              } else {
1236
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
15,227✔
1237
              }
1238
              if (code) goto _exit;
6,280,030!
1239
            } else {
1240
              uint32_t nData;
1241
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
25,193,536!
1242
                pData += tGetU32v(pData, &nData);
6,053,231✔
1243
              } else {
1244
                nData = 0;
19,140,305✔
1245
              }
1246
              if (flag == 0) {
25,193,536!
1247
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
25,424,138✔
1248
              } else {
1249
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
1250
              }
1251
              if (code) goto _exit;
25,631,645!
1252
            }
1253
            iCol++;
31,911,675✔
1254
            goto _continue;
31,911,675✔
1255
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
368,034✔
1256
            break;
39,304✔
1257
          } else {
1258
            iCol++;
328,730✔
1259
          }
1260
        }
1261

1262
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
5,155,435!
1263

1264
      _continue:
5,155,112✔
1265
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
37,066,787✔
1266
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
37,066,787✔
1267
      } else if (pTColumn->colId > pColData->cid) {
410,154!
1268
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1269
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1270
      } else {
1271
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
410,154!
1272
      }
1273
    } else {
1274
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
399,037!
1275
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
399,007✔
1276
    }
1277
  }
1278

1279
_exit:
4,434,162✔
1280
  return code;
4,434,162✔
1281
}
1282
/* flag > 0: forward update
1283
 * flag == 0: append
1284
 * flag < 0: backward update
1285
 */
1286
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
697,843,514✔
1287
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
697,843,514!
1288
  if (!(nColData > 0)) return TSDB_CODE_INVALID_PARA;
697,843,514!
1289

1290
  if (pRow->flag == HAS_NONE) {
697,843,514✔
1291
    return tRowNoneUpsertColData(aColData, nColData, flag);
1,129✔
1292
  } else if (pRow->flag == HAS_NULL) {
697,842,385✔
1293
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
163,997✔
1294
  } else if (pRow->flag >> 4) {  // KV row
697,678,388✔
1295
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
4,545,467✔
1296
  } else {  // TUPLE row
1297
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
693,132,921✔
1298
  }
1299
}
1300

1301
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
2,147,483,647✔
1302
  key->numOfPKs = row->numOfPKs;
2,147,483,647✔
1303

1304
  if (key->numOfPKs == 0) {
2,147,483,647!
1305
    return;
×
1306
  }
1307

1308
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
1309

1310
  uint8_t *data = row->data;
2,147,483,647✔
1311

1312
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
1313
    data += tGetPrimaryKeyIndex(data, &indices[i]);
2,147,483,647✔
1314
  }
1315

1316
  // primary keys
1317
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
1318
    key->pks[i].type = indices[i].type;
2,147,483,647✔
1319

1320
    uint8_t *tdata = data + indices[i].offset;
2,147,483,647✔
1321
    if (row->flag >> 4) {
2,147,483,647✔
1322
      tdata += tGetI16v(tdata, NULL);
3,265,246✔
1323
    }
1324

1325
    if (IS_VAR_DATA_TYPE(indices[i].type)) {
2,147,483,647!
1326
      key->pks[i].pData = tdata;
883✔
1327
      key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
1,766!
1328
    } else {
1329
      (void)memcpy(&key->pks[i].val, tdata, tDataTypes[indices[i].type].bytes);
2,147,483,647✔
1330
    }
1331
  }
1332
}
1333

1334
#define T_COMPARE_SCALAR_VALUE(TYPE, V1, V2)    \
1335
  do {                                          \
1336
    if (*(TYPE *)(V1) < *(TYPE *)(V2)) {        \
1337
      return -1;                                \
1338
    } else if (*(TYPE *)(V1) > *(TYPE *)(V2)) { \
1339
      return 1;                                 \
1340
    } else {                                    \
1341
      return 0;                                 \
1342
    }                                           \
1343
  } while (0)
1344

1345
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
75,128,879✔
1346
  switch (tv1->type) {
75,128,879!
1347
    case TSDB_DATA_TYPE_BOOL:
×
1348
    case TSDB_DATA_TYPE_TINYINT:
1349
      T_COMPARE_SCALAR_VALUE(int8_t, &tv1->val, &tv2->val);
×
1350
    case TSDB_DATA_TYPE_SMALLINT:
×
1351
      T_COMPARE_SCALAR_VALUE(int16_t, &tv1->val, &tv2->val);
×
1352
    case TSDB_DATA_TYPE_INT:
953,652✔
1353
      T_COMPARE_SCALAR_VALUE(int32_t, &tv1->val, &tv2->val);
953,652✔
1354
    case TSDB_DATA_TYPE_BIGINT:
74,179,488✔
1355
    case TSDB_DATA_TYPE_TIMESTAMP:
1356
      T_COMPARE_SCALAR_VALUE(int64_t, &tv1->val, &tv2->val);
74,179,488✔
1357
    case TSDB_DATA_TYPE_FLOAT:
×
1358
      T_COMPARE_SCALAR_VALUE(float, &tv1->val, &tv2->val);
×
1359
    case TSDB_DATA_TYPE_DOUBLE:
×
1360
      T_COMPARE_SCALAR_VALUE(double, &tv1->val, &tv2->val);
×
1361
    case TSDB_DATA_TYPE_UTINYINT:
×
1362
      T_COMPARE_SCALAR_VALUE(uint8_t, &tv1->val, &tv2->val);
×
1363
    case TSDB_DATA_TYPE_USMALLINT:
×
1364
      T_COMPARE_SCALAR_VALUE(uint16_t, &tv1->val, &tv2->val);
×
1365
    case TSDB_DATA_TYPE_UINT:
×
1366
      T_COMPARE_SCALAR_VALUE(uint32_t, &tv1->val, &tv2->val);
×
1367
    case TSDB_DATA_TYPE_UBIGINT:
×
1368
      T_COMPARE_SCALAR_VALUE(uint64_t, &tv1->val, &tv2->val);
×
1369
    case TSDB_DATA_TYPE_GEOMETRY:
269✔
1370
    case TSDB_DATA_TYPE_BINARY: {
1371
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
269✔
1372
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
269✔
1373
    }
1374
    case TSDB_DATA_TYPE_NCHAR: {
×
1375
      int32_t ret = tasoUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
1376
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
1377
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
1378
    }
1379
    case TSDB_DATA_TYPE_VARBINARY: {
×
1380
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
1381
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
1382
    }
1383
    default:
×
1384
      break;
×
1385
  }
1386

1387
  return 0;
×
1388
}
1389

1390
// NOTE:
1391
// set key->numOfPKs to 0 as the smallest key with ts
1392
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
1393
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
2,147,483,647✔
1394
  if (key1->ts < key2->ts) {
2,147,483,647!
1395
    return -1;
2,147,483,647✔
1396
  } else if (key1->ts > key2->ts) {
2,147,483,647!
1397
    return 1;
2,147,483,647✔
1398
  }
1399

1400
  if (key1->numOfPKs == key2->numOfPKs) {
75,472,731!
1401
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
118,310,030!
1402
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
75,129,255✔
1403
      if (ret) return ret;
75,105,730!
1404
    }
1405
  } else if (key1->numOfPKs < key2->numOfPKs) {
×
1406
    return -1;
×
1407
  } else {
1408
    return 1;
×
1409
  }
1410

1411
  return 0;
43,180,775✔
1412
}
1413

1414
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
683,861,852✔
1415
  pDst->ts = pSrc->ts;
683,861,852✔
1416
  pDst->numOfPKs = pSrc->numOfPKs;
683,861,852✔
1417

1418
  if (pSrc->numOfPKs > 0) {
683,861,852✔
1419
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
57,571,896✔
1420
      SValue *pVal = &pDst->pks[i];
28,808,369✔
1421
      pVal->type = pSrc->pks[i].type;
28,808,369✔
1422

1423
      if (IS_NUMERIC_TYPE(pVal->type)) {
28,808,369!
1424
        pVal->val = pSrc->pks[i].val;
28,808,359✔
1425
      } else {
1426
        pVal->nData = pSrc->pks[i].nData;
10✔
1427
        (void)memcpy(pVal->pData, pSrc->pks[i].pData, pVal->nData);
10✔
1428
      }
1429
    }
1430
  }
1431
}
683,861,852✔
1432

1433
// STag ========================================
1434
static int tTagValCmprFn(const void *p1, const void *p2) {
131,054,328✔
1435
  if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
131,054,328✔
1436
    return -1;
44,760,579✔
1437
  } else if (((STagVal *)p1)->cid > ((STagVal *)p2)->cid) {
86,293,749✔
1438
    return 1;
47,763,673✔
1439
  }
1440

1441
  return 0;
38,530,076✔
1442
}
1443
static int tTagValJsonCmprFn(const void *p1, const void *p2) {
11,551✔
1444
  return strcmp(((STagVal *)p1)[0].pKey, ((STagVal *)p2)[0].pKey);
11,551✔
1445
}
1446

1447
#ifdef TD_DEBUG_PRINT_TAG
1448
static void debugPrintTagVal(int8_t type, const void *val, int32_t vlen, const char *tag, int32_t ln) {
1449
  switch (type) {
1450
    case TSDB_DATA_TYPE_VARBINARY:
1451
    case TSDB_DATA_TYPE_JSON:
1452
    case TSDB_DATA_TYPE_VARCHAR:
1453
    case TSDB_DATA_TYPE_NCHAR:
1454
    case TSDB_DATA_TYPE_GEOMETRY: {
1455
      char tmpVal[32] = {0};
1456
      tstrncpy(tmpVal, val, vlen > 31 ? 31 : vlen);
1457
      printf("%s:%d type:%d vlen:%d, val:\"%s\"\n", tag, ln, (int32_t)type, vlen, tmpVal);
1458
    } break;
1459
    case TSDB_DATA_TYPE_FLOAT:
1460
      printf("%s:%d type:%d vlen:%d, val:%f\n", tag, ln, (int32_t)type, vlen, *(float *)val);
1461
      break;
1462
    case TSDB_DATA_TYPE_DOUBLE:
1463
      printf("%s:%d type:%d vlen:%d, val:%lf\n", tag, ln, (int32_t)type, vlen, *(double *)val);
1464
      break;
1465
    case TSDB_DATA_TYPE_BOOL:
1466
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
1467
      break;
1468
    case TSDB_DATA_TYPE_TINYINT:
1469
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
1470
      break;
1471
    case TSDB_DATA_TYPE_SMALLINT:
1472
      printf("%s:%d type:%d vlen:%d, val:%" PRIi16 "\n", tag, ln, (int32_t)type, vlen, *(int16_t *)val);
1473
      break;
1474
    case TSDB_DATA_TYPE_INT:
1475
      printf("%s:%d type:%d vlen:%d, val:%" PRIi32 "\n", tag, ln, (int32_t)type, vlen, *(int32_t *)val);
1476
      break;
1477
    case TSDB_DATA_TYPE_BIGINT:
1478
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
1479
      break;
1480
    case TSDB_DATA_TYPE_TIMESTAMP:
1481
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
1482
      break;
1483
    case TSDB_DATA_TYPE_UTINYINT:
1484
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
1485
      break;
1486
    case TSDB_DATA_TYPE_USMALLINT:
1487
      printf("%s:%d type:%d vlen:%d, val:%" PRIu16 "\n", tag, ln, (int32_t)type, vlen, *(uint16_t *)val);
1488
      break;
1489
    case TSDB_DATA_TYPE_UINT:
1490
      printf("%s:%d type:%d vlen:%d, val:%" PRIu32 "\n", tag, ln, (int32_t)type, vlen, *(uint32_t *)val);
1491
      break;
1492
    case TSDB_DATA_TYPE_UBIGINT:
1493
      printf("%s:%d type:%d vlen:%d, val:%" PRIu64 "\n", tag, ln, (int32_t)type, vlen, *(uint64_t *)val);
1494
      break;
1495
    case TSDB_DATA_TYPE_NULL:
1496
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
1497
      break;
1498
    default:
1499
      break;
1500
  }
1501
}
1502

1503
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln) {
1504
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
1505
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
1506
  uint8_t *p = NULL;
1507
  int16_t  offset = 0;
1508

1509
  if (isLarge) {
1510
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
1511
  } else {
1512
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1513
  }
1514
  printf("%s:%d >>> STAG === %s:%s, len: %d, nTag: %d, sver:%d\n", tag, ln, isJson ? "json" : "normal",
1515
         isLarge ? "large" : "small", (int32_t)pTag->len, (int32_t)pTag->nTag, pTag->ver);
1516
  for (uint16_t n = 0; n < pTag->nTag; ++n) {
1517
    if (isLarge) {
1518
      offset = ((int16_t *)pTag->idx)[n];
1519
    } else {
1520
      offset = pTag->idx[n];
1521
    }
1522
    STagVal tagVal = {0};
1523
    if (isJson) {
1524
      tagVal.pKey = (char *)POINTER_SHIFT(p, offset);
1525
    } else {
1526
      tagVal.cid = *(int16_t *)POINTER_SHIFT(p, offset);
1527
    }
1528
    printf("%s:%d loop[%d-%d] offset=%d\n", __func__, __LINE__, (int32_t)pTag->nTag, (int32_t)n, (int32_t)offset);
1529
    tGetTagVal(p + offset, &tagVal, isJson);
1530
    if (IS_VAR_DATA_TYPE(tagVal.type)) {
1531
      debugPrintTagVal(tagVal.type, tagVal.pData, tagVal.nData, __func__, __LINE__);
1532
    } else {
1533
      debugPrintTagVal(tagVal.type, &tagVal.i64, tDataTypes[tagVal.type].bytes, __func__, __LINE__);
1534
    }
1535
  }
1536
  printf("\n");
1537
}
1538
#endif
1539

1540
static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
1,366,240✔
1541
  int32_t n = 0;
1,366,240✔
1542

1543
  // key
1544
  if (isJson) {
1,366,240✔
1545
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
1,076✔
1546
  } else {
1547
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
2,731,404✔
1548
  }
1549

1550
  // type
1551
  n += tPutI8(p ? p + n : p, pTagVal->type);
1,366,240✔
1552

1553
  // value
1554
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
1,366,240!
1555
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
679,254✔
1556
  } else {
1557
    p = p ? p + n : p;
1,026,613✔
1558
    n += tDataTypes[pTagVal->type].bytes;
1,026,613✔
1559
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
1,026,613✔
1560
  }
1561

1562
  return n;
1,366,240✔
1563
}
1564
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
128,917,866✔
1565
  int32_t n = 0;
128,917,866✔
1566

1567
  // key
1568
  if (isJson) {
128,917,866✔
1569
    n += tGetCStr(p + n, &pTagVal->pKey);
26,598!
1570
  } else {
1571
    n += tGetI16v(p + n, &pTagVal->cid);
257,809,134!
1572
  }
1573

1574
  // type
1575
  n += tGetI8(p + n, &pTagVal->type);
128,917,866!
1576

1577
  // value
1578
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
128,917,866!
1579
    n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
42,813,860!
1580
  } else {
1581
    (void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
107,510,936✔
1582
    n += tDataTypes[pTagVal->type].bytes;
107,510,936✔
1583
  }
1584

1585
  return n;
128,917,866✔
1586
}
1587

1588
bool tTagIsJson(const void *pTag) { return (((const STag *)pTag)->flags & TD_TAG_JSON); }
41,228✔
1589

1590
bool tTagIsJsonNull(void *data) {
6,866✔
1591
  STag  *pTag = (STag *)data;
6,866✔
1592
  int8_t isJson = tTagIsJson(pTag);
6,866✔
1593
  if (!isJson) return false;
6,866✔
1594
  return ((STag *)data)->nTag == 0;
2,894✔
1595
}
1596

1597
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
177,257✔
1598
  int32_t  code = 0;
177,257✔
1599
  uint8_t *p = NULL;
177,257✔
1600
  int16_t  n = 0;
177,257✔
1601
  int16_t  nTag = taosArrayGetSize(pArray);
177,257✔
1602
  int32_t  szTag = 0;
177,252✔
1603
  int8_t   isLarge = 0;
177,252✔
1604

1605
  // sort
1606
  if (isJson) {
177,252✔
1607
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
218✔
1608
  } else {
1609
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
177,034✔
1610
  }
1611

1612
  // get size
1613
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
860,433✔
1614
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
683,181✔
1615
  }
1616
  if (szTag <= INT8_MAX) {
177,252✔
1617
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
162,807✔
1618
  } else {
1619
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
14,445✔
1620
    isLarge = 1;
14,445✔
1621
  }
1622

1623
  // build tag
1624
  (*ppTag) = (STag *)taosMemoryCalloc(szTag, 1);
177,252!
1625
  if ((*ppTag) == NULL) {
177,295!
1626
    code = terrno;
×
1627
    goto _err;
×
1628
  }
1629
  (*ppTag)->flags = 0;
177,295✔
1630
  if (isJson) {
177,295✔
1631
    (*ppTag)->flags |= TD_TAG_JSON;
218✔
1632
  }
1633
  if (isLarge) {
177,295✔
1634
    (*ppTag)->flags |= TD_TAG_LARGE;
14,449✔
1635
  }
1636
  (*ppTag)->len = szTag;
177,295✔
1637
  (*ppTag)->nTag = nTag;
177,295✔
1638
  (*ppTag)->ver = version;
177,295✔
1639

1640
  if (isLarge) {
177,295✔
1641
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
14,450✔
1642
  } else {
1643
    p = (uint8_t *)&(*ppTag)->idx[nTag];
162,845✔
1644
  }
1645
  n = 0;
177,295✔
1646
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
860,478✔
1647
    if (isLarge) {
683,195✔
1648
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
78,685✔
1649
    } else {
1650
      (*ppTag)->idx[iTag] = n;
604,510✔
1651
    }
1652
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
683,195✔
1653
  }
1654
#ifdef TD_DEBUG_PRINT_TAG
1655
  debugPrintSTag(*ppTag, __func__, __LINE__);
1656
#endif
1657

1658
  return code;
177,283✔
1659

1660
_err:
×
1661
  return code;
×
1662
}
1663

1664
void tTagFree(STag *pTag) {
54,766✔
1665
  if (pTag) taosMemoryFree(pTag);
54,766!
1666
}
54,766✔
1667

1668
char *tTagValToData(const STagVal *value, bool isJson) {
11,184,366✔
1669
  if (!value) {
11,184,366!
1670
    return NULL;
×
1671
  }
1672

1673
  char  *data = NULL;
11,184,366✔
1674
  int8_t typeBytes = 0;
11,184,366✔
1675
  if (isJson) {
11,184,366✔
1676
    typeBytes = CHAR_BYTES;
6,261✔
1677
  }
1678

1679
  if (IS_VAR_DATA_TYPE(value->type)) {
11,184,366!
1680
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
3,134,914!
1681
    if (data == NULL) {
3,136,080!
1682
      return NULL;
×
1683
    }
1684

1685
    if (isJson) {
3,136,080✔
1686
      *data = value->type;
2,448✔
1687
    }
1688

1689
    varDataLen(data + typeBytes) = value->nData;
3,136,080✔
1690
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
3,136,080✔
1691
  } else {
1692
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
8,049,452✔
1693
  }
1694

1695
  return data;
11,185,532✔
1696
}
1697

1698
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
39,901,605✔
1699
  if (!pTag || !pTagVal) {
39,901,605!
1700
    return false;
×
1701
  }
1702

1703
  int16_t  lidx = 0;
40,049,314✔
1704
  int16_t  ridx = pTag->nTag - 1;
40,049,314✔
1705
  int16_t  midx;
1706
  uint8_t *p;
1707
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
40,049,314✔
1708
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
40,049,314✔
1709
  int16_t  offset;
1710
  STagVal  tv;
1711
  int      c;
1712

1713
  if (isLarge) {
40,049,314✔
1714
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
32,863,215✔
1715
  } else {
1716
    p = (uint8_t *)&pTag->idx[pTag->nTag];
7,186,099✔
1717
  }
1718

1719
  pTagVal->type = TSDB_DATA_TYPE_NULL;
40,049,314✔
1720
  pTagVal->pData = NULL;
40,049,314✔
1721
  pTagVal->nData = 0;
40,049,314✔
1722
  while (lidx <= ridx) {
131,477,360✔
1723
    midx = (lidx + ridx) / 2;
129,310,669✔
1724
    if (isLarge) {
129,310,669✔
1725
      offset = ((int16_t *)pTag->idx)[midx];
106,233,578✔
1726
    } else {
1727
      offset = pTag->idx[midx];
23,077,091✔
1728
    }
1729

1730
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
129,310,669✔
1731
    if (isJson) {
130,182,090✔
1732
      c = tTagValJsonCmprFn(pTagVal, &tv);
11,388✔
1733
    } else {
1734
      c = tTagValCmprFn(pTagVal, &tv);
130,170,702✔
1735
    }
1736

1737
    if (c < 0) {
131,561,558✔
1738
      ridx = midx - 1;
44,009,449✔
1739
    } else if (c > 0) {
87,552,109✔
1740
      lidx = midx + 1;
47,418,597✔
1741
    } else {
1742
      (void)memcpy(pTagVal, &tv, sizeof(tv));
40,133,512✔
1743
      return true;
40,133,512✔
1744
    }
1745
  }
1746
  return false;
2,166,691✔
1747
}
1748

1749
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag) {
784,880✔
1750
  return tEncodeBinary(pEncoder, (const uint8_t *)pTag, pTag->len);
1,569,760✔
1751
}
1752

1753
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
19,878,210✔
1754

1755
int32_t tTagToValArray(const STag *pTag, SArray **ppArray) {
1,445✔
1756
  int32_t  code = 0;
1,445✔
1757
  uint8_t *p = NULL;
1,445✔
1758
  STagVal  tv = {0};
1,445✔
1759
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
1,445✔
1760
  int16_t  offset = 0;
1,445✔
1761

1762
  if (isLarge) {
1,445✔
1763
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
16✔
1764
  } else {
1765
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1,429✔
1766
  }
1767

1768
  (*ppArray) = taosArrayInit(pTag->nTag + 1, sizeof(STagVal));
1,445✔
1769
  if (*ppArray == NULL) {
1,445!
1770
    code = terrno;
×
1771
    goto _err;
×
1772
  }
1773

1774
  for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
4,117✔
1775
    if (isLarge) {
2,672✔
1776
      offset = ((int16_t *)pTag->idx)[iTag];
16✔
1777
    } else {
1778
      offset = pTag->idx[iTag];
2,656✔
1779
    }
1780
    int32_t nt = tGetTagVal(p + offset, &tv, pTag->flags & TD_TAG_JSON);
2,672✔
1781
    if (taosArrayPush(*ppArray, &tv) == NULL) {
5,344!
1782
      code = terrno;
×
1783
      goto _err;
×
1784
    }
1785
  }
1786

1787
  return code;
1,445✔
1788

1789
_err:
×
1790
  return code;
×
1791
}
1792

1793
// STSchema ========================================
1794
STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
15,756,105✔
1795
  STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
15,756,105!
1796
  if (pTSchema == NULL) {
15,781,156!
1797
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1798
    return NULL;
×
1799
  }
1800

1801
  pTSchema->numOfCols = numOfCols;
15,781,156✔
1802
  pTSchema->version = version;
15,781,156✔
1803

1804
  // timestamp column
1805
  if (!(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
15,781,156!
1806
    terrno = TSDB_CODE_INVALID_PARA;
×
1807
    return NULL;
×
1808
  }
1809
  if (!(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID)) {
15,781,156!
1810
    terrno = TSDB_CODE_INVALID_PARA;
×
1811
    return NULL;
×
1812
  }
1813
  pTSchema->columns[0].colId = aSchema[0].colId;
15,781,156✔
1814
  pTSchema->columns[0].type = aSchema[0].type;
15,781,156✔
1815
  pTSchema->columns[0].flags = aSchema[0].flags;
15,781,156✔
1816
  pTSchema->columns[0].bytes = TYPE_BYTES[aSchema[0].type];
15,781,156✔
1817
  pTSchema->columns[0].offset = -1;
15,781,156✔
1818

1819
  // other columns
1820
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
174,177,542✔
1821
    SSchema  *pSchema = &aSchema[iCol];
158,396,386✔
1822
    STColumn *pTColumn = &pTSchema->columns[iCol];
158,396,386✔
1823

1824
    pTColumn->colId = pSchema->colId;
158,396,386✔
1825
    pTColumn->type = pSchema->type;
158,396,386✔
1826
    pTColumn->flags = pSchema->flags;
158,396,386✔
1827
    pTColumn->offset = pTSchema->flen;
158,396,386✔
1828

1829
    if (IS_VAR_DATA_TYPE(pSchema->type)) {
158,396,386!
1830
      pTColumn->bytes = pSchema->bytes;
33,353,576✔
1831
      pTSchema->tlen += (TYPE_BYTES[pSchema->type] + pSchema->bytes);  // todo: remove
33,353,576✔
1832
    } else {
1833
      pTColumn->bytes = TYPE_BYTES[pSchema->type];
125,042,810✔
1834
      pTSchema->tlen += TYPE_BYTES[pSchema->type];  // todo: remove
125,042,810✔
1835
    }
1836

1837
    pTSchema->flen += TYPE_BYTES[pTColumn->type];
158,396,386✔
1838
  }
1839

1840
#if 1  // todo : remove this
1841
  pTSchema->tlen += (int32_t)TD_BITMAP_BYTES(numOfCols);
15,781,156✔
1842
#endif
1843

1844
  return pTSchema;
15,781,156✔
1845
}
1846

1847
static int32_t tTColumnCompare(const void *p1, const void *p2) {
6,093,726✔
1848
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
6,093,726✔
1849
    return -1;
958,639✔
1850
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
5,135,087✔
1851
    return 1;
3,610,488✔
1852
  }
1853

1854
  return 0;
1,524,599✔
1855
}
1856

1857
const STColumn *tTSchemaSearchColumn(const STSchema *pTSchema, int16_t cid) {
1,524,710✔
1858
  STColumn tcol = {
1,524,710✔
1859
      .colId = cid,
1860
  };
1861

1862
  return taosbsearch(&tcol, pTSchema->columns, pTSchema->numOfCols, sizeof(STColumn), tTColumnCompare, TD_EQ);
1,524,710✔
1863
}
1864

1865
// SColData ========================================
1866
void tColDataDestroy(void *ph) {
20,109,343✔
1867
  if (ph) {
20,109,343!
1868
    SColData *pColData = (SColData *)ph;
20,109,456✔
1869

1870
    tFree(pColData->pBitMap);
20,109,456!
1871
    tFree(pColData->aOffset);
20,109,471!
1872
    tFree(pColData->pData);
20,109,503!
1873
  }
1874
}
20,110,465✔
1875

1876
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
19,189,771✔
1877
  pColData->cid = cid;
19,189,771✔
1878
  pColData->type = type;
19,189,771✔
1879
  pColData->cflag = cflag;
19,189,771✔
1880
  tColDataClear(pColData);
19,189,771✔
1881
}
19,190,903✔
1882

1883
void tColDataClear(SColData *pColData) {
40,913,050✔
1884
  pColData->numOfNone = 0;
40,913,050✔
1885
  pColData->numOfNull = 0;
40,913,050✔
1886
  pColData->numOfValue = 0;
40,913,050✔
1887
  pColData->nVal = 0;
40,913,050✔
1888
  pColData->flag = 0;
40,913,050✔
1889
  pColData->nData = 0;
40,913,050✔
1890
}
40,913,050✔
1891

1892
void tColDataDeepClear(SColData *pColData) {
823,648✔
1893
  pColData->pBitMap = NULL;
823,648✔
1894
  pColData->aOffset = NULL;
823,648✔
1895
  pColData->pData = NULL;
823,648✔
1896

1897
  tColDataClear(pColData);
823,648✔
1898
}
823,648✔
1899

1900
static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData, uint32_t nData) {
1901
  int32_t code = 0;
2,147,483,647✔
1902

1903
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
1904
    code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
99,500,575!
1905
    if (code) goto _exit;
105,772,167!
1906
    pColData->aOffset[pColData->nVal] = pColData->nData;
105,772,167✔
1907

1908
    if (nData) {
105,772,167!
1909
      code = tRealloc(&pColData->pData, pColData->nData + nData);
102,970,840!
1910
      if (code) goto _exit;
103,723,138!
1911
      (void)memcpy(pColData->pData + pColData->nData, pData, nData);
103,723,138✔
1912
      pColData->nData += nData;
103,723,138✔
1913
    }
1914
  } else {
1915
    if (!(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal)) {
2,147,483,647!
1916
      return TSDB_CODE_INVALID_PARA;
×
1917
    }
1918
    code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
2,147,483,647!
1919
    if (code) goto _exit;
2,147,483,647!
1920
    if (pData) {
2,147,483,647!
1921
      (void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
2,147,483,647✔
1922
    } else {
1923
      memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
28,473,528✔
1924
    }
1925
    pColData->nData += tDataTypes[pColData->type].bytes;
2,147,483,647✔
1926
  }
1927
  pColData->nVal++;
2,147,483,647✔
1928

1929
_exit:
2,147,483,647✔
1930
  return code;
2,147,483,647✔
1931
}
1932
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,441,045✔
1933
  pColData->flag = HAS_VALUE;
3,441,502✔
1934
  pColData->numOfValue++;
3,441,045✔
1935
  return tColDataPutValue(pColData, pData, nData);
3,441,940✔
1936
}
1937
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
175,292✔
1938
  pColData->flag = HAS_NONE;
175,292✔
1939
  pColData->numOfNone++;
175,292✔
1940
  pColData->nVal++;
175,292✔
1941
  return 0;
175,292✔
1942
}
1943
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
155,802✔
1944
  pColData->flag = HAS_NULL;
156,240✔
1945
  pColData->numOfNull++;
156,240✔
1946
  pColData->nVal++;
156,240✔
1947
  return 0;
155,802✔
1948
}
1949
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,360✔
1950
  int32_t code = 0;
1,360✔
1951

1952
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
1,360✔
1953
  code = tRealloc(&pColData->pBitMap, nBit);
1,360!
1954
  if (code) return code;
1,361!
1955

1956
  memset(pColData->pBitMap, 0, nBit);
1,361✔
1957
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
1,361!
1958

1959
  pColData->flag |= HAS_VALUE;
1,361✔
1960
  pColData->numOfValue++;
1,361✔
1961

1962
  if (pColData->nVal) {
1,361!
1963
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,363!
1964
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
243✔
1965
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
243!
1966
      if (code) return code;
243!
1967
      memset(pColData->aOffset, 0, nOffset);
243✔
1968
    } else {
1969
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
1,120✔
1970
      code = tRealloc(&pColData->pData, pColData->nData);
1,120!
1971
      if (code) return code;
1,119!
1972
      memset(pColData->pData, 0, pColData->nData);
1,119✔
1973
    }
1974
  }
1975

1976
  return tColDataPutValue(pColData, pData, nData);
1,360✔
1977
}
1978
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, uint8_t *pData, uint32_t nData) {
11,172,486✔
1979
  pColData->nVal++;
11,172,486✔
1980
  pColData->numOfNone++;
11,172,486✔
1981
  return 0;
11,172,486✔
1982
}
1983
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, uint8_t *pData, uint32_t nData) {
600✔
1984
  int32_t code = 0;
600✔
1985

1986
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
600✔
1987
  code = tRealloc(&pColData->pBitMap, nBit);
600!
1988
  if (code) return code;
601!
1989

1990
  memset(pColData->pBitMap, 0, nBit);
601✔
1991
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
601!
1992

1993
  pColData->flag |= HAS_NULL;
601✔
1994
  pColData->numOfNull++;
601✔
1995
  pColData->nVal++;
601✔
1996

1997
  return code;
601✔
1998
}
1999
static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, uint8_t *pData, uint32_t nData) {
16,987✔
2000
  int32_t code = 0;
17,022✔
2001

2002
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
17,022✔
2003
  code = tRealloc(&pColData->pBitMap, nBit);
16,998!
2004
  if (code) return code;
17,021!
2005

2006
  memset(pColData->pBitMap, 0, nBit);
17,021✔
2007
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
17,021!
2008

2009
  pColData->flag |= HAS_VALUE;
17,021✔
2010
  pColData->numOfValue++;
17,021✔
2011

2012
  if (pColData->nVal) {
17,021!
2013
    if (IS_VAR_DATA_TYPE(pColData->type)) {
17,021!
2014
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
7,472✔
2015
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
7,472!
2016
      if (code) return code;
7,472!
2017
      memset(pColData->aOffset, 0, nOffset);
7,472✔
2018
    } else {
2019
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
9,549✔
2020
      code = tRealloc(&pColData->pData, pColData->nData);
9,549!
2021
      if (code) return code;
9,550!
2022
      memset(pColData->pData, 0, pColData->nData);
9,550✔
2023
    }
2024
  }
2025

2026
  return tColDataPutValue(pColData, pData, nData);
17,022✔
2027
}
2028
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, uint8_t *pData, uint32_t nData) {
80✔
2029
  int32_t code = 0;
80✔
2030

2031
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
80✔
2032
  code = tRealloc(&pColData->pBitMap, nBit);
80✔
2033
  if (code) return code;
80!
2034

2035
  memset(pColData->pBitMap, 255, nBit);
80✔
2036
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
80!
2037

2038
  pColData->flag |= HAS_NONE;
80✔
2039
  pColData->numOfNone++;
80✔
2040
  pColData->nVal++;
80✔
2041

2042
  return code;
80✔
2043
}
2044
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,436,644✔
2045
  pColData->nVal++;
4,436,644✔
2046
  pColData->numOfNull++;
4,436,644✔
2047
  return 0;
4,436,644✔
2048
}
2049
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2050
  int32_t code = 0;
×
2051

2052
  pColData->flag |= HAS_VALUE;
×
2053
  pColData->numOfValue++;
×
2054

2055
  uint8_t *pBitMap = NULL;
×
2056
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
2057
  if (code) return code;
×
2058

2059
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
2060
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
×
2061
  }
2062
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
×
2063

2064
  tFree(pColData->pBitMap);
×
2065
  pColData->pBitMap = pBitMap;
×
2066

2067
  if (pColData->nVal) {
×
2068
    if (IS_VAR_DATA_TYPE(pColData->type)) {
×
2069
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
2070
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
2071
      if (code) return code;
×
2072
      memset(pColData->aOffset, 0, nOffset);
×
2073
    } else {
2074
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
×
2075
      code = tRealloc(&pColData->pData, pColData->nData);
×
2076
      if (code) return code;
×
2077
      memset(pColData->pData, 0, pColData->nData);
×
2078
    }
2079
  }
2080

2081
  return tColDataPutValue(pColData, pData, nData);
×
2082
}
2083
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, uint8_t *pData, uint32_t nData) {
400✔
2084
  int32_t code = 0;
400✔
2085

2086
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
400!
2087
  if (code) return code;
400!
2088

2089
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
400!
2090
  pColData->numOfNone++;
400✔
2091
  pColData->nVal++;
400✔
2092

2093
  return code;
400✔
2094
}
2095
static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, uint8_t *pData, uint32_t nData) {
9,370✔
2096
  int32_t code = 0;
9,370✔
2097

2098
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
9,370!
2099
  if (code) return code;
9,376!
2100

2101
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
9,376!
2102
  pColData->numOfNull++;
9,376✔
2103
  pColData->nVal++;
9,376✔
2104

2105
  return code;
9,376✔
2106
}
2107
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
2108
  pColData->numOfValue++;
2,147,483,647✔
2109
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
2110
}
2111
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,886✔
2112
  int32_t code = 0;
4,886✔
2113

2114
  pColData->flag |= HAS_NONE;
4,886✔
2115
  pColData->numOfNone++;
4,886✔
2116

2117
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
4,886✔
2118
  code = tRealloc(&pColData->pBitMap, nBit);
4,886✔
2119
  if (code) return code;
4,886!
2120

2121
  memset(pColData->pBitMap, 255, nBit);
4,886✔
2122
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
4,886✔
2123

2124
  return tColDataPutValue(pColData, NULL, 0);
4,884✔
2125
}
2126
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
291,827✔
2127
  int32_t code = 0;
302,506✔
2128

2129
  pColData->flag |= HAS_NULL;
302,506✔
2130
  pColData->numOfNull++;
302,506✔
2131

2132
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
302,506✔
2133
  code = tRealloc(&pColData->pBitMap, nBit);
302,202✔
2134
  if (code) return code;
302,514!
2135

2136
  memset(pColData->pBitMap, 255, nBit);
302,514✔
2137
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
302,514!
2138

2139
  return tColDataPutValue(pColData, NULL, 0);
302,517✔
2140
}
2141
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
56,219✔
2142
  int32_t code = 0;
58,218✔
2143

2144
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
58,217!
2145
  if (code) return code;
58,201!
2146

2147
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
58,201!
2148
  pColData->numOfValue++;
58,201!
2149

2150
  return tColDataPutValue(pColData, pData, nData);
60,171✔
2151
}
2152
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
102,409✔
2153
  int32_t code = 0;
102,409✔
2154

2155
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
102,409!
2156
  if (code) return code;
102,464!
2157

2158
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
102,464✔
2159
  pColData->numOfNone++;
102,464✔
2160

2161
  return tColDataPutValue(pColData, NULL, 0);
102,556✔
2162
}
2163
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
1✔
2164
  int32_t code = 0;
1✔
2165

2166
  pColData->flag |= HAS_NULL;
1✔
2167
  pColData->numOfNull++;
1✔
2168

2169
  uint8_t *pBitMap = NULL;
1✔
2170
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
1!
2171
  if (code) return code;
1!
2172

2173
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3!
2174
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
2!
2175
  }
2176
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
1!
2177

2178
  tFree(pColData->pBitMap);
1!
2179
  pColData->pBitMap = pBitMap;
1!
2180

2181
  return tColDataPutValue(pColData, NULL, 0);
1✔
2182
}
2183
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
451,091,728✔
2184
  int32_t code = 0;
451,957,491✔
2185

2186
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
451,957,091!
2187
  if (code) return code;
452,321,011!
2188
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
452,321,011!
2189
  pColData->numOfValue++;
452,321,011✔
2190

2191
  return tColDataPutValue(pColData, pData, nData);
453,077,533✔
2192
}
2193
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,997✔
2194
  int32_t code = 0;
3,997✔
2195

2196
  pColData->flag |= HAS_NONE;
3,997✔
2197
  pColData->numOfNone++;
3,997✔
2198

2199
  uint8_t *pBitMap = NULL;
3,997✔
2200
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
3,997!
2201
  if (code) return code;
3,997!
2202

2203
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
135,652✔
2204
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
131,655✔
2205
  }
2206
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
3,997✔
2207

2208
  tFree(pColData->pBitMap);
3,997!
2209
  pColData->pBitMap = pBitMap;
3,997✔
2210

2211
  return tColDataPutValue(pColData, NULL, 0);
3,997✔
2212
}
2213
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
27,105,010✔
2214
  int32_t code = 0;
27,981,471✔
2215

2216
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
27,977,875!
2217
  if (code) return code;
27,991,171!
2218
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
27,991,171✔
2219
  pColData->numOfNull++;
27,991,171✔
2220

2221
  return tColDataPutValue(pColData, NULL, 0);
28,002,416✔
2222
}
2223
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2224
  int32_t code = 0;
×
2225

2226
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
2227
  if (code) return code;
×
2228
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
×
2229
  pColData->numOfValue++;
×
2230

2231
  return tColDataPutValue(pColData, pData, nData);
×
2232
}
2233
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
4✔
2234
  int32_t code = 0;
4✔
2235

2236
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
4!
2237
  if (code) return code;
4!
2238
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
4✔
2239
  pColData->numOfNone++;
4!
2240

2241
  return tColDataPutValue(pColData, NULL, 0);
4✔
2242
}
2243
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2244
  int32_t code = 0;
×
2245

2246
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
2247
  if (code) return code;
×
2248
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
×
2249
  pColData->numOfNull++;
×
2250

2251
  return tColDataPutValue(pColData, NULL, 0);
×
2252
}
2253
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData) = {
2254
    {tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02},  // 0
2255
    {tColDataAppendValue10, tColDataAppendValue11, tColDataAppendValue12},  // HAS_NONE
2256
    {tColDataAppendValue20, tColDataAppendValue21, tColDataAppendValue22},  // HAS_NULL
2257
    {tColDataAppendValue30, tColDataAppendValue31, tColDataAppendValue32},  // HAS_NULL|HAS_NONE
2258
    {tColDataAppendValue40, tColDataAppendValue41, tColDataAppendValue42},  // HAS_VALUE
2259
    {tColDataAppendValue50, tColDataAppendValue51, tColDataAppendValue52},  // HAS_VALUE|HAS_NONE
2260
    {tColDataAppendValue60, tColDataAppendValue61, tColDataAppendValue62},  // HAS_VALUE|HAS_NULL
2261
    {tColDataAppendValue70, tColDataAppendValue71, tColDataAppendValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
2262

2263
    //       VALUE                  NONE                     NULL
2264
};
2265
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal) {
2,147,483,647✔
2266
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) {
2,147,483,647!
2267
    return TSDB_CODE_INVALID_PARA;
×
2268
  }
2269
  return tColDataAppendValueImpl[pColData->flag][pColVal->flag](
2,147,483,647✔
2270
      pColData, IS_VAR_DATA_TYPE(pColData->type) ? pColVal->value.pData : (uint8_t *)&pColVal->value.val,
2,147,483,647!
2271
      pColVal->value.nData);
2272
}
2273

2274
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
9✔
2275
  pColData->numOfNone--;
9✔
2276
  pColData->nVal--;
9✔
2277
  if (pColData->numOfNone) {
9!
2278
    return tColDataAppendValue10(pColData, pData, nData);
×
2279
  } else {
2280
    pColData->flag = 0;
9✔
2281
    return tColDataAppendValue00(pColData, pData, nData);
9✔
2282
  }
2283
}
2284
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24✔
2285
  pColData->numOfNone--;
24✔
2286
  pColData->nVal--;
24✔
2287
  if (pColData->numOfNone) {
24!
2288
    return tColDataAppendValue12(pColData, pData, nData);
×
2289
  } else {
2290
    pColData->flag = 0;
24✔
2291
    return tColDataAppendValue02(pColData, pData, nData);
24✔
2292
  }
2293
  return 0;
2294
}
2295
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
459✔
2296
  if (forward) {
459!
2297
    pColData->numOfNull--;
459✔
2298
    pColData->nVal--;
459✔
2299
    if (pColData->numOfNull) {
459✔
2300
      return tColDataAppendValue20(pColData, pData, nData);
11✔
2301
    } else {
2302
      pColData->flag = 0;
448✔
2303
      return tColDataAppendValue00(pColData, pData, nData);
448✔
2304
    }
2305
  }
2306
  return 0;
×
2307
}
2308
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
2309
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
2310
    pColData->numOfNone--;
×
2311
    pColData->nVal--;
×
2312
    if (pColData->numOfNone) {
×
2313
      return tColDataAppendValue30(pColData, pData, nData);
×
2314
    } else {
2315
      pColData->flag = HAS_NULL;
×
2316
      return tColDataAppendValue20(pColData, pData, nData);
×
2317
    }
2318
  } else if (forward) {  // NULL ==> VALUE
×
2319
    pColData->numOfNull--;
×
2320
    pColData->nVal--;
×
2321
    if (pColData->numOfNull) {
×
2322
      return tColDataAppendValue30(pColData, pData, nData);
×
2323
    } else {
2324
      pColData->flag = HAS_NONE;
×
2325
      return tColDataAppendValue10(pColData, pData, nData);
×
2326
    }
2327
  }
2328
  return 0;
×
2329
}
2330
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
80✔
2331
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
80!
2332
    pColData->numOfNone--;
80✔
2333
    pColData->numOfNull++;
80✔
2334
    if (pColData->numOfNone) {
80!
2335
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
×
2336
    } else {
2337
      pColData->flag = HAS_NULL;
80✔
2338
    }
2339
  }
2340
  return 0;
80✔
2341
}
2342
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
13,512,999✔
2343
  if (forward) {  // VALUE ==> VALUE
13,512,999!
2344
    pColData->nVal--;
13,513,228✔
2345
    if (IS_VAR_DATA_TYPE(pColData->type)) {
13,513,228!
2346
      pColData->nData = pColData->aOffset[pColData->nVal];
675,272✔
2347
    } else {
2348
      pColData->nData -= TYPE_BYTES[pColData->type];
12,837,956✔
2349
    }
2350
    return tColDataPutValue(pColData, pData, nData);
13,536,046✔
2351
  }
2352
  return 0;
×
2353
}
2354
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
10,789✔
2355
  if (forward) {  // VALUE ==> NULL
10,789!
2356
    pColData->numOfValue--;
10,789✔
2357
    pColData->nVal--;
10,789✔
2358
    if (pColData->numOfValue) {
10,789✔
2359
      if (IS_VAR_DATA_TYPE(pColData->type)) {
10,375!
2360
        pColData->nData = pColData->aOffset[pColData->nVal];
1,161✔
2361
      } else {
2362
        pColData->nData -= TYPE_BYTES[pColData->type];
9,214✔
2363
      }
2364
      return tColDataAppendValue42(pColData, pData, nData);
10,375✔
2365
    } else {
2366
      pColData->flag = 0;
414✔
2367
      pColData->nData = 0;
414✔
2368
      return tColDataAppendValue02(pColData, pData, nData);
414✔
2369
    }
2370
  }
2371
  return 0;
×
2372
}
2373
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
5,603✔
2374
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
5,603✔
2375
    pColData->numOfNone--;
5,594✔
2376
    pColData->nVal--;
5,594✔
2377
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
5,594!
2378
      pColData->nData -= TYPE_BYTES[pColData->type];
4,476✔
2379
    }
2380
    if (pColData->numOfNone) {
5,594✔
2381
      return tColDataAppendValue50(pColData, pData, nData);
1,999✔
2382
    } else {
2383
      pColData->flag = HAS_VALUE;
3,596✔
2384
      return tColDataAppendValue40(pColData, pData, nData);
3,595✔
2385
    }
2386
  } else if (forward) {  // VALUE ==> VALUE
9!
2387
    pColData->nVal--;
9✔
2388
    if (IS_VAR_DATA_TYPE(pColData->type)) {
9!
2389
      pColData->nData = pColData->aOffset[pColData->nVal];
8✔
2390
    } else {
2391
      pColData->nData -= TYPE_BYTES[pColData->type];
1✔
2392
    }
2393
    return tColDataPutValue(pColData, pData, nData);
9✔
2394
  }
2395
  return 0;
×
2396
}
2397
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
304✔
2398
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
304!
2399
    pColData->numOfNone--;
304✔
2400
    pColData->nVal--;
304✔
2401
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
304!
2402
      pColData->nData -= TYPE_BYTES[pColData->type];
244✔
2403
    }
2404
    if (pColData->numOfNone) {
304!
2405
      return tColDataAppendValue52(pColData, pData, nData);
×
2406
    } else {
2407
      pColData->flag = HAS_VALUE;
304!
2408
      return tColDataAppendValue42(pColData, pData, nData);
304✔
2409
    }
2410
  } else if (forward) {  // VALUE ==> NULL
×
2411
    pColData->numOfValue--;
×
2412
    pColData->nVal--;
×
2413
    if (pColData->numOfValue) {
×
2414
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
2415
        pColData->nData = pColData->aOffset[pColData->nVal];
×
2416
      } else {
2417
        pColData->nData -= TYPE_BYTES[pColData->type];
×
2418
      }
2419
      return tColDataAppendValue52(pColData, pData, nData);
×
2420
    } else {
2421
      pColData->flag = HAS_NONE;
×
2422
      pColData->nData = 0;
×
2423
      return tColDataAppendValue12(pColData, pData, nData);
×
2424
    }
2425
  }
2426
  return 0;
×
2427
}
2428
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
17,278,424✔
2429
  if (forward) {
17,278,424!
2430
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
17,278,424✔
2431
      pColData->numOfNull--;
889,419✔
2432
      pColData->nVal--;
889,419✔
2433
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
889,419!
2434
        pColData->nData -= TYPE_BYTES[pColData->type];
858,975✔
2435
      }
2436
      if (pColData->numOfNull) {
889,419✔
2437
        return tColDataAppendValue60(pColData, pData, nData);
865,363✔
2438
      } else {
2439
        pColData->flag = HAS_VALUE;
24,056✔
2440
        return tColDataAppendValue40(pColData, pData, nData);
24,059✔
2441
      }
2442
    } else {  // VALUE ==> VALUE
2443
      pColData->nVal--;
16,389,005✔
2444
      if (IS_VAR_DATA_TYPE(pColData->type)) {
16,389,005!
2445
        pColData->nData = pColData->aOffset[pColData->nVal];
481,580✔
2446
      } else {
2447
        pColData->nData -= TYPE_BYTES[pColData->type];
15,907,425✔
2448
      }
2449
      return tColDataPutValue(pColData, pData, nData);
16,389,005✔
2450
    }
2451
  }
2452
  return 0;
×
2453
}
2454
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
933,357✔
2455
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
933,357!
2456
    pColData->numOfValue--;
872,889✔
2457
    pColData->nVal--;
872,889✔
2458
    if (pColData->numOfValue) {
872,889✔
2459
      if (IS_VAR_DATA_TYPE(pColData->type)) {
872,865!
2460
        pColData->nData = pColData->aOffset[pColData->nVal];
27,878✔
2461
      } else {
2462
        pColData->nData -= TYPE_BYTES[pColData->type];
844,987✔
2463
      }
2464
      return tColDataAppendValue62(pColData, pData, nData);
872,866✔
2465
    } else {
2466
      pColData->flag = HAS_NULL;
24✔
2467
      pColData->nData = 0;
24!
2468
      return tColDataAppendValue20(pColData, pData, nData);
24✔
2469
    }
2470
  }
2471
  return 0;
60,468✔
2472
}
2473
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
401✔
2474
  int32_t code = 0;
401✔
2475

2476
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
401✔
2477
  if (bv == 0) {  // NONE ==> VALUE
401✔
2478
    pColData->numOfNone--;
400✔
2479
    pColData->nVal--;
400✔
2480
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
400!
2481
      pColData->nData -= TYPE_BYTES[pColData->type];
320✔
2482
    }
2483
    if (pColData->numOfNone) {
400!
2484
      return tColDataAppendValue70(pColData, pData, nData);
×
2485
    } else {
2486
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
21,200✔
2487
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
20,800✔
2488
      }
2489
      pColData->flag = (HAS_VALUE | HAS_NULL);
400!
2490
      return tColDataAppendValue60(pColData, pData, nData);
400✔
2491
    }
2492
  } else if (bv == 1) {  // NULL ==> VALUE
1!
2493
    if (forward) {
1!
2494
      pColData->numOfNull--;
1✔
2495
      pColData->nVal--;
1✔
2496
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
1!
2497
        pColData->nData -= TYPE_BYTES[pColData->type];
1✔
2498
      }
2499
      if (pColData->numOfNull) {
1!
2500
        return tColDataAppendValue70(pColData, pData, nData);
×
2501
      } else {
2502
        for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
3✔
2503
          SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0);
2✔
2504
        }
2505
        pColData->flag = (HAS_VALUE | HAS_NONE);
1!
2506
        return tColDataAppendValue50(pColData, pData, nData);
1✔
2507
      }
2508
    }
2509
  } else if (bv == 2) {  // VALUE ==> VALUE
×
2510
    if (forward) {
×
2511
      pColData->nVal--;
×
2512
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
2513
        pColData->nData = pColData->aOffset[pColData->nVal];
×
2514
      } else {
2515
        pColData->nData -= TYPE_BYTES[pColData->type];
×
2516
      }
2517
      return tColDataPutValue(pColData, pData, nData);
×
2518
    }
2519
  } else {
2520
    return TSDB_CODE_INVALID_PARA;
×
2521
  }
2522
  return 0;
×
2523
}
2524
static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,596✔
2525
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
3,596✔
2526
  if (bv == 0) {  // NONE ==> NULL
3,596!
2527
    pColData->numOfNone--;
3,596✔
2528
    pColData->nVal--;
3,596✔
2529
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
3,596!
2530
      pColData->nData -= TYPE_BYTES[pColData->type];
2,544✔
2531
    }
2532
    if (pColData->numOfNone) {
3,596!
2533
      return tColDataAppendValue72(pColData, pData, nData);
×
2534
    } else {
2535
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
114,340✔
2536
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
110,744✔
2537
      }
2538
      pColData->flag = (HAS_VALUE | HAS_NULL);
3,596!
2539
      return tColDataAppendValue62(pColData, pData, nData);
3,596✔
2540
    }
2541
  } else if (bv == 2 && forward) {  // VALUE ==> NULL
×
2542
    pColData->numOfValue--;
×
2543
    pColData->nVal--;
×
2544
    if (pColData->numOfValue) {
×
2545
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
2546
        pColData->nData = pColData->aOffset[pColData->nVal];
×
2547
      } else {
2548
        pColData->nData -= TYPE_BYTES[pColData->type];
×
2549
      }
2550
      return tColDataAppendValue72(pColData, pData, nData);
×
2551
    } else {
2552
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
2553
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal));
×
2554
      }
2555
      pColData->flag = (HAS_NULL | HAS_NONE);
×
2556
      pColData->nData = 0;
×
2557
      return tColDataAppendValue32(pColData, pData, nData);
×
2558
    }
2559
  }
2560
  return 0;
×
2561
}
2562
static FORCE_INLINE int32_t tColDataUpdateNothing(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
12,451✔
2563
  return 0;
12,451✔
2564
}
2565
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) = {
2566
    {NULL, NULL, NULL},                                                     // 0
2567
    {tColDataUpdateValue10, tColDataUpdateNothing, tColDataUpdateValue12},  // HAS_NONE
2568
    {tColDataUpdateValue20, tColDataUpdateNothing, tColDataUpdateNothing},  // HAS_NULL
2569
    {tColDataUpdateValue30, tColDataUpdateNothing, tColDataUpdateValue32},  // HAS_NULL|HAS_NONE
2570
    {tColDataUpdateValue40, tColDataUpdateNothing, tColDataUpdateValue42},  // HAS_VALUE
2571
    {tColDataUpdateValue50, tColDataUpdateNothing, tColDataUpdateValue52},  // HAS_VALUE|HAS_NONE
2572
    {tColDataUpdateValue60, tColDataUpdateNothing, tColDataUpdateValue62},  // HAS_VALUE|HAS_NULL
2573
    {tColDataUpdateValue70, tColDataUpdateNothing, tColDataUpdateValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
2574

2575
    //    VALUE             NONE        NULL
2576
};
2577
int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward) {
27,042,381✔
2578
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) return TSDB_CODE_INVALID_PARA;
27,042,381!
2579
  if (!(pColData->nVal > 0)) return TSDB_CODE_INVALID_PARA;
27,042,449!
2580

2581
  if (tColDataUpdateValueImpl[pColData->flag][pColVal->flag] == NULL) return 0;
27,042,449!
2582

2583
  return tColDataUpdateValueImpl[pColData->flag][pColVal->flag](
27,042,449✔
2584
      pColData, IS_VAR_DATA_TYPE(pColData->type) ? pColVal->value.pData : (uint8_t *)&pColVal->value.val,
27,042,449!
2585
      pColVal->value.nData, forward);
2586
}
2587

2588
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
46,923,624✔
2589
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
46,923,624✔
2590
}
46,923,624✔
2591
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
1,560,525✔
2592
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
1,560,525✔
2593
}
1,560,525✔
2594
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
11,219✔
2595
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
2596
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
11,219!
2597
    case 0:
1,020✔
2598
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,020✔
2599
      break;
1,020✔
2600
    case 1:
10,199✔
2601
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
10,199✔
2602
      break;
10,199✔
2603
    default:
×
2604
      break;
×
2605
  }
2606
}
11,219✔
2607
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
2608
  SValue value = {.type = pColData->type};
2,147,483,647✔
2609
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
2610
    if (iVal + 1 < pColData->nVal) {
202,162,316!
2611
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
204,337,096✔
2612
    } else {
2613
      value.nData = pColData->nData - pColData->aOffset[iVal];
×
2614
    }
2615
    value.pData = pColData->pData + pColData->aOffset[iVal];
202,162,316✔
2616
  } else {
2617
    (void)memcpy(&value.val, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
2618
                 tDataTypes[pColData->type].bytes);
2,147,483,647✔
2619
  }
2620
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
2621
}
269,815,931✔
2622
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
250,138✔
2623
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
2624
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
250,138!
2625
    case 0:
105,317✔
2626
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
105,317✔
2627
      break;
105,317✔
2628
    case 1:
145,122✔
2629
      tColDataGetValue4(pColData, iVal, pColVal);
2630
      break;
145,122✔
2631
    default:
×
2632
      break;
×
2633
  }
2634
}
250,138✔
2635
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
284,496,420✔
2636
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
2637
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
284,496,420!
2638
    case 0:
15,426,473✔
2639
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
15,426,473✔
2640
      break;
15,426,473✔
2641
    case 1:
269,670,808✔
2642
      tColDataGetValue4(pColData, iVal, pColVal);
2643
      break;
269,670,808✔
2644
    default:
×
2645
      break;
×
2646
  }
2647
}
284,496,420✔
2648
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
11✔
2649
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
2650
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
11!
2651
    case 0:
5✔
2652
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
5✔
2653
      break;
5✔
2654
    case 1:
5✔
2655
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
5✔
2656
      break;
5✔
2657
    case 2:
1!
2658
      tColDataGetValue4(pColData, iVal, pColVal);
2659
      break;
1✔
2660
    default:
×
2661
      break;
×
2662
  }
2663
}
11✔
2664
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
2665
    NULL,               // 0
2666
    tColDataGetValue1,  // HAS_NONE
2667
    tColDataGetValue2,  // HAS_NULL
2668
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
2669
    tColDataGetValue4,  // HAS_VALUE
2670
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
2671
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
2672
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
2673
};
2674
void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
2675
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
2676
}
2,147,483,647✔
2677

2678
uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
657,861,257✔
2679
  switch (pColData->flag) {
657,861,257!
2680
    case HAS_NONE:
×
2681
      return 0;
×
2682
    case HAS_NULL:
×
2683
      return 1;
×
2684
    case (HAS_NULL | HAS_NONE):
11,211✔
2685
      return GET_BIT1(pColData->pBitMap, iVal);
11,211✔
2686
    case HAS_VALUE:
×
2687
      return 2;
×
2688
    case (HAS_VALUE | HAS_NONE):
743,487✔
2689
      return (GET_BIT1(pColData->pBitMap, iVal)) ? 2 : 0;
743,487✔
2690
    case (HAS_VALUE | HAS_NULL):
657,396,551✔
2691
      return GET_BIT1(pColData->pBitMap, iVal) + 1;
657,396,551✔
2692
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
22✔
2693
      return GET_BIT2(pColData->pBitMap, iVal);
22✔
2694
    default:
×
2695
      return 0;
×
2696
  }
2697
}
2698

2699
int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) {
449✔
2700
  int32_t code = 0;
449✔
2701

2702
  *pColData = *pColDataFrom;
449✔
2703

2704
  // bitmap
2705
  switch (pColData->flag) {
449!
2706
    case (HAS_NULL | HAS_NONE):
14✔
2707
    case (HAS_VALUE | HAS_NONE):
2708
    case (HAS_VALUE | HAS_NULL):
2709
      pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal));
14✔
2710
      if (pColData->pBitMap == NULL) {
14!
2711
        code = TSDB_CODE_OUT_OF_MEMORY;
×
2712
        goto _exit;
×
2713
      }
2714
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
14✔
2715
      break;
14✔
2716
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2717
      pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
×
2718
      if (pColData->pBitMap == NULL) {
×
2719
        code = TSDB_CODE_OUT_OF_MEMORY;
×
2720
        goto _exit;
×
2721
      }
2722
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
×
2723
      break;
×
2724
    default:
435✔
2725
      pColData->pBitMap = NULL;
435✔
2726
      break;
435✔
2727
  }
2728

2729
  // offset
2730
  if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) {
449!
2731
    pColData->aOffset = xMalloc(arg, pColData->nVal << 2);
104✔
2732
    if (pColData->aOffset == NULL) {
104!
2733
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2734
      goto _exit;
×
2735
    }
2736
    (void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
104✔
2737
  } else {
2738
    pColData->aOffset = NULL;
345✔
2739
  }
2740

2741
  // value
2742
  if (pColData->nData) {
449✔
2743
    pColData->pData = xMalloc(arg, pColData->nData);
362✔
2744
    if (pColData->pData == NULL) {
362!
2745
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2746
      goto _exit;
×
2747
    }
2748

2749
    (void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
362✔
2750
  } else {
2751
    pColData->pData = NULL;
87✔
2752
  }
2753

2754
_exit:
449✔
2755
  return code;
449✔
2756
}
2757

2758
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
2,555,891✔
2759
  int32_t code;
2760
  SBuffer local;
2761

2762
  if (!(colData->nVal > 0)) {
2,555,891!
2763
    return TSDB_CODE_INVALID_PARA;
×
2764
  }
2765

2766
  (*info) = (SColDataCompressInfo){
2,555,891✔
2767
      .cmprAlg = info->cmprAlg,
2,555,891✔
2768
      .columnFlag = colData->cflag,
2,555,891✔
2769
      .flag = colData->flag,
2,555,891✔
2770
      .dataType = colData->type,
2,555,891✔
2771
      .columnId = colData->cid,
2,555,891✔
2772
      .numOfData = colData->nVal,
2,555,891✔
2773
  };
2774

2775
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
2,555,891!
2776
    return 0;
137,905✔
2777
  }
2778

2779
  tBufferInit(&local);
2780
  if (assist == NULL) {
2,417,986!
2781
    assist = &local;
×
2782
  }
2783

2784
  // bitmap
2785
  if (colData->flag != HAS_VALUE) {
2,417,986✔
2786
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
265,302✔
2787
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
1✔
2788
    } else {
2789
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
265,301✔
2790
    }
2791

2792
    SCompressInfo cinfo = {
265,302✔
2793
        .dataType = TSDB_DATA_TYPE_TINYINT,
2794
        .cmprAlg = info->cmprAlg,
265,302✔
2795
        .originalSize = info->bitmapOriginalSize,
265,302✔
2796
    };
2797

2798
    code = tCompressDataToBuffer(colData->pBitMap, &cinfo, output, assist);
265,302✔
2799
    if (code) {
265,329!
2800
      tBufferDestroy(&local);
2801
      return code;
×
2802
    }
2803

2804
    info->bitmapCompressedSize = cinfo.compressedSize;
265,329✔
2805
  }
2806

2807
  if (colData->flag == (HAS_NONE | HAS_NULL)) {
2,418,013✔
2808
    tBufferDestroy(&local);
2809
    return 0;
601✔
2810
  }
2811

2812
  // offset
2813
  if (IS_VAR_DATA_TYPE(colData->type)) {
2,417,412!
2814
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
325,495✔
2815

2816
    SCompressInfo cinfo = {
325,495✔
2817
        .dataType = TSDB_DATA_TYPE_INT,
2818
        .cmprAlg = info->cmprAlg,
325,495✔
2819
        .originalSize = info->offsetOriginalSize,
325,495✔
2820
    };
2821

2822
    code = tCompressDataToBuffer(colData->aOffset, &cinfo, output, assist);
325,495✔
2823
    if (code) {
325,694!
2824
      tBufferDestroy(&local);
2825
      return code;
×
2826
    }
2827

2828
    info->offsetCompressedSize = cinfo.compressedSize;
325,694✔
2829
  }
2830

2831
  // data
2832
  if (colData->nData > 0) {
2,417,611✔
2833
    info->dataOriginalSize = colData->nData;
2,417,464✔
2834

2835
    SCompressInfo cinfo = {
2,417,464✔
2836
        .dataType = colData->type,
2,417,464✔
2837
        .cmprAlg = info->cmprAlg,
2,417,464✔
2838
        .originalSize = info->dataOriginalSize,
2,417,464✔
2839
    };
2840

2841
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
2,417,464✔
2842
    if (code) {
2,417,646!
2843
      tBufferDestroy(&local);
2844
      return code;
×
2845
    }
2846

2847
    info->dataCompressedSize = cinfo.compressedSize;
2,417,646✔
2848
  }
2849

2850
  tBufferDestroy(&local);
2851
  return 0;
2,417,793✔
2852
}
2853

2854
int32_t tColDataDecompress(void *input, SColDataCompressInfo *info, SColData *colData, SBuffer *assist) {
16,671,378✔
2855
  int32_t  code;
2856
  SBuffer  local;
2857
  uint8_t *data = (uint8_t *)input;
16,671,378✔
2858

2859
  tBufferInit(&local);
2860
  if (assist == NULL) {
16,671,378!
2861
    assist = &local;
×
2862
  }
2863

2864
  tColDataClear(colData);
16,671,378✔
2865
  colData->cid = info->columnId;
16,671,111✔
2866
  colData->type = info->dataType;
16,671,111✔
2867
  colData->cflag = info->columnFlag;
16,671,111✔
2868
  colData->nVal = info->numOfData;
16,671,111✔
2869
  colData->flag = info->flag;
16,671,111✔
2870

2871
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
16,671,111✔
2872
    goto _exit;
1,786,561✔
2873
  }
2874

2875
  // bitmap
2876
  if (info->bitmapOriginalSize > 0) {
14,884,550✔
2877
    SCompressInfo cinfo = {
526,525✔
2878
        .dataType = TSDB_DATA_TYPE_TINYINT,
2879
        .cmprAlg = info->cmprAlg,
526,525✔
2880
        .originalSize = info->bitmapOriginalSize,
526,525✔
2881
        .compressedSize = info->bitmapCompressedSize,
526,525✔
2882
    };
2883

2884
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
526,525!
2885
    if (code) {
526,542!
2886
      tBufferDestroy(&local);
2887
      return code;
×
2888
    }
2889

2890
    code = tDecompressData(data, &cinfo, colData->pBitMap, cinfo.originalSize, assist);
526,542✔
2891
    if (code) {
526,518!
2892
      tBufferDestroy(&local);
2893
      return code;
×
2894
    }
2895

2896
    data += cinfo.compressedSize;
526,518✔
2897
  }
2898

2899
  if (info->flag == (HAS_NONE | HAS_NULL)) {
14,884,543✔
2900
    goto _exit;
604✔
2901
  }
2902

2903
  // offset
2904
  if (info->offsetOriginalSize > 0) {
14,883,939✔
2905
    SCompressInfo cinfo = {
2,528,921✔
2906
        .cmprAlg = info->cmprAlg,
2,528,921✔
2907
        .dataType = TSDB_DATA_TYPE_INT,
2908
        .originalSize = info->offsetOriginalSize,
2,528,921✔
2909
        .compressedSize = info->offsetCompressedSize,
2,528,921✔
2910
    };
2911

2912
    code = tRealloc((uint8_t **)&colData->aOffset, cinfo.originalSize);
2,528,921!
2913
    if (code) {
2,529,178!
2914
      tBufferDestroy(&local);
2915
      return code;
×
2916
    }
2917

2918
    code = tDecompressData(data, &cinfo, colData->aOffset, cinfo.originalSize, assist);
2,529,178✔
2919
    if (code) {
2,529,033!
2920
      tBufferDestroy(&local);
2921
      return code;
×
2922
    }
2923

2924
    data += cinfo.compressedSize;
2,529,033✔
2925
  }
2926

2927
  // data
2928
  if (info->dataOriginalSize > 0) {
14,884,051✔
2929
    colData->nData = info->dataOriginalSize;
14,882,782✔
2930

2931
    SCompressInfo cinfo = {
14,882,782✔
2932
        .cmprAlg = info->cmprAlg,
14,882,782✔
2933
        .dataType = colData->type,
14,882,782✔
2934
        .originalSize = info->dataOriginalSize,
14,882,782✔
2935
        .compressedSize = info->dataCompressedSize,
14,882,782✔
2936
    };
2937

2938
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
14,882,782!
2939
    if (code) {
14,883,541!
2940
      tBufferDestroy(&local);
2941
      return code;
×
2942
    }
2943

2944
    code = tDecompressData(data, &cinfo, colData->pData, cinfo.originalSize, assist);
14,883,541✔
2945
    if (code) {
14,883,569!
2946
      tBufferDestroy(&local);
2947
      return code;
×
2948
    }
2949

2950
    data += cinfo.compressedSize;
14,883,569✔
2951
  }
2952

2953
_exit:
1,269✔
2954
  switch (colData->flag) {
16,672,003✔
2955
    case HAS_NONE:
1,524,794✔
2956
      colData->numOfNone = colData->nVal;
1,524,794✔
2957
      break;
1,524,794✔
2958
    case HAS_NULL:
262,705✔
2959
      colData->numOfNull = colData->nVal;
262,705✔
2960
      break;
262,705✔
2961
    case HAS_VALUE:
14,358,003✔
2962
      colData->numOfValue = colData->nVal;
14,358,003✔
2963
      break;
14,358,003✔
2964
    default:
526,501✔
2965
      for (int32_t i = 0; i < colData->nVal; i++) {
363,207,616✔
2966
        uint8_t bitValue = tColDataGetBitValue(colData, i);
362,682,480✔
2967
        if (bitValue == 0) {
362,681,115✔
2968
          colData->numOfNone++;
213,052✔
2969
        } else if (bitValue == 1) {
362,468,063✔
2970
          colData->numOfNull++;
25,509,766✔
2971
        } else {
2972
          colData->numOfValue++;
336,958,297✔
2973
        }
2974
      }
2975
  }
2976
  tBufferDestroy(&local);
2977
  return 0;
16,670,638✔
2978
}
2979

2980
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
573✔
2981
                                    char *data) {
2982
  int32_t code = 0;
573✔
2983
  if (data == NULL) {
573✔
2984
    if (pColData->cflag & COL_IS_KEY) {
12!
2985
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
2986
    } else {
2987
      for (int32_t i = 0; i < nRows; ++i) {
26✔
2988
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
14✔
2989
      }
2990
    }
2991
    goto _exit;
12✔
2992
  }
2993

2994
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
561!
2995
    for (int32_t i = 0; i < nRows; ++i) {
271✔
2996
      int32_t offset = *((int32_t *)lengthOrbitmap + i);
171✔
2997
      if (offset == -1) {
171!
2998
        if (pColData->cflag & COL_IS_KEY) {
×
2999
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3000
          goto _exit;
×
3001
        }
3002
        if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
3003
          goto _exit;
×
3004
        }
3005
      } else {
3006
        if (varDataTLen(data + offset) > bytes) {
171!
3007
          uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
3008
                 bytes);
3009
          code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
3010
          goto _exit;
×
3011
        }
3012
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
171✔
3013
                                                                      varDataLen(data + offset));
171✔
3014
      }
3015
    }
3016
  } else {  // fixed-length data type
3017
    bool allValue = true;
461✔
3018
    bool allNull = true;
461✔
3019
    for (int32_t i = 0; i < nRows; ++i) {
1,266✔
3020
      if (!colDataIsNull_f(lengthOrbitmap, i)) {
805✔
3021
        allNull = false;
592✔
3022
      } else {
3023
        allValue = false;
213✔
3024
      }
3025
    }
3026
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
461!
3027
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3028
      goto _exit;
×
3029
    }
3030

3031
    if (allValue) {
461✔
3032
      // optimize (todo)
3033
      for (int32_t i = 0; i < nRows; ++i) {
945✔
3034
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
578✔
3035
      }
3036
    } else if (allNull) {
94✔
3037
      // optimize (todo)
3038
      for (int32_t i = 0; i < nRows; ++i) {
249✔
3039
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
165✔
3040
        if (code) goto _exit;
165!
3041
      }
3042
    } else {
3043
      for (int32_t i = 0; i < nRows; ++i) {
72✔
3044
        if (colDataIsNull_f(lengthOrbitmap, i)) {
62✔
3045
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
48✔
3046
          if (code) goto _exit;
48!
3047
        } else {
3048
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
14✔
3049
        }
3050
      }
3051
    }
3052
  }
3053

3054
_exit:
10✔
3055
  return code;
573✔
3056
}
3057

3058
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
2,248,870✔
3059
                               checkWKBGeometryFn cgeos) {
3060
  int32_t code = 0;
2,248,870✔
3061

3062
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
2,248,870✔
3063
    if (!(pColData->type == pBind->buffer_type)) {
2,248,867!
3064
      return TSDB_CODE_INVALID_PARA;
×
3065
    }
3066
  }
3067

3068
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
2,248,870!
3069
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
318,642!
3070
      code = igeos();
×
3071
      if (code) {
×
3072
        return code;
×
3073
      }
3074
    }
3075
    for (int32_t i = 0; i < pBind->num; ++i) {
951,190✔
3076
      if (pBind->is_null && pBind->is_null[i]) {
632,557✔
3077
        if (pColData->cflag & COL_IS_KEY) {
2,751!
3078
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3079
          goto _exit;
×
3080
        }
3081
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2,751✔
3082
        if (code) goto _exit;
2,751!
3083
      } else if (pBind->length[i] > buffMaxLen) {
629,806✔
3084
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
10✔
3085
      } else {
3086
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
629,796!
3087
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
×
3088
          if (code) goto _exit;
×
3089
        }
3090
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
629,796✔
3091
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
629,796✔
3092
      }
3093
    }
3094
  } else {  // fixed-length data type
3095
    bool allValue;
3096
    bool allNull;
3097
    if (pBind->is_null) {
1,930,228✔
3098
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
15,680✔
3099
      allNull = (same && pBind->is_null[0] != 0);
15,680✔
3100
      allValue = (same && pBind->is_null[0] == 0);
15,680✔
3101
    } else {
3102
      allNull = false;
1,914,548✔
3103
      allValue = true;
1,914,548✔
3104
    }
3105

3106
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
1,930,228!
3107
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3108
      goto _exit;
×
3109
    }
3110

3111
    if (allValue) {
1,930,228✔
3112
      // optimize (todo)
3113
      for (int32_t i = 0; i < pBind->num; ++i) {
5,739,803✔
3114
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
3,824,844✔
3115
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
3,824,844✔
3116
      }
3117
    } else if (allNull) {
15,305✔
3118
      // optimize (todo)
3119
      for (int32_t i = 0; i < pBind->num; ++i) {
4✔
3120
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2✔
3121
        if (code) goto _exit;
2!
3122
      }
3123
    } else {
3124
      for (int32_t i = 0; i < pBind->num; ++i) {
46,717✔
3125
        if (pBind->is_null[i]) {
31,414✔
3126
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
15,707✔
3127
          if (code) goto _exit;
15,707!
3128
        } else {
3129
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
15,707✔
3130
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
15,707✔
3131
        }
3132
      }
3133
    }
3134
  }
3135

3136
_exit:
15,303✔
3137
  return code;
2,248,897✔
3138
}
3139

3140
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
×
3141
                                checkWKBGeometryFn cgeos) {
3142
  int32_t code = 0;
×
3143

3144
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
×
3145
    if (!(pColData->type == pBind->buffer_type)) {
×
3146
      return TSDB_CODE_INVALID_PARA;
×
3147
    }
3148
  }
3149

3150
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
×
3151
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
×
3152
      code = igeos();
×
3153
      if (code) {
×
3154
        return code;
×
3155
      }
3156
    }
3157

3158
    uint8_t *buf = pBind->buffer;
×
3159
    for (int32_t i = 0; i < pBind->num; ++i) {
×
3160
      if (pBind->is_null && pBind->is_null[i]) {
×
3161
        if (pColData->cflag & COL_IS_KEY) {
×
3162
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3163
          goto _exit;
×
3164
        }
3165
        if (pBind->is_null[i] == 1) {
×
3166
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
3167
          if (code) goto _exit;
×
3168
        } else {
3169
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
3170
          if (code) goto _exit;
×
3171
        }
3172
      } else if (pBind->length[i] > buffMaxLen) {
×
3173
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
3174
      } else {
3175
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
×
3176
          code = cgeos(buf, pBind->length[i]);
×
3177
          if (code) goto _exit;
×
3178
        }
3179
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
×
3180
        buf += pBind->length[i];
×
3181
      }
3182
    }
3183
  } else {  // fixed-length data type
3184
    bool allValue;
3185
    bool allNull;
3186
    bool allNone;
3187
    if (pBind->is_null) {
×
3188
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
×
3189
      allNull = (same && pBind->is_null[0] == 1);
×
3190
      allNone = (same && pBind->is_null[0] > 1);
×
3191
      allValue = (same && pBind->is_null[0] == 0);
×
3192
    } else {
3193
      allNull = false;
×
3194
      allNone = false;
×
3195
      allValue = true;
×
3196
    }
3197

3198
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
×
3199
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3200
      goto _exit;
×
3201
    }
3202

3203
    if (allValue) {
×
3204
      // optimize (todo)
3205
      for (int32_t i = 0; i < pBind->num; ++i) {
×
3206
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
3207
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
3208
          *val = 1;
×
3209
        }
3210

3211
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
3212
      }
3213
    } else if (allNull) {
×
3214
      // optimize (todo)
3215
      for (int32_t i = 0; i < pBind->num; ++i) {
×
3216
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
3217
        if (code) goto _exit;
×
3218
      }
3219
    } else if (allNone) {
×
3220
      // optimize (todo)
3221
      for (int32_t i = 0; i < pBind->num; ++i) {
×
3222
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
3223
        if (code) goto _exit;
×
3224
      }
3225
    } else {
3226
      for (int32_t i = 0; i < pBind->num; ++i) {
×
3227
        if (pBind->is_null[i]) {
×
3228
          if (pBind->is_null[i] == 1) {
×
3229
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
3230
            if (code) goto _exit;
×
3231
          } else {
3232
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
3233
            if (code) goto _exit;
×
3234
          }
3235
        } else {
3236
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
3237
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
3238
            *val = 1;
×
3239
          }
3240

3241
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
3242
        }
3243
      }
3244
    }
3245
  }
3246

3247
_exit:
×
3248
  return code;
×
3249
}
3250

3251
/* build rows to `rowArray` from bind
3252
 * `infos` is the bind information array
3253
 * `numOfInfos` is the number of bind information
3254
 * `infoSorted` is whether the bind information is sorted by column id
3255
 * `pTSchema` is the schema of the table
3256
 * `rowArray` is the array to store the rows
3257
 * `pOrdered` is the pointer to store ordered
3258
 * `pDupTs` is the pointer to store duplicateTs
3259
 */
3260
int32_t tRowBuildFromBind2(SBindInfo2 *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
×
3261
                           SArray *rowArray, bool *pOrdered, bool *pDupTs) {
3262
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
×
3263
    return TSDB_CODE_INVALID_PARA;
×
3264
  }
3265

3266
  if (!infoSorted) {
×
3267
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
3268
  }
3269

3270
  int32_t code = 0;
×
3271
  int32_t numOfRows = infos[0].bind->num;
×
3272
  SArray *colValArray, *bufArray;
3273
  SColVal colVal;
3274

3275
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
×
3276
    return terrno;
×
3277
  }
3278
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
×
3279
    taosArrayDestroy(colValArray);
×
3280
    return terrno;
×
3281
  }
3282
  for (int i = 0; i < numOfInfos; ++i) {
×
3283
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
×
3284
      taosArrayDestroy(colValArray);
×
3285
      taosArrayDestroy(bufArray);
×
3286
      return terrno;
×
3287
    }
3288
  }
3289

3290
  SRowKey rowKey, lastRowKey;
3291
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
×
3292
    taosArrayClear(colValArray);
×
3293

3294
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
×
3295
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
×
3296
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
3297
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
3298
        } else {
3299
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
3300
        }
3301
      } else {
3302
        SValue value = {
×
3303
            .type = infos[iInfo].type,
×
3304
        };
3305
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
×
3306
          int32_t   length = infos[iInfo].bind->length[iRow];
×
3307
          uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
3308
          value.nData = length;
×
3309
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
×
3310
            code = TSDB_CODE_INVALID_PARA;
×
3311
            goto _exit;
×
3312
          }
3313
          value.pData = *data;
×
3314
          *data += length;
×
3315
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
3316
        } else {
3317
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
×
3318
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
×
3319
            *val = 1;
×
3320
          }
3321
          (void)memcpy(&value.val, val,
×
3322
                       /*(uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,*/
3323
                       infos[iInfo].bytes /*bind->buffer_length*/);
×
3324
        }
3325
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
×
3326
      }
3327
      if (taosArrayPush(colValArray, &colVal) == NULL) {
×
3328
        code = terrno;
×
3329
        goto _exit;
×
3330
      }
3331
    }
3332

3333
    SRow *row;
3334
    if ((code = tRowBuild(colValArray, pTSchema, &row))) {
×
3335
      goto _exit;
×
3336
    }
3337

3338
    if ((taosArrayPush(rowArray, &row)) == NULL) {
×
3339
      code = terrno;
×
3340
      goto _exit;
×
3341
    }
3342

3343
    if (pOrdered && pDupTs) {
×
3344
      tRowGetKey(row, &rowKey);
×
3345
      if (iRow == 0) {
×
3346
        *pOrdered = true;
×
3347
        *pDupTs = false;
×
3348
      } else {
3349
        // no more compare if we already get disordered or duplicate rows
3350
        if (*pOrdered && !*pDupTs) {
×
3351
          int32_t code = tRowKeyCompare(&rowKey, &lastRowKey);
×
3352
          *pOrdered = (code >= 0);
×
3353
          *pDupTs = (code == 0);
×
3354
        }
3355
      }
3356
      lastRowKey = rowKey;
×
3357
    }
3358
  }
3359

3360
_exit:
×
3361
  taosArrayDestroy(colValArray);
×
3362
  taosArrayDestroy(bufArray);
×
3363
  return code;
×
3364
}
3365

3366
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
286✔
3367
  int32_t code = TSDB_CODE_SUCCESS;
286✔
3368

3369
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
286!
3370
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
116✔
3371
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
42✔
3372
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
58✔
3373
    if (iToRow == 0) {
58✔
3374
      pToColData->aOffset[iToRow] = 0;
8✔
3375
    }
3376

3377
    if (iToRow < pToColData->nVal - 1) {
58✔
3378
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
52✔
3379
    }
3380

3381
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
58✔
3382
                 nData);
3383
  } else {
3384
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
228✔
3385
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
228✔
3386
  }
3387
  return code;
286✔
3388
}
3389

3390
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
294✔
3391
                                        int32_t iToRow) {
3392
  int32_t code = TSDB_CODE_SUCCESS;
294✔
3393

3394
  switch (pFromColData->flag) {
294!
3395
    case HAS_NONE:
8✔
3396
    case HAS_NULL:
3397
      break;
8✔
3398
    case (HAS_NULL | HAS_NONE): {
×
3399
      SET_BIT1(pToColData->pBitMap, iToRow, GET_BIT1(pFromColData->pBitMap, iFromRow));
×
3400
    } break;
×
3401
    case HAS_VALUE: {
238✔
3402
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
238!
3403
    } break;
238✔
3404
    case (HAS_VALUE | HAS_NONE):
48✔
3405
    case (HAS_VALUE | HAS_NULL): {
3406
      SET_BIT1(pToColData->pBitMap, iToRow, GET_BIT1(pFromColData->pBitMap, iFromRow));
48✔
3407
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
48!
3408
    } break;
48✔
3409
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
3410
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
3411
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
3412
    } break;
×
3413
    default:
×
3414
      return -1;
×
3415
  }
3416

3417
  return code;
294✔
3418
}
3419

3420
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
60✔
3421
                               int32_t nColData) {
3422
  int32_t code = TSDB_CODE_SUCCESS;
60✔
3423

3424
  for (int32_t i = 0; i < nColData; i++) {
354✔
3425
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
294✔
3426
    if (code != TSDB_CODE_SUCCESS) {
294!
3427
      return code;
×
3428
    }
3429
  }
3430

3431
  return code;
60✔
3432
}
3433

3434
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
60✔
3435
  int32_t code = TSDB_CODE_SUCCESS;
60✔
3436

3437
  for (int32_t i = 0; i < nColData; i++) {
354✔
3438
    SColVal cv = {0};
294✔
3439
    tColDataGetValue(&aFromColData[i], iFromRow, &cv);
294✔
3440
    code = tColDataAppendValue(&aToColData[i], &cv);
294✔
3441
    if (code != TSDB_CODE_SUCCESS) {
294!
3442
      return code;
×
3443
    }
3444
  }
3445

3446
  return code;
60✔
3447
}
3448

3449
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
1,069,521✔
3450
  SColVal cv;
3451

3452
  key->ts = ((TSKEY *)aColData[0].pData)[iRow];
1,069,521✔
3453
  key->numOfPKs = 0;
1,069,521✔
3454

3455
  for (int i = 1; i < nColData; i++) {
1,069,521✔
3456
    if (aColData[i].cflag & COL_IS_KEY) {
1,069,519!
3457
      tColDataGetValue4(&aColData[i], iRow, &cv);
×
3458
      key->pks[key->numOfPKs++] = cv.value;
×
3459
    } else {
3460
      break;
1,069,519✔
3461
    }
3462
  }
3463
}
1,069,521✔
3464

3465
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
17✔
3466
  SColData *aDstColData = NULL;
17✔
3467
  int32_t   i = start, j = mid + 1, k = 0;
17✔
3468
  SRowKey   keyi, keyj;
3469

3470
  if (end > start) {
17!
3471
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
17!
3472
    if (aDstColData == NULL) {
17!
3473
      return terrno;
×
3474
    }
3475
    for (int c = 0; c < nColData; ++c) {
99✔
3476
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
82✔
3477
    }
3478
  }
3479

3480
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
17✔
3481
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
17✔
3482
  while (i <= mid && j <= end) {
48✔
3483
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
31✔
3484
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
24!
3485
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
24✔
3486
    } else {
3487
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
7!
3488
      tColDataArrGetRowKey(aColData, nColData, j, &keyj);
7✔
3489
    }
3490
  }
3491

3492
  while (i <= mid) {
26✔
3493
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
9!
3494
  }
3495

3496
  while (j <= end) {
37✔
3497
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
20!
3498
  }
3499

3500
  for (i = start, k = 0; i <= end; ++i, ++k) {
77✔
3501
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
60!
3502
  }
3503

3504
  if (aDstColData) {
17!
3505
    for (int32_t i = 0; i < nColData; i++) {
99✔
3506
      tColDataDestroy(&aDstColData[i]);
82✔
3507
    }
3508
    taosMemoryFree(aDstColData);
17!
3509
  }
3510

3511
  return TSDB_CODE_SUCCESS;
17✔
3512
}
3513

3514
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
37✔
3515
  int32_t ret = TSDB_CODE_SUCCESS;
37✔
3516
  int32_t mid;
3517

3518
  if (start >= end) {
37✔
3519
    return TSDB_CODE_SUCCESS;
20✔
3520
  }
3521

3522
  mid = (start + end) / 2;
17✔
3523

3524
  ret = tColDataMergeSort(aColData, start, mid, nColData);
17✔
3525
  if (ret != TSDB_CODE_SUCCESS) {
17!
3526
    return ret;
×
3527
  }
3528

3529
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
17✔
3530
  if (ret != TSDB_CODE_SUCCESS) {
17!
3531
    return ret;
×
3532
  }
3533

3534
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
17✔
3535
}
3536

3537
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
3✔
3538
  int32_t nVal = aColData[0].nVal;
3✔
3539

3540
  if (nVal < 2) return TSDB_CODE_SUCCESS;
3!
3541

3542
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
3✔
3543
}
3544

3545
static int32_t tColDataMerge(SArray **colArr) {
3✔
3546
  int32_t code = 0;
3✔
3547
  SArray *src = *colArr;
3✔
3548
  SArray *dst = NULL;
3✔
3549

3550
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
3✔
3551
  if (dst == NULL) {
3!
3552
    return terrno;
×
3553
  }
3554

3555
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
12✔
3556
    SColData *srcCol = taosArrayGet(src, i);
9✔
3557

3558
    SColData *dstCol = taosArrayReserve(dst, 1);
9✔
3559
    if (dstCol == NULL) {
9!
3560
      code = terrno;
×
3561
      goto _exit;
×
3562
    }
3563
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
9✔
3564
  }
3565

3566
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
3✔
3567
  SRowKey lastKey;
3568
  for (int32_t i = 0; i < numRows; i++) {
9✔
3569
    SRowKey key;
3570
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
6✔
3571

3572
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
9!
3573
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
12✔
3574
        SColData *srcCol = taosArrayGet(src, j);
9✔
3575
        SColData *dstCol = taosArrayGet(dst, j);
9✔
3576

3577
        SColVal cv;
3578
        tColDataGetValue(srcCol, i, &cv);
9✔
3579
        code = tColDataAppendValue(dstCol, &cv);
9✔
3580
        if (code) {
9!
3581
          goto _exit;
×
3582
        }
3583
      }
3584
      lastKey = key;
3✔
3585
    } else {  // update existing row
3586
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
12✔
3587
        SColData *srcCol = taosArrayGet(src, j);
9✔
3588
        SColData *dstCol = taosArrayGet(dst, j);
9✔
3589

3590
        SColVal cv;
3591
        tColDataGetValue(srcCol, i, &cv);
9✔
3592
        code = tColDataUpdateValue(dstCol, &cv, true);
9✔
3593
        if (code) {
9!
3594
          goto _exit;
×
3595
        }
3596
      }
3597
    }
3598
  }
3599

3600
_exit:
3✔
3601
  if (code) {
3!
3602
    taosArrayDestroyEx(dst, tColDataDestroy);
×
3603
  } else {
3604
    taosArrayDestroyEx(src, tColDataDestroy);
3✔
3605
    *colArr = dst;
3✔
3606
  }
3607
  return code;
3✔
3608
}
3609

3610
int32_t tColDataSortMerge(SArray **arr) {
92,192✔
3611
  SArray   *colDataArr = *arr;
92,192✔
3612
  int32_t   nColData = TARRAY_SIZE(colDataArr);
92,192✔
3613
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
92,192✔
3614

3615
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
92,192!
3616
    return TSDB_CODE_INVALID_PARA;
×
3617
  }
3618
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
92,192!
3619
    return TSDB_CODE_INVALID_PARA;
×
3620
  }
3621
  if (!(aColData[0].flag == HAS_VALUE)) {
92,192!
3622
    return TSDB_CODE_INVALID_PARA;
×
3623
  }
3624

3625
  if (aColData[0].nVal <= 1) goto _exit;
92,192✔
3626

3627
  int8_t doSort = 0;
90,494✔
3628
  int8_t doMerge = 0;
90,494✔
3629
  // scan -------
3630
  SRowKey lastKey;
3631
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
90,494✔
3632
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
534,601✔
3633
    SRowKey key;
3634
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
444,113✔
3635

3636
    int32_t c = tRowKeyCompare(&lastKey, &key);
444,111✔
3637
    if (c < 0) {
444,111✔
3638
      lastKey = key;
444,106✔
3639
      continue;
444,106✔
3640
    } else if (c > 0) {
5✔
3641
      doSort = 1;
3✔
3642
      break;
3✔
3643
    } else {
3644
      doMerge = 1;
2✔
3645
    }
3646
  }
3647

3648
  // sort -------
3649
  if (doSort) {
90,491✔
3650
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
3!
3651
  }
3652

3653
  if (doMerge != 1) {
90,498✔
3654
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
90,491✔
3655
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
534,610✔
3656
      SRowKey key;
3657
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
444,123✔
3658

3659
      int32_t c = tRowKeyCompare(&lastKey, &key);
444,120✔
3660
      if (c == 0) {
444,120!
3661
        doMerge = 1;
×
3662
        break;
×
3663
      }
3664
      lastKey = key;
444,120✔
3665
    }
3666
  }
3667

3668
  // merge -------
3669
  if (doMerge) {
90,494✔
3670
    int32_t code = tColDataMerge(arr);
3✔
3671
    if (code) return code;
3!
3672
  }
3673

3674
_exit:
90,494✔
3675
  return 0;
92,192✔
3676
}
3677

3678
static int32_t tPutColDataVersion0(uint8_t *pBuf, SColData *pColData) {
1,604,723✔
3679
  int32_t n = 0;
1,604,723✔
3680

3681
  n += tPutI16v(pBuf ? pBuf + n : NULL, pColData->cid);
1,604,723✔
3682
  n += tPutI8(pBuf ? pBuf + n : NULL, pColData->type);
1,604,723✔
3683
  n += tPutI32v(pBuf ? pBuf + n : NULL, pColData->nVal);
1,604,723✔
3684
  n += tPutI8(pBuf ? pBuf + n : NULL, pColData->flag);
1,604,723✔
3685

3686
  // bitmap
3687
  switch (pColData->flag) {
1,604,723!
3688
    case (HAS_NULL | HAS_NONE):
17,150✔
3689
    case (HAS_VALUE | HAS_NONE):
3690
    case (HAS_VALUE | HAS_NULL):
3691
      if (pBuf) (void)memcpy(pBuf + n, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
17,150✔
3692
      n += BIT1_SIZE(pColData->nVal);
17,150✔
3693
      break;
17,150✔
3694
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
3695
      if (pBuf) (void)memcpy(pBuf + n, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
3696
      n += BIT2_SIZE(pColData->nVal);
×
3697
      break;
×
3698
    default:
1,587,573✔
3699
      break;
1,587,573✔
3700
  }
3701

3702
  // value
3703
  if (pColData->flag & HAS_VALUE) {
1,604,723✔
3704
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,604,542!
3705
      if (pBuf) (void)memcpy(pBuf + n, pColData->aOffset, pColData->nVal << 2);
217,946✔
3706
      n += (pColData->nVal << 2);
217,946✔
3707

3708
      n += tPutI32v(pBuf ? pBuf + n : NULL, pColData->nData);
217,946✔
3709
      if (pBuf) (void)memcpy(pBuf + n, pColData->pData, pColData->nData);
217,946✔
3710
      n += pColData->nData;
217,946✔
3711
    } else {
3712
      if (pBuf) (void)memcpy(pBuf + n, pColData->pData, pColData->nData);
1,386,596✔
3713
      n += pColData->nData;
1,386,596✔
3714
    }
3715
  }
3716

3717
  return n;
1,604,723✔
3718
}
3719

3720
static int32_t tGetColDataVersion0(uint8_t *pBuf, SColData *pColData) {
2,012✔
3721
  int32_t n = 0;
2,012✔
3722

3723
  n += tGetI16v(pBuf + n, &pColData->cid);
2,012✔
3724
  n += tGetI8(pBuf + n, &pColData->type);
2,012✔
3725
  n += tGetI32v(pBuf + n, &pColData->nVal);
2,012✔
3726
  n += tGetI8(pBuf + n, &pColData->flag);
2,012✔
3727

3728
  // bitmap
3729
  switch (pColData->flag) {
2,012!
3730
    case (HAS_NULL | HAS_NONE):
52✔
3731
    case (HAS_VALUE | HAS_NONE):
3732
    case (HAS_VALUE | HAS_NULL):
3733
      pColData->pBitMap = pBuf + n;
52✔
3734
      n += BIT1_SIZE(pColData->nVal);
52✔
3735
      break;
52✔
3736
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
3737
      pColData->pBitMap = pBuf + n;
×
3738
      n += BIT2_SIZE(pColData->nVal);
×
3739
      break;
×
3740
    default:
1,960✔
3741
      break;
1,960✔
3742
  }
3743

3744
  // value
3745
  if (pColData->flag & HAS_VALUE) {
2,012✔
3746
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,819!
3747
      pColData->aOffset = (int32_t *)(pBuf + n);
376✔
3748
      n += (pColData->nVal << 2);
376✔
3749

3750
      n += tGetI32v(pBuf + n, &pColData->nData);
376!
3751
      pColData->pData = pBuf + n;
376✔
3752
      n += pColData->nData;
376✔
3753
    } else {
3754
      pColData->pData = pBuf + n;
1,443✔
3755
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
1,443✔
3756
      n += pColData->nData;
1,443✔
3757
    }
3758
  }
3759
  pColData->cflag = 0;
2,012✔
3760

3761
  return n;
2,012✔
3762
}
3763

3764
static int32_t tPutColDataVersion1(uint8_t *pBuf, SColData *pColData) {
1,604,723✔
3765
  int32_t n = tPutColDataVersion0(pBuf, pColData);
1,604,723✔
3766
  n += tPutI8(pBuf ? pBuf + n : NULL, pColData->cflag);
1,604,722✔
3767
  return n;
1,604,722✔
3768
}
3769

3770
static int32_t tGetColDataVersion1(uint8_t *pBuf, SColData *pColData) {
2,012✔
3771
  int32_t n = tGetColDataVersion0(pBuf, pColData);
2,012✔
3772
  n += tGetI8(pBuf ? pBuf + n : NULL, &pColData->cflag);
2,011!
3773
  return n;
2,011✔
3774
}
3775

3776
int32_t tPutColData(uint8_t version, uint8_t *pBuf, SColData *pColData) {
1,604,723✔
3777
  if (version == 0) {
1,604,723!
3778
    return tPutColDataVersion0(pBuf, pColData);
×
3779
  } else if (version == 1) {
1,604,723!
3780
    return tPutColDataVersion1(pBuf, pColData);
1,604,723✔
3781
  } else {
3782
    return TSDB_CODE_INVALID_PARA;
×
3783
  }
3784
}
3785

3786
int32_t tGetColData(uint8_t version, uint8_t *pBuf, SColData *pColData) {
2,012✔
3787
  if (version == 0) {
2,012!
3788
    return tGetColDataVersion0(pBuf, pColData);
×
3789
  } else if (version == 1) {
2,012!
3790
    return tGetColDataVersion1(pBuf, pColData);
2,012✔
3791
  } else {
3792
    return TSDB_CODE_INVALID_PARA;
×
3793
  }
3794
}
3795

3796
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
3797
  do {                                       \
3798
    (SUM) += (VAL);                          \
3799
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
3800
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
3801
  } while (0)
3802

3803
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
7,085✔
3804
                                             int16_t *numOfNull) {
3805
  *sum = 0;
7,085✔
3806
  *max = 0;
7,085✔
3807
  *min = 1;
7,085✔
3808
  *numOfNull = 0;
7,085✔
3809

3810
  int8_t val;
3811
  if (HAS_VALUE == pColData->flag) {
7,085✔
3812
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,240,560✔
3813
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
4,234,940✔
3814
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,234,940✔
3815
    }
3816
  } else {
3817
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
3818
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
3819
        case 0:
236,620✔
3820
        case 1:
3821
          (*numOfNull)++;
236,620✔
3822
          break;
236,620✔
3823
        case 2:
4,498,073✔
3824
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
4,498,073✔
3825
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,498,073✔
3826
          break;
4,498,073✔
3827
        default:
×
3828
          break;
×
3829
      }
3830
    }
3831
  }
3832
}
7,085✔
3833

3834
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
7,122✔
3835
                                                int16_t *numOfNull) {
3836
  *sum = 0;
7,122✔
3837
  *max = INT8_MIN;
7,122✔
3838
  *min = INT8_MAX;
7,122✔
3839
  *numOfNull = 0;
7,122✔
3840

3841
  int8_t val;
3842
  if (HAS_VALUE == pColData->flag) {
7,122✔
3843
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,360,082✔
3844
      val = ((int8_t *)pColData->pData)[iVal];
4,354,425✔
3845
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,354,425✔
3846
    }
3847
  } else {
3848
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
3849
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
3850
        case 0:
236,852✔
3851
        case 1:
3852
          (*numOfNull)++;
236,852✔
3853
          break;
236,852✔
3854
        case 2:
4,497,841✔
3855
          val = ((int8_t *)pColData->pData)[iVal];
4,497,841✔
3856
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,497,841✔
3857
          break;
4,497,841✔
3858
        default:
×
3859
          break;
×
3860
      }
3861
    }
3862
  }
3863
}
7,122✔
3864

3865
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
7,121✔
3866
                                                     int16_t *numOfNull) {
3867
  *sum = 0;
7,121✔
3868
  *max = INT16_MIN;
7,121✔
3869
  *min = INT16_MAX;
7,121✔
3870
  *numOfNull = 0;
7,121✔
3871

3872
  int16_t val;
3873
  if (HAS_VALUE == pColData->flag) {
7,121✔
3874
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,360,084✔
3875
      val = ((int16_t *)pColData->pData)[iVal];
4,354,428✔
3876
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,354,428✔
3877
    }
3878
  } else {
3879
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
3880
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
3881
        case 0:
236,525✔
3882
        case 1:
3883
          (*numOfNull)++;
236,525✔
3884
          break;
236,525✔
3885
        case 2:
4,498,168✔
3886
          val = ((int16_t *)pColData->pData)[iVal];
4,498,168✔
3887
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,498,168✔
3888
          break;
4,498,168✔
3889
        default:
×
3890
          break;
×
3891
      }
3892
    }
3893
  }
3894
}
7,121✔
3895

3896
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
253,634✔
3897
                                            int16_t *numOfNull) {
3898
  *sum = 0;
253,634✔
3899
  *max = INT32_MIN;
253,634✔
3900
  *min = INT32_MAX;
253,634✔
3901
  *numOfNull = 0;
253,634✔
3902

3903
  int32_t val;
3904
  if (HAS_VALUE == pColData->flag) {
253,634✔
3905
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
732,646,284✔
3906
      val = ((int32_t *)pColData->pData)[iVal];
732,434,416✔
3907
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
732,434,416✔
3908
    }
3909
  } else {
3910
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
121,646,079✔
3911
      switch (tColDataGetBitValue(pColData, iVal)) {
121,615,227!
3912
        case 0:
6,898,857✔
3913
        case 1:
3914
          (*numOfNull)++;
6,898,857✔
3915
          break;
6,898,857✔
3916
        case 2:
114,793,424✔
3917
          val = ((int32_t *)pColData->pData)[iVal];
114,793,424✔
3918
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
114,793,424✔
3919
          break;
114,793,424✔
3920
        default:
×
3921
          break;
×
3922
      }
3923
    }
3924
  }
3925
}
242,720✔
3926

3927
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
84,101✔
3928
                                               int16_t *numOfNull) {
3929
  *sum = 0;
84,101✔
3930
  *max = INT64_MIN;
84,101✔
3931
  *min = INT64_MAX;
84,101✔
3932
  *numOfNull = 0;
84,101✔
3933

3934
  int64_t val;
3935
  if (HAS_VALUE == pColData->flag) {
84,101✔
3936
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
220,954,436✔
3937
      val = ((int64_t *)pColData->pData)[iVal];
220,875,937✔
3938
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
220,875,937✔
3939
    }
3940
  } else {
3941
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
19,777,903✔
3942
      switch (tColDataGetBitValue(pColData, iVal)) {
19,774,372!
3943
        case 0:
1,810,274✔
3944
        case 1:
3945
          (*numOfNull)++;
1,810,274✔
3946
          break;
1,810,274✔
3947
        case 2:
17,967,017✔
3948
          val = ((int64_t *)pColData->pData)[iVal];
17,967,017✔
3949
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
17,967,017✔
3950
          break;
17,967,017✔
3951
        default:
×
3952
          break;
×
3953
      }
3954
    }
3955
  }
3956
}
82,030✔
3957

3958
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
187,781✔
3959
                                              int16_t *numOfNull) {
3960
  *(double *)sum = 0;
187,781✔
3961
  *(double *)max = -FLT_MAX;
187,781✔
3962
  *(double *)min = FLT_MAX;
187,781✔
3963
  *numOfNull = 0;
187,781✔
3964

3965
  float val;
3966
  if (HAS_VALUE == pColData->flag) {
187,781✔
3967
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
743,092,748✔
3968
      val = ((float *)pColData->pData)[iVal];
742,906,432✔
3969
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
742,906,432✔
3970
    }
3971
  } else {
3972
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,263✔
3973
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,798!
3974
        case 0:
237,928✔
3975
        case 1:
3976
          (*numOfNull)++;
237,928✔
3977
          break;
237,928✔
3978
        case 2:
4,496,870✔
3979
          val = ((float *)pColData->pData)[iVal];
4,496,870✔
3980
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
4,496,870✔
3981
          break;
4,496,870✔
3982
        default:
×
3983
          break;
×
3984
      }
3985
    }
3986
  }
3987
}
187,781✔
3988

3989
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
8,119✔
3990
                                               int16_t *numOfNull) {
3991
  *(double *)sum = 0;
8,119✔
3992
  *(double *)max = -DBL_MAX;
8,119✔
3993
  *(double *)min = DBL_MAX;
8,119✔
3994
  *numOfNull = 0;
8,119✔
3995

3996
  double val;
3997
  if (HAS_VALUE == pColData->flag) {
8,119✔
3998
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
10,378,947✔
3999
      val = ((double *)pColData->pData)[iVal];
10,372,293✔
4000
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
10,372,293✔
4001
    }
4002
  } else {
4003
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
4004
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
4005
        case 0:
236,818✔
4006
        case 1:
4007
          (*numOfNull)++;
236,818✔
4008
          break;
236,818✔
4009
        case 2:
4,497,875✔
4010
          val = ((double *)pColData->pData)[iVal];
4,497,875✔
4011
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
4,497,875✔
4012
          break;
4,497,875✔
4013
        default:
×
4014
          break;
×
4015
      }
4016
    }
4017
  }
4018
}
8,119✔
4019

4020
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
4,207✔
4021
                                                 int16_t *numOfNull) {
4022
  *(uint64_t *)sum = 0;
4,207✔
4023
  *(uint64_t *)max = 0;
4,207✔
4024
  *(uint64_t *)min = UINT8_MAX;
4,207✔
4025
  *numOfNull = 0;
4,207✔
4026

4027
  uint8_t val;
4028
  if (HAS_VALUE == pColData->flag) {
4,207✔
4029
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,476,111✔
4030
      val = ((uint8_t *)pColData->pData)[iVal];
3,473,369✔
4031
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,473,369✔
4032
    }
4033
  } else {
4034
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
4035
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
4036
        case 0:
236,837✔
4037
        case 1:
4038
          (*numOfNull)++;
236,837✔
4039
          break;
236,837✔
4040
        case 2:
4,497,856✔
4041
          val = ((uint8_t *)pColData->pData)[iVal];
4,497,856✔
4042
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
4,497,856✔
4043
          break;
4,497,856✔
4044
        default:
×
4045
          break;
×
4046
      }
4047
    }
4048
  }
4049
}
4,207✔
4050

4051
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
4,207✔
4052
                                                      int16_t *numOfNull) {
4053
  *(uint64_t *)sum = 0;
4,207✔
4054
  *(uint64_t *)max = 0;
4,207✔
4055
  *(uint64_t *)min = UINT16_MAX;
4,207✔
4056
  *numOfNull = 0;
4,207✔
4057

4058
  uint16_t val;
4059
  if (HAS_VALUE == pColData->flag) {
4,207✔
4060
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,476,111✔
4061
      val = ((uint16_t *)pColData->pData)[iVal];
3,473,369✔
4062
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,473,369✔
4063
    }
4064
  } else {
4065
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
4066
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
4067
        case 0:
235,562✔
4068
        case 1:
4069
          (*numOfNull)++;
235,562✔
4070
          break;
235,562✔
4071
        case 2:
4,499,131✔
4072
          val = ((uint16_t *)pColData->pData)[iVal];
4,499,131✔
4073
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
4,499,131✔
4074
          break;
4,499,131✔
4075
        default:
×
4076
          break;
×
4077
      }
4078
    }
4079
  }
4080
}
4,207✔
4081

4082
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
4,207✔
4083
                                             int16_t *numOfNull) {
4084
  *(uint64_t *)sum = 0;
4,207✔
4085
  *(uint64_t *)max = 0;
4,207✔
4086
  *(uint64_t *)min = UINT32_MAX;
4,207✔
4087
  *numOfNull = 0;
4,207✔
4088

4089
  uint32_t val;
4090
  if (HAS_VALUE == pColData->flag) {
4,207✔
4091
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,474,304✔
4092
      val = ((uint32_t *)pColData->pData)[iVal];
3,471,562✔
4093
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,471,562✔
4094
    }
4095
  } else {
4096
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
4097
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
4098
        case 0:
236,832✔
4099
        case 1:
4100
          (*numOfNull)++;
236,832✔
4101
          break;
236,832✔
4102
        case 2:
4,497,861✔
4103
          val = ((uint32_t *)pColData->pData)[iVal];
4,497,861✔
4104
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
4,497,861✔
4105
          break;
4,497,861✔
4106
        default:
×
4107
          break;
×
4108
      }
4109
    }
4110
  }
4111
}
4,207✔
4112

4113
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
4,207✔
4114
                                                int16_t *numOfNull) {
4115
  *(uint64_t *)sum = 0;
4,207✔
4116
  *(uint64_t *)max = 0;
4,207✔
4117
  *(uint64_t *)min = UINT64_MAX;
4,207✔
4118
  *numOfNull = 0;
4,207✔
4119

4120
  uint64_t val;
4121
  if (HAS_VALUE == pColData->flag) {
4,207✔
4122
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,473,798✔
4123
      val = ((uint64_t *)pColData->pData)[iVal];
3,471,056✔
4124
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,471,056✔
4125
    }
4126
  } else {
4127
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,736,158✔
4128
      switch (tColDataGetBitValue(pColData, iVal)) {
4,734,693!
4129
        case 0:
234,971✔
4130
        case 1:
4131
          (*numOfNull)++;
234,971✔
4132
          break;
234,971✔
4133
        case 2:
4,499,722✔
4134
          val = ((uint64_t *)pColData->pData)[iVal];
4,499,722✔
4135
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
4,499,722✔
4136
          break;
4,499,722✔
4137
        default:
×
4138
          break;
×
4139
      }
4140
    }
4141
  }
4142
}
4,207✔
4143

4144
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
19,764✔
4145
                                                int16_t *numOfNull) {
4146
  *(uint64_t *)sum = 0;
19,764✔
4147
  *(uint64_t *)max = 0;
19,764✔
4148
  *(uint64_t *)min = 0;
19,764✔
4149
  *numOfNull = 0;
19,764✔
4150

4151
  switch (pColData->flag) {
19,764!
4152
    case HAS_NONE:
×
4153
    case HAS_NULL:
4154
    case (HAS_NONE | HAS_NULL):
4155
      *numOfNull = pColData->nVal;
×
4156
      break;
×
4157
    case HAS_VALUE:
16,834✔
4158
      *numOfNull = 0;
16,834✔
4159
      break;
16,834✔
4160
    case (HAS_VALUE | HAS_NULL):
2,930✔
4161
    case (HAS_VALUE | HAS_NONE):
4162
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
9,472,316✔
4163
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
9,469,386✔
4164
          (*numOfNull)++;
473,998✔
4165
        }
4166
      }
4167
      break;
2,930✔
4168
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
4169
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
4170
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
4171
          (*numOfNull)++;
×
4172
        }
4173
      }
4174
      break;
×
4175
    default:
×
4176
      break;
×
4177
  }
4178
}
19,764✔
4179

4180
void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull) = {
4181
    NULL,
4182
    tColDataCalcSMABool,           // TSDB_DATA_TYPE_BOOL
4183
    tColDataCalcSMATinyInt,        // TSDB_DATA_TYPE_TINYINT
4184
    tColDataCalcSMATinySmallInt,   // TSDB_DATA_TYPE_SMALLINT
4185
    tColDataCalcSMAInt,            // TSDB_DATA_TYPE_INT
4186
    tColDataCalcSMABigInt,         // TSDB_DATA_TYPE_BIGINT
4187
    tColDataCalcSMAFloat,          // TSDB_DATA_TYPE_FLOAT
4188
    tColDataCalcSMADouble,         // TSDB_DATA_TYPE_DOUBLE
4189
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_VARCHAR
4190
    tColDataCalcSMABigInt,         // TSDB_DATA_TYPE_TIMESTAMP
4191
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_NCHAR
4192
    tColDataCalcSMAUTinyInt,       // TSDB_DATA_TYPE_UTINYINT
4193
    tColDataCalcSMATinyUSmallInt,  // TSDB_DATA_TYPE_USMALLINT
4194
    tColDataCalcSMAUInt,           // TSDB_DATA_TYPE_UINT
4195
    tColDataCalcSMAUBigInt,        // TSDB_DATA_TYPE_UBIGINT
4196
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_JSON
4197
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_VARBINARY
4198
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_DECIMAL
4199
    tColDataCalcSMAVarType,        // TSDB_DATA_TYPE_BLOB
4200
    NULL,                          // TSDB_DATA_TYPE_MEDIUMBLOB
4201
    tColDataCalcSMAVarType         // TSDB_DATA_TYPE_GEOMETRY
4202
};
4203

4204
// SValueColumn ================================
4205
int32_t tValueColumnInit(SValueColumn *valCol) {
17,032,724✔
4206
  valCol->type = TSDB_DATA_TYPE_NULL;
17,032,724✔
4207
  valCol->numOfValues = 0;
17,032,724✔
4208
  tBufferInit(&valCol->data);
17,032,724✔
4209
  tBufferInit(&valCol->offsets);
17,032,724✔
4210
  return 0;
17,032,724✔
4211
}
4212

4213
void tValueColumnDestroy(SValueColumn *valCol) {
39,274,474✔
4214
  valCol->type = TSDB_DATA_TYPE_NULL;
39,274,474✔
4215
  valCol->numOfValues = 0;
39,274,474✔
4216
  tBufferDestroy(&valCol->data);
39,274,474✔
4217
  tBufferDestroy(&valCol->offsets);
39,274,474✔
4218
  return;
39,274,474✔
4219
}
4220

4221
void tValueColumnClear(SValueColumn *valCol) {
19,222,088✔
4222
  valCol->type = TSDB_DATA_TYPE_NULL;
19,222,088✔
4223
  valCol->numOfValues = 0;
19,222,088✔
4224
  tBufferClear(&valCol->data);
19,222,088✔
4225
  tBufferClear(&valCol->offsets);
19,222,088✔
4226
  return;
19,222,088✔
4227
}
4228

4229
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
964,762✔
4230
  int32_t code;
4231

4232
  if (valCol->numOfValues == 0) {
964,762✔
4233
    valCol->type = value->type;
4,558✔
4234
  }
4235

4236
  if (!(value->type == valCol->type)) {
964,762!
4237
    return TSDB_CODE_INVALID_PARA;
×
4238
  }
4239

4240
  if (IS_VAR_DATA_TYPE(value->type)) {
964,762!
4241
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
36!
4242
      return code;
×
4243
    }
4244
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
36!
4245
      return code;
×
4246
    }
4247
  } else {
4248
    code = tBufferPut(&valCol->data, &value->val, tDataTypes[value->type].bytes);
964,744✔
4249
    if (code) return code;
964,744!
4250
  }
4251
  valCol->numOfValues++;
964,762✔
4252

4253
  return 0;
964,762✔
4254
}
4255

4256
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
252,738,988✔
4257
  int32_t code;
4258

4259
  if (idx < 0 || idx >= valCol->numOfValues) {
252,738,988!
4260
    return TSDB_CODE_OUT_OF_RANGE;
×
4261
  }
4262

4263
  if (IS_VAR_DATA_TYPE(valCol->type)) {
252,760,191!
4264
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
×
4265
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
×
4266
    int32_t  oldDataSize = nextOffset - offsets[idx];
×
4267
    int32_t  bytesAdded = value->nData - oldDataSize;
×
4268

4269
    if (bytesAdded != 0) {
×
4270
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
24!
4271
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
12✔
4272
              tBufferGetSize(&valCol->data) - nextOffset);
12✔
4273
      valCol->data.size += bytesAdded;
12✔
4274

4275
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
12!
4276
        offsets[i] += bytesAdded;
×
4277
      }
4278
    }
4279
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
×
4280
  } else {
4281
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, &value->val,
252,922,312✔
4282
                        tDataTypes[valCol->type].bytes);
252,797,608✔
4283
  }
4284
  return 0;
4285
}
4286

4287
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
512,956,722✔
4288
  if (idx < 0 || idx >= valCol->numOfValues) {
512,956,722!
4289
    return TSDB_CODE_OUT_OF_RANGE;
×
4290
  }
4291

4292
  value->type = valCol->type;
512,992,617✔
4293
  if (IS_VAR_DATA_TYPE(value->type)) {
512,992,617!
4294
    int32_t       offset, nextOffset;
4295
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
×
4296

4297
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
×
4298
    if (idx == valCol->numOfValues - 1) {
106✔
4299
      nextOffset = tBufferGetSize(&valCol->data);
102✔
4300
    } else {
4301
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
4!
4302
    }
4303
    value->nData = nextOffset - offset;
106✔
4304
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
106✔
4305
  } else {
4306
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
513,068,976✔
4307
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, &value->val));
1,026,137,952!
4308
  }
4309
  return 0;
513,069,082✔
4310
}
4311

4312
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
4,557✔
4313
  int32_t code;
4314

4315
  if (!(valCol->numOfValues > 0)) {
4,557!
4316
    return TSDB_CODE_INVALID_PARA;
×
4317
  }
4318

4319
  (*info) = (SValueColumnCompressInfo){
4,557✔
4320
      .cmprAlg = info->cmprAlg,
4,557✔
4321
      .type = valCol->type,
4,557✔
4322
  };
4323

4324
  // offset
4325
  if (IS_VAR_DATA_TYPE(valCol->type)) {
4,557!
4326
    SCompressInfo cinfo = {
15✔
4327
        .cmprAlg = info->cmprAlg,
15✔
4328
        .dataType = TSDB_DATA_TYPE_INT,
4329
        .originalSize = valCol->offsets.size,
15✔
4330
    };
4331

4332
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
15✔
4333
    if (code) return code;
14!
4334

4335
    info->offsetOriginalSize = cinfo.originalSize;
14✔
4336
    info->offsetCompressedSize = cinfo.compressedSize;
14✔
4337
  }
4338

4339
  // data
4340
  SCompressInfo cinfo = {
4,556✔
4341
      .cmprAlg = info->cmprAlg,
4,556✔
4342
      .dataType = valCol->type,
4,556✔
4343
      .originalSize = valCol->data.size,
4,556✔
4344
  };
4345

4346
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
4,556✔
4347
  if (code) return code;
4,558!
4348

4349
  info->dataOriginalSize = cinfo.originalSize;
4,558✔
4350
  info->dataCompressedSize = cinfo.compressedSize;
4,558✔
4351

4352
  return 0;
4,558✔
4353
}
4354

4355
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
64,465✔
4356
                               SBuffer *assist) {
4357
  int32_t code;
4358

4359
  tValueColumnClear(valCol);
64,465✔
4360
  valCol->type = info->type;
64,465✔
4361
  // offset
4362
  if (IS_VAR_DATA_TYPE(valCol->type)) {
64,471!
4363
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
6✔
4364

4365
    SCompressInfo cinfo = {
6✔
4366
        .dataType = TSDB_DATA_TYPE_INT,
4367
        .cmprAlg = info->cmprAlg,
6✔
4368
        .originalSize = info->offsetOriginalSize,
6✔
4369
        .compressedSize = info->offsetCompressedSize,
6✔
4370
    };
4371

4372
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
6✔
4373
    if (code) {
6!
4374
      return code;
×
4375
    }
4376
  } else {
4377
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
64,459✔
4378
  }
4379

4380
  // data
4381
  SCompressInfo cinfo = {
64,465✔
4382
      .dataType = valCol->type,
64,465✔
4383
      .cmprAlg = info->cmprAlg,
64,465✔
4384
      .originalSize = info->dataOriginalSize,
64,465✔
4385
      .compressedSize = info->dataCompressedSize,
64,465✔
4386
  };
4387

4388
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
64,465✔
4389
  if (code) {
64,466!
4390
    return code;
×
4391
  }
4392

4393
  return 0;
64,466✔
4394
}
4395

4396
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
4,558✔
4397
  int32_t code;
4398
  uint8_t fmtVer = 0;
4,558✔
4399

4400
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
9,116!
4401
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
9,116!
4402
  if ((code = tBufferPutI8(buffer, info->type))) return code;
9,116!
4403
  if (IS_VAR_DATA_TYPE(info->type)) {
4,558!
4404
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
28!
4405
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
28!
4406
  }
4407
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
9,116!
4408
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
9,116!
4409

4410
  return 0;
4,558✔
4411
}
4412

4413
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
64,465✔
4414
  int32_t code;
4415
  uint8_t fmtVer;
4416

4417
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
64,465!
4418
  if (fmtVer == 0) {
64,465!
4419
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
64,465!
4420
    if ((code = tBufferGetI8(reader, &info->type))) return code;
64,464!
4421
    if (IS_VAR_DATA_TYPE(info->type)) {
64,465!
4422
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
6!
4423
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
6!
4424
    } else {
4425
      info->offsetOriginalSize = 0;
64,459✔
4426
      info->offsetCompressedSize = 0;
64,459✔
4427
    }
4428
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
64,465!
4429
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
64,465!
4430
  } else {
4431
    return TSDB_CODE_INVALID_PARA;
×
4432
  }
4433

4434
  return 0;
64,466✔
4435
}
4436

4437
int32_t tCompressData(void          *input,       // input
5,642,763✔
4438
                      SCompressInfo *info,        // compress info
4439
                      void          *output,      // output
4440
                      int32_t        outputSize,  // output size
4441
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
4442
) {
4443
  int32_t extraSizeNeeded;
4444
  int32_t code;
4445

4446
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
5,642,763!
4447
  if (!(outputSize >= extraSizeNeeded)) {
5,642,763!
4448
    return TSDB_CODE_INVALID_PARA;
×
4449
  }
4450

4451
  if (info->cmprAlg == NO_COMPRESSION) {
5,642,763!
4452
    (void)memcpy(output, input, info->originalSize);
×
4453
    info->compressedSize = info->originalSize;
×
4454
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
6,934,303✔
4455
    SBuffer local;
4456

4457
    tBufferInit(&local);
4458
    if (buffer == NULL) {
1,289,486!
4459
      buffer = &local;
×
4460
    }
4461

4462
    if (info->cmprAlg == TWO_STAGE_COMP) {
1,289,486!
4463
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
1,291,332✔
4464
      if (code) {
1,291,332!
4465
        tBufferDestroy(&local);
4466
        return code;
×
4467
      }
4468
    }
4469

4470
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
2,581,026✔
4471
        input,                                                   // input
4472
        info->originalSize,                                      // input size
4473
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
1,289,486✔
4474
        output,                                                  // output
4475
        outputSize,                                              // output size
4476
        info->cmprAlg,                                           // compression algorithm
1,289,486✔
4477
        buffer->data,                                            // buffer
4478
        buffer->capacity                                         // buffer size
1,289,486✔
4479
    );
4480
    if (info->compressedSize < 0) {
1,291,540!
4481
      tBufferDestroy(&local);
4482
      return TSDB_CODE_COMPRESS_ERROR;
×
4483
    }
4484

4485
    tBufferDestroy(&local);
4486
  } else {
4487
    DEFINE_VAR(info->cmprAlg)
4,353,277✔
4488
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
4,353,277!
4489
      (void)memcpy(output, input, info->originalSize);
×
4490
      info->compressedSize = info->originalSize;
×
4491
      return 0;
×
4492
    }
4493
    SBuffer local;
4494

4495
    tBufferInit(&local);
4496
    if (buffer == NULL) {
4,353,277!
4497
      buffer = &local;
×
4498
    }
4499
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
4,353,277✔
4500

4501
    info->compressedSize = tDataCompress[info->dataType].compFunc(  //
8,707,480✔
4502
        input,                                                      // input
4503
        info->originalSize,                                         // input size
4504
        info->originalSize / tDataTypes[info->dataType].bytes,      // number of elements
4,353,293✔
4505
        output,                                                     // output
4506
        outputSize,                                                 // output size
4507
        info->cmprAlg,                                              // compression algorithm
4508
        buffer->data,                                               // buffer
4509
        buffer->capacity                                            // buffer size
4,353,293✔
4510
    );
4511
    if (info->compressedSize < 0) {
4,354,187!
4512
      tBufferDestroy(&local);
4513
      return TSDB_CODE_COMPRESS_ERROR;
×
4514
    }
4515

4516
    tBufferDestroy(&local);
4517
    // new col compress
4518
  }
4519

4520
  return 0;
5,645,727✔
4521
}
4522

4523
int32_t tDecompressData(void                *input,       // input
60,849,275✔
4524
                        const SCompressInfo *info,        // compress info
4525
                        void                *output,      // output
4526
                        int32_t              outputSize,  // output size
4527
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
4528
) {
4529
  int32_t code;
4530

4531
  if (!(outputSize >= info->originalSize)) {
60,849,275!
4532
    return TSDB_CODE_INVALID_PARA;
×
4533
  }
4534

4535
  if (info->cmprAlg == NO_COMPRESSION) {
60,849,275!
4536
    if (!(info->compressedSize == info->originalSize)) {
×
4537
      return TSDB_CODE_INVALID_PARA;
×
4538
    }
4539
    (void)memcpy(output, input, info->compressedSize);
×
4540
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
85,517,787!
4541
    SBuffer local;
4542

4543
    tBufferInit(&local);
4544
    if (buffer == NULL) {
24,647,162!
4545
      buffer = &local;
×
4546
    }
4547

4548
    if (info->cmprAlg == TWO_STAGE_COMP) {
24,647,162!
4549
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
24,666,985✔
4550
      if (code) {
24,667,708!
4551
        tBufferDestroy(&local);
4552
        return code;
×
4553
      }
4554
    }
4555

4556
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
24,647,885✔
4557
        input,                                                  // input
4558
        info->compressedSize,                                   // inputSize
24,647,885✔
4559
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
24,647,885✔
4560
        output,                                                 // output
4561
        outputSize,                                             // output size
4562
        info->cmprAlg,                                          // compression algorithm
24,647,885✔
4563
        buffer->data,                                           // helper buffer
4564
        buffer->capacity                                        // extra buffer size
24,647,885✔
4565
    );
4566
    if (decompressedSize < 0) {
24,668,512!
4567
      tBufferDestroy(&local);
4568
      return TSDB_CODE_COMPRESS_ERROR;
×
4569
    }
4570

4571
    if (!(decompressedSize == info->originalSize)) {
24,668,512!
4572
      return TSDB_CODE_COMPRESS_ERROR;
×
4573
    }
4574
    tBufferDestroy(&local);
4575
  } else {
4576
    DEFINE_VAR(info->cmprAlg);
36,202,113✔
4577
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
36,202,113!
4578
      (void)memcpy(output, input, info->compressedSize);
×
4579
      return 0;
×
4580
    }
4581
    SBuffer local;
4582

4583
    tBufferInit(&local);
4584
    if (buffer == NULL) {
36,202,113!
4585
      buffer = &local;
×
4586
    }
4587
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
36,202,113✔
4588
    if (code) {
36,202,961!
4589
      return code;
×
4590
    }
4591

4592
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
36,202,961✔
4593
        input,                                                  // input
4594
        info->compressedSize,                                   // inputSize
36,202,961✔
4595
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
36,202,961✔
4596
        output,                                                 // output
4597
        outputSize,                                             // output size
4598
        info->cmprAlg,                                          // compression algorithm
36,202,961✔
4599
        buffer->data,                                           // helper buffer
4600
        buffer->capacity                                        // extra buffer size
36,202,961✔
4601
    );
4602
    if (decompressedSize < 0) {
36,204,993!
4603
      tBufferDestroy(&local);
4604
      return TSDB_CODE_COMPRESS_ERROR;
×
4605
    }
4606

4607
    if (!(decompressedSize == info->originalSize)) {
36,204,993!
4608
      return TSDB_CODE_COMPRESS_ERROR;
×
4609
    }
4610
    tBufferDestroy(&local);
4611
  }
4612

4613
  return 0;
60,873,505✔
4614
}
4615

4616
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
5,643,165✔
4617
  int32_t code;
4618

4619
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
5,643,165✔
4620
  if (code) return code;
5,643,180!
4621

4622
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
5,643,180✔
4623
  if (code) return code;
5,643,684!
4624

4625
  output->size += info->compressedSize;
5,643,684✔
4626
  return 0;
5,643,684✔
4627
}
4628

4629
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
24,666,336✔
4630
  int32_t code;
4631

4632
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
24,666,336✔
4633
  if (code) return code;
24,665,225!
4634

4635
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
24,665,225✔
4636
  if (code) return code;
24,668,168!
4637

4638
  output->size += info->originalSize;
24,668,168✔
4639
  return 0;
24,668,168✔
4640
}
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