[
https://issues.apache.org/jira/browse/CALCITE-3379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16948237#comment-16948237
]
Wang Yanlin commented on CALCITE-3379:
--------------------------------------
Currently, this test case in *ServerTest* run success, mind the invalid use of
*trims*.
{noformat}
@Test public void testVirtualColumnWithFunctions() throws Exception {
try (Connection c = connect();
Statement s = c.createStatement()) {
// Test builtin and library functions.
final String create = "create table t1 (\n"
+ " h varchar(3) not null,\n"
+ " i varchar(3),\n"
+ " j int not null as (char_length(h)) virtual,\n"
+ " k varchar(3) null as (trims(i)) virtual)";
boolean b = s.execute(create);
assertThat(b, is(false));
int x = s.executeUpdate("insert into t1 (h, i) values ('abc', 'de ')");
assertThat(x, is(1));
}
}
{noformat}
And exception occurs when trying to query the table.
Agree with [[email protected]], it would be better to throw an exception
when creating the table.
> 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)