[ https://issues.apache.org/jira/browse/CALCITE-3379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16946450#comment-16946450 ]
Danny Chen commented on CALCITE-3379: ------------------------------------- [~julianhyde] [~hyuan],yes, the linked PR is not relevant with this JIRA, maybe i mis-clicked. Let me re-state the use case: Now user can declare the column of a table in DDL with special strategy(known as column constraints in other sql engines[1] [2]), as we enumerate in ColumnStrategy[3], then with the SqlNode got from InitializerExpressionFactory#newColumnDefaultValue, SqlToRelConverter would translate it to a RexCall and put it the project list above the table. InitializerExpressionFactory#newColumnDefaultValue use the InitializerContext to convert the SqlNode, the problem is that: # SqlNode got from the DDL is not validated(we have no validation for DDL nodes yet, and i think we don'tneed to) and we always got a RexCall with SqlUnresolvedFunction. # The SqlNode can not be serialized directly, many times the DDL definition need to persist into the Catalog as a metadata(we may unparse it to pure sql but that is not intuitive and we still need use to parse it back to SqlNode when deserializing) So, what i proposed is that add the InitializerContext#convertExpression(String) and deprecate the #convertExpression(SqlNode), Calcite is the role to parse the string to SqlNode then validate and translate it to RexCall. What the user see is always a string and it can be persisted. > Support expand STRING column expression in table during sql-to-rel conversion > ----------------------------------------------------------------------------- > > Key: CALCITE-3379 > URL: https://issues.apache.org/jira/browse/CALCITE-3379 > Project: Calcite > Issue Type: Improvement > Components: core > Affects Versions: 1.21.0 > Reporter: Danny Chen > Assignee: Danny Chen > Priority: Major > Labels: pull-request-available > Fix For: 1.22.0 > > Time Spent: 2h > Remaining Estimate: 0h > > Now there are 2 ways to convert a RelOptTable to LogicalTableScan: > 1. One way is to open the Config#isConvertTableAccess[1] flag and the > SqlToRelConverter would invoke the #toRel method which transforms the table > to a node returned by the user(Usually a table scan). > 2. Another way is to use the LogicalTableScan rule, this rule would invoke > RelOptTable#toRel and wrap the returned node with a LogicalTableScan. > > The difference between 1 and 2 is that, 2 happens in the planning rule but 1 > happens in sql-to-rel conversion, 1 also supports to expand the table columns > based on the defined default values expressions, see > InitializerExpressionFactory#newColumnDefaultValue. > > The problem with the InitializerExpressionFactory#newColumnDefaultValue is > that it uses InitializerContext#convertExpression to convert a SqlNode, but > if the SqlNode is not validated, we always got a RexCall with > SqlUnresolvedFunction. We should give the user chance to validate their > SqlNode or even we can support pure string expressions which can be used to > persist. > > Another problem with #toRel is that after the expressions applied as a > projection, user has no chance to apply any other relational nodes if they > want, we can actually support this, the same way as we support the column > expressions. > > [1]https://github.com/apache/calcite/blob/2dc97e6723e1b5bf762540f87ffffb5cd1a848a1/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java#L5605 -- This message was sent by Atlassian Jira (v8.3.4#803005)