Hi All,
I have a question regarding how to get a rex expression scoped to a select
list:
Let's say I have a table t:
CREATE TABLE t (
foo int,
bar int
);
And a simple query:
SELECT foo FROM t
And some standalone expressions related to that query/table stored
elsewhere that I want to inject:
bar + 123
Where the final desired query is:
SELECT foo, bar + 123 FROM t
How can I produce a RexNode for the expression `bar + 1` (eg `$1 + 123`)?
My intuition was to validate the simple query and get the scope at the
select list:
SqlValidator validator
SqlToRelConverter converter
SqlSelect select = (SqlSelect) parse("SELECT foo FROM t")
validator.validate(select)
SqlNode node = parse("bar + 123")
val scope = validator.getSelectScope(select)
node.validateExpr(validator, scope)
RexNode rex = converter.convertExpression(node)
however, I can't get the identifier resolved.
[info] Cause: java.lang.AssertionError: no unique expression found for
{id: bar, prefix: 1}; count is 0
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.lookupExp(SqlToRelConverter.java:5009)
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter.convertIdentifier(SqlToRelConverter.java:4299)
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter.access$2600(SqlToRelConverter.java:229)
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5532)
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:4702)
[info] at
org.apache.calcite.sql.SqlIdentifier.accept(SqlIdentifier.java:324)
[info] at
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5351)
[info] at
org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:971)
[info] at
org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:963)
[info] at
org.apache.calcite.sql2rel.StandardConvertletTable.convertCall(StandardConvertletTable.java:916)
For the rest of the process (rebuilding the select with the new select
list), I have no problem.
I'm really stuck with resolving identifiers given the scope of the select
list.
Any help would be greatly appreciated.
Guillaume Massé
马赛卫