Calcite中文字符串toSqlString()变为乱码(Unicode),重写SqlDialect类中的quoteStringLiteral()方法解决

使用Calcite,中文字符串toSqlString()时会变成乱码(unicode),可以新建一个方言类,重写quoteStringLiteral()方法解决。

没有重写quoteStringLiteral()时:
在这里插入图片描述
在这里插入图片描述
重写quoteStringLiteral()后:
在这里插入图片描述
在这里插入图片描述
原因在SqlDialect类中的quoteStringLiteral()方法:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 定义自定义函数类 首先需要定义一个自定义函数类,该类需要继承`org.apache.calcite.sql.SqlFunction`类,并实现其的构造方法和`org.apache.calcite.sql.SqlKind`枚举类型。构造方法需要设置函数名称、参数类型、返回类型等信息。 例如,定义一个自定义函数`myFunc`,该函数接收两个整型参数,并返回它们的和: ```java public class MyFunc extends SqlFunction { public MyFunc() { super("myFunc", SqlKind.OTHER_FUNCTION, ReturnTypes.INTEGER_NULLABLE, null, OperandTypes.family(SqlTypeFamily.INTEGER, SqlTypeFamily.INTEGER), SqlFunctionCategory.USER_DEFINED_FUNCTION); } @Override public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) { return new MyFuncCall(this, pos, operands[0], operands[1]); } } ``` 2. 定义自定义函数调用类 接下来需要定义一个函数调用类,该类需要继承`org.apache.calcite.sql.SqlCall`类,并实现其的构造方法和`org.apache.calcite.sql.SqlKind`枚举类型。构造方法需要设置函数调用的参数信息。 例如,定义一个自定义函数调用类`MyFuncCall`,该类用于调用`myFunc`函数: ```java public class MyFuncCall extends SqlCall { public MyFuncCall(SqlFunction function, SqlParserPos pos, SqlNode... operands) { super(pos); this.function = function; this.operands = operands; } @Override public SqlKind getKind() { return SqlKind.OTHER_FUNCTION; } @Override public SqlOperator getOperator() { return function; } @Override public List<SqlNode> getOperandList() { return Arrays.asList(operands); } @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { writer.keyword("myFunc"); writer.keyword("("); SqlNodeList nodeList = new SqlNodeList(operands, SqlParserPos.ZERO); nodeList.get(0).unparse(writer, leftPrec, rightPrec); writer.keyword(","); nodeList.get(1).unparse(writer, leftPrec, rightPrec); writer.keyword(")"); } } ``` 3. 注册自定义函数 最后需要将自定义函数注册到`org.apache.calcite.sql.SqlOperatorTable`,以便在SQL查询使用。 例如,在`org.apache.calcite.adapter.druid.DruidSchema`注册自定义函数: ```java public class DruidSchema extends AbstractSchema { // ... @Override protected Map<String, org.apache.calcite.schema.Table> getTableMap() { Map<String, org.apache.calcite.schema.Table> map = new HashMap<>(); // ... // 注册自定义函数 SqlOperatorTable operatorTable = new SqlFunctionTable( ImmutableList.of( new MyFunc() )); map.put("functions", new FunctionTable(operatorTable)); return map; } } ``` 现在就可以在SQL查询使用自定义函数了: ```sql SELECT myFunc(1, 2) FROM myTable ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值