start to refactor GET_TYPED_DATA

This commit is contained in:
wangjiaming0909 2025-01-17 17:16:48 +08:00
parent 494a16713e
commit 7c31f060af
6 changed files with 133 additions and 46 deletions

View File

@ -53,45 +53,70 @@ typedef struct {
#define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0])) #define varDataNetLen(v) (htons(((VarDataLenT *)(v))[0]))
#define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v)) #define varDataNetTLen(v) (sizeof(VarDataLenT) + varDataNetLen(v))
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \ #define DEFINE_TYPE_FROM_DECIMAL_FUNC(oType, decimalType) \
do { \ oType oType##From##decimalType(const void* pDec, uint8_t prec, uint8_t scale)
switch (_type) { \
case TSDB_DATA_TYPE_BOOL: \ #define DEFINE_TYPE_FROM_DECIMAL_FUNCS(prefix, decimalType) \
case TSDB_DATA_TYPE_TINYINT: \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(bool, decimalType); \
(_v) = (_finalType)GET_INT8_VAL(_data); \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int8_t, decimalType); \
break; \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint8_t, decimalType); \
case TSDB_DATA_TYPE_UTINYINT: \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int16_t, decimalType); \
(_v) = (_finalType)GET_UINT8_VAL(_data); \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint16_t, decimalType); \
break; \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int32_t, decimalType); \
case TSDB_DATA_TYPE_SMALLINT: \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint32_t, decimalType); \
(_v) = (_finalType)GET_INT16_VAL(_data); \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(int64_t, decimalType); \
break; \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(uint64_t, decimalType); \
case TSDB_DATA_TYPE_USMALLINT: \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(float, decimalType); \
(_v) = (_finalType)GET_UINT16_VAL(_data); \ prefix DEFINE_TYPE_FROM_DECIMAL_FUNC(double, decimalType);
break; \
case TSDB_DATA_TYPE_TIMESTAMP: \ DEFINE_TYPE_FROM_DECIMAL_FUNCS(extern, Decimal64);
case TSDB_DATA_TYPE_BIGINT: \ DEFINE_TYPE_FROM_DECIMAL_FUNCS(extern, Decimal128);
(_v) = (_finalType)(GET_INT64_VAL(_data)); \
break; \ #define GET_TYPED_DATA(_v, _finalType, _type, _data) \
case TSDB_DATA_TYPE_UBIGINT: \ do { \
(_v) = (_finalType)(GET_UINT64_VAL(_data)); \ switch (_type) { \
break; \ case TSDB_DATA_TYPE_BOOL: \
case TSDB_DATA_TYPE_FLOAT: \ case TSDB_DATA_TYPE_TINYINT: \
(_v) = (_finalType)GET_FLOAT_VAL(_data); \ (_v) = (_finalType)GET_INT8_VAL(_data); \
break; \ break; \
case TSDB_DATA_TYPE_DOUBLE: \ case TSDB_DATA_TYPE_UTINYINT: \
(_v) = (_finalType)GET_DOUBLE_VAL(_data); \ (_v) = (_finalType)GET_UINT8_VAL(_data); \
break; \ break; \
case TSDB_DATA_TYPE_UINT: \ case TSDB_DATA_TYPE_SMALLINT: \
(_v) = (_finalType)GET_UINT32_VAL(_data); \ (_v) = (_finalType)GET_INT16_VAL(_data); \
break; \ break; \
case TSDB_DATA_TYPE_INT: \ case TSDB_DATA_TYPE_USMALLINT: \
(_v) = (_finalType)GET_INT32_VAL(_data); \ (_v) = (_finalType)GET_UINT16_VAL(_data); \
break; \ break; \
default: \ case TSDB_DATA_TYPE_TIMESTAMP: \
(_v) = (_finalType)varDataLen(_data); \ case TSDB_DATA_TYPE_BIGINT: \
break; \ (_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) } while (0)
#define SET_TYPED_DATA(_v, _type, _data) \ #define SET_TYPED_DATA(_v, _type, _data) \
@ -382,7 +407,7 @@ void *getDataMax(int32_t type, void *value);
#define STypeMod int32_t #define STypeMod int32_t
uint8_t decimalTypeFromPrecision(uint8_t precision); uint8_t decimalTypeFromPrecision(uint8_t precision);
STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale); 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 #ifdef __cplusplus
} }

View File

@ -65,6 +65,9 @@ int32_t decimalOp(EOperatorType op, const SDataType* pLeftT, const SDataType* pR
const void* pLeftData, const void* pRightData, void* pOutputData); const void* pLeftData, const void* pRightData, void* pOutputData);
int32_t convertToDecimal(const void* pData, const SDataType* pInputType, void* pOut, const SDataType* pOutType); 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?? // TODO wjm change rightWordNum to DecimalType??
typedef struct SDecimalOps { typedef struct SDecimalOps {
void (*negate)(DecimalType* pWord); void (*negate)(DecimalType* pWord);

View File

@ -15,8 +15,8 @@
*/ */
#include "decimal.h" #include "decimal.h"
#include "wideInteger.h"
#include "tdataformat.h" #include "tdataformat.h"
#include "wideInteger.h"
typedef enum DecimalInternalType { typedef enum DecimalInternalType {
DECIMAL_64 = 0, DECIMAL_64 = 0,
@ -228,7 +228,9 @@ static Decimal64 SCALE_MULTIPLIER_64[19] = {1LL,
100000000000000000LL, 100000000000000000LL,
1000000000000000000LL}; 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) \ #define DECIMAL64_GET_MAX(precision, pMax) \
do { \ 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_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); #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) { static int32_t decimal64FromInt64(DecimalType* pDec, uint8_t prec, uint8_t scale, int64_t val) {
Decimal64 max = {0}; Decimal64 max = {0};
DECIMAL64_GET_MAX(prec - scale, &max); DECIMAL64_GET_MAX(prec - scale, &max);
@ -980,6 +986,10 @@ static int32_t decimal64FromDecimal64(DecimalType* pDec, uint8_t prec, uint8_t s
return 0; 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) { 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. if (prec - scale <= 18) { // TODO wjm test int64 with 19 digits.
Decimal64 max = {0}; Decimal64 max = {0};
@ -1224,3 +1234,49 @@ int32_t decimal128CountLeadingBinaryZeros(const Decimal128* pDec) {
return countLeadingZeros((uint64_t)DECIMAL128_HIGH_WORD(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);

View File

@ -4728,6 +4728,9 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
if (QUERY_NODE_COLUMN == nodeType(*pNode)) { if (QUERY_NODE_COLUMN == nodeType(*pNode)) {
SColumnNode *colNode = (SColumnNode *)*pNode; SColumnNode *colNode = (SColumnNode *)*pNode;
stat->precision = colNode->node.resType.precision; stat->precision = colNode->node.resType.precision;
if (IS_DECIMAL_TYPE(colNode->node.resType.type)) {
stat->scalarMode = true;
}
return DEAL_RES_CONTINUE; return DEAL_RES_CONTINUE;
} }

View File

@ -397,7 +397,7 @@ int32_t sclInitParam(SNode *node, SScalarParam *param, SScalarCtx *ctx, int32_t
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 1)); SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 1));
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilterOthers, node, ctx->type.selfType, 2)); SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilterOthers, node, ctx->type.selfType, 2));
} else if (IS_INTEGER_TYPE(ctx->type.selfType) && IS_FLOAT_TYPE(type)){ } else if (IS_INTEGER_TYPE(ctx->type.selfType) && IS_FLOAT_TYPE(type)){
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 3)); SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 2));
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilterOthers, node, ctx->type.selfType, 4)); SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilterOthers, node, ctx->type.selfType, 4));
} else { } else {
SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 0)); SCL_ERR_RET(scalarGenerateSetFromList((void **)&param->pHashFilter, node, type, 0));

View File

@ -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, /*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, /*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, /*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, /*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, 17, /*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, 17, /*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, /*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, /*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, /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 17,