This commit is contained in:
Hongze Cheng 2022-09-28 15:46:56 +08:00
parent 5be361ee08
commit 0ca19fb42b
1 changed files with 52 additions and 22 deletions

View File

@ -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 tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg);
static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); 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 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 { static struct {
int8_t type; int8_t type;
int32_t bytes; int32_t bytes;
@ -1031,122 +1036,148 @@ static struct {
int32_t (*startFn)(SCompressor *, int8_t type, int8_t cmprAlg); int32_t (*startFn)(SCompressor *, int8_t type, int8_t cmprAlg);
int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData);
int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *);
int64_t (*getI64)(const void *pData);
} DATA_TYPE_INFO[] = { } 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, {.type = TSDB_DATA_TYPE_BOOL,
.bytes = 1, .bytes = 1,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompBoolStart, .startFn = tCompBoolStart,
.cmprFn = tCompBool, .cmprFn = tCompBool,
.endFn = tCompBoolEnd}, .endFn = tCompBoolEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_TINYINT, {.type = TSDB_DATA_TYPE_TINYINT,
.bytes = 1, .bytes = 1,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI8ToI64},
{.type = TSDB_DATA_TYPE_SMALLINT, {.type = TSDB_DATA_TYPE_SMALLINT,
.bytes = 2, .bytes = 2,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI16ToI64},
{.type = TSDB_DATA_TYPE_INT, {.type = TSDB_DATA_TYPE_INT,
.bytes = 4, .bytes = 4,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI32ToI64},
{.type = TSDB_DATA_TYPE_BIGINT, {.type = TSDB_DATA_TYPE_BIGINT,
.bytes = 8, .bytes = 8,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI64ToI64},
{.type = TSDB_DATA_TYPE_FLOAT, {.type = TSDB_DATA_TYPE_FLOAT,
.bytes = 4, .bytes = 4,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompFloatStart, .startFn = tCompFloatStart,
.cmprFn = tCompFloat, .cmprFn = tCompFloat,
.endFn = tCompFloatEnd}, .endFn = tCompFloatEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_DOUBLE, {.type = TSDB_DATA_TYPE_DOUBLE,
.bytes = 8, .bytes = 8,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompDoubleStart, .startFn = tCompDoubleStart,
.cmprFn = tCompDouble, .cmprFn = tCompDouble,
.endFn = tCompDoubleEnd}, .endFn = tCompDoubleEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_VARCHAR, {.type = TSDB_DATA_TYPE_VARCHAR,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_TIMESTAMP, {.type = TSDB_DATA_TYPE_TIMESTAMP,
.bytes = 8, .bytes = 8,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompTimestampStart, .startFn = tCompTimestampStart,
.cmprFn = tCompTimestamp, .cmprFn = tCompTimestamp,
.endFn = tCompTimestampEnd}, .endFn = tCompTimestampEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_NCHAR, {.type = TSDB_DATA_TYPE_NCHAR,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_UTINYINT, {.type = TSDB_DATA_TYPE_UTINYINT,
.bytes = 1, .bytes = 1,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI8ToI64},
{.type = TSDB_DATA_TYPE_USMALLINT, {.type = TSDB_DATA_TYPE_USMALLINT,
.bytes = 2, .bytes = 2,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI16ToI64},
{.type = TSDB_DATA_TYPE_UINT, {.type = TSDB_DATA_TYPE_UINT,
.bytes = 4, .bytes = 4,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI32ToI64},
{.type = TSDB_DATA_TYPE_UBIGINT, {.type = TSDB_DATA_TYPE_UBIGINT,
.bytes = 8, .bytes = 8,
.isVarLen = 0, .isVarLen = 0,
.startFn = tCompIntStart, .startFn = tCompIntStart,
.cmprFn = tCompInt, .cmprFn = tCompInt,
.endFn = tCompIntEnd}, .endFn = tCompIntEnd,
.getI64 = tI64ToI64},
{.type = TSDB_DATA_TYPE_JSON, {.type = TSDB_DATA_TYPE_JSON,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_VARBINARY, {.type = TSDB_DATA_TYPE_VARBINARY,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_DECIMAL, {.type = TSDB_DATA_TYPE_DECIMAL,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_BLOB, {.type = TSDB_DATA_TYPE_BLOB,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
{.type = TSDB_DATA_TYPE_MEDIUMBLOB, {.type = TSDB_DATA_TYPE_MEDIUMBLOB,
.bytes = 1, .bytes = 1,
.isVarLen = 1, .isVarLen = 1,
.startFn = tCompBinaryStart, .startFn = tCompBinaryStart,
.cmprFn = tCompBinary, .cmprFn = tCompBinary,
.endFn = tCompBinaryEnd}, .endFn = tCompBinaryEnd,
.getI64 = NULL},
}; };
struct SCompressor { 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); ASSERT(nData == DATA_TYPE_INFO[pCmprsor->type].bytes);
if (pCmprsor->pBuf[0] == 0) { if (pCmprsor->pBuf[0] == 0) {
int64_t val = 0; int64_t val = DATA_TYPE_INFO[pCmprsor->type].getI64(pData);
memcpy(&val, pData, nData); // little-endian only
if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) { if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) {
code = tCompIntSwitchToCopy(pCmprsor); code = tCompIntSwitchToCopy(pCmprsor);