OOTB 示例 udf junits (UdfTest.java) 使用虚拟 jdbc 架构,并且不显示 RelBuilder api 的用法。
我正在注册一个简单的 UDF,它返回输入字符串的长度。我已经创建了 SqlFunction 并在 SqlStdOperatorTable 中注册了相同的内容 -
SqlFunction length = new SqlFunction("STRLEN",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER,
null,
OperandTypes.STRING,
SqlFunctionCategory.USER_DEFINED_FUNCTION);
SqlStdOperatorTable sqlStdOperatorTable = SqlStdOperatorTable.instance();
sqlStdOperatorTable.register(length);
并用它来创建 FrameworkConfig -
FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()
.parserConfig(SqlParser.Config.DEFAULT)
.defaultSchema(connection.getRootSchema().getSubSchema("SYSTEM"))
.programs(Programs.sequence(Programs.ofRules(Programs.RULE_SET), Programs.CALC_PROGRAM))
.operatorTable(sqlStdOperatorTable)
.build();
现在我可以使用预定义的 sql 函数substr,例如在 SqlStringLengthFunction 类中定义的函数,其中包含以下部分:
RelNode udfRelNode = builder
.scan("EMP")
.project(builder.call(new SqlStringLengthFunction(),builder.literal("SampleString"), builder.literal(3))
.build();
PreparedStatement statement = RelRunners.run(udfRelNode);
ResultSet resultSet = statement.executeQuery();
但是当我在 builder.call 中尝试使用上述函数“length”时,它会抛出异常 -
java.lang.RuntimeException: cannot translate call STRLEN($t3)
构建器从类中的私有映射中获取这些函数的实现RexImpTable。此类中没有公开/受保护的 API 来向该映射添加值。
您能否指导如何使用 Calcite 注册任何 UDF 并将其与 RelBuilder 一起使用?
红颜莎娜
相关分类