diff --git a/include/common/tcommon.h b/include/common/tcommon.h index 968568d2dc..a6857aa683 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -430,6 +430,14 @@ static inline bool isTsmaResSTb(const char* stbName) { return false; } +static inline STypeMod typeGetTypeModFromColInfo(const SColumnInfo* pCol) { + return typeGetTypeMod(pCol->type, pCol->precision, pCol->scale, pCol->bytes); +} + +static inline STypeMod typeGetTypeModFromCol(const SColumn* pCol) { + return typeGetTypeMod(pCol->type, pCol->precision, pCol->scale, pCol->bytes); +} + #ifdef __cplusplus } #endif diff --git a/include/common/ttypes.h b/include/common/ttypes.h index ec8c743d78..3ccccab348 100644 --- a/include/common/ttypes.h +++ b/include/common/ttypes.h @@ -45,6 +45,9 @@ typedef struct { } SNCharNullT; #pragma pack(pop) +#define STypeMod int32_t +void extractTypeFromTypeMod(uint8_t type, STypeMod typeMod, uint8_t *prec, uint8_t* scale, int32_t *bytes); + #define varDataTLen(v) (sizeof(VarDataLenT) + varDataLen(v)) #define varDataCopy(dst, v) (void)memcpy((dst), (void *)(v), varDataTLen(v)) #define varDataLenByData(v) (*(VarDataLenT *)(((char *)(v)) - VARSTR_HEADER_SIZE)) @@ -72,51 +75,55 @@ typedef struct { 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; \ - } \ +#define GET_TYPED_DATA(_v, _finalType, _type, _data, inputTypeMod) \ + 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: { \ + uint8_t prec = 0, scale = 0; \ + extractTypeFromTypeMod(_type, inputTypeMod, &prec, &scale, NULL); \ + (_v) = _finalType##FromDecimal128(_data, prec, scale); \ + } break; \ + case TSDB_DATA_TYPE_DECIMAL64: { \ + uint8_t prec = 0, scale = 0; \ + extractTypeFromTypeMod(_type, inputTypeMod, &prec, &scale, NULL); \ + (_v) = _finalType##FromDecimal64(_data, prec, scale); \ + } break; \ + default: \ + (_v) = (_finalType)varDataLen(_data); \ + break; \ + } \ } while (0) #define SET_TYPED_DATA(_v, _type, _data) \ @@ -404,9 +411,7 @@ void assignVal(char *val, const char *src, int32_t len, int32_t type); void *getDataMin(int32_t type, void *value); void *getDataMax(int32_t type, void *value); -#define STypeMod int32_t STypeMod typeGetTypeMod(uint8_t type, uint8_t prec, uint8_t scale, int32_t bytes); -void extractTypeFromTypeMod(uint8_t type, STypeMod typeMod, uint8_t *prec, uint8_t scale, int32_t *bytes); uint8_t decimalTypeFromPrecision(uint8_t precision); STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale); void decimalFromTypeMod(STypeMod typeMod, uint8_t *precision, uint8_t *scale); diff --git a/include/libs/function/function.h b/include/libs/function/function.h index b2bde42463..b0b5d4ba02 100644 --- a/include/libs/function/function.h +++ b/include/libs/function/function.h @@ -315,7 +315,7 @@ typedef struct SPoint { } SPoint; void taosGetLinearInterpolationVal(SPoint *point, int32_t outputType, SPoint *point1, SPoint *point2, - int32_t inputType); + int32_t inputType, STypeMod inputTypeMod); #define LEASTSQUARES_DOUBLE_ITEM_LENGTH 25 #define LEASTSQUARES_BUFF_LENGTH 128 diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index b43507c2a6..5c13e1617e 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -516,7 +516,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { RAW_NULL_CHECK(tvalue); } else { double val = 0; - GET_TYPED_DATA(val, double, pTagVal->type, &pTagVal->i64); + GET_TYPED_DATA(val, double, pTagVal->type, &pTagVal->i64, 0); // currently tag type can't be decimal, so pass 0 as typeMod tvalue = cJSON_CreateNumber(val); RAW_NULL_CHECK(tvalue); } @@ -2714,4 +2714,4 @@ static int32_t tmqWriteBatchMetaDataImpl(TAOS* taos, void* meta, uint32_t metaLe end: tDeleteMqBatchMetaRsp(&rsp); return code; -} \ No newline at end of file +} diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 959b092fc9..b1c6cd04e0 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -728,9 +728,9 @@ int32_t blockDataUpdatePkRange(SSDataBlock* pDataBlock, int32_t pkColumnIndex, b int64_t val = 0; if (asc) { if (IS_NUMERIC_TYPE(pColInfoData->info.type)) { - GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, skey); + GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, skey, typeGetTypeModFromColInfo(&pColInfoData->info)); VALUE_SET_TRIVIAL_DATUM(&pInfo->pks[0], val); - GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, ekey); + GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, ekey, typeGetTypeModFromColInfo(&pColInfoData->info)); VALUE_SET_TRIVIAL_DATUM(&pInfo->pks[1], val); } else { // todo refactor memcpy(pInfo->pks[0].pData, varDataVal(skey), varDataLen(skey)); @@ -741,9 +741,9 @@ int32_t blockDataUpdatePkRange(SSDataBlock* pDataBlock, int32_t pkColumnIndex, b } } else { if (IS_NUMERIC_TYPE(pColInfoData->info.type)) { - GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, ekey); + GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, ekey, typeGetTypeModFromColInfo(&pColInfoData->info)); VALUE_SET_TRIVIAL_DATUM(&pInfo->pks[0], val); - GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, skey); + GET_TYPED_DATA(val, int64_t, pColInfoData->info.type, skey, typeGetTypeModFromColInfo(&pColInfoData->info)); VALUE_SET_TRIVIAL_DATUM(&pInfo->pks[1], val); } else { // todo refactor memcpy(pInfo->pks[0].pData, varDataVal(ekey), varDataLen(ekey)); @@ -2887,19 +2887,19 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq2** ppReq, const SSDataBlock* pDat char tv[DATUM_MAX_SIZE] = {0}; if (pColInfoData->info.type == TSDB_DATA_TYPE_FLOAT) { float v = 0; - GET_TYPED_DATA(v, float, pColInfoData->info.type, var); + GET_TYPED_DATA(v, float, pColInfoData->info.type, var, typeGetTypeModFromColInfo(&pColInfoData->info)); SET_TYPED_DATA(&tv, pCol->type, v); } else if (pColInfoData->info.type == TSDB_DATA_TYPE_DOUBLE) { double v = 0; - GET_TYPED_DATA(v, double, pColInfoData->info.type, var); + GET_TYPED_DATA(v, double, pColInfoData->info.type, var, typeGetTypeModFromColInfo(&pColInfoData->info)); SET_TYPED_DATA(&tv, pCol->type, v); } else if (IS_SIGNED_NUMERIC_TYPE(pColInfoData->info.type)) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pColInfoData->info.type, var); + GET_TYPED_DATA(v, int64_t, pColInfoData->info.type, var, typeGetTypeModFromColInfo(&pColInfoData->info)); SET_TYPED_DATA(&tv, pCol->type, v); } else { uint64_t v = 0; - GET_TYPED_DATA(v, uint64_t, pColInfoData->info.type, var); + GET_TYPED_DATA(v, uint64_t, pColInfoData->info.type, var, typeGetTypeModFromColInfo(&pColInfoData->info)); SET_TYPED_DATA(&tv, pCol->type, v); } valueSetDatum(&sv, sv.type, tv, tDataTypes[pCol->type].bytes); @@ -3714,12 +3714,12 @@ int32_t blockDataCheck(const SSDataBlock* pDataBlock) { } else { if (TSDB_DATA_TYPE_FLOAT == pCol->info.type) { float v = 0; - GET_TYPED_DATA(v, float, pCol->info.type, colDataGetNumData(pCol, r)); + GET_TYPED_DATA(v, float, pCol->info.type, colDataGetNumData(pCol, r), typeGetTypeModFromColInfo(&pCol->info)); } else if (TSDB_DATA_TYPE_DOUBLE == pCol->info.type) { double v = 0; - GET_TYPED_DATA(v, double, pCol->info.type, colDataGetNumData(pCol, r)); + GET_TYPED_DATA(v, double, pCol->info.type, colDataGetNumData(pCol, r), typeGetTypeModFromColInfo(&pCol->info)); } else { - GET_TYPED_DATA(typeValue, int64_t, pCol->info.type, colDataGetNumData(pCol, r)); + GET_TYPED_DATA(typeValue, int64_t, pCol->info.type, colDataGetNumData(pCol, r), typeGetTypeModFromColInfo(&pCol->info)); } } } diff --git a/source/common/src/ttypes.c b/source/common/src/ttypes.c index 181df0dd40..54f3fc2757 100644 --- a/source/common/src/ttypes.c +++ b/source/common/src/ttypes.c @@ -243,8 +243,8 @@ STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale) { } void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale) { - *precision = (uint8_t)((typeMod >> 8) & 0xFF); - *scale = (uint8_t)(typeMod & 0xFF); + if (precision) *precision = (uint8_t)((typeMod >> 8) & 0xFF); + if (scale) *scale = (uint8_t)(typeMod & 0xFF); } STypeMod typeGetTypeMod(uint8_t type, uint8_t prec, uint8_t scale, int32_t bytes) { @@ -259,3 +259,13 @@ void fillTypeFromTypeMod(SDataType* pType, STypeMod mod) { decimalFromTypeMod(mod, &pType->precision, &pType->scale); } } + +void extractTypeFromTypeMod(uint8_t type, STypeMod typeMod, uint8_t *prec, uint8_t *scale, int32_t *bytes) { + if (IS_DECIMAL_TYPE(type)) { + decimalFromTypeMod(typeMod, prec, scale); + } else { + if (prec) *prec = 0; + if (scale) *scale = 0; + } + if (bytes) *bytes = tDataTypes[type].bytes; +} diff --git a/source/libs/decimal/src/decimal.c b/source/libs/decimal/src/decimal.c index 9e0951940e..2fbbfd0e76 100644 --- a/source/libs/decimal/src/decimal.c +++ b/source/libs/decimal/src/decimal.c @@ -906,7 +906,7 @@ int32_t decimalOp(EOperatorType op, const SDataType* pLeftT, const SDataType* pR #define ABS_INT64(v) (v) == INT64_MIN ? (uint64_t)INT64_MAX + 1 : (uint64_t)llabs(v) #define ABS_UINT64(v) (v) -#define DECIMAL64_IS_OVERFLOW(v, max) decimal64Gt(&(v), &max, DECIMAL_WORD_NUM(Decimal64)) +#define DECIMAL64_IS_OVERFLOW(v, max) decimal64Gt(&(v), &max, DECIMAL_WORD_NUM(Decimal64)) // TODO wjm DELETE it #define DECIMAL128_IS_OVERFLOW(v, max) decimal128Gt(&(v), &max, DECIMAL_WORD_NUM(Decimal128)) #define CHECK_OVERFLOW_AND_MAKE_DECIMAL64(pDec, v, max, ABS) \ @@ -922,7 +922,7 @@ 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); +#define MAKE_DECIMAL64_UNSIGNED(pDec, v, max) CHECK_OVERFLOW_AND_MAKE_DECIMAL64(pDec, v, max, ABS_UINT64); // TODO wjm delete it static int64_t int64FromDecimal64(const DecimalType* pDec, uint8_t prec, uint8_t scale) { return 0; } diff --git a/source/libs/executor/src/streamfilloperator.c b/source/libs/executor/src/streamfilloperator.c index ffaa62721e..0d14343988 100644 --- a/source/libs/executor/src/streamfilloperator.c +++ b/source/libs/executor/src/streamfilloperator.c @@ -603,7 +603,7 @@ static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* cur.key = pFillInfo->current; cur.val = taosMemoryCalloc(1, pCell->bytes); QUERY_CHECK_NULL(cur.val, code, lino, _end, terrno); - taosGetLinearInterpolationVal(&cur, pCell->type, &start, pEnd, pCell->type); + taosGetLinearInterpolationVal(&cur, pCell->type, &start, pEnd, pCell->type, typeGetTypeModFromColInfo(&pColData->info)); code = colDataSetVal(pColData, index, (const char*)cur.val, false); QUERY_CHECK_CODE(code, lino, _end); destroySPoint(&cur); @@ -1712,15 +1712,15 @@ static void setValueForFillInfo(SStreamFillSupporter* pFillSup, SStreamFillInfo* SVariant* pVar = &(pFillCol->fillVal); if (pCell->type == TSDB_DATA_TYPE_FLOAT) { float v = 0; - GET_TYPED_DATA(v, float, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, float, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else if (IS_FLOAT_TYPE(pCell->type)) { double v = 0; - GET_TYPED_DATA(v, double, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, double, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else if (IS_INTEGER_TYPE(pCell->type)) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else { pCell->isNull = true; diff --git a/source/libs/executor/src/streamintervalsliceoperator.c b/source/libs/executor/src/streamintervalsliceoperator.c index cc06f5b693..80e59445f5 100644 --- a/source/libs/executor/src/streamintervalsliceoperator.c +++ b/source/libs/executor/src/streamintervalsliceoperator.c @@ -217,15 +217,15 @@ void doStreamSliceInterpolation(SSliceRowData* pPrevWinVal, TSKEY winKey, TSKEY double prevVal = 0, curVal = 0, winVal = 0; SResultCellData* pCell = getSliceResultCell((SResultCellData*)pPrevWinVal->pRowVal, pParam->pCol->slotId, pOffsetInfo); - GET_TYPED_DATA(prevVal, double, pCell->type, pCell->pData); - GET_TYPED_DATA(curVal, double, pColInfo->info.type, colDataGetData(pColInfo, curRowIndex)); + GET_TYPED_DATA(prevVal, double, pCell->type, pCell->pData, typeGetTypeModFromColInfo(&pColInfo->info)); + GET_TYPED_DATA(curVal, double, pColInfo->info.type, colDataGetData(pColInfo, curRowIndex), typeGetTypeModFromColInfo(&pColInfo->info)); SPoint point1 = (SPoint){.key = pPrevWinVal->key, .val = &prevVal}; SPoint point2 = (SPoint){.key = curTs, .val = &curVal}; SPoint point = (SPoint){.key = winKey, .val = &winVal}; if (!fmIsElapsedFunc(pCtx[k].functionId)) { - taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE); + taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE, 0); } if (type == INTERVAL_SLICE_START) { diff --git a/source/libs/executor/src/streamtimesliceoperator.c b/source/libs/executor/src/streamtimesliceoperator.c index f511c5ab4f..7401de3ee6 100644 --- a/source/libs/executor/src/streamtimesliceoperator.c +++ b/source/libs/executor/src/streamtimesliceoperator.c @@ -515,7 +515,7 @@ static void fillLinearRange(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFi cur.val = taosMemoryCalloc(1, pCell->bytes); QUERY_CHECK_NULL(cur.val, code, lino, _end, terrno); - taosGetLinearInterpolationVal(&cur, pCell->type, &start, pEnd, pCell->type); + taosGetLinearInterpolationVal(&cur, pCell->type, &start, pEnd, pCell->type, typeGetTypeModFromColInfo(&pDstCol->info)); code = colDataSetVal(pDstCol, index, (const char*)cur.val, false); QUERY_CHECK_CODE(code, lino, _end); @@ -1980,15 +1980,15 @@ static void copyFillValueInfo(SStreamFillSupporter* pFillSup, SStreamFillInfo* p SVariant* pVar = &(pValueCol->fillVal); if (pCell->type == TSDB_DATA_TYPE_FLOAT) { float v = 0; - GET_TYPED_DATA(v, float, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, float, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else if (IS_FLOAT_TYPE(pCell->type)) { double v = 0; - GET_TYPED_DATA(v, double, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, double, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else if (IS_INTEGER_TYPE(pCell->type)) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i, 0); SET_TYPED_DATA(pCell->pData, pCell->type, v); } else { pCell->isNull = true; diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index 5e355ff7e0..104b731e77 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -85,27 +85,27 @@ static int32_t doSetUserSpecifiedValue(SColumnInfoData* pDst, SVariant* pVar, in bool isNull = (TSDB_DATA_TYPE_NULL == pVar->nType) ? true : false; if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) { float v = 0; - GET_TYPED_DATA(v, float, pVar->nType, &pVar->f); + GET_TYPED_DATA(v, float, pVar->nType, &pVar->f, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rowIndex, (char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); } else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) { double v = 0; - GET_TYPED_DATA(v, double, pVar->nType, &pVar->d); + GET_TYPED_DATA(v, double, pVar->nType, &pVar->d, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rowIndex, (char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); } else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type) || pDst->info.type == TSDB_DATA_TYPE_BOOL) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rowIndex, (char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); } else if (IS_UNSIGNED_NUMERIC_TYPE(pDst->info.type)) { uint64_t v = 0; - GET_TYPED_DATA(v, uint64_t, pVar->nType, &pVar->u); + GET_TYPED_DATA(v, uint64_t, pVar->nType, &pVar->u, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rowIndex, (char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); } else if (pDst->info.type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->u); + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->u, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rowIndex, (const char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); } else if (pDst->info.type == TSDB_DATA_TYPE_NCHAR || pDst->info.type == TSDB_DATA_TYPE_VARCHAR || @@ -236,7 +236,7 @@ static void doFillOneRow(SFillInfo* pFillInfo, SSDataBlock* pBlock, SSDataBlock* int64_t out = 0; point = (SPoint){.key = pFillInfo->currentKey, .val = &out}; - taosGetLinearInterpolationVal(&point, type, &point1, &point2, type); + taosGetLinearInterpolationVal(&point, type, &point1, &point2, type, typeGetTypeModFromColInfo(&pDstCol->info)); code = colDataSetVal(pDstCol, index, (const char*)&out, false); QUERY_CHECK_CODE(code, lino, _end); @@ -725,10 +725,10 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, TSKEY ekey, int32_t ma } void taosGetLinearInterpolationVal(SPoint* point, int32_t outputType, SPoint* point1, SPoint* point2, - int32_t inputType) { + int32_t inputType, STypeMod inputTypeMod) { double v1 = -1, v2 = -1; - GET_TYPED_DATA(v1, double, inputType, point1->val); - GET_TYPED_DATA(v2, double, inputType, point2->val); + GET_TYPED_DATA(v1, double, inputType, point1->val, inputTypeMod); + GET_TYPED_DATA(v2, double, inputType, point2->val, inputTypeMod); double r = 0; if (!IS_BOOLEAN_TYPE(inputType)) { diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c index 025e38ed3e..60c1977dde 100644 --- a/source/libs/executor/src/timesliceoperator.c +++ b/source/libs/executor/src/timesliceoperator.c @@ -460,7 +460,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) { float v = 0; if (!IS_VAR_DATA_TYPE(pVar->nType)) { - GET_TYPED_DATA(v, float, pVar->nType, &pVar->f); + GET_TYPED_DATA(v, float, pVar->nType, &pVar->f, 0); } else { v = taosStr2Float(varDataVal(pVar->pz), NULL); } @@ -469,7 +469,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp } else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) { double v = 0; if (!IS_VAR_DATA_TYPE(pVar->nType)) { - GET_TYPED_DATA(v, double, pVar->nType, &pVar->d); + GET_TYPED_DATA(v, double, pVar->nType, &pVar->d, 0); } else { v = taosStr2Double(varDataVal(pVar->pz), NULL); } @@ -478,7 +478,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp } else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type)) { int64_t v = 0; if (!IS_VAR_DATA_TYPE(pVar->nType)) { - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i, 0); } else { v = taosStr2Int64(varDataVal(pVar->pz), NULL, 10); } @@ -487,7 +487,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp } else if (IS_UNSIGNED_NUMERIC_TYPE(pDst->info.type)) { uint64_t v = 0; if (!IS_VAR_DATA_TYPE(pVar->nType)) { - GET_TYPED_DATA(v, uint64_t, pVar->nType, &pVar->u); + GET_TYPED_DATA(v, uint64_t, pVar->nType, &pVar->u, 0); } else { v = taosStr2UInt64(varDataVal(pVar->pz), NULL, 10); } @@ -496,12 +496,14 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp } else if (IS_BOOLEAN_TYPE(pDst->info.type)) { bool v = false; if (!IS_VAR_DATA_TYPE(pVar->nType)) { - GET_TYPED_DATA(v, bool, pVar->nType, &pVar->i); + GET_TYPED_DATA(v, bool, pVar->nType, &pVar->i, 0); } else { v = taosStr2Int8(varDataVal(pVar->pz), NULL, 10); } code = colDataSetVal(pDst, rows, (char*)&v, isNull); QUERY_CHECK_CODE(code, lino, _end); + } else if (IS_DECIMAL_TYPE(pDst->info.type)) { + // TODO wjm } ++fillColIndex; @@ -537,7 +539,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp current.val = taosMemoryCalloc(pLinearInfo->bytes, 1); QUERY_CHECK_NULL(current.val, code, lino, _end, terrno); - taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type); + taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type, typeGetTypeModFromColInfo(&pDst->info)); code = colDataSetVal(pDst, rows, (char*)current.val, false); QUERY_CHECK_CODE(code, lino, _end); diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 96a3b02464..848837c3fc 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -235,12 +235,12 @@ void doTimeWindowInterpolation(SArray* pPrevValues, SArray* pDataBlock, TSKEY pr double v1 = 0, v2 = 0, v = 0; if (prevRowIndex == -1) { SGroupKeys* p = taosArrayGet(pPrevValues, index); - GET_TYPED_DATA(v1, double, pColInfo->info.type, p->pData); + GET_TYPED_DATA(v1, double, pColInfo->info.type, p->pData, typeGetTypeModFromColInfo(&pColInfo->info)); } else { - GET_TYPED_DATA(v1, double, pColInfo->info.type, colDataGetData(pColInfo, prevRowIndex)); + GET_TYPED_DATA(v1, double, pColInfo->info.type, colDataGetData(pColInfo, prevRowIndex), typeGetTypeModFromColInfo(&pColInfo->info)); } - GET_TYPED_DATA(v2, double, pColInfo->info.type, colDataGetData(pColInfo, curRowIndex)); + GET_TYPED_DATA(v2, double, pColInfo->info.type, colDataGetData(pColInfo, curRowIndex), typeGetTypeModFromColInfo(&pColInfo->info)); #if 0 if (functionId == FUNCTION_INTERP) { @@ -270,7 +270,7 @@ void doTimeWindowInterpolation(SArray* pPrevValues, SArray* pDataBlock, TSKEY pr SPoint point = (SPoint){.key = windowKey, .val = &v}; if (!fmIsElapsedFunc(pCtx[k].functionId)) { - taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE); + taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE, 0); } if (type == RESULT_ROW_START_INTERP) { diff --git a/source/libs/function/inc/functionResInfoInt.h b/source/libs/function/inc/functionResInfoInt.h index f97d2e8024..5c134f0d9b 100644 --- a/source/libs/function/inc/functionResInfoInt.h +++ b/source/libs/function/inc/functionResInfoInt.h @@ -195,6 +195,7 @@ typedef struct tMemBucket { int16_t numOfSlots; int16_t type; int32_t bytes; + STypeMod typeMod; int32_t total; int32_t elemPerPage; // number of elements for each object int32_t maxCapacity; // maximum allowed number of elements that can be sort directly to get the result diff --git a/source/libs/function/inc/tpercentile.h b/source/libs/function/inc/tpercentile.h index 4738301cd3..beec7d4307 100644 --- a/source/libs/function/inc/tpercentile.h +++ b/source/libs/function/inc/tpercentile.h @@ -25,7 +25,7 @@ extern "C" { struct tMemBucket; -int32_t tMemBucketCreate(int32_t nElemSize, int16_t dataType, double minval, double maxval, bool hasWindowOrGroup, +int32_t tMemBucketCreate(int32_t nElemSize, int16_t dataType, STypeMod typeMod, double minval, double maxval, bool hasWindowOrGroup, struct tMemBucket **pBucket, int32_t numOfElements); void tMemBucketDestroy(struct tMemBucket **pBucket); diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index e522918b9b..9965d30367 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -1536,8 +1536,10 @@ int32_t leastSQRFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResult SLeastSQRInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo); - GET_TYPED_DATA(pInfo->startVal, double, pCtx->param[1].param.nType, &pCtx->param[1].param.i); - GET_TYPED_DATA(pInfo->stepVal, double, pCtx->param[2].param.nType, &pCtx->param[2].param.i); + GET_TYPED_DATA(pInfo->startVal, double, pCtx->param[1].param.nType, &pCtx->param[1].param.i, + typeGetTypeModFromCol(pCtx->param[1].pCol)); + GET_TYPED_DATA(pInfo->stepVal, double, pCtx->param[2].param.nType, &pCtx->param[2].param.i, + typeGetTypeModFromCol(pCtx->param[2].pCol)); return TSDB_CODE_SUCCESS; } @@ -1832,7 +1834,7 @@ int32_t percentileFunction(SqlFunctionCtx* pCtx) { pResInfo->complete = true; return TSDB_CODE_SUCCESS; } else { - code = tMemBucketCreate(pCol->info.bytes, type, pInfo->minval, pInfo->maxval, pCtx->hasWindowOrGroup, + code = tMemBucketCreate(pCol->info.bytes, type, typeGetTypeModFromColInfo(&pCol->info), pInfo->minval, pInfo->maxval, pCtx->hasWindowOrGroup, &pInfo->pMemBucket, pInfo->numOfElems); if (TSDB_CODE_SUCCESS != code) { return code; @@ -1875,7 +1877,7 @@ int32_t percentileFunction(SqlFunctionCtx* pCtx) { char* data = colDataGetData(pCol, i); double v = 0; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pCol->info)); if (v < GET_DOUBLE_VAL(&pInfo->minval)) { SET_DOUBLE_VAL(&pInfo->minval, v); } @@ -1930,7 +1932,7 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { for (int32_t i = 1; i < pCtx->numOfParams; ++i) { SVariant* pVal = &pCtx->param[i].param; - GET_TYPED_DATA(v, double, pVal->nType, &pVal->i); + GET_TYPED_DATA(v, double, pVal->nType, &pVal->i, typeGetTypeModFromCol(pCtx->param[i].pCol)); code = getPercentile((*pMemBucket), v, &ppInfo->result); if (code != TSDB_CODE_SUCCESS) { @@ -1962,7 +1964,7 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { } else { SVariant* pVal = &pCtx->param[1].param; - GET_TYPED_DATA(v, double, pVal->nType, &pVal->i); + GET_TYPED_DATA(v, double, pVal->nType, &pVal->i, typeGetTypeModFromCol(pCtx->param[1].pCol)); code = getPercentile((*pMemBucket), v, &ppInfo->result); if (code != TSDB_CODE_SUCCESS) { @@ -2031,7 +2033,7 @@ int32_t apercentileFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pRes SVariant* pVal = &pCtx->param[1].param; pInfo->percent = 0; - GET_TYPED_DATA(pInfo->percent, double, pVal->nType, &pVal->i); + GET_TYPED_DATA(pInfo->percent, double, pVal->nType, &pVal->i, typeGetTypeModFromCol(pCtx->param[1].pCol)); if (pCtx->numOfParams == 2) { pInfo->algo = APERCT_ALGO_DEFAULT; @@ -2078,7 +2080,7 @@ int32_t apercentileFunction(SqlFunctionCtx* pCtx) { double v = 0; // value int64_t w = 1; // weigth - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pCol->info)); int32_t code = tdigestAdd(pInfo->pTDigest, v, w); if (code != TSDB_CODE_SUCCESS) { return code; @@ -2099,7 +2101,7 @@ int32_t apercentileFunction(SqlFunctionCtx* pCtx) { char* data = colDataGetData(pCol, i); double v = 0; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pCol->info)); int32_t code = tHistogramAdd(&pInfo->pHisto, v); if (code != TSDB_CODE_SUCCESS) { return code; @@ -4150,7 +4152,7 @@ int32_t spreadFunction(SqlFunctionCtx* pCtx) { char* data = colDataGetData(pCol, i); double v = 0; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pCol->info)); if (v < GET_DOUBLE_VAL(&pInfo->min)) { SET_DOUBLE_VAL(&pInfo->min, v); } @@ -4705,7 +4707,7 @@ static int32_t histogramFunctionImpl(SqlFunctionCtx* pCtx, bool isPartial) { char* data = colDataGetData(pCol, i); double v; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pCol->info)); for (int32_t k = 0; k < pInfo->numOfBins; ++k) { if (v > pInfo->bins[k].lower && v <= pInfo->bins[k].upper) { @@ -5342,7 +5344,7 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) { char* data = colDataGetData(pInputCol, i); if (IS_SIGNED_NUMERIC_TYPE(type)) { int64_t v; - GET_TYPED_DATA(v, int64_t, type, data); + GET_TYPED_DATA(v, int64_t, type, data, typeGetTypeModFromColInfo(&pInputCol->info)); pSumRes->isum += v; code = colDataSetVal(pOutput, pos, (char*)&pSumRes->isum, false); if (TSDB_CODE_SUCCESS != code) { @@ -5350,7 +5352,7 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) { } } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) { uint64_t v; - GET_TYPED_DATA(v, uint64_t, type, data); + GET_TYPED_DATA(v, uint64_t, type, data, typeGetTypeModFromColInfo(&pInputCol->info)); pSumRes->usum += v; code = colDataSetVal(pOutput, pos, (char*)&pSumRes->usum, false); if (TSDB_CODE_SUCCESS != code) { @@ -5358,7 +5360,7 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) { } } else if (IS_FLOAT_TYPE(type)) { double v; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pInputCol->info)); pSumRes->dsum += v; // check for overflow if (isinf(pSumRes->dsum) || isnan(pSumRes->dsum)) { @@ -5444,7 +5446,7 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) { char* data = colDataGetData(pInputCol, i); double v; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pInputCol->info)); if (!pInfo->pointsMeet && (pInfo->pos < pInfo->numOfPoints - 1)) { pInfo->points[pInfo->pos] = v; @@ -6136,7 +6138,7 @@ int32_t twaFunction(SqlFunctionCtx* pCtx) { last->key = row.ts; - GET_TYPED_DATA(last->val, double, pInputCol->info.type, row.pData); + GET_TYPED_DATA(last->val, double, pInputCol->info.type, row.pData, typeGetTypeModFromColInfo(&pInputCol->info)); pInfo->dOutput += twa_get_area(pCtx->start, *last); pInfo->win.skey = pCtx->start.key; @@ -6158,7 +6160,7 @@ int32_t twaFunction(SqlFunctionCtx* pCtx) { last->key = row.ts; - GET_TYPED_DATA(last->val, double, pInputCol->info.type, row.pData); + GET_TYPED_DATA(last->val, double, pInputCol->info.type, row.pData, typeGetTypeModFromColInfo(&pInputCol->info)); pInfo->win.skey = last->key; pInfo->numOfElems++; @@ -6691,7 +6693,7 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) { } char* d = row.pData; - GET_TYPED_DATA(v, double, pInputCol->info.type, d); + GET_TYPED_DATA(v, double, pInputCol->info.type, d, typeGetTypeModFromColInfo(&pInputCol->info)); int32_t pos = pCtx->offset + numOfElems; if (!pDerivInfo->valueSet) { // initial value is not set yet @@ -6747,7 +6749,7 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) { } char* d = row.pData; - GET_TYPED_DATA(v, double, pInputCol->info.type, d); + GET_TYPED_DATA(v, double, pInputCol->info.type, d, typeGetTypeModFromColInfo(&pInputCol->info)); int32_t pos = pCtx->offset + numOfElems; if (!pDerivInfo->valueSet) { // initial value is not set yet @@ -6905,7 +6907,7 @@ int32_t irateFunction(SqlFunctionCtx* pCtx) { char* data = row.pData; double v = 0; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pInputCol->info)); if (INT64_MIN == pRateInfo->lastKey) { doSaveRateInfo(pRateInfo, false, row.ts, row.pPk, v); diff --git a/source/libs/function/src/detail/tminmax.c b/source/libs/function/src/detail/tminmax.c index 9d2aff48ce..6b65554386 100644 --- a/source/libs/function/src/detail/tminmax.c +++ b/source/libs/function/src/detail/tminmax.c @@ -597,7 +597,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc, int32_t* nElems) } else { if (IS_SIGNED_NUMERIC_TYPE(type)) { int64_t prev = 0; - GET_TYPED_DATA(prev, int64_t, type, &pBuf->v); + GET_TYPED_DATA(prev, int64_t, type, &pBuf->v, 0); int64_t val = GET_INT64_VAL(tval); if ((prev < val) ^ isMinFunc) { @@ -606,7 +606,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc, int32_t* nElems) } } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) { uint64_t prev = 0; - GET_TYPED_DATA(prev, uint64_t, type, &pBuf->v); + GET_TYPED_DATA(prev, uint64_t, type, &pBuf->v, 0); uint64_t val = GET_UINT64_VAL(tval); if ((prev < val) ^ isMinFunc) { @@ -615,7 +615,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc, int32_t* nElems) } } else if (type == TSDB_DATA_TYPE_DOUBLE) { double prev = 0; - GET_TYPED_DATA(prev, double, type, &pBuf->v); + GET_TYPED_DATA(prev, double, type, &pBuf->v, 0); double val = GET_DOUBLE_VAL(tval); if ((prev < val) ^ isMinFunc) { @@ -624,7 +624,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc, int32_t* nElems) } } else if (type == TSDB_DATA_TYPE_FLOAT) { float prev = 0; - GET_TYPED_DATA(prev, float, type, &pBuf->v); + GET_TYPED_DATA(prev, float, type, &pBuf->v, 0); float val = GET_DOUBLE_VAL(tval); if ((prev < val) ^ isMinFunc) { diff --git a/source/libs/function/src/tpercentile.c b/source/libs/function/src/tpercentile.c index 405049fe6f..a637ad7be7 100644 --- a/source/libs/function/src/tpercentile.c +++ b/source/libs/function/src/tpercentile.c @@ -143,7 +143,7 @@ int32_t findOnlyResult(tMemBucket *pMemBucket, double *result) { return TSDB_CODE_FUNC_PERCENTILE_ERROR; } - GET_TYPED_DATA(*result, double, pMemBucket->type, pPage->data); + GET_TYPED_DATA(*result, double, pMemBucket->type, pPage->data, pMemBucket->typeMod); return TSDB_CODE_SUCCESS; } } @@ -154,7 +154,7 @@ int32_t findOnlyResult(tMemBucket *pMemBucket, double *result) { int32_t tBucketIntHash(tMemBucket *pBucket, const void *value, int32_t *index) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pBucket->type, value); + GET_TYPED_DATA(v, int64_t, pBucket->type, value, pBucket->typeMod); *index = -1; @@ -186,7 +186,7 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value, int32_t *index) { int32_t tBucketUintHash(tMemBucket *pBucket, const void *value, int32_t *index) { int64_t v = 0; - GET_TYPED_DATA(v, uint64_t, pBucket->type, value); + GET_TYPED_DATA(v, uint64_t, pBucket->type, value, pBucket->typeMod); *index = -1; @@ -268,7 +268,7 @@ static void resetSlotInfo(tMemBucket *pBucket) { } } -int32_t tMemBucketCreate(int32_t nElemSize, int16_t dataType, double minval, double maxval, bool hasWindowOrGroup, +int32_t tMemBucketCreate(int32_t nElemSize, int16_t dataType, STypeMod typeMod, double minval, double maxval, bool hasWindowOrGroup, tMemBucket **pBucket, int32_t numOfElements) { *pBucket = (tMemBucket *)taosMemoryCalloc(1, sizeof(tMemBucket)); if (*pBucket == NULL) { @@ -286,6 +286,7 @@ int32_t tMemBucketCreate(int32_t nElemSize, int16_t dataType, double minval, dou (*pBucket)->bytes = nElemSize; (*pBucket)->total = 0; (*pBucket)->times = 1; + (*pBucket)->typeMod = typeMod; (*pBucket)->maxCapacity = 200000; (*pBucket)->groupPagesMap = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK); @@ -353,10 +354,11 @@ void tMemBucketDestroy(tMemBucket **pBucket) { taosMemoryFreeClear(*pBucket); } -int32_t tMemBucketUpdateBoundingBox(MinMaxEntry *r, const char *data, int32_t dataType) { +int32_t tMemBucketUpdateBoundingBox(MinMaxEntry *r, const char *data, tMemBucket* pBucket) { + int32_t dataType = pBucket->type; if (IS_SIGNED_NUMERIC_TYPE(dataType)) { int64_t v = 0; - GET_TYPED_DATA(v, int64_t, dataType, data); + GET_TYPED_DATA(v, int64_t, dataType, data, pBucket->typeMod); if (r->dMinVal > v) { r->dMinVal = v; @@ -367,7 +369,7 @@ int32_t tMemBucketUpdateBoundingBox(MinMaxEntry *r, const char *data, int32_t da } } else if (IS_UNSIGNED_NUMERIC_TYPE(dataType)) { uint64_t v = 0; - GET_TYPED_DATA(v, uint64_t, dataType, data); + GET_TYPED_DATA(v, uint64_t, dataType, data, pBucket->typeMod); if (r->u64MinVal > v) { r->u64MinVal = v; @@ -378,7 +380,7 @@ int32_t tMemBucketUpdateBoundingBox(MinMaxEntry *r, const char *data, int32_t da } } else if (IS_FLOAT_TYPE(dataType)) { double v = 0; - GET_TYPED_DATA(v, double, dataType, data); + GET_TYPED_DATA(v, double, dataType, data, pBucket->typeMod); if (r->dMinVal > v) { r->dMinVal = v; @@ -415,7 +417,7 @@ int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size) { count += 1; tMemBucketSlot *pSlot = &pBucket->pSlots[index]; - code = tMemBucketUpdateBoundingBox(&pSlot->range, d, pBucket->type); + code = tMemBucketUpdateBoundingBox(&pSlot->range, d, pBucket); if (TSDB_CODE_SUCCESS != code) { return code; } @@ -572,8 +574,8 @@ int32_t getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction char *nextVal = thisVal + pMemBucket->bytes; double td = 1.0, nd = 1.0; - GET_TYPED_DATA(td, double, pMemBucket->type, thisVal); - GET_TYPED_DATA(nd, double, pMemBucket->type, nextVal); + GET_TYPED_DATA(td, double, pMemBucket->type, thisVal, pMemBucket->typeMod); + GET_TYPED_DATA(nd, double, pMemBucket->type, nextVal, pMemBucket->typeMod); *result = (1 - fraction) * td + fraction * nd; taosMemoryFreeClear(buffer); @@ -586,7 +588,7 @@ int32_t getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction } // try next round tMemBucket *tmpBucket = NULL; - int32_t code = tMemBucketCreate(pMemBucket->bytes, pMemBucket->type, pSlot->range.dMinVal, pSlot->range.dMaxVal, + int32_t code = tMemBucketCreate(pMemBucket->bytes, pMemBucket->type, pMemBucket->typeMod, pSlot->range.dMinVal, pSlot->range.dMaxVal, false, &tmpBucket, pSlot->info.size); if (TSDB_CODE_SUCCESS != code) { tMemBucketDestroy(&tmpBucket); diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 9994a4e06b..ede48b290b 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -878,7 +878,7 @@ int32_t sclExecLogic(SLogicConditionNode *node, SScalarCtx *ctx, SScalarParam *o int32_t ind = (i >= params[m].numOfRows) ? (params[m].numOfRows - 1) : i; char *p = colDataGetData(params[m].columnData, ind); - GET_TYPED_DATA(value, bool, params[m].columnData->info.type, p); + GET_TYPED_DATA(value, bool, params[m].columnData->info.type, p, typeGetTypeModFromColInfo(¶ms[m].columnData->info)); if (LOGIC_COND_TYPE_AND == node->condType && (false == value)) { complete = true; diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c index abd19466a7..87aefd0d4a 100644 --- a/source/libs/scalar/src/sclfunc.c +++ b/source/libs/scalar/src/sclfunc.c @@ -1218,9 +1218,9 @@ int32_t substrFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu int32_t subPos = 0; int32_t subLen = INT16_MAX; - GET_TYPED_DATA(subPos, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInputData[1], colIdx[1])); + GET_TYPED_DATA(subPos, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInputData[1], colIdx[1]), typeGetTypeModFromColInfo(&pInput[1].columnData->info)); if (inputNum == 3) { - GET_TYPED_DATA(subLen, int32_t, GET_PARAM_TYPE(&pInput[2]), colDataGetData(pInputData[2], colIdx[2])); + GET_TYPED_DATA(subLen, int32_t, GET_PARAM_TYPE(&pInput[2]), colDataGetData(pInputData[2], colIdx[2]), typeGetTypeModFromColInfo(&pInput[2].columnData->info)); } if (subPos == 0 || subLen < 1) { @@ -1337,7 +1337,7 @@ int32_t charFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp if (colDataIsNull_s(pInput[j].columnData, i)) { continue; } else if (IS_NUMERIC_TYPE(GET_PARAM_TYPE(&pInput[j]))) { - GET_TYPED_DATA(num, int32_t, GET_PARAM_TYPE(&pInput[j]), colDataGetData(pInput[j].columnData, colIdx)); + GET_TYPED_DATA(num, int32_t, GET_PARAM_TYPE(&pInput[j]), colDataGetData(pInput[j].columnData, colIdx), typeGetTypeModFromColInfo(&pInput[j].columnData->info)); getAsciiChar(num, &output); } else if (TSDB_DATA_TYPE_BINARY == GET_PARAM_TYPE(&pInput[j])) { num = taosStr2Int32(varDataVal(colDataGetData(pInput[j].columnData, colIdx)), NULL, 10); @@ -1478,7 +1478,8 @@ int32_t positionFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p int32_t trimFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { // trim space uint8_t trimType = 0; - GET_TYPED_DATA(trimType, int32_t, GET_PARAM_TYPE(&pInput[inputNum - 1]), pInput[inputNum - 1].columnData->pData); + GET_TYPED_DATA(trimType, int32_t, GET_PARAM_TYPE(&pInput[inputNum - 1]), pInput[inputNum - 1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[inputNum - 1].columnData->info)); switch (trimType) { case TRIM_TYPE_LEADING: { SCL_ERR_RET(doTrimFunction(pInput, inputNum, pOutput, tltrimspace, tltrim)); @@ -1673,7 +1674,9 @@ int32_t substrIdxFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam * char *delimStr = varDataVal(colDataGetData(pInputData[1], colIdx2)); int32_t delimLen = varDataLen(colDataGetData(pInputData[1], colIdx2)); bool needFreeDelim = false; - GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[2]), colDataGetData(pInputData[2], (pInput[2].numOfRows == 1) ? 0 : k)); + GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[2]), + colDataGetData(pInputData[2], (pInput[2].numOfRows == 1) ? 0 : k), + typeGetTypeModFromColInfo(&pInputData[2]->info)); int32_t startPosBytes; int32_t endPosBytes; @@ -1735,7 +1738,8 @@ int32_t repeatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu if (colDataIsNull_s(pInput[1].columnData, i)) { continue; } - GET_TYPED_DATA(tmpCount, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i)); + GET_TYPED_DATA(tmpCount, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i), + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); maxCount = TMAX(maxCount, tmpCount); } pInputData[0] = pInput[0].columnData; @@ -1761,7 +1765,8 @@ int32_t repeatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu continue; } int32_t count = 0; - GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i)); + GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i), + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); if (count <= 0) { varDataSetLen(output, 0); SCL_ERR_JRET(colDataSetVal(pOutputData, i, outputBuf, false)); @@ -1783,7 +1788,8 @@ int32_t repeatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu continue; } int32_t count = 0; - GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i)); + GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, i), + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); if (count <= 0) { varDataSetLen(output, 0); SCL_ERR_JRET(colDataSetVal(pOutputData, i, outputBuf, false)); @@ -1806,7 +1812,8 @@ int32_t repeatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu continue; } int32_t count = 0; - GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, 0)); + GET_TYPED_DATA(count, int32_t, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInput[1].columnData, 0), + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); if (count <= 0) { varDataSetLen(output, 0); SCL_ERR_JRET(colDataSetVal(pOutputData, i, outputBuf, false)); @@ -1868,7 +1875,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(int8_t *)output = taosStr2Int8(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(int8_t *)output, int8_t, inputType, input); + GET_TYPED_DATA(*(int8_t *)output, int8_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1886,7 +1893,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(int16_t *)output = taosStr2Int16(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(int16_t *)output, int16_t, inputType, input); + GET_TYPED_DATA(*(int16_t *)output, int16_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1905,7 +1912,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(int32_t *)output = taosStr2Int32(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(int32_t *)output, int32_t, inputType, input); + GET_TYPED_DATA(*(int32_t *)output, int32_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1923,7 +1930,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(int64_t *)output = taosStr2Int64(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(int64_t *)output, int64_t, inputType, input); + GET_TYPED_DATA(*(int64_t *)output, int64_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1941,7 +1948,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(uint8_t *)output = taosStr2UInt8(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(uint8_t *)output, uint8_t, inputType, input); + GET_TYPED_DATA(*(uint8_t *)output, uint8_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1959,7 +1966,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(uint16_t *)output = taosStr2UInt16(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(uint16_t *)output, uint16_t, inputType, input); + GET_TYPED_DATA(*(uint16_t *)output, uint16_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1977,7 +1984,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(uint32_t *)output = taosStr2UInt32(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(uint32_t *)output, uint32_t, inputType, input); + GET_TYPED_DATA(*(uint32_t *)output, uint32_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -1996,7 +2003,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(uint64_t *)output = taosStr2UInt64(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(uint64_t *)output, uint64_t, inputType, input); + GET_TYPED_DATA(*(uint64_t *)output, uint64_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -2014,7 +2021,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(float *)output = taosStr2Float(convBuf, NULL); } else { - GET_TYPED_DATA(*(float *)output, float, inputType, input); + GET_TYPED_DATA(*(float *)output, float, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -2032,7 +2039,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(double *)output = taosStr2Double(convBuf, NULL); } else { - GET_TYPED_DATA(*(double *)output, double, inputType, input); + GET_TYPED_DATA(*(double *)output, double, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -2050,7 +2057,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp convBuf[len] = 0; *(bool *)output = taosStr2Int8(convBuf, NULL, 10); } else { - GET_TYPED_DATA(*(bool *)output, bool, inputType, input); + GET_TYPED_DATA(*(bool *)output, bool, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -2058,7 +2065,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp int64_t timeVal; if (inputType == TSDB_DATA_TYPE_BINARY || inputType == TSDB_DATA_TYPE_NCHAR) { int64_t timePrec; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, typeGetTypeModFromColInfo(&pInput[1].columnData->info)); int32_t ret = convertStringToTimestamp(inputType, input, timePrec, &timeVal, pInput->tz, pInput->charsetCxt); if (ret != TSDB_CODE_SUCCESS) { *(int64_t *)output = 0; @@ -2066,7 +2073,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp *(int64_t *)output = timeVal; } } else { - GET_TYPED_DATA(*(int64_t *)output, int64_t, inputType, input); + GET_TYPED_DATA(*(int64_t *)output, int64_t, inputType, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } break; } @@ -2225,7 +2232,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam * int64_t quot = 0; long mod = 0; - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); switch (pInput->columnData[0].info.precision) { case TSDB_TIME_PRECISION_MILLI: { @@ -2298,7 +2305,8 @@ int32_t toUnixtimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarP int32_t type = GET_PARAM_TYPE(pInput); int64_t timePrec; int32_t idx = (inputNum == 2) ? 1 : 2; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[idx]), pInput[idx].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[idx]), pInput[idx].columnData->pData, + typeGetTypeModFromColInfo(&pInput[idx].columnData->info)); for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { if (colDataIsNull_s(pInput[0].columnData, i)) { @@ -2477,16 +2485,19 @@ int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarPara bool ignoreTz = true; char timezoneStr[20] = {0}; - GET_TYPED_DATA(timeUnit, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); + GET_TYPED_DATA(timeUnit, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); int32_t timePrecIdx = 2, timeZoneIdx = 3; if (inputNum == 5) { timePrecIdx += 1; timeZoneIdx += 1; - GET_TYPED_DATA(ignoreTz, bool, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData); + GET_TYPED_DATA(ignoreTz, bool, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData, + typeGetTypeModFromColInfo(&pInput[2].columnData->info)); } - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[timePrecIdx]), pInput[timePrecIdx].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[timePrecIdx]), pInput[timePrecIdx].columnData->pData, + typeGetTypeModFromColInfo(&pInput[timePrecIdx].columnData->info)); (void)memcpy(timezoneStr, varDataVal(pInput[timeZoneIdx].columnData->pData), varDataLen(pInput[timeZoneIdx].columnData->pData)); for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { @@ -2504,9 +2515,9 @@ int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarPara continue; } } else if (type == TSDB_DATA_TYPE_BIGINT) { /* unix timestamp */ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { /* timestamp column*/ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } char buf[20] = {0}; @@ -2530,10 +2541,13 @@ int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarPara int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { int64_t timeUnit = -1, timePrec, timeVal[2] = {0}; if (inputNum == 4) { - GET_TYPED_DATA(timeUnit, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData); - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[3]), pInput[3].columnData->pData); + GET_TYPED_DATA(timeUnit, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData, + typeGetTypeModFromColInfo(&pInput[2].columnData->info)); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[3]), pInput[3].columnData->pData, + typeGetTypeModFromColInfo(&pInput[3].columnData->info)); } else { - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData, + typeGetTypeModFromColInfo(&pInput[2].columnData->info)); } int64_t factor = TSDB_TICK_PER_SECOND(timePrec); @@ -2564,7 +2578,7 @@ int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p break; } } else if (type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_TIMESTAMP) { /* unix timestamp or ts column*/ - GET_TYPED_DATA(timeVal[k], int64_t, type, input[k]); + GET_TYPED_DATA(timeVal[k], int64_t, type, input[k], typeGetTypeModFromColInfo(&pInput[k].columnData->info)); if (type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t timeValSec = timeVal[k] / factor; if (timeValSec < 1000000000) { @@ -2663,7 +2677,8 @@ int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p int32_t nowFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { int64_t timePrec; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[0]), pInput[0].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[0]), pInput[0].columnData->pData, + typeGetTypeModFromColInfo(&pInput[0].columnData->info)); int64_t ts = taosGetTimestamp(timePrec); for (int32_t i = 0; i < pInput->numOfRows; ++i) { @@ -2675,7 +2690,8 @@ int32_t nowFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutpu int32_t todayFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { int64_t timePrec; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[0]), pInput[0].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[0]), pInput[0].columnData->pData, + typeGetTypeModFromColInfo(&pInput[0].columnData->info)); int64_t ts = taosGetTimestampToday(timePrec, pInput->tz); for (int32_t i = 0; i < pInput->numOfRows; ++i) { @@ -2711,7 +2727,8 @@ int32_t weekdayFunctionImpl(SScalarParam *pInput, int32_t inputNum, SScalarParam int64_t timePrec, timeVal = 0; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); for (int32_t i = 0; i < pInput[0].numOfRows; ++i) { if (colDataIsNull_s(pInput[0].columnData, i)) { @@ -2728,9 +2745,9 @@ int32_t weekdayFunctionImpl(SScalarParam *pInput, int32_t inputNum, SScalarParam continue; } } else if (type == TSDB_DATA_TYPE_BIGINT) { /* unix timestamp */ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { /* timestamp column*/ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } struct STm tm; TAOS_CHECK_RETURN(taosTs2Tm(timeVal, timePrec, &tm, pInput->tz)); @@ -2838,9 +2855,9 @@ int32_t weekFunctionImpl(SScalarParam *pInput, int32_t inputNum, SScalarParam *p continue; } } else if (type == TSDB_DATA_TYPE_BIGINT) { /* unix timestamp */ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { /* timestamp column*/ - GET_TYPED_DATA(timeVal, int64_t, type, input); + GET_TYPED_DATA(timeVal, int64_t, type, input, typeGetTypeModFromColInfo(&pInput[0].columnData->info)); } struct STm tm; SCL_ERR_RET(taosTs2Tm(timeVal, prec, &tm, pInput->tz)); @@ -2857,18 +2874,22 @@ int32_t weekFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp int64_t timePrec; int32_t mode = 0; if (inputNum == 2) { - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); return weekFunctionImpl(pInput, inputNum, pOutput, timePrec, mode); } else { - GET_TYPED_DATA(mode, int32_t , GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData); + GET_TYPED_DATA(mode, int32_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData, + typeGetTypeModFromColInfo(&pInput[2].columnData->info)); return weekFunctionImpl(pInput, inputNum, pOutput, timePrec, mode); } } int32_t weekofyearFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { int64_t timePrec; - GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); + GET_TYPED_DATA(timePrec, int64_t, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); return weekFunctionImpl(pInput, inputNum, pOutput, timePrec, 3); } @@ -2927,7 +2948,8 @@ int32_t randFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp // for constant seed, only set seed once if ((pInput[0].numOfRows == 1 && i == 0) || (pInput[0].numOfRows != 1)) { if (!IS_NULL_TYPE(GET_PARAM_TYPE(&pInput[0])) && !colDataIsNull_s(pInput[0].columnData, i)) { - GET_TYPED_DATA(seed, int32_t, GET_PARAM_TYPE(&pInput[0]), colDataGetData(pInput[0].columnData, i)); + GET_TYPED_DATA(seed, int32_t, GET_PARAM_TYPE(&pInput[0]), colDataGetData(pInput[0].columnData, i), + typeGetTypeModFromColInfo(&pInput[0].columnData->info)); taosSeedRand(seed); } } @@ -3016,7 +3038,8 @@ static int32_t doScalarFunction2(SScalarParam *pInput, int32_t inputNum, SScalar continue; } double in2; - GET_TYPED_DATA(in2, double, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInputData[1], colIdx2)); + GET_TYPED_DATA(in2, double, GET_PARAM_TYPE(&pInput[1]), colDataGetData(pInputData[1], colIdx2), + typeGetTypeModFromColInfo(&pInputData[1]->info)); switch (GET_PARAM_TYPE(&pInput[0])) { case TSDB_DATA_TYPE_DOUBLE: { double *in = (double *)pInputData[0]->pData; @@ -3654,8 +3677,10 @@ int32_t leastSQRScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarPa double startVal, stepVal; double matrix[2][3] = {0}; - GET_TYPED_DATA(startVal, double, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData); - GET_TYPED_DATA(stepVal, double, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData); + GET_TYPED_DATA(startVal, double, GET_PARAM_TYPE(&pInput[1]), pInput[1].columnData->pData, + typeGetTypeModFromColInfo(&pInput[1].columnData->info)); + GET_TYPED_DATA(stepVal, double, GET_PARAM_TYPE(&pInput[2]), pInput[2].columnData->pData, + typeGetTypeModFromColInfo(&pInput[2].columnData->info)); int32_t type = GET_PARAM_TYPE(pInput); int64_t count = 0; @@ -3831,7 +3856,7 @@ int32_t percentileScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalar break; } char *in = pInputData->pData; - GET_TYPED_DATA(val, double, type, in); + GET_TYPED_DATA(val, double, type, in, typeGetTypeModFromColInfo(&pInputData->info)); } if (hasNull) { @@ -3868,7 +3893,7 @@ int32_t spreadScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarPara char *in = pInputData->pData; double val = 0; - GET_TYPED_DATA(val, double, type, in); + GET_TYPED_DATA(val, double, type, in, typeGetTypeModFromColInfo(&pInputData->info)); if (val < GET_DOUBLE_VAL(&min)) { SET_DOUBLE_VAL(&min, val); @@ -4339,7 +4364,7 @@ int32_t histogramScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarP char *data = colDataGetData(pInputData, i); double v; - GET_TYPED_DATA(v, double, type, data); + GET_TYPED_DATA(v, double, type, data, typeGetTypeModFromColInfo(&pInputData->info)); for (int32_t k = 0; k < numOfBins; ++k) { if (v > bins[k].lower && v <= bins[k].upper) { diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index 0fd42ced70..a89766787a 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -50,48 +50,48 @@ static int32_t vectorMathOpForDecimal(SScalarParam *pLeft, SScalarParam *pRight, int32_t convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) { switch (outType) { case TSDB_DATA_TYPE_BOOL: { - GET_TYPED_DATA(*((bool *)outData), bool, inType, inData); + GET_TYPED_DATA(*((bool *)outData), bool, inType, inData, 0); break; } case TSDB_DATA_TYPE_TINYINT: { - GET_TYPED_DATA(*((int8_t *)outData), int8_t, inType, inData); + GET_TYPED_DATA(*((int8_t *)outData), int8_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_SMALLINT: { - GET_TYPED_DATA(*((int16_t *)outData), int16_t, inType, inData); + GET_TYPED_DATA(*((int16_t *)outData), int16_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_INT: { - GET_TYPED_DATA(*((int32_t *)outData), int32_t, inType, inData); + GET_TYPED_DATA(*((int32_t *)outData), int32_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_BIGINT: case TSDB_DATA_TYPE_TIMESTAMP: { - GET_TYPED_DATA(*((int64_t *)outData), int64_t, inType, inData); + GET_TYPED_DATA(*((int64_t *)outData), int64_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_UTINYINT: { - GET_TYPED_DATA(*((uint8_t *)outData), uint8_t, inType, inData); + GET_TYPED_DATA(*((uint8_t *)outData), uint8_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_USMALLINT: { - GET_TYPED_DATA(*((uint16_t *)outData), uint16_t, inType, inData); + GET_TYPED_DATA(*((uint16_t *)outData), uint16_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_UINT: { - GET_TYPED_DATA(*((uint32_t *)outData), uint32_t, inType, inData); + GET_TYPED_DATA(*((uint32_t *)outData), uint32_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_UBIGINT: { - GET_TYPED_DATA(*((uint64_t *)outData), uint64_t, inType, inData); + GET_TYPED_DATA(*((uint64_t *)outData), uint64_t, inType, inData, 0); break; } case TSDB_DATA_TYPE_FLOAT: { - GET_TYPED_DATA(*((float *)outData), float, inType, inData); + GET_TYPED_DATA(*((float *)outData), float, inType, inData, 0); break; } case TSDB_DATA_TYPE_DOUBLE: { - GET_TYPED_DATA(*((double *)outData), double, inType, inData); + GET_TYPED_DATA(*((double *)outData), double, inType, inData, 0); break; } default: { @@ -737,7 +737,7 @@ int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) { } int64_t value = 0; - GET_TYPED_DATA(value, int64_t, pCtx->inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, int64_t, pCtx->inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%" PRId64, value); varDataLen(tmp) = len; if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) { @@ -754,7 +754,7 @@ int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) { } uint64_t value = 0; - GET_TYPED_DATA(value, uint64_t, pCtx->inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, uint64_t, pCtx->inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%" PRIu64, value); varDataLen(tmp) = len; if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) { @@ -771,7 +771,7 @@ int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) { } double value = 0; - GET_TYPED_DATA(value, double, pCtx->inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, double, pCtx->inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%lf", value); varDataLen(tmp) = len; if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) { @@ -820,7 +820,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, int64_t maxValue = tDataTypes[cCtx.outType].maxValue; double value = 0; - GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0)); + GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0), typeGetTypeModFromColInfo(&pInputCol->info)); if (value > maxValue) { *overflow = 1; @@ -836,7 +836,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, uint64_t maxValue = (uint64_t)tDataTypes[cCtx.outType].maxValue; double value = 0; - GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0)); + GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0), typeGetTypeModFromColInfo(&pInputCol->info)); if (value > maxValue) { *overflow = 1; @@ -860,7 +860,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } bool value = 0; - GET_TYPED_DATA(value, bool, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, bool, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt8(pOutputCol, i, (int8_t *)&value); } break; @@ -873,7 +873,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } int8_t value = 0; - GET_TYPED_DATA(value, int8_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, int8_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt8(pOutputCol, i, (int8_t *)&value); } break; @@ -886,7 +886,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } int16_t value = 0; - GET_TYPED_DATA(value, int16_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, int16_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt16(pOutputCol, i, (int16_t *)&value); } break; @@ -899,7 +899,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } int32_t value = 0; - GET_TYPED_DATA(value, int32_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, int32_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt32(pOutputCol, i, (int32_t *)&value); } break; @@ -913,7 +913,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } int64_t value = 0; - GET_TYPED_DATA(value, int64_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, int64_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt64(pOutputCol, i, (int64_t *)&value); } break; @@ -926,7 +926,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } uint8_t value = 0; - GET_TYPED_DATA(value, uint8_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, uint8_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt8(pOutputCol, i, (int8_t *)&value); } break; @@ -939,7 +939,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } uint16_t value = 0; - GET_TYPED_DATA(value, uint16_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, uint16_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt16(pOutputCol, i, (int16_t *)&value); } break; @@ -952,7 +952,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } uint32_t value = 0; - GET_TYPED_DATA(value, uint32_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, uint32_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt32(pOutputCol, i, (int32_t *)&value); } break; @@ -965,7 +965,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } uint64_t value = 0; - GET_TYPED_DATA(value, uint64_t, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, uint64_t, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetInt64(pOutputCol, i, (int64_t *)&value); } break; @@ -978,7 +978,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } float value = 0; - GET_TYPED_DATA(value, float, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, float, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetFloat(pOutputCol, i, (float *)&value); } break; @@ -991,7 +991,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, } double value = 0; - GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, i)); + GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, i), typeGetTypeModFromColInfo(&pInputCol->info)); colDataSetDouble(pOutputCol, i, (double *)&value); } break; @@ -2075,7 +2075,7 @@ int32_t vectorIsTrue(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pO } { bool v = false; - GET_TYPED_DATA(v, bool, pOut->columnData->info.type, colDataGetData(pOut->columnData, i)); + GET_TYPED_DATA(v, bool, pOut->columnData->info.type, colDataGetData(pOut->columnData, i), typeGetTypeModFromColInfo(&pOut->columnData->info)); if (v) { ++pOut->numOfQualified; }