start to refactor GET_TYPED_DATA
This commit is contained in:
parent
494a16713e
commit
7c31f060af
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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->pHashFilter, node, type, 1));
|
||||||
SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilterOthers, node, ctx->type.selfType, 2));
|
SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->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 **)¶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));
|
SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilterOthers, node, ctx->type.selfType, 4));
|
||||||
} else {
|
} else {
|
||||||
SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 0));
|
SCL_ERR_RET(scalarGenerateSetFromList((void **)¶m->pHashFilter, node, type, 0));
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue