具有默认参数值的方解石函数

Calcite function with default argument value

我正在使用 Apache Calcite 添加一些内置函数。现在,我想实现像 MySQL 这样的 GROUP_CONCAT 函数来用一个分隔符连接一列。

SELECT GROUP_CONCAT(n_name, '|') FROM nation GROUP BY n_lang;

函数class如下:

public class SqlGroupConcatFunction extends SqlAggFunction {
  public SqlGroupConcatFunction() {
    super(
        "GROUP_CONCAT",
        null,
        SqlKind.GROUP_CONCAT,
        ReturnTypes.VARCHAR_2000,
        InferTypes.FIRST_KNOWN,
        OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING),
        SqlFunctionCategory.STRING,
        false,
        false);
  }
}

现在,我希望这个函数可以接受一个参数(没有分隔符)或两个参数。当只接受一个参数时,将第二个参数设置为默认值。

我没有找到任何在 Calcite 中设置默认参数值的方法。有实现此功能的方法吗?

CALCITE-941 中,我们添加了对参数的支持,这些参数是可选的并且有名称。可以在自定义函数的参数中添加@Parameter注解来指定其名称和是否可选。

但是,您的用例是一个聚合函数,@Parameter 注释不适用于这些。

因此,您必须为允许 1 或 2 个参数的构造函数指定一个 SqlOperandTypeChecker 参数。尝试替换

OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING),

OperandTypes.or(
  OperandTypes.family(SqlTypeFamily.ANY),
  OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.STRING)),

这将使验证者满意。在稍后的某个阶段,可能在 sql-to-rel 转换时,您可以拦截 1 参数调用并将它们变成 2 参数调用。