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

taosdata / TDengine / #4672

14 Aug 2025 01:04PM UTC coverage: 59.715% (+2.2%) from 57.533%
#4672

push

travis-ci

web-flow
fix(query): fix order by column check of union operator (#32524)

137065 of 292055 branches covered (46.93%)

Branch coverage included in aggregate %.

1 of 13 new or added lines in 1 file covered. (7.69%)

20958 existing lines in 205 files now uncovered.

207155 of 284385 relevant lines covered (72.84%)

20501687.34 hits per line

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

44.31
/source/common/src/tdataformat.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "tdataformat.h"
18
#include "decimal.h"
19
#include "tRealloc.h"
20
#include "tdatablock.h"
21
#include "tlog.h"
22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

157
  *sinfo = (SRowBuildScanInfo){.tupleFixedSize = schema->flen, .hasBlob = sinfo->hasBlob, .scanType = sinfo->scanType};
1,044,494,654✔
158

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

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

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

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

192
  if (sinfo->numOfNone) {
1,044,494,642✔
193
    sinfo->flag |= HAS_NONE;
537,984,411✔
194
  }
195
  if (sinfo->numOfNull) {
1,044,494,642✔
196
    sinfo->flag |= HAS_NULL;
14,886,358✔
197
  }
198
  if (sinfo->numOfValue) {
1,044,494,642✔
199
    sinfo->flag |= HAS_VALUE;
1,008,032,810✔
200
  }
201

202
  // Tuple
203
  sinfo->tupleFlag = sinfo->flag;
1,044,494,642✔
204
  switch (sinfo->flag) {
1,044,494,642!
205
    case HAS_NONE:
41,037,279✔
206
    case HAS_NULL:
207
      sinfo->tupleBitmapSize = 0;
41,037,279✔
208
      sinfo->tupleFixedSize = 0;
41,037,279✔
209
      break;
41,037,279✔
210
    case HAS_VALUE:
498,813,688✔
211
      sinfo->tupleBitmapSize = 0;
498,813,688✔
212
      sinfo->tupleFixedSize = schema->flen;
498,813,688✔
213
      break;
498,813,688✔
214
    case (HAS_NONE | HAS_NULL):
23,167✔
215
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
23,167✔
216
      sinfo->tupleFixedSize = 0;
23,167✔
217
      break;
23,167✔
218
    case (HAS_NONE | HAS_VALUE):
511,279,464✔
219
    case (HAS_NULL | HAS_VALUE):
220
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
511,279,464✔
221
      sinfo->tupleFixedSize = schema->flen;
511,279,464✔
222
      break;
511,279,464✔
223
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
431,258✔
224
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
431,258✔
225
      sinfo->tupleFixedSize = schema->flen;
431,258✔
226
      break;
431,258✔
227
  }
228
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
1,463,296,397✔
229
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
419,775,761✔
230
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
419,775,761✔
231
  }
232
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
1,043,520,636✔
233
                        + sinfo->tuplePKSize      // primary keys
1,043,520,636✔
234
                        + sinfo->tupleBitmapSize  // bitmap
1,043,520,636✔
235
                        + sinfo->tupleFixedSize   // fixed part
1,043,520,636✔
236
                        + sinfo->tupleVarSize;    // var part
1,043,520,636✔
237

238
  // Key-Value
239
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
1,043,520,636!
240
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
1,047,528,300✔
241
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
1,047,528,300✔
UNCOV
242
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
×
243
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
3,787,346✔
244
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
3,787,346✔
245
  } else {
UNCOV
246
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
×
UNCOV
247
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
×
248
  }
249
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
1,461,531,621✔
250
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
418,707,764✔
251
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
418,707,764✔
252
  }
253
  sinfo->kvRowSize = sizeof(SRow)             // SRow
1,042,823,857✔
254
                     + sinfo->kvPKSize        // primary keys
1,042,823,857✔
255
                     + sinfo->kvIndexSize     // index array
1,042,823,857✔
256
                     + sinfo->kvPayloadSize;  // payload
1,042,823,857✔
257

258
_exit:
1,042,823,869✔
259
  return code;
1,042,823,869✔
260
}
261

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

275
  if (sinfo->tupleFlag == HAS_NONE || sinfo->tupleFlag == HAS_NULL) {
560,550,392!
276
    return 0;
38,798,295✔
277
  }
278

279
  uint8_t *primaryKeys = (*ppRow)->data;
521,752,097✔
280
  uint8_t *bitmap = primaryKeys + sinfo->tuplePKSize;
521,752,097✔
281
  uint8_t *fixed = bitmap + sinfo->tupleBitmapSize;
521,752,097✔
282
  uint8_t *varlen = fixed + sinfo->tupleFixedSize;
521,752,097✔
283

284
  // primary keys
285
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
944,535,687✔
286
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->tupleIndices + i);
427,312,367✔
287
  }
288

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

299
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
1,874,922,620!
300
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
1,876,934,955✔
301
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_VALUE);
1,862,604,392!
302

303
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
1,862,604,392!
304
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
64,296,502✔
305
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
64,296,502✔
306
            if (colValArray[colValIndex].value.nData) {
64,296,502!
307
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
64,954,526✔
308
              varlen += colValArray[colValIndex].value.nData;
64,954,526✔
309
            }
310
          } else {
311
            (void)memcpy(fixed + schema->columns[i].offset,
1,798,307,890✔
312
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
1,798,307,890!
313
                         tDataTypes[schema->columns[i].type].bytes);
1,798,307,890!
314
          }
315
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
14,330,563✔
316
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
14,294,510!
317
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
36,053!
318
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
419,543!
319
        }
320

321
        colValIndex++;
1,876,934,955✔
322
        break;
1,876,934,955✔
UNCOV
323
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
324
        ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
8!
325
        break;
8✔
326
      } else {
327
        colValIndex++;
×
328
      }
329
    }
330
  }
331

332
  return 0;
517,223,320✔
333
}
334

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

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

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

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

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

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

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

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

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

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

UNCOV
453
  return 0;
×
454
}
455

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

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

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

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

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

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

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

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

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

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

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

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

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

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

589
  if (!(sinfo->flag != HAS_NONE && sinfo->flag != HAS_NULL)) {
498,034,609!
590
    return TSDB_CODE_INVALID_PARA;
×
591
  }
592

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

598
  // primary keys
599
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
498,388,830✔
600
    primaryKeys += tPutPrimaryKeyIndex(primaryKeys, sinfo->kvIndices + i);
331,225✔
601
  }
602

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

611
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
2,147,483,647!
612
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
2,147,483,647✔
613
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
2,147,483,647!
614
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647!
615
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
704,431,921✔
616
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
704,431,921✔
617
            if (colValArray[colValIndex].value.nData > 0) {
704,431,921!
618
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
727,947,308✔
619
                           colValArray[colValIndex].value.nData);
727,947,308✔
620
              payloadSize += colValArray[colValIndex].value.nData;
727,947,308✔
621
            }
622
          } else {
623
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,147,483,647✔
624
            (void)memcpy(payload + payloadSize,
2,147,483,647✔
625
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647!
626
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
627
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,147,483,647✔
628
          }
629
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
2,147,483,647✔
630
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
1,575,269✔
631
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
3,150,538✔
632
        }
633

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

845
  if (((*ppRow)->flag) == 0) {
×
846
    return TSDB_CODE_INVALID_PARA;
×
847
  }
UNCOV
848
  return 0;
×
849
}
850
int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SRowBuildScanInfo *sinfo) {
1,044,016,124✔
851
  int32_t code;
852
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
1,044,016,124✔
853
  if (code) return code;
1,050,399,225✔
854

855
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
1,050,399,213✔
856
    code = tRowBuildTupleRow(aColVal, sinfo, pTSchema, ppRow);
553,206,312✔
857
  } else {
858
    code = tRowBuildKVRow(aColVal, sinfo, pTSchema, ppRow);
497,192,901✔
859
  }
860
  return code;
1,055,026,494✔
861
}
862

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

UNCOV
1004
  return code;
×
1005
}
1006

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

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

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

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

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

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

UNCOV
1048
  return code;
×
1049
}
1050

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

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

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

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

UNCOV
1086
  return code;
×
1087
}
1088

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

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

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

UNCOV
1102
  return code;
×
1103
}
1104

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1257
  return code;
×
1258
}
1259

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

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

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

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

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

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

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

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

1326
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
756,275✔
1327
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
698,043✔
1328
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
32✔
1329
      } else {
1330
        SValue value = {
698,011✔
1331
            .type = infos[iInfo].type,
698,011✔
1332
        };
1333
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
698,011!
1334
          value.nData = infos[iInfo].bind->length[iRow];
205,302✔
1335
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
205,302!
UNCOV
1336
            code = TSDB_CODE_INVALID_PARA;
×
UNCOV
1337
            goto _exit;
×
1338
          }
1339
          value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
205,302✔
1340
        } else {
1341
          valueSetDatum(&value, infos[iInfo].type,
492,709✔
1342
                        (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
492,709✔
1343
                        infos[iInfo].bind->buffer_length);
492,709✔
1344
        }
1345
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
708,879✔
1346
      }
1347
      if (taosArrayPush(colValArray, &colVal) == NULL) {
693,914!
UNCOV
1348
        code = terrno;
×
UNCOV
1349
        goto _exit;
×
1350
      }
1351
    }
1352

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

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

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

1382
_exit:
3,425✔
1383
  taosArrayDestroy(colValArray);
3,425✔
1384
  return code;
5,630✔
1385
}
1386

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

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

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

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

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

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

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

1421
    if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
1422
      pv = pIdx->idx + pIdx->nCol;
2,147,483,647✔
1423
    } else if (pRow->flag & KV_FLG_MID) {
13,214,389!
1424
      pv = pIdx->idx + (pIdx->nCol << 1);
69,562,372✔
1425
    } else {
UNCOV
1426
      pv = pIdx->idx + (pIdx->nCol << 2);
×
1427
    }
1428

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

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

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

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

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

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

1484
    if (pRow->flag == HAS_VALUE) {
821,488,086✔
1485
      fixed = bitmap;
643,931,310✔
1486
      bit = BIT_FLG_VALUE;
643,931,310✔
1487
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
177,556,776!
UNCOV
1488
      fixed = BIT2_SIZE(pTSchema->numOfCols - 1) + bitmap;
×
UNCOV
1489
      bit = GET_BIT2(bitmap, iCol - 1);
×
1490
    } else {
1491
      fixed = BIT1_SIZE(pTSchema->numOfCols - 1) + bitmap;
177,556,776✔
1492
      bit = GET_BIT1(bitmap, iCol - 1);
177,556,776✔
1493

1494
      if (pRow->flag == (HAS_NONE | HAS_VALUE)) {
177,556,776✔
1495
        if (bit) bit++;
21,725✔
1496
      } else if (pRow->flag == (HAS_NULL | HAS_VALUE)) {
177,535,051✔
1497
        bit++;
39,756,536✔
1498
      }
1499
    }
1500
    varlen = fixed + pTSchema->flen;
821,488,086✔
1501

1502
    if (bit == BIT_FLG_NONE) {
821,488,086✔
1503
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
9,416✔
1504
      return 0;
9,416✔
1505
    } else if (bit == BIT_FLG_NULL) {
821,478,670✔
1506
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
12,320,919✔
1507
      return 0;
12,320,919✔
1508
    }
1509

1510
    pColVal->cid = pTColumn->colId;
809,157,751✔
1511
    pColVal->value.type = pTColumn->type;
809,157,751✔
1512
    pColVal->flag = CV_FLAG_VALUE;
809,157,751✔
1513
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
809,157,751!
1514
      int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
222,926,697!
1515
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
222,926,697✔
1516
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
445,853,394✔
1517
      // TODO(yhDeng): support tuple
1518
      //  if (isBlob) pColVal->value.pData += sizeof(uint64_t);  // skip seq
1519
      //  }
1520
    } else {
1521
      valueSetDatum(&pColVal->value, pTColumn->type, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
586,231,054✔
1522
    }
1523
  }
1524

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

1528
void tRowDestroy(SRow *pRow) {
514,637,636✔
1529
  if (pRow) taosMemoryFree(pRow);
514,637,636!
1530
}
514,571,306✔
1531

1532
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
547,152,783✔
1533
  SRowKey key1, key2;
1534
  tRowGetKey(*(SRow **)p1, &key1);
1,094,305,566✔
1535
  tRowGetKey(*(SRow **)p2, &key2);
1,087,697,308✔
1536
  return tRowKeyCompare(&key1, &key2);
551,640,458✔
1537
}
1538
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
163,778✔
1539

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

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

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

1562
  for (int32_t i = 0; i < nRow; i++) {
218,246✔
1563
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
163,778✔
1564

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

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

1576
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
163,576✔
1577
    int32_t targetCid = pTSchema->columns[iCol].colId;
109,108✔
1578
    SColVal *pColVal = NULL;
109,108✔
1579

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

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

1591
          if (COL_VAL_IS_VALUE(pColValT)) {
280✔
1592
            pColVal = pColValT;
174✔
1593
            break;
174✔
1594
          } else if (pColVal == NULL) {
106✔
1595
            pColVal = pColValT;
54✔
1596
          }
1597
        }
1598
        break;
200✔
1599
    }
1600

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

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

1613
  if (code) goto _exit;
54,468!
1614

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

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

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

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

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

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

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

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

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

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

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

UNCOV
1708
  tBlobSetSwap(pBlob, pTempBlob);
×
1709

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

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

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

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

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

UNCOV
1751
    tRowGetKey(row1, &key1);
×
1752

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

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

UNCOV
1761
      iEnd++;
×
1762
    }
1763

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

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

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

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

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

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

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

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

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

1840
  // build
1841

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

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

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

UNCOV
1862
  return code;
×
1863
}
1864

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

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

1877
  int32_t iStart = 0;
78,788✔
1878
  while (iStart < aRowP->size) {
74,978,454✔
1879
    SRowKey key1;
1880
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
74,914,881✔
1881

1882
    tRowGetKey(row1, &key1);
149,875,562✔
1883

1884
    int32_t iEnd = iStart + 1;
74,883,222✔
1885
    while (iEnd < aRowP->size) {
74,964,643✔
1886
      SRowKey key2;
1887
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
74,905,049✔
1888
      tRowGetKey(row2, &key2);
149,877,748✔
1889

1890
      if (tRowKeyCompare(&key1, &key2) != 0) break;
74,921,493✔
1891

1892
      iEnd++;
81,421✔
1893
    }
1894

1895
    if (iEnd - iStart > 1) {
74,899,666✔
1896
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, strategy);
54,468✔
1897
      if (code) return code;
54,468!
1898
    }
1899

1900
    // the array is also changing, so the iStart just ++ instead of iEnd
1901
    iStart++;
74,899,666✔
1902
  }
1903

1904
  return code;
63,573✔
1905
}
1906

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

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

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

UNCOV
1926
    tRowGetKey(row1, &key1);
×
1927

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

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

UNCOV
1936
      iEnd++;
×
1937
    }
1938

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

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

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

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

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

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

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

1986
  int32_t code = 0;
552,290✔
1987

1988
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
552,290!
1989
  if (pIter == NULL) {
552,731!
UNCOV
1990
    code = terrno;
×
UNCOV
1991
    goto _exit;
×
1992
  }
1993

1994
  pIter->pRow = pRow;
552,731✔
1995
  pIter->pTSchema = pTSchema;
552,731✔
1996
  pIter->iTColumn = 0;
552,731✔
1997

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

2000
  uint8_t         *data = pRow->data;
549,422✔
2001
  SPrimaryKeyIndex index;
2002
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
578,025✔
2003
    data += tGetPrimaryKeyIndex(data, &index);
28,618✔
2004
  }
2005

2006
  if (pRow->flag >> 4) {
549,407✔
2007
    pIter->iCol = 0;
381,482✔
2008
    pIter->pIdx = (SKVIdx *)data;
381,482✔
2009
    if (pRow->flag & KV_FLG_LIT) {
381,482✔
2010
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
378,480✔
2011
    } else if (pRow->flag & KV_FLG_MID) {
3,002✔
2012
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
3,000✔
2013
    } else {
2014
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
2✔
2015
    }
2016
  } else {
2017
    switch (pRow->flag) {
167,925!
2018
      case (HAS_NULL | HAS_NONE):
1✔
2019
        pIter->pb = data;
1✔
2020
        break;
1✔
2021
      case HAS_VALUE:
166,658✔
2022
        pIter->pf = data;
166,658✔
2023
        pIter->pv = pIter->pf + pTSchema->flen;
166,658✔
2024
        break;
166,658✔
2025
      case (HAS_VALUE | HAS_NONE):
1,246✔
2026
      case (HAS_VALUE | HAS_NULL):
2027
        pIter->pb = data;
1,246✔
2028
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
1,246✔
2029
        pIter->pv = pIter->pf + pTSchema->flen;
1,246✔
2030
        break;
1,246✔
UNCOV
2031
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
UNCOV
2032
        pIter->pb = data;
×
UNCOV
2033
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
UNCOV
2034
        pIter->pv = pIter->pf + pTSchema->flen;
×
UNCOV
2035
        break;
×
2036
      default:
20✔
2037
        break;
20✔
2038
    }
2039
  }
2040

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

2050
void tRowIterClose(SRowIter **ppIter) {
552,100✔
2051
  SRowIter *pIter = *ppIter;
552,100✔
2052
  if (pIter) {
552,100✔
2053
    taosMemoryFree(pIter);
552,099!
2054
  }
2055
  *ppIter = NULL;
552,861✔
2056
}
552,861✔
2057

2058
SColVal *tRowIterNext(SRowIter *pIter) {
9,917,944✔
2059
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
9,917,944✔
2060
    return NULL;
380,281✔
2061
  }
2062

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

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

2074
  if (pIter->pRow->flag == HAS_NONE) {
9,094,324✔
2075
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
55,704✔
2076
    goto _exit;
55,704✔
2077
  }
2078

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

2084
  if (pIter->pRow->flag >> 4) {  // KV
9,035,489✔
2085
    if (pIter->iCol < pIter->pIdx->nCol) {
8,981,818✔
2086
      uint8_t *pData;
2087

2088
      if (pIter->pRow->flag & KV_FLG_LIT) {
5,133,690✔
2089
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
5,043,771✔
2090
      } else if (pIter->pRow->flag & KV_FLG_MID) {
89,919!
2091
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
90,000✔
2092
      } else {
UNCOV
2093
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
2094
      }
2095

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

2099
      if (TABS(cid) == pTColumn->colId) {
5,133,690!
2100
        if (cid < 0) {
5,136,998✔
2101
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,816✔
2102
        } else {
2103
          pIter->cv.cid = pTColumn->colId;
5,133,182✔
2104
          pIter->cv.value.type = pTColumn->type;
5,133,182✔
2105
          pIter->cv.flag = CV_FLAG_VALUE;
5,133,182✔
2106

2107
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
5,133,182!
2108
            pData += tGetU32v(pData, &pIter->cv.value.nData);
770,454!
2109
            if (pIter->cv.value.nData > 0) {
770,454!
2110
              pIter->cv.value.pData = pData;
780,736✔
2111
            } else {
UNCOV
2112
              pIter->cv.value.pData = NULL;
×
2113
              // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2114
              //   pIter->cv.value.pData = pData;
2115
              // }
2116
            }
2117
          } else {
2118
            valueSetDatum(&pIter->cv.value, pTColumn->type, pData, pTColumn->bytes);
4,362,728✔
2119
          }
2120
        }
2121

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

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

2165
    pIter->cv.cid = pTColumn->colId;
52,989✔
2166
    pIter->cv.value.type = pTColumn->type;
52,989✔
2167
    pIter->cv.flag = CV_FLAG_VALUE;
52,989✔
2168
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
24,227!
UNCOV
2169
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
×
UNCOV
2170
      pData += tGetU32v(pData, &pIter->cv.value.nData);
×
UNCOV
2171
      if (pIter->cv.value.nData > 0) {
×
2172
        pIter->cv.value.pData = pData;
1,115✔
2173
      } else {
UNCOV
2174
        pIter->cv.value.pData = NULL;
×
2175
        // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2176
        //   pIter->cv.value.pData = pData;
2177
        // }
2178
      }
2179
    } else {
2180
      valueSetDatum(&pIter->cv.value, pTColumn->type, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
81,751✔
2181
    }
2182
    goto _exit;
82,897✔
2183
  }
2184

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

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

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

2195
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
73,008✔
2196
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
67,900✔
2197
    if (code) return code;
67,973!
2198
  }
2199

2200
  return code;
5,108✔
2201
}
2202
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
181,471✔
2203
  int32_t code = 0;
181,471✔
2204

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

2210
  while (pColData) {
740,106✔
2211
    if (pTColumn) {
558,544!
2212
      if (pTColumn->colId == pColData->cid) {  // NULL
558,544!
2213
        if (flag == 0) {
558,602✔
2214
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
558,463✔
2215
        } else {
2216
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
139✔
2217
        }
2218
        if (code) goto _exit;
558,693!
2219

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

2234
_exit:
181,562✔
2235
  return code;
181,562✔
2236
}
2237
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
597,118,366✔
2238
                                      int32_t flag) {
2239
  int32_t code = 0;
597,118,366✔
2240

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

2246
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
597,118,366✔
2247
  SPrimaryKeyIndex index;
2248
  uint8_t         *data = pRow->data;
597,118,366✔
2249
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,059,981,352✔
2250
    data += tGetPrimaryKeyIndex(data, &index);
462,853,045✔
2251
  }
2252

2253
  switch (pRow->flag) {
597,128,307!
2254
    case HAS_VALUE:
581,481,143✔
2255
      pf = data;  // TODO: fix here
581,481,143✔
2256
      pv = pf + pTSchema->flen;
581,481,143✔
2257
      break;
581,481,143✔
2258
    case (HAS_NULL | HAS_NONE):
1,309✔
2259
      pb = data;
1,309✔
2260
      break;
1,309✔
2261
    case (HAS_VALUE | HAS_NONE):
15,982,119✔
2262
    case (HAS_VALUE | HAS_NULL):
2263
      pb = data;
15,982,119✔
2264
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
15,982,119✔
2265
      pv = pf + pTSchema->flen;
15,982,119✔
2266
      break;
15,982,119✔
UNCOV
2267
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
UNCOV
2268
      pb = data;
×
UNCOV
2269
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
×
UNCOV
2270
      pv = pf + pTSchema->flen;
×
UNCOV
2271
      break;
×
UNCOV
2272
    default:
×
UNCOV
2273
      return TSDB_CODE_INVALID_DATA_FMT;
×
2274
  }
2275

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

2302
          if (bv == BIT_FLG_NONE) {
68,912,207✔
2303
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
53,497!
UNCOV
2304
              goto _exit;
×
2305
            goto _continue;
53,492✔
2306
          } else if (bv == BIT_FLG_NULL) {
68,858,710✔
2307
            if (flag == 0) {
18,924,508✔
2308
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
18,922,440✔
2309
            } else {
2310
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
2,068✔
2311
            }
2312
            if (code) goto _exit;
18,924,119!
2313
            goto _continue;
18,924,119✔
2314
          }
2315
        }
2316

2317
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
2318
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
74,318,310!
2319
          uint32_t nData;
2320
          pData += tGetU32v(pData, &nData);
74,318,310✔
2321
          if (flag == 0) {
74,318,310!
2322
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
78,787,527✔
2323
          } else {
UNCOV
2324
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
2325
          }
2326
          if (code) goto _exit;
79,074,938!
2327
        } else {
2328
          if (flag == 0) {
2,095,933,414✔
2329
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,091,246,461✔
2330
                                                                          TYPE_BYTES[pColData->type]);
2,091,246,461✔
2331
          } else {
2332
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
4,686,953✔
2333
                                                                          TYPE_BYTES[pColData->type], flag > 0);
4,686,953✔
2334
          }
2335
          if (code) goto _exit;
2,094,115,000!
2336
        }
2337

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

2353
_exit:
600,400,988✔
2354
  return code;
600,400,988✔
2355
}
2356
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
4,238,248✔
2357
  int32_t code = 0;
4,238,248✔
2358

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

2366
  // primary keys
2367
  uint8_t         *data = pRow->data;
4,238,248✔
2368
  SPrimaryKeyIndex index;
2369
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
4,644,294✔
2370
    data += tGetPrimaryKeyIndex(data, &index);
406,093✔
2371
  }
2372

2373
  SKVIdx *pKVIdx = (SKVIdx *)data;
4,238,201✔
2374
  if (pRow->flag & KV_FLG_LIT) {
4,238,201✔
2375
    pv = pKVIdx->idx + pKVIdx->nCol;
4,185,936✔
2376
  } else if (pRow->flag & KV_FLG_MID) {
52,265!
2377
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
54,695✔
UNCOV
2378
  } else if (pRow->flag & KV_FLG_BIG) {
×
UNCOV
2379
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
2380
  } else {
2381
    return TSDB_CODE_INVALID_PARA;
×
2382
  }
2383

2384
  while (pColData) {
60,839,201✔
2385
    if (pTColumn) {
56,573,910!
2386
      if (pTColumn->colId == pColData->cid) {
56,573,910✔
2387
        while (iCol < pKVIdx->nCol) {
56,576,492✔
2388
          uint8_t *pData;
2389
          if (pRow->flag & KV_FLG_LIT) {
46,872,388✔
2390
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
45,290,575✔
2391
          } else if (pRow->flag & KV_FLG_MID) {
1,581,813!
2392
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
1,581,852✔
UNCOV
2393
          } else if (pRow->flag & KV_FLG_BIG) {
×
UNCOV
2394
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
2395
          } else {
UNCOV
2396
            return TSDB_CODE_INVALID_DATA_FMT;
×
2397
          }
2398

2399
          int16_t cid;
2400
          pData += tGetI16v(pData, &cid);
46,872,427✔
2401

2402
          if (TABS(cid) == pTColumn->colId) {
46,872,427✔
2403
            if (cid < 0) {
28,022,858✔
2404
              if (flag == 0) {
5,324,275✔
2405
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
5,317,513✔
2406
              } else {
2407
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
6,762✔
2408
              }
2409
              if (code) goto _exit;
4,925,594!
2410
            } else {
2411
              uint32_t nData;
2412
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
22,698,583!
2413
                pData += tGetU32v(pData, &nData);
4,469,943✔
2414
              } else {
2415
                nData = 0;
18,228,640✔
2416
              }
2417
              if (flag == 0) {
22,698,583!
2418
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
22,781,506✔
2419
              } else {
UNCOV
2420
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
×
2421
              }
2422
              if (code) goto _exit;
23,123,521!
2423
            }
2424
            iCol++;
28,049,115✔
2425
            goto _continue;
28,049,115✔
2426
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
18,849,569✔
2427
            break;
18,817,203✔
2428
          } else {
2429
            iCol++;
32,366✔
2430
          }
2431
        }
2432

2433
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
28,521,307!
2434

2435
      _continue:
28,519,671✔
2436
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
56,568,786✔
2437
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
56,568,786✔
2438
      } else if (pTColumn->colId > pColData->cid) {
29,784!
UNCOV
2439
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
UNCOV
2440
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2441
      } else {
2442
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
29,784!
2443
      }
2444
    } else {
UNCOV
2445
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
UNCOV
2446
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2447
    }
2448
  }
2449

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

2461
  if (pRow->flag == HAS_NONE) {
601,559,023✔
2462
    return tRowNoneUpsertColData(aColData, nColData, flag);
8,593✔
2463
  } else if (pRow->flag == HAS_NULL) {
601,550,430✔
2464
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
181,473✔
2465
  } else if (pRow->flag >> 4) {  // KV row
601,368,957✔
2466
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
4,239,672✔
2467
  } else {  // TUPLE row
2468
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
597,129,285✔
2469
  }
2470
}
2471

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

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

2479
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
2480

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

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

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

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

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

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

2516
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
92,538,315✔
2517
  switch (tv1->type) {
92,538,315!
UNCOV
2518
    case TSDB_DATA_TYPE_BOOL:
×
2519
    case TSDB_DATA_TYPE_TINYINT:
UNCOV
2520
      T_COMPARE_SCALAR_VALUE(int8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
UNCOV
2521
    case TSDB_DATA_TYPE_SMALLINT:
×
UNCOV
2522
      T_COMPARE_SCALAR_VALUE(int16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2523
    case TSDB_DATA_TYPE_INT:
636,966✔
2524
      T_COMPARE_SCALAR_VALUE(int32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
636,966✔
2525
    case TSDB_DATA_TYPE_BIGINT:
89,828,532✔
2526
    case TSDB_DATA_TYPE_TIMESTAMP:
2527
      T_COMPARE_SCALAR_VALUE(int64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
89,828,532!
UNCOV
2528
    case TSDB_DATA_TYPE_FLOAT:
×
UNCOV
2529
      T_COMPARE_SCALAR_VALUE(float, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
UNCOV
2530
    case TSDB_DATA_TYPE_DOUBLE:
×
UNCOV
2531
      T_COMPARE_SCALAR_VALUE(double, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
UNCOV
2532
    case TSDB_DATA_TYPE_UTINYINT:
×
UNCOV
2533
      T_COMPARE_SCALAR_VALUE(uint8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
UNCOV
2534
    case TSDB_DATA_TYPE_USMALLINT:
×
UNCOV
2535
      T_COMPARE_SCALAR_VALUE(uint16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2536
    case TSDB_DATA_TYPE_UINT:
534,338✔
2537
      T_COMPARE_SCALAR_VALUE(uint32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
534,338✔
2538
    case TSDB_DATA_TYPE_UBIGINT:
543,872✔
2539
      T_COMPARE_SCALAR_VALUE(uint64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
543,872✔
2540
    case TSDB_DATA_TYPE_GEOMETRY:
987,444✔
2541
    case TSDB_DATA_TYPE_BINARY: {
2542
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
987,444✔
2543
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
987,444✔
2544
    }
UNCOV
2545
    case TSDB_DATA_TYPE_NCHAR: {
×
UNCOV
2546
      int32_t ret = taosUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
UNCOV
2547
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
UNCOV
2548
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2549
    }
UNCOV
2550
    case TSDB_DATA_TYPE_VARBINARY: {
×
UNCOV
2551
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
UNCOV
2552
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2553
    }
2554
    default:
7,163✔
2555
      break;
7,163✔
2556
  }
2557

2558
  return 0;
7,163✔
2559
}
2560

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

2571
  if (key1->numOfPKs == key2->numOfPKs) {
85,102,052!
2572
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
110,477,202!
2573
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
92,527,632✔
2574
      if (ret) return ret;
92,499,784!
2575
    }
2576
  } else if (key1->numOfPKs < key2->numOfPKs) {
×
2577
    return -1;
11✔
2578
  } else {
2579
    return 1;
×
2580
  }
2581

2582
  return 0;
17,949,570✔
2583
}
2584

2585
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
937,320,911✔
2586
  pDst->ts = pSrc->ts;
937,320,911✔
2587
  pDst->numOfPKs = pSrc->numOfPKs;
937,320,911✔
2588

2589
  if (pSrc->numOfPKs > 0) {
937,320,911✔
2590
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
112,388,800✔
2591
      SValue *pVal = &pDst->pks[i];
55,682,142✔
2592
      pVal->type = pSrc->pks[i].type;
55,682,142✔
2593

2594
      valueCloneDatum(pVal, pSrc->pks + i, pVal->type);
55,682,142✔
2595
    }
2596
  }
2597
}
938,346,409✔
2598

2599
// STag ========================================
2600
static int tTagValCmprFn(const void *p1, const void *p2) {
258,608,412✔
2601
  if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
258,608,412✔
2602
    return -1;
89,515,113✔
2603
  } else if (((STagVal *)p1)->cid > ((STagVal *)p2)->cid) {
169,093,299✔
2604
    return 1;
93,203,660✔
2605
  }
2606

2607
  return 0;
75,889,639✔
2608
}
2609
static int tTagValJsonCmprFn(const void *p1, const void *p2) {
21,582✔
2610
  return strcmp(((STagVal *)p1)[0].pKey, ((STagVal *)p2)[0].pKey);
21,582✔
2611
}
2612

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

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

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

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

2709
  // key
2710
  if (isJson) {
349,341✔
2711
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
272✔
2712
  } else {
2713
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
698,410✔
2714
  }
2715

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

2719
  // value
2720
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
349,341!
2721
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
227,588✔
2722
  } else {
2723
    p = p ? p + n : p;
235,547✔
2724
    n += tDataTypes[pTagVal->type].bytes;
235,547✔
2725
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
235,547✔
2726
  }
2727

2728
  return n;
349,341✔
2729
}
2730
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
255,469,292✔
2731
  int32_t n = 0;
255,469,292✔
2732

2733
  // key
2734
  if (isJson) {
255,469,292✔
2735
    n += tGetCStr(p + n, &pTagVal->pKey);
46,080!
2736
  } else {
2737
    n += tGetI16v(p + n, &pTagVal->cid);
510,892,504!
2738
  }
2739

2740
  // type
2741
  n += tGetI8(p + n, &pTagVal->type);
255,469,292!
2742

2743
  // value
2744
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
255,469,292!
2745
    n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
86,609,914!
2746
  } else {
2747
    (void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
212,164,335✔
2748
    n += tDataTypes[pTagVal->type].bytes;
212,164,335✔
2749
  }
2750

2751
  return n;
255,469,292✔
2752
}
2753

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

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

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

2771
  // sort
2772
  if (isJson) {
96,088✔
2773
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
46✔
2774
  } else {
2775
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
96,042✔
2776
  }
2777

2778
  // get size
2779
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
270,852✔
2780
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
174,751✔
2781
  }
2782
  if (szTag <= INT8_MAX) {
96,101✔
2783
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
94,684✔
2784
  } else {
2785
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
1,417✔
2786
    isLarge = 1;
1,417✔
2787
  }
2788

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

2806
  if (isLarge) {
96,197✔
2807
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
1,418✔
2808
  } else {
2809
    p = (uint8_t *)&(*ppTag)->idx[nTag];
94,779✔
2810
  }
2811
  n = 0;
96,197✔
2812
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
270,998✔
2813
    if (isLarge) {
174,841✔
2814
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
12,166✔
2815
    } else {
2816
      (*ppTag)->idx[iTag] = n;
162,675✔
2817
    }
2818
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
174,841✔
2819
  }
2820
#ifdef TD_DEBUG_PRINT_TAG
2821
  debugPrintSTag(*ppTag, __func__, __LINE__);
2822
#endif
2823

2824
  return code;
96,157✔
2825

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

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

2834
char *tTagValToData(const STagVal *value, bool isJson) {
19,739,543✔
2835
  if (!value) {
19,739,543!
UNCOV
2836
    return NULL;
×
2837
  }
2838

2839
  char  *data = NULL;
19,739,543✔
2840
  int8_t typeBytes = 0;
19,739,543✔
2841
  if (isJson) {
19,739,543✔
2842
    typeBytes = CHAR_BYTES;
12,358✔
2843
  }
2844

2845
  if (IS_VAR_DATA_TYPE(value->type)) {
19,739,543!
2846
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
4,886,735!
2847
    if (data == NULL) {
4,887,970!
UNCOV
2848
      return NULL;
×
2849
    }
2850

2851
    if (isJson) {
4,887,970✔
2852
      *data = value->type;
8,387✔
2853
    }
2854

2855
    varDataLen(data + typeBytes) = value->nData;
4,887,970✔
2856
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
4,887,970✔
2857
  } else {
2858
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
14,852,808✔
2859
  }
2860

2861
  return data;
19,740,778✔
2862
}
2863

2864
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
77,280,041✔
2865
  if (!pTag || !pTagVal) {
77,280,041!
UNCOV
2866
    return false;
×
2867
  }
2868

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

2879
  if (isLarge) {
77,734,133✔
2880
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
72,200,118✔
2881
  } else {
2882
    p = (uint8_t *)&pTag->idx[pTag->nTag];
5,534,015✔
2883
  }
2884

2885
  pTagVal->type = TSDB_DATA_TYPE_NULL;
77,734,133✔
2886
  pTagVal->pData = NULL;
77,734,133✔
2887
  pTagVal->nData = 0;
77,734,133✔
2888
  while (lidx <= ridx) {
260,102,448✔
2889
    midx = (lidx + ridx) / 2;
256,879,211✔
2890
    if (isLarge) {
256,879,211✔
2891
      offset = ((int16_t *)pTag->idx)[midx];
232,546,251✔
2892
    } else {
2893
      offset = pTag->idx[midx];
24,332,960✔
2894
    }
2895

2896
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
256,879,211✔
2897
    if (isJson) {
259,117,853✔
2898
      c = tTagValJsonCmprFn(pTagVal, &tv);
21,528✔
2899
    } else {
2900
      c = tTagValCmprFn(pTagVal, &tv);
259,096,325✔
2901
    }
2902

2903
    if (c < 0) {
262,227,606✔
2904
      ridx = midx - 1;
89,226,656✔
2905
    } else if (c > 0) {
173,000,950✔
2906
      lidx = midx + 1;
93,141,659✔
2907
    } else {
2908
      (void)memcpy(pTagVal, &tv, sizeof(tv));
79,859,291✔
2909
      return true;
79,859,291✔
2910
    }
2911
  }
2912
  return false;
3,223,237✔
2913
}
2914

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

2919
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
43,200,309✔
2920

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

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

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

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

2953
  return code;
1,520✔
2954

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

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

2967
  pTSchema->numOfCols = numOfCols;
24,367,483✔
2968
  pTSchema->version = version;
24,367,483✔
2969

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

2987
  // other columns
2988
  for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
268,122,756✔
2989
    SSchema  *pSchema = &aSchema[iCol];
243,755,273✔
2990
    STColumn *pTColumn = &pTSchema->columns[iCol];
243,755,273✔
2991

2992
    pTColumn->colId = pSchema->colId;
243,755,273✔
2993
    pTColumn->type = pSchema->type;
243,755,273✔
2994
    pTColumn->flags = pSchema->flags;
243,755,273✔
2995
    pTColumn->offset = pTSchema->flen;
243,755,273✔
2996

2997
    if (IS_VAR_DATA_TYPE(pSchema->type)) {
243,755,273!
2998
      pTColumn->bytes = pSchema->bytes;
35,502,302✔
2999
      pTSchema->tlen += (TYPE_BYTES[pSchema->type] + pSchema->bytes);  // todo: remove
35,502,302✔
3000
    } else {
3001
      pTColumn->bytes = TYPE_BYTES[pSchema->type];
208,252,971✔
3002
      pTSchema->tlen += TYPE_BYTES[pSchema->type];  // todo: remove
208,252,971✔
3003
    }
3004

3005
    pTSchema->flen += TYPE_BYTES[pTColumn->type];
243,755,273✔
3006
  }
3007

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

3012
  return pTSchema;
24,367,483✔
3013
}
3014

3015
static int32_t tTColumnCompare(const void *p1, const void *p2) {
15,529,020✔
3016
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
15,529,020✔
3017
    return -1;
2,330,067✔
3018
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
13,198,953✔
3019
    return 1;
9,334,003✔
3020
  }
3021

3022
  return 0;
3,864,950✔
3023
}
3024

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

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

3033
// SColData ========================================
3034
void tColDataDestroy(void *ph) {
29,896,937✔
3035
  if (ph) {
29,896,937!
3036
    SColData *pColData = (SColData *)ph;
29,897,148✔
3037

3038
    tFree(pColData->pBitMap);
29,897,148!
3039
    tFree(pColData->aOffset);
29,897,273✔
3040
    tFree(pColData->pData);
29,897,276!
3041
  }
3042
}
29,897,862✔
3043

3044
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
30,501,197✔
3045
  pColData->cid = cid;
30,501,197✔
3046
  pColData->type = type;
30,501,197✔
3047
  pColData->cflag = cflag;
30,501,197✔
3048
  tColDataClear(pColData);
30,501,197✔
3049
}
30,504,913✔
3050

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

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

3065
  tColDataClear(pColData);
68,115✔
3066
}
68,112✔
3067

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

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

3089
    } else {
3090
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
132,045,382!
3091
      if (code) goto _exit;
132,096,814!
3092
      pColData->aOffset[pColData->nVal] = pColData->nData;
132,096,814✔
3093

3094
      if (nData) {
132,096,814!
3095
        code = tRealloc(&pColData->pData, pColData->nData + nData);
126,614,588!
3096
        if (code) goto _exit;
126,901,626!
3097
        (void)memcpy(pColData->pData + pColData->nData, pData, nData);
126,901,626✔
3098
        pColData->nData += nData;
126,901,626✔
3099
      }
3100
    }
3101
  } else {
3102
    if (!(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal)) {
2,147,483,647!
UNCOV
3103
      return TSDB_CODE_INVALID_PARA;
×
3104
    }
3105
    code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
2,147,483,647!
3106
    if (code) goto _exit;
2,147,483,647!
3107
    if (pData) {
2,147,483,647!
3108
      (void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
2,147,483,647✔
3109
    } else {
3110
      memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
50,206,287✔
3111
    }
3112
    pColData->nData += tDataTypes[pColData->type].bytes;
2,147,483,647✔
3113
  }
3114
  pColData->nVal++;
2,147,483,647✔
3115

3116
_exit:
2,147,483,647✔
3117
  return code;
2,147,483,647✔
3118
}
3119
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,094,224✔
3120
  pColData->flag = HAS_VALUE;
2,094,384✔
3121
  pColData->numOfValue++;
2,094,224✔
3122
  return tColDataPutValue(pColData, pData, nData);
2,096,480✔
3123
}
3124
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
241,697✔
3125
  pColData->flag = HAS_NONE;
241,697✔
3126
  pColData->numOfNone++;
241,697✔
3127
  pColData->nVal++;
241,697✔
3128
  return 0;
241,697✔
3129
}
3130
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
47,594✔
3131
  pColData->flag = HAS_NULL;
47,658✔
3132
  pColData->numOfNull++;
47,658✔
3133
  pColData->nVal++;
47,658✔
3134
  return 0;
47,594✔
3135
}
3136
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,457✔
3137
  int32_t code = 0;
2,457✔
3138

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

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

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

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

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

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

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

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

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

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

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

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

3204
  pColData->flag |= HAS_VALUE;
22,178✔
3205
  pColData->numOfValue++;
22,178✔
3206

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3311
  pColData->flag |= HAS_NONE;
129,235✔
3312
  pColData->numOfNone++;
129,235✔
3313

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

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

3321
  return tColDataPutValue(pColData, NULL, 0);
129,260✔
3322
}
3323
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
207,850✔
3324
  int32_t code = 0;
213,159✔
3325

3326
  pColData->flag |= HAS_NULL;
213,159✔
3327
  pColData->numOfNull++;
213,159✔
3328

3329
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
213,159✔
3330
  code = tRealloc(&pColData->pBitMap, nBit);
212,855✔
3331
  if (code) return code;
213,156!
3332

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

3336
  return tColDataPutValue(pColData, NULL, 0);
213,163✔
3337
}
3338
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,965,918✔
3339
  int32_t code = 0;
1,967,920✔
3340

3341
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,967,918!
3342
  if (code) return code;
1,968,192!
3343

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

3347
  return tColDataPutValue(pColData, pData, nData);
1,972,090✔
3348
}
3349
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
12,861,875✔
3350
  int32_t code = 0;
12,861,875✔
3351

3352
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
12,861,875!
3353
  if (code) return code;
12,861,879!
3354

3355
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
12,861,879✔
3356
  pColData->numOfNone++;
12,861,879✔
3357

3358
  return tColDataPutValue(pColData, NULL, 0);
12,864,417✔
3359
}
3360
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
9,974✔
3361
  int32_t code = 0;
9,974✔
3362

3363
  pColData->flag |= HAS_NULL;
9,974✔
3364
  pColData->numOfNull++;
9,974✔
3365

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

3370
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,013,125!
3371
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
3,003,151!
3372
  }
3373
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
9,974!
3374

3375
  tFree(pColData->pBitMap);
9,974!
3376
  pColData->pBitMap = pBitMap;
9,974!
3377

3378
  return tColDataPutValue(pColData, NULL, 0);
9,974✔
3379
}
3380
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
531,703,439✔
3381
  int32_t code = 0;
531,706,467✔
3382

3383
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
531,706,067!
3384
  if (code) return code;
532,223,408!
3385
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
532,223,408!
3386
  pColData->numOfValue++;
532,223,408✔
3387

3388
  return tColDataPutValue(pColData, pData, nData);
532,861,757✔
3389
}
3390
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
26,434✔
3391
  int32_t code = 0;
26,434✔
3392

3393
  pColData->flag |= HAS_NONE;
26,434✔
3394
  pColData->numOfNone++;
26,434✔
3395

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

3400
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
3,401,595✔
3401
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
3,375,161✔
3402
  }
3403
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
26,434✔
3404

3405
  tFree(pColData->pBitMap);
26,434!
3406
  pColData->pBitMap = pBitMap;
26,434✔
3407

3408
  return tColDataPutValue(pColData, NULL, 0);
26,434✔
3409
}
3410
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
32,301,513✔
3411
  int32_t code = 0;
32,315,235✔
3412

3413
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
32,311,639!
3414
  if (code) return code;
32,316,414!
3415
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
32,316,414✔
3416
  pColData->numOfNull++;
32,316,414✔
3417

3418
  return tColDataPutValue(pColData, NULL, 0);
32,323,748✔
3419
}
3420
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
528,262✔
3421
  int32_t code = 0;
528,262✔
3422

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

3428
  return tColDataPutValue(pColData, pData, nData);
528,262✔
3429
}
3430
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
4,459,571✔
3431
  int32_t code = 0;
4,459,571✔
3432

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

3438
  return tColDataPutValue(pColData, NULL, 0);
4,459,571✔
3439
}
3440
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
450,614✔
3441
  int32_t code = 0;
450,614✔
3442

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

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

3460
    //       VALUE                  NONE                     NULL
3461
};
3462

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3826
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
10✔
3827
  pColData->numOfNone--;
10✔
3828
  pColData->nVal--;
10✔
3829
  if (pColData->numOfNone) {
10!
UNCOV
3830
    return tColDataAppendValue10(pColData, pData, nData);
×
3831
  } else {
3832
    pColData->flag = 0;
10✔
3833
    return tColDataAppendValue00(pColData, pData, nData);
10✔
3834
  }
3835
}
3836
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24✔
3837
  pColData->numOfNone--;
24✔
3838
  pColData->nVal--;
24✔
3839
  if (pColData->numOfNone) {
24!
UNCOV
3840
    return tColDataAppendValue12(pColData, pData, nData);
×
3841
  } else {
3842
    pColData->flag = 0;
24✔
3843
    return tColDataAppendValue02(pColData, pData, nData);
24✔
3844
  }
3845
  return 0;
3846
}
3847
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
150✔
3848
  if (forward) {
150!
3849
    pColData->numOfNull--;
150✔
3850
    pColData->nVal--;
150✔
3851
    if (pColData->numOfNull) {
150!
UNCOV
3852
      return tColDataAppendValue20(pColData, pData, nData);
×
3853
    } else {
3854
      pColData->flag = 0;
150✔
3855
      return tColDataAppendValue00(pColData, pData, nData);
150✔
3856
    }
3857
  }
UNCOV
3858
  return 0;
×
3859
}
UNCOV
3860
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
UNCOV
3861
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
UNCOV
3862
    pColData->numOfNone--;
×
UNCOV
3863
    pColData->nVal--;
×
UNCOV
3864
    if (pColData->numOfNone) {
×
3865
      return tColDataAppendValue30(pColData, pData, nData);
×
3866
    } else {
UNCOV
3867
      pColData->flag = HAS_NULL;
×
UNCOV
3868
      return tColDataAppendValue20(pColData, pData, nData);
×
3869
    }
UNCOV
3870
  } else if (forward) {  // NULL ==> VALUE
×
3871
    pColData->numOfNull--;
×
UNCOV
3872
    pColData->nVal--;
×
UNCOV
3873
    if (pColData->numOfNull) {
×
UNCOV
3874
      return tColDataAppendValue30(pColData, pData, nData);
×
3875
    } else {
UNCOV
3876
      pColData->flag = HAS_NONE;
×
UNCOV
3877
      return tColDataAppendValue10(pColData, pData, nData);
×
3878
    }
3879
  }
UNCOV
3880
  return 0;
×
3881
}
3882
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
80✔
3883
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
80!
3884
    pColData->numOfNone--;
80✔
3885
    pColData->numOfNull++;
80✔
3886
    if (pColData->numOfNone) {
80!
UNCOV
3887
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
×
3888
    } else {
3889
      pColData->flag = HAS_NULL;
80✔
3890
    }
3891
  }
3892
  return 0;
80✔
3893
}
3894
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
15,311,018✔
3895
  if (forward) {  // VALUE ==> VALUE
15,311,018!
3896
    pColData->nVal--;
15,312,001✔
3897
    if (IS_VAR_DATA_TYPE(pColData->type)) {
15,312,001!
3898
      pColData->nData = pColData->aOffset[pColData->nVal];
2,498,004✔
3899
    } else {
3900
      pColData->nData -= TYPE_BYTES[pColData->type];
12,813,997✔
3901
    }
3902
    return tColDataPutValue(pColData, pData, nData);
15,464,915✔
3903
  }
UNCOV
3904
  return 0;
×
3905
}
3906
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
5,045✔
3907
  if (forward) {  // VALUE ==> NULL
5,045!
3908
    pColData->numOfValue--;
5,045✔
3909
    pColData->nVal--;
5,045✔
3910
    if (pColData->numOfValue) {
5,045✔
3911
      if (IS_VAR_DATA_TYPE(pColData->type)) {
5,005!
3912
        pColData->nData = pColData->aOffset[pColData->nVal];
998✔
3913
      } else {
3914
        pColData->nData -= TYPE_BYTES[pColData->type];
4,007✔
3915
      }
3916
      return tColDataAppendValue42(pColData, pData, nData);
5,006✔
3917
    } else {
3918
      pColData->flag = 0;
40✔
3919
      pColData->nData = 0;
40✔
3920
      return tColDataAppendValue02(pColData, pData, nData);
40✔
3921
    }
3922
  }
UNCOV
3923
  return 0;
×
3924
}
3925
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
30,300✔
3926
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
30,300✔
3927
    pColData->numOfNone--;
5,596✔
3928
    pColData->nVal--;
5,596✔
3929
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
5,596!
3930
      pColData->nData -= TYPE_BYTES[pColData->type];
4,477✔
3931
    }
3932
    if (pColData->numOfNone) {
5,596✔
3933
      return tColDataAppendValue50(pColData, pData, nData);
2,000✔
3934
    } else {
3935
      pColData->flag = HAS_VALUE;
3,596✔
3936
      return tColDataAppendValue40(pColData, pData, nData);
3,600✔
3937
    }
3938
  } else if (forward) {  // VALUE ==> VALUE
24,704!
3939
    pColData->nVal--;
24,706✔
3940
    if (IS_VAR_DATA_TYPE(pColData->type)) {
24,706!
3941
      pColData->nData = pColData->aOffset[pColData->nVal];
3,536✔
3942
    } else {
3943
      pColData->nData -= TYPE_BYTES[pColData->type];
21,170✔
3944
    }
3945
    return tColDataPutValue(pColData, pData, nData);
24,706✔
3946
  }
UNCOV
3947
  return 0;
×
3948
}
3949
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
304✔
3950
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
304!
3951
    pColData->numOfNone--;
304✔
3952
    pColData->nVal--;
304✔
3953
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
304!
3954
      pColData->nData -= TYPE_BYTES[pColData->type];
244✔
3955
    }
3956
    if (pColData->numOfNone) {
304!
UNCOV
3957
      return tColDataAppendValue52(pColData, pData, nData);
×
3958
    } else {
3959
      pColData->flag = HAS_VALUE;
304!
3960
      return tColDataAppendValue42(pColData, pData, nData);
304✔
3961
    }
UNCOV
3962
  } else if (forward) {  // VALUE ==> NULL
×
3963
    pColData->numOfValue--;
×
UNCOV
3964
    pColData->nVal--;
×
UNCOV
3965
    if (pColData->numOfValue) {
×
UNCOV
3966
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
UNCOV
3967
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3968
      } else {
UNCOV
3969
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3970
      }
UNCOV
3971
      return tColDataAppendValue52(pColData, pData, nData);
×
3972
    } else {
UNCOV
3973
      pColData->flag = HAS_NONE;
×
UNCOV
3974
      pColData->nData = 0;
×
UNCOV
3975
      return tColDataAppendValue12(pColData, pData, nData);
×
3976
    }
3977
  }
3978
  return 0;
×
3979
}
3980
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
32,439✔
3981
  if (forward) {
32,439!
3982
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
32,439✔
3983
      pColData->numOfNull--;
22,654✔
3984
      pColData->nVal--;
22,654✔
3985
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
22,654!
3986
        pColData->nData -= TYPE_BYTES[pColData->type];
17,972✔
3987
      }
3988
      if (pColData->numOfNull) {
22,654✔
3989
        return tColDataAppendValue60(pColData, pData, nData);
2,628✔
3990
      } else {
3991
        pColData->flag = HAS_VALUE;
20,026✔
3992
        return tColDataAppendValue40(pColData, pData, nData);
20,027✔
3993
      }
3994
    } else {  // VALUE ==> VALUE
3995
      pColData->nVal--;
9,785✔
3996
      if (IS_VAR_DATA_TYPE(pColData->type)) {
9,785!
3997
        pColData->nData = pColData->aOffset[pColData->nVal];
2,356✔
3998
      } else {
3999
        pColData->nData -= TYPE_BYTES[pColData->type];
7,429✔
4000
      }
4001
      return tColDataPutValue(pColData, pData, nData);
9,788✔
4002
    }
4003
  }
UNCOV
4004
  return 0;
×
4005
}
4006
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24,627✔
4007
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
24,627!
4008
    pColData->numOfValue--;
10,127✔
4009
    pColData->nVal--;
10,127✔
4010
    if (pColData->numOfValue) {
10,127✔
4011
      if (IS_VAR_DATA_TYPE(pColData->type)) {
10,126!
4012
        pColData->nData = pColData->aOffset[pColData->nVal];
2,202✔
4013
      } else {
4014
        pColData->nData -= TYPE_BYTES[pColData->type];
7,924✔
4015
      }
4016
      return tColDataAppendValue62(pColData, pData, nData);
10,127✔
4017
    } else {
4018
      pColData->flag = HAS_NULL;
1✔
4019
      pColData->nData = 0;
1!
4020
      return tColDataAppendValue20(pColData, pData, nData);
1✔
4021
    }
4022
  }
4023
  return 0;
14,500✔
4024
}
4025
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
402✔
4026
  int32_t code = 0;
402✔
4027

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

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

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

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

4139
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
155,964,950✔
4140
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
155,964,950✔
4141
}
155,964,950✔
4142
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
1,619,154✔
4143
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
1,619,154✔
4144
}
1,619,154✔
4145
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
11,159✔
4146
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
4147
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
11,159!
4148
    case 0:
1,016✔
4149
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,016✔
4150
      break;
1,016✔
4151
    case 1:
10,146✔
4152
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
10,146✔
4153
      break;
10,146✔
4154
    default:
×
UNCOV
4155
      break;
×
4156
  }
4157
}
11,159✔
4158
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
4159
  SValue value = {.type = pColData->type};
2,147,483,647✔
4160
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647!
4161
    if (iVal + 1 < pColData->nVal) {
343,398,771!
4162
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
346,462,142✔
4163
    } else {
UNCOV
4164
      value.nData = pColData->nData - pColData->aOffset[iVal];
×
4165
    }
4166
    value.pData = pColData->pData + pColData->aOffset[iVal];
343,398,771✔
4167
  } else {
4168
    valueSetDatum(&value, pColData->type, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
4169
                  tDataTypes[pColData->type].bytes);
2,147,483,647✔
4170
  }
4171
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
4172
}
271,011,629✔
4173
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
9,067,720✔
4174
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
4175
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
9,067,720!
4176
    case 0:
4,556,250✔
4177
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
4,556,250✔
4178
      break;
4,556,250✔
4179
    case 1:
4,634,834✔
4180
      tColDataGetValue4(pColData, iVal, pColVal);
4181
      break;
4,669,710✔
UNCOV
4182
    default:
×
4183
      break;
×
4184
  }
4185
}
9,102,596✔
4186
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
299,460,689✔
4187
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
4188
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
299,460,689!
4189
    case 0:
35,177,907✔
4190
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
35,177,907✔
4191
      break;
35,177,907✔
4192
    case 1:
264,887,189✔
4193
      tColDataGetValue4(pColData, iVal, pColVal);
4194
      break;
266,341,887✔
UNCOV
4195
    default:
×
UNCOV
4196
      break;
×
4197
  }
4198
}
300,915,387✔
4199
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
22✔
4200
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
4201
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
22!
4202
    case 0:
10✔
4203
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
10✔
4204
      break;
10✔
4205
    case 1:
10✔
4206
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
10✔
4207
      break;
10✔
4208
    case 2:
2!
4209
      tColDataGetValue4(pColData, iVal, pColVal);
4210
      break;
2✔
4211
    default:
×
4212
      break;
×
4213
  }
4214
}
22✔
4215
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
4216
    NULL,               // 0
4217
    tColDataGetValue1,  // HAS_NONE
4218
    tColDataGetValue2,  // HAS_NULL
4219
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
4220
    tColDataGetValue4,  // HAS_VALUE
4221
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
4222
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
4223
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
4224
};
4225
int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
4226
  if (iVal < 0 || iVal >= pColData->nVal ||
2,147,483,647!
4227
      (pColData->flag <= 0 || pColData->flag >= sizeof(tColDataGetValueImpl) / POINTER_BYTES)) {
2,147,483,647!
UNCOV
4228
    return TSDB_CODE_INVALID_PARA;
×
4229
  }
4230
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
4231
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
4232
}
4233

4234
uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
774,531,686✔
4235
  switch (pColData->flag) {
774,531,686!
UNCOV
4236
    case HAS_NONE:
×
UNCOV
4237
      return 0;
×
UNCOV
4238
    case HAS_NULL:
×
UNCOV
4239
      return 1;
×
4240
    case (HAS_NULL | HAS_NONE):
11,165✔
4241
      return GET_BIT1(pColData->pBitMap, iVal);
11,165✔
UNCOV
4242
    case HAS_VALUE:
×
UNCOV
4243
      return 2;
×
4244
    case (HAS_VALUE | HAS_NONE):
11,896,478✔
4245
      return (GET_BIT1(pColData->pBitMap, iVal)) ? 2 : 0;
11,896,478✔
4246
    case (HAS_VALUE | HAS_NULL):
762,699,855✔
4247
      return GET_BIT1(pColData->pBitMap, iVal) + 1;
762,699,855✔
4248
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
44✔
4249
      return GET_BIT2(pColData->pBitMap, iVal);
44✔
4250
    default:
×
UNCOV
4251
      return 0;
×
4252
  }
4253
}
4254

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

4258
  *pColData = *pColDataFrom;
5,879✔
4259

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

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

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

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

4310
_exit:
5,879✔
4311
  return code;
5,879✔
4312
}
4313

4314
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
1,746,880✔
4315
  int32_t code;
4316
  SBuffer local;
4317

4318
  if (!(colData->nVal > 0)) {
1,746,880!
UNCOV
4319
    return TSDB_CODE_INVALID_PARA;
×
4320
  }
4321

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

4331
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
1,746,880!
4332
    return 0;
14,673✔
4333
  }
4334

4335
  tBufferInit(&local);
4336
  if (assist == NULL) {
1,732,207!
UNCOV
4337
    assist = &local;
×
4338
  }
4339

4340
  // bitmap
4341
  if (colData->flag != HAS_VALUE) {
1,732,207✔
4342
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
326,891✔
4343
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
32,416✔
4344
    } else {
4345
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
294,475✔
4346
    }
4347

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

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

4360
    info->bitmapCompressedSize = cinfo.compressedSize;
326,982✔
4361
  }
4362

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

4368
  // offset
4369
  if (IS_VAR_DATA_TYPE(colData->type)) {
1,721,701!
4370
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
126,695✔
4371

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

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

4384
    info->offsetCompressedSize = cinfo.compressedSize;
126,691✔
4385
  }
4386

4387
  // data
4388
  if (colData->nData > 0) {
1,721,697!
4389
    info->dataOriginalSize = colData->nData;
1,721,702✔
4390

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

4397
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
1,721,702✔
4398
    if (code) {
1,722,033!
4399
      tBufferDestroy(&local);
4400
      return code;
×
4401
    }
4402

4403
    info->dataCompressedSize = cinfo.compressedSize;
1,722,033✔
4404
  }
4405

4406
  tBufferDestroy(&local);
4407
  return 0;
1,722,028✔
4408
}
4409

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

4415
  tBufferInit(&local);
4416
  if (assist == NULL) {
28,002,353!
UNCOV
4417
    assist = &local;
×
4418
  }
4419

4420
  tColDataClear(colData);
28,002,353✔
4421
  colData->cid = info->columnId;
28,000,140✔
4422
  colData->type = info->dataType;
28,000,140✔
4423
  colData->cflag = info->columnFlag;
28,000,140✔
4424
  colData->nVal = info->numOfData;
28,000,140✔
4425
  colData->flag = info->flag;
28,000,140✔
4426

4427
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
28,000,140✔
4428
    goto _exit;
4,421,818✔
4429
  }
4430

4431
  // bitmap
4432
  if (info->bitmapOriginalSize > 0) {
23,578,322✔
4433
    SCompressInfo cinfo = {
933,487✔
4434
        .dataType = TSDB_DATA_TYPE_TINYINT,
4435
        .cmprAlg = info->cmprAlg,
933,487✔
4436
        .originalSize = info->bitmapOriginalSize,
933,487✔
4437
        .compressedSize = info->bitmapCompressedSize,
933,487✔
4438
    };
4439

4440
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
933,487!
4441
    if (code) {
933,002!
4442
      tBufferDestroy(&local);
UNCOV
4443
      return code;
×
4444
    }
4445

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

4452
    data += cinfo.compressedSize;
933,362✔
4453
  }
4454

4455
  if (info->flag == (HAS_NONE | HAS_NULL)) {
23,578,197✔
4456
    goto _exit;
603✔
4457
  }
4458

4459
  // offset
4460
  if (info->offsetOriginalSize > 0) {
23,577,594✔
4461
    SCompressInfo cinfo = {
5,092,972✔
4462
        .cmprAlg = info->cmprAlg,
5,092,972✔
4463
        .dataType = TSDB_DATA_TYPE_INT,
4464
        .originalSize = info->offsetOriginalSize,
5,092,972✔
4465
        .compressedSize = info->offsetCompressedSize,
5,092,972✔
4466
    };
4467

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

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

4480
    data += cinfo.compressedSize;
5,092,992✔
4481
  }
4482

4483
  // data
4484
  if (info->dataOriginalSize > 0) {
23,577,614✔
4485
    colData->nData = info->dataOriginalSize;
23,576,252✔
4486

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

4494
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
23,576,252!
4495
    if (code) {
23,575,598!
4496
      tBufferDestroy(&local);
4497
      return code;
×
4498
    }
4499

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

4506
    data += cinfo.compressedSize;
23,575,640✔
4507
  }
4508

4509
_exit:
1,362✔
4510
  switch (colData->flag) {
27,999,423✔
4511
    case HAS_NONE:
3,866,709✔
4512
      colData->numOfNone = colData->nVal;
3,866,709✔
4513
      break;
3,866,709✔
4514
    case HAS_NULL:
558,848✔
4515
      colData->numOfNull = colData->nVal;
558,848✔
4516
      break;
558,848✔
4517
    case HAS_VALUE:
22,641,963✔
4518
      colData->numOfValue = colData->nVal;
22,641,963✔
4519
      break;
22,641,963✔
4520
    default:
931,903✔
4521
      for (int32_t i = 0; i < colData->nVal; i++) {
445,151,541✔
4522
        uint8_t bitValue = tColDataGetBitValue(colData, i);
444,223,805✔
4523
        if (bitValue == 0) {
444,219,638✔
4524
          colData->numOfNone++;
4,792,180✔
4525
        } else if (bitValue == 1) {
439,427,458✔
4526
          colData->numOfNull++;
80,324,896✔
4527
        } else {
4528
          colData->numOfValue++;
359,102,562✔
4529
        }
4530
      }
4531
  }
4532
  tBufferDestroy(&local);
4533
  return 0;
27,995,256✔
4534
}
4535

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

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

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

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

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

4642
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
504,508!
4643
    if (!(pColData->type == pBind->buffer_type)) {
503,870!
4644
      return TSDB_CODE_INVALID_PARA;
×
4645
    }
4646
  }
4647

4648
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
504,508!
4649
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
45,533✔
4650
      code = igeos();
3✔
4651
      if (code) {
3!
UNCOV
4652
        return code;
×
4653
      }
4654
    }
4655
    for (int32_t i = 0; i < pBind->num; ++i) {
94,037✔
4656
      if (pBind->is_null && pBind->is_null[i]) {
48,493✔
4657
        if (pColData->cflag & COL_IS_KEY) {
576!
UNCOV
4658
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
4659
          goto _exit;
×
4660
        }
4661
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
576✔
4662
        if (code) goto _exit;
576!
4663
      } else if (pBind->length[i] > buffMaxLen) {
47,917!
UNCOV
4664
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4665
      } else {
4666
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
47,917✔
4667
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
5✔
4668
          if (code) {
5✔
4669
            uError("stmt col[%d] bind geometry wrong format", i);
1!
4670
            goto _exit;
1✔
4671
          }
4672
        }
4673
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
47,916✔
4674
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
47,916✔
4675
      }
4676
    }
4677
  } else {  // fixed-length data type
4678
    bool allValue;
4679
    bool allNull;
4680
    if (pBind->is_null) {
458,975✔
4681
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
20,405✔
4682
      allNull = (same && pBind->is_null[0] != 0);
20,405!
4683
      allValue = (same && pBind->is_null[0] == 0);
20,405!
4684
    } else {
4685
      allNull = false;
438,570✔
4686
      allValue = true;
438,570✔
4687
    }
4688

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

4694
    if (allValue) {
458,975✔
4695
      // optimize (todo)
4696
      for (int32_t i = 0; i < pBind->num; ++i) {
21,090,108✔
4697
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
20,732,203✔
4698
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
20,732,203✔
4699
      }
4700
    } else if (allNull) {
845✔
4701
      // optimize (todo)
4702
      for (int32_t i = 0; i < pBind->num; ++i) {
124✔
4703
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
62✔
4704
        if (code) goto _exit;
62!
4705
      }
4706
    } else {
4707
      for (int32_t i = 0; i < pBind->num; ++i) {
783!
UNCOV
4708
        if (pBind->is_null[i]) {
×
4709
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
UNCOV
4710
          if (code) goto _exit;
×
4711
        } else {
UNCOV
4712
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
×
UNCOV
4713
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
×
4714
        }
4715
      }
4716
    }
4717
  }
4718

4719
_exit:
783✔
4720
  return code;
404,295✔
4721
}
4722

UNCOV
4723
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
×
4724
                                checkWKBGeometryFn cgeos) {
UNCOV
4725
  int32_t code = 0;
×
4726

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

UNCOV
4733
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
×
UNCOV
4734
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
×
UNCOV
4735
      code = igeos();
×
UNCOV
4736
      if (code) {
×
UNCOV
4737
        return code;
×
4738
      }
4739
    }
4740

UNCOV
4741
    uint8_t *buf = pBind->buffer;
×
UNCOV
4742
    for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4743
      if (pBind->is_null && pBind->is_null[i]) {
×
UNCOV
4744
        if (pColData->cflag & COL_IS_KEY) {
×
UNCOV
4745
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
4746
          goto _exit;
×
4747
        }
UNCOV
4748
        if (pBind->is_null[i] == 1) {
×
UNCOV
4749
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
UNCOV
4750
          if (code) goto _exit;
×
4751
        } else {
UNCOV
4752
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
UNCOV
4753
          if (code) goto _exit;
×
4754
        }
UNCOV
4755
      } else if (pBind->length[i] > buffMaxLen) {
×
UNCOV
4756
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4757
      } else {
UNCOV
4758
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
×
UNCOV
4759
          code = cgeos(buf, pBind->length[i]);
×
UNCOV
4760
          if (code) {
×
UNCOV
4761
            uError("stmt2 col[%d] bind geometry wrong format", i);
×
4762
            goto _exit;
×
4763
          }
4764
        }
UNCOV
4765
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
×
UNCOV
4766
        buf += pBind->length[i];
×
4767
      }
4768
    }
4769
  } else {  // fixed-length data type
4770
    bool allValue;
4771
    bool allNull;
4772
    bool allNone;
UNCOV
4773
    if (pBind->is_null) {
×
UNCOV
4774
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
×
UNCOV
4775
      allNull = (same && pBind->is_null[0] == 1);
×
UNCOV
4776
      allNone = (same && pBind->is_null[0] > 1);
×
UNCOV
4777
      allValue = (same && pBind->is_null[0] == 0);
×
4778
    } else {
UNCOV
4779
      allNull = false;
×
UNCOV
4780
      allNone = false;
×
UNCOV
4781
      allValue = true;
×
4782
    }
4783

UNCOV
4784
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
×
UNCOV
4785
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
4786
      goto _exit;
×
4787
    }
4788

UNCOV
4789
    if (allValue) {
×
4790
      // optimize (todo)
UNCOV
4791
      for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4792
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
UNCOV
4793
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
UNCOV
4794
          *val = 1;
×
4795
        }
4796

4797
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
4798
      }
UNCOV
4799
    } else if (allNull) {
×
4800
      // optimize (todo)
UNCOV
4801
      for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4802
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
UNCOV
4803
        if (code) goto _exit;
×
4804
      }
UNCOV
4805
    } else if (allNone) {
×
4806
      // optimize (todo)
UNCOV
4807
      for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4808
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
UNCOV
4809
        if (code) goto _exit;
×
4810
      }
4811
    } else {
UNCOV
4812
      for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4813
        if (pBind->is_null[i]) {
×
UNCOV
4814
          if (pBind->is_null[i] == 1) {
×
UNCOV
4815
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
×
4816
            if (code) goto _exit;
×
4817
          } else {
UNCOV
4818
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
UNCOV
4819
            if (code) goto _exit;
×
4820
          }
4821
        } else {
UNCOV
4822
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
×
UNCOV
4823
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
×
UNCOV
4824
            *val = 1;
×
4825
          }
4826

UNCOV
4827
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
×
4828
        }
4829
      }
4830
    }
4831
  }
4832

UNCOV
4833
_exit:
×
UNCOV
4834
  return code;
×
4835
}
4836
int32_t tColDataAddValueByBind2WithBlob(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
×
4837
                                        SBlobSet *pBlobSet) {
UNCOV
4838
  int32_t code = 0;
×
4839

UNCOV
4840
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
×
UNCOV
4841
    if (!(pColData->type == pBind->buffer_type)) {
×
UNCOV
4842
      return TSDB_CODE_INVALID_PARA;
×
4843
    }
4844
  }
4845

UNCOV
4846
  if (IS_STR_DATA_BLOB(pColData->type)) {  // var-length data type
×
UNCOV
4847
    uint8_t *buf = pBind->buffer;
×
UNCOV
4848
    for (int32_t i = 0; i < pBind->num; ++i) {
×
UNCOV
4849
      if (pBind->is_null && pBind->is_null[i]) {
×
UNCOV
4850
        if (pColData->cflag & COL_IS_KEY) {
×
UNCOV
4851
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
4852
          goto _exit;
×
4853
        }
UNCOV
4854
        if (pBind->is_null[i] == 1) {
×
UNCOV
4855
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NULL](pBlobSet, pColData, NULL, 0);
×
UNCOV
4856
          if (code) goto _exit;
×
4857
        } else {
4858
          code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_NONE](pBlobSet, pColData, NULL, 0);
×
UNCOV
4859
          if (code) goto _exit;
×
4860
        }
4861
      } else if (pBind->length[i] > buffMaxLen) {
×
UNCOV
4862
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4863
      } else {
4864
        code = tColDataAppendValueBlobImpl[pColData->flag][CV_FLAG_VALUE](pBlobSet, pColData, buf, pBind->length[i]);
×
UNCOV
4865
        buf += pBind->length[i];
×
4866
      }
4867
    }
4868
  }
UNCOV
4869
_exit:
×
UNCOV
4870
  return code;
×
4871
}
4872

4873
/* build rows to `rowArray` from bind
4874
 * `infos` is the bind information array
4875
 * `numOfInfos` is the number of bind information
4876
 * `infoSorted` is whether the bind information is sorted by column id
4877
 * `pTSchema` is the schema of the table
4878
 * `rowArray` is the array to store the rows
4879
 * `pOrdered` is the pointer to store ordered
4880
 * `pDupTs` is the pointer to store duplicateTs
4881
 */
4882
int32_t tRowBuildFromBind2(SBindInfo2 *infos, int32_t numOfInfos, SSHashObj *parsedCols, bool infoSorted,
7,369✔
4883
                           const STSchema *pTSchema, SArray *rowArray, bool *pOrdered, bool *pDupTs) {
4884
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
7,369!
UNCOV
4885
    return TSDB_CODE_INVALID_PARA;
×
4886
  }
4887
  int8_t hasBlob = schemaHasBlob(pTSchema);
7,377✔
4888
  if (!infoSorted) {
7,378!
UNCOV
4889
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
4890
  }
4891

4892
  int32_t code = 0;
7,378✔
4893
  int32_t numOfRows = infos[0].bind->num;
7,378✔
4894
  SArray *colValArray, *bufArray;
4895
  SColVal colVal;
4896
  int32_t numOfFixedValue = 0;
7,378✔
4897

4898
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
7,378!
UNCOV
4899
    return terrno;
×
4900
  }
4901
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
7,375!
UNCOV
4902
    taosArrayDestroy(colValArray);
×
UNCOV
4903
    return terrno;
×
4904
  }
4905
  for (int i = 0; i < numOfInfos; ++i) {
117,510✔
4906
    if (parsedCols) {
110,117!
UNCOV
4907
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
×
UNCOV
4908
      if (pParsedVal) {
×
UNCOV
4909
        continue;
×
4910
      }
4911
    }
4912
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
220,250!
UNCOV
4913
      taosArrayDestroy(colValArray);
×
UNCOV
4914
      taosArrayDestroy(bufArray);
×
UNCOV
4915
      return terrno;
×
4916
    }
4917
  }
4918

4919
  SRowKey rowKey, lastRowKey;
4920
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
255,354✔
4921
    taosArrayClear(colValArray);
250,237✔
4922

4923
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
1,391,923✔
4924
      if (parsedCols) {
1,116,628!
4925
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
×
4926
        if (pParsedVal) {
×
UNCOV
4927
          numOfFixedValue++;
×
4928
          colVal = *pParsedVal;
×
4929

UNCOV
4930
          if (taosArrayPush(colValArray, &colVal) == NULL) {
×
4931
            if (IS_VAR_DATA_TYPE(pParsedVal->value.type)) {
×
4932
              taosMemoryFree(colVal.value.pData);
×
4933
            }
UNCOV
4934
            code = terrno;
×
4935
            goto _exit;
×
4936
          }
4937
          continue;
×
4938
        }
4939
      }
4940

4941
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
1,122,401!
4942
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
UNCOV
4943
          if (iInfo == 0) {
×
4944
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
4945
            goto _exit;
×
4946
          }
4947
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
4948
        } else {
4949
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
4950
        }
4951
      } else {
4952
        SValue value = {
1,122,401✔
4953
            .type = infos[iInfo].type,
1,122,401✔
4954
        };
4955
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
1,122,401!
4956
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
85,585!
UNCOV
4957
            int32_t   length = infos[iInfo].bind->length[iRow];
×
UNCOV
4958
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
4959
            value.nData = length;
×
4960
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
UNCOV
4961
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
UNCOV
4962
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo,
×
4963
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), infos[iInfo].bytes);
4964
              goto _exit;
×
4965
            }
UNCOV
4966
            value.pData = *data;
×
4967
            *data += length;
×
4968
          } else {
4969
            int32_t   length = infos[iInfo].bind->length[iRow];
85,585✔
4970
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
85,585✔
4971
            value.nData = length;
85,585✔
4972
            if (value.nData > infos[iInfo].bytes - VARSTR_HEADER_SIZE) {
85,585!
UNCOV
4973
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4974
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo,
×
4975
                     value.nData + (uint32_t)(VARSTR_HEADER_SIZE), infos[iInfo].bytes);
UNCOV
4976
              goto _exit;
×
4977
            }
4978
            value.pData = *data;
85,585✔
4979
            *data += length;
85,585✔
4980
          }
4981
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
4982
        } else {
4983
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
1,036,816✔
4984
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
1,036,816!
4985
            *val = 1;
×
4986
          }
4987
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
1,036,816✔
4988
        }
4989
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
1,126,688✔
4990
      }
4991
      if (taosArrayPush(colValArray, &colVal) == NULL) {
1,141,736!
UNCOV
4992
        code = terrno;
×
UNCOV
4993
        goto _exit;
×
4994
      }
4995
    }
4996

4997
    SRow *row;
4998

4999
    if (hasBlob == 0) {
275,295✔
5000
      SRowBuildScanInfo sinfo = {0};
248,081✔
5001
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
248,081!
UNCOV
5002
        goto _exit;
×
5003
      }
5004
    } else {
5005
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
27,214✔
5006
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, NULL, &sinfo))) {
27,214!
5007
        goto _exit;
×
5008
      }
5009
    }
5010

5011
    if ((taosArrayPush(rowArray, &row)) == NULL) {
248,042!
UNCOV
5012
      code = terrno;
×
UNCOV
5013
      goto _exit;
×
5014
    }
5015

5016
    if (pOrdered && pDupTs) {
248,042!
5017
      tRowGetKey(row, &rowKey);
496,702!
5018
      if (iRow == 0) {
248,270✔
5019
        *pOrdered = true;
7,375✔
5020
        *pDupTs = false;
7,375✔
5021
      } else {
5022
        if (*pOrdered) {
240,895!
5023
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
240,947✔
5024
          *pOrdered = (res >= 0);
240,947✔
5025
          if (!*pDupTs) {
240,947!
5026
            *pDupTs = (res == 0);
241,020✔
5027
          }
5028
        }
5029
      }
5030
      lastRowKey = rowKey;
248,270✔
5031
    }
5032
  }
5033
_exit:
5,117✔
5034
  if (code != 0) {
5,117!
UNCOV
5035
    uError("tRowBuildFromBind2 failed, code=%d", code);
×
5036
  }
5037
  taosArrayDestroy(colValArray);
5,117✔
5038
  taosArrayDestroy(bufArray);
7,378✔
5039
  return code;
7,386✔
5040
}
5041
/* build rows to `rowArray` from bind
5042
 * `infos` is the bind information array
5043
 * `numOfInfos` is the number of bind information
5044
 * `infoSorted` is whether the bind information is sorted by column id
5045
 * `pTSchema` is the schema of the table
5046
 * `rowArray` is the array to store the rows
5047
 * `pOrdered` is the pointer to store ordered
5048
 * `pDupTs` is the pointer to store duplicateTs
5049
 */
UNCOV
5050
int32_t tRowBuildFromBind2WithBlob(SBindInfo2 *infos, int32_t numOfInfos, bool infoSorted, const STSchema *pTSchema,
×
5051
                                   SArray *rowArray, bool *pOrdered, bool *pDupTs, SBlobSet *pBlobSet) {
5052
  if (infos == NULL || numOfInfos <= 0 || numOfInfos > pTSchema->numOfCols || pTSchema == NULL || rowArray == NULL) {
×
5053
    return TSDB_CODE_INVALID_PARA;
×
5054
  }
5055
  int8_t hasBlob = schemaHasBlob(pTSchema);
×
UNCOV
5056
  if (!infoSorted) {
×
UNCOV
5057
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
5058
  }
5059

UNCOV
5060
  int32_t code = 0;
×
UNCOV
5061
  int32_t numOfRows = infos[0].bind->num;
×
5062
  SArray *colValArray, *bufArray;
5063
  SColVal colVal;
5064

UNCOV
5065
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
×
UNCOV
5066
    return terrno;
×
5067
  }
UNCOV
5068
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
×
UNCOV
5069
    taosArrayDestroy(colValArray);
×
UNCOV
5070
    return terrno;
×
5071
  }
UNCOV
5072
  for (int i = 0; i < numOfInfos; ++i) {
×
UNCOV
5073
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
×
UNCOV
5074
      taosArrayDestroy(colValArray);
×
UNCOV
5075
      taosArrayDestroy(bufArray);
×
UNCOV
5076
      return terrno;
×
5077
    }
5078
  }
5079

5080
  SRowKey rowKey, lastRowKey;
UNCOV
5081
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
×
UNCOV
5082
    taosArrayClear(colValArray);
×
5083

UNCOV
5084
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
×
UNCOV
5085
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
×
UNCOV
5086
        if (infos[iInfo].bind->is_null[iRow] == 1) {
×
UNCOV
5087
          if (iInfo == 0) {
×
UNCOV
5088
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
UNCOV
5089
            goto _exit;
×
5090
          }
UNCOV
5091
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
×
5092
        } else {
UNCOV
5093
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
5094
        }
5095
      } else {
UNCOV
5096
        SValue value = {
×
UNCOV
5097
            .type = infos[iInfo].type,
×
5098
        };
UNCOV
5099
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
×
UNCOV
5100
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
×
UNCOV
5101
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5102
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
UNCOV
5103
            value.nData = length;
×
UNCOV
5104
            if (value.nData > (TSDB_MAX_BLOB_LEN - BLOBSTR_HEADER_SIZE)) {
×
UNCOV
5105
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
UNCOV
5106
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5107
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5108
              goto _exit;
×
5109
            }
UNCOV
5110
            value.pData = *data;
×
UNCOV
5111
            *data += length;
×
5112
          } else {
UNCOV
5113
            int32_t   length = infos[iInfo].bind->length[iRow];
×
UNCOV
5114
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo];
×
UNCOV
5115
            value.nData = length;
×
UNCOV
5116
            if (value.nData > pTSchema->columns[infos[iInfo].columnId - 1].bytes - VARSTR_HEADER_SIZE) {
×
UNCOV
5117
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
UNCOV
5118
              uError("stmt bind param[%d] length:%d  greater than type maximum lenght: %d", iInfo, value.nData,
×
5119
                     pTSchema->columns[infos[iInfo].columnId - 1].bytes);
5120
              goto _exit;
×
5121
            }
UNCOV
5122
            value.pData = *data;
×
UNCOV
5123
            *data += length;
×
5124
          }
5125

5126
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5127
        } else {
UNCOV
5128
          uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
×
UNCOV
5129
          if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
×
UNCOV
5130
            *val = 1;
×
5131
          }
UNCOV
5132
          valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
×
5133
        }
UNCOV
5134
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
×
5135
      }
UNCOV
5136
      if (taosArrayPush(colValArray, &colVal) == NULL) {
×
UNCOV
5137
        code = terrno;
×
UNCOV
5138
        goto _exit;
×
5139
      }
5140
    }
5141

5142
    SRow *row;
5143

UNCOV
5144
    if (hasBlob == 0) {
×
UNCOV
5145
      SRowBuildScanInfo sinfo = {0};
×
UNCOV
5146
      if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
×
UNCOV
5147
        goto _exit;
×
5148
      }
5149
    } else {
UNCOV
5150
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
×
UNCOV
5151
      if ((code = tRowBuildWithBlob(colValArray, pTSchema, &row, pBlobSet, &sinfo))) {
×
UNCOV
5152
        goto _exit;
×
5153
      }
5154
    }
5155

UNCOV
5156
    if ((taosArrayPush(rowArray, &row)) == NULL) {
×
UNCOV
5157
      code = terrno;
×
UNCOV
5158
      goto _exit;
×
5159
    }
5160

UNCOV
5161
    if (pOrdered && pDupTs) {
×
UNCOV
5162
      tRowGetKey(row, &rowKey);
×
UNCOV
5163
      if (iRow == 0) {
×
UNCOV
5164
        *pOrdered = true;
×
UNCOV
5165
        *pDupTs = false;
×
5166
      } else {
UNCOV
5167
        if (*pOrdered) {
×
UNCOV
5168
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
×
5169
          *pOrdered = (res >= 0);
×
5170
          if (!*pDupTs) {
×
5171
            *pDupTs = (res == 0);
×
5172
          }
5173
        }
5174
      }
5175
      lastRowKey = rowKey;
×
5176
    }
5177
  }
UNCOV
5178
_exit:
×
5179
  taosArrayDestroy(colValArray);
×
5180
  taosArrayDestroy(bufArray);
×
UNCOV
5181
  return code;
×
5182
}
5183

5184
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
342✔
5185
  int32_t code = TSDB_CODE_SUCCESS;
342✔
5186

5187
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
342!
5188
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
146✔
5189
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
51✔
5190
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
73✔
5191
    if (iToRow == 0) {
73✔
5192
      pToColData->aOffset[iToRow] = 0;
14✔
5193
    }
5194

5195
    if (iToRow < pToColData->nVal - 1) {
73✔
5196
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
64✔
5197
    }
5198

5199
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
73✔
5200
                 nData);
5201
  } else {
5202
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
269✔
5203
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
269✔
5204
  }
5205
  return code;
342✔
5206
}
5207

5208
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
350✔
5209
                                        int32_t iToRow) {
5210
  int32_t code = TSDB_CODE_SUCCESS;
350✔
5211
  int     bit_val = 0;
350✔
5212

5213
  switch (pFromColData->flag) {
350!
UNCOV
5214
    case HAS_NONE: {
×
UNCOV
5215
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5216
    } break;
×
5217
    case HAS_NULL: {
8✔
5218
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
8!
5219
    } break;
8✔
UNCOV
5220
    case (HAS_NULL | HAS_NONE): {
×
5221
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5222
      if (0 == bit_val)
×
UNCOV
5223
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5224
      else
UNCOV
5225
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
×
5226
    } break;
×
5227
    case HAS_VALUE: {
296✔
5228
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
296!
5229
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
296!
5230
    } break;
296✔
5231
    case (HAS_VALUE | HAS_NONE): {
×
UNCOV
5232
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
UNCOV
5233
      if (0 == bit_val)
×
5234
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5235
      else
UNCOV
5236
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
×
UNCOV
5237
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
UNCOV
5238
    } break;
×
5239
    case (HAS_VALUE | HAS_NULL): {
46✔
5240
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
46✔
5241
      if (0 == bit_val)
46✔
5242
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
28!
5243
      else
5244
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
18!
5245
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
46!
5246
    } break;
46✔
UNCOV
5247
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
UNCOV
5248
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
UNCOV
5249
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
UNCOV
5250
    } break;
×
UNCOV
5251
    default:
×
UNCOV
5252
      return -1;
×
5253
  }
5254

5255
  return code;
350✔
5256
}
5257

5258
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
73✔
5259
                               int32_t nColData) {
5260
  int32_t code = TSDB_CODE_SUCCESS;
73✔
5261

5262
  for (int32_t i = 0; i < nColData; i++) {
423✔
5263
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
350✔
5264
    if (code != TSDB_CODE_SUCCESS) {
350!
UNCOV
5265
      return code;
×
5266
    }
5267
  }
5268

5269
  return code;
73✔
5270
}
5271

5272
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
73✔
5273
  int32_t code = TSDB_CODE_SUCCESS;
73✔
5274

5275
  for (int32_t i = 0; i < nColData; i++) {
423✔
5276
    SColVal cv = {0};
350✔
5277
    code = tColDataGetValue(&aFromColData[i], iFromRow, &cv);
350✔
5278
    if (code != TSDB_CODE_SUCCESS) {
350!
UNCOV
5279
      return code;
×
5280
    }
5281
    code = tColDataAppendValue(&aToColData[i], &cv);
350✔
5282
    if (code != TSDB_CODE_SUCCESS) {
350!
UNCOV
5283
      return code;
×
5284
    }
5285
  }
5286

5287
  return code;
73✔
5288
}
5289

5290
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
9,860,550✔
5291
  SColVal cv;
5292

5293
  key->ts = ((TSKEY *)aColData[0].pData)[iRow];
9,860,550✔
5294
  key->numOfPKs = 0;
9,860,550✔
5295

5296
  for (int i = 1; i < nColData; i++) {
9,860,580!
5297
    if (aColData[i].cflag & COL_IS_KEY) {
9,880,387✔
5298
      tColDataGetValue4(&aColData[i], iRow, &cv);
30✔
5299
      key->pks[key->numOfPKs++] = cv.value;
30✔
5300
    } else {
5301
      break;
9,880,357✔
5302
    }
5303
  }
5304
}
9,860,550✔
5305

5306
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
22✔
5307
  SColData *aDstColData = NULL;
22✔
5308
  int32_t   i = start, j = mid + 1, k = 0;
22✔
5309
  SRowKey   keyi, keyj;
5310

5311
  if (end > start) {
22!
5312
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
22!
5313
    if (aDstColData == NULL) {
22!
UNCOV
5314
      return terrno;
×
5315
    }
5316
    for (int c = 0; c < nColData; ++c) {
126✔
5317
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
104✔
5318
    }
5319
  }
5320

5321
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
22✔
5322
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
22✔
5323
  while (i <= mid && j <= end) {
61✔
5324
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
39✔
5325
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
30!
5326
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
30✔
5327
    } else {
5328
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
9!
5329
      if (j <= end) tColDataArrGetRowKey(aColData, nColData, j, &keyj);
9✔
5330
    }
5331
  }
5332

5333
  while (i <= mid) {
33✔
5334
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
11!
5335
  }
5336

5337
  while (j <= end) {
45✔
5338
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
23!
5339
  }
5340

5341
  for (i = start, k = 0; i <= end; ++i, ++k) {
95✔
5342
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
73!
5343
  }
5344

5345
  if (aDstColData) {
22!
5346
    for (int32_t i = 0; i < nColData; i++) {
126✔
5347
      tColDataDestroy(&aDstColData[i]);
104✔
5348
    }
5349
    taosMemoryFree(aDstColData);
22!
5350
  }
5351

5352
  return TSDB_CODE_SUCCESS;
22✔
5353
}
5354

5355
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
49✔
5356
  int32_t ret = TSDB_CODE_SUCCESS;
49✔
5357
  int32_t mid;
5358

5359
  if (start >= end) {
49✔
5360
    return TSDB_CODE_SUCCESS;
27✔
5361
  }
5362

5363
  mid = (start + end) / 2;
22✔
5364

5365
  ret = tColDataMergeSort(aColData, start, mid, nColData);
22✔
5366
  if (ret != TSDB_CODE_SUCCESS) {
22!
UNCOV
5367
    return ret;
×
5368
  }
5369

5370
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
22✔
5371
  if (ret != TSDB_CODE_SUCCESS) {
22!
UNCOV
5372
    return ret;
×
5373
  }
5374

5375
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
22✔
5376
}
5377

5378
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
5✔
5379
  int32_t nVal = aColData[0].nVal;
5✔
5380

5381
  if (nVal < 2) return TSDB_CODE_SUCCESS;
5!
5382

5383
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
5✔
5384
}
5385

5386
static int32_t tColDataMerge(SArray **colArr) {
3✔
5387
  int32_t code = 0;
3✔
5388
  SArray *src = *colArr;
3✔
5389
  SArray *dst = NULL;
3✔
5390

5391
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
3✔
5392
  if (dst == NULL) {
3!
UNCOV
5393
    return terrno;
×
5394
  }
5395

5396
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
12✔
5397
    SColData *srcCol = taosArrayGet(src, i);
9✔
5398

5399
    SColData *dstCol = taosArrayReserve(dst, 1);
9✔
5400
    if (dstCol == NULL) {
9!
UNCOV
5401
      code = terrno;
×
UNCOV
5402
      goto _exit;
×
5403
    }
5404
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
9✔
5405
  }
5406

5407
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
3✔
5408
  SRowKey lastKey;
5409
  for (int32_t i = 0; i < numRows; i++) {
9✔
5410
    SRowKey key;
5411
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
6✔
5412

5413
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
9!
5414
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
12✔
5415
        SColData *srcCol = taosArrayGet(src, j);
9✔
5416
        SColData *dstCol = taosArrayGet(dst, j);
9✔
5417

5418
        SColVal cv;
5419
        code = tColDataGetValue(srcCol, i, &cv);
9✔
5420
        if (code != TSDB_CODE_SUCCESS) {
9!
UNCOV
5421
          goto _exit;
×
5422
        }
5423
        code = tColDataAppendValue(dstCol, &cv);
9✔
5424
        if (code) {
9!
UNCOV
5425
          goto _exit;
×
5426
        }
5427
      }
5428
      lastKey = key;
3✔
5429
    } else {  // update existing row
5430
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
12✔
5431
        SColData *srcCol = taosArrayGet(src, j);
9✔
5432
        SColData *dstCol = taosArrayGet(dst, j);
9✔
5433

5434
        SColVal cv;
5435
        code = tColDataGetValue(srcCol, i, &cv);
9✔
5436
        if (code != TSDB_CODE_SUCCESS) {
9!
UNCOV
5437
          goto _exit;
×
5438
        }
5439
        code = tColDataUpdateValue(dstCol, &cv, true);
9✔
5440
        if (code) {
9!
UNCOV
5441
          goto _exit;
×
5442
        }
5443
      }
5444
    }
5445
  }
5446

5447
_exit:
3✔
5448
  if (code) {
3!
UNCOV
5449
    taosArrayDestroyEx(dst, tColDataDestroy);
×
5450
  } else {
5451
    taosArrayDestroyEx(src, tColDataDestroy);
3✔
5452
    *colArr = dst;
3✔
5453
  }
5454
  return code;
3✔
5455
}
5456

5457
int32_t tColDataSortMerge(SArray **arr) {
10,945✔
5458
  SArray   *colDataArr = *arr;
10,945✔
5459
  int32_t   nColData = TARRAY_SIZE(colDataArr);
10,945✔
5460
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
10,945✔
5461

5462
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
10,945!
UNCOV
5463
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5464
  }
5465
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
10,945!
UNCOV
5466
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5467
  }
5468
  if (!(aColData[0].flag == HAS_VALUE)) {
10,945!
UNCOV
5469
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5470
  }
5471

5472
  if (aColData[0].nVal <= 1) goto _exit;
10,945✔
5473

5474
  int8_t doSort = 0;
10,813✔
5475
  int8_t doMerge = 0;
10,813✔
5476
  // scan -------
5477
  SRowKey lastKey;
5478
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
10,813✔
5479
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
9,793,185!
5480
    SRowKey key;
5481
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
9,886,216✔
5482

5483
    int32_t c = tRowKeyCompare(&lastKey, &key);
9,782,353✔
5484
    if (c < 0) {
9,782,353✔
5485
      lastKey = key;
9,744,996✔
5486
      continue;
9,744,996✔
5487
    } else if (c > 0) {
37,357✔
5488
      doSort = 1;
5✔
5489
      break;
5✔
5490
    } else {
5491
      doMerge = 1;
37,352✔
5492
    }
5493
  }
5494

5495
  // sort -------
UNCOV
5496
  if (doSort) {
×
5497
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
5!
5498
  }
5499

5500
  if ((doMerge != 1) && (doSort == 1)) {
10,843✔
5501
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
5✔
5502
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
27✔
5503
      SRowKey key;
5504
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
22✔
5505

5506
      int32_t c = tRowKeyCompare(&lastKey, &key);
22✔
5507
      if (c == 0) {
22!
UNCOV
5508
        doMerge = 1;
×
UNCOV
5509
        break;
×
5510
      }
5511
      lastKey = key;
22✔
5512
    }
5513
  }
5514

5515
  // merge -------
5516
  if (doMerge) {
10,843✔
5517
    int32_t code = tColDataMerge(arr);
3✔
5518
    if (code) return code;
3!
5519
  }
5520

5521
_exit:
10,843✔
5522
  return 0;
10,975✔
5523
}
5524

5525
int32_t tColDataSortMergeWithBlob(SArray **arr, SBlobSet *pBlob) {
×
5526
  SArray   *colDataArr = *arr;
×
UNCOV
5527
  int32_t   nColData = TARRAY_SIZE(colDataArr);
×
UNCOV
5528
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
×
5529

UNCOV
5530
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
×
UNCOV
5531
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5532
  }
UNCOV
5533
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
UNCOV
5534
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5535
  }
UNCOV
5536
  if (!(aColData[0].flag == HAS_VALUE)) {
×
UNCOV
5537
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5538
  }
5539

UNCOV
5540
  if (aColData[0].nVal <= 1) goto _exit;
×
5541

UNCOV
5542
  int8_t doSort = 0;
×
UNCOV
5543
  int8_t doMerge = 0;
×
5544
  // scan -------
5545
  SRowKey lastKey;
UNCOV
5546
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
UNCOV
5547
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5548
    SRowKey key;
UNCOV
5549
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5550

UNCOV
5551
    int32_t c = tRowKeyCompare(&lastKey, &key);
×
UNCOV
5552
    if (c < 0) {
×
UNCOV
5553
      lastKey = key;
×
UNCOV
5554
      continue;
×
UNCOV
5555
    } else if (c > 0) {
×
UNCOV
5556
      doSort = 1;
×
5557
      break;
×
5558
    } else {
UNCOV
5559
      doMerge = 1;
×
5560
    }
5561
  }
UNCOV
5562
  if (doMerge || doSort) {
×
UNCOV
5563
    return TSDB_CODE_BLOB_NOT_SUPPORT;
×
5564
  }
5565
  // sort -------
UNCOV
5566
  if (doSort) {
×
UNCOV
5567
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
×
5568
  }
5569

UNCOV
5570
  if ((doMerge != 1) && (doSort == 1)) {
×
UNCOV
5571
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
UNCOV
5572
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5573
      SRowKey key;
UNCOV
5574
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5575

UNCOV
5576
      int32_t c = tRowKeyCompare(&lastKey, &key);
×
UNCOV
5577
      if (c == 0) {
×
UNCOV
5578
        doMerge = 1;
×
UNCOV
5579
        break;
×
5580
      }
UNCOV
5581
      lastKey = key;
×
5582
    }
5583
  }
5584

5585
  // merge -------
UNCOV
5586
  if (doMerge) {
×
UNCOV
5587
    int32_t code = tColDataMerge(arr);
×
UNCOV
5588
    if (code) return code;
×
5589
  }
5590

UNCOV
5591
_exit:
×
UNCOV
5592
  return 0;
×
5593
}
5594

5595
static int32_t tEncodeColDataVersion0(SEncoder *pEncoder, SColData *pColData) {
73,365✔
5596
  int32_t code = 0;
73,365✔
5597

5598
  if ((code = tEncodeI16v(pEncoder, pColData->cid))) return code;
146,730!
5599
  if ((code = tEncodeI8(pEncoder, pColData->type))) return code;
146,730!
5600
  if ((code = tEncodeI32v(pEncoder, pColData->nVal))) return code;
146,730!
5601
  if ((code = tEncodeI8(pEncoder, pColData->flag))) return code;
146,730!
5602

5603
  // bitmap
5604
  switch (pColData->flag) {
73,365!
5605
    case (HAS_NULL | HAS_NONE):
110✔
5606
    case (HAS_VALUE | HAS_NONE):
5607
    case (HAS_VALUE | HAS_NULL):
5608
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
110✔
5609
      if (code) return code;
110!
5610
      break;
110✔
UNCOV
5611
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
UNCOV
5612
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
UNCOV
5613
      if (code) return code;
×
UNCOV
5614
      break;
×
5615
    default:
73,255✔
5616
      break;
73,255✔
5617
  }
5618

5619
  // value
5620
  if (pColData->flag & HAS_VALUE) {
73,365✔
5621
    if (IS_VAR_DATA_TYPE(pColData->type)) {
73,094!
5622
      code = tEncodeFixed(pEncoder, pColData->aOffset, pColData->nVal << 2);
1,134✔
5623
      if (code) return code;
1,134!
5624

5625
      code = tEncodeI32v(pEncoder, pColData->nData);
1,134✔
5626
      if (code) return code;
1,134!
5627

5628
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
1,134✔
5629
      if (code) return code;
1,134!
5630
    } else {
5631
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
71,960✔
5632
      if (code) return code;
71,960!
5633
    }
5634
  }
5635

5636
  return code;
73,365✔
5637
}
5638

5639
static int32_t tDecodeColDataVersion0(SDecoder *pDecoder, SColData *pColData) {
19,072✔
5640
  int32_t code = 0;
19,072✔
5641

5642
  if ((code = tDecodeI16v(pDecoder, &pColData->cid))) return code;
38,146!
5643
  if ((code = tDecodeI8(pDecoder, &pColData->type))) return code;
38,146!
5644
  if ((code = tDecodeI32v(pDecoder, &pColData->nVal))) return code;
38,141!
5645
  if ((code = tDecodeI8(pDecoder, &pColData->flag))) return code;
38,135!
5646

5647
  if (pColData->type <= 0 || pColData->type >= TSDB_DATA_TYPE_MAX || pColData->flag <= 0 || pColData->flag >= 8) {
19,066!
UNCOV
5648
    return TSDB_CODE_INVALID_PARA;
×
5649
  }
5650

5651
  // bitmap
5652
  switch (pColData->flag) {
19,068!
5653
    case (HAS_NULL | HAS_NONE):
228✔
5654
    case (HAS_VALUE | HAS_NONE):
5655
    case (HAS_VALUE | HAS_NULL):
5656
      code = tDecodeBinaryWithSize(pDecoder, BIT1_SIZE(pColData->nVal), &pColData->pBitMap);
228!
5657
      if (code) return code;
228!
5658
      break;
228✔
UNCOV
5659
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
UNCOV
5660
      code = tDecodeBinaryWithSize(pDecoder, BIT2_SIZE(pColData->nVal), &pColData->pBitMap);
×
UNCOV
5661
      if (code) return code;
×
UNCOV
5662
      break;
×
5663
    default:
18,840✔
5664
      break;
18,840✔
5665
  }
5666

5667
  // value
5668
  if (pColData->flag & HAS_VALUE) {
19,068✔
5669
    if (IS_VAR_DATA_TYPE(pColData->type)) {
18,732!
5670
      code = tDecodeBinaryWithSize(pDecoder, pColData->nVal << 2, (uint8_t **)&pColData->aOffset);
1,369!
5671
      if (code) return code;
1,369!
5672

5673
      code = tDecodeI32v(pDecoder, &pColData->nData);
1,369✔
5674
      if (code) return code;
1,367!
5675

5676
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
1,367!
5677
      if (code) return code;
1,367!
5678
    } else {
5679
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
17,363✔
5680
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
17,363!
5681
      if (code) return code;
17,363!
5682
    }
5683
  }
5684
  pColData->cflag = 0;
19,066✔
5685

5686
  return code;
19,066✔
5687
}
5688

5689
static int32_t tEncodeColDataVersion1(SEncoder *pEncoder, SColData *pColData) {
73,365✔
5690
  int32_t code = tEncodeColDataVersion0(pEncoder, pColData);
73,365✔
5691
  if (code) return code;
73,363!
5692
  return tEncodeI8(pEncoder, pColData->cflag);
146,726✔
5693
}
5694

5695
static int32_t tDecodeColDataVersion1(SDecoder *pDecoder, SColData *pColData) {
19,072✔
5696
  int32_t code = tDecodeColDataVersion0(pDecoder, pColData);
19,072✔
5697
  if (code) return code;
19,069!
5698

5699
  code = tDecodeI8(pDecoder, &pColData->cflag);
19,069✔
5700
  return code;
19,067✔
5701
}
5702

5703
int32_t tEncodeColData(uint8_t version, SEncoder *pEncoder, SColData *pColData) {
73,370✔
5704
  if (version == 0) {
73,370!
UNCOV
5705
    return tEncodeColDataVersion0(pEncoder, pColData);
×
5706
  } else if (version == 1) {
73,370!
5707
    return tEncodeColDataVersion1(pEncoder, pColData);
73,371✔
5708
  } else {
5709
    return TSDB_CODE_INVALID_PARA;
×
5710
  }
5711
}
5712

5713
int32_t tDecodeColData(uint8_t version, SDecoder *pDecoder, SColData *pColData) {
19,072✔
5714
  if (version == 0) {
19,072!
UNCOV
5715
    return tDecodeColDataVersion0(pDecoder, pColData);
×
5716
  } else if (version == 1) {
19,072!
5717
    return tDecodeColDataVersion1(pDecoder, pColData);
19,072✔
5718
  } else {
UNCOV
5719
    return TSDB_CODE_INVALID_PARA;
×
5720
  }
5721
}
5722

5723
int32_t tEncodeRow(SEncoder *pEncoder, SRow *pRow) { return tEncodeFixed(pEncoder, pRow, pRow->len); }
2,050,505,422✔
5724

5725
int32_t tDecodeRow(SDecoder *pDecoder, SRow **ppRow) {
644,968,614✔
5726
  if (ppRow == NULL) {
644,968,614!
UNCOV
5727
    return TSDB_CODE_INVALID_PARA;
×
5728
  }
5729

5730
  if (pDecoder->pos + sizeof(SRow) > pDecoder->size) {
644,968,614!
UNCOV
5731
    return TSDB_CODE_OUT_OF_RANGE;
×
5732
  }
5733

5734
  SRow *pRow = (SRow *)(pDecoder->data + pDecoder->pos);
644,968,614✔
5735
  return tDecodeBinaryWithSize(pDecoder, pRow->len, (uint8_t **)ppRow);
1,289,937,228!
5736
}
5737

UNCOV
5738
int32_t tEncodeBlobSet(SEncoder *pEncoder, SBlobSet *pRow) {
×
UNCOV
5739
  int32_t code = 0;
×
UNCOV
5740
  int32_t lino = 0;
×
UNCOV
5741
  uint8_t compressed = 0;
×
UNCOV
5742
  int32_t compressSize = 0;
×
UNCOV
5743
  char   *p = NULL;
×
5744

UNCOV
5745
  TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pRow->type));
×
UNCOV
5746
  TAOS_CHECK_EXIT(tEncodeI64(pEncoder, pRow->len));
×
5747

UNCOV
5748
  int32_t nSeq = taosArrayGetSize(pRow->pSeqTable);
×
UNCOV
5749
  TAOS_CHECK_EXIT(tEncodeI32(pEncoder, nSeq));
×
5750

5751
  // if (pRow->type) {
UNCOV
5752
  void *pIter = taosHashIterate(pRow->pSeqToffset, NULL);
×
UNCOV
5753
  while (pIter) {
×
UNCOV
5754
    uint64_t seq = *(uint64_t *)taosHashGetKey(pIter, NULL);
×
UNCOV
5755
    int32_t  idx = *(int32_t *)pIter;
×
UNCOV
5756
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, seq));
×
UNCOV
5757
    TAOS_CHECK_EXIT(tEncodeI32(pEncoder, idx));
×
5758

UNCOV
5759
    pIter = taosHashIterate(pRow->pSeqToffset, pIter);
×
5760
  }
5761
  //}
UNCOV
5762
  for (int32_t i = 0; i < nSeq; i++) {
×
UNCOV
5763
    SBlobValue *p = taosArrayGet(pRow->pSeqTable, i);
×
UNCOV
5764
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, p->offset));
×
UNCOV
5765
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->len));
×
UNCOV
5766
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->dataOffset));
×
UNCOV
5767
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->nextRow));
×
UNCOV
5768
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->type));
×
5769
  }
5770

UNCOV
5771
  TAOS_CHECK_EXIT(tEncodeFixed(pEncoder, pRow->data, pRow->len));
×
5772

UNCOV
5773
_exit:
×
5774
  return code;
×
5775
}
5776

UNCOV
5777
int32_t tDecodeBlobSet(SDecoder *pDecoder, SBlobSet **pBlobSet) {
×
UNCOV
5778
  int32_t    code = 0;
×
5779
  int32_t    lino = 0;
×
UNCOV
5780
  int32_t    nSeq = 0;
×
UNCOV
5781
  uint8_t    compressd = 0;
×
5782
  int32_t    compressSize = 0;
×
UNCOV
5783
  SBlobSet  *pBlob = taosMemCalloc(1, sizeof(SBlobSet));
×
UNCOV
5784
  if (pBlob == NULL) {
×
UNCOV
5785
    TAOS_CHECK_EXIT(terrno);
×
5786
  }
UNCOV
5787
  TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &pBlob->type));
×
UNCOV
5788
  TAOS_CHECK_EXIT(tDecodeI64(pDecoder, &pBlob->len));
×
5789

UNCOV
5790
  TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &nSeq));
×
5791

5792
  // if (pBlob->type) {
UNCOV
5793
  pBlob->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
×
UNCOV
5794
  if (pBlob->pSeqToffset == NULL) {
×
UNCOV
5795
    TAOS_CHECK_EXIT(terrno);
×
5796
  }
5797
  for (int32_t i = 0; i < nSeq; i++) {
×
5798
    uint64_t seq;
5799
    int32_t  idx;
UNCOV
5800
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &seq));
×
5801
    TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &idx));
×
5802

5803
    code = taosHashPut(pBlob->pSeqToffset, &seq, sizeof(seq), &idx, sizeof(idx));
×
5804
    TAOS_CHECK_EXIT(code);
×
5805
  }
5806
  //}
5807

UNCOV
5808
  pBlob->pSeqTable = taosArrayInit(nSeq, sizeof(SBlobValue));
×
UNCOV
5809
  if (pBlob->pSeqTable == NULL) {
×
UNCOV
5810
    TAOS_CHECK_EXIT(terrno);
×
5811
  }
5812

5813
  for (int32_t i = 0; i < nSeq; i++) {
×
5814
    SBlobValue value;
UNCOV
5815
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &value.offset));
×
5816
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.len));
×
UNCOV
5817
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.dataOffset));
×
UNCOV
5818
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.nextRow));
×
UNCOV
5819
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.type));
×
UNCOV
5820
    if (taosArrayPush(pBlob->pSeqTable, &value) == NULL) {
×
UNCOV
5821
      TAOS_CHECK_EXIT(terrno);
×
5822
    }
5823
  }
5824

UNCOV
5825
  pBlob->data = taosMemCalloc(1, pBlob->len);
×
5826
  if (pBlob->data == NULL) {
×
UNCOV
5827
    TAOS_CHECK_EXIT(terrno);
×
5828
  }
5829

UNCOV
5830
  TAOS_CHECK_EXIT(tDecodeFixed(pDecoder, pBlob->data, pBlob->len));
×
UNCOV
5831
  *pBlobSet = pBlob;
×
5832

UNCOV
5833
  uTrace("decode blob len:%d", (int32_t)(pBlob->len));
×
5834

UNCOV
5835
_exit:
×
UNCOV
5836
  if (code != 0) {
×
UNCOV
5837
    if (pBlob != NULL) {
×
UNCOV
5838
      taosMemoryFree(pBlob->data);
×
UNCOV
5839
      taosArrayDestroy(pBlob->pSeqTable);
×
UNCOV
5840
      taosMemoryFree(pBlob);
×
5841
    }
5842
  }
UNCOV
5843
  return code;
×
5844
}
5845

5846
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
5847
  do {                                       \
5848
    (SUM) += (VAL);                          \
5849
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
5850
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
5851
  } while (0)
5852

5853
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, SColumnDataAgg *pAggs) {
10,627✔
5854
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
10,627✔
5855
  int16_t *numOfNull = &pAggs->numOfNull;
10,627✔
5856
  *sum = 0;
10,627✔
5857
  *max = 0;
10,627✔
5858
  *min = 1;
10,627✔
5859
  *numOfNull = 0;
10,627✔
5860

5861
  int8_t val;
5862
  if (HAS_VALUE == pColData->flag) {
10,627✔
5863
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,461,860✔
5864
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
12,452,232✔
5865
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
12,452,232✔
5866
    }
5867
  } else {
5868
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
5869
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
5870
        case 0:
143,080✔
5871
        case 1:
5872
          (*numOfNull)++;
143,080✔
5873
          break;
143,080✔
5874
        case 2:
2,704,070✔
5875
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
2,704,070✔
5876
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,704,070✔
5877
          break;
2,704,070✔
UNCOV
5878
        default:
×
UNCOV
5879
          break;
×
5880
      }
5881
    }
5882
  }
5883
}
10,627✔
5884

5885
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
10,651✔
5886
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
10,651✔
5887
  int16_t *numOfNull = &pAggs->numOfNull;
10,651✔
5888
  *sum = 0;
10,651✔
5889
  *max = INT8_MIN;
10,651✔
5890
  *min = INT8_MAX;
10,651✔
5891
  *numOfNull = 0;
10,651✔
5892

5893
  int8_t val;
5894
  if (HAS_VALUE == pColData->flag) {
10,651✔
5895
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,521,024✔
5896
      val = ((int8_t *)pColData->pData)[iVal];
12,511,384✔
5897
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
12,511,384✔
5898
    }
5899
  } else {
5900
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,860,161✔
5901
      switch (tColDataGetBitValue(pColData, iVal)) {
2,859,150!
5902
        case 0:
151,696✔
5903
        case 1:
5904
          (*numOfNull)++;
151,696✔
5905
          break;
151,696✔
5906
        case 2:
2,707,454✔
5907
          val = ((int8_t *)pColData->pData)[iVal];
2,707,454✔
5908
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,707,454✔
5909
          break;
2,707,454✔
UNCOV
5910
        default:
×
5911
          break;
×
5912
      }
5913
    }
5914
  }
5915
}
10,651✔
5916

5917
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
10,641✔
5918
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
10,641✔
5919
  int16_t *numOfNull = &pAggs->numOfNull;
10,641✔
5920
  *sum = 0;
10,641✔
5921
  *max = INT16_MIN;
10,641✔
5922
  *min = INT16_MAX;
10,641✔
5923
  *numOfNull = 0;
10,641✔
5924

5925
  int16_t val;
5926
  if (HAS_VALUE == pColData->flag) {
10,641✔
5927
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,522,984✔
5928
      val = ((int16_t *)pColData->pData)[iVal];
12,513,342✔
5929
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
12,513,342✔
5930
    }
5931
  } else {
5932
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
5933
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
5934
        case 0:
142,608✔
5935
        case 1:
5936
          (*numOfNull)++;
142,608✔
5937
          break;
142,608✔
5938
        case 2:
2,704,542✔
5939
          val = ((int16_t *)pColData->pData)[iVal];
2,704,542✔
5940
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,704,542✔
5941
          break;
2,704,542✔
UNCOV
5942
        default:
×
UNCOV
5943
          break;
×
5944
      }
5945
    }
5946
  }
5947
}
10,641✔
5948

5949
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, SColumnDataAgg *pAggs) {
301,653✔
5950
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
301,653✔
5951
  int16_t *numOfNull = &pAggs->numOfNull;
301,653✔
5952
  *sum = 0;
301,653✔
5953
  *max = INT32_MIN;
301,653✔
5954
  *min = INT32_MAX;
301,653✔
5955
  *numOfNull = 0;
301,653✔
5956

5957
  int32_t val;
5958
  if (HAS_VALUE == pColData->flag) {
301,653✔
5959
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
740,233,853✔
5960
      val = ((int32_t *)pColData->pData)[iVal];
739,989,326✔
5961
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
739,989,326✔
5962
    }
5963
  } else {
5964
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
153,537,207✔
5965
      switch (tColDataGetBitValue(pColData, iVal)) {
153,480,266!
5966
        case 0:
8,557,439✔
5967
        case 1:
5968
          (*numOfNull)++;
8,557,439✔
5969
          break;
8,557,439✔
5970
        case 2:
144,999,704✔
5971
          val = ((int32_t *)pColData->pData)[iVal];
144,999,704✔
5972
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
144,999,704✔
5973
          break;
144,999,704✔
UNCOV
5974
        default:
×
UNCOV
5975
          break;
×
5976
      }
5977
    }
5978
  }
5979
}
301,468✔
5980

5981
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, SColumnDataAgg *pAggs) {
268,529✔
5982
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
268,529✔
5983
  int16_t *numOfNull = &pAggs->numOfNull;
268,529✔
5984
  *sum = 0;
268,529✔
5985
  *max = INT64_MIN;
268,529✔
5986
  *min = INT64_MAX;
268,529✔
5987
  *numOfNull = 0;
268,529✔
5988

5989
  int64_t val;
5990
  if (HAS_VALUE == pColData->flag) {
268,529✔
5991
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
674,877,233✔
5992
      val = ((int64_t *)pColData->pData)[iVal];
674,614,422✔
5993
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
674,614,422✔
5994
    }
5995
  } else {
5996
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
18,861,148✔
5997
      switch (tColDataGetBitValue(pColData, iVal)) {
18,855,430!
5998
        case 0:
1,870,161✔
5999
        case 1:
6000
          (*numOfNull)++;
1,870,161✔
6001
          break;
1,870,161✔
6002
        case 2:
16,985,269✔
6003
          val = ((int64_t *)pColData->pData)[iVal];
16,985,269✔
6004
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
16,985,269✔
6005
          break;
16,985,269✔
UNCOV
6006
        default:
×
UNCOV
6007
          break;
×
6008
      }
6009
    }
6010
  }
6011
}
268,529✔
6012

6013
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, SColumnDataAgg *pAggs) {
11,795✔
6014
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
11,795✔
6015
  int16_t *numOfNull = &pAggs->numOfNull;
11,795✔
6016
  *(double *)sum = 0;
11,795✔
6017
  *(double *)max = -FLT_MAX;
11,795✔
6018
  *(double *)min = FLT_MAX;
11,795✔
6019
  *numOfNull = 0;
11,795✔
6020

6021
  float val;
6022
  if (HAS_VALUE == pColData->flag) {
11,795✔
6023
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
16,546,754✔
6024
      val = ((float *)pColData->pData)[iVal];
16,535,985✔
6025
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
16,535,985✔
6026
    }
6027
  } else {
6028
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,869,985✔
6029
      switch (tColDataGetBitValue(pColData, iVal)) {
2,868,959!
6030
        case 0:
152,968✔
6031
        case 1:
6032
          (*numOfNull)++;
152,968✔
6033
          break;
152,968✔
6034
        case 2:
2,715,991✔
6035
          val = ((float *)pColData->pData)[iVal];
2,715,991✔
6036
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,715,991✔
6037
          break;
2,715,991✔
UNCOV
6038
        default:
×
UNCOV
6039
          break;
×
6040
      }
6041
    }
6042
  }
6043
}
11,795✔
6044

6045
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, SColumnDataAgg *pAggs) {
11,321✔
6046
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
11,321✔
6047
  int16_t *numOfNull = &pAggs->numOfNull;
11,321✔
6048
  *(double *)sum = 0;
11,321✔
6049
  *(double *)max = -DBL_MAX;
11,321✔
6050
  *(double *)min = DBL_MAX;
11,321✔
6051
  *numOfNull = 0;
11,321✔
6052

6053
  double val;
6054
  if (HAS_VALUE == pColData->flag) {
11,321✔
6055
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
18,006,358✔
6056
      val = ((double *)pColData->pData)[iVal];
17,996,048✔
6057
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
17,996,048✔
6058
    }
6059
  } else {
6060
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,860,161✔
6061
      switch (tColDataGetBitValue(pColData, iVal)) {
2,859,150!
6062
        case 0:
152,405✔
6063
        case 1:
6064
          (*numOfNull)++;
152,405✔
6065
          break;
152,405✔
6066
        case 2:
2,706,745✔
6067
          val = ((double *)pColData->pData)[iVal];
2,706,745✔
6068
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,706,745✔
6069
          break;
2,706,745✔
UNCOV
6070
        default:
×
UNCOV
6071
          break;
×
6072
      }
6073
    }
6074
  }
6075
}
11,321✔
6076

6077
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,858✔
6078
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,858✔
6079
  int16_t *numOfNull = &pAggs->numOfNull;
7,858✔
6080
  *(uint64_t *)sum = 0;
7,858✔
6081
  *(uint64_t *)max = 0;
7,858✔
6082
  *(uint64_t *)min = UINT8_MAX;
7,858✔
6083
  *numOfNull = 0;
7,858✔
6084

6085
  uint8_t val;
6086
  if (HAS_VALUE == pColData->flag) {
7,858✔
6087
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,083,732✔
6088
      val = ((uint8_t *)pColData->pData)[iVal];
12,076,873✔
6089
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
12,076,873✔
6090
    }
6091
  } else {
6092
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
6093
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
6094
        case 0:
142,769✔
6095
        case 1:
6096
          (*numOfNull)++;
142,769✔
6097
          break;
142,769✔
6098
        case 2:
2,704,381✔
6099
          val = ((uint8_t *)pColData->pData)[iVal];
2,704,381✔
6100
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,704,381✔
6101
          break;
2,704,381✔
UNCOV
6102
        default:
×
UNCOV
6103
          break;
×
6104
      }
6105
    }
6106
  }
6107
}
7,858✔
6108

6109
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,858✔
6110
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,858✔
6111
  int16_t *numOfNull = &pAggs->numOfNull;
7,858✔
6112
  *(uint64_t *)sum = 0;
7,858✔
6113
  *(uint64_t *)max = 0;
7,858✔
6114
  *(uint64_t *)min = UINT16_MAX;
7,858✔
6115
  *numOfNull = 0;
7,858✔
6116

6117
  uint16_t val;
6118
  if (HAS_VALUE == pColData->flag) {
7,858✔
6119
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,084,207✔
6120
      val = ((uint16_t *)pColData->pData)[iVal];
12,077,348✔
6121
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
12,077,348✔
6122
    }
6123
  } else {
6124
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
6125
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
6126
        case 0:
142,222✔
6127
        case 1:
6128
          (*numOfNull)++;
142,222✔
6129
          break;
142,222✔
6130
        case 2:
2,704,928✔
6131
          val = ((uint16_t *)pColData->pData)[iVal];
2,704,928✔
6132
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,704,928✔
6133
          break;
2,704,928✔
UNCOV
6134
        default:
×
UNCOV
6135
          break;
×
6136
      }
6137
    }
6138
  }
6139
}
7,858✔
6140

6141
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,858✔
6142
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,858✔
6143
  int16_t *numOfNull = &pAggs->numOfNull;
7,858✔
6144
  *(uint64_t *)sum = 0;
7,858✔
6145
  *(uint64_t *)max = 0;
7,858✔
6146
  *(uint64_t *)min = UINT32_MAX;
7,858✔
6147
  *numOfNull = 0;
7,858✔
6148

6149
  uint32_t val;
6150
  if (HAS_VALUE == pColData->flag) {
7,858✔
6151
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,083,880✔
6152
      val = ((uint32_t *)pColData->pData)[iVal];
12,077,021✔
6153
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
12,077,021✔
6154
    }
6155
  } else {
6156
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
6157
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
6158
        case 0:
141,333✔
6159
        case 1:
6160
          (*numOfNull)++;
141,333✔
6161
          break;
141,333✔
6162
        case 2:
2,705,817✔
6163
          val = ((uint32_t *)pColData->pData)[iVal];
2,705,817✔
6164
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,705,817✔
6165
          break;
2,705,817✔
UNCOV
6166
        default:
×
UNCOV
6167
          break;
×
6168
      }
6169
    }
6170
  }
6171
}
7,858✔
6172

6173
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, SColumnDataAgg *pAggs) {
7,858✔
6174
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
7,858✔
6175
  int16_t *numOfNull = &pAggs->numOfNull;
7,858✔
6176
  *(uint64_t *)sum = 0;
7,858✔
6177
  *(uint64_t *)max = 0;
7,858✔
6178
  *(uint64_t *)min = UINT64_MAX;
7,858✔
6179
  *numOfNull = 0;
7,858✔
6180

6181
  uint64_t val;
6182
  if (HAS_VALUE == pColData->flag) {
7,858✔
6183
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,083,853✔
6184
      val = ((uint64_t *)pColData->pData)[iVal];
12,076,994✔
6185
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
12,076,994✔
6186
    }
6187
  } else {
6188
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,848,149✔
6189
      switch (tColDataGetBitValue(pColData, iVal)) {
2,847,150!
6190
        case 0:
142,680✔
6191
        case 1:
6192
          (*numOfNull)++;
142,680✔
6193
          break;
142,680✔
6194
        case 2:
2,704,470✔
6195
          val = ((uint64_t *)pColData->pData)[iVal];
2,704,470✔
6196
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,704,470✔
6197
          break;
2,704,470✔
6198
        default:
×
6199
          break;
×
6200
      }
6201
    }
6202
  }
6203
}
7,858✔
6204

6205
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, SColumnDataAgg *pAggs) {
25,834✔
6206
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
25,834✔
6207
  int16_t *numOfNull = &pAggs->numOfNull;
25,834✔
6208
  *(uint64_t *)sum = 0;
25,834✔
6209
  *(uint64_t *)max = 0;
25,834✔
6210
  *(uint64_t *)min = 0;
25,834✔
6211
  *numOfNull = 0;
25,834✔
6212

6213
  switch (pColData->flag) {
25,834!
6214
    case HAS_NONE:
×
6215
    case HAS_NULL:
6216
    case (HAS_NONE | HAS_NULL):
6217
      *numOfNull = pColData->nVal;
×
UNCOV
6218
      break;
×
6219
    case HAS_VALUE:
23,824✔
6220
      *numOfNull = 0;
23,824✔
6221
      break;
23,824✔
6222
    case (HAS_VALUE | HAS_NULL):
2,010✔
6223
    case (HAS_VALUE | HAS_NONE):
6224
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
5,708,310✔
6225
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
5,706,300✔
6226
          (*numOfNull)++;
294,008✔
6227
        }
6228
      }
6229
      break;
2,010✔
UNCOV
6230
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
UNCOV
6231
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
UNCOV
6232
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
UNCOV
6233
          (*numOfNull)++;
×
6234
        }
6235
      }
UNCOV
6236
      break;
×
UNCOV
6237
    default:
×
UNCOV
6238
      break;
×
6239
  }
6240
}
25,834✔
6241

6242
#define CALC_DECIMAL_SUM_MAX_MIN(TYPE, pSumOp, pCompOp, pColData, pSum, pMax, pMin)                   \
6243
  do {                                                                                                \
6244
    if (decimal128AddCheckOverflow((Decimal *)pSum, pVal, DECIMAL_WORD_NUM(TYPE))) *pOverflow = true; \
6245
    pSumOp->add(pSum, pVal, DECIMAL_WORD_NUM(TYPE));                                                  \
6246
    if (pCompOp->gt(pVal, pMax, DECIMAL_WORD_NUM(TYPE))) {                                            \
6247
      *(pMax) = *pVal;                                                                                \
6248
    }                                                                                                 \
6249
    if (pCompOp->lt(pVal, pMin, DECIMAL_WORD_NUM(TYPE))) {                                            \
6250
      *(pMin) = *pVal;                                                                                \
6251
    }                                                                                                 \
6252
  } while (0)
6253

6254
static FORCE_INLINE void tColDataCalcSMADecimal64Type(SColData *pColData, SColumnDataAgg *pAggs) {
717✔
6255
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum;
717✔
6256
  Decimal64  *pMax = (Decimal64 *)pAggs->decimal128Max, *pMin = (Decimal64 *)pAggs->decimal128Min;
717✔
6257
  uint8_t    *pOverflow = &pAggs->overflow;
717✔
6258
  *pSum = DECIMAL128_ZERO;
717✔
6259
  *pMax = DECIMAL64_MIN;
717✔
6260
  *pMin = DECIMAL64_MAX;
717✔
6261
  pAggs->numOfNull = 0;
717✔
6262
  pAggs->colId |= DECIMAL_AGG_FLAG;
717✔
6263

6264
  Decimal64         *pVal = NULL;
717✔
6265
  const SDecimalOps *pSumOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
717✔
6266
  const SDecimalOps *pCompOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
717✔
6267
  if (HAS_VALUE == pColData->flag) {
717✔
6268
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
2,288,767✔
6269
      pVal = ((Decimal64 *)pColData->pData) + iVal;
2,288,031✔
6270
      CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
2,288,031!
6271
    }
6272
  } else {
6273
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
12,012✔
6274
      switch (tColDataGetBitValue(pColData, iVal)) {
12,000!
6275
        case 0:
3,851✔
6276
        case 1:
6277
          pAggs->numOfNull++;
3,851✔
6278
          break;
3,851✔
6279
        case 2:
8,149✔
6280
          pVal = ((Decimal64 *)pColData->pData) + iVal;
8,149✔
6281
          CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
8,149!
6282
          break;
8,149✔
UNCOV
6283
        default:
×
UNCOV
6284
          break;
×
6285
      }
6286
    }
6287
  }
6288
}
748✔
6289

6290
static FORCE_INLINE void tColDataCalcSMADecimal128Type(SColData *pColData, SColumnDataAgg *pAggs) {
741✔
6291
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum, *pMax = (Decimal128 *)pAggs->decimal128Max,
741✔
6292
             *pMin = (Decimal128 *)pAggs->decimal128Min;
741✔
6293
  uint8_t *pOverflow = &pAggs->overflow;
741✔
6294
  *pSum = DECIMAL128_ZERO;
741✔
6295
  *pMax = DECIMAL128_MIN;
741✔
6296
  *pMin = DECIMAL128_MAX;
741✔
6297
  pAggs->numOfNull = 0;
741✔
6298
  pAggs->colId |= DECIMAL_AGG_FLAG;
741✔
6299

6300
  Decimal128        *pVal = NULL;
741✔
6301
  const SDecimalOps *pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
741✔
6302
  if (HAS_VALUE == pColData->flag) {
741✔
6303
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
2,291,073✔
6304
      pVal = ((Decimal128 *)pColData->pData) + iVal;
2,290,346✔
6305
      CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
2,290,346!
6306
    }
6307
  } else {
6308
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
36,036✔
6309
      switch (tColDataGetBitValue(pColData, iVal)) {
36,000!
6310
        case 0:
11,419✔
6311
        case 1:
6312
          pAggs->numOfNull++;
11,419✔
6313
          break;
11,419✔
6314
        case 2:
24,581✔
6315
          pVal = ((Decimal128 *)pColData->pData) + iVal;
24,581✔
6316
          CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
24,581✔
6317
          break;
24,581✔
UNCOV
6318
        default:
×
UNCOV
6319
          break;
×
6320
      }
6321
    }
6322
  }
6323
}
763✔
6324

6325
void (*tColDataCalcSMA[])(SColData *pColData, SColumnDataAgg *pAggs) = {
6326
    NULL,
6327
    tColDataCalcSMABool,            // TSDB_DATA_TYPE_BOOL
6328
    tColDataCalcSMATinyInt,         // TSDB_DATA_TYPE_TINYINT
6329
    tColDataCalcSMATinySmallInt,    // TSDB_DATA_TYPE_SMALLINT
6330
    tColDataCalcSMAInt,             // TSDB_DATA_TYPE_INT
6331
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_BIGINT
6332
    tColDataCalcSMAFloat,           // TSDB_DATA_TYPE_FLOAT
6333
    tColDataCalcSMADouble,          // TSDB_DATA_TYPE_DOUBLE
6334
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARCHAR
6335
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_TIMESTAMP
6336
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_NCHAR
6337
    tColDataCalcSMAUTinyInt,        // TSDB_DATA_TYPE_UTINYINT
6338
    tColDataCalcSMATinyUSmallInt,   // TSDB_DATA_TYPE_USMALLINT
6339
    tColDataCalcSMAUInt,            // TSDB_DATA_TYPE_UINT
6340
    tColDataCalcSMAUBigInt,         // TSDB_DATA_TYPE_UBIGINT
6341
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_JSON
6342
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARBINARY
6343
    tColDataCalcSMADecimal128Type,  // TSDB_DATA_TYPE_DECIMAL
6344
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_BLOB
6345
    NULL,                           // TSDB_DATA_TYPE_MEDIUMBLOB
6346
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_GEOMETRY
6347
    tColDataCalcSMADecimal64Type,   // TSDB_DATA_TYPE_DECIMAL64
6348
};
6349

6350
// SValueColumn ================================
6351
int32_t tValueColumnInit(SValueColumn *valCol) {
32,212,389✔
6352
  valCol->type = TSDB_DATA_TYPE_NULL;
32,212,389✔
6353
  valCol->numOfValues = 0;
32,212,389✔
6354
  tBufferInit(&valCol->data);
32,212,389✔
6355
  tBufferInit(&valCol->offsets);
32,212,389✔
6356
  return 0;
32,212,389✔
6357
}
6358

6359
void tValueColumnDestroy(SValueColumn *valCol) {
71,843,137✔
6360
  valCol->type = TSDB_DATA_TYPE_NULL;
71,843,137✔
6361
  valCol->numOfValues = 0;
71,843,137✔
6362
  tBufferDestroy(&valCol->data);
71,843,137✔
6363
  tBufferDestroy(&valCol->offsets);
71,843,359✔
6364
  return;
71,843,381✔
6365
}
6366

6367
void tValueColumnClear(SValueColumn *valCol) {
34,335,488✔
6368
  valCol->type = TSDB_DATA_TYPE_NULL;
34,335,488✔
6369
  valCol->numOfValues = 0;
34,335,488✔
6370
  tBufferClear(&valCol->data);
34,335,488✔
6371
  tBufferClear(&valCol->offsets);
34,335,488✔
6372
  return;
34,335,488✔
6373
}
6374

6375
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
1,784,862✔
6376
  int32_t code;
6377

6378
  if (valCol->numOfValues == 0) {
1,784,862✔
6379
    valCol->type = value->type;
16,056✔
6380
  }
6381

6382
  if (!(value->type == valCol->type)) {
1,784,862!
UNCOV
6383
    return TSDB_CODE_INVALID_PARA;
×
6384
  }
6385

6386
  if (IS_VAR_DATA_TYPE(value->type)) {
1,784,862!
6387
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
14,002!
UNCOV
6388
      return code;
×
6389
    }
6390
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
14,002!
UNCOV
6391
      return code;
×
6392
    }
6393
  } else {
6394
    code = tBufferPut(&valCol->data, VALUE_GET_DATUM(value, value->type), tDataTypes[value->type].bytes);
1,777,861!
6395
    if (code) return code;
1,777,861!
6396
  }
6397
  valCol->numOfValues++;
1,784,862✔
6398

6399
  return 0;
1,784,862✔
6400
}
6401

6402
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
463,277,877✔
6403
  int32_t code;
6404

6405
  if (idx < 0 || idx >= valCol->numOfValues) {
463,277,877!
UNCOV
6406
    return TSDB_CODE_OUT_OF_RANGE;
×
6407
  }
6408

6409
  if (IS_VAR_DATA_TYPE(valCol->type)) {
463,319,207!
UNCOV
6410
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
×
UNCOV
6411
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
×
UNCOV
6412
    int32_t  oldDataSize = nextOffset - offsets[idx];
×
UNCOV
6413
    int32_t  bytesAdded = value->nData - oldDataSize;
×
6414

UNCOV
6415
    if (bytesAdded != 0) {
×
6416
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
72!
6417
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
36✔
6418
              tBufferGetSize(&valCol->data) - nextOffset);
36✔
6419
      valCol->data.size += bytesAdded;
36✔
6420

6421
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
36!
UNCOV
6422
        offsets[i] += bytesAdded;
×
6423
      }
6424
    }
UNCOV
6425
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
×
6426
  } else {
6427
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, VALUE_GET_DATUM(value, valCol->type),
463,352,226!
6428
                        tDataTypes[valCol->type].bytes);
463,352,226✔
6429
  }
6430
  return 0;
6431
}
6432

6433
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
933,567,936✔
6434
  if (idx < 0 || idx >= valCol->numOfValues) {
933,567,936!
UNCOV
6435
    return TSDB_CODE_OUT_OF_RANGE;
×
6436
  }
6437

6438
  value->type = valCol->type;
933,702,703✔
6439
  if (IS_VAR_DATA_TYPE(value->type)) {
933,702,703!
6440
    int32_t       offset, nextOffset;
6441
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
254,325✔
6442

6443
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
254,325!
6444
    if (idx == valCol->numOfValues - 1) {
491,866✔
6445
      nextOffset = tBufferGetSize(&valCol->data);
227,400✔
6446
    } else {
6447
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
264,466✔
6448
    }
6449
    value->nData = nextOffset - offset;
491,467✔
6450
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
491,467✔
6451
  } else {
6452
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
933,448,378✔
6453
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, VALUE_GET_DATUM(value, value->type)));
1,866,896,756!
6454
  }
6455
  return 0;
933,939,845✔
6456
}
6457

6458
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
16,055✔
6459
  int32_t code;
6460

6461
  if (!(valCol->numOfValues > 0)) {
16,055!
UNCOV
6462
    return TSDB_CODE_INVALID_PARA;
×
6463
  }
6464

6465
  (*info) = (SValueColumnCompressInfo){
16,055✔
6466
      .cmprAlg = info->cmprAlg,
16,055✔
6467
      .type = valCol->type,
16,055✔
6468
  };
6469

6470
  // offset
6471
  if (IS_VAR_DATA_TYPE(valCol->type)) {
16,055!
6472
    SCompressInfo cinfo = {
2,853✔
6473
        .cmprAlg = info->cmprAlg,
2,853✔
6474
        .dataType = TSDB_DATA_TYPE_INT,
6475
        .originalSize = valCol->offsets.size,
2,853✔
6476
    };
6477

6478
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
2,853✔
6479
    if (code) return code;
2,852!
6480

6481
    info->offsetOriginalSize = cinfo.originalSize;
2,852✔
6482
    info->offsetCompressedSize = cinfo.compressedSize;
2,852✔
6483
  }
6484

6485
  // data
6486
  SCompressInfo cinfo = {
16,054✔
6487
      .cmprAlg = info->cmprAlg,
16,054✔
6488
      .dataType = valCol->type,
16,054✔
6489
      .originalSize = valCol->data.size,
16,054✔
6490
  };
6491

6492
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
16,054✔
6493
  if (code) return code;
16,054!
6494

6495
  info->dataOriginalSize = cinfo.originalSize;
16,054✔
6496
  info->dataCompressedSize = cinfo.compressedSize;
16,054✔
6497

6498
  return 0;
16,054✔
6499
}
6500

6501
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
741,786✔
6502
                               SBuffer *assist) {
6503
  int32_t code;
6504

6505
  tValueColumnClear(valCol);
741,786✔
6506
  valCol->type = info->type;
741,807✔
6507
  // offset
6508
  if (IS_VAR_DATA_TYPE(valCol->type)) {
1,054,695!
6509
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
312,643✔
6510

6511
    SCompressInfo cinfo = {
312,643✔
6512
        .dataType = TSDB_DATA_TYPE_INT,
6513
        .cmprAlg = info->cmprAlg,
312,643✔
6514
        .originalSize = info->offsetOriginalSize,
312,643✔
6515
        .compressedSize = info->offsetCompressedSize,
312,643✔
6516
    };
6517

6518
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
312,643✔
6519
    if (code) {
312,888!
UNCOV
6520
      return code;
×
6521
    }
6522
  } else {
6523
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
429,164✔
6524
  }
6525

6526
  // data
6527
  SCompressInfo cinfo = {
742,052✔
6528
      .dataType = valCol->type,
742,052✔
6529
      .cmprAlg = info->cmprAlg,
742,052✔
6530
      .originalSize = info->dataOriginalSize,
742,052✔
6531
      .compressedSize = info->dataCompressedSize,
742,052✔
6532
  };
6533

6534
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
742,052✔
6535
  if (code) {
742,103!
UNCOV
6536
    return code;
×
6537
  }
6538

6539
  return 0;
742,103✔
6540
}
6541

6542
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
16,054✔
6543
  int32_t code;
6544
  uint8_t fmtVer = 0;
16,054✔
6545

6546
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
32,108!
6547
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
32,108!
6548
  if ((code = tBufferPutI8(buffer, info->type))) return code;
32,108!
6549
  if (IS_VAR_DATA_TYPE(info->type)) {
16,054!
6550
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
5,706!
6551
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
5,706!
6552
  }
6553
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
32,108!
6554
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
32,108!
6555

6556
  return 0;
16,054✔
6557
}
6558

6559
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
741,891✔
6560
  int32_t code;
6561
  uint8_t fmtVer;
6562

6563
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
741,891!
6564
  if (fmtVer == 0) {
741,867!
6565
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
741,905!
6566
    if ((code = tBufferGetI8(reader, &info->type))) return code;
741,735!
6567
    if (IS_VAR_DATA_TYPE(info->type)) {
741,669!
6568
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
312,562!
6569
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
312,752!
6570
    } else {
6571
      info->offsetOriginalSize = 0;
429,107✔
6572
      info->offsetCompressedSize = 0;
429,107✔
6573
    }
6574
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
741,846!
6575
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
741,755!
6576
  } else {
UNCOV
6577
    return TSDB_CODE_INVALID_PARA;
×
6578
  }
6579

6580
  return 0;
741,697✔
6581
}
6582

6583
int32_t tCompressData(void          *input,       // input
3,394,857✔
6584
                      SCompressInfo *info,        // compress info
6585
                      void          *output,      // output
6586
                      int32_t        outputSize,  // output size
6587
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
6588
) {
6589
  int32_t extraSizeNeeded;
6590
  int32_t code;
6591

6592
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
3,394,857✔
6593
  if (!(outputSize >= extraSizeNeeded)) {
3,394,857!
UNCOV
6594
    return TSDB_CODE_INVALID_PARA;
×
6595
  }
6596

6597
  if (info->cmprAlg == NO_COMPRESSION) {
3,394,857✔
6598
    (void)memcpy(output, input, info->originalSize);
250✔
6599
    info->compressedSize = info->originalSize;
250✔
6600
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
3,743,932✔
6601
    SBuffer local;
6602

6603
    tBufferInit(&local);
6604
    if (buffer == NULL) {
348,861!
UNCOV
6605
      buffer = &local;
×
6606
    }
6607

6608
    if (info->cmprAlg == TWO_STAGE_COMP) {
348,861!
6609
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
349,096✔
6610
      if (code) {
349,096!
6611
        tBufferDestroy(&local);
UNCOV
6612
        return code;
×
6613
      }
6614
    }
6615

6616
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
698,186✔
6617
        input,                                                   // input
6618
        info->originalSize,                                      // input size
6619
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
348,861✔
6620
        output,                                                  // output
6621
        outputSize,                                              // output size
6622
        info->cmprAlg,                                           // compression algorithm
348,861✔
6623
        buffer->data,                                            // buffer
6624
        buffer->capacity                                         // buffer size
348,861✔
6625
    );
6626
    if (info->compressedSize < 0) {
349,325!
6627
      tBufferDestroy(&local);
UNCOV
6628
      return TSDB_CODE_COMPRESS_ERROR;
×
6629
    }
6630

6631
    tBufferDestroy(&local);
6632
  } else {
6633
    DEFINE_VAR(info->cmprAlg)
3,045,746✔
6634
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
3,045,746!
6635
      (void)memcpy(output, input, info->originalSize);
12✔
6636
      info->compressedSize = info->originalSize;
12✔
6637
      return 0;
12✔
6638
    }
6639
    SBuffer local;
6640

6641
    tBufferInit(&local);
6642
    if (buffer == NULL) {
3,045,734!
UNCOV
6643
      buffer = &local;
×
6644
    }
6645
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
3,045,734✔
6646

6647
    info->compressedSize = tDataCompress[info->dataType].compFunc(  //
6,092,012✔
6648
        input,                                                      // input
6649
        info->originalSize,                                         // input size
6650
        info->originalSize / tDataTypes[info->dataType].bytes,      // number of elements
3,045,745✔
6651
        output,                                                     // output
6652
        outputSize,                                                 // output size
6653
        info->cmprAlg,                                              // compression algorithm
6654
        buffer->data,                                               // buffer
6655
        buffer->capacity                                            // buffer size
3,045,745✔
6656
    );
6657
    if (info->compressedSize < 0) {
3,046,267!
6658
      tBufferDestroy(&local);
UNCOV
6659
      return TSDB_CODE_COMPRESS_ERROR;
×
6660
    }
6661

6662
    tBufferDestroy(&local);
6663
    // new col compress
6664
  }
6665

6666
  return 0;
3,395,842✔
6667
}
6668

6669
int32_t tDecompressData(void                *input,       // input
94,766,684✔
6670
                        const SCompressInfo *info,        // compress info
6671
                        void                *output,      // output
6672
                        int32_t              outputSize,  // output size
6673
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
6674
) {
6675
  int32_t code;
6676

6677
  if (!(outputSize >= info->originalSize)) {
94,766,684!
UNCOV
6678
    return TSDB_CODE_INVALID_PARA;
×
6679
  }
6680

6681
  if (info->cmprAlg == NO_COMPRESSION) {
94,766,684✔
6682
    if (!(info->compressedSize == info->originalSize)) {
250!
UNCOV
6683
      return TSDB_CODE_INVALID_PARA;
×
6684
    }
6685
    (void)memcpy(output, input, info->compressedSize);
250✔
6686
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
138,867,609✔
6687
    SBuffer local;
6688

6689
    tBufferInit(&local);
6690
    if (buffer == NULL) {
44,027,591!
UNCOV
6691
      buffer = &local;
×
6692
    }
6693

6694
    if (info->cmprAlg == TWO_STAGE_COMP) {
44,027,591!
6695
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
44,092,261✔
6696
      if (code) {
44,092,509!
6697
        tBufferDestroy(&local);
UNCOV
6698
        return code;
×
6699
      }
6700
    }
6701

6702
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
44,027,839✔
6703
        input,                                                  // input
6704
        info->compressedSize,                                   // inputSize
44,027,839✔
6705
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
44,027,839✔
6706
        output,                                                 // output
6707
        outputSize,                                             // output size
6708
        info->cmprAlg,                                          // compression algorithm
44,027,839✔
6709
        buffer->data,                                           // helper buffer
6710
        buffer->capacity                                        // extra buffer size
44,027,839✔
6711
    );
6712
    if (decompressedSize < 0) {
44,101,175!
6713
      tBufferDestroy(&local);
UNCOV
6714
      return TSDB_CODE_COMPRESS_ERROR;
×
6715
    }
6716

6717
    if (!(decompressedSize == info->originalSize)) {
44,101,175!
UNCOV
6718
      return TSDB_CODE_COMPRESS_ERROR;
×
6719
    }
6720
    tBufferDestroy(&local);
6721
  } else {
6722
    DEFINE_VAR(info->cmprAlg);
50,738,843✔
6723
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
50,738,843✔
6724
      (void)memcpy(output, input, info->compressedSize);
18✔
6725
      return 0;
18✔
6726
    }
6727
    SBuffer local;
6728

6729
    tBufferInit(&local);
6730
    if (buffer == NULL) {
50,738,825!
UNCOV
6731
      buffer = &local;
×
6732
    }
6733
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
50,738,825✔
6734
    if (code) {
50,739,249!
UNCOV
6735
      return code;
×
6736
    }
6737

6738
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
50,739,249✔
6739
        input,                                                  // input
6740
        info->compressedSize,                                   // inputSize
50,739,249✔
6741
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
50,739,249✔
6742
        output,                                                 // output
6743
        outputSize,                                             // output size
6744
        info->cmprAlg,                                          // compression algorithm
50,739,249✔
6745
        buffer->data,                                           // helper buffer
6746
        buffer->capacity                                        // extra buffer size
50,739,249✔
6747
    );
6748
    if (decompressedSize < 0) {
50,750,408!
6749
      tBufferDestroy(&local);
UNCOV
6750
      return TSDB_CODE_COMPRESS_ERROR;
×
6751
    }
6752

6753
    if (!(decompressedSize == info->originalSize)) {
50,750,408!
UNCOV
6754
      return TSDB_CODE_COMPRESS_ERROR;
×
6755
    }
6756
    tBufferDestroy(&local);
6757
  }
6758

6759
  return 0;
94,851,833✔
6760
}
6761

6762
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
3,394,808✔
6763
  int32_t code;
6764

6765
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
3,394,808✔
6766
  if (code) return code;
3,394,817!
6767

6768
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
3,394,817✔
6769
  if (code) return code;
3,395,425!
6770

6771
  output->size += info->compressedSize;
3,395,425✔
6772
  return 0;
3,395,425✔
6773
}
6774

6775
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
44,090,166✔
6776
  int32_t code;
6777

6778
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
44,090,166✔
6779
  if (code) return code;
44,076,801!
6780

6781
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
44,076,801✔
6782
  if (code) return code;
44,098,577!
6783

6784
  output->size += info->originalSize;
44,098,577✔
6785
  return 0;
44,098,577✔
6786
}
6787

6788
// handle all types, including var data
6789
void valueSetDatum(SValue *pVal, int8_t type, void *pDatum, uint32_t len) {
2,147,483,647✔
6790
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647!
UNCOV
6791
    pVal->pData = pDatum;
×
UNCOV
6792
    pVal->nData = len;
×
6793
  } else {
6794
    switch (len) {
2,147,483,647!
6795
      case sizeof(uint8_t):
2,147,483,647✔
6796
        pVal->val = *(uint8_t *)pDatum;
2,147,483,647✔
6797
        break;
2,147,483,647✔
6798
      case sizeof(uint16_t):
1,344,544,833✔
6799
        pVal->val = *(uint16_t *)pDatum;
1,344,544,833✔
6800
        break;
1,344,544,833✔
6801
      case sizeof(uint32_t):
2,147,483,647✔
6802
        pVal->val = *(uint32_t *)pDatum;
2,147,483,647✔
6803
        break;
2,147,483,647✔
6804
      case sizeof(uint64_t):
2,147,483,647✔
6805
        pVal->val = *(uint64_t *)pDatum;
2,147,483,647✔
6806
        break;
2,147,483,647✔
UNCOV
6807
      default:
×
UNCOV
6808
        break;
×
6809
    }
6810
  }
6811
}
2,147,483,647✔
6812

6813
void valueCloneDatum(SValue *pDst, const SValue *pSrc, int8_t type) {
151,200,522✔
6814
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
151,200,522!
6815
    memcpy(pDst->pData, pSrc->pData, pSrc->nData);
574,691✔
6816
    pDst->nData = pSrc->nData;
574,691✔
6817
  } else {
6818
    pDst->val = pSrc->val;
150,625,831✔
6819
  }
6820
}
151,200,522✔
UNCOV
6821
void valueClearDatum(SValue *pVal, int8_t type) {
×
UNCOV
6822
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
×
UNCOV
6823
    taosMemoryFreeClear(pVal->pData);
×
UNCOV
6824
    pVal->nData = 0;
×
6825
  } else {
UNCOV
6826
    pVal->val = 0;
×
6827
  }
UNCOV
6828
}
×
6829

6830
int8_t schemaHasBlob(const STSchema *pSchema) {
16,176,365✔
6831
  if (pSchema == NULL) {
16,176,365!
UNCOV
6832
    return 0;
×
6833
  }
6834
  for (int i = 0; i < pSchema->numOfCols; ++i) {
103,038,618✔
6835
    if (IS_STR_DATA_BLOB(pSchema->columns[i].type)) {
86,862,253!
UNCOV
6836
      return 1;
×
6837
    }
6838
  }
6839
  return 0;
16,176,365✔
6840
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc