more code
This commit is contained in:
parent
37eb6345a3
commit
6f71556e79
|
@ -2134,6 +2134,82 @@ _exit:
|
|||
return code;
|
||||
}
|
||||
|
||||
static int32_t tColDataSwapValue(SColData *pColData, int32_t i, int32_t j) {
|
||||
int32_t code = 0;
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pColData->type)) {
|
||||
int32_t nData1 = pColData->aOffset[i + 1] - pColData->aOffset[i];
|
||||
int32_t nData2 = (j < pColData->nVal - 1) ? pColData->aOffset[j + 1] - pColData->aOffset[j]
|
||||
: pColData->nData - pColData->aOffset[j];
|
||||
uint8_t *pData = taosMemoryMalloc(TMAX(nData1, nData2));
|
||||
if (pData == NULL) {
|
||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
if (nData1 > nData2) {
|
||||
memcpy(pData, pColData->pData + pColData->aOffset[i], nData1);
|
||||
memcpy(pColData->pData + pColData->aOffset[i], pColData->pData + pColData->aOffset[j], nData2);
|
||||
memmove(pColData->pData + pColData->aOffset[i] + nData2, pColData->pData + pColData->aOffset[i] + nData1,
|
||||
pColData->aOffset[j] - pColData->aOffset[i + 1]);
|
||||
memcpy(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pData, nData1);
|
||||
} else {
|
||||
memcpy(pData, pColData->pData + pColData->aOffset[j], nData2);
|
||||
memcpy(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pColData->pData + pColData->aOffset[i], nData1);
|
||||
memmove(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pColData->pData + pColData->aOffset[i] + nData1,
|
||||
pColData->aOffset[j] - pColData->aOffset[i + 1]);
|
||||
memcpy(pColData->pData + pColData->aOffset[i], pData, nData2);
|
||||
}
|
||||
for (int32_t k = i + 1; k <= j; ++k) {
|
||||
pColData->aOffset[k] = pColData->aOffset[k] + nData2 - nData1;
|
||||
}
|
||||
|
||||
taosMemoryFree(pData);
|
||||
} else {
|
||||
uint64_t val;
|
||||
memcpy(&val, &pColData->pData[TYPE_BYTES[pColData->type] * i], TYPE_BYTES[pColData->type]);
|
||||
memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * i], &pColData->pData[TYPE_BYTES[pColData->type] * j],
|
||||
TYPE_BYTES[pColData->type]);
|
||||
memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * j], &val, TYPE_BYTES[pColData->type]);
|
||||
}
|
||||
|
||||
_exit:
|
||||
return code;
|
||||
}
|
||||
static void tColDataSwap(SColData *pColData, int32_t i, int32_t j) {
|
||||
ASSERT(i < j);
|
||||
ASSERT(j < pColData->nVal);
|
||||
|
||||
switch (pColData->flag) {
|
||||
case HAS_NONE:
|
||||
case HAS_NULL:
|
||||
break;
|
||||
case (HAS_NULL | HAS_NONE): {
|
||||
uint8_t bv = GET_BIT1(pColData->pBitMap, i);
|
||||
SET_BIT1(pColData->pBitMap, i, GET_BIT1(pColData->pBitMap, j));
|
||||
SET_BIT1(pColData->pBitMap, j, bv);
|
||||
} break;
|
||||
case HAS_VALUE: {
|
||||
tColDataSwapValue(pColData, i, j);
|
||||
} break;
|
||||
case (HAS_VALUE | HAS_NONE):
|
||||
case (HAS_VALUE | HAS_NULL): {
|
||||
uint8_t bv = GET_BIT1(pColData->pBitMap, i);
|
||||
SET_BIT1(pColData->pBitMap, i, GET_BIT1(pColData->pBitMap, j));
|
||||
SET_BIT1(pColData->pBitMap, j, bv);
|
||||
tColDataSwapValue(pColData, i, j);
|
||||
} break;
|
||||
case (HAS_VALUE | HAS_NULL | HAS_NONE): {
|
||||
uint8_t bv = GET_BIT2(pColData->pBitMap, i);
|
||||
SET_BIT2(pColData->pBitMap, i, GET_BIT2(pColData->pBitMap, j));
|
||||
SET_BIT2(pColData->pBitMap, j, bv);
|
||||
tColDataSwapValue(pColData, i, j);
|
||||
} break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
static void tColDataSort(SColData *aColData, int32_t nColData) {
|
||||
if (aColData[0].nVal == 0) return;
|
||||
// TODO
|
||||
|
|
Loading…
Reference in New Issue