Hi community,
I want to override the `trim` function. Currently the function it cannot
support signature like this: `trim(string, characters)`, which is supported
by database like DuckDB[1].
I implemented a function like the following:
```
public class SqlTrim2Function extends SqlFunction {
public static final SqlTrim2Function INSTANCE = new SqlTrim2Function();
public SqlTrim2Function() {
super(
"TRIM",
SqlKind.OTHER_FUNCTION,
ReturnTypes.VARCHAR,
null,
OperandTypes.STRING
.or(OperandTypes.sequence("TRIM(<STRING>,
<STRING>)",
OperandTypes.STRING, OperandTypes.STRING)),
SqlFunctionCategory.STRING);
}
}
```
and added to the operator table like this:
```
SqlOperatorTable sqlOperatorTable = SqlOperatorTables.chain(
SqlOperatorTables.of(
SqlTrim2Function.INSTANCE
)
);
FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()
...
.operatorTable(sqlOperatorTable)
...
.build();
```
However, I still got the parsing error (saying there is a ',').
The reason is that the `TRIM` expression directly goes to the
`BuiltinFunctionCall` since `jj_2_60(2)` is true inside
`AtomicRowExpression` of `SqlParserImpl` instead of goes to
`NamedFunctionCall·. So it does not goes to the function I defined.
Currently I workaround this by changing the function name to `trim2` so
that it is not recognized as a built-in function, which works but is not
ideal. Is there a easy way to override the `trim` function inside
SqlParserImpl (seems like it is generated)?
Best,
Xiaoying
[1] https://duckdb.org/docs/sql/functions/char.html