diff --git a/src/main/java/com/canner/udf/UdfPlugin.java b/src/main/java/com/canner/udf/UdfPlugin.java index 5756631..bd3224c 100644 --- a/src/main/java/com/canner/udf/UdfPlugin.java +++ b/src/main/java/com/canner/udf/UdfPlugin.java @@ -20,6 +20,7 @@ import com.canner.udf.scalar.EncryptDecryptWithKey; import com.canner.udf.scalar.ExtendedHashFunction; import com.canner.udf.scalar.MathOperation; +import com.canner.udf.scalar.MathOperation.MathOP; import com.canner.udf.scalar.TimestampSeqNo; import com.canner.udf.scalar.TimestampWithTZSeqNo; import io.trino.spi.Plugin; @@ -47,6 +48,7 @@ public Set> getFunctions() functions.add(TimestampWithTZSeqNo.class); // load udfs in MathOperation class functions.add(MathOperation.class); + functions.add(MathOP.class); return Collections.unmodifiableSet(functions); } diff --git a/src/main/java/com/canner/udf/scalar/MathOperation.java b/src/main/java/com/canner/udf/scalar/MathOperation.java index a46fd26..8954d60 100644 --- a/src/main/java/com/canner/udf/scalar/MathOperation.java +++ b/src/main/java/com/canner/udf/scalar/MathOperation.java @@ -16,10 +16,14 @@ package com.canner.udf.scalar; import io.trino.spi.function.Description; +import io.trino.spi.function.LiteralParameters; import io.trino.spi.function.ScalarFunction; import io.trino.spi.function.SqlType; +import io.trino.spi.type.Int128; import io.trino.spi.type.StandardTypes; +import static io.trino.spi.type.Int128Math.add; + public class MathOperation { private MathOperation() {} @@ -31,4 +35,32 @@ public static long mathOpAddBigInt(@SqlType(StandardTypes.BIGINT) long left, @Sq { return left + right; } + + @ScalarFunction("math_op") + @Description("math op") + public static final class MathOP + { + private MathOP() {} + + // this is needed, otherwise mathOp(Int128, Int128) won't work + @LiteralParameters({"p", "s"}) + @SqlType("decimal(p, s)") + public static long mathOp(@SqlType("decimal(p, s)") long left, @SqlType("decimal(p, s)") long right) + { + return left + right; + } + + @LiteralParameters({"p", "s"}) + @SqlType("decimal(p, s)") + public static Int128 mathOp(@SqlType("decimal(p, s)") Int128 left, @SqlType("decimal(p, s)") Int128 right) + { + long[] resultArray = new long[2]; + add( + left.getHigh(), left.getLow(), + right.getHigh(), right.getLow(), + resultArray, + 0); + return Int128.valueOf(resultArray); + } + } }