more code
This commit is contained in:
parent
37eb6345a3
commit
6f71556e79
|
@ -2134,6 +2134,82 @@ _exit:
|
||||||
return code;
|
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) {
|
static void tColDataSort(SColData *aColData, int32_t nColData) {
|
||||||
if (aColData[0].nVal == 0) return;
|
if (aColData[0].nVal == 0) return;
|
||||||
// TODO
|
// TODO
|
||||||
|
|
Loading…
Reference in New Issue