diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 5ba3a7e36b..46529f00ae 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -1072,7 +1072,7 @@ void nodesDestroyNode(SNode* pNode) { SValueNode* pValue = (SValueNode*)pNode; destroyExprNode((SExprNode*)pNode); taosMemoryFreeClear(pValue->literal); - if (IS_VAR_DATA_TYPE(pValue->node.resType.type)) { + if (IS_VAR_DATA_TYPE(pValue->node.resType.type) || pValue->node.resType.type == TSDB_DATA_TYPE_DECIMAL) { taosMemoryFreeClear(pValue->datum.p); } break; diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 08effe9724..42e5aa2639 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -1298,6 +1298,16 @@ EDealRes sclRewriteFunction(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } (void)memcpy(res->datum.p, output.columnData->pData, varDataTLen(output.columnData->pData)); + } else if (type == TSDB_DATA_TYPE_DECIMAL) { + res->datum.p = taosMemoryCalloc(1, DECIMAL128_BYTES); + if (!res->datum.p) { + sclError("calloc %d failed", DECIMAL128_BYTES); + sclFreeParam(&output); + nodesDestroyNode((SNode*)res); + ctx->code = terrno; + return DEAL_RES_ERROR; + } + (void)memcpy(res->datum.p, output.columnData->pData, DECIMAL128_BYTES); } else { ctx->code = nodesSetValueNodeValue(res, output.columnData->pData); if (ctx->code) { diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index b0ccc12e4e..8434c875db 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1063,6 +1063,13 @@ int32_t compareDecimal64SameScale(const void* pleft, const void* pright) { return 0; } +int32_t compareDecimal64SameScaleDesc(const void* pLeft, const void* pRight) { + SDecimalOps* pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64); + if (pOps->lt(pLeft, pRight, WORD_NUM(Decimal64))) return 1; + if (pOps->gt(pLeft, pRight, WORD_NUM(Decimal64))) return -1; + return 0; +} + int32_t compareDecimal128SameScale(const void* pleft, const void* pright) { SDecimalOps* pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL); if (pOps->gt(pleft, pright, WORD_NUM(Decimal))) return 1; @@ -1070,6 +1077,13 @@ int32_t compareDecimal128SameScale(const void* pleft, const void* pright) { return 0; } +int32_t compareDecimal128SameScaleDesc(const void* pLeft, const void* pRight) { + SDecimalOps* pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL); + if (pOps->lt(pLeft, pRight, WORD_NUM(Decimal))) return 1; + if (pOps->gt(pLeft, pRight, WORD_NUM(Decimal))) return -1; + return 0; +} + int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); } /* @@ -1810,6 +1824,10 @@ __compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) { return (order == TSDB_ORDER_ASC) ? compareLenPrefixedWStr : compareLenPrefixedWStrDesc; case TSDB_DATA_TYPE_JSON: return (order == TSDB_ORDER_ASC) ? compareJsonVal : compareJsonValDesc; + case TSDB_DATA_TYPE_DECIMAL64: + return (order == TSDB_ORDER_ASC) ? compareDecimal64SameScale : compareDecimal64SameScaleDesc; + case TSDB_DATA_TYPE_DECIMAL: + return (order == TSDB_ORDER_ASC) ? compareDecimal128SameScale : compareDecimal128SameScaleDesc; default: return (order == TSDB_ORDER_ASC) ? compareInt32Val : compareInt32ValDesc; }