trino 自定义函数历险
trino 版本 392
普通的自定函数 按照官网教程就可以 https://trino.io/docs/current/develop/functions.html 。 注意项目结构 和包名就可以 参考 https://blog.csdn.net/u010711495/article/details/112294779
本文主要说一下针对有小数的自定义函数。
trino中当时函数参数是小数的时候,需要用 decimal 注解 。当长度超过18位的时候接受就需要使用 Int128 否则使用 long , 通过 注解中p来确定小数点位置。。 如果只有一个方法就会报 Unsupported binding 异常。
当出现这个异常的时候,需要检查参数类型。 当我当时不知道trino的骚操作卡了很久。
返回为什么不用 decimal呢。
如果返回明确 decimal 的大小是可以使用,当返回的长度是个变量,trino不支持。。
@ScalarFunction("cu_fucntion")
public class FpeDeFunctions {
@LiteralParameters({"p", "s"})
@SqlType(StandardTypes.VARCHAR)
public static Slice fpeDecrypt(@LiteralParameter("s") long numScale, @SqlType("decimal(p, s)") Int128 num, @SqlType(StandardTypes.VARCHAR) Slice secret) {
String input = Decimals.toString(num, (int) numScale);
String val = .....
return Slices.utf8Slice(val);
}
@LiteralParameters({"p", "s"})
@SqlType(StandardTypes.DOUBLE)
public static double fpeShortDecrypt(@LiteralParameter("s") long numScale, @SqlType("decimal(p, s)") long num, @SqlType(StandardTypes.VARCHAR) Slice secret) {
String input = String.valueOf(num);
if (numScale > 0) {
input = new StringBuilder(input).insert(input.length() - (int) numScale, ".").toString();
}
String val = .........;
return Double.parseDouble(val);
}
@SqlType(StandardTypes.BIGINT)
public static long fpeBigintDecrypt(@SqlType(StandardTypes.BIGINT) long num, @SqlType(StandardTypes.VARCHAR) Slice secret) {
String input = String.valueOf(num);
String val =............;
return Long.parseLong(val);
}
}

浙公网安备 33010602011771号