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

taosdata / TDengine / #5059

17 May 2026 01:15AM UTC coverage: 73.443% (+0.06%) from 73.387%
#5059

push

travis-ci

web-flow
feat (TDgpt): Dynamic Model Synchronization Enhancements (#35344)

* refactor: do some internal refactor.

* fix: fix multiprocess sync issue.

* feat: add dynamic anomaly detection and forecasting services

* fix: log error message for undeploying model in exception handling

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: handle undeploy when model exists only on disk

Agent-Logs-Url: https://github.com/taosdata/TDengine/sessions/286aafa0-c3ce-4c27-b803-2707571e9dc1

Co-authored-by: hjxilinx <8252296+hjxilinx@users.noreply.github.com>

* fix: guard dynamic registry concurrent access

Agent-Logs-Url: https://github.com/taosdata/TDengine/sessions/5e4db858-6458-40f4-ac28-d1b1b7f97c18

Co-authored-by: hjxilinx <8252296+hjxilinx@users.noreply.github.com>

* fix: tighten service list locking scope

Agent-Logs-Url: https://github.com/taosdata/TDengine/sessions/5e4db858-6458-40f4-ac28-d1b1b7f97c18

Co-authored-by: hjxilinx <8252296+hjxilinx@users.noreply.github.com>

* fix: restore prophet support and update tests per review feedback

Agent-Logs-Url: https://github.com/taosdata/TDengine/sessions/92298ae1-7da6-4d07-b20e-101c7cd0b26b

Co-authored-by: hjxilinx <8252296+hjxilinx@users.noreply.github.com>

* fix: improve test name and move copy inside lock scope

Agent-Logs-Url: https://github.com/taosdata/TDengine/sessions/92298ae1-7da6-4d07-b20e-101c7cd0b26b

Co-authored-by: hjxilinx <8252296+hjxilinx@users.noreply.github.com>

* Potential fix for pull request finding

Co-au... (continued)

281870 of 383795 relevant lines covered (73.44%)

135516561.93 hits per line

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

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

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

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

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

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

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

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

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

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

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

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

78
static int32_t tPutPrimaryKeyIndex(uint8_t *p, const SPrimaryKeyIndex *index) {
269,882,124✔
79
  int32_t n = 0;
269,882,124✔
80
  n += tPutI8(p ? p + n : p, index->type);
269,882,124✔
81
  n += tPutU32v(p ? p + n : p, index->offset);
269,888,334✔
82
  return n;
269,889,114✔
83
}
84

85
static int32_t tGetPrimaryKeyIndex(uint8_t *p, SPrimaryKeyIndex *index) {
1,022,953,732✔
86
  int32_t n = 0;
1,022,953,732✔
87
  n += tGetI8(p + n, &index->type);
1,022,953,732✔
88
  n += tGetU32v(p + n, &index->offset);
1,023,073,621✔
89
  return n;
1,022,923,809✔
90
}
91

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

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

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

109
  if (isPK) {
2,147,483,647✔
110
    sinfo->tupleIndices[sinfo->numOfPKs].type = colVal->value.type;
89,962,958✔
111
    sinfo->tupleIndices[sinfo->numOfPKs].offset =
89,963,768✔
112
        IS_VAR_DATA_TYPE(pTColumn->type) ? sinfo->tupleVarSize + sinfo->tupleFixedSize : pTColumn->offset;
89,963,348✔
113
    sinfo->kvIndices[sinfo->numOfPKs].type = colVal->value.type;
89,964,128✔
114
    sinfo->kvIndices[sinfo->numOfPKs].offset = sinfo->kvPayloadSize;
89,962,268✔
115
    sinfo->numOfPKs++;
89,962,808✔
116
  }
117

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

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

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

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

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

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

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

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

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

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

202
  // Tuple
203
  sinfo->tupleFlag = sinfo->flag;
2,147,483,647✔
204
  switch (sinfo->flag) {
2,147,483,647✔
205
    case HAS_NONE:
2,147,483,647✔
206
    case HAS_NULL:
207
      sinfo->tupleBitmapSize = 0;
2,147,483,647✔
208
      sinfo->tupleFixedSize = 0;
2,147,483,647✔
209
      break;
2,147,483,647✔
210
    case HAS_VALUE:
2,147,483,647✔
211
      sinfo->tupleBitmapSize = 0;
2,147,483,647✔
212
      sinfo->tupleFixedSize = schema->flen;
2,147,483,647✔
213
      break;
2,147,483,647✔
214
    case (HAS_NONE | HAS_NULL):
2,993,435✔
215
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
2,993,435✔
216
      sinfo->tupleFixedSize = 0;
2,992,766✔
217
      break;
2,994,773✔
218
    case (HAS_NONE | HAS_VALUE):
2,147,483,647✔
219
    case (HAS_NULL | HAS_VALUE):
220
      sinfo->tupleBitmapSize = BIT1_SIZE(schema->numOfCols - 1);
2,147,483,647✔
221
      sinfo->tupleFixedSize = schema->flen;
2,147,483,647✔
222
      break;
2,147,483,647✔
223
    case (HAS_NONE | HAS_NULL | HAS_VALUE):
1,240,676,435✔
224
      sinfo->tupleBitmapSize = BIT2_SIZE(schema->numOfCols - 1);
1,240,676,435✔
225
      sinfo->tupleFixedSize = schema->flen;
1,240,673,090✔
226
      break;
989,439,285✔
227
  }
228
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
229
    sinfo->tupleIndices[i].offset += sinfo->tupleBitmapSize;
89,959,598✔
230
    sinfo->tuplePKSize += tPutPrimaryKeyIndex(NULL, sinfo->tupleIndices + i);
89,963,858✔
231
  }
232
  sinfo->tupleRowSize = sizeof(SRow)              // SRow
2,147,483,647✔
233
                        + sinfo->tuplePKSize      // primary keys
2,147,483,647✔
234
                        + sinfo->tupleBitmapSize  // bitmap
2,147,483,647✔
235
                        + sinfo->tupleFixedSize   // fixed part
2,147,483,647✔
236
                        + sinfo->tupleVarSize;    // var part
2,147,483,647✔
237

238
  // Key-Value
239
  if (sinfo->kvMaxOffset <= UINT8_MAX) {
2,147,483,647✔
240
    sinfo->kvFlag = (KV_FLG_LIT | sinfo->flag);
2,147,483,647✔
241
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint8_t);
2,147,483,647✔
242
  } else if (sinfo->kvMaxOffset <= UINT16_MAX) {
52,685,294✔
243
    sinfo->kvFlag = (KV_FLG_MID | sinfo->flag);
52,753,335✔
244
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint16_t);
52,754,683✔
245
  } else {
246
    sinfo->kvFlag = (KV_FLG_BIG | sinfo->flag);
×
247
    sinfo->kvIndexSize = sizeof(SKVIdx) + (sinfo->numOfNull + sinfo->numOfValue) * sizeof(uint32_t);
×
248
  }
249
  for (int32_t i = 0; i < sinfo->numOfPKs; i++) {
2,147,483,647✔
250
    sinfo->kvIndices[i].offset += sinfo->kvIndexSize;
89,960,168✔
251
    sinfo->kvPKSize += tPutPrimaryKeyIndex(NULL, sinfo->kvIndices + i);
89,962,868✔
252
  }
253
  sinfo->kvRowSize = sizeof(SRow)             // SRow
2,147,483,647✔
254
                     + sinfo->kvPKSize        // primary keys
2,147,483,647✔
255
                     + sinfo->kvIndexSize     // index array
2,147,483,647✔
256
                     + sinfo->kvPayloadSize;  // payload
2,147,483,647✔
257

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

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

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

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

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

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

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

303
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
2,147,483,647✔
304
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
2,147,483,647✔
305
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
2,147,483,647✔
306
            if (colValArray[colValIndex].value.nData) {
2,147,483,647✔
307
              (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
2,147,483,647✔
308
              varlen += colValArray[colValIndex].value.nData;
2,147,483,647✔
309
            }
310
          } else {
311
            (void)memcpy(fixed + schema->columns[i].offset,
2,147,483,647✔
312
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647✔
313
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
314
          }
315
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
879,718,904✔
316
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
820,440,922✔
317
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
59,878,407✔
318
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NONE);
59,885,100✔
319
        }
320

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

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

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

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

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

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

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

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

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

395
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
82,164✔
396
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
22,840✔
397
              hasBlob = 1;
4,568✔
398
            }
399
            *(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
22,840✔
400
            varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
45,680✔
401
            if (colValArray[colValIndex].value.nData) {
22,840✔
402
              if (hasBlob == 0) {
22,840✔
403
                (void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
18,272✔
404
                varlen += colValArray[colValIndex].value.nData;
18,272✔
405
              } else {
406
                uint64_t  seq = 0;
4,568✔
407
                SBlobItem item = {.seqOffsetInRow = varlen - (*ppRow)->data,
4,568✔
408
                                  .data = colValArray[colValIndex].value.pData,
4,568✔
409
                                  .len = colValArray[colValIndex].value.nData,
4,568✔
410
                                  .type = TSDB_DATA_BLOB_VALUE};
411
                code = tBlobSetPush(pBlobSet, &item, &seq, firstBlobCol);
4,568✔
412
                if (firstBlobCol == 1) {
4,568✔
413
                  firstBlobCol = 0;
4,568✔
414
                }
415
                if (code != 0) return code;
4,568✔
416
                varlen += tPutU64(varlen, seq);
9,136✔
417
              }
418
            } else {
419
              if (hasBlob) TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
×
420
            }
421
          } else {
422
            (void)memcpy(fixed + schema->columns[i].offset,
59,324✔
423
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
59,324✔
424
                         tDataTypes[schema->columns[i].type].bytes);
59,324✔
425
          }
426
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
11,004✔
427
          ROW_SET_BITMAP(bitmap, sinfo->tupleFlag, i - 1, BIT_FLG_NULL);
524✔
428
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
524✔
429
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(pBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
524✔
430
          }
431
        } else if (COL_VAL_IS_NONE(&colValArray[colValIndex])) {  // NONE
10,480✔
432
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
10,480✔
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);
10,480✔
436
        }
437

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

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

453
  return 0;
5,092✔
454
}
455

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

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

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

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

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

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

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

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

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

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

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

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

576
static int32_t tRowBuildKVRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, const STSchema *schema, SRow **ppRow) {
2,147,483,647✔
577
  SColVal *colValArray = (SColVal *)TARRAY_DATA(aColVal);
2,147,483,647✔
578

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

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

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

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

603
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
2,147,483,647✔
604
  int32_t colValIndex = 1;
2,147,483,647✔
605
  for (int32_t i = 1; i < schema->numOfCols; i++) {
2,147,483,647✔
606
    for (;;) {
607
      if (colValIndex >= numOfColVals) {  // NONE
2,147,483,647✔
608
        break;
39,680✔
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);
2,147,483,647✔
616
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
2,147,483,647✔
617
            if (colValArray[colValIndex].value.nData > 0) {
2,147,483,647✔
618
              (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
2,147,483,647✔
619
                           colValArray[colValIndex].value.nData);
2,147,483,647✔
620
              payloadSize += colValArray[colValIndex].value.nData;
2,147,483,647✔
621
            }
622
          } else {
623
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,147,483,647✔
624
            (void)memcpy(payload + payloadSize,
2,147,483,647✔
625
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,147,483,647✔
626
                         tDataTypes[schema->columns[i].type].bytes);
2,147,483,647✔
627
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,147,483,647✔
628
          }
629
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
2,147,483,647✔
630
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
2,147,483,647✔
631
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
2,147,483,647✔
632
        }
633

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

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

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

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

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

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

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

678
  int32_t numOfColVals = TARRAY_SIZE(aColVal);
28,182,930✔
679
  int32_t colValIndex = 1;
28,182,930✔
680
  int8_t  firstBlobCol = 1;
28,182,930✔
681
  for (int32_t i = 1; i < schema->numOfCols; i++) {
63,744,000✔
682
    for (;;) {
×
683
      if (colValIndex >= numOfColVals) {  // NONE
35,561,070✔
684
        break;
×
685
      }
686
      uint8_t hasBlob = 0;
35,561,070✔
687

688
      if (colValArray[colValIndex].cid == schema->columns[i].colId) {
35,561,070✔
689
        if (COL_VAL_IS_VALUE(&colValArray[colValIndex])) {  // value
35,561,070✔
690
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
31,880,970✔
691
          if (IS_VAR_DATA_TYPE(schema->columns[i].type)) {
31,880,970✔
692
            if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
28,930,662✔
693
              hasBlob = 1;
28,181,310✔
694
            }
695
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
28,930,662✔
696
            payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
28,930,662✔
697
            if (colValArray[colValIndex].value.nData > 0) {
28,930,662✔
698
              if (hasBlob == 0) {
26,657,646✔
699
                (void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData,
749,352✔
700
                             colValArray[colValIndex].value.nData);
749,352✔
701
                payloadSize += colValArray[colValIndex].value.nData;
749,352✔
702
              } else {
703
                uint64_t  seq = 0;
25,908,294✔
704
                uint32_t  seqOffset = payloadSize + payload - (*ppRow)->data;
25,908,294✔
705
                SBlobItem item = {.seqOffsetInRow = seqOffset,
25,908,294✔
706
                                  .data = colValArray[colValIndex].value.pData,
25,908,294✔
707
                                  .len = colValArray[colValIndex].value.nData,
25,908,294✔
708
                                  .type = TSDB_DATA_BLOB_VALUE};
709
                int32_t   code = tBlobSetPush(ppBlobSet, &item, &seq, 0);
25,908,294✔
710
                if (code != 0) return code;
25,908,294✔
711
                payloadSize += tPutU64(payload + payloadSize, seq);
51,816,588✔
712
              }
713
            } else {
714
              if (hasBlob) {
2,273,016✔
715
                TAOS_CHECK_RETURN(addEmptyItemToBlobSet(ppBlobSet, TSDB_DATA_BLOB_EMPTY_VALUE, NULL));
2,273,016✔
716
              }
717
            }
718
          } else {
719
            payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
2,950,308✔
720
            (void)memcpy(payload + payloadSize,
2,950,712✔
721
                         VALUE_GET_DATUM(&colValArray[colValIndex].value, schema->columns[i].type),
2,950,308✔
722
                         tDataTypes[schema->columns[i].type].bytes);
2,950,308✔
723
            payloadSize += tDataTypes[schema->columns[i].type].bytes;
2,950,308✔
724
          }
725
        } else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) {  // NULL
3,680,100✔
726
          tRowBuildKVRowSetIndex(sinfo->kvFlag, indices, payloadSize);
1,620✔
727
          payloadSize += tPutI16v(payload + payloadSize, -schema->columns[i].colId);
1,620✔
728
          if (IS_STR_DATA_BLOB(schema->columns[i].type)) {
1,620✔
729
            TAOS_CHECK_RETURN(addEmptyItemToBlobSet(ppBlobSet, TSDB_DATA_BLOB_NULL_VALUE, NULL));
1,620✔
730
          }
731
        }
732
        colValIndex++;
35,561,070✔
733
        break;
35,561,070✔
734
      } else if (colValArray[colValIndex].cid > schema->columns[i].colId) {  // NONE
×
735
        break;
×
736
      } else {
737
        colValIndex++;
×
738
      }
739
    }
740
  }
741

742
  if (((*ppRow)->flag) == 0) {
28,182,930✔
743
    return TSDB_CODE_INVALID_PARA;
×
744
  }
745
  return 0;
28,182,930✔
746
}
747

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

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

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

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

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

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

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

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

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

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

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

847
  if (((*ppRow)->flag) == 0) {
×
848
    return TSDB_CODE_INVALID_PARA;
×
849
  }
850
  return 0;
×
851
}
852
int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SRowBuildScanInfo *sinfo) {
2,147,483,647✔
853
  int32_t code;
854
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
2,147,483,647✔
855
  if (code) return code;
2,147,483,647✔
856

857
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
2,147,483,647✔
858
    code = tRowBuildTupleRow(aColVal, sinfo, pTSchema, ppRow);
2,147,483,647✔
859
  } else {
860
    code = tRowBuildKVRow(aColVal, sinfo, pTSchema, ppRow);
2,147,483,647✔
861
  }
862
  return code;
2,147,483,647✔
863
}
864

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

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

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

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

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

894
  p->cap = cap;
×
895
  p->len = 0;
×
896
  p->seq = 1;
×
897

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

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

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

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

943
  offset = pBlobRow->len;
×
944
  pBlobRow->len += len;
×
945

946
  pBlobRow->seq++;
×
947
  *seq = pBlobRow->seq;
×
948

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

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

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

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

983
  int32_t code = 0;
×
984
  int32_t len = 0;
×
985
  int32_t dataOffset = 0;
×
986
  int8_t  nextRow = 0;
×
987

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

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

998
  len = value->len;
×
999
  dataOffset = value->dataOffset;
×
1000
  nextRow = value->nextRow;
×
1001

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

1006
  return code;
×
1007
}
1008

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

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

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

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

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

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

1050
  return code;
×
1051
}
1052

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

1075
int32_t tRowBuildWithBlob(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow, SBlobSet *pBlobSet,
28,769,425✔
1076
                          SRowBuildScanInfo *sinfo) {
1077
  int32_t code;
1078

1079
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
28,769,425✔
1080
  if (code) return code;
28,769,425✔
1081

1082
  if (sinfo->tupleRowSize <= sinfo->kvRowSize) {
28,769,425✔
1083
    code = tRowBuildTupleWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
586,495✔
1084
  } else {
1085
    code = tRowBuildKVRowWithBlob(aColVal, sinfo, pTSchema, ppRow, pBlobSet);
28,182,930✔
1086
  }
1087

1088
  return code;
28,769,425✔
1089
}
1090

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

1095
  code = tRowBuildScan(aColVal, pTSchema, sinfo);
×
1096
  if (code) return code;
×
1097

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

1104
  return code;
×
1105
}
1106

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

1115
  p->type = type;
52,708✔
1116
  p->pSeqTable = taosArrayInit(128, sizeof(SBlobValue));
52,708✔
1117
  if (p->pSeqTable == NULL) {
52,708✔
1118
    TAOS_CHECK_EXIT(terrno);
×
1119
  }
1120

1121
  p->data = taosMemCalloc(1024, cap * sizeof(uint8_t));
52,708✔
1122
  if (p->data == NULL) {
52,708✔
1123
    TAOS_CHECK_EXIT(terrno);
×
1124
  }
1125

1126
  p->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
52,708✔
1127
  if (p->pSeqToffset == NULL) {
52,708✔
1128
    TAOS_CHECK_EXIT(terrno);
×
1129
  }
1130

1131
  p->pSet = taosArrayInit(4, sizeof(int32_t));
52,708✔
1132
  if (p->pSet == NULL) {
52,708✔
1133
    TAOS_CHECK_EXIT(terrno);
×
1134
  }
1135

1136
  p->cap = cap;
52,708✔
1137
  p->len = 0;
52,708✔
1138
  p->seq = 1;
52,708✔
1139

1140
  *ppBlobSet = p;
52,708✔
1141
_exit:
52,708✔
1142
  if (code != 0) {
52,708✔
1143
    taosHashCleanup(p->pSeqToffset);
×
1144
    taosArrayDestroy(p->pSeqTable);
×
1145
    taosArrayDestroy(p->pSet);
×
1146

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

1166
  uint64_t tlen = pBlobSet->len + len;
28,778,571✔
1167
  if (tlen > pBlobSet->cap) {
28,778,571✔
1168
    int64_t cap = pBlobSet->cap;
23,998✔
1169
    // opt later
1170
    do {
1171
      cap = cap * 2;
23,998✔
1172
    } while (tlen > cap);
23,998✔
1173

1174
    uint8_t *data = taosMemRealloc(pBlobSet->data, cap);
23,998✔
1175
    if (data == NULL) {
23,998✔
1176
      return terrno;
×
1177
    }
1178
    pBlobSet->data = data;
23,998✔
1179
    pBlobSet->cap = cap;
23,998✔
1180
  }
1181
  if (len > 0) {
28,778,571✔
1182
    (void)memcpy(pBlobSet->data + pBlobSet->len, data, len);
25,913,051✔
1183
  }
1184

1185
  offset = pBlobSet->len;
28,778,571✔
1186
  pBlobSet->len += len;
28,778,571✔
1187

1188
  pBlobSet->seq++;
28,778,571✔
1189
  *seq = pBlobSet->seq;
28,778,571✔
1190

1191
  SBlobValue value = {.offset = offset, .len = len, .dataOffset = dataOffset, .nextRow = nextRow, .type = pItem->type};
28,778,571✔
1192
  if (taosArrayPush(pBlobSet->pSeqTable, &value) == NULL) {
57,557,142✔
1193
    TAOS_CHECK_EXIT(terrno);
×
1194
  }
1195

1196
  int32_t sz = taosArrayGetSize(pBlobSet->pSeqTable);
28,778,571✔
1197
  code = taosHashPut(pBlobSet->pSeqToffset, seq, sizeof(int64_t), &sz, sizeof(int32_t));
28,778,571✔
1198
  if (code != 0) {
28,778,571✔
1199
    TAOS_CHECK_EXIT(code);
×
1200
  }
1201

1202
_exit:
28,778,571✔
1203
  return code;
28,778,571✔
1204
}
1205

1206
void tBlobSetSwap(SBlobSet *p1, SBlobSet *p2) {
853✔
1207
  SBlobSet t = {0};
853✔
1208

1209
  memcpy(&t, p1, sizeof(SBlobSet));
853✔
1210

1211
  memcpy(p1, p2, sizeof(SBlobSet));
853✔
1212
  memcpy(p2, &t, sizeof(SBlobSet));
853✔
1213
}
853✔
1214

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

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

1235
  int32_t code = 0;
×
1236
  int32_t len = 0;
×
1237
  int32_t dataOffset = 0;
×
1238
  int8_t  nextRow = 0;
×
1239

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

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

1250
  len = value->len;
×
1251
  dataOffset = value->dataOffset;
×
1252
  nextRow = value->nextRow;
×
1253

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

1259
  return code;
×
1260
}
1261

1262
int32_t tBlobSetSize(SBlobSet *pBlobSet) {
1,681,722,339✔
1263
  if (pBlobSet == NULL) return 0;
1,681,722,339✔
1264
  return taosArrayGetSize(pBlobSet->pSeqTable);
118,494✔
1265
}
1266

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

1287
static int32_t tBindInfoCompare(const void *p1, const void *p2, const void *param) {
3,737✔
1288
  if (((SBindInfo *)p1)->columnId < ((SBindInfo *)p2)->columnId) {
3,737✔
1289
    return -1;
707✔
1290
  } else if (((SBindInfo *)p1)->columnId > ((SBindInfo *)p2)->columnId) {
3,030✔
1291
    return 1;
3,030✔
1292
  }
1293
  return 0;
×
1294
}
1295

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

1311
  if (!infoSorted) {
2,688,194✔
1312
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo), NULL, tBindInfoCompare);
×
1313
  }
1314

1315
  int32_t code = 0;
2,688,194✔
1316
  int32_t numOfRows = infos[0].bind->num;
2,688,194✔
1317
  SArray *colValArray;
1318
  SColVal colVal;
2,660,608✔
1319

1320
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
2,688,884✔
1321
    return terrno;
×
1322
  }
1323

1324
  SRowKey rowKey, lastRowKey;
2,661,178✔
1325
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
22,063,767✔
1326
    taosArrayClear(colValArray);
19,636,153✔
1327

1328
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
102,156,487✔
1329
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
82,664,426✔
1330
        colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
1,952✔
1331
      } else {
1332
        SValue value = {
82,692,750✔
1333
            .type = infos[iInfo].type,
82,704,860✔
1334
        };
1335
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
82,718,871✔
1336
          value.nData = infos[iInfo].bind->length[iRow];
5,909,376✔
1337
          if (value.nData > pTSchema->columns[iInfo].bytes - VARSTR_HEADER_SIZE) {
6,005,670✔
1338
            code = TSDB_CODE_INVALID_PARA;
×
1339
            goto _exit;
×
1340
          }
1341
          value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
6,006,826✔
1342
        } else {
1343
          valueSetDatum(&value, infos[iInfo].type,
76,816,580✔
1344
                        (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
76,812,791✔
1345
                        infos[iInfo].bind->buffer_length);
76,791,690✔
1346
        }
1347
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
83,864,742✔
1348
      }
1349
      if (taosArrayPush(colValArray, &colVal) == NULL) {
82,556,710✔
1350
        code = terrno;
×
1351
        goto _exit;
×
1352
      }
1353
    }
1354

1355
    SRow             *row;
5,488,254✔
1356
    SRowBuildScanInfo sinfo = {0};
19,452,911✔
1357
    if ((code = tRowBuild(colValArray, pTSchema, &row, &sinfo))) {
19,456,244✔
1358
      goto _exit;
×
1359
    }
1360

1361
    if ((taosArrayPush(rowArray, &row)) == NULL) {
19,382,714✔
1362
      code = terrno;
×
1363
      goto _exit;
×
1364
    }
1365

1366
    if (pOrdered && pDupTs) {
19,382,714✔
1367
      tRowGetKey(row, &rowKey);
38,876,842✔
1368
      if (iRow == 0) {
19,423,240✔
1369
        *pOrdered = true;
2,683,498✔
1370
        *pDupTs = false;
2,684,050✔
1371
      } else {
1372
        if (*pOrdered) {
16,739,742✔
1373
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
16,769,258✔
1374
          *pOrdered = (res >= 0);
16,769,258✔
1375
          if (!*pDupTs) {
16,769,056✔
1376
            *pDupTs = (res == 0);
16,739,437✔
1377
          }
1378
        }
1379
      }
1380
      lastRowKey = rowKey;
19,423,778✔
1381
    }
1382
  }
1383

1384
_exit:
2,663,878✔
1385
  taosArrayDestroy(colValArray);
2,663,729✔
1386
  return code;
2,686,199✔
1387
}
1388

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

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

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

1403
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
1404
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
17,485,672✔
1405
    return 0;
17,485,672✔
1406
  }
1407

1408
  if (pRow->flag == HAS_NULL) {
2,147,483,647✔
1409
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
600,813,991✔
1410
    return 0;
600,955,105✔
1411
  }
1412

1413
  SPrimaryKeyIndex index;
2,147,483,647✔
1414
  uint8_t         *data = pRow->data;
2,147,483,647✔
1415
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
1416
    data += tGetPrimaryKeyIndex(data, &index);
91,728,433✔
1417
  }
1418

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

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

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

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

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

1455
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647✔
1456
            int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
2,147,483,647✔
1457

1458
            pData += tGetU32v(pData, &pColVal->value.nData);
2,147,483,647✔
1459
            if (pColVal->value.nData > 0) {
2,147,483,647✔
1460
              pColVal->value.pData = pData;
2,147,483,647✔
1461
            } else {
1462
              pColVal->value.pData = NULL;
15,213,428✔
1463
            }
1464
            if (isBlob == 1) {
2,147,483,647✔
1465
              pData += BSE_SEQUECE_SIZE;  // skip seq
35,114,044✔
1466
            }
1467
          } else {
1468
            valueSetDatum(&pColVal->value, pTColumn->type, pData, pTColumn->bytes);
2,147,483,647✔
1469
          }
1470
        }
1471
        return 0;
2,147,483,647✔
1472
      } else if (TABS(cid) < pTColumn->colId) {
2,147,483,647✔
1473
        lidx = mid + 1;
2,147,483,647✔
1474
      } else {
1475
        ridx = mid - 1;
2,147,483,647✔
1476
      }
1477
    }
1478

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

1486
    if (pRow->flag == HAS_VALUE) {
2,147,483,647✔
1487
      fixed = bitmap;
2,147,483,647✔
1488
      bit = BIT_FLG_VALUE;
2,147,483,647✔
1489
    } else if (pRow->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
2,147,483,647✔
1490
      fixed = BIT2_SIZE(pTSchema->numOfCols - 1) + bitmap;
×
1491
      bit = GET_BIT2(bitmap, iCol - 1);
×
1492
    } else {
1493
      fixed = BIT1_SIZE(pTSchema->numOfCols - 1) + bitmap;
2,147,483,647✔
1494
      bit = GET_BIT1(bitmap, iCol - 1);
2,147,483,647✔
1495

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

1504
    if (bit == BIT_FLG_NONE) {
2,147,483,647✔
1505
      *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,864,151✔
1506
      return 0;
1,864,151✔
1507
    } else if (bit == BIT_FLG_NULL) {
2,147,483,647✔
1508
      *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
2,059,100,296✔
1509
      return 0;
2,059,107,303✔
1510
    }
1511

1512
    pColVal->cid = pTColumn->colId;
2,147,483,647✔
1513
    pColVal->value.type = pTColumn->type;
2,147,483,647✔
1514
    pColVal->flag = CV_FLAG_VALUE;
2,147,483,647✔
1515
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647✔
1516
      int8_t isBlob = IS_STR_DATA_BLOB(pTColumn->type) ? 1 : 0;
2,147,483,647✔
1517
      pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
2,147,483,647✔
1518
      pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
2,147,483,647✔
1519
      // TODO(yhDeng): support tuple
1520
      //  if (isBlob) pColVal->value.pData += sizeof(uint64_t);  // skip seq
1521
      //  }
1522
    } else {
1523
      valueSetDatum(&pColVal->value, pTColumn->type, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
2,147,483,647✔
1524
    }
1525
  }
1526

1527
  return 0;
2,147,483,647✔
1528
}
1529

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

1534
static int32_t tRowPCmprFn(const void *p1, const void *p2) {
510,212,161✔
1535
  SRowKey key1, key2;
510,188,892✔
1536
  tRowGetKey(*(SRow **)p1, &key1);
1,021,639,081✔
1537
  tRowGetKey(*(SRow **)p2, &key2);
1,022,574,148✔
1538
  return tRowKeyCompare(&key1, &key2);
512,242,490✔
1539
}
1540
static void    tRowPDestroy(SRow **ppRow) { tRowDestroy(*ppRow); }
40,888,797✔
1541

1542
static SColVal* tRowFindColumnValue(SRowIter *iter, int32_t targetCid) {
98,202,688✔
1543
  SColVal* pColVal = tRowIterNext(iter);
98,202,688✔
1544
  while (pColVal != NULL && pColVal->cid < targetCid) {
127,303,295✔
1545
    pColVal = tRowIterNext(iter);
29,096,995✔
1546
  }
1547
  return pColVal;
98,206,384✔
1548
}
1549

1550
static int32_t tRowMergeImpl(SArray *aRowP, STSchema *pTSchema, int32_t iStart, int32_t iEnd, ERowMergeStrategy strategy) {
6,092,736✔
1551
  int32_t code = 0;
6,092,736✔
1552

1553
  int32_t    nRow = iEnd - iStart;
6,092,736✔
1554
  SRowIter **aIter = NULL;
6,092,736✔
1555
  SArray    *aColVal = NULL;
6,092,736✔
1556
  SRow      *pRow = NULL;
6,092,736✔
1557
  uint8_t    hasBlob = 0;
6,092,974✔
1558
  aIter = taosMemoryCalloc(nRow, sizeof(SRowIter *));
6,092,974✔
1559
  if (aIter == NULL) {
6,092,813✔
1560
    code = terrno;
×
1561
    goto _exit;
×
1562
  }
1563

1564
  for (int32_t i = 0; i < nRow; i++) {
46,984,711✔
1565
    SRow *pRowT = taosArrayGetP(aRowP, iStart + i);
40,891,142✔
1566

1567
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
40,890,442✔
1568
    if (code) goto _exit;
40,891,898✔
1569
  }
1570

1571
  // merge
1572
  aColVal = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
6,093,569✔
1573
  if (aColVal == NULL) {
6,092,155✔
1574
    code = terrno;
×
1575
    goto _exit;
×
1576
  }
1577

1578
  for (int32_t iCol = 0; iCol < pTSchema->numOfCols; iCol++) {
80,836,116✔
1579
    int32_t targetCid = pTSchema->columns[iCol].colId;
74,740,020✔
1580
    SColVal *pColVal = NULL;
74,738,935✔
1581

1582
    switch (strategy) {
74,738,935✔
1583
      case KEEP_CONSISTENCY:
5,145,453✔
1584
        if (nRow > 0)
5,145,453✔
1585
          pColVal = tRowFindColumnValue(aIter[nRow - 1], targetCid);
5,145,453✔
1586
        break;
5,145,453✔
1587

1588
      default:  // default using PREFER_NON_NULL strategy
69,593,482✔
1589
      case PREFER_NON_NULL:
1590
        for (int32_t iRow = nRow - 1; iRow >= 0; --iRow) {
113,237,638✔
1591
          SColVal *pColValT = tRowFindColumnValue(aIter[iRow], targetCid);
93,057,256✔
1592

1593
          if (COL_VAL_IS_VALUE(pColValT)) {
93,061,148✔
1594
            pColVal = pColValT;
49,417,216✔
1595
            break;
49,417,216✔
1596
          } else if (pColVal == NULL) {
43,644,156✔
1597
            pColVal = pColValT;
22,109,403✔
1598
          }
1599
        }
1600
        break;
69,597,598✔
1601
    }
1602

1603
    if (pColVal) {
74,743,051✔
1604
      if (taosArrayPush(aColVal, pColVal) == NULL) {
74,742,085✔
1605
        code = terrno;
×
1606
        goto _exit;
×
1607
      }
1608
    }
1609
  }
1610

1611
  // build
1612
  SRowBuildScanInfo sinfo = {0};
6,087,255✔
1613
  code = tRowBuild(aColVal, pTSchema, &pRow, &sinfo);
6,092,869✔
1614

1615
  if (code) goto _exit;
6,092,015✔
1616

1617
  taosArrayRemoveBatch(aRowP, iStart, nRow, (FDelete)tRowPDestroy);
6,092,015✔
1618
  if (taosArrayInsert(aRowP, iStart, &pRow) == NULL) {
6,092,694✔
1619
    code = terrno;
×
1620
    goto _exit;
×
1621
  }
1622

1623
_exit:
6,092,841✔
1624
  if (aIter) {
6,092,876✔
1625
    for (int32_t i = 0; i < nRow; i++) {
46,985,047✔
1626
      tRowIterClose(&aIter[i]);
40,892,206✔
1627
    }
1628
    taosMemoryFree(aIter);
6,092,841✔
1629
  }
1630
  if (aColVal) taosArrayDestroy(aColVal);
6,092,946✔
1631
  if (code) tRowDestroy(pRow);
6,092,771✔
1632
  return code;
6,092,771✔
1633
}
1634
static int32_t tBlobSetTransferTo(SBlobSet *pSrc, SBlobSet *pDst, SColVal *pVal) {
8,530✔
1635
  int32_t code = 0;
8,530✔
1636
  int32_t lino = 0;
8,530✔
1637
  if (COL_VAL_IS_NULL(pVal) || pVal->value.pData == NULL) {
17,060✔
1638
    int8_t type = COL_VAL_IS_NULL(pVal) ? TSDB_DATA_BLOB_NULL_VALUE : TSDB_DATA_BLOB_EMPTY_VALUE;
8,530✔
1639
    code = addEmptyItemToBlobSet(pDst, type, NULL);
8,530✔
1640
    TAOS_CHECK_GOTO(code, &lino, _error);
8,530✔
1641
  } else {
1642
    uint64_t seq = 0;
×
1643
    if (tGetU64(pVal->value.pData, &seq) < 0) {
×
1644
      uError("tBlobSetTransferTo: invalid blob value, seq %p", pVal->value.pData);
×
1645
      return TSDB_CODE_INVALID_PARA;
×
1646
    }
1647

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

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

1660
_error:
8,530✔
1661
  return code;
8,530✔
1662
}
1663

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

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

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

1680
  for (int32_t i = 0; i < nRow; i++) {
9,383✔
1681
    SRow *pRowT = taosArrayGetP(aRowP, 0 + i);
8,530✔
1682
    code = tRowIterOpen(pRowT, pTSchema, &aIter[i]);
8,530✔
1683
    TAOS_CHECK_GOTO(code, &lino, _error);
8,530✔
1684
  }
1685

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

1701
  code = tBlobSetCreate(pBlob->cap, pBlob->type, &pTempBlob);
853✔
1702
  TAOS_CHECK_GOTO(code, &lino, _error);
853✔
1703

1704
  for (int32_t i = 0; i < taosArrayGetSize(aColVal); i++) {
9,383✔
1705
    uint64_t seq = 0;
8,530✔
1706
    SColVal *pVal = taosArrayGet(aColVal, i);
8,530✔
1707

1708
    code = tBlobSetTransferTo(pBlob, pTempBlob, pVal);
8,530✔
1709
    TAOS_CHECK_GOTO(code, &lino, _error);
8,530✔
1710
  }
1711

1712
  tBlobSetSwap(pBlob, pTempBlob);
853✔
1713

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

1719
  if (aIter) {
853✔
1720
    for (int32_t i = 0; i < nRow; i++) {
9,383✔
1721
      tRowIterClose(&aIter[i]);
8,530✔
1722
    }
1723
    taosMemoryFree(aIter);
853✔
1724
  }
1725
  if (aColVal) {
853✔
1726
    taosArrayDestroy(aColVal);
853✔
1727
  }
1728
  tBlobSetDestroy(pTempBlob);
853✔
1729
  return code;
853✔
1730
}
1731

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

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

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

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

1757
    tRowGetKey(row1, &key1);
×
1758

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

1765
      if (tRowKeyCompare(&key1, &key2) != 0) break;
×
1766

1767
      iEnd++;
×
1768
    }
1769

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

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

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

1790
  tBlobSetDestroy(pTempBlobSet);
×
1791
  return code;
×
1792
}
1793

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

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

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

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

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

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

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

1850
  // build
1851

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

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

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

1872
  return code;
×
1873
}
1874

1875
int32_t tRowSort(SArray *aRowP) {
1,725,394✔
1876
  if (TARRAY_SIZE(aRowP) <= 1) return 0;
1,725,394✔
1877
  int32_t code = taosArrayMSort(aRowP, tRowPCmprFn);
1,718,788✔
1878
  if (code != TSDB_CODE_SUCCESS) {
1,718,788✔
1879
    uError("taosArrayMSort failed caused by %d", code);
×
1880
  }
1881
  return code;
1,718,788✔
1882
}
1883

1884
int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, ERowMergeStrategy strategy) {
1,881,934✔
1885
  int32_t code = 0;
1,881,934✔
1886

1887
  int32_t iStart = 0;
1,881,934✔
1888
  while (iStart < aRowP->size) {
46,404,248✔
1889
    SRowKey key1;
44,508,311✔
1890
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
44,524,806✔
1891

1892
    tRowGetKey(row1, &key1);
89,029,186✔
1893

1894
    int32_t iEnd = iStart + 1;
44,517,008✔
1895
    while (iEnd < aRowP->size) {
79,308,806✔
1896
      SRowKey key2;
77,414,431✔
1897
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
77,425,213✔
1898
      tRowGetKey(row2, &key2);
154,833,430✔
1899

1900
      if (tRowKeyCompare(&key1, &key2) != 0) break;
77,443,735✔
1901

1902
      iEnd++;
34,807,737✔
1903
    }
1904

1905
    if (iEnd - iStart > 1) {
44,520,991✔
1906
      code = tRowMergeImpl(aRowP, pTSchema, iStart, iEnd, strategy);
6,092,659✔
1907
      if (code) return code;
6,092,610✔
1908
    }
1909

1910
    // the array is also changing, so the iStart just ++ instead of iEnd
1911
    iStart++;
44,520,942✔
1912
  }
1913

1914
  return code;
1,881,934✔
1915
}
1916

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

1927
int8_t tRowNeedDoMerge(SArray *aRowP) {
853✔
1928
  if (aRowP == NULL || aRowP->size <= 1) return 0;
853✔
1929

1930
  int8_t  doMerge = 0;
853✔
1931
  int32_t iStart = 0;
853✔
1932
  while (iStart < aRowP->size) {
9,383✔
1933
    SRowKey key1;
8,530✔
1934
    SRow   *row1 = (SRow *)taosArrayGetP(aRowP, iStart);
8,530✔
1935

1936
    tRowGetKey(row1, &key1);
17,060✔
1937

1938
    int32_t iEnd = iStart + 1;
8,530✔
1939
    while (iEnd < aRowP->size) {
8,530✔
1940
      SRowKey key2;
7,677✔
1941
      SRow   *row2 = (SRow *)taosArrayGetP(aRowP, iEnd);
7,677✔
1942
      tRowGetKey(row2, &key2);
15,354✔
1943

1944
      if (tRowKeyCompare(&key1, &key2) != 0) break;
7,677✔
1945

1946
      iEnd++;
×
1947
    }
1948

1949
    if (iEnd - iStart > 1) {
8,530✔
1950
      doMerge = 1;
×
1951
      break;
×
1952
    }
1953
    iStart++;
8,530✔
1954
  }
1955
  return doMerge;
853✔
1956
}
1957

1958
int32_t tRowMergeWithBlob(SArray *aRowP, STSchema *pTSchema, SBlobSet *pBlobSet, int8_t flag) {
853✔
1959
  int32_t code = 0;
853✔
1960

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

1968
    code = tRowMergeAndRebuildBlob(aRowP, pTSchema, pBlobSet);
×
1969
  }
1970
  return code;
853✔
1971
}
1972

1973
// SRowIter ========================================
1974
struct SRowIter {
1975
  SRow     *pRow;
1976
  STSchema *pTSchema;
1977

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

1993
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
43,480,337✔
1994
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
43,480,337✔
1995

1996
  int32_t code = 0;
43,481,513✔
1997

1998
  SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
43,481,513✔
1999
  if (pIter == NULL) {
43,480,351✔
2000
    code = terrno;
×
2001
    goto _exit;
×
2002
  }
2003

2004
  pIter->pRow = pRow;
43,480,351✔
2005
  pIter->pTSchema = pTSchema;
43,480,169✔
2006
  pIter->iTColumn = 0;
43,480,526✔
2007

2008
  if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
43,479,746✔
2009

2010
  uint8_t         *data = pRow->data;
43,311,906✔
2011
  SPrimaryKeyIndex index;
43,305,329✔
2012
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
43,429,900✔
2013
    data += tGetPrimaryKeyIndex(data, &index);
117,207✔
2014
  }
2015

2016
  if (pRow->flag >> 4) {
43,311,864✔
2017
    pIter->iCol = 0;
4,965,768✔
2018
    pIter->pIdx = (SKVIdx *)data;
4,965,768✔
2019
    if (pRow->flag & KV_FLG_LIT) {
4,965,768✔
2020
      pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
4,965,768✔
2021
    } else if (pRow->flag & KV_FLG_MID) {
×
2022
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);  // * sizeof(uint16_t)
×
2023
    } else {
2024
      pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);  // * sizeof(uint32_t)
×
2025
    }
2026
  } else {
2027
    switch (pRow->flag) {
38,346,117✔
2028
      case (HAS_NULL | HAS_NONE):
3,323✔
2029
        pIter->pb = data;
3,323✔
2030
        break;
3,323✔
2031
      case HAS_VALUE:
35,202,298✔
2032
        pIter->pf = data;
35,202,298✔
2033
        pIter->pv = pIter->pf + pTSchema->flen;
35,202,487✔
2034
        break;
35,202,372✔
2035
      case (HAS_VALUE | HAS_NONE):
3,141,346✔
2036
      case (HAS_VALUE | HAS_NULL):
2037
        pIter->pb = data;
3,141,346✔
2038
        pIter->pf = data + BIT1_SIZE(pTSchema->numOfCols - 1);
3,141,346✔
2039
        pIter->pv = pIter->pf + pTSchema->flen;
3,141,346✔
2040
        break;
3,141,346✔
2041
      case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2042
        pIter->pb = data;
×
2043
        pIter->pf = data + BIT2_SIZE(pTSchema->numOfCols - 1);
×
2044
        pIter->pv = pIter->pf + pTSchema->flen;
×
2045
        break;
×
2046
      default:
×
2047
        break;
×
2048
    }
2049
  }
2050

2051
_exit:
43,480,817✔
2052
  if (code) {
43,477,516✔
2053
    *ppIter = NULL;
×
2054
  } else {
2055
    *ppIter = pIter;
43,477,516✔
2056
  }
2057
  return code;
43,481,317✔
2058
}
2059

2060
void tRowIterClose(SRowIter **ppIter) {
43,481,387✔
2061
  SRowIter *pIter = *ppIter;
43,481,387✔
2062
  if (pIter) {
43,481,373✔
2063
    taosMemoryFree(pIter);
43,481,534✔
2064
  }
2065
  *ppIter = NULL;
43,481,506✔
2066
}
43,481,723✔
2067

2068
SColVal *tRowIterNext(SRowIter *pIter) {
140,086,233✔
2069
  if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
140,086,233✔
2070
    return NULL;
1,628,137✔
2071
  }
2072

2073
  STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
138,465,415✔
2074

2075
  // timestamp
2076
  if (0 == pIter->iTColumn) {
138,469,229✔
2077
    pIter->cv.cid = pTColumn->colId;
12,622,033✔
2078
    pIter->cv.value.type = pTColumn->type;
12,621,823✔
2079
    pIter->cv.flag = CV_FLAG_VALUE;
12,621,302✔
2080
    VALUE_SET_TRIVIAL_DATUM(&pIter->cv.value, pIter->pRow->ts);
12,621,767✔
2081
    goto _exit;
12,621,288✔
2082
  }
2083

2084
  if (pIter->pRow->flag == HAS_NONE) {
125,848,169✔
2085
    pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
161,372✔
2086
    goto _exit;
161,372✔
2087
  }
2088

2089
  if (pIter->pRow->flag == HAS_NULL) {
125,686,356✔
2090
    pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
394,700✔
2091
    goto _exit;
394,700✔
2092
  }
2093

2094
  if (pIter->pRow->flag >> 4) {  // KV
125,291,695✔
2095
    if (pIter->iCol < pIter->pIdx->nCol) {
84,786,889✔
2096
      uint8_t *pData;
2097

2098
      if (pIter->pRow->flag & KV_FLG_LIT) {
47,001,862✔
2099
        pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
47,001,862✔
2100
      } else if (pIter->pRow->flag & KV_FLG_MID) {
×
2101
        pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
×
2102
      } else {
2103
        pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
×
2104
      }
2105

2106
      int16_t cid;
47,001,862✔
2107
      pData += tGetI16v(pData, &cid);
47,001,862✔
2108

2109
      if (TABS(cid) == pTColumn->colId) {
47,001,862✔
2110
        if (cid < 0) {
45,544,016✔
2111
          pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
3,754,333✔
2112
        } else {
2113
          pIter->cv.cid = pTColumn->colId;
41,789,683✔
2114
          pIter->cv.value.type = pTColumn->type;
41,789,683✔
2115
          pIter->cv.flag = CV_FLAG_VALUE;
41,789,683✔
2116

2117
          if (IS_VAR_DATA_TYPE(pTColumn->type)) {
41,789,683✔
2118
            pData += tGetU32v(pData, &pIter->cv.value.nData);
17,813,962✔
2119
            if (pIter->cv.value.nData > 0) {
8,906,981✔
2120
              pIter->cv.value.pData = pData;
8,905,409✔
2121
            } else {
2122
              pIter->cv.value.pData = NULL;
1,572✔
2123
              // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2124
              //   pIter->cv.value.pData = pData;
2125
              // }
2126
            }
2127
          } else {
2128
            valueSetDatum(&pIter->cv.value, pTColumn->type, pData, pTColumn->bytes);
32,882,702✔
2129
          }
2130
        }
2131

2132
        pIter->iCol++;
45,544,016✔
2133
        goto _exit;
45,544,016✔
2134
      } else if (TABS(cid) > pTColumn->colId) {
1,457,846✔
2135
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,457,846✔
2136
        goto _exit;
1,457,846✔
2137
      } else {
2138
        uError("unexpected column id %d, %d", cid, pTColumn->colId);
×
2139
        goto _exit;
×
2140
      }
2141
    } else {
2142
      pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
37,785,027✔
2143
      goto _exit;
37,785,027✔
2144
    }
2145
  } else {  // Tuple
2146
    uint8_t bv = BIT_FLG_VALUE;
40,505,051✔
2147
    if (pIter->pb) {
40,505,051✔
2148
      switch (pIter->pRow->flag) {
16,625,953✔
2149
        case (HAS_NULL | HAS_NONE):
30,001✔
2150
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
30,001✔
2151
          break;
30,001✔
2152
        case (HAS_VALUE | HAS_NONE):
10,113,915✔
2153
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
10,113,915✔
2154
          if (bv) bv++;
10,113,915✔
2155
          break;
10,113,915✔
2156
        case (HAS_VALUE | HAS_NULL):
6,482,037✔
2157
          bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
6,482,037✔
2158
          break;
6,482,037✔
2159
        case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2160
          bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
×
2161
          break;
×
2162
        default:
×
2163
          break;
×
2164
      }
2165

2166
      if (bv == BIT_FLG_NONE) {
16,625,953✔
2167
        pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
1,041,271✔
2168
        goto _exit;
1,041,271✔
2169
      } else if (bv == BIT_FLG_NULL) {
15,584,682✔
2170
        pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
1,138,098✔
2171
        goto _exit;
1,138,098✔
2172
      }
2173
    }
2174

2175
    pIter->cv.cid = pTColumn->colId;
38,326,259✔
2176
    pIter->cv.value.type = pTColumn->type;
38,325,626✔
2177
    pIter->cv.flag = CV_FLAG_VALUE;
38,326,833✔
2178
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
43,314,558✔
2179
      uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
4,990,433✔
2180
      pData += tGetU32v(pData, &pIter->cv.value.nData);
9,985,169✔
2181
      if (pIter->cv.value.nData > 0) {
4,992,067✔
2182
        pIter->cv.value.pData = pData;
4,962,874✔
2183
      } else {
2184
        pIter->cv.value.pData = NULL;
28,532✔
2185
        // if (IS_STR_DATA_BLOB(pTColumn->type)) {
2186
        //   pIter->cv.value.pData = pData;
2187
        // }
2188
      }
2189
    } else {
2190
      valueSetDatum(&pIter->cv.value, pTColumn->type, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
33,333,385✔
2191
    }
2192
    goto _exit;
38,320,958✔
2193
  }
2194

2195
_exit:
138,464,576✔
2196
  pIter->iTColumn++;
138,464,576✔
2197
  return &pIter->cv;
138,464,068✔
2198
}
2199

2200
static int32_t tRowNoneUpsertColData(SColData *aColData, int32_t nColData, int32_t flag) {
826,228✔
2201
  int32_t code = 0;
826,228✔
2202

2203
  if (flag) return code;
826,228✔
2204

2205
  for (int32_t iColData = 0; iColData < nColData; iColData++) {
6,582,161✔
2206
    code = tColDataAppendValueImpl[aColData[iColData].flag][CV_FLAG_NONE](&aColData[iColData], NULL, 0);
6,040,202✔
2207
    if (code) return code;
6,039,469✔
2208
  }
2209

2210
  return code;
541,959✔
2211
}
2212
static int32_t tRowNullUpsertColData(SColData *aColData, int32_t nColData, STSchema *pSchema, int32_t flag) {
68,095,490✔
2213
  int32_t code = 0;
68,095,490✔
2214

2215
  int32_t   iColData = 0;
68,095,490✔
2216
  SColData *pColData = &aColData[iColData];
68,095,490✔
2217
  int32_t   iTColumn = 1;
68,096,524✔
2218
  STColumn *pTColumn = &pSchema->columns[iTColumn];
68,096,524✔
2219

2220
  while (pColData) {
442,616,034✔
2221
    if (pTColumn) {
374,553,878✔
2222
      if (pTColumn->colId == pColData->cid) {  // NULL
374,553,878✔
2223
        if (flag == 0) {
374,751,867✔
2224
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
374,751,867✔
2225
        } else {
2226
          code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
×
2227
        }
2228
        if (code) goto _exit;
374,588,441✔
2229

2230
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
374,588,441✔
2231
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
374,696,498✔
2232
      } else if (pTColumn->colId > pColData->cid) {  // NONE
×
2233
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2234
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2235
      } else {
2236
        pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL;
×
2237
      }
2238
    } else {  // NONE
2239
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2240
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2241
    }
2242
  }
2243

2244
_exit:
68,062,156✔
2245
  return code;
68,062,156✔
2246
}
2247
static int32_t tRowTupleUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData,
2,147,483,647✔
2248
                                      int32_t flag) {
2249
  int32_t code = 0;
2,147,483,647✔
2250

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

2256
  uint8_t         *pb = NULL, *pf = NULL, *pv = NULL;
2,147,483,647✔
2257
  SPrimaryKeyIndex index;
2,147,483,647✔
2258
  uint8_t         *data = pRow->data;
2,147,483,647✔
2259
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
2,147,483,647✔
2260
    data += tGetPrimaryKeyIndex(data, &index);
74,048,448✔
2261
  }
2262

2263
  switch (pRow->flag) {
2,147,483,647✔
2264
    case HAS_VALUE:
2,147,483,647✔
2265
      pf = data;  // TODO: fix here
2,147,483,647✔
2266
      pv = pf + pTSchema->flen;
2,147,483,647✔
2267
      break;
2,147,483,647✔
2268
    case (HAS_NULL | HAS_NONE):
198,120✔
2269
      pb = data;
198,120✔
2270
      break;
198,120✔
2271
    case (HAS_VALUE | HAS_NONE):
520,171,429✔
2272
    case (HAS_VALUE | HAS_NULL):
2273
      pb = data;
520,171,429✔
2274
      pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
520,171,429✔
2275
      pv = pf + pTSchema->flen;
520,175,629✔
2276
      break;
520,179,465✔
2277
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
189,452✔
2278
      pb = data;
189,452✔
2279
      pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
189,452✔
2280
      pv = pf + pTSchema->flen;
×
2281
      break;
×
2282
    default:
×
2283
      return TSDB_CODE_INVALID_DATA_FMT;
×
2284
  }
2285

2286
  while (pColData) {
2,147,483,647✔
2287
    if (pTColumn) {
2,147,483,647✔
2288
      if (pTColumn->colId == pColData->cid) {
2,147,483,647✔
2289
        if (!(pTColumn->type == pColData->type)) {
2,147,483,647✔
2290
          return TSDB_CODE_INVALID_PARA;
×
2291
        }
2292
        if (pb) {
2,147,483,647✔
2293
          uint8_t bv;
2294
          switch (pRow->flag) {
2,147,483,647✔
2295
            case (HAS_NULL | HAS_NONE):
3,912,190✔
2296
              bv = GET_BIT1(pb, iTColumn - 1);
3,912,190✔
2297
              break;
3,912,190✔
2298
            case (HAS_VALUE | HAS_NONE):
68,593,505✔
2299
              bv = GET_BIT1(pb, iTColumn - 1);
68,593,505✔
2300
              if (bv) bv++;
68,611,487✔
2301
              break;
68,611,487✔
2302
            case (HAS_VALUE | HAS_NULL):
2,132,449,512✔
2303
              bv = GET_BIT1(pb, iTColumn - 1) + 1;
2,132,449,512✔
2304
              break;
2,132,535,902✔
2305
            case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
2306
              bv = GET_BIT2(pb, iTColumn - 1);
×
2307
              break;
×
2308
            default:
×
2309
              return TSDB_CODE_INVALID_DATA_FMT;
×
2310
          }
2311

2312
          if (bv == BIT_FLG_NONE) {
2,147,483,647✔
2313
            if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0)))
8,676,241✔
2314
              goto _exit;
×
2315
            goto _continue;
8,675,644✔
2316
          } else if (bv == BIT_FLG_NULL) {
2,147,483,647✔
2317
            if (flag == 0) {
613,574,430✔
2318
              code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
613,123,289✔
2319
            } else {
2320
              code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
451,141✔
2321
            }
2322
            if (code) goto _exit;
613,587,316✔
2323
            goto _continue;
613,587,316✔
2324
          }
2325
        }
2326

2327
        if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
2328
          uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
2,147,483,647✔
2329
          uint32_t nData;
2,147,483,647✔
2330
          pData += tGetU32v(pData, &nData);
2,147,483,647✔
2331
          if (flag == 0) {
2,147,483,647✔
2332
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
2,147,483,647✔
2333
          } else {
2334
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
525,338,461✔
2335
          }
2336
          if (code) goto _exit;
2,147,483,647✔
2337
        } else {
2338
          if (flag == 0) {
2,147,483,647✔
2339
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
2340
                                                                          TYPE_BYTES[pColData->type]);
2,147,483,647✔
2341
          } else {
2342
            code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pf + pTColumn->offset,
2,147,483,647✔
2343
                                                                          TYPE_BYTES[pColData->type], flag > 0);
1,446,374,046✔
2344
          }
2345
          if (code) goto _exit;
2,147,483,647✔
2346
        }
2347

2348
      _continue:
2,147,483,647✔
2349
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
2,147,483,647✔
2350
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
2,147,483,647✔
2351
      } else if (pTColumn->colId > pColData->cid) {  // NONE
75,084,425✔
2352
        if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
×
2353
        pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
×
2354
      } else {
2355
        pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
75,056,005✔
2356
      }
2357
    } else {
2358
      if (flag == 0 && (code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0))) goto _exit;
42,711,100✔
2359
      pColData = (++iColData < nColData) ? &aColData[iColData] : NULL;
42,711,100✔
2360
    }
2361
  }
2362

2363
_exit:
2,147,483,647✔
2364
  return code;
2,147,483,647✔
2365
}
2366
static int32_t tRowKVUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
1,992,633,417✔
2367
  int32_t code = 0;
1,992,633,417✔
2368

2369
  uint8_t  *pv = NULL;
1,992,633,417✔
2370
  int32_t   iColData = 0;
1,992,633,417✔
2371
  SColData *pColData = &aColData[iColData];
1,992,633,417✔
2372
  int32_t   iTColumn = 1;
1,992,838,510✔
2373
  STColumn *pTColumn = &pTSchema->columns[iTColumn];
1,992,838,510✔
2374
  int32_t   iCol = 0;
1,992,844,633✔
2375

2376
  // primary keys
2377
  uint8_t         *data = pRow->data;
1,992,844,633✔
2378
  SPrimaryKeyIndex index;
1,992,823,611✔
2379
  for (int32_t i = 0; i < pRow->numOfPKs; i++) {
1,998,838,324✔
2380
    data += tGetPrimaryKeyIndex(data, &index);
6,004,239✔
2381
  }
2382

2383
  SKVIdx *pKVIdx = (SKVIdx *)data;
1,992,831,012✔
2384
  if (pRow->flag & KV_FLG_LIT) {
1,992,831,012✔
2385
    pv = pKVIdx->idx + pKVIdx->nCol;
1,980,682,853✔
2386
  } else if (pRow->flag & KV_FLG_MID) {
12,090,099✔
2387
    pv = pKVIdx->idx + (pKVIdx->nCol << 1);
12,163,754✔
2388
  } else if (pRow->flag & KV_FLG_BIG) {
4,422✔
2389
    pv = pKVIdx->idx + (pKVIdx->nCol << 2);
×
2390
  } else {
2391
    return TSDB_CODE_INVALID_PARA;
×
2392
  }
2393

2394
  while (pColData) {
2,147,483,647✔
2395
    if (pTColumn) {
2,147,483,647✔
2396
      if (pTColumn->colId == pColData->cid) {
2,147,483,647✔
2397
        while (iCol < pKVIdx->nCol) {
2,147,483,647✔
2398
          uint8_t *pData;
2399
          if (pRow->flag & KV_FLG_LIT) {
2,147,483,647✔
2400
            pData = pv + ((uint8_t *)pKVIdx->idx)[iCol];
2,147,483,647✔
2401
          } else if (pRow->flag & KV_FLG_MID) {
327,609,282✔
2402
            pData = pv + ((uint16_t *)pKVIdx->idx)[iCol];
329,604,099✔
2403
          } else if (pRow->flag & KV_FLG_BIG) {
×
2404
            pData = pv + ((uint32_t *)pKVIdx->idx)[iCol];
×
2405
          } else {
2406
            return TSDB_CODE_INVALID_DATA_FMT;
×
2407
          }
2408

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

2412
          if (TABS(cid) == pTColumn->colId) {
2,147,483,647✔
2413
            if (cid < 0) {
2,147,483,647✔
2414
              if (flag == 0) {
2,147,483,647✔
2415
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2,147,483,647✔
2416
              } else {
2417
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0, flag > 0);
15,784✔
2418
              }
2419
              if (code) goto _exit;
2,147,483,647✔
2420
            } else {
2421
              uint32_t nData;
2,147,483,647✔
2422
              if (IS_VAR_DATA_TYPE(pTColumn->type)) {
2,147,483,647✔
2423
                pData += tGetU32v(pData, &nData);
1,075,555,687✔
2424
              } else {
2425
                nData = 0;
2,147,483,647✔
2426
              }
2427
              if (flag == 0) {
2,147,483,647✔
2428
                code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData);
2,147,483,647✔
2429
              } else {
2430
                code = tColDataUpdateValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pData, nData, flag > 0);
6,402,610✔
2431
              }
2432
              if (code) goto _exit;
2,147,483,647✔
2433
            }
2434
            iCol++;
2,147,483,647✔
2435
            goto _continue;
2,147,483,647✔
2436
          } else if (TABS(cid) > pTColumn->colId) {  // NONE
2,147,483,647✔
2437
            break;
2,147,483,647✔
2438
          } else {
2439
            iCol++;
4,959,000✔
2440
          }
2441
        }
2442

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

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

2460
_exit:
2,004,675,786✔
2461
  return code;
1,992,245,583✔
2462
}
2463
/* flag > 0: forward update
2464
 * flag == 0: append
2465
 * flag < 0: backward update
2466
 */
2467
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag) {
2,147,483,647✔
2468
  if (!(pRow->sver == pTSchema->version)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
2469
  if (!(nColData > 0)) return TSDB_CODE_INVALID_PARA;
2,147,483,647✔
2470

2471
  if (pRow->flag == HAS_NONE) {
2,147,483,647✔
2472
    return tRowNoneUpsertColData(aColData, nColData, flag);
826,228✔
2473
  } else if (pRow->flag == HAS_NULL) {
2,147,483,647✔
2474
    return tRowNullUpsertColData(aColData, nColData, pTSchema, flag);
68,099,144✔
2475
  } else if (pRow->flag >> 4) {  // KV row
2,147,483,647✔
2476
    return tRowKVUpsertColData(pRow, pTSchema, aColData, nColData, flag);
1,992,612,256✔
2477
  } else {  // TUPLE row
2478
    return tRowTupleUpsertColData(pRow, pTSchema, aColData, nColData, flag);
2,147,483,647✔
2479
  }
2480
}
2481

2482
void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
851,046,120✔
2483
  key->numOfPKs = row->numOfPKs;
851,046,120✔
2484

2485
  if (key->numOfPKs == 0) {
851,580,105✔
2486
    return;
×
2487
  }
2488

2489
  SPrimaryKeyIndex indices[TD_MAX_PK_COLS];
845,268,788✔
2490

2491
  uint8_t *data = row->data;
851,637,015✔
2492

2493
  for (int32_t i = 0; i < row->numOfPKs; i++) {
1,703,384,280✔
2494
    data += tGetPrimaryKeyIndex(data, &indices[i]);
851,648,682✔
2495
  }
2496

2497
  // primary keys
2498
  for (int32_t i = 0; i < row->numOfPKs; i++) {
1,703,428,980✔
2499
    key->pks[i].type = indices[i].type;
851,724,382✔
2500

2501
    uint8_t *tdata = data + indices[i].offset;
851,789,826✔
2502
    if (row->flag >> 4) {
851,768,334✔
2503
      tdata += tGetI16v(tdata, NULL);
144,333,192✔
2504
    }
2505

2506
    if (IS_VAR_DATA_TYPE(indices[i].type)) {
851,869,583✔
2507
      key->pks[i].pData = tdata;
150,945,449✔
2508
      key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
300,942,532✔
2509
    } else {
2510
      valueSetDatum(key->pks + i, indices[i].type, tdata, tDataTypes[indices[i].type].bytes);
701,366,310✔
2511
    }
2512
  }
2513
}
2514

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

2526
int32_t tValueCompare(const SValue *tv1, const SValue *tv2) {
1,293,894,248✔
2527
  switch (tv1->type) {
1,293,894,248✔
2528
    case TSDB_DATA_TYPE_BOOL:
×
2529
    case TSDB_DATA_TYPE_TINYINT:
2530
      T_COMPARE_SCALAR_VALUE(int8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2531
    case TSDB_DATA_TYPE_SMALLINT:
×
2532
      T_COMPARE_SCALAR_VALUE(int16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2533
    case TSDB_DATA_TYPE_INT:
568,434,863✔
2534
      T_COMPARE_SCALAR_VALUE(int32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
568,434,863✔
2535
    case TSDB_DATA_TYPE_BIGINT:
154,390,604✔
2536
    case TSDB_DATA_TYPE_TIMESTAMP:
2537
      T_COMPARE_SCALAR_VALUE(int64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
154,390,604✔
2538
    case TSDB_DATA_TYPE_FLOAT:
×
2539
      T_COMPARE_SCALAR_VALUE(float, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2540
    case TSDB_DATA_TYPE_DOUBLE:
×
2541
      T_COMPARE_SCALAR_VALUE(double, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2542
    case TSDB_DATA_TYPE_UTINYINT:
×
2543
      T_COMPARE_SCALAR_VALUE(uint8_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2544
    case TSDB_DATA_TYPE_USMALLINT:
×
2545
      T_COMPARE_SCALAR_VALUE(uint16_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
×
2546
    case TSDB_DATA_TYPE_UINT:
153,667,623✔
2547
      T_COMPARE_SCALAR_VALUE(uint32_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
153,667,623✔
2548
    case TSDB_DATA_TYPE_UBIGINT:
152,775,643✔
2549
      T_COMPARE_SCALAR_VALUE(uint64_t, &VALUE_GET_TRIVIAL_DATUM(tv1), &VALUE_GET_TRIVIAL_DATUM(tv2));
152,775,643✔
2550
    case TSDB_DATA_TYPE_GEOMETRY:
264,613,895✔
2551
    case TSDB_DATA_TYPE_BINARY: {
2552
      int32_t ret = strncmp((const char *)tv1->pData, (const char *)tv2->pData, TMIN(tv1->nData, tv2->nData));
264,613,895✔
2553
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
264,637,401✔
2554
    }
2555
    case TSDB_DATA_TYPE_NCHAR: {
×
2556
      int32_t ret = taosUcs4Compare((TdUcs4 *)tv1->pData, (TdUcs4 *)tv2->pData,
×
2557
                                    tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2558
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2559
    }
2560
    case TSDB_DATA_TYPE_VARBINARY: {
×
2561
      int32_t ret = memcmp(tv1->pData, tv2->pData, tv1->nData < tv2->nData ? tv1->nData : tv2->nData);
×
2562
      return ret ? ret : (tv1->nData < tv2->nData ? -1 : (tv1->nData > tv2->nData ? 1 : 0));
×
2563
    }
2564
    default:
×
2565
      break;
×
2566
  }
2567

2568
  return 0;
×
2569
}
2570

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

2581
  if (key1->numOfPKs == key2->numOfPKs) {
2,147,483,647✔
2582
    for (uint8_t iKey = 0; iKey < key1->numOfPKs; iKey++) {
2,147,483,647✔
2583
      int32_t ret = tValueCompare(&key1->pks[iKey], &key2->pks[iKey]);
1,293,992,235✔
2584
      if (ret) return ret;
1,293,896,780✔
2585
    }
2586
  } else if (key1->numOfPKs < key2->numOfPKs) {
5,821✔
2587
    return -1;
5,821✔
2588
  } else {
2589
    return 1;
×
2590
  }
2591

2592
  return 0;
2,147,483,647✔
2593
}
2594

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

2599
  if (pSrc->numOfPKs > 0) {
2,147,483,647✔
2600
    for (int32_t i = 0; i < pSrc->numOfPKs; ++i) {
2,147,483,647✔
2601
      SValue *pVal = &pDst->pks[i];
1,456,949,115✔
2602
      pVal->type = pSrc->pks[i].type;
1,456,842,432✔
2603

2604
      valueCloneDatum(pVal, pSrc->pks + i, pVal->type);
1,456,875,368✔
2605
    }
2606
  }
2607
}
2,147,483,647✔
2608

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

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

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

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

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

2716
static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
412,424,514✔
2717
  int32_t n = 0;
412,424,514✔
2718

2719
  // key
2720
  if (isJson) {
412,424,514✔
2721
    n += tPutCStr(p ? p + n : p, pTagVal->pKey);
2,864,656✔
2722
  } else {
2723
    n += tPutI16v(p ? p + n : p, pTagVal->cid);
821,957,742✔
2724
  }
2725

2726
  // type
2727
  n += tPutI8(p ? p + n : p, pTagVal->type);
412,397,884✔
2728

2729
  // value
2730
  if (IS_VAR_DATA_TYPE(pTagVal->type)) {
412,442,810✔
2731
    n += tPutBinary(p ? p + n : p, pTagVal->pData, pTagVal->nData);
351,928,405✔
2732
  } else {
2733
    p = p ? p + n : p;
236,474,279✔
2734
    n += tDataTypes[pTagVal->type].bytes;
236,474,465✔
2735
    if (p) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
236,424,004✔
2736
  }
2737

2738
  return n;
412,383,025✔
2739
}
2740
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
2,147,483,647✔
2741
  int32_t n = 0;
2,147,483,647✔
2742

2743
  // key
2744
  if (isJson) {
2,147,483,647✔
2745
    n += tGetCStr(p + n, &pTagVal->pKey);
11,112,164✔
2746
  } else {
2747
    n += tGetI16v(p + n, &pTagVal->cid);
2,147,483,647✔
2748
  }
2749

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

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

2761
  return n;
2,147,483,647✔
2762
}
2763

2764
bool tTagIsJson(const void *pTag) { return (((const STag *)pTag)->flags & TD_TAG_JSON); }
12,167,289✔
2765

2766
bool tTagIsJsonNull(void *data) {
1,496,430✔
2767
  STag  *pTag = (STag *)data;
1,496,430✔
2768
  int8_t isJson = tTagIsJson(pTag);
1,496,430✔
2769
  if (!isJson) return false;
1,496,430✔
2770
  return ((STag *)data)->nTag == 0;
859,216✔
2771
}
2772

2773
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag) {
85,161,911✔
2774
  int32_t  code = 0;
85,161,911✔
2775
  uint8_t *p = NULL;
85,161,911✔
2776
  int16_t  n = 0;
85,161,911✔
2777
  int16_t  nTag = taosArrayGetSize(pArray);
85,161,911✔
2778
  int32_t  szTag = 0;
85,166,148✔
2779
  int8_t   isLarge = 0;
85,166,148✔
2780

2781
  // sort
2782
  if (isJson) {
85,166,148✔
2783
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValJsonCmprFn);
468,501✔
2784
  } else {
2785
    taosSort(pArray->pData, nTag, sizeof(STagVal), tTagValCmprFn);
84,697,647✔
2786
  }
2787

2788
  // get size
2789
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
291,341,536✔
2790
    szTag += tPutTagVal(NULL, (STagVal *)taosArrayGet(pArray, iTag), isJson);
206,222,545✔
2791
  }
2792
  if (szTag <= INT8_MAX) {
85,118,991✔
2793
    szTag = szTag + sizeof(STag) + sizeof(int8_t) * nTag;
75,875,717✔
2794
  } else {
2795
    szTag = szTag + sizeof(STag) + sizeof(int16_t) * nTag;
9,243,274✔
2796
    isLarge = 1;
9,243,274✔
2797
  }
2798

2799
  // build tag
2800
  (*ppTag) = (STag *)taosMemoryCalloc(szTag, 1);
85,118,991✔
2801
  if ((*ppTag) == NULL) {
85,163,835✔
2802
    code = terrno;
×
2803
    goto _err;
×
2804
  }
2805
  (*ppTag)->flags = 0;
85,162,555✔
2806
  if (isJson) {
85,176,656✔
2807
    (*ppTag)->flags |= TD_TAG_JSON;
468,501✔
2808
  }
2809
  if (isLarge) {
85,176,656✔
2810
    (*ppTag)->flags |= TD_TAG_LARGE;
9,245,557✔
2811
  }
2812
  (*ppTag)->len = szTag;
85,176,656✔
2813
  (*ppTag)->nTag = nTag;
85,160,540✔
2814
  (*ppTag)->ver = version;
85,135,224✔
2815

2816
  if (isLarge) {
85,118,851✔
2817
    p = (uint8_t *)&((int16_t *)(*ppTag)->idx)[nTag];
9,245,571✔
2818
  } else {
2819
    p = (uint8_t *)&(*ppTag)->idx[nTag];
75,873,280✔
2820
  }
2821
  n = 0;
85,157,479✔
2822
  for (int16_t iTag = 0; iTag < nTag; iTag++) {
291,359,327✔
2823
    if (isLarge) {
206,192,235✔
2824
      ((int16_t *)(*ppTag)->idx)[iTag] = n;
54,006,191✔
2825
    } else {
2826
      (*ppTag)->idx[iTag] = n;
152,186,044✔
2827
    }
2828
    n += tPutTagVal(p + n, (STagVal *)taosArrayGet(pArray, iTag), isJson);
206,187,563✔
2829
  }
2830
#ifdef TD_DEBUG_PRINT_TAG
2831
  debugPrintSTag(*ppTag, __func__, __LINE__);
2832
#endif
2833

2834
  return code;
85,167,092✔
2835

2836
_err:
×
2837
  return code;
×
2838
}
2839

2840
void tTagFree(STag *pTag) {
1,233,326,805✔
2841
  if (pTag) taosMemoryFree(pTag);
1,233,326,805✔
2842
}
1,233,326,805✔
2843

2844
char *tTagValToData(const STagVal *value, bool isJson) {
1,020,945,533✔
2845
  if (!value) {
1,020,945,533✔
2846
    return NULL;
×
2847
  }
2848

2849
  char  *data = NULL;
1,020,945,533✔
2850
  int8_t typeBytes = 0;
1,020,945,533✔
2851
  if (isJson) {
1,020,945,533✔
2852
    typeBytes = CHAR_BYTES;
2,521,764✔
2853
  }
2854

2855
  if (IS_VAR_DATA_TYPE(value->type)) {
1,020,945,533✔
2856
    data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
352,875,860✔
2857
    if (data == NULL) {
353,213,487✔
2858
      return NULL;
×
2859
    }
2860

2861
    if (isJson) {
353,213,487✔
2862
      *data = value->type;
1,928,074✔
2863
    }
2864

2865
    varDataLen(data + typeBytes) = value->nData;
353,213,487✔
2866
    (void)memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
353,195,814✔
2867
  } else {
2868
    data = ((char *)&(value->i64)) - typeBytes;  // json with type
667,870,106✔
2869
  }
2870

2871
  return data;
1,021,211,058✔
2872
}
2873

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

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

2889
  if (isLarge) {
2,147,483,647✔
2890
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
833,604,190✔
2891
  } else {
2892
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1,945,749,964✔
2893
  }
2894

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

2906
    int32_t nt = tGetTagVal(p + offset, &tv, isJson);
2,147,483,647✔
2907
    if (isJson) {
2,147,483,647✔
2908
      c = tTagValJsonCmprFn(pTagVal, &tv);
4,303,994✔
2909
    } else {
2910
      c = tTagValCmprFn(pTagVal, &tv);
2,147,483,647✔
2911
    }
2912

2913
    if (c < 0) {
2,147,483,647✔
2914
      ridx = midx - 1;
2,147,483,647✔
2915
    } else if (c > 0) {
2,147,483,647✔
2916
      lidx = midx + 1;
2,147,483,647✔
2917
    } else {
2918
      (void)memcpy(pTagVal, &tv, sizeof(tv));
2,147,483,647✔
2919
      return true;
2,147,483,647✔
2920
    }
2921
  }
2922
  return false;
63,361,983✔
2923
}
2924

2925
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag) {
314,640,992✔
2926
  return tEncodeBinary(pEncoder, (const uint8_t *)pTag, pTag->len);
629,326,329✔
2927
}
2928

2929
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag) { return tDecodeBinary(pDecoder, (uint8_t **)ppTag, NULL); }
2,147,483,647✔
2930

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

2938
  if (isLarge) {
1,045,149✔
2939
    p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
4,622✔
2940
  } else {
2941
    p = (uint8_t *)&pTag->idx[pTag->nTag];
1,040,527✔
2942
  }
2943

2944
  (*ppArray) = taosArrayInit(pTag->nTag + 1, sizeof(STagVal));
1,045,149✔
2945
  if (*ppArray == NULL) {
1,045,149✔
2946
    code = terrno;
×
2947
    goto _err;
×
2948
  }
2949

2950
  for (int16_t iTag = 0; iTag < pTag->nTag; iTag++) {
2,661,323✔
2951
    if (isLarge) {
1,616,174✔
2952
      offset = ((int16_t *)pTag->idx)[iTag];
6,194✔
2953
    } else {
2954
      offset = pTag->idx[iTag];
1,609,980✔
2955
    }
2956
    int32_t nt = tGetTagVal(p + offset, &tv, pTag->flags & TD_TAG_JSON);
1,616,174✔
2957
    if (taosArrayPush(*ppArray, &tv) == NULL) {
3,232,348✔
2958
      code = terrno;
×
2959
      goto _err;
×
2960
    }
2961
  }
2962

2963
  return code;
1,045,149✔
2964

2965
_err:
×
2966
  return code;
×
2967
}
2968

2969

2970
void destroyTagVal(void *pTag) {
13,989,496✔
2971
  STagVal* pTagVal = (STagVal*)pTag;
13,989,496✔
2972
  if (pTagVal && IS_VAR_DATA_TYPE(pTagVal->type)) {
13,989,496✔
2973
    taosMemoryFree(pTagVal->pData);
6,103,248✔
2974
  }
2975
}
13,989,496✔
2976

2977
// STSchema ========================================
2978
STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
1,279,653,534✔
2979
  STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
1,279,653,534✔
2980
  if (pTSchema == NULL) {
1,279,459,604✔
2981
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2982
    return NULL;
×
2983
  }
2984

2985
  pTSchema->numOfCols = numOfCols;
1,279,459,604✔
2986
  pTSchema->version = version;
1,279,522,315✔
2987

2988
  // timestamp column
2989
  if (!(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
1,279,704,054✔
2990
    terrno = TSDB_CODE_INVALID_PARA;
×
2991
    taosMemoryFree(pTSchema);
×
2992
    return NULL;
×
2993
  }
2994
  if (!(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID)) {
1,279,526,819✔
2995
    terrno = TSDB_CODE_INVALID_PARA;
×
2996
    taosMemoryFree(pTSchema);
×
2997
    return NULL;
×
2998
  }
2999
  pTSchema->columns[0].colId = aSchema[0].colId;
1,279,443,146✔
3000
  pTSchema->columns[0].type = aSchema[0].type;
1,279,756,741✔
3001
  pTSchema->columns[0].flags = aSchema[0].flags;
1,279,673,265✔
3002
  pTSchema->columns[0].bytes = TYPE_BYTES[aSchema[0].type];
1,279,822,710✔
3003
  pTSchema->columns[0].offset = -1;
1,279,856,484✔
3004

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

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

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

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

3026
#if 1  // todo : remove this
3027
  pTSchema->tlen += (int32_t)TD_BITMAP_BYTES(numOfCols);
1,280,153,480✔
3028
#endif
3029

3030
  return pTSchema;
1,280,051,236✔
3031
}
3032

3033
static int32_t tTColumnCompare(const void *p1, const void *p2) {
372,653,396✔
3034
  if (((STColumn *)p1)->colId < ((STColumn *)p2)->colId) {
372,653,396✔
3035
    return -1;
62,115,295✔
3036
  } else if (((STColumn *)p1)->colId > ((STColumn *)p2)->colId) {
310,665,509✔
3037
    return 1;
221,444,120✔
3038
  }
3039

3040
  return 0;
89,242,004✔
3041
}
3042

3043
const STColumn *tTSchemaSearchColumn(const STSchema *pTSchema, int16_t cid) {
89,242,072✔
3044
  STColumn tcol = {
89,242,072✔
3045
      .colId = cid,
3046
  };
3047

3048
  return taosbsearch(&tcol, pTSchema->columns, pTSchema->numOfCols, sizeof(STColumn), tTColumnCompare, TD_EQ);
89,247,732✔
3049
}
3050

3051
// SColData ========================================
3052
void tColDataDestroy(void *ph) {
1,822,284,136✔
3053
  if (ph) {
1,822,284,136✔
3054
    SColData *pColData = (SColData *)ph;
1,822,358,891✔
3055

3056
    tFree(pColData->pBitMap);
1,822,358,891✔
3057
    tFree(pColData->aOffset);
1,822,413,735✔
3058
    tFree(pColData->pData);
1,822,352,832✔
3059
  }
3060
}
1,822,222,584✔
3061

3062
void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t cflag) {
1,910,306,167✔
3063
  pColData->cid = cid;
1,910,306,167✔
3064
  pColData->type = type;
1,910,460,356✔
3065
  pColData->cflag = cflag;
1,910,493,113✔
3066
  tColDataClear(pColData);
1,910,492,092✔
3067
}
1,910,245,745✔
3068

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

3078
void tColDataDeepClear(SColData *pColData) {
47,544,319✔
3079
  pColData->pBitMap = NULL;
47,544,319✔
3080
  pColData->aOffset = NULL;
47,557,568✔
3081
  pColData->pData = NULL;
47,555,671✔
3082

3083
  tColDataClear(pColData);
47,560,456✔
3084
}
47,564,719✔
3085

3086
static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData, uint32_t nData) {
3087
  int32_t  code = 0;
2,147,483,647✔
3088
  uint32_t cvtNData = sizeof(uint64_t);
2,147,483,647✔
3089
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
3090
    // TODO
3091
    if (IS_STR_DATA_BLOB(pColData->type)) {
2,147,483,647✔
3092
      code = tRealloc((uint8_t **)(&pColData->aOffset), ((int64_t)(pColData->nVal + 1)) << 2);
23,968,854✔
3093
      if (code) goto _exit;
34,060,928✔
3094
      pColData->aOffset[pColData->nVal] = pColData->nData;
34,060,928✔
3095

3096
      if (nData) {
34,060,928✔
3097
        code = tRealloc(&pColData->pData, pColData->nData + BSE_SEQUECE_SIZE);
30,693,130✔
3098
        if (code) goto _exit;
30,693,130✔
3099
        (void)memcpy(pColData->pData + pColData->nData, pData, BSE_SEQUECE_SIZE);
30,693,130✔
3100
        pColData->nData += BSE_SEQUECE_SIZE;
30,693,130✔
3101
      } else {
3102
        // uint64_t zero = 0;
3103
        // (void)memcpy(pColData->pData + pColData->nData, &zero, BSE_SEQUECE_SIZE);
3104
        // pColData->nData += BSE_SEQUECE_SIZE;
3105
      }
3106

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

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

3134
_exit:
2,147,483,647✔
3135
  return code;
2,147,483,647✔
3136
}
3137
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, uint8_t *pData, uint32_t nData) {
731,972,568✔
3138
  pColData->flag = HAS_VALUE;
732,075,137✔
3139
  pColData->numOfValue++;
732,119,337✔
3140
  return tColDataPutValue(pColData, pData, nData);
732,128,439✔
3141
}
3142
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, uint8_t *pData, uint32_t nData) {
18,589,161✔
3143
  pColData->flag = HAS_NONE;
18,589,161✔
3144
  pColData->numOfNone++;
18,589,161✔
3145
  pColData->nVal++;
18,589,161✔
3146
  return 0;
18,589,161✔
3147
}
3148
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, uint8_t *pData, uint32_t nData) {
35,616,905✔
3149
  pColData->flag = HAS_NULL;
35,641,714✔
3150
  pColData->numOfNull++;
35,642,254✔
3151
  pColData->nVal++;
35,638,598✔
3152
  return 0;
35,642,672✔
3153
}
3154
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,031,459✔
3155
  int32_t code = 0;
1,031,459✔
3156

3157
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
1,031,459✔
3158
  code = tRealloc(&pColData->pBitMap, nBit);
1,031,459✔
3159
  if (code) return code;
1,031,459✔
3160

3161
  memset(pColData->pBitMap, 0, nBit);
1,031,459✔
3162
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
1,031,459✔
3163

3164
  pColData->flag |= HAS_VALUE;
1,031,459✔
3165
  pColData->numOfValue++;
1,031,459✔
3166

3167
  if (pColData->nVal) {
1,031,459✔
3168
    if (IS_VAR_DATA_TYPE(pColData->type)) {
1,031,459✔
3169
      if (IS_STR_DATA_BLOB(pColData->type)) {
40,725✔
3170
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
×
3171
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
×
3172
        if (code) return code;
×
3173
        memset(pColData->aOffset, 0, nOffset);
×
3174

3175
      } else {
3176
        int32_t nOffset = sizeof(int32_t) * pColData->nVal;
40,725✔
3177
        code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
40,725✔
3178
        if (code) return code;
40,725✔
3179
        memset(pColData->aOffset, 0, nOffset);
40,725✔
3180
      }
3181
    } else {
3182
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
990,734✔
3183
      code = tRealloc(&pColData->pData, pColData->nData);
990,734✔
3184
      if (code) return code;
990,734✔
3185
      memset(pColData->pData, 0, pColData->nData);
990,734✔
3186
    }
3187
  }
3188

3189
  return tColDataPutValue(pColData, pData, nData);
1,031,459✔
3190
}
3191
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3192
  pColData->nVal++;
2,147,483,647✔
3193
  pColData->numOfNone++;
2,147,483,647✔
3194
  return 0;
2,147,483,647✔
3195
}
3196
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, uint8_t *pData, uint32_t nData) {
72,810✔
3197
  int32_t code = 0;
96,894✔
3198

3199
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
96,894✔
3200
  code = tRealloc(&pColData->pBitMap, nBit);
96,894✔
3201
  if (code) return code;
96,894✔
3202

3203
  memset(pColData->pBitMap, 0, nBit);
96,894✔
3204
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
96,894✔
3205

3206
  pColData->flag |= HAS_NULL;
96,894✔
3207
  pColData->numOfNull++;
96,894✔
3208
  pColData->nVal++;
96,894✔
3209

3210
  return code;
96,894✔
3211
}
3212
static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, uint8_t *pData, uint32_t nData) {
5,125,798✔
3213
  int32_t code = 0;
5,126,265✔
3214

3215
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
5,126,265✔
3216
  code = tRealloc(&pColData->pBitMap, nBit);
5,126,265✔
3217
  if (code) return code;
5,126,265✔
3218

3219
  memset(pColData->pBitMap, 0, nBit);
5,126,265✔
3220
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
5,126,265✔
3221

3222
  pColData->flag |= HAS_VALUE;
5,126,265✔
3223
  pColData->numOfValue++;
5,126,265✔
3224

3225
  if (pColData->nVal) {
5,126,265✔
3226
    if (IS_VAR_DATA_TYPE(pColData->type)) {
6,653,469✔
3227
      int32_t nOffset = sizeof(int32_t) * pColData->nVal;
1,527,204✔
3228
      code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset);
1,527,204✔
3229
      if (code) return code;
1,527,204✔
3230
      if (!IS_STR_DATA_BLOB(pColData->type)) {
1,527,204✔
3231
        memset(pColData->aOffset, 0, nOffset);
1,520,773✔
3232
      }
3233
    } else {
3234
      pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal;
3,599,060✔
3235
      code = tRealloc(&pColData->pData, pColData->nData);
3,599,061✔
3236
      if (code) return code;
3,599,061✔
3237
      memset(pColData->pData, 0, pColData->nData);
3,599,061✔
3238
    }
3239
  }
3240

3241
  return tColDataPutValue(pColData, pData, nData);
5,126,265✔
3242
}
3243
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, uint8_t *pData, uint32_t nData) {
20,008✔
3244
  int32_t code = 0;
20,008✔
3245

3246
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
20,008✔
3247
  code = tRealloc(&pColData->pBitMap, nBit);
20,008✔
3248
  if (code) return code;
20,008✔
3249

3250
  memset(pColData->pBitMap, 255, nBit);
20,008✔
3251
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
20,008✔
3252

3253
  pColData->flag |= HAS_NONE;
20,008✔
3254
  pColData->numOfNone++;
20,008✔
3255
  pColData->nVal++;
20,008✔
3256

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

3267
  pColData->flag |= HAS_VALUE;
×
3268
  pColData->numOfValue++;
×
3269

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

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

3279
  tFree(pColData->pBitMap);
×
3280
  pColData->pBitMap = pBitMap;
×
3281

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

3296
  return tColDataPutValue(pColData, pData, nData);
×
3297
}
3298
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, uint8_t *pData, uint32_t nData) {
840,264✔
3299
  int32_t code = 0;
840,264✔
3300

3301
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
840,264✔
3302
  if (code) return code;
840,264✔
3303

3304
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
840,264✔
3305
  pColData->numOfNone++;
840,264✔
3306
  pColData->nVal++;
840,264✔
3307

3308
  return code;
840,264✔
3309
}
3310
static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, uint8_t *pData, uint32_t nData) {
155,208✔
3311
  int32_t code = 0;
155,208✔
3312

3313
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
155,208✔
3314
  if (code) return code;
155,208✔
3315

3316
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
155,208✔
3317
  pColData->numOfNull++;
155,208✔
3318
  pColData->nVal++;
155,208✔
3319

3320
  return code;
155,208✔
3321
}
3322
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3323
  pColData->numOfValue++;
2,147,483,647✔
3324
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3325
}
3326
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, uint8_t *pData, uint32_t nData) {
8,962,240✔
3327
  int32_t code = 0;
8,962,240✔
3328

3329
  pColData->flag |= HAS_NONE;
8,962,240✔
3330
  pColData->numOfNone++;
8,962,240✔
3331

3332
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
8,962,240✔
3333
  code = tRealloc(&pColData->pBitMap, nBit);
8,962,240✔
3334
  if (code) return code;
8,962,240✔
3335

3336
  memset(pColData->pBitMap, 255, nBit);
8,962,240✔
3337
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
8,962,240✔
3338

3339
  return tColDataPutValue(pColData, NULL, 0);
8,962,240✔
3340
}
3341
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, uint8_t *pData, uint32_t nData) {
24,504,371✔
3342
  int32_t code = 0;
25,171,977✔
3343

3344
  pColData->flag |= HAS_NULL;
25,171,977✔
3345
  pColData->numOfNull++;
25,171,977✔
3346

3347
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
25,171,983✔
3348
  code = tRealloc(&pColData->pBitMap, nBit);
25,171,977✔
3349
  if (code) return code;
25,170,894✔
3350

3351
  memset(pColData->pBitMap, 255, nBit);
25,170,894✔
3352
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
25,171,980✔
3353

3354
  return tColDataPutValue(pColData, NULL, 0);
25,171,191✔
3355
}
3356
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, uint8_t *pData, uint32_t nData) {
379,247,583✔
3357
  int32_t code = 0;
379,248,261✔
3358

3359
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
379,248,261✔
3360
  if (code) return code;
379,254,693✔
3361

3362
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
379,254,693✔
3363
  pColData->numOfValue++;
379,267,528✔
3364

3365
  return tColDataPutValue(pColData, pData, nData);
379,225,781✔
3366
}
3367
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, uint8_t *pData, uint32_t nData) {
908,013,234✔
3368
  int32_t code = 0;
908,013,234✔
3369

3370
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
908,013,234✔
3371
  if (code) return code;
908,036,709✔
3372

3373
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
908,036,709✔
3374
  pColData->numOfNone++;
908,032,413✔
3375

3376
  return tColDataPutValue(pColData, NULL, 0);
908,033,248✔
3377
}
3378
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, uint8_t *pData, uint32_t nData) {
107,529✔
3379
  int32_t code = 0;
107,529✔
3380

3381
  pColData->flag |= HAS_NULL;
107,529✔
3382
  pColData->numOfNull++;
107,529✔
3383

3384
  uint8_t *pBitMap = NULL;
107,529✔
3385
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
107,529✔
3386
  if (code) return code;
107,529✔
3387

3388
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,594,793✔
3389
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0);
2,487,264✔
3390
  }
3391
  SET_BIT2_EX(pBitMap, pColData->nVal, 1);
107,529✔
3392

3393
  tFree(pColData->pBitMap);
107,529✔
3394
  pColData->pBitMap = pBitMap;
107,529✔
3395

3396
  return tColDataPutValue(pColData, NULL, 0);
107,529✔
3397
}
3398
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,147,483,647✔
3399
  int32_t code = 0;
2,147,483,647✔
3400

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

3406
  return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3407
}
3408
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, uint8_t *pData, uint32_t nData) {
2,216,494✔
3409
  int32_t code = 0;
2,216,494✔
3410

3411
  pColData->flag |= HAS_NONE;
2,216,494✔
3412
  pColData->numOfNone++;
2,216,494✔
3413

3414
  uint8_t *pBitMap = NULL;
2,216,494✔
3415
  code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1));
2,216,494✔
3416
  if (code) return code;
2,216,494✔
3417

3418
  for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
190,916,718✔
3419
    SET_BIT2_EX(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1);
188,700,224✔
3420
  }
3421
  SET_BIT2_EX(pBitMap, pColData->nVal, 0);
2,216,494✔
3422

3423
  tFree(pColData->pBitMap);
2,216,494✔
3424
  pColData->pBitMap = pBitMap;
2,216,494✔
3425

3426
  return tColDataPutValue(pColData, NULL, 0);
2,216,494✔
3427
}
3428
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, uint8_t *pData, uint32_t nData) {
1,578,605,377✔
3429
  int32_t code = 0;
1,580,083,739✔
3430

3431
  code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1));
1,580,083,739✔
3432
  if (code) return code;
1,580,297,924✔
3433
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
1,580,297,924✔
3434
  pColData->numOfNull++;
1,580,371,617✔
3435

3436
  return tColDataPutValue(pColData, NULL, 0);
1,580,322,295✔
3437
}
3438
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, uint8_t *pData, uint32_t nData) {
3,366,044✔
3439
  int32_t code = 0;
3,489,140✔
3440

3441
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
3,489,140✔
3442
  if (code) return code;
3,489,140✔
3443
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 2);
3,489,140✔
3444
  pColData->numOfValue++;
3,489,140✔
3445

3446
  return tColDataPutValue(pColData, pData, nData);
3,489,140✔
3447
}
3448
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, uint8_t *pData, uint32_t nData) {
347,075,480✔
3449
  int32_t code = 0;
347,075,480✔
3450

3451
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
347,075,480✔
3452
  if (code) return code;
347,075,480✔
3453
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 0);
347,075,480✔
3454
  pColData->numOfNone++;
347,075,480✔
3455

3456
  return tColDataPutValue(pColData, NULL, 0);
347,075,480✔
3457
}
3458
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, uint8_t *pData, uint32_t nData) {
404,149✔
3459
  int32_t code = 0;
404,149✔
3460

3461
  code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1));
404,149✔
3462
  if (code) return code;
404,149✔
3463
  SET_BIT2_EX(pColData->pBitMap, pColData->nVal, 1);
404,149✔
3464
  pColData->numOfNull++;
404,149✔
3465

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

3478
    //       VALUE                  NONE                     NULL
3479
};
3480

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

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

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

3508
_exit:
421✔
3509
  return code;
421✔
3510
}
3511

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

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

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

3539
  pColData->flag |= HAS_VALUE;
×
3540
  pColData->numOfValue++;
×
3541

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

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

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

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

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

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

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

3588
  pColData->flag |= HAS_VALUE;
×
3589
  pColData->numOfValue++;
×
3590

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

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

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

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

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

3627
  pColData->flag |= HAS_VALUE;
×
3628
  pColData->numOfValue++;
×
3629

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

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

3639
  tFree(pColData->pBitMap);
×
3640
  pColData->pBitMap = pBitMap;
×
3641

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

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

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

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

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

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

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

3685
  pColData->flag |= HAS_NONE;
×
3686
  pColData->numOfNone++;
×
3687

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

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

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

3700
  pColData->flag |= HAS_NULL;
116✔
3701
  pColData->numOfNull++;
116✔
3702

3703
  int32_t nBit = BIT1_SIZE(pColData->nVal + 1);
116✔
3704
  code = tRealloc(&pColData->pBitMap, nBit);
116✔
3705
  if (code) return code;
116✔
3706

3707
  memset(pColData->pBitMap, 255, nBit);
116✔
3708
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
116✔
3709

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

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

3718
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 1);
×
3719
  pColData->numOfValue++;
×
3720

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

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

3729
  SET_BIT1_EX(pColData->pBitMap, pColData->nVal, 0);
×
3730
  pColData->numOfNone++;
×
3731

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

3737
  pColData->flag |= HAS_NULL;
×
3738
  pColData->numOfNull++;
×
3739

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

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

3749
  tFree(pColData->pBitMap);
×
3750
  pColData->pBitMap = pBitMap;
×
3751

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

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

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

3767
  pColData->flag |= HAS_NONE;
×
3768
  pColData->numOfNone++;
×
3769

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

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

3779
  tFree(pColData->pBitMap);
×
3780
  pColData->pBitMap = pBitMap;
×
3781

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

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

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

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

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

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

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

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

3822
  return tColDataPutValueBlob(pArg, pColData, NULL, 0);
×
3823
}
3824

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

3844
static FORCE_INLINE int32_t tColDataUpdateValue10(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,438✔
3845
  pColData->numOfNone--;
3,438✔
3846
  pColData->nVal--;
3,438✔
3847
  if (pColData->numOfNone) {
3,438✔
3848
    return tColDataAppendValue10(pColData, pData, nData);
×
3849
  } else {
3850
    pColData->flag = 0;
3,438✔
3851
    return tColDataAppendValue00(pColData, pData, nData);
3,438✔
3852
  }
3853
}
3854
static FORCE_INLINE int32_t tColDataUpdateValue12(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
27,678✔
3855
  pColData->numOfNone--;
27,678✔
3856
  pColData->nVal--;
27,678✔
3857
  if (pColData->numOfNone) {
27,678✔
3858
    return tColDataAppendValue12(pColData, pData, nData);
24,084✔
3859
  } else {
3860
    pColData->flag = 0;
3,594✔
3861
    return tColDataAppendValue02(pColData, pData, nData);
3,594✔
3862
  }
3863
  return 0;
3864
}
3865
static FORCE_INLINE int32_t tColDataUpdateValue20(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
99,596✔
3866
  if (forward) {
99,596✔
3867
    pColData->numOfNull--;
99,596✔
3868
    pColData->nVal--;
99,596✔
3869
    if (pColData->numOfNull) {
99,596✔
3870
      return tColDataAppendValue20(pColData, pData, nData);
465✔
3871
    } else {
3872
      pColData->flag = 0;
99,131✔
3873
      return tColDataAppendValue00(pColData, pData, nData);
99,131✔
3874
    }
3875
  }
3876
  return 0;
×
3877
}
3878
static FORCE_INLINE int32_t tColDataUpdateValue30(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
×
3879
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
×
3880
    pColData->numOfNone--;
×
3881
    pColData->nVal--;
×
3882
    if (pColData->numOfNone) {
×
3883
      return tColDataAppendValue30(pColData, pData, nData);
×
3884
    } else {
3885
      pColData->flag = HAS_NULL;
×
3886
      return tColDataAppendValue20(pColData, pData, nData);
×
3887
    }
3888
  } else if (forward) {  // NULL ==> VALUE
×
3889
    pColData->numOfNull--;
×
3890
    pColData->nVal--;
×
3891
    if (pColData->numOfNull) {
×
3892
      return tColDataAppendValue30(pColData, pData, nData);
×
3893
    } else {
3894
      pColData->flag = HAS_NONE;
×
3895
      return tColDataAppendValue10(pColData, pData, nData);
×
3896
    }
3897
  }
3898
  return 0;
×
3899
}
3900
static FORCE_INLINE int32_t tColDataUpdateValue32(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
349,156✔
3901
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
349,156✔
3902
    pColData->numOfNone--;
349,156✔
3903
    pColData->numOfNull++;
349,156✔
3904
    if (pColData->numOfNone) {
349,156✔
3905
      SET_BIT1(pColData->pBitMap, pColData->nVal - 1, 1);
337,176✔
3906
    } else {
3907
      pColData->flag = HAS_NULL;
11,980✔
3908
    }
3909
  }
3910
  return 0;
349,156✔
3911
}
3912
static FORCE_INLINE int32_t tColDataUpdateValue40(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
2,147,483,647✔
3913
  if (forward) {  // VALUE ==> VALUE
2,147,483,647✔
3914
    pColData->nVal--;
2,147,483,647✔
3915
    if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
3916
      pColData->nData = pColData->aOffset[pColData->nVal];
1,876,242,059✔
3917
    } else {
3918
      pColData->nData -= TYPE_BYTES[pColData->type];
2,147,483,647✔
3919
    }
3920
    return tColDataPutValue(pColData, pData, nData);
2,147,483,647✔
3921
  }
3922
  return 0;
×
3923
}
3924
static FORCE_INLINE int32_t tColDataUpdateValue42(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
664,138✔
3925
  if (forward) {  // VALUE ==> NULL
664,138✔
3926
    pColData->numOfValue--;
664,138✔
3927
    pColData->nVal--;
664,138✔
3928
    if (pColData->numOfValue) {
664,138✔
3929
      if (IS_VAR_DATA_TYPE(pColData->type)) {
642,923✔
3930
        pColData->nData = pColData->aOffset[pColData->nVal];
187,463✔
3931
      } else {
3932
        pColData->nData -= TYPE_BYTES[pColData->type];
455,460✔
3933
      }
3934
      return tColDataAppendValue42(pColData, pData, nData);
642,923✔
3935
    } else {
3936
      pColData->flag = 0;
21,215✔
3937
      pColData->nData = 0;
21,215✔
3938
      return tColDataAppendValue02(pColData, pData, nData);
21,215✔
3939
    }
3940
  }
3941
  return 0;
×
3942
}
3943
static FORCE_INLINE int32_t tColDataUpdateValue50(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
2,493,212✔
3944
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> VALUE
2,493,212✔
3945
    pColData->numOfNone--;
133,800✔
3946
    pColData->nVal--;
133,800✔
3947
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
133,800✔
3948
      pColData->nData -= TYPE_BYTES[pColData->type];
133,800✔
3949
    }
3950
    if (pColData->numOfNone) {
133,800✔
3951
      return tColDataAppendValue50(pColData, pData, nData);
×
3952
    } else {
3953
      pColData->flag = HAS_VALUE;
133,800✔
3954
      return tColDataAppendValue40(pColData, pData, nData);
133,800✔
3955
    }
3956
  } else if (forward) {  // VALUE ==> VALUE
2,359,412✔
3957
    pColData->nVal--;
2,359,412✔
3958
    if (IS_VAR_DATA_TYPE(pColData->type)) {
2,359,412✔
3959
      pColData->nData = pColData->aOffset[pColData->nVal];
336,924✔
3960
    } else {
3961
      pColData->nData -= TYPE_BYTES[pColData->type];
2,022,488✔
3962
    }
3963
    return tColDataPutValue(pColData, pData, nData);
2,359,412✔
3964
  }
3965
  return 0;
×
3966
}
3967
static FORCE_INLINE int32_t tColDataUpdateValue52(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
24,683✔
3968
  if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NONE ==> NULL
24,683✔
3969
    pColData->numOfNone--;
24,683✔
3970
    pColData->nVal--;
24,683✔
3971
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
24,683✔
3972
      pColData->nData -= TYPE_BYTES[pColData->type];
16,655✔
3973
    }
3974
    if (pColData->numOfNone) {
24,683✔
3975
      return tColDataAppendValue52(pColData, pData, nData);
×
3976
    } else {
3977
      pColData->flag = HAS_VALUE;
24,683✔
3978
      return tColDataAppendValue42(pColData, pData, nData);
24,683✔
3979
    }
3980
  } else if (forward) {  // VALUE ==> NULL
×
3981
    pColData->numOfValue--;
×
3982
    pColData->nVal--;
×
3983
    if (pColData->numOfValue) {
×
3984
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
3985
        pColData->nData = pColData->aOffset[pColData->nVal];
×
3986
      } else {
3987
        pColData->nData -= TYPE_BYTES[pColData->type];
×
3988
      }
3989
      return tColDataAppendValue52(pColData, pData, nData);
×
3990
    } else {
3991
      pColData->flag = HAS_NONE;
×
3992
      pColData->nData = 0;
×
3993
      return tColDataAppendValue12(pColData, pData, nData);
×
3994
    }
3995
  }
3996
  return 0;
×
3997
}
3998
static FORCE_INLINE int32_t tColDataUpdateValue60(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
4,949,483✔
3999
  if (forward) {
4,949,483✔
4000
    if (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 0) {  // NULL ==> VALUE
4,949,484✔
4001
      pColData->numOfNull--;
2,495,708✔
4002
      pColData->nVal--;
2,495,709✔
4003
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
2,495,708✔
4004
        pColData->nData -= TYPE_BYTES[pColData->type];
2,059,865✔
4005
      }
4006
      if (pColData->numOfNull) {
2,495,709✔
4007
        return tColDataAppendValue60(pColData, pData, nData);
77,773✔
4008
      } else {
4009
        pColData->flag = HAS_VALUE;
2,417,937✔
4010
        return tColDataAppendValue40(pColData, pData, nData);
2,417,937✔
4011
      }
4012
    } else {  // VALUE ==> VALUE
4013
      pColData->nVal--;
2,453,979✔
4014
      if (IS_VAR_DATA_TYPE(pColData->type)) {
2,453,987✔
4015
        pColData->nData = pColData->aOffset[pColData->nVal];
462,674✔
4016
      } else {
4017
        pColData->nData -= TYPE_BYTES[pColData->type];
1,991,416✔
4018
      }
4019
      return tColDataPutValue(pColData, pData, nData);
2,454,430✔
4020
    }
4021
  }
4022
  return 0;
×
4023
}
4024
static FORCE_INLINE int32_t tColDataUpdateValue62(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
1,734,079✔
4025
  if (forward && (GET_BIT1(pColData->pBitMap, pColData->nVal - 1) == 1)) {  // VALUE ==> NULL
1,734,079✔
4026
    pColData->numOfValue--;
1,080,912✔
4027
    pColData->nVal--;
1,080,912✔
4028
    if (pColData->numOfValue) {
1,080,912✔
4029
      if (IS_VAR_DATA_TYPE(pColData->type)) {
1,080,910✔
4030
        pColData->nData = pColData->aOffset[pColData->nVal];
125,548✔
4031
      } else {
4032
        pColData->nData -= TYPE_BYTES[pColData->type];
955,362✔
4033
      }
4034
      return tColDataAppendValue62(pColData, pData, nData);
1,080,242✔
4035
    } else {
4036
      pColData->flag = HAS_NULL;
2✔
4037
      pColData->nData = 0;
2✔
4038
      return tColDataAppendValue20(pColData, pData, nData);
2✔
4039
    }
4040
  }
4041
  return 0;
653,167✔
4042
}
4043
static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
339,134✔
4044
  int32_t code = 0;
339,134✔
4045

4046
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
339,134✔
4047
  if (bv == 0) {  // NONE ==> VALUE
339,134✔
4048
    pColData->numOfNone--;
80,280✔
4049
    pColData->nVal--;
80,280✔
4050
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
80,280✔
4051
      pColData->nData -= TYPE_BYTES[pColData->type];
80,280✔
4052
    }
4053
    if (pColData->numOfNone) {
80,280✔
4054
      return tColDataAppendValue70(pColData, pData, nData);
80,280✔
4055
    } else {
4056
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
4057
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
×
4058
      }
4059
      pColData->flag = (HAS_VALUE | HAS_NULL);
×
4060
      return tColDataAppendValue60(pColData, pData, nData);
×
4061
    }
4062
  } else if (bv == 1) {  // NULL ==> VALUE
258,854✔
4063
    if (forward) {
43,494✔
4064
      pColData->numOfNull--;
43,494✔
4065
      pColData->nVal--;
43,494✔
4066
      if (!IS_VAR_DATA_TYPE(pColData->type)) {
43,494✔
4067
        pColData->nData -= TYPE_BYTES[pColData->type];
43,494✔
4068
      }
4069
      if (pColData->numOfNull) {
43,494✔
4070
        return tColDataAppendValue70(pColData, pData, nData);
42,816✔
4071
      } else {
4072
        for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
2,034✔
4073
          SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) ? 1 : 0);
1,356✔
4074
        }
4075
        pColData->flag = (HAS_VALUE | HAS_NONE);
678✔
4076
        return tColDataAppendValue50(pColData, pData, nData);
678✔
4077
      }
4078
    }
4079
  } else if (bv == 2) {  // VALUE ==> VALUE
215,360✔
4080
    if (forward) {
215,360✔
4081
      pColData->nVal--;
215,360✔
4082
      if (IS_VAR_DATA_TYPE(pColData->type)) {
215,360✔
4083
        pColData->nData = pColData->aOffset[pColData->nVal];
53,520✔
4084
      } else {
4085
        pColData->nData -= TYPE_BYTES[pColData->type];
161,840✔
4086
      }
4087
      return tColDataPutValue(pColData, pData, nData);
215,360✔
4088
    }
4089
  } else {
4090
    return TSDB_CODE_INVALID_PARA;
×
4091
  }
4092
  return 0;
×
4093
}
4094
static int32_t tColDataUpdateValue72(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
397,452✔
4095
  uint8_t bv = GET_BIT2(pColData->pBitMap, pColData->nVal - 1);
397,452✔
4096
  if (bv == 0) {  // NONE ==> NULL
397,452✔
4097
    pColData->numOfNone--;
397,452✔
4098
    pColData->nVal--;
397,452✔
4099
    if (!IS_VAR_DATA_TYPE(pColData->type)) {
397,452✔
4100
      pColData->nData -= TYPE_BYTES[pColData->type];
246,933✔
4101
    }
4102
    if (pColData->numOfNone) {
397,452✔
4103
      return tColDataAppendValue72(pColData, pData, nData);
×
4104
    } else {
4105
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
12,494,248✔
4106
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal) - 1);
12,096,796✔
4107
      }
4108
      pColData->flag = (HAS_VALUE | HAS_NULL);
397,452✔
4109
      return tColDataAppendValue62(pColData, pData, nData);
397,452✔
4110
    }
4111
  } else if (bv == 2 && forward) {  // VALUE ==> NULL
×
4112
    pColData->numOfValue--;
×
4113
    pColData->nVal--;
×
4114
    if (pColData->numOfValue) {
×
4115
      if (IS_VAR_DATA_TYPE(pColData->type)) {
×
4116
        pColData->nData = pColData->aOffset[pColData->nVal];
×
4117
      } else {
4118
        pColData->nData -= TYPE_BYTES[pColData->type];
×
4119
      }
4120
      return tColDataAppendValue72(pColData, pData, nData);
×
4121
    } else {
4122
      for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
4123
        SET_BIT1(pColData->pBitMap, iVal, GET_BIT2(pColData->pBitMap, iVal));
×
4124
      }
4125
      pColData->flag = (HAS_NULL | HAS_NONE);
×
4126
      pColData->nData = 0;
×
4127
      return tColDataAppendValue32(pColData, pData, nData);
×
4128
    }
4129
  }
4130
  return 0;
×
4131
}
4132
static FORCE_INLINE int32_t tColDataUpdateNothing(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) {
3,074,979✔
4133
  return 0;
3,074,979✔
4134
}
4135
static int32_t (*tColDataUpdateValueImpl[8][3])(SColData *pColData, uint8_t *pData, uint32_t nData, bool forward) = {
4136
    {NULL, NULL, NULL},                                                     // 0
4137
    {tColDataUpdateValue10, tColDataUpdateNothing, tColDataUpdateValue12},  // HAS_NONE
4138
    {tColDataUpdateValue20, tColDataUpdateNothing, tColDataUpdateNothing},  // HAS_NULL
4139
    {tColDataUpdateValue30, tColDataUpdateNothing, tColDataUpdateValue32},  // HAS_NULL|HAS_NONE
4140
    {tColDataUpdateValue40, tColDataUpdateNothing, tColDataUpdateValue42},  // HAS_VALUE
4141
    {tColDataUpdateValue50, tColDataUpdateNothing, tColDataUpdateValue52},  // HAS_VALUE|HAS_NONE
4142
    {tColDataUpdateValue60, tColDataUpdateNothing, tColDataUpdateValue62},  // HAS_VALUE|HAS_NULL
4143
    {tColDataUpdateValue70, tColDataUpdateNothing, tColDataUpdateValue72},  // HAS_VALUE|HAS_NULL|HAS_NONE
4144

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

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

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

4157
static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NONE
2,147,483,647✔
4158
  *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
2,147,483,647✔
4159
}
2,147,483,647✔
4160
static FORCE_INLINE void tColDataGetValue2(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_NULL
1,772,790,346✔
4161
  *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
1,772,790,346✔
4162
}
1,772,884,578✔
4163
static FORCE_INLINE void tColDataGetValue3(SColData *pColData, int32_t iVal,
6,625,982✔
4164
                                           SColVal *pColVal) {  // HAS_NULL|HAS_NONE
4165
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
6,625,982✔
4166
    case 0:
3,365,173✔
4167
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
3,365,173✔
4168
      break;
3,365,173✔
4169
    case 1:
3,260,809✔
4170
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
3,260,809✔
4171
      break;
3,260,809✔
4172
    default:
×
4173
      break;
×
4174
  }
4175
}
6,625,982✔
4176
static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SColVal *pColVal) {  // HAS_VALUE
2,147,483,647✔
4177
  SValue value = {.type = pColData->type};
2,147,483,647✔
4178
  if (IS_VAR_DATA_TYPE(pColData->type)) {
2,147,483,647✔
4179
    if (iVal + 1 < pColData->nVal) {
2,147,483,647✔
4180
      value.nData = pColData->aOffset[iVal + 1] - pColData->aOffset[iVal];
2,147,483,647✔
4181
    } else {
4182
      value.nData = pColData->nData - pColData->aOffset[iVal];
266,878,820✔
4183
    }
4184
    value.pData = pColData->pData + pColData->aOffset[iVal];
2,147,483,647✔
4185
  } else {
4186
    valueSetDatum(&value, pColData->type, pColData->pData + tDataTypes[pColData->type].bytes * iVal,
2,147,483,647✔
4187
                  tDataTypes[pColData->type].bytes);
2,147,483,647✔
4188
  }
4189
  *pColVal = COL_VAL_VALUE(pColData->cid, value);
2,147,483,647✔
4190
}
2,147,483,647✔
4191
static FORCE_INLINE void tColDataGetValue5(SColData *pColData, int32_t iVal,
2,147,483,647✔
4192
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NONE
4193
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
2,147,483,647✔
4194
    case 0:
1,176,910,675✔
4195
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
1,176,910,675✔
4196
      break;
1,176,747,975✔
4197
    case 1:
1,222,921,823✔
4198
      tColDataGetValue4(pColData, iVal, pColVal);
4199
      break;
1,222,678,527✔
4200
    default:
×
4201
      break;
×
4202
  }
4203
}
2,147,483,647✔
4204
static FORCE_INLINE void tColDataGetValue6(SColData *pColData, int32_t iVal,
2,147,483,647✔
4205
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL
4206
  switch (GET_BIT1(pColData->pBitMap, iVal)) {
2,147,483,647✔
4207
    case 0:
2,147,483,647✔
4208
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
2,147,483,647✔
4209
      break;
2,147,483,647✔
4210
    case 1:
2,147,483,647✔
4211
      tColDataGetValue4(pColData, iVal, pColVal);
4212
      break;
2,147,483,647✔
4213
    default:
×
4214
      break;
×
4215
  }
4216
}
2,147,483,647✔
4217
static FORCE_INLINE void tColDataGetValue7(SColData *pColData, int32_t iVal,
23,445,553✔
4218
                                           SColVal *pColVal) {  // HAS_VALUE|HAS_NULL|HAS_NONE
4219
  switch (GET_BIT2(pColData->pBitMap, iVal)) {
23,445,553✔
4220
    case 0:
4,327,596✔
4221
      *pColVal = COL_VAL_NONE(pColData->cid, pColData->type);
4,327,596✔
4222
      break;
4,325,589✔
4223
    case 1:
4,939,975✔
4224
      *pColVal = COL_VAL_NULL(pColData->cid, pColData->type);
4,939,975✔
4225
      break;
4,939,975✔
4226
    case 2:
14,174,637✔
4227
      tColDataGetValue4(pColData, iVal, pColVal);
4228
      break;
14,177,982✔
4229
    default:
×
4230
      break;
×
4231
  }
4232
}
23,443,546✔
4233
static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal *pColVal) = {
4234
    NULL,               // 0
4235
    tColDataGetValue1,  // HAS_NONE
4236
    tColDataGetValue2,  // HAS_NULL
4237
    tColDataGetValue3,  // HAS_NULL | HAS_NONE
4238
    tColDataGetValue4,  // HAS_VALUE
4239
    tColDataGetValue5,  // HAS_VALUE | HAS_NONE
4240
    tColDataGetValue6,  // HAS_VALUE | HAS_NULL
4241
    tColDataGetValue7   // HAS_VALUE | HAS_NULL | HAS_NONE
4242
};
4243
int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
2,147,483,647✔
4244
  if (iVal < 0 || iVal >= pColData->nVal ||
2,147,483,647✔
4245
      (pColData->flag <= 0 || pColData->flag >= sizeof(tColDataGetValueImpl) / POINTER_BYTES)) {
2,147,483,647✔
4246
    return TSDB_CODE_INVALID_PARA;
352✔
4247
  }
4248
  tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
2,147,483,647✔
4249
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
4250
}
4251

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

4273
int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) {
16,239,117✔
4274
  int32_t code = 0;
16,239,117✔
4275

4276
  *pColData = *pColDataFrom;
16,239,117✔
4277

4278
  // bitmap
4279
  switch (pColData->flag) {
16,239,489✔
4280
    case (HAS_NULL | HAS_NONE):
70,468✔
4281
    case (HAS_VALUE | HAS_NONE):
4282
    case (HAS_VALUE | HAS_NULL):
4283
      pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal));
70,468✔
4284
      if (pColData->pBitMap == NULL) {
70,468✔
4285
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4286
        goto _exit;
×
4287
      }
4288
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
70,468✔
4289
      break;
70,468✔
4290
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
4291
      pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
×
4292
      if (pColData->pBitMap == NULL) {
×
4293
        code = TSDB_CODE_OUT_OF_MEMORY;
×
4294
        goto _exit;
×
4295
      }
4296
      (void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
×
4297
      break;
×
4298
    default:
16,168,709✔
4299
      pColData->pBitMap = NULL;
16,168,709✔
4300
      break;
16,169,476✔
4301
  }
4302

4303
  // offset
4304
  if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) {
16,239,944✔
4305
    pColData->aOffset = xMalloc(arg, pColData->nVal << 2);
113,268✔
4306
    if (pColData->aOffset == NULL) {
113,268✔
4307
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4308
      goto _exit;
×
4309
    }
4310
    (void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
113,268✔
4311
  } else {
4312
    pColData->aOffset = NULL;
16,126,346✔
4313
  }
4314

4315
  // value
4316
  if (pColData->nData) {
16,239,963✔
4317
    pColData->pData = xMalloc(arg, pColData->nData);
16,192,423✔
4318
    if (pColData->pData == NULL) {
16,191,619✔
4319
      code = TSDB_CODE_OUT_OF_MEMORY;
×
4320
      goto _exit;
×
4321
    }
4322

4323
    (void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
16,192,051✔
4324
  } else {
4325
    pColData->pData = NULL;
46,796✔
4326
  }
4327

4328
_exit:
16,239,746✔
4329
  return code;
16,239,746✔
4330
}
4331

4332
int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer *output, SBuffer *assist) {
607,502,125✔
4333
  int32_t code;
4334
  SBuffer local;
607,496,501✔
4335

4336
  if (!(colData->nVal > 0)) {
607,538,539✔
4337
    return TSDB_CODE_INVALID_PARA;
×
4338
  }
4339

4340
  (*info) = (SColDataCompressInfo){
607,569,467✔
4341
      .cmprAlg = info->cmprAlg,
607,561,461✔
4342
      .columnFlag = colData->cflag,
607,542,240✔
4343
      .flag = colData->flag,
607,575,109✔
4344
      .dataType = colData->type,
607,578,819✔
4345
      .columnId = colData->cid,
607,581,828✔
4346
      .numOfData = colData->nVal,
607,522,595✔
4347
  };
4348

4349
  if (colData->flag == HAS_NONE || colData->flag == HAS_NULL) {
607,565,701✔
4350
    return 0;
20,422,478✔
4351
  }
4352

4353
  tBufferInit(&local);
4354
  if (assist == NULL) {
587,159,046✔
4355
    assist = &local;
×
4356
  }
4357

4358
  // bitmap
4359
  if (colData->flag != HAS_VALUE) {
587,159,046✔
4360
    if (colData->flag == (HAS_NONE | HAS_NULL | HAS_VALUE)) {
32,995,136✔
4361
      info->bitmapOriginalSize = BIT2_SIZE(colData->nVal);
1,899,133✔
4362
    } else {
4363
      info->bitmapOriginalSize = BIT1_SIZE(colData->nVal);
31,092,382✔
4364
    }
4365

4366
    SCompressInfo cinfo = {
32,991,792✔
4367
        .dataType = TSDB_DATA_TYPE_TINYINT,
4368
        .cmprAlg = info->cmprAlg,
32,992,497✔
4369
        .originalSize = info->bitmapOriginalSize,
32,992,977✔
4370
    };
4371

4372
    code = tCompressDataToBuffer(colData->pBitMap, &cinfo, output, assist);
32,992,510✔
4373
    if (code) {
32,994,991✔
4374
      tBufferDestroy(&local);
4375
      return code;
×
4376
    }
4377

4378
    info->bitmapCompressedSize = cinfo.compressedSize;
32,994,991✔
4379
  }
4380

4381
  if (colData->flag == (HAS_NONE | HAS_NULL)) {
587,144,800✔
4382
    tBufferDestroy(&local);
4383
    return 0;
104,819✔
4384
  }
4385

4386
  // offset
4387
  if (IS_VAR_DATA_TYPE(colData->type)) {
586,966,717✔
4388
    info->offsetOriginalSize = sizeof(int32_t) * info->numOfData;
94,097,024✔
4389

4390
    SCompressInfo cinfo = {
94,099,713✔
4391
        .dataType = TSDB_DATA_TYPE_INT,
4392
        .cmprAlg = info->cmprAlg,
94,104,269✔
4393
        .originalSize = info->offsetOriginalSize,
94,104,592✔
4394
    };
4395

4396
    code = tCompressDataToBuffer(colData->aOffset, &cinfo, output, assist);
94,098,078✔
4397
    if (code) {
94,105,481✔
4398
      tBufferDestroy(&local);
4399
      return code;
×
4400
    }
4401

4402
    info->offsetCompressedSize = cinfo.compressedSize;
94,105,481✔
4403
  }
4404

4405
  // data
4406
  if (colData->nData > 0) {
587,050,351✔
4407
    info->dataOriginalSize = colData->nData;
587,038,921✔
4408

4409
    SCompressInfo cinfo = {
587,038,390✔
4410
        .dataType = colData->type,
587,034,153✔
4411
        .cmprAlg = info->cmprAlg,
587,025,928✔
4412
        .originalSize = info->dataOriginalSize,
587,022,724✔
4413
    };
4414

4415
    code = tCompressDataToBuffer(colData->pData, &cinfo, output, assist);
587,023,447✔
4416
    if (code) {
587,002,114✔
4417
      tBufferDestroy(&local);
4418
      return code;
×
4419
    }
4420

4421
    info->dataCompressedSize = cinfo.compressedSize;
587,002,114✔
4422
  }
4423

4424
  tBufferDestroy(&local);
4425
  return 0;
586,997,901✔
4426
}
4427

4428
int32_t tColDataDecompress(void *input, SColDataCompressInfo *info, SColData *colData, SBuffer *assist) {
1,126,488,308✔
4429
  int32_t  code;
4430
  SBuffer  local;
1,126,483,412✔
4431
  uint8_t *data = (uint8_t *)input;
1,126,589,354✔
4432

4433
  tBufferInit(&local);
4434
  if (assist == NULL) {
1,126,615,961✔
4435
    assist = &local;
×
4436
  }
4437

4438
  tColDataClear(colData);
1,126,615,961✔
4439
  colData->cid = info->columnId;
1,126,605,724✔
4440
  colData->type = info->dataType;
1,126,613,103✔
4441
  colData->cflag = info->columnFlag;
1,126,608,268✔
4442
  colData->nVal = info->numOfData;
1,126,563,166✔
4443
  colData->flag = info->flag;
1,126,589,999✔
4444

4445
  if (info->flag == HAS_NONE || info->flag == HAS_NULL) {
1,126,520,780✔
4446
    goto _exit;
129,202,744✔
4447
  }
4448

4449
  // bitmap
4450
  if (info->bitmapOriginalSize > 0) {
997,400,684✔
4451
    SCompressInfo cinfo = {
201,563,543✔
4452
        .dataType = TSDB_DATA_TYPE_TINYINT,
4453
        .cmprAlg = info->cmprAlg,
201,571,845✔
4454
        .originalSize = info->bitmapOriginalSize,
201,574,321✔
4455
        .compressedSize = info->bitmapCompressedSize,
201,571,121✔
4456
    };
4457

4458
    code = tRealloc(&colData->pBitMap, cinfo.originalSize);
201,562,425✔
4459
    if (code) {
201,546,935✔
4460
      tBufferDestroy(&local);
4461
      return code;
×
4462
    }
4463

4464
    code = tDecompressData(data, &cinfo, colData->pBitMap, cinfo.originalSize, assist);
201,546,935✔
4465
    if (code) {
201,553,474✔
4466
      tBufferDestroy(&local);
4467
      return code;
×
4468
    }
4469

4470
    data += cinfo.compressedSize;
201,553,474✔
4471
  }
4472

4473
  if (info->flag == (HAS_NONE | HAS_NULL)) {
997,397,701✔
4474
    goto _exit;
202,038✔
4475
  }
4476

4477
  // offset
4478
  if (info->offsetOriginalSize > 0) {
997,196,292✔
4479
    SCompressInfo cinfo = {
215,054,365✔
4480
        .cmprAlg = info->cmprAlg,
215,057,001✔
4481
        .dataType = TSDB_DATA_TYPE_INT,
4482
        .originalSize = info->offsetOriginalSize,
215,039,826✔
4483
        .compressedSize = info->offsetCompressedSize,
215,039,307✔
4484
    };
4485

4486
    code = tRealloc((uint8_t **)&colData->aOffset, cinfo.originalSize);
215,047,556✔
4487
    if (code) {
215,028,612✔
4488
      tBufferDestroy(&local);
4489
      return code;
×
4490
    }
4491

4492
    code = tDecompressData(data, &cinfo, colData->aOffset, cinfo.originalSize, assist);
215,028,612✔
4493
    if (code) {
215,038,135✔
4494
      tBufferDestroy(&local);
4495
      return code;
×
4496
    }
4497

4498
    data += cinfo.compressedSize;
215,038,135✔
4499
  }
4500

4501
  // data
4502
  if (info->dataOriginalSize > 0) {
997,177,417✔
4503
    colData->nData = info->dataOriginalSize;
997,117,111✔
4504

4505
    SCompressInfo cinfo = {
997,114,971✔
4506
        .cmprAlg = info->cmprAlg,
1,994,300,071✔
4507
        .dataType = colData->type,
997,099,714✔
4508
        .originalSize = info->dataOriginalSize,
997,121,750✔
4509
        .compressedSize = info->dataCompressedSize,
997,116,983✔
4510
    };
4511

4512
    code = tRealloc((uint8_t **)&colData->pData, cinfo.originalSize);
997,124,668✔
4513
    if (code) {
997,069,672✔
4514
      tBufferDestroy(&local);
4515
      return code;
×
4516
    }
4517

4518
    code = tDecompressData(data, &cinfo, colData->pData, cinfo.originalSize, assist);
997,069,672✔
4519
    if (code) {
997,116,804✔
4520
      tBufferDestroy(&local);
4521
      return code;
×
4522
    }
4523

4524
    data += cinfo.compressedSize;
997,116,804✔
4525
  }
4526

4527
_exit:
1,126,654,604✔
4528
  switch (colData->flag) {
1,126,623,804✔
4529
    case HAS_NONE:
89,254,095✔
4530
      colData->numOfNone = colData->nVal;
89,254,095✔
4531
      break;
89,250,532✔
4532
    case HAS_NULL:
39,939,798✔
4533
      colData->numOfNull = colData->nVal;
39,939,798✔
4534
      break;
39,944,520✔
4535
    case HAS_VALUE:
795,770,230✔
4536
      colData->numOfValue = colData->nVal;
795,770,230✔
4537
      break;
795,847,101✔
4538
    default:
201,543,677✔
4539
      for (int32_t i = 0; i < colData->nVal; i++) {
2,147,483,647✔
4540
        uint8_t bitValue = tColDataGetBitValue(colData, i);
2,147,483,647✔
4541
        if (bitValue == 0) {
2,147,483,647✔
4542
          colData->numOfNone++;
1,068,416,933✔
4543
        } else if (bitValue == 1) {
2,147,483,647✔
4544
          colData->numOfNull++;
2,147,483,647✔
4545
        } else {
4546
          colData->numOfValue++;
2,147,483,647✔
4547
        }
4548
      }
4549
  }
4550
  tBufferDestroy(&local);
4551
  return 0;
1,126,521,701✔
4552
}
4553

4554
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
259,142✔
4555
                                    char *data) {
4556
  int32_t code = 0;
259,142✔
4557
  if (data == NULL) {
259,142✔
4558
    if (pColData->cflag & COL_IS_KEY) {
7,074✔
4559
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4560
    } else {
4561
      for (int32_t i = 0; i < nRows; ++i) {
15,556✔
4562
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
8,482✔
4563
      }
4564
    }
4565
    goto _exit;
7,074✔
4566
  }
4567

4568
  if (IS_VAR_DATA_TYPE(type)) {  // var-length data type
252,068✔
4569
    if (!IS_STR_DATA_BLOB(type)) {
48,443✔
4570
      for (int32_t i = 0; i < nRows; ++i) {
130,682✔
4571
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
82,239✔
4572
        if (offset == -1) {
82,239✔
4573
          if (pColData->cflag & COL_IS_KEY) {
×
4574
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4575
            goto _exit;
×
4576
          }
4577
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4578
            goto _exit;
×
4579
          }
4580
        } else {
4581
          if (varDataTLen(data + offset) > bytes || (type == TSDB_DATA_TYPE_NCHAR && varDataLen(data + offset) % TSDB_NCHAR_SIZE != 0)) {
82,239✔
4582
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d", (int)varDataTLen(data + offset),
×
4583
                   bytes);
4584
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4585
            goto _exit;
×
4586
          }
4587
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
164,478✔
4588
                                                                        varDataLen(data + offset));
82,239✔
4589
        }
4590
      }
4591
    } else {
4592
      for (int32_t i = 0; i < nRows; ++i) {
×
4593
        int32_t offset = *((int32_t *)lengthOrbitmap + i);
×
4594
        if (offset == -1) {
×
4595
          if (pColData->cflag & COL_IS_KEY) {
×
4596
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4597
            goto _exit;
×
4598
          }
4599
          if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) {
×
4600
            goto _exit;
×
4601
          }
4602
        } else {
4603
          if (blobDataTLen(data + offset) > TSDB_MAX_BLOB_LEN) {
×
4604
            uError("var data length invalid, varDataTLen(data + offset):%d > bytes:%d",
×
4605
                   (int)blobDataTLen(data + offset), bytes);
4606
            code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4607
            goto _exit;
×
4608
          }
4609
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)blobDataVal(data + offset),
×
4610
                                                                        blobDataLen(data + offset));
×
4611
        }
4612
      }
4613
    }
4614
  } else {  // fixed-length data type
4615
    bool allValue = true;
203,625✔
4616
    bool allNull = true;
203,625✔
4617
    for (int32_t i = 0; i < nRows; ++i) {
561,128✔
4618
      if (!BMIsNull(lengthOrbitmap, i)) {
357,503✔
4619
        allNull = false;
272,879✔
4620
      } else {
4621
        allValue = false;
84,624✔
4622
      }
4623
    }
4624
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
203,625✔
4625
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4626
      goto _exit;
×
4627
    }
4628

4629
    if (allValue) {
203,625✔
4630
      // optimize (todo)
4631
      for (int32_t i = 0; i < nRows; ++i) {
434,033✔
4632
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
267,610✔
4633
      }
4634
    } else if (allNull) {
37,202✔
4635
      // optimize (todo)
4636
      for (int32_t i = 0; i < nRows; ++i) {
98,943✔
4637
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
65,610✔
4638
        if (code) goto _exit;
65,610✔
4639
      }
4640
    } else {
4641
      for (int32_t i = 0; i < nRows; ++i) {
28,152✔
4642
        if (BMIsNull(lengthOrbitmap, i)) {
24,283✔
4643
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
19,014✔
4644
          if (code) goto _exit;
19,014✔
4645
        } else {
4646
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)data + bytes * i, bytes);
5,269✔
4647
        }
4648
      }
4649
    }
4650
  }
4651

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

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

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

4753
_exit:
×
4754
  return code;
×
4755
}
4756

4757
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen, initGeosFn igeos,
23,029,470✔
4758
                               checkWKBGeometryFn cgeos) {
4759
  int32_t code = 0;
23,029,470✔
4760

4761
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
23,029,470✔
4762
    if (!(pColData->type == pBind->buffer_type)) {
23,038,330✔
4763
      return TSDB_CODE_INVALID_PARA;
×
4764
    }
4765
  }
4766

4767
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
23,047,570✔
4768
    if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
27,044✔
4769
      code = igeos();
1,476✔
4770
      if (code) {
1,476✔
4771
        return code;
×
4772
      }
4773
    }
4774
    for (int32_t i = 0; i < pBind->num; ++i) {
1,537,138✔
4775
      if (pBind->is_null && pBind->is_null[i]) {
1,515,722✔
4776
        if (pColData->cflag & COL_IS_KEY) {
698,452✔
4777
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
1,468✔
4778
          goto _exit;
1,468✔
4779
        }
4780
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
696,984✔
4781
        if (code) goto _exit;
696,984✔
4782
      } else if (pBind->length[i] > buffMaxLen) {
817,270✔
4783
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4784
      } else {
4785
        if (pColData->type == TSDB_DATA_TYPE_GEOMETRY) {
817,270✔
4786
          code = cgeos((char *)pBind->buffer + pBind->buffer_length * i, (size_t)pBind->length[i]);
19,130✔
4787
          if (code) {
19,130✔
4788
            uError("stmt col[%d] bind geometry wrong format", i);
106✔
4789
            goto _exit;
106✔
4790
          }
4791
        }
4792
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
1,616,856✔
4793
            pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
817,164✔
4794
      }
4795
    }
4796
  } else {  // fixed-length data type
4797
    bool allValue;
4798
    bool allNull;
4799
    if (pBind->is_null) {
23,011,774✔
4800
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
15,370,377✔
4801
      allNull = (same && pBind->is_null[0] != 0);
15,368,133✔
4802
      allValue = (same && pBind->is_null[0] == 0);
15,367,327✔
4803
    } else {
4804
      allNull = false;
7,639,123✔
4805
      allValue = true;
7,639,123✔
4806
    }
4807

4808
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
23,007,600✔
4809
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
2,936✔
4810
      goto _exit;
2,936✔
4811
    }
4812

4813
    if (allValue) {
23,004,262✔
4814
      // optimize (todo)
4815
      for (int32_t i = 0; i < pBind->num; ++i) {
2,147,483,647✔
4816
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
2,147,483,647✔
4817
            pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
2,147,483,647✔
4818
      }
4819
    } else if (allNull) {
27,185✔
4820
      // optimize (todo)
4821
      for (int32_t i = 0; i < pBind->num; ++i) {
1,354✔
4822
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
677✔
4823
        if (code) goto _exit;
677✔
4824
      }
4825
    } else {
4826
      for (int32_t i = 0; i < pBind->num; ++i) {
9,077,940✔
4827
        if (pBind->is_null[i]) {
9,051,432✔
4828
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
4,001,622✔
4829
          if (code) goto _exit;
4,001,622✔
4830
        } else {
4831
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
10,099,620✔
4832
              pColData, (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i, pBind->buffer_length);
5,049,810✔
4833
        }
4834
      }
4835
    }
4836
  }
4837

4838
_exit:
10,982✔
4839
  return code;
23,052,447✔
4840
}
4841

4842
int32_t tColDataAddValueByBind2(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen) {
1,422,254✔
4843
  int32_t code = 0;
1,422,254✔
4844

4845
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
1,422,254✔
4846
    if (!(pColData->type == pBind->buffer_type)) {
1,414,842✔
4847
      return TSDB_CODE_INVALID_PARA;
×
4848
    }
4849
  }
4850

4851
  if (IS_VAR_DATA_TYPE(pColData->type)) {  // var-length data type
1,507,386✔
4852
    uint8_t *buf = pBind->buffer;
84,380✔
4853
    for (int32_t i = 0; i < pBind->num; ++i) {
217,953,530✔
4854
      if (pBind->is_null && pBind->is_null[i]) {
217,920,614✔
4855
        if (pColData->cflag & COL_IS_KEY) {
13,823,536✔
4856
          code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4857
          goto _exit;
×
4858
        }
4859
        if (pBind->is_null[i] == 1) {
13,823,935✔
4860
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
13,824,193✔
4861
          if (code) goto _exit;
13,826,241✔
4862
        } else {
4863
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4864
          if (code) goto _exit;
×
4865
        }
4866
      } else if (pBind->length[i] > buffMaxLen) {
204,157,751✔
4867
        return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4868
      } else {
4869
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
204,699,643✔
4870
        buf += pBind->length[i];
204,253,004✔
4871
      }
4872
    }
4873
  } else {  // fixed-length data type
4874
    bool allValue;
4875
    bool allNull;
4876
    bool allNone;
4877
    if (pBind->is_null) {
1,337,772✔
4878
      bool same = (memcmp(pBind->is_null, pBind->is_null + 1, pBind->num - 1) == 0);
1,313,160✔
4879
      allNull = (same && pBind->is_null[0] == 1);
1,313,619✔
4880
      allNone = (same && pBind->is_null[0] > 1);
1,313,542✔
4881
      allValue = (same && pBind->is_null[0] == 0);
1,313,286✔
4882
    } else {
4883
      allNull = false;
24,236✔
4884
      allNone = false;
24,236✔
4885
      allValue = true;
24,236✔
4886
    }
4887

4888
    if ((pColData->cflag & COL_IS_KEY) && !allValue) {
1,337,834✔
4889
      code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4890
      goto _exit;
×
4891
    }
4892

4893
    uint8_t *buf = pBind->buffer;
1,337,534✔
4894

4895
    if (allValue) {
1,337,100✔
4896
      // optimize (todo)
4897
      for (int32_t i = 0; i < pBind->num; ++i) {
951,018,493✔
4898
        uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
950,319,332✔
4899
        if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
950,551,499✔
4900
          *val = 1;
×
4901
        }
4902
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
950,171,552✔
4903
      }
4904
    } else if (allNull) {
79,095✔
4905
      // optimize (todo)
4906
      for (int32_t i = 0; i < pBind->num; ++i) {
15,750,080✔
4907
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
15,742,264✔
4908
        if (code) goto _exit;
15,742,264✔
4909
      }
4910
    } else if (allNone) {
71,279✔
4911
      // optimize (todo)
4912
      for (int32_t i = 0; i < pBind->num; ++i) {
×
4913
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4914
        if (code) goto _exit;
×
4915
      }
4916
    } else {
4917
      for (int32_t i = 0; i < pBind->num; ++i) {
737,500,153✔
4918
        if (pBind->is_null[i]) {
751,978,373✔
4919
          if (pBind->is_null[i] == 1) {
44,947,206✔
4920
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
44,954,231✔
4921
            if (code) goto _exit;
45,009,709✔
4922
          } else {
4923
            code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4924
            if (code) goto _exit;
×
4925
          }
4926
        } else {
4927
          uint8_t *val = (uint8_t *)pBind->buffer + TYPE_BYTES[pColData->type] * i;
717,424,689✔
4928
          if (TSDB_DATA_TYPE_BOOL == pColData->type && *val > 1) {
716,842,886✔
4929
            *val = 1;
×
4930
          }
4931

4932
          code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, val, TYPE_BYTES[pColData->type]);
719,196,095✔
4933
        }
4934
      }
4935
    }
4936
  }
4937

4938
_exit:
89,938✔
4939
  return code;
1,401,052✔
4940
}
4941

4942
int32_t tColDataAddValueByBind2WithGeos(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
4,659✔
4943
                                        initGeosFn igeos, checkWKBGeometryFn cgeos) {
4944
  int32_t code = 0;
4,659✔
4945

4946
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
4,659✔
4947
    if (!(pColData->type == pBind->buffer_type)) {
4,659✔
4948
      return TSDB_CODE_INVALID_PARA;
×
4949
    }
4950
  }
4951

4952
  if (pColData->type != TSDB_DATA_TYPE_GEOMETRY) {
4,659✔
4953
    return TSDB_CODE_INVALID_OPTION;
×
4954
  }
4955

4956
  code = igeos();
4,659✔
4957
  if (code) {
4,659✔
4958
    return code;
×
4959
  }
4960

4961
  uint8_t *buf = pBind->buffer;
4,659✔
4962
  for (int32_t i = 0; i < pBind->num; ++i) {
2,564,445✔
4963
    if (pBind->is_null && pBind->is_null[i]) {
2,559,985✔
4964
      if (pColData->cflag & COL_IS_KEY) {
402✔
4965
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
4966
        goto _exit;
×
4967
      }
4968
      if (pBind->is_null[i] == 1) {
402✔
4969
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
402✔
4970
        if (code) goto _exit;
402✔
4971
      } else {
4972
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
×
4973
        if (code) goto _exit;
×
4974
      }
4975
    } else if (pBind->length[i] > buffMaxLen) {
2,559,675✔
4976
      return TSDB_CODE_PAR_VALUE_TOO_LONG;
×
4977
    } else {
4978
      code = cgeos(buf, pBind->length[i]);
2,560,681✔
4979
      if (code) {
2,551,564✔
4980
        uError("stmt2 col[%d] bind geometry with wrong format", i);
×
4981
        goto _exit;
×
4982
      }
4983
      code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, buf, pBind->length[i]);
2,551,564✔
4984
      buf += pBind->length[i];
2,558,886✔
4985
    }
4986
  }
4987

4988
_exit:
4,659✔
4989
  return code;
4,659✔
4990
}
4991

4992
int32_t tColDataAddValueByBind2WithBlob(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
439✔
4993
                                        SBlobSet *pBlobSet) {
4994
  int32_t code = 0;
439✔
4995

4996
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
439✔
4997
    if (!(pColData->type == pBind->buffer_type)) {
244✔
4998
      return TSDB_CODE_INVALID_PARA;
×
4999
    }
5000
  }
5001

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

5029
int32_t tColDataAddValueByBind2WithDecimal(SColData *pColData, TAOS_STMT2_BIND *pBind, int32_t buffMaxLen,
5,647✔
5030
                                           uint8_t precision, uint8_t scale) {
5031
  int32_t code = 0;
5,647✔
5032

5033
  if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
5,647✔
5034
    if (!(pColData->type == pBind->buffer_type)) {
5,189✔
5035
      return TSDB_CODE_INVALID_PARA;
×
5036
    }
5037
  }
5038

5039
  if (!IS_DECIMAL_TYPE(pColData->type)) {
5,646✔
5040
    return TSDB_CODE_INVALID_OPTION;
×
5041
  }
5042

5043
  uint8_t *buf = pBind->buffer;
5,646✔
5044
  for (int32_t i = 0; i < pBind->num; ++i) {
46,281,671✔
5045
    if (pBind->is_null && pBind->is_null[i]) {
46,397,644✔
5046
      if (pColData->cflag & COL_IS_KEY) {
2,336,380✔
5047
        code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5048
        goto _exit;
×
5049
      }
5050
      if (pBind->is_null[i] == 1) {
2,336,194✔
5051
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
2,336,089✔
5052
        if (code) goto _exit;
2,335,946✔
5053
      } else {
5054
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
202✔
5055
        if (code) goto _exit;
210✔
5056
      }
5057
    } else {
5058
      if (pColData->type == TSDB_DATA_TYPE_DECIMAL64) {
43,997,709✔
5059
        Decimal64 dec = {0};
22,103,437✔
5060
        int32_t   code = decimal64FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
22,102,337✔
5061
        buf += pBind->length[i];
22,020,150✔
5062
        if (TSDB_CODE_SUCCESS != code) {
22,028,084✔
5063
          return code;
×
5064
        }
5065
        int64_t tmp = DECIMAL64_GET_VALUE(&dec);
22,028,084✔
5066
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)&tmp,
22,030,450✔
5067
                                                                      TYPE_BYTES[pColData->type]);
22,031,354✔
5068
      } else if (pColData->type == TSDB_DATA_TYPE_DECIMAL) {
22,106,998✔
5069
        Decimal128 dec = {0};
22,045,647✔
5070
        int32_t    code = decimal128FromStr((char *)buf, pBind->length[i], precision, scale, &dec);
22,073,034✔
5071
        buf += pBind->length[i];
22,024,672✔
5072
        if (TSDB_CODE_SUCCESS != code) {
22,088,229✔
5073
          return code;
×
5074
        }
5075
        uint8_t *pV = taosMemCalloc(1, sizeof(Decimal128));
22,088,229✔
5076
        if (!pV) return terrno;
22,119,182✔
5077
        memcpy(pV, &dec, DECIMAL_WORD_NUM(Decimal128) * sizeof(DecimalWord));
22,119,182✔
5078
        code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, pV, TYPE_BYTES[pColData->type]);
22,127,316✔
5079
        taosMemoryFree(pV);
22,101,694✔
5080
      }
5081
    }
5082
  }
5083

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

5107
  int32_t code = 0;
1,242,956✔
5108
  int32_t numOfRows = -1;
1,242,956✔
5109
  SArray *colValArray, *bufArray;
5110
  SColVal colVal;
459,878✔
5111
  int32_t numOfFixedValue = 0;
1,242,896✔
5112
  int32_t lino = 0;
1,242,896✔
5113
  bool    hasDecimal128 = false;
1,242,956✔
5114

5115
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
1,242,956✔
5116
    return terrno;
×
5117
  }
5118
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
1,243,045✔
5119
    taosArrayDestroy(colValArray);
×
5120
    return terrno;
×
5121
  }
5122
  for (int i = 0; i < numOfInfos; ++i) {
12,218,716✔
5123
    if (parsedCols) {
10,976,312✔
5124
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
14,544✔
5125
      if (pParsedVal) {
14,544✔
5126
        continue;
3,030✔
5127
      }
5128
    }
5129
    if (numOfRows == -1) {
10,973,282✔
5130
      numOfRows = infos[i].bind->num;
1,242,860✔
5131
    }
5132

5133
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
21,946,012✔
5134
      taosArrayDestroy(colValArray);
×
5135
      taosArrayDestroy(bufArray);
×
5136
      return terrno;
×
5137
    }
5138
  }
5139

5140
  SRowKey rowKey, lastRowKey;
459,077✔
5141
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
15,192,980✔
5142
    taosArrayClear(colValArray);
13,956,538✔
5143
    numOfFixedValue = 0;
13,955,893✔
5144

5145
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
80,322,573✔
5146
      if (parsedCols) {
66,185,098✔
5147
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
15,756✔
5148
        if (pParsedVal) {
15,756✔
5149
          numOfFixedValue++;
3,132✔
5150
          colVal = *pParsedVal;
3,132✔
5151

5152
          if (taosArrayPush(colValArray, &colVal) == NULL) {
3,636✔
5153
            code = terrno;
×
5154
            TAOS_CHECK_GOTO(code, &lino, _exit);
202✔
5155
          }
5156
          continue;
3,636✔
5157
        }
5158
      }
5159

5160
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
66,194,930✔
5161
        if (infos[iInfo].bind->is_null[iRow] == 1) {
505✔
5162
          if (iInfo == 0) {
303✔
5163
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
101✔
5164
            TAOS_CHECK_GOTO(code, &lino, _exit);
101✔
5165
          }
5166
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
202✔
5167
        } else {
5168
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
202✔
5169
        }
5170
      } else {
5171
        SValue value = {
66,218,482✔
5172
            .type = infos[iInfo].type,
66,190,167✔
5173
        };
5174
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
66,254,752✔
5175
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
5,416,386✔
5176
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5177
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5178
            value.nData = length;
×
5179
            if (value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE) > TSDB_MAX_BLOB_LEN) {
×
5180
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5181
              uError("stmt2 bind col:%d, row:%d length:%d  greater than blob maximum length: %d", iInfo, iRow,
×
5182
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), TSDB_MAX_BLOB_LEN);
5183
              goto _exit;
101✔
5184
            }
5185
            value.pData = *data;
×
5186
            *data += length;
×
5187
          } else {
5188
            int32_t   length = infos[iInfo].bind->length[iRow];
5,486,360✔
5189
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
5,487,302✔
5190
            value.nData = length;
5,488,850✔
5191
            if (value.nData + VARSTR_HEADER_SIZE > infos[iInfo].bytes) {
5,488,850✔
5192
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5193
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum length: %d", iInfo, iRow,
×
5194
                     value.nData + (uint32_t)(VARSTR_HEADER_SIZE), infos[iInfo].bytes);
5195
              goto _exit;
×
5196
            }
5197
            value.pData = *data;
5,487,630✔
5198
            *data += length;
5,486,887✔
5199
          }
5200
          // value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
5201
        } else {
5202
          if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL) {
60,896,684✔
5203
            if (!pSchemaExt) {
404✔
5204
              uError("stmt2 decimal128 type without ext schema info, cannot parse decimal values");
×
5205
              code = TSDB_CODE_DECIMAL_PARSE_ERROR;
×
5206
              goto _exit;
×
5207
            }
5208
            uint8_t precision = 0, scale = 0;
404✔
5209
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
404✔
5210
            Decimal128 dec = {0};
404✔
5211
            uint8_t  **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
404✔
5212
            int32_t    length = infos[iInfo].bind->length[iRow];
404✔
5213
            code = decimal128FromStr(*(char **)data, length, precision, scale, &dec);
404✔
5214
            *data += length;
404✔
5215
            hasDecimal128 = true;
404✔
5216
            TAOS_CHECK_GOTO(code, &lino, _exit);
404✔
5217

5218
            // precision check
5219
            // scale auto fit
5220

5221
            code = decimal128ToDataVal(&dec, &value);
404✔
5222
            TAOS_CHECK_GOTO(code, &lino, _exit);
404✔
5223

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

5239
            code = decimal64ToDataVal(&dec, &value);
404✔
5240
            TAOS_CHECK_GOTO(code, &lino, _exit);
404✔
5241

5242
          } else {
5243
            uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
60,883,435✔
5244
            if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
60,894,874✔
5245
              *val = 1;
×
5246
            }
5247
            valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
60,894,874✔
5248
          }
5249
        }
5250
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
66,444,977✔
5251
      }
5252
      if (taosArrayPush(colValArray, &colVal) == NULL) {
66,363,044✔
5253
        code = terrno;
×
5254
        goto _exit;
×
5255
      }
5256
    }
5257

5258
    SRow *row;
3,208,285✔
5259

5260
    if (hasBlob == 0) {
14,055,606✔
5261
      SRowBuildScanInfo sinfo = {0};
13,950,196✔
5262
      code = tRowBuild(colValArray, pTSchema, &row, &sinfo);
13,951,275✔
5263
      TAOS_CHECK_GOTO(code, &lino, _exit);
13,947,078✔
5264
    } else {
5265
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
106,092✔
5266
      code = tRowBuildWithBlob(colValArray, pTSchema, &row, NULL, &sinfo);
106,092✔
5267
      TAOS_CHECK_GOTO(code, &lino, _exit);
×
5268
    }
5269

5270
    if ((taosArrayPush(rowArray, &row)) == NULL) {
13,942,947✔
5271
      code = terrno;
×
5272
      goto _exit;
×
5273
    }
5274

5275
    // fix decimal memory leak
5276
    if (hasDecimal128) {
13,942,947✔
5277
      int32_t num = taosArrayGetSize(colValArray);
404✔
5278
      for (int32_t i = 0; i < num; ++i) {
1,616✔
5279
        SColVal *pCol = taosArrayGet(colValArray, i);
1,212✔
5280
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
1,212✔
5281
          taosMemoryFreeClear(pCol->value.pData);
404✔
5282
        }
5283
      }
5284
      hasDecimal128 = false;
404✔
5285
    }
5286

5287
    if (pOrdered && pDupTs) {
13,942,947✔
5288
      tRowGetKey(row, &rowKey);
27,893,567✔
5289
      if (iRow == 0) {
13,952,167✔
5290
        *pOrdered = true;
1,242,641✔
5291
        *pDupTs = false;
1,242,641✔
5292
      } else {
5293
        if (*pOrdered) {
12,709,526✔
5294
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
12,652,867✔
5295
          *pOrdered = (res >= 0);
12,652,867✔
5296
          if (!*pDupTs) {
12,706,690✔
5297
            *pDupTs = (res == 0);
12,707,107✔
5298
          }
5299
        }
5300
      }
5301
      lastRowKey = rowKey;
13,949,712✔
5302
    }
5303
  }
5304
_exit:
1,236,404✔
5305
  if (code != 0) {
1,236,524✔
5306
    if (hasDecimal128) {
202✔
5307
      int32_t num = taosArrayGetSize(colValArray);
×
5308
      for (int32_t i = 0; i < num; ++i) {
×
5309
        SColVal *pCol = taosArrayGet(colValArray, i);
×
5310
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
×
5311
          taosMemoryFreeClear(pCol->value.pData);
×
5312
        }
5313
      }
5314
    }
5315
    uError("tRowBuildFromBind2 failed at line %d, ErrCode=0x%x", lino, code);
202✔
5316
  }
5317
  taosArrayDestroy(colValArray);
1,236,524✔
5318
  taosArrayDestroy(bufArray);
1,243,016✔
5319
  return code;
1,243,444✔
5320
}
5321
/* build rows to `rowArray` from bind
5322
 * `infos` is the bind information array
5323
 * `numOfInfos` is the number of bind information
5324
 * `infoSorted` is whether the bind information is sorted by column id
5325
 * `pTSchema` is the schema of the table
5326
 * `rowArray` is the array to store the rows
5327
 * `pOrdered` is the pointer to store ordered
5328
 * `pDupTs` is the pointer to store duplicateTs
5329
 */
5330
int32_t tRowBuildFromBind2WithBlob(SBindInfo2 *infos, int32_t numOfInfos, SSHashObj *parsedCols, bool infoSorted,
101✔
5331
                                   const STSchema *pTSchema, const SSchemaExt *pSchemaExt, SArray *rowArray,
5332
                                   bool *pOrdered, bool *pDupTs, SBlobSet *pBlobSet) {
5333
  if (infos == NULL || numOfInfos <= 0 || pTSchema == NULL || numOfInfos > pTSchema->numOfCols || rowArray == NULL) {
101✔
5334
    return TSDB_CODE_INVALID_PARA;
×
5335
  }
5336
  int8_t hasBlob = schemaHasBlob(pTSchema);
101✔
5337
  if (!infoSorted) {
101✔
5338
    taosqsort_r(infos, numOfInfos, sizeof(SBindInfo2), NULL, tBindInfoCompare);
×
5339
  }
5340

5341
  int32_t code = 0;
101✔
5342
  int32_t numOfRows = -1;
101✔
5343
  SArray *colValArray, *bufArray;
5344
  SColVal colVal;
×
5345
  int32_t numOfFixedValue = 0;
101✔
5346
  int32_t lino = 0;
101✔
5347
  bool    hasDecimal128 = false;
101✔
5348

5349
  if ((colValArray = taosArrayInit(numOfInfos, sizeof(SColVal))) == NULL) {
101✔
5350
    return terrno;
×
5351
  }
5352
  if ((bufArray = taosArrayInit(numOfInfos, sizeof(uint8_t *))) == NULL) {
101✔
5353
    taosArrayDestroy(colValArray);
×
5354
    return terrno;
×
5355
  }
5356
  for (int i = 0; i < numOfInfos; ++i) {
404✔
5357
    if (parsedCols) {
303✔
5358
      SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[i].columnId, sizeof(int16_t));
×
5359
      if (pParsedVal) {
×
5360
        continue;
×
5361
      }
5362
    }
5363
    if (numOfRows == -1) {
303✔
5364
      numOfRows = infos[i].bind->num;
101✔
5365
    }
5366

5367
    if (!taosArrayPush(bufArray, &infos[i].bind->buffer)) {
606✔
5368
      taosArrayDestroy(colValArray);
×
5369
      taosArrayDestroy(bufArray);
×
5370
      return terrno;
×
5371
    }
5372
  }
5373

5374
  SRowKey rowKey, lastRowKey;
×
5375
  for (int32_t iRow = 0; iRow < numOfRows; iRow++) {
404✔
5376
    taosArrayClear(colValArray);
303✔
5377
    numOfFixedValue = 0;
303✔
5378

5379
    for (int32_t iInfo = 0; iInfo < numOfInfos; iInfo++) {
1,212✔
5380
      if (parsedCols) {
909✔
5381
        SColVal *pParsedVal = tSimpleHashGet(parsedCols, &infos[iInfo].columnId, sizeof(int16_t));
×
5382
        if (pParsedVal) {
×
5383
          numOfFixedValue++;
×
5384
          colVal = *pParsedVal;
×
5385

5386
          if (taosArrayPush(colValArray, &colVal) == NULL) {
×
5387
            code = terrno;
×
5388
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5389
          }
5390
          continue;
×
5391
        }
5392
      }
5393

5394
      if (infos[iInfo].bind->is_null && infos[iInfo].bind->is_null[iRow]) {
909✔
5395
        if (infos[iInfo].bind->is_null[iRow] == 1) {
202✔
5396
          if (iInfo == 0) {
202✔
5397
            code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5398
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5399
          }
5400
          colVal = COL_VAL_NULL(infos[iInfo].columnId, infos[iInfo].type);
202✔
5401
        } else {
5402
          colVal = COL_VAL_NONE(infos[iInfo].columnId, infos[iInfo].type);
×
5403
        }
5404
      } else {
5405
        SValue value = {
707✔
5406
            .type = infos[iInfo].type,
707✔
5407
        };
5408
        if (IS_VAR_DATA_TYPE(infos[iInfo].type)) {
707✔
5409
          if (IS_STR_DATA_BLOB(infos[iInfo].type)) {
202✔
5410
            int32_t   length = infos[iInfo].bind->length[iRow];
202✔
5411
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
202✔
5412
            value.nData = length;
202✔
5413
            if (value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE) > TSDB_MAX_BLOB_LEN) {
202✔
5414
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5415
              uError("stmt2 bind col:%d, row:%d length:%d  greater than blob maximum length: %d", iInfo, iRow,
×
5416
                     value.nData + (uint32_t)(BLOBSTR_HEADER_SIZE), TSDB_MAX_BLOB_LEN);
5417
              goto _exit;
×
5418
            }
5419
            value.pData = *data;
202✔
5420
            *data += length;
202✔
5421
          } else {
5422
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5423
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5424
            value.nData = length;
×
5425
            if (value.nData + VARSTR_HEADER_SIZE > infos[iInfo].bytes) {
×
5426
              code = TSDB_CODE_PAR_VALUE_TOO_LONG;
×
5427
              uError("stmt2 bind col:%d, row:%d length:%d  greater than type maximum length: %d", iInfo, iRow,
×
5428
                     value.nData + (uint32_t)(VARSTR_HEADER_SIZE), infos[iInfo].bytes);
5429
              goto _exit;
×
5430
            }
5431
            value.pData = *data;
×
5432
            *data += length;
×
5433
          }
5434
        } else {
5435
          if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL) {
505✔
5436
            if (!pSchemaExt) {
202✔
5437
              uError("stmt2 decimal128 type without ext schema info, cannot parse decimal values");
×
5438
              code = TSDB_CODE_DECIMAL_PARSE_ERROR;
×
5439
              goto _exit;
×
5440
            }
5441
            uint8_t precision = 0, scale = 0;
202✔
5442
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
202✔
5443
            Decimal128 dec = {0};
202✔
5444
            uint8_t  **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
202✔
5445
            int32_t    length = infos[iInfo].bind->length[iRow];
202✔
5446
            code = decimal128FromStr(*(char **)data, length, precision, scale, &dec);
202✔
5447
            *data += length;
202✔
5448
            hasDecimal128 = true;
202✔
5449
            TAOS_CHECK_GOTO(code, &lino, _exit);
202✔
5450

5451
            code = decimal128ToDataVal(&dec, &value);
202✔
5452
            TAOS_CHECK_GOTO(code, &lino, _exit);
202✔
5453

5454
          } else if (infos[iInfo].type == TSDB_DATA_TYPE_DECIMAL64) {
303✔
5455
            if (!pSchemaExt) {
×
5456
              uError("stmt2 decimal64 type without ext schema info, cannot parse decimal values");
×
5457
              code = TSDB_CODE_DECIMAL_PARSE_ERROR;
×
5458
              goto _exit;
×
5459
            }
5460
            uint8_t precision = 0, scale = 0;
×
5461
            decimalFromTypeMod(pSchemaExt[iInfo].typeMod, &precision, &scale);
×
5462
            Decimal64 dec = {0};
×
5463
            uint8_t **data = &((uint8_t **)TARRAY_DATA(bufArray))[iInfo - numOfFixedValue];
×
5464
            int32_t   length = infos[iInfo].bind->length[iRow];
×
5465
            code = decimal64FromStr(*(char **)data, length, precision, scale, &dec);
×
5466
            *data += length;
×
5467
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5468

5469
            code = decimal64ToDataVal(&dec, &value);
×
5470
            TAOS_CHECK_GOTO(code, &lino, _exit);
×
5471

5472
          } else {
5473
            uint8_t *val = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bytes * iRow;
303✔
5474
            if (TSDB_DATA_TYPE_BOOL == value.type && *val > 1) {
303✔
5475
              *val = 1;
×
5476
            }
5477
            valueSetDatum(&value, infos[iInfo].type, val, infos[iInfo].bytes);
303✔
5478
          }
5479
        }
5480
        colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
707✔
5481
      }
5482
      if (taosArrayPush(colValArray, &colVal) == NULL) {
909✔
5483
        code = terrno;
×
5484
        goto _exit;
×
5485
      }
5486
    }
5487

5488
    SRow *row;
×
5489

5490
    if (hasBlob == 0) {
303✔
5491
      SRowBuildScanInfo sinfo = {0};
×
5492
      code = tRowBuild(colValArray, pTSchema, &row, &sinfo);
×
5493
      TAOS_CHECK_GOTO(code, &lino, _exit);
×
5494
    } else {
5495
      SRowBuildScanInfo sinfo = {.hasBlob = 1, .scanType = ROW_BUILD_UPDATE};
303✔
5496
      code = tRowBuildWithBlob(colValArray, pTSchema, &row, pBlobSet, &sinfo);
303✔
5497
      TAOS_CHECK_GOTO(code, &lino, _exit);
303✔
5498
    }
5499

5500
    if ((taosArrayPush(rowArray, &row)) == NULL) {
303✔
5501
      code = terrno;
×
5502
      goto _exit;
×
5503
    }
5504

5505
    // fix decimal memory leak
5506
    if (hasDecimal128) {
303✔
5507
      int32_t num = taosArrayGetSize(colValArray);
202✔
5508
      for (int32_t i = 0; i < num; ++i) {
808✔
5509
        SColVal *pCol = taosArrayGet(colValArray, i);
606✔
5510
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
606✔
5511
          taosMemoryFreeClear(pCol->value.pData);
202✔
5512
        }
5513
      }
5514
      hasDecimal128 = false;
202✔
5515
    }
5516

5517
    if (pOrdered && pDupTs) {
303✔
5518
      tRowGetKey(row, &rowKey);
606✔
5519
      if (iRow == 0) {
303✔
5520
        *pOrdered = true;
101✔
5521
        *pDupTs = false;
101✔
5522
      } else {
5523
        if (*pOrdered) {
202✔
5524
          int32_t res = tRowKeyCompare(&rowKey, &lastRowKey);
202✔
5525
          *pOrdered = (res >= 0);
202✔
5526
          if (!*pDupTs) {
202✔
5527
            *pDupTs = (res == 0);
202✔
5528
          }
5529
        }
5530
      }
5531
      lastRowKey = rowKey;
303✔
5532
    }
5533
  }
5534
_exit:
101✔
5535
  if (code != 0) {
101✔
5536
    if (hasDecimal128) {
×
5537
      int32_t num = taosArrayGetSize(colValArray);
×
5538
      for (int32_t i = 0; i < num; ++i) {
×
5539
        SColVal *pCol = taosArrayGet(colValArray, i);
×
5540
        if (pCol->value.type == TSDB_DATA_TYPE_DECIMAL) {
×
5541
          taosMemoryFreeClear(pCol->value.pData);
×
5542
        }
5543
      }
5544
    }
5545
    uError("tRowBuildFromBind2WithBlob failed at line %d, ErrCode=0x%x", lino, code);
×
5546
  }
5547
  taosArrayDestroy(colValArray);
101✔
5548
  taosArrayDestroy(bufArray);
101✔
5549
  return code;
101✔
5550
}
5551

5552
static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) {
48,428,733✔
5553
  int32_t code = TSDB_CODE_SUCCESS;
48,428,733✔
5554

5555
  if (IS_VAR_DATA_TYPE(pToColData->type)) {
48,428,733✔
5556
    int32_t nData = (iFromRow < pFromColData->nVal - 1)
6,111,226✔
5557
                        ? pFromColData->aOffset[iFromRow + 1] - pFromColData->aOffset[iFromRow]
5,494,404✔
5558
                        : pFromColData->nData - pFromColData->aOffset[iFromRow];
11,605,630✔
5559
    if (iToRow == 0) {
6,111,226✔
5560
      pToColData->aOffset[iToRow] = 0;
18,618✔
5561
    }
5562

5563
    if (iToRow < pToColData->nVal - 1) {
6,111,226✔
5564
      pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
6,095,424✔
5565
    }
5566

5567
    (void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
6,111,226✔
5568
                 nData);
5569
  } else {
5570
    (void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
42,317,507✔
5571
                 &pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
42,317,507✔
5572
  }
5573
  return code;
48,428,733✔
5574
}
5575

5576
static int32_t tColDataCopyRowSingleCol(SColData *pFromColData, int32_t iFromRow, SColData *pToColData,
50,168,689✔
5577
                                        int32_t iToRow) {
5578
  int32_t code = TSDB_CODE_SUCCESS;
50,168,689✔
5579
  int     bit_val = 0;
50,168,689✔
5580

5581
  switch (pFromColData->flag) {
50,168,689✔
5582
    case HAS_NONE: {
×
5583
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5584
    } break;
×
5585
    case HAS_NULL: {
1,739,956✔
5586
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
1,739,956✔
5587
    } break;
1,739,956✔
5588
    case (HAS_NULL | HAS_NONE): {
×
5589
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5590
      if (0 == bit_val)
×
5591
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5592
      else
5593
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
×
5594
    } break;
×
5595
    case HAS_VALUE: {
5,532,106✔
5596
      ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
5,532,106✔
5597
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
5,532,106✔
5598
    } break;
5,532,106✔
5599
    case (HAS_VALUE | HAS_NONE): {
×
5600
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
×
5601
      if (0 == bit_val)
×
5602
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NONE);
×
5603
      else
5604
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
×
5605
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5606
    } break;
×
5607
    case (HAS_VALUE | HAS_NULL): {
42,896,627✔
5608
      bit_val = GET_BIT1(pFromColData->pBitMap, iFromRow);
42,896,627✔
5609
      if (0 == bit_val)
42,896,627✔
5610
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_NULL);
19,368,170✔
5611
      else
5612
        ROW_SET_BITMAP(pToColData->pBitMap, pToColData->flag, iToRow, BIT_FLG_VALUE);
23,528,457✔
5613
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
42,896,627✔
5614
    } break;
42,896,627✔
5615
    case (HAS_VALUE | HAS_NULL | HAS_NONE): {
×
5616
      SET_BIT2(pToColData->pBitMap, iToRow, GET_BIT2(pFromColData->pBitMap, iFromRow));
×
5617
      TAOS_CHECK_RETURN(tColDataCopyRowCell(pFromColData, iFromRow, pToColData, iToRow));
×
5618
    } break;
×
5619
    default:
×
5620
      return -1;
×
5621
  }
5622

5623
  return code;
50,168,689✔
5624
}
5625

5626
static int32_t tColDataCopyRow(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t iToRow,
3,162,930✔
5627
                               int32_t nColData) {
5628
  int32_t code = TSDB_CODE_SUCCESS;
3,162,930✔
5629

5630
  for (int32_t i = 0; i < nColData; i++) {
53,331,619✔
5631
    code = tColDataCopyRowSingleCol(&aFromColData[i], iFromRow, &aToColData[i], iToRow);
50,168,689✔
5632
    if (code != TSDB_CODE_SUCCESS) {
50,168,689✔
5633
      return code;
×
5634
    }
5635
  }
5636

5637
  return code;
3,162,930✔
5638
}
5639

5640
static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, SColData *aToColData, int32_t nColData) {
3,162,930✔
5641
  int32_t code = TSDB_CODE_SUCCESS;
3,162,930✔
5642

5643
  for (int32_t i = 0; i < nColData; i++) {
53,331,619✔
5644
    SColVal cv = {0};
50,168,689✔
5645
    code = tColDataGetValue(&aFromColData[i], iFromRow, &cv);
50,168,689✔
5646
    if (code != TSDB_CODE_SUCCESS) {
50,168,689✔
5647
      return code;
×
5648
    }
5649
    code = tColDataAppendValue(&aToColData[i], &cv);
50,168,689✔
5650
    if (code != TSDB_CODE_SUCCESS) {
50,168,689✔
5651
      return code;
×
5652
    }
5653
  }
5654

5655
  return code;
3,162,930✔
5656
}
5657

5658
void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key) {
2,147,483,647✔
5659
  SColVal cv;
2,147,483,647✔
5660

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

5664
  for (int i = 1; i < nColData; i++) {
2,147,483,647✔
5665
    if (aColData[i].cflag & COL_IS_KEY) {
2,147,483,647✔
5666
      tColDataGetValue4(&aColData[i], iRow, &cv);
1,884,826✔
5667
      key->pks[key->numOfPKs++] = cv.value;
1,884,797✔
5668
    } else {
5669
      break;
2,147,483,647✔
5670
    }
5671
  }
5672
}
2,147,483,647✔
5673

5674
static int32_t tColDataMergeSortMerge(SColData *aColData, int32_t start, int32_t mid, int32_t end, int32_t nColData) {
358,025✔
5675
  SColData *aDstColData = NULL;
358,025✔
5676
  int32_t   i = start, j = mid + 1, k = 0;
358,025✔
5677
  SRowKey   keyi, keyj;
357,520✔
5678

5679
  if (end > start) {
358,025✔
5680
    aDstColData = taosMemoryCalloc(1, sizeof(SColData) * nColData);
358,025✔
5681
    if (aDstColData == NULL) {
358,025✔
5682
      return terrno;
×
5683
    }
5684
    for (int c = 0; c < nColData; ++c) {
5,954,419✔
5685
      tColDataInit(&aDstColData[c], aColData[c].cid, aColData[c].type, aColData[c].cflag);
5,596,394✔
5686
    }
5687
  }
5688

5689
  tColDataArrGetRowKey(aColData, nColData, i, &keyi);
358,025✔
5690
  tColDataArrGetRowKey(aColData, nColData, j, &keyj);
358,025✔
5691
  while (i <= mid && j <= end) {
1,940,761✔
5692
    if (tRowKeyCompare(&keyi, &keyj) <= 0) {
1,582,736✔
5693
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
15,673✔
5694
      tColDataArrGetRowKey(aColData, nColData, i, &keyi);
15,673✔
5695
    } else {
5696
      TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
1,567,063✔
5697
      if (j <= end) tColDataArrGetRowKey(aColData, nColData, j, &keyj);
1,567,063✔
5698
    }
5699
  }
5700

5701
  while (i <= mid) {
1,926,056✔
5702
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, i++, aDstColData, nColData));
1,568,031✔
5703
  }
5704

5705
  while (j <= end) {
370,188✔
5706
    TAOS_CHECK_RETURN(tColDataCopyRowAppend(aColData, j++, aDstColData, nColData));
12,163✔
5707
  }
5708

5709
  for (i = start, k = 0; i <= end; ++i, ++k) {
3,520,955✔
5710
    TAOS_CHECK_RETURN(tColDataCopyRow(aDstColData, k, aColData, i, nColData));
3,162,930✔
5711
  }
5712

5713
  if (aDstColData) {
358,025✔
5714
    for (int32_t i = 0; i < nColData; i++) {
5,954,419✔
5715
      tColDataDestroy(&aDstColData[i]);
5,596,394✔
5716
    }
5717
    taosMemoryFree(aDstColData);
358,025✔
5718
  }
5719

5720
  return TSDB_CODE_SUCCESS;
358,025✔
5721
}
5722

5723
static int32_t tColDataMergeSort(SColData *aColData, int32_t start, int32_t end, int32_t nColData) {
719,339✔
5724
  int32_t ret = TSDB_CODE_SUCCESS;
719,339✔
5725
  int32_t mid;
5726

5727
  if (start >= end) {
719,339✔
5728
    return TSDB_CODE_SUCCESS;
361,314✔
5729
  }
5730

5731
  mid = (start + end) / 2;
358,025✔
5732

5733
  ret = tColDataMergeSort(aColData, start, mid, nColData);
358,025✔
5734
  if (ret != TSDB_CODE_SUCCESS) {
358,025✔
5735
    return ret;
×
5736
  }
5737

5738
  ret = tColDataMergeSort(aColData, mid + 1, end, nColData);
358,025✔
5739
  if (ret != TSDB_CODE_SUCCESS) {
358,025✔
5740
    return ret;
×
5741
  }
5742

5743
  return tColDataMergeSortMerge(aColData, start, mid, end, nColData);
358,025✔
5744
}
5745

5746
static int32_t tColDataSort(SColData *aColData, int32_t nColData) {
3,289✔
5747
  int32_t nVal = aColData[0].nVal;
3,289✔
5748

5749
  if (nVal < 2) return TSDB_CODE_SUCCESS;
3,289✔
5750

5751
  return tColDataMergeSort(aColData, 0, nVal - 1, nColData);
3,289✔
5752
}
5753

5754
static int32_t tColDataMerge(SArray **colArr) {
1,170✔
5755
  int32_t code = 0;
1,170✔
5756
  SArray *src = *colArr;
1,170✔
5757
  SArray *dst = NULL;
1,170✔
5758

5759
  dst = taosArrayInit(taosArrayGetSize(src), sizeof(SColData));
1,170✔
5760
  if (dst == NULL) {
1,170✔
5761
    return terrno;
×
5762
  }
5763

5764
  for (int32_t i = 0; i < taosArrayGetSize(src); i++) {
4,579✔
5765
    SColData *srcCol = taosArrayGet(src, i);
3,409✔
5766

5767
    SColData *dstCol = taosArrayReserve(dst, 1);
3,409✔
5768
    if (dstCol == NULL) {
3,409✔
5769
      code = terrno;
×
5770
      goto _exit;
×
5771
    }
5772
    tColDataInit(dstCol, srcCol->cid, srcCol->type, srcCol->cflag);
3,409✔
5773
  }
5774

5775
  int32_t numRows = ((SColData *)TARRAY_DATA(src))->nVal;
1,170✔
5776
  SRowKey lastKey;
1,069✔
5777
  for (int32_t i = 0; i < numRows; i++) {
3,914✔
5778
    SRowKey key;
2,138✔
5779
    tColDataArrGetRowKey((SColData *)TARRAY_DATA(src), taosArrayGetSize(src), i, &key);
2,744✔
5780

5781
    if (i == 0 || tRowKeyCompare(&key, &lastKey) != 0) {  // append new row
4,318✔
5782
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
4,882✔
5783
        SColData *srcCol = taosArrayGet(src, j);
3,611✔
5784
        SColData *dstCol = taosArrayGet(dst, j);
3,611✔
5785

5786
        SColVal cv;
3,207✔
5787
        code = tColDataGetValue(srcCol, i, &cv);
3,611✔
5788
        if (code != TSDB_CODE_SUCCESS) {
3,611✔
5789
          goto _exit;
×
5790
        }
5791
        code = tColDataAppendValue(dstCol, &cv);
3,611✔
5792
        if (code) {
3,611✔
5793
          goto _exit;
×
5794
        }
5795
      }
5796
      lastKey = key;
1,271✔
5797
    } else {  // update existing row
5798
      for (int32_t j = 0; j < taosArrayGetSize(src); j++) {
5,488✔
5799
        SColData *srcCol = taosArrayGet(src, j);
4,015✔
5800
        SColData *dstCol = taosArrayGet(dst, j);
4,015✔
5801

5802
        SColVal cv;
3,207✔
5803
        code = tColDataGetValue(srcCol, i, &cv);
4,015✔
5804
        if (code != TSDB_CODE_SUCCESS) {
4,015✔
5805
          goto _exit;
×
5806
        }
5807
        code = tColDataUpdateValue(dstCol, &cv, true);
4,015✔
5808
        if (code) {
4,015✔
5809
          goto _exit;
×
5810
        }
5811
      }
5812
    }
5813
  }
5814

5815
_exit:
1,170✔
5816
  if (code) {
1,170✔
5817
    taosArrayDestroyEx(dst, tColDataDestroy);
×
5818
  } else {
5819
    taosArrayDestroyEx(src, tColDataDestroy);
1,170✔
5820
    *colArr = dst;
1,170✔
5821
  }
5822
  return code;
1,170✔
5823
}
5824

5825
int32_t tColDataSortMerge(SArray **arr) {
7,912,486✔
5826
  SArray   *colDataArr = *arr;
7,912,486✔
5827
  int32_t   nColData = TARRAY_SIZE(colDataArr);
7,915,318✔
5828
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
7,916,826✔
5829

5830
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
7,915,796✔
5831
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5832
  }
5833
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
7,913,400✔
5834
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5835
  }
5836
  if (!(aColData[0].flag == HAS_VALUE)) {
7,912,285✔
5837
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5838
  }
5839

5840
  if (aColData[0].nVal <= 1) goto _exit;
7,915,283✔
5841

5842
  int8_t doSort = 0;
7,852,643✔
5843
  int8_t doMerge = 0;
7,852,643✔
5844
  // scan -------
5845
  SRowKey lastKey;
7,825,954✔
5846
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
7,852,165✔
5847
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
2,147,483,647✔
5848
    SRowKey key;
2,147,483,647✔
5849
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
2,147,483,647✔
5850

5851
    int32_t c = tRowKeyCompare(&lastKey, &key);
2,147,483,647✔
5852
    if (c < 0) {
2,147,483,647✔
5853
      lastKey = key;
2,147,483,647✔
5854
      continue;
2,147,483,647✔
5855
    } else if (c > 0) {
1,037,185✔
5856
      doSort = 1;
3,289✔
5857
      break;
3,289✔
5858
    } else {
5859
      doMerge = 1;
1,033,896✔
5860
    }
5861
  }
5862

5863
  // sort -------
5864
  if (doSort) {
9,253,806✔
5865
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
3,289✔
5866
  }
5867

5868
  if ((doMerge != 1) && (doSort == 1)) {
9,253,806✔
5869
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
3,289✔
5870
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
360,809✔
5871
      SRowKey key;
357,520✔
5872
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
357,621✔
5873

5874
      int32_t c = tRowKeyCompare(&lastKey, &key);
357,621✔
5875
      if (c == 0) {
357,621✔
5876
        doMerge = 1;
101✔
5877
        break;
101✔
5878
      }
5879
      lastKey = key;
357,520✔
5880
    }
5881
  }
5882

5883
  // merge -------
5884
  if (doMerge) {
7,858,028✔
5885
    int32_t code = tColDataMerge(arr);
1,170✔
5886
    if (code) return code;
1,170✔
5887
  }
5888

5889
_exit:
7,917,245✔
5890
  return 0;
7,918,049✔
5891
}
5892

5893
int32_t tColDataSortMergeWithBlob(SArray **arr, SBlobSet *pBlob) {
×
5894
  SArray   *colDataArr = *arr;
×
5895
  int32_t   nColData = TARRAY_SIZE(colDataArr);
×
5896
  SColData *aColData = (SColData *)TARRAY_DATA(colDataArr);
×
5897

5898
  if (!(aColData[0].type == TSDB_DATA_TYPE_TIMESTAMP)) {
×
5899
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5900
  }
5901
  if (!(aColData[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
5902
    return TSDB_CODE_PAR_INVALID_FIRST_COLUMN;
×
5903
  }
5904
  if (!(aColData[0].flag == HAS_VALUE)) {
×
5905
    return TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL;
×
5906
  }
5907

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

5910
  int8_t doSort = 0;
×
5911
  int8_t doMerge = 0;
×
5912
  // scan -------
5913
  SRowKey lastKey;
×
5914
  tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5915
  for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5916
    SRowKey key;
×
5917
    tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5918

5919
    int32_t c = tRowKeyCompare(&lastKey, &key);
×
5920
    if (c < 0) {
×
5921
      lastKey = key;
×
5922
      continue;
×
5923
    } else if (c > 0) {
×
5924
      doSort = 1;
×
5925
      break;
×
5926
    } else {
5927
      doMerge = 1;
×
5928
    }
5929
  }
5930
  if (doMerge || doSort) {
×
5931
    return TSDB_CODE_BLOB_NOT_SUPPORT;
×
5932
  }
5933
  // sort -------
5934
  if (doSort) {
×
5935
    TAOS_CHECK_RETURN(tColDataSort(aColData, nColData));
×
5936
  }
5937

5938
  if ((doMerge != 1) && (doSort == 1)) {
×
5939
    tColDataArrGetRowKey(aColData, nColData, 0, &lastKey);
×
5940
    for (int32_t iVal = 1; iVal < aColData[0].nVal; ++iVal) {
×
5941
      SRowKey key;
×
5942
      tColDataArrGetRowKey(aColData, nColData, iVal, &key);
×
5943

5944
      int32_t c = tRowKeyCompare(&lastKey, &key);
×
5945
      if (c == 0) {
×
5946
        doMerge = 1;
×
5947
        break;
×
5948
      }
5949
      lastKey = key;
×
5950
    }
5951
  }
5952

5953
  // merge -------
5954
  if (doMerge) {
×
5955
    int32_t code = tColDataMerge(arr);
×
5956
    if (code) return code;
×
5957
  }
5958

5959
_exit:
×
5960
  return 0;
×
5961
}
5962

5963
static int32_t tEncodeColDataVersion0(SEncoder *pEncoder, SColData *pColData) {
49,309,408✔
5964
  int32_t code = 0;
49,309,408✔
5965

5966
  if ((code = tEncodeI16v(pEncoder, pColData->cid))) return code;
98,633,279✔
5967
  if ((code = tEncodeI8(pEncoder, pColData->type))) return code;
98,648,912✔
5968
  if ((code = tEncodeI32v(pEncoder, pColData->nVal))) return code;
98,648,574✔
5969
  if ((code = tEncodeI8(pEncoder, pColData->flag))) return code;
98,644,243✔
5970

5971
  // bitmap
5972
  switch (pColData->flag) {
49,320,710✔
5973
    case (HAS_NULL | HAS_NONE):
260,297✔
5974
    case (HAS_VALUE | HAS_NONE):
5975
    case (HAS_VALUE | HAS_NULL):
5976
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
260,297✔
5977
      if (code) return code;
260,298✔
5978
      break;
260,298✔
5979
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
5980
      code = tEncodeFixed(pEncoder, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
×
5981
      if (code) return code;
×
5982
      break;
×
5983
    default:
49,052,404✔
5984
      break;
49,052,404✔
5985
  }
5986

5987
  // value
5988
  if (pColData->flag & HAS_VALUE) {
49,312,702✔
5989
    if (IS_VAR_DATA_TYPE(pColData->type)) {
49,227,463✔
5990
      code = tEncodeFixed(pEncoder, pColData->aOffset, pColData->nVal << 2);
291,467✔
5991
      if (code) return code;
296,582✔
5992

5993
      code = tEncodeI32v(pEncoder, pColData->nData);
296,582✔
5994
      if (code) return code;
296,527✔
5995

5996
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
296,527✔
5997
      if (code) return code;
296,646✔
5998
    } else {
5999
      code = tEncodeFixed(pEncoder, pColData->pData, pColData->nData);
48,934,514✔
6000
      if (code) return code;
48,907,000✔
6001
    }
6002
  }
6003

6004
  return code;
49,303,916✔
6005
}
6006

6007
static int32_t tDecodeColDataVersion0(SDecoder *pDecoder, SColData *pColData) {
34,347,929✔
6008
  int32_t code = 0;
34,347,929✔
6009

6010
  if ((code = tDecodeI16v(pDecoder, &pColData->cid))) return code;
68,698,918✔
6011
  if ((code = tDecodeI8(pDecoder, &pColData->type))) return code;
68,702,388✔
6012
  if ((code = tDecodeI32v(pDecoder, &pColData->nVal))) return code;
68,701,215✔
6013
  if ((code = tDecodeI8(pDecoder, &pColData->flag))) return code;
68,698,075✔
6014

6015
  if (pColData->type <= 0 || pColData->type >= TSDB_DATA_TYPE_MAX || pColData->flag <= 0 || pColData->flag >= 8) {
34,348,259✔
6016
    return TSDB_CODE_INVALID_PARA;
×
6017
  }
6018

6019
  // bitmap
6020
  switch (pColData->flag) {
34,349,449✔
6021
    case (HAS_NULL | HAS_NONE):
79,362✔
6022
    case (HAS_VALUE | HAS_NONE):
6023
    case (HAS_VALUE | HAS_NULL):
6024
      code = tDecodeBinaryWithSize(pDecoder, BIT1_SIZE(pColData->nVal), &pColData->pBitMap);
79,362✔
6025
      if (code) return code;
79,362✔
6026
      break;
79,362✔
6027
    case (HAS_VALUE | HAS_NULL | HAS_NONE):
×
6028
      code = tDecodeBinaryWithSize(pDecoder, BIT2_SIZE(pColData->nVal), &pColData->pBitMap);
×
6029
      if (code) return code;
×
6030
      break;
×
6031
    default:
34,268,634✔
6032
      break;
34,268,634✔
6033
  }
6034

6035
  // value
6036
  if (pColData->flag & HAS_VALUE) {
34,347,996✔
6037
    if (IS_VAR_DATA_TYPE(pColData->type)) {
34,294,411✔
6038
      code = tDecodeBinaryWithSize(pDecoder, pColData->nVal << 2, (uint8_t **)&pColData->aOffset);
159,266✔
6039
      if (code) return code;
170,158✔
6040

6041
      code = tDecodeI32v(pDecoder, &pColData->nData);
170,158✔
6042
      if (code) return code;
170,218✔
6043

6044
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
170,218✔
6045
      if (code) return code;
170,158✔
6046
    } else {
6047
      pColData->nData = TYPE_BYTES[pColData->type] * pColData->nVal;
34,120,398✔
6048
      code = tDecodeBinaryWithSize(pDecoder, pColData->nData, &pColData->pData);
34,125,205✔
6049
      if (code) return code;
34,123,570✔
6050
    }
6051
  }
6052
  pColData->cflag = 0;
34,348,434✔
6053

6054
  return code;
34,347,421✔
6055
}
6056

6057
static int32_t tEncodeColDataVersion1(SEncoder *pEncoder, SColData *pColData) {
49,309,678✔
6058
  int32_t code = tEncodeColDataVersion0(pEncoder, pColData);
49,309,678✔
6059
  if (code) return code;
49,301,231✔
6060
  return tEncodeI8(pEncoder, pColData->cflag);
98,616,385✔
6061
}
6062

6063
static int32_t tDecodeColDataVersion1(SDecoder *pDecoder, SColData *pColData) {
34,348,604✔
6064
  int32_t code = tDecodeColDataVersion0(pDecoder, pColData);
34,348,604✔
6065
  if (code) return code;
34,344,712✔
6066

6067
  code = tDecodeI8(pDecoder, &pColData->cflag);
34,344,712✔
6068
  return code;
34,349,170✔
6069
}
6070

6071
int32_t tEncodeColData(uint8_t version, SEncoder *pEncoder, SColData *pColData) {
49,292,126✔
6072
  if (version == 0) {
49,292,126✔
6073
    return tEncodeColDataVersion0(pEncoder, pColData);
×
6074
  } else if (version == 1) {
49,292,126✔
6075
    return tEncodeColDataVersion1(pEncoder, pColData);
×
6076
  } else if (version == 2) {
49,292,126✔
6077
    int32_t posStart = pEncoder->pos;
49,292,088✔
6078
    pEncoder->pos += INT_BYTES;
49,301,563✔
6079
    int32_t code = tEncodeColDataVersion1(pEncoder, pColData);
49,316,617✔
6080
    if (code) return code;
49,310,384✔
6081
    int32_t posEnd = pEncoder->pos;
49,310,384✔
6082
    int32_t pos = posEnd - posStart;
49,309,502✔
6083
    pEncoder->pos = posStart;
49,309,502✔
6084
    code = tEncodeI32(pEncoder, pos);
49,327,056✔
6085
    pEncoder->pos = posEnd;
49,327,056✔
6086
    return code;
49,329,470✔
6087
  } else {
6088
    return TSDB_CODE_INVALID_PARA;
351✔
6089
  }
6090
}
6091

6092
int32_t tDecodeColData(uint8_t version, SDecoder *pDecoder, SColData *pColData, bool jump) {
50,585,185✔
6093
  if (version == 0) {
50,585,185✔
6094
    return tDecodeColDataVersion0(pDecoder, pColData);
×
6095
  } else if (version == 1) {
50,585,185✔
6096
    return tDecodeColDataVersion1(pDecoder, pColData);
×
6097
  } else if (version == 2) {
50,585,185✔
6098
    if (jump) {
50,587,063✔
6099
      int32_t len = 0;
16,239,071✔
6100
      int32_t code = tDecodeI32(pDecoder, &len);
16,239,493✔
6101
      if (code) return code;
16,239,493✔
6102
      pDecoder->pos += (len - INT_BYTES);
16,239,493✔
6103
      return TSDB_CODE_SUCCESS;
16,239,433✔
6104
    } else {
6105
      pDecoder->pos += INT_BYTES;
34,347,992✔
6106
      return tDecodeColDataVersion1(pDecoder, pColData);
34,351,138✔
6107
    }    
6108
  } else {
6109
    return TSDB_CODE_INVALID_PARA;
×
6110
  }
6111
}
6112

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

6115
int32_t tDecodeRow(SDecoder *pDecoder, SRow **ppRow) {
2,147,483,647✔
6116
  if (ppRow == NULL) {
2,147,483,647✔
6117
    return TSDB_CODE_INVALID_PARA;
×
6118
  }
6119

6120
  if (pDecoder->pos + sizeof(SRow) > pDecoder->size) {
2,147,483,647✔
6121
    return TSDB_CODE_OUT_OF_RANGE;
×
6122
  }
6123

6124
  SRow *pRow = (SRow *)(pDecoder->data + pDecoder->pos);
2,147,483,647✔
6125
  return tDecodeBinaryWithSize(pDecoder, pRow->len, (uint8_t **)ppRow);
2,147,483,647✔
6126
}
6127

6128
int32_t tEncodeBlobSet(SEncoder *pEncoder, SBlobSet *pRow) {
103,710✔
6129
  int32_t code = 0;
103,710✔
6130
  int32_t lino = 0;
103,710✔
6131
  uint8_t compressed = 0;
103,710✔
6132
  int32_t compressSize = 0;
103,710✔
6133
  char   *p = NULL;
103,710✔
6134

6135
  TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pRow->type));
207,420✔
6136
  TAOS_CHECK_EXIT(tEncodeI64(pEncoder, pRow->len));
207,420✔
6137

6138
  int32_t nSeq = taosArrayGetSize(pRow->pSeqTable);
103,710✔
6139
  TAOS_CHECK_EXIT(tEncodeI32(pEncoder, nSeq));
103,710✔
6140

6141
  // if (pRow->type) {
6142
  void *pIter = taosHashIterate(pRow->pSeqToffset, NULL);
103,710✔
6143
  while (pIter) {
57,643,792✔
6144
    uint64_t seq = *(uint64_t *)taosHashGetKey(pIter, NULL);
57,540,082✔
6145
    int32_t  idx = *(int32_t *)pIter;
57,540,082✔
6146
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, seq));
57,540,082✔
6147
    TAOS_CHECK_EXIT(tEncodeI32(pEncoder, idx));
57,540,082✔
6148

6149
    pIter = taosHashIterate(pRow->pSeqToffset, pIter);
57,540,082✔
6150
  }
6151
  //}
6152
  for (int32_t i = 0; i < nSeq; i++) {
57,643,792✔
6153
    SBlobValue *p = taosArrayGet(pRow->pSeqTable, i);
57,540,082✔
6154
    TAOS_CHECK_EXIT(tEncodeU64(pEncoder, p->offset));
115,080,164✔
6155
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->len));
115,080,164✔
6156
    TAOS_CHECK_EXIT(tEncodeU32(pEncoder, p->dataOffset));
115,080,164✔
6157
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->nextRow));
115,080,164✔
6158
    TAOS_CHECK_EXIT(tEncodeI8(pEncoder, p->type));
115,080,164✔
6159
  }
6160

6161
  TAOS_CHECK_EXIT(tEncodeFixed(pEncoder, pRow->data, pRow->len));
207,420✔
6162

6163
_exit:
103,710✔
6164
  return code;
103,710✔
6165
}
6166

6167
int32_t tDecodeBlobSet(SDecoder *pDecoder, SBlobSet **pBlobSet) {
51,724✔
6168
  int32_t    code = 0;
51,724✔
6169
  int32_t    lino = 0;
51,724✔
6170
  int32_t    nSeq = 0;
51,724✔
6171
  uint8_t    compressd = 0;
51,724✔
6172
  int32_t    compressSize = 0;
51,724✔
6173
  SBlobSet  *pBlob = taosMemCalloc(1, sizeof(SBlobSet));
51,724✔
6174
  if (pBlob == NULL) {
51,724✔
6175
    TAOS_CHECK_EXIT(terrno);
×
6176
  }
6177
  TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &pBlob->type));
103,448✔
6178
  TAOS_CHECK_EXIT(tDecodeI64(pDecoder, &pBlob->len));
103,448✔
6179

6180
  TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &nSeq));
51,724✔
6181

6182
  // if (pBlob->type) {
6183
  pBlob->pSeqToffset = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
51,724✔
6184
  if (pBlob->pSeqToffset == NULL) {
51,724✔
6185
    TAOS_CHECK_EXIT(terrno);
×
6186
  }
6187
  for (int32_t i = 0; i < nSeq; i++) {
28,821,421✔
6188
    uint64_t seq;
28,769,697✔
6189
    int32_t  idx;
28,769,697✔
6190
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &seq));
28,769,697✔
6191
    TAOS_CHECK_EXIT(tDecodeI32(pDecoder, &idx));
28,769,697✔
6192

6193
    code = taosHashPut(pBlob->pSeqToffset, &seq, sizeof(seq), &idx, sizeof(idx));
28,769,697✔
6194
    TAOS_CHECK_EXIT(code);
28,769,697✔
6195
  }
6196
  //}
6197

6198
  pBlob->pSeqTable = taosArrayInit(nSeq, sizeof(SBlobValue));
51,724✔
6199
  if (pBlob->pSeqTable == NULL) {
51,724✔
6200
    TAOS_CHECK_EXIT(terrno);
×
6201
  }
6202

6203
  for (int32_t i = 0; i < nSeq; i++) {
28,821,421✔
6204
    SBlobValue value;
28,769,697✔
6205
    TAOS_CHECK_EXIT(tDecodeU64(pDecoder, &value.offset));
28,769,697✔
6206
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.len));
28,769,697✔
6207
    TAOS_CHECK_EXIT(tDecodeU32(pDecoder, &value.dataOffset));
28,769,697✔
6208
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.nextRow));
28,769,697✔
6209
    TAOS_CHECK_EXIT(tDecodeI8(pDecoder, &value.type));
28,769,697✔
6210
    if (taosArrayPush(pBlob->pSeqTable, &value) == NULL) {
57,539,394✔
6211
      TAOS_CHECK_EXIT(terrno);
×
6212
    }
6213
  }
6214

6215
  pBlob->data = taosMemCalloc(1, pBlob->len);
51,724✔
6216
  if (pBlob->data == NULL) {
51,724✔
6217
    TAOS_CHECK_EXIT(terrno);
×
6218
  }
6219

6220
  TAOS_CHECK_EXIT(tDecodeFixed(pDecoder, pBlob->data, pBlob->len));
51,724✔
6221
  *pBlobSet = pBlob;
51,724✔
6222

6223
  uTrace("decode blob len:%d", (int32_t)(pBlob->len));
51,724✔
6224

6225
_exit:
51,724✔
6226
  if (code != 0) {
51,724✔
6227
    if (pBlob != NULL) {
×
6228
      taosMemoryFree(pBlob->data);
×
6229
      taosArrayDestroy(pBlob->pSeqTable);
×
6230
      taosMemoryFree(pBlob);
×
6231
    }
6232
  }
6233
  return code;
51,724✔
6234
}
6235

6236
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
6237
  do {                                       \
6238
    (SUM) += (VAL);                          \
6239
    if ((MAX) < (VAL)) (MAX) = (VAL);        \
6240
    if ((MIN) > (VAL)) (MIN) = (VAL);        \
6241
  } while (0)
6242

6243
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, SColumnDataAgg *pAggs) {
9,289,156✔
6244
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
9,289,156✔
6245
  int16_t *numOfNull = &pAggs->numOfNull;
9,289,156✔
6246
  *sum = 0;
9,289,156✔
6247
  *max = 0;
9,289,156✔
6248
  *min = 1;
9,289,156✔
6249
  *numOfNull = 0;
9,287,778✔
6250

6251
  int8_t val;
6252
  if (HAS_VALUE == pColData->flag) {
9,288,474✔
6253
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6254
      val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
2,147,483,647✔
6255
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6256
    }
6257
  } else {
6258
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6259
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6260
        case 0:
22,355✔
6261
        case 1:
6262
          (*numOfNull)++;
22,355✔
6263
          break;
22,355✔
6264
        case 2:
423,063✔
6265
          val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
423,063✔
6266
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
423,063✔
6267
          break;
423,063✔
6268
        default:
×
6269
          break;
×
6270
      }
6271
    }
6272
  }
6273
}
9,221,101✔
6274

6275
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
9,306,652✔
6276
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
9,306,652✔
6277
  int16_t *numOfNull = &pAggs->numOfNull;
9,307,334✔
6278
  *sum = 0;
9,306,652✔
6279
  *max = INT8_MIN;
9,306,652✔
6280
  *min = INT8_MAX;
9,306,638✔
6281
  *numOfNull = 0;
9,303,896✔
6282

6283
  int8_t val;
6284
  if (HAS_VALUE == pColData->flag) {
9,305,274✔
6285
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6286
      val = ((int8_t *)pColData->pData)[iVal];
2,147,483,647✔
6287
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6288
    }
6289
  } else {
6290
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,823,935✔
6291
      switch (tColDataGetBitValue(pColData, iVal)) {
1,822,418✔
6292
        case 0:
1,127,580✔
6293
        case 1:
6294
          (*numOfNull)++;
1,127,580✔
6295
          break;
1,127,580✔
6296
        case 2:
694,838✔
6297
          val = ((int8_t *)pColData->pData)[iVal];
694,838✔
6298
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
694,838✔
6299
          break;
694,838✔
6300
        default:
×
6301
          break;
×
6302
      }
6303
    }
6304
  }
6305
}
9,248,112✔
6306

6307
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
9,289,980✔
6308
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
9,289,980✔
6309
  int16_t *numOfNull = &pAggs->numOfNull;
9,290,662✔
6310
  *sum = 0;
9,289,980✔
6311
  *max = INT16_MIN;
9,289,980✔
6312
  *min = INT16_MAX;
9,289,298✔
6313
  *numOfNull = 0;
9,288,616✔
6314

6315
  int16_t val;
6316
  if (HAS_VALUE == pColData->flag) {
9,288,616✔
6317
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6318
      val = ((int16_t *)pColData->pData)[iVal];
2,147,483,647✔
6319
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6320
    }
6321
  } else {
6322
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6323
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6324
        case 0:
22,193✔
6325
        case 1:
6326
          (*numOfNull)++;
22,193✔
6327
          break;
22,193✔
6328
        case 2:
423,225✔
6329
          val = ((int16_t *)pColData->pData)[iVal];
423,225✔
6330
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
423,225✔
6331
          break;
423,225✔
6332
        default:
×
6333
          break;
×
6334
      }
6335
    }
6336
  }
6337
}
9,205,439✔
6338

6339
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, SColumnDataAgg *pAggs) {
30,401,770✔
6340
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
30,401,770✔
6341
  int16_t *numOfNull = &pAggs->numOfNull;
30,405,158✔
6342
  *sum = 0;
30,405,800✔
6343
  *max = INT32_MIN;
30,403,979✔
6344
  *min = INT32_MAX;
30,403,661✔
6345
  *numOfNull = 0;
30,402,794✔
6346

6347
  int32_t val;
6348
  if (HAS_VALUE == pColData->flag) {
30,399,228✔
6349
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6350
      val = ((int32_t *)pColData->pData)[iVal];
2,147,483,647✔
6351
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6352
    }
6353
  } else {
6354
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6355
      switch (tColDataGetBitValue(pColData, iVal)) {
2,147,483,647✔
6356
        case 0:
320,508,083✔
6357
        case 1:
6358
          (*numOfNull)++;
320,508,083✔
6359
          break;
320,508,083✔
6360
        case 2:
2,147,483,647✔
6361
          val = ((int32_t *)pColData->pData)[iVal];
2,147,483,647✔
6362
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6363
          break;
2,147,483,647✔
6364
        default:
×
6365
          break;
×
6366
      }
6367
    }
6368
  }
6369
}
24,768,140✔
6370

6371
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, SColumnDataAgg *pAggs) {
75,693,429✔
6372
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
75,693,429✔
6373
  int16_t *numOfNull = &pAggs->numOfNull;
75,696,045✔
6374
  *sum = 0;
75,695,363✔
6375
  *max = INT64_MIN;
75,694,937✔
6376
  *min = INT64_MAX;
75,695,619✔
6377
  *numOfNull = 0;
75,694,937✔
6378

6379
  int64_t val;
6380
  if (HAS_VALUE == pColData->flag) {
75,691,810✔
6381
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6382
      val = ((int64_t *)pColData->pData)[iVal];
2,147,483,647✔
6383
      CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6384
    }
6385
  } else {
6386
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6387
      switch (tColDataGetBitValue(pColData, iVal)) {
2,147,483,647✔
6388
        case 0:
353,009,725✔
6389
        case 1:
6390
          (*numOfNull)++;
353,009,725✔
6391
          break;
353,009,725✔
6392
        case 2:
2,147,483,647✔
6393
          val = ((int64_t *)pColData->pData)[iVal];
2,147,483,647✔
6394
          CALC_SUM_MAX_MIN(*sum, *max, *min, val);
2,147,483,647✔
6395
          break;
2,147,483,647✔
6396
        default:
×
6397
          break;
×
6398
      }
6399
    }
6400
  }
6401
}
90✔
6402

6403
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, SColumnDataAgg *pAggs) {
32,278,762✔
6404
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
32,278,762✔
6405
  int16_t *numOfNull = &pAggs->numOfNull;
32,278,762✔
6406
  *(double *)sum = 0;
32,278,762✔
6407
  *(double *)max = -FLT_MAX;
32,278,762✔
6408
  *(double *)min = FLT_MAX;
32,278,762✔
6409
  *numOfNull = 0;
32,277,384✔
6410

6411
  float val;
6412
  if (HAS_VALUE == pColData->flag) {
32,277,384✔
6413
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6414
      val = ((float *)pColData->pData)[iVal];
2,147,483,647✔
6415
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,147,483,647✔
6416
    }
6417
  } else {
6418
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
12,444,311✔
6419
      switch (tColDataGetBitValue(pColData, iVal)) {
12,426,190✔
6420
        case 0:
2,164,900✔
6421
        case 1:
6422
          (*numOfNull)++;
2,164,900✔
6423
          break;
2,164,900✔
6424
        case 2:
10,261,290✔
6425
          val = ((float *)pColData->pData)[iVal];
10,261,290✔
6426
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
10,261,290✔
6427
          break;
10,261,290✔
6428
        default:
×
6429
          break;
×
6430
      }
6431
    }
6432
  }
6433
}
18,239,376✔
6434

6435
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, SColumnDataAgg *pAggs) {
17,221,508✔
6436
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
17,221,508✔
6437
  int16_t *numOfNull = &pAggs->numOfNull;
17,225,228✔
6438
  *(double *)sum = 0;
17,225,166✔
6439
  *(double *)max = -DBL_MAX;
17,223,430✔
6440
  *(double *)min = DBL_MAX;
17,223,492✔
6441
  *numOfNull = 0;
17,222,438✔
6442

6443
  double val;
6444
  if (HAS_VALUE == pColData->flag) {
17,223,430✔
6445
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6446
      val = ((double *)pColData->pData)[iVal];
2,147,483,647✔
6447
      CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
2,147,483,647✔
6448
    }
6449
  } else {
6450
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
1,823,935✔
6451
      switch (tColDataGetBitValue(pColData, iVal)) {
1,822,418✔
6452
        case 0:
1,123,361✔
6453
        case 1:
6454
          (*numOfNull)++;
1,123,361✔
6455
          break;
1,123,361✔
6456
        case 2:
699,057✔
6457
          val = ((double *)pColData->pData)[iVal];
699,057✔
6458
          CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
699,057✔
6459
          break;
699,057✔
6460
        default:
×
6461
          break;
×
6462
      }
6463
    }
6464
  }
6465
}
15,562,350✔
6466

6467
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,912,616✔
6468
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,912,616✔
6469
  int16_t *numOfNull = &pAggs->numOfNull;
8,913,298✔
6470
  *(uint64_t *)sum = 0;
8,913,298✔
6471
  *(uint64_t *)max = 0;
8,911,906✔
6472
  *(uint64_t *)min = UINT8_MAX;
8,911,934✔
6473
  *numOfNull = 0;
8,912,616✔
6474

6475
  uint8_t val;
6476
  if (HAS_VALUE == pColData->flag) {
8,911,934✔
6477
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6478
      val = ((uint8_t *)pColData->pData)[iVal];
2,147,483,647✔
6479
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6480
    }
6481
  } else {
6482
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6483
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6484
        case 0:
22,292✔
6485
        case 1:
6486
          (*numOfNull)++;
22,292✔
6487
          break;
22,292✔
6488
        case 2:
423,126✔
6489
          val = ((uint8_t *)pColData->pData)[iVal];
423,126✔
6490
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
423,126✔
6491
          break;
423,126✔
6492
        default:
×
6493
          break;
×
6494
      }
6495
    }
6496
  }
6497
}
8,835,784✔
6498

6499
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,912,616✔
6500
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,912,616✔
6501
  int16_t *numOfNull = &pAggs->numOfNull;
8,910,542✔
6502
  *(uint64_t *)sum = 0;
8,911,920✔
6503
  *(uint64_t *)max = 0;
8,909,192✔
6504
  *(uint64_t *)min = UINT16_MAX;
8,907,814✔
6505
  *numOfNull = 0;
8,907,132✔
6506

6507
  uint16_t val;
6508
  if (HAS_VALUE == pColData->flag) {
8,910,570✔
6509
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6510
      val = ((uint16_t *)pColData->pData)[iVal];
2,147,483,647✔
6511
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6512
    }
6513
  } else {
6514
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6515
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6516
        case 0:
22,151✔
6517
        case 1:
6518
          (*numOfNull)++;
22,151✔
6519
          break;
22,151✔
6520
        case 2:
423,267✔
6521
          val = ((uint16_t *)pColData->pData)[iVal];
423,267✔
6522
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
423,267✔
6523
          break;
423,267✔
6524
        default:
×
6525
          break;
×
6526
      }
6527
    }
6528
  }
6529
}
6,346,862✔
6530

6531
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,913,980✔
6532
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,913,980✔
6533
  int16_t *numOfNull = &pAggs->numOfNull;
8,913,298✔
6534
  *(uint64_t *)sum = 0;
8,913,298✔
6535
  *(uint64_t *)max = 0;
8,913,298✔
6536
  *(uint64_t *)min = UINT32_MAX;
8,912,616✔
6537
  *numOfNull = 0;
8,913,298✔
6538

6539
  uint32_t val;
6540
  if (HAS_VALUE == pColData->flag) {
8,912,616✔
6541
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6542
      val = ((uint32_t *)pColData->pData)[iVal];
2,147,483,647✔
6543
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6544
    }
6545
  } else {
6546
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6547
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6548
        case 0:
21,887✔
6549
        case 1:
6550
          (*numOfNull)++;
21,887✔
6551
          break;
21,887✔
6552
        case 2:
423,531✔
6553
          val = ((uint32_t *)pColData->pData)[iVal];
423,531✔
6554
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
423,531✔
6555
          break;
423,531✔
6556
        default:
×
6557
          break;
×
6558
      }
6559
    }
6560
  }
6561
}
8,616,070✔
6562

6563
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, SColumnDataAgg *pAggs) {
8,913,980✔
6564
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
8,913,980✔
6565
  int16_t *numOfNull = &pAggs->numOfNull;
8,913,980✔
6566
  *(uint64_t *)sum = 0;
8,913,980✔
6567
  *(uint64_t *)max = 0;
8,913,284✔
6568
  *(uint64_t *)min = UINT64_MAX;
8,913,980✔
6569
  *numOfNull = 0;
8,913,298✔
6570

6571
  uint64_t val;
6572
  if (HAS_VALUE == pColData->flag) {
8,911,934✔
6573
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
2,147,483,647✔
6574
      val = ((uint64_t *)pColData->pData)[iVal];
2,147,483,647✔
6575
      CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
2,147,483,647✔
6576
    }
6577
  } else {
6578
    for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
445,558✔
6579
      switch (tColDataGetBitValue(pColData, iVal)) {
445,418✔
6580
        case 0:
22,084✔
6581
        case 1:
6582
          (*numOfNull)++;
22,084✔
6583
          break;
22,084✔
6584
        case 2:
423,334✔
6585
          val = ((uint64_t *)pColData->pData)[iVal];
423,334✔
6586
          CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
423,334✔
6587
          break;
423,334✔
6588
        default:
×
6589
          break;
×
6590
      }
6591
    }
6592
  }
6593
}
8,733,651✔
6594

6595
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, SColumnDataAgg *pAggs) {
34,090,264✔
6596
  int64_t *sum = &pAggs->sum, *max = &pAggs->max, *min = &pAggs->min;
34,090,264✔
6597
  int16_t *numOfNull = &pAggs->numOfNull;
34,089,663✔
6598
  *(uint64_t *)sum = 0;
34,088,981✔
6599
  *(uint64_t *)max = 0;
34,088,981✔
6600
  *(uint64_t *)min = 0;
34,088,380✔
6601
  *numOfNull = 0;
34,088,380✔
6602

6603
  switch (pColData->flag) {
34,088,299✔
6604
    case HAS_NONE:
×
6605
    case HAS_NULL:
6606
    case (HAS_NONE | HAS_NULL):
6607
      *numOfNull = pColData->nVal;
×
6608
      break;
×
6609
    case HAS_VALUE:
34,079,651✔
6610
      *numOfNull = 0;
34,079,651✔
6611
      break;
34,082,217✔
6612
    case (HAS_VALUE | HAS_NULL):
4,637✔
6613
    case (HAS_VALUE | HAS_NONE):
6614
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
11,263,309✔
6615
        if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
11,258,672✔
6616
          (*numOfNull)++;
1,350,496✔
6617
        }
6618
      }
6619
      break;
4,637✔
6620
    case (HAS_VALUE | HAS_NONE | HAS_NULL):
×
6621
      for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
×
6622
        if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
×
6623
          (*numOfNull)++;
×
6624
        }
6625
      }
6626
      break;
×
6627
    default:
×
6628
      break;
×
6629
  }
6630
}
34,086,854✔
6631

6632
#define CALC_DECIMAL_SUM_MAX_MIN(TYPE, pSumOp, pCompOp, pColData, pSum, pMax, pMin)                   \
6633
  do {                                                                                                \
6634
    if (decimal128AddCheckOverflow((Decimal *)pSum, pVal, DECIMAL_WORD_NUM(TYPE))) *pOverflow = true; \
6635
    pSumOp->add(pSum, pVal, DECIMAL_WORD_NUM(TYPE));                                                  \
6636
    if (pCompOp->gt(pVal, pMax, DECIMAL_WORD_NUM(TYPE))) {                                            \
6637
      *(pMax) = *pVal;                                                                                \
6638
    }                                                                                                 \
6639
    if (pCompOp->lt(pVal, pMin, DECIMAL_WORD_NUM(TYPE))) {                                            \
6640
      *(pMin) = *pVal;                                                                                \
6641
    }                                                                                                 \
6642
  } while (0)
6643

6644
static FORCE_INLINE void tColDataCalcSMADecimal64Type(SColData *pColData, SColumnDataAgg *pAggs) {
20,572✔
6645
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum;
20,572✔
6646
  Decimal64  *pMax = (Decimal64 *)pAggs->decimal128Max, *pMin = (Decimal64 *)pAggs->decimal128Min;
20,572✔
6647
  uint8_t    *pOverflow = &pAggs->overflow;
20,572✔
6648
  *pSum = DECIMAL128_ZERO;
20,572✔
6649
  *pMax = DECIMAL64_MIN;
20,572✔
6650
  *pMin = DECIMAL64_MAX;
20,572✔
6651
  pAggs->numOfNull = 0;
20,572✔
6652
  pAggs->colId |= DECIMAL_AGG_FLAG;
20,572✔
6653

6654
  Decimal64         *pVal = NULL;
20,572✔
6655
  const SDecimalOps *pSumOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
20,572✔
6656
  const SDecimalOps *pCompOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
20,572✔
6657
  if (HAS_VALUE == pColData->flag) {
20,572✔
6658
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
83,426✔
6659
      pVal = ((Decimal64 *)pColData->pData) + iVal;
82,600✔
6660
      CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
82,600✔
6661
    }
6662
  } else {
6663
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
16,354,164✔
6664
      switch (tColDataGetBitValue(pColData, iVal)) {
16,334,418✔
6665
        case 0:
703,256✔
6666
        case 1:
6667
          pAggs->numOfNull++;
703,256✔
6668
          break;
703,256✔
6669
        case 2:
15,631,162✔
6670
          pVal = ((Decimal64 *)pColData->pData) + iVal;
15,631,162✔
6671
          CALC_DECIMAL_SUM_MAX_MIN(Decimal64, pSumOps, pCompOps, pColData, pSum, pMax, pMin);
15,631,162✔
6672
          break;
15,631,162✔
6673
        default:
×
6674
          break;
×
6675
      }
6676
    }
6677
  }
6678
}
20,572✔
6679

6680
static FORCE_INLINE void tColDataCalcSMADecimal128Type(SColData *pColData, SColumnDataAgg *pAggs) {
56,518✔
6681
  Decimal128 *pSum = (Decimal128 *)pAggs->decimal128Sum, *pMax = (Decimal128 *)pAggs->decimal128Max,
56,518✔
6682
             *pMin = (Decimal128 *)pAggs->decimal128Min;
56,518✔
6683
  uint8_t *pOverflow = &pAggs->overflow;
56,518✔
6684
  *pSum = DECIMAL128_ZERO;
56,518✔
6685
  *pMax = DECIMAL128_MIN;
56,518✔
6686
  *pMin = DECIMAL128_MAX;
56,518✔
6687
  pAggs->numOfNull = 0;
56,518✔
6688
  pAggs->colId |= DECIMAL_AGG_FLAG;
56,518✔
6689

6690
  Decimal128        *pVal = NULL;
56,518✔
6691
  const SDecimalOps *pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
56,518✔
6692
  if (HAS_VALUE == pColData->flag) {
56,518✔
6693
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
×
6694
      pVal = ((Decimal128 *)pColData->pData) + iVal;
×
6695
      CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
×
6696
    }
6697
  } else {
6698
    for (int32_t iVal = 0; iVal < pColData->nVal; ++iVal) {
52,419,536✔
6699
      switch (tColDataGetBitValue(pColData, iVal)) {
52,363,018✔
6700
        case 0:
2,074,574✔
6701
        case 1:
6702
          pAggs->numOfNull++;
2,074,574✔
6703
          break;
2,074,574✔
6704
        case 2:
50,288,444✔
6705
          pVal = ((Decimal128 *)pColData->pData) + iVal;
50,288,444✔
6706
          CALC_DECIMAL_SUM_MAX_MIN(Decimal128, pOps, pOps, pColData, pSum, pMax, pMin);
50,288,444✔
6707
          break;
50,288,444✔
6708
        default:
×
6709
          break;
×
6710
      }
6711
    }
6712
  }
6713
}
56,518✔
6714

6715
void (*tColDataCalcSMA[])(SColData *pColData, SColumnDataAgg *pAggs) = {
6716
    NULL,
6717
    tColDataCalcSMABool,            // TSDB_DATA_TYPE_BOOL
6718
    tColDataCalcSMATinyInt,         // TSDB_DATA_TYPE_TINYINT
6719
    tColDataCalcSMATinySmallInt,    // TSDB_DATA_TYPE_SMALLINT
6720
    tColDataCalcSMAInt,             // TSDB_DATA_TYPE_INT
6721
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_BIGINT
6722
    tColDataCalcSMAFloat,           // TSDB_DATA_TYPE_FLOAT
6723
    tColDataCalcSMADouble,          // TSDB_DATA_TYPE_DOUBLE
6724
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARCHAR
6725
    tColDataCalcSMABigInt,          // TSDB_DATA_TYPE_TIMESTAMP
6726
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_NCHAR
6727
    tColDataCalcSMAUTinyInt,        // TSDB_DATA_TYPE_UTINYINT
6728
    tColDataCalcSMATinyUSmallInt,   // TSDB_DATA_TYPE_USMALLINT
6729
    tColDataCalcSMAUInt,            // TSDB_DATA_TYPE_UINT
6730
    tColDataCalcSMAUBigInt,         // TSDB_DATA_TYPE_UBIGINT
6731
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_JSON
6732
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_VARBINARY
6733
    tColDataCalcSMADecimal128Type,  // TSDB_DATA_TYPE_DECIMAL
6734
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_BLOB
6735
    NULL,                           // TSDB_DATA_TYPE_MEDIUMBLOB
6736
    tColDataCalcSMAVarType,         // TSDB_DATA_TYPE_GEOMETRY
6737
    tColDataCalcSMADecimal64Type,   // TSDB_DATA_TYPE_DECIMAL64
6738
};
6739

6740
// SValueColumn ================================
6741
int32_t tValueColumnInit(SValueColumn *valCol) {
1,324,903,032✔
6742
  valCol->type = TSDB_DATA_TYPE_NULL;
1,324,903,032✔
6743
  valCol->numOfValues = 0;
1,324,972,169✔
6744
  tBufferInit(&valCol->data);
1,324,994,304✔
6745
  tBufferInit(&valCol->offsets);
1,324,978,006✔
6746
  return 0;
1,325,088,023✔
6747
}
6748

6749
void tValueColumnDestroy(SValueColumn *valCol) {
2,147,483,647✔
6750
  valCol->type = TSDB_DATA_TYPE_NULL;
2,147,483,647✔
6751
  valCol->numOfValues = 0;
2,147,483,647✔
6752
  tBufferDestroy(&valCol->data);
2,147,483,647✔
6753
  tBufferDestroy(&valCol->offsets);
2,147,483,647✔
6754
  return;
2,147,483,647✔
6755
}
6756

6757
void tValueColumnClear(SValueColumn *valCol) {
1,866,338,240✔
6758
  valCol->type = TSDB_DATA_TYPE_NULL;
1,866,338,240✔
6759
  valCol->numOfValues = 0;
1,866,444,009✔
6760
  tBufferClear(&valCol->data);
1,866,511,971✔
6761
  tBufferClear(&valCol->offsets);
1,866,450,428✔
6762
  return;
1,866,424,151✔
6763
}
6764

6765
int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value) {
2,002,476✔
6766
  int32_t code;
6767

6768
  if (valCol->numOfValues == 0) {
2,002,476✔
6769
    valCol->type = value->type;
889,794✔
6770
  }
6771

6772
  if (!(value->type == valCol->type)) {
2,002,476✔
6773
    return TSDB_CODE_INVALID_PARA;
×
6774
  }
6775

6776
  if (IS_VAR_DATA_TYPE(value->type)) {
2,002,476✔
6777
    if ((code = tBufferPutI32(&valCol->offsets, tBufferGetSize(&valCol->data)))) {
1,764,212✔
6778
      return code;
×
6779
    }
6780
    if ((code = tBufferPut(&valCol->data, value->pData, value->nData))) {
1,764,212✔
6781
      return code;
×
6782
    }
6783
  } else {
6784
    code = tBufferPut(&valCol->data, VALUE_GET_DATUM(value, value->type), tDataTypes[value->type].bytes);
1,120,370✔
6785
    if (code) return code;
1,120,370✔
6786
  }
6787
  valCol->numOfValues++;
2,002,476✔
6788

6789
  return 0;
2,001,742✔
6790
}
6791

6792
int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value) {
65,293,106✔
6793
  int32_t code;
6794

6795
  if (idx < 0 || idx >= valCol->numOfValues) {
65,293,106✔
6796
    return TSDB_CODE_OUT_OF_RANGE;
×
6797
  }
6798

6799
  if (IS_VAR_DATA_TYPE(valCol->type)) {
65,293,861✔
6800
    int32_t *offsets = (int32_t *)tBufferGetData(&valCol->offsets);
1,944,469✔
6801
    int32_t  nextOffset = (idx == valCol->numOfValues - 1) ? tBufferGetSize(&valCol->data) : offsets[idx + 1];
1,944,385✔
6802
    int32_t  oldDataSize = nextOffset - offsets[idx];
1,943,651✔
6803
    int32_t  bytesAdded = value->nData - oldDataSize;
1,943,651✔
6804

6805
    if (bytesAdded != 0) {
1,944,385✔
6806
      if ((code = tBufferEnsureCapacity(&valCol->data, tBufferGetSize(&valCol->data) + bytesAdded))) return code;
46,110✔
6807
      memmove(tBufferGetDataAt(&valCol->data, nextOffset + bytesAdded), tBufferGetDataAt(&valCol->data, nextOffset),
23,055✔
6808
              tBufferGetSize(&valCol->data) - nextOffset);
23,055✔
6809
      valCol->data.size += bytesAdded;
23,055✔
6810

6811
      for (int32_t i = idx + 1; i < valCol->numOfValues; i++) {
23,055✔
6812
        offsets[i] += bytesAdded;
×
6813
      }
6814
    }
6815
    return tBufferPutAt(&valCol->data, offsets[idx], value->pData, value->nData);
1,944,385✔
6816
  } else {
6817
    return tBufferPutAt(&valCol->data, idx * tDataTypes[valCol->type].bytes, VALUE_GET_DATUM(value, valCol->type),
63,349,280✔
6818
                        tDataTypes[valCol->type].bytes);
63,349,420✔
6819
  }
6820
  return 0;
6821
}
6822

6823
int32_t tValueColumnGet(SValueColumn *valCol, int32_t idx, SValue *value) {
532,240,169✔
6824
  if (idx < 0 || idx >= valCol->numOfValues) {
532,240,169✔
6825
    return TSDB_CODE_OUT_OF_RANGE;
×
6826
  }
6827

6828
  value->type = valCol->type;
532,291,902✔
6829
  if (IS_VAR_DATA_TYPE(value->type)) {
704,011,679✔
6830
    int32_t       offset, nextOffset;
171,722,340✔
6831
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * sizeof(offset), &valCol->offsets);
171,706,735✔
6832

6833
    TAOS_CHECK_RETURN(tBufferGetI32(&reader, &offset));
171,712,361✔
6834
    if (idx == valCol->numOfValues - 1) {
171,695,737✔
6835
      nextOffset = tBufferGetSize(&valCol->data);
56,809,110✔
6836
    } else {
6837
      TAOS_CHECK_RETURN(tBufferGetI32(&reader, &nextOffset));
114,880,969✔
6838
    }
6839
    value->nData = nextOffset - offset;
171,704,294✔
6840
    value->pData = (uint8_t *)tBufferGetDataAt(&valCol->data, offset);
171,701,501✔
6841
  } else {
6842
    SBufferReader reader = BUFFER_READER_INITIALIZER(idx * tDataTypes[value->type].bytes, &valCol->data);
360,612,090✔
6843
    TAOS_CHECK_RETURN(tBufferGet(&reader, tDataTypes[value->type].bytes, VALUE_GET_DATUM(value, value->type)));
721,228,433✔
6844
  }
6845
  return 0;
532,303,793✔
6846
}
6847

6848
int32_t tValueColumnCompress(SValueColumn *valCol, SValueColumnCompressInfo *info, SBuffer *output, SBuffer *assist) {
889,794✔
6849
  int32_t code;
6850

6851
  if (!(valCol->numOfValues > 0)) {
889,794✔
6852
    return TSDB_CODE_INVALID_PARA;
×
6853
  }
6854

6855
  (*info) = (SValueColumnCompressInfo){
889,794✔
6856
      .cmprAlg = info->cmprAlg,
889,060✔
6857
      .type = valCol->type,
889,794✔
6858
  };
6859

6860
  // offset
6861
  if (IS_VAR_DATA_TYPE(valCol->type)) {
889,794✔
6862
    SCompressInfo cinfo = {
333,564✔
6863
        .cmprAlg = info->cmprAlg,
333,564✔
6864
        .dataType = TSDB_DATA_TYPE_INT,
6865
        .originalSize = valCol->offsets.size,
333,564✔
6866
    };
6867

6868
    code = tCompressDataToBuffer(valCol->offsets.data, &cinfo, output, assist);
332,830✔
6869
    if (code) return code;
333,564✔
6870

6871
    info->offsetOriginalSize = cinfo.originalSize;
333,564✔
6872
    info->offsetCompressedSize = cinfo.compressedSize;
333,564✔
6873
  }
6874

6875
  // data
6876
  SCompressInfo cinfo = {
889,794✔
6877
      .cmprAlg = info->cmprAlg,
1,779,548✔
6878
      .dataType = valCol->type,
889,794✔
6879
      .originalSize = valCol->data.size,
889,794✔
6880
  };
6881

6882
  code = tCompressDataToBuffer(valCol->data.data, &cinfo, output, assist);
889,794✔
6883
  if (code) return code;
889,794✔
6884

6885
  info->dataOriginalSize = cinfo.originalSize;
889,794✔
6886
  info->dataCompressedSize = cinfo.compressedSize;
889,794✔
6887

6888
  return 0;
889,794✔
6889
}
6890

6891
int32_t tValueColumnDecompress(void *input, const SValueColumnCompressInfo *info, SValueColumn *valCol,
225,791,743✔
6892
                               SBuffer *assist) {
6893
  int32_t code;
6894

6895
  tValueColumnClear(valCol);
225,791,743✔
6896
  valCol->type = info->type;
225,828,173✔
6897
  // offset
6898
  if (IS_VAR_DATA_TYPE(valCol->type)) {
331,492,087✔
6899
    valCol->numOfValues = info->offsetOriginalSize / tDataTypes[TSDB_DATA_TYPE_INT].bytes;
105,682,149✔
6900

6901
    SCompressInfo cinfo = {
105,645,122✔
6902
        .dataType = TSDB_DATA_TYPE_INT,
6903
        .cmprAlg = info->cmprAlg,
105,663,535✔
6904
        .originalSize = info->offsetOriginalSize,
105,658,574✔
6905
        .compressedSize = info->offsetCompressedSize,
105,645,686✔
6906
    };
6907

6908
    code = tDecompressDataToBuffer(input, &cinfo, &valCol->offsets, assist);
105,649,111✔
6909
    if (code) {
105,679,392✔
6910
      return code;
×
6911
    }
6912
  } else {
6913
    valCol->numOfValues = info->dataOriginalSize / tDataTypes[valCol->type].bytes;
120,155,178✔
6914
  }
6915

6916
  // data
6917
  SCompressInfo cinfo = {
225,875,007✔
6918
      .dataType = valCol->type,
225,865,186✔
6919
      .cmprAlg = info->cmprAlg,
225,873,813✔
6920
      .originalSize = info->dataOriginalSize,
225,862,919✔
6921
      .compressedSize = info->dataCompressedSize,
225,852,517✔
6922
  };
6923

6924
  code = tDecompressDataToBuffer((char *)input + info->offsetCompressedSize, &cinfo, &valCol->data, assist);
225,851,531✔
6925
  if (code) {
225,891,934✔
6926
    return code;
×
6927
  }
6928

6929
  return 0;
225,891,934✔
6930
}
6931

6932
int32_t tValueColumnCompressInfoEncode(const SValueColumnCompressInfo *info, SBuffer *buffer) {
889,794✔
6933
  int32_t code;
6934
  uint8_t fmtVer = 0;
889,794✔
6935

6936
  if ((code = tBufferPutU8(buffer, fmtVer))) return code;
1,778,854✔
6937
  if ((code = tBufferPutI8(buffer, info->cmprAlg))) return code;
1,778,854✔
6938
  if ((code = tBufferPutI8(buffer, info->type))) return code;
1,778,854✔
6939
  if (IS_VAR_DATA_TYPE(info->type)) {
889,060✔
6940
    if ((code = tBufferPutI32v(buffer, info->offsetOriginalSize))) return code;
667,128✔
6941
    if ((code = tBufferPutI32v(buffer, info->offsetCompressedSize))) return code;
666,394✔
6942
  }
6943
  if ((code = tBufferPutI32v(buffer, info->dataOriginalSize))) return code;
1,778,854✔
6944
  if ((code = tBufferPutI32v(buffer, info->dataCompressedSize))) return code;
1,778,120✔
6945

6946
  return 0;
889,060✔
6947
}
6948

6949
int32_t tValueColumnCompressInfoDecode(SBufferReader *reader, SValueColumnCompressInfo *info) {
225,807,565✔
6950
  int32_t code;
6951
  uint8_t fmtVer;
225,807,565✔
6952

6953
  if ((code = tBufferGetU8(reader, &fmtVer))) return code;
225,824,749✔
6954
  if (fmtVer == 0) {
225,860,122✔
6955
    if ((code = tBufferGetI8(reader, &info->cmprAlg))) return code;
225,860,122✔
6956
    if ((code = tBufferGetI8(reader, &info->type))) return code;
225,864,386✔
6957
    if (IS_VAR_DATA_TYPE(info->type)) {
225,888,064✔
6958
      if ((code = tBufferGetI32v(reader, &info->offsetOriginalSize))) return code;
105,696,421✔
6959
      if ((code = tBufferGetI32v(reader, &info->offsetCompressedSize))) return code;
105,635,132✔
6960
    } else {
6961
      info->offsetOriginalSize = 0;
120,185,489✔
6962
      info->offsetCompressedSize = 0;
120,202,111✔
6963
    }
6964
    if ((code = tBufferGetI32v(reader, &info->dataOriginalSize))) return code;
225,881,672✔
6965
    if ((code = tBufferGetI32v(reader, &info->dataCompressedSize))) return code;
225,858,554✔
6966
  } else {
6967
    return TSDB_CODE_INVALID_PARA;
×
6968
  }
6969

6970
  return 0;
225,860,123✔
6971
}
6972

6973
int32_t tCompressData(void          *input,       // input
1,060,989,942✔
6974
                      SCompressInfo *info,        // compress info
6975
                      void          *output,      // output
6976
                      int32_t        outputSize,  // output size
6977
                      SBuffer       *buffer       // assistant buffer provided by caller, can be NULL
6978
) {
6979
  int32_t extraSizeNeeded;
6980
  int32_t code;
6981

6982
  extraSizeNeeded = (info->cmprAlg == NO_COMPRESSION) ? info->originalSize : info->originalSize + COMP_OVERFLOW_BYTES;
1,060,989,942✔
6983
  if (!(outputSize >= extraSizeNeeded)) {
1,061,057,652✔
6984
    return TSDB_CODE_INVALID_PARA;
×
6985
  }
6986

6987
  if (info->cmprAlg == NO_COMPRESSION) {
1,061,057,652✔
6988
    (void)memcpy(output, input, info->originalSize);
42,944✔
6989
    info->compressedSize = info->originalSize;
42,944✔
6990
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
1,190,846,651✔
6991
    SBuffer local;
129,795,601✔
6992

6993
    tBufferInit(&local);
6994
    if (buffer == NULL) {
129,817,262✔
6995
      buffer = &local;
×
6996
    }
6997

6998
    if (info->cmprAlg == TWO_STAGE_COMP) {
129,817,262✔
6999
      code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
129,693,052✔
7000
      if (code) {
129,686,449✔
7001
        tBufferDestroy(&local);
7002
        return code;
×
7003
      }
7004
    }
7005

7006
    info->compressedSize = tDataTypes[info->dataType].compFunc(  //
389,430,155✔
7007
        input,                                                   // input
7008
        info->originalSize,                                      // input size
7009
        info->originalSize / tDataTypes[info->dataType].bytes,   // number of elements
129,810,554✔
7010
        output,                                                  // output
7011
        outputSize,                                              // output size
7012
        info->cmprAlg,                                           // compression algorithm
129,811,828✔
7013
        buffer->data,                                            // buffer
7014
        buffer->capacity                                         // buffer size
129,807,052✔
7015
    );
7016
    if (info->compressedSize < 0) {
129,816,879✔
7017
      tBufferDestroy(&local);
7018
      return TSDB_CODE_COMPRESS_ERROR;
×
7019
    }
7020

7021
    tBufferDestroy(&local);
7022
  } else {
7023
    DEFINE_VAR(info->cmprAlg)
931,239,731✔
7024
    if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
931,306,793✔
7025
      (void)memcpy(output, input, info->originalSize);
7,680✔
7026
      info->compressedSize = info->originalSize;
7,680✔
7027
      return 0;
7,680✔
7028
    }
7029
    SBuffer local;
931,289,103✔
7030

7031
    tBufferInit(&local);
7032
    if (buffer == NULL) {
931,284,541✔
7033
      buffer = &local;
919,573✔
7034
    }
7035
    code = tBufferEnsureCapacity(buffer, extraSizeNeeded);
931,284,541✔
7036

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

7052
    tBufferDestroy(&local);
7053
    // new col compress
7054
  }
7055

7056
  return 0;
1,061,076,071✔
7057
}
7058

7059
int32_t tDecompressData(void                *input,       // input
2,147,483,647✔
7060
                        const SCompressInfo *info,        // compress info
7061
                        void                *output,      // output
7062
                        int32_t              outputSize,  // output size
7063
                        SBuffer             *buffer       // assistant buffer provided by caller, can be NULL
7064
) {
7065
  int32_t code;
7066

7067
  if (!(outputSize >= info->originalSize)) {
2,147,483,647✔
7068
    return TSDB_CODE_INVALID_PARA;
×
7069
  }
7070

7071
  if (info->cmprAlg == NO_COMPRESSION) {
2,147,483,647✔
7072
    if (!(info->compressedSize == info->originalSize)) {
19,960✔
7073
      return TSDB_CODE_INVALID_PARA;
×
7074
    }
7075
    (void)memcpy(output, input, info->compressedSize);
19,960✔
7076
  } else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
2,147,483,647✔
7077
    SBuffer local;
2,147,483,647✔
7078

7079
    tBufferInit(&local);
7080
    if (buffer == NULL) {
2,147,483,647✔
7081
      buffer = &local;
×
7082
    }
7083

7084
    if (info->cmprAlg == TWO_STAGE_COMP) {
2,147,483,647✔
7085
      code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
2,147,483,647✔
7086
      if (code) {
2,147,483,647✔
7087
        tBufferDestroy(&local);
7088
        return code;
×
7089
      }
7090
    }
7091

7092
    int32_t decompressedSize = tDataTypes[info->dataType].decompFunc(
2,147,483,647✔
7093
        input,                                                  // input
7094
        info->compressedSize,                                   // inputSize
2,147,483,647✔
7095
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
2,147,483,647✔
7096
        output,                                                 // output
7097
        outputSize,                                             // output size
7098
        info->cmprAlg,                                          // compression algorithm
2,147,483,647✔
7099
        buffer->data,                                           // helper buffer
7100
        buffer->capacity                                        // extra buffer size
2,147,483,647✔
7101
    );
7102
    if (decompressedSize < 0) {
2,147,483,647✔
7103
      tBufferDestroy(&local);
7104
      return TSDB_CODE_COMPRESS_ERROR;
×
7105
    }
7106

7107
    if (!(decompressedSize == info->originalSize)) {
2,147,483,647✔
7108
      return TSDB_CODE_COMPRESS_ERROR;
×
7109
    }
7110
    tBufferDestroy(&local);
7111
  } else {
7112
    DEFINE_VAR(info->cmprAlg);
2,147,483,647✔
7113
    if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
2,147,483,647✔
7114
      (void)memcpy(output, input, info->compressedSize);
11,520✔
7115
      return 0;
11,520✔
7116
    }
7117
    SBuffer local;
2,147,483,647✔
7118

7119
    tBufferInit(&local);
7120
    if (buffer == NULL) {
2,147,483,647✔
7121
      buffer = &local;
734,141✔
7122
    }
7123
    code = tBufferEnsureCapacity(buffer, info->originalSize + COMP_OVERFLOW_BYTES);
2,147,483,647✔
7124
    if (code) {
2,147,483,647✔
7125
      return code;
×
7126
    }
7127

7128
    int32_t decompressedSize = tDataCompress[info->dataType].decompFunc(
2,147,483,647✔
7129
        input,                                                  // input
7130
        info->compressedSize,                                   // inputSize
2,147,483,647✔
7131
        info->originalSize / tDataTypes[info->dataType].bytes,  // number of elements
2,147,483,647✔
7132
        output,                                                 // output
7133
        outputSize,                                             // output size
7134
        info->cmprAlg,                                          // compression algorithm
2,147,483,647✔
7135
        buffer->data,                                           // helper buffer
7136
        buffer->capacity                                        // extra buffer size
2,147,483,647✔
7137
    );
7138
    if (decompressedSize < 0) {
2,147,483,647✔
7139
      tBufferDestroy(&local);
7140
      return TSDB_CODE_COMPRESS_ERROR;
×
7141
    }
7142

7143
    if (!(decompressedSize == info->originalSize)) {
2,147,483,647✔
7144
      return TSDB_CODE_COMPRESS_ERROR;
×
7145
    }
7146
    tBufferDestroy(&local);
7147
  }
7148

7149
  return 0;
2,147,483,647✔
7150
}
7151

7152
int32_t tCompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
1,059,236,607✔
7153
  int32_t code;
7154

7155
  code = tBufferEnsureCapacity(output, output->size + info->originalSize + COMP_OVERFLOW_BYTES);
1,059,236,607✔
7156
  if (code) return code;
1,059,214,870✔
7157

7158
  code = tCompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
1,059,214,870✔
7159
  if (code) return code;
1,059,285,229✔
7160

7161
  output->size += info->compressedSize;
1,059,285,229✔
7162
  return 0;
1,059,196,048✔
7163
}
7164

7165
int32_t tDecompressDataToBuffer(void *input, SCompressInfo *info, SBuffer *output, SBuffer *assist) {
2,147,483,647✔
7166
  int32_t code;
7167

7168
  code = tBufferEnsureCapacity(output, output->size + info->originalSize);
2,147,483,647✔
7169
  if (code) return code;
2,147,483,647✔
7170

7171
  code = tDecompressData(input, info, tBufferGetDataEnd(output), output->capacity - output->size, assist);
2,147,483,647✔
7172
  if (code) return code;
2,147,483,647✔
7173

7174
  output->size += info->originalSize;
2,147,483,647✔
7175
  return 0;
2,147,483,647✔
7176
}
7177

7178
// handle all types, including var data
7179
void valueSetDatum(SValue *pVal, int8_t type, void *pDatum, uint32_t len) {
2,147,483,647✔
7180
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
7181
    pVal->pData = pDatum;
80,580,108✔
7182
    pVal->nData = len;
525,226,341✔
7183
  } else {
7184
    switch (len) {
2,147,483,647✔
7185
      case sizeof(uint8_t):
2,147,483,647✔
7186
        pVal->val = *(uint8_t *)pDatum;
2,147,483,647✔
7187
        break;
2,147,483,647✔
7188
      case sizeof(uint16_t):
2,147,483,647✔
7189
        pVal->val = *(uint16_t *)pDatum;
2,147,483,647✔
7190
        break;
2,147,483,647✔
7191
      case sizeof(uint32_t):
2,147,483,647✔
7192
        pVal->val = *(uint32_t *)pDatum;
2,147,483,647✔
7193
        break;
2,147,483,647✔
7194
      case sizeof(uint64_t):
2,147,483,647✔
7195
        pVal->val = *(uint64_t *)pDatum;
2,147,483,647✔
7196
        break;
2,147,483,647✔
7197
      default:
6,588,734✔
7198
        break;
6,588,734✔
7199
    }
7200
  }
7201
}
2,147,483,647✔
7202

7203
void valueCloneDatum(SValue *pDst, const SValue *pSrc, int8_t type) {
2,147,483,647✔
7204
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
2,147,483,647✔
7205
    memcpy(pDst->pData, pSrc->pData, pSrc->nData);
425,631,937✔
7206
    pDst->nData = pSrc->nData;
426,271,252✔
7207
  } else {
7208
    pDst->val = pSrc->val;
2,147,483,647✔
7209
  }
7210
}
2,147,483,647✔
7211
void valueClearDatum(SValue *pVal, int8_t type) {
499,458✔
7212
  if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_DECIMAL) {
499,458✔
7213
    taosMemoryFreeClear(pVal->pData);
26,626✔
7214
    pVal->nData = 0;
26,626✔
7215
  } else {
7216
    pVal->val = 0;
472,832✔
7217
  }
7218
}
499,458✔
7219

7220
int8_t schemaHasBlob(const STSchema *pSchema) {
830,150,973✔
7221
  if (pSchema == NULL) {
830,150,973✔
7222
    return 0;
×
7223
  }
7224
  for (int i = 0; i < pSchema->numOfCols; ++i) {
2,147,483,647✔
7225
    if (IS_STR_DATA_BLOB(pSchema->columns[i].type)) {
2,147,483,647✔
7226
      return 1;
62,172✔
7227
    }
7228
  }
7229
  return 0;
830,259,067✔
7230
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc