Hi,
We are using calcite to do MV rewrite, for we convert the original sql to
a relNode, optimize the relNode and reconvert it back to Sql (using
RelToSqlConverter)
Currently a query like this
*Select * from foo.bar where limit 10 ; *
Results in the following plan (after a MV rewrite to a different table)
EnumerableLimit(fetch=[1]): rowcount = 1.0, cumulative cost = {1.0 rows,
2.0 cpu, 0.0 io}, id = 303
EnumerableTableScan(table=[[viewSchema, barView]]): rowcount = 1.0,
cumulative cost = {0.0 rows, 1.0 cpu, 0.0 io}, id = 176
While converting the relNode to sql using RelToSqlConverter we get an
exception saying
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.AssertionError: Need to implement
org.apache.calcite.adapter.enumerable.EnumerableLimit
Seems like RelToSqlConverter does not handle EnumerableLimit , Is this a bug ?
The fix is adding a visit method to RelToSqlConverter with
EnumerableLimit as the function argument.
public Result visit(EnumerableLimit e) {
Result x = visitChild(0, e.getInput());
Builder builder = x.builder(e, Clause.FETCH);
if (e.fetch != null) {
builder = x.builder(e, Clause.FETCH);
builder.setFetch(builder.context.toSql(null, e.fetch));
x = builder.result();
}
if (e.offset != null) {
builder = x.builder(e, Clause.OFFSET);
builder.setOffset(builder.context.toSql(null, e.offset));
x = builder.result();
}
return x;
}
Found some relevant discussion here -
https://jira.apache.org/jira/browse/CALCITE-1003.
Can you please help in understanding if this handling is correct? (or
if there is a better way )
Thanks
Anupam