From 7c31f060af2e2a9970ba345678ddc7e715306005 Mon Sep 17 00:00:00 2001 From: wangjiaming0909 Date: Fri, 17 Jan 2025 17:16:48 +0800 Subject: [PATCH] start to refactor GET_TYPED_DATA --- include/common/ttypes.h | 105 ++++++++++++++++++----------- include/libs/decimal/decimal.h | 3 + source/libs/decimal/src/decimal.c | 60 ++++++++++++++++- source/libs/scalar/src/filter.c | 3 + source/libs/scalar/src/scalar.c | 2 +- source/libs/scalar/src/sclvector.c | 6 +- 6 files changed, 133 insertions(+), 46 deletions(-) diff --git a/include/common/ttypes.h b/include/common/ttypes.h index 3dc8e6ee73..4757cce810 100644 --- a/include/common/ttypes.h +++ b/include/common/ttypes.h @@ -53,45 +53,70 @@ typedef struct { #define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0])) #define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v)) -#define GET_TYPED_DATA(_v, _finalType, _type, _data) \ - do { \ - switch (_type) { \ - case TSDB_DATA_TYPE_BOOL: \ - case TSDB_DATA_TYPE_TINYINT: \ - (_v) = (_finalType)GET_INT8_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_UTINYINT: \ - (_v) = (_finalType)GET_UINT8_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_SMALLINT: \ - (_v) = (_finalType)GET_INT16_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_USMALLINT: \ - (_v) = (_finalType)GET_UINT16_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_TIMESTAMP: \ - case TSDB_DATA_TYPE_BIGINT: \ - (_v) = (_finalType)(GET_INT64_VAL(_data)); \ - break; \ - case TSDB_DATA_TYPE_UBIGINT: \ - (_v) = (_finalType)(GET_UINT64_VAL(_data)); \ - break; \ - case TSDB_DATA_TYPE_FLOAT: \ - (_v) = (_finalType)GET_FLOAT_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_DOUBLE: \ - (_v) = (_finalType)GET_DOUBLE_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_UINT: \ - (_v) = (_finalType)GET_UINT32_VAL(_data); \ - break; \ - case TSDB_DATA_TYPE_INT: \ - (_v) = (_finalType)GET_INT32_VAL(_data); \ - break; \ - default: \ - (_v) = (_finalType)varDataLen(_data); \ - break; \ - } \ +#define DEFINE_TYPE_FROM_DECIMAL_FUNC(oType, decimalType) \ + oType oType##From##decimalType(const void* pDec, uint8_t prec, uint8_t scale) + +#define DEFINE_TYPE_FROM_DECIMAL_FUNCS(prefix, decimalType) \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(bool, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int8_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint8_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int16_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint16_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int32_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint32_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int64_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint64_t, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(float, decimalType); \ + prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(double, decimalType); + +DEFINE_TYPE_FROM_DECIMAL_FUNCS(extern, Decimal64); +DEFINE_TYPE_FROM_DECIMAL_FUNCS(extern, Decimal128); + +#define GET_TYPED_DATA(_v, _finalType, _type, _data) \ + do { \ + switch (_type) { \ + case TSDB_DATA_TYPE_BOOL: \ + case TSDB_DATA_TYPE_TINYINT: \ + (_v) = (_finalType)GET_INT8_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_UTINYINT: \ + (_v) = (_finalType)GET_UINT8_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_SMALLINT: \ + (_v) = (_finalType)GET_INT16_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_USMALLINT: \ + (_v) = (_finalType)GET_UINT16_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_TIMESTAMP: \ + case TSDB_DATA_TYPE_BIGINT: \ + (_v) = (_finalType)(GET_INT64_VAL(_data)); \ + break; \ + case TSDB_DATA_TYPE_UBIGINT: \ + (_v) = (_finalType)(GET_UINT64_VAL(_data)); \ + break; \ + case TSDB_DATA_TYPE_FLOAT: \ + (_v) = (_finalType)GET_FLOAT_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_DOUBLE: \ + (_v) = (_finalType)GET_DOUBLE_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_UINT: \ + (_v) = (_finalType)GET_UINT32_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_INT: \ + (_v) = (_finalType)GET_INT32_VAL(_data); \ + break; \ + case TSDB_DATA_TYPE_DECIMAL: \ + (_v) = _finalType##FromDecimal128(_data, 10, 0); \ + break; \ + case TSDB_DATA_TYPE_DECIMAL64: \ + (_v) = _finalType##FromDecimal64(_data, 10, 0); \ + break; \ + default: \ + (_v) = (_finalType)varDataLen(_data); \ + break; \ + } \ } while (0) #define SET_TYPED_DATA(_v, _type, _data) \ @@ -382,7 +407,7 @@ void *getDataMax(int32_t type, void *value); #define STypeMod int32_t uint8_t decimalTypeFromPrecision(uint8_t precision); STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale); -void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale); +void decimalFromTypeMod(STypeMod typeMod, uint8_t *precision, uint8_t *scale); #ifdef __cplusplus } diff --git a/include/libs/decimal/decimal.h b/include/libs/decimal/decimal.h index 9491278564..964fc5d6c6 100644 --- a/include/libs/decimal/decimal.h +++ b/include/libs/decimal/decimal.h @@ -65,6 +65,9 @@ int32_t decimalOp(EOperatorType op, const SDataType* pLeftT, const SDataType* pR const void* pLeftData, const void* pRightData, void* pOutputData); int32_t convertToDecimal(const void* pData, const SDataType* pInputType, void* pOut, const SDataType* pOutType); +DEFINE_TYPE_FROM_DECIMAL_FUNCS(, Decimal64); +DEFINE_TYPE_FROM_DECIMAL_FUNCS(, Decimal128); + // TODO wjm change rightWordNum to DecimalType?? typedef struct SDecimalOps { void (*negate)(DecimalType* pWord); diff --git a/source/libs/decimal/src/decimal.c b/source/libs/decimal/src/decimal.c index 1320ce454a..9e0951940e 100644 --- a/source/libs/decimal/src/decimal.c +++ b/source/libs/decimal/src/decimal.c @@ -15,8 +15,8 @@ */ #include "decimal.h" -#include "wideInteger.h" #include "tdataformat.h" +#include "wideInteger.h" typedef enum DecimalInternalType { DECIMAL_64 = 0, @@ -228,7 +228,9 @@ static Decimal64 SCALE_MULTIPLIER_64[19] = {1LL, 100000000000000000LL, 1000000000000000000LL}; -#define DECIMAL64_ONE SCALE_MULTIPLIER_64[0] +static const Decimal64 decimal64Zero = {0}; +#define DECIMAL64_ONE SCALE_MULTIPLIER_64[0] +#define DECIMAL64_ZERO decimal64Zero #define DECIMAL64_GET_MAX(precision, pMax) \ do { \ @@ -922,6 +924,10 @@ int32_t decimalOp(EOperatorType op, const SDataType* pLeftT, const SDataType* pR #define MAKE_DECIMAL64_SIGNED(pDec, v, max) CHECK_OVERFLOW_AND_MAKE_DECIMAL64(pDec, v, max, ABS_INT64) #define MAKE_DECIMAL64_UNSIGNED(pDec, v, max) CHECK_OVERFLOW_AND_MAKE_DECIMAL64(pDec, v, max, ABS_UINT64); +static int64_t int64FromDecimal64(const DecimalType* pDec, uint8_t prec, uint8_t scale) { return 0; } + +static uint64_t uint64FromDecimal64(const DecimalType* pDec, uint8_t prec, uint8_t scale) { return 0; } + static int32_t decimal64FromInt64(DecimalType* pDec, uint8_t prec, uint8_t scale, int64_t val) { Decimal64 max = {0}; DECIMAL64_GET_MAX(prec - scale, &max); @@ -980,6 +986,10 @@ static int32_t decimal64FromDecimal64(DecimalType* pDec, uint8_t prec, uint8_t s return 0; } +static int64_t int64FromDecimal128(const DecimalType* pDec, uint8_t prec, uint8_t scale) { return 0; } + +static uint64_t uint64FromDecimal128(const DecimalType* pDec, uint8_t prec, uint8_t scale) { return 0; } + static int32_t decimal128FromInt64(DecimalType* pDec, uint8_t prec, uint8_t scale, int64_t val) { if (prec - scale <= 18) { // TODO wjm test int64 with 19 digits. Decimal64 max = {0}; @@ -1224,3 +1234,49 @@ int32_t decimal128CountLeadingBinaryZeros(const Decimal128* pDec) { return countLeadingZeros((uint64_t)DECIMAL128_HIGH_WORD(pDec)); } } + +#define IMPL_INTEGER_TYPE_FROM_DECIMAL_TYPE(oType, decimalType, sign) \ + oType oType##From##decimalType(const DecimalType* pDec, uint8_t prec, uint8_t scale) { \ + return (oType)sign##int64##From##decimalType(pDec, prec, scale); \ + } +#define IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(oType, decimalType) \ + IMPL_INTEGER_TYPE_FROM_DECIMAL_TYPE(oType, decimalType, ) +#define IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(oType, decimalType) \ + IMPL_INTEGER_TYPE_FROM_DECIMAL_TYPE(oType, decimalType, u) + +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int8_t, Decimal64) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int16_t, Decimal64) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int32_t, Decimal64) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int64_t, Decimal64) + +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint8_t, Decimal64) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint16_t, Decimal64) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint32_t, Decimal64) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint64_t, Decimal64) + +double doubleFromDecimal64(const void* pDec, uint8_t prec, uint8_t scale) { return 0; } + +bool boolFromDecimal64(const void* pDec, uint8_t prec, uint8_t scale) { + return !decimal64Eq(pDec, &decimal64Zero, WORD_NUM(Decimal64)); +} + +#define IMPL_REAL_TYPE_FROM_DECIMAL_TYPE(oType, decimalType) \ + oType oType##From##decimalType(const DecimalType* pDec, uint8_t prec, uint8_t scale) { \ + return (oType) double##From##decimalType(pDec, prec, scale); \ + } + +IMPL_REAL_TYPE_FROM_DECIMAL_TYPE(float, Decimal64); + +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int8_t, Decimal128) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int16_t, Decimal128) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int32_t, Decimal128) +IMP_SIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(int64_t, Decimal128) + +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint8_t, Decimal128) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint16_t, Decimal128) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint32_t, Decimal128) +IMP_UNSIGNED_INTEGER_TYPE_FROM_DECIMAL_TYPE(uint64_t, Decimal128) + +bool boolFromDecimal128(const void* pDec, uint8_t prec, uint8_t scale) { return true; } +double doubleFromDecimal128(const void* pDec, uint8_t prec, uint8_t scale) { return 0; } +IMPL_REAL_TYPE_FROM_DECIMAL_TYPE(float, Decimal128); diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index f5362e867e..5154700926 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -4728,6 +4728,9 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) { if (QUERY_NODE_COLUMN == nodeType(*pNode)) { SColumnNode *colNode = (SColumnNode *)*pNode; stat->precision = colNode->node.resType.precision; + if (IS_DECIMAL_TYPE(colNode->node.resType.type)) { + stat->scalarMode = true; + } return DEAL_RES_CONTINUE; } diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index b200191dd5..9994a4e06b 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -397,7 +397,7 @@ int32_t sclInitParam(SNode *node, SScalarParam *param, SScalarCtx *ctx, int32_t SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 1)); SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilterOthers, node, ctx->type.selfType, 2)); } else if (IS_INTEGER_TYPE(ctx->type.selfType) && IS_FLOAT_TYPE(type)){ - SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 3)); + SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 2)); SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilterOthers, node, ctx->type.selfType, 4)); } else { SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 0)); diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index a92fe0d521..b751ffbb30 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -1068,9 +1068,9 @@ int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = { /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 5, 5, 5, 8, -1, -1, 17, -1, -1, -1, 17, /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, -1, -1, 7, -1, -1, -1, 7, /*UTINY*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, -1, -1, 17, -1, -1, -1, 17, - /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, -1, -1, 17, -1, -1, -1, 17, - /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, -1, -1, 17, -1, -1, -1, 17, - /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, 17, -1, -1, -1, 17, + /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, -1, -1, 17, -1, -1, -1, -1, + /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, -1, -1, 17, -1, -1, -1, -1, + /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, 17, -1, -1, -1, -1, /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -1, -1, -1, -1, -1, -1, /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -1, -1, -1, -1, -1, /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 17,