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

taosdata / TDengine / #3562

20 Dec 2024 09:57AM UTC coverage: 26.655% (-32.2%) from 58.812%
#3562

push

travis-ci

web-flow
Merge pull request #29229 from taosdata/enh/TS-5749-3.0

enh: seperate tsdb async tasks to different thread pools

21498 of 109421 branches covered (19.65%)

Branch coverage included in aggregate %.

66 of 96 new or added lines in 7 files covered. (68.75%)

39441 existing lines in 157 files now uncovered.

35007 of 102566 relevant lines covered (34.13%)

53922.97 hits per line

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

0.0
/source/common/src/trow.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 "trow.h"
18
#include "tlog.h"
19

20
static bool tdSTSRowIterGetTpVal(STSRowIter *pIter, col_type_t colType, int32_t offset, SCellVal *pVal);
21
static bool tdSTSRowIterGetKvVal(STSRowIter *pIter, col_id_t colId, col_id_t *nIdx, SCellVal *pVal);
22

UNCOV
23
void tdSTSRowIterInit(STSRowIter *pIter, STSchema *pSchema) {
×
UNCOV
24
  pIter->pSchema = pSchema;
×
UNCOV
25
  pIter->maxColId = pSchema->columns[pSchema->numOfCols - 1].colId;
×
UNCOV
26
}
×
27

UNCOV
28
void *tdGetBitmapAddr(STSRow *pRow, uint8_t rowType, uint32_t flen, col_id_t nKvCols) {
×
29
#ifdef TD_SUPPORT_BITMAP
UNCOV
30
  switch (rowType) {
×
UNCOV
31
    case TD_ROW_TP:
×
UNCOV
32
      return tdGetBitmapAddrTp(pRow, flen);
×
UNCOV
33
    case TD_ROW_KV:
×
UNCOV
34
      return tdGetBitmapAddrKv(pRow, nKvCols);
×
35
    default:
×
36
      break;
×
37
  }
38
#endif
39
  return NULL;
×
40
}
41

UNCOV
42
void tdSTSRowIterReset(STSRowIter *pIter, STSRow *pRow) {
×
UNCOV
43
  pIter->pRow = pRow;
×
UNCOV
44
  pIter->pBitmap = tdGetBitmapAddr(pRow, pRow->type, pIter->pSchema->flen, tdRowGetNCols(pRow));
×
UNCOV
45
  pIter->offset = 0;
×
UNCOV
46
  pIter->colIdx = 0;  // PRIMARYKEY_TIMESTAMP_COL_ID;
×
UNCOV
47
  pIter->kvIdx = 0;
×
UNCOV
48
}
×
49

UNCOV
50
bool tdSTSRowIterFetch(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCellVal *pVal) {
×
UNCOV
51
  if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
UNCOV
52
    pVal->val = &pIter->pRow->ts;
×
UNCOV
53
    pVal->valType = TD_VTYPE_NORM;
×
UNCOV
54
    return true;
×
55
  }
56

UNCOV
57
  bool ret = true;
×
UNCOV
58
  if (TD_IS_TP_ROW(pIter->pRow)) {
×
UNCOV
59
    STColumn *pCol = NULL;
×
UNCOV
60
    STSchema *pSchema = pIter->pSchema;
×
UNCOV
61
    while (pIter->colIdx < pSchema->numOfCols) {
×
UNCOV
62
      pCol = &pSchema->columns[pIter->colIdx];  // 1st column of schema is primary TS key
×
UNCOV
63
      if (colId == pCol->colId) {
×
UNCOV
64
        break;
×
UNCOV
65
      } else if (pCol->colId < colId) {
×
UNCOV
66
        ++pIter->colIdx;
×
UNCOV
67
        continue;
×
68
      } else {
69
        return false;
×
70
      }
71
    }
UNCOV
72
    ret = tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal);
×
UNCOV
73
    ++pIter->colIdx;
×
UNCOV
74
  } else if (TD_IS_KV_ROW(pIter->pRow)) {
×
UNCOV
75
    ret = tdSTSRowIterGetKvVal(pIter, colId, &pIter->kvIdx, pVal);
×
76
  } else {
77
    pVal->valType = TD_VTYPE_NONE;
×
78
    terrno = TSDB_CODE_INVALID_PARA;
×
79
    if (COL_REACH_END(colId, pIter->maxColId)) ret = false;
×
80
  }
UNCOV
81
  return ret;
×
82
}
83

UNCOV
84
bool tdSTSRowIterGetTpVal(STSRowIter *pIter, col_type_t colType, int32_t offset, SCellVal *pVal) {
×
UNCOV
85
  STSRow *pRow = pIter->pRow;
×
UNCOV
86
  if (pRow->statis == 0) {
×
UNCOV
87
    pVal->valType = TD_VTYPE_NORM;
×
UNCOV
88
    if (IS_VAR_DATA_TYPE(colType)) {
×
UNCOV
89
      pVal->val = POINTER_SHIFT(pRow, *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(pRow), offset));
×
90
    } else {
UNCOV
91
      pVal->val = POINTER_SHIFT(TD_ROW_DATA(pRow), offset);
×
92
    }
UNCOV
93
    return true;
×
94
  }
95

UNCOV
96
  if (tdGetBitmapValType(pIter->pBitmap, pIter->colIdx - 1, &pVal->valType, 0) != TSDB_CODE_SUCCESS) {
×
97
    pVal->valType = TD_VTYPE_NONE;
×
98
    return true;
×
99
  }
100

UNCOV
101
  if (pVal->valType == TD_VTYPE_NORM) {
×
UNCOV
102
    if (IS_VAR_DATA_TYPE(colType)) {
×
UNCOV
103
      pVal->val = POINTER_SHIFT(pRow, *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(pRow), offset));
×
104
    } else {
UNCOV
105
      pVal->val = POINTER_SHIFT(TD_ROW_DATA(pRow), offset);
×
106
    }
107
  }
108

UNCOV
109
  return true;
×
110
}
111

UNCOV
112
int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pValType) {
×
UNCOV
113
  if (!pBitmap || colIdx < 0) {
×
114
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
115
  }
UNCOV
116
  int16_t nBytes = colIdx / TD_VTYPE_PARTS;
×
UNCOV
117
  int16_t nOffset = colIdx & TD_VTYPE_OPTR;
×
UNCOV
118
  char   *pDestByte = (char *)POINTER_SHIFT(pBitmap, nBytes);
×
119
  // use literal value directly and not use formula to simplify the codes
UNCOV
120
  switch (nOffset) {
×
UNCOV
121
    case 0:
×
UNCOV
122
      *pValType = (((*pDestByte) & 0xC0) >> 6);
×
UNCOV
123
      break;
×
UNCOV
124
    case 1:
×
UNCOV
125
      *pValType = (((*pDestByte) & 0x30) >> 4);
×
UNCOV
126
      break;
×
UNCOV
127
    case 2:
×
UNCOV
128
      *pValType = (((*pDestByte) & 0x0C) >> 2);
×
UNCOV
129
      break;
×
UNCOV
130
    case 3:
×
UNCOV
131
      *pValType = ((*pDestByte) & 0x03);
×
UNCOV
132
      break;
×
133
    default:
×
134
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
135
  }
UNCOV
136
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
137
}
138

139
int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValType, int8_t bitmapMode) {
UNCOV
140
  switch (bitmapMode) {
×
UNCOV
141
    case 0:
×
UNCOV
142
      return tdGetBitmapValTypeII(pBitmap, colIdx, pValType);
×
143
      break;
144
#if 0
145
    case -1:
146
    case 1:
147
      tdGetBitmapValTypeI(pBitmap, colIdx, pValType);
148
      break;
149
#endif
150
    default:
×
151
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
152
  }
153
  TAOS_RETURN(TSDB_CODE_SUCCESS);
154
}
155

UNCOV
156
bool tdSTSRowIterGetKvVal(STSRowIter *pIter, col_id_t colId, col_id_t *nIdx, SCellVal *pVal) {
×
UNCOV
157
  STSRow    *pRow = pIter->pRow;
×
UNCOV
158
  SKvRowIdx *pKvIdx = NULL;
×
UNCOV
159
  bool       colFound = false;
×
UNCOV
160
  col_id_t   kvNCols = tdRowGetNCols(pRow) - 1;
×
UNCOV
161
  void      *pColIdx = TD_ROW_COL_IDX(pRow);
×
UNCOV
162
  while (*nIdx < kvNCols) {
×
UNCOV
163
    pKvIdx = (SKvRowIdx *)POINTER_SHIFT(pColIdx, *nIdx * sizeof(SKvRowIdx));
×
UNCOV
164
    if (pKvIdx->colId == colId) {
×
UNCOV
165
      ++(*nIdx);
×
UNCOV
166
      pVal->val = POINTER_SHIFT(pRow, pKvIdx->offset);
×
UNCOV
167
      colFound = true;
×
UNCOV
168
      break;
×
UNCOV
169
    } else if (pKvIdx->colId > colId) {
×
UNCOV
170
      pVal->valType = TD_VTYPE_NONE;
×
UNCOV
171
      return true;
×
172
    } else {
173
      ++(*nIdx);
×
174
    }
175
  }
176

UNCOV
177
  if (!colFound) {
×
UNCOV
178
    if (colId <= pIter->maxColId) {
×
UNCOV
179
      pVal->valType = TD_VTYPE_NONE;
×
UNCOV
180
      return true;
×
181
    } else {
UNCOV
182
      return false;
×
183
    }
184
  }
185

UNCOV
186
  if (tdGetBitmapValType(pIter->pBitmap, pIter->kvIdx - 1, &pVal->valType, 0) != TSDB_CODE_SUCCESS) {
×
187
    pVal->valType = TD_VTYPE_NONE;
×
188
  }
189

UNCOV
190
  return true;
×
191
}
192

193
// #ifdef BUILD_NO_CALL
194
const uint8_t tdVTypeByte[2][3] = {{
195
                                       // 2 bits
196
                                       TD_VTYPE_NORM_BYTE_II,
197
                                       TD_VTYPE_NONE_BYTE_II,
198
                                       TD_VTYPE_NULL_BYTE_II,
199
                                   },
200
                                   {
201
                                       // 1 bit
202
                                       TD_VTYPE_NORM_BYTE_I,  // normal
203
                                       TD_VTYPE_NULL_BYTE_I,
204
                                       TD_VTYPE_NULL_BYTE_I,  // padding
205
                                   }
206

207
};
208

209
// declaration
210
static uint8_t tdGetBitmapByte(uint8_t byte);
211
static bool    tdSTpRowGetVal(STSRow *pRow, col_id_t colId, col_type_t colType, int32_t flen, uint32_t offset,
212
                              col_id_t colIdx, SCellVal *pVal);
213
static bool    tdSKvRowGetVal(STSRow *pRow, col_id_t colId, col_id_t colIdx, SCellVal *pVal);
214
static void    tdSCellValPrint(SCellVal *pVal, int8_t colType);
215

216
// implementation
217
STSRow *tdRowDup(STSRow *row) {
×
218
  STSRow *trow = taosMemoryMalloc(TD_ROW_LEN(row));
×
219
  if (trow == NULL) return NULL;
×
220

221
  tdRowCpy(trow, row);
222
  return trow;
×
223
}
224

UNCOV
225
void tdSRowPrint(STSRow *row, STSchema *pSchema, const char *tag) {
×
UNCOV
226
  STSRowIter iter = {0};
×
UNCOV
227
  tdSTSRowIterInit(&iter, pSchema);
×
UNCOV
228
  tdSTSRowIterReset(&iter, row);
×
UNCOV
229
  printf("%s >>>type:%d,sver:%d ", tag, (int32_t)TD_ROW_TYPE(row), (int32_t)TD_ROW_SVER(row));
×
UNCOV
230
  STColumn *cols = (STColumn *)&iter.pSchema->columns;
×
UNCOV
231
  while (true) {
×
UNCOV
232
    SCellVal sVal = {.valType = 255, NULL};
×
UNCOV
233
    if (!tdSTSRowIterNext(&iter, &sVal)) {
×
UNCOV
234
      break;
×
235
    }
UNCOV
236
    tdSCellValPrint(&sVal, cols[iter.colIdx - 1].type);
×
237
  }
UNCOV
238
  printf("\n");
×
UNCOV
239
}
×
240

UNCOV
241
void tdSCellValPrint(SCellVal *pVal, int8_t colType) {
×
UNCOV
242
  if (tdValTypeIsNull(pVal->valType)) {
×
UNCOV
243
    printf("NULL ");
×
UNCOV
244
    return;
×
UNCOV
245
  } else if (tdValTypeIsNone(pVal->valType)) {
×
UNCOV
246
    printf("NONE ");
×
UNCOV
247
    return;
×
248
  }
UNCOV
249
  if (!pVal->val) {
×
250
    printf("BadVal ");
×
251
    return;
×
252
  }
253

UNCOV
254
  switch (colType) {
×
UNCOV
255
    case TSDB_DATA_TYPE_BOOL:
×
UNCOV
256
      printf("%s ", (*(int8_t *)pVal->val) == 0 ? "false" : "true");
×
UNCOV
257
      break;
×
UNCOV
258
    case TSDB_DATA_TYPE_TINYINT:
×
UNCOV
259
      printf("%" PRIi8 " ", *(int8_t *)pVal->val);
×
UNCOV
260
      break;
×
UNCOV
261
    case TSDB_DATA_TYPE_SMALLINT:
×
UNCOV
262
      printf("%" PRIi16 " ", *(int16_t *)pVal->val);
×
UNCOV
263
      break;
×
UNCOV
264
    case TSDB_DATA_TYPE_INT:
×
UNCOV
265
      printf("%" PRIi32 " ", *(int32_t *)pVal->val);
×
UNCOV
266
      break;
×
UNCOV
267
    case TSDB_DATA_TYPE_BIGINT:
×
UNCOV
268
      printf("%" PRIi64 " ", *(int64_t *)pVal->val);
×
UNCOV
269
      break;
×
UNCOV
270
    case TSDB_DATA_TYPE_FLOAT:
×
UNCOV
271
      printf("%f ", *(float *)pVal->val);
×
UNCOV
272
      break;
×
UNCOV
273
    case TSDB_DATA_TYPE_DOUBLE:
×
UNCOV
274
      printf("%lf ", *(double *)pVal->val);
×
UNCOV
275
      break;
×
UNCOV
276
    case TSDB_DATA_TYPE_VARCHAR:
×
UNCOV
277
      printf("VARCHAR ");
×
UNCOV
278
      break;
×
UNCOV
279
    case TSDB_DATA_TYPE_TIMESTAMP:
×
UNCOV
280
      printf("%" PRIi64 " ", *(int64_t *)pVal->val);
×
UNCOV
281
      break;
×
UNCOV
282
    case TSDB_DATA_TYPE_NCHAR:
×
UNCOV
283
      printf("NCHAR ");
×
UNCOV
284
      break;
×
UNCOV
285
    case TSDB_DATA_TYPE_UTINYINT:
×
UNCOV
286
      printf("%" PRIu8 " ", *(uint8_t *)pVal->val);
×
UNCOV
287
      break;
×
UNCOV
288
    case TSDB_DATA_TYPE_USMALLINT:
×
UNCOV
289
      printf("%" PRIu16 " ", *(uint16_t *)pVal->val);
×
UNCOV
290
      break;
×
UNCOV
291
    case TSDB_DATA_TYPE_UINT:
×
UNCOV
292
      printf("%" PRIu32 " ", *(uint32_t *)pVal->val);
×
UNCOV
293
      break;
×
UNCOV
294
    case TSDB_DATA_TYPE_UBIGINT:
×
UNCOV
295
      printf("%" PRIu64 " ", *(uint64_t *)pVal->val);
×
UNCOV
296
      break;
×
297
    case TSDB_DATA_TYPE_JSON:
×
298
      printf("JSON ");
×
299
      break;
×
300
    case TSDB_DATA_TYPE_GEOMETRY:
×
301
      printf("GEOMETRY ");
×
302
      break;
×
303
    case TSDB_DATA_TYPE_VARBINARY:
×
304
      printf("VARBIN ");
×
305
      break;
×
306
    case TSDB_DATA_TYPE_DECIMAL:
×
307
      printf("DECIMAL ");
×
308
      break;
×
309
    case TSDB_DATA_TYPE_BLOB:
×
310
      printf("BLOB ");
×
311
      break;
×
312
    case TSDB_DATA_TYPE_MEDIUMBLOB:
×
313
      printf("MedBLOB ");
×
314
      break;
×
315
    // case TSDB_DATA_TYPE_BINARY:
316
    //   printf("BINARY ");
317
    //   break;
318
    case TSDB_DATA_TYPE_MAX:
×
319
      printf("UNDEF ");
×
320
      break;
×
321
    default:
×
322
      printf("UNDEF ");
×
323
      break;
×
324
  }
325
}
326

UNCOV
327
static FORCE_INLINE int32_t compareKvRowColId(const void *key1, const void *key2) {
×
UNCOV
328
  if (*(col_id_t *)key1 > ((SKvRowIdx *)key2)->colId) {
×
UNCOV
329
    return 1;
×
UNCOV
330
  } else if (*(col_id_t *)key1 < ((SKvRowIdx *)key2)->colId) {
×
UNCOV
331
    return -1;
×
332
  } else {
UNCOV
333
    return 0;
×
334
  }
335
}
336

UNCOV
337
bool tdSKvRowGetVal(STSRow *pRow, col_id_t colId, col_id_t colIdx, SCellVal *pVal) {
×
UNCOV
338
  if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
339
    tdRowSetVal(pVal, TD_VTYPE_NORM, TD_ROW_KEY_ADDR(pRow));
UNCOV
340
    return true;
×
341
  }
UNCOV
342
  int16_t nCols = tdRowGetNCols(pRow) - 1;
×
UNCOV
343
  if (nCols <= 0) {
×
UNCOV
344
    pVal->valType = TD_VTYPE_NONE;
×
UNCOV
345
    return true;
×
346
  }
347

348
  SKvRowIdx *pColIdx =
UNCOV
349
      (SKvRowIdx *)taosbsearch(&colId, TD_ROW_COL_IDX(pRow), nCols, sizeof(SKvRowIdx), compareKvRowColId, TD_EQ);
×
350

UNCOV
351
  if (!pColIdx) {
×
UNCOV
352
    pVal->valType = TD_VTYPE_NONE;
×
UNCOV
353
    return true;
×
354
  }
355

UNCOV
356
  void *pBitmap = tdGetBitmapAddrKv(pRow, tdRowGetNCols(pRow));
×
UNCOV
357
  if (tdGetKvRowValOfCol(pVal, pRow, pBitmap, pColIdx->offset,
×
UNCOV
358
                         POINTER_DISTANCE(pColIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx)) != TSDB_CODE_SUCCESS) {
×
359
    return false;
×
360
  }
UNCOV
361
  return true;
×
362
}
363

UNCOV
364
bool tdSTpRowGetVal(STSRow *pRow, col_id_t colId, col_type_t colType, int32_t flen, uint32_t offset, col_id_t colIdx,
×
365
                    SCellVal *pVal) {
UNCOV
366
  if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
367
    tdRowSetVal(pVal, TD_VTYPE_NORM, TD_ROW_KEY_ADDR(pRow));
UNCOV
368
    return true;
×
369
  }
UNCOV
370
  void *pBitmap = tdGetBitmapAddrTp(pRow, flen);
×
UNCOV
371
  if (tdGetTpRowValOfCol(pVal, pRow, pBitmap, colType, offset, colIdx)) return false;
×
UNCOV
372
  return true;
×
373
}
374

UNCOV
375
bool tdSTSRowIterNext(STSRowIter *pIter, SCellVal *pVal) {
×
UNCOV
376
  if (pIter->colIdx >= pIter->pSchema->numOfCols) {
×
UNCOV
377
    return false;
×
378
  }
379

UNCOV
380
  STColumn *pCol = &pIter->pSchema->columns[pIter->colIdx];
×
381

UNCOV
382
  if (pCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
UNCOV
383
    pVal->val = &pIter->pRow->ts;
×
UNCOV
384
    pVal->valType = TD_VTYPE_NORM;
×
UNCOV
385
    ++pIter->colIdx;
×
UNCOV
386
    return true;
×
387
  }
388

UNCOV
389
  bool ret = true;
×
UNCOV
390
  if (TD_IS_TP_ROW(pIter->pRow)) {
×
UNCOV
391
    ret = tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal);
×
UNCOV
392
  } else if (TD_IS_KV_ROW(pIter->pRow)) {
×
UNCOV
393
    ret = tdSTSRowIterGetKvVal(pIter, pCol->colId, &pIter->kvIdx, pVal);
×
394
  } else {
395
    return false;
×
396
  }
UNCOV
397
  ++pIter->colIdx;
×
398

UNCOV
399
  return ret;
×
400
}
401

UNCOV
402
int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t rowType) {
×
403
  STColumn *pTColumn;
404
  SColVal  *pColVal;
UNCOV
405
  int32_t   nColVal = taosArrayGetSize(pArray);
×
UNCOV
406
  int32_t   varDataLen = 0;
×
UNCOV
407
  int32_t   nonVarDataLen = 0;
×
UNCOV
408
  int32_t   maxVarDataLen = 0;
×
UNCOV
409
  int32_t   iColVal = 0;
×
UNCOV
410
  int32_t   nBound = 0;
×
UNCOV
411
  int32_t   code = 0;
×
UNCOV
412
  void     *varBuf = NULL;
×
UNCOV
413
  bool      isAlloc = false;
×
414

UNCOV
415
  if(nColVal <= 1) {
×
416
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
417
  }
418

UNCOV
419
  for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; ++iColumn) {
×
UNCOV
420
    pTColumn = &pTSchema->columns[iColumn];
×
UNCOV
421
    if (iColVal < nColVal) {
×
UNCOV
422
      pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
×
423
    } else {
424
      pColVal = NULL;
×
425
    }
UNCOV
426
    if (pColVal && !COL_VAL_IS_NONE(pColVal)) {
×
UNCOV
427
      ++nBound;
×
428
    }
429

UNCOV
430
    if (iColumn == 0) {
×
UNCOV
431
      if ((pColVal && pColVal->cid != pTColumn->colId) || (pTColumn->type != TSDB_DATA_TYPE_TIMESTAMP) ||
×
UNCOV
432
          (pTColumn->colId != PRIMARYKEY_TIMESTAMP_COL_ID)) {
×
433
        TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
434
      }
435
    } else {
UNCOV
436
      if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
UNCOV
437
        if (pColVal && COL_VAL_IS_VALUE(pColVal)) {
×
UNCOV
438
          varDataLen += (pColVal->value.nData + sizeof(VarDataLenT));
×
UNCOV
439
          if (maxVarDataLen < (pColVal->value.nData + sizeof(VarDataLenT))) {
×
UNCOV
440
            maxVarDataLen = pColVal->value.nData + sizeof(VarDataLenT);
×
441
          }
442
        } else {
UNCOV
443
          varDataLen += sizeof(VarDataLenT);
×
UNCOV
444
          if (pTColumn->type == TSDB_DATA_TYPE_VARCHAR || pTColumn->type == TSDB_DATA_TYPE_VARBINARY ||
×
UNCOV
445
              pTColumn->type == TSDB_DATA_TYPE_GEOMETRY) {
×
UNCOV
446
            varDataLen += CHAR_BYTES;
×
UNCOV
447
            if (maxVarDataLen < CHAR_BYTES + sizeof(VarDataLenT)) {
×
UNCOV
448
              maxVarDataLen = CHAR_BYTES + sizeof(VarDataLenT);
×
449
            }
450
          } else {
UNCOV
451
            varDataLen += INT_BYTES;
×
UNCOV
452
            if (maxVarDataLen < INT_BYTES + sizeof(VarDataLenT)) {
×
UNCOV
453
              maxVarDataLen = INT_BYTES + sizeof(VarDataLenT);
×
454
            }
455
          }
456
        }
457
      } else {
UNCOV
458
        if (pColVal && COL_VAL_IS_VALUE(pColVal)) {
×
UNCOV
459
          nonVarDataLen += TYPE_BYTES[pTColumn->type];
×
460
        }
461
      }
462
    }
463

UNCOV
464
    ++iColVal;
×
465
  }
466

UNCOV
467
  int32_t rowTotalLen = 0;
×
UNCOV
468
  if (rowType == TD_ROW_TP) {
×
UNCOV
469
    rowTotalLen = sizeof(STSRow) + pTSchema->flen + varDataLen + TD_BITMAP_BYTES(pTSchema->numOfCols - 1);
×
470
  } else {
UNCOV
471
    rowTotalLen = sizeof(STSRow) + sizeof(col_id_t) + varDataLen + nonVarDataLen + (nBound - 1) * sizeof(SKvRowIdx) +
×
UNCOV
472
                  TD_BITMAP_BYTES(nBound - 1);
×
473
  }
UNCOV
474
  if (!(*ppRow)) {
×
UNCOV
475
    *ppRow = (STSRow *)taosMemoryCalloc(1, rowTotalLen);
×
UNCOV
476
    isAlloc = true;
×
477
  }
478

UNCOV
479
  if (!(*ppRow)) {
×
480
    TAOS_RETURN(terrno);
×
481
  }
482

UNCOV
483
  if (maxVarDataLen > 0) {
×
UNCOV
484
    varBuf = taosMemoryMalloc(maxVarDataLen);
×
UNCOV
485
    if (!varBuf) {
×
486
      if (isAlloc) {
×
487
        taosMemoryFreeClear(*ppRow);
×
488
      }
489
      TAOS_RETURN(terrno);
×
490
    }
491
  }
492

UNCOV
493
  SRowBuilder rb = {.rowType = rowType};
×
UNCOV
494
  tdSRowInit(&rb, pTSchema->version);
×
UNCOV
495
  TAOS_CHECK_GOTO(tdSRowSetInfo(&rb, pTSchema->numOfCols, nBound, pTSchema->flen), NULL, _exit);
×
UNCOV
496
  TAOS_CHECK_GOTO(tdSRowResetBuf(&rb, *ppRow), NULL, _exit);
×
UNCOV
497
  int32_t iBound = 0;
×
498

UNCOV
499
  iColVal = 0;
×
UNCOV
500
  for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; ++iColumn) {
×
UNCOV
501
    pTColumn = &pTSchema->columns[iColumn];
×
502

UNCOV
503
    TDRowValT   valType = TD_VTYPE_NORM;
×
UNCOV
504
    const void *val = NULL;
×
UNCOV
505
    if (iColVal < nColVal) {
×
UNCOV
506
      pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
×
UNCOV
507
      if (COL_VAL_IS_NONE(pColVal)) {
×
UNCOV
508
        valType = TD_VTYPE_NONE;
×
UNCOV
509
      } else if (COL_VAL_IS_NULL(pColVal)) {
×
UNCOV
510
        valType = TD_VTYPE_NULL;
×
UNCOV
511
        ++iBound;
×
UNCOV
512
      } else if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
UNCOV
513
        varDataSetLen(varBuf, pColVal->value.nData);
×
UNCOV
514
        if (pColVal->value.nData != 0) {
×
UNCOV
515
          (void)memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData);
×
516
        }
UNCOV
517
        val = varBuf;
×
UNCOV
518
        ++iBound;
×
519
      } else {
UNCOV
520
        val = (const void *)&pColVal->value.val;
×
UNCOV
521
        ++iBound;
×
522
      }
523
    } else {
524
      // pColVal = NULL;
525
      valType = TD_VTYPE_NONE;
×
526
    }
527

UNCOV
528
    if (TD_IS_TP_ROW(rb.pBuf)) {
×
UNCOV
529
      TAOS_CHECK_GOTO(
×
530
          tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, pTColumn->offset, iColVal),
531
          NULL, _exit);
532
    } else {
UNCOV
533
      TAOS_CHECK_GOTO(
×
534
          tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, rb.offset, iBound - 1), NULL,
535
          _exit);
536
    }
537

UNCOV
538
    ++iColVal;
×
539
  }
540
  tdSRowEnd(&rb);
541

UNCOV
542
_exit:
×
UNCOV
543
  taosMemoryFreeClear(varBuf);
×
UNCOV
544
  if (code < 0) {
×
545
    if (isAlloc) {
×
546
      taosMemoryFreeClear(*ppRow);
×
547
    }
548
  }
549

UNCOV
550
  TAOS_RETURN(code);
×
551
}
552

553
static FORCE_INLINE int32_t tdCompareColId(const void *arg1, const void *arg2) {
×
554
  int32_t   colId = *(int32_t *)arg1;
×
555
  STColumn *pCol = (STColumn *)arg2;
×
556

557
  if (colId < pCol->colId) {
×
558
    return -1;
×
559
  } else if (colId == pCol->colId) {
×
560
    return 0;
×
561
  } else {
562
    return 1;
×
563
  }
564
}
565

566
bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCellVal *pVal) {
×
567
  if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
568
    pVal->val = &pIter->pRow->ts;
×
569
    pVal->valType = TD_VTYPE_NORM;
×
570
    return true;
×
571
  }
572

573
  bool    ret = true;
×
574
  STSRow *pRow = pIter->pRow;
×
575
  int16_t colIdx = -1;
×
576
  if (TD_IS_TP_ROW(pRow)) {
×
577
    STSchema *pSchema = pIter->pSchema;
×
578
    STColumn *pCol =
579
        (STColumn *)taosbsearch(&colId, pSchema->columns, pSchema->numOfCols, sizeof(STColumn), tdCompareColId, TD_EQ);
×
580
    if (!pCol) {
×
581
      pVal->valType = TD_VTYPE_NONE;
×
582
      if (COL_REACH_END(colId, pIter->maxColId)) return false;
×
583
      return true;
×
584
    }
585
#ifdef TD_SUPPORT_BITMAP
586
    colIdx = POINTER_DISTANCE(pCol, pSchema->columns) / sizeof(STColumn);
×
587
#endif
588
    if (tdGetTpRowValOfCol(pVal, pRow, pIter->pBitmap, pCol->type, pCol->offset, colIdx - 1)) ret = false;
×
589
  } else if (TD_IS_KV_ROW(pRow)) {
×
590
    SKvRowIdx *pIdx = (SKvRowIdx *)taosbsearch(&colId, TD_ROW_COL_IDX(pRow), tdRowGetNCols(pRow), sizeof(SKvRowIdx),
×
591
                                               compareKvRowColId, TD_EQ);
592
#ifdef TD_SUPPORT_BITMAP
593
    if (pIdx) {
×
594
      colIdx = POINTER_DISTANCE(pIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx);
×
595
    }
596
#endif
597
    if (tdGetKvRowValOfCol(pVal, pRow, pIter->pBitmap, pIdx ? pIdx->offset : -1, colIdx)) ret = false;
×
598
  } else {
599
    if (COL_REACH_END(colId, pIter->maxColId)) return false;
×
600
    pVal->valType = TD_VTYPE_NONE;
×
601
  }
602

603
  return ret;
×
604
}
605

UNCOV
606
int32_t tdGetKvRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int32_t offset, int16_t colIdx) {
×
607
#ifdef TD_SUPPORT_BITMAP
UNCOV
608
  if (!(colIdx < tdRowGetNCols(pRow) - 1)) {
×
609
    output->valType = TD_VTYPE_NONE;
×
610
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
611
  }
UNCOV
612
  int32_t code = 0;
×
UNCOV
613
  if ((code = tdGetBitmapValType(pBitmap, colIdx, &output->valType, 0)) != TSDB_CODE_SUCCESS) {
×
614
    output->valType = TD_VTYPE_NONE;
×
615
    TAOS_RETURN(code);
×
616
  }
UNCOV
617
  if (tdValTypeIsNorm(output->valType)) {
×
UNCOV
618
    if (offset < 0) {
×
619
      output->valType = TD_VTYPE_NONE;
×
620
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
621
    }
UNCOV
622
    output->val = POINTER_SHIFT(pRow, offset);
×
623
  }
624
#else
625
  if (offset < 0) {
626
    output->valType = TD_VTYPE_NONE;
627
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
628
  }
629
  output->val = POINTER_SHIFT(pRow, offset);
630
  output->valType = isNull(output->val, colType) ? TD_VTYPE_NULL : TD_VTYPE_NORM;
631
#endif
UNCOV
632
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
633
}
634

UNCOV
635
int32_t tdGetTpRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int8_t colType, int32_t offset,
×
636
                           int16_t colIdx) {
UNCOV
637
  if (pRow->statis == 0) {
×
UNCOV
638
    output->valType = TD_VTYPE_NORM;
×
UNCOV
639
    if (IS_VAR_DATA_TYPE(colType)) {
×
UNCOV
640
      output->val = POINTER_SHIFT(pRow, *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(pRow), offset));
×
641
    } else {
UNCOV
642
      output->val = POINTER_SHIFT(TD_ROW_DATA(pRow), offset);
×
643
    }
UNCOV
644
    TAOS_RETURN(TSDB_CODE_SUCCESS);
×
645
  }
646

UNCOV
647
  int32_t code = 0;
×
UNCOV
648
  if ((code = tdGetBitmapValType(pBitmap, colIdx, &output->valType, 0)) != TSDB_CODE_SUCCESS) {
×
649
    output->valType = TD_VTYPE_NONE;
×
650
    TAOS_RETURN(code);
×
651
  }
652

UNCOV
653
  if (output->valType == TD_VTYPE_NORM) {
×
UNCOV
654
    if (IS_VAR_DATA_TYPE(colType)) {
×
UNCOV
655
      output->val = POINTER_SHIFT(pRow, *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(pRow), offset));
×
656
    } else {
UNCOV
657
      output->val = POINTER_SHIFT(TD_ROW_DATA(pRow), offset);
×
658
    }
659
  }
660

UNCOV
661
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
662
}
663

UNCOV
664
int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colType, TDRowValT valType, const void *val,
×
665
                            bool isCopyVarData, int32_t offset, col_id_t colIdx) {
UNCOV
666
  STSRow *pRow = pBuilder->pBuf;
×
UNCOV
667
  if (!val) {
×
668
#ifdef TD_SUPPORT_BITMAP
UNCOV
669
    if (valType == TD_VTYPE_NORM) {
×
670
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
671
    }
672
#else
673
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
674
    d
675
#endif
676
  }
677
  // TS KEY is stored in STSRow.ts and not included in STSRow.data field.
UNCOV
678
  if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
×
UNCOV
679
    if (!val) {
×
680
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
681
    }
UNCOV
682
    TD_ROW_KEY(pRow) = *(TSKEY *)val;
×
683
    // The primary TS key is Norm all the time, thus its valType is not stored in bitmap.
UNCOV
684
    TAOS_RETURN(TSDB_CODE_SUCCESS);
×
685
  }
686
  // TODO:  We can avoid the type judegement by FP, but would prevent the inline scheme.
687

UNCOV
688
  switch (valType) {
×
UNCOV
689
    case TD_VTYPE_NORM:
×
UNCOV
690
      break;
×
UNCOV
691
    case TD_VTYPE_NULL:
×
UNCOV
692
      if (!pBuilder->hasNull) pBuilder->hasNull = true;
×
UNCOV
693
      break;
×
UNCOV
694
    case TD_VTYPE_NONE:
×
UNCOV
695
      if (!pBuilder->hasNone) pBuilder->hasNone = true;
×
UNCOV
696
      TAOS_RETURN(TSDB_CODE_SUCCESS);
×
697
    default:
×
698
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
699
  }
700

UNCOV
701
  if (TD_IS_TP_ROW(pRow)) {
×
UNCOV
702
    TAOS_CHECK_RETURN(tdAppendColValToTpRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset));
×
703
  } else {
UNCOV
704
    TAOS_CHECK_RETURN(tdAppendColValToKvRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset, colId));
×
705
  }
UNCOV
706
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
707
}
708

UNCOV
709
int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const void *val, bool isCopyVarData,
×
710
                              int8_t colType, int16_t colIdx, int32_t offset, col_id_t colId) {
UNCOV
711
  if (colIdx < 1) {
×
712
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
713
  }
UNCOV
714
  --colIdx;
×
715

716
#ifdef TD_SUPPORT_BITMAP
UNCOV
717
  TAOS_CHECK_RETURN(tdSetBitmapValType(pBuilder->pBitmap, colIdx, valType, 0));
×
718
#endif
719

UNCOV
720
  STSRow *row = pBuilder->pBuf;
×
721
  // No need to store None/Null values.
UNCOV
722
  SKvRowIdx *pColIdx = (SKvRowIdx *)POINTER_SHIFT(TD_ROW_COL_IDX(row), offset);
×
UNCOV
723
  pColIdx->colId = colId;
×
UNCOV
724
  pColIdx->offset = TD_ROW_LEN(row);  // the offset include the TD_ROW_HEAD_LEN
×
UNCOV
725
  pBuilder->offset += sizeof(SKvRowIdx);
×
UNCOV
726
  if (valType == TD_VTYPE_NORM) {
×
UNCOV
727
    char *ptr = (char *)POINTER_SHIFT(row, TD_ROW_LEN(row));
×
UNCOV
728
    if (IS_VAR_DATA_TYPE(colType)) {
×
UNCOV
729
      if (isCopyVarData) {
×
UNCOV
730
        (void)memcpy(ptr, val, varDataTLen(val));
×
731
      }
UNCOV
732
      TD_ROW_LEN(row) += varDataTLen(val);
×
733
    } else {
UNCOV
734
      (void)memcpy(ptr, val, TYPE_BYTES[colType]);
×
UNCOV
735
      TD_ROW_LEN(row) += TYPE_BYTES[colType];
×
736
    }
737
  }
738

UNCOV
739
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
740
}
741

UNCOV
742
int32_t tdAppendColValToTpRow(SRowBuilder *pBuilder, TDRowValT valType, const void *val, bool isCopyVarData,
×
743
                              int8_t colType, int16_t colIdx, int32_t offset) {
UNCOV
744
  if (colIdx < 1) {
×
745
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
746
  }
UNCOV
747
  --colIdx;
×
748

749
#ifdef TD_SUPPORT_BITMAP
UNCOV
750
  TAOS_CHECK_RETURN(tdSetBitmapValType(pBuilder->pBitmap, colIdx, valType, 0));
×
751
#endif
752

UNCOV
753
  STSRow *row = pBuilder->pBuf;
×
754

755
  // 1. No need to set flen part for Null/None, just use bitmap. When upsert for the same primary TS key, the bitmap
756
  // should be updated simultaneously if Norm val overwrite Null/None cols.
757
  // 2. When consume STSRow in memory by taos client/tq, the output of Null/None cols should both be Null.
UNCOV
758
  if (valType == TD_VTYPE_NORM) {
×
759
    // TODO: The layout of new data types imported since 3.0 like blob/medium blob is the same with binary/nchar.
UNCOV
760
    if (IS_VAR_DATA_TYPE(colType)) {
×
761
      // ts key stored in STSRow.ts
UNCOV
762
      *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(row), offset) = TD_ROW_LEN(row);
×
UNCOV
763
      if (isCopyVarData) {
×
UNCOV
764
        (void)memcpy(POINTER_SHIFT(row, TD_ROW_LEN(row)), val, varDataTLen(val));
×
765
      }
UNCOV
766
      TD_ROW_LEN(row) += varDataTLen(val);
×
767
    } else {
UNCOV
768
      (void)memcpy(POINTER_SHIFT(TD_ROW_DATA(row), offset), val, TYPE_BYTES[colType]);
×
769
    }
770
  }
771

UNCOV
772
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
773
}
774

UNCOV
775
int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
×
UNCOV
776
  pBuilder->pBuf = (STSRow *)pBuf;
×
UNCOV
777
  if (!pBuilder->pBuf) {
×
778
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
779
  }
780

UNCOV
781
  if (pBuilder->hasNone) pBuilder->hasNone = false;
×
UNCOV
782
  if (pBuilder->hasNull) pBuilder->hasNull = false;
×
783

UNCOV
784
  TD_ROW_SET_INFO(pBuilder->pBuf, 0);
×
UNCOV
785
  TD_ROW_SET_TYPE(pBuilder->pBuf, pBuilder->rowType);
×
786

UNCOV
787
  if(!(pBuilder->nBitmaps > 0 && pBuilder->flen > 0)) {
×
788
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
789
  }
790

UNCOV
791
  uint32_t len = 0;
×
UNCOV
792
  switch (pBuilder->rowType) {
×
UNCOV
793
    case TD_ROW_TP:
×
794
#ifdef TD_SUPPORT_BITMAP
UNCOV
795
      pBuilder->pBitmap = tdGetBitmapAddrTp(pBuilder->pBuf, pBuilder->flen);
×
UNCOV
796
      (void)memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBitmaps);
×
797
#endif
798
      // the primary TS key is stored separatedly
UNCOV
799
      len = TD_ROW_HEAD_LEN + pBuilder->flen + pBuilder->nBitmaps;
×
UNCOV
800
      TD_ROW_SET_LEN(pBuilder->pBuf, len);
×
UNCOV
801
      TD_ROW_SET_SVER(pBuilder->pBuf, pBuilder->sver);
×
UNCOV
802
      break;
×
UNCOV
803
    case TD_ROW_KV:
×
804
#ifdef TD_SUPPORT_BITMAP
UNCOV
805
      pBuilder->pBitmap = tdGetBitmapAddrKv(pBuilder->pBuf, pBuilder->nBoundCols);
×
UNCOV
806
      (void)memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBoundBitmaps);
×
807
#endif
UNCOV
808
      len = TD_ROW_HEAD_LEN + TD_ROW_NCOLS_LEN + (pBuilder->nBoundCols - 1) * sizeof(SKvRowIdx) +
×
UNCOV
809
            pBuilder->nBoundBitmaps;  // add
×
UNCOV
810
      TD_ROW_SET_LEN(pBuilder->pBuf, len);
×
UNCOV
811
      TD_ROW_SET_SVER(pBuilder->pBuf, pBuilder->sver);
×
UNCOV
812
      TD_ROW_SET_NCOLS(pBuilder->pBuf, pBuilder->nBoundCols);
×
UNCOV
813
      pBuilder->offset = 0;
×
UNCOV
814
      break;
×
815
    default:
×
816
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
817
  }
818

UNCOV
819
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
820
}
821

822
int32_t tdSRowGetBuf(SRowBuilder *pBuilder, void *pBuf) {
×
823
  pBuilder->pBuf = (STSRow *)pBuf;
×
824
  if (!pBuilder->pBuf) {
×
825
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
826
  }
827

828
  if(!(pBuilder->nBitmaps > 0 && pBuilder->flen > 0)) {
×
829
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
830
  }
831

832
  uint32_t len = 0;
×
833
  switch (pBuilder->rowType) {
×
834
    case TD_ROW_TP:
×
835
#ifdef TD_SUPPORT_BITMAP
836
      pBuilder->pBitmap = tdGetBitmapAddrTp(pBuilder->pBuf, pBuilder->flen);
×
837
#endif
838
      break;
×
839
    case TD_ROW_KV:
×
840
#ifdef TD_SUPPORT_BITMAP
841
      pBuilder->pBitmap = tdGetBitmapAddrKv(pBuilder->pBuf, pBuilder->nBoundCols);
×
842
#endif
843
      break;
×
844
    default:
×
845
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
846
  }
847
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
848
}
849

850
void tdSRowReset(SRowBuilder *pBuilder) {
×
851
  pBuilder->rowType = TD_ROW_TP;
×
852
  pBuilder->pBuf = NULL;
×
853
  pBuilder->nBoundCols = -1;
×
854
  pBuilder->nCols = -1;
×
855
  pBuilder->flen = -1;
×
856
  pBuilder->pBitmap = NULL;
×
857
}
×
858

859
int32_t tdSRowSetTpInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t flen) {
×
860
  pBuilder->flen = flen;
×
861
  pBuilder->nCols = nCols;
×
862
  if (pBuilder->flen <= 0 || pBuilder->nCols <= 0) {
×
863
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
864
  }
865
#ifdef TD_SUPPORT_BITMAP
866
  // the primary TS key is stored separatedly
867
  pBuilder->nBitmaps = (int16_t)TD_BITMAP_BYTES(pBuilder->nCols - 1);
×
868
#else
869
  pBuilder->nBitmaps = 0;
870
  pBuilder->nBoundBitmaps = 0;
871
#endif
872
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
873
}
874

UNCOV
875
int32_t tdSRowSetInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBoundCols, int32_t flen) {
×
UNCOV
876
  pBuilder->flen = flen;
×
UNCOV
877
  pBuilder->nCols = nCols;
×
UNCOV
878
  pBuilder->nBoundCols = nBoundCols;
×
UNCOV
879
  if (pBuilder->flen <= 0 || pBuilder->nCols <= 0) {
×
880
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
881
  }
882
#ifdef TD_SUPPORT_BITMAP
883
  // the primary TS key is stored separatedly
UNCOV
884
  pBuilder->nBitmaps = (int16_t)TD_BITMAP_BYTES(pBuilder->nCols - 1);
×
UNCOV
885
  if (nBoundCols > 0) {
×
UNCOV
886
    pBuilder->nBoundBitmaps = (int16_t)TD_BITMAP_BYTES(pBuilder->nBoundCols - 1);
×
887
  } else {
888
    pBuilder->nBoundBitmaps = 0;
×
889
  }
890
#else
891
  pBuilder->nBitmaps = 0;
892
  pBuilder->nBoundBitmaps = 0;
893
#endif
UNCOV
894
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
895
}
896

897
int32_t tdSetBitmapValTypeII(void *pBitmap, int16_t colIdx, TDRowValT valType) {
UNCOV
898
  if (!pBitmap || colIdx < 0) {
×
899
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
900
  }
UNCOV
901
  int16_t nBytes = colIdx / TD_VTYPE_PARTS;
×
UNCOV
902
  int16_t nOffset = colIdx & TD_VTYPE_OPTR;
×
UNCOV
903
  char   *pDestByte = (char *)POINTER_SHIFT(pBitmap, nBytes);
×
904
  // use literal value directly and not use formula to simplify the codes
UNCOV
905
  switch (nOffset) {
×
UNCOV
906
    case 0:
×
UNCOV
907
      *pDestByte = ((*pDestByte) & 0x3F) | (valType << 6);
×
908
      // set the value and clear other partitions for offset 0
909
      // *pDestByte |= (valType << 6);
UNCOV
910
      break;
×
UNCOV
911
    case 1:
×
UNCOV
912
      *pDestByte = ((*pDestByte) & 0xCF) | (valType << 4);
×
913
      // *pDestByte |= (valType << 4);
UNCOV
914
      break;
×
UNCOV
915
    case 2:
×
UNCOV
916
      *pDestByte = ((*pDestByte) & 0xF3) | (valType << 2);
×
917
      // *pDestByte |= (valType << 2);
UNCOV
918
      break;
×
UNCOV
919
    case 3:
×
UNCOV
920
      *pDestByte = ((*pDestByte) & 0xFC) | valType;
×
921
      // *pDestByte |= (valType);
UNCOV
922
      break;
×
923
    default:
×
924
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
925
  }
UNCOV
926
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
927
}
928

929
int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int8_t bitmapMode) {
UNCOV
930
  switch (bitmapMode) {
×
UNCOV
931
    case 0:
×
UNCOV
932
      tdSetBitmapValTypeII(pBitmap, colIdx, valType);
×
UNCOV
933
      break;
×
934
#if 0
935
    case -1:
936
    case 1:
937
      tdSetBitmapValTypeI(pBitmap, colIdx, valType);
938
      break;
939
#endif
940
    default:
×
941
      TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
942
  }
UNCOV
943
  TAOS_RETURN(TSDB_CODE_SUCCESS);
×
944
}
945

UNCOV
946
int32_t tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColVal) {
×
UNCOV
947
  STColumn *pTColumn = &pTSchema->columns[iCol];
×
UNCOV
948
  SCellVal  cv = {0};
×
949

UNCOV
950
  if (!((pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID) || (iCol > 0))) {
×
951
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
952
  }
953

UNCOV
954
  if (TD_IS_TP_ROW(pRow)) {
×
UNCOV
955
    TAOS_UNUSED(tdSTpRowGetVal(pRow, pTColumn->colId, pTColumn->type, pTSchema->flen, pTColumn->offset, iCol - 1, &cv));
×
UNCOV
956
  } else if (TD_IS_KV_ROW(pRow)) {
×
UNCOV
957
    TAOS_UNUSED(tdSKvRowGetVal(pRow, pTColumn->colId, iCol - 1, &cv));
×
958
  } else {
959
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
960
  }
961

UNCOV
962
  if (tdValTypeIsNone(cv.valType)) {
×
UNCOV
963
    *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
×
UNCOV
964
  } else if (tdValTypeIsNull(cv.valType)) {
×
UNCOV
965
    *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
×
966
  } else {
UNCOV
967
    pColVal->cid = pTColumn->colId;
×
UNCOV
968
    pColVal->value.type = pTColumn->type;
×
UNCOV
969
    pColVal->flag = CV_FLAG_VALUE;
×
970

UNCOV
971
    if (IS_VAR_DATA_TYPE(pTColumn->type)) {
×
UNCOV
972
      pColVal->value.nData = varDataLen(cv.val);
×
UNCOV
973
      pColVal->value.pData = varDataVal(cv.val);
×
974
    } else {
UNCOV
975
      (void)memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes);
×
976
    }
977
  }
UNCOV
978
  return 0;
×
979
}
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