diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 7d1c6b02ad..a6167a1a75 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1024,6 +1024,11 @@ static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static FORCE_INLINE int64_t tI8ToI64(const void *pData) { return *(int8_t *)pData; } +static FORCE_INLINE int64_t tI16ToI64(const void *pData) { return *(int16_t *)pData; } +static FORCE_INLINE int64_t tI32ToI64(const void *pData) { return *(int32_t *)pData; } +static FORCE_INLINE int64_t tI64ToI64(const void *pData) { return *(int64_t *)pData; } static struct { int8_t type; int32_t bytes; @@ -1031,122 +1036,148 @@ static struct { int32_t (*startFn)(SCompressor *, int8_t type, int8_t cmprAlg); int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); + int64_t (*getI64)(const void *pData); } DATA_TYPE_INFO[] = { - {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, .isVarLen = 0, .startFn = NULL, .cmprFn = NULL, .endFn = NULL}, + {.type = TSDB_DATA_TYPE_NULL, + .bytes = 0, + .isVarLen = 0, + .startFn = NULL, + .cmprFn = NULL, + .endFn = NULL, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, .startFn = tCompBoolStart, .cmprFn = tCompBool, - .endFn = tCompBoolEnd}, + .endFn = tCompBoolEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_TINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI8ToI64}, {.type = TSDB_DATA_TYPE_SMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI16ToI64}, {.type = TSDB_DATA_TYPE_INT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI32ToI64}, {.type = TSDB_DATA_TYPE_BIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI64ToI64}, {.type = TSDB_DATA_TYPE_FLOAT, .bytes = 4, .isVarLen = 0, .startFn = tCompFloatStart, .cmprFn = tCompFloat, - .endFn = tCompFloatEnd}, + .endFn = tCompFloatEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_DOUBLE, .bytes = 8, .isVarLen = 0, .startFn = tCompDoubleStart, .cmprFn = tCompDouble, - .endFn = tCompDoubleEnd}, + .endFn = tCompDoubleEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_VARCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = 8, .isVarLen = 0, .startFn = tCompTimestampStart, .cmprFn = tCompTimestamp, - .endFn = tCompTimestampEnd}, + .endFn = tCompTimestampEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_NCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_UTINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI8ToI64}, {.type = TSDB_DATA_TYPE_USMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI16ToI64}, {.type = TSDB_DATA_TYPE_UINT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI32ToI64}, {.type = TSDB_DATA_TYPE_UBIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI64ToI64}, {.type = TSDB_DATA_TYPE_JSON, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_VARBINARY, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_DECIMAL, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_BLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_MEDIUMBLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, }; struct SCompressor { @@ -1442,8 +1473,7 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) ASSERT(nData == DATA_TYPE_INFO[pCmprsor->type].bytes); if (pCmprsor->pBuf[0] == 0) { - int64_t val = 0; - memcpy(&val, pData, nData); // little-endian only + int64_t val = DATA_TYPE_INFO[pCmprsor->type].getI64(pData); if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) { code = tCompIntSwitchToCopy(pCmprsor);