'm trying to rewrite the below query to be
SELECT (SELECT PRONAME FROM PG_PROC WHERE OID = col1) FROM (VALUES
('array_in', 'array_out')) as tbl(col1, col2)

When I try to test my code using this query
SELECT col1::regproc FROM (VALUES ('array_in', 'array_out')) as tbl(col1,
col2)

The casting expression (col1::regproc) type is derived as *not* nullable
because the casting is applied on a column selected from VALUES.

But RexSubQuery.scalar[1] always returns a RelNode with a nullable type.

The exception I get when I try to run the query after rewriting is:

set type is RecordType(REGPROC *NOT NULL* EXPR$0) NOT NULL
expression type is RecordType(REGPROC EXPR$0) NOT NULL
set is
rel#11:LogicalProject.NONE.[0](input=HepRelVertex#10,EXPR$0=$SCALAR_QUERY({
LogicalFilter(condition=[=($1, $0)])
  LogicalProject(PRONAME=[$0])
    LogicalTableScan(table=[[PG_CATALOG, PG_PROC]])
}))
expression is LogicalProject(EXPR$0=[$2])
  LogicalJoin(condition=[true], joinType=[left])
    LogicalValues(tuples=[[{ 'array_in', 'array_out' }]])
    LogicalAggregate(group=[{}], agg#0=[SINGLE_VALUE($0)])
      LogicalFilter(condition=[=($1, $0)])
        LogicalProject(PRONAME=[$0])
          LogicalTableScan(table=[[PG_CATALOG, PG_PROC]])

    at
org.apache.calcite.plan.RelOptUtil.verifyTypeEquivalence(RelOptUtil.java:381)
    at
org.apache.calcite.plan.hep.HepRuleCall.transformTo(HepRuleCall.java:57)
    at
org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:234)
    at
org.apache.calcite.rel.rules.SubQueryRemoveRule$SubQueryProjectRemoveRule.onMatch(SubQueryRemoveRule.java:518)

Shouldn't we be able to specify if the scalar query type created by
RexSubQuery.scalar is nullable or not ?

[1]
https://github.com/apache/calcite/blob/d10aeb7f7e50dc7028ce102a5f590d0c50c49fa8/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java#L94

Thanks,
Gelbana

Reply via email to