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

taosdata / TDengine / #4976

06 Mar 2026 09:48AM UTC coverage: 68.446% (+0.08%) from 68.37%
#4976

push

travis-ci

web-flow
feat(TDgpt): support multiple input data columns for anomaly detection. (#34606)

0 of 93 new or added lines in 9 files covered. (0.0%)

5718 existing lines in 144 files now uncovered.

211146 of 308486 relevant lines covered (68.45%)

136170362.0 hits per line

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

67.37
/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) {
215,583,571✔
79
  int32_t n = 0;
215,583,571✔
80
  n += tPutI8(p ? p + n : p, index->type);
215,583,571✔
81
  n += tPutU32v(p ? p + n : p, index->offset);
215,594,175✔
82
  return n;
215,593,251✔
83
}
84

85
static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
778,996,521✔
86
  int32_t n = 0;
778,996,521✔
87
  n += tGetI8(p + n, &index->type);
778,996,521✔
88
  n += tGetU32v(p + n, &index->offset);
779,203,715✔
89
  return n;
779,356,660✔
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;
2,147,483,647✔
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;
2,147,483,647✔
100
  sinfo->numOfNull++;
2,147,483,647✔
101
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
2,147,483,647✔
102
  sinfo->kvPayloadSize += tPutI16v(NULL, -pTColumn->colId);
2,147,483,647✔
103
  return 0;
2,147,483,647✔
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;
71,860,853✔
111
    sinfo->tupleIndices[sinfo->numOfPKs].offset =
71,863,317✔
112
        IS_VAR_DATA_TYPE(pTColumn->type) ? sinfo->tupleVarSize + sinfo->tupleFixedSize : pTColumn->offset;
71,863,141✔
113
    sinfo->kvIndices[sinfo->numOfPKs].type = colVal->value.type;
71,865,649✔
114
    sinfo->kvIndices[sinfo->numOfPKs].offset = sinfo->kvPayloadSize;
71,859,269✔
115
    sinfo->numOfPKs++;
71,861,865✔
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)) {
2,147,483,647✔
121
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)     // size
49,149,326✔
122
                             + BSE_SEQUECE_SIZE;                     // value
24,574,663✔
123
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
49,149,326✔
124
                              + tPutU32v(NULL, colVal->value.nData)  // size
24,574,663✔
125
                              + BSE_SEQUECE_SIZE;                    // seq offset
49,149,326✔
126
    } else {
127
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)  // size
2,147,483,647✔
128
                             + colVal->value.nData;               // value
2,147,483,647✔
129

130
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
2,147,483,647✔
131
                              + tPutU32v(NULL, colVal->value.nData)  // size
2,147,483,647✔
132
                              + colVal->value.nData;                 // value
2,147,483,647✔
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) {
2,147,483,647✔
142
  int32_t  code = 0;
2,147,483,647✔
143
  int32_t  colValIndex = 1;
2,147,483,647✔
144
  int32_t  numOfColVals = TARRAY_SIZE(colVals);
2,147,483,647✔
145
  SColVal *colValArray = (SColVal *)TARRAY_DATA(colVals);
2,147,483,647✔
146

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

157
  *sinfo = (SRowBuildScanInfo){.tupleFixedSize = schema->flen, .hasBlob = sinfo->hasBlob, .scanType = sinfo->scanType};
2,147,483,647✔
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;
116,200✔
164
        break;
58,100✔
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;
2,147,483,647✔
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) {
156✔
184
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
312✔
185
        break;
156✔
186
      } else {  // skip useless value
187
        colValIndex++;
×
188
      }
189
    }
190
  }
191

192
  if (sinfo->numOfNone) {
2,147,483,647✔
193
    sinfo->flag |= HAS_NONE;
2,147,483,647✔
194
  }
195
  if (sinfo->numOfNull) {
2,147,483,647✔
196
    sinfo->flag |= HAS_NULL;
1,920,868,277✔
197
  }
198
  if (sinfo->numOfValue) {
2,147,483,647✔
199
    sinfo->flag |= HAS_VALUE;
2,147,483,647✔
200
  }
201

202
  // Tuple
203
  sinfo->tupleFlag = sinfo->flag;
2,147,483,647✔
204
  switch (sinfo->flag) {
2,147,483,647✔
205
    case HAS_NONE:
2,147,483,647✔
206
    case HAS_NULL:
207
      sinfo->tupleBitmapSize = 0;
2,147,483,647✔
208
      sinfo->tupleFixedSize = 0;
2,147,483,647✔
209
      break;
2,147,483,647✔
210
    case HAS_VALUE:
2,147,483,647✔
211
      sinfo->tupleBitmapSize = 0;
2,147,483,647✔
212
      sinfo->tupleFixedSize = schema->flen;
2,147,483,647✔
213
      break;
2,147,483,647✔
214
    case (HAS_NONE | HAS_NULL):
2,434,681✔
215
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
2,434,681✔
216
      sinfo->tupleFixedSize = 0;
2,435,264✔
217
      break;
2,435,264✔
218
    case (HAS_NONE | HAS_VALUE):
2,147,483,647✔
219
    case (HAS_NULL | HAS_VALUE):
220
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
2,147,483,647✔
221
      sinfo->tupleFixedSize = schema->flen;
2,147,483,647✔
222
      break;
2,147,483,647✔
223
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
1,106,310,726✔
224
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
1,106,310,726✔
225
      sinfo->tupleFixedSize = schema->flen;
1,106,319,471✔
226
      break;
940,995,810✔
227
  }
228
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
229
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
71,851,921✔
230
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
71,866,353✔
231
  }
232
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
2,147,483,647✔
233
                        + sinfo->tuplePKSize      // primary keys
2,147,483,647✔
234
                        + sinfo->tupleBitmapSize  // bitmap
2,147,483,647✔
235
                        + sinfo->tupleFixedSize   // fixed part
2,147,483,647✔
236
                        + sinfo->tupleVarSize;    // var part
2,147,483,647✔
237

238
  // Key-Value
239
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
2,147,483,647✔
240
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
2,147,483,647✔
241
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
2,147,483,647✔
242
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
57,571,149✔
243
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
57,559,944✔
244
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
57,565,028✔
245
  } else {
246
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
14,775✔
247
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
14,775✔
248
  }
249
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
250
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
71,858,257✔
251
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
71,865,077✔
252
  }
253
  sinfo->kvRowSize = sizeof(SRow)             // SRow
2,147,483,647✔
254
                     + sinfo->kvPKSize        // primary keys
2,147,483,647✔
255
                     + sinfo->kvIndexSize     // index array
2,147,483,647✔
256
                     + sinfo->kvPayloadSize;  // payload
2,147,483,647✔
257

258
_exit:
2,147,483,647✔
259
  return code;
2,147,483,647✔
260
}
261

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

275
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
2,147,483,647✔
276
    return 0;
2,147,483,647✔
277
  }
278

279
  uint8_t *primaryKeys = (*ppRow)->data;
2,147,483,647✔
280
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
2,147,483,647✔
281
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
2,147,483,647✔
282
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
2,147,483,647✔
283

284
  // primary keys
285
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
286
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
66,428,329✔
287
  }
288

289
  // bitmap + fixed + varlen
290
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
2,147,483,647✔
291
  int32_t colValIndex = 1;
2,147,483,647✔
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);
13,900✔
296
        break;
13,900✔
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;
2,147,483,647✔
305
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
2,147,483,647✔
306
            if (colValArray[colValIndex].value.nData) {
2,147,483,647✔
307
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
2,147,483,647✔
308
              varlen += colValArray[colValIndex].value.nData;
2,147,483,647✔
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
712,210,900✔
316
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
660,800,298✔
317
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
51,583,543✔
318
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
51,584,756✔
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
15,612✔
324
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
156✔
325
        break;
156✔
326
      } else {
327
        colValIndex++;
15,456✔
328
      }
329
    }
330
  }
331

332
  return 0;
2,147,483,647✔
333
}
334

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

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

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

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

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

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

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

395
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
69,760✔
396
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
19,268✔
397
              hasBlob = 1;
3,884✔
398
            }
399
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
19,268✔
400
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
38,536✔
401
            if (colValArray[colValIndex].value.nData) {
19,268✔
402
              if (hasBlob == 0) {
19,268✔
403
                (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
15,384✔
404
                varlen += colValArray[colValIndex].value.nData;
15,384✔
405
              } else {
406
                uint64_t  seq = 0;
3,884✔
407
                SBlobItem item = {.seqOffsetInRow = varlen - (*ppRow)->data,
3,884✔
408
                                  .data = colValArray[colValIndex].value.pData,
3,884✔
409
                                  .len = colValArray[colValIndex].value.nData,
3,884✔
410
                                  .type = TSDB_DATA_BLOB_VALUE};
411
                code = tBlobSetPush(pBlobSet, &item, &seq, firstBlobCol);
3,884✔
412
                if (firstBlobCol == 1) {
3,884✔
413
                  firstBlobCol = 0;
3,884✔
414
                }
415
                if (code != 0) return code;
3,884✔
416
                varlen += tPutU64(varlen, seq);
7,768✔
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,
50,492✔
423
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
50,492✔
424
                         tDataTypes[schema->columns[i].type].bytes);
50,492✔
425
          }
426
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
9,366✔
427
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
446✔
428
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
446✔
429
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
446✔
430
          }
431
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
8,920✔
432
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
8,920✔
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);
8,920✔
436
        }
437

438
        colValIndex++;
79,126✔
439
        break;
79,126✔
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) {
4,330✔
450
    return TSDB_CODE_INVALID_PARA;
×
451
  }
452

453
  return 0;
4,330✔
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) {
710,226,647✔
569
    ((uint16_t *)indices->idx)[indices->nCol] = (uint16_t)offset;
710,226,647✔
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) {
2,147,483,647✔
577
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
2,147,483,647✔
578

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

589
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
2,147,483,647✔
590
    return TSDB_CODE_INVALID_PARA;
×
591
  }
592

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

598
  // primary keys
599
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
600
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
5,435,296✔
601
  }
602

603
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
2,147,483,647✔
604
  int32_t colValIndex = 1;
2,147,483,647✔
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;
32,160✔
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);
1,975,169,197✔
616
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
1,975,219,545✔
617
            if (colValArray[colValIndex].value.nData > 0) {
1,975,202,836✔
618
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
1,963,828,101✔
619
                           colValArray[colValIndex].value.nData);
1,963,881,311✔
620
              payloadSize += colValArray[colValIndex].value.nData;
1,963,879,738✔
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);
2,033,935,793✔
631
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
2,147,483,647✔
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;
×
638
      } else {
639
        colValIndex++;
×
640
      }
641
    }
642
  }
643
  return 0;
2,147,483,647✔
644
}
645

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

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

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

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

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

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

678
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
24,570,779✔
679
  int32_t colValIndex = 1;
24,570,779✔
680
  int8_t  firstBlobCol = 1;
24,570,779✔
681
  for (int32_t i = 1; i < schema->numOfCols; i++) {
55,394,478✔
682
    for (;;) {
×
683
      if (colValIndex >= numOfColVals) {  // NONE
30,823,699✔
684
        break;
×
685
      }
686
      uint8_t hasBlob = 0;
30,823,699✔
687

688
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
30,823,699✔
689
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
30,823,699✔
690
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
27,692,779✔
691
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
27,692,779✔
692
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
25,195,179✔
693
              hasBlob = 1;
24,570,779✔
694
            }
695
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
25,195,179✔
696
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
25,195,179✔
697
            if (colValArray[colValIndex].value.nData > 0) {
25,195,179✔
698
              if (hasBlob == 0) {
23,212,657✔
699
                (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
624,400✔
700
                             colValArray[colValIndex].value.nData);
624,400✔
701
                payloadSize += colValArray[colValIndex].value.nData;
624,400✔
702
              } else {
703
                uint64_t  seq = 0;
22,588,257✔
704
                uint32_t  seqOffset = payloadSize + payload - (*ppRow)->data;
22,588,257✔
705
                SBlobItem item = {.seqOffsetInRow = seqOffset,
22,588,257✔
706
                                  .data = colValArray[colValIndex].value.pData,
22,588,257✔
707
                                  .len = colValArray[colValIndex].value.nData,
22,588,257✔
708
                                  .type = TSDB_DATA_BLOB_VALUE};
709
                int32_t   code = tBlobSetPush(ppBlobSet, &item, &seq, 0);
22,588,257✔
710
                if (code != 0) return code;
22,588,257✔
711
                payloadSize += tPutU64(payload + payloadSize, seq);
45,176,514✔
712
              }
713
            } else {
714
              if (hasBlob) {
1,982,522✔
715
                TAOS_CHECK_RETURN(addEmptyItemToBlobSet(ppBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
1,982,522✔
716
              }
717
            }
718
          } else {
719
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,497,600✔
720
            (void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
2,497,600✔
721
                         tDataTypes[schema->columns[i].type].bytes);
2,497,600✔
722
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,497,600✔
723
          }
724
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
3,130,920✔
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++;
30,823,699✔
732
        break;
30,823,699✔
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) {
24,570,779✔
742
    return TSDB_CODE_INVALID_PARA;
×
743
  }
744
  return 0;
24,570,779✔
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) {
2,147,483,647✔
851
  int32_t code;
852
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
2,147,483,647✔
853
  if (code) return code;
2,147,483,647✔
854

855
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
2,147,483,647✔
856
    code = tRowBuildTupleRow(aColVal, sinfo, pTSchema, ppRow);
2,147,483,647✔
857
  } else {
858
    code = tRowBuildKVRow(aColVal, sinfo, pTSchema, ppRow);
2,147,483,647✔
859
  }
860
  return code;
2,147,483,647✔
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,
25,082,500✔
1074
                          SRowBuildScanInfo *sinfo) {
1075
  int32_t code;
1076

1077
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
25,082,500✔
1078
  if (code) return code;
25,082,500✔
1079

1080
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
25,082,500✔
1081
    code = tRowBuildTupleWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
511,721✔
1082
  } else {
1083
    code = tRowBuildKVRowWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
24,570,779✔
1084
  }
1085

1086
  return code;
25,082,500✔
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) {
32,200✔
1106
  int32_t    lino = 0;
32,200✔
1107
  int32_t    code = 0;
32,200✔
1108
  SBlobSet  *p = taosMemCalloc(1, sizeof(SBlobSet));
32,200✔
1109
  if (p == NULL) {
32,200✔
1110
    return terrno;
×
1111
  }
1112

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

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

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

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

1134
  p->cap = cap;
32,200✔
1135
  p->len = 0;
32,200✔
1136
  p->seq = 1;
32,200✔
1137

1138
  *ppBlobSet = p;
32,200✔
1139
_exit:
32,200✔
1140
  if (code != 0) {
32,200✔
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);
32,200✔
1149
  return code;
32,200✔
1150
}
1151
int32_t tBlobSetPush(SBlobSet *pBlobSet, SBlobItem *pItem, uint64_t *seq, int8_t nextRow) {
25,090,336✔
1152
  if (pBlobSet == NULL || pItem == NULL || seq == NULL) {
25,090,336✔
1153
    return TSDB_CODE_INVALID_PARA;
×
1154
  }
1155
  uTrace("push blob %p, seqOffsetInRow %d, dataLen %d, nextRow %d", pBlobSet, pItem->seqOffsetInRow, pItem->len,
25,090,336✔
1156
         nextRow);
1157
  int32_t  lino = 0;
25,090,336✔
1158
  int32_t  code = 0;
25,090,336✔
1159
  uint64_t offset;
1160
  uint32_t len = pItem->len;
25,090,336✔
1161
  uint8_t *data = pItem->data;
25,090,336✔
1162
  int32_t  dataOffset = pItem->seqOffsetInRow;
25,090,336✔
1163

1164
  uint64_t tlen = pBlobSet->len + len;
25,090,336✔
1165
  if (tlen > pBlobSet->cap) {
25,090,336✔
1166
    int64_t cap = pBlobSet->cap;
20,918✔
1167
    // opt later
1168
    do {
1169
      cap = cap * 2;
20,918✔
1170
    } while (tlen > cap);
20,918✔
1171

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

1183
  offset = pBlobSet->len;
25,090,336✔
1184
  pBlobSet->len += len;
25,090,336✔
1185

1186
  pBlobSet->seq++;
25,090,336✔
1187
  *seq = pBlobSet->seq;
25,090,336✔
1188

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

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

1200
_exit:
25,090,336✔
1201
  return code;
25,090,336✔
1202
}
1203

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

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

1209
  memcpy(p1, p2, sizeof(SBlobSet));
759✔
1210
  memcpy(p2, &t, sizeof(SBlobSet));
759✔
1211
}
759✔
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) {
1,255,520,865✔
1261
  if (pBlobSet == NULL) return 0;
1,255,520,865✔
1262
  return taosArrayGetSize(pBlobSet->pSeqTable);
112,577✔
1263
}
1264

1265
void tBlobSetDestroy(SBlobSet *pBlobSet) {
13,685,728✔
1266
  if (pBlobSet == NULL) return;
13,685,728✔
1267
  uTrace("destroy blob row, seqTable size %p", pBlobSet);
56,580✔
1268
  taosMemoryFree(pBlobSet->data);
56,580✔
1269
  taosArrayDestroy(pBlobSet->pSeqTable);
63,596✔
1270
  taosHashCleanup(pBlobSet->pSeqToffset);
63,596✔
1271
  taosArrayDestroy(pBlobSet->pSet);
63,596✔
1272
  taosMemoryFree(pBlobSet);
63,596✔
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) {
×
1286
  if (((SBindInfo *)p1)->columnId < ((SBindInfo *)p2)->columnId) {
×
1287
    return -1;
×
1288
  } else if (((SBindInfo *)p1)->columnId > ((SBindInfo *)p2)->columnId) {
×
1289
    return 1;
×
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,
2,600,235✔
1304
                          SArray *rowArray, bool *pOrdered, bool *pDupTs) {
1305
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
2,600,235✔
1306
    return TSDB_CODE_INVALID_PARA;
×
1307
  }
1308

1309
  if (!infoSorted) {
2,605,743✔
1310
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
1311
  }
1312

1313
  int32_t code = 0;
2,605,743✔
1314
  int32_t numOfRows = infos[0].bind->num;
2,605,743✔
1315
  SArray *colValArray;
1316
  SColVal colVal;
2,591,178✔
1317

1318
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
2,605,823✔
1319
    return terrno;
×
1320
  }
1321

1322
  SRowKey rowKey, lastRowKey;
2,589,806✔
1323
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
19,806,843✔
1324
    taosArrayClear(colValArray);
17,313,796✔
1325

1326
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
89,748,090✔
1327
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
72,194,875✔
1328
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
1,376✔
1329
      } else {
1330
        SValue value = {
72,209,779✔
1331
            .type = infos[iInfo].type,
72,205,685✔
1332
        };
1333
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
72,216,297✔
1334
          value.nData = infos[iInfo].bind->length[iRow];
4,626,588✔
1335
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
4,647,639✔
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;
4,647,827✔
1340
        } else {
1341
          valueSetDatum(&value, infos[iInfo].type,
67,619,793✔
1342
                        (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
67,611,531✔
1343
                        infos[iInfo].bind->buffer_length);
67,599,440✔
1344
        }
1345
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
72,861,091✔
1346
      }
1347
      if (taosArrayPush(colValArray, &colVal) == NULL) {
72,478,318✔
1348
        code = terrno;
×
1349
        goto _exit;
×
1350
      }
1351
    }
1352

1353
    SRow             *row;
5,243,958✔
1354
    SRowBuildScanInfo sinfo = {0};
17,538,908✔
1355
    if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
17,541,690✔
1356
      goto _exit;
×
1357
    }
1358

1359
    if ((taosArrayPush(rowArray, &row)) == NULL) {
17,226,954✔
1360
      code = terrno;
×
1361
      goto _exit;
×
1362
    }
1363

1364
    if (pOrdered && pDupTs) {
17,226,954✔
1365
      tRowGetKey(row, &rowKey);
34,511,011✔
1366
      if (iRow == 0) {
17,224,569✔
1367
        *pOrdered = true;
2,603,295✔
1368
        *pDupTs = false;
2,603,168✔
1369
      } else {
1370
        if (*pOrdered) {
14,621,274✔
1371
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
14,658,699✔
1372
          *pOrdered = (res >= 0);
14,658,699✔
1373
          if (!*pDupTs) {
14,658,101✔
1374
            *pDupTs = (res == 0);
14,650,028✔
1375
          }
1376
        }
1377
      }
1378
      lastRowKey = rowKey;
17,220,537✔
1379
    }
1380
  }
1381

1382
_exit:
2,590,141✔
1383
  taosArrayDestroy(colValArray);
2,590,575✔
1384
  return code;
2,603,251✔
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;
2,147,483,647✔
1395
    pColVal->value.type = pTColumn->type;
2,147,483,647✔
1396
    pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
1397
    VALUE_SET_TRIVIAL_DATUM(&pColVal->value, pRow->ts);
2,147,483,647✔
1398
    return 0;
2,147,483,647✔
1399
  }
1400

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

1406
  if (pRow->flag == HAS_NULL) {
2,147,483,647✔
1407
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
482,767,175✔
1408
    return 0;
482,804,787✔
1409
  }
1410

1411
  SPrimaryKeyIndex index;
2,147,483,647✔
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);
50,267,300✔
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) {
2,147,483,647✔
1424
      pv = pIdx->idx + (pIdx->nCol << 1);
2,147,483,647✔
1425
    } else {
1426
      pv = pIdx->idx + (pIdx->nCol << 2);
3✔
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) {
2,147,483,647✔
1437
        pData = pv + ((uint16_t *)pIdx->idx)[mid];
2,147,483,647✔
1438
      } else {
1439
        pData = pv + ((uint32_t *)pIdx->idx)[mid];
×
1440
      }
1441

1442
      int16_t cid;
2,147,483,647✔
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);
2,147,483,647✔
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;
2,147,483,647✔
1455

1456
            pData += tGetU32v(pData, &pColVal->value.nData);
2,147,483,647✔
1457
            if (pColVal->value.nData > 0) {
2,147,483,647✔
1458
              pColVal->value.pData = pData;
2,147,483,647✔
1459
            } else {
1460
              pColVal->value.pData = NULL;
11,141,657✔
1461
            }
1462
            if (isBlob == 1) {
2,147,483,647✔
1463
              pData += BSE_SEQUECE_SIZE;  // skip seq
30,607,552✔
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;
2,147,483,647✔
1480
    uint8_t *fixed;
1481
    uint8_t *varlen;
1482
    uint8_t  bit;
1483

1484
    if (pRow->flag == HAS_VALUE) {
2,147,483,647✔
1485
      fixed = bitmap;
2,147,483,647✔
1486
      bit = BIT_FLG_VALUE;
2,147,483,647✔
1487
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
2,147,483,647✔
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;
2,147,483,647✔
1492
      bit = GET_BIT1(bitmap, iCol - 1);
2,147,483,647✔
1493

1494
      if (pRow->flag == (HAS_NONE | HAS_VALUE)) {
2,147,483,647✔
1495
        if (bit) bit++;
11,447,536✔
1496
      } else if (pRow->flag == (HAS_NULL | HAS_VALUE)) {
2,147,483,647✔
1497
        bit++;
2,147,483,647✔
1498
      }
1499
    }
1500
    varlen = fixed + pTSchema->flen;
2,147,483,647✔
1501

1502
    if (bit == BIT_FLG_NONE) {
2,147,483,647✔
1503
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,770,144✔
1504
      return 0;
1,770,144✔
1505
    } else if (bit == BIT_FLG_NULL) {
2,147,483,647✔
1506
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,756,675,939✔
1507
      return 0;
1,756,675,693✔
1508
    }
1509

1510
    pColVal->cid = pTColumn->colId;
2,147,483,647✔
1511
    pColVal->value.type = pTColumn->type;
2,147,483,647✔
1512
    pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
1513
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647✔
1514
      int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
2,147,483,647✔
1515
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
2,147,483,647✔
1516
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
2,147,483,647✔
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]);
2,147,483,647✔
1522
    }
1523
  }
1524

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

1528
void tRowDestroy(SRow *pRow) {
2,147,483,647✔
1529
  if (pRow) taosMemoryFree(pRow);
2,147,483,647✔
1530
}
2,147,483,647✔
1531

1532
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
391,881,414✔
1533
  SRowKey key1, key2;
391,865,363✔
1534
  tRowGetKey(*(SRow **)p1, &key1);
784,466,108✔
1535
  tRowGetKey(*(SRow **)p2, &key2);
784,370,384✔
1536
  return tRowKeyCompare(&key1, &key2);
392,541,814✔
1537
}
1538
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
34,870,859✔
1539

1540
static SColVal* tRowFindColumnValue(SRowIter *iter, int32_t targetCid) {
92,828,132✔
1541
  SColVal* pColVal = tRowIterNext(iter);
92,828,132✔
1542
  while (pColVal != NULL && pColVal->cid < targetCid) {
118,142,314✔
1543
    pColVal = tRowIterNext(iter);
25,313,460✔
1544
  }
1545
  return pColVal;
92,829,120✔
1546
}
1547

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

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

1562
  for (int32_t i = 0; i < nRow; i++) {
41,621,259✔
1563
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
34,870,631✔
1564

1565
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
34,872,911✔
1566
    if (code) goto _exit;
34,873,937✔
1567
  }
1568

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

1576
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
79,159,348✔
1577
    int32_t targetCid = pTSchema->columns[iCol].colId;
72,409,062✔
1578
    SColVal *pColVal = NULL;
72,408,910✔
1579

1580
    switch (strategy) {
72,408,910✔
1581
      case KEEP_CONSISTENCY:
4,032,802✔
1582
        if (nRow > 0)
4,032,802✔
1583
          pColVal = tRowFindColumnValue(aIter[nRow - 1], targetCid);
4,032,802✔
1584
        break;
4,032,802✔
1585

1586
      default:  // default using PREFER_NON_NULL strategy
68,376,108✔
1587
      case PREFER_NON_NULL:
1588
        for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
106,380,356✔
1589
          SColVal *pColValT = tRowFindColumnValue(aIter[iRow], targetCid);
88,794,988✔
1590

1591
          if (COL_VAL_IS_VALUE(pColValT)) {
88,792,442✔
1592
            pColVal = pColValT;
50,791,994✔
1593
            break;
50,791,994✔
1594
          } else if (pColVal == NULL) {
38,004,248✔
1595
            pColVal = pColValT;
19,238,228✔
1596
          }
1597
        }
1598
        break;
68,377,362✔
1599
    }
1600

1601
    if (pColVal) {
72,410,164✔
1602
      if (taosArrayPush(aColVal, pColVal) == NULL) {
72,412,216✔
1603
        code = terrno;
×
1604
        goto _exit;
×
1605
      }
1606
    }
1607
  }
1608

1609
  // build
1610
  SRowBuildScanInfo sinfo = {0};
6,745,422✔
1611
  code = tRowBuild(aColVal, pTSchema, &pRow, &sinfo);
6,747,664✔
1612

1613
  if (code) goto _exit;
6,747,170✔
1614

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

1621
_exit:
6,747,056✔
1622
  if (aIter) {
6,747,094✔
1623
    for (int32_t i = 0; i < nRow; i++) {
41,619,815✔
1624
      tRowIterClose(&aIter[i]);
34,872,683✔
1625
    }
1626
    taosMemoryFree(aIter);
6,747,132✔
1627
  }
1628
  if (aColVal) taosArrayDestroy(aColVal);
6,746,980✔
1629
  if (code) tRowDestroy(pRow);
6,747,132✔
1630
  return code;
6,747,132✔
1631
}
1632
static int32_t tBlobSetTransferTo(SBlobSet *pSrc, SBlobSet *pDst, SColVal *pVal) {
7,590✔
1633
  int32_t code = 0;
7,590✔
1634
  int32_t lino = 0;
7,590✔
1635
  if (COL_VAL_IS_NULL(pVal) || pVal->value.pData == NULL) {
15,180✔
1636
    int8_t type = COL_VAL_IS_NULL(pVal) ? TSDB_DATA_BLOB_NULL_VALUE : TSDB_DATA_BLOB_EMPTY_VALUE;
7,590✔
1637
    code = addEmptyItemToBlobSet(pDst, type, NULL);
7,590✔
1638
    TAOS_CHECK_GOTO(code, &lino, _error);
7,590✔
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:
7,590✔
1659
  return code;
7,590✔
1660
}
1661

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

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

1673
  SRowIter **aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
759✔
1674
  if (aIter == NULL) {
759✔
1675
    TAOS_CHECK_GOTO(terrno, &lino, _error);
×
1676
  }
1677

1678
  for (int32_t i = 0; i < nRow; i++) {
8,349✔
1679
    SRow *pRowT = taosArrayGetP(aRowP, 0 + i);
7,590✔
1680
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
7,590✔
1681
    TAOS_CHECK_GOTO(code, &lino, _error);
7,590✔
1682
  }
1683

1684
  for (int32_t i = 0; i < nRow; i++) {
8,349✔
1685
    SColVal *pColVal = tRowIterNext(aIter[i]);
7,590✔
1686
    do {
1687
      if (COL_VAL_IS_VALUE(pColVal) || COL_VAL_IS_NULL(pColVal)) {
15,180✔
1688
        if (IS_STR_DATA_BLOB(pColVal->value.type)) {
15,180✔
1689
          if (taosArrayPush(aColVal, pColVal) == NULL) {
7,590✔
1690
            code = terrno;
×
1691
            TAOS_CHECK_GOTO(code, &lino, _error);
×
1692
          }
1693
          break;
7,590✔
1694
        }
1695
      }
1696
    } while ((pColVal = tRowIterNext(aIter[i])) != NULL);
7,590✔
1697
  }
1698

1699
  code = tBlobSetCreate(pBlob->cap, pBlob->type, &pTempBlob);
759✔
1700
  TAOS_CHECK_GOTO(code, &lino, _error);
759✔
1701

1702
  for (int32_t i = 0; i < taosArrayGetSize(aColVal); i++) {
8,349✔
1703
    uint64_t seq = 0;
7,590✔
1704
    SColVal *pVal = taosArrayGet(aColVal, i);
7,590✔
1705

1706
    code = tBlobSetTransferTo(pBlob, pTempBlob, pVal);
7,590✔
1707
    TAOS_CHECK_GOTO(code, &lino, _error);
7,590✔
1708
  }
1709

1710
  tBlobSetSwap(pBlob, pTempBlob);
759✔
1711

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

1717
  if (aIter) {
759✔
1718
    for (int32_t i = 0; i < nRow; i++) {
8,349✔
1719
      tRowIterClose(&aIter[i]);
7,590✔
1720
    }
1721
    taosMemoryFree(aIter);
759✔
1722
  }
1723
  if (aColVal) {
759✔
1724
    taosArrayDestroy(aColVal);
759✔
1725
  }
1726
  tBlobSetDestroy(pTempBlob);
759✔
1727
  return code;
759✔
1728
}
1729

1730
static int32_t tRowMergeAndRebuildBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob) {
×
1731
  int32_t code = 0;
×
1732
  int32_t lino = 0;
×
1733

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

1747
  code = tBlobSetCreate(pBlob->cap, pBlob->type, &pTempBlobSet);
×
1748
  TAOS_CHECK_GOTO(code, &lino, _error);
×
1749

1750
  int32_t iStart = 0;
×
1751
  while (iStart < aRowP->size) {
×
1752
    SRowKey key1;
×
1753
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
×
1754

1755
    tRowGetKey(row1, &key1);
×
1756

1757
    int32_t iEnd = iStart + 1;
×
1758
    while (iEnd < aRowP->size) {
×
1759
      SRowKey key2;
×
1760
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
×
1761
      tRowGetKey(row2, &key2);
×
1762

1763
      if (tRowKeyCompare(&key1, &key2) != 0) break;
×
1764

1765
      iEnd++;
×
1766
    }
1767

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

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

1783
_error:
×
1784
  if (pBlob && pTempBlobSet) {
×
1785
    tBlobSetSwap(pBlob, pTempBlobSet);
×
1786
  }
1787

1788
  tBlobSetDestroy(pTempBlobSet);
×
1789
  return code;
×
1790
}
1791

1792
static int32_t tRowMergeWithBlobImpl(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlob, SBlobSet *pDstBlob,
×
1793
                                     int32_t iStart, int32_t iEnd, int8_t flag) {
1794
  int32_t code = 0;
×
1795
  int32_t    lino = 0;
×
1796
  int32_t    nRow = iEnd - iStart;
×
1797
  SRowIter **aIter = NULL;
×
1798
  SArray    *aColVal = NULL;
×
1799
  SRow      *pRow = NULL;
×
1800

1801
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
×
1802
  if (aColVal == NULL) {
×
1803
    code = terrno;
×
1804
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1805
  }
1806

1807
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
×
1808
  if (aIter == NULL) {
×
1809
    code = terrno;
×
1810
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1811
  }
1812

1813
  for (int32_t i = 0; i < nRow; i++) {
×
1814
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
×
1815
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
×
1816
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1817
  }
1818
  // merge
1819

1820
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
×
1821
    SColVal  *pColVal = NULL;
×
1822
    STColumn *pCol = pTSchema->columns + iCol;
×
1823

1824
    for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
×
1825
      SColVal *pColValT = tRowIterNext(aIter[iRow]);
×
1826
      while (pColValT->cid < pTSchema->columns[iCol].colId) {
×
1827
        pColValT = tRowIterNext(aIter[iRow]);
×
1828
      }
1829
      // todo: take strategy according to the flag
1830
      if (COL_VAL_IS_VALUE(pColValT)) {
×
1831
        pColVal = pColValT;
×
1832
        break;
×
1833
      } else if (COL_VAL_IS_NULL(pColValT)) {
×
1834
        if (pColVal == NULL) {
×
1835
          pColVal = pColValT;
×
1836
        }
1837
      }
1838
    }
1839

1840
    if (pColVal) {
×
1841
      if (taosArrayPush(aColVal, pColVal) == NULL) {
×
1842
        code = terrno;
×
1843
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
1844
      }
1845
    }
1846
  }
1847

1848
  // build
1849

1850
  SRowBuildScanInfo sinfo = {.hasBlob = 1};
×
1851
  code = tRowBuildWithBlob2(aColVal, pTSchema, &pRow, pBlob, pDstBlob, &sinfo);
×
1852
  TAOS_CHECK_GOTO(code, &lino, _exit);
×
1853

1854
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
×
1855
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
×
1856
    code = terrno;
×
1857
    TAOS_CHECK_GOTO(code, &lino, _exit);
×
1858
  }
1859

1860
_exit:
×
1861
  if (aIter) {
×
1862
    for (int32_t i = 0; i < nRow; i++) {
×
1863
      tRowIterClose(&aIter[i]);
×
1864
    }
1865
    taosMemoryFree(aIter);
×
1866
  }
1867
  if (aColVal) taosArrayDestroy(aColVal);
×
1868
  if (code) tRowDestroy(pRow);
×
1869

1870
  return code;
×
1871
}
1872

1873
int32_t tRowSort(SArray *aRowP) {
1,448,848✔
1874
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
1,448,848✔
1875
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
1,443,007✔
1876
  if (code != TSDB_CODE_SUCCESS) {
1,443,007✔
1877
    uError("taosArrayMSort failed caused by %d", code);
×
1878
  }
1879
  return code;
1,443,007✔
1880
}
1881

1882
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, ERowMergeStrategy strategy) {
1,584,364✔
1883
  int32_t code = 0;
1,584,364✔
1884

1885
  int32_t iStart = 0;
1,584,364✔
1886
  while (iStart < aRowP->size) {
36,765,841✔
1887
    SRowKey key1;
35,173,434✔
1888
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
35,182,237✔
1889

1890
    tRowGetKey(row1, &key1);
70,356,836✔
1891

1892
    int32_t iEnd = iStart + 1;
35,179,045✔
1893
    while (iEnd < aRowP->size) {
63,302,696✔
1894
      SRowKey key2;
61,709,297✔
1895
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
61,717,078✔
1896
      tRowGetKey(row2, &key2);
123,432,674✔
1897

1898
      if (tRowKeyCompare(&key1, &key2) != 0) break;
61,726,502✔
1899

1900
      iEnd++;
28,127,755✔
1901
    }
1902

1903
    if (iEnd - iStart > 1) {
35,180,489✔
1904
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, strategy);
6,747,056✔
1905
      if (code) return code;
6,746,942✔
1906
    }
1907

1908
    // the array is also changing, so the iStart just ++ instead of iEnd
1909
    iStart++;
35,180,375✔
1910
  }
1911

1912
  return code;
1,584,364✔
1913
}
1914

1915
int32_t tRowSortWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlobSet) {
759✔
1916
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
759✔
1917
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
759✔
1918
  if (code != TSDB_CODE_SUCCESS) {
759✔
1919
    uError("taosArrayMSort failed caused by %d", code);
×
1920
    return code;
×
1921
  }
1922
  return code;
759✔
1923
}
1924

1925
int8_t tRowNeedDoMerge(SArray *aRowP) {
759✔
1926
  if (aRowP == NULL || aRowP->size <= 1) return 0;
759✔
1927

1928
  int8_t  doMerge = 0;
759✔
1929
  int32_t iStart = 0;
759✔
1930
  while (iStart < aRowP->size) {
8,349✔
1931
    SRowKey key1;
7,590✔
1932
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
7,590✔
1933

1934
    tRowGetKey(row1, &key1);
15,180✔
1935

1936
    int32_t iEnd = iStart + 1;
7,590✔
1937
    while (iEnd < aRowP->size) {
7,590✔
1938
      SRowKey key2;
6,831✔
1939
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
6,831✔
1940
      tRowGetKey(row2, &key2);
13,662✔
1941

1942
      if (tRowKeyCompare(&key1, &key2) != 0) break;
6,831✔
1943

1944
      iEnd++;
×
1945
    }
1946

1947
    if (iEnd - iStart > 1) {
7,590✔
1948
      doMerge = 1;
×
1949
      break;
×
1950
    }
1951
    iStart++;
7,590✔
1952
  }
1953
  return doMerge;
759✔
1954
}
1955

1956
int32_t tRowMergeWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlobSet, int8_t flag) {
759✔
1957
  int32_t code = 0;
759✔
1958

1959
  int8_t doMerge = tRowNeedDoMerge(aRowP);
759✔
1960
  if (!doMerge) {
759✔
1961
    code = tRowRebuildBlob(aRowP, pTSchema, pBlobSet);
759✔
1962
  } else {
1963
    code = tRowRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1964
    TAOS_CHECK_RETURN(code);
×
1965

1966
    code = tRowMergeAndRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1967
  }
1968
  return code;
759✔
1969
}
1970

1971
// SRowIter ========================================
1972
struct SRowIter {
1973
  SRow     *pRow;
1974
  STSchema *pTSchema;
1975

1976
  int32_t iTColumn;
1977
  union {
1978
    struct {  // kv
1979
      int32_t iCol;
1980
      SKVIdx *pIdx;
1981
    };
1982
    struct {  // tuple
1983
      uint8_t *pb;
1984
      uint8_t *pf;
1985
    };
1986
  };
1987
  uint8_t *pv;
1988
  SColVal  cv;
1989
};
1990

1991
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
36,765,287✔
1992
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
36,765,287✔
1993

1994
  int32_t code = 0;
36,763,615✔
1995

1996
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
36,763,615✔
1997
  if (pIter == NULL) {
36,763,393✔
1998
    code = terrno;
×
1999
    goto _exit;
×
2000
  }
2001

2002
  pIter->pRow = pRow;
36,763,393✔
2003
  pIter->pTSchema = pTSchema;
36,763,431✔
2004
  pIter->iTColumn = 0;
36,763,697✔
2005

2006
  if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
36,764,033✔
2007

2008
  uint8_t         *data = pRow->data;
36,623,178✔
2009
  SPrimaryKeyIndex index;
36,618,728✔
2010
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
36,766,869✔
2011
    data += tGetPrimaryKeyIndex(data, &index);
145,173✔
2012
  }
2013

2014
  if (pRow->flag >> 4) {
36,622,228✔
2015
    pIter->iCol = 0;
4,312,785✔
2016
    pIter->pIdx = (SKVIdx *)data;
4,312,785✔
2017
    if (pRow->flag & KV_FLG_LIT) {
4,312,785✔
2018
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
4,312,785✔
2019
    } else if (pRow->flag & KV_FLG_MID) {
×
2020
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
×
2021
    } else {
2022
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
×
2023
    }
2024
  } else {
2025
    switch (pRow->flag) {
32,309,405✔
2026
      case (HAS_NULL | HAS_NONE):
2,814✔
2027
        pIter->pb = data;
2,814✔
2028
        break;
2,814✔
2029
      case HAS_VALUE:
29,572,115✔
2030
        pIter->pf = data;
29,572,115✔
2031
        pIter->pv = pIter->pf + pTSchema->flen;
29,572,267✔
2032
        break;
29,573,445✔
2033
      case (HAS_VALUE | HAS_NONE):
2,734,514✔
2034
      case (HAS_VALUE | HAS_NULL):
2035
        pIter->pb = data;
2,734,514✔
2036
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
2,734,514✔
2037
        pIter->pv = pIter->pf + pTSchema->flen;
2,734,514✔
2038
        break;
2,734,514✔
2039
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2040
        pIter->pb = data;
×
2041
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
2042
        pIter->pv = pIter->pf + pTSchema->flen;
×
2043
        break;
×
2044
      default:
×
2045
        break;
×
2046
    }
2047
  }
2048

2049
_exit:
36,766,389✔
2050
  if (code) {
36,766,009✔
2051
    *ppIter = NULL;
×
2052
  } else {
2053
    *ppIter = pIter;
36,766,009✔
2054
  }
2055
  return code;
36,765,971✔
2056
}
2057

2058
void tRowIterClose(SRowIter **ppIter) {
36,764,793✔
2059
  SRowIter *pIter = *ppIter;
36,764,793✔
2060
  if (pIter) {
36,765,059✔
2061
    taosMemoryFree(pIter);
36,765,135✔
2062
  }
2063
  *ppIter = NULL;
36,765,021✔
2064
}
36,765,211✔
2065

2066
SColVal *tRowIterNext(SRowIter *pIter) {
128,087,009✔
2067
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
128,087,009✔
2068
    return NULL;
1,402,486✔
2069
  }
2070

2071
  STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
126,686,955✔
2072

2073
  // timestamp
2074
  if (0 == pIter->iTColumn) {
126,689,349✔
2075
    pIter->cv.cid = pTColumn->colId;
12,058,672✔
2076
    pIter->cv.value.type = pTColumn->type;
12,058,558✔
2077
    pIter->cv.flag = CV_FLAG_VALUE;
12,058,146✔
2078
    VALUE_SET_TRIVIAL_DATUM(&pIter->cv.value, pIter->pRow->ts);
12,058,520✔
2079
    goto _exit;
12,058,222✔
2080
  }
2081

2082
  if (pIter->pRow->flag == HAS_NONE) {
114,631,589✔
2083
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
140,162✔
2084
    goto _exit;
140,162✔
2085
  }
2086

2087
  if (pIter->pRow->flag == HAS_NULL) {
114,488,040✔
2088
    pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
334,030✔
2089
    goto _exit;
334,030✔
2090
  }
2091

2092
  if (pIter->pRow->flag >> 4) {  // KV
114,157,886✔
2093
    if (pIter->iCol < pIter->pIdx->nCol) {
73,766,631✔
2094
      uint8_t *pData;
2095

2096
      if (pIter->pRow->flag & KV_FLG_LIT) {
40,839,333✔
2097
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
40,839,333✔
2098
      } else if (pIter->pRow->flag & KV_FLG_MID) {
×
2099
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
×
2100
      } else {
2101
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
2102
      }
2103

2104
      int16_t cid;
40,839,333✔
2105
      pData += tGetI16v(pData, &cid);
40,839,333✔
2106

2107
      if (TABS(cid) == pTColumn->colId) {
40,839,333✔
2108
        if (cid < 0) {
39,569,545✔
2109
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,248,535✔
2110
        } else {
2111
          pIter->cv.cid = pTColumn->colId;
36,321,010✔
2112
          pIter->cv.value.type = pTColumn->type;
36,321,010✔
2113
          pIter->cv.flag = CV_FLAG_VALUE;
36,321,010✔
2114

2115
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
36,321,010✔
2116
            pData += tGetU32v(pData, &pIter->cv.value.nData);
15,467,562✔
2117
            if (pIter->cv.value.nData > 0) {
7,733,781✔
2118
              pIter->cv.value.pData = pData;
7,732,443✔
2119
            } else {
2120
              pIter->cv.value.pData = NULL;
1,338✔
2121
              // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2122
              //   pIter->cv.value.pData = pData;
2123
              // }
2124
            }
2125
          } else {
2126
            valueSetDatum(&pIter->cv.value, pTColumn->type, pData, pTColumn->bytes);
28,587,229✔
2127
          }
2128
        }
2129

2130
        pIter->iCol++;
39,569,545✔
2131
        goto _exit;
39,569,545✔
2132
      } else if (TABS(cid) > pTColumn->colId) {
1,269,788✔
2133
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,269,788✔
2134
        goto _exit;
1,269,788✔
2135
      } else {
2136
        uError("unexpected column id %d, %d", cid, pTColumn->colId);
×
2137
        goto _exit;
×
2138
      }
2139
    } else {
2140
      pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
32,927,298✔
2141
      goto _exit;
32,927,298✔
2142
    }
2143
  } else {  // Tuple
2144
    uint8_t bv = BIT_FLG_VALUE;
40,391,027✔
2145
    if (pIter->pb) {
40,391,027✔
2146
      switch (pIter->pRow->flag) {
14,513,606✔
2147
        case (HAS_NULL | HAS_NONE):
25,390✔
2148
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
25,390✔
2149
          break;
25,390✔
2150
        case (HAS_VALUE | HAS_NONE):
8,813,972✔
2151
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
8,813,972✔
2152
          if (bv) bv++;
8,813,972✔
2153
          break;
8,813,972✔
2154
        case (HAS_VALUE | HAS_NULL):
5,674,244✔
2155
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
5,674,244✔
2156
          break;
5,674,244✔
2157
        case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2158
          bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
×
2159
          break;
×
2160
        default:
×
2161
          break;
×
2162
      }
2163

2164
      if (bv == BIT_FLG_NONE) {
14,513,606✔
2165
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
906,818✔
2166
        goto _exit;
906,818✔
2167
      } else if (bv == BIT_FLG_NULL) {
13,606,788✔
2168
        pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,000,141✔
2169
        goto _exit;
1,000,141✔
2170
      }
2171
    }
2172

2173
    pIter->cv.cid = pTColumn->colId;
38,483,726✔
2174
    pIter->cv.value.type = pTColumn->type;
38,483,878✔
2175
    pIter->cv.flag = CV_FLAG_VALUE;
38,484,182✔
2176
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
45,850,144✔
2177
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
7,367,639✔
2178
      pData += tGetU32v(pData, &pIter->cv.value.nData);
14,734,619✔
2179
      if (pIter->cv.value.nData > 0) {
7,367,449✔
2180
        pIter->cv.value.pData = pData;
7,327,093✔
2181
      } else {
2182
        pIter->cv.value.pData = NULL;
40,280✔
2183
        // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2184
        //   pIter->cv.value.pData = pData;
2185
        // }
2186
      }
2187
    } else {
2188
      valueSetDatum(&pIter->cv.value, pTColumn->type, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
31,115,973✔
2189
    }
2190
    goto _exit;
38,480,681✔
2191
  }
2192

2193
_exit:
126,686,685✔
2194
  pIter->iTColumn++;
126,686,685✔
2195
  return &pIter->cv;
126,684,828✔
2196
}
2197

2198
static int32_t tRowNoneUpsertColData(SColData *aColData, int32_t nColData, int32_t flag) {
709,513✔
2199
  int32_t code = 0;
709,513✔
2200

2201
  if (flag) return code;
709,513✔
2202

2203
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
5,612,422✔
2204
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
5,142,885✔
2205
    if (code) return code;
5,142,885✔
2206
  }
2207

2208
  return code;
469,537✔
2209
}
2210
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
51,505,399✔
2211
  int32_t code = 0;
51,505,399✔
2212

2213
  int32_t   iColData = 0;
51,505,399✔
2214
  SColData *pColData = &aColData[iColData];
51,505,399✔
2215
  int32_t   iTColumn = 1;
51,505,767✔
2216
  STColumn *pTColumn = &pSchema->columns[iTColumn];
51,505,767✔
2217

2218
  while (pColData) {
332,277,909✔
2219
    if (pTColumn) {
280,769,215✔
2220
      if (pTColumn->colId == pColData->cid) {  // NULL
280,769,215✔
2221
        if (flag == 0) {
280,774,550✔
2222
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
280,774,550✔
2223
        } else {
2224
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
×
2225
        }
2226
        if (code) goto _exit;
280,772,173✔
2227

2228
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
280,772,173✔
2229
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
280,789,683✔
2230
      } else if (pTColumn->colId > pColData->cid) {  // NONE
×
2231
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2232
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2233
      } else {
2234
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
×
2235
      }
2236
    } else {  // NONE
2237
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2238
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2239
    }
2240
  }
2241

2242
_exit:
51,508,694✔
2243
  return code;
51,508,694✔
2244
}
2245
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
2,147,483,647✔
2246
                                      int32_t flag) {
2247
  int32_t code = 0;
2,147,483,647✔
2248

2249
  int32_t   iColData = 0;
2,147,483,647✔
2250
  SColData *pColData = &aColData[iColData];
2,147,483,647✔
2251
  int32_t   iTColumn = 1;
2,147,483,647✔
2252
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
2,147,483,647✔
2253

2254
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
2,147,483,647✔
2255
  SPrimaryKeyIndex index;
2,147,483,647✔
2256
  uint8_t         *data = pRow->data;
2,147,483,647✔
2257
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
2258
    data += tGetPrimaryKeyIndex(data, &index);
56,012,486✔
2259
  }
2260

2261
  switch (pRow->flag) {
2,147,483,647✔
2262
    case HAS_VALUE:
2,147,483,647✔
2263
      pf = data;  // TODO: fix here
2,147,483,647✔
2264
      pv = pf + pTSchema->flen;
2,147,483,647✔
2265
      break;
2,147,483,647✔
2266
    case (HAS_NULL | HAS_NONE):
172,329✔
2267
      pb = data;
172,329✔
2268
      break;
172,329✔
2269
    case (HAS_VALUE | HAS_NONE):
395,806,761✔
2270
    case (HAS_VALUE | HAS_NULL):
2271
      pb = data;
395,806,761✔
2272
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
395,806,761✔
2273
      pv = pf + pTSchema->flen;
395,806,978✔
2274
      break;
395,807,904✔
UNCOV
2275
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
UNCOV
2276
      pb = data;
×
UNCOV
2277
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
×
2278
      pv = pf + pTSchema->flen;
×
2279
      break;
×
2280
    default:
×
2281
      return TSDB_CODE_INVALID_DATA_FMT;
×
2282
  }
2283

2284
  while (pColData) {
2,147,483,647✔
2285
    if (pTColumn) {
2,147,483,647✔
2286
      if (pTColumn->colId == pColData->cid) {
2,147,483,647✔
2287
        if (!(pTColumn->type == pColData->type)) {
2,147,483,647✔
2288
          return TSDB_CODE_INVALID_PARA;
×
2289
        }
2290
        if (pb) {
2,147,483,647✔
2291
          uint8_t bv;
2292
          switch (pRow->flag) {
1,685,973,341✔
2293
            case (HAS_NULL | HAS_NONE):
3,402,445✔
2294
              bv = GET_BIT1(pb, iTColumn - 1);
3,402,445✔
2295
              break;
3,402,445✔
2296
            case (HAS_VALUE | HAS_NONE):
60,002,911✔
2297
              bv = GET_BIT1(pb, iTColumn - 1);
60,002,911✔
2298
              if (bv) bv++;
60,010,205✔
2299
              break;
60,010,205✔
2300
            case (HAS_VALUE | HAS_NULL):
1,622,580,841✔
2301
              bv = GET_BIT1(pb, iTColumn - 1) + 1;
1,622,580,841✔
2302
              break;
1,622,629,866✔
2303
            case (HAS_VALUE | HAS_NULL | HAS_NONE):
8,211✔
2304
              bv = GET_BIT2(pb, iTColumn - 1);
8,211✔
2305
              break;
×
2306
            default:
×
2307
              return TSDB_CODE_INVALID_DATA_FMT;
×
2308
          }
2309

2310
          if (bv == BIT_FLG_NONE) {
1,686,042,516✔
2311
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
7,559,980✔
2312
              goto _exit;
×
2313
            goto _continue;
7,558,814✔
2314
          } else if (bv == BIT_FLG_NULL) {
1,678,482,536✔
2315
            if (flag == 0) {
474,293,290✔
2316
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
473,951,786✔
2317
            } else {
2318
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
341,504✔
2319
            }
2320
            if (code) goto _exit;
474,280,325✔
2321
            goto _continue;
474,280,325✔
2322
          }
2323
        }
2324

2325
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
2326
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
2,147,483,647✔
2327
          uint32_t nData;
2,147,483,647✔
2328
          pData += tGetU32v(pData, &nData);
2,147,483,647✔
2329
          if (flag == 0) {
2,147,483,647✔
2330
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
2,147,483,647✔
2331
          } else {
2332
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
463,710,743✔
2333
          }
2334
          if (code) goto _exit;
2,147,483,647✔
2335
        } else {
2336
          if (flag == 0) {
2,147,483,647✔
2337
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
2338
                                                                          TYPE_BYTES[pColData->type]);
2,147,483,647✔
2339
          } else {
2340
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
2341
                                                                          TYPE_BYTES[pColData->type], flag > 0);
1,257,528,584✔
2342
          }
2343
          if (code) goto _exit;
2,147,483,647✔
2344
        }
2345

2346
      _continue:
2,147,483,647✔
2347
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
2348
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
2349
      } else if (pTColumn->colId > pColData->cid) {  // NONE
77,900,984✔
2350
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2351
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2352
      } else {
2353
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
77,901,676✔
2354
      }
2355
    } else {
2356
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
50,055,150✔
2357
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
50,055,150✔
2358
    }
2359
  }
2360

2361
_exit:
2,147,483,647✔
2362
  return code;
2,147,483,647✔
2363
}
2364
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
1,717,835,890✔
2365
  int32_t code = 0;
1,717,835,890✔
2366

2367
  uint8_t  *pv = NULL;
1,717,835,890✔
2368
  int32_t   iColData = 0;
1,717,835,890✔
2369
  SColData *pColData = &aColData[iColData];
1,717,835,890✔
2370
  int32_t   iTColumn = 1;
1,717,928,846✔
2371
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
1,717,928,846✔
2372
  int32_t   iCol = 0;
1,717,969,795✔
2373

2374
  // primary keys
2375
  uint8_t         *data = pRow->data;
1,717,969,795✔
2376
  SPrimaryKeyIndex index;
1,717,968,110✔
2377
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,723,048,268✔
2378
    data += tGetPrimaryKeyIndex(data, &index);
5,088,614✔
2379
  }
2380

2381
  SKVIdx *pKVIdx = (SKVIdx *)data;
1,717,947,666✔
2382
  if (pRow->flag & KV_FLG_LIT) {
1,717,947,666✔
2383
    pv = pKVIdx->idx + pKVIdx->nCol;
1,707,293,444✔
2384
  } else if (pRow->flag & KV_FLG_MID) {
10,648,147✔
2385
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
10,648,710✔
2386
  } else if (pRow->flag & KV_FLG_BIG) {
×
2387
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
2388
  } else {
2389
    return TSDB_CODE_INVALID_PARA;
×
2390
  }
2391

2392
  while (pColData) {
2,147,483,647✔
2393
    if (pTColumn) {
2,147,483,647✔
2394
      if (pTColumn->colId == pColData->cid) {
2,147,483,647✔
2395
        while (iCol < pKVIdx->nCol) {
2,147,483,647✔
2396
          uint8_t *pData;
2397
          if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
2398
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
2,147,483,647✔
2399
          } else if (pRow->flag & KV_FLG_MID) {
287,152,799✔
2400
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
287,526,926✔
2401
          } else if (pRow->flag & KV_FLG_BIG) {
×
2402
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
2403
          } else {
2404
            return TSDB_CODE_INVALID_DATA_FMT;
×
2405
          }
2406

2407
          int16_t cid;
2,147,483,647✔
2408
          pData += tGetI16v(pData, &cid);
2,147,483,647✔
2409

2410
          if (TABS(cid) == pTColumn->colId) {
2,147,483,647✔
2411
            if (cid < 0) {
2,147,483,647✔
2412
              if (flag == 0) {
2,123,548,977✔
2413
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2,123,557,978✔
2414
              } else {
2415
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
9,075✔
2416
              }
2417
              if (code) goto _exit;
2,120,666,615✔
2418
            } else {
2419
              uint32_t nData;
2,147,483,647✔
2420
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647✔
2421
                pData += tGetU32v(pData, &nData);
922,042,532✔
2422
              } else {
2423
                nData = 0;
2,147,483,647✔
2424
              }
2425
              if (flag == 0) {
2,147,483,647✔
2426
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
2,147,483,647✔
2427
              } else {
2428
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
5,006,912✔
2429
              }
2430
              if (code) goto _exit;
2,147,483,647✔
2431
            }
2432
            iCol++;
2,147,483,647✔
2433
            goto _continue;
2,147,483,647✔
2434
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
2,147,483,647✔
2435
            break;
2,147,483,647✔
2436
          } else {
2437
            iCol++;
4,257,000✔
2438
          }
2439
        }
2440

2441
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
2,147,483,647✔
2442

2443
      _continue:
2,147,483,647✔
2444
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
2445
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
2446
      } else if (pTColumn->colId > pColData->cid) {
4,257,000✔
2447
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2448
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2449
      } else {
2450
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
4,257,000✔
2451
      }
2452
    } else {
2453
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
7,773✔
2454
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
7,773✔
2455
    }
2456
  }
2457

2458
_exit:
1,717,577,323✔
2459
  return code;
1,717,860,624✔
2460
}
2461
/* flag > 0: forward update
2462
 * flag == 0: append
2463
 * flag < 0: backward update
2464
 */
2465
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
2,147,483,647✔
2466
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
2467
  if (!(nColData > 0)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
2468

2469
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
2470
    return tRowNoneUpsertColData(aColData, nColData, flag);
709,943✔
2471
  } else if (pRow->flag == HAS_NULL) {
2,147,483,647✔
2472
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
51,505,767✔
2473
  } else if (pRow->flag >> 4) {  // KV row
2,147,483,647✔
2474
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
1,717,843,745✔
2475
  } else {  // TUPLE row
2476
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
2,147,483,647✔
2477
  }
2478
}
2479

2480
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
667,764,986✔
2481
  key->numOfPKs = row->numOfPKs;
667,764,986✔
2482

2483
  if (key->numOfPKs == 0) {
667,782,061✔
2484
    return;
×
2485
  }
2486

2487
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
661,830,298✔
2488

2489
  uint8_t *data = row->data;
667,800,717✔
2490

2491
  for (int32_t i = 0; i < row->numOfPKs; i++) {
1,335,633,165✔
2492
    data += tGetPrimaryKeyIndex(data, &indices[i]);
667,791,026✔
2493
  }
2494

2495
  // primary keys
2496
  for (int32_t i = 0; i < row->numOfPKs; i++) {
1,335,529,948✔
2497
    key->pks[i].type = indices[i].type;
667,788,285✔
2498

2499
    uint8_t *tdata = data + indices[i].offset;
667,781,820✔
2500
    if (row->flag >> 4) {
667,778,630✔
2501
      tdata += tGetI16v(tdata, NULL);
119,834,638✔
2502
    }
2503

2504
    if (IS_VAR_DATA_TYPE(indices[i].type)) {
667,805,189✔
2505
      key->pks[i].pData = tdata;
104,048,091✔
2506
      key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
208,134,213✔
2507
    } else {
2508
      valueSetDatum(key->pks + i, indices[i].type, tdata, tDataTypes[indices[i].type].bytes);
563,776,044✔
2509
    }
2510
  }
2511
}
2512

2513
#define T_COMPARE_SCALAR_VALUE(TYPE, V1, V2)    \
2514
  do {                                          \
2515
    if (*(TYPE *)(V1) < *(TYPE *)(V2)) {        \
2516
      return -1;                                \
2517
    } else if (*(TYPE *)(V1) > *(TYPE *)(V2)) { \
2518
      return 1;                                 \
2519
    } else {                                    \
2520
      return 0;                                 \
2521
    }                                           \
2522
  } while (0)
2523

2524
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
1,096,395,951✔
2525
  switch (tv1->type) {
1,096,395,951✔
2526
    case TSDB_DATA_TYPE_BOOL:
×
2527
    case TSDB_DATA_TYPE_TINYINT:
2528
      T_COMPARE_SCALAR_VALUE(int8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2529
    case TSDB_DATA_TYPE_SMALLINT:
×
2530
      T_COMPARE_SCALAR_VALUE(int16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2531
    case TSDB_DATA_TYPE_INT:
479,064,424✔
2532
      T_COMPARE_SCALAR_VALUE(int32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
479,064,424✔
2533
    case TSDB_DATA_TYPE_BIGINT:
130,542,277✔
2534
    case TSDB_DATA_TYPE_TIMESTAMP:
2535
      T_COMPARE_SCALAR_VALUE(int64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
130,542,277✔
2536
    case TSDB_DATA_TYPE_FLOAT:
×
2537
      T_COMPARE_SCALAR_VALUE(float, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2538
    case TSDB_DATA_TYPE_DOUBLE:
×
2539
      T_COMPARE_SCALAR_VALUE(double, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2540
    case TSDB_DATA_TYPE_UTINYINT:
×
2541
      T_COMPARE_SCALAR_VALUE(uint8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2542
    case TSDB_DATA_TYPE_USMALLINT:
×
2543
      T_COMPARE_SCALAR_VALUE(uint16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2544
    case TSDB_DATA_TYPE_UINT:
130,474,603✔
2545
      T_COMPARE_SCALAR_VALUE(uint32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
130,474,603✔
2546
    case TSDB_DATA_TYPE_UBIGINT:
130,942,420✔
2547
      T_COMPARE_SCALAR_VALUE(uint64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
130,942,420✔
2548
    case TSDB_DATA_TYPE_GEOMETRY:
225,396,130✔
2549
    case TSDB_DATA_TYPE_BINARY: {
2550
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
225,396,130✔
2551
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
225,411,265✔
2552
    }
2553
    case TSDB_DATA_TYPE_NCHAR: {
×
2554
      int32_t ret = taosUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
2555
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2556
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2557
    }
2558
    case TSDB_DATA_TYPE_VARBINARY: {
×
2559
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2560
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2561
    }
2562
    default:
×
2563
      break;
×
2564
  }
2565

2566
  return 0;
×
2567
}
2568

2569
// NOTE:
2570
// set key->numOfPKs to 0 as the smallest key with ts
2571
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
2572
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
2,147,483,647✔
2573
  if (key1->ts < key2->ts) {
2,147,483,647✔
2574
    return -1;
2,147,483,647✔
2575
  } else if (key1->ts > key2->ts) {
2,147,483,647✔
2576
    return 1;
2,147,483,647✔
2577
  }
2578

2579
  if (key1->numOfPKs == key2->numOfPKs) {
2,147,483,647✔
2580
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
2,147,483,647✔
2581
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
1,096,490,663✔
2582
      if (ret) return ret;
1,096,405,374✔
2583
    }
2584
  } else if (key1->numOfPKs < key2->numOfPKs) {
5,319✔
2585
    return -1;
5,319✔
2586
  } else {
2587
    return 1;
×
2588
  }
2589

2590
  return 0;
2,147,483,647✔
2591
}
2592

2593
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
2,147,483,647✔
2594
  pDst->ts = pSrc->ts;
2,147,483,647✔
2595
  pDst->numOfPKs = pSrc->numOfPKs;
2,147,483,647✔
2596

2597
  if (pSrc->numOfPKs > 0) {
2,147,483,647✔
2598
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
2,147,483,647✔
2599
      SValue *pVal = &pDst->pks[i];
1,259,040,670✔
2600
      pVal->type = pSrc->pks[i].type;
1,259,015,998✔
2601

2602
      valueCloneDatum(pVal, pSrc->pks + i, pVal->type);
1,259,154,434✔
2603
    }
2604
  }
2605
}
2,147,483,647✔
2606

2607
// STag ========================================
2608
static int tTagValCmprFn(const void *p1, const void *p2) {
2,147,483,647✔
2609
  if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
2,147,483,647✔
2610
    return -1;
2,147,483,647✔
2611
  } else if (((STagVal *)p1)->cid > ((STagVal *)p2)->cid) {
2,147,483,647✔
2612
    return 1;
2,147,483,647✔
2613
  }
2614

2615
  return 0;
2,147,483,647✔
2616
}
2617
static int tTagValJsonCmprFn(const void *p1, const void *p2) {
4,095,586✔
2618
  return strcmp(((STagVal *)p1)[0].pKey, ((STagVal *)p2)[0].pKey);
4,095,586✔
2619
}
2620

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

2677
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln) {
2678
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
2679
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
2680
  uint8_t *p = NULL;
2681
  int16_t  offset = 0;
2682

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

2714
static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
368,254,308✔
2715
  int32_t n = 0;
368,254,308✔
2716

2717
  // key
2718
  if (isJson) {
368,254,308✔
2719
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
2,456,104✔
2720
  } else {
2721
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
734,028,228✔
2722
  }
2723

2724
  // type
2725
  n += tPutI8(p ? p + n : p, pTagVal->type);
368,230,024✔
2726

2727
  // value
2728
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
368,276,610✔
2729
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
321,692,101✔
2730
  } else {
2731
    p = p ? p + n : p;
207,405,115✔
2732
    n += tDataTypes[pTagVal->type].bytes;
207,404,256✔
2733
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
207,360,349✔
2734
  }
2735

2736
  return n;
368,202,927✔
2737
}
2738
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
2,147,483,647✔
2739
  int32_t n = 0;
2,147,483,647✔
2740

2741
  // key
2742
  if (isJson) {
2,147,483,647✔
2743
    n += tGetCStr(p + n, &pTagVal->pKey);
9,322,206✔
2744
  } else {
2745
    n += tGetI16v(p + n, &pTagVal->cid);
2,147,483,647✔
2746
  }
2747

2748
  // type
2749
  n += tGetI8(p + n, &pTagVal->type);
2,147,483,647✔
2750

2751
  // value
2752
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
2,147,483,647✔
2753
    n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
2,147,483,647✔
2754
  } else {
2755
    (void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
2,147,483,647✔
2756
    n += tDataTypes[pTagVal->type].bytes;
2,147,483,647✔
2757
  }
2758

2759
  return n;
2,147,483,647✔
2760
}
2761

2762
bool tTagIsJson(const void *pTag) { return (((const STag *)pTag)->flags & TD_TAG_JSON); }
10,329,778✔
2763

2764
bool tTagIsJsonNull(void *data) {
1,263,967✔
2765
  STag  *pTag = (STag *)data;
1,263,967✔
2766
  int8_t isJson = tTagIsJson(pTag);
1,263,967✔
2767
  if (!isJson) return false;
1,263,563✔
2768
  return ((STag *)data)->nTag == 0;
742,939✔
2769
}
2770

2771
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
80,463,381✔
2772
  int32_t  code = 0;
80,463,381✔
2773
  uint8_t *p = NULL;
80,463,381✔
2774
  int16_t  n = 0;
80,463,381✔
2775
  int16_t  nTag = taosArrayGetSize(pArray);
80,463,381✔
2776
  int32_t  szTag = 0;
80,459,372✔
2777
  int8_t   isLarge = 0;
80,459,372✔
2778

2779
  // sort
2780
  if (isJson) {
80,459,372✔
2781
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
400,483✔
2782
  } else {
2783
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
80,058,889✔
2784
  }
2785

2786
  // get size
2787
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
264,525,423✔
2788
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
184,123,660✔
2789
  }
2790
  if (szTag <= INT8_MAX) {
80,401,763✔
2791
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
72,408,757✔
2792
  } else {
2793
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
7,993,014✔
2794
    isLarge = 1;
7,993,014✔
2795
  }
2796

2797
  // build tag
2798
  (*ppTag) = (STag *)taosMemoryCalloc(szTag, 1);
80,401,763✔
2799
  if ((*ppTag) == NULL) {
80,457,924✔
2800
    code = terrno;
×
2801
    goto _err;
×
2802
  }
2803
  (*ppTag)->flags = 0;
80,459,213✔
2804
  if (isJson) {
80,472,779✔
2805
    (*ppTag)->flags |= TD_TAG_JSON;
400,483✔
2806
  }
2807
  if (isLarge) {
80,472,779✔
2808
    (*ppTag)->flags |= TD_TAG_LARGE;
8,001,879✔
2809
  }
2810
  (*ppTag)->len = szTag;
80,472,779✔
2811
  (*ppTag)->nTag = nTag;
80,463,078✔
2812
  (*ppTag)->ver = version;
80,436,680✔
2813

2814
  if (isLarge) {
80,397,653✔
2815
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
8,001,879✔
2816
  } else {
2817
    p = (uint8_t *)&(*ppTag)->idx[nTag];
72,395,774✔
2818
  }
2819
  n = 0;
80,452,104✔
2820
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
264,576,344✔
2821
    if (isLarge) {
184,118,984✔
2822
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
46,809,681✔
2823
    } else {
2824
      (*ppTag)->idx[iTag] = n;
137,309,303✔
2825
    }
2826
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
184,088,076✔
2827
  }
2828
#ifdef TD_DEBUG_PRINT_TAG
2829
  debugPrintSTag(*ppTag, __func__, __LINE__);
2830
#endif
2831

2832
  return code;
80,457,360✔
2833

2834
_err:
×
2835
  return code;
×
2836
}
2837

2838
void tTagFree(STag *pTag) {
1,100,580,244✔
2839
  if (pTag) taosMemoryFree(pTag);
1,100,580,244✔
2840
}
1,100,580,244✔
2841

2842
char *tTagValToData(const STagVal *value, bool isJson) {
891,620,192✔
2843
  if (!value) {
891,620,192✔
2844
    return NULL;
×
2845
  }
2846

2847
  char  *data = NULL;
891,620,192✔
2848
  int8_t typeBytes = 0;
891,620,192✔
2849
  if (isJson) {
891,620,192✔
2850
    typeBytes = CHAR_BYTES;
2,122,658✔
2851
  }
2852

2853
  if (IS_VAR_DATA_TYPE(value->type)) {
891,620,192✔
2854
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
311,253,633✔
2855
    if (data == NULL) {
310,937,295✔
2856
      return NULL;
×
2857
    }
2858

2859
    if (isJson) {
310,937,295✔
2860
      *data = value->type;
1,636,778✔
2861
    }
2862

2863
    varDataLen(data + typeBytes) = value->nData;
310,937,295✔
2864
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
310,982,516✔
2865
  } else {
2866
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
580,701,993✔
2867
  }
2868

2869
  return data;
891,751,655✔
2870
}
2871

2872
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
2,147,483,647✔
2873
  if (!pTag || !pTagVal) {
2,147,483,647✔
2874
    return false;
×
2875
  }
2876

2877
  int16_t  lidx = 0;
2,147,483,647✔
2878
  int16_t  ridx = pTag->nTag - 1;
2,147,483,647✔
2879
  int16_t  midx;
2880
  uint8_t *p;
2881
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
2,147,483,647✔
2882
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
2,147,483,647✔
2883
  int16_t  offset;
2884
  STagVal  tv;
2,147,483,647✔
2885
  int      c;
2886

2887
  if (isLarge) {
2,147,483,647✔
2888
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
716,392,436✔
2889
  } else {
2890
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1,619,553,422✔
2891
  }
2892

2893
  pTagVal->type = TSDB_DATA_TYPE_NULL;
2,147,483,647✔
2894
  pTagVal->pData = NULL;
2,147,483,647✔
2895
  pTagVal->nData = 0;
2,147,483,647✔
2896
  while (lidx <= ridx) {
2,147,483,647✔
2897
    midx = (lidx + ridx) / 2;
2,147,483,647✔
2898
    if (isLarge) {
2,147,483,647✔
2899
      offset = ((int16_t *)pTag->idx)[midx];
2,147,483,647✔
2900
    } else {
2901
      offset = pTag->idx[midx];
2,147,483,647✔
2902
    }
2903

2904
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
2,147,483,647✔
2905
    if (isJson) {
2,147,483,647✔
2906
      c = tTagValJsonCmprFn(pTagVal, &tv);
3,582,876✔
2907
    } else {
2908
      c = tTagValCmprFn(pTagVal, &tv);
2,147,483,647✔
2909
    }
2910

2911
    if (c < 0) {
2,147,483,647✔
2912
      ridx = midx - 1;
2,040,722,666✔
2913
    } else if (c > 0) {
2,147,483,647✔
2914
      lidx = midx + 1;
2,147,483,647✔
2915
    } else {
2916
      (void)memcpy(pTagVal, &tv, sizeof(tv));
2,147,483,647✔
2917
      return true;
2,147,483,647✔
2918
    }
2919
  }
2920
  return false;
56,320,801✔
2921
}
2922

2923
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag) {
291,933,567✔
2924
  return tEncodeBinary(pEncoder, (const uint8_t *)pTag, pTag->len);
583,907,894✔
2925
}
2926

2927
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
1,805,819,310✔
2928

2929
int32_t tTagToValArray(const STag *pTag, SArray **ppArray) {
865,838✔
2930
  int32_t  code = 0;
865,838✔
2931
  uint8_t *p = NULL;
865,838✔
2932
  STagVal  tv = {0};
865,838✔
2933
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
865,838✔
2934
  int16_t  offset = 0;
865,838✔
2935

2936
  if (isLarge) {
865,838✔
2937
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
3,974✔
2938
  } else {
2939
    p = (uint8_t *)&pTag->idx[pTag->nTag];
861,864✔
2940
  }
2941

2942
  (*ppArray) = taosArrayInit(pTag->nTag + 1, sizeof(STagVal));
865,838✔
2943
  if (*ppArray == NULL) {
865,838✔
2944
    code = terrno;
×
2945
    goto _err;
×
2946
  }
2947

2948
  for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
2,207,430✔
2949
    if (isLarge) {
1,341,592✔
2950
      offset = ((int16_t *)pTag->idx)[iTag];
5,312✔
2951
    } else {
2952
      offset = pTag->idx[iTag];
1,336,280✔
2953
    }
2954
    int32_t nt = tGetTagVal(p + offset, &tv, pTag->flags & TD_TAG_JSON);
1,341,592✔
2955
    if (taosArrayPush(*ppArray, &tv) == NULL) {
2,683,184✔
2956
      code = terrno;
×
2957
      goto _err;
×
2958
    }
2959
  }
2960

2961
  return code;
865,838✔
2962

2963
_err:
×
2964
  return code;
×
2965
}
2966

2967

2968
void destroyTagVal(void *pTag) {
49,263,420✔
2969
  STagVal* pTagVal = (STagVal*)pTag;
49,263,420✔
2970
  if (pTagVal && IS_VAR_DATA_TYPE(pTagVal->type)) {
49,263,420✔
2971
    taosMemoryFree(pTagVal->pData);
21,665,856✔
2972
  }
2973
}
49,263,420✔
2974

2975
// STSchema ========================================
2976
STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
1,018,103,683✔
2977
  STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
1,018,103,683✔
2978
  if (pTSchema == NULL) {
1,018,031,522✔
2979
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2980
    return NULL;
×
2981
  }
2982

2983
  pTSchema->numOfCols = numOfCols;
1,018,031,522✔
2984
  pTSchema->version = version;
1,018,067,177✔
2985

2986
  // timestamp column
2987
  if (!(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
1,018,103,366✔
2988
    terrno = TSDB_CODE_INVALID_PARA;
×
2989
    taosMemoryFree(pTSchema);
×
2990
    return NULL;
×
2991
  }
2992
  if (!(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID)) {
1,018,116,755✔
2993
    terrno = TSDB_CODE_INVALID_PARA;
×
2994
    taosMemoryFree(pTSchema);
×
2995
    return NULL;
×
2996
  }
2997
  pTSchema->columns[0].colId = aSchema[0].colId;
1,018,013,185✔
2998
  pTSchema->columns[0].type = aSchema[0].type;
1,018,205,797✔
2999
  pTSchema->columns[0].flags = aSchema[0].flags;
1,018,275,017✔
3000
  pTSchema->columns[0].bytes = TYPE_BYTES[aSchema[0].type];
1,018,091,365✔
3001
  pTSchema->columns[0].offset = -1;
1,018,232,302✔
3002

3003
  // other columns
3004
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
2,147,483,647✔
3005
    SSchema  *pSchema = &aSchema[iCol];
2,147,483,647✔
3006
    STColumn *pTColumn = &pTSchema->columns[iCol];
2,147,483,647✔
3007

3008
    pTColumn->colId = pSchema->colId;
2,147,483,647✔
3009
    pTColumn->type = pSchema->type;
2,147,483,647✔
3010
    pTColumn->flags = pSchema->flags;
2,147,483,647✔
3011
    pTColumn->offset = pTSchema->flen;
2,147,483,647✔
3012

3013
    if (IS_VAR_DATA_TYPE(pSchema->type)) {
2,147,483,647✔
3014
      pTColumn->bytes = pSchema->bytes;
2,147,483,647✔
3015
      pTSchema->tlen += (TYPE_BYTES[pSchema->type] + pSchema->bytes);  // todo: remove
2,147,483,647✔
3016
    } else {
3017
      pTColumn->bytes = TYPE_BYTES[pSchema->type];
2,147,483,647✔
3018
      pTSchema->tlen += TYPE_BYTES[pSchema->type];  // todo: remove
2,147,483,647✔
3019
    }
3020

3021
    pTSchema->flen += TYPE_BYTES[pTColumn->type];
2,147,483,647✔
3022
  }
3023

3024
#if 1  // todo : remove this
3025
  pTSchema->tlen += (int32_t)TD_BITMAP_BYTES(numOfCols);
1,018,391,265✔
3026
#endif
3027

3028
  return pTSchema;
1,018,245,302✔
3029
}
3030

3031
static int32_t tTColumnCompare(const void *p1, const void *p2) {
364,790,458✔
3032
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
364,790,458✔
3033
    return -1;
60,826,749✔
3034
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
304,005,550✔
3035
    return 1;
216,786,126✔
3036
  }
3037

3038
  return 0;
87,256,996✔
3039
}
3040

3041
const STColumn *tTSchemaSearchColumn(const STSchema *pTSchema, int16_t cid) {
87,263,062✔
3042
  STColumn tcol = {
87,263,062✔
3043
      .colId = cid,
3044
  };
3045

3046
  return taosbsearch(&tcol, pTSchema->columns, pTSchema->numOfCols, sizeof(STColumn), tTColumnCompare, TD_EQ);
87,264,280✔
3047
}
3048

3049
// SColData ========================================
3050
void tColDataDestroy(void *ph) {
1,703,650,474✔
3051
  if (ph) {
1,703,650,474✔
3052
    SColData *pColData = (SColData *)ph;
1,703,731,624✔
3053

3054
    tFree(pColData->pBitMap);
1,703,731,624✔
3055
    tFree(pColData->aOffset);
1,703,799,537✔
3056
    tFree(pColData->pData);
1,703,778,538✔
3057
  }
3058
}
1,703,667,908✔
3059

3060
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
1,776,285,886✔
3061
  pColData->cid = cid;
1,776,285,886✔
3062
  pColData->type = type;
1,776,376,113✔
3063
  pColData->cflag = cflag;
1,776,429,993✔
3064
  tColDataClear(pColData);
1,776,538,723✔
3065
}
1,776,431,251✔
3066

3067
void tColDataClear(SColData *pColData) {
2,147,483,647✔
3068
  pColData->numOfNone = 0;
2,147,483,647✔
3069
  pColData->numOfNull = 0;
2,147,483,647✔
3070
  pColData->numOfValue = 0;
2,147,483,647✔
3071
  pColData->nVal = 0;
2,147,483,647✔
3072
  pColData->flag = 0;
2,147,483,647✔
3073
  pColData->nData = 0;
2,147,483,647✔
3074
}
2,147,483,647✔
3075

3076
void tColDataDeepClear(SColData *pColData) {
41,513,677✔
3077
  pColData->pBitMap = NULL;
41,513,677✔
3078
  pColData->aOffset = NULL;
41,528,179✔
3079
  pColData->pData = NULL;
41,517,646✔
3080

3081
  tColDataClear(pColData);
41,524,063✔
3082
}
41,530,861✔
3083

3084
static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData, uint32_t nData) {
3085
  int32_t  code = 0;
2,147,483,647✔
3086
  uint32_t cvtNData = sizeof(uint64_t);
2,147,483,647✔
3087
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
3088
    // TODO
3089
    if (IS_STR_DATA_BLOB(pColData->type)) {
2,147,483,647✔
3090
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
67,256,946✔
3091
      if (code) goto _exit;
29,713,112✔
3092
      pColData->aOffset[pColData->nVal] = pColData->nData;
29,713,112✔
3093

3094
      if (nData) {
29,713,112✔
3095
        code = tRealloc(&pColData->pData, pColData->nData + BSE_SEQUECE_SIZE);
26,774,570✔
3096
        if (code) goto _exit;
26,774,570✔
3097
        (void)memcpy(pColData->pData + pColData->nData, pData, BSE_SEQUECE_SIZE);
26,774,570✔
3098
        pColData->nData += BSE_SEQUECE_SIZE;
26,774,570✔
3099
      } else {
3100
        // uint64_t zero = 0;
3101
        // (void)memcpy(pColData->pData + pColData->nData, &zero, BSE_SEQUECE_SIZE);
3102
        // pColData->nData += BSE_SEQUECE_SIZE;
3103
      }
3104

3105
    } else {
3106
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
2,147,483,647✔
3107
      if (code) goto _exit;
2,147,483,647✔
3108
      pColData->aOffset[pColData->nVal] = pColData->nData;
2,147,483,647✔
3109

3110
      if (nData) {
2,147,483,647✔
3111
        code = tRealloc(&pColData->pData, pColData->nData + nData);
2,147,483,647✔
3112
        if (code) goto _exit;
2,147,483,647✔
3113
        (void)memcpy(pColData->pData + pColData->nData, pData, nData);
2,147,483,647✔
3114
        pColData->nData += nData;
2,147,483,647✔
3115
      }
3116
    }
3117
  } else {
3118
    if (!(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal)) {
2,147,483,647✔
3119
      return TSDB_CODE_INVALID_PARA;
×
3120
    }
3121
    code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
2,147,483,647✔
3122
    if (code) goto _exit;
2,147,483,647✔
3123
    if (pData) {
2,147,483,647✔
3124
      (void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
2,147,483,647✔
3125
    } else {
3126
      memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
1,470,227,312✔
3127
    }
3128
    pColData->nData += tDataTypes[pColData->type].bytes;
2,147,483,647✔
3129
  }
3130
  pColData->nVal++;
2,147,483,647✔
3131

3132
_exit:
2,147,483,647✔
3133
  return code;
2,147,483,647✔
3134
}
3135
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
618,902,063✔
3136
  pColData->flag = HAS_VALUE;
618,985,739✔
3137
  pColData->numOfValue++;
619,025,128✔
3138
  return tColDataPutValue(pColData, pData, nData);
619,036,428✔
3139
}
3140
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
17,125,187✔
3141
  pColData->flag = HAS_NONE;
17,125,187✔
3142
  pColData->numOfNone++;
17,125,187✔
3143
  pColData->nVal++;
17,124,757✔
3144
  return 0;
17,125,770✔
3145
}
3146
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
30,694,669✔
3147
  pColData->flag = HAS_NULL;
30,701,511✔
3148
  pColData->numOfNull++;
30,707,204✔
3149
  pColData->nVal++;
30,710,823✔
3150
  return 0;
30,709,743✔
3151
}
3152
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
872,448✔
3153
  int32_t code = 0;
872,448✔
3154

3155
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
872,448✔
3156
  code = tRealloc(&pColData->pBitMap, nBit);
873,308✔
3157
  if (code) return code;
873,308✔
3158

3159
  memset(pColData->pBitMap, 0, nBit);
873,308✔
3160
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
872,878✔
3161

3162
  pColData->flag |= HAS_VALUE;
873,308✔
3163
  pColData->numOfValue++;
873,308✔
3164

3165
  if (pColData->nVal) {
873,308✔
3166
    if (IS_VAR_DATA_TYPE(pColData->type)) {
873,308✔
3167
      if (IS_STR_DATA_BLOB(pColData->type)) {
28,472✔
3168
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
430✔
3169
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3170
        if (code) return code;
×
3171
        memset(pColData->aOffset, 0, nOffset);
×
3172

3173
      } else {
3174
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
28,472✔
3175
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
28,472✔
3176
        if (code) return code;
28,902✔
3177
        memset(pColData->aOffset, 0, nOffset);
28,902✔
3178
      }
3179
    } else {
3180
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
844,406✔
3181
      code = tRealloc(&pColData->pData, pColData->nData);
844,406✔
3182
      if (code) return code;
844,406✔
3183
      memset(pColData->pData, 0, pColData->nData);
844,406✔
3184
    }
3185
  }
3186

3187
  return tColDataPutValue(pColData, pData, nData);
872,878✔
3188
}
3189
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3190
  pColData->nVal++;
2,147,483,647✔
3191
  pColData->numOfNone++;
2,147,483,647✔
3192
  return 0;
2,147,483,647✔
3193
}
3194
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, uint8_t *pData, uint32_t nData) {
63,412✔
3195
  int32_t code = 0;
84,400✔
3196

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

3201
  memset(pColData->pBitMap, 0, nBit);
84,400✔
3202
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
84,400✔
3203

3204
  pColData->flag |= HAS_NULL;
84,400✔
3205
  pColData->numOfNull++;
84,400✔
3206
  pColData->nVal++;
84,400✔
3207

3208
  return code;
84,400✔
3209
}
3210
static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,675,137✔
3211
  int32_t code = 0;
4,675,535✔
3212

3213
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
4,675,535✔
3214
  code = tRealloc(&pColData->pBitMap, nBit);
4,675,535✔
3215
  if (code) return code;
4,675,535✔
3216

3217
  memset(pColData->pBitMap, 0, nBit);
4,675,535✔
3218
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
4,675,535✔
3219

3220
  pColData->flag |= HAS_VALUE;
4,675,535✔
3221
  pColData->numOfValue++;
4,675,535✔
3222

3223
  if (pColData->nVal) {
4,675,535✔
3224
    if (IS_VAR_DATA_TYPE(pColData->type)) {
6,052,728✔
3225
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
1,377,193✔
3226
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
1,377,193✔
3227
      if (code) return code;
1,377,193✔
3228
      if (!IS_STR_DATA_BLOB(pColData->type)) {
1,377,193✔
3229
        memset(pColData->aOffset, 0, nOffset);
1,371,552✔
3230
      }
3231
    } else {
3232
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
3,298,342✔
3233
      code = tRealloc(&pColData->pData, pColData->nData);
3,298,342✔
3234
      if (code) return code;
3,298,342✔
3235
      memset(pColData->pData, 0, pColData->nData);
3,298,342✔
3236
    }
3237
  }
3238

3239
  return tColDataPutValue(pColData, pData, nData);
4,675,535✔
3240
}
3241
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, uint8_t *pData, uint32_t nData) {
17,416✔
3242
  int32_t code = 0;
17,416✔
3243

3244
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
17,416✔
3245
  code = tRealloc(&pColData->pBitMap, nBit);
17,416✔
3246
  if (code) return code;
17,416✔
3247

3248
  memset(pColData->pBitMap, 255, nBit);
17,416✔
3249
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
17,416✔
3250

3251
  pColData->flag |= HAS_NONE;
17,416✔
3252
  pColData->numOfNone++;
17,416✔
3253
  pColData->nVal++;
17,416✔
3254

3255
  return code;
17,416✔
3256
}
3257
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3258
  pColData->nVal++;
2,147,483,647✔
3259
  pColData->numOfNull++;
2,147,483,647✔
3260
  return 0;
2,147,483,647✔
3261
}
3262
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3263
  int32_t code = 0;
×
3264

3265
  pColData->flag |= HAS_VALUE;
×
3266
  pColData->numOfValue++;
×
3267

3268
  uint8_t *pBitMap = NULL;
×
3269
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3270
  if (code) return code;
×
3271

3272
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3273
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
×
3274
  }
3275
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
×
3276

3277
  tFree(pColData->pBitMap);
×
3278
  pColData->pBitMap = pBitMap;
×
3279

3280
  if (pColData->nVal) {
×
3281
    if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3282
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3283
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3284
      if (code) return code;
×
3285
      memset(pColData->aOffset, 0, nOffset);
×
3286
    } else {
3287
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
×
3288
      code = tRealloc(&pColData->pData, pColData->nData);
×
3289
      if (code) return code;
×
3290
      memset(pColData->pData, 0, pColData->nData);
×
3291
    }
3292
  }
3293

3294
  return tColDataPutValue(pColData, pData, nData);
×
3295
}
3296
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, uint8_t *pData, uint32_t nData) {
732,248✔
3297
  int32_t code = 0;
732,248✔
3298

3299
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
732,248✔
3300
  if (code) return code;
732,248✔
3301

3302
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
732,248✔
3303
  pColData->numOfNone++;
732,248✔
3304
  pColData->nVal++;
732,248✔
3305

3306
  return code;
732,248✔
3307
}
3308
static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, uint8_t *pData, uint32_t nData) {
135,256✔
3309
  int32_t code = 0;
135,256✔
3310

3311
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
135,256✔
3312
  if (code) return code;
135,256✔
3313

3314
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
135,256✔
3315
  pColData->numOfNull++;
135,256✔
3316
  pColData->nVal++;
135,256✔
3317

3318
  return code;
135,256✔
3319
}
3320
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3321
  pColData->numOfValue++;
2,147,483,647✔
3322
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3323
}
3324
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, uint8_t *pData, uint32_t nData) {
8,896,725✔
3325
  int32_t code = 0;
8,896,725✔
3326

3327
  pColData->flag |= HAS_NONE;
8,896,725✔
3328
  pColData->numOfNone++;
8,896,725✔
3329

3330
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
8,896,725✔
3331
  code = tRealloc(&pColData->pBitMap, nBit);
8,896,725✔
3332
  if (code) return code;
8,895,519✔
3333

3334
  memset(pColData->pBitMap, 255, nBit);
8,895,519✔
3335
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
8,896,122✔
3336

3337
  return tColDataPutValue(pColData, NULL, 0);
8,896,142✔
3338
}
3339
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
20,370,751✔
3340
  int32_t code = 0;
20,952,922✔
3341

3342
  pColData->flag |= HAS_NULL;
20,952,922✔
3343
  pColData->numOfNull++;
20,952,922✔
3344

3345
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
20,952,922✔
3346
  code = tRealloc(&pColData->pBitMap, nBit);
20,952,922✔
3347
  if (code) return code;
20,952,122✔
3348

3349
  memset(pColData->pBitMap, 255, nBit);
20,952,122✔
3350
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
20,952,636✔
3351

3352
  return tColDataPutValue(pColData, NULL, 0);
20,953,436✔
3353
}
3354
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
310,927,895✔
3355
  int32_t code = 0;
310,928,489✔
3356

3357
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
310,928,489✔
3358
  if (code) return code;
310,940,291✔
3359

3360
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
310,940,291✔
3361
  pColData->numOfValue++;
310,980,889✔
3362

3363
  return tColDataPutValue(pColData, pData, nData);
310,998,611✔
3364
}
3365
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
800,935,954✔
3366
  int32_t code = 0;
800,935,954✔
3367

3368
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
800,935,954✔
3369
  if (code) return code;
800,963,174✔
3370

3371
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
800,963,174✔
3372
  pColData->numOfNone++;
800,963,200✔
3373

3374
  return tColDataPutValue(pColData, NULL, 0);
800,965,168✔
3375
}
3376
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
93,236✔
3377
  int32_t code = 0;
93,236✔
3378

3379
  pColData->flag |= HAS_NULL;
93,236✔
3380
  pColData->numOfNull++;
93,819✔
3381

3382
  uint8_t *pBitMap = NULL;
93,819✔
3383
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
93,819✔
3384
  if (code) return code;
93,819✔
3385

3386
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,294,413✔
3387
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
2,201,177✔
3388
  }
3389
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
93,819✔
3390

3391
  tFree(pColData->pBitMap);
93,819✔
3392
  pColData->pBitMap = pBitMap;
93,819✔
3393

3394
  return tColDataPutValue(pColData, NULL, 0);
93,236✔
3395
}
3396
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3397
  int32_t code = 0;
2,147,483,647✔
3398

3399
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
2,147,483,647✔
3400
  if (code) return code;
2,147,483,647✔
3401
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
2,147,483,647✔
3402
  pColData->numOfValue++;
2,147,483,647✔
3403

3404
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3405
}
3406
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,894,228✔
3407
  int32_t code = 0;
1,894,228✔
3408

3409
  pColData->flag |= HAS_NONE;
1,894,228✔
3410
  pColData->numOfNone++;
1,894,228✔
3411

3412
  uint8_t *pBitMap = NULL;
1,894,228✔
3413
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
1,894,228✔
3414
  if (code) return code;
1,894,228✔
3415

3416
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
164,706,092✔
3417
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
162,811,864✔
3418
  }
3419
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
1,894,228✔
3420

3421
  tFree(pColData->pBitMap);
1,894,228✔
3422
  pColData->pBitMap = pBitMap;
1,894,228✔
3423

3424
  return tColDataPutValue(pColData, NULL, 0);
1,894,228✔
3425
}
3426
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,223,634,585✔
3427
  int32_t code = 0;
1,224,816,346✔
3428

3429
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,224,816,346✔
3430
  if (code) return code;
1,224,831,935✔
3431
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
1,224,831,935✔
3432
  pColData->numOfNull++;
1,224,896,931✔
3433

3434
  return tColDataPutValue(pColData, NULL, 0);
1,224,871,941✔
3435
}
3436
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,035,116✔
3437
  int32_t code = 0;
3,142,388✔
3438

3439
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
3,142,388✔
3440
  if (code) return code;
3,142,388✔
3441
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
3,142,388✔
3442
  pColData->numOfValue++;
3,142,388✔
3443

3444
  return tColDataPutValue(pColData, pData, nData);
3,142,388✔
3445
}
3446
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
303,383,614✔
3447
  int32_t code = 0;
303,383,614✔
3448

3449
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
303,383,614✔
3450
  if (code) return code;
303,383,614✔
3451
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
303,383,614✔
3452
  pColData->numOfNone++;
303,383,614✔
3453

3454
  return tColDataPutValue(pColData, NULL, 0);
303,383,614✔
3455
}
3456
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
352,671✔
3457
  int32_t code = 0;
352,671✔
3458

3459
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
352,671✔
3460
  if (code) return code;
352,671✔
3461
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
352,671✔
3462
  pColData->numOfNull++;
352,671✔
3463

3464
  return tColDataPutValue(pColData, NULL, 0);
352,671✔
3465
}
3466
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData) = {
3467
    {tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02},  // 0
3468
    {tColDataAppendValue10, tColDataAppendValue11, tColDataAppendValue12},  // HAS_NONE
3469
    {tColDataAppendValue20, tColDataAppendValue21, tColDataAppendValue22},  // HAS_NULL
3470
    {tColDataAppendValue30, tColDataAppendValue31, tColDataAppendValue32},  // HAS_NULL|HAS_NONE
3471
    {tColDataAppendValue40, tColDataAppendValue41, tColDataAppendValue42},  // HAS_VALUE
3472
    {tColDataAppendValue50, tColDataAppendValue51, tColDataAppendValue52},  // HAS_VALUE|HAS_NONE
3473
    {tColDataAppendValue60, tColDataAppendValue61, tColDataAppendValue62},  // HAS_VALUE|HAS_NULL
3474
    {tColDataAppendValue70, tColDataAppendValue71, tColDataAppendValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
3475

3476
    //       VALUE                  NONE                     NULL
3477
};
3478

3479
static FORCE_INLINE int32_t tColDataPutValueBlob(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
3480
  int32_t  code = 0;
120✔
3481
  uint8_t  buf[sizeof(uint64_t) + 1] = {0};
×
3482
  uint64_t seq = 0;
120✔
3483

3484
  int32_t offset = 0;
120✔
3485
  if (IS_STR_DATA_BLOB(pColData->type)) {
120✔
3486
    code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
120✔
3487
    if (code) goto _exit;
120✔
3488
    pColData->aOffset[pColData->nVal] = pColData->nData;
120✔
3489
    if (nData) {
120✔
3490
      SBlobItem item = {.seqOffsetInRow = seq, .len = nData, .data = pData, .type = TSDB_DATA_BLOB_VALUE};
120✔
3491
      code = tBlobSetPush(pArg, &item, &seq, 0);
120✔
3492
      if (code != 0) return code;
120✔
3493

3494
      offset = tPutU64(buf, seq);
120✔
3495
      code = tRealloc(&pColData->pData, pColData->nData + offset);
120✔
3496
      if (code != 0) return code;
120✔
3497
      memcpy(pColData->pData + pColData->nData, buf, offset);
120✔
3498
      pColData->nData += offset;
120✔
3499
    } else {
3500
      int8_t type = pData ? TSDB_DATA_BLOB_EMPTY_VALUE : TSDB_DATA_BLOB_NULL_VALUE;
×
3501
      code = addEmptyItemToBlobSet(pArg, type, NULL);
×
3502
    }
3503
  }
3504
  pColData->nVal++;
120✔
3505

3506
_exit:
120✔
3507
  return code;
120✔
3508
}
3509

3510
static FORCE_INLINE int32_t tColDataAppendValueBlob00(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
82✔
3511
  pColData->flag = HAS_VALUE;
82✔
3512
  pColData->numOfValue++;
82✔
3513
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
82✔
3514
}
3515
static FORCE_INLINE int32_t tColDataAppendValueBlob01(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3516
  pColData->flag = HAS_NONE;
×
3517
  pColData->numOfNone++;
×
3518
  pColData->nVal++;
×
3519
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3520
}
3521
static FORCE_INLINE int32_t tColDataAppendValueBlob02(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
126✔
3522
  pColData->flag = HAS_NULL;
126✔
3523
  pColData->numOfNull++;
126✔
3524
  pColData->nVal++;
126✔
3525
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
126✔
3526
}
3527
static FORCE_INLINE int32_t tColDataAppendValueBlob10(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3528
  int32_t code = 0;
×
3529

3530
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3531
  code = tRealloc(&pColData->pBitMap, nBit);
×
3532
  if (code) return code;
×
3533

3534
  memset(pColData->pBitMap, 0, nBit);
×
3535
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3536

3537
  pColData->flag |= HAS_VALUE;
×
3538
  pColData->numOfValue++;
×
3539

3540
  if (pColData->nVal) {
×
3541
    if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3542
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3543
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3544
      if (code) return code;
×
3545
      memset(pColData->aOffset, 0, nOffset);
×
3546
    } else {
3547
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
×
3548
      code = tRealloc(&pColData->pData, pColData->nData);
×
3549
      if (code) return code;
×
3550
      memset(pColData->pData, 0, pColData->nData);
×
3551
    }
3552
  }
3553

3554
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3555
}
3556
static FORCE_INLINE int32_t tColDataAppendValueBlob11(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3557
  pColData->nVal++;
×
3558
  pColData->numOfNone++;
×
3559
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3560
}
3561
static FORCE_INLINE int32_t tColDataAppendValueBlob12(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3562
  int32_t code = 0;
×
3563

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

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

3571
  pColData->flag |= HAS_NULL;
×
3572
  pColData->numOfNull++;
×
3573
  pColData->nVal++;
×
3574
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3575
}
3576
static FORCE_INLINE int32_t tColDataAppendValueBlob20(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3577
  int32_t code = 0;
×
3578

3579
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3580
  code = tRealloc(&pColData->pBitMap, nBit);
×
3581
  if (code) return code;
×
3582

3583
  memset(pColData->pBitMap, 0, nBit);
×
3584
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3585

3586
  pColData->flag |= HAS_VALUE;
×
3587
  pColData->numOfValue++;
×
3588

3589
  if (pColData->nVal) {
×
3590
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
3591
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3592
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3593
      if (code) return code;
×
3594
      memset(pColData->aOffset, 0, nOffset);
×
3595
    } else {
3596
      return TSDB_CODE_INVALID_MSG;
×
3597
    }
3598
  }
3599

3600
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3601
}
3602
static FORCE_INLINE int32_t tColDataAppendValueBlob21(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3603
  int32_t code = 0;
×
3604

3605
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3606
  code = tRealloc(&pColData->pBitMap, nBit);
×
3607
  if (code) return code;
×
3608

3609
  memset(pColData->pBitMap, 255, nBit);
×
3610
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3611

3612
  pColData->flag |= HAS_NONE;
×
3613
  pColData->numOfNone++;
×
3614
  pColData->nVal++;
×
3615
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3616
}
3617
static FORCE_INLINE int32_t tColDataAppendValueBlob22(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3618
  pColData->nVal++;
×
3619
  pColData->numOfNull++;
×
3620
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3621
}
3622
static FORCE_INLINE int32_t tColDataAppendValueBlob30(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3623
  int32_t code = 0;
×
3624

3625
  pColData->flag |= HAS_VALUE;
×
3626
  pColData->numOfValue++;
×
3627

3628
  uint8_t *pBitMap = NULL;
×
3629
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3630
  if (code) return code;
×
3631

3632
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3633
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
×
3634
  }
3635
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
×
3636

3637
  tFree(pColData->pBitMap);
×
3638
  pColData->pBitMap = pBitMap;
×
3639

3640
  if (pColData->nVal) {
×
3641
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
3642
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3643
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3644
      if (code) return code;
×
3645
      memset(pColData->aOffset, 0, nOffset);
×
3646
    } else {
3647
      return TSDB_CODE_INVALID_MSG;
×
3648
    }
3649
  }
3650

3651
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3652
}
3653
static FORCE_INLINE int32_t tColDataAppendValueBlob31(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3654
  int32_t code = 0;
×
3655

3656
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3657
  if (code) return code;
×
3658

3659
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3660
  pColData->numOfNone++;
×
3661
  pColData->nVal++;
×
3662

3663
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3664
}
3665
static FORCE_INLINE int32_t tColDataAppendValueBlob32(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3666
  int32_t code = 0;
×
3667

3668
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3669
  if (code) return code;
×
3670

3671
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3672
  pColData->numOfNull++;
×
3673
  pColData->nVal++;
×
3674
  return addEmptyItemToBlobSet(pArg, TSDB_DATA_BLOB_NULL_VALUE, NULL);
×
3675
}
3676
static FORCE_INLINE int32_t tColDataAppendValueBlob40(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
38✔
3677
  pColData->numOfValue++;
38✔
3678
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
38✔
3679
}
3680
static FORCE_INLINE int32_t tColDataAppendValueBlob41(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3681
  int32_t code = 0;
×
3682

3683
  pColData->flag |= HAS_NONE;
×
3684
  pColData->numOfNone++;
×
3685

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

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

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

3698
  pColData->flag |= HAS_NULL;
×
3699
  pColData->numOfNull++;
×
3700

3701
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3702
  code = tRealloc(&pColData->pBitMap, nBit);
×
3703
  if (code) return code;
×
3704

3705
  memset(pColData->pBitMap, 255, nBit);
×
3706
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3707

3708
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3709
}
3710
static FORCE_INLINE int32_t tColDataAppendValueBlob50(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3711
  int32_t code = 0;
×
3712

3713
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3714
  if (code) return code;
×
3715

3716
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3717
  pColData->numOfValue++;
×
3718

3719
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3720
}
3721
static FORCE_INLINE int32_t tColDataAppendValueBlob51(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3722
  int32_t code = 0;
×
3723

3724
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3725
  if (code) return code;
×
3726

3727
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3728
  pColData->numOfNone++;
×
3729

3730
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3731
}
3732
static FORCE_INLINE int32_t tColDataAppendValueBlob52(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3733
  int32_t code = 0;
×
3734

3735
  pColData->flag |= HAS_NULL;
×
3736
  pColData->numOfNull++;
×
3737

3738
  uint8_t *pBitMap = NULL;
×
3739
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3740
  if (code) return code;
×
3741

3742
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3743
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
×
3744
  }
3745
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
×
3746

3747
  tFree(pColData->pBitMap);
×
3748
  pColData->pBitMap = pBitMap;
×
3749

3750
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3751
}
3752
static FORCE_INLINE int32_t tColDataAppendValueBlob60(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3753
  int32_t code = 0;
×
3754

3755
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3756
  if (code) return code;
×
3757
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3758
  pColData->numOfValue++;
×
3759

3760
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3761
}
3762
static FORCE_INLINE int32_t tColDataAppendValueBlob61(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3763
  int32_t code = 0;
×
3764

3765
  pColData->flag |= HAS_NONE;
×
3766
  pColData->numOfNone++;
×
3767

3768
  uint8_t *pBitMap = NULL;
×
3769
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3770
  if (code) return code;
×
3771

3772
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3773
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
×
3774
  }
3775
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
×
3776

3777
  tFree(pColData->pBitMap);
×
3778
  pColData->pBitMap = pBitMap;
×
3779

3780
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3781
}
3782
static FORCE_INLINE int32_t tColDataAppendValueBlob62(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3783
  int32_t code = 0;
×
3784

3785
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3786
  if (code) return code;
×
3787
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3788
  pColData->numOfNull++;
×
3789

3790
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3791
}
3792
static FORCE_INLINE int32_t tColDataAppendValueBlob70(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3793
  int32_t code = 0;
×
3794

3795
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3796
  if (code) return code;
×
3797
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
×
3798
  pColData->numOfValue++;
×
3799

3800
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3801
}
3802
static FORCE_INLINE int32_t tColDataAppendValueBlob71(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3803
  int32_t code = 0;
×
3804

3805
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3806
  if (code) return code;
×
3807
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
×
3808
  pColData->numOfNone++;
×
3809

3810
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3811
}
3812
static FORCE_INLINE int32_t tColDataAppendValueBlob72(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3813
  int32_t code = 0;
×
3814

3815
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3816
  if (code) return code;
×
3817
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
×
3818
  pColData->numOfNull++;
×
3819

3820
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3821
}
3822

3823
static int32_t (*tColDataAppendValueBlobImpl[8][3])(void *pDst, SColData *pColData, uint8_t *pData, uint32_t nData) = {
3824
    {tColDataAppendValueBlob00, tColDataAppendValueBlob01, tColDataAppendValueBlob02},  // 0
3825
    {tColDataAppendValueBlob10, tColDataAppendValueBlob11, tColDataAppendValueBlob12},  // HAS_NONE
3826
    {tColDataAppendValueBlob20, tColDataAppendValueBlob21, tColDataAppendValueBlob22},  // HAS_NULL
3827
    {tColDataAppendValueBlob30, tColDataAppendValueBlob31, tColDataAppendValueBlob32},  // HAS_NULL|HAS_NONE
3828
    {tColDataAppendValueBlob40, tColDataAppendValueBlob41, tColDataAppendValueBlob42},  // HAS_VALUE
3829
    {tColDataAppendValueBlob50, tColDataAppendValueBlob51, tColDataAppendValueBlob52},  // HAS_VALUE|HAS_NONE
3830
    {tColDataAppendValueBlob60, tColDataAppendValueBlob61, tColDataAppendValueBlob62},  // HAS_VALUE|HAS_NULL
3831
    {tColDataAppendValueBlob70, tColDataAppendValueBlob71, tColDataAppendValueBlob72}   // HAS_VALUE|HAS_NULL|HAS_NONE
3832
    //       VALUE                  NONE                     NULL
3833
};
3834
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal) {
2,147,483,647✔
3835
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) {
2,147,483,647✔
3836
    return TSDB_CODE_INVALID_PARA;
×
3837
  }
3838
  return tColDataAppendValueImpl[pColData->flag][pColVal->flag](
2,147,483,647✔
3839
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData);
2,147,483,647✔
3840
}
3841

3842
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
2,965✔
3843
  pColData->numOfNone--;
2,965✔
3844
  pColData->nVal--;
2,965✔
3845
  if (pColData->numOfNone) {
2,965✔
3846
    return tColDataAppendValue10(pColData, pData, nData);
×
3847
  } else {
3848
    pColData->flag = 0;
2,965✔
3849
    return tColDataAppendValue00(pColData, pData, nData);
2,965✔
3850
  }
3851
}
3852
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24,114✔
3853
  pColData->numOfNone--;
24,114✔
3854
  pColData->nVal--;
24,114✔
3855
  if (pColData->numOfNone) {
24,114✔
3856
    return tColDataAppendValue12(pColData, pData, nData);
20,988✔
3857
  } else {
3858
    pColData->flag = 0;
3,126✔
3859
    return tColDataAppendValue02(pColData, pData, nData);
3,126✔
3860
  }
3861
  return 0;
3862
}
3863
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
81,109✔
3864
  if (forward) {
81,109✔
3865
    pColData->numOfNull--;
81,109✔
3866
    pColData->nVal--;
81,109✔
3867
    if (pColData->numOfNull) {
81,109✔
3868
      return tColDataAppendValue20(pColData, pData, nData);
398✔
3869
    } else {
3870
      pColData->flag = 0;
80,711✔
3871
      return tColDataAppendValue00(pColData, pData, nData);
80,711✔
3872
    }
3873
  }
3874
  return 0;
×
3875
}
3876
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
3877
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
3878
    pColData->numOfNone--;
×
3879
    pColData->nVal--;
×
3880
    if (pColData->numOfNone) {
×
3881
      return tColDataAppendValue30(pColData, pData, nData);
×
3882
    } else {
3883
      pColData->flag = HAS_NULL;
×
3884
      return tColDataAppendValue20(pColData, pData, nData);
×
3885
    }
3886
  } else if (forward) {  // NULL ==> VALUE
×
3887
    pColData->numOfNull--;
×
3888
    pColData->nVal--;
×
3889
    if (pColData->numOfNull) {
×
3890
      return tColDataAppendValue30(pColData, pData, nData);
×
3891
    } else {
3892
      pColData->flag = HAS_NONE;
×
3893
      return tColDataAppendValue10(pColData, pData, nData);
×
3894
    }
3895
  }
3896
  return 0;
×
3897
}
3898
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
304,252✔
3899
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
304,252✔
3900
    pColData->numOfNone--;
304,252✔
3901
    pColData->numOfNull++;
304,252✔
3902
    if (pColData->numOfNone) {
304,252✔
3903
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
293,832✔
3904
    } else {
3905
      pColData->flag = HAS_NULL;
10,420✔
3906
    }
3907
  }
3908
  return 0;
304,252✔
3909
}
3910
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
2,147,483,647✔
3911
  if (forward) {  // VALUE ==> VALUE
2,147,483,647✔
3912
    pColData->nVal--;
2,147,483,647✔
3913
    if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
3914
      pColData->nData = pColData->aOffset[pColData->nVal];
1,629,277,828✔
3915
    } else {
3916
      pColData->nData -= TYPE_BYTES[pColData->type];
2,147,483,647✔
3917
    }
3918
    return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3919
  }
3920
  return 0;
×
3921
}
3922
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
564,378✔
3923
  if (forward) {  // VALUE ==> NULL
564,378✔
3924
    pColData->numOfValue--;
564,378✔
3925
    pColData->nVal--;
564,378✔
3926
    if (pColData->numOfValue) {
564,378✔
3927
      if (IS_VAR_DATA_TYPE(pColData->type)) {
560,662✔
3928
        pColData->nData = pColData->aOffset[pColData->nVal];
163,240✔
3929
      } else {
3930
        pColData->nData -= TYPE_BYTES[pColData->type];
397,422✔
3931
      }
3932
      return tColDataAppendValue42(pColData, pData, nData);
560,662✔
3933
    } else {
3934
      pColData->flag = 0;
3,716✔
3935
      pColData->nData = 0;
3,716✔
3936
      return tColDataAppendValue02(pColData, pData, nData);
3,716✔
3937
    }
3938
  }
3939
  return 0;
×
3940
}
3941
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
1,491,069✔
3942
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
1,491,069✔
3943
    pColData->numOfNone--;
116,600✔
3944
    pColData->nVal--;
116,600✔
3945
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
116,600✔
3946
      pColData->nData -= TYPE_BYTES[pColData->type];
116,600✔
3947
    }
3948
    if (pColData->numOfNone) {
116,600✔
3949
      return tColDataAppendValue50(pColData, pData, nData);
×
3950
    } else {
3951
      pColData->flag = HAS_VALUE;
116,600✔
3952
      return tColDataAppendValue40(pColData, pData, nData);
116,600✔
3953
    }
3954
  } else if (forward) {  // VALUE ==> VALUE
1,374,469✔
3955
    pColData->nVal--;
1,374,469✔
3956
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,374,469✔
3957
      pColData->nData = pColData->aOffset[pColData->nVal];
196,236✔
3958
    } else {
3959
      pColData->nData -= TYPE_BYTES[pColData->type];
1,178,233✔
3960
    }
3961
    return tColDataPutValue(pColData, pData, nData);
1,374,469✔
3962
  }
3963
  return 0;
×
3964
}
3965
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
21,509✔
3966
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
21,509✔
3967
    pColData->numOfNone--;
21,509✔
3968
    pColData->nVal--;
21,509✔
3969
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
21,509✔
3970
      pColData->nData -= TYPE_BYTES[pColData->type];
14,513✔
3971
    }
3972
    if (pColData->numOfNone) {
21,509✔
3973
      return tColDataAppendValue52(pColData, pData, nData);
×
3974
    } else {
3975
      pColData->flag = HAS_VALUE;
21,509✔
3976
      return tColDataAppendValue42(pColData, pData, nData);
21,509✔
3977
    }
3978
  } else if (forward) {  // VALUE ==> NULL
×
3979
    pColData->numOfValue--;
×
3980
    pColData->nVal--;
×
3981
    if (pColData->numOfValue) {
×
3982
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3983
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3984
      } else {
3985
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3986
      }
3987
      return tColDataAppendValue52(pColData, pData, nData);
×
3988
    } else {
3989
      pColData->flag = HAS_NONE;
×
3990
      pColData->nData = 0;
×
3991
      return tColDataAppendValue12(pColData, pData, nData);
×
3992
    }
3993
  }
3994
  return 0;
×
3995
}
3996
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,003,932✔
3997
  if (forward) {
3,003,932✔
3998
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
3,003,932✔
3999
      pColData->numOfNull--;
2,042,105✔
4000
      pColData->nVal--;
2,042,105✔
4001
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
2,042,105✔
4002
        pColData->nData -= TYPE_BYTES[pColData->type];
1,732,473✔
4003
      }
4004
      if (pColData->numOfNull) {
2,042,105✔
4005
        return tColDataAppendValue60(pColData, pData, nData);
3,086✔
4006
      } else {
4007
        pColData->flag = HAS_VALUE;
2,039,019✔
4008
        return tColDataAppendValue40(pColData, pData, nData);
2,039,019✔
4009
      }
4010
    } else {  // VALUE ==> VALUE
4011
      pColData->nVal--;
961,827✔
4012
      if (IS_VAR_DATA_TYPE(pColData->type)) {
961,827✔
4013
        pColData->nData = pColData->aOffset[pColData->nVal];
111,131✔
4014
      } else {
4015
        pColData->nData -= TYPE_BYTES[pColData->type];
850,696✔
4016
      }
4017
      return tColDataPutValue(pColData, pData, nData);
961,827✔
4018
    }
4019
  }
4020
  return 0;
×
4021
}
4022
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
1,404,998✔
4023
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
1,404,998✔
4024
    pColData->numOfValue--;
877,405✔
4025
    pColData->nVal--;
877,405✔
4026
    if (pColData->numOfValue) {
877,405✔
4027
      if (IS_VAR_DATA_TYPE(pColData->type)) {
877,405✔
4028
        pColData->nData = pColData->aOffset[pColData->nVal];
93,842✔
4029
      } else {
4030
        pColData->nData -= TYPE_BYTES[pColData->type];
783,563✔
4031
      }
4032
      return tColDataAppendValue62(pColData, pData, nData);
877,405✔
4033
    } else {
4034
      pColData->flag = HAS_NULL;
×
4035
      pColData->nData = 0;
×
4036
      return tColDataAppendValue20(pColData, pData, nData);
×
4037
    }
4038
  }
4039
  return 0;
527,593✔
4040
}
4041
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
295,834✔
4042
  int32_t code = 0;
295,834✔
4043

4044
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
295,834✔
4045
  if (bv == 0) {  // NONE ==> VALUE
295,834✔
4046
    pColData->numOfNone--;
69,960✔
4047
    pColData->nVal--;
69,960✔
4048
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
69,960✔
4049
      pColData->nData -= TYPE_BYTES[pColData->type];
69,960✔
4050
    }
4051
    if (pColData->numOfNone) {
69,960✔
4052
      return tColDataAppendValue70(pColData, pData, nData);
69,960✔
4053
    } else {
4054
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
4055
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
×
4056
      }
4057
      pColData->flag = (HAS_VALUE | HAS_NULL);
×
4058
      return tColDataAppendValue60(pColData, pData, nData);
×
4059
    }
4060
  } else if (bv == 1) {  // NULL ==> VALUE
225,874✔
4061
    if (forward) {
37,906✔
4062
      pColData->numOfNull--;
37,906✔
4063
      pColData->nVal--;
37,906✔
4064
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
37,906✔
4065
        pColData->nData -= TYPE_BYTES[pColData->type];
37,906✔
4066
      }
4067
      if (pColData->numOfNull) {
37,906✔
4068
        return tColDataAppendValue70(pColData, pData, nData);
37,312✔
4069
      } else {
4070
        for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
1,782✔
4071
          SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0);
1,188✔
4072
        }
4073
        pColData->flag = (HAS_VALUE | HAS_NONE);
594✔
4074
        return tColDataAppendValue50(pColData, pData, nData);
594✔
4075
      }
4076
    }
4077
  } else if (bv == 2) {  // VALUE ==> VALUE
187,968✔
4078
    if (forward) {
187,968✔
4079
      pColData->nVal--;
187,968✔
4080
      if (IS_VAR_DATA_TYPE(pColData->type)) {
187,968✔
4081
        pColData->nData = pColData->aOffset[pColData->nVal];
46,640✔
4082
      } else {
4083
        pColData->nData -= TYPE_BYTES[pColData->type];
141,328✔
4084
      }
4085
      return tColDataPutValue(pColData, pData, nData);
187,968✔
4086
    }
4087
  } else {
4088
    return TSDB_CODE_INVALID_PARA;
×
4089
  }
4090
  return 0;
×
4091
}
4092
static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
304,356✔
4093
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
304,356✔
4094
  if (bv == 0) {  // NONE ==> NULL
304,356✔
4095
    pColData->numOfNone--;
304,356✔
4096
    pColData->nVal--;
304,356✔
4097
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
304,356✔
4098
      pColData->nData -= TYPE_BYTES[pColData->type];
194,179✔
4099
    }
4100
    if (pColData->numOfNone) {
304,356✔
4101
      return tColDataAppendValue72(pColData, pData, nData);
×
4102
    } else {
4103
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
8,705,552✔
4104
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
8,401,196✔
4105
      }
4106
      pColData->flag = (HAS_VALUE | HAS_NULL);
304,356✔
4107
      return tColDataAppendValue62(pColData, pData, nData);
304,356✔
4108
    }
4109
  } else if (bv == 2 && forward) {  // VALUE ==> NULL
×
4110
    pColData->numOfValue--;
×
4111
    pColData->nVal--;
×
4112
    if (pColData->numOfValue) {
×
4113
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
4114
        pColData->nData = pColData->aOffset[pColData->nVal];
×
4115
      } else {
4116
        pColData->nData -= TYPE_BYTES[pColData->type];
×
4117
      }
4118
      return tColDataAppendValue72(pColData, pData, nData);
×
4119
    } else {
4120
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
4121
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal));
×
4122
      }
4123
      pColData->flag = (HAS_NULL | HAS_NONE);
×
4124
      pColData->nData = 0;
×
4125
      return tColDataAppendValue32(pColData, pData, nData);
×
4126
    }
4127
  }
4128
  return 0;
×
4129
}
4130
static FORCE_INLINE int32_t tColDataUpdateNothing(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
2,284,468✔
4131
  return 0;
2,284,468✔
4132
}
4133
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) = {
4134
    {NULL, NULL, NULL},                                                     // 0
4135
    {tColDataUpdateValue10, tColDataUpdateNothing, tColDataUpdateValue12},  // HAS_NONE
4136
    {tColDataUpdateValue20, tColDataUpdateNothing, tColDataUpdateNothing},  // HAS_NULL
4137
    {tColDataUpdateValue30, tColDataUpdateNothing, tColDataUpdateValue32},  // HAS_NULL|HAS_NONE
4138
    {tColDataUpdateValue40, tColDataUpdateNothing, tColDataUpdateValue42},  // HAS_VALUE
4139
    {tColDataUpdateValue50, tColDataUpdateNothing, tColDataUpdateValue52},  // HAS_VALUE|HAS_NONE
4140
    {tColDataUpdateValue60, tColDataUpdateNothing, tColDataUpdateValue62},  // HAS_VALUE|HAS_NULL
4141
    {tColDataUpdateValue70, tColDataUpdateNothing, tColDataUpdateValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
4142

4143
    //    VALUE             NONE        NULL
4144
};
4145
int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward) {
2,147,483,647✔
4146
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
4147
  if (!(pColData->nVal > 0)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
4148

4149
  if (tColDataUpdateValueImpl[pColData->flag][pColVal->flag] == NULL) return 0;
2,147,483,647✔
4150

4151
  return tColDataUpdateValueImpl[pColData->flag][pColVal->flag](
2,147,483,647✔
4152
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData, forward);
2,147,483,647✔
4153
}
4154

4155
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
1,829,266,289✔
4156
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,829,266,289✔
4157
}
1,829,533,117✔
4158
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
1,539,821,671✔
4159
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
1,539,821,671✔
4160
}
1,539,819,559✔
4161
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
6,153,138✔
4162
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
4163
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
6,153,138✔
4164
    case 0:
3,161,687✔
4165
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
3,161,687✔
4166
      break;
3,161,104✔
4167
    case 1:
2,991,451✔
4168
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
2,991,451✔
4169
      break;
2,991,451✔
4170
    default:
×
4171
      break;
×
4172
  }
4173
}
6,152,555✔
4174
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
4175
  SValue value = {.type = pColData->type};
2,147,483,647✔
4176
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
4177
    if (iVal + 1 < pColData->nVal) {
2,147,483,647✔
4178
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
2,147,483,647✔
4179
    } else {
4180
      value.nData = pColData->nData - pColData->aOffset[iVal];
255,849,576✔
4181
    }
4182
    value.pData = pColData->pData + pColData->aOffset[iVal];
2,147,483,647✔
4183
  } else {
4184
    valueSetDatum(&value, pColData->type, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
4185
                  tDataTypes[pColData->type].bytes);
2,147,483,647✔
4186
  }
4187
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
4188
}
2,147,483,647✔
4189
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
2,056,141,052✔
4190
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
4191
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
2,056,141,052✔
4192
    case 0:
999,083,590✔
4193
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
999,083,590✔
4194
      break;
999,114,338✔
4195
    case 1:
1,057,618,227✔
4196
      tColDataGetValue4(pColData, iVal, pColVal);
4197
      break;
1,057,349,255✔
4198
    default:
×
4199
      break;
×
4200
  }
4201
}
2,056,463,593✔
4202
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
2,147,483,647✔
4203
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
4204
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
2,147,483,647✔
4205
    case 0:
1,982,239,711✔
4206
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
1,982,239,711✔
4207
      break;
1,982,108,638✔
4208
    case 1:
2,147,483,647✔
4209
      tColDataGetValue4(pColData, iVal, pColVal);
4210
      break;
2,147,483,647✔
4211
    default:
×
4212
      break;
×
4213
  }
4214
}
2,147,483,647✔
4215
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
19,955,936✔
4216
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
4217
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
19,955,936✔
4218
    case 0:
3,484,555✔
4219
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
3,484,555✔
4220
      break;
3,484,555✔
4221
    case 1:
4,228,089✔
4222
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
4,228,089✔
4223
      break;
4,227,506✔
4224
    case 2:
12,242,709✔
4225
      tColDataGetValue4(pColData, iVal, pColVal);
4226
      break;
12,246,207✔
4227
    default:
×
4228
      break;
×
4229
  }
4230
}
19,958,268✔
4231
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
4232
    NULL,               // 0
4233
    tColDataGetValue1,  // HAS_NONE
4234
    tColDataGetValue2,  // HAS_NULL
4235
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
4236
    tColDataGetValue4,  // HAS_VALUE
4237
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
4238
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
4239
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
4240
};
4241
int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
4242
  if (iVal < 0 || iVal >= pColData->nVal ||
2,147,483,647✔
4243
      (pColData->flag <= 0 || pColData->flag >= sizeof(tColDataGetValueImpl) / POINTER_BYTES)) {
2,147,483,647✔
4244
    return TSDB_CODE_INVALID_PARA;
×
4245
  }
4246
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
4247
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
4248
}
4249

4250
uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
2,147,483,647✔
4251
  switch (pColData->flag) {
2,147,483,647✔
4252
    case HAS_NONE:
×
4253
      return 0;
×
4254
    case HAS_NULL:
×
4255
      return 1;
×
4256
    case (HAS_NULL | HAS_NONE):
6,141,322✔
4257
      return GET_BIT1(pColData->pBitMap, iVal);
6,141,322✔
4258
    case HAS_VALUE:
×
4259
      return 2;
×
4260
    case (HAS_VALUE | HAS_NONE):
2,147,483,647✔
4261
      return (GET_BIT1(pColData->pBitMap, iVal)) ? 2 : 0;
2,147,483,647✔
4262
    case (HAS_VALUE | HAS_NULL):
2,147,483,647✔
4263
      return GET_BIT1(pColData->pBitMap, iVal) + 1;
2,147,483,647✔
4264
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
103,262,093✔
4265
      return GET_BIT2(pColData->pBitMap, iVal);
103,262,093✔
4266
    default:
×
4267
      return 0;
×
4268
  }
4269
}
4270

4271
int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) {
13,955,673✔
4272
  int32_t code = 0;
13,955,673✔
4273

4274
  *pColData = *pColDataFrom;
13,955,673✔
4275

4276
  // bitmap
4277
  switch (pColData->flag) {
13,957,333✔
4278
    case (HAS_NULL | HAS_NONE):
40,490✔
4279
    case (HAS_VALUE | HAS_NONE):
4280
    case (HAS_VALUE | HAS_NULL):
4281
      pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal));
40,490✔
4282
      if (pColData->pBitMap == NULL) {
40,490✔
4283
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4284
        goto _exit;
×
4285
      }
4286
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
40,490✔
4287
      break;
40,490✔
4288
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
4289
      pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
×
4290
      if (pColData->pBitMap == NULL) {
×
4291
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4292
        goto _exit;
×
4293
      }
4294
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
×
4295
      break;
×
4296
    default:
13,916,841✔
4297
      pColData->pBitMap = NULL;
13,916,841✔
4298
      break;
13,916,516✔
4299
  }
4300

4301
  // offset
4302
  if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) {
13,957,006✔
4303
    pColData->aOffset = xMalloc(arg, pColData->nVal << 2);
57,085✔
4304
    if (pColData->aOffset == NULL) {
57,085✔
4305
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4306
      goto _exit;
×
4307
    }
4308
    (void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
57,085✔
4309
  } else {
4310
    pColData->aOffset = NULL;
13,900,575✔
4311
  }
4312

4313
  // value
4314
  if (pColData->nData) {
13,958,273✔
4315
    pColData->pData = xMalloc(arg, pColData->nData);
13,922,530✔
4316
    if (pColData->pData == NULL) {
13,921,863✔
4317
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4318
      goto _exit;
×
4319
    }
4320

4321
    (void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
13,921,536✔
4322
  } else {
4323
    pColData->pData = NULL;
35,090✔
4324
  }
4325

4326
_exit:
13,956,028✔
4327
  return code;
13,956,028✔
4328
}
4329

4330
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
511,398,096✔
4331
  int32_t code;
4332
  SBuffer local;
511,392,901✔
4333

4334
  if (!(colData->nVal > 0)) {
511,421,777✔
4335
    return TSDB_CODE_INVALID_PARA;
×
4336
  }
4337

4338
  (*info) = (SColDataCompressInfo){
511,435,575✔
4339
      .cmprAlg = info->cmprAlg,
511,432,168✔
4340
      .columnFlag = colData->cflag,
511,437,836✔
4341
      .flag = colData->flag,
511,435,637✔
4342
      .dataType = colData->type,
511,435,764✔
4343
      .columnId = colData->cid,
511,435,303✔
4344
      .numOfData = colData->nVal,
511,437,098✔
4345
  };
4346

4347
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
511,431,120✔
4348
    return 0;
17,357,653✔
4349
  }
4350

4351
  tBufferInit(&local);
4352
  if (assist == NULL) {
494,074,192✔
4353
    assist = &local;
×
4354
  }
4355

4356
  // bitmap
4357
  if (colData->flag != HAS_VALUE) {
494,074,192✔
4358
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
29,135,744✔
4359
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
1,659,777✔
4360
    } else {
4361
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
27,475,997✔
4362
    }
4363

4364
    SCompressInfo cinfo = {
29,136,174✔
4365
        .dataType = TSDB_DATA_TYPE_TINYINT,
4366
        .cmprAlg = info->cmprAlg,
29,136,174✔
4367
        .originalSize = info->bitmapOriginalSize,
29,136,353✔
4368
    };
4369

4370
    code = tCompressDataToBuffer(colData->pBitMap, &cinfo, output, assist);
29,135,571✔
4371
    if (code) {
29,136,108✔
4372
      tBufferDestroy(&local);
4373
      return code;
×
4374
    }
4375

4376
    info->bitmapCompressedSize = cinfo.compressedSize;
29,136,108✔
4377
  }
4378

4379
  if (colData->flag == (HAS_NONE | HAS_NULL)) {
494,028,447✔
4380
    tBufferDestroy(&local);
4381
    return 0;
91,318✔
4382
  }
4383

4384
  // offset
4385
  if (IS_VAR_DATA_TYPE(colData->type)) {
493,923,714✔
4386
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
78,226,213✔
4387

4388
    SCompressInfo cinfo = {
78,256,227✔
4389
        .dataType = TSDB_DATA_TYPE_INT,
4390
        .cmprAlg = info->cmprAlg,
78,255,007✔
4391
        .originalSize = info->offsetOriginalSize,
78,252,310✔
4392
    };
4393

4394
    code = tCompressDataToBuffer(colData->aOffset, &cinfo, output, assist);
78,253,353✔
4395
    if (code) {
78,253,991✔
4396
      tBufferDestroy(&local);
4397
      return code;
×
4398
    }
4399

4400
    info->offsetCompressedSize = cinfo.compressedSize;
78,253,991✔
4401
  }
4402

4403
  // data
4404
  if (colData->nData > 0) {
493,972,310✔
4405
    info->dataOriginalSize = colData->nData;
493,957,218✔
4406

4407
    SCompressInfo cinfo = {
493,967,834✔
4408
        .dataType = colData->type,
493,958,027✔
4409
        .cmprAlg = info->cmprAlg,
493,964,986✔
4410
        .originalSize = info->dataOriginalSize,
493,973,783✔
4411
    };
4412

4413
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
493,947,964✔
4414
    if (code) {
493,962,141✔
4415
      tBufferDestroy(&local);
4416
      return code;
×
4417
    }
4418

4419
    info->dataCompressedSize = cinfo.compressedSize;
493,962,141✔
4420
  }
4421

4422
  tBufferDestroy(&local);
4423
  return 0;
493,944,597✔
4424
}
4425

4426
int32_t tColDataDecompress(void *input, SColDataCompressInfo *info, SColData *colData, SBuffer *assist) {
1,103,706,762✔
4427
  int32_t  code;
4428
  SBuffer  local;
1,103,702,250✔
4429
  uint8_t *data = (uint8_t *)input;
1,103,804,718✔
4430

4431
  tBufferInit(&local);
4432
  if (assist == NULL) {
1,103,841,612✔
4433
    assist = &local;
×
4434
  }
4435

4436
  tColDataClear(colData);
1,103,841,612✔
4437
  colData->cid = info->columnId;
1,103,786,923✔
4438
  colData->type = info->dataType;
1,103,856,883✔
4439
  colData->cflag = info->columnFlag;
1,103,804,140✔
4440
  colData->nVal = info->numOfData;
1,103,845,106✔
4441
  colData->flag = info->flag;
1,103,790,365✔
4442

4443
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
1,103,821,006✔
4444
    goto _exit;
143,904,265✔
4445
  }
4446

4447
  // bitmap
4448
  if (info->bitmapOriginalSize > 0) {
959,809,692✔
4449
    SCompressInfo cinfo = {
164,796,881✔
4450
        .dataType = TSDB_DATA_TYPE_TINYINT,
4451
        .cmprAlg = info->cmprAlg,
164,798,872✔
4452
        .originalSize = info->bitmapOriginalSize,
164,795,304✔
4453
        .compressedSize = info->bitmapCompressedSize,
164,773,151✔
4454
    };
4455

4456
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
164,793,280✔
4457
    if (code) {
164,771,273✔
4458
      tBufferDestroy(&local);
4459
      return code;
×
4460
    }
4461

4462
    code = tDecompressData(data, &cinfo, colData->pBitMap, cinfo.originalSize, assist);
164,771,273✔
4463
    if (code) {
164,751,567✔
4464
      tBufferDestroy(&local);
4465
      return code;
×
4466
    }
4467

4468
    data += cinfo.compressedSize;
164,751,567✔
4469
  }
4470

4471
  if (info->flag == (HAS_NONE | HAS_NULL)) {
959,918,753✔
4472
    goto _exit;
185,394✔
4473
  }
4474

4475
  // offset
4476
  if (info->offsetOriginalSize > 0) {
959,699,874✔
4477
    SCompressInfo cinfo = {
207,783,491✔
4478
        .cmprAlg = info->cmprAlg,
207,750,864✔
4479
        .dataType = TSDB_DATA_TYPE_INT,
4480
        .originalSize = info->offsetOriginalSize,
207,787,352✔
4481
        .compressedSize = info->offsetCompressedSize,
207,781,480✔
4482
    };
4483

4484
    code = tRealloc((uint8_t **)&colData->aOffset, cinfo.originalSize);
207,768,300✔
4485
    if (code) {
207,756,744✔
4486
      tBufferDestroy(&local);
4487
      return code;
×
4488
    }
4489

4490
    code = tDecompressData(data, &cinfo, colData->aOffset, cinfo.originalSize, assist);
207,756,744✔
4491
    if (code) {
207,743,743✔
4492
      tBufferDestroy(&local);
4493
      return code;
×
4494
    }
4495

4496
    data += cinfo.compressedSize;
207,743,743✔
4497
  }
4498

4499
  // data
4500
  if (info->dataOriginalSize > 0) {
959,718,945✔
4501
    colData->nData = info->dataOriginalSize;
959,714,272✔
4502

4503
    SCompressInfo cinfo = {
959,698,772✔
4504
        .cmprAlg = info->cmprAlg,
1,919,342,723✔
4505
        .dataType = colData->type,
959,659,187✔
4506
        .originalSize = info->dataOriginalSize,
959,656,931✔
4507
        .compressedSize = info->dataCompressedSize,
959,695,228✔
4508
    };
4509

4510
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
959,615,612✔
4511
    if (code) {
959,546,201✔
4512
      tBufferDestroy(&local);
4513
      return code;
×
4514
    }
4515

4516
    code = tDecompressData(data, &cinfo, colData->pData, cinfo.originalSize, assist);
959,546,201✔
4517
    if (code) {
959,617,351✔
4518
      tBufferDestroy(&local);
4519
      return code;
×
4520
    }
4521

4522
    data += cinfo.compressedSize;
959,617,351✔
4523
  }
4524

4525
_exit:
1,103,870,056✔
4526
  switch (colData->flag) {
1,103,855,706✔
4527
    case HAS_NONE:
87,273,391✔
4528
      colData->numOfNone = colData->nVal;
87,273,391✔
4529
      break;
87,273,391✔
4530
    case HAS_NULL:
56,606,524✔
4531
      colData->numOfNull = colData->nVal;
56,606,524✔
4532
      break;
56,628,027✔
4533
    case HAS_VALUE:
795,096,029✔
4534
      colData->numOfValue = colData->nVal;
795,096,029✔
4535
      break;
795,150,949✔
4536
    default:
164,790,086✔
4537
      for (int32_t i = 0; i < colData->nVal; i++) {
2,147,483,647✔
4538
        uint8_t bitValue = tColDataGetBitValue(colData, i);
2,147,483,647✔
4539
        if (bitValue == 0) {
2,147,483,647✔
4540
          colData->numOfNone++;
1,038,916,244✔
4541
        } else if (bitValue == 1) {
2,147,483,647✔
4542
          colData->numOfNull++;
2,147,483,647✔
4543
        } else {
4544
          colData->numOfValue++;
2,147,483,647✔
4545
        }
4546
      }
4547
  }
4548
  tBufferDestroy(&local);
4549
  return 0;
1,103,709,145✔
4550
}
4551

4552
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
165,561✔
4553
                                    char *data) {
4554
  int32_t code = 0;
165,561✔
4555
  if (data == NULL) {
165,561✔
4556
    if (pColData->cflag & COL_IS_KEY) {
3,863✔
4557
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4558
    } else {
4559
      for (int32_t i = 0; i < nRows; ++i) {
8,320✔
4560
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
4,457✔
4561
      }
4562
    }
4563
    goto _exit;
3,863✔
4564
  }
4565

4566
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
161,698✔
4567
    if (!IS_STR_DATA_BLOB(type)) {
27,305✔
4568
      for (int32_t i = 0; i < nRows; ++i) {
78,559✔
4569
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
51,254✔
4570
        if (offset == -1) {
51,254✔
4571
          if (pColData->cflag & COL_IS_KEY) {
×
4572
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4573
            goto _exit;
×
4574
          }
4575
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4576
            goto _exit;
×
4577
          }
4578
        } else {
4579
          if (varDataTLen(data + offset) > bytes || (type == TSDB_DATA_TYPE_NCHAR && varDataLen(data + offset) % TSDB_NCHAR_SIZE != 0)) {
51,254✔
4580
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
4581
                   bytes);
4582
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4583
            goto _exit;
×
4584
          }
4585
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
102,508✔
4586
                                                                        varDataLen(data + offset));
51,254✔
4587
        }
4588
      }
4589
    } else {
4590
      for (int32_t i = 0; i < nRows; ++i) {
×
4591
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
×
4592
        if (offset == -1) {
×
4593
          if (pColData->cflag & COL_IS_KEY) {
×
4594
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4595
            goto _exit;
×
4596
          }
4597
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4598
            goto _exit;
×
4599
          }
4600
        } else {
4601
          if (blobDataTLen(data + offset) > TSDB_MAX_BLOB_LEN) {
×
4602
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d",
×
4603
                   (int)blobDataTLen(data + offset), bytes);
4604
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4605
            goto _exit;
×
4606
          }
4607
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)blobDataVal(data + offset),
×
4608
                                                                        blobDataLen(data + offset));
×
4609
        }
4610
      }
4611
    }
4612
  } else {  // fixed-length data type
4613
    bool allValue = true;
134,393✔
4614
    bool allNull = true;
134,393✔
4615
    for (int32_t i = 0; i < nRows; ++i) {
384,042✔
4616
      if (!BMIsNull(lengthOrbitmap, i)) {
249,649✔
4617
        allNull = false;
177,701✔
4618
      } else {
4619
        allValue = false;
71,948✔
4620
      }
4621
    }
4622
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
134,393✔
4623
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4624
      goto _exit;
×
4625
    }
4626

4627
    if (allValue) {
134,393✔
4628
      // optimize (todo)
4629
      for (int32_t i = 0; i < nRows; ++i) {
275,707✔
4630
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
173,576✔
4631
      }
4632
    } else if (allNull) {
32,262✔
4633
      // optimize (todo)
4634
      for (int32_t i = 0; i < nRows; ++i) {
87,045✔
4635
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
57,737✔
4636
        if (code) goto _exit;
57,737✔
4637
      }
4638
    } else {
4639
      for (int32_t i = 0; i < nRows; ++i) {
21,290✔
4640
        if (BMIsNull(lengthOrbitmap, i)) {
18,336✔
4641
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
14,211✔
4642
          if (code) goto _exit;
14,211✔
4643
        } else {
4644
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
4,125✔
4645
        }
4646
      }
4647
    }
4648
  }
4649

4650
_exit:
2,954✔
4651
  return code;
165,561✔
4652
}
4653
int32_t tColDataAddValueByDataBlockWithBlob(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows,
×
4654
                                            char *lengthOrbitmap, char *data, void *pBlobSet) {
4655
  int32_t code = 0;
×
4656
  if (data == NULL) {
×
4657
    if (pColData->cflag & COL_IS_KEY) {
×
4658
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4659
    } else {
4660
      for (int32_t i = 0; i < nRows; ++i) {
×
4661
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4662
      }
4663
    }
4664
    goto _exit;
×
4665
  }
4666

4667
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
×
4668
    if (!IS_STR_DATA_BLOB(type)) {
×
4669
      for (int32_t i = 0; i < nRows; ++i) {
×
4670
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
×
4671
        if (offset == -1) {
×
4672
          if (pColData->cflag & COL_IS_KEY) {
×
4673
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4674
            goto _exit;
×
4675
          }
4676
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4677
            goto _exit;
×
4678
          }
4679
        } else {
4680
          if (varDataTLen(data + offset) > bytes) {
×
4681
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
4682
                   bytes);
4683
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4684
            goto _exit;
×
4685
          }
4686
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
×
4687
                                                                        varDataLen(data + offset));
×
4688
        }
4689
      }
4690
    } else {
4691
      for (int32_t i = 0; i < nRows; ++i) {
×
4692
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
×
4693
        if (offset == -1) {
×
4694
          if (pColData->cflag & COL_IS_KEY) {
×
4695
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4696
            goto _exit;
×
4697
          }
4698
          if ((code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NULL](pBlobSet, pColData, NULL, 0))) {
×
4699
            goto _exit;
×
4700
          }
4701
        } else {
4702
          if (blobDataTLen(data + offset) > TSDB_MAX_BLOB_LEN) {
×
4703
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d",
×
4704
                   (int)blobDataTLen(data + offset), bytes);
4705
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4706
            goto _exit;
×
4707
          }
4708
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_VALUE](
×
4709
              pBlobSet, pColData, (uint8_t *)blobDataVal(data + offset), blobDataLen(data + offset));
×
4710
        }
4711
      }
4712
    }
4713
  } else {  // fixed-length data type
4714
    bool allValue = true;
×
4715
    bool allNull = true;
×
4716
    for (int32_t i = 0; i < nRows; ++i) {
×
4717
      if (!BMIsNull(lengthOrbitmap, i)) {
×
4718
        allNull = false;
×
4719
      } else {
4720
        allValue = false;
×
4721
      }
4722
    }
4723
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
×
4724
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4725
      goto _exit;
×
4726
    }
4727

4728
    if (allValue) {
×
4729
      // optimize (todo)
4730
      for (int32_t i = 0; i < nRows; ++i) {
×
4731
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
×
4732
      }
4733
    } else if (allNull) {
×
4734
      // optimize (todo)
4735
      for (int32_t i = 0; i < nRows; ++i) {
×
4736
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4737
        if (code) goto _exit;
×
4738
      }
4739
    } else {
4740
      for (int32_t i = 0; i < nRows; ++i) {
×
4741
        if (BMIsNull(lengthOrbitmap, i)) {
×
4742
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4743
          if (code) goto _exit;
×
4744
        } else {
4745
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
×
4746
        }
4747
      }
4748
    }
4749
  }
4750

4751
_exit:
×
4752
  return code;
×
4753
}
4754

4755
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
20,288,336✔
4756
                               checkWKBGeometryFn cgeos) {
4757
  int32_t code = 0;
20,288,336✔
4758

4759
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
20,288,336✔
4760
    if (!(pColData->type == pBind->buffer_type)) {
20,292,288✔
4761
      return TSDB_CODE_INVALID_PARA;
×
4762
    }
4763
  }
4764

4765
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
20,296,298✔
4766
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
29,080✔
4767
      code = igeos();
880✔
4768
      if (code) {
880✔
4769
        return code;
×
4770
      }
4771
    }
4772
    for (int32_t i = 0; i < pBind->num; ++i) {
1,269,386✔
4773
      if (pBind->is_null && pBind->is_null[i]) {
1,251,942✔
4774
        if (pColData->cflag & COL_IS_KEY) {
611,918✔
4775
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
1,286✔
4776
          goto _exit;
1,286✔
4777
        }
4778
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
610,632✔
4779
        if (code) goto _exit;
610,632✔
4780
      } else if (pBind->length[i] > buffMaxLen) {
640,024✔
4781
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4782
      } else {
4783
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
640,024✔
4784
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
1,600✔
4785
          if (code) {
1,600✔
4786
            uError("stmt col[%d] bind geometry wrong format", i);
×
4787
            goto _exit;
×
4788
          }
4789
        }
4790
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
1,265,296✔
4791
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
640,024✔
4792
      }
4793
    }
4794
  } else {  // fixed-length data type
4795
    bool allValue;
4796
    bool allNull;
4797
    if (pBind->is_null) {
20,262,891✔
4798
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
13,552,844✔
4799
      allNull = (same && pBind->is_null[0] != 0);
13,550,536✔
4800
      allValue = (same && pBind->is_null[0] == 0);
13,547,209✔
4801
    } else {
4802
      allNull = false;
6,717,781✔
4803
      allValue = true;
6,717,781✔
4804
    }
4805

4806
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
20,269,625✔
4807
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
2,572✔
4808
      goto _exit;
2,572✔
4809
    }
4810

4811
    if (allValue) {
20,267,399✔
4812
      // optimize (todo)
4813
      for (int32_t i = 0; i < pBind->num; ++i) {
2,147,483,647✔
4814
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
2,147,483,647✔
4815
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
2,147,483,647✔
4816
      }
4817
    } else if (allNull) {
23,819✔
4818
      // optimize (todo)
4819
      for (int32_t i = 0; i < pBind->num; ++i) {
1,186✔
4820
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
593✔
4821
        if (code) goto _exit;
593✔
4822
      }
4823
    } else {
4824
      for (int32_t i = 0; i < pBind->num; ++i) {
7,953,246✔
4825
        if (pBind->is_null[i]) {
7,930,020✔
4826
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
3,505,848✔
4827
          if (code) goto _exit;
3,505,848✔
4828
        } else {
4829
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
8,848,344✔
4830
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
4,424,172✔
4831
        }
4832
      }
4833
    }
4834
  }
4835

4836
_exit:
9,424✔
4837
  return code;
20,305,298✔
4838
}
4839

4840
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen) {
728,723,322✔
4841
  int32_t code = 0;
728,723,322✔
4842

4843
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
728,723,322✔
4844
    if (!(pColData->type == pBind->buffer_type)) {
716,656,510✔
4845
      return TSDB_CODE_INVALID_PARA;
×
4846
    }
4847
  }
4848

4849
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
830,082,761✔
4850
    uint8_t *buf = pBind->buffer;
79,486,510✔
4851
    for (int32_t i = 0; i < pBind->num; ++i) {
170,589,322✔
4852
      if (pBind->is_null && pBind->is_null[i]) {
85,591,366✔
4853
        if (pColData->cflag & COL_IS_KEY) {
4,143,758✔
4854
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4855
          goto _exit;
×
4856
        }
4857
        if (pBind->is_null[i] == 1) {
4,143,864✔
4858
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
4,141,848✔
4859
          if (code) goto _exit;
4,143,798✔
4860
        } else {
4861
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4862
          if (code) goto _exit;
×
4863
        }
4864
      } else if (pBind->length[i] > buffMaxLen) {
81,420,153✔
4865
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4866
      } else {
4867
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
81,474,079✔
4868
        buf += pBind->length[i];
81,227,165✔
4869
      }
4870
    }
4871
  } else {  // fixed-length data type
4872
    bool allValue;
4873
    bool allNull;
4874
    bool allNone;
4875
    if (pBind->is_null) {
665,087,479✔
4876
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
20,678,471✔
4877
      allNull = (same && pBind->is_null[0] == 1);
20,732,775✔
4878
      allNone = (same && pBind->is_null[0] > 1);
20,723,696✔
4879
      allValue = (same && pBind->is_null[0] == 0);
20,727,730✔
4880
    } else {
4881
      allNull = false;
638,708,332✔
4882
      allNone = false;
638,708,332✔
4883
      allValue = true;
638,708,332✔
4884
    }
4885

4886
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
659,411,163✔
4887
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4888
      goto _exit;
×
4889
    }
4890

4891
    uint8_t *buf = pBind->buffer;
661,789,797✔
4892

4893
    if (allValue) {
663,414,411✔
4894
      // optimize (todo)
4895
      for (int32_t i = 0; i < pBind->num; ++i) {
1,273,641,453✔
4896
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
640,381,951✔
4897
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
644,116,576✔
4898
          *val = 1;
×
4899
        }
4900
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
641,506,050✔
4901
      }
4902
    } else if (allNull) {
21,153,649✔
4903
      // optimize (todo)
4904
      for (int32_t i = 0; i < pBind->num; ++i) {
41,439,730✔
4905
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
20,720,505✔
4906
        if (code) goto _exit;
20,726,274✔
4907
      }
4908
    } else if (allNone) {
440,193✔
4909
      // optimize (todo)
4910
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4911
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4912
        if (code) goto _exit;
×
4913
      }
4914
    } else {
4915
      for (int32_t i = 0; i < pBind->num; ++i) {
440,193✔
4916
        if (pBind->is_null[i]) {
×
4917
          if (pBind->is_null[i] == 1) {
×
4918
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4919
            if (code) goto _exit;
×
4920
          } else {
4921
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4922
            if (code) goto _exit;
×
4923
          }
4924
        } else {
4925
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
4926
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
4927
            *val = 1;
×
4928
          }
4929

4930
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
4931
        }
4932
      }
4933
    }
4934
  }
4935

4936
_exit:
20,691,978✔
4937
  return code;
737,102,048✔
4938
}
4939

4940
int32_t tColDataAddValueByBind2WithGeos(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
1,078,848✔
4941
                                        initGeosFn igeos, checkWKBGeometryFn cgeos) {
4942
  int32_t code = 0;
1,078,848✔
4943

4944
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
1,078,848✔
4945
    if (!(pColData->type == pBind->buffer_type)) {
1,079,172✔
4946
      return TSDB_CODE_INVALID_PARA;
×
4947
    }
4948
  }
4949

4950
  if (pColData->type != TSDB_DATA_TYPE_GEOMETRY) {
1,079,172✔
4951
    return TSDB_CODE_INVALID_OPTION;
×
4952
  }
4953

4954
  code = igeos();
1,078,632✔
4955
  if (code) {
1,078,056✔
4956
    return code;
×
4957
  }
4958

4959
  uint8_t *buf = pBind->buffer;
1,078,056✔
4960
  for (int32_t i = 0; i < pBind->num; ++i) {
2,157,660✔
4961
    if (pBind->is_null && pBind->is_null[i]) {
1,078,812✔
4962
      if (pColData->cflag & COL_IS_KEY) {
36✔
4963
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4964
        goto _exit;
×
4965
      }
4966
      if (pBind->is_null[i] == 1) {
36✔
4967
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
36✔
4968
        if (code) goto _exit;
36✔
4969
      } else {
4970
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4971
        if (code) goto _exit;
×
4972
      }
4973
    } else if (pBind->length[i] > buffMaxLen) {
1,079,064✔
4974
      return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4975
    } else {
4976
      code = cgeos(buf, pBind->length[i]);
1,079,496✔
4977
      if (code) {
1,075,752✔
4978
        uError("stmt2 col[%d] bind geometry with wrong format", i);
×
4979
        goto _exit;
×
4980
      }
4981
      code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
1,075,752✔
4982
      buf += pBind->length[i];
1,079,064✔
4983
    }
4984
  }
4985

4986
_exit:
1,079,532✔
4987
  return code;
1,079,532✔
4988
}
4989

4990
int32_t tColDataAddValueByBind2WithBlob(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
246✔
4991
                                        SBlobSet *pBlobSet) {
4992
  int32_t code = 0;
246✔
4993

4994
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
246✔
4995
    if (!(pColData->type == pBind->buffer_type)) {
120✔
4996
      return TSDB_CODE_INVALID_PARA;
×
4997
    }
4998
  }
4999

5000
  if (IS_STR_DATA_BLOB(pColData->type)) {  // var-length data type
246✔
5001
    uint8_t *buf = pBind->buffer;
246✔
5002
    for (int32_t i = 0; i < pBind->num; ++i) {
492✔
5003
      if (pBind->is_null && pBind->is_null[i]) {
246✔
5004
        if (pColData->cflag & COL_IS_KEY) {
126✔
5005
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5006
          goto _exit;
×
5007
        }
5008
        if (pBind->is_null[i] == 1) {
126✔
5009
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NULL](pBlobSet, pColData, NULL, 0);
126✔
5010
          if (code) goto _exit;
126✔
5011
        } else {
5012
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NONE](pBlobSet, pColData, NULL, 0);
×
5013
          if (code) goto _exit;
×
5014
        }
5015
      } else if (pBind->length[i] > buffMaxLen) {
120✔
5016
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5017
      } else {
5018
        code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_VALUE](pBlobSet, pColData, buf, pBind->length[i]);
120✔
5019
        buf += pBind->length[i];
120✔
5020
      }
5021
    }
5022
  }
5023
_exit:
246✔
5024
  return code;
246✔
5025
}
5026

5027
int32_t tColDataAddValueByBind2WithDecimal(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
246✔
5028
                                           uint8_t precision, uint8_t scale) {
5029
  int32_t code = 0;
246✔
5030

5031
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
246✔
5032
    if (!(pColData->type == pBind->buffer_type)) {
82✔
5033
      return TSDB_CODE_INVALID_PARA;
×
5034
    }
5035
  }
5036

5037
  if (!IS_DECIMAL_TYPE(pColData->type)) {
284✔
5038
    return TSDB_CODE_INVALID_OPTION;
×
5039
  }
5040

5041
  uint8_t *buf = pBind->buffer;
246✔
5042
  for (int32_t i = 0; i < pBind->num; ++i) {
568✔
5043
    if (pBind->is_null && pBind->is_null[i]) {
284✔
5044
      if (pColData->cflag & COL_IS_KEY) {
164✔
5045
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5046
        goto _exit;
×
5047
      }
5048
      if (pBind->is_null[i] == 1) {
164✔
5049
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
164✔
5050
        if (code) goto _exit;
164✔
5051
      } else {
5052
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
5053
        if (code) goto _exit;
×
5054
      }
5055
    } else {
5056
      if (pColData->type == TSDB_DATA_TYPE_DECIMAL64) {
82✔
5057
        Decimal64 dec = {0};
38✔
5058
        int32_t   code = decimal64FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
38✔
5059
        buf += pBind->length[i];
38✔
5060
        if (TSDB_CODE_SUCCESS != code) {
38✔
5061
          return code;
×
5062
        }
5063
        int64_t tmp = DECIMAL64_GET_VALUE(&dec);
38✔
5064
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)&tmp,
38✔
5065
                                                                      TYPE_BYTES[pColData->type]);
38✔
5066
      } else if (pColData->type == TSDB_DATA_TYPE_DECIMAL) {
82✔
5067
        Decimal128 dec = {0};
82✔
5068
        int32_t    code = decimal128FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
82✔
5069
        buf += pBind->length[i];
82✔
5070
        if (TSDB_CODE_SUCCESS != code) {
82✔
5071
          return code;
×
5072
        }
5073
        uint8_t *pV = taosMemCalloc(1, sizeof(Decimal128));
82✔
5074
        if (!pV) return terrno;
82✔
5075
        memcpy(pV, &dec, DECIMAL_WORD_NUM(Decimal128) * sizeof(DecimalWord));
82✔
5076
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pV, TYPE_BYTES[pColData->type]);
82✔
5077
        taosMemoryFree(pV);
82✔
5078
      }
5079
    }
5080
  }
5081

5082
_exit:
284✔
5083
  return code;
284✔
5084
}
5085
/* build rows to `rowArray` from bind
5086
 * `infos` is the bind information array
5087
 * `numOfInfos` is the number of bind information
5088
 * `infoSorted` is whether the bind information is sorted by column id
5089
 * `pTSchema` is the schema of the table
5090
 * `rowArray` is the array to store the rows
5091
 * `pOrdered` is the pointer to store ordered
5092
 * `pDupTs` is the pointer to store duplicateTs
5093
 */
5094
int32_t tRowBuildFromBind2(SBindInfo2 *infos, int32_t numOfInfos, SSHashObj *parsedCols, bool infoSorted,
1,026,314✔
5095
                           const STSchema *pTSchema, const SSchemaExt *pSchemaExt, SArray *rowArray, bool *pOrdered,
5096
                           bool *pDupTs) {
5097
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
1,026,314✔
5098
    return TSDB_CODE_INVALID_PARA;
×
5099
  }
5100
  int8_t hasBlob = schemaHasBlob(pTSchema);
1,026,862✔
5101
  if (!infoSorted) {
1,026,826✔
5102
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
5103
  }
5104

5105
  int32_t code = 0;
1,026,826✔
5106
  int32_t numOfRows = -1;
1,026,826✔
5107
  SArray *colValArray, *bufArray;
5108
  SColVal colVal;
339,542✔
5109
  int32_t numOfFixedValue = 0;
1,026,780✔
5110
  int32_t lino = 0;
1,026,780✔
5111
  bool    hasDecimal128 = false;
1,026,780✔
5112

5113
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
1,026,780✔
5114
    return terrno;
×
5115
  }
5116
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
1,026,590✔
UNCOV
5117
    taosArrayDestroy(colValArray);
×
5118
    return terrno;
×
5119
  }
5120
  for (int i = 0; i < numOfInfos; ++i) {
9,233,060✔
5121
    if (parsedCols) {
8,205,655✔
5122
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
×
5123
      if (pParsedVal) {
×
5124
        continue;
×
5125
      }
5126
    }
5127
    if (numOfRows == -1) {
8,205,655✔
5128
      numOfRows = infos[i].bind->num;
1,026,596✔
5129
    }
5130

5131
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
16,411,941✔
5132
      taosArrayDestroy(colValArray);
×
5133
      taosArrayDestroy(bufArray);
×
5134
      return terrno;
×
5135
    }
5136
  }
5137

5138
  SRowKey rowKey, lastRowKey;
340,001✔
5139
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
10,811,469✔
5140
    taosArrayClear(colValArray);
9,787,101✔
5141

5142
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
55,977,488✔
5143
      if (parsedCols) {
46,119,138✔
5144
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
×
5145
        if (pParsedVal) {
×
5146
          numOfFixedValue++;
×
5147
          colVal = *pParsedVal;
×
5148

5149
          if (taosArrayPush(colValArray, &colVal) == NULL) {
×
5150
            code = terrno;
×
5151
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5152
          }
5153
          continue;
×
5154
        }
5155
      }
5156

5157
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
46,124,274✔
5158
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
5159
          if (iInfo == 0) {
×
5160
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5161
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5162
          }
5163
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
5164
        } else {
5165
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
5166
        }
5167
      } else {
5168
        SValue value = {
46,124,248✔
5169
            .type = infos[iInfo].type,
46,113,256✔
5170
        };
5171
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
46,122,034✔
5172
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
3,612,098✔
UNCOV
5173
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5174
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5175
            value.nData = length;
×
5176
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
5177
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5178
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum lenght: %d", iInfo, iRow,
×
5179
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
5180
              goto _exit;
×
5181
            }
5182
            value.pData = *data;
×
5183
            *data += length;
×
5184
          } else {
5185
            int32_t   length = infos[iInfo].bind->length[iRow];
3,637,323✔
5186
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
3,637,637✔
5187
            value.nData = length;
3,638,362✔
5188
            if (value.nData > infos[iInfo].bytes - VARSTR_HEADER_SIZE) {
3,638,362✔
5189
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5190
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum lenght: %d", iInfo, iRow,
×
5191
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
5192
              goto _exit;
×
5193
            }
5194
            value.pData = *data;
3,638,090✔
5195
            *data += length;
3,636,875✔
5196
          }
5197
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5198
        } else {
5199
          if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL) {
42,543,688✔
5200
            if (!pSchemaExt) {
×
5201
              uError("stmt2 decimal64 type without ext schema info, cannot parse decimal values");
×
5202
              code = TSDB_CODE_DECIMAL_PARSE_ERROR;
×
5203
              goto _exit;
×
5204
            }
5205
            uint8_t precision = 0, scale = 0;
×
5206
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
×
5207
            Decimal128 dec = {0};
×
5208
            uint8_t  **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5209
            int32_t    length = infos[iInfo].bind->length[iRow];
×
5210
            code = decimal128FromStr(*(char **)data, length, precision, scale, &dec);
×
5211
            *data += length;
×
5212
            hasDecimal128 = true;
×
5213
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5214

5215
            // precision check
5216
            // scale auto fit
5217

5218
            code = decimal128ToDataVal(&dec, &value);
×
5219
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5220

5221
          } else if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL64) {
42,537,882✔
5222
            if (!pSchemaExt) {
×
5223
              uError("stmt2 decimal128 type without ext schema info, cannot parse decimal values");
×
5224
              code = TSDB_CODE_DECIMAL_PARSE_ERROR;
×
5225
              goto _exit;
×
5226
            }
5227
            uint8_t precision = 0, scale = 0;
×
5228
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
×
5229
            Decimal64 dec = {0};
×
5230
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5231
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5232
            code = decimal64FromStr(*(char **)data, length, precision, scale, &dec);
×
5233
            *data += length;
×
5234
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5235

5236
            code = decimal64ToDataVal(&dec, &value);
×
5237
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5238

5239
          } else {
5240
            uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
42,538,493✔
5241
            if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
42,541,143✔
5242
              *val = 1;
×
5243
            }
5244
            valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
42,541,143✔
5245
          }
5246
        }
5247
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
46,140,464✔
5248
      }
5249
      if (taosArrayPush(colValArray, &colVal) == NULL) {
46,191,215✔
5250
        code = terrno;
×
5251
        goto _exit;
×
5252
      }
5253
    }
5254

5255
    SRow *row;
2,574,738✔
5256

5257
    if (hasBlob == 0) {
9,822,453✔
5258
      SRowBuildScanInfo sinfo = {0};
9,787,442✔
5259
      code = tRowBuild(colValArray, pTSchema, &row, &sinfo);
9,787,846✔
5260
      TAOS_CHECK_GOTO(code, &lino, _exit);
9,784,568✔
5261
    } else {
5262
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
35,011✔
5263
      code = tRowBuildWithBlob(colValArray, pTSchema, &row, NULL, &sinfo);
34,620✔
5264
      TAOS_CHECK_GOTO(code, &lino, _exit);
×
5265
    }
5266

5267
    if ((taosArrayPush(rowArray, &row)) == NULL) {
9,783,525✔
5268
      code = terrno;
×
5269
      goto _exit;
×
5270
    }
5271

5272
    // fix decimal memory leak
5273
    if (hasDecimal128) {
9,783,525✔
5274
      int32_t num = taosArrayGetSize(colValArray);
×
5275
      for (int32_t i = 0; i < num; ++i) {
×
5276
        SColVal *pCol = taosArrayGet(colValArray, i);
×
5277
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
×
5278
          taosMemoryFreeClear(pCol->value.pData);
×
5279
        }
5280
      }
5281
      hasDecimal128 = false;
×
5282
    }
5283

5284
    if (pOrdered && pDupTs) {
9,783,525✔
5285
      tRowGetKey(row, &rowKey);
19,568,988✔
5286
      if (iRow == 0) {
9,785,945✔
5287
        *pOrdered = true;
1,026,279✔
5288
        *pDupTs = false;
1,026,279✔
5289
      } else {
5290
        if (*pOrdered) {
8,759,666✔
5291
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
8,758,829✔
5292
          *pOrdered = (res >= 0);
8,758,829✔
5293
          if (!*pDupTs) {
8,757,718✔
5294
            *pDupTs = (res == 0);
8,757,660✔
5295
          }
5296
        }
5297
      }
5298
      lastRowKey = rowKey;
9,783,843✔
5299
    }
5300
  }
5301
_exit:
1,024,132✔
5302
  if (code != 0) {
1,024,368✔
5303
    if (hasDecimal128) {
×
5304
      int32_t num = taosArrayGetSize(colValArray);
×
5305
      for (int32_t i = 0; i < num; ++i) {
×
5306
        SColVal *pCol = taosArrayGet(colValArray, i);
×
5307
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
×
5308
          taosMemoryFreeClear(pCol->value.pData);
×
5309
        }
5310
      }
5311
    }
5312
    uError("tRowBuildFromBind2 failed at line %d, ErrCode=0x%x", lino, code);
×
5313
  }
5314
  taosArrayDestroy(colValArray);
1,024,368✔
5315
  taosArrayDestroy(bufArray);
1,026,992✔
5316
  return code;
1,027,276✔
5317
}
5318
/* build rows to `rowArray` from bind
5319
 * `infos` is the bind information array
5320
 * `numOfInfos` is the number of bind information
5321
 * `infoSorted` is whether the bind information is sorted by column id
5322
 * `pTSchema` is the schema of the table
5323
 * `rowArray` is the array to store the rows
5324
 * `pOrdered` is the pointer to store ordered
5325
 * `pDupTs` is the pointer to store duplicateTs
5326
 */
5327
int32_t tRowBuildFromBind2WithBlob(SBindInfo2 *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
×
5328
                                   SArray *rowArray, bool *pOrdered, bool *pDupTs, SBlobSet *pBlobSet) {
5329
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
×
5330
    return TSDB_CODE_INVALID_PARA;
×
5331
  }
5332
  int8_t hasBlob = schemaHasBlob(pTSchema);
×
5333
  if (!infoSorted) {
×
5334
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
5335
  }
5336

5337
  int32_t code = 0;
×
5338
  int32_t numOfRows = infos[0].bind->num;
×
5339
  SArray *colValArray, *bufArray;
5340
  SColVal colVal;
×
5341

5342
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
×
5343
    return terrno;
×
5344
  }
5345
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
×
5346
    taosArrayDestroy(colValArray);
×
5347
    return terrno;
×
5348
  }
5349
  for (int i = 0; i < numOfInfos; ++i) {
×
5350
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
×
5351
      taosArrayDestroy(colValArray);
×
5352
      taosArrayDestroy(bufArray);
×
5353
      return terrno;
×
5354
    }
5355
  }
5356

5357
  SRowKey rowKey, lastRowKey;
×
5358
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
×
5359
    taosArrayClear(colValArray);
×
5360

5361
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
×
5362
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
×
5363
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
5364
          if (iInfo == 0) {
×
5365
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5366
            goto _exit;
×
5367
          }
5368
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
5369
        } else {
5370
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
5371
        }
5372
      } else {
5373
        SValue value = {
×
5374
            .type = infos[iInfo].type,
×
5375
        };
5376
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
×
5377
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
×
5378
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5379
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
5380
            value.nData = length;
×
5381
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
5382
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5383
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5384
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5385
              goto _exit;
×
5386
            }
5387
            value.pData = *data;
×
5388
            *data += length;
×
5389
          } else {
5390
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5391
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
5392
            value.nData = length;
×
5393
            if (value.nData > pTSchema->columns[infos[iInfo].columnId - 1].bytes - VARSTR_HEADER_SIZE) {
×
5394
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5395
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5396
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5397
              goto _exit;
×
5398
            }
5399
            value.pData = *data;
×
5400
            *data += length;
×
5401
          }
5402

5403
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5404
        } else {
5405
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
×
5406
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
×
5407
            *val = 1;
×
5408
          }
5409
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
×
5410
        }
5411
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
×
5412
      }
5413
      if (taosArrayPush(colValArray, &colVal) == NULL) {
×
5414
        code = terrno;
×
5415
        goto _exit;
×
5416
      }
5417
    }
5418

5419
    SRow *row;
×
5420

5421
    if (hasBlob == 0) {
×
5422
      SRowBuildScanInfo sinfo = {0};
×
5423
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
×
5424
        goto _exit;
×
5425
      }
5426
    } else {
5427
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
×
5428
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, pBlobSet, &sinfo))) {
×
5429
        goto _exit;
×
5430
      }
5431
    }
5432

5433
    if ((taosArrayPush(rowArray, &row)) == NULL) {
×
5434
      code = terrno;
×
5435
      goto _exit;
×
5436
    }
5437

5438
    if (pOrdered && pDupTs) {
×
5439
      tRowGetKey(row, &rowKey);
×
5440
      if (iRow == 0) {
×
5441
        *pOrdered = true;
×
5442
        *pDupTs = false;
×
5443
      } else {
5444
        if (*pOrdered) {
×
5445
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
×
5446
          *pOrdered = (res >= 0);
×
5447
          if (!*pDupTs) {
×
5448
            *pDupTs = (res == 0);
×
5449
          }
5450
        }
5451
      }
5452
      lastRowKey = rowKey;
×
5453
    }
5454
  }
5455
_exit:
×
5456
  taosArrayDestroy(colValArray);
×
5457
  taosArrayDestroy(bufArray);
×
5458
  return code;
×
5459
}
5460

5461
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
42,379,392✔
5462
  int32_t code = TSDB_CODE_SUCCESS;
42,379,392✔
5463

5464
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
42,379,392✔
5465
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
5,344,488✔
5466
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
4,806,756✔
5467
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
10,151,244✔
5468
    if (iToRow == 0) {
5,344,488✔
5469
      pToColData->aOffset[iToRow] = 0;
14,940✔
5470
    }
5471

5472
    if (iToRow < pToColData->nVal - 1) {
5,344,488✔
5473
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
5,331,654✔
5474
    }
5475

5476
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
5,344,488✔
5477
                 nData);
5478
  } else {
5479
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
37,034,904✔
5480
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
37,034,904✔
5481
  }
5482
  return code;
42,379,392✔
5483
}
5484

5485
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
43,902,480✔
5486
                                        int32_t iToRow) {
5487
  int32_t code = TSDB_CODE_SUCCESS;
43,902,480✔
5488
  int     bit_val = 0;
43,902,480✔
5489

5490
  switch (pFromColData->flag) {
43,902,480✔
5491
    case HAS_NONE: {
×
5492
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5493
    } break;
×
5494
    case HAS_NULL: {
1,523,088✔
5495
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
1,523,088✔
5496
    } break;
1,523,088✔
5497
    case (HAS_NULL | HAS_NONE): {
×
5498
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5499
      if (0 == bit_val)
×
5500
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5501
      else
5502
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
×
5503
    } break;
×
5504
    case HAS_VALUE: {
4,804,854✔
5505
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
4,804,854✔
5506
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
4,804,854✔
5507
    } break;
4,804,854✔
5508
    case (HAS_VALUE | HAS_NONE): {
×
5509
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5510
      if (0 == bit_val)
×
5511
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5512
      else
5513
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
×
5514
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5515
    } break;
×
5516
    case (HAS_VALUE | HAS_NULL): {
37,574,538✔
5517
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
37,574,538✔
5518
      if (0 == bit_val)
37,574,538✔
5519
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
16,964,031✔
5520
      else
5521
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
20,610,507✔
5522
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
37,574,538✔
5523
    } break;
37,574,538✔
5524
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
5525
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
5526
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5527
    } break;
×
5528
    default:
×
5529
      return -1;
×
5530
  }
5531

5532
  return code;
43,902,480✔
5533
}
5534

5535
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
2,760,054✔
5536
                               int32_t nColData) {
5537
  int32_t code = TSDB_CODE_SUCCESS;
2,760,054✔
5538

5539
  for (int32_t i = 0; i < nColData; i++) {
46,662,534✔
5540
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
43,902,480✔
5541
    if (code != TSDB_CODE_SUCCESS) {
43,902,480✔
5542
      return code;
×
5543
    }
5544
  }
5545

5546
  return code;
2,760,054✔
5547
}
5548

5549
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
2,760,054✔
5550
  int32_t code = TSDB_CODE_SUCCESS;
2,760,054✔
5551

5552
  for (int32_t i = 0; i < nColData; i++) {
46,662,534✔
5553
    SColVal cv = {0};
43,902,480✔
5554
    code = tColDataGetValue(&aFromColData[i], iFromRow, &cv);
43,902,480✔
5555
    if (code != TSDB_CODE_SUCCESS) {
43,902,480✔
5556
      return code;
×
5557
    }
5558
    code = tColDataAppendValue(&aToColData[i], &cv);
43,902,480✔
5559
    if (code != TSDB_CODE_SUCCESS) {
43,902,480✔
5560
      return code;
×
5561
    }
5562
  }
5563

5564
  return code;
2,760,054✔
5565
}
5566

5567
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
2,147,483,647✔
5568
  SColVal cv;
2,147,483,647✔
5569

5570
  key->ts = ((TSKEY *)aColData[0].pData)[iRow];
2,147,483,647✔
5571
  key->numOfPKs = 0;
2,147,483,647✔
5572

5573
  for (int i = 1; i < nColData; i++) {
2,147,483,647✔
5574
    if (aColData[i].cflag & COL_IS_KEY) {
2,147,483,647✔
5575
      tColDataGetValue4(&aColData[i], iRow, &cv);
900,864✔
5576
      key->pks[key->numOfPKs++] = cv.value;
900,864✔
5577
    } else {
5578
      break;
2,147,483,647✔
5579
    }
5580
  }
5581
}
2,147,483,647✔
5582

5583
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
310,557✔
5584
  SColData *aDstColData = NULL;
310,557✔
5585
  int32_t   i = start, j = mid + 1, k = 0;
310,557✔
5586
  SRowKey   keyi, keyj;
310,557✔
5587

5588
  if (end > start) {
310,557✔
5589
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
310,557✔
5590
    if (aDstColData == NULL) {
310,557✔
5591
      return terrno;
×
5592
    }
5593
    for (int c = 0; c < nColData; ++c) {
5,199,435✔
5594
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
4,888,878✔
5595
    }
5596
  }
5597

5598
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
310,557✔
5599
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
310,557✔
5600
  while (i <= mid && j <= end) {
1,691,340✔
5601
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
1,380,783✔
5602
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
9,144✔
5603
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
9,144✔
5604
    } else {
5605
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
1,371,639✔
5606
      if (j <= end) tColDataArrGetRowKey(aColData, nColData, j, &keyj);
1,371,639✔
5607
    }
5608
  }
5609

5610
  while (i <= mid) {
1,682,808✔
5611
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
1,372,251✔
5612
  }
5613

5614
  while (j <= end) {
317,577✔
5615
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
7,020✔
5616
  }
5617

5618
  for (i = start, k = 0; i <= end; ++i, ++k) {
3,070,611✔
5619
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
2,760,054✔
5620
  }
5621

5622
  if (aDstColData) {
310,557✔
5623
    for (int32_t i = 0; i < nColData; i++) {
5,199,435✔
5624
      tColDataDestroy(&aDstColData[i]);
4,888,878✔
5625
    }
5626
    taosMemoryFree(aDstColData);
310,557✔
5627
  }
5628

5629
  return TSDB_CODE_SUCCESS;
310,557✔
5630
}
5631

5632
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
623,547✔
5633
  int32_t ret = TSDB_CODE_SUCCESS;
623,547✔
5634
  int32_t mid;
5635

5636
  if (start >= end) {
623,547✔
5637
    return TSDB_CODE_SUCCESS;
312,990✔
5638
  }
5639

5640
  mid = (start + end) / 2;
310,557✔
5641

5642
  ret = tColDataMergeSort(aColData, start, mid, nColData);
310,557✔
5643
  if (ret != TSDB_CODE_SUCCESS) {
310,557✔
5644
    return ret;
×
5645
  }
5646

5647
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
310,557✔
5648
  if (ret != TSDB_CODE_SUCCESS) {
310,557✔
5649
    return ret;
×
5650
  }
5651

5652
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
310,557✔
5653
}
5654

5655
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
2,433✔
5656
  int32_t nVal = aColData[0].nVal;
2,433✔
5657

5658
  if (nVal < 2) return TSDB_CODE_SUCCESS;
2,433✔
5659

5660
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
2,433✔
5661
}
5662

5663
static int32_t tColDataMerge(SArray **colArr) {
900✔
5664
  int32_t code = 0;
900✔
5665
  SArray *src = *colArr;
900✔
5666
  SArray *dst = NULL;
900✔
5667

5668
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
900✔
5669
  if (dst == NULL) {
900✔
5670
    return terrno;
×
5671
  }
5672

5673
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
3,600✔
5674
    SColData *srcCol = taosArrayGet(src, i);
2,700✔
5675

5676
    SColData *dstCol = taosArrayReserve(dst, 1);
2,700✔
5677
    if (dstCol == NULL) {
2,700✔
5678
      code = terrno;
×
5679
      goto _exit;
×
5680
    }
5681
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
2,700✔
5682
  }
5683

5684
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
900✔
5685
  SRowKey lastKey;
900✔
5686
  for (int32_t i = 0; i < numRows; i++) {
2,700✔
5687
    SRowKey key;
1,800✔
5688
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
1,800✔
5689

5690
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
2,700✔
5691
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
3,600✔
5692
        SColData *srcCol = taosArrayGet(src, j);
2,700✔
5693
        SColData *dstCol = taosArrayGet(dst, j);
2,700✔
5694

5695
        SColVal cv;
2,700✔
5696
        code = tColDataGetValue(srcCol, i, &cv);
2,700✔
5697
        if (code != TSDB_CODE_SUCCESS) {
2,700✔
5698
          goto _exit;
×
5699
        }
5700
        code = tColDataAppendValue(dstCol, &cv);
2,700✔
5701
        if (code) {
2,700✔
5702
          goto _exit;
×
5703
        }
5704
      }
5705
      lastKey = key;
900✔
5706
    } else {  // update existing row
5707
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
3,600✔
5708
        SColData *srcCol = taosArrayGet(src, j);
2,700✔
5709
        SColData *dstCol = taosArrayGet(dst, j);
2,700✔
5710

5711
        SColVal cv;
2,700✔
5712
        code = tColDataGetValue(srcCol, i, &cv);
2,700✔
5713
        if (code != TSDB_CODE_SUCCESS) {
2,700✔
5714
          goto _exit;
×
5715
        }
5716
        code = tColDataUpdateValue(dstCol, &cv, true);
2,700✔
5717
        if (code) {
2,700✔
5718
          goto _exit;
×
5719
        }
5720
      }
5721
    }
5722
  }
5723

5724
_exit:
900✔
5725
  if (code) {
900✔
5726
    taosArrayDestroyEx(dst, tColDataDestroy);
×
5727
  } else {
5728
    taosArrayDestroyEx(src, tColDataDestroy);
900✔
5729
    *colArr = dst;
900✔
5730
  }
5731
  return code;
900✔
5732
}
5733

5734
int32_t tColDataSortMerge(SArray **arr) {
6,888,260✔
5735
  SArray   *colDataArr = *arr;
6,888,260✔
5736
  int32_t   nColData = TARRAY_SIZE(colDataArr);
6,891,346✔
5737
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
6,891,023✔
5738

5739
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
6,888,084✔
5740
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5741
  }
5742
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
6,884,388✔
5743
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5744
  }
5745
  if (!(aColData[0].flag == HAS_VALUE)) {
6,887,000✔
5746
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5747
  }
5748

5749
  if (aColData[0].nVal <= 1) goto _exit;
6,889,369✔
5750

5751
  int8_t doSort = 0;
6,850,610✔
5752
  int8_t doMerge = 0;
6,850,610✔
5753
  // scan -------
5754
  SRowKey lastKey;
6,839,969✔
5755
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
6,853,370✔
5756
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
2,147,483,647✔
5757
    SRowKey key;
2,147,483,647✔
5758
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
2,147,483,647✔
5759

5760
    int32_t c = tRowKeyCompare(&lastKey, &key);
2,147,483,647✔
5761
    if (c < 0) {
2,147,483,647✔
5762
      lastKey = key;
2,147,483,647✔
5763
      continue;
2,147,483,647✔
5764
    } else if (c > 0) {
3,091,180✔
5765
      doSort = 1;
2,433✔
5766
      break;
2,433✔
5767
    } else {
5768
      doMerge = 1;
3,088,747✔
5769
    }
5770
  }
5771

5772
  // sort -------
5773
  if (doSort) {
11,436,844✔
5774
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
2,433✔
5775
  }
5776

5777
  if ((doMerge != 1) && (doSort == 1)) {
11,437,156✔
5778
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
2,433✔
5779
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
312,990✔
5780
      SRowKey key;
310,557✔
5781
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
310,557✔
5782

5783
      int32_t c = tRowKeyCompare(&lastKey, &key);
310,557✔
5784
      if (c == 0) {
310,557✔
5785
        doMerge = 1;
×
5786
        break;
×
5787
      }
5788
      lastKey = key;
310,557✔
5789
    }
5790
  }
5791

5792
  // merge -------
5793
  if (doMerge) {
6,857,809✔
5794
    int32_t code = tColDataMerge(arr);
900✔
5795
    if (code) return code;
900✔
5796
  }
5797

5798
_exit:
6,891,390✔
5799
  return 0;
6,892,131✔
5800
}
5801

5802
int32_t tColDataSortMergeWithBlob(SArray **arr, SBlobSet *pBlob) {
×
5803
  SArray   *colDataArr = *arr;
×
5804
  int32_t   nColData = TARRAY_SIZE(colDataArr);
×
5805
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
×
5806

5807
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
×
5808
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5809
  }
5810
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
5811
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5812
  }
5813
  if (!(aColData[0].flag == HAS_VALUE)) {
×
5814
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5815
  }
5816

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

5819
  int8_t doSort = 0;
×
5820
  int8_t doMerge = 0;
×
5821
  // scan -------
5822
  SRowKey lastKey;
×
5823
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5824
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5825
    SRowKey key;
×
5826
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5827

5828
    int32_t c = tRowKeyCompare(&lastKey, &key);
×
5829
    if (c < 0) {
×
5830
      lastKey = key;
×
5831
      continue;
×
5832
    } else if (c > 0) {
×
5833
      doSort = 1;
×
5834
      break;
×
5835
    } else {
5836
      doMerge = 1;
×
5837
    }
5838
  }
5839
  if (doMerge || doSort) {
×
5840
    return TSDB_CODE_BLOB_NOT_SUPPORT;
×
5841
  }
5842
  // sort -------
5843
  if (doSort) {
×
5844
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
×
5845
  }
5846

5847
  if ((doMerge != 1) && (doSort == 1)) {
×
5848
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5849
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5850
      SRowKey key;
×
5851
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5852

5853
      int32_t c = tRowKeyCompare(&lastKey, &key);
×
5854
      if (c == 0) {
×
5855
        doMerge = 1;
×
5856
        break;
×
5857
      }
5858
      lastKey = key;
×
5859
    }
5860
  }
5861

5862
  // merge -------
5863
  if (doMerge) {
×
5864
    int32_t code = tColDataMerge(arr);
×
5865
    if (code) return code;
×
5866
  }
5867

5868
_exit:
×
5869
  return 0;
×
5870
}
5871

5872
static int32_t tEncodeColDataVersion0(SEncoder *pEncoder, SColData *pColData) {
42,536,730✔
5873
  int32_t code = 0;
42,536,730✔
5874

5875
  if ((code = tEncodeI16v(pEncoder, pColData->cid))) return code;
85,077,872✔
5876
  if ((code = tEncodeI8(pEncoder, pColData->type))) return code;
85,092,433✔
5877
  if ((code = tEncodeI32v(pEncoder, pColData->nVal))) return code;
85,100,680✔
5878
  if ((code = tEncodeI8(pEncoder, pColData->flag))) return code;
85,093,492✔
5879

5880
  // bitmap
5881
  switch (pColData->flag) {
42,544,103✔
5882
    case (HAS_NULL | HAS_NONE):
140,258✔
5883
    case (HAS_VALUE | HAS_NONE):
5884
    case (HAS_VALUE | HAS_NULL):
5885
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
140,258✔
5886
      if (code) return code;
140,258✔
5887
      break;
140,258✔
5888
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5889
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
5890
      if (code) return code;
×
5891
      break;
×
5892
    default:
42,396,716✔
5893
      break;
42,396,716✔
5894
  }
5895

5896
  // value
5897
  if (pColData->flag & HAS_VALUE) {
42,536,974✔
5898
    if (IS_VAR_DATA_TYPE(pColData->type)) {
42,475,537✔
5899
      code = tEncodeFixed(pEncoder, pColData->aOffset, pColData->nVal << 2);
134,398✔
5900
      if (code) return code;
140,649✔
5901

5902
      code = tEncodeI32v(pEncoder, pColData->nData);
140,649✔
5903
      if (code) return code;
140,737✔
5904

5905
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
140,737✔
5906
      if (code) return code;
140,695✔
5907
    } else {
5908
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
42,330,800✔
5909
      if (code) return code;
42,318,336✔
5910
    }
5911
  }
5912

5913
  return code;
42,531,259✔
5914
}
5915

5916
static int32_t tDecodeColDataVersion0(SDecoder *pDecoder, SColData *pColData) {
29,348,962✔
5917
  int32_t code = 0;
29,348,962✔
5918

5919
  if ((code = tDecodeI16v(pDecoder, &pColData->cid))) return code;
58,699,254✔
5920
  if ((code = tDecodeI8(pDecoder, &pColData->type))) return code;
58,702,560✔
5921
  if ((code = tDecodeI32v(pDecoder, &pColData->nVal))) return code;
58,700,873✔
5922
  if ((code = tDecodeI8(pDecoder, &pColData->flag))) return code;
58,699,893✔
5923

5924
  if (pColData->type <= 0 || pColData->type >= TSDB_DATA_TYPE_MAX || pColData->flag <= 0 || pColData->flag >= 8) {
29,351,288✔
5925
    return TSDB_CODE_INVALID_PARA;
×
5926
  }
5927

5928
  // bitmap
5929
  switch (pColData->flag) {
29,350,576✔
5930
    case (HAS_NULL | HAS_NONE):
47,510✔
5931
    case (HAS_VALUE | HAS_NONE):
5932
    case (HAS_VALUE | HAS_NULL):
5933
      code = tDecodeBinaryWithSize(pDecoder, BIT1_SIZE(pColData->nVal), &pColData->pBitMap);
47,510✔
5934
      if (code) return code;
47,510✔
5935
      break;
47,510✔
5936
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5937
      code = tDecodeBinaryWithSize(pDecoder, BIT2_SIZE(pColData->nVal), &pColData->pBitMap);
×
5938
      if (code) return code;
×
5939
      break;
×
5940
    default:
29,301,096✔
5941
      break;
29,301,096✔
5942
  }
5943

5944
  // value
5945
  if (pColData->flag & HAS_VALUE) {
29,348,606✔
5946
    if (IS_VAR_DATA_TYPE(pColData->type)) {
29,310,728✔
5947
      code = tDecodeBinaryWithSize(pDecoder, pColData->nVal << 2, (uint8_t **)&pColData->aOffset);
96,948✔
5948
      if (code) return code;
101,786✔
5949

5950
      code = tDecodeI32v(pDecoder, &pColData->nData);
101,786✔
5951
      if (code) return code;
101,799✔
5952

5953
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
101,799✔
5954
      if (code) return code;
101,516✔
5955
    } else {
5956
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
29,210,884✔
5957
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
29,208,648✔
5958
      if (code) return code;
29,210,968✔
5959
    }
5960
  }
5961
  pColData->cflag = 0;
29,351,029✔
5962

5963
  return code;
29,350,681✔
5964
}
5965

5966
static int32_t tEncodeColDataVersion1(SEncoder *pEncoder, SColData *pColData) {
42,528,082✔
5967
  int32_t code = tEncodeColDataVersion0(pEncoder, pColData);
42,528,082✔
5968
  if (code) return code;
42,518,413✔
5969
  return tEncodeI8(pEncoder, pColData->cflag);
85,058,187✔
5970
}
5971

5972
static int32_t tDecodeColDataVersion1(SDecoder *pDecoder, SColData *pColData) {
29,348,635✔
5973
  int32_t code = tDecodeColDataVersion0(pDecoder, pColData);
29,348,635✔
5974
  if (code) return code;
29,350,738✔
5975

5976
  code = tDecodeI8(pDecoder, &pColData->cflag);
29,350,738✔
5977
  return code;
29,351,345✔
5978
}
5979

5980
int32_t tEncodeColData(uint8_t version, SEncoder *pEncoder, SColData *pColData) {
42,512,737✔
5981
  if (version == 0) {
42,512,737✔
5982
    return tEncodeColDataVersion0(pEncoder, pColData);
×
5983
  } else if (version == 1) {
42,512,737✔
5984
    return tEncodeColDataVersion1(pEncoder, pColData);
×
5985
  } else if (version == 2) {
42,512,737✔
5986
    int32_t posStart = pEncoder->pos;
42,514,631✔
5987
    pEncoder->pos += INT_BYTES;
42,521,171✔
5988
    int32_t code = tEncodeColDataVersion1(pEncoder, pColData);
42,519,673✔
5989
    if (code) return code;
42,534,131✔
5990
    int32_t posEnd = pEncoder->pos;
42,534,131✔
5991
    int32_t pos = posEnd - posStart;
42,536,420✔
5992
    pEncoder->pos = posStart;
42,536,420✔
5993
    code = tEncodeI32(pEncoder, pos);
42,546,006✔
5994
    pEncoder->pos = posEnd;
42,546,006✔
5995
    return code;
42,540,720✔
5996
  } else {
5997
    return TSDB_CODE_INVALID_PARA;
26✔
5998
  }
5999
}
6000

6001
int32_t tDecodeColData(uint8_t version, SDecoder *pDecoder, SColData *pColData, bool jump) {
43,307,822✔
6002
  if (version == 0) {
43,307,822✔
6003
    return tDecodeColDataVersion0(pDecoder, pColData);
×
6004
  } else if (version == 1) {
43,307,822✔
6005
    return tDecodeColDataVersion1(pDecoder, pColData);
×
6006
  } else if (version == 2) {
43,307,822✔
6007
    if (jump) {
43,310,121✔
6008
      int32_t len = 0;
13,957,556✔
6009
      int32_t code = tDecodeI32(pDecoder, &len);
13,958,272✔
6010
      if (code) return code;
13,958,272✔
6011
      pDecoder->pos += (len - INT_BYTES);
13,958,272✔
6012
      return TSDB_CODE_SUCCESS;
13,957,945✔
6013
    } else {
6014
      pDecoder->pos += INT_BYTES;
29,352,565✔
6015
      return tDecodeColDataVersion1(pDecoder, pColData);
29,350,914✔
6016
    }    
6017
  } else {
6018
    return TSDB_CODE_INVALID_PARA;
×
6019
  }
6020
}
6021

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

6024
int32_t tDecodeRow(SDecoder *pDecoder, SRow **ppRow) {
2,147,483,647✔
6025
  if (ppRow == NULL) {
2,147,483,647✔
6026
    return TSDB_CODE_INVALID_PARA;
×
6027
  }
6028

6029
  if (pDecoder->pos + sizeof(SRow) > pDecoder->size) {
2,147,483,647✔
6030
    return TSDB_CODE_OUT_OF_RANGE;
×
6031
  }
6032

6033
  SRow *pRow = (SRow *)(pDecoder->data + pDecoder->pos);
2,147,483,647✔
6034
  return tDecodeBinaryWithSize(pDecoder, pRow->len, (uint8_t **)ppRow);
2,147,483,647✔
6035
}
6036

6037
int32_t tEncodeBlobSet(SEncoder *pEncoder, SBlobSet *pRow) {
62,882✔
6038
  int32_t code = 0;
62,882✔
6039
  int32_t lino = 0;
62,882✔
6040
  uint8_t compressed = 0;
62,882✔
6041
  int32_t compressSize = 0;
62,882✔
6042
  char   *p = NULL;
62,882✔
6043

6044
  TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pRow->type));
125,764✔
6045
  TAOS_CHECK_EXIT(tEncodeI64(pEncoder, pRow->len));
125,764✔
6046

6047
  int32_t nSeq = taosArrayGetSize(pRow->pSeqTable);
62,882✔
6048
  TAOS_CHECK_EXIT(tEncodeI32(pEncoder, nSeq));
62,882✔
6049

6050
  // if (pRow->type) {
6051
  void *pIter = taosHashIterate(pRow->pSeqToffset, NULL);
62,882✔
6052
  while (pIter) {
50,228,374✔
6053
    uint64_t seq = *(uint64_t *)taosHashGetKey(pIter, NULL);
50,165,492✔
6054
    int32_t  idx = *(int32_t *)pIter;
50,165,492✔
6055
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, seq));
50,165,492✔
6056
    TAOS_CHECK_EXIT(tEncodeI32(pEncoder, idx));
50,165,492✔
6057

6058
    pIter = taosHashIterate(pRow->pSeqToffset, pIter);
50,165,492✔
6059
  }
6060
  //}
6061
  for (int32_t i = 0; i < nSeq; i++) {
50,228,374✔
6062
    SBlobValue *p = taosArrayGet(pRow->pSeqTable, i);
50,165,492✔
6063
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, p->offset));
100,330,984✔
6064
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->len));
100,330,984✔
6065
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->dataOffset));
100,330,984✔
6066
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->nextRow));
100,330,984✔
6067
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->type));
100,330,984✔
6068
  }
6069

6070
  TAOS_CHECK_EXIT(tEncodeFixed(pEncoder, pRow->data, pRow->len));
125,764✔
6071

6072
_exit:
62,882✔
6073
  return code;
62,882✔
6074
}
6075

6076
int32_t tDecodeBlobSet(SDecoder *pDecoder, SBlobSet **pBlobSet) {
31,396✔
6077
  int32_t    code = 0;
31,396✔
6078
  int32_t    lino = 0;
31,396✔
6079
  int32_t    nSeq = 0;
31,396✔
6080
  uint8_t    compressd = 0;
31,396✔
6081
  int32_t    compressSize = 0;
31,396✔
6082
  SBlobSet  *pBlob = taosMemCalloc(1, sizeof(SBlobSet));
31,396✔
6083
  if (pBlob == NULL) {
31,396✔
6084
    TAOS_CHECK_EXIT(terrno);
×
6085
  }
6086
  TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &pBlob->type));
62,792✔
6087
  TAOS_CHECK_EXIT(tDecodeI64(pDecoder, &pBlob->len));
62,792✔
6088

6089
  TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &nSeq));
31,396✔
6090

6091
  // if (pBlob->type) {
6092
  pBlob->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
31,396✔
6093
  if (pBlob->pSeqToffset == NULL) {
31,396✔
6094
    TAOS_CHECK_EXIT(terrno);
×
6095
  }
6096
  for (int32_t i = 0; i < nSeq; i++) {
25,114,084✔
6097
    uint64_t seq;
25,082,688✔
6098
    int32_t  idx;
25,082,688✔
6099
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &seq));
25,082,688✔
6100
    TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &idx));
25,082,688✔
6101

6102
    code = taosHashPut(pBlob->pSeqToffset, &seq, sizeof(seq), &idx, sizeof(idx));
25,082,688✔
6103
    TAOS_CHECK_EXIT(code);
25,082,688✔
6104
  }
6105
  //}
6106

6107
  pBlob->pSeqTable = taosArrayInit(nSeq, sizeof(SBlobValue));
31,396✔
6108
  if (pBlob->pSeqTable == NULL) {
31,396✔
6109
    TAOS_CHECK_EXIT(terrno);
×
6110
  }
6111

6112
  for (int32_t i = 0; i < nSeq; i++) {
25,114,084✔
6113
    SBlobValue value;
25,082,688✔
6114
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &value.offset));
25,082,688✔
6115
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.len));
25,082,688✔
6116
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.dataOffset));
25,082,688✔
6117
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.nextRow));
25,082,688✔
6118
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.type));
25,082,688✔
6119
    if (taosArrayPush(pBlob->pSeqTable, &value) == NULL) {
50,165,376✔
6120
      TAOS_CHECK_EXIT(terrno);
×
6121
    }
6122
  }
6123

6124
  pBlob->data = taosMemCalloc(1, pBlob->len);
31,396✔
6125
  if (pBlob->data == NULL) {
31,396✔
6126
    TAOS_CHECK_EXIT(terrno);
×
6127
  }
6128

6129
  TAOS_CHECK_EXIT(tDecodeFixed(pDecoder, pBlob->data, pBlob->len));
31,396✔
6130
  *pBlobSet = pBlob;
31,396✔
6131

6132
  uTrace("decode blob len:%d", (int32_t)(pBlob->len));
31,396✔
6133

6134
_exit:
31,396✔
6135
  if (code != 0) {
31,396✔
6136
    if (pBlob != NULL) {
×
6137
      taosMemoryFree(pBlob->data);
×
6138
      taosArrayDestroy(pBlob->pSeqTable);
×
6139
      taosMemoryFree(pBlob);
×
6140
    }
6141
  }
6142
  return code;
31,396✔
6143
}
6144

6145
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
6146
  do {                                       \
6147
    (SUM) += (VAL);                          \
6148
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
6149
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
6150
  } while (0)
6151

6152
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, SColumnDataAgg *pAggs) {
8,058,547✔
6153
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,058,547✔
6154
  int16_t *numOfNull = &pAggs->numOfNull;
8,059,158✔
6155
  *sum = 0;
8,059,751✔
6156
  *max = 0;
8,059,751✔
6157
  *min = 1;
8,059,751✔
6158
  *numOfNull = 0;
8,059,751✔
6159

6160
  int8_t val;
6161
  if (HAS_VALUE == pColData->flag) {
8,059,751✔
6162
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6163
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
2,147,483,647✔
6164
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6165
    }
6166
  } else {
6167
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6168
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6169
        case 0:
90,138✔
6170
        case 1:
6171
          (*numOfNull)++;
90,138✔
6172
          break;
90,138✔
6173
        case 2:
1,709,862✔
6174
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
1,709,862✔
6175
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,709,862✔
6176
          break;
1,709,862✔
6177
        default:
×
6178
          break;
×
6179
      }
6180
    }
6181
  }
6182
}
8,265,685✔
6183

6184
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,074,903✔
6185
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,074,903✔
6186
  int16_t *numOfNull = &pAggs->numOfNull;
8,073,717✔
6187
  *sum = 0;
8,074,310✔
6188
  *max = INT8_MIN;
8,074,310✔
6189
  *min = INT8_MAX;
8,074,310✔
6190
  *numOfNull = 0;
8,073,717✔
6191

6192
  int8_t val;
6193
  if (HAS_VALUE == pColData->flag) {
8,074,310✔
6194
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6195
      val = ((int8_t *)pColData->pData)[iVal];
2,147,483,647✔
6196
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6197
    }
6198
  } else {
6199
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,956,605✔
6200
      switch (tColDataGetBitValue(pColData, iVal)) {
2,955,000✔
6201
        case 0:
1,005,940✔
6202
        case 1:
6203
          (*numOfNull)++;
1,005,940✔
6204
          break;
1,005,940✔
6205
        case 2:
1,949,060✔
6206
          val = ((int8_t *)pColData->pData)[iVal];
1,949,060✔
6207
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,949,060✔
6208
          break;
1,949,060✔
6209
        default:
×
6210
          break;
×
6211
      }
6212
    }
6213
  }
6214
}
8,315,057✔
6215

6216
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,060,743✔
6217
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,060,743✔
6218
  int16_t *numOfNull = &pAggs->numOfNull;
8,060,150✔
6219
  *sum = 0;
8,060,150✔
6220
  *max = INT16_MIN;
8,060,743✔
6221
  *min = INT16_MAX;
8,060,743✔
6222
  *numOfNull = 0;
8,060,743✔
6223

6224
  int16_t val;
6225
  if (HAS_VALUE == pColData->flag) {
8,058,964✔
6226
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6227
      val = ((int16_t *)pColData->pData)[iVal];
2,147,483,647✔
6228
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6229
    }
6230
  } else {
6231
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6232
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6233
        case 0:
89,709✔
6234
        case 1:
6235
          (*numOfNull)++;
89,709✔
6236
          break;
89,709✔
6237
        case 2:
1,710,291✔
6238
          val = ((int16_t *)pColData->pData)[iVal];
1,710,291✔
6239
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,710,291✔
6240
          break;
1,710,291✔
6241
        default:
×
6242
          break;
×
6243
      }
6244
    }
6245
  }
6246
}
8,312,126✔
6247

6248
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, SColumnDataAgg *pAggs) {
25,856,563✔
6249
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
25,856,563✔
6250
  int16_t *numOfNull = &pAggs->numOfNull;
25,859,773✔
6251
  *sum = 0;
25,856,621✔
6252
  *max = INT32_MIN;
25,857,286✔
6253
  *min = INT32_MAX;
25,858,261✔
6254
  *numOfNull = 0;
25,856,395✔
6255

6256
  int32_t val;
6257
  if (HAS_VALUE == pColData->flag) {
25,858,530✔
6258
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6259
      val = ((int32_t *)pColData->pData)[iVal];
2,147,483,647✔
6260
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6261
    }
6262
  } else {
6263
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6264
      switch (tColDataGetBitValue(pColData, iVal)) {
2,147,483,647✔
6265
        case 0:
248,796,699✔
6266
        case 1:
6267
          (*numOfNull)++;
248,796,699✔
6268
          break;
248,796,699✔
6269
        case 2:
2,147,483,647✔
6270
          val = ((int32_t *)pColData->pData)[iVal];
2,147,483,647✔
6271
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6272
          break;
2,147,483,647✔
6273
        default:
×
6274
          break;
×
6275
      }
6276
    }
6277
  }
6278
}
28,766,800✔
6279

6280
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, SColumnDataAgg *pAggs) {
64,039,241✔
6281
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
64,039,241✔
6282
  int16_t *numOfNull = &pAggs->numOfNull;
64,039,253✔
6283
  *sum = 0;
64,038,648✔
6284
  *max = INT64_MIN;
64,039,098✔
6285
  *min = INT64_MAX;
64,039,098✔
6286
  *numOfNull = 0;
64,038,055✔
6287

6288
  int64_t val;
6289
  if (HAS_VALUE == pColData->flag) {
64,038,055✔
6290
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6291
      val = ((int64_t *)pColData->pData)[iVal];
2,147,483,647✔
6292
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6293
    }
6294
  } else {
6295
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6296
      switch (tColDataGetBitValue(pColData, iVal)) {
2,147,483,647✔
6297
        case 0:
273,750,060✔
6298
        case 1:
6299
          (*numOfNull)++;
273,750,060✔
6300
          break;
273,750,060✔
6301
        case 2:
2,147,483,647✔
6302
          val = ((int64_t *)pColData->pData)[iVal];
2,147,483,647✔
6303
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6304
          break;
2,147,483,647✔
6305
        default:
×
6306
          break;
×
6307
      }
6308
    }
6309
  }
6310
}
55,862,072✔
6311

6312
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, SColumnDataAgg *pAggs) {
27,592,839✔
6313
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
27,592,839✔
6314
  int16_t *numOfNull = &pAggs->numOfNull;
27,593,402✔
6315
  *(double *)sum = 0;
27,593,402✔
6316
  *(double *)max = -FLT_MAX;
27,593,402✔
6317
  *(double *)min = FLT_MAX;
27,593,402✔
6318
  *numOfNull = 0;
27,592,216✔
6319

6320
  float val;
6321
  if (HAS_VALUE == pColData->flag) {
27,592,216✔
6322
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6323
      val = ((float *)pColData->pData)[iVal];
2,147,483,647✔
6324
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,147,483,647✔
6325
    }
6326
  } else {
6327
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,677,877✔
6328
      switch (tColDataGetBitValue(pColData, iVal)) {
12,661,092✔
6329
        case 0:
1,962,635✔
6330
        case 1:
6331
          (*numOfNull)++;
1,962,635✔
6332
          break;
1,962,635✔
6333
        case 2:
10,698,457✔
6334
          val = ((float *)pColData->pData)[iVal];
10,698,457✔
6335
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
10,698,457✔
6336
          break;
10,698,457✔
6337
        default:
×
6338
          break;
×
6339
      }
6340
    }
6341
  }
6342
}
29,621,633✔
6343

6344
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, SColumnDataAgg *pAggs) {
14,755,843✔
6345
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
14,755,843✔
6346
  int16_t *numOfNull = &pAggs->numOfNull;
14,761,351✔
6347
  *(double *)sum = 0;
14,759,188✔
6348
  *(double *)max = -DBL_MAX;
14,760,490✔
6349
  *(double *)min = DBL_MAX;
14,761,083✔
6350
  *numOfNull = 0;
14,761,081✔
6351

6352
  double val;
6353
  if (HAS_VALUE == pColData->flag) {
14,761,138✔
6354
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6355
      val = ((double *)pColData->pData)[iVal];
2,147,483,647✔
6356
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,147,483,647✔
6357
    }
6358
  } else {
6359
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,956,605✔
6360
      switch (tColDataGetBitValue(pColData, iVal)) {
2,955,000✔
6361
        case 0:
1,026,805✔
6362
        case 1:
6363
          (*numOfNull)++;
1,026,805✔
6364
          break;
1,026,805✔
6365
        case 2:
1,928,195✔
6366
          val = ((double *)pColData->pData)[iVal];
1,928,195✔
6367
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
1,928,195✔
6368
          break;
1,928,195✔
6369
        default:
×
6370
          break;
×
6371
      }
6372
    }
6373
  }
6374
}
15,063,052✔
6375

6376
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,734,054✔
6377
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,734,054✔
6378
  int16_t *numOfNull = &pAggs->numOfNull;
7,735,240✔
6379
  *(uint64_t *)sum = 0;
7,734,054✔
6380
  *(uint64_t *)max = 0;
7,735,240✔
6381
  *(uint64_t *)min = UINT8_MAX;
7,735,833✔
6382
  *numOfNull = 0;
7,735,833✔
6383

6384
  uint8_t val;
6385
  if (HAS_VALUE == pColData->flag) {
7,735,833✔
6386
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6387
      val = ((uint8_t *)pColData->pData)[iVal];
2,147,483,647✔
6388
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6389
    }
6390
  } else {
6391
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6392
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6393
        case 0:
90,357✔
6394
        case 1:
6395
          (*numOfNull)++;
90,357✔
6396
          break;
90,357✔
6397
        case 2:
1,709,643✔
6398
          val = ((uint8_t *)pColData->pData)[iVal];
1,709,643✔
6399
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
1,709,643✔
6400
          break;
1,709,643✔
6401
        default:
×
6402
          break;
×
6403
      }
6404
    }
6405
  }
6406
}
7,870,454✔
6407

6408
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,734,647✔
6409
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,734,647✔
6410
  int16_t *numOfNull = &pAggs->numOfNull;
7,734,054✔
6411
  *(uint64_t *)sum = 0;
7,734,054✔
6412
  *(uint64_t *)max = 0;
7,733,461✔
6413
  *(uint64_t *)min = UINT16_MAX;
7,734,054✔
6414
  *numOfNull = 0;
7,735,240✔
6415

6416
  uint16_t val;
6417
  if (HAS_VALUE == pColData->flag) {
7,734,054✔
6418
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6419
      val = ((uint16_t *)pColData->pData)[iVal];
2,147,483,647✔
6420
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6421
    }
6422
  } else {
6423
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6424
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6425
        case 0:
90,474✔
6426
        case 1:
6427
          (*numOfNull)++;
90,474✔
6428
          break;
90,474✔
6429
        case 2:
1,709,526✔
6430
          val = ((uint16_t *)pColData->pData)[iVal];
1,709,526✔
6431
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
1,709,526✔
6432
          break;
1,709,526✔
6433
        default:
×
6434
          break;
×
6435
      }
6436
    }
6437
  }
6438
}
7,886,956✔
6439

6440
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,735,833✔
6441
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,735,833✔
6442
  int16_t *numOfNull = &pAggs->numOfNull;
7,735,833✔
6443
  *(uint64_t *)sum = 0;
7,735,240✔
6444
  *(uint64_t *)max = 0;
7,735,240✔
6445
  *(uint64_t *)min = UINT32_MAX;
7,735,240✔
6446
  *numOfNull = 0;
7,735,240✔
6447

6448
  uint32_t val;
6449
  if (HAS_VALUE == pColData->flag) {
7,735,240✔
6450
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6451
      val = ((uint32_t *)pColData->pData)[iVal];
2,147,483,647✔
6452
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6453
    }
6454
  } else {
6455
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6456
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6457
        case 0:
90,738✔
6458
        case 1:
6459
          (*numOfNull)++;
90,738✔
6460
          break;
90,738✔
6461
        case 2:
1,709,262✔
6462
          val = ((uint32_t *)pColData->pData)[iVal];
1,709,262✔
6463
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
1,709,262✔
6464
          break;
1,709,262✔
6465
        default:
×
6466
          break;
×
6467
      }
6468
    }
6469
  }
6470
}
7,963,941✔
6471

6472
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,735,833✔
6473
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,735,833✔
6474
  int16_t *numOfNull = &pAggs->numOfNull;
7,735,833✔
6475
  *(uint64_t *)sum = 0;
7,735,240✔
6476
  *(uint64_t *)max = 0;
7,735,240✔
6477
  *(uint64_t *)min = UINT64_MAX;
7,735,833✔
6478
  *numOfNull = 0;
7,735,240✔
6479

6480
  uint64_t val;
6481
  if (HAS_VALUE == pColData->flag) {
7,734,647✔
6482
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6483
      val = ((uint64_t *)pColData->pData)[iVal];
2,147,483,647✔
6484
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6485
    }
6486
  } else {
6487
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,800,450✔
6488
      switch (tColDataGetBitValue(pColData, iVal)) {
1,800,000✔
6489
        case 0:
90,066✔
6490
        case 1:
6491
          (*numOfNull)++;
90,066✔
6492
          break;
90,066✔
6493
        case 2:
1,709,934✔
6494
          val = ((uint64_t *)pColData->pData)[iVal];
1,709,934✔
6495
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
1,709,934✔
6496
          break;
1,709,934✔
6497
        default:
×
6498
          break;
×
6499
      }
6500
    }
6501
  }
6502
}
7,608,829✔
6503

6504
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, SColumnDataAgg *pAggs) {
29,048,795✔
6505
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
29,048,795✔
6506
  int16_t *numOfNull = &pAggs->numOfNull;
29,048,795✔
6507
  *(uint64_t *)sum = 0;
29,048,795✔
6508
  *(uint64_t *)max = 0;
29,048,795✔
6509
  *(uint64_t *)min = 0;
29,048,795✔
6510
  *numOfNull = 0;
29,048,202✔
6511

6512
  switch (pColData->flag) {
29,047,016✔
6513
    case HAS_NONE:
×
6514
    case HAS_NULL:
6515
    case (HAS_NONE | HAS_NULL):
6516
      *numOfNull = pColData->nVal;
×
6517
      break;
×
6518
    case HAS_VALUE:
29,042,605✔
6519
      *numOfNull = 0;
29,042,605✔
6520
      break;
29,042,140✔
6521
    case (HAS_VALUE | HAS_NULL):
4,411✔
6522
    case (HAS_VALUE | HAS_NONE):
6523
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
11,827,411✔
6524
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
11,823,000✔
6525
          (*numOfNull)++;
1,247,834✔
6526
        }
6527
      }
6528
      break;
4,411✔
6529
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
6530
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
6531
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
6532
          (*numOfNull)++;
×
6533
        }
6534
      }
6535
      break;
×
6536
    default:
×
6537
      break;
×
6538
  }
6539
}
29,046,551✔
6540

6541
#define CALC_DECIMAL_SUM_MAX_MIN(TYPE, pSumOp, pCompOp, pColData, pSum, pMax, pMin)                   \
6542
  do {                                                                                                \
6543
    if (decimal128AddCheckOverflow((Decimal *)pSum, pVal, DECIMAL_WORD_NUM(TYPE))) *pOverflow = true; \
6544
    pSumOp->add(pSum, pVal, DECIMAL_WORD_NUM(TYPE));                                                  \
6545
    if (pCompOp->gt(pVal, pMax, DECIMAL_WORD_NUM(TYPE))) {                                            \
6546
      *(pMax) = *pVal;                                                                                \
6547
    }                                                                                                 \
6548
    if (pCompOp->lt(pVal, pMin, DECIMAL_WORD_NUM(TYPE))) {                                            \
6549
      *(pMin) = *pVal;                                                                                \
6550
    }                                                                                                 \
6551
  } while (0)
6552

6553
static FORCE_INLINE void tColDataCalcSMADecimal64Type(SColData *pColData, SColumnDataAgg *pAggs) {
20,997✔
6554
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum;
20,997✔
6555
  Decimal64  *pMax = (Decimal64 *)pAggs->decimal128Max, *pMin = (Decimal64 *)pAggs->decimal128Min;
20,997✔
6556
  uint8_t    *pOverflow = &pAggs->overflow;
20,997✔
6557
  *pSum = DECIMAL128_ZERO;
20,997✔
6558
  *pMax = DECIMAL64_MIN;
20,997✔
6559
  *pMin = DECIMAL64_MAX;
20,997✔
6560
  pAggs->numOfNull = 0;
20,997✔
6561
  pAggs->colId |= DECIMAL_AGG_FLAG;
20,997✔
6562

6563
  Decimal64         *pVal = NULL;
20,997✔
6564
  const SDecimalOps *pSumOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
20,997✔
6565
  const SDecimalOps *pCompOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
20,997✔
6566
  if (HAS_VALUE == pColData->flag) {
20,997✔
6567
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
295,728✔
6568
      pVal = ((Decimal64 *)pColData->pData) + iVal;
292,800✔
6569
      CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
292,800✔
6570
    }
6571
  } else {
6572
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
14,134,269✔
6573
      switch (tColDataGetBitValue(pColData, iVal)) {
14,116,200✔
6574
        case 0:
541,649✔
6575
        case 1:
6576
          pAggs->numOfNull++;
541,649✔
6577
          break;
541,649✔
6578
        case 2:
13,574,551✔
6579
          pVal = ((Decimal64 *)pColData->pData) + iVal;
13,574,551✔
6580
          CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
13,574,551✔
6581
          break;
13,574,551✔
6582
        default:
×
6583
          break;
×
6584
      }
6585
    }
6586
  }
6587
}
20,997✔
6588

6589
static FORCE_INLINE void tColDataCalcSMADecimal128Type(SColData *pColData, SColumnDataAgg *pAggs) {
52,795✔
6590
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum, *pMax = (Decimal128 *)pAggs->decimal128Max,
52,795✔
6591
             *pMin = (Decimal128 *)pAggs->decimal128Min;
52,795✔
6592
  uint8_t *pOverflow = &pAggs->overflow;
52,795✔
6593
  *pSum = DECIMAL128_ZERO;
52,795✔
6594
  *pMax = DECIMAL128_MIN;
52,795✔
6595
  *pMin = DECIMAL128_MAX;
52,795✔
6596
  pAggs->numOfNull = 0;
52,795✔
6597
  pAggs->colId |= DECIMAL_AGG_FLAG;
52,795✔
6598

6599
  Decimal128        *pVal = NULL;
52,795✔
6600
  const SDecimalOps *pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
52,795✔
6601
  if (HAS_VALUE == pColData->flag) {
52,795✔
UNCOV
6602
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
UNCOV
6603
      pVal = ((Decimal128 *)pColData->pData) + iVal;
×
UNCOV
6604
      CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
×
6605
    }
6606
  } else {
6607
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
46,259,795✔
6608
      switch (tColDataGetBitValue(pColData, iVal)) {
46,207,000✔
6609
        case 0:
1,785,886✔
6610
        case 1:
6611
          pAggs->numOfNull++;
1,785,886✔
6612
          break;
1,785,886✔
6613
        case 2:
44,421,114✔
6614
          pVal = ((Decimal128 *)pColData->pData) + iVal;
44,421,114✔
6615
          CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
44,421,114✔
6616
          break;
44,421,114✔
6617
        default:
×
6618
          break;
×
6619
      }
6620
    }
6621
  }
6622
}
52,795✔
6623

6624
void (*tColDataCalcSMA[])(SColData *pColData, SColumnDataAgg *pAggs) = {
6625
    NULL,
6626
    tColDataCalcSMABool,            // TSDB_DATA_TYPE_BOOL
6627
    tColDataCalcSMATinyInt,         // TSDB_DATA_TYPE_TINYINT
6628
    tColDataCalcSMATinySmallInt,    // TSDB_DATA_TYPE_SMALLINT
6629
    tColDataCalcSMAInt,             // TSDB_DATA_TYPE_INT
6630
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_BIGINT
6631
    tColDataCalcSMAFloat,           // TSDB_DATA_TYPE_FLOAT
6632
    tColDataCalcSMADouble,          // TSDB_DATA_TYPE_DOUBLE
6633
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARCHAR
6634
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_TIMESTAMP
6635
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_NCHAR
6636
    tColDataCalcSMAUTinyInt,        // TSDB_DATA_TYPE_UTINYINT
6637
    tColDataCalcSMATinyUSmallInt,   // TSDB_DATA_TYPE_USMALLINT
6638
    tColDataCalcSMAUInt,            // TSDB_DATA_TYPE_UINT
6639
    tColDataCalcSMAUBigInt,         // TSDB_DATA_TYPE_UBIGINT
6640
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_JSON
6641
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARBINARY
6642
    tColDataCalcSMADecimal128Type,  // TSDB_DATA_TYPE_DECIMAL
6643
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_BLOB
6644
    NULL,                           // TSDB_DATA_TYPE_MEDIUMBLOB
6645
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_GEOMETRY
6646
    tColDataCalcSMADecimal64Type,   // TSDB_DATA_TYPE_DECIMAL64
6647
};
6648

6649
// SValueColumn ================================
6650
int32_t tValueColumnInit(SValueColumn *valCol) {
1,202,338,794✔
6651
  valCol->type = TSDB_DATA_TYPE_NULL;
1,202,338,794✔
6652
  valCol->numOfValues = 0;
1,202,383,045✔
6653
  tBufferInit(&valCol->data);
1,202,386,228✔
6654
  tBufferInit(&valCol->offsets);
1,202,415,933✔
6655
  return 0;
1,202,500,765✔
6656
}
6657

6658
void tValueColumnDestroy(SValueColumn *valCol) {
2,147,483,647✔
6659
  valCol->type = TSDB_DATA_TYPE_NULL;
2,147,483,647✔
6660
  valCol->numOfValues = 0;
2,147,483,647✔
6661
  tBufferDestroy(&valCol->data);
2,147,483,647✔
6662
  tBufferDestroy(&valCol->offsets);
2,147,483,647✔
6663
  return;
2,147,483,647✔
6664
}
6665

6666
void tValueColumnClear(SValueColumn *valCol) {
1,665,356,002✔
6667
  valCol->type = TSDB_DATA_TYPE_NULL;
1,665,356,002✔
6668
  valCol->numOfValues = 0;
1,665,460,857✔
6669
  tBufferClear(&valCol->data);
1,665,606,348✔
6670
  tBufferClear(&valCol->offsets);
1,665,622,550✔
6671
  return;
1,665,599,010✔
6672
}
6673

6674
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
1,589,756✔
6675
  int32_t code;
6676

6677
  if (valCol->numOfValues == 0) {
1,589,756✔
6678
    valCol->type = value->type;
899,268✔
6679
  }
6680

6681
  if (!(value->type == valCol->type)) {
1,589,756✔
6682
    return TSDB_CODE_INVALID_PARA;
×
6683
  }
6684

6685
  if (IS_VAR_DATA_TYPE(value->type)) {
1,589,756✔
6686
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
1,271,752✔
6687
      return code;
×
6688
    }
6689
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
1,271,752✔
6690
      return code;
×
6691
    }
6692
  } else {
6693
    code = tBufferPut(&valCol->data, VALUE_GET_DATUM(value, value->type), tDataTypes[value->type].bytes);
953,880✔
6694
    if (code) return code;
953,880✔
6695
  }
6696
  valCol->numOfValues++;
1,589,756✔
6697

6698
  return 0;
1,589,756✔
6699
}
6700

6701
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
54,589,257✔
6702
  int32_t code;
6703

6704
  if (idx < 0 || idx >= valCol->numOfValues) {
54,589,257✔
6705
    return TSDB_CODE_OUT_OF_RANGE;
×
6706
  }
6707

6708
  if (IS_VAR_DATA_TYPE(valCol->type)) {
54,589,300✔
6709
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
1,657,687✔
6710
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
1,654,806✔
6711
    int32_t  oldDataSize = nextOffset - offsets[idx];
1,654,806✔
6712
    int32_t  bytesAdded = value->nData - oldDataSize;
1,654,806✔
6713

6714
    if (bytesAdded != 0) {
1,654,806✔
6715
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
39,420✔
6716
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
19,710✔
6717
              tBufferGetSize(&valCol->data) - nextOffset);
19,710✔
6718
      valCol->data.size += bytesAdded;
19,710✔
6719

6720
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
19,710✔
6721
        offsets[i] += bytesAdded;
×
6722
      }
6723
    }
6724
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
1,654,806✔
6725
  } else {
6726
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, VALUE_GET_DATUM(value, valCol->type),
52,934,882✔
6727
                        tDataTypes[valCol->type].bytes);
52,934,925✔
6728
  }
6729
  return 0;
6730
}
6731

6732
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
418,978,103✔
6733
  if (idx < 0 || idx >= valCol->numOfValues) {
418,978,103✔
6734
    return TSDB_CODE_OUT_OF_RANGE;
×
6735
  }
6736

6737
  value->type = valCol->type;
419,039,100✔
6738
  if (IS_VAR_DATA_TYPE(value->type)) {
545,355,373✔
6739
    int32_t       offset, nextOffset;
126,303,494✔
6740
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
126,302,024✔
6741

6742
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
126,303,833✔
6743
    if (idx == valCol->numOfValues - 1) {
126,296,573✔
6744
      nextOffset = tBufferGetSize(&valCol->data);
56,535,260✔
6745
    } else {
6746
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
69,763,152✔
6747
    }
6748
    value->nData = nextOffset - offset;
126,305,045✔
6749
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
126,293,450✔
6750
  } else {
6751
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
292,734,292✔
6752
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, VALUE_GET_DATUM(value, value->type)));
585,471,296✔
6753
  }
6754
  return 0;
419,017,719✔
6755
}
6756

6757
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
899,268✔
6758
  int32_t code;
6759

6760
  if (!(valCol->numOfValues > 0)) {
899,268✔
6761
    return TSDB_CODE_INVALID_PARA;
×
6762
  }
6763

6764
  (*info) = (SValueColumnCompressInfo){
899,268✔
6765
      .cmprAlg = info->cmprAlg,
899,268✔
6766
      .type = valCol->type,
899,268✔
6767
  };
6768

6769
  // offset
6770
  if (IS_VAR_DATA_TYPE(valCol->type)) {
899,268✔
6771
    SCompressInfo cinfo = {
324,958✔
6772
        .cmprAlg = info->cmprAlg,
324,958✔
6773
        .dataType = TSDB_DATA_TYPE_INT,
6774
        .originalSize = valCol->offsets.size,
324,958✔
6775
    };
6776

6777
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
324,958✔
6778
    if (code) return code;
324,958✔
6779

6780
    info->offsetOriginalSize = cinfo.originalSize;
324,958✔
6781
    info->offsetCompressedSize = cinfo.compressedSize;
324,958✔
6782
  }
6783

6784
  // data
6785
  SCompressInfo cinfo = {
899,268✔
6786
      .cmprAlg = info->cmprAlg,
1,798,536✔
6787
      .dataType = valCol->type,
899,268✔
6788
      .originalSize = valCol->data.size,
899,268✔
6789
  };
6790

6791
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
899,268✔
6792
  if (code) return code;
899,268✔
6793

6794
  info->dataOriginalSize = cinfo.originalSize;
899,268✔
6795
  info->dataCompressedSize = cinfo.compressedSize;
899,268✔
6796

6797
  return 0;
899,268✔
6798
}
6799

6800
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
198,529,008✔
6801
                               SBuffer *assist) {
6802
  int32_t code;
6803

6804
  tValueColumnClear(valCol);
198,529,008✔
6805
  valCol->type = info->type;
198,573,245✔
6806
  // offset
6807
  if (IS_VAR_DATA_TYPE(valCol->type)) {
282,000,151✔
6808
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
83,445,008✔
6809

6810
    SCompressInfo cinfo = {
83,426,313✔
6811
        .dataType = TSDB_DATA_TYPE_INT,
6812
        .cmprAlg = info->cmprAlg,
83,424,492✔
6813
        .originalSize = info->offsetOriginalSize,
83,425,101✔
6814
        .compressedSize = info->offsetCompressedSize,
83,412,366✔
6815
    };
6816

6817
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
83,428,128✔
6818
    if (code) {
83,432,954✔
6819
      return code;
×
6820
    }
6821
  } else {
6822
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
115,139,067✔
6823
  }
6824

6825
  // data
6826
  SCompressInfo cinfo = {
198,575,629✔
6827
      .dataType = valCol->type,
198,572,654✔
6828
      .cmprAlg = info->cmprAlg,
198,579,926✔
6829
      .originalSize = info->dataOriginalSize,
198,566,614✔
6830
      .compressedSize = info->dataCompressedSize,
198,582,376✔
6831
  };
6832

6833
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
198,579,918✔
6834
  if (code) {
198,586,603✔
6835
    return code;
×
6836
  }
6837

6838
  return 0;
198,586,603✔
6839
}
6840

6841
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
899,268✔
6842
  int32_t code;
6843
  uint8_t fmtVer = 0;
899,268✔
6844

6845
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
1,798,536✔
6846
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
1,798,536✔
6847
  if ((code = tBufferPutI8(buffer, info->type))) return code;
1,798,536✔
6848
  if (IS_VAR_DATA_TYPE(info->type)) {
899,268✔
6849
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
649,916✔
6850
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
649,916✔
6851
  }
6852
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
1,798,536✔
6853
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
1,798,536✔
6854

6855
  return 0;
899,268✔
6856
}
6857

6858
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
198,575,727✔
6859
  int32_t code;
6860
  uint8_t fmtVer;
198,575,727✔
6861

6862
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
198,580,563✔
6863
  if (fmtVer == 0) {
198,588,512✔
6864
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
198,588,512✔
6865
    if ((code = tBufferGetI8(reader, &info->type))) return code;
198,583,009✔
6866
    if (IS_VAR_DATA_TYPE(info->type)) {
198,593,987✔
6867
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
83,443,271✔
6868
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
83,434,797✔
6869
    } else {
6870
      info->offsetOriginalSize = 0;
115,141,571✔
6871
      info->offsetCompressedSize = 0;
115,147,022✔
6872
    }
6873
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
198,574,525✔
6874
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
198,591,391✔
6875
  } else {
6876
    return TSDB_CODE_INVALID_PARA;
×
6877
  }
6878

6879
  return 0;
198,592,114✔
6880
}
6881

6882
int32_t tCompressData(void          *input,       // input
895,571,088✔
6883
                      SCompressInfo *info,        // compress info
6884
                      void          *output,      // output
6885
                      int32_t        outputSize,  // output size
6886
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
6887
) {
6888
  int32_t extraSizeNeeded;
6889
  int32_t code;
6890

6891
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
895,571,088✔
6892
  if (!(outputSize >= extraSizeNeeded)) {
895,666,332✔
6893
    return TSDB_CODE_INVALID_PARA;
×
6894
  }
6895

6896
  if (info->cmprAlg == NO_COMPRESSION) {
895,666,332✔
6897
    (void)memcpy(output, input, info->originalSize);
33,252✔
6898
    info->compressedSize = info->originalSize;
33,252✔
6899
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
1,007,696,482✔
6900
    SBuffer local;
112,069,913✔
6901

6902
    tBufferInit(&local);
6903
    if (buffer == NULL) {
112,070,749✔
6904
      buffer = &local;
×
6905
    }
6906

6907
    if (info->cmprAlg == TWO_STAGE_COMP) {
112,070,749✔
6908
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
111,959,140✔
6909
      if (code) {
111,942,941✔
6910
        tBufferDestroy(&local);
6911
        return code;
×
6912
      }
6913
    }
6914

6915
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
336,191,557✔
6916
        input,                                                   // input
6917
        info->originalSize,                                      // input size
6918
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
112,071,718✔
6919
        output,                                                  // output
6920
        outputSize,                                              // output size
6921
        info->cmprAlg,                                           // compression algorithm
112,069,254✔
6922
        buffer->data,                                            // buffer
6923
        buffer->capacity                                         // buffer size
112,066,554✔
6924
    );
6925
    if (info->compressedSize < 0) {
112,074,717✔
6926
      tBufferDestroy(&local);
6927
      return TSDB_CODE_COMPRESS_ERROR;
×
6928
    }
6929

6930
    tBufferDestroy(&local);
6931
  } else {
6932
    DEFINE_VAR(info->cmprAlg)
783,564,417✔
6933
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
783,577,565✔
6934
      (void)memcpy(output, input, info->originalSize);
10,621✔
6935
      info->compressedSize = info->originalSize;
10,621✔
6936
      return 0;
10,621✔
6937
    }
6938
    SBuffer local;
783,557,738✔
6939

6940
    tBufferInit(&local);
6941
    if (buffer == NULL) {
783,576,272✔
6942
      buffer = &local;
×
6943
    }
6944
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
783,576,272✔
6945

6946
    info->compressedSize = tDataCompress[info->dataType].compFunc(  //
2,147,483,647✔
6947
        input,                                                      // input
6948
        info->originalSize,                                         // input size
6949
        info->originalSize / tDataTypes[info->dataType].bytes,      // number of elements
783,578,380✔
6950
        output,                                                     // output
6951
        outputSize,                                                 // output size
6952
        info->cmprAlg,                                              // compression algorithm
6953
        buffer->data,                                               // buffer
6954
        buffer->capacity                                            // buffer size
783,531,504✔
6955
    );
6956
    if (info->compressedSize < 0) {
783,573,485✔
6957
      tBufferDestroy(&local);
6958
      return TSDB_CODE_COMPRESS_ERROR;
×
6959
    }
6960

6961
    tBufferDestroy(&local);
6962
    // new col compress
6963
  }
6964

6965
  return 0;
895,639,654✔
6966
}
6967

6968
int32_t tDecompressData(void                *input,       // input
2,147,483,647✔
6969
                        const SCompressInfo *info,        // compress info
6970
                        void                *output,      // output
6971
                        int32_t              outputSize,  // output size
6972
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
6973
) {
6974
  int32_t code;
6975

6976
  if (!(outputSize >= info->originalSize)) {
2,147,483,647✔
6977
    return TSDB_CODE_INVALID_PARA;
×
6978
  }
6979

6980
  if (info->cmprAlg == NO_COMPRESSION) {
2,147,483,647✔
6981
    if (!(info->compressedSize == info->originalSize)) {
14,046✔
6982
      return TSDB_CODE_INVALID_PARA;
×
6983
    }
6984
    (void)memcpy(output, input, info->compressedSize);
14,046✔
6985
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
2,147,483,647✔
6986
    SBuffer local;
2,147,483,647✔
6987

6988
    tBufferInit(&local);
6989
    if (buffer == NULL) {
2,147,483,647✔
6990
      buffer = &local;
×
6991
    }
6992

6993
    if (info->cmprAlg == TWO_STAGE_COMP) {
2,147,483,647✔
6994
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
2,147,483,647✔
6995
      if (code) {
2,147,483,647✔
6996
        tBufferDestroy(&local);
6997
        return code;
×
6998
      }
6999
    }
7000

7001
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
2,147,483,647✔
7002
        input,                                                  // input
7003
        info->compressedSize,                                   // inputSize
2,147,483,647✔
7004
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
2,147,483,647✔
7005
        output,                                                 // output
7006
        outputSize,                                             // output size
7007
        info->cmprAlg,                                          // compression algorithm
2,147,483,647✔
7008
        buffer->data,                                           // helper buffer
7009
        buffer->capacity                                        // extra buffer size
2,147,483,647✔
7010
    );
7011
    if (decompressedSize < 0) {
2,147,483,647✔
7012
      tBufferDestroy(&local);
7013
      return TSDB_CODE_COMPRESS_ERROR;
×
7014
    }
7015

7016
    if (!(decompressedSize == info->originalSize)) {
2,147,483,647✔
7017
      return TSDB_CODE_COMPRESS_ERROR;
×
7018
    }
7019
    tBufferDestroy(&local);
7020
  } else {
7021
    DEFINE_VAR(info->cmprAlg);
2,147,483,647✔
7022
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
2,147,483,647✔
7023
      (void)memcpy(output, input, info->compressedSize);
19,565✔
7024
      return 0;
19,565✔
7025
    }
7026
    SBuffer local;
2,147,483,647✔
7027

7028
    tBufferInit(&local);
7029
    if (buffer == NULL) {
2,147,483,647✔
7030
      buffer = &local;
×
7031
    }
7032
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
2,147,483,647✔
7033
    if (code) {
2,147,483,647✔
7034
      return code;
×
7035
    }
7036

7037
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
2,147,483,647✔
7038
        input,                                                  // input
7039
        info->compressedSize,                                   // inputSize
2,147,483,647✔
7040
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
2,147,483,647✔
7041
        output,                                                 // output
7042
        outputSize,                                             // output size
7043
        info->cmprAlg,                                          // compression algorithm
2,147,483,647✔
7044
        buffer->data,                                           // helper buffer
7045
        buffer->capacity                                        // extra buffer size
2,147,483,647✔
7046
    );
7047
    if (decompressedSize < 0) {
2,147,483,647✔
7048
      tBufferDestroy(&local);
7049
      return TSDB_CODE_COMPRESS_ERROR;
×
7050
    }
7051

7052
    if (!(decompressedSize == info->originalSize)) {
2,147,483,647✔
7053
      return TSDB_CODE_COMPRESS_ERROR;
×
7054
    }
7055
    tBufferDestroy(&local);
7056
  }
7057

7058
  return 0;
2,147,483,647✔
7059
}
7060

7061
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
895,543,890✔
7062
  int32_t code;
7063

7064
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
895,543,890✔
7065
  if (code) return code;
895,537,974✔
7066

7067
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
895,537,974✔
7068
  if (code) return code;
895,512,218✔
7069

7070
  output->size += info->compressedSize;
895,512,218✔
7071
  return 0;
895,649,937✔
7072
}
7073

7074
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
2,147,483,647✔
7075
  int32_t code;
7076

7077
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
2,147,483,647✔
7078
  if (code) return code;
2,147,483,647✔
7079

7080
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
2,147,483,647✔
7081
  if (code) return code;
2,147,483,647✔
7082

7083
  output->size += info->originalSize;
2,147,483,647✔
7084
  return 0;
2,147,483,647✔
7085
}
7086

7087
// handle all types, including var data
7088
void valueSetDatum(SValue *pVal, int8_t type, void *pDatum, uint32_t len) {
2,147,483,647✔
7089
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
7090
    pVal->pData = pDatum;
67,665,731✔
7091
    pVal->nData = len;
411,320,621✔
7092
  } else {
7093
    switch (len) {
2,147,483,647✔
7094
      case sizeof(uint8_t):
2,147,483,647✔
7095
        pVal->val = *(uint8_t *)pDatum;
2,147,483,647✔
7096
        break;
2,147,483,647✔
7097
      case sizeof(uint16_t):
2,147,483,647✔
7098
        pVal->val = *(uint16_t *)pDatum;
2,147,483,647✔
7099
        break;
2,147,483,647✔
7100
      case sizeof(uint32_t):
2,147,483,647✔
7101
        pVal->val = *(uint32_t *)pDatum;
2,147,483,647✔
7102
        break;
2,147,483,647✔
7103
      case sizeof(uint64_t):
2,147,483,647✔
7104
        pVal->val = *(uint64_t *)pDatum;
2,147,483,647✔
7105
        break;
2,147,483,647✔
7106
      default:
47,666✔
7107
        break;
47,666✔
7108
    }
7109
  }
7110
}
2,147,483,647✔
7111

7112
void valueCloneDatum(SValue *pDst, const SValue *pSrc, int8_t type) {
2,147,483,647✔
7113
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
7114
    memcpy(pDst->pData, pSrc->pData, pSrc->nData);
363,096,955✔
7115
    pDst->nData = pSrc->nData;
363,564,394✔
7116
  } else {
7117
    pDst->val = pSrc->val;
2,147,483,647✔
7118
  }
7119
}
2,147,483,647✔
7120
void valueClearDatum(SValue *pVal, int8_t type) {
×
7121
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
×
7122
    taosMemoryFreeClear(pVal->pData);
×
7123
    pVal->nData = 0;
×
7124
  } else {
7125
    pVal->val = 0;
×
7126
  }
7127
}
×
7128

7129
int8_t schemaHasBlob(const STSchema *pSchema) {
619,853,216✔
7130
  if (pSchema == NULL) {
619,853,216✔
7131
    return 0;
×
7132
  }
7133
  for (int i = 0; i < pSchema->numOfCols; ++i) {
2,147,483,647✔
7134
    if (IS_STR_DATA_BLOB(pSchema->columns[i].type)) {
2,147,483,647✔
7135
      return 1;
40,549✔
7136
    }
7137
  }
7138
  return 0;
619,823,207✔
7139
}
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