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

taosdata / TDengine / #4766

28 Sep 2025 10:49AM UTC coverage: 58.606% (+0.03%) from 58.577%
#4766

push

travis-ci

web-flow
merge: set version (#33122)

139135 of 302095 branches covered (46.06%)

Branch coverage included in aggregate %.

210115 of 293830 relevant lines covered (71.51%)

23976146.11 hits per line

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

46.08
/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 "decimal.h"
19
#include "tRealloc.h"
20
#include "tdatablock.h"
21
#include "tlog.h"
22

23
enum {
24
  BLOB_ROW_KV = 0,
25
  BLOB_ROW_TUPLE = 1,
26
};
27

28
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData);
29
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward);
30

31
static int32_t tRowMergeWithBlobImpl(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob, SBlobSet *pDstBlobSet,
32
                                     int32_t iStart, int32_t iEnd, int8_t flag);
33

34
static int32_t tRowBuildTupleWithBlob2(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
35
                                       SRow **ppRow, SBlobSet *pSrcBlobSet, SBlobSet *pDstBlobSet);
36

37
static int32_t tRowBuildKVRowWithBlob2(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
38
                                       SRow **ppRow, SBlobSet *pSrcBlob, SBlobSet *pDstBlobSet);
39
// ================================
40
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson);
41

42
// SRow ========================================================================
43
#define KV_FLG_LIT ((uint8_t)0x10)
44
#define KV_FLG_MID ((uint8_t)0x20)
45
#define KV_FLG_BIG ((uint8_t)0x40)
46

47
#define BIT_FLG_NONE  ((uint8_t)0x0)
48
#define BIT_FLG_NULL  ((uint8_t)0x1)
49
#define BIT_FLG_VALUE ((uint8_t)0x2)
50

51
#pragma pack(push, 1)
52
typedef struct {
53
  int16_t nCol;
54
  uint8_t idx[];  // uint8_t * | uint16_t * | uint32_t *
55
} SKVIdx;
56
#pragma pack(pop)
57

58
#define ROW_SET_BITMAP(PB, FLAG, IDX, VAL)      \
59
  do {                                          \
60
    switch (FLAG) {                             \
61
      case (HAS_NULL | HAS_NONE):               \
62
        SET_BIT1(PB, IDX, VAL);                 \
63
        break;                                  \
64
      case (HAS_VALUE | HAS_NONE):              \
65
        SET_BIT1(PB, IDX, (VAL) ? (VAL)-1 : 0); \
66
        break;                                  \
67
      case (HAS_VALUE | HAS_NULL):              \
68
        SET_BIT1(PB, IDX, (VAL)-1);             \
69
        break;                                  \
70
      case (HAS_VALUE | HAS_NULL | HAS_NONE):   \
71
        SET_BIT2(PB, IDX, VAL);                 \
72
        break;                                  \
73
      default:                                  \
74
        break;                                  \
75
    }                                           \
76
  } while (0)
77

78
static int32_t tPutPrimaryKeyIndex(uint8_t *p, const SPrimaryKeyIndex *index) {
1,242,406,481✔
79
  int32_t n = 0;
1,242,406,481✔
80
  n += tPutI8(p ? p + n : p, index->type);
1,242,406,481✔
81
  n += tPutU32v(p ? p + n : p, index->offset);
1,242,406,481✔
82
  return n;
1,242,406,481✔
83
}
84

85
static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
2,147,483,647✔
86
  int32_t n = 0;
2,147,483,647✔
87
  n += tGetI8(p + n, &index->type);
2,147,483,647!
88
  n += tGetU32v(p + n, &index->offset);
2,147,483,647!
89
  return n;
2,147,483,647✔
90
}
91

92
static FORCE_INLINE int32_t tRowBuildScanAddNone(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
93
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NONE;
×
94
  sinfo->numOfNone++;
2,147,483,647✔
95
  return 0;
2,147,483,647✔
96
}
97

98
static FORCE_INLINE int32_t tRowBuildScanAddNull(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
99
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
12✔
100
  sinfo->numOfNull++;
15,607,986✔
101
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
15,607,986✔
102
  sinfo->kvPayloadSize += tPutI16v(NULL, -pTColumn->colId);
15,607,986✔
103
  return 0;
15,607,986✔
104
}
105

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

109
  if (isPK) {
2,147,483,647✔
110
    sinfo->tupleIndices[sinfo->numOfPKs].type = colVal->value.type;
422,098,694✔
111
    sinfo->tupleIndices[sinfo->numOfPKs].offset =
422,098,694✔
112
        IS_VAR_DATA_TYPE(pTColumn->type) ? sinfo->tupleVarSize + sinfo->tupleFixedSize : pTColumn->offset;
422,098,694!
113
    sinfo->kvIndices[sinfo->numOfPKs].type = colVal->value.type;
422,098,694✔
114
    sinfo->kvIndices[sinfo->numOfPKs].offset = sinfo->kvPayloadSize;
422,098,694✔
115
    sinfo->numOfPKs++;
422,098,694✔
116
  }
117

118
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
2,147,483,647✔
119
  if (IS_VAR_DATA_TYPE(colVal->value.type)) {
2,147,483,647!
120
    if (sinfo->hasBlob && IS_STR_DATA_BLOB(colVal->value.type)) {
973,499,377!
121
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)     // size
×
122
                             + BSE_SEQUECE_SIZE;                     // value
×
123
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
×
124
                              + tPutU32v(NULL, colVal->value.nData)  // size
×
125
                              + BSE_SEQUECE_SIZE;                    // seq offset
×
126
    } else {
127
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)  // size
973,499,377✔
128
                             + colVal->value.nData;               // value
973,499,377✔
129

130
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
973,499,377✔
131
                              + tPutU32v(NULL, colVal->value.nData)  // size
973,499,377✔
132
                              + colVal->value.nData;                 // value
973,499,377✔
133
    }
134
  } else {
135
    sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)              // colId
2,147,483,647✔
136
                            + tDataTypes[colVal->value.type].bytes;  // value
2,147,483,647✔
137
  }
138
  sinfo->numOfValue++;
2,147,483,647✔
139
}
2,147,483,647✔
140

141
static int32_t tRowBuildScan(SArray *colVals, const STSchema *schema, SRowBuildScanInfo *sinfo) {
1,990,698,450✔
142
  int32_t  code = 0;
1,990,698,450✔
143
  int32_t  colValIndex = 1;
1,990,698,450✔
144
  int32_t  numOfColVals = TARRAY_SIZE(colVals);
1,990,698,450✔
145
  SColVal *colValArray = (SColVal *)TARRAY_DATA(colVals);
1,990,698,450✔
146

147
  if (!(numOfColVals > 0)) {
1,990,698,450!
148
    return TSDB_CODE_INVALID_PARA;
×
149
  }
150
  if (!(colValArray[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
1,990,698,450!
151
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
152
  }
153
  if (!(colValArray[0].value.type == TSDB_DATA_TYPE_TIMESTAMP)) {
1,990,698,450!
154
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
155
  }
156

157
  *sinfo = (SRowBuildScanInfo){.tupleFixedSize = schema->flen, .hasBlob = sinfo->hasBlob, .scanType = sinfo->scanType};
1,990,698,450✔
158

159
  // loop scan
160
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
161
    for (;;) {
162
      if (colValIndex >= numOfColVals) {
2,147,483,647✔
163
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
644!
164
        break;
322✔
165
      }
166

167
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
168
        if (!(colValArray[colValIndex].value.type == schema->columns[i].type)) {
2,147,483,647!
169
          code = TSDB_CODE_INVALID_PARA;
×
170
          goto _exit;
×
171
        }
172

173
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {
2,147,483,647✔
174
          tRowBuildScanAddValue(sinfo, &colValArray[colValIndex], schema->columns + i);
2,147,483,647✔
175
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {
2,147,483,647✔
176
          if ((code = tRowBuildScanAddNull(sinfo, schema->columns + i))) goto _exit;
31,215,996✔
177
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {
2,147,483,647!
178
          if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
2,147,483,647!
179
        }
180

181
        colValIndex++;
2,147,483,647✔
182
        break;
2,147,483,647✔
183
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {
×
184
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
464!
185
        break;
232✔
186
      } else {  // skip useless value
187
        colValIndex++;
×
188
      }
189
    }
190
  }
191

192
  if (sinfo->numOfNone) {
1,990,698,438✔
193
    sinfo->flag |= HAS_NONE;
673,812,581✔
194
  }
195
  if (sinfo->numOfNull) {
1,990,698,438✔
196
    sinfo->flag |= HAS_NULL;
14,661,162✔
197
  }
198
  if (sinfo->numOfValue) {
1,990,698,438✔
199
    sinfo->flag |= HAS_VALUE;
1,955,689,851✔
200
  }
201

202
  // Tuple
203
  sinfo->tupleFlag = sinfo->flag;
1,990,698,438✔
204
  switch (sinfo->flag) {
1,990,698,438!
205
    case HAS_NONE:
38,924,704✔
206
    case HAS_NULL:
207
      sinfo->tupleBitmapSize = 0;
38,924,704✔
208
      sinfo->tupleFixedSize = 0;
38,924,704✔
209
      break;
38,924,704✔
210
    case HAS_VALUE:
1,308,694,029✔
211
      sinfo->tupleBitmapSize = 0;
1,308,694,029✔
212
      sinfo->tupleFixedSize = schema->flen;
1,308,694,029✔
213
      break;
1,308,694,029✔
214
    case (HAS_NONE | HAS_NULL):
23,008✔
215
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
23,008✔
216
      sinfo->tupleFixedSize = 0;
23,008✔
217
      break;
23,008✔
218
    case (HAS_NONE | HAS_VALUE):
648,999,873✔
219
    case (HAS_NULL | HAS_VALUE):
220
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
648,999,873✔
221
      sinfo->tupleFixedSize = schema->flen;
648,999,873✔
222
      break;
648,999,873✔
223
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
431,216✔
224
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
431,216✔
225
      sinfo->tupleFixedSize = schema->flen;
431,216✔
226
      break;
431,216✔
227
  }
228
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
229
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
420,610,286✔
230
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
420,610,286✔
231
  }
232
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
1,989,734,269✔
233
                        + sinfo->tuplePKSize      // primary keys
1,989,734,269✔
234
                        + sinfo->tupleBitmapSize  // bitmap
1,989,734,269✔
235
                        + sinfo->tupleFixedSize   // fixed part
1,989,734,269✔
236
                        + sinfo->tupleVarSize;    // var part
1,989,734,269✔
237

238
  // Key-Value
239
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
1,989,734,269!
240
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
1,992,153,058✔
241
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
1,992,153,058✔
242
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
×
243
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
4,914,816✔
244
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
4,914,816✔
245
  } else {
246
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
×
247
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
×
248
  }
249
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
250
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
420,227,623✔
251
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
420,227,623✔
252
  }
253
  sinfo->kvRowSize = sizeof(SRow)             // SRow
1,989,155,049✔
254
                     + sinfo->kvPKSize        // primary keys
1,989,155,049✔
255
                     + sinfo->kvIndexSize     // index array
1,989,155,049✔
256
                     + sinfo->kvPayloadSize;  // payload
1,989,155,049✔
257

258
_exit:
1,989,155,061✔
259
  return code;
1,989,155,061✔
260
}
261

262
static int32_t tRowBuildTupleRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
1,359,553,775✔
263
                                 SRow **ppRow) {
264
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
1,359,553,775✔
265
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
1,359,553,775!
266
  if (*ppRow == NULL) {
1,370,094,274!
267
    return terrno;
×
268
  }
269
  (*ppRow)->flag = sinfo->tupleFlag;
1,370,094,274✔
270
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
1,370,094,274✔
271
  (*ppRow)->sver = schema->version;
1,370,094,274✔
272
  (*ppRow)->len = sinfo->tupleRowSize;
1,370,094,274✔
273
  (*ppRow)->ts = VALUE_GET_TRIVIAL_DATUM(&colValArray[0].value);
1,370,094,274✔
274

275
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
1,370,094,274✔
276
    return 0;
40,522,233✔
277
  }
278

279
  uint8_t *primaryKeys = (*ppRow)->data;
1,329,572,041✔
280
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
1,329,572,041✔
281
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
1,329,572,041✔
282
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
1,329,572,041✔
283

284
  // primary keys
285
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
1,753,293,628✔
286
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
427,293,013✔
287
  }
288

289
  // bitmap + fixed + varlen
290
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
1,326,000,615✔
291
  int32_t colValIndex = 1;
1,326,000,615✔
292
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
293
    for (;;) {
294
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
295
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
22!
296
        break;
22✔
297
      }
298

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

303
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
304
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
73,662,219✔
305
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
73,662,219✔
306
            if (colValArray[colValIndex].value.nData) {
73,662,219!
307
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
75,153,568✔
308
              varlen += colValArray[colValIndex].value.nData;
75,153,568✔
309
            }
310
          } else {
311
            (void)memcpy(fixed + schema->columns[i].offset,
2,147,483,647✔
312
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647!
313
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647!
314
          }
315
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
12,574,097!
316
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
14,352,942!
317
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
318
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
416,099!
319
        }
320

321
        colValIndex++;
2,147,483,647✔
322
        break;
2,147,483,647✔
323
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
1,302,725✔
324
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
4!
325
        break;
4✔
326
      } else {
327
        colValIndex++;
1,302,721✔
328
      }
329
    }
330
  }
331

332
  return 0;
1,326,000,615✔
333
}
334

335
static int32_t addEmptyItemToBlobSet(SBlobSet *pBlobSet, int8_t type, uint64_t *pSeq) {
×
336
  SBlobItem item = {.type = type, .len = 0};
×
337
  uint64_t  seq = 0;
×
338
  int32_t   code = tBlobSetPush(pBlobSet, &item, &seq, 0);
×
339
  if (code != 0) return code;
×
340

341
  if (pSeq != NULL) {
×
342
    *pSeq = seq;
×
343
  }
344
  return 0;
×
345
}
346
static int32_t tRowBuildTupleWithBlob(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
347
                                      SRow **ppRow, SBlobSet *pBlobSet) {
348
  int32_t  code = 0;
×
349
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
350
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
×
351
  if (*ppRow == NULL) {
×
352
    return terrno;
×
353
  }
354
  (*ppRow)->flag = sinfo->tupleFlag;
×
355
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
356
  (*ppRow)->sver = schema->version;
×
357
  (*ppRow)->len = sinfo->tupleRowSize;
×
358
  (*ppRow)->ts = colValArray[0].value.val;
×
359

360
  if (((*ppRow)->flag) == 0) {
×
361
    return TSDB_CODE_INVALID_PARA;
×
362
  }
363
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
×
364
    code = addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
365
    return code;
×
366
  }
367

368
  uint8_t *primaryKeys = (*ppRow)->data;
×
369
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
×
370
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
×
371
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
×
372
  uint8_t *start = varlen;
×
373

374
  // primary keys
375
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
376
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
×
377
  }
378

379
  // bitmap + fixed + varlen
380
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
381
  int32_t colValIndex = 1;
×
382
  int8_t  firstBlobCol = 1;
×
383
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
384
    for (;;) {
×
385
      if (colValIndex >= numOfColVals) {  // NONE
×
386
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
387
        break;
×
388
      }
389

390
      int8_t hasBlob = 0;
×
391
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
392
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
393
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_VALUE);
×
394

395
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
396
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
397
              hasBlob = 1;
×
398
            }
399
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
×
400
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
×
401
            if (colValArray[colValIndex].value.nData) {
×
402
              if (hasBlob == 0) {
×
403
                (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
×
404
                varlen += colValArray[colValIndex].value.nData;
×
405
              } else {
406
                uint64_t  seq = 0;
×
407
                SBlobItem item = {.seqOffsetInRow = varlen - (*ppRow)->data,
×
408
                                  .data = colValArray[colValIndex].value.pData,
×
409
                                  .len = colValArray[colValIndex].value.nData,
×
410
                                  .type = TSDB_DATA_BLOB_VALUE};
411
                code = tBlobSetPush(pBlobSet, &item, &seq, firstBlobCol);
×
412
                if (firstBlobCol == 1) {
×
413
                  firstBlobCol = 0;
×
414
                }
415
                if (code != 0) return code;
×
416
                varlen += tPutU64(varlen, seq);
×
417
              }
418
            } else {
419
              if (hasBlob) TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
×
420
            }
421
          } else {
422
            (void)memcpy(fixed + schema->columns[i].offset,
×
423
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
×
424
                         tDataTypes[schema->columns[i].type].bytes);
×
425
          }
426
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
427
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
×
428
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
429
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
430
          }
431
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
432
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
433
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
434
          }
435
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
436
        }
437

438
        colValIndex++;
×
439
        break;
×
440
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
441
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
442
        break;
×
443
      } else {
444
        colValIndex++;
×
445
      }
446
    }
447
  }
448

449
  if (((*ppRow)->flag) == 0) {
×
450
    return TSDB_CODE_INVALID_PARA;
×
451
  }
452

453
  return 0;
×
454
}
455

456
static int32_t tRowBuildTupleWithBlob2(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
457
                                       SRow **ppRow, SBlobSet *pSrcBlobSet, SBlobSet *pDstBlobSet) {
458
  int32_t  code = 0;
×
459
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
460
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
×
461
  if (*ppRow == NULL) {
×
462
    return terrno;
×
463
  }
464
  (*ppRow)->flag = sinfo->tupleFlag;
×
465
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
466
  (*ppRow)->sver = schema->version;
×
467
  (*ppRow)->len = sinfo->tupleRowSize;
×
468
  (*ppRow)->ts = colValArray[0].value.val;
×
469

470
  if (((*ppRow)->flag) == 0) {
×
471
    return TSDB_CODE_INVALID_PARA;
×
472
  }
473
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
×
474
    code = addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
475
    return code;
×
476
  }
477

478
  uint8_t *primaryKeys = (*ppRow)->data;
×
479
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
×
480
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
×
481
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
×
482
  uint8_t *start = varlen;
×
483

484
  // primary keys
485
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
486
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
×
487
  }
488

489
  // bitmap + fixed + varlen
490
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
491
  int32_t colValIndex = 1;
×
492
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
493
    for (;;) {
×
494
      if (colValIndex >= numOfColVals) {  // NONE
×
495
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
496
        break;
×
497
      }
498

499
      int8_t hasBlob = 0;
×
500
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
501
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
502
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_VALUE);
×
503

504
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
505
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
506
              hasBlob = 1;
×
507
            }
508
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
×
509
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
×
510
            if (colValArray[colValIndex].value.nData) {
×
511
              if (hasBlob == 0) {
×
512
                (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
×
513
                varlen += colValArray[colValIndex].value.nData;
×
514
              } else {
515
                uint64_t seq = 0;
×
516
                if (tGetU64(colValArray[colValIndex].value.pData, &seq) < 0) {
×
517
                  TAOS_CHECK_RETURN(TSDB_CODE_INVALID_PARA);
×
518
                }
519
                SBlobItem item = {0};
×
520

521
                code = tBlobSetGet(pSrcBlobSet, seq, &item);
×
522
                TAOS_CHECK_RETURN(code);
×
523

524
                code = tBlobSetPush(pDstBlobSet, &item, &seq, 0);
×
525
                TAOS_CHECK_RETURN(code);
×
526
                varlen += tPutU64(varlen, seq);
×
527
              }
528
            } else {
529
              if (hasBlob) TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
×
530
            }
531
          } else {
532
            (void)memcpy(fixed + schema->columns[i].offset,
×
533
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
×
534
                         tDataTypes[schema->columns[i].type].bytes);
×
535
          }
536
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
537
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
×
538
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
539
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
540
          }
541
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
542
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
543
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
544
          }
545
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
546
        }
547

548
        colValIndex++;
×
549
        break;
×
550
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
551
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
552
        break;
×
553
      } else {
554
        colValIndex++;
×
555
      }
556
    }
557
  }
558

559
  if (((*ppRow)->flag) == 0) {
×
560
    return TSDB_CODE_INVALID_PARA;
×
561
  }
562

563
  return 0;
×
564
}
565
static FORCE_INLINE void tRowBuildKVRowSetIndex(uint8_t flag, SKVIdx *indices, uint32_t offset) {
566
  if (flag & KV_FLG_LIT) {
2,147,483,647✔
567
    ((uint8_t *)indices->idx)[indices->nCol] = (uint8_t)offset;
2,147,483,647✔
568
  } else if (flag & KV_FLG_MID) {
×
569
    ((uint16_t *)indices->idx)[indices->nCol] = (uint16_t)offset;
387,161✔
570
  } else {
571
    ((uint32_t *)indices->idx)[indices->nCol] = (uint32_t)offset;
×
572
  }
573
  indices->nCol++;
2,147,483,647✔
574
}
2,147,483,647✔
575

576
static int32_t tRowBuildKVRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema, SRow **ppRow) {
635,561,140✔
577
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
635,561,140✔
578

579
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
635,561,140!
580
  if (*ppRow == NULL) {
635,639,316!
581
    return terrno;
×
582
  }
583
  (*ppRow)->flag = sinfo->kvFlag;
635,639,316✔
584
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
635,639,316✔
585
  (*ppRow)->sver = schema->version;
635,639,316✔
586
  (*ppRow)->len = sinfo->kvRowSize;
635,639,316✔
587
  (*ppRow)->ts = VALUE_GET_TRIVIAL_DATUM(&colValArray[0].value);
635,639,316✔
588

589
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
635,639,316!
590
    return TSDB_CODE_INVALID_PARA;
×
591
  }
592

593
  uint8_t *primaryKeys = (*ppRow)->data;
635,689,656✔
594
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
635,689,656✔
595
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
635,689,656✔
596
  uint32_t payloadSize = 0;
635,689,656✔
597

598
  // primary keys
599
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
636,022,386✔
600
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
332,732✔
601
  }
602

603
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
635,689,654✔
604
  int32_t colValIndex = 1;
635,689,654✔
605
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
606
    for (;;) {
607
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
608
        break;
84✔
609
      }
610

611
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
612
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
2,147,483,647✔
613
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
2,147,483,647!
614
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
615
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
879,081,161✔
616
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
879,081,161✔
617
            if (colValArray[colValIndex].value.nData > 0) {
879,081,161!
618
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
911,707,171✔
619
                           colValArray[colValIndex].value.nData);
911,707,171✔
620
              payloadSize += colValArray[colValIndex].value.nData;
911,707,171✔
621
            }
622
          } else {
623
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,147,483,647✔
624
            (void)memcpy(payload + payloadSize,
2,147,483,647✔
625
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647!
626
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
627
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,147,483,647✔
628
          }
629
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
2,147,483,647✔
630
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
1,256,723✔
631
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
2,513,446✔
632
        }
633

634
        colValIndex++;
2,147,483,647✔
635
        break;
2,147,483,647✔
636
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
637
        break;
228✔
638
      } else {
639
        colValIndex++;
×
640
      }
641
    }
642
  }
643
  return 0;
635,689,654✔
644
}
645

646
static int32_t tRowBuildKVRowWithBlob(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
647
                                      SRow **ppRow, SBlobSet *ppBlobSet) {
648
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
649

650
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
×
651
  if (*ppRow == NULL) {
×
652
    return terrno;
×
653
  }
654
  (*ppRow)->flag = sinfo->kvFlag;
×
655
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
656
  (*ppRow)->sver = schema->version;
×
657
  (*ppRow)->len = sinfo->kvRowSize;
×
658
  (*ppRow)->ts = colValArray[0].value.val;
×
659

660
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
×
661
    return TSDB_CODE_INVALID_PARA;
×
662
  }
663

664
  if (((*ppRow)->flag) == 0) {
×
665
    return TSDB_CODE_INVALID_PARA;
×
666
  }
667

668
  uint8_t *primaryKeys = (*ppRow)->data;
×
669
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
×
670
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
×
671
  uint32_t payloadSize = 0;
×
672

673
  // primary keys
674
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
675
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
×
676
  }
677

678
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
679
  int32_t colValIndex = 1;
×
680
  int8_t  firstBlobCol = 1;
×
681
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
682
    for (;;) {
×
683
      if (colValIndex >= numOfColVals) {  // NONE
×
684
        break;
×
685
      }
686
      uint8_t hasBlob = 0;
×
687

688
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
689
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
690
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
691
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
692
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
693
              hasBlob = 1;
×
694
            }
695
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
696
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
×
697
            if (colValArray[colValIndex].value.nData > 0) {
×
698
              if (hasBlob == 0) {
×
699
                (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
×
700
                             colValArray[colValIndex].value.nData);
×
701
                payloadSize += colValArray[colValIndex].value.nData;
×
702
              } else {
703
                uint64_t  seq = 0;
×
704
                uint32_t  seqOffset = payloadSize + payload - (*ppRow)->data;
×
705
                SBlobItem item = {.seqOffsetInRow = seqOffset,
×
706
                                  .data = colValArray[colValIndex].value.pData,
×
707
                                  .len = colValArray[colValIndex].value.nData,
×
708
                                  .type = TSDB_DATA_BLOB_VALUE};
709
                int32_t   code = tBlobSetPush(ppBlobSet, &item, &seq, 0);
×
710
                if (code != 0) return code;
×
711
                payloadSize += tPutU64(payload + payloadSize, seq);
×
712
              }
713
            } else {
714
              if (hasBlob) {
×
715
                TAOS_CHECK_RETURN(addEmptyItemToBlobSet(ppBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
×
716
              }
717
            }
718
          } else {
719
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
720
            (void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
×
721
                         tDataTypes[schema->columns[i].type].bytes);
×
722
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
×
723
          }
724
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
725
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
726
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
×
727
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
728
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(ppBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
729
          }
730
        }
731
        colValIndex++;
×
732
        break;
×
733
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
734
        break;
×
735
      } else {
736
        colValIndex++;
×
737
      }
738
    }
739
  }
740

741
  if (((*ppRow)->flag) == 0) {
×
742
    return TSDB_CODE_INVALID_PARA;
×
743
  }
744
  return 0;
×
745
}
746

747
static int32_t tRowBuildKVRowWithBlob2(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
748
                                       SRow **ppRow, SBlobSet *pSrcBlobSet, SBlobSet *pDstBlobSet) {
749
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
750

751
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
×
752
  if (*ppRow == NULL) {
×
753
    return terrno;
×
754
  }
755
  (*ppRow)->flag = sinfo->kvFlag;
×
756
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
757
  (*ppRow)->sver = schema->version;
×
758
  (*ppRow)->len = sinfo->kvRowSize;
×
759
  (*ppRow)->ts = colValArray[0].value.val;
×
760

761
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
×
762
    return TSDB_CODE_INVALID_PARA;
×
763
  }
764

765
  if (((*ppRow)->flag) == 0) {
×
766
    return TSDB_CODE_INVALID_PARA;
×
767
  }
768

769
  uint8_t *primaryKeys = (*ppRow)->data;
×
770
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
×
771
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
×
772
  uint32_t payloadSize = 0;
×
773

774
  // primary keys
775
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
776
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
×
777
  }
778

779
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
780
  int32_t colValIndex = 1;
×
781
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
782
    for (;;) {
×
783
      if (colValIndex >= numOfColVals) {  // NONE
×
784
        break;
×
785
      }
786
      uint8_t hasBlob = 0;
×
787

788
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
789
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
790
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
791
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
792
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
793
              hasBlob = 1;
×
794
            }
795
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
796
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
×
797
            if (colValArray[colValIndex].value.nData > 0) {
×
798
              if (hasBlob == 0) {
×
799
                (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
×
800
                             colValArray[colValIndex].value.nData);
×
801
                payloadSize += colValArray[colValIndex].value.nData;
×
802
              } else {
803
                uint64_t seq = 0;
×
804
                if (tGetU64(colValArray[colValIndex].value.pData, &seq) < 0) {
×
805
                  TAOS_CHECK_RETURN(TSDB_CODE_INVALID_PARA);
×
806
                }
807
                SBlobItem item = {0};
×
808

809
                int32_t code = tBlobSetGet(pSrcBlobSet, seq, &item);
×
810
                TAOS_CHECK_RETURN(code);
×
811

812
                code = tBlobSetPush(pDstBlobSet, &item, &seq, 0);
×
813
                TAOS_CHECK_RETURN(code);
×
814

815
                payloadSize += tPutU64(payload + payloadSize, seq);
×
816
              }
817
            } else {
818
              if (hasBlob) {
×
819
                TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
×
820
              }
821
            }
822
          } else {
823
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
824
            (void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
×
825
                         tDataTypes[schema->columns[i].type].bytes);
×
826
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
×
827
          }
828
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
829
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
830
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
×
831
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
832
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pDstBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
×
833
          }
834
        }
835
        colValIndex++;
×
836
        break;
×
837
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
838
        break;
×
839
      } else {
840
        colValIndex++;
×
841
      }
842
    }
843
  }
844

845
  if (((*ppRow)->flag) == 0) {
×
846
    return TSDB_CODE_INVALID_PARA;
×
847
  }
848
  return 0;
×
849
}
850
int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SRowBuildScanInfo *sinfo) {
1,990,316,704✔
851
  int32_t code;
852
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
1,990,316,704✔
853
  if (code) return code;
1,996,448,905✔
854

855
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
1,996,448,893✔
856
    code = tRowBuildTupleRow(aColVal, sinfo, pTSchema, ppRow);
1,361,588,330✔
857
  } else {
858
    code = tRowBuildKVRow(aColVal, sinfo, pTSchema, ppRow);
634,860,563✔
859
  }
860
  return code;
1,996,284,931✔
861
}
862

863
int32_t tBlobRowCreate(int64_t cap, int8_t type, SBlobSet **ppBlobRow) {
×
864
  int32_t    lino = 0;
×
865
  int32_t    code = 0;
×
866
  SBlobSet *p = taosMemCalloc(1, sizeof(SBlobSet));
×
867
  if (p == NULL) {
×
868
    return terrno;
×
869
  }
870

871
  p->type = type;
×
872
  p->pSeqTable = taosArrayInit(128, sizeof(SBlobValue));
×
873
  if (p->pSeqTable == NULL) {
×
874
    TAOS_CHECK_EXIT(terrno);
×
875
  }
876

877
  p->data = taosMemCalloc(1024, cap * sizeof(uint8_t));
×
878
  if (p->data == NULL) {
×
879
    TAOS_CHECK_EXIT(terrno);
×
880
  }
881

882
  p->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
×
883
  if (p->pSeqToffset == NULL) {
×
884
    TAOS_CHECK_EXIT(terrno);
×
885
  }
886

887
  p->pSet = taosArrayInit(4, sizeof(int32_t));
×
888
  if (p->pSet == NULL) {
×
889
    TAOS_CHECK_EXIT(terrno);
×
890
  }
891

892
  p->cap = cap;
×
893
  p->len = 0;
×
894
  p->seq = 1;
×
895

896
  *ppBlobRow = p;
×
897
_exit:
×
898
  if (code != 0) {
×
899
    taosHashCleanup(p->pSeqToffset);
×
900
    taosArrayDestroy(p->pSeqTable);
×
901
    taosArrayDestroy(p->pSet);
×
902

903
    taosMemoryFree(p->data);
×
904
    taosMemoryFree(p);
×
905
  }
906
  uDebug("create blob row %p", p);
×
907
  return code;
×
908
}
909
int32_t tBlobRowPush(SBlobSet *pBlobRow, SBlobItem *pItem, uint64_t *seq, int8_t nextRow) {
×
910
  if (pBlobRow == NULL || pItem == NULL || seq == NULL) {
×
911
    return TSDB_CODE_INVALID_PARA;
×
912
  }
913
  uTrace("push blob %p, seqOffsetInRow %d, dataLen %d, nextRow %d", pBlobRow, pItem->seqOffsetInRow, pItem->len,
×
914
         nextRow);
915
  int32_t  lino = 0;
×
916
  int32_t  code = 0;
×
917
  uint64_t offset;
918
  uint32_t len = pItem->len;
×
919
  uint8_t *data = pItem->data;
×
920
  int32_t  dataOffset = pItem->seqOffsetInRow;
×
921

922
  uint64_t tlen = pBlobRow->len + len;
×
923
  if (tlen > pBlobRow->cap) {
×
924
    int64_t cap = pBlobRow->cap;
×
925
    // opt later
926
    do {
927
      cap = cap * 2;
×
928
    } while (tlen > cap);
×
929

930
    uint8_t *data = taosMemRealloc(pBlobRow->data, cap);
×
931
    if (data == NULL) {
×
932
      return terrno;
×
933
    }
934
    pBlobRow->data = data;
×
935
    pBlobRow->cap = cap;
×
936
  }
937
  if (len > 0) {
×
938
    (void)memcpy(pBlobRow->data + pBlobRow->len, data, len);
×
939
  }
940

941
  offset = pBlobRow->len;
×
942
  pBlobRow->len += len;
×
943

944
  pBlobRow->seq++;
×
945
  *seq = pBlobRow->seq;
×
946

947
  SBlobValue value = {.offset = offset, .len = len, .dataOffset = dataOffset, .nextRow = nextRow};
×
948
  if (taosArrayPush(pBlobRow->pSeqTable, &value) == NULL) {
×
949
    TAOS_CHECK_EXIT(terrno);
×
950
  }
951

952
  int32_t sz = taosArrayGetSize(pBlobRow->pSeqTable);
×
953
  code = taosHashPut(pBlobRow->pSeqToffset, seq, sizeof(int64_t), &sz, sizeof(int32_t));
×
954
  if (code != 0) {
×
955
    TAOS_CHECK_EXIT(code);
×
956
  }
957

958
_exit:
×
959
  return code;
×
960
}
961
int32_t tBlobRowUpdate(SBlobSet *pBlobRow, uint64_t seq, SBlobItem *pItem) {
×
962
  int32_t code = 0;
×
963
  return code;
×
964
  if (pBlobRow == NULL || pItem == NULL) {
965
    return TSDB_CODE_INVALID_PARA;
966
  }
967
  if (pBlobRow->pSeqToffset == NULL || pBlobRow->pSeqTable == NULL) {
968
    return TSDB_CODE_INVALID_PARA;
969
  }
970

971
  return code;
972
}
973
int32_t tBlobRowGet(SBlobSet *pBlobRow, uint64_t seq, SBlobItem *pItem) {
×
974
  if (pBlobRow == NULL || pItem == NULL) {
×
975
    return TSDB_CODE_INVALID_PARA;
×
976
  }
977
  if (pBlobRow->pSeqToffset == NULL || pBlobRow->pSeqTable == NULL) {
×
978
    return TSDB_CODE_INVALID_PARA;
×
979
  }
980

981
  int32_t code = 0;
×
982
  int32_t len = 0;
×
983
  int32_t dataOffset = 0;
×
984
  int8_t  nextRow = 0;
×
985

986
  int32_t *offset = (int32_t *)taosHashGet(pBlobRow->pSeqToffset, &seq, sizeof(int64_t));
×
987
  if (offset == NULL) {
×
988
    return TSDB_CODE_INVALID_PARA;
×
989
  }
990

991
  SBlobValue *value = taosArrayGet(pBlobRow->pSeqTable, *offset - 1);
×
992
  if (value == NULL) {
×
993
    return TSDB_CODE_INVALID_PARA;
×
994
  }
995

996
  len = value->len;
×
997
  dataOffset = value->dataOffset;
×
998
  nextRow = value->nextRow;
×
999

1000
  pItem->seqOffsetInRow = dataOffset + pBlobRow->data - (uint8_t *)pBlobRow;
×
1001
  pItem->len = len;
×
1002
  pItem->data = pBlobRow->data + value->offset;
×
1003

1004
  return code;
×
1005
}
1006

1007
int32_t tBlobRowSize(SBlobSet *pBlobRow) {
×
1008
  if (pBlobRow == NULL) return 0;
×
1009
  return taosArrayGetSize(pBlobRow->pSeqTable);
×
1010
}
1011
int32_t tBlobRowEnd(SBlobSet *pBlobRow) {
×
1012
  if (pBlobRow == NULL) return 0;
×
1013
  int32_t sz = taosArrayGetSize(pBlobRow->pSeqTable);
×
1014
  if (taosArrayPush(pBlobRow->pSet, &sz) == NULL) {
×
1015
    return terrno;
×
1016
  }
1017
  return 0;
×
1018
}
1019
int32_t tBlobRowRebuild(SBlobSet *p, int32_t sRow, int32_t nrow, SBlobSet **pDst) {
×
1020
  int32_t code = 0;
×
1021

1022
  code = tBlobRowCreate(p->cap, p->type, pDst);
×
1023
  if (code != 0) {
×
1024
    return code;
×
1025
  }
1026

1027
  SBlobSet *pBlobRow = *pDst;
×
1028
  if (p->pSeqToffset == NULL || p->pSeqTable == NULL || p->data == NULL) {
×
1029
    return TSDB_CODE_INVALID_PARA;
×
1030
  }
1031

1032
  uint64_t seq = 0;
×
1033
  int32_t  count = 0;
×
1034
  for (int32_t i = sRow; i < taosArrayGetSize(p->pSeqTable); i++) {
×
1035
    SBlobValue *pValue = taosArrayGet(p->pSeqTable, i);
×
1036
    uint8_t    *data = p->data + pValue->offset;
×
1037
    int32_t     len = pValue->len;
×
1038

1039
    SBlobItem item = {.data = data, .len = len, .seqOffsetInRow = pValue->dataOffset};
×
1040

1041
    code = tBlobRowPush(pBlobRow, &item, &seq, pValue->nextRow);
×
1042
    count++;
×
1043
    if (count >= nrow) {
×
1044
      break;
×
1045
    }
1046
  }
1047

1048
  return code;
×
1049
}
1050

1051
int32_t tBlobRowDestroy(SBlobSet *pBlobRow) {
×
1052
  if (pBlobRow == NULL) return 0;
×
1053
  int32_t code = 0;
×
1054
  uTrace("destroy blob row, seqTable size %p", pBlobRow);
×
1055
  taosMemoryFree(pBlobRow->data);
×
1056
  taosArrayDestroy(pBlobRow->pSeqTable);
×
1057
  taosHashCleanup(pBlobRow->pSeqToffset);
×
1058
  taosArrayDestroy(pBlobRow->pSet);
×
1059
  taosMemoryFree(pBlobRow);
×
1060
  return code;
×
1061
}
1062
int32_t tBlobRowClear(SBlobSet *pBlobRow) {
×
1063
  if (pBlobRow == NULL) return 0;
×
1064
  int32_t code = 0;
×
1065
  uTrace("clear blob row, seqTable size %p", pBlobRow);
×
1066
  taosArrayClear(pBlobRow->pSeqTable);
×
1067
  taosHashClear(pBlobRow->pSeqToffset);
×
1068
  pBlobRow->len = 0;
×
1069
  pBlobRow->seq = 1;
×
1070
  return code;
×
1071
}
1072

1073
int32_t tRowBuildWithBlob(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SBlobSet *pBlobSet,
×
1074
                          SRowBuildScanInfo *sinfo) {
1075
  int32_t code;
1076

1077
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
×
1078
  if (code) return code;
×
1079

1080
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
×
1081
    code = tRowBuildTupleWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
×
1082
  } else {
1083
    code = tRowBuildKVRowWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
×
1084
  }
1085

1086
  return code;
×
1087
}
1088

1089
int32_t tRowBuildWithBlob2(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SBlobSet *pSrcBlobSet,
×
1090
                           SBlobSet *pDstBlobSet, SRowBuildScanInfo *sinfo) {
1091
  int32_t code;
1092

1093
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
×
1094
  if (code) return code;
×
1095

1096
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
×
1097
    code = tRowBuildTupleWithBlob2(aColVal, sinfo, pTSchema, ppRow, pSrcBlobSet, pDstBlobSet);
×
1098
  } else {
1099
    code = tRowBuildKVRowWithBlob2(aColVal, sinfo, pTSchema, ppRow, pSrcBlobSet, pDstBlobSet);
×
1100
  }
1101

1102
  return code;
×
1103
}
1104

1105
int32_t tBlobSetCreate(int64_t cap, int8_t type, SBlobSet **ppBlobSet) {
×
1106
  int32_t    lino = 0;
×
1107
  int32_t    code = 0;
×
1108
  SBlobSet  *p = taosMemCalloc(1, sizeof(SBlobSet));
×
1109
  if (p == NULL) {
×
1110
    return terrno;
×
1111
  }
1112

1113
  p->type = type;
×
1114
  p->pSeqTable = taosArrayInit(128, sizeof(SBlobValue));
×
1115
  if (p->pSeqTable == NULL) {
×
1116
    TAOS_CHECK_EXIT(terrno);
×
1117
  }
1118

1119
  p->data = taosMemCalloc(1024, cap * sizeof(uint8_t));
×
1120
  if (p->data == NULL) {
×
1121
    TAOS_CHECK_EXIT(terrno);
×
1122
  }
1123

1124
  p->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
×
1125
  if (p->pSeqToffset == NULL) {
×
1126
    TAOS_CHECK_EXIT(terrno);
×
1127
  }
1128

1129
  p->pSet = taosArrayInit(4, sizeof(int32_t));
×
1130
  if (p->pSet == NULL) {
×
1131
    TAOS_CHECK_EXIT(terrno);
×
1132
  }
1133

1134
  p->cap = cap;
×
1135
  p->len = 0;
×
1136
  p->seq = 1;
×
1137

1138
  *ppBlobSet = p;
×
1139
_exit:
×
1140
  if (code != 0) {
×
1141
    taosHashCleanup(p->pSeqToffset);
×
1142
    taosArrayDestroy(p->pSeqTable);
×
1143
    taosArrayDestroy(p->pSet);
×
1144

1145
    taosMemoryFree(p->data);
×
1146
    taosMemoryFree(p);
×
1147
  }
1148
  uDebug("create blob row %p", p);
×
1149
  return code;
×
1150
}
1151
int32_t tBlobSetPush(SBlobSet *pBlobSet, SBlobItem *pItem, uint64_t *seq, int8_t nextRow) {
×
1152
  if (pBlobSet == NULL || pItem == NULL || seq == NULL) {
×
1153
    return TSDB_CODE_INVALID_PARA;
×
1154
  }
1155
  uTrace("push blob %p, seqOffsetInRow %d, dataLen %d, nextRow %d", pBlobSet, pItem->seqOffsetInRow, pItem->len,
×
1156
         nextRow);
1157
  int32_t  lino = 0;
×
1158
  int32_t  code = 0;
×
1159
  uint64_t offset;
1160
  uint32_t len = pItem->len;
×
1161
  uint8_t *data = pItem->data;
×
1162
  int32_t  dataOffset = pItem->seqOffsetInRow;
×
1163

1164
  uint64_t tlen = pBlobSet->len + len;
×
1165
  if (tlen > pBlobSet->cap) {
×
1166
    int64_t cap = pBlobSet->cap;
×
1167
    // opt later
1168
    do {
1169
      cap = cap * 2;
×
1170
    } while (tlen > cap);
×
1171

1172
    uint8_t *data = taosMemRealloc(pBlobSet->data, cap);
×
1173
    if (data == NULL) {
×
1174
      return terrno;
×
1175
    }
1176
    pBlobSet->data = data;
×
1177
    pBlobSet->cap = cap;
×
1178
  }
1179
  if (len > 0) {
×
1180
    (void)memcpy(pBlobSet->data + pBlobSet->len, data, len);
×
1181
  }
1182

1183
  offset = pBlobSet->len;
×
1184
  pBlobSet->len += len;
×
1185

1186
  pBlobSet->seq++;
×
1187
  *seq = pBlobSet->seq;
×
1188

1189
  SBlobValue value = {.offset = offset, .len = len, .dataOffset = dataOffset, .nextRow = nextRow, .type = pItem->type};
×
1190
  if (taosArrayPush(pBlobSet->pSeqTable, &value) == NULL) {
×
1191
    TAOS_CHECK_EXIT(terrno);
×
1192
  }
1193

1194
  int32_t sz = taosArrayGetSize(pBlobSet->pSeqTable);
×
1195
  code = taosHashPut(pBlobSet->pSeqToffset, seq, sizeof(int64_t), &sz, sizeof(int32_t));
×
1196
  if (code != 0) {
×
1197
    TAOS_CHECK_EXIT(code);
×
1198
  }
1199

1200
_exit:
×
1201
  return code;
×
1202
}
1203

1204
void tBlobSetSwap(SBlobSet *p1, SBlobSet *p2) {
×
1205
  SBlobSet t = {0};
×
1206

1207
  memcpy(&t, p1, sizeof(SBlobSet));
×
1208

1209
  memcpy(p1, p2, sizeof(SBlobSet));
×
1210
  memcpy(p2, &t, sizeof(SBlobSet));
×
1211
}
×
1212

1213
int32_t tBlobSetUpdate(SBlobSet *pBlobSet, uint64_t seq, SBlobItem *pItem) {
×
1214
  int32_t code = 0;
×
1215
  return code;
×
1216
  if (pBlobSet == NULL || pItem == NULL) {
1217
    return TSDB_CODE_INVALID_PARA;
1218
  }
1219
  if (pBlobSet->pSeqToffset == NULL || pBlobSet->pSeqTable == NULL) {
1220
    return TSDB_CODE_INVALID_PARA;
1221
  }
1222

1223
  return code;
1224
}
1225
int32_t tBlobSetGet(SBlobSet *pBlobSet, uint64_t seq, SBlobItem *pItem) {
×
1226
  if (pBlobSet == NULL || pItem == NULL) {
×
1227
    return TSDB_CODE_INVALID_PARA;
×
1228
  }
1229
  if (pBlobSet->pSeqToffset == NULL || pBlobSet->pSeqTable == NULL) {
×
1230
    return TSDB_CODE_INVALID_PARA;
×
1231
  }
1232

1233
  int32_t code = 0;
×
1234
  int32_t len = 0;
×
1235
  int32_t dataOffset = 0;
×
1236
  int8_t  nextRow = 0;
×
1237

1238
  int32_t *offset = (int32_t *)taosHashGet(pBlobSet->pSeqToffset, &seq, sizeof(int64_t));
×
1239
  if (offset == NULL) {
×
1240
    return TSDB_CODE_INVALID_PARA;
×
1241
  }
1242

1243
  SBlobValue *value = taosArrayGet(pBlobSet->pSeqTable, *offset - 1);
×
1244
  if (value == NULL) {
×
1245
    return TSDB_CODE_INVALID_PARA;
×
1246
  }
1247

1248
  len = value->len;
×
1249
  dataOffset = value->dataOffset;
×
1250
  nextRow = value->nextRow;
×
1251

1252
  pItem->seqOffsetInRow = value->dataOffset;
×
1253
  pItem->len = len;
×
1254
  pItem->data = pBlobSet->data + value->offset;
×
1255
  pItem->type = value->type;
×
1256

1257
  return code;
×
1258
}
1259

1260
int32_t tBlobSetSize(SBlobSet *pBlobSet) {
31,767,491✔
1261
  if (pBlobSet == NULL) return 0;
31,767,491!
1262
  return taosArrayGetSize(pBlobSet->pSeqTable);
×
1263
}
1264

1265
void tBlobSetDestroy(SBlobSet *pBlobSet) {
22,215✔
1266
  if (pBlobSet == NULL) return;
22,215!
1267
  uTrace("destroy blob row, seqTable size %p", pBlobSet);
×
1268
  taosMemoryFree(pBlobSet->data);
×
1269
  taosArrayDestroy(pBlobSet->pSeqTable);
×
1270
  taosHashCleanup(pBlobSet->pSeqToffset);
×
1271
  taosArrayDestroy(pBlobSet->pSet);
×
1272
  taosMemoryFree(pBlobSet);
×
1273
}
1274
int32_t tBlobSetClear(SBlobSet *pBlobSet) {
×
1275
  if (pBlobSet == NULL) return 0;
×
1276
  int32_t code = 0;
×
1277
  uTrace("clear blob row, seqTable size %p", pBlobSet);
×
1278
  taosArrayClear(pBlobSet->pSeqTable);
×
1279
  taosHashClear(pBlobSet->pSeqToffset);
×
1280
  pBlobSet->len = 0;
×
1281
  pBlobSet->seq = 1;
×
1282
  return code;
×
1283
}
1284

1285
static int32_t tBindInfoCompare(const void *p1, const void *p2, const void *param) {
37✔
1286
  if (((SBindInfo *)p1)->columnId < ((SBindInfo *)p2)->columnId) {
37✔
1287
    return -1;
7✔
1288
  } else if (((SBindInfo *)p1)->columnId > ((SBindInfo *)p2)->columnId) {
30!
1289
    return 1;
30✔
1290
  }
1291
  return 0;
×
1292
}
1293

1294
/* build rows to `rowArray` from bind
1295
 * `infos` is the bind information array
1296
 * `numOfInfos` is the number of bind information
1297
 * `infoSorted` is whether the bind information is sorted by column id
1298
 * `pTSchema` is the schema of the table
1299
 * `rowArray` is the array to store the rows
1300
 * `pOrdered` is the pointer to store ordered
1301
 * `pDupTs` is the pointer to store duplicateTs
1302
 */
1303
int32_t tRowBuildFromBind(SBindInfo *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
5,625✔
1304
                          SArray *rowArray, bool *pOrdered, bool *pDupTs) {
1305
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
5,625!
1306
    return TSDB_CODE_INVALID_PARA;
×
1307
  }
1308

1309
  if (!infoSorted) {
5,631!
1310
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
1311
  }
1312

1313
  int32_t code = 0;
5,631✔
1314
  int32_t numOfRows = infos[0].bind->num;
5,631✔
1315
  SArray *colValArray;
1316
  SColVal colVal;
1317

1318
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
5,631!
1319
    return terrno;
×
1320
  }
1321

1322
  SRowKey rowKey, lastRowKey;
1323
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
66,197✔
1324
    taosArrayClear(colValArray);
61,691✔
1325

1326
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
731,410✔
1327
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
684,557✔
1328
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
32✔
1329
      } else {
1330
        SValue value = {
684,525✔
1331
            .type = infos[iInfo].type,
684,525✔
1332
        };
1333
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
684,525!
1334
          value.nData = infos[iInfo].bind->length[iRow];
199,462✔
1335
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
199,462!
1336
            code = TSDB_CODE_INVALID_PARA;
×
1337
            goto _exit;
×
1338
          }
1339
          value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
199,462✔
1340
        } else {
1341
          valueSetDatum(&value, infos[iInfo].type,
485,063✔
1342
                        (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
485,063✔
1343
                        infos[iInfo].bind->buffer_length);
485,063✔
1344
        }
1345
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
697,511✔
1346
      }
1347
      if (taosArrayPush(colValArray, &colVal) == NULL) {
669,949!
1348
        code = terrno;
×
1349
        goto _exit;
×
1350
      }
1351
    }
1352

1353
    SRow             *row;
1354
    SRowBuildScanInfo sinfo = {0};
46,853✔
1355
    if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
46,853!
1356
      goto _exit;
×
1357
    }
1358

1359
    if ((taosArrayPush(rowArray, &row)) == NULL) {
60,510!
1360
      code = terrno;
×
1361
      goto _exit;
×
1362
    }
1363

1364
    if (pOrdered && pDupTs) {
60,510!
1365
      tRowGetKey(row, &rowKey);
121,232!
1366
      if (iRow == 0) {
60,675✔
1367
        *pOrdered = true;
5,631✔
1368
        *pDupTs = false;
5,631✔
1369
      } else {
1370
        if (*pOrdered) {
55,044!
1371
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
55,126✔
1372
          *pOrdered = (res >= 0);
55,126✔
1373
          if (!*pDupTs) {
55,126✔
1374
            *pDupTs = (res == 0);
55,052✔
1375
          }
1376
        }
1377
      }
1378
      lastRowKey = rowKey;
60,675✔
1379
    }
1380
  }
1381

1382
_exit:
4,506✔
1383
  taosArrayDestroy(colValArray);
4,506✔
1384
  return code;
5,629✔
1385
}
1386

1387
int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
2,147,483,647✔
1388
  if (!(iCol < pTSchema->numOfCols)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
1389
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
1390

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

1393
  if (iCol == 0) {
2,147,483,647✔
1394
    pColVal->cid = pTColumn->colId;
10,938,516✔
1395
    pColVal->value.type = pTColumn->type;
10,938,516✔
1396
    pColVal->flag = CV_FLAG_VALUE;
10,938,516✔
1397
    VALUE_SET_TRIVIAL_DATUM(&pColVal->value, pRow->ts);
10,938,516✔
1398
    return 0;
10,938,516✔
1399
  }
1400

1401
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
1402
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
600,402✔
1403
    return 0;
600,402✔
1404
  }
1405

1406
  if (pRow->flag == HAS_NULL) {
2,147,483,647✔
1407
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,028,524✔
1408
    return 0;
1,028,524✔
1409
  }
1410

1411
  SPrimaryKeyIndex index;
1412
  uint8_t         *data = pRow->data;
2,147,483,647✔
1413
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
1414
    data += tGetPrimaryKeyIndex(data, &index);
33,007,620✔
1415
  }
1416

1417
  if (pRow->flag >> 4) {  // KV Row
2,147,483,647✔
1418
    SKVIdx  *pIdx = (SKVIdx *)data;
2,147,483,647✔
1419
    uint8_t *pv = NULL;
2,147,483,647✔
1420

1421
    if (pRow->flag & KV_FLG_LIT) {
2,147,483,647!
1422
      pv = pIdx->idx + pIdx->nCol;
2,147,483,647✔
1423
    } else if (pRow->flag & KV_FLG_MID) {
×
1424
      pv = pIdx->idx + (pIdx->nCol << 1);
109,236,208✔
1425
    } else {
1426
      pv = pIdx->idx + (pIdx->nCol << 2);
×
1427
    }
1428

1429
    int16_t lidx = 0;
2,147,483,647✔
1430
    int16_t ridx = pIdx->nCol - 1;
2,147,483,647✔
1431
    while (lidx <= ridx) {
2,147,483,647✔
1432
      int16_t  mid = (lidx + ridx) >> 1;
2,147,483,647✔
1433
      uint8_t *pData = NULL;
2,147,483,647✔
1434
      if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
1435
        pData = pv + ((uint8_t *)pIdx->idx)[mid];
2,147,483,647✔
1436
      } else if (pRow->flag & KV_FLG_MID) {
470,664,736!
1437
        pData = pv + ((uint16_t *)pIdx->idx)[mid];
470,914,973✔
1438
      } else {
1439
        pData = pv + ((uint32_t *)pIdx->idx)[mid];
×
1440
      }
1441

1442
      int16_t cid;
1443
      pData += tGetI16v(pData, &cid);
2,147,483,647✔
1444

1445
      if (TABS(cid) == pTColumn->colId) {
2,147,483,647✔
1446
        if (cid < 0) {
2,147,483,647✔
1447
          *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,649,826✔
1448
        } else {
1449
          pColVal->cid = pTColumn->colId;
2,147,483,647✔
1450
          pColVal->value.type = pTColumn->type;
2,147,483,647✔
1451
          pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
1452

1453
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647!
1454
            int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
1,053,757,308!
1455

1456
            pData += tGetU32v(pData, &pColVal->value.nData);
1,053,757,308!
1457
            if (pColVal->value.nData > 0) {
1,053,757,308!
1458
              pColVal->value.pData = pData;
1,500,695,066✔
1459
            } else {
1460
              pColVal->value.pData = NULL;
×
1461
            }
1462
            if (isBlob == 1) {
1,053,757,308!
1463
              pData += BSE_SEQUECE_SIZE;  // skip seq
×
1464
            }
1465
          } else {
1466
            valueSetDatum(&pColVal->value, pTColumn->type, pData, pTColumn->bytes);
2,147,483,647✔
1467
          }
1468
        }
1469
        return 0;
2,147,483,647✔
1470
      } else if (TABS(cid) < pTColumn->colId) {
2,147,483,647✔
1471
        lidx = mid + 1;
2,147,483,647✔
1472
      } else {
1473
        ridx = mid - 1;
2,147,483,647✔
1474
      }
1475
    }
1476

1477
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
2,147,483,647✔
1478
  } else {  // Tuple Row
1479
    uint8_t *bitmap = data;
1,103,757,659✔
1480
    uint8_t *fixed;
1481
    uint8_t *varlen;
1482
    uint8_t  bit;
1483

1484
    if (pRow->flag == HAS_VALUE) {
1,103,757,659✔
1485
      fixed = bitmap;
920,874,466✔
1486
      bit = BIT_FLG_VALUE;
920,874,466✔
1487
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
182,883,193!
1488
      fixed = BIT2_SIZE(pTSchema->numOfCols - 1) + bitmap;
×
1489
      bit = GET_BIT2(bitmap, iCol - 1);
×
1490
    } else {
1491
      fixed = BIT1_SIZE(pTSchema->numOfCols - 1) + bitmap;
182,883,193✔
1492
      bit = GET_BIT1(bitmap, iCol - 1);
182,883,193✔
1493

1494
      if (pRow->flag == (HAS_NONE | HAS_VALUE)) {
182,883,193✔
1495
        if (bit) bit++;
32,094✔
1496
      } else if (pRow->flag == (HAS_NULL | HAS_VALUE)) {
182,851,099✔
1497
        bit++;
42,857,464✔
1498
      }
1499
    }
1500
    varlen = fixed + pTSchema->flen;
1,103,757,659✔
1501

1502
    if (bit == BIT_FLG_NONE) {
1,103,757,659✔
1503
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
9,212✔
1504
      return 0;
9,212✔
1505
    } else if (bit == BIT_FLG_NULL) {
1,103,748,447✔
1506
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
13,287,296✔
1507
      return 0;
13,287,296✔
1508
    }
1509

1510
    pColVal->cid = pTColumn->colId;
1,090,461,151✔
1511
    pColVal->value.type = pTColumn->type;
1,090,461,151✔
1512
    pColVal->flag = CV_FLAG_VALUE;
1,090,461,151✔
1513
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
1,090,461,151!
1514
      int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
286,572,731!
1515
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
286,572,731✔
1516
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
573,145,462✔
1517
      // TODO(yhDeng): support tuple
1518
      //  if (isBlob) pColVal->value.pData += sizeof(uint64_t);  // skip seq
1519
      //  }
1520
    } else {
1521
      valueSetDatum(&pColVal->value, pTColumn->type, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
803,888,420✔
1522
    }
1523
  }
1524

1525
  return 0;
2,147,483,647✔
1526
}
1527

1528
void tRowDestroy(SRow *pRow) {
1,321,763,635✔
1529
  if (pRow) taosMemoryFree(pRow);
1,321,763,635!
1530
}
1,321,697,031✔
1531

1532
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
537,623,889✔
1533
  SRowKey key1, key2;
1534
  tRowGetKey(*(SRow **)p1, &key1);
1,075,247,778✔
1535
  tRowGetKey(*(SRow **)p2, &key2);
1,052,894,674✔
1536
  return tRowKeyCompare(&key1, &key2);
542,587,049✔
1537
}
1538
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
138,126✔
1539

1540
static SColVal* tRowFindColumnValue(SRowIter *iter, int32_t targetCid) {
1,763✔
1541
  SColVal* pColVal = tRowIterNext(iter);
1,763✔
1542
  while (pColVal != NULL && pColVal->cid < targetCid) {
1,775!
1543
    pColVal = tRowIterNext(iter);
12✔
1544
  }
1545
  return pColVal;
1,763✔
1546
}
1547

1548
static int32_t tRowMergeImpl(SArray *aRowP, STSchema *pTSchema, int32_t iStart, int32_t iEnd, ERowMergeStrategy strategy) {
593✔
1549
  int32_t code = 0;
593✔
1550

1551
  int32_t    nRow = iEnd - iStart;
593✔
1552
  SRowIter **aIter = NULL;
593✔
1553
  SArray    *aColVal = NULL;
593✔
1554
  SRow      *pRow = NULL;
593✔
1555
  uint8_t    hasBlob = 0;
593✔
1556
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
593!
1557
  if (aIter == NULL) {
593!
1558
    code = terrno;
×
1559
    goto _exit;
×
1560
  }
1561

1562
  for (int32_t i = 0; i < nRow; i++) {
138,719✔
1563
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
138,126✔
1564

1565
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
138,126✔
1566
    if (code) goto _exit;
138,126!
1567
  }
1568

1569
  // merge
1570
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
593✔
1571
  if (aColVal == NULL) {
593!
1572
    code = terrno;
×
1573
    goto _exit;
×
1574
  }
1575

1576
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
2,332✔
1577
    int32_t targetCid = pTSchema->columns[iCol].colId;
1,739✔
1578
    SColVal *pColVal = NULL;
1,739✔
1579

1580
    switch (strategy) {
1,739✔
1581
      case KEEP_CONSISTENCY:
1,595✔
1582
        if (nRow > 0)
1,595!
1583
          pColVal = tRowFindColumnValue(aIter[nRow - 1], targetCid);
1,595✔
1584
        break;
1,595✔
1585

1586
      default:  // default using PREFER_NON_NULL strategy
144✔
1587
      case PREFER_NON_NULL:
1588
        for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
168!
1589
          SColVal *pColValT = tRowFindColumnValue(aIter[iRow], targetCid);
168✔
1590

1591
          if (COL_VAL_IS_VALUE(pColValT)) {
168✔
1592
            pColVal = pColValT;
144✔
1593
            break;
144✔
1594
          } else if (pColVal == NULL) {
24!
1595
            pColVal = pColValT;
24✔
1596
          }
1597
        }
1598
        break;
144✔
1599
    }
1600

1601
    if (pColVal) {
1,739!
1602
      if (taosArrayPush(aColVal, pColVal) == NULL) {
1,739!
1603
        code = terrno;
×
1604
        goto _exit;
×
1605
      }
1606
    }
1607
  }
1608

1609
  // build
1610
  SRowBuildScanInfo sinfo = {0};
593✔
1611
  code = tRowBuild(aColVal, pTSchema, &pRow, &sinfo);
593✔
1612

1613
  if (code) goto _exit;
593!
1614

1615
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
593✔
1616
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
593!
1617
    code = terrno;
×
1618
    goto _exit;
×
1619
  }
1620

1621
_exit:
593✔
1622
  if (aIter) {
593!
1623
    for (int32_t i = 0; i < nRow; i++) {
138,719✔
1624
      tRowIterClose(&aIter[i]);
138,126✔
1625
    }
1626
    taosMemoryFree(aIter);
593!
1627
  }
1628
  if (aColVal) taosArrayDestroy(aColVal);
593!
1629
  if (code) tRowDestroy(pRow);
593!
1630
  return code;
593✔
1631
}
1632
static int32_t tBlobSetTransferTo(SBlobSet *pSrc, SBlobSet *pDst, SColVal *pVal) {
×
1633
  int32_t code = 0;
×
1634
  int32_t lino = 0;
×
1635
  if (COL_VAL_IS_NULL(pVal) || pVal->value.pData == NULL) {
×
1636
    int8_t type = COL_VAL_IS_NULL(pVal) ? TSDB_DATA_BLOB_NULL_VALUE : TSDB_DATA_BLOB_EMPTY_VALUE;
×
1637
    code = addEmptyItemToBlobSet(pDst, type, NULL);
×
1638
    TAOS_CHECK_GOTO(code, &lino, _error);
×
1639
  } else {
1640
    uint64_t seq = 0;
×
1641
    if (tGetU64(pVal->value.pData, &seq) < 0) {
×
1642
      uError("tBlobSetTransferTo: invalid blob value, seq %p", pVal->value.pData);
×
1643
      return TSDB_CODE_INVALID_PARA;
×
1644
    }
1645

1646
    SBlobItem item = {0};
×
1647
    code = tBlobSetGet(pSrc, seq, &item);
×
1648
    TAOS_CHECK_GOTO(code, &lino, _error);
×
1649

1650
    code = tBlobSetPush(pDst, &item, &seq, 1);
×
1651
    TAOS_CHECK_GOTO(code, &lino, _error);
×
1652
    if (tPutU64(pVal->value.pData, seq) < 0) {
×
1653
      uError("tBlobSetTransferTo: put seq to colVal failed");
×
1654
      return TSDB_CODE_INVALID_PARA;
×
1655
    }
1656
  }
1657

1658
_error:
×
1659
  return code;
×
1660
}
1661

1662
static int32_t tRowRebuildBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob) {
×
1663
  int32_t code = 0;
×
1664
  int32_t   nRow = TARRAY_SIZE(aRowP);
×
1665
  int32_t   lino = 0;
×
1666
  SBlobSet *pTempBlob = NULL;
×
1667

1668
  SArray *aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
×
1669
  if (aColVal == NULL) {
×
1670
    TAOS_CHECK_RETURN(code = terrno);
×
1671
  }
1672

1673
  SRowIter **aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
×
1674
  if (aIter == NULL) {
×
1675
    TAOS_CHECK_RETURN(code = terrno);
×
1676
  }
1677

1678
  for (int32_t i = 0; i < nRow; i++) {
×
1679
    SRow *pRowT = taosArrayGetP(aRowP, 0 + i);
×
1680
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
×
1681
    TAOS_CHECK_GOTO(code, &lino, _error);
×
1682
  }
1683
  for (int32_t i = 0; i < nRow; i++) {
×
1684
    SColVal *pColVal = tRowIterNext(aIter[i]);
×
1685
    do {
1686
      if (COL_VAL_IS_VALUE(pColVal) || COL_VAL_IS_NULL(pColVal)) {
×
1687
        if (IS_STR_DATA_BLOB(pColVal->value.type)) {
×
1688
          if (taosArrayPush(aColVal, pColVal) == NULL) {
×
1689
            code = terrno;
×
1690
            TAOS_CHECK_GOTO(code, &lino, _error);
×
1691
          }
1692
          break;
×
1693
        }
1694
      }
1695
    } while ((pColVal = tRowIterNext(aIter[i])) != NULL);
×
1696
  }
1697

1698
  code = tBlobSetCreate(pBlob->cap, pBlob->type, &pTempBlob);
×
1699
  TAOS_CHECK_GOTO(code, &lino, _error);
×
1700

1701
  for (int32_t i = 0; i < taosArrayGetSize(aColVal); i++) {
×
1702
    uint64_t seq = 0;
×
1703
    SColVal *pVal = taosArrayGet(aColVal, i);
×
1704
    code = tBlobSetTransferTo(pBlob, pTempBlob, pVal);
×
1705
    TAOS_CHECK_GOTO(code, &lino, _error);
×
1706
  }
1707

1708
  tBlobSetSwap(pBlob, pTempBlob);
×
1709

1710
_error:
×
1711
  if (code != 0) {
×
1712
    uError("tRowRebuildBlob failed at line %d, code %d", code, lino);
×
1713
  }
1714

1715
  if (aIter) {
×
1716
    for (int32_t i = 0; i < nRow; i++) {
×
1717
      tRowIterClose(&aIter[i]);
×
1718
    }
1719
    taosMemoryFree(aIter);
×
1720
  }
1721
  if (aColVal) {
×
1722
    taosArrayDestroy(aColVal);
×
1723
  }
1724
  tBlobSetDestroy(pTempBlob);
×
1725
  return code;
×
1726
}
1727

1728
static int32_t tRowMergeAndRebuildBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob) {
×
1729
  int32_t code = 0;
×
1730

1731
  int32_t   lino = 0;
×
1732
  SBlobSet *pTempBlobSet = NULL;
×
1733
  int32_t   size = taosArrayGetSize(aRowP);
×
1734
  if (size <= 1) {
×
1735
    return code;
×
1736
  }
1737
  int32_t colBlobIdx = 0;
×
1738
  for (int32_t i = 0; i < pTSchema->numOfCols; i++) {
×
1739
    if (IS_STR_DATA_BLOB(pTSchema->columns[i].type)) {
×
1740
      colBlobIdx = i;
×
1741
      break;
×
1742
    }
1743
  }
1744

1745
  code = tBlobSetCreate(pBlob->cap, pBlob->type, &pTempBlobSet);
×
1746
  int32_t iStart = 0;
×
1747
  while (iStart < aRowP->size) {
×
1748
    SRowKey key1;
1749
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
×
1750

1751
    tRowGetKey(row1, &key1);
×
1752

1753
    int32_t iEnd = iStart + 1;
×
1754
    while (iEnd < aRowP->size) {
×
1755
      SRowKey key2;
1756
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
×
1757
      tRowGetKey(row2, &key2);
×
1758

1759
      if (tRowKeyCompare(&key1, &key2) != 0) break;
×
1760

1761
      iEnd++;
×
1762
    }
1763

1764
    if (iEnd - iStart > 1) {
×
1765
      code = tRowMergeWithBlobImpl(aRowP, pTSchema, pBlob, pTempBlobSet, iStart, iEnd, 0);
×
1766
      TAOS_CHECK_GOTO(code, &lino, _error);
×
1767
    } else {
1768
      SColVal colVal = {0};
×
1769
      code = tRowGet(row1, pTSchema, colBlobIdx, &colVal);
×
1770
      TAOS_CHECK_GOTO(code, &lino, _error);
×
1771

1772
      code = tBlobSetTransferTo(pBlob, pTempBlobSet, &colVal);
×
1773
      TAOS_CHECK_GOTO(code, &lino, _error);
×
1774
    }
1775
    // the array is also changing, so the iStart just ++ instead of iEnd
1776
    iStart++;
×
1777
  }
1778
_error:
×
1779
  tBlobSetSwap(pBlob, pTempBlobSet);
×
1780
  tBlobSetDestroy(pTempBlobSet);
×
1781
  return code;
×
1782
}
1783

1784
static int32_t tRowMergeWithBlobImpl(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob, SBlobSet *pDstBlob,
×
1785
                                     int32_t iStart, int32_t iEnd, int8_t flag) {
1786
  int32_t code = 0;
×
1787
  int32_t    lino = 0;
×
1788
  int32_t    nRow = iEnd - iStart;
×
1789
  SRowIter **aIter = NULL;
×
1790
  SArray    *aColVal = NULL;
×
1791
  SRow      *pRow = NULL;
×
1792

1793
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
×
1794
  if (aColVal == NULL) {
×
1795
    code = terrno;
×
1796
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1797
  }
1798

1799
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
×
1800
  if (aIter == NULL) {
×
1801
    code = terrno;
×
1802
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1803
  }
1804

1805
  for (int32_t i = 0; i < nRow; i++) {
×
1806
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
×
1807
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
×
1808
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1809
  }
1810
  // merge
1811

1812
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
×
1813
    SColVal  *pColVal = NULL;
×
1814
    STColumn *pCol = pTSchema->columns + iCol;
×
1815

1816
    for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
×
1817
      SColVal *pColValT = tRowIterNext(aIter[iRow]);
×
1818
      while (pColValT->cid < pTSchema->columns[iCol].colId) {
×
1819
        pColValT = tRowIterNext(aIter[iRow]);
×
1820
      }
1821
      // todo: take strategy according to the flag
1822
      if (COL_VAL_IS_VALUE(pColValT)) {
×
1823
        pColVal = pColValT;
×
1824
        break;
×
1825
      } else if (COL_VAL_IS_NULL(pColValT)) {
×
1826
        if (pColVal == NULL) {
×
1827
          pColVal = pColValT;
×
1828
        }
1829
      }
1830
    }
1831

1832
    if (pColVal) {
×
1833
      if (taosArrayPush(aColVal, pColVal) == NULL) {
×
1834
        code = terrno;
×
1835
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
1836
      }
1837
    }
1838
  }
1839

1840
  // build
1841

1842
  SRowBuildScanInfo sinfo = {.hasBlob = 1};
×
1843
  code = tRowBuildWithBlob2(aColVal, pTSchema, &pRow, pBlob, pDstBlob, &sinfo);
×
1844
  TAOS_CHECK_GOTO(code, &lino, _exit);
×
1845

1846
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
×
1847
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
×
1848
    code = terrno;
×
1849
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1850
  }
1851

1852
_exit:
×
1853
  if (aIter) {
×
1854
    for (int32_t i = 0; i < nRow; i++) {
×
1855
      tRowIterClose(&aIter[i]);
×
1856
    }
1857
    taosMemoryFree(aIter);
×
1858
  }
1859
  if (aColVal) taosArrayDestroy(aColVal);
×
1860
  if (code) tRowDestroy(pRow);
×
1861

1862
  return code;
×
1863
}
1864

1865
int32_t tRowSort(SArray *aRowP) {
73,630✔
1866
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
73,630✔
1867
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
73,628✔
1868
  if (code != TSDB_CODE_SUCCESS) {
73,629!
1869
    uError("taosArrayMSort failed caused by %d", code);
×
1870
  }
1871
  return code;
73,629✔
1872
}
1873

1874
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, ERowMergeStrategy strategy) {
73,650✔
1875
  int32_t code = 0;
73,650✔
1876

1877
  int32_t iStart = 0;
73,650✔
1878
  while (iStart < aRowP->size) {
75,152,749✔
1879
    SRowKey key1;
1880
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
75,117,044✔
1881

1882
    tRowGetKey(row1, &key1);
150,034,888✔
1883

1884
    int32_t iEnd = iStart + 1;
75,048,168✔
1885
    while (iEnd < aRowP->size) {
75,164,824✔
1886
      SRowKey key2;
1887
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
75,112,208✔
1888
      tRowGetKey(row2, &key2);
150,029,978✔
1889

1890
      if (tRowKeyCompare(&key1, &key2) != 0) break;
75,143,139✔
1891

1892
      iEnd++;
116,656✔
1893
    }
1894

1895
    if (iEnd - iStart > 1) {
75,079,099✔
1896
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, strategy);
593✔
1897
      if (code) return code;
593!
1898
    }
1899

1900
    // the array is also changing, so the iStart just ++ instead of iEnd
1901
    iStart++;
75,079,099✔
1902
  }
1903

1904
  return code;
35,705✔
1905
}
1906

1907
int32_t tRowSortWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlobSet) {
×
1908
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
×
1909
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
×
1910
  if (code != TSDB_CODE_SUCCESS) {
×
1911
    uError("taosArrayMSort failed caused by %d", code);
×
1912
    return code;
×
1913
  }
1914
  return code;
×
1915
}
1916

1917
int8_t tRowNeedDoMerge(SArray *aRowP) {
×
1918
  if (aRowP == NULL || aRowP->size <= 1) return 0;
×
1919

1920
  int8_t  doMerge = 0;
×
1921
  int32_t iStart = 0;
×
1922
  while (iStart < aRowP->size) {
×
1923
    SRowKey key1;
1924
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
×
1925

1926
    tRowGetKey(row1, &key1);
×
1927

1928
    int32_t iEnd = iStart + 1;
×
1929
    while (iEnd < aRowP->size) {
×
1930
      SRowKey key2;
1931
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
×
1932
      tRowGetKey(row2, &key2);
×
1933

1934
      if (tRowKeyCompare(&key1, &key2) != 0) break;
×
1935

1936
      iEnd++;
×
1937
    }
1938

1939
    if (iEnd - iStart > 1) {
×
1940
      doMerge = 1;
×
1941
      break;
×
1942
    }
1943
    iStart++;
×
1944
  }
1945
  return doMerge;
×
1946
}
1947

1948
int32_t tRowMergeWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlobSet, int8_t flag) {
×
1949
  int32_t code = 0;
×
1950

1951
  int8_t doMerge = tRowNeedDoMerge(aRowP);
×
1952
  if (!doMerge) {
×
1953
    code = tRowRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1954
  } else {
1955
    code = tRowRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1956
    TAOS_CHECK_RETURN(code);
×
1957

1958
    code = tRowMergeAndRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1959
  }
1960
  return code;
×
1961
}
1962

1963
// SRowIter ========================================
1964
struct SRowIter {
1965
  SRow     *pRow;
1966
  STSchema *pTSchema;
1967

1968
  int32_t iTColumn;
1969
  union {
1970
    struct {  // kv
1971
      int32_t iCol;
1972
      SKVIdx *pIdx;
1973
    };
1974
    struct {  // tuple
1975
      uint8_t *pb;
1976
      uint8_t *pf;
1977
    };
1978
  };
1979
  uint8_t *pv;
1980
  SColVal  cv;
1981
};
1982

1983
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
540,255✔
1984
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
540,255!
1985

1986
  int32_t code = 0;
540,255✔
1987

1988
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
540,255!
1989
  if (pIter == NULL) {
540,648!
1990
    code = terrno;
×
1991
    goto _exit;
×
1992
  }
1993

1994
  pIter->pRow = pRow;
540,648✔
1995
  pIter->pTSchema = pTSchema;
540,648✔
1996
  pIter->iTColumn = 0;
540,648✔
1997

1998
  if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
540,648✔
1999

2000
  uint8_t         *data = pRow->data;
537,765✔
2001
  SPrimaryKeyIndex index;
2002
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
557,720✔
2003
    data += tGetPrimaryKeyIndex(data, &index);
19,970✔
2004
  }
2005

2006
  if (pRow->flag >> 4) {
537,750✔
2007
    pIter->iCol = 0;
395,037✔
2008
    pIter->pIdx = (SKVIdx *)data;
395,037✔
2009
    if (pRow->flag & KV_FLG_LIT) {
395,037✔
2010
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
388,437✔
2011
    } else if (pRow->flag & KV_FLG_MID) {
6,600!
2012
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
6,600✔
2013
    } else {
2014
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
×
2015
    }
2016
  } else {
2017
    switch (pRow->flag) {
142,713!
2018
      case (HAS_NULL | HAS_NONE):
×
2019
        pIter->pb = data;
×
2020
        break;
×
2021
      case HAS_VALUE:
141,425✔
2022
        pIter->pf = data;
141,425✔
2023
        pIter->pv = pIter->pf + pTSchema->flen;
141,425✔
2024
        break;
141,425✔
2025
      case (HAS_VALUE | HAS_NONE):
1,280✔
2026
      case (HAS_VALUE | HAS_NULL):
2027
        pIter->pb = data;
1,280✔
2028
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
1,280✔
2029
        pIter->pv = pIter->pf + pTSchema->flen;
1,280✔
2030
        break;
1,280✔
2031
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2032
        pIter->pb = data;
×
2033
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
2034
        pIter->pv = pIter->pf + pTSchema->flen;
×
2035
        break;
×
2036
      default:
8✔
2037
        break;
8✔
2038
    }
2039
  }
2040

2041
_exit:
540,633✔
2042
  if (code) {
540,633!
2043
    *ppIter = NULL;
×
2044
  } else {
2045
    *ppIter = pIter;
540,633✔
2046
  }
2047
  return code;
540,633✔
2048
}
2049

2050
void tRowIterClose(SRowIter **ppIter) {
540,148✔
2051
  SRowIter *pIter = *ppIter;
540,148✔
2052
  if (pIter) {
540,148!
2053
    taosMemoryFree(pIter);
540,164!
2054
  }
2055
  *ppIter = NULL;
540,848✔
2056
}
540,848✔
2057

2058
SColVal *tRowIterNext(SRowIter *pIter) {
10,207,885✔
2059
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
10,207,885✔
2060
    return NULL;
392,614✔
2061
  }
2062

2063
  STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
9,815,271✔
2064

2065
  // timestamp
2066
  if (0 == pIter->iTColumn) {
9,815,271✔
2067
    pIter->cv.cid = pTColumn->colId;
403,053✔
2068
    pIter->cv.value.type = pTColumn->type;
403,053✔
2069
    pIter->cv.flag = CV_FLAG_VALUE;
403,053✔
2070
    VALUE_SET_TRIVIAL_DATUM(&pIter->cv.value, pIter->pRow->ts);
403,053✔
2071
    goto _exit;
403,053✔
2072
  }
2073

2074
  if (pIter->pRow->flag == HAS_NONE) {
9,412,218✔
2075
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
39,767✔
2076
    goto _exit;
39,767✔
2077
  }
2078

2079
  if (pIter->pRow->flag == HAS_NULL) {
9,372,451✔
2080
    pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,368✔
2081
    goto _exit;
3,368✔
2082
  }
2083

2084
  if (pIter->pRow->flag >> 4) {  // KV
9,369,083✔
2085
    if (pIter->iCol < pIter->pIdx->nCol) {
9,362,246✔
2086
      uint8_t *pData;
2087

2088
      if (pIter->pRow->flag & KV_FLG_LIT) {
5,431,587✔
2089
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
5,233,703✔
2090
      } else if (pIter->pRow->flag & KV_FLG_MID) {
197,884!
2091
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
198,000✔
2092
      } else {
2093
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
2094
      }
2095

2096
      int16_t cid;
2097
      pData += tGetI16v(pData, &cid);
5,431,587✔
2098

2099
      if (TABS(cid) == pTColumn->colId) {
5,431,587✔
2100
        if (cid < 0) {
5,429,548✔
2101
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
9,453✔
2102
        } else {
2103
          pIter->cv.cid = pTColumn->colId;
5,420,095✔
2104
          pIter->cv.value.type = pTColumn->type;
5,420,095✔
2105
          pIter->cv.flag = CV_FLAG_VALUE;
5,420,095✔
2106

2107
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
5,420,095!
2108
            pData += tGetU32v(pData, &pIter->cv.value.nData);
857,781!
2109
            if (pIter->cv.value.nData > 0) {
857,781!
2110
              pIter->cv.value.pData = pData;
869,303✔
2111
            } else {
2112
              pIter->cv.value.pData = NULL;
×
2113
              // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2114
              //   pIter->cv.value.pData = pData;
2115
              // }
2116
            }
2117
          } else {
2118
            valueSetDatum(&pIter->cv.value, pTColumn->type, pData, pTColumn->bytes);
4,562,314✔
2119
          }
2120
        }
2121

2122
        pIter->iCol++;
5,438,546✔
2123
        goto _exit;
5,438,546✔
2124
      } else if (TABS(cid) > pTColumn->colId) {
2,039✔
2125
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
24✔
2126
        goto _exit;
24✔
2127
      } else {
2128
        uError("unexpected column id %d, %d", cid, pTColumn->colId);
2,015!
2129
        goto _exit;
×
2130
      }
2131
    } else {
2132
      pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
3,930,659✔
2133
      goto _exit;
3,930,659✔
2134
    }
2135
  } else {  // Tuple
2136
    uint8_t bv = BIT_FLG_VALUE;
6,837✔
2137
    if (pIter->pb) {
6,837✔
2138
      switch (pIter->pRow->flag) {
5,534!
2139
        case (HAS_NULL | HAS_NONE):
×
2140
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
×
2141
          break;
×
2142
        case (HAS_VALUE | HAS_NONE):
12✔
2143
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
12✔
2144
          if (bv) bv++;
12!
2145
          break;
12✔
2146
        case (HAS_VALUE | HAS_NULL):
5,522✔
2147
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
5,522✔
2148
          break;
5,522✔
2149
        case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2150
          bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
×
2151
          break;
×
2152
        default:
×
2153
          break;
×
2154
      }
2155

2156
      if (bv == BIT_FLG_NONE) {
5,534!
2157
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
×
2158
        goto _exit;
×
2159
      } else if (bv == BIT_FLG_NULL) {
5,534✔
2160
        pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
894✔
2161
        goto _exit;
894✔
2162
      }
2163
    }
2164

2165
    pIter->cv.cid = pTColumn->colId;
5,943✔
2166
    pIter->cv.value.type = pTColumn->type;
5,943✔
2167
    pIter->cv.flag = CV_FLAG_VALUE;
5,943✔
2168
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
2169
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
×
2170
      pData += tGetU32v(pData, &pIter->cv.value.nData);
×
2171
      if (pIter->cv.value.nData > 0) {
×
2172
        pIter->cv.value.pData = pData;
1,323✔
2173
      } else {
2174
        pIter->cv.value.pData = NULL;
×
2175
        // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2176
        //   pIter->cv.value.pData = pData;
2177
        // }
2178
      }
2179
    } else {
2180
      valueSetDatum(&pIter->cv.value, pTColumn->type, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
28,807✔
2181
    }
2182
    goto _exit;
30,170✔
2183
  }
2184

2185
_exit:
9,846,481✔
2186
  pIter->iTColumn++;
9,846,481✔
2187
  return &pIter->cv;
9,846,481✔
2188
}
2189

2190
static int32_t tRowNoneUpsertColData(SColData *aColData, int32_t nColData, int32_t flag) {
8,228✔
2191
  int32_t code = 0;
8,228✔
2192

2193
  if (flag) return code;
8,228✔
2194

2195
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
69,496✔
2196
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
64,594✔
2197
    if (code) return code;
64,631!
2198
  }
2199

2200
  return code;
4,902✔
2201
}
2202
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
168,340✔
2203
  int32_t code = 0;
168,340✔
2204

2205
  int32_t   iColData = 0;
168,340✔
2206
  SColData *pColData = &aColData[iColData];
168,340✔
2207
  int32_t   iTColumn = 1;
168,340✔
2208
  STColumn *pTColumn = &pSchema->columns[iTColumn];
168,340✔
2209

2210
  while (pColData) {
611,431✔
2211
    if (pTColumn) {
443,144!
2212
      if (pTColumn->colId == pColData->cid) {  // NULL
443,144!
2213
        if (flag == 0) {
443,146✔
2214
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
442,994✔
2215
        } else {
2216
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
152✔
2217
        }
2218
        if (code) goto _exit;
443,093!
2219

2220
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
443,093✔
2221
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
443,093✔
2222
      } else if (pTColumn->colId > pColData->cid) {  // NONE
×
2223
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2224
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2225
      } else {
2226
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
×
2227
      }
2228
    } else {  // NONE
2229
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2230
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2231
    }
2232
  }
2233

2234
_exit:
168,287✔
2235
  return code;
168,287✔
2236
}
2237
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
1,406,128,701✔
2238
                                      int32_t flag) {
2239
  int32_t code = 0;
1,406,128,701✔
2240

2241
  int32_t   iColData = 0;
1,406,128,701✔
2242
  SColData *pColData = &aColData[iColData];
1,406,128,701✔
2243
  int32_t   iTColumn = 1;
1,406,128,701✔
2244
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
1,406,128,701✔
2245

2246
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
1,406,128,701✔
2247
  SPrimaryKeyIndex index;
2248
  uint8_t         *data = pRow->data;
1,406,128,701✔
2249
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,870,895,186✔
2250
    data += tGetPrimaryKeyIndex(data, &index);
464,733,234✔
2251
  }
2252

2253
  switch (pRow->flag) {
1,406,161,952!
2254
    case HAS_VALUE:
1,390,247,669✔
2255
      pf = data;  // TODO: fix here
1,390,247,669✔
2256
      pv = pf + pTSchema->flen;
1,390,247,669✔
2257
      break;
1,390,247,669✔
2258
    case (HAS_NULL | HAS_NONE):
1,311✔
2259
      pb = data;
1,311✔
2260
      break;
1,311✔
2261
    case (HAS_VALUE | HAS_NONE):
15,908,887✔
2262
    case (HAS_VALUE | HAS_NULL):
2263
      pb = data;
15,908,887✔
2264
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
15,908,887✔
2265
      pv = pf + pTSchema->flen;
15,908,887✔
2266
      break;
15,908,887✔
2267
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2268
      pb = data;
×
2269
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
×
2270
      pv = pf + pTSchema->flen;
×
2271
      break;
×
2272
    default:
4,085✔
2273
      return TSDB_CODE_INVALID_DATA_FMT;
4,085✔
2274
  }
2275

2276
  while (pColData) {
2,147,483,647✔
2277
    if (pTColumn) {
2,147,483,647✔
2278
      if (pTColumn->colId == pColData->cid) {
2,147,483,647!
2279
        if (!(pTColumn->type == pColData->type)) {
2,147,483,647!
2280
          return TSDB_CODE_INVALID_PARA;
×
2281
        }
2282
        if (pb) {
2,147,483,647✔
2283
          uint8_t bv;
2284
          switch (pRow->flag) {
69,098,928!
2285
            case (HAS_NULL | HAS_NONE):
26,019✔
2286
              bv = GET_BIT1(pb, iTColumn - 1);
26,019✔
2287
              break;
26,019✔
2288
            case (HAS_VALUE | HAS_NONE):
348,283✔
2289
              bv = GET_BIT1(pb, iTColumn - 1);
348,283✔
2290
              if (bv) bv++;
348,283✔
2291
              break;
348,283✔
2292
            case (HAS_VALUE | HAS_NULL):
68,722,760✔
2293
              bv = GET_BIT1(pb, iTColumn - 1) + 1;
68,722,760✔
2294
              break;
68,722,760✔
2295
            case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2296
              bv = GET_BIT2(pb, iTColumn - 1);
×
2297
              break;
×
2298
            default:
1,866✔
2299
              return TSDB_CODE_INVALID_DATA_FMT;
1,866✔
2300
          }
2301

2302
          if (bv == BIT_FLG_NONE) {
69,097,062✔
2303
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
53,529!
2304
              goto _exit;
×
2305
            goto _continue;
53,510✔
2306
          } else if (bv == BIT_FLG_NULL) {
69,043,533✔
2307
            if (flag == 0) {
19,081,854✔
2308
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
19,079,710✔
2309
            } else {
2310
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
2,144✔
2311
            }
2312
            if (code) goto _exit;
19,085,292!
2313
            goto _continue;
19,085,292✔
2314
          }
2315
        }
2316

2317
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
2318
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
82,996,267!
2319
          uint32_t nData;
2320
          pData += tGetU32v(pData, &nData);
82,996,267✔
2321
          if (flag == 0) {
82,996,267!
2322
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
88,641,330✔
2323
          } else {
2324
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
2325
          }
2326
          if (code) goto _exit;
89,109,180!
2327
        } else {
2328
          if (flag == 0) {
2,147,483,647✔
2329
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
2330
                                                                          TYPE_BYTES[pColData->type]);
2,147,483,647✔
2331
          } else {
2332
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
5,084,449✔
2333
                                                                          TYPE_BYTES[pColData->type], flag > 0);
5,084,449✔
2334
          }
2335
          if (code) goto _exit;
2,147,483,647!
2336
        }
2337

2338
      _continue:
2,147,483,647✔
2339
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
2340
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
2341
      } else if (pTColumn->colId > pColData->cid) {  // NONE
×
2342
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2343
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2344
      } else {
2345
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
×
2346
      }
2347
    } else {
2348
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
20,461!
2349
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
20,461✔
2350
    }
2351
  }
2352

2353
_exit:
1,409,070,935✔
2354
  return code;
1,409,070,935✔
2355
}
2356
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
4,021,717✔
2357
  int32_t code = 0;
4,021,717✔
2358

2359
  uint8_t  *pv = NULL;
4,021,717✔
2360
  int32_t   iColData = 0;
4,021,717✔
2361
  SColData *pColData = &aColData[iColData];
4,021,717✔
2362
  int32_t   iTColumn = 1;
4,021,717✔
2363
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
4,021,717✔
2364
  int32_t   iCol = 0;
4,021,717✔
2365

2366
  // primary keys
2367
  uint8_t         *data = pRow->data;
4,021,717✔
2368
  SPrimaryKeyIndex index;
2369
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
4,427,567✔
2370
    data += tGetPrimaryKeyIndex(data, &index);
405,933✔
2371
  }
2372

2373
  SKVIdx *pKVIdx = (SKVIdx *)data;
4,021,634✔
2374
  if (pRow->flag & KV_FLG_LIT) {
4,021,634✔
2375
    pv = pKVIdx->idx + pKVIdx->nCol;
3,969,502✔
2376
  } else if (pRow->flag & KV_FLG_MID) {
52,132!
2377
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
54,737✔
2378
  } else if (pRow->flag & KV_FLG_BIG) {
×
2379
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
2380
  } else {
2381
    return TSDB_CODE_INVALID_PARA;
×
2382
  }
2383

2384
  while (pColData) {
62,538,380✔
2385
    if (pTColumn) {
58,500,098✔
2386
      if (pTColumn->colId == pColData->cid) {
58,500,066✔
2387
        while (iCol < pKVIdx->nCol) {
58,488,828✔
2388
          uint8_t *pData;
2389
          if (pRow->flag & KV_FLG_LIT) {
48,475,024✔
2390
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
46,880,760✔
2391
          } else if (pRow->flag & KV_FLG_MID) {
1,594,264!
2392
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
1,594,296✔
2393
          } else if (pRow->flag & KV_FLG_BIG) {
×
2394
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
2395
          } else {
2396
            return TSDB_CODE_INVALID_DATA_FMT;
×
2397
          }
2398

2399
          int16_t cid;
2400
          pData += tGetI16v(pData, &cid);
48,475,056✔
2401

2402
          if (TABS(cid) == pTColumn->colId) {
48,475,056✔
2403
            if (cid < 0) {
28,006,803✔
2404
              if (flag == 0) {
5,031,057✔
2405
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
5,023,030✔
2406
              } else {
2407
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
8,027✔
2408
              }
2409
              if (code) goto _exit;
4,581,408!
2410
            } else {
2411
              uint32_t nData;
2412
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
22,975,746!
2413
                pData += tGetU32v(pData, &nData);
4,491,248✔
2414
              } else {
2415
                nData = 0;
18,484,498✔
2416
              }
2417
              if (flag == 0) {
22,975,746!
2418
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
23,096,557✔
2419
              } else {
2420
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
2421
              }
2422
              if (code) goto _exit;
23,440,386!
2423
            }
2424
            iCol++;
28,021,794✔
2425
            goto _continue;
28,021,794✔
2426
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
20,468,253✔
2427
            break;
20,450,506✔
2428
          } else {
2429
            iCol++;
17,747✔
2430
          }
2431
        }
2432

2433
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
30,464,310!
2434

2435
      _continue:
30,463,330✔
2436
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
58,485,124✔
2437
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
58,485,124✔
2438
      } else if (pTColumn->colId > pColData->cid) {
28,985!
2439
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2440
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2441
      } else {
2442
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
28,985!
2443
      }
2444
    } else {
2445
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
32!
2446
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
32!
2447
    }
2448
  }
2449

2450
_exit:
4,038,282✔
2451
  return code;
4,038,282✔
2452
}
2453
/* flag > 0: forward update
2454
 * flag == 0: append
2455
 * flag < 0: backward update
2456
 */
2457
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
1,410,171,633✔
2458
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
1,410,171,633!
2459
  if (!(nColData > 0)) return TSDB_CODE_INVALID_PARA;
1,410,171,633!
2460

2461
  if (pRow->flag == HAS_NONE) {
1,410,171,633✔
2462
    return tRowNoneUpsertColData(aColData, nColData, flag);
8,228✔
2463
  } else if (pRow->flag == HAS_NULL) {
1,410,163,405✔
2464
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
168,343✔
2465
  } else if (pRow->flag >> 4) {  // KV row
1,409,995,062✔
2466
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
4,024,290✔
2467
  } else {  // TUPLE row
2468
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
1,405,970,772✔
2469
  }
2470
}
2471

2472
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
2,147,483,647✔
2473
  key->numOfPKs = row->numOfPKs;
2,147,483,647✔
2474

2475
  if (key->numOfPKs == 0) {
2,147,483,647!
2476
    return;
×
2477
  }
2478

2479
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
2480

2481
  uint8_t *data = row->data;
2,147,483,647✔
2482

2483
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
2484
    data += tGetPrimaryKeyIndex(data, &indices[i]);
2,147,483,647✔
2485
  }
2486

2487
  // primary keys
2488
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
2489
    key->pks[i].type = indices[i].type;
2,147,483,647✔
2490

2491
    uint8_t *tdata = data + indices[i].offset;
2,147,483,647✔
2492
    if (row->flag >> 4) {
2,147,483,647✔
2493
      tdata += tGetI16v(tdata, NULL);
8,717,423✔
2494
    }
2495

2496
    if (IS_VAR_DATA_TYPE(indices[i].type)) {
2,147,483,647!
2497
      key->pks[i].pData = tdata;
701,497✔
2498
      key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
1,402,994✔
2499
    } else {
2500
      valueSetDatum(key->pks + i, indices[i].type, tdata, tDataTypes[indices[i].type].bytes);
2,147,483,647✔
2501
    }
2502
  }
2503
}
2504

2505
#define T_COMPARE_SCALAR_VALUE(TYPE, V1, V2)    \
2506
  do {                                          \
2507
    if (*(TYPE *)(V1) < *(TYPE *)(V2)) {        \
2508
      return -1;                                \
2509
    } else if (*(TYPE *)(V1) > *(TYPE *)(V2)) { \
2510
      return 1;                                 \
2511
    } else {                                    \
2512
      return 0;                                 \
2513
    }                                           \
2514
  } while (0)
2515

2516
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
95,392,072✔
2517
  switch (tv1->type) {
95,392,072!
2518
    case TSDB_DATA_TYPE_BOOL:
×
2519
    case TSDB_DATA_TYPE_TINYINT:
2520
      T_COMPARE_SCALAR_VALUE(int8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2521
    case TSDB_DATA_TYPE_SMALLINT:
×
2522
      T_COMPARE_SCALAR_VALUE(int16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2523
    case TSDB_DATA_TYPE_INT:
863,095✔
2524
      T_COMPARE_SCALAR_VALUE(int32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
863,095✔
2525
    case TSDB_DATA_TYPE_BIGINT:
92,532,040✔
2526
    case TSDB_DATA_TYPE_TIMESTAMP:
2527
      T_COMPARE_SCALAR_VALUE(int64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
92,532,040!
2528
    case TSDB_DATA_TYPE_FLOAT:
×
2529
      T_COMPARE_SCALAR_VALUE(float, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2530
    case TSDB_DATA_TYPE_DOUBLE:
×
2531
      T_COMPARE_SCALAR_VALUE(double, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2532
    case TSDB_DATA_TYPE_UTINYINT:
×
2533
      T_COMPARE_SCALAR_VALUE(uint8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2534
    case TSDB_DATA_TYPE_USMALLINT:
×
2535
      T_COMPARE_SCALAR_VALUE(uint16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2536
    case TSDB_DATA_TYPE_UINT:
511,649✔
2537
      T_COMPARE_SCALAR_VALUE(uint32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
511,649✔
2538
    case TSDB_DATA_TYPE_UBIGINT:
525,616✔
2539
      T_COMPARE_SCALAR_VALUE(uint64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
525,616✔
2540
    case TSDB_DATA_TYPE_GEOMETRY:
955,174✔
2541
    case TSDB_DATA_TYPE_BINARY: {
2542
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
955,174✔
2543
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
955,174✔
2544
    }
2545
    case TSDB_DATA_TYPE_NCHAR: {
×
2546
      int32_t ret = taosUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
2547
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2548
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2549
    }
2550
    case TSDB_DATA_TYPE_VARBINARY: {
×
2551
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2552
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2553
    }
2554
    default:
4,498✔
2555
      break;
4,498✔
2556
  }
2557

2558
  return 0;
4,498✔
2559
}
2560

2561
// NOTE:
2562
// set key->numOfPKs to 0 as the smallest key with ts
2563
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
2564
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
2,147,483,647✔
2565
  if (key1->ts < key2->ts) {
2,147,483,647!
2566
    return -1;
2,147,483,647✔
2567
  } else if (key1->ts > key2->ts) {
2,147,483,647!
2568
    return 1;
2,147,483,647✔
2569
  }
2570

2571
  if (key1->numOfPKs == key2->numOfPKs) {
76,262,831!
2572
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
113,438,744!
2573
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
95,379,513✔
2574
      if (ret) return ret;
95,351,208!
2575
    }
2576
  } else if (key1->numOfPKs < key2->numOfPKs) {
×
2577
    return -1;
9✔
2578
  } else {
2579
    return 1;
×
2580
  }
2581

2582
  return 0;
18,059,231✔
2583
}
2584

2585
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
1,135,482,385✔
2586
  pDst->ts = pSrc->ts;
1,135,482,385✔
2587
  pDst->numOfPKs = pSrc->numOfPKs;
1,135,482,385✔
2588

2589
  if (pSrc->numOfPKs > 0) {
1,135,482,385✔
2590
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
112,690,015✔
2591
      SValue *pVal = &pDst->pks[i];
55,896,979✔
2592
      pVal->type = pSrc->pks[i].type;
55,896,979✔
2593

2594
      valueCloneDatum(pVal, pSrc->pks + i, pVal->type);
55,896,979✔
2595
    }
2596
  }
2597
}
1,136,378,783✔
2598

2599
// STag ========================================
2600
static int tTagValCmprFn(const void *p1, const void *p2) {
233,949,826✔
2601
  if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
233,949,826✔
2602
    return -1;
80,531,241✔
2603
  } else if (((STagVal *)p1)->cid > ((STagVal *)p2)->cid) {
153,418,585✔
2604
    return 1;
85,257,693✔
2605
  }
2606

2607
  return 0;
68,160,892✔
2608
}
2609
static int tTagValJsonCmprFn(const void *p1, const void *p2) {
23,100✔
2610
  return strcmp(((STagVal *)p1)[0].pKey, ((STagVal *)p2)[0].pKey);
23,100✔
2611
}
2612

2613
#ifdef TD_DEBUG_PRINT_TAG
2614
static void debugPrintTagVal(int8_t type, const void *val, int32_t vlen, const char *tag, int32_t ln) {
2615
  switch (type) {
2616
    case TSDB_DATA_TYPE_VARBINARY:
2617
    case TSDB_DATA_TYPE_JSON:
2618
    case TSDB_DATA_TYPE_VARCHAR:
2619
    case TSDB_DATA_TYPE_NCHAR:
2620
    case TSDB_DATA_TYPE_GEOMETRY: {
2621
      char tmpVal[32] = {0};
2622
      tstrncpy(tmpVal, val, vlen > 31 ? 31 : vlen);
2623
      printf("%s:%d type:%d vlen:%d, val:\"%s\"\n", tag, ln, (int32_t)type, vlen, tmpVal);
2624
    } break;
2625
    case TSDB_DATA_TYPE_FLOAT:
2626
      printf("%s:%d type:%d vlen:%d, val:%f\n", tag, ln, (int32_t)type, vlen, *(float *)val);
2627
      break;
2628
    case TSDB_DATA_TYPE_DOUBLE:
2629
      printf("%s:%d type:%d vlen:%d, val:%lf\n", tag, ln, (int32_t)type, vlen, *(double *)val);
2630
      break;
2631
    case TSDB_DATA_TYPE_BOOL:
2632
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
2633
      break;
2634
    case TSDB_DATA_TYPE_TINYINT:
2635
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
2636
      break;
2637
    case TSDB_DATA_TYPE_SMALLINT:
2638
      printf("%s:%d type:%d vlen:%d, val:%" PRIi16 "\n", tag, ln, (int32_t)type, vlen, *(int16_t *)val);
2639
      break;
2640
    case TSDB_DATA_TYPE_INT:
2641
      printf("%s:%d type:%d vlen:%d, val:%" PRIi32 "\n", tag, ln, (int32_t)type, vlen, *(int32_t *)val);
2642
      break;
2643
    case TSDB_DATA_TYPE_BIGINT:
2644
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
2645
      break;
2646
    case TSDB_DATA_TYPE_TIMESTAMP:
2647
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
2648
      break;
2649
    case TSDB_DATA_TYPE_UTINYINT:
2650
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
2651
      break;
2652
    case TSDB_DATA_TYPE_USMALLINT:
2653
      printf("%s:%d type:%d vlen:%d, val:%" PRIu16 "\n", tag, ln, (int32_t)type, vlen, *(uint16_t *)val);
2654
      break;
2655
    case TSDB_DATA_TYPE_UINT:
2656
      printf("%s:%d type:%d vlen:%d, val:%" PRIu32 "\n", tag, ln, (int32_t)type, vlen, *(uint32_t *)val);
2657
      break;
2658
    case TSDB_DATA_TYPE_UBIGINT:
2659
      printf("%s:%d type:%d vlen:%d, val:%" PRIu64 "\n", tag, ln, (int32_t)type, vlen, *(uint64_t *)val);
2660
      break;
2661
    case TSDB_DATA_TYPE_NULL:
2662
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
2663
      break;
2664
    default:
2665
      break;
2666
  }
2667
}
2668

2669
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln) {
2670
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
2671
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
2672
  uint8_t *p = NULL;
2673
  int16_t  offset = 0;
2674

2675
  if (isLarge) {
2676
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
2677
  } else {
2678
    p = (uint8_t *)&pTag->idx[pTag->nTag];
2679
  }
2680
  printf("%s:%d >>> STAG === %s:%s, len: %d, nTag: %d, sver:%d\n", tag, ln, isJson ? "json" : "normal",
2681
         isLarge ? "large" : "small", (int32_t)pTag->len, (int32_t)pTag->nTag, pTag->ver);
2682
  for (uint16_t n = 0; n < pTag->nTag; ++n) {
2683
    if (isLarge) {
2684
      offset = ((int16_t *)pTag->idx)[n];
2685
    } else {
2686
      offset = pTag->idx[n];
2687
    }
2688
    STagVal tagVal = {0};
2689
    if (isJson) {
2690
      tagVal.pKey = (char *)POINTER_SHIFT(p, offset);
2691
    } else {
2692
      tagVal.cid = *(int16_t *)POINTER_SHIFT(p, offset);
2693
    }
2694
    printf("%s:%d loop[%d-%d] offset=%d\n", __func__, __LINE__, (int32_t)pTag->nTag, (int32_t)n, (int32_t)offset);
2695
    tGetTagVal(p + offset, &tagVal, isJson);
2696
    if (IS_VAR_DATA_TYPE(tagVal.type)) {
2697
      debugPrintTagVal(tagVal.type, tagVal.pData, tagVal.nData, __func__, __LINE__);
2698
    } else {
2699
      debugPrintTagVal(tagVal.type, &tagVal.i64, tDataTypes[tagVal.type].bytes, __func__, __LINE__);
2700
    }
2701
  }
2702
  printf("\n");
2703
}
2704
#endif
2705

2706
static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
435,305✔
2707
  int32_t n = 0;
435,305✔
2708

2709
  // key
2710
  if (isJson) {
435,305✔
2711
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
2,440✔
2712
  } else {
2713
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
868,170✔
2714
  }
2715

2716
  // type
2717
  n += tPutI8(p ? p + n : p, pTagVal->type);
435,305✔
2718

2719
  // value
2720
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
435,305!
2721
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
297,976✔
2722
  } else {
2723
    p = p ? p + n : p;
286,317✔
2724
    n += tDataTypes[pTagVal->type].bytes;
286,317✔
2725
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
286,317✔
2726
  }
2727

2728
  return n;
435,305✔
2729
}
2730
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
230,802,936✔
2731
  int32_t n = 0;
230,802,936✔
2732

2733
  // key
2734
  if (isJson) {
230,802,936✔
2735
    n += tGetCStr(p + n, &pTagVal->pKey);
48,448!
2736
  } else {
2737
    n += tGetI16v(p + n, &pTagVal->cid);
461,557,424!
2738
  }
2739

2740
  // type
2741
  n += tGetI8(p + n, &pTagVal->type);
230,802,936!
2742

2743
  // value
2744
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
230,802,936!
2745
    n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
78,596,060!
2746
  } else {
2747
    (void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
191,504,906✔
2748
    n += tDataTypes[pTagVal->type].bytes;
191,504,906✔
2749
  }
2750

2751
  return n;
230,802,936✔
2752
}
2753

2754
bool tTagIsJson(const void *pTag) { return (((const STag *)pTag)->flags & TD_TAG_JSON); }
44,769✔
2755

2756
bool tTagIsJsonNull(void *data) {
7,798✔
2757
  STag  *pTag = (STag *)data;
7,798✔
2758
  int8_t isJson = tTagIsJson(pTag);
7,798✔
2759
  if (!isJson) return false;
7,798✔
2760
  return ((STag *)data)->nTag == 0;
3,285✔
2761
}
2762

2763
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
99,344✔
2764
  int32_t  code = 0;
99,344✔
2765
  uint8_t *p = NULL;
99,344✔
2766
  int16_t  n = 0;
99,344✔
2767
  int16_t  nTag = taosArrayGetSize(pArray);
99,344✔
2768
  int32_t  szTag = 0;
99,349✔
2769
  int8_t   isLarge = 0;
99,349✔
2770

2771
  // sort
2772
  if (isJson) {
99,349✔
2773
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
302✔
2774
  } else {
2775
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
99,047✔
2776
  }
2777

2778
  // get size
2779
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
317,036✔
2780
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
217,685✔
2781
  }
2782
  if (szTag <= INT8_MAX) {
99,351✔
2783
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
93,638✔
2784
  } else {
2785
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
5,713✔
2786
    isLarge = 1;
5,713✔
2787
  }
2788

2789
  // build tag
2790
  (*ppTag) = (STag *)taosMemoryCalloc(szTag, 1);
99,351!
2791
  if ((*ppTag) == NULL) {
99,417!
2792
    code = terrno;
×
2793
    goto _err;
×
2794
  }
2795
  (*ppTag)->flags = 0;
99,417✔
2796
  if (isJson) {
99,417✔
2797
    (*ppTag)->flags |= TD_TAG_JSON;
302✔
2798
  }
2799
  if (isLarge) {
99,417✔
2800
    (*ppTag)->flags |= TD_TAG_LARGE;
5,726✔
2801
  }
2802
  (*ppTag)->len = szTag;
99,417✔
2803
  (*ppTag)->nTag = nTag;
99,417✔
2804
  (*ppTag)->ver = version;
99,417✔
2805

2806
  if (isLarge) {
99,417✔
2807
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
5,726✔
2808
  } else {
2809
    p = (uint8_t *)&(*ppTag)->idx[nTag];
93,691✔
2810
  }
2811
  n = 0;
99,417✔
2812
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
317,243✔
2813
    if (isLarge) {
217,822✔
2814
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
67,829✔
2815
    } else {
2816
      (*ppTag)->idx[iTag] = n;
149,993✔
2817
    }
2818
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
217,822✔
2819
  }
2820
#ifdef TD_DEBUG_PRINT_TAG
2821
  debugPrintSTag(*ppTag, __func__, __LINE__);
2822
#endif
2823

2824
  return code;
99,421✔
2825

2826
_err:
×
2827
  return code;
×
2828
}
2829

2830
void tTagFree(STag *pTag) {
11,084✔
2831
  if (pTag) taosMemoryFree(pTag);
11,084!
2832
}
11,084✔
2833

2834
char *tTagValToData(const STagVal *value, bool isJson) {
20,878,944✔
2835
  if (!value) {
20,878,944!
2836
    return NULL;
×
2837
  }
2838

2839
  char  *data = NULL;
20,878,944✔
2840
  int8_t typeBytes = 0;
20,878,944✔
2841
  if (isJson) {
20,878,944✔
2842
    typeBytes = CHAR_BYTES;
12,400✔
2843
  }
2844

2845
  if (IS_VAR_DATA_TYPE(value->type)) {
20,878,944!
2846
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
5,485,314!
2847
    if (data == NULL) {
5,486,630!
2848
      return NULL;
×
2849
    }
2850

2851
    if (isJson) {
5,486,630✔
2852
      *data = value->type;
8,099✔
2853
    }
2854

2855
    varDataLen(data + typeBytes) = value->nData;
5,486,630✔
2856
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
5,486,630✔
2857
  } else {
2858
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
15,393,630✔
2859
  }
2860

2861
  return data;
20,880,260✔
2862
}
2863

2864
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
68,133,069✔
2865
  if (!pTag || !pTagVal) {
68,133,069!
2866
    return false;
×
2867
  }
2868

2869
  int16_t  lidx = 0;
68,391,404✔
2870
  int16_t  ridx = pTag->nTag - 1;
68,391,404✔
2871
  int16_t  midx;
2872
  uint8_t *p;
2873
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
68,391,404✔
2874
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
68,391,404✔
2875
  int16_t  offset;
2876
  STagVal  tv;
2877
  int      c;
2878

2879
  if (isLarge) {
68,391,404✔
2880
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
64,048,834✔
2881
  } else {
2882
    p = (uint8_t *)&pTag->idx[pTag->nTag];
4,342,570✔
2883
  }
2884

2885
  pTagVal->type = TSDB_DATA_TYPE_NULL;
68,391,404✔
2886
  pTagVal->pData = NULL;
68,391,404✔
2887
  pTagVal->nData = 0;
68,391,404✔
2888
  while (lidx <= ridx) {
233,707,964✔
2889
    midx = (lidx + ridx) / 2;
231,600,784✔
2890
    if (isLarge) {
231,600,784✔
2891
      offset = ((int16_t *)pTag->idx)[midx];
208,118,109✔
2892
    } else {
2893
      offset = pTag->idx[midx];
23,482,675✔
2894
    }
2895

2896
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
231,600,784✔
2897
    if (isJson) {
234,925,182✔
2898
      c = tTagValJsonCmprFn(pTagVal, &tv);
22,740✔
2899
    } else {
2900
      c = tTagValCmprFn(pTagVal, &tv);
234,902,442✔
2901
    }
2902

2903
    if (c < 0) {
237,119,972✔
2904
      ridx = midx - 1;
80,127,102✔
2905
    } else if (c > 0) {
156,992,870✔
2906
      lidx = midx + 1;
85,189,458✔
2907
    } else {
2908
      (void)memcpy(pTagVal, &tv, sizeof(tv));
71,803,412✔
2909
      return true;
71,803,412✔
2910
    }
2911
  }
2912
  return false;
2,107,180✔
2913
}
2914

2915
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag) {
774,150✔
2916
  return tEncodeBinary(pEncoder, (const uint8_t *)pTag, pTag->len);
1,548,300✔
2917
}
2918

2919
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
35,278,197✔
2920

2921
int32_t tTagToValArray(const STag *pTag, SArray **ppArray) {
1,492✔
2922
  int32_t  code = 0;
1,492✔
2923
  uint8_t *p = NULL;
1,492✔
2924
  STagVal  tv = {0};
1,492✔
2925
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
1,492✔
2926
  int16_t  offset = 0;
1,492✔
2927

2928
  if (isLarge) {
1,492✔
2929
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
23✔
2930
  } else {
2931
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1,469✔
2932
  }
2933

2934
  (*ppArray) = taosArrayInit(pTag->nTag + 1, sizeof(STagVal));
1,492✔
2935
  if (*ppArray == NULL) {
1,492!
2936
    code = terrno;
×
2937
    goto _err;
×
2938
  }
2939

2940
  for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
3,703✔
2941
    if (isLarge) {
2,211✔
2942
      offset = ((int16_t *)pTag->idx)[iTag];
29✔
2943
    } else {
2944
      offset = pTag->idx[iTag];
2,182✔
2945
    }
2946
    int32_t nt = tGetTagVal(p + offset, &tv, pTag->flags & TD_TAG_JSON);
2,211✔
2947
    if (taosArrayPush(*ppArray, &tv) == NULL) {
4,422!
2948
      code = terrno;
×
2949
      goto _err;
×
2950
    }
2951
  }
2952

2953
  return code;
1,492✔
2954

2955
_err:
×
2956
  return code;
×
2957
}
2958

2959
// STSchema ========================================
2960
STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
24,891,667✔
2961
  STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
24,891,667!
2962
  if (pTSchema == NULL) {
24,957,531!
2963
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2964
    return NULL;
×
2965
  }
2966

2967
  pTSchema->numOfCols = numOfCols;
24,957,531✔
2968
  pTSchema->version = version;
24,957,531✔
2969

2970
  // timestamp column
2971
  if (!(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
24,957,531!
2972
    terrno = TSDB_CODE_INVALID_PARA;
×
2973
    taosMemoryFree(pTSchema);
×
2974
    return NULL;
×
2975
  }
2976
  if (!(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID)) {
24,957,531!
2977
    terrno = TSDB_CODE_INVALID_PARA;
×
2978
    taosMemoryFree(pTSchema);
×
2979
    return NULL;
×
2980
  }
2981
  pTSchema->columns[0].colId = aSchema[0].colId;
24,957,531✔
2982
  pTSchema->columns[0].type = aSchema[0].type;
24,957,531✔
2983
  pTSchema->columns[0].flags = aSchema[0].flags;
24,957,531✔
2984
  pTSchema->columns[0].bytes = TYPE_BYTES[aSchema[0].type];
24,957,531✔
2985
  pTSchema->columns[0].offset = -1;
24,957,531✔
2986

2987
  // other columns
2988
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
294,124,973✔
2989
    SSchema  *pSchema = &aSchema[iCol];
269,167,442✔
2990
    STColumn *pTColumn = &pTSchema->columns[iCol];
269,167,442✔
2991

2992
    pTColumn->colId = pSchema->colId;
269,167,442✔
2993
    pTColumn->type = pSchema->type;
269,167,442✔
2994
    pTColumn->flags = pSchema->flags;
269,167,442✔
2995
    pTColumn->offset = pTSchema->flen;
269,167,442✔
2996

2997
    if (IS_VAR_DATA_TYPE(pSchema->type)) {
269,167,442!
2998
      pTColumn->bytes = pSchema->bytes;
38,357,600✔
2999
      pTSchema->tlen += (TYPE_BYTES[pSchema->type] + pSchema->bytes);  // todo: remove
38,357,600✔
3000
    } else {
3001
      pTColumn->bytes = TYPE_BYTES[pSchema->type];
230,809,842✔
3002
      pTSchema->tlen += TYPE_BYTES[pSchema->type];  // todo: remove
230,809,842✔
3003
    }
3004

3005
    pTSchema->flen += TYPE_BYTES[pTColumn->type];
269,167,442✔
3006
  }
3007

3008
#if 1  // todo : remove this
3009
  pTSchema->tlen += (int32_t)TD_BITMAP_BYTES(numOfCols);
24,957,531✔
3010
#endif
3011

3012
  return pTSchema;
24,957,531✔
3013
}
3014

3015
static int32_t tTColumnCompare(const void *p1, const void *p2) {
14,396,383✔
3016
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
14,396,383✔
3017
    return -1;
2,188,390✔
3018
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
12,207,993✔
3019
    return 1;
8,631,099✔
3020
  }
3021

3022
  return 0;
3,576,894✔
3023
}
3024

3025
const STColumn *tTSchemaSearchColumn(const STSchema *pTSchema, int16_t cid) {
3,577,857✔
3026
  STColumn tcol = {
3,577,857✔
3027
      .colId = cid,
3028
  };
3029

3030
  return taosbsearch(&tcol, pTSchema->columns, pTSchema->numOfCols, sizeof(STColumn), tTColumnCompare, TD_EQ);
3,577,857✔
3031
}
3032

3033
// SColData ========================================
3034
void tColDataDestroy(void *ph) {
35,860,562✔
3035
  if (ph) {
35,860,562!
3036
    SColData *pColData = (SColData *)ph;
35,860,735✔
3037

3038
    tFree(pColData->pBitMap);
35,860,735!
3039
    tFree(pColData->aOffset);
35,860,820✔
3040
    tFree(pColData->pData);
35,860,835!
3041
  }
3042
}
35,861,585✔
3043

3044
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
36,499,648✔
3045
  pColData->cid = cid;
36,499,648✔
3046
  pColData->type = type;
36,499,648✔
3047
  pColData->cflag = cflag;
36,499,648✔
3048
  tColDataClear(pColData);
36,499,648✔
3049
}
36,503,977✔
3050

3051
void tColDataClear(SColData *pColData) {
74,806,481✔
3052
  pColData->numOfNone = 0;
74,806,481✔
3053
  pColData->numOfNull = 0;
74,806,481✔
3054
  pColData->numOfValue = 0;
74,806,481✔
3055
  pColData->nVal = 0;
74,806,481✔
3056
  pColData->flag = 0;
74,806,481✔
3057
  pColData->nData = 0;
74,806,481✔
3058
}
74,806,481✔
3059

3060
void tColDataDeepClear(SColData *pColData) {
75,975✔
3061
  pColData->pBitMap = NULL;
75,975✔
3062
  pColData->aOffset = NULL;
75,975✔
3063
  pColData->pData = NULL;
75,975✔
3064

3065
  tColDataClear(pColData);
75,975✔
3066
}
76,000✔
3067

3068
static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData, uint32_t nData) {
3069
  int32_t  code = 0;
2,147,483,647✔
3070
  uint32_t cvtNData = sizeof(uint64_t);
2,147,483,647✔
3071
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
3072
    // TODO
3073
    if (IS_STR_DATA_BLOB(pColData->type)) {
133,007,107!
3074
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
×
3075
      if (code) goto _exit;
×
3076
      pColData->aOffset[pColData->nVal] = pColData->nData;
×
3077

3078
      if (nData) {
×
3079
        code = tRealloc(&pColData->pData, pColData->nData + BSE_SEQUECE_SIZE);
×
3080
        if (code) goto _exit;
×
3081
        (void)memcpy(pColData->pData + pColData->nData, pData, BSE_SEQUECE_SIZE);
×
3082
        pColData->nData += BSE_SEQUECE_SIZE;
×
3083
      } else {
3084
        // uint64_t zero = 0;
3085
        // (void)memcpy(pColData->pData + pColData->nData, &zero, BSE_SEQUECE_SIZE);
3086
        // pColData->nData += BSE_SEQUECE_SIZE;
3087
      }
3088

3089
    } else {
3090
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
151,188,797!
3091
      if (code) goto _exit;
151,276,386!
3092
      pColData->aOffset[pColData->nVal] = pColData->nData;
151,276,386✔
3093

3094
      if (nData) {
151,276,386!
3095
        code = tRealloc(&pColData->pData, pColData->nData + nData);
145,403,432!
3096
        if (code) goto _exit;
145,663,699!
3097
        (void)memcpy(pColData->pData + pColData->nData, pData, nData);
145,663,699✔
3098
        pColData->nData += nData;
145,663,699✔
3099
      }
3100
    }
3101
  } else {
3102
    if (!(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal)) {
2,147,483,647!
3103
      return TSDB_CODE_INVALID_PARA;
×
3104
    }
3105
    code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
2,147,483,647!
3106
    if (code) goto _exit;
2,147,483,647!
3107
    if (pData) {
2,147,483,647!
3108
      (void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
2,147,483,647✔
3109
    } else {
3110
      memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
52,111,923✔
3111
    }
3112
    pColData->nData += tDataTypes[pColData->type].bytes;
2,147,483,647✔
3113
  }
3114
  pColData->nVal++;
2,147,483,647✔
3115

3116
_exit:
2,147,483,647✔
3117
  return code;
2,147,483,647✔
3118
}
3119
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,368,484✔
3120
  pColData->flag = HAS_VALUE;
3,368,639✔
3121
  pColData->numOfValue++;
3,368,484✔
3122
  return tColDataPutValue(pColData, pData, nData);
3,371,160✔
3123
}
3124
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
251,351✔
3125
  pColData->flag = HAS_NONE;
251,351✔
3126
  pColData->numOfNone++;
251,351✔
3127
  pColData->nVal++;
251,351✔
3128
  return 0;
251,351✔
3129
}
3130
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
43,874✔
3131
  pColData->flag = HAS_NULL;
43,933✔
3132
  pColData->numOfNull++;
43,933✔
3133
  pColData->nVal++;
43,933✔
3134
  return 0;
43,874✔
3135
}
3136
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,412✔
3137
  int32_t code = 0;
2,412✔
3138

3139
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
2,412✔
3140
  code = tRealloc(&pColData->pBitMap, nBit);
2,412!
3141
  if (code) return code;
2,416!
3142

3143
  memset(pColData->pBitMap, 0, nBit);
2,416✔
3144
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
2,416!
3145

3146
  pColData->flag |= HAS_VALUE;
2,416✔
3147
  pColData->numOfValue++;
2,416✔
3148

3149
  if (pColData->nVal) {
2,416!
3150
    if (IS_VAR_DATA_TYPE(pColData->type)) {
2,416!
3151
      if (IS_STR_DATA_BLOB(pColData->type)) {
254!
3152
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3153
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3154
        if (code) return code;
×
3155
        memset(pColData->aOffset, 0, nOffset);
×
3156

3157
      } else {
3158
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
254✔
3159
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
254!
3160
        if (code) return code;
252!
3161
        memset(pColData->aOffset, 0, nOffset);
252✔
3162
      }
3163
    } else {
3164
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
2,162✔
3165
      code = tRealloc(&pColData->pData, pColData->nData);
2,162!
3166
      if (code) return code;
2,161!
3167
      memset(pColData->pData, 0, pColData->nData);
2,161✔
3168
    }
3169
  }
3170

3171
  return tColDataPutValue(pColData, pData, nData);
2,413✔
3172
}
3173
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, uint8_t *pData, uint32_t nData) {
19,315,705✔
3174
  pColData->nVal++;
19,315,705✔
3175
  pColData->numOfNone++;
19,315,705✔
3176
  return 0;
19,315,705✔
3177
}
3178
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, uint8_t *pData, uint32_t nData) {
603✔
3179
  int32_t code = 0;
603✔
3180

3181
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
603✔
3182
  code = tRealloc(&pColData->pBitMap, nBit);
603!
3183
  if (code) return code;
603!
3184

3185
  memset(pColData->pBitMap, 0, nBit);
603✔
3186
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
603!
3187

3188
  pColData->flag |= HAS_NULL;
603✔
3189
  pColData->numOfNull++;
603✔
3190
  pColData->nVal++;
603✔
3191

3192
  return code;
603✔
3193
}
3194
static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, uint8_t *pData, uint32_t nData) {
19,190✔
3195
  int32_t code = 0;
19,190✔
3196

3197
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
19,190✔
3198
  code = tRealloc(&pColData->pBitMap, nBit);
19,190!
3199
  if (code) return code;
19,190!
3200

3201
  memset(pColData->pBitMap, 0, nBit);
19,190✔
3202
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
19,190!
3203

3204
  pColData->flag |= HAS_VALUE;
19,190✔
3205
  pColData->numOfValue++;
19,190✔
3206

3207
  if (pColData->nVal) {
19,190!
3208
    if (IS_VAR_DATA_TYPE(pColData->type)) {
20,028!
3209
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
838✔
3210
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
838!
3211
      if (code) return code;
838!
3212
      if (!IS_STR_DATA_BLOB(pColData->type)) {
838!
3213
        memset(pColData->aOffset, 0, nOffset);
838✔
3214
      }
3215
    } else {
3216
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
18,352✔
3217
      code = tRealloc(&pColData->pData, pColData->nData);
18,352!
3218
      if (code) return code;
18,352!
3219
      memset(pColData->pData, 0, pColData->nData);
18,352✔
3220
    }
3221
  }
3222

3223
  return tColDataPutValue(pColData, pData, nData);
19,190✔
3224
}
3225
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, uint8_t *pData, uint32_t nData) {
10,080✔
3226
  int32_t code = 0;
10,080✔
3227

3228
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
10,080✔
3229
  code = tRealloc(&pColData->pBitMap, nBit);
10,080✔
3230
  if (code) return code;
10,080!
3231

3232
  memset(pColData->pBitMap, 255, nBit);
10,080✔
3233
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
10,080!
3234

3235
  pColData->flag |= HAS_NONE;
10,080✔
3236
  pColData->numOfNone++;
10,080✔
3237
  pColData->nVal++;
10,080✔
3238

3239
  return code;
10,080✔
3240
}
3241
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,318,010✔
3242
  pColData->nVal++;
3,318,010✔
3243
  pColData->numOfNull++;
3,318,010✔
3244
  return 0;
3,318,010✔
3245
}
3246
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, uint8_t *pData, uint32_t nData) {
5✔
3247
  int32_t code = 0;
5✔
3248

3249
  pColData->flag |= HAS_VALUE;
5✔
3250
  pColData->numOfValue++;
5✔
3251

3252
  uint8_t *pBitMap = NULL;
5✔
3253
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
5!
3254
  if (code) return code;
5!
3255

3256
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,005!
3257
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
1,000!
3258
  }
3259
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
5!
3260

3261
  tFree(pColData->pBitMap);
5!
3262
  pColData->pBitMap = pBitMap;
5✔
3263

3264
  if (pColData->nVal) {
5!
3265
    if (IS_VAR_DATA_TYPE(pColData->type)) {
5!
3266
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3267
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3268
      if (code) return code;
×
3269
      memset(pColData->aOffset, 0, nOffset);
×
3270
    } else {
3271
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
5✔
3272
      code = tRealloc(&pColData->pData, pColData->nData);
5!
3273
      if (code) return code;
5!
3274
      memset(pColData->pData, 0, pColData->nData);
5✔
3275
    }
3276
  }
3277

3278
  return tColDataPutValue(pColData, pData, nData);
5✔
3279
}
3280
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,989,900✔
3281
  int32_t code = 0;
1,989,900✔
3282

3283
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,989,900!
3284
  if (code) return code;
1,989,900!
3285

3286
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
1,989,900✔
3287
  pColData->numOfNone++;
1,989,900✔
3288
  pColData->nVal++;
1,989,900✔
3289

3290
  return code;
1,989,900✔
3291
}
3292
static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, uint8_t *pData, uint32_t nData) {
9,379✔
3293
  int32_t code = 0;
9,379✔
3294

3295
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
9,379!
3296
  if (code) return code;
9,379!
3297

3298
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
9,379!
3299
  pColData->numOfNull++;
9,379✔
3300
  pColData->nVal++;
9,379✔
3301

3302
  return code;
9,379✔
3303
}
3304
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3305
  pColData->numOfValue++;
2,147,483,647✔
3306
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3307
}
3308
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, uint8_t *pData, uint32_t nData) {
124,749✔
3309
  int32_t code = 0;
124,749✔
3310

3311
  pColData->flag |= HAS_NONE;
124,749✔
3312
  pColData->numOfNone++;
124,749✔
3313

3314
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
124,749✔
3315
  code = tRealloc(&pColData->pBitMap, nBit);
124,749✔
3316
  if (code) return code;
124,804!
3317

3318
  memset(pColData->pBitMap, 255, nBit);
124,804✔
3319
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
124,804✔
3320

3321
  return tColDataPutValue(pColData, NULL, 0);
124,792✔
3322
}
3323
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
219,094✔
3324
  int32_t code = 0;
224,400✔
3325

3326
  pColData->flag |= HAS_NULL;
224,400✔
3327
  pColData->numOfNull++;
224,400✔
3328

3329
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
224,400✔
3330
  code = tRealloc(&pColData->pBitMap, nBit);
224,096✔
3331
  if (code) return code;
224,400!
3332

3333
  memset(pColData->pBitMap, 255, nBit);
224,400✔
3334
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
224,400!
3335

3336
  return tColDataPutValue(pColData, NULL, 0);
224,405✔
3337
}
3338
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,954,062✔
3339
  int32_t code = 0;
1,956,063✔
3340

3341
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,956,062!
3342
  if (code) return code;
1,956,438!
3343

3344
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
1,956,438!
3345
  pColData->numOfValue++;
1,956,438!
3346

3347
  return tColDataPutValue(pColData, pData, nData);
1,958,636✔
3348
}
3349
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
13,913,363✔
3350
  int32_t code = 0;
13,913,363✔
3351

3352
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
13,913,363!
3353
  if (code) return code;
13,913,337!
3354

3355
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
13,913,337✔
3356
  pColData->numOfNone++;
13,913,337✔
3357

3358
  return tColDataPutValue(pColData, NULL, 0);
13,915,992✔
3359
}
3360
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
12,469✔
3361
  int32_t code = 0;
12,469✔
3362

3363
  pColData->flag |= HAS_NULL;
12,469✔
3364
  pColData->numOfNull++;
12,469✔
3365

3366
  uint8_t *pBitMap = NULL;
12,469✔
3367
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
12,469!
3368
  if (code) return code;
12,469!
3369

3370
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,767,407!
3371
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
3,754,938!
3372
  }
3373
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
12,469!
3374

3375
  tFree(pColData->pBitMap);
12,469!
3376
  pColData->pBitMap = pBitMap;
12,469!
3377

3378
  return tColDataPutValue(pColData, NULL, 0);
12,469✔
3379
}
3380
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
549,178,950✔
3381
  int32_t code = 0;
549,181,978✔
3382

3383
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
549,181,578!
3384
  if (code) return code;
549,684,231!
3385
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
549,684,231!
3386
  pColData->numOfValue++;
549,684,231✔
3387

3388
  return tColDataPutValue(pColData, pData, nData);
550,898,208✔
3389
}
3390
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
28,928✔
3391
  int32_t code = 0;
28,928✔
3392

3393
  pColData->flag |= HAS_NONE;
28,928✔
3394
  pColData->numOfNone++;
28,928✔
3395

3396
  uint8_t *pBitMap = NULL;
28,928✔
3397
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
28,928!
3398
  if (code) return code;
28,925!
3399

3400
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,904,093✔
3401
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
3,875,168✔
3402
  }
3403
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
28,925✔
3404

3405
  tFree(pColData->pBitMap);
28,925!
3406
  pColData->pBitMap = pBitMap;
28,926✔
3407

3408
  return tColDataPutValue(pColData, NULL, 0);
28,927✔
3409
}
3410
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
33,065,993✔
3411
  int32_t code = 0;
33,079,688✔
3412

3413
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
33,076,092!
3414
  if (code) return code;
33,081,821!
3415
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
33,081,821✔
3416
  pColData->numOfNull++;
33,081,821✔
3417

3418
  return tColDataPutValue(pColData, NULL, 0);
33,095,667✔
3419
}
3420
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
662,083✔
3421
  int32_t code = 0;
662,083✔
3422

3423
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
662,083!
3424
  if (code) return code;
662,083!
3425
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
662,083!
3426
  pColData->numOfValue++;
662,083!
3427

3428
  return tColDataPutValue(pColData, pData, nData);
662,083✔
3429
}
3430
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,955,205✔
3431
  int32_t code = 0;
4,955,205✔
3432

3433
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
4,955,205!
3434
  if (code) return code;
4,955,205!
3435
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
4,955,205✔
3436
  pColData->numOfNone++;
4,955,205!
3437

3438
  return tColDataPutValue(pColData, NULL, 0);
4,955,205✔
3439
}
3440
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
563,728✔
3441
  int32_t code = 0;
563,728✔
3442

3443
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
563,728!
3444
  if (code) return code;
563,728!
3445
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
563,728!
3446
  pColData->numOfNull++;
563,728!
3447

3448
  return tColDataPutValue(pColData, NULL, 0);
563,728✔
3449
}
3450
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData) = {
3451
    {tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02},  // 0
3452
    {tColDataAppendValue10, tColDataAppendValue11, tColDataAppendValue12},  // HAS_NONE
3453
    {tColDataAppendValue20, tColDataAppendValue21, tColDataAppendValue22},  // HAS_NULL
3454
    {tColDataAppendValue30, tColDataAppendValue31, tColDataAppendValue32},  // HAS_NULL|HAS_NONE
3455
    {tColDataAppendValue40, tColDataAppendValue41, tColDataAppendValue42},  // HAS_VALUE
3456
    {tColDataAppendValue50, tColDataAppendValue51, tColDataAppendValue52},  // HAS_VALUE|HAS_NONE
3457
    {tColDataAppendValue60, tColDataAppendValue61, tColDataAppendValue62},  // HAS_VALUE|HAS_NULL
3458
    {tColDataAppendValue70, tColDataAppendValue71, tColDataAppendValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
3459

3460
    //       VALUE                  NONE                     NULL
3461
};
3462

3463
static FORCE_INLINE int32_t tColDataPutValueBlob(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
3464
  int32_t  code = 0;
×
3465
  uint8_t  buf[sizeof(uint64_t) + 1] = {0};
×
3466
  uint64_t seq = 0;
×
3467

3468
  int32_t offset = 0;
×
3469
  if (IS_STR_DATA_BLOB(pColData->type)) {
×
3470
    code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
×
3471
    if (code) goto _exit;
×
3472
    pColData->aOffset[pColData->nVal] = pColData->nData;
×
3473
    if (nData) {
×
3474
      SBlobItem item = {.seqOffsetInRow = seq, .len = nData, .data = pData, .type = TSDB_DATA_BLOB_VALUE};
×
3475
      code = tBlobSetPush(pArg, &item, &seq, 0);
×
3476
      if (code != 0) return code;
×
3477

3478
      offset = tPutU64(buf, seq);
×
3479
      code = tRealloc(&pColData->pData, pColData->nData + offset);
×
3480
      if (code != 0) return code;
×
3481
      memcpy(pColData->pData + pColData->nData, buf, offset);
×
3482
      pColData->nData += offset;
×
3483
    } else {
3484
      int8_t type = pData ? TSDB_DATA_BLOB_EMPTY_VALUE : TSDB_DATA_BLOB_NULL_VALUE;
×
3485
      code = addEmptyItemToBlobSet(pArg, type, NULL);
×
3486
    }
3487
  }
3488
  pColData->nVal++;
×
3489

3490
_exit:
×
3491
  return code;
×
3492
}
3493

3494
static FORCE_INLINE int32_t tColDataAppendValueBlob00(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3495
  pColData->flag = HAS_VALUE;
×
3496
  pColData->numOfValue++;
×
3497
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3498
}
3499
static FORCE_INLINE int32_t tColDataAppendValueBlob01(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3500
  pColData->flag = HAS_NONE;
×
3501
  pColData->numOfNone++;
×
3502
  pColData->nVal++;
×
3503
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3504
}
3505
static FORCE_INLINE int32_t tColDataAppendValueBlob02(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3506
  pColData->flag = HAS_NULL;
×
3507
  pColData->numOfNull++;
×
3508
  pColData->nVal++;
×
3509
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3510
}
3511
static FORCE_INLINE int32_t tColDataAppendValueBlob10(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3512
  int32_t code = 0;
×
3513

3514
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3515
  code = tRealloc(&pColData->pBitMap, nBit);
×
3516
  if (code) return code;
×
3517

3518
  memset(pColData->pBitMap, 0, nBit);
×
3519
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3520

3521
  pColData->flag |= HAS_VALUE;
×
3522
  pColData->numOfValue++;
×
3523

3524
  if (pColData->nVal) {
×
3525
    if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3526
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3527
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3528
      if (code) return code;
×
3529
      memset(pColData->aOffset, 0, nOffset);
×
3530
    } else {
3531
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
×
3532
      code = tRealloc(&pColData->pData, pColData->nData);
×
3533
      if (code) return code;
×
3534
      memset(pColData->pData, 0, pColData->nData);
×
3535
    }
3536
  }
3537

3538
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3539
}
3540
static FORCE_INLINE int32_t tColDataAppendValueBlob11(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3541
  pColData->nVal++;
×
3542
  pColData->numOfNone++;
×
3543
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3544
}
3545
static FORCE_INLINE int32_t tColDataAppendValueBlob12(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3546
  int32_t code = 0;
×
3547

3548
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3549
  code = tRealloc(&pColData->pBitMap, nBit);
×
3550
  if (code) return code;
×
3551

3552
  memset(pColData->pBitMap, 0, nBit);
×
3553
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3554

3555
  pColData->flag |= HAS_NULL;
×
3556
  pColData->numOfNull++;
×
3557
  pColData->nVal++;
×
3558
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3559
}
3560
static FORCE_INLINE int32_t tColDataAppendValueBlob20(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3561
  int32_t code = 0;
×
3562

3563
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3564
  code = tRealloc(&pColData->pBitMap, nBit);
×
3565
  if (code) return code;
×
3566

3567
  memset(pColData->pBitMap, 0, nBit);
×
3568
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3569

3570
  pColData->flag |= HAS_VALUE;
×
3571
  pColData->numOfValue++;
×
3572

3573
  if (pColData->nVal) {
×
3574
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
3575
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3576
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3577
      if (code) return code;
×
3578
      memset(pColData->aOffset, 0, nOffset);
×
3579
    } else {
3580
      return TSDB_CODE_INVALID_MSG;
×
3581
    }
3582
  }
3583

3584
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3585
}
3586
static FORCE_INLINE int32_t tColDataAppendValueBlob21(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3587
  int32_t code = 0;
×
3588

3589
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3590
  code = tRealloc(&pColData->pBitMap, nBit);
×
3591
  if (code) return code;
×
3592

3593
  memset(pColData->pBitMap, 255, nBit);
×
3594
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3595

3596
  pColData->flag |= HAS_NONE;
×
3597
  pColData->numOfNone++;
×
3598
  pColData->nVal++;
×
3599
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3600
}
3601
static FORCE_INLINE int32_t tColDataAppendValueBlob22(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3602
  pColData->nVal++;
×
3603
  pColData->numOfNull++;
×
3604
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3605
}
3606
static FORCE_INLINE int32_t tColDataAppendValueBlob30(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3607
  int32_t code = 0;
×
3608

3609
  pColData->flag |= HAS_VALUE;
×
3610
  pColData->numOfValue++;
×
3611

3612
  uint8_t *pBitMap = NULL;
×
3613
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3614
  if (code) return code;
×
3615

3616
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3617
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
×
3618
  }
3619
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
×
3620

3621
  tFree(pColData->pBitMap);
×
3622
  pColData->pBitMap = pBitMap;
×
3623

3624
  if (pColData->nVal) {
×
3625
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
3626
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3627
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3628
      if (code) return code;
×
3629
      memset(pColData->aOffset, 0, nOffset);
×
3630
    } else {
3631
      return TSDB_CODE_INVALID_MSG;
×
3632
    }
3633
  }
3634

3635
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3636
}
3637
static FORCE_INLINE int32_t tColDataAppendValueBlob31(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3638
  int32_t code = 0;
×
3639

3640
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3641
  if (code) return code;
×
3642

3643
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3644
  pColData->numOfNone++;
×
3645
  pColData->nVal++;
×
3646

3647
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3648
}
3649
static FORCE_INLINE int32_t tColDataAppendValueBlob32(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3650
  int32_t code = 0;
×
3651

3652
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3653
  if (code) return code;
×
3654

3655
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3656
  pColData->numOfNull++;
×
3657
  pColData->nVal++;
×
3658
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3659
}
3660
static FORCE_INLINE int32_t tColDataAppendValueBlob40(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3661
  pColData->numOfValue++;
×
3662
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3663
}
3664
static FORCE_INLINE int32_t tColDataAppendValueBlob41(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3665
  int32_t code = 0;
×
3666

3667
  pColData->flag |= HAS_NONE;
×
3668
  pColData->numOfNone++;
×
3669

3670
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3671
  code = tRealloc(&pColData->pBitMap, nBit);
×
3672
  if (code) return code;
×
3673

3674
  memset(pColData->pBitMap, 255, nBit);
×
3675
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3676

3677
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3678
}
3679
static FORCE_INLINE int32_t tColDataAppendValueBlob42(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3680
  int32_t code = 0;
×
3681

3682
  pColData->flag |= HAS_NULL;
×
3683
  pColData->numOfNull++;
×
3684

3685
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3686
  code = tRealloc(&pColData->pBitMap, nBit);
×
3687
  if (code) return code;
×
3688

3689
  memset(pColData->pBitMap, 255, nBit);
×
3690
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3691

3692
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3693
}
3694
static FORCE_INLINE int32_t tColDataAppendValueBlob50(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3695
  int32_t code = 0;
×
3696

3697
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3698
  if (code) return code;
×
3699

3700
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3701
  pColData->numOfValue++;
×
3702

3703
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3704
}
3705
static FORCE_INLINE int32_t tColDataAppendValueBlob51(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3706
  int32_t code = 0;
×
3707

3708
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3709
  if (code) return code;
×
3710

3711
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3712
  pColData->numOfNone++;
×
3713

3714
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3715
}
3716
static FORCE_INLINE int32_t tColDataAppendValueBlob52(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3717
  int32_t code = 0;
×
3718

3719
  pColData->flag |= HAS_NULL;
×
3720
  pColData->numOfNull++;
×
3721

3722
  uint8_t *pBitMap = NULL;
×
3723
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3724
  if (code) return code;
×
3725

3726
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3727
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
×
3728
  }
3729
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
×
3730

3731
  tFree(pColData->pBitMap);
×
3732
  pColData->pBitMap = pBitMap;
×
3733

3734
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3735
}
3736
static FORCE_INLINE int32_t tColDataAppendValueBlob60(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3737
  int32_t code = 0;
×
3738

3739
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3740
  if (code) return code;
×
3741
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3742
  pColData->numOfValue++;
×
3743

3744
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3745
}
3746
static FORCE_INLINE int32_t tColDataAppendValueBlob61(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3747
  int32_t code = 0;
×
3748

3749
  pColData->flag |= HAS_NONE;
×
3750
  pColData->numOfNone++;
×
3751

3752
  uint8_t *pBitMap = NULL;
×
3753
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3754
  if (code) return code;
×
3755

3756
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3757
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
×
3758
  }
3759
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
×
3760

3761
  tFree(pColData->pBitMap);
×
3762
  pColData->pBitMap = pBitMap;
×
3763

3764
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3765
}
3766
static FORCE_INLINE int32_t tColDataAppendValueBlob62(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3767
  int32_t code = 0;
×
3768

3769
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3770
  if (code) return code;
×
3771
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3772
  pColData->numOfNull++;
×
3773

3774
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3775
}
3776
static FORCE_INLINE int32_t tColDataAppendValueBlob70(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3777
  int32_t code = 0;
×
3778

3779
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3780
  if (code) return code;
×
3781
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
×
3782
  pColData->numOfValue++;
×
3783

3784
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3785
}
3786
static FORCE_INLINE int32_t tColDataAppendValueBlob71(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3787
  int32_t code = 0;
×
3788

3789
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3790
  if (code) return code;
×
3791
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
×
3792
  pColData->numOfNone++;
×
3793

3794
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3795
}
3796
static FORCE_INLINE int32_t tColDataAppendValueBlob72(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3797
  int32_t code = 0;
×
3798

3799
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3800
  if (code) return code;
×
3801
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
×
3802
  pColData->numOfNull++;
×
3803

3804
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3805
}
3806

3807
static int32_t (*tColDataAppendValueBlobImpl[8][3])(void *pDst, SColData *pColData, uint8_t *pData, uint32_t nData) = {
3808
    {tColDataAppendValueBlob00, tColDataAppendValueBlob01, tColDataAppendValueBlob02},  // 0
3809
    {tColDataAppendValueBlob10, tColDataAppendValueBlob11, tColDataAppendValueBlob12},  // HAS_NONE
3810
    {tColDataAppendValueBlob20, tColDataAppendValueBlob21, tColDataAppendValueBlob22},  // HAS_NULL
3811
    {tColDataAppendValueBlob30, tColDataAppendValueBlob31, tColDataAppendValueBlob32},  // HAS_NULL|HAS_NONE
3812
    {tColDataAppendValueBlob40, tColDataAppendValueBlob41, tColDataAppendValueBlob42},  // HAS_VALUE
3813
    {tColDataAppendValueBlob50, tColDataAppendValueBlob51, tColDataAppendValueBlob52},  // HAS_VALUE|HAS_NONE
3814
    {tColDataAppendValueBlob60, tColDataAppendValueBlob61, tColDataAppendValueBlob62},  // HAS_VALUE|HAS_NULL
3815
    {tColDataAppendValueBlob70, tColDataAppendValueBlob71, tColDataAppendValueBlob72}   // HAS_VALUE|HAS_NULL|HAS_NONE
3816
    //       VALUE                  NONE                     NULL
3817
};
3818
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal) {
2,147,483,647✔
3819
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) {
2,147,483,647!
3820
    return TSDB_CODE_INVALID_PARA;
×
3821
  }
3822
  return tColDataAppendValueImpl[pColData->flag][pColVal->flag](
2,147,483,647✔
3823
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData);
2,147,483,647!
3824
}
3825

3826
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
7✔
3827
  pColData->numOfNone--;
7✔
3828
  pColData->nVal--;
7✔
3829
  if (pColData->numOfNone) {
7!
3830
    return tColDataAppendValue10(pColData, pData, nData);
×
3831
  } else {
3832
    pColData->flag = 0;
7✔
3833
    return tColDataAppendValue00(pColData, pData, nData);
7✔
3834
  }
3835
}
3836
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24✔
3837
  pColData->numOfNone--;
24✔
3838
  pColData->nVal--;
24✔
3839
  if (pColData->numOfNone) {
24!
3840
    return tColDataAppendValue12(pColData, pData, nData);
×
3841
  } else {
3842
    pColData->flag = 0;
24✔
3843
    return tColDataAppendValue02(pColData, pData, nData);
24✔
3844
  }
3845
  return 0;
3846
}
3847
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
148✔
3848
  if (forward) {
148!
3849
    pColData->numOfNull--;
148✔
3850
    pColData->nVal--;
148✔
3851
    if (pColData->numOfNull) {
148!
3852
      return tColDataAppendValue20(pColData, pData, nData);
×
3853
    } else {
3854
      pColData->flag = 0;
148✔
3855
      return tColDataAppendValue00(pColData, pData, nData);
148✔
3856
    }
3857
  }
3858
  return 0;
×
3859
}
3860
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
3861
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
3862
    pColData->numOfNone--;
×
3863
    pColData->nVal--;
×
3864
    if (pColData->numOfNone) {
×
3865
      return tColDataAppendValue30(pColData, pData, nData);
×
3866
    } else {
3867
      pColData->flag = HAS_NULL;
×
3868
      return tColDataAppendValue20(pColData, pData, nData);
×
3869
    }
3870
  } else if (forward) {  // NULL ==> VALUE
×
3871
    pColData->numOfNull--;
×
3872
    pColData->nVal--;
×
3873
    if (pColData->numOfNull) {
×
3874
      return tColDataAppendValue30(pColData, pData, nData);
×
3875
    } else {
3876
      pColData->flag = HAS_NONE;
×
3877
      return tColDataAppendValue10(pColData, pData, nData);
×
3878
    }
3879
  }
3880
  return 0;
×
3881
}
3882
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
80✔
3883
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
80!
3884
    pColData->numOfNone--;
80✔
3885
    pColData->numOfNull++;
80✔
3886
    if (pColData->numOfNone) {
80!
3887
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
×
3888
    } else {
3889
      pColData->flag = HAS_NULL;
80✔
3890
    }
3891
  }
3892
  return 0;
80✔
3893
}
3894
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
15,322,598✔
3895
  if (forward) {  // VALUE ==> VALUE
15,322,598!
3896
    pColData->nVal--;
15,324,009✔
3897
    if (IS_VAR_DATA_TYPE(pColData->type)) {
15,324,009!
3898
      pColData->nData = pColData->aOffset[pColData->nVal];
2,594,799✔
3899
    } else {
3900
      pColData->nData -= TYPE_BYTES[pColData->type];
12,729,210✔
3901
    }
3902
    return tColDataPutValue(pColData, pData, nData);
15,489,946✔
3903
  }
3904
  return 0;
×
3905
}
3906
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
5,037✔
3907
  if (forward) {  // VALUE ==> NULL
5,037!
3908
    pColData->numOfValue--;
5,037✔
3909
    pColData->nVal--;
5,037✔
3910
    if (pColData->numOfValue) {
5,037✔
3911
      if (IS_VAR_DATA_TYPE(pColData->type)) {
5,002!
3912
        pColData->nData = pColData->aOffset[pColData->nVal];
999✔
3913
      } else {
3914
        pColData->nData -= TYPE_BYTES[pColData->type];
4,003✔
3915
      }
3916
      return tColDataAppendValue42(pColData, pData, nData);
5,002✔
3917
    } else {
3918
      pColData->flag = 0;
35✔
3919
      pColData->nData = 0;
35✔
3920
      return tColDataAppendValue02(pColData, pData, nData);
35✔
3921
    }
3922
  }
3923
  return 0;
×
3924
}
3925
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
31,013✔
3926
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
31,013✔
3927
    pColData->numOfNone--;
5,594✔
3928
    pColData->nVal--;
5,594✔
3929
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
5,594!
3930
      pColData->nData -= TYPE_BYTES[pColData->type];
4,475✔
3931
    }
3932
    if (pColData->numOfNone) {
5,594✔
3933
      return tColDataAppendValue50(pColData, pData, nData);
2,000✔
3934
    } else {
3935
      pColData->flag = HAS_VALUE;
3,594✔
3936
      return tColDataAppendValue40(pColData, pData, nData);
3,596✔
3937
    }
3938
  } else if (forward) {  // VALUE ==> VALUE
25,419!
3939
    pColData->nVal--;
25,419✔
3940
    if (IS_VAR_DATA_TYPE(pColData->type)) {
25,419!
3941
      pColData->nData = pColData->aOffset[pColData->nVal];
3,629✔
3942
    } else {
3943
      pColData->nData -= TYPE_BYTES[pColData->type];
21,790✔
3944
    }
3945
    return tColDataPutValue(pColData, pData, nData);
25,436✔
3946
  }
3947
  return 0;
×
3948
}
3949
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
304✔
3950
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
304!
3951
    pColData->numOfNone--;
304✔
3952
    pColData->nVal--;
304✔
3953
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
304!
3954
      pColData->nData -= TYPE_BYTES[pColData->type];
244✔
3955
    }
3956
    if (pColData->numOfNone) {
304!
3957
      return tColDataAppendValue52(pColData, pData, nData);
×
3958
    } else {
3959
      pColData->flag = HAS_VALUE;
304!
3960
      return tColDataAppendValue42(pColData, pData, nData);
304✔
3961
    }
3962
  } else if (forward) {  // VALUE ==> NULL
×
3963
    pColData->numOfValue--;
×
3964
    pColData->nVal--;
×
3965
    if (pColData->numOfValue) {
×
3966
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3967
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3968
      } else {
3969
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3970
      }
3971
      return tColDataAppendValue52(pColData, pData, nData);
×
3972
    } else {
3973
      pColData->flag = HAS_NONE;
×
3974
      pColData->nData = 0;
×
3975
      return tColDataAppendValue12(pColData, pData, nData);
×
3976
    }
3977
  }
3978
  return 0;
×
3979
}
3980
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
33,067✔
3981
  if (forward) {
33,067!
3982
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
33,067✔
3983
      pColData->numOfNull--;
22,652✔
3984
      pColData->nVal--;
22,652✔
3985
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
22,652!
3986
        pColData->nData -= TYPE_BYTES[pColData->type];
17,956✔
3987
      }
3988
      if (pColData->numOfNull) {
22,652✔
3989
        return tColDataAppendValue60(pColData, pData, nData);
2,628✔
3990
      } else {
3991
        pColData->flag = HAS_VALUE;
20,024✔
3992
        return tColDataAppendValue40(pColData, pData, nData);
20,025✔
3993
      }
3994
    } else {  // VALUE ==> VALUE
3995
      pColData->nVal--;
10,415✔
3996
      if (IS_VAR_DATA_TYPE(pColData->type)) {
10,415!
3997
        pColData->nData = pColData->aOffset[pColData->nVal];
2,358✔
3998
      } else {
3999
        pColData->nData -= TYPE_BYTES[pColData->type];
8,057✔
4000
      }
4001
      return tColDataPutValue(pColData, pData, nData);
10,417✔
4002
    }
4003
  }
4004
  return 0;
×
4005
}
4006
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24,503✔
4007
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
24,503!
4008
    pColData->numOfValue--;
10,099✔
4009
    pColData->nVal--;
10,099✔
4010
    if (pColData->numOfValue) {
10,099!
4011
      if (IS_VAR_DATA_TYPE(pColData->type)) {
10,099!
4012
        pColData->nData = pColData->aOffset[pColData->nVal];
2,201✔
4013
      } else {
4014
        pColData->nData -= TYPE_BYTES[pColData->type];
7,898✔
4015
      }
4016
      return tColDataAppendValue62(pColData, pData, nData);
10,100✔
4017
    } else {
4018
      pColData->flag = HAS_NULL;
×
4019
      pColData->nData = 0;
×
4020
      return tColDataAppendValue20(pColData, pData, nData);
×
4021
    }
4022
  }
4023
  return 0;
14,404✔
4024
}
4025
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
409✔
4026
  int32_t code = 0;
409✔
4027

4028
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
409✔
4029
  if (bv == 0) {  // NONE ==> VALUE
409✔
4030
    pColData->numOfNone--;
400✔
4031
    pColData->nVal--;
400✔
4032
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
400!
4033
      pColData->nData -= TYPE_BYTES[pColData->type];
320✔
4034
    }
4035
    if (pColData->numOfNone) {
400!
4036
      return tColDataAppendValue70(pColData, pData, nData);
×
4037
    } else {
4038
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
21,200✔
4039
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
20,800✔
4040
      }
4041
      pColData->flag = (HAS_VALUE | HAS_NULL);
400!
4042
      return tColDataAppendValue60(pColData, pData, nData);
400✔
4043
    }
4044
  } else if (bv == 1) {  // NULL ==> VALUE
9✔
4045
    if (forward) {
1!
4046
      pColData->numOfNull--;
1✔
4047
      pColData->nVal--;
1✔
4048
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
1!
4049
        pColData->nData -= TYPE_BYTES[pColData->type];
1✔
4050
      }
4051
      if (pColData->numOfNull) {
1!
4052
        return tColDataAppendValue70(pColData, pData, nData);
×
4053
      } else {
4054
        for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
3✔
4055
          SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0);
2✔
4056
        }
4057
        pColData->flag = (HAS_VALUE | HAS_NONE);
1!
4058
        return tColDataAppendValue50(pColData, pData, nData);
1✔
4059
      }
4060
    }
4061
  } else if (bv == 2) {  // VALUE ==> VALUE
8!
4062
    if (forward) {
8!
4063
      pColData->nVal--;
8✔
4064
      if (IS_VAR_DATA_TYPE(pColData->type)) {
8!
4065
        pColData->nData = pColData->aOffset[pColData->nVal];
×
4066
      } else {
4067
        pColData->nData -= TYPE_BYTES[pColData->type];
8✔
4068
      }
4069
      return tColDataPutValue(pColData, pData, nData);
8✔
4070
    }
4071
  } else {
4072
    return TSDB_CODE_INVALID_PARA;
×
4073
  }
4074
  return 0;
×
4075
}
4076
static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,595✔
4077
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
3,595✔
4078
  if (bv == 0) {  // NONE ==> NULL
3,595!
4079
    pColData->numOfNone--;
3,596✔
4080
    pColData->nVal--;
3,596✔
4081
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
3,596!
4082
      pColData->nData -= TYPE_BYTES[pColData->type];
2,544✔
4083
    }
4084
    if (pColData->numOfNone) {
3,596!
4085
      return tColDataAppendValue72(pColData, pData, nData);
×
4086
    } else {
4087
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
114,291✔
4088
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
110,695✔
4089
      }
4090
      pColData->flag = (HAS_VALUE | HAS_NULL);
3,596✔
4091
      return tColDataAppendValue62(pColData, pData, nData);
3,596✔
4092
    }
4093
  } else if (bv == 2 && forward) {  // VALUE ==> NULL
×
4094
    pColData->numOfValue--;
×
4095
    pColData->nVal--;
×
4096
    if (pColData->numOfValue) {
×
4097
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
4098
        pColData->nData = pColData->aOffset[pColData->nVal];
×
4099
      } else {
4100
        pColData->nData -= TYPE_BYTES[pColData->type];
×
4101
      }
4102
      return tColDataAppendValue72(pColData, pData, nData);
×
4103
    } else {
4104
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
4105
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal));
×
4106
      }
4107
      pColData->flag = (HAS_NULL | HAS_NONE);
×
4108
      pColData->nData = 0;
×
4109
      return tColDataAppendValue32(pColData, pData, nData);
×
4110
    }
4111
  }
4112
  return 0;
×
4113
}
4114
static FORCE_INLINE int32_t tColDataUpdateNothing(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
17,378✔
4115
  return 0;
17,378✔
4116
}
4117
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) = {
4118
    {NULL, NULL, NULL},                                                     // 0
4119
    {tColDataUpdateValue10, tColDataUpdateNothing, tColDataUpdateValue12},  // HAS_NONE
4120
    {tColDataUpdateValue20, tColDataUpdateNothing, tColDataUpdateNothing},  // HAS_NULL
4121
    {tColDataUpdateValue30, tColDataUpdateNothing, tColDataUpdateValue32},  // HAS_NULL|HAS_NONE
4122
    {tColDataUpdateValue40, tColDataUpdateNothing, tColDataUpdateValue42},  // HAS_VALUE
4123
    {tColDataUpdateValue50, tColDataUpdateNothing, tColDataUpdateValue52},  // HAS_VALUE|HAS_NONE
4124
    {tColDataUpdateValue60, tColDataUpdateNothing, tColDataUpdateValue62},  // HAS_VALUE|HAS_NULL
4125
    {tColDataUpdateValue70, tColDataUpdateNothing, tColDataUpdateValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
4126

4127
    //    VALUE             NONE        NULL
4128
};
4129
int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward) {
13,418,764✔
4130
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) return TSDB_CODE_INVALID_PARA;
13,418,764!
4131
  if (!(pColData->nVal > 0)) return TSDB_CODE_INVALID_PARA;
13,421,104!
4132

4133
  if (tColDataUpdateValueImpl[pColData->flag][pColVal->flag] == NULL) return 0;
13,421,104!
4134

4135
  return tColDataUpdateValueImpl[pColData->flag][pColVal->flag](
13,421,104✔
4136
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData, forward);
13,421,104!
4137
}
4138

4139
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
127,401,389✔
4140
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
127,401,389✔
4141
}
127,401,389✔
4142
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
871,805✔
4143
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
871,805✔
4144
}
871,805✔
4145
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
11,165✔
4146
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
4147
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
11,165!
4148
    case 0:
1,016✔
4149
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,016✔
4150
      break;
1,016✔
4151
    case 1:
10,149✔
4152
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
10,149✔
4153
      break;
10,149✔
4154
    default:
×
4155
      break;
×
4156
  }
4157
}
11,165✔
4158
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
4159
  SValue value = {.type = pColData->type};
2,147,483,647✔
4160
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
4161
    if (iVal + 1 < pColData->nVal) {
346,655,674!
4162
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
362,354,973✔
4163
    } else {
4164
      value.nData = pColData->nData - pColData->aOffset[iVal];
×
4165
    }
4166
    value.pData = pColData->pData + pColData->aOffset[iVal];
346,655,674✔
4167
  } else {
4168
    valueSetDatum(&value, pColData->type, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
4169
                  tDataTypes[pColData->type].bytes);
2,147,483,647✔
4170
  }
4171
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
4172
}
288,055,360✔
4173
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
9,292,782✔
4174
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
4175
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
9,292,782!
4176
    case 0:
4,634,757✔
4177
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
4,634,757✔
4178
      break;
4,634,757✔
4179
    case 1:
4,771,540✔
4180
      tColDataGetValue4(pColData, iVal, pColVal);
4181
      break;
4,800,444✔
4182
    default:
×
4183
      break;
×
4184
  }
4185
}
9,321,686✔
4186
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
318,104,057✔
4187
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
4188
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
318,104,057!
4189
    case 0:
36,814,553✔
4190
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
36,814,553✔
4191
      break;
36,814,553✔
4192
    case 1:
281,678,900✔
4193
      tColDataGetValue4(pColData, iVal, pColVal);
4194
      break;
283,250,066✔
4195
    default:
×
4196
      break;
×
4197
  }
4198
}
319,675,223✔
4199
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
5,462✔
4200
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
4201
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
5,462!
4202
    case 0:
614✔
4203
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
614✔
4204
      break;
614✔
4205
    case 1:
29✔
4206
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
29✔
4207
      break;
29✔
4208
    case 2:
4,819!
4209
      tColDataGetValue4(pColData, iVal, pColVal);
4210
      break;
4,819✔
4211
    default:
×
4212
      break;
×
4213
  }
4214
}
5,462✔
4215
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
4216
    NULL,               // 0
4217
    tColDataGetValue1,  // HAS_NONE
4218
    tColDataGetValue2,  // HAS_NULL
4219
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
4220
    tColDataGetValue4,  // HAS_VALUE
4221
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
4222
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
4223
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
4224
};
4225
int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
4226
  if (iVal < 0 || iVal >= pColData->nVal ||
2,147,483,647!
4227
      (pColData->flag <= 0 || pColData->flag >= sizeof(tColDataGetValueImpl) / POINTER_BYTES)) {
2,147,483,647!
4228
    return TSDB_CODE_INVALID_PARA;
×
4229
  }
4230
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
4231
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
4232
}
4233

4234
uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
813,097,911✔
4235
  switch (pColData->flag) {
813,097,911!
4236
    case HAS_NONE:
×
4237
      return 0;
×
4238
    case HAS_NULL:
×
4239
      return 1;
×
4240
    case (HAS_NULL | HAS_NONE):
11,165✔
4241
      return GET_BIT1(pColData->pBitMap, iVal);
11,165✔
4242
    case HAS_VALUE:
×
4243
      return 2;
×
4244
    case (HAS_VALUE | HAS_NONE):
15,545,700✔
4245
      return (GET_BIT1(pColData->pBitMap, iVal)) ? 2 : 0;
15,545,700✔
4246
    case (HAS_VALUE | HAS_NULL):
797,563,636✔
4247
      return GET_BIT1(pColData->pBitMap, iVal) + 1;
797,563,636✔
4248
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
160,786✔
4249
      return GET_BIT2(pColData->pBitMap, iVal);
160,786✔
4250
    default:
×
4251
      return 0;
×
4252
  }
4253
}
4254

4255
int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) {
6,128✔
4256
  int32_t code = 0;
6,128✔
4257

4258
  *pColData = *pColDataFrom;
6,128✔
4259

4260
  // bitmap
4261
  switch (pColData->flag) {
6,128!
4262
    case (HAS_NULL | HAS_NONE):
105✔
4263
    case (HAS_VALUE | HAS_NONE):
4264
    case (HAS_VALUE | HAS_NULL):
4265
      pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal));
105✔
4266
      if (pColData->pBitMap == NULL) {
105!
4267
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4268
        goto _exit;
×
4269
      }
4270
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
105✔
4271
      break;
105✔
4272
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
4273
      pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
×
4274
      if (pColData->pBitMap == NULL) {
×
4275
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4276
        goto _exit;
×
4277
      }
4278
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
×
4279
      break;
×
4280
    default:
6,023✔
4281
      pColData->pBitMap = NULL;
6,023✔
4282
      break;
6,023✔
4283
  }
4284

4285
  // offset
4286
  if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) {
6,128!
4287
    pColData->aOffset = xMalloc(arg, pColData->nVal << 2);
727✔
4288
    if (pColData->aOffset == NULL) {
727!
4289
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4290
      goto _exit;
×
4291
    }
4292
    (void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
727✔
4293
  } else {
4294
    pColData->aOffset = NULL;
5,401✔
4295
  }
4296

4297
  // value
4298
  if (pColData->nData) {
6,128✔
4299
    pColData->pData = xMalloc(arg, pColData->nData);
5,958✔
4300
    if (pColData->pData == NULL) {
5,964!
4301
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4302
      goto _exit;
×
4303
    }
4304

4305
    (void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
5,964✔
4306
  } else {
4307
    pColData->pData = NULL;
170✔
4308
  }
4309

4310
_exit:
6,134✔
4311
  return code;
6,134✔
4312
}
4313

4314
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
2,998,408✔
4315
  int32_t code;
4316
  SBuffer local;
4317

4318
  if (!(colData->nVal > 0)) {
2,998,408!
4319
    return TSDB_CODE_INVALID_PARA;
×
4320
  }
4321

4322
  (*info) = (SColDataCompressInfo){
2,998,408✔
4323
      .cmprAlg = info->cmprAlg,
2,998,408✔
4324
      .columnFlag = colData->cflag,
2,998,408✔
4325
      .flag = colData->flag,
2,998,408✔
4326
      .dataType = colData->type,
2,998,408✔
4327
      .columnId = colData->cid,
2,998,408✔
4328
      .numOfData = colData->nVal,
2,998,408✔
4329
  };
4330

4331
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
2,998,408!
4332
    return 0;
14,211✔
4333
  }
4334

4335
  tBufferInit(&local);
4336
  if (assist == NULL) {
2,984,197!
4337
    assist = &local;
×
4338
  }
4339

4340
  // bitmap
4341
  if (colData->flag != HAS_VALUE) {
2,984,197✔
4342
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
330,407✔
4343
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
37,405✔
4344
    } else {
4345
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
293,002✔
4346
    }
4347

4348
    SCompressInfo cinfo = {
330,407✔
4349
        .dataType = TSDB_DATA_TYPE_TINYINT,
4350
        .cmprAlg = info->cmprAlg,
330,407✔
4351
        .originalSize = info->bitmapOriginalSize,
330,407✔
4352
    };
4353

4354
    code = tCompressDataToBuffer(colData->pBitMap, &cinfo, output, assist);
330,407✔
4355
    if (code) {
330,466!
4356
      tBufferDestroy(&local);
4357
      return code;
×
4358
    }
4359

4360
    info->bitmapCompressedSize = cinfo.compressedSize;
330,466✔
4361
  }
4362

4363
  if (colData->flag == (HAS_NONE | HAS_NULL)) {
2,984,256✔
4364
    tBufferDestroy(&local);
4365
    return 0;
10,597✔
4366
  }
4367

4368
  // offset
4369
  if (IS_VAR_DATA_TYPE(colData->type)) {
2,973,659!
4370
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
137,168✔
4371

4372
    SCompressInfo cinfo = {
137,168✔
4373
        .dataType = TSDB_DATA_TYPE_INT,
4374
        .cmprAlg = info->cmprAlg,
137,168✔
4375
        .originalSize = info->offsetOriginalSize,
137,168✔
4376
    };
4377

4378
    code = tCompressDataToBuffer(colData->aOffset, &cinfo, output, assist);
137,168✔
4379
    if (code) {
137,026!
4380
      tBufferDestroy(&local);
4381
      return code;
×
4382
    }
4383

4384
    info->offsetCompressedSize = cinfo.compressedSize;
137,026✔
4385
  }
4386

4387
  // data
4388
  if (colData->nData > 0) {
2,973,517!
4389
    info->dataOriginalSize = colData->nData;
2,973,571✔
4390

4391
    SCompressInfo cinfo = {
2,973,571✔
4392
        .dataType = colData->type,
2,973,571✔
4393
        .cmprAlg = info->cmprAlg,
2,973,571✔
4394
        .originalSize = info->dataOriginalSize,
2,973,571✔
4395
    };
4396

4397
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
2,973,571✔
4398
    if (code) {
2,973,923!
4399
      tBufferDestroy(&local);
4400
      return code;
×
4401
    }
4402

4403
    info->dataCompressedSize = cinfo.compressedSize;
2,973,923✔
4404
  }
4405

4406
  tBufferDestroy(&local);
4407
  return 0;
2,973,869✔
4408
}
4409

4410
int32_t tColDataDecompress(void *input, SColDataCompressInfo *info, SColData *colData, SBuffer *assist) {
33,829,631✔
4411
  int32_t  code;
4412
  SBuffer  local;
4413
  uint8_t *data = (uint8_t *)input;
33,829,631✔
4414

4415
  tBufferInit(&local);
4416
  if (assist == NULL) {
33,829,631!
4417
    assist = &local;
×
4418
  }
4419

4420
  tColDataClear(colData);
33,829,631✔
4421
  colData->cid = info->columnId;
33,828,377✔
4422
  colData->type = info->dataType;
33,828,377✔
4423
  colData->cflag = info->columnFlag;
33,828,377✔
4424
  colData->nVal = info->numOfData;
33,828,377✔
4425
  colData->flag = info->flag;
33,828,377✔
4426

4427
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
33,828,377✔
4428
    goto _exit;
3,903,256✔
4429
  }
4430

4431
  // bitmap
4432
  if (info->bitmapOriginalSize > 0) {
29,925,121✔
4433
    SCompressInfo cinfo = {
1,118,560✔
4434
        .dataType = TSDB_DATA_TYPE_TINYINT,
4435
        .cmprAlg = info->cmprAlg,
1,118,560✔
4436
        .originalSize = info->bitmapOriginalSize,
1,118,560✔
4437
        .compressedSize = info->bitmapCompressedSize,
1,118,560✔
4438
    };
4439

4440
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
1,118,560!
4441
    if (code) {
1,118,237!
4442
      tBufferDestroy(&local);
4443
      return code;
×
4444
    }
4445

4446
    code = tDecompressData(data, &cinfo, colData->pBitMap, cinfo.originalSize, assist);
1,118,237✔
4447
    if (code) {
1,118,427!
4448
      tBufferDestroy(&local);
4449
      return code;
×
4450
    }
4451

4452
    data += cinfo.compressedSize;
1,118,427✔
4453
  }
4454

4455
  if (info->flag == (HAS_NONE | HAS_NULL)) {
29,924,988✔
4456
    goto _exit;
603✔
4457
  }
4458

4459
  // offset
4460
  if (info->offsetOriginalSize > 0) {
29,924,385✔
4461
    SCompressInfo cinfo = {
5,042,068✔
4462
        .cmprAlg = info->cmprAlg,
5,042,068✔
4463
        .dataType = TSDB_DATA_TYPE_INT,
4464
        .originalSize = info->offsetOriginalSize,
5,042,068✔
4465
        .compressedSize = info->offsetCompressedSize,
5,042,068✔
4466
    };
4467

4468
    code = tRealloc((uint8_t **)&colData->aOffset, cinfo.originalSize);
5,042,068!
4469
    if (code) {
5,042,179!
4470
      tBufferDestroy(&local);
4471
      return code;
×
4472
    }
4473

4474
    code = tDecompressData(data, &cinfo, colData->aOffset, cinfo.originalSize, assist);
5,042,179✔
4475
    if (code) {
5,042,068!
4476
      tBufferDestroy(&local);
4477
      return code;
×
4478
    }
4479

4480
    data += cinfo.compressedSize;
5,042,068✔
4481
  }
4482

4483
  // data
4484
  if (info->dataOriginalSize > 0) {
29,924,385✔
4485
    colData->nData = info->dataOriginalSize;
29,922,909✔
4486

4487
    SCompressInfo cinfo = {
29,922,909✔
4488
        .cmprAlg = info->cmprAlg,
29,922,909✔
4489
        .dataType = colData->type,
29,922,909✔
4490
        .originalSize = info->dataOriginalSize,
29,922,909✔
4491
        .compressedSize = info->dataCompressedSize,
29,922,909✔
4492
    };
4493

4494
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
29,922,909!
4495
    if (code) {
29,923,150!
4496
      tBufferDestroy(&local);
4497
      return code;
×
4498
    }
4499

4500
    code = tDecompressData(data, &cinfo, colData->pData, cinfo.originalSize, assist);
29,923,150✔
4501
    if (code) {
29,923,134!
4502
      tBufferDestroy(&local);
4503
      return code;
×
4504
    }
4505

4506
    data += cinfo.compressedSize;
29,923,134✔
4507
  }
4508

4509
_exit:
1,476✔
4510
  switch (colData->flag) {
33,828,469✔
4511
    case HAS_NONE:
3,578,395✔
4512
      colData->numOfNone = colData->nVal;
3,578,395✔
4513
      break;
3,578,395✔
4514
    case HAS_NULL:
328,406✔
4515
      colData->numOfNull = colData->nVal;
328,406✔
4516
      break;
328,406✔
4517
    case HAS_VALUE:
28,804,648✔
4518
      colData->numOfValue = colData->nVal;
28,804,648✔
4519
      break;
28,804,648✔
4520
    default:
1,117,020✔
4521
      for (int32_t i = 0; i < colData->nVal; i++) {
468,783,784✔
4522
        uint8_t bitValue = tColDataGetBitValue(colData, i);
467,667,912✔
4523
        if (bitValue == 0) {
467,666,764✔
4524
          colData->numOfNone++;
4,838,297✔
4525
        } else if (bitValue == 1) {
462,828,467✔
4526
          colData->numOfNull++;
80,767,644✔
4527
        } else {
4528
          colData->numOfValue++;
382,060,823✔
4529
        }
4530
      }
4531
  }
4532
  tBufferDestroy(&local);
4533
  return 0;
33,827,321✔
4534
}
4535

4536
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
543✔
4537
                                    char *data) {
4538
  int32_t code = 0;
543✔
4539
  if (data == NULL) {
543✔
4540
    if (pColData->cflag & COL_IS_KEY) {
13!
4541
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4542
    } else {
4543
      for (int32_t i = 0; i < nRows; ++i) {
28✔
4544
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
15✔
4545
      }
4546
    }
4547
    goto _exit;
13✔
4548
  }
4549

4550
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
530!
4551
    if (!IS_STR_DATA_BLOB(type)) {
92!
4552
      for (int32_t i = 0; i < nRows; ++i) {
265✔
4553
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
173✔
4554
        if (offset == -1) {
173!
4555
          if (pColData->cflag & COL_IS_KEY) {
×
4556
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4557
            goto _exit;
×
4558
          }
4559
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4560
            goto _exit;
×
4561
          }
4562
        } else {
4563
          if (varDataTLen(data + offset) > bytes) {
173!
4564
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
4565
                   bytes);
4566
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4567
            goto _exit;
×
4568
          }
4569
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
173✔
4570
                                                                        varDataLen(data + offset));
173✔
4571
        }
4572
      }
4573
    } else {
4574
      for (int32_t i = 0; i < nRows; ++i) {
×
4575
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
×
4576
        if (offset == -1) {
×
4577
          if (pColData->cflag & COL_IS_KEY) {
×
4578
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4579
            goto _exit;
×
4580
          }
4581
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4582
            goto _exit;
×
4583
          }
4584
        } else {
4585
          if (blobDataTLen(data + offset) > TSDB_MAX_BLOB_LEN) {
×
4586
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d",
×
4587
                   (int)blobDataTLen(data + offset), bytes);
4588
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4589
            goto _exit;
×
4590
          }
4591
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)blobDataVal(data + offset),
×
4592
                                                                        blobDataLen(data + offset));
×
4593
        }
4594
      }
4595
    }
4596
  } else {  // fixed-length data type
4597
    bool allValue = true;
438✔
4598
    bool allNull = true;
438✔
4599
    for (int32_t i = 0; i < nRows; ++i) {
1,250✔
4600
      if (!BMIsNull(lengthOrbitmap, i)) {
812✔
4601
        allNull = false;
599✔
4602
      } else {
4603
        allValue = false;
213✔
4604
      }
4605
    }
4606
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
438!
4607
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4608
      goto _exit;
×
4609
    }
4610

4611
    if (allValue) {
438✔
4612
      // optimize (todo)
4613
      for (int32_t i = 0; i < nRows; ++i) {
929✔
4614
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
585✔
4615
      }
4616
    } else if (allNull) {
94✔
4617
      // optimize (todo)
4618
      for (int32_t i = 0; i < nRows; ++i) {
249✔
4619
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
165✔
4620
        if (code) goto _exit;
165!
4621
      }
4622
    } else {
4623
      for (int32_t i = 0; i < nRows; ++i) {
72✔
4624
        if (BMIsNull(lengthOrbitmap, i)) {
62✔
4625
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
48✔
4626
          if (code) goto _exit;
48!
4627
        } else {
4628
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
14✔
4629
        }
4630
      }
4631
    }
4632
  }
4633

4634
_exit:
10✔
4635
  return code;
543✔
4636
}
4637

4638
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
1,815,120✔
4639
                               checkWKBGeometryFn cgeos) {
4640
  int32_t code = 0;
1,815,120✔
4641

4642
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
1,815,120!
4643
    if (!(pColData->type == pBind->buffer_type)) {
1,814,443!
4644
      return TSDB_CODE_INVALID_PARA;
×
4645
    }
4646
  }
4647

4648
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
1,815,120!
4649
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
32,485✔
4650
      code = igeos();
3✔
4651
      if (code) {
3!
4652
        return code;
×
4653
      }
4654
    }
4655
    for (int32_t i = 0; i < pBind->num; ++i) {
90,975✔
4656
      if (pBind->is_null && pBind->is_null[i]) {
58,674✔
4657
        if (pColData->cflag & COL_IS_KEY) {
615!
4658
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4659
          goto _exit;
×
4660
        }
4661
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
615✔
4662
        if (code) goto _exit;
616!
4663
      } else if (pBind->length[i] > buffMaxLen) {
58,059!
4664
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4665
      } else {
4666
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
58,059✔
4667
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
5✔
4668
          if (code) {
5✔
4669
            uError("stmt col[%d] bind geometry wrong format", i);
1!
4670
            goto _exit;
1✔
4671
          }
4672
        }
4673
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
58,058✔
4674
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
58,058✔
4675
      }
4676
    }
4677
  } else {  // fixed-length data type
4678
    bool allValue;
4679
    bool allNull;
4680
    if (pBind->is_null) {
1,782,635✔
4681
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
20,406✔
4682
      allNull = (same && pBind->is_null[0] != 0);
20,406!
4683
      allValue = (same && pBind->is_null[0] == 0);
20,406!
4684
    } else {
4685
      allNull = false;
1,762,229✔
4686
      allValue = true;
1,762,229✔
4687
    }
4688

4689
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
1,782,635!
4690
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4691
      goto _exit;
×
4692
    }
4693

4694
    if (allValue) {
1,782,635✔
4695
      // optimize (todo)
4696
      for (int32_t i = 0; i < pBind->num; ++i) {
23,619,897✔
4697
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
22,008,698✔
4698
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
22,008,698✔
4699
      }
4700
    } else if (allNull) {
41,985✔
4701
      // optimize (todo)
4702
      for (int32_t i = 0; i < pBind->num; ++i) {
124✔
4703
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
62✔
4704
        if (code) goto _exit;
62!
4705
      }
4706
    } else {
4707
      for (int32_t i = 0; i < pBind->num; ++i) {
41,923!
4708
        if (pBind->is_null[i]) {
×
4709
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4710
          if (code) goto _exit;
×
4711
        } else {
4712
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
×
4713
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
×
4714
        }
4715
      }
4716
    }
4717
  }
4718

4719
_exit:
41,923✔
4720
  return code;
1,685,486✔
4721
}
4722

4723
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen) {
343✔
4724
  int32_t code = 0;
343✔
4725

4726
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
343!
4727
    if (!(pColData->type == pBind->buffer_type)) {
343!
4728
      return TSDB_CODE_INVALID_PARA;
×
4729
    }
4730
  }
4731

4732
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
472!
4733
    uint8_t *buf = pBind->buffer;
129✔
4734
    for (int32_t i = 0; i < pBind->num; ++i) {
501✔
4735
      if (pBind->is_null && pBind->is_null[i]) {
372✔
4736
        if (pColData->cflag & COL_IS_KEY) {
1!
4737
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4738
          goto _exit;
×
4739
        }
4740
        if (pBind->is_null[i] == 1) {
1!
4741
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
1✔
4742
          if (code) goto _exit;
1!
4743
        } else {
4744
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4745
          if (code) goto _exit;
×
4746
        }
4747
      } else if (pBind->length[i] > buffMaxLen) {
371!
4748
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4749
      } else {
4750
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
371✔
4751
        buf += pBind->length[i];
371✔
4752
      }
4753
    }
4754
  } else {  // fixed-length data type
4755
    bool allValue;
4756
    bool allNull;
4757
    bool allNone;
4758
    if (pBind->is_null) {
214✔
4759
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
1✔
4760
      allNull = (same && pBind->is_null[0] == 1);
1!
4761
      allNone = (same && pBind->is_null[0] > 1);
1!
4762
      allValue = (same && pBind->is_null[0] == 0);
1!
4763
    } else {
4764
      allNull = false;
213✔
4765
      allNone = false;
213✔
4766
      allValue = true;
213✔
4767
    }
4768

4769
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
214!
4770
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4771
      goto _exit;
×
4772
    }
4773

4774
    uint8_t *buf = pBind->buffer;
214✔
4775

4776
    if (allValue) {
214!
4777
      // optimize (todo)
4778
      for (int32_t i = 0; i < pBind->num; ++i) {
665✔
4779
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
451✔
4780
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
451!
4781
          *val = 1;
1✔
4782
        }
4783
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
451✔
4784
      }
4785
    } else if (allNull) {
×
4786
      // optimize (todo)
4787
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4788
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4789
        if (code) goto _exit;
×
4790
      }
4791
    } else if (allNone) {
×
4792
      // optimize (todo)
4793
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4794
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4795
        if (code) goto _exit;
×
4796
      }
4797
    } else {
4798
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4799
        if (pBind->is_null[i]) {
×
4800
          if (pBind->is_null[i] == 1) {
×
4801
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4802
            if (code) goto _exit;
×
4803
          } else {
4804
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4805
            if (code) goto _exit;
×
4806
          }
4807
        } else {
4808
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
4809
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
4810
            *val = 1;
×
4811
          }
4812

4813
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
4814
        }
4815
      }
4816
    }
4817
  }
4818

4819
_exit:
×
4820
  return code;
343✔
4821
}
4822

4823
int32_t tColDataAddValueByBind2WithGeos(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
15✔
4824
                                        initGeosFn igeos, checkWKBGeometryFn cgeos) {
4825
  int32_t code = 0;
15✔
4826

4827
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
15!
4828
    if (!(pColData->type == pBind->buffer_type)) {
15!
4829
      return TSDB_CODE_INVALID_PARA;
×
4830
    }
4831
  }
4832

4833
  if (pColData->type != TSDB_DATA_TYPE_GEOMETRY) {
15!
4834
    return TSDB_CODE_INVALID_OPTION;
×
4835
  }
4836

4837
  code = igeos();
15✔
4838
  if (code) {
15!
4839
    return code;
×
4840
  }
4841

4842
  uint8_t *buf = pBind->buffer;
15✔
4843
  for (int32_t i = 0; i < pBind->num; ++i) {
36✔
4844
    if (pBind->is_null && pBind->is_null[i]) {
21✔
4845
      if (pColData->cflag & COL_IS_KEY) {
2!
4846
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4847
        goto _exit;
×
4848
      }
4849
      if (pBind->is_null[i] == 1) {
2!
4850
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2✔
4851
        if (code) goto _exit;
2!
4852
      } else {
4853
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4854
        if (code) goto _exit;
×
4855
      }
4856
    } else if (pBind->length[i] > buffMaxLen) {
19!
4857
      return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4858
    } else {
4859
      code = cgeos(buf, pBind->length[i]);
19✔
4860
      if (code) {
19!
4861
        uError("stmt2 col[%d] bind geometry with wrong format", i);
×
4862
        goto _exit;
×
4863
      }
4864
      code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
19✔
4865
      buf += pBind->length[i];
19✔
4866
    }
4867
  }
4868

4869
_exit:
15✔
4870
  return code;
15✔
4871
}
4872

4873
int32_t tColDataAddValueByBind2WithBlob(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
×
4874
                                        SBlobSet *pBlobSet) {
4875
  int32_t code = 0;
×
4876

4877
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
×
4878
    if (!(pColData->type == pBind->buffer_type)) {
×
4879
      return TSDB_CODE_INVALID_PARA;
×
4880
    }
4881
  }
4882

4883
  if (IS_STR_DATA_BLOB(pColData->type)) {  // var-length data type
×
4884
    uint8_t *buf = pBind->buffer;
×
4885
    for (int32_t i = 0; i < pBind->num; ++i) {
×
4886
      if (pBind->is_null && pBind->is_null[i]) {
×
4887
        if (pColData->cflag & COL_IS_KEY) {
×
4888
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4889
          goto _exit;
×
4890
        }
4891
        if (pBind->is_null[i] == 1) {
×
4892
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NULL](pBlobSet, pColData, NULL, 0);
×
4893
          if (code) goto _exit;
×
4894
        } else {
4895
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NONE](pBlobSet, pColData, NULL, 0);
×
4896
          if (code) goto _exit;
×
4897
        }
4898
      } else if (pBind->length[i] > buffMaxLen) {
×
4899
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4900
      } else {
4901
        code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_VALUE](pBlobSet, pColData, buf, pBind->length[i]);
×
4902
        buf += pBind->length[i];
×
4903
      }
4904
    }
4905
  }
4906
_exit:
×
4907
  return code;
×
4908
}
4909

4910
int32_t tColDataAddValueByBind2WithDecimal(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
8✔
4911
                                           uint8_t precision, uint8_t scale) {
4912
  int32_t code = 0;
8✔
4913

4914
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
8!
4915
    if (!(pColData->type == pBind->buffer_type)) {
6!
4916
      return TSDB_CODE_INVALID_PARA;
×
4917
    }
4918
  }
4919

4920
  if (!IS_DECIMAL_TYPE(pColData->type)) {
8!
4921
    return TSDB_CODE_INVALID_OPTION;
×
4922
  }
4923

4924
  uint8_t *buf = pBind->buffer;
8✔
4925
  for (int32_t i = 0; i < pBind->num; ++i) {
22✔
4926
    if (pBind->is_null && pBind->is_null[i]) {
14!
4927
      if (pColData->cflag & COL_IS_KEY) {
2!
4928
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4929
        goto _exit;
×
4930
      }
4931
      if (pBind->is_null[i] == 1) {
2!
4932
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4933
        if (code) goto _exit;
×
4934
      } else {
4935
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
2✔
4936
        if (code) goto _exit;
2!
4937
      }
4938
    } else {
4939
      if (pColData->type == TSDB_DATA_TYPE_DECIMAL64) {
12✔
4940
        Decimal64 dec = {0};
6✔
4941
        int32_t   code = decimal64FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
6✔
4942
        buf += pBind->length[i];
6✔
4943
        if (TSDB_CODE_SUCCESS != code) {
6!
4944
          return code;
×
4945
        }
4946
        int64_t tmp = DECIMAL64_GET_VALUE(&dec);
6✔
4947
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)&tmp,
6✔
4948
                                                                      TYPE_BYTES[pColData->type]);
6✔
4949
      } else if (pColData->type == TSDB_DATA_TYPE_DECIMAL) {
6!
4950
        Decimal128 dec = {0};
6✔
4951
        int32_t    code = decimal128FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
6✔
4952
        buf += pBind->length[i];
6✔
4953
        if (TSDB_CODE_SUCCESS != code) {
6!
4954
          return code;
×
4955
        }
4956
        uint8_t *pV = taosMemCalloc(1, sizeof(Decimal128));
6✔
4957
        if (!pV) return terrno;
6!
4958
        memcpy(pV, &dec, DECIMAL_WORD_NUM(Decimal128) * sizeof(DecimalWord));
6✔
4959
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pV, TYPE_BYTES[pColData->type]);
6✔
4960
      }
4961
    }
4962
  }
4963

4964
_exit:
8✔
4965
  return code;
8✔
4966
}
4967
/* build rows to `rowArray` from bind
4968
 * `infos` is the bind information array
4969
 * `numOfInfos` is the number of bind information
4970
 * `infoSorted` is whether the bind information is sorted by column id
4971
 * `pTSchema` is the schema of the table
4972
 * `rowArray` is the array to store the rows
4973
 * `pOrdered` is the pointer to store ordered
4974
 * `pDupTs` is the pointer to store duplicateTs
4975
 */
4976
int32_t tRowBuildFromBind2(SBindInfo2 *infos, int32_t numOfInfos, SSHashObj *parsedCols, bool infoSorted,
7,511✔
4977
                           const STSchema *pTSchema, const SSchemaExt *pSchemaExt, SArray *rowArray, bool *pOrdered,
4978
                           bool *pDupTs) {
4979
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
7,511!
4980
    return TSDB_CODE_INVALID_PARA;
×
4981
  }
4982
  int8_t hasBlob = schemaHasBlob(pTSchema);
7,513✔
4983
  if (!infoSorted) {
7,514✔
4984
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
7✔
4985
  }
4986

4987
  int32_t code = 0;
7,514✔
4988
  int32_t numOfRows = infos[0].bind->num;
7,514✔
4989
  SArray *colValArray, *bufArray;
4990
  SColVal colVal;
4991
  int32_t numOfFixedValue = 0;
7,514✔
4992
  int32_t lino = 0;
7,514✔
4993

4994
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
7,514!
4995
    return terrno;
×
4996
  }
4997
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
7,516!
4998
    taosArrayDestroy(colValArray);
×
4999
    return terrno;
×
5000
  }
5001
  for (int i = 0; i < numOfInfos; ++i) {
117,514✔
5002
    if (parsedCols) {
110,016✔
5003
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
132✔
5004
      if (pParsedVal) {
132✔
5005
        continue;
24✔
5006
      }
5007
    }
5008
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
219,971!
5009
      taosArrayDestroy(colValArray);
×
5010
      taosArrayDestroy(bufArray);
×
5011
      return terrno;
×
5012
    }
5013
  }
5014

5015
  SRowKey rowKey, lastRowKey;
5016
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
254,401✔
5017
    taosArrayClear(colValArray);
249,990✔
5018

5019
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
1,390,849✔
5020
      if (parsedCols) {
1,117,355✔
5021
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
132✔
5022
        if (pParsedVal) {
132!
5023
          numOfFixedValue++;
×
5024
          colVal = *pParsedVal;
×
5025

5026
          if (taosArrayPush(colValArray, &colVal) == NULL) {
24!
5027
            if (IS_VAR_DATA_TYPE(pParsedVal->value.type)) {
×
5028
              taosMemoryFree(colVal.value.pData);
×
5029
            }
5030
            code = terrno;
×
5031
            TAOS_CHECK_GOTO(code, &lino, _exit);
2!
5032
          }
5033
          continue;
24✔
5034
        }
5035
      }
5036

5037
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
1,122,915✔
5038
        if (infos[iInfo].bind->is_null[iRow] == 1) {
5✔
5039
          if (iInfo == 0) {
3✔
5040
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
1✔
5041
            TAOS_CHECK_GOTO(code, &lino, _exit);
1!
5042
          }
5043
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
2✔
5044
        } else {
5045
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
2✔
5046
        }
5047
      } else {
5048
        SValue value = {
1,122,910✔
5049
            .type = infos[iInfo].type,
1,122,910✔
5050
        };
5051
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
1,122,910!
5052
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
85,890!
5053
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5054
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5055
            value.nData = length;
×
5056
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
5057
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5058
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum lenght: %d", iInfo, iRow,
×
5059
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
5060
              goto _exit;
1✔
5061
            }
5062
            value.pData = *data;
×
5063
            *data += length;
×
5064
          } else {
5065
            int32_t   length = infos[iInfo].bind->length[iRow];
85,890✔
5066
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
85,890✔
5067
            value.nData = length;
85,890✔
5068
            if (value.nData > infos[iInfo].bytes - VARSTR_HEADER_SIZE) {
85,890!
5069
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5070
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum lenght: %d", iInfo, iRow,
×
5071
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
5072
              goto _exit;
×
5073
            }
5074
            value.pData = *data;
85,890✔
5075
            *data += length;
85,890✔
5076
          }
5077
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5078
        } else {
5079
          if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL) {
1,037,020✔
5080
            if (!pSchemaExt) {
4!
5081
              uError("stmt2 decimal64 type without ext schema info, cannot parse decimal values");
×
5082
              code = TSDB_CODE_PAR_INTERNAL_ERROR;
×
5083
              goto _exit;
×
5084
            }
5085
            uint8_t precision = 0, scale = 0;
4✔
5086
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
4✔
5087
            Decimal128 dec = {0};
4✔
5088
            uint8_t  **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
4✔
5089
            int32_t    length = infos[iInfo].bind->length[iRow];
4✔
5090
            code = decimal128FromStr(*(char **)data, length, precision, scale, &dec);
4✔
5091
            *data += length;
4✔
5092
            TAOS_CHECK_GOTO(code, &lino, _exit);
4!
5093

5094
            // precision check
5095
            // scale auto fit
5096

5097
            code = decimal128ToDataVal(&dec, &value);
4✔
5098
            TAOS_CHECK_GOTO(code, &lino, _exit);
4!
5099

5100
          } else if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL64) {
1,037,016✔
5101
            if (!pSchemaExt) {
5!
5102
              uError("stmt2 decimal128 type without ext schema info, cannot parse decimal values");
×
5103
              code = TSDB_CODE_PAR_INTERNAL_ERROR;
×
5104
              goto _exit;
1✔
5105
            }
5106
            uint8_t precision = 0, scale = 0;
5✔
5107
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
5✔
5108
            Decimal64 dec = {0};
5✔
5109
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
5✔
5110
            int32_t   length = infos[iInfo].bind->length[iRow];
5✔
5111
            code = decimal64FromStr(*(char **)data, length, precision, scale, &dec);
5✔
5112
            *data += length;
5✔
5113
            TAOS_CHECK_GOTO(code, &lino, _exit);
5✔
5114

5115
            code = decimal64ToDataVal(&dec, &value);
4✔
5116
            TAOS_CHECK_GOTO(code, &lino, _exit);
4!
5117

5118
          } else {
5119
            uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
1,037,011✔
5120
            if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
1,037,011✔
5121
              *val = 1;
1✔
5122
            }
5123
            valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
1,037,011✔
5124
          }
5125
        }
5126
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
1,136,862✔
5127
      }
5128
      if (taosArrayPush(colValArray, &colVal) == NULL) {
1,141,066!
5129
        code = terrno;
×
5130
        goto _exit;
×
5131
      }
5132
    }
5133

5134
    SRow *row;
5135

5136
    if (hasBlob == 0) {
273,494✔
5137
      SRowBuildScanInfo sinfo = {0};
247,793✔
5138
      code = tRowBuild(colValArray, pTSchema, &row, &sinfo);
247,793✔
5139
      TAOS_CHECK_GOTO(code, &lino, _exit);
248,887!
5140
    } else {
5141
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
25,701✔
5142
      code = tRowBuildWithBlob(colValArray, pTSchema, &row, NULL, &sinfo);
25,701✔
5143
      TAOS_CHECK_GOTO(code, &lino, _exit);
×
5144
    }
5145

5146
    if ((taosArrayPush(rowArray, &row)) == NULL) {
246,984!
5147
      code = terrno;
×
5148
      goto _exit;
×
5149
    }
5150

5151
    if (pOrdered && pDupTs) {
246,984!
5152
      tRowGetKey(row, &rowKey);
494,836✔
5153
      if (iRow == 0) {
247,337✔
5154
        *pOrdered = true;
7,512✔
5155
        *pDupTs = false;
7,512✔
5156
      } else {
5157
        if (*pOrdered) {
239,825!
5158
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
240,111✔
5159
          *pOrdered = (res >= 0);
240,111✔
5160
          if (!*pDupTs) {
240,111!
5161
            *pDupTs = (res == 0);
240,314✔
5162
          }
5163
        }
5164
      }
5165
      lastRowKey = rowKey;
247,337✔
5166
    }
5167
  }
5168
_exit:
4,411✔
5169
  if (code != 0) {
4,413✔
5170
    uError("tRowBuildFromBind2 failed at line %d, ErrCode=0x%x", lino, code);
2!
5171
  }
5172
  taosArrayDestroy(colValArray);
4,413✔
5173
  taosArrayDestroy(bufArray);
7,515✔
5174
  return code;
7,518✔
5175
}
5176
/* build rows to `rowArray` from bind
5177
 * `infos` is the bind information array
5178
 * `numOfInfos` is the number of bind information
5179
 * `infoSorted` is whether the bind information is sorted by column id
5180
 * `pTSchema` is the schema of the table
5181
 * `rowArray` is the array to store the rows
5182
 * `pOrdered` is the pointer to store ordered
5183
 * `pDupTs` is the pointer to store duplicateTs
5184
 */
5185
int32_t tRowBuildFromBind2WithBlob(SBindInfo2 *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
×
5186
                                   SArray *rowArray, bool *pOrdered, bool *pDupTs, SBlobSet *pBlobSet) {
5187
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
×
5188
    return TSDB_CODE_INVALID_PARA;
×
5189
  }
5190
  int8_t hasBlob = schemaHasBlob(pTSchema);
×
5191
  if (!infoSorted) {
×
5192
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
5193
  }
5194

5195
  int32_t code = 0;
×
5196
  int32_t numOfRows = infos[0].bind->num;
×
5197
  SArray *colValArray, *bufArray;
5198
  SColVal colVal;
5199

5200
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
×
5201
    return terrno;
×
5202
  }
5203
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
×
5204
    taosArrayDestroy(colValArray);
×
5205
    return terrno;
×
5206
  }
5207
  for (int i = 0; i < numOfInfos; ++i) {
×
5208
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
×
5209
      taosArrayDestroy(colValArray);
×
5210
      taosArrayDestroy(bufArray);
×
5211
      return terrno;
×
5212
    }
5213
  }
5214

5215
  SRowKey rowKey, lastRowKey;
5216
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
×
5217
    taosArrayClear(colValArray);
×
5218

5219
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
×
5220
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
×
5221
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
5222
          if (iInfo == 0) {
×
5223
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5224
            goto _exit;
×
5225
          }
5226
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
5227
        } else {
5228
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
5229
        }
5230
      } else {
5231
        SValue value = {
×
5232
            .type = infos[iInfo].type,
×
5233
        };
5234
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
×
5235
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
×
5236
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5237
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
5238
            value.nData = length;
×
5239
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
5240
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5241
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5242
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5243
              goto _exit;
×
5244
            }
5245
            value.pData = *data;
×
5246
            *data += length;
×
5247
          } else {
5248
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5249
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
5250
            value.nData = length;
×
5251
            if (value.nData > pTSchema->columns[infos[iInfo].columnId - 1].bytes - VARSTR_HEADER_SIZE) {
×
5252
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5253
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5254
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5255
              goto _exit;
×
5256
            }
5257
            value.pData = *data;
×
5258
            *data += length;
×
5259
          }
5260

5261
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5262
        } else {
5263
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
×
5264
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
×
5265
            *val = 1;
×
5266
          }
5267
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
×
5268
        }
5269
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
×
5270
      }
5271
      if (taosArrayPush(colValArray, &colVal) == NULL) {
×
5272
        code = terrno;
×
5273
        goto _exit;
×
5274
      }
5275
    }
5276

5277
    SRow *row;
5278

5279
    if (hasBlob == 0) {
×
5280
      SRowBuildScanInfo sinfo = {0};
×
5281
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
×
5282
        goto _exit;
×
5283
      }
5284
    } else {
5285
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
×
5286
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, pBlobSet, &sinfo))) {
×
5287
        goto _exit;
×
5288
      }
5289
    }
5290

5291
    if ((taosArrayPush(rowArray, &row)) == NULL) {
×
5292
      code = terrno;
×
5293
      goto _exit;
×
5294
    }
5295

5296
    if (pOrdered && pDupTs) {
×
5297
      tRowGetKey(row, &rowKey);
×
5298
      if (iRow == 0) {
×
5299
        *pOrdered = true;
×
5300
        *pDupTs = false;
×
5301
      } else {
5302
        if (*pOrdered) {
×
5303
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
×
5304
          *pOrdered = (res >= 0);
×
5305
          if (!*pDupTs) {
×
5306
            *pDupTs = (res == 0);
×
5307
          }
5308
        }
5309
      }
5310
      lastRowKey = rowKey;
×
5311
    }
5312
  }
5313
_exit:
×
5314
  taosArrayDestroy(colValArray);
×
5315
  taosArrayDestroy(bufArray);
×
5316
  return code;
×
5317
}
5318

5319
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
374✔
5320
  int32_t code = TSDB_CODE_SUCCESS;
374✔
5321

5322
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
374!
5323
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
146✔
5324
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
51✔
5325
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
73✔
5326
    if (iToRow == 0) {
73✔
5327
      pToColData->aOffset[iToRow] = 0;
14✔
5328
    }
5329

5330
    if (iToRow < pToColData->nVal - 1) {
73✔
5331
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
64✔
5332
    }
5333

5334
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
73✔
5335
                 nData);
5336
  } else {
5337
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
301✔
5338
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
301✔
5339
  }
5340
  return code;
374✔
5341
}
5342

5343
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
382✔
5344
                                        int32_t iToRow) {
5345
  int32_t code = TSDB_CODE_SUCCESS;
382✔
5346
  int     bit_val = 0;
382✔
5347

5348
  switch (pFromColData->flag) {
382!
5349
    case HAS_NONE: {
×
5350
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5351
    } break;
×
5352
    case HAS_NULL: {
8✔
5353
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
8!
5354
    } break;
8✔
5355
    case (HAS_NULL | HAS_NONE): {
×
5356
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5357
      if (0 == bit_val)
×
5358
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5359
      else
5360
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
×
5361
    } break;
×
5362
    case HAS_VALUE: {
328✔
5363
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
328!
5364
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
328!
5365
    } break;
328✔
5366
    case (HAS_VALUE | HAS_NONE): {
×
5367
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5368
      if (0 == bit_val)
×
5369
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5370
      else
5371
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
×
5372
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5373
    } break;
×
5374
    case (HAS_VALUE | HAS_NULL): {
46✔
5375
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
46✔
5376
      if (0 == bit_val)
46✔
5377
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
28!
5378
      else
5379
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
18!
5380
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
46!
5381
    } break;
46✔
5382
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
5383
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
5384
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5385
    } break;
×
5386
    default:
×
5387
      return -1;
×
5388
  }
5389

5390
  return code;
382✔
5391
}
5392

5393
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
89✔
5394
                               int32_t nColData) {
5395
  int32_t code = TSDB_CODE_SUCCESS;
89✔
5396

5397
  for (int32_t i = 0; i < nColData; i++) {
471✔
5398
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
382✔
5399
    if (code != TSDB_CODE_SUCCESS) {
382!
5400
      return code;
×
5401
    }
5402
  }
5403

5404
  return code;
89✔
5405
}
5406

5407
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
89✔
5408
  int32_t code = TSDB_CODE_SUCCESS;
89✔
5409

5410
  for (int32_t i = 0; i < nColData; i++) {
471✔
5411
    SColVal cv = {0};
382✔
5412
    code = tColDataGetValue(&aFromColData[i], iFromRow, &cv);
382✔
5413
    if (code != TSDB_CODE_SUCCESS) {
382!
5414
      return code;
×
5415
    }
5416
    code = tColDataAppendValue(&aToColData[i], &cv);
382✔
5417
    if (code != TSDB_CODE_SUCCESS) {
382!
5418
      return code;
×
5419
    }
5420
  }
5421

5422
  return code;
89✔
5423
}
5424

5425
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
10,188,279✔
5426
  SColVal cv;
5427

5428
  key->ts = ((TSKEY *)aColData[0].pData)[iRow];
10,188,279✔
5429
  key->numOfPKs = 0;
10,188,279✔
5430

5431
  for (int i = 1; i < nColData; i++) {
10,188,310!
5432
    if (aColData[i].cflag & COL_IS_KEY) {
10,207,692✔
5433
      tColDataGetValue4(&aColData[i], iRow, &cv);
31✔
5434
      key->pks[key->numOfPKs++] = cv.value;
31✔
5435
    } else {
5436
      break;
10,207,661✔
5437
    }
5438
  }
5439
}
10,188,279✔
5440

5441
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
27✔
5442
  SColData *aDstColData = NULL;
27✔
5443
  int32_t   i = start, j = mid + 1, k = 0;
27✔
5444
  SRowKey   keyi, keyj;
5445

5446
  if (end > start) {
27!
5447
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
27!
5448
    if (aDstColData == NULL) {
27!
5449
      return terrno;
×
5450
    }
5451
    for (int c = 0; c < nColData; ++c) {
141✔
5452
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
114✔
5453
    }
5454
  }
5455

5456
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
27✔
5457
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
27✔
5458
  while (i <= mid && j <= end) {
76✔
5459
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
49✔
5460
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
37!
5461
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
37✔
5462
    } else {
5463
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
12!
5464
      if (j <= end) tColDataArrGetRowKey(aColData, nColData, j, &keyj);
12✔
5465
    }
5466
  }
5467

5468
  while (i <= mid) {
40✔
5469
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
13!
5470
  }
5471

5472
  while (j <= end) {
54✔
5473
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
27!
5474
  }
5475

5476
  for (i = start, k = 0; i <= end; ++i, ++k) {
116✔
5477
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
89!
5478
  }
5479

5480
  if (aDstColData) {
27!
5481
    for (int32_t i = 0; i < nColData; i++) {
141✔
5482
      tColDataDestroy(&aDstColData[i]);
114✔
5483
    }
5484
    taosMemoryFree(aDstColData);
27!
5485
  }
5486

5487
  return TSDB_CODE_SUCCESS;
27✔
5488
}
5489

5490
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
60✔
5491
  int32_t ret = TSDB_CODE_SUCCESS;
60✔
5492
  int32_t mid;
5493

5494
  if (start >= end) {
60✔
5495
    return TSDB_CODE_SUCCESS;
33✔
5496
  }
5497

5498
  mid = (start + end) / 2;
27✔
5499

5500
  ret = tColDataMergeSort(aColData, start, mid, nColData);
27✔
5501
  if (ret != TSDB_CODE_SUCCESS) {
27!
5502
    return ret;
×
5503
  }
5504

5505
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
27✔
5506
  if (ret != TSDB_CODE_SUCCESS) {
27!
5507
    return ret;
×
5508
  }
5509

5510
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
27✔
5511
}
5512

5513
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
6✔
5514
  int32_t nVal = aColData[0].nVal;
6✔
5515

5516
  if (nVal < 2) return TSDB_CODE_SUCCESS;
6!
5517

5518
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
6✔
5519
}
5520

5521
static int32_t tColDataMerge(SArray **colArr) {
4✔
5522
  int32_t code = 0;
4✔
5523
  SArray *src = *colArr;
4✔
5524
  SArray *dst = NULL;
4✔
5525

5526
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
4✔
5527
  if (dst == NULL) {
4!
5528
    return terrno;
×
5529
  }
5530

5531
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
15✔
5532
    SColData *srcCol = taosArrayGet(src, i);
11✔
5533

5534
    SColData *dstCol = taosArrayReserve(dst, 1);
11✔
5535
    if (dstCol == NULL) {
11!
5536
      code = terrno;
×
5537
      goto _exit;
×
5538
    }
5539
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
11✔
5540
  }
5541

5542
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
4✔
5543
  SRowKey lastKey;
5544
  for (int32_t i = 0; i < numRows; i++) {
16✔
5545
    SRowKey key;
5546
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
12✔
5547

5548
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
20✔
5549
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
18✔
5550
        SColData *srcCol = taosArrayGet(src, j);
13✔
5551
        SColData *dstCol = taosArrayGet(dst, j);
13✔
5552

5553
        SColVal cv;
5554
        code = tColDataGetValue(srcCol, i, &cv);
13✔
5555
        if (code != TSDB_CODE_SUCCESS) {
13!
5556
          goto _exit;
×
5557
        }
5558
        code = tColDataAppendValue(dstCol, &cv);
13✔
5559
        if (code) {
13!
5560
          goto _exit;
×
5561
        }
5562
      }
5563
      lastKey = key;
5✔
5564
    } else {  // update existing row
5565
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
24✔
5566
        SColData *srcCol = taosArrayGet(src, j);
17✔
5567
        SColData *dstCol = taosArrayGet(dst, j);
17✔
5568

5569
        SColVal cv;
5570
        code = tColDataGetValue(srcCol, i, &cv);
17✔
5571
        if (code != TSDB_CODE_SUCCESS) {
17!
5572
          goto _exit;
×
5573
        }
5574
        code = tColDataUpdateValue(dstCol, &cv, true);
17✔
5575
        if (code) {
17!
5576
          goto _exit;
×
5577
        }
5578
      }
5579
    }
5580
  }
5581

5582
_exit:
4✔
5583
  if (code) {
4!
5584
    taosArrayDestroyEx(dst, tColDataDestroy);
×
5585
  } else {
5586
    taosArrayDestroyEx(src, tColDataDestroy);
4✔
5587
    *colArr = dst;
4✔
5588
  }
5589
  return code;
4✔
5590
}
5591

5592
int32_t tColDataSortMerge(SArray **arr) {
12,190✔
5593
  SArray   *colDataArr = *arr;
12,190✔
5594
  int32_t   nColData = TARRAY_SIZE(colDataArr);
12,190✔
5595
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
12,190✔
5596

5597
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
12,190!
5598
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5599
  }
5600
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
12,190!
5601
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5602
  }
5603
  if (!(aColData[0].flag == HAS_VALUE)) {
12,190!
5604
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5605
  }
5606

5607
  if (aColData[0].nVal <= 1) goto _exit;
12,190✔
5608

5609
  int8_t doSort = 0;
12,055✔
5610
  int8_t doMerge = 0;
12,055✔
5611
  // scan -------
5612
  SRowKey lastKey;
5613
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
12,055✔
5614
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
10,123,558!
5615
    SRowKey key;
5616
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
10,204,566✔
5617

5618
    int32_t c = tRowKeyCompare(&lastKey, &key);
10,111,483✔
5619
    if (c < 0) {
10,111,483✔
5620
      lastKey = key;
10,070,842✔
5621
      continue;
10,070,842✔
5622
    } else if (c > 0) {
40,641✔
5623
      doSort = 1;
6✔
5624
      break;
6✔
5625
    } else {
5626
      doMerge = 1;
40,635✔
5627
    }
5628
  }
5629

5630
  // sort -------
5631
  if (doSort) {
×
5632
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
6!
5633
  }
5634

5635
  if ((doMerge != 1) && (doSort == 1)) {
12,089✔
5636
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
6✔
5637
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
28✔
5638
      SRowKey key;
5639
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
23✔
5640

5641
      int32_t c = tRowKeyCompare(&lastKey, &key);
23✔
5642
      if (c == 0) {
23✔
5643
        doMerge = 1;
1✔
5644
        break;
1✔
5645
      }
5646
      lastKey = key;
22✔
5647
    }
5648
  }
5649

5650
  // merge -------
5651
  if (doMerge) {
12,089✔
5652
    int32_t code = tColDataMerge(arr);
4✔
5653
    if (code) return code;
4!
5654
  }
5655

5656
_exit:
12,089✔
5657
  return 0;
12,224✔
5658
}
5659

5660
int32_t tColDataSortMergeWithBlob(SArray **arr, SBlobSet *pBlob) {
×
5661
  SArray   *colDataArr = *arr;
×
5662
  int32_t   nColData = TARRAY_SIZE(colDataArr);
×
5663
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
×
5664

5665
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
×
5666
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5667
  }
5668
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
5669
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5670
  }
5671
  if (!(aColData[0].flag == HAS_VALUE)) {
×
5672
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5673
  }
5674

5675
  if (aColData[0].nVal <= 1) goto _exit;
×
5676

5677
  int8_t doSort = 0;
×
5678
  int8_t doMerge = 0;
×
5679
  // scan -------
5680
  SRowKey lastKey;
5681
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5682
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5683
    SRowKey key;
5684
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5685

5686
    int32_t c = tRowKeyCompare(&lastKey, &key);
×
5687
    if (c < 0) {
×
5688
      lastKey = key;
×
5689
      continue;
×
5690
    } else if (c > 0) {
×
5691
      doSort = 1;
×
5692
      break;
×
5693
    } else {
5694
      doMerge = 1;
×
5695
    }
5696
  }
5697
  if (doMerge || doSort) {
×
5698
    return TSDB_CODE_BLOB_NOT_SUPPORT;
×
5699
  }
5700
  // sort -------
5701
  if (doSort) {
×
5702
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
×
5703
  }
5704

5705
  if ((doMerge != 1) && (doSort == 1)) {
×
5706
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5707
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5708
      SRowKey key;
5709
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5710

5711
      int32_t c = tRowKeyCompare(&lastKey, &key);
×
5712
      if (c == 0) {
×
5713
        doMerge = 1;
×
5714
        break;
×
5715
      }
5716
      lastKey = key;
×
5717
    }
5718
  }
5719

5720
  // merge -------
5721
  if (doMerge) {
×
5722
    int32_t code = tColDataMerge(arr);
×
5723
    if (code) return code;
×
5724
  }
5725

5726
_exit:
×
5727
  return 0;
×
5728
}
5729

5730
static int32_t tEncodeColDataVersion0(SEncoder *pEncoder, SColData *pColData) {
89,308✔
5731
  int32_t code = 0;
89,308✔
5732

5733
  if ((code = tEncodeI16v(pEncoder, pColData->cid))) return code;
178,616!
5734
  if ((code = tEncodeI8(pEncoder, pColData->type))) return code;
178,616!
5735
  if ((code = tEncodeI32v(pEncoder, pColData->nVal))) return code;
178,616!
5736
  if ((code = tEncodeI8(pEncoder, pColData->flag))) return code;
178,616!
5737

5738
  // bitmap
5739
  switch (pColData->flag) {
89,308!
5740
    case (HAS_NULL | HAS_NONE):
116✔
5741
    case (HAS_VALUE | HAS_NONE):
5742
    case (HAS_VALUE | HAS_NULL):
5743
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
116✔
5744
      if (code) return code;
116!
5745
      break;
116✔
5746
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5747
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
5748
      if (code) return code;
×
5749
      break;
×
5750
    default:
89,192✔
5751
      break;
89,192✔
5752
  }
5753

5754
  // value
5755
  if (pColData->flag & HAS_VALUE) {
89,308✔
5756
    if (IS_VAR_DATA_TYPE(pColData->type)) {
89,028!
5757
      code = tEncodeFixed(pEncoder, pColData->aOffset, pColData->nVal << 2);
1,838✔
5758
      if (code) return code;
1,838!
5759

5760
      code = tEncodeI32v(pEncoder, pColData->nData);
1,838✔
5761
      if (code) return code;
1,838!
5762

5763
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
1,838✔
5764
      if (code) return code;
1,838!
5765
    } else {
5766
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
87,190✔
5767
      if (code) return code;
87,190!
5768
    }
5769
  }
5770

5771
  return code;
89,308✔
5772
}
5773

5774
static int32_t tDecodeColDataVersion0(SDecoder *pDecoder, SColData *pColData) {
9,250✔
5775
  int32_t code = 0;
9,250✔
5776

5777
  if ((code = tDecodeI16v(pDecoder, &pColData->cid))) return code;
18,500!
5778
  if ((code = tDecodeI8(pDecoder, &pColData->type))) return code;
18,499!
5779
  if ((code = tDecodeI32v(pDecoder, &pColData->nVal))) return code;
18,497!
5780
  if ((code = tDecodeI8(pDecoder, &pColData->flag))) return code;
18,496!
5781

5782
  if (pColData->type <= 0 || pColData->type >= TSDB_DATA_TYPE_MAX || pColData->flag <= 0 || pColData->flag >= 8) {
9,248!
5783
    return TSDB_CODE_INVALID_PARA;
×
5784
  }
5785

5786
  // bitmap
5787
  switch (pColData->flag) {
9,248!
5788
    case (HAS_NULL | HAS_NONE):
129✔
5789
    case (HAS_VALUE | HAS_NONE):
5790
    case (HAS_VALUE | HAS_NULL):
5791
      code = tDecodeBinaryWithSize(pDecoder, BIT1_SIZE(pColData->nVal), &pColData->pBitMap);
129!
5792
      if (code) return code;
129!
5793
      break;
129✔
5794
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5795
      code = tDecodeBinaryWithSize(pDecoder, BIT2_SIZE(pColData->nVal), &pColData->pBitMap);
×
5796
      if (code) return code;
×
5797
      break;
×
5798
    default:
9,119✔
5799
      break;
9,119✔
5800
  }
5801

5802
  // value
5803
  if (pColData->flag & HAS_VALUE) {
9,248✔
5804
    if (IS_VAR_DATA_TYPE(pColData->type)) {
9,072!
5805
      code = tDecodeBinaryWithSize(pDecoder, pColData->nVal << 2, (uint8_t **)&pColData->aOffset);
884!
5806
      if (code) return code;
884!
5807

5808
      code = tDecodeI32v(pDecoder, &pColData->nData);
884✔
5809
      if (code) return code;
886!
5810

5811
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
886!
5812
      if (code) return code;
886!
5813
    } else {
5814
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
8,188✔
5815
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
8,188!
5816
      if (code) return code;
8,188!
5817
    }
5818
  }
5819
  pColData->cflag = 0;
9,250✔
5820

5821
  return code;
9,250✔
5822
}
5823

5824
static int32_t tEncodeColDataVersion1(SEncoder *pEncoder, SColData *pColData) {
89,323✔
5825
  int32_t code = tEncodeColDataVersion0(pEncoder, pColData);
89,323✔
5826
  if (code) return code;
89,313!
5827
  return tEncodeI8(pEncoder, pColData->cflag);
178,626✔
5828
}
5829

5830
static int32_t tDecodeColDataVersion1(SDecoder *pDecoder, SColData *pColData) {
9,246✔
5831
  int32_t code = tDecodeColDataVersion0(pDecoder, pColData);
9,246✔
5832
  if (code) return code;
9,249!
5833

5834
  code = tDecodeI8(pDecoder, &pColData->cflag);
9,249✔
5835
  return code;
9,250✔
5836
}
5837

5838
int32_t tEncodeColData(uint8_t version, SEncoder *pEncoder, SColData *pColData) {
89,323✔
5839
  if (version == 0) {
89,323!
5840
    return tEncodeColDataVersion0(pEncoder, pColData);
×
5841
  } else if (version == 1) {
89,323!
5842
    return tEncodeColDataVersion1(pEncoder, pColData);
×
5843
  } else if (version == 2) {
89,323!
5844
    int32_t posStart = pEncoder->pos;
89,335✔
5845
    pEncoder->pos += INT_BYTES;
89,335✔
5846
    int32_t code = tEncodeColDataVersion1(pEncoder, pColData);
89,335✔
5847
    if (code) return code;
89,370!
5848
    int32_t posEnd = pEncoder->pos;
89,370✔
5849
    int32_t pos = posEnd - posStart;
89,370✔
5850
    pEncoder->pos = posStart;
89,370✔
5851
    code = tEncodeI32(pEncoder, pos);
89,370✔
5852
    pEncoder->pos = posEnd;
89,370✔
5853
    return code;
89,370✔
5854
  } else {
5855
    return TSDB_CODE_INVALID_PARA;
×
5856
  }
5857
}
5858

5859
int32_t tDecodeColData(uint8_t version, SDecoder *pDecoder, SColData *pColData, bool jump) {
15,384✔
5860
  if (version == 0) {
15,384!
5861
    return tDecodeColDataVersion0(pDecoder, pColData);
×
5862
  } else if (version == 1) {
15,384!
5863
    return tDecodeColDataVersion1(pDecoder, pColData);
×
5864
  } else if (version == 2) {
15,384✔
5865
    if (jump) {
15,382✔
5866
      int32_t len = 0;
6,138✔
5867
      int32_t code = tDecodeI32(pDecoder, &len);
6,138✔
5868
      if (code) return code;
6,138!
5869
      pDecoder->pos += (len - INT_BYTES);
6,138✔
5870
      return TSDB_CODE_SUCCESS;
6,138✔
5871
    } else {
5872
      pDecoder->pos += INT_BYTES;
9,244✔
5873
      return tDecodeColDataVersion1(pDecoder, pColData);
9,244✔
5874
    }    
5875
  } else {
5876
    return TSDB_CODE_INVALID_PARA;
2✔
5877
  }
5878
}
5879

5880
int32_t tEncodeRow(SEncoder *pEncoder, SRow *pRow) { return tEncodeFixed(pEncoder, pRow, pRow->len); }
2,147,483,647✔
5881

5882
int32_t tDecodeRow(SDecoder *pDecoder, SRow **ppRow) {
1,452,128,768✔
5883
  if (ppRow == NULL) {
1,452,128,768!
5884
    return TSDB_CODE_INVALID_PARA;
×
5885
  }
5886

5887
  if (pDecoder->pos + sizeof(SRow) > pDecoder->size) {
1,452,128,768!
5888
    return TSDB_CODE_OUT_OF_RANGE;
×
5889
  }
5890

5891
  SRow *pRow = (SRow *)(pDecoder->data + pDecoder->pos);
1,452,128,768✔
5892
  return tDecodeBinaryWithSize(pDecoder, pRow->len, (uint8_t **)ppRow);
2,147,483,647!
5893
}
5894

5895
int32_t tEncodeBlobSet(SEncoder *pEncoder, SBlobSet *pRow) {
×
5896
  int32_t code = 0;
×
5897
  int32_t lino = 0;
×
5898
  uint8_t compressed = 0;
×
5899
  int32_t compressSize = 0;
×
5900
  char   *p = NULL;
×
5901

5902
  TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pRow->type));
×
5903
  TAOS_CHECK_EXIT(tEncodeI64(pEncoder, pRow->len));
×
5904

5905
  int32_t nSeq = taosArrayGetSize(pRow->pSeqTable);
×
5906
  TAOS_CHECK_EXIT(tEncodeI32(pEncoder, nSeq));
×
5907

5908
  // if (pRow->type) {
5909
  void *pIter = taosHashIterate(pRow->pSeqToffset, NULL);
×
5910
  while (pIter) {
×
5911
    uint64_t seq = *(uint64_t *)taosHashGetKey(pIter, NULL);
×
5912
    int32_t  idx = *(int32_t *)pIter;
×
5913
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, seq));
×
5914
    TAOS_CHECK_EXIT(tEncodeI32(pEncoder, idx));
×
5915

5916
    pIter = taosHashIterate(pRow->pSeqToffset, pIter);
×
5917
  }
5918
  //}
5919
  for (int32_t i = 0; i < nSeq; i++) {
×
5920
    SBlobValue *p = taosArrayGet(pRow->pSeqTable, i);
×
5921
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, p->offset));
×
5922
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->len));
×
5923
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->dataOffset));
×
5924
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->nextRow));
×
5925
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->type));
×
5926
  }
5927

5928
  TAOS_CHECK_EXIT(tEncodeFixed(pEncoder, pRow->data, pRow->len));
×
5929

5930
_exit:
×
5931
  return code;
×
5932
}
5933

5934
int32_t tDecodeBlobSet(SDecoder *pDecoder, SBlobSet **pBlobSet) {
×
5935
  int32_t    code = 0;
×
5936
  int32_t    lino = 0;
×
5937
  int32_t    nSeq = 0;
×
5938
  uint8_t    compressd = 0;
×
5939
  int32_t    compressSize = 0;
×
5940
  SBlobSet  *pBlob = taosMemCalloc(1, sizeof(SBlobSet));
×
5941
  if (pBlob == NULL) {
×
5942
    TAOS_CHECK_EXIT(terrno);
×
5943
  }
5944
  TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &pBlob->type));
×
5945
  TAOS_CHECK_EXIT(tDecodeI64(pDecoder, &pBlob->len));
×
5946

5947
  TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &nSeq));
×
5948

5949
  // if (pBlob->type) {
5950
  pBlob->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
×
5951
  if (pBlob->pSeqToffset == NULL) {
×
5952
    TAOS_CHECK_EXIT(terrno);
×
5953
  }
5954
  for (int32_t i = 0; i < nSeq; i++) {
×
5955
    uint64_t seq;
5956
    int32_t  idx;
5957
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &seq));
×
5958
    TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &idx));
×
5959

5960
    code = taosHashPut(pBlob->pSeqToffset, &seq, sizeof(seq), &idx, sizeof(idx));
×
5961
    TAOS_CHECK_EXIT(code);
×
5962
  }
5963
  //}
5964

5965
  pBlob->pSeqTable = taosArrayInit(nSeq, sizeof(SBlobValue));
×
5966
  if (pBlob->pSeqTable == NULL) {
×
5967
    TAOS_CHECK_EXIT(terrno);
×
5968
  }
5969

5970
  for (int32_t i = 0; i < nSeq; i++) {
×
5971
    SBlobValue value;
5972
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &value.offset));
×
5973
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.len));
×
5974
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.dataOffset));
×
5975
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.nextRow));
×
5976
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.type));
×
5977
    if (taosArrayPush(pBlob->pSeqTable, &value) == NULL) {
×
5978
      TAOS_CHECK_EXIT(terrno);
×
5979
    }
5980
  }
5981

5982
  pBlob->data = taosMemCalloc(1, pBlob->len);
×
5983
  if (pBlob->data == NULL) {
×
5984
    TAOS_CHECK_EXIT(terrno);
×
5985
  }
5986

5987
  TAOS_CHECK_EXIT(tDecodeFixed(pDecoder, pBlob->data, pBlob->len));
×
5988
  *pBlobSet = pBlob;
×
5989

5990
  uTrace("decode blob len:%d", (int32_t)(pBlob->len));
×
5991

5992
_exit:
×
5993
  if (code != 0) {
×
5994
    if (pBlob != NULL) {
×
5995
      taosMemoryFree(pBlob->data);
×
5996
      taosArrayDestroy(pBlob->pSeqTable);
×
5997
      taosMemoryFree(pBlob);
×
5998
    }
5999
  }
6000
  return code;
×
6001
}
6002

6003
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
6004
  do {                                       \
6005
    (SUM) += (VAL);                          \
6006
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
6007
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
6008
  } while (0)
6009

6010
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, SColumnDataAgg *pAggs) {
11,565✔
6011
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
11,565✔
6012
  int16_t *numOfNull = &pAggs->numOfNull;
11,565✔
6013
  *sum = 0;
11,565✔
6014
  *max = 0;
11,565✔
6015
  *min = 1;
11,565✔
6016
  *numOfNull = 0;
11,565✔
6017

6018
  int8_t val;
6019
  if (HAS_VALUE == pColData->flag) {
11,565✔
6020
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
15,157,328✔
6021
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
15,146,763✔
6022
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
15,146,763✔
6023
    }
6024
  } else {
6025
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6026
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6027
        case 0:
141,971✔
6028
        case 1:
6029
          (*numOfNull)++;
141,971✔
6030
          break;
141,971✔
6031
        case 2:
2,708,029✔
6032
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
2,708,029✔
6033
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,708,029✔
6034
          break;
2,708,029✔
6035
        default:
×
6036
          break;
×
6037
      }
6038
    }
6039
  }
6040
}
11,565✔
6041

6042
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
11,593✔
6043
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
11,593✔
6044
  int16_t *numOfNull = &pAggs->numOfNull;
11,593✔
6045
  *sum = 0;
11,593✔
6046
  *max = INT8_MIN;
11,593✔
6047
  *min = INT8_MAX;
11,593✔
6048
  *numOfNull = 0;
11,593✔
6049

6050
  int8_t val;
6051
  if (HAS_VALUE == pColData->flag) {
11,593✔
6052
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
15,219,273✔
6053
      val = ((int8_t *)pColData->pData)[iVal];
15,208,692✔
6054
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
15,208,692✔
6055
    }
6056
  } else {
6057
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,863,012✔
6058
      switch (tColDataGetBitValue(pColData, iVal)) {
2,862,000!
6059
        case 0:
151,777✔
6060
        case 1:
6061
          (*numOfNull)++;
151,777✔
6062
          break;
151,777✔
6063
        case 2:
2,710,223✔
6064
          val = ((int8_t *)pColData->pData)[iVal];
2,710,223✔
6065
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,710,223✔
6066
          break;
2,710,223✔
6067
        default:
×
6068
          break;
×
6069
      }
6070
    }
6071
  }
6072
}
11,593✔
6073

6074
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
11,583✔
6075
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
11,583✔
6076
  int16_t *numOfNull = &pAggs->numOfNull;
11,583✔
6077
  *sum = 0;
11,583✔
6078
  *max = INT16_MIN;
11,583✔
6079
  *min = INT16_MAX;
11,583✔
6080
  *numOfNull = 0;
11,583✔
6081

6082
  int16_t val;
6083
  if (HAS_VALUE == pColData->flag) {
11,583✔
6084
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
15,221,929✔
6085
      val = ((int16_t *)pColData->pData)[iVal];
15,211,346✔
6086
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
15,211,346✔
6087
    }
6088
  } else {
6089
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6090
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6091
        case 0:
142,820✔
6092
        case 1:
6093
          (*numOfNull)++;
142,820✔
6094
          break;
142,820✔
6095
        case 2:
2,707,180✔
6096
          val = ((int16_t *)pColData->pData)[iVal];
2,707,180✔
6097
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,707,180✔
6098
          break;
2,707,180✔
6099
        default:
×
6100
          break;
×
6101
      }
6102
    }
6103
  }
6104
}
11,583✔
6105

6106
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, SColumnDataAgg *pAggs) {
504,824✔
6107
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
504,824✔
6108
  int16_t *numOfNull = &pAggs->numOfNull;
504,824✔
6109
  *sum = 0;
504,824✔
6110
  *max = INT32_MIN;
504,824✔
6111
  *min = INT32_MAX;
504,824✔
6112
  *numOfNull = 0;
504,824✔
6113

6114
  int32_t val;
6115
  if (HAS_VALUE == pColData->flag) {
504,824✔
6116
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,548,395,736✔
6117
      val = ((int32_t *)pColData->pData)[iVal];
1,547,953,506✔
6118
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,547,953,506✔
6119
    }
6120
  } else {
6121
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
168,351,638✔
6122
      switch (tColDataGetBitValue(pColData, iVal)) {
168,343,332!
6123
        case 0:
9,297,225✔
6124
        case 1:
6125
          (*numOfNull)++;
9,297,225✔
6126
          break;
9,297,225✔
6127
        case 2:
159,104,854✔
6128
          val = ((int32_t *)pColData->pData)[iVal];
159,104,854✔
6129
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
159,104,854✔
6130
          break;
159,104,854✔
6131
        default:
×
6132
          break;
×
6133
      }
6134
    }
6135
  }
6136
}
450,536✔
6137

6138
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, SColumnDataAgg *pAggs) {
292,863✔
6139
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
292,863✔
6140
  int16_t *numOfNull = &pAggs->numOfNull;
292,863✔
6141
  *sum = 0;
292,863✔
6142
  *max = INT64_MIN;
292,863✔
6143
  *min = INT64_MAX;
292,863✔
6144
  *numOfNull = 0;
292,863✔
6145

6146
  int64_t val;
6147
  if (HAS_VALUE == pColData->flag) {
292,863✔
6148
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
686,827,013✔
6149
      val = ((int64_t *)pColData->pData)[iVal];
686,539,857✔
6150
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
686,539,857✔
6151
    }
6152
  } else {
6153
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
18,819,755✔
6154
      switch (tColDataGetBitValue(pColData, iVal)) {
18,814,048!
6155
        case 0:
1,838,013✔
6156
        case 1:
6157
          (*numOfNull)++;
1,838,013✔
6158
          break;
1,838,013✔
6159
        case 2:
16,976,035✔
6160
          val = ((int64_t *)pColData->pData)[iVal];
16,976,035✔
6161
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
16,976,035✔
6162
          break;
16,976,035✔
6163
        default:
×
6164
          break;
×
6165
      }
6166
    }
6167
  }
6168
}
292,863✔
6169

6170
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, SColumnDataAgg *pAggs) {
405,147✔
6171
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
405,147✔
6172
  int16_t *numOfNull = &pAggs->numOfNull;
405,147✔
6173
  *(double *)sum = 0;
405,147✔
6174
  *(double *)max = -FLT_MAX;
405,147✔
6175
  *(double *)min = FLT_MAX;
405,147✔
6176
  *numOfNull = 0;
405,147✔
6177

6178
  float val;
6179
  if (HAS_VALUE == pColData->flag) {
405,147✔
6180
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,625,658,109✔
6181
      val = ((float *)pColData->pData)[iVal];
1,625,253,993✔
6182
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
1,625,253,993✔
6183
    }
6184
  } else {
6185
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,875,338✔
6186
      switch (tColDataGetBitValue(pColData, iVal)) {
2,874,326!
6187
        case 0:
153,523✔
6188
        case 1:
6189
          (*numOfNull)++;
153,523✔
6190
          break;
153,523✔
6191
        case 2:
2,720,809✔
6192
          val = ((float *)pColData->pData)[iVal];
2,720,809✔
6193
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,720,809✔
6194
          break;
2,720,809✔
6195
        default:
×
6196
          break;
×
6197
      }
6198
    }
6199
  }
6200
}
405,128✔
6201

6202
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, SColumnDataAgg *pAggs) {
12,624✔
6203
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
12,624✔
6204
  int16_t *numOfNull = &pAggs->numOfNull;
12,624✔
6205
  *(double *)sum = 0;
12,624✔
6206
  *(double *)max = -DBL_MAX;
12,624✔
6207
  *(double *)min = DBL_MAX;
12,624✔
6208
  *numOfNull = 0;
12,624✔
6209

6210
  double val;
6211
  if (HAS_VALUE == pColData->flag) {
12,624✔
6212
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
21,643,266✔
6213
      val = ((double *)pColData->pData)[iVal];
21,631,654✔
6214
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
21,631,654✔
6215
    }
6216
  } else {
6217
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,863,012✔
6218
      switch (tColDataGetBitValue(pColData, iVal)) {
2,862,000!
6219
        case 0:
152,141✔
6220
        case 1:
6221
          (*numOfNull)++;
152,141✔
6222
          break;
152,141✔
6223
        case 2:
2,709,859✔
6224
          val = ((double *)pColData->pData)[iVal];
2,709,859✔
6225
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,709,859✔
6226
          break;
2,709,859✔
6227
        default:
×
6228
          break;
×
6229
      }
6230
    }
6231
  }
6232
}
12,624✔
6233

6234
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,800✔
6235
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,800✔
6236
  int16_t *numOfNull = &pAggs->numOfNull;
8,800✔
6237
  *(uint64_t *)sum = 0;
8,800✔
6238
  *(uint64_t *)max = 0;
8,800✔
6239
  *(uint64_t *)min = UINT8_MAX;
8,800✔
6240
  *numOfNull = 0;
8,800✔
6241

6242
  uint8_t val;
6243
  if (HAS_VALUE == pColData->flag) {
8,800✔
6244
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
14,781,127✔
6245
      val = ((uint8_t *)pColData->pData)[iVal];
14,773,327✔
6246
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
14,773,327✔
6247
    }
6248
  } else {
6249
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6250
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6251
        case 0:
142,842✔
6252
        case 1:
6253
          (*numOfNull)++;
142,842✔
6254
          break;
142,842✔
6255
        case 2:
2,707,158✔
6256
          val = ((uint8_t *)pColData->pData)[iVal];
2,707,158✔
6257
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,707,158✔
6258
          break;
2,707,158✔
6259
        default:
×
6260
          break;
×
6261
      }
6262
    }
6263
  }
6264
}
8,800✔
6265

6266
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,799✔
6267
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,799✔
6268
  int16_t *numOfNull = &pAggs->numOfNull;
8,799✔
6269
  *(uint64_t *)sum = 0;
8,799✔
6270
  *(uint64_t *)max = 0;
8,799✔
6271
  *(uint64_t *)min = UINT16_MAX;
8,799✔
6272
  *numOfNull = 0;
8,799✔
6273

6274
  uint16_t val;
6275
  if (HAS_VALUE == pColData->flag) {
8,799✔
6276
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
14,781,272✔
6277
      val = ((uint16_t *)pColData->pData)[iVal];
14,773,473✔
6278
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
14,773,473✔
6279
    }
6280
  } else {
6281
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6282
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6283
        case 0:
142,647✔
6284
        case 1:
6285
          (*numOfNull)++;
142,647✔
6286
          break;
142,647✔
6287
        case 2:
2,707,353✔
6288
          val = ((uint16_t *)pColData->pData)[iVal];
2,707,353✔
6289
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,707,353✔
6290
          break;
2,707,353✔
6291
        default:
×
6292
          break;
×
6293
      }
6294
    }
6295
  }
6296
}
8,799✔
6297

6298
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,800✔
6299
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,800✔
6300
  int16_t *numOfNull = &pAggs->numOfNull;
8,800✔
6301
  *(uint64_t *)sum = 0;
8,800✔
6302
  *(uint64_t *)max = 0;
8,800✔
6303
  *(uint64_t *)min = UINT32_MAX;
8,800✔
6304
  *numOfNull = 0;
8,800✔
6305

6306
  uint32_t val;
6307
  if (HAS_VALUE == pColData->flag) {
8,800✔
6308
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
14,780,940✔
6309
      val = ((uint32_t *)pColData->pData)[iVal];
14,773,140✔
6310
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
14,773,140✔
6311
    }
6312
  } else {
6313
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6314
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6315
        case 0:
142,667✔
6316
        case 1:
6317
          (*numOfNull)++;
142,667✔
6318
          break;
142,667✔
6319
        case 2:
2,707,333✔
6320
          val = ((uint32_t *)pColData->pData)[iVal];
2,707,333✔
6321
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,707,333✔
6322
          break;
2,707,333✔
6323
        default:
×
6324
          break;
×
6325
      }
6326
    }
6327
  }
6328
}
8,800✔
6329

6330
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,800✔
6331
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,800✔
6332
  int16_t *numOfNull = &pAggs->numOfNull;
8,800✔
6333
  *(uint64_t *)sum = 0;
8,800✔
6334
  *(uint64_t *)max = 0;
8,800✔
6335
  *(uint64_t *)min = UINT64_MAX;
8,800✔
6336
  *numOfNull = 0;
8,800✔
6337

6338
  uint64_t val;
6339
  if (HAS_VALUE == pColData->flag) {
8,800✔
6340
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
14,781,554✔
6341
      val = ((uint64_t *)pColData->pData)[iVal];
14,773,754✔
6342
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
14,773,754✔
6343
    }
6344
  } else {
6345
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,851,000✔
6346
      switch (tColDataGetBitValue(pColData, iVal)) {
2,850,000!
6347
        case 0:
141,965✔
6348
        case 1:
6349
          (*numOfNull)++;
141,965✔
6350
          break;
141,965✔
6351
        case 2:
2,708,035✔
6352
          val = ((uint64_t *)pColData->pData)[iVal];
2,708,035✔
6353
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,708,035✔
6354
          break;
2,708,035✔
6355
        default:
×
6356
          break;
×
6357
      }
6358
    }
6359
  }
6360
}
8,800✔
6361

6362
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, SColumnDataAgg *pAggs) {
28,488✔
6363
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
28,488✔
6364
  int16_t *numOfNull = &pAggs->numOfNull;
28,488✔
6365
  *(uint64_t *)sum = 0;
28,488✔
6366
  *(uint64_t *)max = 0;
28,488✔
6367
  *(uint64_t *)min = 0;
28,488✔
6368
  *numOfNull = 0;
28,488✔
6369

6370
  switch (pColData->flag) {
28,488!
6371
    case HAS_NONE:
×
6372
    case HAS_NULL:
6373
    case (HAS_NONE | HAS_NULL):
6374
      *numOfNull = pColData->nVal;
×
6375
      break;
×
6376
    case HAS_VALUE:
26,477✔
6377
      *numOfNull = 0;
26,477✔
6378
      break;
26,477✔
6379
    case (HAS_VALUE | HAS_NULL):
2,012✔
6380
    case (HAS_VALUE | HAS_NONE):
6381
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
5,714,012✔
6382
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
5,712,000✔
6383
          (*numOfNull)++;
294,247✔
6384
        }
6385
      }
6386
      break;
2,012✔
6387
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
6388
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
6389
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
6390
          (*numOfNull)++;
×
6391
        }
6392
      }
6393
      break;
×
6394
    default:
×
6395
      break;
×
6396
  }
6397
}
28,488✔
6398

6399
#define CALC_DECIMAL_SUM_MAX_MIN(TYPE, pSumOp, pCompOp, pColData, pSum, pMax, pMin)                   \
6400
  do {                                                                                                \
6401
    if (decimal128AddCheckOverflow((Decimal *)pSum, pVal, DECIMAL_WORD_NUM(TYPE))) *pOverflow = true; \
6402
    pSumOp->add(pSum, pVal, DECIMAL_WORD_NUM(TYPE));                                                  \
6403
    if (pCompOp->gt(pVal, pMax, DECIMAL_WORD_NUM(TYPE))) {                                            \
6404
      *(pMax) = *pVal;                                                                                \
6405
    }                                                                                                 \
6406
    if (pCompOp->lt(pVal, pMin, DECIMAL_WORD_NUM(TYPE))) {                                            \
6407
      *(pMin) = *pVal;                                                                                \
6408
    }                                                                                                 \
6409
  } while (0)
6410

6411
static FORCE_INLINE void tColDataCalcSMADecimal64Type(SColData *pColData, SColumnDataAgg *pAggs) {
744✔
6412
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum;
744✔
6413
  Decimal64  *pMax = (Decimal64 *)pAggs->decimal128Max, *pMin = (Decimal64 *)pAggs->decimal128Min;
744✔
6414
  uint8_t    *pOverflow = &pAggs->overflow;
744✔
6415
  *pSum = DECIMAL128_ZERO;
744✔
6416
  *pMax = DECIMAL64_MIN;
744✔
6417
  *pMin = DECIMAL64_MAX;
744✔
6418
  pAggs->numOfNull = 0;
744✔
6419
  pAggs->colId |= DECIMAL_AGG_FLAG;
744✔
6420

6421
  Decimal64         *pVal = NULL;
744✔
6422
  const SDecimalOps *pSumOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
744✔
6423
  const SDecimalOps *pCompOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
744✔
6424
  if (HAS_VALUE == pColData->flag) {
744✔
6425
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
2,367,701✔
6426
      pVal = ((Decimal64 *)pColData->pData) + iVal;
2,366,968✔
6427
      CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
2,366,968!
6428
    }
6429
  } else {
6430
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
12,012✔
6431
      switch (tColDataGetBitValue(pColData, iVal)) {
12,000!
6432
        case 0:
3,847✔
6433
        case 1:
6434
          pAggs->numOfNull++;
3,847✔
6435
          break;
3,847✔
6436
        case 2:
8,153✔
6437
          pVal = ((Decimal64 *)pColData->pData) + iVal;
8,153✔
6438
          CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
8,153!
6439
          break;
8,153✔
6440
        default:
×
6441
          break;
×
6442
      }
6443
    }
6444
  }
6445
}
745✔
6446

6447
static FORCE_INLINE void tColDataCalcSMADecimal128Type(SColData *pColData, SColumnDataAgg *pAggs) {
768✔
6448
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum, *pMax = (Decimal128 *)pAggs->decimal128Max,
768✔
6449
             *pMin = (Decimal128 *)pAggs->decimal128Min;
768✔
6450
  uint8_t *pOverflow = &pAggs->overflow;
768✔
6451
  *pSum = DECIMAL128_ZERO;
768✔
6452
  *pMax = DECIMAL128_MIN;
768✔
6453
  *pMin = DECIMAL128_MAX;
768✔
6454
  pAggs->numOfNull = 0;
768✔
6455
  pAggs->colId |= DECIMAL_AGG_FLAG;
768✔
6456

6457
  Decimal128        *pVal = NULL;
768✔
6458
  const SDecimalOps *pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
768✔
6459
  if (HAS_VALUE == pColData->flag) {
768✔
6460
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
2,366,567✔
6461
      pVal = ((Decimal128 *)pColData->pData) + iVal;
2,365,952✔
6462
      CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
2,365,952!
6463
    }
6464
  } else {
6465
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
36,036✔
6466
      switch (tColDataGetBitValue(pColData, iVal)) {
36,000!
6467
        case 0:
11,428✔
6468
        case 1:
6469
          pAggs->numOfNull++;
11,428✔
6470
          break;
11,428✔
6471
        case 2:
24,572✔
6472
          pVal = ((Decimal128 *)pColData->pData) + iVal;
24,572✔
6473
          CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
24,572✔
6474
          break;
24,572✔
6475
        default:
×
6476
          break;
×
6477
      }
6478
    }
6479
  }
6480
}
651✔
6481

6482
void (*tColDataCalcSMA[])(SColData *pColData, SColumnDataAgg *pAggs) = {
6483
    NULL,
6484
    tColDataCalcSMABool,            // TSDB_DATA_TYPE_BOOL
6485
    tColDataCalcSMATinyInt,         // TSDB_DATA_TYPE_TINYINT
6486
    tColDataCalcSMATinySmallInt,    // TSDB_DATA_TYPE_SMALLINT
6487
    tColDataCalcSMAInt,             // TSDB_DATA_TYPE_INT
6488
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_BIGINT
6489
    tColDataCalcSMAFloat,           // TSDB_DATA_TYPE_FLOAT
6490
    tColDataCalcSMADouble,          // TSDB_DATA_TYPE_DOUBLE
6491
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARCHAR
6492
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_TIMESTAMP
6493
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_NCHAR
6494
    tColDataCalcSMAUTinyInt,        // TSDB_DATA_TYPE_UTINYINT
6495
    tColDataCalcSMATinyUSmallInt,   // TSDB_DATA_TYPE_USMALLINT
6496
    tColDataCalcSMAUInt,            // TSDB_DATA_TYPE_UINT
6497
    tColDataCalcSMAUBigInt,         // TSDB_DATA_TYPE_UBIGINT
6498
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_JSON
6499
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARBINARY
6500
    tColDataCalcSMADecimal128Type,  // TSDB_DATA_TYPE_DECIMAL
6501
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_BLOB
6502
    NULL,                           // TSDB_DATA_TYPE_MEDIUMBLOB
6503
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_GEOMETRY
6504
    tColDataCalcSMADecimal64Type,   // TSDB_DATA_TYPE_DECIMAL64
6505
};
6506

6507
// SValueColumn ================================
6508
int32_t tValueColumnInit(SValueColumn *valCol) {
33,914,139✔
6509
  valCol->type = TSDB_DATA_TYPE_NULL;
33,914,139✔
6510
  valCol->numOfValues = 0;
33,914,139✔
6511
  tBufferInit(&valCol->data);
33,914,139✔
6512
  tBufferInit(&valCol->offsets);
33,914,139✔
6513
  return 0;
33,914,139✔
6514
}
6515

6516
void tValueColumnDestroy(SValueColumn *valCol) {
81,330,274✔
6517
  valCol->type = TSDB_DATA_TYPE_NULL;
81,330,274✔
6518
  valCol->numOfValues = 0;
81,330,274✔
6519
  tBufferDestroy(&valCol->data);
81,330,274✔
6520
  tBufferDestroy(&valCol->offsets);
81,330,584✔
6521
  return;
81,330,564✔
6522
}
6523

6524
void tValueColumnClear(SValueColumn *valCol) {
37,087,625✔
6525
  valCol->type = TSDB_DATA_TYPE_NULL;
37,087,625✔
6526
  valCol->numOfValues = 0;
37,087,625✔
6527
  tBufferClear(&valCol->data);
37,087,625✔
6528
  tBufferClear(&valCol->offsets);
37,087,625✔
6529
  return;
37,087,625✔
6530
}
6531

6532
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
1,808,068✔
6533
  int32_t code;
6534

6535
  if (valCol->numOfValues == 0) {
1,808,068✔
6536
    valCol->type = value->type;
14,844✔
6537
  }
6538

6539
  if (!(value->type == valCol->type)) {
1,808,068!
6540
    return TSDB_CODE_INVALID_PARA;
×
6541
  }
6542

6543
  if (IS_VAR_DATA_TYPE(value->type)) {
1,808,068!
6544
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
13,236!
6545
      return code;
×
6546
    }
6547
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
13,235!
6548
      return code;
×
6549
    }
6550
  } else {
6551
    code = tBufferPut(&valCol->data, VALUE_GET_DATUM(value, value->type), tDataTypes[value->type].bytes);
1,801,450!
6552
    if (code) return code;
1,801,450!
6553
  }
6554
  valCol->numOfValues++;
1,808,067✔
6555

6556
  return 0;
1,808,067✔
6557
}
6558

6559
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
464,790,424✔
6560
  int32_t code;
6561

6562
  if (idx < 0 || idx >= valCol->numOfValues) {
464,790,424!
6563
    return TSDB_CODE_OUT_OF_RANGE;
×
6564
  }
6565

6566
  if (IS_VAR_DATA_TYPE(valCol->type)) {
464,815,322!
6567
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
×
6568
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
×
6569
    int32_t  oldDataSize = nextOffset - offsets[idx];
×
6570
    int32_t  bytesAdded = value->nData - oldDataSize;
×
6571

6572
    if (bytesAdded != 0) {
×
6573
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
72!
6574
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
36✔
6575
              tBufferGetSize(&valCol->data) - nextOffset);
36✔
6576
      valCol->data.size += bytesAdded;
36✔
6577

6578
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
36!
6579
        offsets[i] += bytesAdded;
×
6580
      }
6581
    }
6582
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
×
6583
  } else {
6584
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, VALUE_GET_DATUM(value, valCol->type),
464,864,679!
6585
                        tDataTypes[valCol->type].bytes);
464,864,679✔
6586
  }
6587
  return 0;
6588
}
6589

6590
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
936,829,695✔
6591
  if (idx < 0 || idx >= valCol->numOfValues) {
936,829,695!
6592
    return TSDB_CODE_OUT_OF_RANGE;
×
6593
  }
6594

6595
  value->type = valCol->type;
936,950,188✔
6596
  if (IS_VAR_DATA_TYPE(value->type)) {
936,950,188!
6597
    int32_t       offset, nextOffset;
6598
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
503,533✔
6599

6600
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
503,533!
6601
    if (idx == valCol->numOfValues - 1) {
550,775✔
6602
      nextOffset = tBufferGetSize(&valCol->data);
209,124✔
6603
    } else {
6604
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
341,651✔
6605
    }
6606
    value->nData = nextOffset - offset;
550,464✔
6607
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
550,464✔
6608
  } else {
6609
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
936,446,655✔
6610
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, VALUE_GET_DATUM(value, value->type)));
1,872,893,310!
6611
  }
6612
  return 0;
936,997,119✔
6613
}
6614

6615
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
14,843✔
6616
  int32_t code;
6617

6618
  if (!(valCol->numOfValues > 0)) {
14,843!
6619
    return TSDB_CODE_INVALID_PARA;
×
6620
  }
6621

6622
  (*info) = (SValueColumnCompressInfo){
14,843✔
6623
      .cmprAlg = info->cmprAlg,
14,843✔
6624
      .type = valCol->type,
14,843✔
6625
  };
6626

6627
  // offset
6628
  if (IS_VAR_DATA_TYPE(valCol->type)) {
14,843!
6629
    SCompressInfo cinfo = {
2,342✔
6630
        .cmprAlg = info->cmprAlg,
2,342✔
6631
        .dataType = TSDB_DATA_TYPE_INT,
6632
        .originalSize = valCol->offsets.size,
2,342✔
6633
    };
6634

6635
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
2,342✔
6636
    if (code) return code;
2,342!
6637

6638
    info->offsetOriginalSize = cinfo.originalSize;
2,342✔
6639
    info->offsetCompressedSize = cinfo.compressedSize;
2,342✔
6640
  }
6641

6642
  // data
6643
  SCompressInfo cinfo = {
14,843✔
6644
      .cmprAlg = info->cmprAlg,
14,843✔
6645
      .dataType = valCol->type,
14,843✔
6646
      .originalSize = valCol->data.size,
14,843✔
6647
  };
6648

6649
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
14,843✔
6650
  if (code) return code;
14,844!
6651

6652
  info->dataOriginalSize = cinfo.originalSize;
14,844✔
6653
  info->dataCompressedSize = cinfo.compressedSize;
14,844✔
6654

6655
  return 0;
14,844✔
6656
}
6657

6658
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
752,065✔
6659
                               SBuffer *assist) {
6660
  int32_t code;
6661

6662
  tValueColumnClear(valCol);
752,065✔
6663
  valCol->type = info->type;
752,148✔
6664
  // offset
6665
  if (IS_VAR_DATA_TYPE(valCol->type)) {
991,207!
6666
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
238,815✔
6667

6668
    SCompressInfo cinfo = {
238,815✔
6669
        .dataType = TSDB_DATA_TYPE_INT,
6670
        .cmprAlg = info->cmprAlg,
238,815✔
6671
        .originalSize = info->offsetOriginalSize,
238,815✔
6672
        .compressedSize = info->offsetCompressedSize,
238,815✔
6673
    };
6674

6675
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
238,815✔
6676
    if (code) {
239,059!
6677
      return code;
×
6678
    }
6679
  } else {
6680
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
513,333✔
6681
  }
6682

6683
  // data
6684
  SCompressInfo cinfo = {
752,392✔
6685
      .dataType = valCol->type,
752,392✔
6686
      .cmprAlg = info->cmprAlg,
752,392✔
6687
      .originalSize = info->dataOriginalSize,
752,392✔
6688
      .compressedSize = info->dataCompressedSize,
752,392✔
6689
  };
6690

6691
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
752,392✔
6692
  if (code) {
752,464!
6693
    return code;
×
6694
  }
6695

6696
  return 0;
752,464✔
6697
}
6698

6699
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
14,844✔
6700
  int32_t code;
6701
  uint8_t fmtVer = 0;
14,844✔
6702

6703
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
29,688!
6704
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
29,688!
6705
  if ((code = tBufferPutI8(buffer, info->type))) return code;
29,688!
6706
  if (IS_VAR_DATA_TYPE(info->type)) {
14,844!
6707
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
4,684!
6708
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
4,684!
6709
  }
6710
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
29,688!
6711
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
29,688!
6712

6713
  return 0;
14,844✔
6714
}
6715

6716
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
752,031✔
6717
  int32_t code;
6718
  uint8_t fmtVer;
6719

6720
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
752,031!
6721
  if (fmtVer == 0) {
751,997!
6722
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
752,041!
6723
    if ((code = tBufferGetI8(reader, &info->type))) return code;
751,901!
6724
    if (IS_VAR_DATA_TYPE(info->type)) {
751,884!
6725
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
238,733!
6726
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
238,835!
6727
    } else {
6728
      info->offsetOriginalSize = 0;
513,151✔
6729
      info->offsetCompressedSize = 0;
513,151✔
6730
    }
6731
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
751,975!
6732
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
751,997!
6733
  } else {
6734
    return TSDB_CODE_INVALID_PARA;
×
6735
  }
6736

6737
  return 0;
752,020✔
6738
}
6739

6740
int32_t tCompressData(void          *input,       // input
6,887,130✔
6741
                      SCompressInfo *info,        // compress info
6742
                      void          *output,      // output
6743
                      int32_t        outputSize,  // output size
6744
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
6745
) {
6746
  int32_t extraSizeNeeded;
6747
  int32_t code;
6748

6749
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
6,887,130✔
6750
  if (!(outputSize >= extraSizeNeeded)) {
6,887,130!
6751
    return TSDB_CODE_INVALID_PARA;
×
6752
  }
6753

6754
  if (info->cmprAlg == NO_COMPRESSION) {
6,887,130✔
6755
    (void)memcpy(output, input, info->originalSize);
244✔
6756
    info->compressedSize = info->originalSize;
244✔
6757
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
8,464,771✔
6758
    SBuffer local;
6759

6760
    tBufferInit(&local);
6761
    if (buffer == NULL) {
1,577,615!
6762
      buffer = &local;
×
6763
    }
6764

6765
    if (info->cmprAlg == TWO_STAGE_COMP) {
1,577,615✔
6766
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
1,577,559✔
6767
      if (code) {
1,577,559!
6768
        tBufferDestroy(&local);
6769
        return code;
×
6770
      }
6771
    }
6772

6773
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
3,155,500✔
6774
        input,                                                   // input
6775
        info->originalSize,                                      // input size
6776
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
1,577,615✔
6777
        output,                                                  // output
6778
        outputSize,                                              // output size
6779
        info->cmprAlg,                                           // compression algorithm
1,577,615✔
6780
        buffer->data,                                            // buffer
6781
        buffer->capacity                                         // buffer size
1,577,615✔
6782
    );
6783
    if (info->compressedSize < 0) {
1,577,885!
6784
      tBufferDestroy(&local);
6785
      return TSDB_CODE_COMPRESS_ERROR;
×
6786
    }
6787

6788
    tBufferDestroy(&local);
6789
  } else {
6790
    DEFINE_VAR(info->cmprAlg)
5,309,271✔
6791
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
5,309,271!
6792
      (void)memcpy(output, input, info->originalSize);
12✔
6793
      info->compressedSize = info->originalSize;
12✔
6794
      return 0;
12✔
6795
    }
6796
    SBuffer local;
6797

6798
    tBufferInit(&local);
6799
    if (buffer == NULL) {
5,309,259!
6800
      buffer = &local;
×
6801
    }
6802
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
5,309,259✔
6803

6804
    info->compressedSize = tDataCompress[info->dataType].compFunc(  //
10,619,199✔
6805
        input,                                                      // input
6806
        info->originalSize,                                         // input size
6807
        info->originalSize / tDataTypes[info->dataType].bytes,      // number of elements
5,309,262✔
6808
        output,                                                     // output
6809
        outputSize,                                                 // output size
6810
        info->cmprAlg,                                              // compression algorithm
6811
        buffer->data,                                               // buffer
6812
        buffer->capacity                                            // buffer size
5,309,262✔
6813
    );
6814
    if (info->compressedSize < 0) {
5,309,937!
6815
      tBufferDestroy(&local);
6816
      return TSDB_CODE_COMPRESS_ERROR;
×
6817
    }
6818

6819
    tBufferDestroy(&local);
6820
    // new col compress
6821
  }
6822

6823
  return 0;
6,888,066✔
6824
}
6825

6826
int32_t tDecompressData(void                *input,       // input
119,591,422✔
6827
                        const SCompressInfo *info,        // compress info
6828
                        void                *output,      // output
6829
                        int32_t              outputSize,  // output size
6830
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
6831
) {
6832
  int32_t code;
6833

6834
  if (!(outputSize >= info->originalSize)) {
119,591,422!
6835
    return TSDB_CODE_INVALID_PARA;
×
6836
  }
6837

6838
  if (info->cmprAlg == NO_COMPRESSION) {
119,591,422✔
6839
    if (!(info->compressedSize == info->originalSize)) {
244!
6840
      return TSDB_CODE_INVALID_PARA;
×
6841
    }
6842
    (void)memcpy(output, input, info->compressedSize);
244✔
6843
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
167,728,030!
6844
    SBuffer local;
6845

6846
    tBufferInit(&local);
6847
    if (buffer == NULL) {
48,078,267!
6848
      buffer = &local;
×
6849
    }
6850

6851
    if (info->cmprAlg == TWO_STAGE_COMP) {
48,078,267!
6852
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
48,129,349✔
6853
      if (code) {
48,130,257!
6854
        tBufferDestroy(&local);
6855
        return code;
×
6856
      }
6857
    }
6858

6859
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
48,079,175✔
6860
        input,                                                  // input
6861
        info->compressedSize,                                   // inputSize
48,079,175✔
6862
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
48,079,175✔
6863
        output,                                                 // output
6864
        outputSize,                                             // output size
6865
        info->cmprAlg,                                          // compression algorithm
48,079,175✔
6866
        buffer->data,                                           // helper buffer
6867
        buffer->capacity                                        // extra buffer size
48,079,175✔
6868
    );
6869
    if (decompressedSize < 0) {
48,136,852!
6870
      tBufferDestroy(&local);
6871
      return TSDB_CODE_COMPRESS_ERROR;
×
6872
    }
6873

6874
    if (!(decompressedSize == info->originalSize)) {
48,136,852!
6875
      return TSDB_CODE_COMPRESS_ERROR;
×
6876
    }
6877
    tBufferDestroy(&local);
6878
  } else {
6879
    DEFINE_VAR(info->cmprAlg);
71,512,911✔
6880
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
71,512,911✔
6881
      (void)memcpy(output, input, info->compressedSize);
18✔
6882
      return 0;
18✔
6883
    }
6884
    SBuffer local;
6885

6886
    tBufferInit(&local);
6887
    if (buffer == NULL) {
71,512,893!
6888
      buffer = &local;
×
6889
    }
6890
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
71,512,893✔
6891
    if (code) {
71,513,456!
6892
      return code;
×
6893
    }
6894

6895
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
71,513,456✔
6896
        input,                                                  // input
6897
        info->compressedSize,                                   // inputSize
71,513,456✔
6898
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
71,513,456✔
6899
        output,                                                 // output
6900
        outputSize,                                             // output size
6901
        info->cmprAlg,                                          // compression algorithm
71,513,456✔
6902
        buffer->data,                                           // helper buffer
6903
        buffer->capacity                                        // extra buffer size
71,513,456✔
6904
    );
6905
    if (decompressedSize < 0) {
71,522,229!
6906
      tBufferDestroy(&local);
6907
      return TSDB_CODE_COMPRESS_ERROR;
×
6908
    }
6909

6910
    if (!(decompressedSize == info->originalSize)) {
71,522,229!
6911
      return TSDB_CODE_COMPRESS_ERROR;
×
6912
    }
6913
    tBufferDestroy(&local);
6914
  }
6915

6916
  return 0;
119,659,325✔
6917
}
6918

6919
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
6,887,117✔
6920
  int32_t code;
6921

6922
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
6,887,117✔
6923
  if (code) return code;
6,887,124!
6924

6925
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
6,887,124✔
6926
  if (code) return code;
6,887,701!
6927

6928
  output->size += info->compressedSize;
6,887,701✔
6929
  return 0;
6,887,701✔
6930
}
6931

6932
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
48,134,318✔
6933
  int32_t code;
6934

6935
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
48,134,318✔
6936
  if (code) return code;
48,125,627!
6937

6938
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
48,125,627✔
6939
  if (code) return code;
48,136,104!
6940

6941
  output->size += info->originalSize;
48,136,104✔
6942
  return 0;
48,136,104✔
6943
}
6944

6945
// handle all types, including var data
6946
void valueSetDatum(SValue *pVal, int8_t type, void *pDatum, uint32_t len) {
2,147,483,647✔
6947
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647!
6948
    pVal->pData = pDatum;
×
6949
    pVal->nData = len;
×
6950
  } else {
6951
    switch (len) {
2,147,483,647!
6952
      case sizeof(uint8_t):
2,147,483,647✔
6953
        pVal->val = *(uint8_t *)pDatum;
2,147,483,647✔
6954
        break;
2,147,483,647✔
6955
      case sizeof(uint16_t):
1,588,974,726✔
6956
        pVal->val = *(uint16_t *)pDatum;
1,588,974,726✔
6957
        break;
1,588,974,726✔
6958
      case sizeof(uint32_t):
2,147,483,647✔
6959
        pVal->val = *(uint32_t *)pDatum;
2,147,483,647✔
6960
        break;
2,147,483,647✔
6961
      case sizeof(uint64_t):
2,147,483,647✔
6962
        pVal->val = *(uint64_t *)pDatum;
2,147,483,647✔
6963
        break;
2,147,483,647✔
6964
      default:
×
6965
        break;
×
6966
    }
6967
  }
6968
}
2,147,483,647✔
6969

6970
void valueCloneDatum(SValue *pDst, const SValue *pSrc, int8_t type) {
154,138,195✔
6971
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
154,138,195!
6972
    memcpy(pDst->pData, pSrc->pData, pSrc->nData);
750,105✔
6973
    pDst->nData = pSrc->nData;
750,105✔
6974
  } else {
6975
    pDst->val = pSrc->val;
153,388,090✔
6976
  }
6977
}
154,138,195✔
6978
void valueClearDatum(SValue *pVal, int8_t type) {
×
6979
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
×
6980
    taosMemoryFreeClear(pVal->pData);
×
6981
    pVal->nData = 0;
×
6982
  } else {
6983
    pVal->val = 0;
×
6984
  }
6985
}
×
6986

6987
int8_t schemaHasBlob(const STSchema *pSchema) {
15,970,132✔
6988
  if (pSchema == NULL) {
15,970,132!
6989
    return 0;
×
6990
  }
6991
  for (int i = 0; i < pSchema->numOfCols; ++i) {
108,610,702✔
6992
    if (IS_STR_DATA_BLOB(pSchema->columns[i].type)) {
92,640,570!
6993
      return 1;
×
6994
    }
6995
  }
6996
  return 0;
15,970,132✔
6997
}
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