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

taosdata / TDengine / #4541

19 Jul 2025 01:13AM UTC coverage: 56.753% (-1.6%) from 58.31%
#4541

push

travis-ci

web-flow
fix: subquery memleak (#32024)

124299 of 282344 branches covered (44.02%)

Branch coverage included in aggregate %.

181106 of 255787 relevant lines covered (70.8%)

24937406.43 hits per line

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

48.89
/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
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData);
24
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward);
25

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

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

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

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

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

65
static int32_t tPutPrimaryKeyIndex(uint8_t *p, const SPrimaryKeyIndex *index) {
1,243,134,817✔
66
  int32_t n = 0;
1,243,134,817✔
67
  n += tPutI8(p ? p + n : p, index->type);
1,243,134,817✔
68
  n += tPutU32v(p ? p + n : p, index->offset);
1,243,134,817✔
69
  return n;
1,243,134,817✔
70
}
71

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

79
static FORCE_INLINE int32_t tRowBuildScanAddNone(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
80
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NONE;
×
81
  sinfo->numOfNone++;
2,147,483,647✔
82
  return 0;
2,147,483,647✔
83
}
84

85
static FORCE_INLINE int32_t tRowBuildScanAddNull(SRowBuildScanInfo *sinfo, const STColumn *pTColumn) {
86
  if ((pTColumn->flags & COL_IS_KEY)) return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
87
  sinfo->numOfNull++;
27,291,830✔
88
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
27,291,830✔
89
  sinfo->kvPayloadSize += tPutI16v(NULL, -pTColumn->colId);
27,291,830✔
90
  return 0;
27,291,830✔
91
}
92

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

96
  if (isPK) {
2,147,483,647✔
97
    sinfo->tupleIndices[sinfo->numOfPKs].type = colVal->value.type;
424,175,366✔
98
    sinfo->tupleIndices[sinfo->numOfPKs].offset =
424,175,366✔
99
        IS_VAR_DATA_TYPE(pTColumn->type) ? sinfo->tupleVarSize + sinfo->tupleFixedSize : pTColumn->offset;
424,175,366!
100
    sinfo->kvIndices[sinfo->numOfPKs].type = colVal->value.type;
424,175,366✔
101
    sinfo->kvIndices[sinfo->numOfPKs].offset = sinfo->kvPayloadSize;
424,175,366✔
102
    sinfo->numOfPKs++;
424,175,366✔
103
  }
104

105
  sinfo->kvMaxOffset = sinfo->kvPayloadSize;
2,147,483,647✔
106
  if (IS_VAR_DATA_TYPE(colVal->value.type)) {
2,147,483,647!
107
    if (sinfo->hasBlob && IS_STR_DATA_BLOB(colVal->value.type)) {
1,079,623,091!
108
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)     // size
×
109
                             + BSE_SEQUECE_SIZE;                     // value
×
110
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
×
111
                              + tPutU32v(NULL, colVal->value.nData)  // size
×
112
                              + BSE_SEQUECE_SIZE;                    // seq offset
×
113
    } else {
114
      sinfo->tupleVarSize += tPutU32v(NULL, colVal->value.nData)  // size
1,079,623,091✔
115
                             + colVal->value.nData;               // value
1,079,623,091✔
116

117
      sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)            // colId
1,079,623,091✔
118
                              + tPutU32v(NULL, colVal->value.nData)  // size
1,079,623,091✔
119
                              + colVal->value.nData;                 // value
1,079,623,091✔
120
    }
121
  } else {
122
    sinfo->kvPayloadSize += tPutI16v(NULL, colVal->cid)              // colId
2,147,483,647✔
123
                            + tDataTypes[colVal->value.type].bytes;  // value
2,147,483,647✔
124
  }
125
  sinfo->numOfValue++;
2,147,483,647✔
126
}
2,147,483,647✔
127

128
static int32_t tRowBuildScan(SArray *colVals, const STSchema *schema, SRowBuildScanInfo *sinfo) {
2,147,483,647✔
129
  int32_t  code = 0;
2,147,483,647✔
130
  int32_t  colValIndex = 1;
2,147,483,647✔
131
  int32_t  numOfColVals = TARRAY_SIZE(colVals);
2,147,483,647✔
132
  SColVal *colValArray = (SColVal *)TARRAY_DATA(colVals);
2,147,483,647✔
133

134
  if (!(numOfColVals > 0)) {
2,147,483,647!
135
    return TSDB_CODE_INVALID_PARA;
×
136
  }
137
  if (!(colValArray[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
2,147,483,647!
138
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
139
  }
140
  if (!(colValArray[0].value.type == TSDB_DATA_TYPE_TIMESTAMP)) {
2,147,483,647!
141
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
142
  }
143

144
  *sinfo = (SRowBuildScanInfo){.tupleFixedSize = schema->flen, .hasBlob = sinfo->hasBlob, .scanType = sinfo->scanType};
2,147,483,647✔
145

146
  // loop scan
147
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
148
    for (;;) {
149
      if (colValIndex >= numOfColVals) {
2,147,483,647✔
150
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
660!
151
        break;
330✔
152
      }
153

154
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
155
        if (!(colValArray[colValIndex].value.type == schema->columns[i].type)) {
2,147,483,647!
156
          code = TSDB_CODE_INVALID_PARA;
×
157
          goto _exit;
×
158
        }
159

160
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {
2,147,483,647✔
161
          tRowBuildScanAddValue(sinfo, &colValArray[colValIndex], schema->columns + i);
2,147,483,647✔
162
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {
2,147,483,647✔
163
          if ((code = tRowBuildScanAddNull(sinfo, schema->columns + i))) goto _exit;
54,583,660!
164
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {
2,147,483,647!
165
          if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
2,147,483,647!
166
        }
167

168
        colValIndex++;
2,147,483,647✔
169
        break;
2,147,483,647✔
170
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {
×
171
        if ((code = tRowBuildScanAddNone(sinfo, schema->columns + i))) goto _exit;
530!
172
        break;
265✔
173
      } else {  // skip useless value
174
        colValIndex++;
×
175
      }
176
    }
177
  }
178

179
  if (sinfo->numOfNone) {
2,147,483,647✔
180
    sinfo->flag |= HAS_NONE;
713,650,624✔
181
  }
182
  if (sinfo->numOfNull) {
2,147,483,647✔
183
    sinfo->flag |= HAS_NULL;
20,873,385✔
184
  }
185
  if (sinfo->numOfValue) {
2,147,483,647✔
186
    sinfo->flag |= HAS_VALUE;
2,147,483,647✔
187
  }
188

189
  // Tuple
190
  sinfo->tupleFlag = sinfo->flag;
2,147,483,647✔
191
  switch (sinfo->flag) {
2,147,483,647!
192
    case HAS_NONE:
48,208,616✔
193
    case HAS_NULL:
194
      sinfo->tupleBitmapSize = 0;
48,208,616✔
195
      sinfo->tupleFixedSize = 0;
48,208,616✔
196
      break;
48,208,616✔
197
    case HAS_VALUE:
1,628,981,262✔
198
      sinfo->tupleBitmapSize = 0;
1,628,981,262✔
199
      sinfo->tupleFixedSize = schema->flen;
1,628,981,262✔
200
      break;
1,628,981,262✔
201
    case (HAS_NONE | HAS_NULL):
24,457✔
202
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
24,457✔
203
      sinfo->tupleFixedSize = 0;
24,457✔
204
      break;
24,457✔
205
    case (HAS_NONE | HAS_VALUE):
681,418,256✔
206
    case (HAS_NULL | HAS_VALUE):
207
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
681,418,256✔
208
      sinfo->tupleFixedSize = schema->flen;
681,418,256✔
209
      break;
681,418,256✔
210
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
2,462,031✔
211
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
2,462,031✔
212
      sinfo->tupleFixedSize = schema->flen;
2,462,031✔
213
      break;
2,462,031✔
214
  }
215
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
216
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
421,831,266✔
217
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
421,831,266✔
218
  }
219
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
2,147,483,647✔
220
                        + sinfo->tuplePKSize      // primary keys
2,147,483,647✔
221
                        + sinfo->tupleBitmapSize  // bitmap
2,147,483,647✔
222
                        + sinfo->tupleFixedSize   // fixed part
2,147,483,647✔
223
                        + sinfo->tupleVarSize;    // var part
2,147,483,647✔
224

225
  // Key-Value
226
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
2,147,483,647!
227
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
2,147,483,647✔
228
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
2,147,483,647✔
229
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
×
230
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
5,210,607✔
231
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
5,210,607✔
232
  } else {
233
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
×
234
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
×
235
  }
236
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
237
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
421,172,496✔
238
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
421,172,496✔
239
  }
240
  sinfo->kvRowSize = sizeof(SRow)             // SRow
2,147,483,647✔
241
                     + sinfo->kvPKSize        // primary keys
2,147,483,647✔
242
                     + sinfo->kvIndexSize     // index array
2,147,483,647✔
243
                     + sinfo->kvPayloadSize;  // payload
2,147,483,647✔
244

245
_exit:
2,147,483,647✔
246
  return code;
2,147,483,647✔
247
}
248

249
static int32_t tRowBuildTupleRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
1,689,514,535✔
250
                                 SRow **ppRow) {
251
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
1,689,514,535✔
252
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
1,689,514,535!
253
  if (*ppRow == NULL) {
1,702,297,670!
254
    return terrno;
×
255
  }
256
  (*ppRow)->flag = sinfo->tupleFlag;
1,702,297,670✔
257
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
1,702,297,670✔
258
  (*ppRow)->sver = schema->version;
1,702,297,670✔
259
  (*ppRow)->len = sinfo->tupleRowSize;
1,702,297,670✔
260
  (*ppRow)->ts = VALUE_GET_TRIVIAL_DATUM(&colValArray[0].value);
1,702,297,670✔
261

262
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
1,702,297,670✔
263
    return 0;
50,519,192✔
264
  }
265

266
  uint8_t *primaryKeys = (*ppRow)->data;
1,651,778,478✔
267
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
1,651,778,478✔
268
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
1,651,778,478✔
269
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
1,651,778,478✔
270

271
  // primary keys
272
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,074,149,312✔
273
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
426,094,659✔
274
  }
275

276
  // bitmap + fixed + varlen
277
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
1,648,054,653✔
278
  int32_t colValIndex = 1;
1,648,054,653✔
279
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
280
    for (;;) {
281
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
282
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
6!
283
        break;
6✔
284
      }
285

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

290
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
291
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
161,038,334✔
292
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
161,038,334✔
293
            if (colValArray[colValIndex].value.nData) {
161,038,334!
294
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
165,168,728✔
295
              varlen += colValArray[colValIndex].value.nData;
165,168,728✔
296
            }
297
          } else {
298
            (void)memcpy(fixed + schema->columns[i].offset,
2,147,483,647✔
299
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647!
300
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647!
301
          }
302
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
15,645,365!
303
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
17,846,200!
304
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
305
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
463,926!
306
        }
307

308
        colValIndex++;
2,147,483,647✔
309
        break;
2,147,483,647✔
310
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
394,477✔
311
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
15!
312
        break;
15✔
313
      } else {
314
        colValIndex++;
394,462✔
315
      }
316
    }
317
  }
318

319
  return 0;
1,648,054,653✔
320
}
321

322
static int32_t tRowBuildTupleWithBlob(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
323
                                      SRow **ppRow, SBlobRow2 *pBlobRow) {
324
  int32_t  code = 0;
×
325
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
326
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->tupleRowSize);
×
327
  if (*ppRow == NULL) {
×
328
    return terrno;
×
329
  }
330
  (*ppRow)->flag = sinfo->tupleFlag;
×
331
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
332
  (*ppRow)->sver = schema->version;
×
333
  (*ppRow)->len = sinfo->tupleRowSize;
×
334
  (*ppRow)->ts = colValArray[0].value.val;
×
335

336
  if (((*ppRow)->flag) == 0) {
×
337
    return TSDB_CODE_INVALID_PARA;
×
338
  }
339
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
×
340
    return 0;
×
341
  }
342

343
  uint8_t *primaryKeys = (*ppRow)->data;
×
344
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
×
345
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
×
346
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
×
347
  uint8_t *start = varlen;
×
348

349
  // primary keys
350
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
351
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
×
352
  }
353

354
  // bitmap + fixed + varlen
355
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
356
  int32_t colValIndex = 1;
×
357
  int8_t  firstBlobCol = 1;
×
358
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
359
    for (;;) {
×
360
      if (colValIndex >= numOfColVals) {  // NONE
×
361
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
362
        break;
×
363
      }
364

365
      int8_t hasBlob = 0;
×
366
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
367
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
368
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_VALUE);
×
369

370
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
371
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
372
              hasBlob = 1;
×
373
            }
374
            if (sinfo->scanType == ROW_BUILD_MERGE && hasBlob) {
×
375
              uInfo("merge block");
×
376
            }
377

378
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
×
379
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
×
380
            if (colValArray[colValIndex].value.nData) {
×
381
              if (hasBlob == 0) {
×
382
                (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
×
383
                varlen += colValArray[colValIndex].value.nData;
×
384
              } else {
385
                uint64_t  seq = 0;
×
386
                SBlobItem item = {.seqOffsetInRow = varlen - (*ppRow)->data,
×
387
                                  .data = colValArray[colValIndex].value.pData,
×
388
                                  .dataLen = colValArray[colValIndex].value.nData};
×
389
                code = tBlobRowPush(pBlobRow, &item, &seq, firstBlobCol);
×
390
                if (firstBlobCol == 1) {
×
391
                  firstBlobCol = 0;
×
392
                }
393
                if (code != 0) return code;
×
394
                varlen += tPutU64(varlen, seq);
×
395
              }
396
            } else {
397
              if (hasBlob) {
×
398
                uint64_t  seq = 0;
×
399
                SBlobItem item = {.seqOffsetInRow = varlen - (*ppRow)->data,
×
400
                                  .data = colValArray[colValIndex].value.pData,
×
401
                                  .dataLen = colValArray[colValIndex].value.nData};
×
402
                code = tBlobRowPush(pBlobRow, &item, &seq, firstBlobCol);
×
403
                if (firstBlobCol == 1) {
×
404
                  firstBlobCol = 0;
×
405
                }
406
                if (code != 0) return code;
×
407
              }
408
            }
409
          } else {
410
            (void)memcpy(fixed + schema->columns[i].offset,
×
411
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
×
412
                         tDataTypes[schema->columns[i].type].bytes);
×
413
          }
414
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
415
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
×
416
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
×
417
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
418
        }
419

420
        colValIndex++;
×
421
        break;
×
422
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
423
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
×
424
        break;
×
425
      } else {
426
        colValIndex++;
×
427
      }
428
    }
429
  }
430

431
  if (((*ppRow)->flag) == 0) {
×
432
    return TSDB_CODE_INVALID_PARA;
×
433
  }
434

435
  return 0;
×
436
}
437

438
static FORCE_INLINE void tRowBuildKVRowSetIndex(uint8_t flag, SKVIdx *indices, uint32_t offset) {
439
  if (flag & KV_FLG_LIT) {
2,147,483,647✔
440
    ((uint8_t *)indices->idx)[indices->nCol] = (uint8_t)offset;
2,147,483,647✔
441
  } else if (flag & KV_FLG_MID) {
2,764,548!
442
    ((uint16_t *)indices->idx)[indices->nCol] = (uint16_t)offset;
7,802,520✔
443
  } else {
444
    ((uint32_t *)indices->idx)[indices->nCol] = (uint32_t)offset;
×
445
  }
446
  indices->nCol++;
2,147,483,647✔
447
}
2,147,483,647✔
448

449
static int32_t tRowBuildKVRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema, SRow **ppRow) {
668,818,210✔
450
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
668,818,210✔
451

452
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
668,818,210!
453
  if (*ppRow == NULL) {
669,040,789!
454
    return terrno;
×
455
  }
456
  (*ppRow)->flag = sinfo->kvFlag;
669,040,789✔
457
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
669,040,789✔
458
  (*ppRow)->sver = schema->version;
669,040,789✔
459
  (*ppRow)->len = sinfo->kvRowSize;
669,040,789✔
460
  (*ppRow)->ts = VALUE_GET_TRIVIAL_DATUM(&colValArray[0].value);
669,040,789✔
461

462
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
669,040,789!
463
    return TSDB_CODE_INVALID_PARA;
179,325✔
464
  }
465

466
  uint8_t *primaryKeys = (*ppRow)->data;
668,861,464✔
467
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
668,861,464✔
468
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
668,861,464✔
469
  uint32_t payloadSize = 0;
668,861,464✔
470

471
  // primary keys
472
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
669,272,172✔
473
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
410,713✔
474
  }
475

476
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
668,861,459✔
477
  int32_t colValIndex = 1;
668,861,459✔
478
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
479
    for (;;) {
480
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
481
        break;
108✔
482
      }
483

484
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
485
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
2,147,483,647✔
486
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
2,147,483,647✔
487
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
488
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
900,942,167✔
489
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
900,942,167✔
490
            if (colValArray[colValIndex].value.nData > 0) {
900,942,167!
491
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
925,740,623✔
492
                           colValArray[colValIndex].value.nData);
925,740,623✔
493
              payloadSize += colValArray[colValIndex].value.nData;
925,740,623✔
494
            }
495
          } else {
496
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,147,483,647✔
497
            (void)memcpy(payload + payloadSize,
2,147,483,647✔
498
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647!
499
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647!
500
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,147,483,647✔
501
          }
502
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
2,147,483,647✔
503
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
9,203,684✔
504
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
18,407,368✔
505
        }
506

507
        colValIndex++;
2,147,483,647✔
508
        break;
2,147,483,647✔
509
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
510
        break;
250✔
511
      } else {
512
        colValIndex++;
×
513
      }
514
    }
515
  }
516
  return 0;
668,861,459✔
517
}
518

519
static int32_t tRowBuildKVRowWithBlob(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema,
×
520
                                      SRow **ppRow, SBlobRow2 *ppBlobRow) {
521
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
×
522

523
  *ppRow = (SRow *)taosMemoryCalloc(1, sinfo->kvRowSize);
×
524
  if (*ppRow == NULL) {
×
525
    return terrno;
×
526
  }
527
  (*ppRow)->flag = sinfo->kvFlag;
×
528
  (*ppRow)->numOfPKs = sinfo->numOfPKs;
×
529
  (*ppRow)->sver = schema->version;
×
530
  (*ppRow)->len = sinfo->kvRowSize;
×
531
  (*ppRow)->ts = colValArray[0].value.val;
×
532

533
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
×
534
    return TSDB_CODE_INVALID_PARA;
×
535
  }
536

537
  if (((*ppRow)->flag) == 0) {
×
538
    return TSDB_CODE_INVALID_PARA;
×
539
  }
540

541
  uint8_t *primaryKeys = (*ppRow)->data;
×
542
  SKVIdx  *indices = (SKVIdx *)(primaryKeys + sinfo->kvPKSize);
×
543
  uint8_t *payload = primaryKeys + sinfo->kvPKSize + sinfo->kvIndexSize;
×
544
  uint32_t payloadSize = 0;
×
545

546
  // primary keys
547
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
×
548
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
×
549
  }
550

551
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
×
552
  int32_t colValIndex = 1;
×
553
  int8_t  firstBlobCol = 1;
×
554
  for (int32_t i = 1; i < schema->numOfCols; i++) {
×
555
    for (;;) {
×
556
      if (colValIndex >= numOfColVals) {  // NONE
×
557
        break;
×
558
      }
559
      uint8_t hasBlob = 0;
×
560

561
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
×
562
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
×
563
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
564
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
×
565
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
×
566
              hasBlob = 1;
×
567
            }
568
            if (sinfo->scanType == ROW_BUILD_MERGE && hasBlob) {
×
569
              uTrace("blob merge block");
×
570
            }
571
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
572
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
×
573
            if (colValArray[colValIndex].value.nData > 0) {
×
574
              if (hasBlob == 0) {
×
575
                (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
×
576
                             colValArray[colValIndex].value.nData);
×
577
                payloadSize += colValArray[colValIndex].value.nData;
×
578
              } else {
579
                if (sinfo->scanType == ROW_BUILD_MERGE) {
×
580
                  uint64_t seq = 0;
×
581
                  tGetU64(colValArray[colValIndex].value.pData, &seq);
×
582
                  int32_t code = tBlobRowUpdate(ppBlobRow, seq, NULL);  // tBlobRow
×
583
                  if (code != 0) return code;
×
584
                } else {
585
                  uint64_t  seq = 0;
×
586
                  uint32_t  seqOffset = payloadSize + payload - (*ppRow)->data;
×
587
                  SBlobItem item = {.seqOffsetInRow = seqOffset,
×
588
                                    .data = colValArray[colValIndex].value.pData,
×
589
                                    .dataLen = colValArray[colValIndex].value.nData};
×
590
                  int32_t   code = tBlobRowPush(ppBlobRow, &item, &seq, firstBlobCol);
×
591
                  if (code != 0) return code;
×
592
                  if (firstBlobCol == 1) {
×
593
                    firstBlobCol = 0;
×
594
                  }
595
                  payloadSize += tPutU64(payload + payloadSize, seq);
×
596
                }
597
              }
598
            } else {
599
              if (hasBlob) {
×
600
                uint64_t  seq = 0;
×
601
                uint32_t  seqOffset = payloadSize + payload - (*ppRow)->data;
×
602
                SBlobItem item = {.seqOffsetInRow = seqOffset,
×
603
                                  .data = colValArray[colValIndex].value.pData,
×
604
                                  .dataLen = colValArray[colValIndex].value.nData};
×
605
                int32_t   code = tBlobRowPush(ppBlobRow, &item, &seq, firstBlobCol);
×
606
                if (firstBlobCol == 1) {
×
607
                  firstBlobCol = 0;
×
608
                }
609
                if (code != 0) return code;
×
610
              }
611
            }
612
          } else {
613
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
×
614
            (void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
×
615
                         tDataTypes[schema->columns[i].type].bytes);
×
616
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
×
617
          }
618
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
×
619
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
×
620
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
×
621
        }
622

623
        colValIndex++;
×
624
        break;
×
625
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
626
        break;
×
627
      } else {
628
        colValIndex++;
×
629
      }
630
    }
631
  }
632

633
  if (((*ppRow)->flag) == 0) {
×
634
    return TSDB_CODE_INVALID_PARA;
×
635
  }
636
  return 0;
×
637
}
638
int32_t tRowBuildWithMerge(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow) {
×
639
  int32_t           code;
640
  SRowBuildScanInfo sinfo = {.scanType = ROW_BUILD_MERGE};
×
641

642
  code = tRowBuildScan(aColVal, pTSchema, &sinfo);
×
643
  if (code) return code;
×
644

645
  if (sinfo.tupleRowSize <= sinfo.kvRowSize) {
×
646
    code = tRowBuildTupleRow(aColVal, &sinfo, pTSchema, ppRow);
×
647
  } else {
648
    code = tRowBuildKVRow(aColVal, &sinfo, pTSchema, ppRow);
×
649
  }
650
  return code;
×
651
}
652
int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SRowBuildScanInfo *sinfo) {
2,147,483,647✔
653
  int32_t code;
654
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
2,147,483,647✔
655
  if (code) return code;
2,147,483,647!
656

657
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
2,147,483,647✔
658
    code = tRowBuildTupleRow(aColVal, sinfo, pTSchema, ppRow);
1,693,342,149✔
659
  } else {
660
    code = tRowBuildKVRow(aColVal, sinfo, pTSchema, ppRow);
667,182,055✔
661
  }
662
  return code;
2,147,483,647✔
663
}
664

665
int32_t tRowBuildWithBlob(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SBlobRow2 *pBlobRow,
×
666
                          SRowBuildScanInfo *sinfo) {
667
  int32_t code;
668

669
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
×
670
  if (code) return code;
×
671

672
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
×
673
    code = tRowBuildTupleWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobRow);
×
674
  } else {
675
    code = tRowBuildKVRowWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobRow);
×
676
  }
677

678
  return code;
×
679
}
680

681
int32_t tBlobRowCreate(int64_t cap, int8_t type, SBlobRow2 **ppBlobRow) {
40,905✔
682
  int32_t    lino = 0;
40,905✔
683
  int32_t    code = 0;
40,905✔
684
  SBlobRow2 *p = taosMemCalloc(1, sizeof(SBlobRow2));
40,905✔
685
  if (p == NULL) {
40,938!
686
    return terrno;
×
687
  }
688

689
  p->type = type;
40,938✔
690
  p->pSeqTable = taosArrayInit(128, sizeof(SBlobValue));
40,938✔
691
  if (p->pSeqTable == NULL) {
40,928!
692
    TAOS_CHECK_EXIT(terrno);
×
693
  }
694

695
  p->data = taosMemCalloc(1024, cap * sizeof(uint8_t));
40,928✔
696
  if (p->data == NULL) {
40,938!
697
    TAOS_CHECK_EXIT(terrno);
×
698
  }
699

700
  p->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
40,938✔
701
  if (p->pSeqToffset == NULL) {
40,937!
702
    TAOS_CHECK_EXIT(terrno);
×
703
  }
704

705
  p->pSet = taosArrayInit(4, sizeof(int32_t));
40,937✔
706
  if (p->pSet == NULL) {
40,935✔
707
    TAOS_CHECK_EXIT(terrno);
1!
708
  }
709

710
  p->cap = cap;
40,934✔
711
  p->len = 0;
40,934✔
712
  p->seq = 1;
40,934✔
713

714
  *ppBlobRow = p;
40,934✔
715
_exit:
40,934✔
716
  if (code != 0) {
40,934!
717
    taosHashCleanup(p->pSeqToffset);
×
718
    taosArrayDestroy(p->pSeqTable);
×
719
    taosArrayDestroy(p->pSet);
×
720

721
    taosMemoryFree(p->data);
×
722
    taosMemoryFree(p);
×
723
  }
724
  uDebug("create blob row %p", p);
40,934!
725
  return code;
40,927✔
726
}
727
int32_t tBlobRowPush(SBlobRow2 *pBlobRow, SBlobItem *pItem, uint64_t *seq, int8_t nextRow) {
10✔
728
  if (pBlobRow == NULL || pItem == NULL || seq == NULL) {
10!
729
    return TSDB_CODE_INVALID_PARA;
×
730
  }
731
  uTrace("push blob %p, seqOffsetInRow %d, dataLen %d, nextRow %d", pBlobRow, pItem->seqOffsetInRow, pItem->dataLen,
10!
732
         nextRow);
733
  int32_t  lino = 0;
10✔
734
  int32_t  code = 0;
10✔
735
  uint64_t offset;
736
  uint32_t len = pItem->dataLen;
10✔
737
  uint8_t *data = pItem->data;
10✔
738
  int32_t  dataOffset = pItem->seqOffsetInRow;
10✔
739

740
  uint64_t tlen = pBlobRow->len + len;
10✔
741
  if (tlen > pBlobRow->cap) {
10!
742
    int64_t cap = pBlobRow->cap;
×
743
    // opt later
744
    do {
745
      cap = cap * 2;
×
746
    } while (tlen > cap);
×
747

748
    uint8_t *data = taosMemRealloc(pBlobRow->data, cap);
×
749
    if (data == NULL) {
×
750
      return terrno;
×
751
    }
752
    pBlobRow->data = data;
×
753
    pBlobRow->cap = cap;
×
754
  }
755
  if (len > 0) {
10!
756
    (void)memcpy(pBlobRow->data + pBlobRow->len, data, len);
10✔
757
  }
758

759
  offset = pBlobRow->len;
10✔
760
  pBlobRow->len += len;
10✔
761

762
  pBlobRow->seq++;
10✔
763
  *seq = pBlobRow->seq;
10✔
764

765
  SBlobValue value = {.offset = offset, .len = len, .dataOffset = dataOffset, .nextRow = nextRow};
10✔
766
  if (taosArrayPush(pBlobRow->pSeqTable, &value) == NULL) {
20!
767
    TAOS_CHECK_EXIT(terrno);
×
768
  }
769

770
  int32_t sz = taosArrayGetSize(pBlobRow->pSeqTable);
10✔
771
  code = taosHashPut(pBlobRow->pSeqToffset, seq, sizeof(int64_t), &sz, sizeof(int32_t));
10✔
772
  if (code != 0) {
10!
773
    TAOS_CHECK_EXIT(code);
×
774
  }
775

776
_exit:
10✔
777
  return code;
10✔
778
}
779
int32_t tBlobRowUpdate(SBlobRow2 *pBlobRow, uint64_t seq, SBlobItem *pItem) {
×
780
  int32_t code = 0;
×
781
  return code;
×
782
  if (pBlobRow == NULL || pItem == NULL) {
783
    return TSDB_CODE_INVALID_PARA;
784
  }
785
  if (pBlobRow->pSeqToffset == NULL || pBlobRow->pSeqTable == NULL) {
786
    return TSDB_CODE_INVALID_PARA;
787
  }
788

789
  return code;
790
}
791
int32_t tBlobRowGet(SBlobRow2 *pBlobRow, uint64_t seq, SBlobItem *pItem) {
×
792
  if (pBlobRow == NULL || pItem == NULL) {
×
793
    return TSDB_CODE_INVALID_PARA;
×
794
  }
795
  if (pBlobRow->pSeqToffset == NULL || pBlobRow->pSeqTable == NULL) {
×
796
    return TSDB_CODE_INVALID_PARA;
×
797
  }
798

799
  int32_t code = 0;
×
800
  int32_t len = 0;
×
801
  int32_t dataOffset = 0;
×
802
  int8_t  nextRow = 0;
×
803

804
  int32_t *offset = (int32_t *)taosHashGet(pBlobRow->pSeqToffset, &seq, sizeof(int64_t));
×
805
  if (offset == NULL) {
×
806
    return TSDB_CODE_INVALID_PARA;
×
807
  }
808

809
  SBlobValue *value = taosArrayGet(pBlobRow->pSeqTable, *offset - 1);
×
810
  if (value == NULL) {
×
811
    return TSDB_CODE_INVALID_PARA;
×
812
  }
813

814
  len = value->len;
×
815
  dataOffset = value->dataOffset;
×
816
  nextRow = value->nextRow;
×
817

818
  pItem->seqOffsetInRow = dataOffset + pBlobRow->data - (uint8_t *)pBlobRow;
×
819
  pItem->dataLen = len;
×
820
  pItem->data = pBlobRow->data + value->offset;
×
821

822
  return code;
×
823
}
824

825
int32_t tBlobRowSize(SBlobRow2 *pBlobRow) {
35,253,036✔
826
  if (pBlobRow == NULL) return 0;
35,253,036!
827
  return taosArrayGetSize(pBlobRow->pSeqTable);
×
828
}
829
int32_t tBlobRowEnd(SBlobRow2 *pBlobRow) {
×
830
  if (pBlobRow == NULL) return 0;
×
831
  int32_t sz = taosArrayGetSize(pBlobRow->pSeqTable);
×
832
  if (taosArrayPush(pBlobRow->pSet, &sz) == NULL) {
×
833
    return terrno;
×
834
  }
835
  return 0;
×
836
}
837
int32_t tBlobRowRebuild(SBlobRow2 *p, int32_t sRow, int32_t nrow, SBlobRow2 **pDst) {
×
838
  int32_t code = 0;
×
839

840
  code = tBlobRowCreate(p->cap, p->type, pDst);
×
841
  if (code != 0) {
×
842
    return code;
×
843
  }
844

845
  SBlobRow2 *pBlobRow = *pDst;
×
846
  if (p->pSeqToffset == NULL || p->pSeqTable == NULL || p->data == NULL) {
×
847
    return TSDB_CODE_INVALID_PARA;
×
848
  }
849

850
  uint64_t seq = 0;
×
851
  int32_t  count = 0;
×
852
  for (int32_t i = sRow; i < taosArrayGetSize(p->pSeqTable); i++) {
×
853
    SBlobValue *pValue = taosArrayGet(p->pSeqTable, i);
×
854
    uint8_t    *data = p->data + pValue->offset;
×
855
    int32_t     len = pValue->len;
×
856

857
    SBlobItem item = {.data = data, .dataLen = len, .seqOffsetInRow = pValue->dataOffset};
×
858

859
    code = tBlobRowPush(pBlobRow, &item, &seq, pValue->nextRow);
×
860
    count++;
×
861
    if (count >= nrow) {
×
862
      break;
×
863
    }
864
  }
865

866
  return code;
×
867
}
868

869
int32_t tBlobRowDestroy(SBlobRow2 *pBlobRow) {
101,807✔
870
  if (pBlobRow == NULL) return 0;
101,807✔
871
  int32_t code = 0;
40,869✔
872
  uInfo("destroy blob row, seqTable size %p", pBlobRow);
40,869!
873
  taosMemoryFree(pBlobRow->data);
40,874!
874
  taosArrayDestroy(pBlobRow->pSeqTable);
40,941✔
875
  taosHashCleanup(pBlobRow->pSeqToffset);
40,939✔
876
  taosArrayDestroy(pBlobRow->pSet);
40,940✔
877
  taosMemoryFree(pBlobRow);
40,940!
878
  return code;
40,940✔
879
}
880
int32_t tBlobRowClear(SBlobRow2 *pBlobRow) {
×
881
  if (pBlobRow == NULL) return 0;
×
882
  int32_t code = 0;
×
883
  uInfo("clear blob row, seqTable size %p", pBlobRow);
×
884
  taosArrayClear(pBlobRow->pSeqTable);
×
885
  taosHashClear(pBlobRow->pSeqToffset);
×
886
  pBlobRow->len = 0;
×
887
  pBlobRow->seq = 1;
×
888
  return code;
×
889
}
890

891
static int32_t tBindInfoCompare(const void *p1, const void *p2, const void *param) {
37✔
892
  if (((SBindInfo *)p1)->columnId < ((SBindInfo *)p2)->columnId) {
37✔
893
    return -1;
7✔
894
  } else if (((SBindInfo *)p1)->columnId > ((SBindInfo *)p2)->columnId) {
30!
895
    return 1;
30✔
896
  }
897
  return 0;
×
898
}
899

900
/* build rows to `rowArray` from bind
901
 * `infos` is the bind information array
902
 * `numOfInfos` is the number of bind information
903
 * `infoSorted` is whether the bind information is sorted by column id
904
 * `pTSchema` is the schema of the table
905
 * `rowArray` is the array to store the rows
906
 * `pOrdered` is the pointer to store ordered
907
 * `pDupTs` is the pointer to store duplicateTs
908
 */
909
int32_t tRowBuildFromBind(SBindInfo *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
51,111✔
910
                          SArray *rowArray, bool *pOrdered, bool *pDupTs) {
911
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
51,111!
912
    return TSDB_CODE_INVALID_PARA;
×
913
  }
914

915
  if (!infoSorted) {
51,225!
916
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
917
  }
918

919
  int32_t code = 0;
51,225✔
920
  int32_t numOfRows = infos[0].bind->num;
51,225✔
921
  SArray *colValArray;
922
  SColVal colVal;
923

924
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
51,225!
925
    return terrno;
×
926
  }
927

928
  SRowKey rowKey, lastRowKey;
929
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
100,875,147!
930
    taosArrayClear(colValArray);
109,407,937✔
931

932
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
466,561,866✔
933
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
344,633,905✔
934
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
32✔
935
      } else {
936
        SValue value = {
344,633,873✔
937
            .type = infos[iInfo].type,
344,633,873✔
938
        };
939
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
344,633,873!
940
          value.nData = infos[iInfo].bind->length[iRow];
176,053✔
941
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
176,053!
942
            code = TSDB_CODE_INVALID_PARA;
×
943
            goto _exit;
×
944
          }
945
          value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
176,053✔
946
        } else {
947
          valueSetDatum(&value, infos[iInfo].type,
344,457,820✔
948
                        (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
344,457,820✔
949
                        infos[iInfo].bind->buffer_length);
344,457,820✔
950
        }
951
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
369,729,118✔
952
      }
953
      if (taosArrayPush(colValArray, &colVal) == NULL) {
358,744,772!
954
        code = terrno;
×
955
        goto _exit;
×
956
      }
957
    }
958

959
    SRow             *row;
960
    SRowBuildScanInfo sinfo = {0};
121,927,961✔
961
    if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
121,927,961!
962
      goto _exit;
×
963
    }
964

965
    if ((taosArrayPush(rowArray, &row)) == NULL) {
100,938,012!
966
      code = terrno;
×
967
      goto _exit;
×
968
    }
969

970
    if (pOrdered && pDupTs) {
100,938,012!
971
      tRowGetKey(row, &rowKey);
202,489,414!
972
      if (iRow == 0) {
101,130,661✔
973
        *pOrdered = true;
50,864✔
974
        *pDupTs = false;
50,864✔
975
      } else {
976
        if (*pOrdered) {
101,079,797!
977
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
101,112,928✔
978
          *pOrdered = (res >= 0);
101,112,928✔
979
          if (!*pDupTs) {
101,112,928!
980
            *pDupTs = (res == 0);
101,239,145✔
981
          }
982
        }
983
      }
984
      lastRowKey = rowKey;
101,130,661✔
985
    }
986
  }
987

988
_exit:
×
989
  taosArrayDestroy(colValArray);
×
990
  return code;
51,184✔
991
}
992

993
int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
2,147,483,647✔
994
  if (!(iCol < pTSchema->numOfCols)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
995
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
2,147,483,647!
996

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

999
  if (iCol == 0) {
2,147,483,647✔
1000
    pColVal->cid = pTColumn->colId;
15,700,403✔
1001
    pColVal->value.type = pTColumn->type;
15,700,403✔
1002
    pColVal->flag = CV_FLAG_VALUE;
15,700,403✔
1003
    VALUE_SET_TRIVIAL_DATUM(&pColVal->value, pRow->ts);
15,700,403✔
1004
    return 0;
15,700,403✔
1005
  }
1006

1007
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
1008
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,022,067✔
1009
    return 0;
1,022,067✔
1010
  }
1011

1012
  if (pRow->flag == HAS_NULL) {
2,147,483,647✔
1013
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,047,680✔
1014
    return 0;
1,047,680✔
1015
  }
1016

1017
  SPrimaryKeyIndex index;
1018
  uint8_t         *data = pRow->data;
2,147,483,647✔
1019
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
1020
    data += tGetPrimaryKeyIndex(data, &index);
39,388,502✔
1021
  }
1022

1023
  if (pRow->flag >> 4) {  // KV Row
2,147,483,647✔
1024
    SKVIdx  *pIdx = (SKVIdx *)data;
2,147,483,647✔
1025
    uint8_t *pv = NULL;
2,147,483,647✔
1026

1027
    if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
1028
      pv = pIdx->idx + pIdx->nCol;
2,147,483,647✔
1029
    } else if (pRow->flag & KV_FLG_MID) {
41,071,781!
1030
      pv = pIdx->idx + (pIdx->nCol << 1);
113,107,296✔
1031
    } else {
1032
      pv = pIdx->idx + (pIdx->nCol << 2);
×
1033
    }
1034

1035
    int16_t lidx = 0;
2,147,483,647✔
1036
    int16_t ridx = pIdx->nCol - 1;
2,147,483,647✔
1037
    while (lidx <= ridx) {
2,147,483,647✔
1038
      int16_t  mid = (lidx + ridx) >> 1;
2,147,483,647✔
1039
      uint8_t *pData = NULL;
2,147,483,647✔
1040
      if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
1041
        pData = pv + ((uint8_t *)pIdx->idx)[mid];
2,147,483,647✔
1042
      } else if (pRow->flag & KV_FLG_MID) {
463,163,502!
1043
        pData = pv + ((uint16_t *)pIdx->idx)[mid];
463,255,741✔
1044
      } else {
1045
        pData = pv + ((uint32_t *)pIdx->idx)[mid];
×
1046
      }
1047

1048
      int16_t cid;
1049
      pData += tGetI16v(pData, &cid);
2,147,483,647✔
1050

1051
      if (TABS(cid) == pTColumn->colId) {
2,147,483,647✔
1052
        if (cid < 0) {
2,147,483,647✔
1053
          *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
36,396,915✔
1054
        } else {
1055
          pColVal->cid = pTColumn->colId;
2,147,483,647✔
1056
          pColVal->value.type = pTColumn->type;
2,147,483,647✔
1057
          pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
1058

1059
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647!
1060
            int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
1,201,511,654!
1061

1062
            pData += tGetU32v(pData, &pColVal->value.nData);
1,201,511,654!
1063
            if (pColVal->value.nData > 0) {
1,201,511,654!
1064
              pColVal->value.pData = pData;
1,601,045,895✔
1065
            } else {
1066
              pColVal->value.pData = NULL;
×
1067
            }
1068
            if (isBlob == 1) {
1,201,511,654!
1069
              pData += BSE_SEQUECE_SIZE;  // skip seq
×
1070
            }
1071
          } else {
1072
            valueSetDatum(&pColVal->value, pTColumn->type, pData, pTColumn->bytes);
2,147,483,647✔
1073
          }
1074
        }
1075
        return 0;
2,147,483,647✔
1076
      } else if (TABS(cid) < pTColumn->colId) {
2,147,483,647✔
1077
        lidx = mid + 1;
2,147,483,647✔
1078
      } else {
1079
        ridx = mid - 1;
2,147,483,647✔
1080
      }
1081
    }
1082

1083
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
2,147,483,647✔
1084
  } else {  // Tuple Row
1085
    uint8_t *bitmap = data;
690,616,929✔
1086
    uint8_t *fixed;
1087
    uint8_t *varlen;
1088
    uint8_t  bit;
1089

1090
    if (pRow->flag == HAS_VALUE) {
690,616,929✔
1091
      fixed = bitmap;
670,902,680✔
1092
      bit = BIT_FLG_VALUE;
670,902,680✔
1093
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
19,714,249!
1094
      fixed = BIT2_SIZE(pTSchema->numOfCols - 1) + bitmap;
×
1095
      bit = GET_BIT2(bitmap, iCol - 1);
×
1096
    } else {
1097
      fixed = BIT1_SIZE(pTSchema->numOfCols - 1) + bitmap;
19,714,249✔
1098
      bit = GET_BIT1(bitmap, iCol - 1);
19,714,249✔
1099

1100
      if (pRow->flag == (HAS_NONE | HAS_VALUE)) {
19,714,249✔
1101
        if (bit) bit++;
20,435✔
1102
      } else if (pRow->flag == (HAS_NULL | HAS_VALUE)) {
19,693,814!
1103
        bit++;
43,225,492✔
1104
      }
1105
    }
1106
    varlen = fixed + pTSchema->flen;
690,616,929✔
1107

1108
    if (bit == BIT_FLG_NONE) {
690,616,929✔
1109
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
7,250✔
1110
      return 0;
7,250✔
1111
    } else if (bit == BIT_FLG_NULL) {
690,609,679✔
1112
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
13,382,928✔
1113
      return 0;
13,382,928✔
1114
    }
1115

1116
    pColVal->cid = pTColumn->colId;
677,226,751✔
1117
    pColVal->value.type = pTColumn->type;
677,226,751✔
1118
    pColVal->flag = CV_FLAG_VALUE;
677,226,751✔
1119
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
677,226,751!
1120
      int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
41,933,917!
1121
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
41,933,917✔
1122
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
83,867,834!
1123
      // TODO(yhDeng): support tuple
1124
      //  if (isBlob) pColVal->value.pData += sizeof(uint64_t);  // skip seq
1125
      //  }
1126
    } else {
1127
      valueSetDatum(&pColVal->value, pTColumn->type, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
635,292,834✔
1128
    }
1129
  }
1130

1131
  return 0;
2,147,483,647✔
1132
}
1133

1134
void tRowDestroy(SRow *pRow) {
1,649,983,501✔
1135
  if (pRow) taosMemoryFree(pRow);
1,649,983,501!
1136
}
1,649,879,148✔
1137

1138
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
1,095,585,512✔
1139
  SRowKey key1, key2;
1140
  tRowGetKey(*(SRow **)p1, &key1);
2,147,483,647✔
1141
  tRowGetKey(*(SRow **)p2, &key2);
2,147,483,647✔
1142
  return tRowKeyCompare(&key1, &key2);
1,130,597,817✔
1143
}
1144
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
1,098✔
1145
static int32_t tRowMergeImpl(SArray *aRowP, STSchema *pTSchema, int32_t iStart, int32_t iEnd, int8_t flag) {
285✔
1146
  int32_t code = 0;
285✔
1147

1148
  int32_t    nRow = iEnd - iStart;
285✔
1149
  SRowIter **aIter = NULL;
285✔
1150
  SArray    *aColVal = NULL;
285✔
1151
  SRow      *pRow = NULL;
285✔
1152
  uint8_t    hasBlob = 0;
285✔
1153
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
285!
1154
  if (aIter == NULL) {
285!
1155
    code = terrno;
×
1156
    goto _exit;
×
1157
  }
1158

1159
  for (int32_t i = 0; i < nRow; i++) {
1,383✔
1160
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
1,098✔
1161

1162
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
1,098✔
1163
    if (code) goto _exit;
1,098!
1164
  }
1165

1166
  // merge
1167
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
285✔
1168
  if (aColVal == NULL) {
285!
1169
    code = terrno;
×
1170
    goto _exit;
×
1171
  }
1172

1173
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
1,089✔
1174
    SColVal *pColVal = NULL;
804✔
1175

1176
    for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
976✔
1177
      SColVal *pColValT = tRowIterNext(aIter[iRow]);
917✔
1178
      while (pColValT->cid < pTSchema->columns[iCol].colId) {
1,046✔
1179
        pColValT = tRowIterNext(aIter[iRow]);
129✔
1180
      }
1181

1182
      // todo: take strategy according to the flag
1183
      if (COL_VAL_IS_VALUE(pColValT)) {
917✔
1184
        pColVal = pColValT;
745✔
1185
        break;
745✔
1186
      } else if (COL_VAL_IS_NULL(pColValT)) {
172✔
1187
        if (pColVal == NULL) {
4✔
1188
          pColVal = pColValT;
2✔
1189
        }
1190
      }
1191
    }
1192

1193
    if (pColVal) {
804✔
1194
      if (taosArrayPush(aColVal, pColVal) == NULL) {
747!
1195
        code = terrno;
×
1196
        goto _exit;
×
1197
      }
1198
    }
1199
  }
1200

1201
  // build
1202
  SRowBuildScanInfo sinfo = {0};
285✔
1203
  code = tRowBuild(aColVal, pTSchema, &pRow, &sinfo);
285✔
1204

1205
  if (code) goto _exit;
285!
1206

1207
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
285✔
1208
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
285!
1209
    code = terrno;
×
1210
    goto _exit;
×
1211
  }
1212

1213
_exit:
285✔
1214
  if (aIter) {
285!
1215
    for (int32_t i = 0; i < nRow; i++) {
1,383✔
1216
      tRowIterClose(&aIter[i]);
1,098✔
1217
    }
1218
    taosMemoryFree(aIter);
285!
1219
  }
1220
  if (aColVal) taosArrayDestroy(aColVal);
285!
1221
  if (code) tRowDestroy(pRow);
285!
1222
  return code;
285✔
1223
}
1224

1225
static int32_t tRowMergeWithBlobImpl(SArray *aRowP, STSchema *pTSchema, SBlobRow2 *pBlob, int32_t iStart, int32_t iEnd,
×
1226
                                     int8_t flag) {
1227
  int32_t code = 0;
×
1228

1229
  int32_t    nRow = iEnd - iStart;
×
1230
  SRowIter **aIter = NULL;
×
1231
  SArray    *aColVal = NULL;
×
1232
  SRow      *pRow = NULL;
×
1233
  uint8_t    hasBlob = 0;
×
1234
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
×
1235
  if (aIter == NULL) {
×
1236
    code = terrno;
×
1237
    goto _exit;
×
1238
  }
1239

1240
  for (int32_t i = 0; i < nRow; i++) {
×
1241
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
×
1242

1243
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
×
1244
    if (code) goto _exit;
×
1245
  }
1246

1247
  // merge
1248
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
×
1249
  if (aColVal == NULL) {
×
1250
    code = terrno;
×
1251
    goto _exit;
×
1252
  }
1253

1254
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
×
1255
    SColVal  *pColVal = NULL;
×
1256
    STColumn *pCol = pTSchema->columns + iCol;
×
1257
    if (IS_STR_DATA_BLOB(pCol->type)) {
×
1258
      hasBlob = 1;
×
1259
    }
1260

1261
    for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
×
1262
      SColVal *pColValT = tRowIterNext(aIter[iRow]);
×
1263
      while (pColValT->cid < pTSchema->columns[iCol].colId) {
×
1264
        pColValT = tRowIterNext(aIter[iRow]);
×
1265
      }
1266

1267
      // todo: take strategy according to the flag
1268
      if (COL_VAL_IS_VALUE(pColValT)) {
×
1269
        pColVal = pColValT;
×
1270
        break;
×
1271
      } else if (COL_VAL_IS_NULL(pColValT)) {
×
1272
        if (pColVal == NULL) {
×
1273
          pColVal = pColValT;
×
1274
        }
1275
      }
1276
    }
1277

1278
    if (pColVal) {
×
1279
      if (taosArrayPush(aColVal, pColVal) == NULL) {
×
1280
        code = terrno;
×
1281
        goto _exit;
×
1282
      }
1283
    }
1284
  }
1285

1286
  // build
1287
  SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_MERGE};
×
1288
  code = tRowBuildWithBlob(aColVal, pTSchema, &pRow, pBlob, &sinfo);
×
1289
  if (code) goto _exit;
×
1290

1291
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
×
1292
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
×
1293
    code = terrno;
×
1294
    goto _exit;
×
1295
  }
1296

1297
_exit:
×
1298
  if (aIter) {
×
1299
    for (int32_t i = 0; i < nRow; i++) {
×
1300
      tRowIterClose(&aIter[i]);
×
1301
    }
1302
    taosMemoryFree(aIter);
×
1303
  }
1304
  if (aColVal) taosArrayDestroy(aColVal);
×
1305
  if (code) tRowDestroy(pRow);
×
1306
  return code;
×
1307
}
1308

1309
int32_t tRowSort(SArray *aRowP) {
140,939✔
1310
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
140,939✔
1311
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
108,635✔
1312
  if (code != TSDB_CODE_SUCCESS) {
108,654!
1313
    uError("taosArrayMSort failed caused by %d", code);
×
1314
  }
1315
  return code;
108,656✔
1316
}
1317

1318
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag) {
141,023✔
1319
  int32_t code = 0;
141,023✔
1320

1321
  int32_t iStart = 0;
141,023✔
1322
  while (iStart < aRowP->size) {
182,695,653✔
1323
    SRowKey key1;
1324
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
182,576,974✔
1325

1326
    tRowGetKey(row1, &key1);
365,091,004✔
1327

1328
    int32_t iEnd = iStart + 1;
182,528,742✔
1329
    while (iEnd < aRowP->size) {
182,505,795✔
1330
      SRowKey key2;
1331
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
182,367,327✔
1332
      tRowGetKey(row2, &key2);
364,730,772✔
1333

1334
      if (tRowKeyCompare(&key1, &key2) != 0) break;
182,393,215!
1335

1336
      iEnd++;
×
1337
    }
1338

1339
    if (iEnd - iStart > 1) {
182,554,630✔
1340
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, flag);
285✔
1341
      if (code) return code;
285!
1342
    }
1343

1344
    // the array is also changing, so the iStart just ++ instead of iEnd
1345
    iStart++;
182,554,630✔
1346
  }
1347

1348
  return code;
118,679✔
1349
}
1350

1351
int32_t tRowSortWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobRow2 *pBlobRow) {
×
1352
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
×
1353
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
×
1354
  if (code != TSDB_CODE_SUCCESS) {
×
1355
    uError("taosArrayMSort failed caused by %d", code);
×
1356
    return code;
×
1357
  }
1358
  
1359

1360
  return code;
×
1361
}
1362
int32_t tRowMergeWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobRow2 *pBlobRow, int8_t flag) {
×
1363
  int32_t code = 0;
×
1364

1365
  int32_t iStart = 0;
×
1366
  while (iStart < aRowP->size) {
×
1367
    SRowKey key1;
1368
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
×
1369

1370
    tRowGetKey(row1, &key1);
×
1371

1372
    int32_t iEnd = iStart + 1;
×
1373
    while (iEnd < aRowP->size) {
×
1374
      SRowKey key2;
1375
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
×
1376
      tRowGetKey(row2, &key2);
×
1377

1378
      if (tRowKeyCompare(&key1, &key2) != 0) break;
×
1379

1380
      iEnd++;
×
1381
    }
1382

1383
    if (iEnd - iStart > 1) {
×
1384
      code = tRowMergeWithBlobImpl(aRowP, pTSchema, pBlobRow, iStart, iEnd, flag);
×
1385
      if (code) return code;
×
1386
    }
1387

1388
    // the array is also changing, so the iStart just ++ instead of iEnd
1389
    iStart++;
×
1390
  }
1391

1392
  return code;
×
1393
}
1394

1395
// SRowIter ========================================
1396
struct SRowIter {
1397
  SRow     *pRow;
1398
  STSchema *pTSchema;
1399

1400
  int32_t iTColumn;
1401
  union {
1402
    struct {  // kv
1403
      int32_t iCol;
1404
      SKVIdx *pIdx;
1405
    };
1406
    struct {  // tuple
1407
      uint8_t *pb;
1408
      uint8_t *pf;
1409
    };
1410
  };
1411
  uint8_t *pv;
1412
  SColVal  cv;
1413
};
1414

1415
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
1,175,641✔
1416
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
1,175,641!
1417

1418
  int32_t code = 0;
1,175,641✔
1419

1420
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
1,175,641!
1421
  if (pIter == NULL) {
1,205,602!
1422
    code = terrno;
×
1423
    goto _exit;
×
1424
  }
1425

1426
  pIter->pRow = pRow;
1,205,602✔
1427
  pIter->pTSchema = pTSchema;
1,205,602✔
1428
  pIter->iTColumn = 0;
1,205,602✔
1429

1430
  if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
1,205,602!
1431

1432
  uint8_t         *data = pRow->data;
1,204,118✔
1433
  SPrimaryKeyIndex index;
1434
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,236,115✔
1435
    data += tGetPrimaryKeyIndex(data, &index);
32,023✔
1436
  }
1437

1438
  if (pRow->flag >> 4) {
1,204,092✔
1439
    pIter->iCol = 0;
1,195,841✔
1440
    pIter->pIdx = (SKVIdx *)data;
1,195,841✔
1441
    if (pRow->flag & KV_FLG_LIT) {
1,195,841✔
1442
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
1,191,781✔
1443
    } else if (pRow->flag & KV_FLG_MID) {
4,060!
1444
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
4,800✔
1445
    } else {
1446
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
×
1447
    }
1448
  } else {
1449
    switch (pRow->flag) {
8,251!
1450
      case (HAS_NULL | HAS_NONE):
1✔
1451
        pIter->pb = data;
1✔
1452
        break;
1✔
1453
      case HAS_VALUE:
3,375✔
1454
        pIter->pf = data;
3,375✔
1455
        pIter->pv = pIter->pf + pTSchema->flen;
3,375✔
1456
        break;
3,375✔
1457
      case (HAS_VALUE | HAS_NONE):
1,286✔
1458
      case (HAS_VALUE | HAS_NULL):
1459
        pIter->pb = data;
1,286✔
1460
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
1,286✔
1461
        pIter->pv = pIter->pf + pTSchema->flen;
1,286✔
1462
        break;
1,286✔
1463
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1464
        pIter->pb = data;
×
1465
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
1466
        pIter->pv = pIter->pf + pTSchema->flen;
×
1467
        break;
×
1468
      default:
3,589✔
1469
        break;
3,589✔
1470
    }
1471
  }
1472

1473
_exit:
1,205,576✔
1474
  if (code) {
1,205,576!
1475
    *ppIter = NULL;
×
1476
  } else {
1477
    *ppIter = pIter;
1,205,576✔
1478
  }
1479
  return code;
1,205,576✔
1480
}
1481

1482
void tRowIterClose(SRowIter **ppIter) {
1,160,701✔
1483
  SRowIter *pIter = *ppIter;
1,160,701✔
1484
  if (pIter) {
1,160,701!
1485
    taosMemoryFree(pIter);
1,161,135!
1486
  }
1487
  *ppIter = NULL;
1,213,264✔
1488
}
1,213,264✔
1489

1490
SColVal *tRowIterNext(SRowIter *pIter) {
17,272,638✔
1491
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
17,272,638✔
1492
    return NULL;
1,152,914✔
1493
  }
1494

1495
  STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
16,119,724✔
1496

1497
  // timestamp
1498
  if (0 == pIter->iTColumn) {
16,119,724✔
1499
    pIter->cv.cid = pTColumn->colId;
1,183,721✔
1500
    pIter->cv.value.type = pTColumn->type;
1,183,721✔
1501
    pIter->cv.flag = CV_FLAG_VALUE;
1,183,721✔
1502
    VALUE_SET_TRIVIAL_DATUM(&pIter->cv.value, pIter->pRow->ts);
1,183,721✔
1503
    goto _exit;
1,183,721✔
1504
  }
1505

1506
  if (pIter->pRow->flag == HAS_NONE) {
14,936,003✔
1507
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
55,577✔
1508
    goto _exit;
55,577✔
1509
  }
1510

1511
  if (pIter->pRow->flag == HAS_NULL) {
14,880,426✔
1512
    pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,121✔
1513
    goto _exit;
3,121✔
1514
  }
1515

1516
  if (pIter->pRow->flag >> 4) {  // KV
14,877,305!
1517
    if (pIter->iCol < pIter->pIdx->nCol) {
15,444,043✔
1518
      uint8_t *pData;
1519

1520
      if (pIter->pRow->flag & KV_FLG_LIT) {
11,307,352✔
1521
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
11,168,475✔
1522
      } else if (pIter->pRow->flag & KV_FLG_MID) {
138,877!
1523
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
144,000✔
1524
      } else {
1525
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
1526
      }
1527

1528
      int16_t cid;
1529
      pData += tGetI16v(pData, &cid);
11,307,352✔
1530

1531
      if (TABS(cid) == pTColumn->colId) {
11,307,352!
1532
        if (cid < 0) {
11,422,192✔
1533
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,434,502✔
1534
        } else {
1535
          pIter->cv.cid = pTColumn->colId;
9,987,690✔
1536
          pIter->cv.value.type = pTColumn->type;
9,987,690✔
1537
          pIter->cv.flag = CV_FLAG_VALUE;
9,987,690✔
1538

1539
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
9,987,690!
1540
            pData += tGetU32v(pData, &pIter->cv.value.nData);
1,295,434!
1541
            if (pIter->cv.value.nData > 0) {
1,295,434!
1542
              pIter->cv.value.pData = pData;
2,334,730✔
1543
            } else {
1544
              pIter->cv.value.pData = NULL;
×
1545
            }
1546
          } else {
1547
            valueSetDatum(&pIter->cv.value, pTColumn->type, pData, pTColumn->bytes);
8,692,256✔
1548
          }
1549
        }
1550

1551
        pIter->iCol++;
11,922,580✔
1552
        goto _exit;
11,922,580✔
1553
      } else if (TABS(cid) > pTColumn->colId) {
×
1554
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
94✔
1555
        goto _exit;
94✔
1556
      } else {
1557
        uError("unexpected column id %d, %d", cid, pTColumn->colId);
×
1558
        goto _exit;
×
1559
      }
1560
    } else {
1561
      pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
4,136,691✔
1562
      goto _exit;
4,136,691✔
1563
    }
1564
  } else {  // Tuple
1565
    uint8_t bv = BIT_FLG_VALUE;
×
1566
    if (pIter->pb) {
×
1567
      switch (pIter->pRow->flag) {
5,640!
1568
        case (HAS_NULL | HAS_NONE):
3✔
1569
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
3✔
1570
          break;
3✔
1571
        case (HAS_VALUE | HAS_NONE):
47✔
1572
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
47✔
1573
          if (bv) bv++;
47✔
1574
          break;
47✔
1575
        case (HAS_VALUE | HAS_NULL):
5,590✔
1576
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
5,590✔
1577
          break;
5,590✔
1578
        case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1579
          bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
×
1580
          break;
×
1581
        default:
×
1582
          break;
×
1583
      }
1584

1585
      if (bv == BIT_FLG_NONE) {
5,640✔
1586
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
17✔
1587
        goto _exit;
17✔
1588
      } else if (bv == BIT_FLG_NULL) {
5,623✔
1589
        pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
704✔
1590
        goto _exit;
704✔
1591
      }
1592
    }
1593

1594
    pIter->cv.cid = pTColumn->colId;
×
1595
    pIter->cv.value.type = pTColumn->type;
×
1596
    pIter->cv.flag = CV_FLAG_VALUE;
×
1597
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
1598
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
×
1599
      pData += tGetU32v(pData, &pIter->cv.value.nData);
×
1600
      if (pIter->cv.value.nData > 0) {
×
1601
        pIter->cv.value.pData = pData;
3,027✔
1602
      } else {
1603
        pIter->cv.value.pData = NULL;
×
1604
      }
1605
    } else {
1606
      valueSetDatum(&pIter->cv.value, pTColumn->type, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
33,698✔
1607
    }
1608
    goto _exit;
36,739✔
1609
  }
1610

1611
_exit:
17,339,244✔
1612
  pIter->iTColumn++;
17,339,244✔
1613
  return &pIter->cv;
17,339,244✔
1614
}
1615

1616
static int32_t tRowNoneUpsertColData(SColData *aColData, int32_t nColData, int32_t flag) {
10,850✔
1617
  int32_t code = 0;
10,850✔
1618

1619
  if (flag) return code;
10,850✔
1620

1621
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
95,388✔
1622
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
89,433✔
1623
    if (code) return code;
89,471!
1624
  }
1625

1626
  return code;
5,955✔
1627
}
1628
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
180,657✔
1629
  int32_t code = 0;
180,657✔
1630

1631
  int32_t   iColData = 0;
180,657✔
1632
  SColData *pColData = &aColData[iColData];
180,657✔
1633
  int32_t   iTColumn = 1;
180,657✔
1634
  STColumn *pTColumn = &pSchema->columns[iTColumn];
180,657✔
1635

1636
  while (pColData) {
739,476✔
1637
    if (pTColumn) {
558,738!
1638
      if (pTColumn->colId == pColData->cid) {  // NULL
558,738✔
1639
        if (flag == 0) {
558,718!
1640
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
558,728✔
1641
        } else {
1642
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
×
1643
        }
1644
        if (code) goto _exit;
558,799!
1645

1646
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
558,799✔
1647
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
558,799✔
1648
      } else if (pTColumn->colId > pColData->cid) {  // NONE
20!
1649
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1650
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1651
      } else {
1652
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
20!
1653
      }
1654
    } else {  // NONE
1655
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1656
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1657
    }
1658
  }
1659

1660
_exit:
180,738✔
1661
  return code;
180,738✔
1662
}
1663
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
1,549,041,685✔
1664
                                      int32_t flag) {
1665
  int32_t code = 0;
1,549,041,685✔
1666

1667
  int32_t   iColData = 0;
1,549,041,685✔
1668
  SColData *pColData = &aColData[iColData];
1,549,041,685✔
1669
  int32_t   iTColumn = 1;
1,549,041,685✔
1670
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
1,549,041,685✔
1671

1672
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
1,549,041,685✔
1673
  SPrimaryKeyIndex index;
1674
  uint8_t         *data = pRow->data;
1,549,041,685✔
1675
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,021,672,561✔
1676
    data += tGetPrimaryKeyIndex(data, &index);
472,597,276✔
1677
  }
1678

1679
  switch (pRow->flag) {
1,549,075,285!
1680
    case HAS_VALUE:
1,534,031,038✔
1681
      pf = data;  // TODO: fix here
1,534,031,038✔
1682
      pv = pf + pTSchema->flen;
1,534,031,038✔
1683
      break;
1,534,031,038✔
1684
    case (HAS_NULL | HAS_NONE):
1,296✔
1685
      pb = data;
1,296✔
1686
      break;
1,296✔
1687
    case (HAS_VALUE | HAS_NONE):
15,125,598✔
1688
    case (HAS_VALUE | HAS_NULL):
1689
      pb = data;
15,125,598✔
1690
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
15,125,598✔
1691
      pv = pf + pTSchema->flen;
15,125,598✔
1692
      break;
15,125,598✔
1693
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1694
      pb = data;
×
1695
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
×
1696
      pv = pf + pTSchema->flen;
×
1697
      break;
×
1698
    default:
×
1699
      return TSDB_CODE_INVALID_DATA_FMT;
×
1700
  }
1701

1702
  while (pColData) {
2,147,483,647✔
1703
    if (pTColumn) {
2,147,483,647✔
1704
      if (pTColumn->colId == pColData->cid) {
2,147,483,647✔
1705
        if (!(pTColumn->type == pColData->type)) {
2,147,483,647!
1706
          return TSDB_CODE_INVALID_PARA;
×
1707
        }
1708
        if (pb) {
2,147,483,647✔
1709
          uint8_t bv;
1710
          switch (pRow->flag) {
53,526,264!
1711
            case (HAS_NULL | HAS_NONE):
25,920✔
1712
              bv = GET_BIT1(pb, iTColumn - 1);
25,920✔
1713
              break;
25,920✔
1714
            case (HAS_VALUE | HAS_NONE):
266,644✔
1715
              bv = GET_BIT1(pb, iTColumn - 1);
266,644✔
1716
              if (bv) bv++;
266,644✔
1717
              break;
266,644✔
1718
            case (HAS_VALUE | HAS_NULL):
53,232,660✔
1719
              bv = GET_BIT1(pb, iTColumn - 1) + 1;
53,232,660✔
1720
              break;
53,232,660✔
1721
            case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
1722
              bv = GET_BIT2(pb, iTColumn - 1);
×
1723
              break;
×
1724
            default:
1,040✔
1725
              return TSDB_CODE_INVALID_DATA_FMT;
1,040✔
1726
          }
1727

1728
          if (bv == BIT_FLG_NONE) {
53,525,224✔
1729
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
48,210!
1730
              goto _exit;
×
1731
            goto _continue;
48,214✔
1732
          } else if (bv == BIT_FLG_NULL) {
53,477,014✔
1733
            if (flag == 0) {
17,846,549✔
1734
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
17,844,528✔
1735
            } else {
1736
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
2,021✔
1737
            }
1738
            if (code) goto _exit;
17,847,275!
1739
            goto _continue;
17,847,275✔
1740
          }
1741
        }
1742

1743
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
1744
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
61,276,535!
1745
          uint32_t nData;
1746
          pData += tGetU32v(pData, &nData);
61,276,535✔
1747
          if (flag == 0) {
61,276,535!
1748
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
66,628,621✔
1749
          } else {
1750
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
1751
          }
1752
          if (code) goto _exit;
67,314,005!
1753
        } else {
1754
          if (flag == 0) {
2,147,483,647✔
1755
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
1756
                                                                          TYPE_BYTES[pColData->type]);
2,147,483,647✔
1757
          } else {
1758
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
3,009,958✔
1759
                                                                          TYPE_BYTES[pColData->type], flag > 0);
3,009,958✔
1760
          }
1761
          if (code) goto _exit;
2,147,483,647!
1762
        }
1763

1764
      _continue:
2,147,483,647✔
1765
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
1766
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
1767
      } else if (pTColumn->colId > pColData->cid) {  // NONE
274,522!
1768
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1769
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1770
      } else {
1771
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
274,522!
1772
      }
1773
    } else {
1774
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
597,381!
1775
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
597,373✔
1776
    }
1777
  }
1778

1779
_exit:
1,554,610,324✔
1780
  return code;
1,554,610,324✔
1781
}
1782
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
6,978,918✔
1783
  int32_t code = 0;
6,978,918✔
1784

1785
  uint8_t  *pv = NULL;
6,978,918✔
1786
  int32_t   iColData = 0;
6,978,918✔
1787
  SColData *pColData = &aColData[iColData];
6,978,918✔
1788
  int32_t   iTColumn = 1;
6,978,918✔
1789
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
6,978,918✔
1790
  int32_t   iCol = 0;
6,978,918✔
1791

1792
  // primary keys
1793
  uint8_t         *data = pRow->data;
6,978,918✔
1794
  SPrimaryKeyIndex index;
1795
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
7,430,767✔
1796
    data += tGetPrimaryKeyIndex(data, &index);
451,888✔
1797
  }
1798

1799
  SKVIdx *pKVIdx = (SKVIdx *)data;
6,978,879✔
1800
  if (pRow->flag & KV_FLG_LIT) {
6,978,879✔
1801
    pv = pKVIdx->idx + pKVIdx->nCol;
6,905,581✔
1802
  } else if (pRow->flag & KV_FLG_MID) {
73,298!
1803
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
74,779✔
1804
  } else if (pRow->flag & KV_FLG_BIG) {
×
1805
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
1806
  } else {
1807
    return TSDB_CODE_INVALID_PARA;
×
1808
  }
1809

1810
  while (pColData) {
116,713,312✔
1811
    if (pTColumn) {
109,693,971✔
1812
      if (pTColumn->colId == pColData->cid) {
109,294,707✔
1813
        while (iCol < pKVIdx->nCol) {
109,305,214✔
1814
          uint8_t *pData;
1815
          if (pRow->flag & KV_FLG_LIT) {
74,282,926✔
1816
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
72,191,866✔
1817
          } else if (pRow->flag & KV_FLG_MID) {
2,091,060!
1818
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
2,091,144✔
1819
          } else if (pRow->flag & KV_FLG_BIG) {
×
1820
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
1821
          } else {
1822
            return TSDB_CODE_INVALID_DATA_FMT;
×
1823
          }
1824

1825
          int16_t cid;
1826
          pData += tGetI16v(pData, &cid);
74,283,010✔
1827

1828
          if (TABS(cid) == pTColumn->colId) {
74,283,010✔
1829
            if (cid < 0) {
41,338,139✔
1830
              if (flag == 0) {
8,971,211✔
1831
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
8,967,671✔
1832
              } else {
1833
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
3,540✔
1834
              }
1835
              if (code) goto _exit;
8,607,817!
1836
            } else {
1837
              uint32_t nData;
1838
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
32,366,928!
1839
                pData += tGetU32v(pData, &nData);
6,795,819✔
1840
              } else {
1841
                nData = 0;
25,571,109✔
1842
              }
1843
              if (flag == 0) {
32,366,928!
1844
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
32,418,242✔
1845
              } else {
1846
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
1847
              }
1848
              if (code) goto _exit;
32,771,308!
1849
            }
1850
            iCol++;
41,379,125✔
1851
            goto _continue;
41,379,125✔
1852
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
32,944,871✔
1853
            break;
32,508,015✔
1854
          } else {
1855
            iCol++;
436,856✔
1856
          }
1857
        }
1858

1859
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
67,530,303!
1860

1861
      _continue:
67,528,219✔
1862
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
108,907,344✔
1863
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
108,907,344✔
1864
      } else if (pTColumn->colId > pColData->cid) {
426,349!
1865
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
1866
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
1867
      } else {
1868
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
426,349!
1869
      }
1870
    } else {
1871
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
399,264!
1872
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
399,259✔
1873
    }
1874
  }
1875

1876
_exit:
7,019,341✔
1877
  return code;
7,019,341✔
1878
}
1879
/* flag > 0: forward update
1880
 * flag == 0: append
1881
 * flag < 0: backward update
1882
 */
1883
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
1,556,319,100✔
1884
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
1,556,319,100!
1885
  if (!(nColData > 0)) return TSDB_CODE_INVALID_PARA;
1,556,319,100!
1886

1887
  if (pRow->flag == HAS_NONE) {
1,556,319,100✔
1888
    return tRowNoneUpsertColData(aColData, nColData, flag);
10,850✔
1889
  } else if (pRow->flag == HAS_NULL) {
1,556,308,250✔
1890
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
180,659✔
1891
  } else if (pRow->flag >> 4) {  // KV row
1,556,127,591✔
1892
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
6,980,873✔
1893
  } else {  // TUPLE row
1894
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
1,549,146,718✔
1895
  }
1896
}
1897

1898
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
2,147,483,647✔
1899
  key->numOfPKs = row->numOfPKs;
2,147,483,647✔
1900

1901
  if (key->numOfPKs == 0) {
2,147,483,647!
1902
    return;
×
1903
  }
1904

1905
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
1906

1907
  uint8_t *data = row->data;
2,147,483,647✔
1908

1909
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
1910
    data += tGetPrimaryKeyIndex(data, &indices[i]);
2,147,483,647✔
1911
  }
1912

1913
  // primary keys
1914
  for (int32_t i = 0; i < row->numOfPKs; i++) {
2,147,483,647✔
1915
    key->pks[i].type = indices[i].type;
2,147,483,647✔
1916

1917
    uint8_t *tdata = data + indices[i].offset;
2,147,483,647✔
1918
    if (row->flag >> 4) {
2,147,483,647✔
1919
      tdata += tGetI16v(tdata, NULL);
14,108,024✔
1920
    }
1921

1922
    if (IS_VAR_DATA_TYPE(indices[i].type)) {
2,147,483,647!
1923
      key->pks[i].pData = tdata;
2,336,008✔
1924
      key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
4,672,016✔
1925
    } else {
1926
      valueSetDatum(key->pks + i, indices[i].type, tdata, tDataTypes[indices[i].type].bytes);
2,147,483,647✔
1927
    }
1928
  }
1929
}
1930

1931
#define T_COMPARE_SCALAR_VALUE(TYPE, V1, V2)    \
1932
  do {                                          \
1933
    if (*(TYPE *)(V1) < *(TYPE *)(V2)) {        \
1934
      return -1;                                \
1935
    } else if (*(TYPE *)(V1) > *(TYPE *)(V2)) { \
1936
      return 1;                                 \
1937
    } else {                                    \
1938
      return 0;                                 \
1939
    }                                           \
1940
  } while (0)
1941

1942
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
98,625,286✔
1943
  switch (tv1->type) {
98,625,286!
1944
    case TSDB_DATA_TYPE_BOOL:
×
1945
    case TSDB_DATA_TYPE_TINYINT:
1946
      T_COMPARE_SCALAR_VALUE(int8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1947
    case TSDB_DATA_TYPE_SMALLINT:
×
1948
      T_COMPARE_SCALAR_VALUE(int16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1949
    case TSDB_DATA_TYPE_INT:
1,145,408✔
1950
      T_COMPARE_SCALAR_VALUE(int32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
1,145,408✔
1951
    case TSDB_DATA_TYPE_BIGINT:
93,330,207✔
1952
    case TSDB_DATA_TYPE_TIMESTAMP:
1953
      T_COMPARE_SCALAR_VALUE(int64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
93,330,207!
1954
    case TSDB_DATA_TYPE_FLOAT:
×
1955
      T_COMPARE_SCALAR_VALUE(float, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1956
    case TSDB_DATA_TYPE_DOUBLE:
×
1957
      T_COMPARE_SCALAR_VALUE(double, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1958
    case TSDB_DATA_TYPE_UTINYINT:
×
1959
      T_COMPARE_SCALAR_VALUE(uint8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1960
    case TSDB_DATA_TYPE_USMALLINT:
×
1961
      T_COMPARE_SCALAR_VALUE(uint16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
1962
    case TSDB_DATA_TYPE_UINT:
1,092,801✔
1963
      T_COMPARE_SCALAR_VALUE(uint32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
1,092,801✔
1964
    case TSDB_DATA_TYPE_UBIGINT:
1,119,869✔
1965
      T_COMPARE_SCALAR_VALUE(uint64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
1,119,869✔
1966
    case TSDB_DATA_TYPE_GEOMETRY:
1,933,724✔
1967
    case TSDB_DATA_TYPE_BINARY: {
1968
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
1,933,724✔
1969
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
1,933,724✔
1970
    }
1971
    case TSDB_DATA_TYPE_NCHAR: {
×
1972
      int32_t ret = taosUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
1973
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
1974
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
1975
    }
1976
    case TSDB_DATA_TYPE_VARBINARY: {
×
1977
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
1978
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
1979
    }
1980
    default:
3,277✔
1981
      break;
3,277✔
1982
  }
1983

1984
  return 0;
3,277✔
1985
}
1986

1987
// NOTE:
1988
// set key->numOfPKs to 0 as the smallest key with ts
1989
// set key->numOfPKs to (TD_MAX_PK_COLS + 1) as the largest key with ts
1990
FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
2,147,483,647✔
1991
  if (key1->ts < key2->ts) {
2,147,483,647!
1992
    return -1;
2,147,483,647✔
1993
  } else if (key1->ts > key2->ts) {
2,147,483,647!
1994
    return 1;
2,147,483,647✔
1995
  }
1996

1997
  if (key1->numOfPKs == key2->numOfPKs) {
93,892,033!
1998
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
160,815,898!
1999
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
98,612,269✔
2000
      if (ret) return ret;
98,584,425!
2001
    }
2002
  } else if (key1->numOfPKs < key2->numOfPKs) {
×
2003
    return -1;
×
2004
  } else {
2005
    return 1;
×
2006
  }
2007

2008
  return 0;
62,203,629✔
2009
}
2010

2011
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
1,169,873,573✔
2012
  pDst->ts = pSrc->ts;
1,169,873,573✔
2013
  pDst->numOfPKs = pSrc->numOfPKs;
1,169,873,573✔
2014

2015
  if (pSrc->numOfPKs > 0) {
1,169,873,573✔
2016
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
128,240,407✔
2017
      SValue *pVal = &pDst->pks[i];
63,764,481✔
2018
      pVal->type = pSrc->pks[i].type;
63,764,481✔
2019

2020
      valueCloneDatum(pVal, pSrc->pks + i, pVal->type);
63,764,481✔
2021
    }
2022
  }
2023
}
1,170,585,674✔
2024

2025
// STag ========================================
2026
static int tTagValCmprFn(const void *p1, const void *p2) {
251,040,292✔
2027
  if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
251,040,292✔
2028
    return -1;
87,503,976✔
2029
  } else if (((STagVal *)p1)->cid > ((STagVal *)p2)->cid) {
163,536,316✔
2030
    return 1;
90,054,184✔
2031
  }
2032

2033
  return 0;
73,482,132✔
2034
}
2035
static int tTagValJsonCmprFn(const void *p1, const void *p2) {
17,347✔
2036
  return strcmp(((STagVal *)p1)[0].pKey, ((STagVal *)p2)[0].pKey);
17,347✔
2037
}
2038

2039
#ifdef TD_DEBUG_PRINT_TAG
2040
static void debugPrintTagVal(int8_t type, const void *val, int32_t vlen, const char *tag, int32_t ln) {
2041
  switch (type) {
2042
    case TSDB_DATA_TYPE_VARBINARY:
2043
    case TSDB_DATA_TYPE_JSON:
2044
    case TSDB_DATA_TYPE_VARCHAR:
2045
    case TSDB_DATA_TYPE_NCHAR:
2046
    case TSDB_DATA_TYPE_GEOMETRY: {
2047
      char tmpVal[32] = {0};
2048
      tstrncpy(tmpVal, val, vlen > 31 ? 31 : vlen);
2049
      printf("%s:%d type:%d vlen:%d, val:\"%s\"\n", tag, ln, (int32_t)type, vlen, tmpVal);
2050
    } break;
2051
    case TSDB_DATA_TYPE_FLOAT:
2052
      printf("%s:%d type:%d vlen:%d, val:%f\n", tag, ln, (int32_t)type, vlen, *(float *)val);
2053
      break;
2054
    case TSDB_DATA_TYPE_DOUBLE:
2055
      printf("%s:%d type:%d vlen:%d, val:%lf\n", tag, ln, (int32_t)type, vlen, *(double *)val);
2056
      break;
2057
    case TSDB_DATA_TYPE_BOOL:
2058
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
2059
      break;
2060
    case TSDB_DATA_TYPE_TINYINT:
2061
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
2062
      break;
2063
    case TSDB_DATA_TYPE_SMALLINT:
2064
      printf("%s:%d type:%d vlen:%d, val:%" PRIi16 "\n", tag, ln, (int32_t)type, vlen, *(int16_t *)val);
2065
      break;
2066
    case TSDB_DATA_TYPE_INT:
2067
      printf("%s:%d type:%d vlen:%d, val:%" PRIi32 "\n", tag, ln, (int32_t)type, vlen, *(int32_t *)val);
2068
      break;
2069
    case TSDB_DATA_TYPE_BIGINT:
2070
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
2071
      break;
2072
    case TSDB_DATA_TYPE_TIMESTAMP:
2073
      printf("%s:%d type:%d vlen:%d, val:%" PRIi64 "\n", tag, ln, (int32_t)type, vlen, *(int64_t *)val);
2074
      break;
2075
    case TSDB_DATA_TYPE_UTINYINT:
2076
      printf("%s:%d type:%d vlen:%d, val:%" PRIu8 "\n", tag, ln, (int32_t)type, vlen, *(uint8_t *)val);
2077
      break;
2078
    case TSDB_DATA_TYPE_USMALLINT:
2079
      printf("%s:%d type:%d vlen:%d, val:%" PRIu16 "\n", tag, ln, (int32_t)type, vlen, *(uint16_t *)val);
2080
      break;
2081
    case TSDB_DATA_TYPE_UINT:
2082
      printf("%s:%d type:%d vlen:%d, val:%" PRIu32 "\n", tag, ln, (int32_t)type, vlen, *(uint32_t *)val);
2083
      break;
2084
    case TSDB_DATA_TYPE_UBIGINT:
2085
      printf("%s:%d type:%d vlen:%d, val:%" PRIu64 "\n", tag, ln, (int32_t)type, vlen, *(uint64_t *)val);
2086
      break;
2087
    case TSDB_DATA_TYPE_NULL:
2088
      printf("%s:%d type:%d vlen:%d, val:%" PRIi8 "\n", tag, ln, (int32_t)type, vlen, *(int8_t *)val);
2089
      break;
2090
    default:
2091
      break;
2092
  }
2093
}
2094

2095
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln) {
2096
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
2097
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
2098
  uint8_t *p = NULL;
2099
  int16_t  offset = 0;
2100

2101
  if (isLarge) {
2102
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
2103
  } else {
2104
    p = (uint8_t *)&pTag->idx[pTag->nTag];
2105
  }
2106
  printf("%s:%d >>> STAG === %s:%s, len: %d, nTag: %d, sver:%d\n", tag, ln, isJson ? "json" : "normal",
2107
         isLarge ? "large" : "small", (int32_t)pTag->len, (int32_t)pTag->nTag, pTag->ver);
2108
  for (uint16_t n = 0; n < pTag->nTag; ++n) {
2109
    if (isLarge) {
2110
      offset = ((int16_t *)pTag->idx)[n];
2111
    } else {
2112
      offset = pTag->idx[n];
2113
    }
2114
    STagVal tagVal = {0};
2115
    if (isJson) {
2116
      tagVal.pKey = (char *)POINTER_SHIFT(p, offset);
2117
    } else {
2118
      tagVal.cid = *(int16_t *)POINTER_SHIFT(p, offset);
2119
    }
2120
    printf("%s:%d loop[%d-%d] offset=%d\n", __func__, __LINE__, (int32_t)pTag->nTag, (int32_t)n, (int32_t)offset);
2121
    tGetTagVal(p + offset, &tagVal, isJson);
2122
    if (IS_VAR_DATA_TYPE(tagVal.type)) {
2123
      debugPrintTagVal(tagVal.type, tagVal.pData, tagVal.nData, __func__, __LINE__);
2124
    } else {
2125
      debugPrintTagVal(tagVal.type, &tagVal.i64, tDataTypes[tagVal.type].bytes, __func__, __LINE__);
2126
    }
2127
  }
2128
  printf("\n");
2129
}
2130
#endif
2131

2132
static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
1,178,280✔
2133
  int32_t n = 0;
1,178,280✔
2134

2135
  // key
2136
  if (isJson) {
1,178,280✔
2137
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
4,108✔
2138
  } else {
2139
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
2,352,452✔
2140
  }
2141

2142
  // type
2143
  n += tPutI8(p ? p + n : p, pTagVal->type);
1,178,280✔
2144

2145
  // value
2146
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
1,178,280!
2147
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
898,284✔
2148
  } else {
2149
    p = p ? p + n : p;
729,138✔
2150
    n += tDataTypes[pTagVal->type].bytes;
729,138✔
2151
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
729,138✔
2152
  }
2153

2154
  return n;
1,178,280✔
2155
}
2156
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
247,786,218✔
2157
  int32_t n = 0;
247,786,218✔
2158

2159
  // key
2160
  if (isJson) {
247,786,218✔
2161
    n += tGetCStr(p + n, &pTagVal->pKey);
40,308!
2162
  } else {
2163
    n += tGetI16v(p + n, &pTagVal->cid);
495,532,128!
2164
  }
2165

2166
  // type
2167
  n += tGetI8(p + n, &pTagVal->type);
247,786,218!
2168

2169
  // value
2170
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
247,786,218!
2171
    n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
82,352,638!
2172
  } else {
2173
    (void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
206,609,899✔
2174
    n += tDataTypes[pTagVal->type].bytes;
206,609,899✔
2175
  }
2176

2177
  return n;
247,786,218✔
2178
}
2179

2180
bool tTagIsJson(const void *pTag) { return (((const STag *)pTag)->flags & TD_TAG_JSON); }
50,131✔
2181

2182
bool tTagIsJsonNull(void *data) {
7,729✔
2183
  STag  *pTag = (STag *)data;
7,729✔
2184
  int8_t isJson = tTagIsJson(pTag);
7,729✔
2185
  if (!isJson) return false;
7,729✔
2186
  return ((STag *)data)->nTag == 0;
3,501✔
2187
}
2188

2189
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
239,350✔
2190
  int32_t  code = 0;
239,350✔
2191
  uint8_t *p = NULL;
239,350✔
2192
  int16_t  n = 0;
239,350✔
2193
  int16_t  nTag = taosArrayGetSize(pArray);
239,350✔
2194
  int32_t  szTag = 0;
239,367✔
2195
  int8_t   isLarge = 0;
239,367✔
2196

2197
  // sort
2198
  if (isJson) {
239,367✔
2199
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
658✔
2200
  } else {
2201
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
238,709✔
2202
  }
2203

2204
  // get size
2205
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
828,542✔
2206
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
589,151✔
2207
  }
2208
  if (szTag <= INT8_MAX) {
239,391✔
2209
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
221,192✔
2210
  } else {
2211
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
18,199✔
2212
    isLarge = 1;
18,199✔
2213
  }
2214

2215
  // build tag
2216
  (*ppTag) = (STag *)taosMemoryCalloc(szTag, 1);
239,391!
2217
  if ((*ppTag) == NULL) {
239,507!
2218
    code = terrno;
×
2219
    goto _err;
×
2220
  }
2221
  (*ppTag)->flags = 0;
239,507✔
2222
  if (isJson) {
239,507✔
2223
    (*ppTag)->flags |= TD_TAG_JSON;
658✔
2224
  }
2225
  if (isLarge) {
239,507✔
2226
    (*ppTag)->flags |= TD_TAG_LARGE;
18,249✔
2227
  }
2228
  (*ppTag)->len = szTag;
239,507✔
2229
  (*ppTag)->nTag = nTag;
239,507✔
2230
  (*ppTag)->ver = version;
239,507✔
2231

2232
  if (isLarge) {
239,507✔
2233
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
18,249✔
2234
  } else {
2235
    p = (uint8_t *)&(*ppTag)->idx[nTag];
221,258✔
2236
  }
2237
  n = 0;
239,507✔
2238
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
828,754✔
2239
    if (isLarge) {
589,300✔
2240
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
139,179✔
2241
    } else {
2242
      (*ppTag)->idx[iTag] = n;
450,121✔
2243
    }
2244
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
589,300✔
2245
  }
2246
#ifdef TD_DEBUG_PRINT_TAG
2247
  debugPrintSTag(*ppTag, __func__, __LINE__);
2248
#endif
2249

2250
  return code;
239,454✔
2251

2252
_err:
×
2253
  return code;
×
2254
}
2255

2256
void tTagFree(STag *pTag) {
2,123,892✔
2257
  if (pTag) taosMemoryFree(pTag);
2,123,892!
2258
}
2,123,892✔
2259

2260
char *tTagValToData(const STagVal *value, bool isJson) {
22,794,429✔
2261
  if (!value) {
22,794,429!
2262
    return NULL;
×
2263
  }
2264

2265
  char  *data = NULL;
22,794,429✔
2266
  int8_t typeBytes = 0;
22,794,429✔
2267
  if (isJson) {
22,794,429✔
2268
    typeBytes = CHAR_BYTES;
9,603✔
2269
  }
2270

2271
  if (IS_VAR_DATA_TYPE(value->type)) {
22,794,429!
2272
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
5,907,782!
2273
    if (data == NULL) {
5,911,877!
2274
      return NULL;
×
2275
    }
2276

2277
    if (isJson) {
5,911,877✔
2278
      *data = value->type;
5,630✔
2279
    }
2280

2281
    varDataLen(data + typeBytes) = value->nData;
5,911,877✔
2282
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
5,911,877✔
2283
  } else {
2284
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
16,886,647✔
2285
  }
2286

2287
  return data;
22,798,524✔
2288
}
2289

2290
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
73,629,808✔
2291
  if (!pTag || !pTagVal) {
73,629,808!
2292
    return false;
×
2293
  }
2294

2295
  int16_t  lidx = 0;
73,824,919✔
2296
  int16_t  ridx = pTag->nTag - 1;
73,824,919✔
2297
  int16_t  midx;
2298
  uint8_t *p;
2299
  int8_t   isJson = pTag->flags & TD_TAG_JSON;
73,824,919✔
2300
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
73,824,919✔
2301
  int16_t  offset;
2302
  STagVal  tv;
2303
  int      c;
2304

2305
  if (isLarge) {
73,824,919✔
2306
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
68,789,974✔
2307
  } else {
2308
    p = (uint8_t *)&pTag->idx[pTag->nTag];
5,034,945✔
2309
  }
2310

2311
  pTagVal->type = TSDB_DATA_TYPE_NULL;
73,824,919✔
2312
  pTagVal->pData = NULL;
73,824,919✔
2313
  pTagVal->nData = 0;
73,824,919✔
2314
  while (lidx <= ridx) {
250,615,973✔
2315
    midx = (lidx + ridx) / 2;
248,247,769✔
2316
    if (isLarge) {
248,247,769✔
2317
      offset = ((int16_t *)pTag->idx)[midx];
223,265,668✔
2318
    } else {
2319
      offset = pTag->idx[midx];
24,982,101✔
2320
    }
2321

2322
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
248,247,769✔
2323
    if (isJson) {
252,041,647✔
2324
      c = tTagValJsonCmprFn(pTagVal, &tv);
16,834✔
2325
    } else {
2326
      c = tTagValCmprFn(pTagVal, &tv);
252,024,813✔
2327
    }
2328

2329
    if (c < 0) {
254,117,774✔
2330
      ridx = midx - 1;
86,817,900✔
2331
    } else if (c > 0) {
167,299,874✔
2332
      lidx = midx + 1;
89,973,154✔
2333
    } else {
2334
      (void)memcpy(pTagVal, &tv, sizeof(tv));
77,326,720✔
2335
      return true;
77,326,720✔
2336
    }
2337
  }
2338
  return false;
2,368,204✔
2339
}
2340

2341
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag) {
1,054,087✔
2342
  return tEncodeBinary(pEncoder, (const uint8_t *)pTag, pTag->len);
2,108,174✔
2343
}
2344

2345
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
39,335,266✔
2346

2347
int32_t tTagToValArray(const STag *pTag, SArray **ppArray) {
2,550✔
2348
  int32_t  code = 0;
2,550✔
2349
  uint8_t *p = NULL;
2,550✔
2350
  STagVal  tv = {0};
2,550✔
2351
  int8_t   isLarge = pTag->flags & TD_TAG_LARGE;
2,550✔
2352
  int16_t  offset = 0;
2,550✔
2353

2354
  if (isLarge) {
2,550✔
2355
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
19✔
2356
  } else {
2357
    p = (uint8_t *)&pTag->idx[pTag->nTag];
2,531✔
2358
  }
2359

2360
  (*ppArray) = taosArrayInit(pTag->nTag + 1, sizeof(STagVal));
2,550✔
2361
  if (*ppArray == NULL) {
2,550!
2362
    code = terrno;
×
2363
    goto _err;
×
2364
  }
2365

2366
  for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
6,697✔
2367
    if (isLarge) {
4,147✔
2368
      offset = ((int16_t *)pTag->idx)[iTag];
22✔
2369
    } else {
2370
      offset = pTag->idx[iTag];
4,125✔
2371
    }
2372
    int32_t nt = tGetTagVal(p + offset, &tv, pTag->flags & TD_TAG_JSON);
4,147✔
2373
    if (taosArrayPush(*ppArray, &tv) == NULL) {
8,294!
2374
      code = terrno;
×
2375
      goto _err;
×
2376
    }
2377
  }
2378

2379
  return code;
2,550✔
2380

2381
_err:
×
2382
  return code;
×
2383
}
2384

2385
// STSchema ========================================
2386
STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
27,076,076✔
2387
  STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
27,076,076!
2388
  if (pTSchema == NULL) {
27,144,007!
2389
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2390
    return NULL;
×
2391
  }
2392

2393
  pTSchema->numOfCols = numOfCols;
27,144,007✔
2394
  pTSchema->version = version;
27,144,007✔
2395

2396
  // timestamp column
2397
  if (!(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
27,144,007!
2398
    terrno = TSDB_CODE_INVALID_PARA;
×
2399
    taosMemoryFree(pTSchema);
×
2400
    return NULL;
×
2401
  }
2402
  if (!(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID)) {
27,144,007!
2403
    terrno = TSDB_CODE_INVALID_PARA;
×
2404
    taosMemoryFree(pTSchema);
×
2405
    return NULL;
×
2406
  }
2407
  pTSchema->columns[0].colId = aSchema[0].colId;
27,144,007✔
2408
  pTSchema->columns[0].type = aSchema[0].type;
27,144,007✔
2409
  pTSchema->columns[0].flags = aSchema[0].flags;
27,144,007✔
2410
  pTSchema->columns[0].bytes = TYPE_BYTES[aSchema[0].type];
27,144,007✔
2411
  pTSchema->columns[0].offset = -1;
27,144,007✔
2412

2413
  // other columns
2414
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
347,058,526✔
2415
    SSchema  *pSchema = &aSchema[iCol];
319,914,519✔
2416
    STColumn *pTColumn = &pTSchema->columns[iCol];
319,914,519✔
2417

2418
    pTColumn->colId = pSchema->colId;
319,914,519✔
2419
    pTColumn->type = pSchema->type;
319,914,519✔
2420
    pTColumn->flags = pSchema->flags;
319,914,519✔
2421
    pTColumn->offset = pTSchema->flen;
319,914,519✔
2422

2423
    if (IS_VAR_DATA_TYPE(pSchema->type)) {
319,914,519!
2424
      pTColumn->bytes = pSchema->bytes;
51,132,446✔
2425
      pTSchema->tlen += (TYPE_BYTES[pSchema->type] + pSchema->bytes);  // todo: remove
51,132,446✔
2426
    } else {
2427
      pTColumn->bytes = TYPE_BYTES[pSchema->type];
268,782,073✔
2428
      pTSchema->tlen += TYPE_BYTES[pSchema->type];  // todo: remove
268,782,073✔
2429
    }
2430

2431
    pTSchema->flen += TYPE_BYTES[pTColumn->type];
319,914,519✔
2432
  }
2433

2434
#if 1  // todo : remove this
2435
  pTSchema->tlen += (int32_t)TD_BITMAP_BYTES(numOfCols);
27,144,007✔
2436
#endif
2437

2438
  return pTSchema;
27,144,007✔
2439
}
2440

2441
static int32_t tTColumnCompare(const void *p1, const void *p2) {
15,620,783✔
2442
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
15,620,783✔
2443
    return -1;
2,388,626✔
2444
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
13,232,157✔
2445
    return 1;
9,355,979✔
2446
  }
2447

2448
  return 0;
3,876,178✔
2449
}
2450

2451
const STColumn *tTSchemaSearchColumn(const STSchema *pTSchema, int16_t cid) {
3,877,479✔
2452
  STColumn tcol = {
3,877,479✔
2453
      .colId = cid,
2454
  };
2455

2456
  return taosbsearch(&tcol, pTSchema->columns, pTSchema->numOfCols, sizeof(STColumn), tTColumnCompare, TD_EQ);
3,877,479✔
2457
}
2458

2459
// SColData ========================================
2460
void tColDataDestroy(void *ph) {
37,651,643✔
2461
  if (ph) {
37,651,643!
2462
    SColData *pColData = (SColData *)ph;
37,651,923✔
2463

2464
    tFree(pColData->pBitMap);
37,651,923!
2465
    tFree(pColData->aOffset);
37,652,115✔
2466
    tFree(pColData->pData);
37,652,133!
2467
  }
2468
}
37,653,036✔
2469

2470
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
38,107,502✔
2471
  pColData->cid = cid;
38,107,502✔
2472
  pColData->type = type;
38,107,502✔
2473
  pColData->cflag = cflag;
38,107,502✔
2474
  tColDataClear(pColData);
38,107,502✔
2475
}
38,111,881✔
2476

2477
void tColDataClear(SColData *pColData) {
78,357,032✔
2478
  pColData->numOfNone = 0;
78,357,032✔
2479
  pColData->numOfNull = 0;
78,357,032✔
2480
  pColData->numOfValue = 0;
78,357,032✔
2481
  pColData->nVal = 0;
78,357,032✔
2482
  pColData->flag = 0;
78,357,032✔
2483
  pColData->nData = 0;
78,357,032✔
2484
}
78,357,032✔
2485

2486
void tColDataDeepClear(SColData *pColData) {
188,420✔
2487
  pColData->pBitMap = NULL;
188,420✔
2488
  pColData->aOffset = NULL;
188,420✔
2489
  pColData->pData = NULL;
188,420✔
2490

2491
  tColDataClear(pColData);
188,420✔
2492
}
188,451✔
2493

2494
static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData, uint32_t nData) {
2495
  int32_t  code = 0;
2,147,483,647✔
2496
  uint32_t cvtNData = sizeof(uint64_t);
2,147,483,647✔
2497
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
2498
    // TODO
2499
    if (IS_STR_DATA_BLOB(pColData->type)) {
119,665,490!
2500
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
×
2501
      if (code) goto _exit;
×
2502
      pColData->aOffset[pColData->nVal] =
×
2503
          (pColData->nVal > 0) ? pColData->aOffset[pColData->nVal - 1] + BSE_SEQUECE_SIZE : 0;
×
2504
      if (nData) {
×
2505
        code = tRealloc(&pColData->pData, pColData->nData + BSE_SEQUECE_SIZE);
×
2506
        if (code) goto _exit;
×
2507
        (void)memcpy(pColData->pData + pColData->nData, pData, BSE_SEQUECE_SIZE);
×
2508
        pColData->nData += BSE_SEQUECE_SIZE;
×
2509
      } else {
2510
        pColData->aOffset[pColData->nVal] = (pColData->nVal > 0) ? pColData->aOffset[pColData->nVal - 1] : 0;
×
2511
      }
2512

2513
    } else {
2514
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
138,732,310!
2515
      if (code) goto _exit;
138,854,765!
2516
      pColData->aOffset[pColData->nVal] = pColData->nData;
138,854,765✔
2517

2518
      if (nData) {
138,854,765!
2519
        code = tRealloc(&pColData->pData, pColData->nData + nData);
135,617,224!
2520
        if (code) goto _exit;
135,861,969!
2521
        (void)memcpy(pColData->pData + pColData->nData, pData, nData);
135,861,969✔
2522
        pColData->nData += nData;
135,861,969✔
2523
      }
2524
    }
2525
  } else {
2526
    if (!(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal)) {
2,147,483,647!
2527
      return TSDB_CODE_INVALID_PARA;
×
2528
    }
2529
    code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
2,147,483,647!
2530
    if (code) goto _exit;
2,147,483,647!
2531
    if (pData) {
2,147,483,647!
2532
      (void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
2,147,483,647✔
2533
    } else {
2534
      memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
53,447,660✔
2535
    }
2536
    pColData->nData += tDataTypes[pColData->type].bytes;
2,147,483,647✔
2537
  }
2538
  pColData->nVal++;
2,147,483,647✔
2539

2540
_exit:
2,147,483,647✔
2541
  return code;
2,147,483,647✔
2542
}
2543
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,489,844✔
2544
  pColData->flag = HAS_VALUE;
4,490,007✔
2545
  pColData->numOfValue++;
4,489,844✔
2546
  return tColDataPutValue(pColData, pData, nData);
4,491,848✔
2547
}
2548
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
340,496✔
2549
  pColData->flag = HAS_NONE;
340,496✔
2550
  pColData->numOfNone++;
340,496✔
2551
  pColData->nVal++;
340,496✔
2552
  return 0;
340,496✔
2553
}
2554
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
192,083✔
2555
  pColData->flag = HAS_NULL;
192,143✔
2556
  pColData->numOfNull++;
192,143✔
2557
  pColData->nVal++;
192,143✔
2558
  return 0;
192,083✔
2559
}
2560
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,487✔
2561
  int32_t code = 0;
1,487✔
2562

2563
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
1,487✔
2564
  code = tRealloc(&pColData->pBitMap, nBit);
1,487!
2565
  if (code) return code;
1,487!
2566

2567
  memset(pColData->pBitMap, 0, nBit);
1,487✔
2568
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
1,487!
2569

2570
  pColData->flag |= HAS_VALUE;
1,487✔
2571
  pColData->numOfValue++;
1,487✔
2572

2573
  if (pColData->nVal) {
1,487!
2574
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,488!
2575
      if (IS_STR_DATA_BLOB(pColData->type)) {
266!
2576
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
2577
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
2578
        if (code) return code;
×
2579
        memset(pColData->aOffset, 0, nOffset);
×
2580

2581
      } else {
2582
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
266✔
2583
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
266!
2584
        if (code) return code;
266!
2585
        memset(pColData->aOffset, 0, nOffset);
266✔
2586
      }
2587
    } else {
2588
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
1,222✔
2589
      code = tRealloc(&pColData->pData, pColData->nData);
1,222!
2590
      if (code) return code;
1,222!
2591
      memset(pColData->pData, 0, pColData->nData);
1,222✔
2592
    }
2593
  }
2594

2595
  return tColDataPutValue(pColData, pData, nData);
1,488✔
2596
}
2597
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, uint8_t *pData, uint32_t nData) {
93,931,270✔
2598
  pColData->nVal++;
93,931,270✔
2599
  pColData->numOfNone++;
93,931,270✔
2600
  return 0;
93,931,270✔
2601
}
2602
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, uint8_t *pData, uint32_t nData) {
601✔
2603
  int32_t code = 0;
601✔
2604

2605
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
601✔
2606
  code = tRealloc(&pColData->pBitMap, nBit);
601!
2607
  if (code) return code;
601!
2608

2609
  memset(pColData->pBitMap, 0, nBit);
601✔
2610
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
601!
2611

2612
  pColData->flag |= HAS_NULL;
601✔
2613
  pColData->numOfNull++;
601✔
2614
  pColData->nVal++;
601✔
2615

2616
  return code;
601✔
2617
}
2618
static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, uint8_t *pData, uint32_t nData) {
33,209✔
2619
  int32_t code = 0;
33,209✔
2620

2621
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
33,209✔
2622
  code = tRealloc(&pColData->pBitMap, nBit);
33,209!
2623
  if (code) return code;
33,209!
2624

2625
  memset(pColData->pBitMap, 0, nBit);
33,209✔
2626
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
33,209!
2627

2628
  pColData->flag |= HAS_VALUE;
33,209✔
2629
  pColData->numOfValue++;
33,209✔
2630

2631
  if (pColData->nVal) {
33,209!
2632
    if (IS_VAR_DATA_TYPE(pColData->type)) {
33,209!
2633
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
7,702✔
2634
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
7,702!
2635
      if (code) return code;
7,702!
2636
      memset(pColData->aOffset, 0, nOffset);
7,702✔
2637
    } else {
2638
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
25,507✔
2639
      code = tRealloc(&pColData->pData, pColData->nData);
25,507!
2640
      if (code) return code;
25,506!
2641
      memset(pColData->pData, 0, pColData->nData);
25,506✔
2642
    }
2643
  }
2644

2645
  return tColDataPutValue(pColData, pData, nData);
33,208✔
2646
}
2647
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, uint8_t *pData, uint32_t nData) {
10,080✔
2648
  int32_t code = 0;
10,080✔
2649

2650
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
10,080✔
2651
  code = tRealloc(&pColData->pBitMap, nBit);
10,080✔
2652
  if (code) return code;
10,080!
2653

2654
  memset(pColData->pBitMap, 255, nBit);
10,080✔
2655
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
10,080!
2656

2657
  pColData->flag |= HAS_NONE;
10,080✔
2658
  pColData->numOfNone++;
10,080✔
2659
  pColData->nVal++;
10,080✔
2660

2661
  return code;
10,080✔
2662
}
2663
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, uint8_t *pData, uint32_t nData) {
8,205,943✔
2664
  pColData->nVal++;
8,205,943✔
2665
  pColData->numOfNull++;
8,205,943✔
2666
  return 0;
8,205,943✔
2667
}
2668
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, uint8_t *pData, uint32_t nData) {
5✔
2669
  int32_t code = 0;
5✔
2670

2671
  pColData->flag |= HAS_VALUE;
5✔
2672
  pColData->numOfValue++;
5✔
2673

2674
  uint8_t *pBitMap = NULL;
5✔
2675
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
5!
2676
  if (code) return code;
5!
2677

2678
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,005!
2679
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
1,000!
2680
  }
2681
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
5!
2682

2683
  tFree(pColData->pBitMap);
5!
2684
  pColData->pBitMap = pBitMap;
5✔
2685

2686
  if (pColData->nVal) {
5!
2687
    if (IS_VAR_DATA_TYPE(pColData->type)) {
5!
2688
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
2689
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
2690
      if (code) return code;
×
2691
      memset(pColData->aOffset, 0, nOffset);
×
2692
    } else {
2693
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
5✔
2694
      code = tRealloc(&pColData->pData, pColData->nData);
5!
2695
      if (code) return code;
5!
2696
      memset(pColData->pData, 0, pColData->nData);
5✔
2697
    }
2698
  }
2699

2700
  return tColDataPutValue(pColData, pData, nData);
5✔
2701
}
2702
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,989,900✔
2703
  int32_t code = 0;
1,989,900✔
2704

2705
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,989,900!
2706
  if (code) return code;
1,989,900!
2707

2708
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
1,989,900✔
2709
  pColData->numOfNone++;
1,989,900✔
2710
  pColData->nVal++;
1,989,900✔
2711

2712
  return code;
1,989,900✔
2713
}
2714
static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, uint8_t *pData, uint32_t nData) {
9,368✔
2715
  int32_t code = 0;
9,368✔
2716

2717
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
9,368!
2718
  if (code) return code;
9,367!
2719

2720
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
9,367!
2721
  pColData->numOfNull++;
9,367✔
2722
  pColData->nVal++;
9,367✔
2723

2724
  return code;
9,367✔
2725
}
2726
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
2727
  pColData->numOfValue++;
2,147,483,647✔
2728
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
2729
}
2730
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, uint8_t *pData, uint32_t nData) {
147,855✔
2731
  int32_t code = 0;
147,855✔
2732

2733
  pColData->flag |= HAS_NONE;
147,855✔
2734
  pColData->numOfNone++;
147,855✔
2735

2736
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
147,855✔
2737
  code = tRealloc(&pColData->pBitMap, nBit);
147,855✔
2738
  if (code) return code;
147,912!
2739

2740
  memset(pColData->pBitMap, 255, nBit);
147,912✔
2741
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
147,912✔
2742

2743
  return tColDataPutValue(pColData, NULL, 0);
147,904✔
2744
}
2745
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
327,293✔
2746
  int32_t code = 0;
332,597✔
2747

2748
  pColData->flag |= HAS_NULL;
332,597✔
2749
  pColData->numOfNull++;
332,597✔
2750

2751
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
332,597✔
2752
  code = tRealloc(&pColData->pBitMap, nBit);
332,293✔
2753
  if (code) return code;
332,603!
2754

2755
  memset(pColData->pBitMap, 255, nBit);
332,603✔
2756
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
332,603!
2757

2758
  return tColDataPutValue(pColData, NULL, 0);
332,615✔
2759
}
2760
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,386,495✔
2761
  int32_t code = 0;
1,388,497✔
2762

2763
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,388,495!
2764
  if (code) return code;
1,389,050!
2765

2766
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
1,389,050!
2767
  pColData->numOfValue++;
1,389,050!
2768

2769
  return tColDataPutValue(pColData, pData, nData);
1,394,148✔
2770
}
2771
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
14,174,430✔
2772
  int32_t code = 0;
14,174,430✔
2773

2774
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
14,174,430!
2775
  if (code) return code;
14,174,463!
2776

2777
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
14,174,463✔
2778
  pColData->numOfNone++;
14,174,463✔
2779

2780
  return tColDataPutValue(pColData, NULL, 0);
14,178,380✔
2781
}
2782
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
12,467✔
2783
  int32_t code = 0;
12,467✔
2784

2785
  pColData->flag |= HAS_NULL;
12,467✔
2786
  pColData->numOfNull++;
12,467✔
2787

2788
  uint8_t *pBitMap = NULL;
12,467✔
2789
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
12,467!
2790
  if (code) return code;
12,467!
2791

2792
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,766,452!
2793
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
3,753,985!
2794
  }
2795
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
12,467!
2796

2797
  tFree(pColData->pBitMap);
12,467!
2798
  pColData->pBitMap = pBitMap;
12,467!
2799

2800
  return tColDataPutValue(pColData, NULL, 0);
12,467✔
2801
}
2802
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
515,260,434✔
2803
  int32_t code = 0;
515,263,396✔
2804

2805
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
515,262,996!
2806
  if (code) return code;
516,153,563!
2807
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
516,153,563!
2808
  pColData->numOfValue++;
516,153,563!
2809

2810
  return tColDataPutValue(pColData, pData, nData);
518,353,989✔
2811
}
2812
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
28,927✔
2813
  int32_t code = 0;
28,927✔
2814

2815
  pColData->flag |= HAS_NONE;
28,927✔
2816
  pColData->numOfNone++;
28,927✔
2817

2818
  uint8_t *pBitMap = NULL;
28,927✔
2819
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
28,927!
2820
  if (code) return code;
28,926!
2821

2822
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,656,512✔
2823
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
2,627,586✔
2824
  }
2825
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
28,926✔
2826

2827
  tFree(pColData->pBitMap);
28,926!
2828
  pColData->pBitMap = pBitMap;
28,926✔
2829

2830
  return tColDataPutValue(pColData, NULL, 0);
28,927✔
2831
}
2832
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
32,306,551✔
2833
  int32_t code = 0;
32,320,138✔
2834

2835
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
32,316,545!
2836
  if (code) return code;
32,328,067!
2837
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
32,328,067✔
2838
  pColData->numOfNull++;
32,328,067✔
2839

2840
  return tColDataPutValue(pColData, NULL, 0);
32,344,948✔
2841
}
2842
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
659,528✔
2843
  int32_t code = 0;
659,528✔
2844

2845
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
659,528!
2846
  if (code) return code;
659,528!
2847
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
659,528!
2848
  pColData->numOfValue++;
659,528!
2849

2850
  return tColDataPutValue(pColData, pData, nData);
659,528✔
2851
}
2852
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,955,078✔
2853
  int32_t code = 0;
4,955,078✔
2854

2855
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
4,955,078!
2856
  if (code) return code;
4,955,078!
2857
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
4,955,078✔
2858
  pColData->numOfNone++;
4,955,078!
2859

2860
  return tColDataPutValue(pColData, NULL, 0);
4,955,078✔
2861
}
2862
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
563,521✔
2863
  int32_t code = 0;
563,521✔
2864

2865
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
563,521!
2866
  if (code) return code;
563,521!
2867
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
563,521!
2868
  pColData->numOfNull++;
563,521!
2869

2870
  return tColDataPutValue(pColData, NULL, 0);
563,521✔
2871
}
2872
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData) = {
2873
    {tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02},  // 0
2874
    {tColDataAppendValue10, tColDataAppendValue11, tColDataAppendValue12},  // HAS_NONE
2875
    {tColDataAppendValue20, tColDataAppendValue21, tColDataAppendValue22},  // HAS_NULL
2876
    {tColDataAppendValue30, tColDataAppendValue31, tColDataAppendValue32},  // HAS_NULL|HAS_NONE
2877
    {tColDataAppendValue40, tColDataAppendValue41, tColDataAppendValue42},  // HAS_VALUE
2878
    {tColDataAppendValue50, tColDataAppendValue51, tColDataAppendValue52},  // HAS_VALUE|HAS_NONE
2879
    {tColDataAppendValue60, tColDataAppendValue61, tColDataAppendValue62},  // HAS_VALUE|HAS_NULL
2880
    {tColDataAppendValue70, tColDataAppendValue71, tColDataAppendValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
2881

2882
    //       VALUE                  NONE                     NULL
2883
};
2884

2885
static FORCE_INLINE int32_t tColDataPutValueBlob(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
2886
  int32_t  code = 0;
10✔
2887
  uint8_t  buf[sizeof(uint64_t) + 1] = {0};
10✔
2888
  uint64_t seq = 0;
10✔
2889

2890
  int32_t offset = 0;
10✔
2891
  if (IS_STR_DATA_BLOB(pColData->type)) {
×
2892
    code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
10!
2893
    if (code) goto _exit;
10!
2894
    pColData->aOffset[pColData->nVal] = pColData->nData;
10✔
2895
    if (nData) {
10!
2896
      SBlobItem item = {.seqOffsetInRow = seq, .dataLen = nData, .data = pData};
10✔
2897
      code = tBlobRowPush(pArg, &item, &seq, 0);
10✔
2898
      if (code != 0) return code;
10!
2899

2900
      offset = tPutU64(buf, seq);
10!
2901
      code = tRealloc(&pColData->pData, pColData->nData + offset);
10!
2902
      if (code != 0) return code;
10!
2903
      memcpy(pColData->pData + pColData->nData, buf, offset);
10✔
2904
      pColData->nData += offset;
10✔
2905
    }
2906
  }
2907
  pColData->nVal++;
10✔
2908

2909
_exit:
10✔
2910
  return code;
10✔
2911
}
2912

2913
static FORCE_INLINE int32_t tColDataAppendValueBlob00(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
1✔
2914
  pColData->flag = HAS_VALUE;
1✔
2915
  pColData->numOfValue++;
1!
2916
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
1✔
2917
}
2918
static FORCE_INLINE int32_t tColDataAppendValueBlob01(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2919
  pColData->flag = HAS_NONE;
×
2920
  pColData->numOfNone++;
×
2921
  pColData->nVal++;
×
2922
  return 0;
×
2923
}
2924
static FORCE_INLINE int32_t tColDataAppendValueBlob02(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2925
  pColData->flag = HAS_NULL;
×
2926
  pColData->numOfNull++;
×
2927
  pColData->nVal++;
×
2928
  return 0;
×
2929
}
2930
static FORCE_INLINE int32_t tColDataAppendValueBlob10(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2931
  int32_t code = 0;
×
2932

2933
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
2934
  code = tRealloc(&pColData->pBitMap, nBit);
×
2935
  if (code) return code;
×
2936

2937
  memset(pColData->pBitMap, 0, nBit);
×
2938
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
2939

2940
  pColData->flag |= HAS_VALUE;
×
2941
  pColData->numOfValue++;
×
2942

2943
  if (pColData->nVal) {
×
2944
    if (IS_VAR_DATA_TYPE(pColData->type)) {
×
2945
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
2946
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
2947
      if (code) return code;
×
2948
      memset(pColData->aOffset, 0, nOffset);
×
2949
    } else {
2950
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
×
2951
      code = tRealloc(&pColData->pData, pColData->nData);
×
2952
      if (code) return code;
×
2953
      memset(pColData->pData, 0, pColData->nData);
×
2954
    }
2955
  }
2956

2957
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
2958
}
2959
static FORCE_INLINE int32_t tColDataAppendValueBlob11(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2960
  pColData->nVal++;
×
2961
  pColData->numOfNone++;
×
2962
  return 0;
×
2963
}
2964
static FORCE_INLINE int32_t tColDataAppendValueBlob12(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2965
  int32_t code = 0;
×
2966

2967
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
2968
  code = tRealloc(&pColData->pBitMap, nBit);
×
2969
  if (code) return code;
×
2970

2971
  memset(pColData->pBitMap, 0, nBit);
×
2972
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
2973

2974
  pColData->flag |= HAS_NULL;
×
2975
  pColData->numOfNull++;
×
2976
  pColData->nVal++;
×
2977

2978
  return code;
×
2979
}
2980
static FORCE_INLINE int32_t tColDataAppendValueBlob20(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
2981
  int32_t code = 0;
×
2982

2983
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
2984
  code = tRealloc(&pColData->pBitMap, nBit);
×
2985
  if (code) return code;
×
2986

2987
  memset(pColData->pBitMap, 0, nBit);
×
2988
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
2989

2990
  pColData->flag |= HAS_VALUE;
×
2991
  pColData->numOfValue++;
×
2992

2993
  if (pColData->nVal) {
×
2994
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
2995
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
2996
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
2997
      if (code) return code;
×
2998
      memset(pColData->aOffset, 0, nOffset);
×
2999
    } else {
3000
      return TSDB_CODE_INVALID_MSG;
×
3001
    }
3002
  }
3003

3004
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3005
}
3006
static FORCE_INLINE int32_t tColDataAppendValueBlob21(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3007
  int32_t code = 0;
×
3008

3009
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3010
  code = tRealloc(&pColData->pBitMap, nBit);
×
3011
  if (code) return code;
×
3012

3013
  memset(pColData->pBitMap, 255, nBit);
×
3014
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3015

3016
  pColData->flag |= HAS_NONE;
×
3017
  pColData->numOfNone++;
×
3018
  pColData->nVal++;
×
3019

3020
  return code;
×
3021
}
3022
static FORCE_INLINE int32_t tColDataAppendValueBlob22(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3023
  pColData->nVal++;
×
3024
  pColData->numOfNull++;
×
3025
  return 0;
×
3026
}
3027
static FORCE_INLINE int32_t tColDataAppendValueBlob30(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3028
  int32_t code = 0;
×
3029

3030
  pColData->flag |= HAS_VALUE;
×
3031
  pColData->numOfValue++;
×
3032

3033
  uint8_t *pBitMap = NULL;
×
3034
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3035
  if (code) return code;
×
3036

3037
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3038
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal));
×
3039
  }
3040
  SET_BIT2_EX(pBitMap, pColData->nVal, 2);
×
3041

3042
  tFree(pColData->pBitMap);
×
3043
  pColData->pBitMap = pBitMap;
×
3044

3045
  if (pColData->nVal) {
×
3046
    if (IS_STR_DATA_BLOB(pColData->type)) {
×
3047
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3048
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3049
      if (code) return code;
×
3050
      memset(pColData->aOffset, 0, nOffset);
×
3051
    } else {
3052
      return TSDB_CODE_INVALID_MSG;
×
3053
    }
3054
  }
3055

3056
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3057
}
3058
static FORCE_INLINE int32_t tColDataAppendValueBlob31(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3059
  int32_t code = 0;
×
3060

3061
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3062
  if (code) return code;
×
3063

3064
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3065
  pColData->numOfNone++;
×
3066
  pColData->nVal++;
×
3067

3068
  return code;
×
3069
}
3070
static FORCE_INLINE int32_t tColDataAppendValueBlob32(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3071
  int32_t code = 0;
×
3072

3073
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3074
  if (code) return code;
×
3075

3076
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3077
  pColData->numOfNull++;
×
3078
  pColData->nVal++;
×
3079

3080
  return code;
×
3081
}
3082
static FORCE_INLINE int32_t tColDataAppendValueBlob40(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
9✔
3083
  pColData->numOfValue++;
9!
3084
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
9✔
3085
}
3086
static FORCE_INLINE int32_t tColDataAppendValueBlob41(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3087
  int32_t code = 0;
×
3088

3089
  pColData->flag |= HAS_NONE;
×
3090
  pColData->numOfNone++;
×
3091

3092
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3093
  code = tRealloc(&pColData->pBitMap, nBit);
×
3094
  if (code) return code;
×
3095

3096
  memset(pColData->pBitMap, 255, nBit);
×
3097
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3098

3099
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3100
}
3101
static FORCE_INLINE int32_t tColDataAppendValueBlob42(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3102
  int32_t code = 0;
×
3103

3104
  pColData->flag |= HAS_NULL;
×
3105
  pColData->numOfNull++;
×
3106

3107
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
×
3108
  code = tRealloc(&pColData->pBitMap, nBit);
×
3109
  if (code) return code;
×
3110

3111
  memset(pColData->pBitMap, 255, nBit);
×
3112
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3113

3114
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3115
}
3116
static FORCE_INLINE int32_t tColDataAppendValueBlob50(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3117
  int32_t code = 0;
×
3118

3119
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3120
  if (code) return code;
×
3121

3122
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3123
  pColData->numOfValue++;
×
3124

3125
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3126
}
3127
static FORCE_INLINE int32_t tColDataAppendValueBlob51(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3128
  int32_t code = 0;
×
3129

3130
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3131
  if (code) return code;
×
3132

3133
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3134
  pColData->numOfNone++;
×
3135

3136
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3137
}
3138
static FORCE_INLINE int32_t tColDataAppendValueBlob52(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3139
  int32_t code = 0;
×
3140

3141
  pColData->flag |= HAS_NULL;
×
3142
  pColData->numOfNull++;
×
3143

3144
  uint8_t *pBitMap = NULL;
×
3145
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3146
  if (code) return code;
×
3147

3148
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3149
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
×
3150
  }
3151
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
×
3152

3153
  tFree(pColData->pBitMap);
×
3154
  pColData->pBitMap = pBitMap;
×
3155

3156
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3157
}
3158
static FORCE_INLINE int32_t tColDataAppendValueBlob60(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3159
  int32_t code = 0;
×
3160

3161
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3162
  if (code) return code;
×
3163
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3164
  pColData->numOfValue++;
×
3165

3166
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3167
}
3168
static FORCE_INLINE int32_t tColDataAppendValueBlob61(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3169
  int32_t code = 0;
×
3170

3171
  pColData->flag |= HAS_NONE;
×
3172
  pColData->numOfNone++;
×
3173

3174
  uint8_t *pBitMap = NULL;
×
3175
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3176
  if (code) return code;
×
3177

3178
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
3179
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
×
3180
  }
3181
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
×
3182

3183
  tFree(pColData->pBitMap);
×
3184
  pColData->pBitMap = pBitMap;
×
3185

3186
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3187
}
3188
static FORCE_INLINE int32_t tColDataAppendValueBlob62(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3189
  int32_t code = 0;
×
3190

3191
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
×
3192
  if (code) return code;
×
3193
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3194
  pColData->numOfNull++;
×
3195

3196
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3197
}
3198
static FORCE_INLINE int32_t tColDataAppendValueBlob70(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3199
  int32_t code = 0;
×
3200

3201
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3202
  if (code) return code;
×
3203
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
×
3204
  pColData->numOfValue++;
×
3205

3206
  return tColDataPutValueBlob(pArg, pColData, pData, nData);
×
3207
}
3208
static FORCE_INLINE int32_t tColDataAppendValueBlob71(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3209
  int32_t code = 0;
×
3210

3211
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3212
  if (code) return code;
×
3213
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
×
3214
  pColData->numOfNone++;
×
3215

3216
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3217
}
3218
static FORCE_INLINE int32_t tColDataAppendValueBlob72(void *pArg, SColData *pColData, uint8_t *pData, uint32_t nData) {
×
3219
  int32_t code = 0;
×
3220

3221
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
×
3222
  if (code) return code;
×
3223
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
×
3224
  pColData->numOfNull++;
×
3225

3226
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3227
}
3228

3229
static int32_t (*tColDataAppendValueBlobImpl[8][3])(void *pDst, SColData *pColData, uint8_t *pData, uint32_t nData) = {
3230
    {tColDataAppendValueBlob00, tColDataAppendValueBlob01, tColDataAppendValueBlob02},  // 0
3231
    {tColDataAppendValueBlob10, tColDataAppendValueBlob11, tColDataAppendValueBlob12},  // HAS_NONE
3232
    {tColDataAppendValueBlob20, tColDataAppendValueBlob21, tColDataAppendValueBlob22},  // HAS_NULL
3233
    {tColDataAppendValueBlob30, tColDataAppendValueBlob31, tColDataAppendValueBlob32},  // HAS_NULL|HAS_NONE
3234
    {tColDataAppendValueBlob40, tColDataAppendValueBlob41, tColDataAppendValueBlob42},  // HAS_VALUE
3235
    {tColDataAppendValueBlob50, tColDataAppendValueBlob51, tColDataAppendValueBlob52},  // HAS_VALUE|HAS_NONE
3236
    {tColDataAppendValueBlob60, tColDataAppendValueBlob61, tColDataAppendValueBlob62},  // HAS_VALUE|HAS_NULL
3237
    {tColDataAppendValueBlob70, tColDataAppendValueBlob71, tColDataAppendValueBlob72}   // HAS_VALUE|HAS_NULL|HAS_NONE
3238
    //       VALUE                  NONE                     NULL
3239
};
3240
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal) {
2,147,483,647✔
3241
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) {
2,147,483,647!
3242
    return TSDB_CODE_INVALID_PARA;
×
3243
  }
3244
  return tColDataAppendValueImpl[pColData->flag][pColVal->flag](
2,147,483,647✔
3245
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData);
2,147,483,647!
3246
}
3247

3248
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
14✔
3249
  pColData->numOfNone--;
14✔
3250
  pColData->nVal--;
14✔
3251
  if (pColData->numOfNone) {
14!
3252
    return tColDataAppendValue10(pColData, pData, nData);
×
3253
  } else {
3254
    pColData->flag = 0;
14✔
3255
    return tColDataAppendValue00(pColData, pData, nData);
14✔
3256
  }
3257
}
3258
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24✔
3259
  pColData->numOfNone--;
24✔
3260
  pColData->nVal--;
24✔
3261
  if (pColData->numOfNone) {
24!
3262
    return tColDataAppendValue12(pColData, pData, nData);
×
3263
  } else {
3264
    pColData->flag = 0;
24✔
3265
    return tColDataAppendValue02(pColData, pData, nData);
24✔
3266
  }
3267
  return 0;
3268
}
3269
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
149✔
3270
  if (forward) {
149!
3271
    pColData->numOfNull--;
149✔
3272
    pColData->nVal--;
149✔
3273
    if (pColData->numOfNull) {
149!
3274
      return tColDataAppendValue20(pColData, pData, nData);
×
3275
    } else {
3276
      pColData->flag = 0;
149✔
3277
      return tColDataAppendValue00(pColData, pData, nData);
149✔
3278
    }
3279
  }
3280
  return 0;
×
3281
}
3282
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
3283
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
3284
    pColData->numOfNone--;
×
3285
    pColData->nVal--;
×
3286
    if (pColData->numOfNone) {
×
3287
      return tColDataAppendValue30(pColData, pData, nData);
×
3288
    } else {
3289
      pColData->flag = HAS_NULL;
×
3290
      return tColDataAppendValue20(pColData, pData, nData);
×
3291
    }
3292
  } else if (forward) {  // NULL ==> VALUE
×
3293
    pColData->numOfNull--;
×
3294
    pColData->nVal--;
×
3295
    if (pColData->numOfNull) {
×
3296
      return tColDataAppendValue30(pColData, pData, nData);
×
3297
    } else {
3298
      pColData->flag = HAS_NONE;
×
3299
      return tColDataAppendValue10(pColData, pData, nData);
×
3300
    }
3301
  }
3302
  return 0;
×
3303
}
3304
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
80✔
3305
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
80!
3306
    pColData->numOfNone--;
80✔
3307
    pColData->numOfNull++;
80✔
3308
    if (pColData->numOfNone) {
80!
3309
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
×
3310
    } else {
3311
      pColData->flag = HAS_NULL;
80✔
3312
    }
3313
  }
3314
  return 0;
80✔
3315
}
3316
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
48,777,310✔
3317
  if (forward) {  // VALUE ==> VALUE
48,777,310!
3318
    pColData->nVal--;
48,777,484✔
3319
    if (IS_VAR_DATA_TYPE(pColData->type)) {
48,777,484!
3320
      pColData->nData = pColData->aOffset[pColData->nVal];
1,258,690✔
3321
    } else {
3322
      pColData->nData -= TYPE_BYTES[pColData->type];
47,518,794✔
3323
    }
3324
    return tColDataPutValue(pColData, pData, nData);
48,798,874✔
3325
  }
3326
  return 0;
×
3327
}
3328
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
5,036✔
3329
  if (forward) {  // VALUE ==> NULL
5,036!
3330
    pColData->numOfValue--;
5,036✔
3331
    pColData->nVal--;
5,036✔
3332
    if (pColData->numOfValue) {
5,036✔
3333
      if (IS_VAR_DATA_TYPE(pColData->type)) {
5,000!
3334
        pColData->nData = pColData->aOffset[pColData->nVal];
999✔
3335
      } else {
3336
        pColData->nData -= TYPE_BYTES[pColData->type];
4,001✔
3337
      }
3338
      return tColDataAppendValue42(pColData, pData, nData);
5,001✔
3339
    } else {
3340
      pColData->flag = 0;
36✔
3341
      pColData->nData = 0;
36✔
3342
      return tColDataAppendValue02(pColData, pData, nData);
36✔
3343
    }
3344
  }
3345
  return 0;
×
3346
}
3347
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
43,614✔
3348
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
43,614✔
3349
    pColData->numOfNone--;
5,597✔
3350
    pColData->nVal--;
5,597✔
3351
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
5,597!
3352
      pColData->nData -= TYPE_BYTES[pColData->type];
4,476✔
3353
    }
3354
    if (pColData->numOfNone) {
5,597✔
3355
      return tColDataAppendValue50(pColData, pData, nData);
2,000✔
3356
    } else {
3357
      pColData->flag = HAS_VALUE;
3,597✔
3358
      return tColDataAppendValue40(pColData, pData, nData);
3,597✔
3359
    }
3360
  } else if (forward) {  // VALUE ==> VALUE
38,017!
3361
    pColData->nVal--;
38,017✔
3362
    if (IS_VAR_DATA_TYPE(pColData->type)) {
38,017!
3363
      pColData->nData = pColData->aOffset[pColData->nVal];
5,429✔
3364
    } else {
3365
      pColData->nData -= TYPE_BYTES[pColData->type];
32,588✔
3366
    }
3367
    return tColDataPutValue(pColData, pData, nData);
38,046✔
3368
  }
3369
  return 0;
×
3370
}
3371
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
303✔
3372
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
303!
3373
    pColData->numOfNone--;
304✔
3374
    pColData->nVal--;
304✔
3375
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
304!
3376
      pColData->nData -= TYPE_BYTES[pColData->type];
244✔
3377
    }
3378
    if (pColData->numOfNone) {
304!
3379
      return tColDataAppendValue52(pColData, pData, nData);
×
3380
    } else {
3381
      pColData->flag = HAS_VALUE;
304✔
3382
      return tColDataAppendValue42(pColData, pData, nData);
302✔
3383
    }
3384
  } else if (forward) {  // VALUE ==> NULL
×
3385
    pColData->numOfValue--;
×
3386
    pColData->nVal--;
×
3387
    if (pColData->numOfValue) {
×
3388
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3389
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3390
      } else {
3391
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3392
      }
3393
      return tColDataAppendValue52(pColData, pData, nData);
×
3394
    } else {
3395
      pColData->flag = HAS_NONE;
×
3396
      pColData->nData = 0;
×
3397
      return tColDataAppendValue12(pColData, pData, nData);
×
3398
    }
3399
  }
3400
  return 0;
×
3401
}
3402
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
32,246✔
3403
  if (forward) {
32,246!
3404
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
32,248✔
3405
      pColData->numOfNull--;
22,584✔
3406
      pColData->nVal--;
22,584✔
3407
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
22,584!
3408
        pColData->nData -= TYPE_BYTES[pColData->type];
17,902✔
3409
      }
3410
      if (pColData->numOfNull) {
22,584✔
3411
        return tColDataAppendValue60(pColData, pData, nData);
2,562✔
3412
      } else {
3413
        pColData->flag = HAS_VALUE;
20,022✔
3414
        return tColDataAppendValue40(pColData, pData, nData);
20,024✔
3415
      }
3416
    } else {  // VALUE ==> VALUE
3417
      pColData->nVal--;
9,664✔
3418
      if (IS_VAR_DATA_TYPE(pColData->type)) {
9,664!
3419
        pColData->nData = pColData->aOffset[pColData->nVal];
2,355✔
3420
      } else {
3421
        pColData->nData -= TYPE_BYTES[pColData->type];
7,309✔
3422
      }
3423
      return tColDataPutValue(pColData, pData, nData);
9,665✔
3424
    }
3425
  }
3426
  return 0;
×
3427
}
3428
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24,357✔
3429
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
24,357!
3430
    pColData->numOfValue--;
9,994✔
3431
    pColData->nVal--;
9,994✔
3432
    if (pColData->numOfValue) {
9,994!
3433
      if (IS_VAR_DATA_TYPE(pColData->type)) {
9,994!
3434
        pColData->nData = pColData->aOffset[pColData->nVal];
2,201✔
3435
      } else {
3436
        pColData->nData -= TYPE_BYTES[pColData->type];
7,793✔
3437
      }
3438
      return tColDataAppendValue62(pColData, pData, nData);
9,996✔
3439
    } else {
3440
      pColData->flag = HAS_NULL;
×
3441
      pColData->nData = 0;
×
3442
      return tColDataAppendValue20(pColData, pData, nData);
×
3443
    }
3444
  }
3445
  return 0;
14,363✔
3446
}
3447
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
402✔
3448
  int32_t code = 0;
402✔
3449

3450
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
402✔
3451
  if (bv == 0) {  // NONE ==> VALUE
402✔
3452
    pColData->numOfNone--;
400✔
3453
    pColData->nVal--;
400✔
3454
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
400!
3455
      pColData->nData -= TYPE_BYTES[pColData->type];
320✔
3456
    }
3457
    if (pColData->numOfNone) {
400!
3458
      return tColDataAppendValue70(pColData, pData, nData);
×
3459
    } else {
3460
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
21,200✔
3461
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
20,800✔
3462
      }
3463
      pColData->flag = (HAS_VALUE | HAS_NULL);
400!
3464
      return tColDataAppendValue60(pColData, pData, nData);
400✔
3465
    }
3466
  } else if (bv == 1) {  // NULL ==> VALUE
2!
3467
    if (forward) {
2!
3468
      pColData->numOfNull--;
2✔
3469
      pColData->nVal--;
2✔
3470
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
2!
3471
        pColData->nData -= TYPE_BYTES[pColData->type];
2✔
3472
      }
3473
      if (pColData->numOfNull) {
2!
3474
        return tColDataAppendValue70(pColData, pData, nData);
×
3475
      } else {
3476
        for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
6✔
3477
          SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0);
4✔
3478
        }
3479
        pColData->flag = (HAS_VALUE | HAS_NONE);
2!
3480
        return tColDataAppendValue50(pColData, pData, nData);
2✔
3481
      }
3482
    }
3483
  } else if (bv == 2) {  // VALUE ==> VALUE
×
3484
    if (forward) {
×
3485
      pColData->nVal--;
×
3486
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3487
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3488
      } else {
3489
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3490
      }
3491
      return tColDataPutValue(pColData, pData, nData);
×
3492
    }
3493
  } else {
3494
    return TSDB_CODE_INVALID_PARA;
×
3495
  }
3496
  return 0;
×
3497
}
3498
static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,592✔
3499
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
3,592✔
3500
  if (bv == 0) {  // NONE ==> NULL
3,592!
3501
    pColData->numOfNone--;
3,593✔
3502
    pColData->nVal--;
3,593✔
3503
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
3,593!
3504
      pColData->nData -= TYPE_BYTES[pColData->type];
2,543✔
3505
    }
3506
    if (pColData->numOfNone) {
3,593!
3507
      return tColDataAppendValue72(pColData, pData, nData);
×
3508
    } else {
3509
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
114,298✔
3510
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
110,705✔
3511
      }
3512
      pColData->flag = (HAS_VALUE | HAS_NULL);
3,593✔
3513
      return tColDataAppendValue62(pColData, pData, nData);
3,592✔
3514
    }
3515
  } else if (bv == 2 && forward) {  // VALUE ==> NULL
×
3516
    pColData->numOfValue--;
×
3517
    pColData->nVal--;
×
3518
    if (pColData->numOfValue) {
×
3519
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3520
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3521
      } else {
3522
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3523
      }
3524
      return tColDataAppendValue72(pColData, pData, nData);
×
3525
    } else {
3526
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
3527
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal));
×
3528
      }
3529
      pColData->flag = (HAS_NULL | HAS_NONE);
×
3530
      pColData->nData = 0;
×
3531
      return tColDataAppendValue32(pColData, pData, nData);
×
3532
    }
3533
  }
3534
  return 0;
×
3535
}
3536
static FORCE_INLINE int32_t tColDataUpdateNothing(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
14,300✔
3537
  return 0;
14,300✔
3538
}
3539
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) = {
3540
    {NULL, NULL, NULL},                                                     // 0
3541
    {tColDataUpdateValue10, tColDataUpdateNothing, tColDataUpdateValue12},  // HAS_NONE
3542
    {tColDataUpdateValue20, tColDataUpdateNothing, tColDataUpdateNothing},  // HAS_NULL
3543
    {tColDataUpdateValue30, tColDataUpdateNothing, tColDataUpdateValue32},  // HAS_NULL|HAS_NONE
3544
    {tColDataUpdateValue40, tColDataUpdateNothing, tColDataUpdateValue42},  // HAS_VALUE
3545
    {tColDataUpdateValue50, tColDataUpdateNothing, tColDataUpdateValue52},  // HAS_VALUE|HAS_NONE
3546
    {tColDataUpdateValue60, tColDataUpdateNothing, tColDataUpdateValue62},  // HAS_VALUE|HAS_NULL
3547
    {tColDataUpdateValue70, tColDataUpdateNothing, tColDataUpdateValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
3548

3549
    //    VALUE             NONE        NULL
3550
};
3551
int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward) {
47,120,434✔
3552
  if (!(pColData->cid == pColVal->cid && pColData->type == pColVal->value.type)) return TSDB_CODE_INVALID_PARA;
47,120,434!
3553
  if (!(pColData->nVal > 0)) return TSDB_CODE_INVALID_PARA;
47,120,697!
3554

3555
  if (tColDataUpdateValueImpl[pColData->flag][pColVal->flag] == NULL) return 0;
47,120,697!
3556

3557
  return tColDataUpdateValueImpl[pColData->flag][pColVal->flag](
47,120,697✔
3558
      pColData, VALUE_GET_DATUM(&pColVal->value, pColData->type), pColVal->value.nData, forward);
47,120,697!
3559
}
3560

3561
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
138,691,735✔
3562
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
138,691,735✔
3563
}
138,691,735✔
3564
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
3,423,068✔
3565
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
3,423,068✔
3566
}
3,423,068✔
3567
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
15,910✔
3568
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
3569
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
15,910!
3570
    case 0:
1,450✔
3571
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,450✔
3572
      break;
1,450✔
3573
    case 1:
14,467✔
3574
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
14,467✔
3575
      break;
14,467✔
3576
    default:
×
3577
      break;
×
3578
  }
3579
}
15,910✔
3580
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
3581
  SValue value = {.type = pColData->type};
2,147,483,647✔
3582
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
3583
    if (iVal + 1 < pColData->nVal) {
322,478,411!
3584
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
337,663,933✔
3585
    } else {
3586
      value.nData = pColData->nData - pColData->aOffset[iVal];
×
3587
    }
3588
    value.pData = pColData->pData + pColData->aOffset[iVal];
322,478,411✔
3589
  } else {
3590
    valueSetDatum(&value, pColData->type, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
3591
                  tDataTypes[pColData->type].bytes);
2,147,483,647✔
3592
  }
3593
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
3594
}
239,464,128✔
3595
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
11,669,173✔
3596
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
3597
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
11,669,173!
3598
    case 0:
5,900,476✔
3599
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
5,900,476✔
3600
      break;
5,900,476✔
3601
    case 1:
5,940,400✔
3602
      tColDataGetValue4(pColData, iVal, pColVal);
3603
      break;
5,981,861✔
3604
    default:
×
3605
      break;
×
3606
  }
3607
}
11,710,634✔
3608
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
263,753,820✔
3609
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
3610
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
263,753,820!
3611
    case 0:
31,946,247✔
3612
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
31,946,247✔
3613
      break;
31,946,247✔
3614
    case 1:
232,213,210✔
3615
      tColDataGetValue4(pColData, iVal, pColVal);
3616
      break;
233,462,288✔
3617
    default:
×
3618
      break;
×
3619
  }
3620
}
265,002,898✔
3621
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
22✔
3622
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
3623
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
22!
3624
    case 0:
10✔
3625
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
10✔
3626
      break;
10✔
3627
    case 1:
10✔
3628
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
10✔
3629
      break;
10✔
3630
    case 2:
2!
3631
      tColDataGetValue4(pColData, iVal, pColVal);
3632
      break;
2✔
3633
    default:
×
3634
      break;
×
3635
  }
3636
}
22✔
3637
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
3638
    NULL,               // 0
3639
    tColDataGetValue1,  // HAS_NONE
3640
    tColDataGetValue2,  // HAS_NULL
3641
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
3642
    tColDataGetValue4,  // HAS_VALUE
3643
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
3644
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
3645
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
3646
};
3647
int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
3648
  if (iVal < 0 || iVal >= pColData->nVal ||
2,147,483,647!
3649
      (pColData->flag <= 0 || pColData->flag >= sizeof(tColDataGetValueImpl) / POINTER_BYTES)) {
2,147,483,647!
3650
    return TSDB_CODE_INVALID_PARA;
×
3651
  }
3652
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
3653
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
3654
}
3655

3656
uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
768,217,446✔
3657
  switch (pColData->flag) {
768,217,446!
3658
    case HAS_NONE:
×
3659
      return 0;
×
3660
    case HAS_NULL:
×
3661
      return 1;
×
3662
    case (HAS_NULL | HAS_NONE):
15,945✔
3663
      return GET_BIT1(pColData->pBitMap, iVal);
15,945✔
3664
    case HAS_VALUE:
×
3665
      return 2;
×
3666
    case (HAS_VALUE | HAS_NONE):
26,988,294✔
3667
      return (GET_BIT1(pColData->pBitMap, iVal)) ? 2 : 0;
26,988,294✔
3668
    case (HAS_VALUE | HAS_NULL):
728,731,517✔
3669
      return GET_BIT1(pColData->pBitMap, iVal) + 1;
728,731,517✔
3670
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
12,466,544✔
3671
      return GET_BIT2(pColData->pBitMap, iVal);
12,466,544✔
3672
    default:
15,146✔
3673
      return 0;
15,146✔
3674
  }
3675
}
3676

3677
int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) {
20,502✔
3678
  int32_t code = 0;
20,502✔
3679

3680
  *pColData = *pColDataFrom;
20,502✔
3681

3682
  // bitmap
3683
  switch (pColData->flag) {
20,502!
3684
    case (HAS_NULL | HAS_NONE):
44✔
3685
    case (HAS_VALUE | HAS_NONE):
3686
    case (HAS_VALUE | HAS_NULL):
3687
      pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal));
44✔
3688
      if (pColData->pBitMap == NULL) {
44!
3689
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3690
        goto _exit;
×
3691
      }
3692
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
44✔
3693
      break;
44✔
3694
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
3695
      pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
×
3696
      if (pColData->pBitMap == NULL) {
×
3697
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3698
        goto _exit;
×
3699
      }
3700
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
×
3701
      break;
×
3702
    default:
20,458✔
3703
      pColData->pBitMap = NULL;
20,458✔
3704
      break;
20,458✔
3705
  }
3706

3707
  // offset
3708
  if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) {
20,502!
3709
    pColData->aOffset = xMalloc(arg, pColData->nVal << 2);
116✔
3710
    if (pColData->aOffset == NULL) {
116!
3711
      code = TSDB_CODE_OUT_OF_MEMORY;
×
3712
      goto _exit;
×
3713
    }
3714
    (void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
116✔
3715
  } else {
3716
    pColData->aOffset = NULL;
20,386✔
3717
  }
3718

3719
  // value
3720
  if (pColData->nData) {
20,502✔
3721
    pColData->pData = xMalloc(arg, pColData->nData);
20,418✔
3722
    if (pColData->pData == NULL) {
20,417!
3723
      code = TSDB_CODE_OUT_OF_MEMORY;
×
3724
      goto _exit;
×
3725
    }
3726

3727
    (void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
20,417✔
3728
  } else {
3729
    pColData->pData = NULL;
84✔
3730
  }
3731

3732
_exit:
20,501✔
3733
  return code;
20,501✔
3734
}
3735

3736
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
4,168,477✔
3737
  int32_t code;
3738
  SBuffer local;
3739

3740
  if (!(colData->nVal > 0)) {
4,168,477!
3741
    return TSDB_CODE_INVALID_PARA;
×
3742
  }
3743

3744
  (*info) = (SColDataCompressInfo){
4,168,477✔
3745
      .cmprAlg = info->cmprAlg,
4,168,477✔
3746
      .columnFlag = colData->cflag,
4,168,477✔
3747
      .flag = colData->flag,
4,168,477✔
3748
      .dataType = colData->type,
4,168,477✔
3749
      .columnId = colData->cid,
4,168,477✔
3750
      .numOfData = colData->nVal,
4,168,477✔
3751
  };
3752

3753
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
4,168,477!
3754
    return 0;
141,893✔
3755
  }
3756

3757
  tBufferInit(&local);
3758
  if (assist == NULL) {
4,026,584!
3759
    assist = &local;
×
3760
  }
3761

3762
  // bitmap
3763
  if (colData->flag != HAS_VALUE) {
4,026,584✔
3764
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
460,344✔
3765
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
37,402✔
3766
    } else {
3767
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
422,942✔
3768
    }
3769

3770
    SCompressInfo cinfo = {
460,344✔
3771
        .dataType = TSDB_DATA_TYPE_TINYINT,
3772
        .cmprAlg = info->cmprAlg,
460,344✔
3773
        .originalSize = info->bitmapOriginalSize,
460,344✔
3774
    };
3775

3776
    code = tCompressDataToBuffer(colData->pBitMap, &cinfo, output, assist);
460,344✔
3777
    if (code) {
460,410!
3778
      tBufferDestroy(&local);
3779
      return code;
×
3780
    }
3781

3782
    info->bitmapCompressedSize = cinfo.compressedSize;
460,410✔
3783
  }
3784

3785
  if (colData->flag == (HAS_NONE | HAS_NULL)) {
4,026,650✔
3786
    tBufferDestroy(&local);
3787
    return 0;
10,596✔
3788
  }
3789

3790
  // offset
3791
  if (IS_VAR_DATA_TYPE(colData->type)) {
4,016,054!
3792
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
380,258✔
3793

3794
    SCompressInfo cinfo = {
380,258✔
3795
        .dataType = TSDB_DATA_TYPE_INT,
3796
        .cmprAlg = info->cmprAlg,
380,258✔
3797
        .originalSize = info->offsetOriginalSize,
380,258✔
3798
    };
3799

3800
    code = tCompressDataToBuffer(colData->aOffset, &cinfo, output, assist);
380,258✔
3801
    if (code) {
380,222!
3802
      tBufferDestroy(&local);
3803
      return code;
×
3804
    }
3805

3806
    info->offsetCompressedSize = cinfo.compressedSize;
380,222✔
3807
  }
3808

3809
  // data
3810
  if (colData->nData > 0) {
4,016,018!
3811
    info->dataOriginalSize = colData->nData;
4,016,134✔
3812

3813
    SCompressInfo cinfo = {
4,016,134✔
3814
        .dataType = colData->type,
4,016,134✔
3815
        .cmprAlg = info->cmprAlg,
4,016,134✔
3816
        .originalSize = info->dataOriginalSize,
4,016,134✔
3817
    };
3818

3819
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
4,016,134✔
3820
    if (code) {
4,016,408!
3821
      tBufferDestroy(&local);
3822
      return code;
×
3823
    }
3824

3825
    info->dataCompressedSize = cinfo.compressedSize;
4,016,408✔
3826
  }
3827

3828
  tBufferDestroy(&local);
3829
  return 0;
4,016,292✔
3830
}
3831

3832
int32_t tColDataDecompress(void *input, SColDataCompressInfo *info, SColData *colData, SBuffer *assist) {
34,188,501✔
3833
  int32_t  code;
3834
  SBuffer  local;
3835
  uint8_t *data = (uint8_t *)input;
34,188,501✔
3836

3837
  tBufferInit(&local);
3838
  if (assist == NULL) {
34,188,501!
3839
    assist = &local;
×
3840
  }
3841

3842
  tColDataClear(colData);
34,188,501✔
3843
  colData->cid = info->columnId;
34,187,477✔
3844
  colData->type = info->dataType;
34,187,477✔
3845
  colData->cflag = info->columnFlag;
34,187,477✔
3846
  colData->nVal = info->numOfData;
34,187,477✔
3847
  colData->flag = info->flag;
34,187,477✔
3848

3849
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
34,187,477✔
3850
    goto _exit;
4,204,800✔
3851
  }
3852

3853
  // bitmap
3854
  if (info->bitmapOriginalSize > 0) {
29,982,677✔
3855
    SCompressInfo cinfo = {
1,268,904✔
3856
        .dataType = TSDB_DATA_TYPE_TINYINT,
3857
        .cmprAlg = info->cmprAlg,
1,268,904✔
3858
        .originalSize = info->bitmapOriginalSize,
1,268,904✔
3859
        .compressedSize = info->bitmapCompressedSize,
1,268,904✔
3860
    };
3861

3862
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
1,268,904!
3863
    if (code) {
1,268,198!
3864
      tBufferDestroy(&local);
3865
      return code;
×
3866
    }
3867

3868
    code = tDecompressData(data, &cinfo, colData->pBitMap, cinfo.originalSize, assist);
1,268,198✔
3869
    if (code) {
1,268,637!
3870
      tBufferDestroy(&local);
3871
      return code;
×
3872
    }
3873

3874
    data += cinfo.compressedSize;
1,268,637✔
3875
  }
3876

3877
  if (info->flag == (HAS_NONE | HAS_NULL)) {
29,982,410✔
3878
    goto _exit;
690✔
3879
  }
3880

3881
  // offset
3882
  if (info->offsetOriginalSize > 0) {
29,981,720✔
3883
    SCompressInfo cinfo = {
4,806,725✔
3884
        .cmprAlg = info->cmprAlg,
4,806,725✔
3885
        .dataType = TSDB_DATA_TYPE_INT,
3886
        .originalSize = info->offsetOriginalSize,
4,806,725✔
3887
        .compressedSize = info->offsetCompressedSize,
4,806,725✔
3888
    };
3889

3890
    code = tRealloc((uint8_t **)&colData->aOffset, cinfo.originalSize);
4,806,725!
3891
    if (code) {
4,806,919!
3892
      tBufferDestroy(&local);
3893
      return code;
×
3894
    }
3895

3896
    code = tDecompressData(data, &cinfo, colData->aOffset, cinfo.originalSize, assist);
4,806,919✔
3897
    if (code) {
4,806,934!
3898
      tBufferDestroy(&local);
3899
      return code;
×
3900
    }
3901

3902
    data += cinfo.compressedSize;
4,806,934✔
3903
  }
3904

3905
  // data
3906
  if (info->dataOriginalSize > 0) {
29,981,929✔
3907
    colData->nData = info->dataOriginalSize;
29,979,765✔
3908

3909
    SCompressInfo cinfo = {
29,979,765✔
3910
        .cmprAlg = info->cmprAlg,
29,979,765✔
3911
        .dataType = colData->type,
29,979,765✔
3912
        .originalSize = info->dataOriginalSize,
29,979,765✔
3913
        .compressedSize = info->dataCompressedSize,
29,979,765✔
3914
    };
3915

3916
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
29,979,765!
3917
    if (code) {
29,979,941!
3918
      tBufferDestroy(&local);
3919
      return code;
×
3920
    }
3921

3922
    code = tDecompressData(data, &cinfo, colData->pData, cinfo.originalSize, assist);
29,979,941✔
3923
    if (code) {
29,979,535!
3924
      tBufferDestroy(&local);
3925
      return code;
×
3926
    }
3927

3928
    data += cinfo.compressedSize;
29,979,535✔
3929
  }
3930

3931
_exit:
2,164✔
3932
  switch (colData->flag) {
34,187,189✔
3933
    case HAS_NONE:
3,878,206✔
3934
      colData->numOfNone = colData->nVal;
3,878,206✔
3935
      break;
3,878,206✔
3936
    case HAS_NULL:
330,694✔
3937
      colData->numOfNull = colData->nVal;
330,694✔
3938
      break;
330,694✔
3939
    case HAS_VALUE:
28,710,645✔
3940
      colData->numOfValue = colData->nVal;
28,710,645✔
3941
      break;
28,710,645✔
3942
    default:
1,267,644✔
3943
      for (int32_t i = 0; i < colData->nVal; i++) {
406,734,051✔
3944
        uint8_t bitValue = tColDataGetBitValue(colData, i);
405,466,507✔
3945
        if (bitValue == 0) {
405,466,407✔
3946
          colData->numOfNone++;
6,194,824✔
3947
        } else if (bitValue == 1) {
399,271,583✔
3948
          colData->numOfNull++;
76,495,115✔
3949
        } else {
3950
          colData->numOfValue++;
322,776,468✔
3951
        }
3952
      }
3953
  }
3954
  tBufferDestroy(&local);
3955
  return 0;
34,187,089✔
3956
}
3957

3958
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
543✔
3959
                                    char *data) {
3960
  int32_t code = 0;
543✔
3961
  if (data == NULL) {
543✔
3962
    if (pColData->cflag & COL_IS_KEY) {
13!
3963
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3964
    } else {
3965
      for (int32_t i = 0; i < nRows; ++i) {
28✔
3966
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
15✔
3967
      }
3968
    }
3969
    goto _exit;
13✔
3970
  }
3971

3972
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
530!
3973
    for (int32_t i = 0; i < nRows; ++i) {
265✔
3974
      int32_t offset = *((int32_t *)lengthOrbitmap + i);
173✔
3975
      if (offset == -1) {
173!
3976
        if (pColData->cflag & COL_IS_KEY) {
×
3977
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
3978
          goto _exit;
×
3979
        }
3980
        if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
3981
          goto _exit;
×
3982
        }
3983
      } else {
3984
        if (varDataTLen(data + offset) > bytes) {
173!
3985
          uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
3986
                 bytes);
3987
          code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
3988
          goto _exit;
×
3989
        }
3990
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
173✔
3991
                                                                      varDataLen(data + offset));
173✔
3992
      }
3993
    }
3994
  } else {  // fixed-length data type
3995
    bool allValue = true;
438✔
3996
    bool allNull = true;
438✔
3997
    for (int32_t i = 0; i < nRows; ++i) {
1,250✔
3998
      if (!colDataIsNull_f(lengthOrbitmap, i)) {
812✔
3999
        allNull = false;
599✔
4000
      } else {
4001
        allValue = false;
213✔
4002
      }
4003
    }
4004
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
438!
4005
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4006
      goto _exit;
×
4007
    }
4008

4009
    if (allValue) {
438✔
4010
      // optimize (todo)
4011
      for (int32_t i = 0; i < nRows; ++i) {
929✔
4012
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
585✔
4013
      }
4014
    } else if (allNull) {
94✔
4015
      // optimize (todo)
4016
      for (int32_t i = 0; i < nRows; ++i) {
249✔
4017
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
165✔
4018
        if (code) goto _exit;
165!
4019
      }
4020
    } else {
4021
      for (int32_t i = 0; i < nRows; ++i) {
72✔
4022
        if (colDataIsNull_f(lengthOrbitmap, i)) {
62✔
4023
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
48✔
4024
          if (code) goto _exit;
48!
4025
        } else {
4026
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
14✔
4027
        }
4028
      }
4029
    }
4030
  }
4031

4032
_exit:
10✔
4033
  return code;
543✔
4034
}
4035

4036
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
8,525,285✔
4037
                               checkWKBGeometryFn cgeos) {
4038
  int32_t code = 0;
8,525,285✔
4039

4040
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
8,525,285✔
4041
    if (!(pColData->type == pBind->buffer_type)) {
7,946,398!
4042
      return TSDB_CODE_INVALID_PARA;
×
4043
    }
4044
  }
4045

4046
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
8,525,285!
4047
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
887,315✔
4048
      code = igeos();
202✔
4049
      if (code) {
202!
4050
        return code;
×
4051
      }
4052
    }
4053
    for (int32_t i = 0; i < pBind->num; ++i) {
2,764,120✔
4054
      if (pBind->is_null && pBind->is_null[i]) {
1,823,220✔
4055
        if (pColData->cflag & COL_IS_KEY) {
100,941!
4056
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4057
          goto _exit;
×
4058
        }
4059
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
100,941✔
4060
        if (code) goto _exit;
101,270!
4061
      } else if (pBind->length[i] > buffMaxLen) {
1,722,279!
4062
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4063
      } else {
4064
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
1,722,279✔
4065
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
204✔
4066
          if (code) {
205✔
4067
            uError("stmt col[%d] bind geometry wrong format", i);
1!
4068
            goto _exit;
1✔
4069
          }
4070
        }
4071
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
1,722,279✔
4072
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
1,722,279✔
4073
      }
4074
    }
4075
  } else {  // fixed-length data type
4076
    bool allValue;
4077
    bool allNull;
4078
    if (pBind->is_null) {
7,637,970✔
4079
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
564,087✔
4080
      allNull = (same && pBind->is_null[0] != 0);
564,087!
4081
      allValue = (same && pBind->is_null[0] == 0);
564,087!
4082
    } else {
4083
      allNull = false;
7,073,883✔
4084
      allValue = true;
7,073,883✔
4085
    }
4086

4087
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
7,637,970!
4088
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4089
      goto _exit;
×
4090
    }
4091

4092
    if (allValue) {
7,637,970✔
4093
      // optimize (todo)
4094
      for (int32_t i = 0; i < pBind->num; ++i) {
251,771,202✔
4095
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
243,772,178✔
4096
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
243,772,178✔
4097
      }
4098
    } else if (allNull) {
418,058!
4099
      // optimize (todo)
4100
      for (int32_t i = 0; i < pBind->num; ++i) {
979,782✔
4101
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
486,014✔
4102
        if (code) goto _exit;
493,864!
4103
      }
4104
    } else {
4105
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4106
        if (pBind->is_null[i]) {
79✔
4107
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
29✔
4108
          if (code) goto _exit;
29!
4109
        } else {
4110
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
50✔
4111
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
50✔
4112
        }
4113
      }
4114
    }
4115
  }
4116

4117
_exit:
×
4118
  return code;
9,365,833✔
4119
}
4120

4121
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
350✔
4122
                                checkWKBGeometryFn cgeos) {
4123
  int32_t code = 0;
350✔
4124

4125
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
350!
4126
    if (!(pColData->type == pBind->buffer_type)) {
350!
4127
      return TSDB_CODE_INVALID_PARA;
×
4128
    }
4129
  }
4130

4131
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
493!
4132
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
143✔
4133
      code = igeos();
15✔
4134
      if (code) {
15!
4135
        return code;
×
4136
      }
4137
    }
4138

4139
    uint8_t *buf = pBind->buffer;
143✔
4140
    for (int32_t i = 0; i < pBind->num; ++i) {
559✔
4141
      if (pBind->is_null && pBind->is_null[i]) {
416✔
4142
        if (pColData->cflag & COL_IS_KEY) {
2!
4143
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4144
          goto _exit;
×
4145
        }
4146
        if (pBind->is_null[i] == 1) {
2!
4147
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2✔
4148
          if (code) goto _exit;
2!
4149
        } else {
4150
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4151
          if (code) goto _exit;
×
4152
        }
4153
      } else if (pBind->length[i] > buffMaxLen) {
414!
4154
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4155
      } else {
4156
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
414✔
4157
          code = cgeos(buf, pBind->length[i]);
19✔
4158
          if (code) {
19!
4159
            uError("stmt2 col[%d] bind geometry wrong format", i);
×
4160
            goto _exit;
×
4161
          }
4162
        }
4163
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
414✔
4164
        buf += pBind->length[i];
414✔
4165
      }
4166
    }
4167
  } else {  // fixed-length data type
4168
    bool allValue;
4169
    bool allNull;
4170
    bool allNone;
4171
    if (pBind->is_null) {
207✔
4172
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
2✔
4173
      allNull = (same && pBind->is_null[0] == 1);
2!
4174
      allNone = (same && pBind->is_null[0] > 1);
2!
4175
      allValue = (same && pBind->is_null[0] == 0);
2!
4176
    } else {
4177
      allNull = false;
205✔
4178
      allNone = false;
205✔
4179
      allValue = true;
205✔
4180
    }
4181

4182
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
207!
4183
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4184
      goto _exit;
×
4185
    }
4186

4187
    if (allValue) {
207!
4188
      // optimize (todo)
4189
      for (int32_t i = 0; i < pBind->num; ++i) {
654✔
4190
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
447✔
4191
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
447!
4192
          *val = 1;
1✔
4193
        }
4194

4195
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
447✔
4196
      }
4197
    } else if (allNull) {
×
4198
      // optimize (todo)
4199
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4200
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4201
        if (code) goto _exit;
×
4202
      }
4203
    } else if (allNone) {
×
4204
      // optimize (todo)
4205
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4206
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4207
        if (code) goto _exit;
×
4208
      }
4209
    } else {
4210
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4211
        if (pBind->is_null[i]) {
×
4212
          if (pBind->is_null[i] == 1) {
×
4213
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4214
            if (code) goto _exit;
×
4215
          } else {
4216
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4217
            if (code) goto _exit;
×
4218
          }
4219
        } else {
4220
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
4221
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
4222
            *val = 1;
×
4223
          }
4224

4225
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
4226
        }
4227
      }
4228
    }
4229
  }
4230

4231
_exit:
×
4232
  return code;
350✔
4233
}
4234
int32_t tColDataAddValueByBind2WithBlob(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
1✔
4235
                                        SBlobRow2 *pBlobRow) {
4236
  int32_t code = 0;
1✔
4237

4238
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
1!
4239
    if (!(pColData->type == pBind->buffer_type)) {
1!
4240
      return TSDB_CODE_INVALID_PARA;
×
4241
    }
4242
  }
4243

4244
  if (IS_STR_DATA_BLOB(pColData->type)) {  // var-length data type
1!
4245
    uint8_t *buf = pBind->buffer;
1✔
4246
    for (int32_t i = 0; i < pBind->num; ++i) {
11✔
4247
      if (pBind->is_null && pBind->is_null[i]) {
10!
4248
        if (pColData->cflag & COL_IS_KEY) {
×
4249
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4250
          goto _exit;
×
4251
        }
4252
        if (pBind->is_null[i] == 1) {
×
4253
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NULL](pBlobRow, pColData, NULL, 0);
×
4254
          if (code) goto _exit;
×
4255
        } else {
4256
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NONE](pBlobRow, pColData, NULL, 0);
×
4257
          if (code) goto _exit;
×
4258
        }
4259
      } else if (pBind->length[i] > buffMaxLen) {
10!
4260
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4261
      } else {
4262
        code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_VALUE](pBlobRow, pColData, buf, pBind->length[i]);
10✔
4263
        buf += pBind->length[i];
10✔
4264
      }
4265
    }
4266
  }
4267
_exit:
1✔
4268
  return code;
1✔
4269
}
4270

4271
/* build rows to `rowArray` from bind
4272
 * `infos` is the bind information array
4273
 * `numOfInfos` is the number of bind information
4274
 * `infoSorted` is whether the bind information is sorted by column id
4275
 * `pTSchema` is the schema of the table
4276
 * `rowArray` is the array to store the rows
4277
 * `pOrdered` is the pointer to store ordered
4278
 * `pDupTs` is the pointer to store duplicateTs
4279
 */
4280
int32_t tRowBuildFromBind2(SBindInfo2 *infos, int32_t numOfInfos, SSHashObj *parsedCols, bool infoSorted,
5,803✔
4281
                           const STSchema *pTSchema, SArray *rowArray, bool *pOrdered, bool *pDupTs) {
4282
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
5,803!
4283
    return TSDB_CODE_INVALID_PARA;
×
4284
  }
4285
  int8_t hasBlob = schemaHasBlob(pTSchema);
5,810✔
4286
  if (!infoSorted) {
5,809✔
4287
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
7✔
4288
  }
4289

4290
  int32_t code = 0;
5,809✔
4291
  int32_t numOfRows = infos[0].bind->num;
5,809✔
4292
  SArray *colValArray, *bufArray;
4293
  SColVal colVal;
4294
  int32_t numOfFixedValue = 0;
5,809✔
4295

4296
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
5,809!
4297
    return terrno;
×
4298
  }
4299
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
5,808!
4300
    taosArrayDestroy(colValArray);
×
4301
    return terrno;
×
4302
  }
4303
  for (int i = 0; i < numOfInfos; ++i) {
36,658✔
4304
    if (parsedCols) {
30,859✔
4305
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
132✔
4306
      if (pParsedVal) {
132✔
4307
        continue;
24✔
4308
      }
4309
    }
4310
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
61,658!
4311
      taosArrayDestroy(colValArray);
×
4312
      taosArrayDestroy(bufArray);
×
4313
      return terrno;
×
4314
    }
4315
  }
4316

4317
  SRowKey rowKey, lastRowKey;
4318
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
248,676✔
4319
    taosArrayClear(colValArray);
247,153✔
4320

4321
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
1,199,544✔
4322
      if (parsedCols) {
930,968✔
4323
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
132✔
4324
        if (pParsedVal) {
132!
4325
          numOfFixedValue++;
×
4326
          colVal = *pParsedVal;
×
4327

4328
          if (taosArrayPush(colValArray, &colVal) == NULL) {
24!
4329
            if (IS_VAR_DATA_TYPE(pParsedVal->value.type)) {
×
4330
              taosMemoryFree(colVal.value.pData);
×
4331
            }
4332
            code = terrno;
×
4333
            goto _exit;
1✔
4334
          }
4335
          continue;
24✔
4336
        }
4337
      }
4338

4339
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
932,530✔
4340
        if (infos[iInfo].bind->is_null[iRow] == 1) {
2!
4341
          if (iInfo == 0) {
2✔
4342
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
1✔
4343
            goto _exit;
1✔
4344
          }
4345
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
1✔
4346
        } else {
4347
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
4348
        }
4349
      } else {
4350
        SValue value = {
932,528✔
4351
            .type = infos[iInfo].type,
932,528✔
4352
        };
4353
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
932,528!
4354
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
6,862!
4355
            int32_t   length = infos[iInfo].bind->length[iRow];
×
4356
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
4357
            value.nData = length;
×
4358
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
4359
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4360
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo,
×
4361
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
4362
              goto _exit;
×
4363
            }
4364
            value.pData = *data;
×
4365
            *data += length;
×
4366
          } else {
4367
            int32_t   length = infos[iInfo].bind->length[iRow];
6,862✔
4368
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
6,862✔
4369
            value.nData = length;
6,862✔
4370
            if (value.nData > infos[iInfo].bytes - VARSTR_HEADER_SIZE) {
6,862!
4371
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4372
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo,
×
4373
                     value.nData + (uint32_t)(VARSTR_HEADER_SIZE), infos[iInfo].bytes);
4374
              goto _exit;
×
4375
            }
4376
            value.pData = *data;
6,862✔
4377
            *data += length;
6,862✔
4378
          }
4379
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
4380
        } else {
4381
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
925,666✔
4382
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
925,666✔
4383
            *val = 1;
1✔
4384
          }
4385
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
925,666✔
4386
        }
4387
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
945,527✔
4388
      }
4389
      if (taosArrayPush(colValArray, &colVal) == NULL) {
952,541!
4390
        code = terrno;
×
4391
        goto _exit;
×
4392
      }
4393
    }
4394

4395
    SRow *row;
4396

4397
    if (hasBlob == 0) {
268,576✔
4398
      SRowBuildScanInfo sinfo = {0};
241,919✔
4399
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
241,919!
4400
        goto _exit;
×
4401
      }
4402
    } else {
4403
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
26,657✔
4404
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, NULL, &sinfo))) {
26,657!
4405
        goto _exit;
×
4406
      }
4407
    }
4408

4409
    if ((taosArrayPush(rowArray, &row)) == NULL) {
242,902!
4410
      code = terrno;
×
4411
      goto _exit;
×
4412
    }
4413

4414
    if (pOrdered && pDupTs) {
242,902!
4415
      tRowGetKey(row, &rowKey);
486,104✔
4416
      if (iRow == 0) {
243,027✔
4417
        *pOrdered = true;
5,799✔
4418
        *pDupTs = false;
5,799✔
4419
      } else {
4420
        if (*pOrdered) {
237,228!
4421
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
237,246✔
4422
          *pOrdered = (res >= 0);
237,246✔
4423
          if (!*pDupTs) {
237,246✔
4424
            *pDupTs = (res == 0);
237,224✔
4425
          }
4426
        }
4427
      }
4428
      lastRowKey = rowKey;
243,027✔
4429
    }
4430
  }
4431
_exit:
1,523✔
4432
  taosArrayDestroy(colValArray);
1,524✔
4433
  taosArrayDestroy(bufArray);
5,808✔
4434
  return code;
5,815✔
4435
}
4436
/* build rows to `rowArray` from bind
4437
 * `infos` is the bind information array
4438
 * `numOfInfos` is the number of bind information
4439
 * `infoSorted` is whether the bind information is sorted by column id
4440
 * `pTSchema` is the schema of the table
4441
 * `rowArray` is the array to store the rows
4442
 * `pOrdered` is the pointer to store ordered
4443
 * `pDupTs` is the pointer to store duplicateTs
4444
 */
4445
int32_t tRowBuildFromBind2WithBlob(SBindInfo2 *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
×
4446
                                   SArray *rowArray, bool *pOrdered, bool *pDupTs, SBlobRow2 *pBlobRow) {
4447
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
×
4448
    return TSDB_CODE_INVALID_PARA;
×
4449
  }
4450
  int8_t hasBlob = schemaHasBlob(pTSchema);
×
4451
  if (!infoSorted) {
×
4452
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
4453
  }
4454

4455
  int32_t code = 0;
×
4456
  int32_t numOfRows = infos[0].bind->num;
×
4457
  SArray *colValArray, *bufArray;
4458
  SColVal colVal;
4459

4460
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
×
4461
    return terrno;
×
4462
  }
4463
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
×
4464
    taosArrayDestroy(colValArray);
×
4465
    return terrno;
×
4466
  }
4467
  for (int i = 0; i < numOfInfos; ++i) {
×
4468
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
×
4469
      taosArrayDestroy(colValArray);
×
4470
      taosArrayDestroy(bufArray);
×
4471
      return terrno;
×
4472
    }
4473
  }
4474

4475
  SRowKey rowKey, lastRowKey;
4476
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
×
4477
    taosArrayClear(colValArray);
×
4478

4479
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
×
4480
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
×
4481
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
4482
          if (iInfo == 0) {
×
4483
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4484
            goto _exit;
×
4485
          }
4486
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
4487
        } else {
4488
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
4489
        }
4490
      } else {
4491
        SValue value = {
×
4492
            .type = infos[iInfo].type,
×
4493
        };
4494
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
×
4495
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
×
4496
            int32_t   length = infos[iInfo].bind->length[iRow];
×
4497
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
4498
            value.nData = length;
×
4499
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
4500
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4501
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
4502
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
4503
              goto _exit;
×
4504
            }
4505
            value.pData = *data;
×
4506
            *data += length;
×
4507
          } else {
4508
            int32_t   length = infos[iInfo].bind->length[iRow];
×
4509
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
4510
            value.nData = length;
×
4511
            if (value.nData > pTSchema->columns[infos[iInfo].columnId - 1].bytes - VARSTR_HEADER_SIZE) {
×
4512
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4513
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
4514
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
4515
              goto _exit;
×
4516
            }
4517
            value.pData = *data;
×
4518
            *data += length;
×
4519
          }
4520

4521
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
4522
        } else {
4523
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
×
4524
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
×
4525
            *val = 1;
×
4526
          }
4527
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
×
4528
        }
4529
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
×
4530
      }
4531
      if (taosArrayPush(colValArray, &colVal) == NULL) {
×
4532
        code = terrno;
×
4533
        goto _exit;
×
4534
      }
4535
    }
4536

4537
    SRow *row;
4538

4539
    if (hasBlob == 0) {
×
4540
      SRowBuildScanInfo sinfo = {0};
×
4541
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
×
4542
        goto _exit;
×
4543
      }
4544
    } else {
4545
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
×
4546
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, pBlobRow, &sinfo))) {
×
4547
        goto _exit;
×
4548
      }
4549
    }
4550

4551
    if ((taosArrayPush(rowArray, &row)) == NULL) {
×
4552
      code = terrno;
×
4553
      goto _exit;
×
4554
    }
4555

4556
    if (pOrdered && pDupTs) {
×
4557
      tRowGetKey(row, &rowKey);
×
4558
      if (iRow == 0) {
×
4559
        *pOrdered = true;
×
4560
        *pDupTs = false;
×
4561
      } else {
4562
        if (*pOrdered) {
×
4563
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
×
4564
          *pOrdered = (res >= 0);
×
4565
          if (!*pDupTs) {
×
4566
            *pDupTs = (res == 0);
×
4567
          }
4568
        }
4569
      }
4570
      lastRowKey = rowKey;
×
4571
    }
4572
  }
4573
_exit:
×
4574
  taosArrayDestroy(colValArray);
×
4575
  taosArrayDestroy(bufArray);
×
4576
  return code;
×
4577
}
4578

4579
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
378✔
4580
  int32_t code = TSDB_CODE_SUCCESS;
378✔
4581

4582
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
378!
4583
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
146✔
4584
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
51✔
4585
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
73✔
4586
    if (iToRow == 0) {
73✔
4587
      pToColData->aOffset[iToRow] = 0;
14✔
4588
    }
4589

4590
    if (iToRow < pToColData->nVal - 1) {
73✔
4591
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
64✔
4592
    }
4593

4594
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
73✔
4595
                 nData);
4596
  } else {
4597
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
305✔
4598
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
305✔
4599
  }
4600
  return code;
378✔
4601
}
4602

4603
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
386✔
4604
                                        int32_t iToRow) {
4605
  int32_t code = TSDB_CODE_SUCCESS;
386✔
4606
  int     bit_val = 0;
386✔
4607

4608
  switch (pFromColData->flag) {
386!
4609
    case HAS_NONE: {
×
4610
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
4611
    } break;
×
4612
    case HAS_NULL: {
8✔
4613
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
8!
4614
    } break;
8✔
4615
    case (HAS_NULL | HAS_NONE): {
×
4616
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
4617
      if (0 == bit_val)
×
4618
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
4619
      else
4620
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
×
4621
    } break;
×
4622
    case HAS_VALUE: {
330✔
4623
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
330!
4624
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
330!
4625
    } break;
330✔
4626
    case (HAS_VALUE | HAS_NONE): {
×
4627
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
4628
      if (0 == bit_val)
×
4629
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
4630
      else
4631
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
×
4632
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
4633
    } break;
×
4634
    case (HAS_VALUE | HAS_NULL): {
48✔
4635
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
48✔
4636
      if (0 == bit_val)
48✔
4637
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
29!
4638
      else
4639
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
19!
4640
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
48!
4641
    } break;
48✔
4642
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
4643
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
4644
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
4645
    } break;
×
4646
    default:
×
4647
      return -1;
×
4648
  }
4649

4650
  return code;
386✔
4651
}
4652

4653
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
91✔
4654
                               int32_t nColData) {
4655
  int32_t code = TSDB_CODE_SUCCESS;
91✔
4656

4657
  for (int32_t i = 0; i < nColData; i++) {
477✔
4658
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
386✔
4659
    if (code != TSDB_CODE_SUCCESS) {
386!
4660
      return code;
×
4661
    }
4662
  }
4663

4664
  return code;
91✔
4665
}
4666

4667
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
91✔
4668
  int32_t code = TSDB_CODE_SUCCESS;
91✔
4669

4670
  for (int32_t i = 0; i < nColData; i++) {
477✔
4671
    SColVal cv = {0};
386✔
4672
    code = tColDataGetValue(&aFromColData[i], iFromRow, &cv);
386✔
4673
    if (code != TSDB_CODE_SUCCESS) {
386!
4674
      return code;
×
4675
    }
4676
    code = tColDataAppendValue(&aToColData[i], &cv);
386✔
4677
    if (code != TSDB_CODE_SUCCESS) {
386!
4678
      return code;
×
4679
    }
4680
  }
4681

4682
  return code;
91✔
4683
}
4684

4685
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
215,159,495✔
4686
  SColVal cv;
4687

4688
  key->ts = ((TSKEY *)aColData[0].pData)[iRow];
215,159,495✔
4689
  key->numOfPKs = 0;
215,159,495✔
4690

4691
  for (int i = 1; i < nColData; i++) {
215,179,472!
4692
    if (aColData[i].cflag & COL_IS_KEY) {
216,498,557✔
4693
      tColDataGetValue4(&aColData[i], iRow, &cv);
19,969!
4694
      key->pks[key->numOfPKs++] = cv.value;
19,977✔
4695
    } else {
4696
      break;
216,478,588✔
4697
    }
4698
  }
4699
}
215,159,503✔
4700

4701
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
28✔
4702
  SColData *aDstColData = NULL;
28✔
4703
  int32_t   i = start, j = mid + 1, k = 0;
28✔
4704
  SRowKey   keyi, keyj;
4705

4706
  if (end > start) {
28!
4707
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
28!
4708
    if (aDstColData == NULL) {
28!
4709
      return terrno;
×
4710
    }
4711
    for (int c = 0; c < nColData; ++c) {
144✔
4712
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
116✔
4713
    }
4714
  }
4715

4716
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
28✔
4717
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
28✔
4718
  while (i <= mid && j <= end) {
78✔
4719
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
50✔
4720
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
37!
4721
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
37✔
4722
    } else {
4723
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
13!
4724
      tColDataArrGetRowKey(aColData, nColData, j, &keyj);
13✔
4725
    }
4726
  }
4727

4728
  while (i <= mid) {
42✔
4729
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
14!
4730
  }
4731

4732
  while (j <= end) {
55✔
4733
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
27!
4734
  }
4735

4736
  for (i = start, k = 0; i <= end; ++i, ++k) {
119✔
4737
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
91!
4738
  }
4739

4740
  if (aDstColData) {
28!
4741
    for (int32_t i = 0; i < nColData; i++) {
144✔
4742
      tColDataDestroy(&aDstColData[i]);
116✔
4743
    }
4744
    taosMemoryFree(aDstColData);
28!
4745
  }
4746

4747
  return TSDB_CODE_SUCCESS;
28✔
4748
}
4749

4750
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
63✔
4751
  int32_t ret = TSDB_CODE_SUCCESS;
63✔
4752
  int32_t mid;
4753

4754
  if (start >= end) {
63✔
4755
    return TSDB_CODE_SUCCESS;
35✔
4756
  }
4757

4758
  mid = (start + end) / 2;
28✔
4759

4760
  ret = tColDataMergeSort(aColData, start, mid, nColData);
28✔
4761
  if (ret != TSDB_CODE_SUCCESS) {
28!
4762
    return ret;
×
4763
  }
4764

4765
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
28✔
4766
  if (ret != TSDB_CODE_SUCCESS) {
28!
4767
    return ret;
×
4768
  }
4769

4770
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
28✔
4771
}
4772

4773
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
7✔
4774
  int32_t nVal = aColData[0].nVal;
7✔
4775

4776
  if (nVal < 2) return TSDB_CODE_SUCCESS;
7!
4777

4778
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
7✔
4779
}
4780

4781
static int32_t tColDataMerge(SArray **colArr) {
4✔
4782
  int32_t code = 0;
4✔
4783
  SArray *src = *colArr;
4✔
4784
  SArray *dst = NULL;
4✔
4785

4786
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
4✔
4787
  if (dst == NULL) {
4!
4788
    return terrno;
×
4789
  }
4790

4791
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
15✔
4792
    SColData *srcCol = taosArrayGet(src, i);
11✔
4793

4794
    SColData *dstCol = taosArrayReserve(dst, 1);
11✔
4795
    if (dstCol == NULL) {
11!
4796
      code = terrno;
×
4797
      goto _exit;
×
4798
    }
4799
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
11✔
4800
  }
4801

4802
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
4✔
4803
  SRowKey lastKey;
4804
  for (int32_t i = 0; i < numRows; i++) {
16✔
4805
    SRowKey key;
4806
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
12✔
4807

4808
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
20✔
4809
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
18✔
4810
        SColData *srcCol = taosArrayGet(src, j);
13✔
4811
        SColData *dstCol = taosArrayGet(dst, j);
13✔
4812

4813
        SColVal cv;
4814
        code = tColDataGetValue(srcCol, i, &cv);
13✔
4815
        if (code != TSDB_CODE_SUCCESS) {
13!
4816
          goto _exit;
×
4817
        }
4818
        code = tColDataAppendValue(dstCol, &cv);
13✔
4819
        if (code) {
13!
4820
          goto _exit;
×
4821
        }
4822
      }
4823
      lastKey = key;
5✔
4824
    } else {  // update existing row
4825
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
24✔
4826
        SColData *srcCol = taosArrayGet(src, j);
17✔
4827
        SColData *dstCol = taosArrayGet(dst, j);
17✔
4828

4829
        SColVal cv;
4830
        code = tColDataGetValue(srcCol, i, &cv);
17✔
4831
        if (code != TSDB_CODE_SUCCESS) {
17!
4832
          goto _exit;
×
4833
        }
4834
        code = tColDataUpdateValue(dstCol, &cv, true);
17✔
4835
        if (code) {
17!
4836
          goto _exit;
×
4837
        }
4838
      }
4839
    }
4840
  }
4841

4842
_exit:
4✔
4843
  if (code) {
4!
4844
    taosArrayDestroyEx(dst, tColDataDestroy);
×
4845
  } else {
4846
    taosArrayDestroyEx(src, tColDataDestroy);
4✔
4847
    *colArr = dst;
4✔
4848
  }
4849
  return code;
4✔
4850
}
4851

4852
int32_t tColDataSortMerge(SArray **arr) {
40,892✔
4853
  SArray   *colDataArr = *arr;
40,892✔
4854
  int32_t   nColData = TARRAY_SIZE(colDataArr);
40,892✔
4855
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
40,892✔
4856

4857
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
40,892!
4858
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
4859
  }
4860
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
40,892!
4861
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
4862
  }
4863
  if (!(aColData[0].flag == HAS_VALUE)) {
40,892!
4864
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4865
  }
4866

4867
  if (aColData[0].nVal <= 1) goto _exit;
40,892✔
4868

4869
  int8_t doSort = 0;
40,710✔
4870
  int8_t doMerge = 0;
40,710✔
4871
  // scan -------
4872
  SRowKey lastKey;
4873
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
40,710✔
4874
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
106,401,024!
4875
    SRowKey key;
4876
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
108,665,246✔
4877

4878
    int32_t c = tRowKeyCompare(&lastKey, &key);
106,360,308✔
4879
    if (c < 0) {
106,360,308✔
4880
      lastKey = key;
106,178,423✔
4881
      continue;
106,178,423✔
4882
    } else if (c > 0) {
181,885✔
4883
      doSort = 1;
7✔
4884
      break;
7✔
4885
    } else {
4886
      doMerge = 1;
181,878✔
4887
    }
4888
  }
4889

4890
  // sort -------
4891
  if (doSort) {
×
4892
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
7!
4893
  }
4894

4895
  if (doMerge != 1) {
2,140,263✔
4896
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
40,748✔
4897
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
106,271,411!
4898
      SRowKey key;
4899
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
108,330,172✔
4900

4901
      int32_t c = tRowKeyCompare(&lastKey, &key);
106,230,665✔
4902
      if (c == 0) {
106,230,665✔
4903
        doMerge = 1;
1✔
4904
        break;
1✔
4905
      }
4906
      lastKey = key;
106,230,664✔
4907
    }
4908
  }
4909

4910
  // merge -------
4911
  if (doMerge) {
40,755✔
4912
    int32_t code = tColDataMerge(arr);
4✔
4913
    if (code) return code;
4!
4914
  }
4915

4916
_exit:
40,755✔
4917
  return 0;
40,937✔
4918
}
4919

4920
int32_t tColDataSortMergeWithBlob(SArray **arr, SBlobRow2 *pBlob) {
×
4921
  SArray   *colDataArr = *arr;
×
4922
  int32_t   nColData = TARRAY_SIZE(colDataArr);
×
4923
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
×
4924

4925
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
×
4926
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
4927
  }
4928
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
4929
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
4930
  }
4931
  if (!(aColData[0].flag == HAS_VALUE)) {
×
4932
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4933
  }
4934

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

4937
  int8_t doSort = 0;
×
4938
  int8_t doMerge = 0;
×
4939
  // scan -------
4940
  SRowKey lastKey;
4941
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
4942
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
4943
    SRowKey key;
4944
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
4945

4946
    int32_t c = tRowKeyCompare(&lastKey, &key);
×
4947
    if (c < 0) {
×
4948
      lastKey = key;
×
4949
      continue;
×
4950
    } else if (c > 0) {
×
4951
      doSort = 1;
×
4952
      break;
×
4953
    } else {
4954
      doMerge = 1;
×
4955
    }
4956
  }
4957

4958
  // sort -------
4959
  if (doSort) {
×
4960
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
×
4961
  }
4962

4963
  if (doMerge != 1) {
×
4964
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
4965
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
4966
      SRowKey key;
4967
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
4968

4969
      int32_t c = tRowKeyCompare(&lastKey, &key);
×
4970
      if (c == 0) {
×
4971
        doMerge = 1;
×
4972
        break;
×
4973
      }
4974
      lastKey = key;
×
4975
    }
4976
  }
4977

4978
  // merge -------
4979
  if (doMerge) {
×
4980
    int32_t code = tColDataMerge(arr);
×
4981
    if (code) return code;
×
4982
  }
4983

4984
_exit:
×
4985
  return 0;
×
4986
}
4987

4988
static int32_t tEncodeColDataVersion0(SEncoder *pEncoder, SColData *pColData) {
252,086✔
4989
  int32_t code = 0;
252,086✔
4990

4991
  if ((code = tEncodeI16v(pEncoder, pColData->cid))) return code;
504,172!
4992
  if ((code = tEncodeI8(pEncoder, pColData->type))) return code;
504,172!
4993
  if ((code = tEncodeI32v(pEncoder, pColData->nVal))) return code;
504,172!
4994
  if ((code = tEncodeI8(pEncoder, pColData->flag))) return code;
504,172!
4995

4996
  // bitmap
4997
  switch (pColData->flag) {
252,086!
4998
    case (HAS_NULL | HAS_NONE):
2,106✔
4999
    case (HAS_VALUE | HAS_NONE):
5000
    case (HAS_VALUE | HAS_NULL):
5001
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
2,106✔
5002
      if (code) return code;
2,106!
5003
      break;
2,106✔
5004
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5005
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
5006
      if (code) return code;
×
5007
      break;
×
5008
    default:
249,980✔
5009
      break;
249,980✔
5010
  }
5011

5012
  // value
5013
  if (pColData->flag & HAS_VALUE) {
252,086✔
5014
    if (IS_VAR_DATA_TYPE(pColData->type)) {
251,687!
5015
      code = tEncodeFixed(pEncoder, pColData->aOffset, pColData->nVal << 2);
1,774✔
5016
      if (code) return code;
1,774!
5017

5018
      code = tEncodeI32v(pEncoder, pColData->nData);
1,774✔
5019
      if (code) return code;
1,774!
5020

5021
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
1,774✔
5022
      if (code) return code;
1,774!
5023
    } else {
5024
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
249,913✔
5025
      if (code) return code;
249,913!
5026
    }
5027
  }
5028

5029
  return code;
252,086✔
5030
}
5031

5032
static int32_t tDecodeColDataVersion0(SDecoder *pDecoder, SColData *pColData) {
62,333✔
5033
  int32_t code = 0;
62,333✔
5034

5035
  if ((code = tDecodeI16v(pDecoder, &pColData->cid))) return code;
124,662!
5036
  if ((code = tDecodeI8(pDecoder, &pColData->type))) return code;
124,651!
5037
  if ((code = tDecodeI32v(pDecoder, &pColData->nVal))) return code;
124,632!
5038
  if ((code = tDecodeI8(pDecoder, &pColData->flag))) return code;
124,611!
5039

5040
  if (pColData->type <= 0 || pColData->type >= TSDB_DATA_TYPE_MAX || pColData->flag <= 0 || pColData->flag >= 8) {
62,301!
5041
    return TSDB_CODE_INVALID_PARA;
×
5042
  }
5043

5044
  // bitmap
5045
  switch (pColData->flag) {
62,309!
5046
    case (HAS_NULL | HAS_NONE):
112✔
5047
    case (HAS_VALUE | HAS_NONE):
5048
    case (HAS_VALUE | HAS_NULL):
5049
      code = tDecodeBinaryWithSize(pDecoder, BIT1_SIZE(pColData->nVal), &pColData->pBitMap);
112!
5050
      if (code) return code;
112!
5051
      break;
112✔
5052
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5053
      code = tDecodeBinaryWithSize(pDecoder, BIT2_SIZE(pColData->nVal), &pColData->pBitMap);
×
5054
      if (code) return code;
×
5055
      break;
×
5056
    default:
62,197✔
5057
      break;
62,197✔
5058
  }
5059

5060
  // value
5061
  if (pColData->flag & HAS_VALUE) {
62,309✔
5062
    if (IS_VAR_DATA_TYPE(pColData->type)) {
62,116!
5063
      code = tDecodeBinaryWithSize(pDecoder, pColData->nVal << 2, (uint8_t **)&pColData->aOffset);
379!
5064
      if (code) return code;
379!
5065

5066
      code = tDecodeI32v(pDecoder, &pColData->nData);
379✔
5067
      if (code) return code;
378!
5068

5069
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
378!
5070
      if (code) return code;
378!
5071
    } else {
5072
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
61,737✔
5073
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
61,737!
5074
      if (code) return code;
61,737!
5075
    }
5076
  }
5077
  pColData->cflag = 0;
62,308✔
5078

5079
  return code;
62,308✔
5080
}
5081

5082
static int32_t tEncodeColDataVersion1(SEncoder *pEncoder, SColData *pColData) {
252,092✔
5083
  int32_t code = tEncodeColDataVersion0(pEncoder, pColData);
252,092✔
5084
  if (code) return code;
252,075!
5085
  return tEncodeI8(pEncoder, pColData->cflag);
504,150✔
5086
}
5087

5088
static int32_t tDecodeColDataVersion1(SDecoder *pDecoder, SColData *pColData) {
62,333✔
5089
  int32_t code = tDecodeColDataVersion0(pDecoder, pColData);
62,333✔
5090
  if (code) return code;
62,311!
5091

5092
  code = tDecodeI8(pDecoder, &pColData->cflag);
62,311✔
5093
  return code;
62,313✔
5094
}
5095

5096
int32_t tEncodeColData(uint8_t version, SEncoder *pEncoder, SColData *pColData) {
252,091✔
5097
  if (version == 0) {
252,091!
5098
    return tEncodeColDataVersion0(pEncoder, pColData);
×
5099
  } else if (version == 1) {
252,091!
5100
    return tEncodeColDataVersion1(pEncoder, pColData);
252,095✔
5101
  } else {
5102
    return TSDB_CODE_INVALID_PARA;
×
5103
  }
5104
}
5105

5106
int32_t tDecodeColData(uint8_t version, SDecoder *pDecoder, SColData *pColData) {
62,333✔
5107
  if (version == 0) {
62,333!
5108
    return tDecodeColDataVersion0(pDecoder, pColData);
×
5109
  } else if (version == 1) {
62,333!
5110
    return tDecodeColDataVersion1(pDecoder, pColData);
62,334✔
5111
  } else {
5112
    return TSDB_CODE_INVALID_PARA;
×
5113
  }
5114
}
5115

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

5118
int32_t tDecodeRow(SDecoder *pDecoder, SRow **ppRow) {
1,605,393,696✔
5119
  if (ppRow == NULL) {
1,605,393,696!
5120
    return TSDB_CODE_INVALID_PARA;
×
5121
  }
5122

5123
  if (pDecoder->pos + sizeof(SRow) > pDecoder->size) {
1,605,393,696!
5124
    return TSDB_CODE_OUT_OF_RANGE;
×
5125
  }
5126

5127
  SRow *pRow = (SRow *)(pDecoder->data + pDecoder->pos);
1,605,393,696✔
5128
  return tDecodeBinaryWithSize(pDecoder, pRow->len, (uint8_t **)ppRow);
2,147,483,647!
5129
}
5130

5131
int32_t tEncodeBlobRow2(SEncoder *pEncoder, SBlobRow2 *pRow) {
2✔
5132
  int32_t code = 0;
2✔
5133
  int32_t lino = 0;
2✔
5134
  uint8_t compressed = 0;
2✔
5135
  int32_t compressSize = 0;
2✔
5136
  char   *p = NULL;
2✔
5137

5138
  TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pRow->type));
4!
5139
  TAOS_CHECK_EXIT(tEncodeI64(pEncoder, pRow->len));
4!
5140

5141
  int32_t nSeq = taosArrayGetSize(pRow->pSeqTable);
2✔
5142
  TAOS_CHECK_EXIT(tEncodeI32(pEncoder, nSeq));
2!
5143

5144
  // if (pRow->type) {
5145
  void *pIter = taosHashIterate(pRow->pSeqToffset, NULL);
2✔
5146
  while (pIter) {
22✔
5147
    uint64_t seq = *(uint64_t *)taosHashGetKey(pIter, NULL);
20✔
5148
    int32_t  idx = *(int32_t *)pIter;
20✔
5149
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, seq));
20!
5150
    TAOS_CHECK_EXIT(tEncodeI32(pEncoder, idx));
20!
5151

5152
    pIter = taosHashIterate(pRow->pSeqToffset, pIter);
20✔
5153
  }
5154
  //}
5155
  for (int32_t i = 0; i < nSeq; i++) {
22✔
5156
    SBlobValue *p = taosArrayGet(pRow->pSeqTable, i);
20✔
5157
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, p->offset));
40!
5158
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->len));
40!
5159
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->dataOffset));
40!
5160
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->nextRow));
40!
5161
  }
5162

5163
  TAOS_CHECK_EXIT(tEncodeFixed(pEncoder, pRow->data, pRow->len));
4!
5164

5165
_exit:
2✔
5166
  return code;
2✔
5167
}
5168

5169
int32_t tDecodeBlobRow2(SDecoder *pDecoder, SBlobRow2 **pBlobRow) {
×
5170
  int32_t    code = 0;
×
5171
  int32_t    lino = 0;
×
5172
  int32_t    nSeq = 0;
×
5173
  uint8_t    compressd = 0;
×
5174
  int32_t    compressSize = 0;
×
5175
  SBlobRow2 *pBlob = taosMemCalloc(1, sizeof(SBlobRow2));
×
5176
  if (pBlob == NULL) {
×
5177
    TAOS_CHECK_EXIT(terrno);
×
5178
  }
5179
  TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &pBlob->type));
×
5180
  TAOS_CHECK_EXIT(tDecodeI64(pDecoder, &pBlob->len));
×
5181

5182
  TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &nSeq));
×
5183

5184
  // if (pBlob->type) {
5185
  pBlob->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
×
5186
  if (pBlob->pSeqToffset == NULL) {
×
5187
    TAOS_CHECK_EXIT(terrno);
×
5188
  }
5189
  for (int32_t i = 0; i < nSeq; i++) {
×
5190
    uint64_t seq;
5191
    int32_t  idx;
5192
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &seq));
×
5193
    TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &idx));
×
5194

5195
    code = taosHashPut(pBlob->pSeqToffset, &seq, sizeof(seq), &idx, sizeof(idx));
×
5196
    TAOS_CHECK_EXIT(code);
×
5197
  }
5198
  //}
5199

5200
  pBlob->pSeqTable = taosArrayInit(nSeq, sizeof(SBlobValue));
×
5201
  if (pBlob->pSeqTable == NULL) {
×
5202
    TAOS_CHECK_EXIT(terrno);
×
5203
  }
5204

5205
  for (int32_t i = 0; i < nSeq; i++) {
×
5206
    SBlobValue value;
5207
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &value.offset));
×
5208
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.len));
×
5209
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.dataOffset));
×
5210
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.nextRow));
×
5211
    if (taosArrayPush(pBlob->pSeqTable, &value) == NULL) {
×
5212
      TAOS_CHECK_EXIT(terrno);
×
5213
    }
5214
  }
5215

5216
  pBlob->data = taosMemCalloc(1, pBlob->len);
×
5217
  if (pBlob->data == NULL) {
×
5218
    TAOS_CHECK_EXIT(terrno);
×
5219
  }
5220

5221
  TAOS_CHECK_EXIT(tDecodeFixed(pDecoder, pBlob->data, pBlob->len));
×
5222
  *pBlobRow = pBlob;
×
5223

5224
  uInfo("decode blob len:%d", (int32_t)(pBlob->len));
×
5225

5226
_exit:
×
5227
  if (code != 0) {
×
5228
    if (pBlob != NULL) {
×
5229
      taosMemoryFree(pBlob->data);
×
5230
      taosArrayDestroy(pBlob->pSeqTable);
×
5231
      taosMemoryFree(pBlob);
×
5232
    }
5233
  }
5234
  return code;
×
5235
}
5236

5237
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
5238
  do {                                       \
5239
    (SUM) += (VAL);                          \
5240
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
5241
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
5242
  } while (0)
5243

5244
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, SColumnDataAgg *pAggs) {
19,819✔
5245
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
19,819✔
5246
  int16_t *numOfNull = &pAggs->numOfNull;
19,819✔
5247
  *sum = 0;
19,819✔
5248
  *max = 0;
19,819✔
5249
  *min = 1;
19,819✔
5250
  *numOfNull = 0;
19,819✔
5251

5252
  int8_t val;
5253
  if (HAS_VALUE == pColData->flag) {
19,819✔
5254
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,620,321✔
5255
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
4,608,002✔
5256
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,608,002✔
5257
    }
5258
  } else {
5259
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,507,500✔
5260
      switch (tColDataGetBitValue(pColData, iVal)) {
2,500,000!
5261
        case 0:
1,500,000✔
5262
        case 1:
5263
          (*numOfNull)++;
1,500,000✔
5264
          break;
1,500,000✔
5265
        case 2:
1,000,000✔
5266
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
1,000,000✔
5267
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,000,000✔
5268
          break;
1,000,000✔
5269
        default:
×
5270
          break;
×
5271
      }
5272
    }
5273
  }
5274
}
19,819✔
5275

5276
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
19,955✔
5277
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
19,955✔
5278
  int16_t *numOfNull = &pAggs->numOfNull;
19,955✔
5279
  *sum = 0;
19,955✔
5280
  *max = INT8_MIN;
19,955✔
5281
  *min = INT8_MAX;
19,955✔
5282
  *numOfNull = 0;
19,955✔
5283

5284
  int8_t val;
5285
  if (HAS_VALUE == pColData->flag) {
19,955✔
5286
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,862,238✔
5287
      val = ((int8_t *)pColData->pData)[iVal];
4,849,798✔
5288
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,849,798✔
5289
    }
5290
  } else {
5291
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,522,515✔
5292
      switch (tColDataGetBitValue(pColData, iVal)) {
2,515,000!
5293
        case 0:
1,853,214✔
5294
        case 1:
5295
          (*numOfNull)++;
1,853,214✔
5296
          break;
1,853,214✔
5297
        case 2:
661,786✔
5298
          val = ((int8_t *)pColData->pData)[iVal];
661,786✔
5299
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
661,786✔
5300
          break;
661,786✔
5301
        default:
×
5302
          break;
×
5303
      }
5304
    }
5305
  }
5306
}
19,955✔
5307

5308
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
19,854✔
5309
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
19,854✔
5310
  int16_t *numOfNull = &pAggs->numOfNull;
19,854✔
5311
  *sum = 0;
19,854✔
5312
  *max = INT16_MIN;
19,854✔
5313
  *min = INT16_MAX;
19,854✔
5314
  *numOfNull = 0;
19,854✔
5315

5316
  int16_t val;
5317
  if (HAS_VALUE == pColData->flag) {
19,854✔
5318
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
4,741,784✔
5319
      val = ((int16_t *)pColData->pData)[iVal];
4,729,430✔
5320
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
4,729,430✔
5321
    }
5322
  } else {
5323
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,507,500✔
5324
      switch (tColDataGetBitValue(pColData, iVal)) {
2,500,000!
5325
        case 0:
1,841,248✔
5326
        case 1:
5327
          (*numOfNull)++;
1,841,248✔
5328
          break;
1,841,248✔
5329
        case 2:
658,752✔
5330
          val = ((int16_t *)pColData->pData)[iVal];
658,752✔
5331
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
658,752✔
5332
          break;
658,752✔
5333
        default:
×
5334
          break;
×
5335
      }
5336
    }
5337
  }
5338
}
19,854✔
5339

5340
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, SColumnDataAgg *pAggs) {
626,425✔
5341
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
626,425✔
5342
  int16_t *numOfNull = &pAggs->numOfNull;
626,425✔
5343
  *sum = 0;
626,425✔
5344
  *max = INT32_MIN;
626,425✔
5345
  *min = INT32_MAX;
626,425✔
5346
  *numOfNull = 0;
626,425✔
5347

5348
  int32_t val;
5349
  if (HAS_VALUE == pColData->flag) {
626,425✔
5350
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,707,450,786✔
5351
      val = ((int32_t *)pColData->pData)[iVal];
1,706,928,133✔
5352
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
1,706,928,133✔
5353
    }
5354
  } else {
5355
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
186,166,973✔
5356
      switch (tColDataGetBitValue(pColData, iVal)) {
186,064,414!
5357
        case 0:
17,569,755✔
5358
        case 1:
5359
          (*numOfNull)++;
17,569,755✔
5360
          break;
17,569,755✔
5361
        case 2:
168,580,291✔
5362
          val = ((int32_t *)pColData->pData)[iVal];
168,580,291✔
5363
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
168,580,291✔
5364
          break;
168,580,291✔
5365
        default:
×
5366
          break;
×
5367
      }
5368
    }
5369
  }
5370
}
625,212✔
5371

5372
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, SColumnDataAgg *pAggs) {
188,137✔
5373
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
188,137✔
5374
  int16_t *numOfNull = &pAggs->numOfNull;
188,137✔
5375
  *sum = 0;
188,137✔
5376
  *max = INT64_MIN;
188,137✔
5377
  *min = INT64_MAX;
188,137✔
5378
  *numOfNull = 0;
188,137✔
5379

5380
  int64_t val;
5381
  if (HAS_VALUE == pColData->flag) {
188,137✔
5382
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
463,340,578✔
5383
      val = ((int64_t *)pColData->pData)[iVal];
463,164,431✔
5384
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
463,164,431✔
5385
    }
5386
  } else {
5387
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
17,699,204✔
5388
      switch (tColDataGetBitValue(pColData, iVal)) {
17,687,214!
5389
        case 0:
3,152,788✔
5390
        case 1:
5391
          (*numOfNull)++;
3,152,788✔
5392
          break;
3,152,788✔
5393
        case 2:
14,534,426✔
5394
          val = ((int64_t *)pColData->pData)[iVal];
14,534,426✔
5395
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
14,534,426✔
5396
          break;
14,534,426✔
5397
        default:
×
5398
          break;
×
5399
      }
5400
    }
5401
  }
5402
}
188,137✔
5403

5404
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, SColumnDataAgg *pAggs) {
494,350✔
5405
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
494,350✔
5406
  int16_t *numOfNull = &pAggs->numOfNull;
494,350✔
5407
  *(double *)sum = 0;
494,350✔
5408
  *(double *)max = -FLT_MAX;
494,350✔
5409
  *(double *)min = FLT_MAX;
494,350✔
5410
  *numOfNull = 0;
494,350✔
5411

5412
  float val;
5413
  if (HAS_VALUE == pColData->flag) {
494,350✔
5414
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,946,729,170✔
5415
      val = ((float *)pColData->pData)[iVal];
1,946,242,336✔
5416
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
1,946,242,336✔
5417
    }
5418
  } else {
5419
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,522,621✔
5420
      switch (tColDataGetBitValue(pColData, iVal)) {
2,515,105!
5421
        case 0:
1,853,427✔
5422
        case 1:
5423
          (*numOfNull)++;
1,853,427✔
5424
          break;
1,853,427✔
5425
        case 2:
661,678✔
5426
          val = ((float *)pColData->pData)[iVal];
661,678✔
5427
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
661,678✔
5428
          break;
661,678✔
5429
        default:
×
5430
          break;
×
5431
      }
5432
    }
5433
  }
5434
}
494,350✔
5435

5436
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, SColumnDataAgg *pAggs) {
31,145✔
5437
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
31,145✔
5438
  int16_t *numOfNull = &pAggs->numOfNull;
31,145✔
5439
  *(double *)sum = 0;
31,145✔
5440
  *(double *)max = -DBL_MAX;
31,145✔
5441
  *(double *)min = DBL_MAX;
31,145✔
5442
  *numOfNull = 0;
31,145✔
5443

5444
  double val;
5445
  if (HAS_VALUE == pColData->flag) {
31,145✔
5446
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
22,104,742✔
5447
      val = ((double *)pColData->pData)[iVal];
22,081,112✔
5448
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
22,081,112✔
5449
    }
5450
  } else {
5451
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,522,515✔
5452
      switch (tColDataGetBitValue(pColData, iVal)) {
2,515,000!
5453
        case 0:
1,850,978✔
5454
        case 1:
5455
          (*numOfNull)++;
1,850,978✔
5456
          break;
1,850,978✔
5457
        case 2:
664,022✔
5458
          val = ((double *)pColData->pData)[iVal];
664,022✔
5459
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
664,022✔
5460
          break;
664,022✔
5461
        default:
×
5462
          break;
×
5463
      }
5464
    }
5465
  }
5466
}
31,145✔
5467

5468
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
4,571✔
5469
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
4,571✔
5470
  int16_t *numOfNull = &pAggs->numOfNull;
4,571✔
5471
  *(uint64_t *)sum = 0;
4,571✔
5472
  *(uint64_t *)max = 0;
4,571✔
5473
  *(uint64_t *)min = UINT8_MAX;
4,571✔
5474
  *numOfNull = 0;
4,571✔
5475

5476
  uint8_t val;
5477
  if (HAS_VALUE == pColData->flag) {
4,571!
5478
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,796,402✔
5479
      val = ((uint8_t *)pColData->pData)[iVal];
3,791,831✔
5480
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,791,831✔
5481
    }
5482
  } else {
5483
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
5484
      switch (tColDataGetBitValue(pColData, iVal)) {
×
5485
        case 0:
×
5486
        case 1:
5487
          (*numOfNull)++;
×
5488
          break;
×
5489
        case 2:
×
5490
          val = ((uint8_t *)pColData->pData)[iVal];
×
5491
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
×
5492
          break;
×
5493
        default:
×
5494
          break;
×
5495
      }
5496
    }
5497
  }
5498
}
4,571✔
5499

5500
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
4,571✔
5501
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
4,571✔
5502
  int16_t *numOfNull = &pAggs->numOfNull;
4,571✔
5503
  *(uint64_t *)sum = 0;
4,571✔
5504
  *(uint64_t *)max = 0;
4,571✔
5505
  *(uint64_t *)min = UINT16_MAX;
4,571✔
5506
  *numOfNull = 0;
4,571✔
5507

5508
  uint16_t val;
5509
  if (HAS_VALUE == pColData->flag) {
4,571!
5510
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,796,446✔
5511
      val = ((uint16_t *)pColData->pData)[iVal];
3,791,875✔
5512
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,791,875✔
5513
    }
5514
  } else {
5515
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
5516
      switch (tColDataGetBitValue(pColData, iVal)) {
×
5517
        case 0:
×
5518
        case 1:
5519
          (*numOfNull)++;
×
5520
          break;
×
5521
        case 2:
×
5522
          val = ((uint16_t *)pColData->pData)[iVal];
×
5523
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
×
5524
          break;
×
5525
        default:
×
5526
          break;
×
5527
      }
5528
    }
5529
  }
5530
}
4,571✔
5531

5532
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, SColumnDataAgg *pAggs) {
4,571✔
5533
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
4,571✔
5534
  int16_t *numOfNull = &pAggs->numOfNull;
4,571✔
5535
  *(uint64_t *)sum = 0;
4,571✔
5536
  *(uint64_t *)max = 0;
4,571✔
5537
  *(uint64_t *)min = UINT32_MAX;
4,571✔
5538
  *numOfNull = 0;
4,571✔
5539

5540
  uint32_t val;
5541
  if (HAS_VALUE == pColData->flag) {
4,571!
5542
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,796,461✔
5543
      val = ((uint32_t *)pColData->pData)[iVal];
3,791,890✔
5544
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,791,890✔
5545
    }
5546
  } else {
5547
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
5548
      switch (tColDataGetBitValue(pColData, iVal)) {
×
5549
        case 0:
×
5550
        case 1:
5551
          (*numOfNull)++;
×
5552
          break;
×
5553
        case 2:
×
5554
          val = ((uint32_t *)pColData->pData)[iVal];
×
5555
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
×
5556
          break;
×
5557
        default:
×
5558
          break;
×
5559
      }
5560
    }
5561
  }
5562
}
4,571✔
5563

5564
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, SColumnDataAgg *pAggs) {
4,571✔
5565
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
4,571✔
5566
  int16_t *numOfNull = &pAggs->numOfNull;
4,571✔
5567
  *(uint64_t *)sum = 0;
4,571✔
5568
  *(uint64_t *)max = 0;
4,571✔
5569
  *(uint64_t *)min = UINT64_MAX;
4,571✔
5570
  *numOfNull = 0;
4,571✔
5571

5572
  uint64_t val;
5573
  if (HAS_VALUE == pColData->flag) {
4,571!
5574
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,796,461✔
5575
      val = ((uint64_t *)pColData->pData)[iVal];
3,791,890✔
5576
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
3,791,890✔
5577
    }
5578
  } else {
5579
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
5580
      switch (tColDataGetBitValue(pColData, iVal)) {
×
5581
        case 0:
×
5582
        case 1:
5583
          (*numOfNull)++;
×
5584
          break;
×
5585
        case 2:
×
5586
          val = ((uint64_t *)pColData->pData)[iVal];
×
5587
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
×
5588
          break;
×
5589
        default:
×
5590
          break;
×
5591
      }
5592
    }
5593
  }
5594
}
4,571✔
5595

5596
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, SColumnDataAgg *pAggs) {
41,041✔
5597
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
41,041✔
5598
  int16_t *numOfNull = &pAggs->numOfNull;
41,041✔
5599
  *(uint64_t *)sum = 0;
41,041✔
5600
  *(uint64_t *)max = 0;
41,041✔
5601
  *(uint64_t *)min = 0;
41,041✔
5602
  *numOfNull = 0;
41,041✔
5603

5604
  switch (pColData->flag) {
41,041!
5605
    case HAS_NONE:
×
5606
    case HAS_NULL:
5607
    case (HAS_NONE | HAS_NULL):
5608
      *numOfNull = pColData->nVal;
×
5609
      break;
×
5610
    case HAS_VALUE:
32,176✔
5611
      *numOfNull = 0;
32,176✔
5612
      break;
32,176✔
5613
    case (HAS_VALUE | HAS_NULL):
8,865✔
5614
    case (HAS_VALUE | HAS_NONE):
5615
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,973,865✔
5616
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
2,965,000✔
5617
          (*numOfNull)++;
1,782,029✔
5618
        }
5619
      }
5620
      break;
8,865✔
5621
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
5622
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
5623
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
5624
          (*numOfNull)++;
×
5625
        }
5626
      }
5627
      break;
×
5628
    default:
×
5629
      break;
×
5630
  }
5631
}
41,041✔
5632

5633
#define CALC_DECIMAL_SUM_MAX_MIN(TYPE, pSumOp, pCompOp, pColData, pSum, pMax, pMin)                   \
5634
  do {                                                                                                \
5635
    if (decimal128AddCheckOverflow((Decimal *)pSum, pVal, DECIMAL_WORD_NUM(TYPE))) *pOverflow = true; \
5636
    pSumOp->add(pSum, pVal, DECIMAL_WORD_NUM(TYPE));                                                  \
5637
    if (pCompOp->gt(pVal, pMax, DECIMAL_WORD_NUM(TYPE))) {                                            \
5638
      *(pMax) = *pVal;                                                                                \
5639
    }                                                                                                 \
5640
    if (pCompOp->lt(pVal, pMin, DECIMAL_WORD_NUM(TYPE))) {                                            \
5641
      *(pMin) = *pVal;                                                                                \
5642
    }                                                                                                 \
5643
  } while (0)
5644

5645
static FORCE_INLINE void tColDataCalcSMADecimal64Type(SColData *pColData, SColumnDataAgg *pAggs) {
130✔
5646
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum;
130✔
5647
  Decimal64  *pMax = (Decimal64 *)pAggs->decimal128Max, *pMin = (Decimal64 *)pAggs->decimal128Min;
130✔
5648
  uint8_t    *pOverflow = &pAggs->overflow;
130✔
5649
  *pSum = DECIMAL128_ZERO;
130✔
5650
  *pMax = DECIMAL64_MIN;
130✔
5651
  *pMin = DECIMAL64_MAX;
130✔
5652
  pAggs->numOfNull = 0;
130✔
5653
  pAggs->colId |= DECIMAL_AGG_FLAG;
130✔
5654

5655
  Decimal64         *pVal = NULL;
130✔
5656
  const SDecimalOps *pSumOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
130✔
5657
  const SDecimalOps *pCompOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
130✔
5658
  if (HAS_VALUE == pColData->flag) {
130✔
5659
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
808✔
5660
      pVal = ((Decimal64 *)pColData->pData) + iVal;
800✔
5661
      CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
800!
5662
    }
5663
  } else {
5664
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
91,522✔
5665
      switch (tColDataGetBitValue(pColData, iVal)) {
91,400!
5666
        case 0:
6,128✔
5667
        case 1:
5668
          pAggs->numOfNull++;
6,128✔
5669
          break;
6,128✔
5670
        case 2:
85,272✔
5671
          pVal = ((Decimal64 *)pColData->pData) + iVal;
85,272✔
5672
          CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
85,272!
5673
          break;
85,272✔
5674
        default:
×
5675
          break;
×
5676
      }
5677
    }
5678
  }
5679
}
130✔
5680

5681
static FORCE_INLINE void tColDataCalcSMADecimal128Type(SColData *pColData, SColumnDataAgg *pAggs) {
328✔
5682
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum, *pMax = (Decimal128 *)pAggs->decimal128Max,
328✔
5683
             *pMin = (Decimal128 *)pAggs->decimal128Min;
328✔
5684
  uint8_t *pOverflow = &pAggs->overflow;
328✔
5685
  *pSum = DECIMAL128_ZERO;
328✔
5686
  *pMax = DECIMAL128_MIN;
328✔
5687
  *pMin = DECIMAL128_MAX;
328✔
5688
  pAggs->numOfNull = 0;
328✔
5689
  pAggs->colId |= DECIMAL_AGG_FLAG;
328✔
5690

5691
  Decimal128        *pVal = NULL;
328✔
5692
  const SDecimalOps *pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
328✔
5693
  if (HAS_VALUE == pColData->flag) {
328✔
5694
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
808✔
5695
      pVal = ((Decimal128 *)pColData->pData) + iVal;
800✔
5696
      CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
800✔
5697
    }
5698
  } else {
5699
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
289,720✔
5700
      switch (tColDataGetBitValue(pColData, iVal)) {
289,400!
5701
        case 0:
18,223✔
5702
        case 1:
5703
          pAggs->numOfNull++;
18,223✔
5704
          break;
18,223✔
5705
        case 2:
271,177✔
5706
          pVal = ((Decimal128 *)pColData->pData) + iVal;
271,177✔
5707
          CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
271,177✔
5708
          break;
271,177✔
5709
        default:
×
5710
          break;
×
5711
      }
5712
    }
5713
  }
5714
}
328✔
5715

5716
void (*tColDataCalcSMA[])(SColData *pColData, SColumnDataAgg *pAggs) = {
5717
    NULL,
5718
    tColDataCalcSMABool,            // TSDB_DATA_TYPE_BOOL
5719
    tColDataCalcSMATinyInt,         // TSDB_DATA_TYPE_TINYINT
5720
    tColDataCalcSMATinySmallInt,    // TSDB_DATA_TYPE_SMALLINT
5721
    tColDataCalcSMAInt,             // TSDB_DATA_TYPE_INT
5722
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_BIGINT
5723
    tColDataCalcSMAFloat,           // TSDB_DATA_TYPE_FLOAT
5724
    tColDataCalcSMADouble,          // TSDB_DATA_TYPE_DOUBLE
5725
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARCHAR
5726
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_TIMESTAMP
5727
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_NCHAR
5728
    tColDataCalcSMAUTinyInt,        // TSDB_DATA_TYPE_UTINYINT
5729
    tColDataCalcSMATinyUSmallInt,   // TSDB_DATA_TYPE_USMALLINT
5730
    tColDataCalcSMAUInt,            // TSDB_DATA_TYPE_UINT
5731
    tColDataCalcSMAUBigInt,         // TSDB_DATA_TYPE_UBIGINT
5732
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_JSON
5733
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARBINARY
5734
    tColDataCalcSMADecimal128Type,  // TSDB_DATA_TYPE_DECIMAL
5735
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_BLOB
5736
    NULL,                           // TSDB_DATA_TYPE_MEDIUMBLOB
5737
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_GEOMETRY
5738
    tColDataCalcSMADecimal64Type,   // TSDB_DATA_TYPE_DECIMAL64
5739
};
5740

5741
// SValueColumn ================================
5742
int32_t tValueColumnInit(SValueColumn *valCol) {
32,843,882✔
5743
  valCol->type = TSDB_DATA_TYPE_NULL;
32,843,882✔
5744
  valCol->numOfValues = 0;
32,843,882✔
5745
  tBufferInit(&valCol->data);
32,843,882✔
5746
  tBufferInit(&valCol->offsets);
32,843,882✔
5747
  return 0;
32,843,882✔
5748
}
5749

5750
void tValueColumnDestroy(SValueColumn *valCol) {
78,959,050✔
5751
  valCol->type = TSDB_DATA_TYPE_NULL;
78,959,050✔
5752
  valCol->numOfValues = 0;
78,959,050✔
5753
  tBufferDestroy(&valCol->data);
78,959,050✔
5754
  tBufferDestroy(&valCol->offsets);
78,959,465✔
5755
  return;
78,959,488✔
5756
}
5757

5758
void tValueColumnClear(SValueColumn *valCol) {
37,251,402✔
5759
  valCol->type = TSDB_DATA_TYPE_NULL;
37,251,402✔
5760
  valCol->numOfValues = 0;
37,251,402✔
5761
  tBufferClear(&valCol->data);
37,251,402✔
5762
  tBufferClear(&valCol->offsets);
37,251,402✔
5763
  return;
37,251,402✔
5764
}
5765

5766
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
1,815,639✔
5767
  int32_t code;
5768

5769
  if (valCol->numOfValues == 0) {
1,815,639✔
5770
    valCol->type = value->type;
16,848✔
5771
  }
5772

5773
  if (!(value->type == valCol->type)) {
1,815,639!
5774
    return TSDB_CODE_INVALID_PARA;
×
5775
  }
5776

5777
  if (IS_VAR_DATA_TYPE(value->type)) {
1,815,639!
5778
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
18,748!
5779
      return code;
×
5780
    }
5781
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
18,748!
5782
      return code;
×
5783
    }
5784
  } else {
5785
    code = tBufferPut(&valCol->data, VALUE_GET_DATUM(value, value->type), tDataTypes[value->type].bytes);
1,806,265!
5786
    if (code) return code;
1,806,265!
5787
  }
5788
  valCol->numOfValues++;
1,815,639✔
5789

5790
  return 0;
1,815,639✔
5791
}
5792

5793
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
474,147,036✔
5794
  int32_t code;
5795

5796
  if (idx < 0 || idx >= valCol->numOfValues) {
474,147,036!
5797
    return TSDB_CODE_OUT_OF_RANGE;
×
5798
  }
5799

5800
  if (IS_VAR_DATA_TYPE(valCol->type)) {
474,220,427!
5801
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
×
5802
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
×
5803
    int32_t  oldDataSize = nextOffset - offsets[idx];
×
5804
    int32_t  bytesAdded = value->nData - oldDataSize;
×
5805

5806
    if (bytesAdded != 0) {
×
5807
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
×
5808
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
×
5809
              tBufferGetSize(&valCol->data) - nextOffset);
×
5810
      valCol->data.size += bytesAdded;
×
5811

5812
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
×
5813
        offsets[i] += bytesAdded;
×
5814
      }
5815
    }
5816
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
×
5817
  } else {
5818
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, VALUE_GET_DATUM(value, valCol->type),
474,302,713!
5819
                        tDataTypes[valCol->type].bytes);
474,302,713✔
5820
  }
5821
  return 0;
5822
}
5823

5824
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
957,123,740✔
5825
  if (idx < 0 || idx >= valCol->numOfValues) {
957,123,740!
5826
    return TSDB_CODE_OUT_OF_RANGE;
×
5827
  }
5828

5829
  value->type = valCol->type;
957,341,557✔
5830
  if (IS_VAR_DATA_TYPE(value->type)) {
957,341,557!
5831
    int32_t       offset, nextOffset;
5832
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
480,135✔
5833

5834
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
480,135!
5835
    if (idx == valCol->numOfValues - 1) {
828,672✔
5836
      nextOffset = tBufferGetSize(&valCol->data);
295,637✔
5837
    } else {
5838
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
533,035✔
5839
    }
5840
    value->nData = nextOffset - offset;
827,825✔
5841
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
827,825✔
5842
  } else {
5843
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
956,861,422✔
5844
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, VALUE_GET_DATUM(value, value->type)));
1,913,722,844!
5845
  }
5846
  return 0;
957,689,247✔
5847
}
5848

5849
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
16,848✔
5850
  int32_t code;
5851

5852
  if (!(valCol->numOfValues > 0)) {
16,848!
5853
    return TSDB_CODE_INVALID_PARA;
×
5854
  }
5855

5856
  (*info) = (SValueColumnCompressInfo){
16,848✔
5857
      .cmprAlg = info->cmprAlg,
16,848✔
5858
      .type = valCol->type,
16,848✔
5859
  };
5860

5861
  // offset
5862
  if (IS_VAR_DATA_TYPE(valCol->type)) {
16,848!
5863
    SCompressInfo cinfo = {
3,186✔
5864
        .cmprAlg = info->cmprAlg,
3,186✔
5865
        .dataType = TSDB_DATA_TYPE_INT,
5866
        .originalSize = valCol->offsets.size,
3,186✔
5867
    };
5868

5869
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
3,186✔
5870
    if (code) return code;
3,188!
5871

5872
    info->offsetOriginalSize = cinfo.originalSize;
3,188✔
5873
    info->offsetCompressedSize = cinfo.compressedSize;
3,188✔
5874
  }
5875

5876
  // data
5877
  SCompressInfo cinfo = {
16,850✔
5878
      .cmprAlg = info->cmprAlg,
16,850✔
5879
      .dataType = valCol->type,
16,850✔
5880
      .originalSize = valCol->data.size,
16,850✔
5881
  };
5882

5883
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
16,850✔
5884
  if (code) return code;
16,850!
5885

5886
  info->dataOriginalSize = cinfo.originalSize;
16,850✔
5887
  info->dataCompressedSize = cinfo.compressedSize;
16,850✔
5888

5889
  return 0;
16,850✔
5890
}
5891

5892
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
1,140,168✔
5893
                               SBuffer *assist) {
5894
  int32_t code;
5895

5896
  tValueColumnClear(valCol);
1,140,168✔
5897
  valCol->type = info->type;
1,140,278✔
5898
  // offset
5899
  if (IS_VAR_DATA_TYPE(valCol->type)) {
1,663,260!
5900
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
522,481✔
5901

5902
    SCompressInfo cinfo = {
522,481✔
5903
        .dataType = TSDB_DATA_TYPE_INT,
5904
        .cmprAlg = info->cmprAlg,
522,481✔
5905
        .originalSize = info->offsetOriginalSize,
522,481✔
5906
        .compressedSize = info->offsetCompressedSize,
522,481✔
5907
    };
5908

5909
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
522,481✔
5910
    if (code) {
522,982!
5911
      return code;
×
5912
    }
5913
  } else {
5914
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
617,797✔
5915
  }
5916

5917
  // data
5918
  SCompressInfo cinfo = {
1,140,779✔
5919
      .dataType = valCol->type,
1,140,779✔
5920
      .cmprAlg = info->cmprAlg,
1,140,779✔
5921
      .originalSize = info->dataOriginalSize,
1,140,779✔
5922
      .compressedSize = info->dataCompressedSize,
1,140,779✔
5923
  };
5924

5925
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
1,140,779✔
5926
  if (code) {
1,140,945!
5927
    return code;
×
5928
  }
5929

5930
  return 0;
1,140,945✔
5931
}
5932

5933
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
16,850✔
5934
  int32_t code;
5935
  uint8_t fmtVer = 0;
16,850✔
5936

5937
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
33,700!
5938
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
33,700!
5939
  if ((code = tBufferPutI8(buffer, info->type))) return code;
33,700!
5940
  if (IS_VAR_DATA_TYPE(info->type)) {
16,850!
5941
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
6,372!
5942
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
6,372!
5943
  }
5944
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
33,700!
5945
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
33,700!
5946

5947
  return 0;
16,850✔
5948
}
5949

5950
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
1,140,134✔
5951
  int32_t code;
5952
  uint8_t fmtVer;
5953

5954
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
1,140,134!
5955
  if (fmtVer == 0) {
1,140,067!
5956
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
1,140,120!
5957
    if ((code = tBufferGetI8(reader, &info->type))) return code;
1,139,902!
5958
    if (IS_VAR_DATA_TYPE(info->type)) {
1,140,042!
5959
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
522,327!
5960
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
522,573!
5961
    } else {
5962
      info->offsetOriginalSize = 0;
617,715✔
5963
      info->offsetCompressedSize = 0;
617,715✔
5964
    }
5965
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
1,140,330!
5966
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
1,140,068!
5967
  } else {
5968
    return TSDB_CODE_INVALID_PARA;
×
5969
  }
5970

5971
  return 0;
1,139,929✔
5972
}
5973

5974
int32_t tCompressData(void          *input,       // input
9,917,055✔
5975
                      SCompressInfo *info,        // compress info
5976
                      void          *output,      // output
5977
                      int32_t        outputSize,  // output size
5978
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
5979
) {
5980
  int32_t extraSizeNeeded;
5981
  int32_t code;
5982

5983
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
9,917,055!
5984
  if (!(outputSize >= extraSizeNeeded)) {
9,917,055!
5985
    return TSDB_CODE_INVALID_PARA;
×
5986
  }
5987

5988
  if (info->cmprAlg == NO_COMPRESSION) {
9,917,055!
5989
    (void)memcpy(output, input, info->originalSize);
×
5990
    info->compressedSize = info->originalSize;
×
5991
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
12,550,149!
5992
    SBuffer local;
5993

5994
    tBufferInit(&local);
5995
    if (buffer == NULL) {
2,630,016!
5996
      buffer = &local;
×
5997
    }
5998

5999
    if (info->cmprAlg == TWO_STAGE_COMP) {
2,630,016!
6000
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
2,632,862✔
6001
      if (code) {
2,632,862!
6002
        tBufferDestroy(&local);
6003
        return code;
×
6004
      }
6005
    }
6006

6007
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
5,263,110✔
6008
        input,                                                   // input
6009
        info->originalSize,                                      // input size
6010
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
2,630,016✔
6011
        output,                                                  // output
6012
        outputSize,                                              // output size
6013
        info->cmprAlg,                                           // compression algorithm
2,630,016✔
6014
        buffer->data,                                            // buffer
6015
        buffer->capacity                                         // buffer size
2,630,016✔
6016
    );
6017
    if (info->compressedSize < 0) {
2,633,094!
6018
      tBufferDestroy(&local);
6019
      return TSDB_CODE_COMPRESS_ERROR;
×
6020
    }
6021

6022
    tBufferDestroy(&local);
6023
  } else {
6024
    DEFINE_VAR(info->cmprAlg)
7,287,039✔
6025
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
7,287,039!
6026
      (void)memcpy(output, input, info->originalSize);
12✔
6027
      info->compressedSize = info->originalSize;
12✔
6028
      return 0;
12✔
6029
    }
6030
    SBuffer local;
6031

6032
    tBufferInit(&local);
6033
    if (buffer == NULL) {
7,287,027!
6034
      buffer = &local;
×
6035
    }
6036
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
7,287,027✔
6037

6038
    info->compressedSize = tDataCompress[info->dataType].compFunc(  //
14,575,146✔
6039
        input,                                                      // input
6040
        info->originalSize,                                         // input size
6041
        info->originalSize / tDataTypes[info->dataType].bytes,      // number of elements
7,287,058✔
6042
        output,                                                     // output
6043
        outputSize,                                                 // output size
6044
        info->cmprAlg,                                              // compression algorithm
6045
        buffer->data,                                               // buffer
6046
        buffer->capacity                                            // buffer size
7,287,058✔
6047
    );
6048
    if (info->compressedSize < 0) {
7,288,088!
6049
      tBufferDestroy(&local);
6050
      return TSDB_CODE_COMPRESS_ERROR;
×
6051
    }
6052

6053
    tBufferDestroy(&local);
6054
    // new col compress
6055
  }
6056

6057
  return 0;
9,921,182✔
6058
}
6059

6060
int32_t tDecompressData(void                *input,       // input
119,554,117✔
6061
                        const SCompressInfo *info,        // compress info
6062
                        void                *output,      // output
6063
                        int32_t              outputSize,  // output size
6064
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
6065
) {
6066
  int32_t code;
6067

6068
  if (!(outputSize >= info->originalSize)) {
119,554,117!
6069
    return TSDB_CODE_INVALID_PARA;
×
6070
  }
6071

6072
  if (info->cmprAlg == NO_COMPRESSION) {
119,554,117!
6073
    if (!(info->compressedSize == info->originalSize)) {
×
6074
      return TSDB_CODE_INVALID_PARA;
×
6075
    }
6076
    (void)memcpy(output, input, info->compressedSize);
×
6077
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
167,680,280!
6078
    SBuffer local;
6079

6080
    tBufferInit(&local);
6081
    if (buffer == NULL) {
48,060,820!
6082
      buffer = &local;
×
6083
    }
6084

6085
    if (info->cmprAlg == TWO_STAGE_COMP) {
48,060,820!
6086
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
48,116,145✔
6087
      if (code) {
48,116,651!
6088
        tBufferDestroy(&local);
6089
        return code;
×
6090
      }
6091
    }
6092

6093
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
48,061,326✔
6094
        input,                                                  // input
6095
        info->compressedSize,                                   // inputSize
48,061,326✔
6096
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
48,061,326✔
6097
        output,                                                 // output
6098
        outputSize,                                             // output size
6099
        info->cmprAlg,                                          // compression algorithm
48,061,326✔
6100
        buffer->data,                                           // helper buffer
6101
        buffer->capacity                                        // extra buffer size
48,061,326✔
6102
    );
6103
    if (decompressedSize < 0) {
48,126,163!
6104
      tBufferDestroy(&local);
6105
      return TSDB_CODE_COMPRESS_ERROR;
×
6106
    }
6107

6108
    if (!(decompressedSize == info->originalSize)) {
48,126,163!
6109
      return TSDB_CODE_COMPRESS_ERROR;
×
6110
    }
6111
    tBufferDestroy(&local);
6112
  } else {
6113
    DEFINE_VAR(info->cmprAlg);
71,493,297✔
6114
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
71,493,297✔
6115
      (void)memcpy(output, input, info->compressedSize);
18✔
6116
      return 0;
18✔
6117
    }
6118
    SBuffer local;
6119

6120
    tBufferInit(&local);
6121
    if (buffer == NULL) {
71,493,279!
6122
      buffer = &local;
×
6123
    }
6124
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
71,493,279✔
6125
    if (code) {
71,494,004!
6126
      return code;
×
6127
    }
6128

6129
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
71,494,004✔
6130
        input,                                                  // input
6131
        info->compressedSize,                                   // inputSize
71,494,004✔
6132
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
71,494,004✔
6133
        output,                                                 // output
6134
        outputSize,                                             // output size
6135
        info->cmprAlg,                                          // compression algorithm
71,494,004✔
6136
        buffer->data,                                           // helper buffer
6137
        buffer->capacity                                        // extra buffer size
71,494,004✔
6138
    );
6139
    if (decompressedSize < 0) {
71,504,664!
6140
      tBufferDestroy(&local);
6141
      return TSDB_CODE_COMPRESS_ERROR;
×
6142
    }
6143

6144
    if (!(decompressedSize == info->originalSize)) {
71,504,664!
6145
      return TSDB_CODE_COMPRESS_ERROR;
×
6146
    }
6147
    tBufferDestroy(&local);
6148
  }
6149

6150
  return 0;
119,630,827✔
6151
}
6152

6153
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
9,917,763✔
6154
  int32_t code;
6155

6156
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
9,917,763✔
6157
  if (code) return code;
9,917,789!
6158

6159
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
9,917,789✔
6160
  if (code) return code;
9,918,837!
6161

6162
  output->size += info->compressedSize;
9,918,837✔
6163
  return 0;
9,918,837✔
6164
}
6165

6166
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
48,119,499✔
6167
  int32_t code;
6168

6169
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
48,119,499✔
6170
  if (code) return code;
48,107,442!
6171

6172
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
48,107,442✔
6173
  if (code) return code;
48,125,342!
6174

6175
  output->size += info->originalSize;
48,125,342✔
6176
  return 0;
48,125,342✔
6177
}
6178

6179
// handle all types, including var data
6180
void valueSetDatum(SValue *pVal, int8_t type, void *pDatum, uint32_t len) {
2,147,483,647✔
6181
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647!
6182
    pVal->pData = pDatum;
×
6183
    pVal->nData = len;
×
6184
  } else {
6185
    switch (len) {
2,147,483,647!
6186
      case sizeof(uint8_t):
2,147,483,647✔
6187
        pVal->val = *(uint8_t *)pDatum;
2,147,483,647✔
6188
        break;
2,147,483,647✔
6189
      case sizeof(uint16_t):
1,646,931,662✔
6190
        pVal->val = *(uint16_t *)pDatum;
1,646,931,662✔
6191
        break;
1,646,931,662✔
6192
      case sizeof(uint32_t):
2,147,483,647✔
6193
        pVal->val = *(uint32_t *)pDatum;
2,147,483,647✔
6194
        break;
2,147,483,647✔
6195
      case sizeof(uint64_t):
2,147,483,647✔
6196
        pVal->val = *(uint64_t *)pDatum;
2,147,483,647✔
6197
        break;
2,147,483,647✔
6198
      default:
×
6199
        break;
×
6200
    }
6201
  }
6202
}
2,147,483,647✔
6203

6204
void valueCloneDatum(SValue *pDst, const SValue *pSrc, int8_t type) {
173,863,589✔
6205
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
173,863,589!
6206
    memcpy(pDst->pData, pSrc->pData, pSrc->nData);
826,661✔
6207
    pDst->nData = pSrc->nData;
826,661✔
6208
  } else {
6209
    pDst->val = pSrc->val;
173,036,928✔
6210
  }
6211
}
173,863,589✔
6212
void valueClearDatum(SValue *pVal, int8_t type) {
×
6213
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
×
6214
    taosMemoryFreeClear(pVal->pData);
×
6215
    pVal->nData = 0;
×
6216
  } else {
6217
    pVal->val = 0;
×
6218
  }
6219
}
×
6220

6221
int8_t schemaHasBlob(const STSchema *pSchema) {
17,662,802✔
6222
  if (pSchema == NULL) {
17,662,802!
6223
    return 0;
×
6224
  }
6225
  for (int i = 0; i < pSchema->numOfCols; ++i) {
158,381,579✔
6226
    if (IS_STR_DATA_BLOB(pSchema->columns[i].type)) {
140,718,778!
6227
      return 1;
1✔
6228
    }
6229
  }
6230
  return 0;
17,662,801✔
6231
}
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