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);
}

}

  

 

posted @ 2023-11-14 15:18  一天一天  阅读(365)  评论(0)    收藏  举报