You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Muhammad Gelbana <m....@gmail.com> on 2019/03/05 13:00:53 UTC

An exception after rewriting a casting expression to a scalar subquery

'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

Re: An exception after rewriting a casting expression to a scalar subquery

Posted by Muhammad Gelbana <m....@gmail.com>.
https://issues.apache.org/jira/browse/CALCITE-2901

Thanks,
Gelbana


On Thu, Mar 7, 2019 at 11:33 AM Stamatis Zampetakis <za...@gmail.com>
wrote:

> Sorry, I meant to write instead of
>
> final RelDataType type =
> typeFactory.createTypeWithNullability(fieldList.get(0).getType(), true);
>
> in my previous email.
>
> I think it would make sense to change the hardcoded value but I didn't try
> to see if there are test failures after the change neither I know the
> original motive of setting the value to true.
>
> Try it on and log a JIRA case to continue the discussion there.
>
> Best,
> Stamatis
>
>
>
> Στις Πέμ, 7 Μαρ 2019 στις 10:16 π.μ., ο/η Muhammad Gelbana <
> m.gelbana@gmail.com> έγραψε:
>
> > Actually the types is derived this way
> >
> > final RelDataType type =
> > typeFactory.createTypeWithNullability(fieldList.get(0).getType(),
> *true*);
> >
> > Reference:
> >
> >
> https://github.com/apache/calcite/blob/d10aeb7f7e50dc7028ce102a5f590d0c50c49fa8/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java#L99
> >
> > If you beleive it's valid to provide a way to override this hard coded
> > nallability flag, I would love to do it.
> >
> > Thanks,
> > Gelbana
> >
> > On Thu, Mar 7, 2019 at 9:52 AM Stamatis Zampetakis <za...@gmail.com>
> > wrote:
> >
> > > Hi Gelbana,
> > >
> > > I am not sure why the scalar type is always nullable at this part of
> the
> > > code but I would expect that the type is obtained as follows:
> > >
> > > final RelDataType type =
> > typeFactory.copyType(fieldList.get(0).getType());
> > > // which copies also the nullability of the type
> > >
> > > instead of
> > >
> > > final RelDataType type =
> > > typeFactory.createTypeWithNullability(fieldList.get(0).getType(),
> > > fieldList.get(0).getType().isNullable());
> > >
> > > Best,
> > > Stamatis
> > >
> > > Στις Τρί, 5 Μαρ 2019 στις 2:01 μ.μ., ο/η Muhammad Gelbana <
> > > m.gelbana@gmail.com> έγραψε:
> > >
> > > > '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
> > > >
> > >
> >
>

Re: An exception after rewriting a casting expression to a scalar subquery

Posted by Stamatis Zampetakis <za...@gmail.com>.
Sorry, I meant to write instead of

final RelDataType type =
typeFactory.createTypeWithNullability(fieldList.get(0).getType(), true);

in my previous email.

I think it would make sense to change the hardcoded value but I didn't try
to see if there are test failures after the change neither I know the
original motive of setting the value to true.

Try it on and log a JIRA case to continue the discussion there.

Best,
Stamatis



Στις Πέμ, 7 Μαρ 2019 στις 10:16 π.μ., ο/η Muhammad Gelbana <
m.gelbana@gmail.com> έγραψε:

> Actually the types is derived this way
>
> final RelDataType type =
> typeFactory.createTypeWithNullability(fieldList.get(0).getType(), *true*);
>
> Reference:
>
> https://github.com/apache/calcite/blob/d10aeb7f7e50dc7028ce102a5f590d0c50c49fa8/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java#L99
>
> If you beleive it's valid to provide a way to override this hard coded
> nallability flag, I would love to do it.
>
> Thanks,
> Gelbana
>
> On Thu, Mar 7, 2019 at 9:52 AM Stamatis Zampetakis <za...@gmail.com>
> wrote:
>
> > Hi Gelbana,
> >
> > I am not sure why the scalar type is always nullable at this part of the
> > code but I would expect that the type is obtained as follows:
> >
> > final RelDataType type =
> typeFactory.copyType(fieldList.get(0).getType());
> > // which copies also the nullability of the type
> >
> > instead of
> >
> > final RelDataType type =
> > typeFactory.createTypeWithNullability(fieldList.get(0).getType(),
> > fieldList.get(0).getType().isNullable());
> >
> > Best,
> > Stamatis
> >
> > Στις Τρί, 5 Μαρ 2019 στις 2:01 μ.μ., ο/η Muhammad Gelbana <
> > m.gelbana@gmail.com> έγραψε:
> >
> > > '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
> > >
> >
>

Re: An exception after rewriting a casting expression to a scalar subquery

Posted by Muhammad Gelbana <m....@gmail.com>.
Actually the types is derived this way

final RelDataType type =
typeFactory.createTypeWithNullability(fieldList.get(0).getType(), *true*);

Reference:
https://github.com/apache/calcite/blob/d10aeb7f7e50dc7028ce102a5f590d0c50c49fa8/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java#L99

If you beleive it's valid to provide a way to override this hard coded
nallability flag, I would love to do it.

Thanks,
Gelbana

On Thu, Mar 7, 2019 at 9:52 AM Stamatis Zampetakis <za...@gmail.com>
wrote:

> Hi Gelbana,
>
> I am not sure why the scalar type is always nullable at this part of the
> code but I would expect that the type is obtained as follows:
>
> final RelDataType type = typeFactory.copyType(fieldList.get(0).getType());
> // which copies also the nullability of the type
>
> instead of
>
> final RelDataType type =
> typeFactory.createTypeWithNullability(fieldList.get(0).getType(),
> fieldList.get(0).getType().isNullable());
>
> Best,
> Stamatis
>
> Στις Τρί, 5 Μαρ 2019 στις 2:01 μ.μ., ο/η Muhammad Gelbana <
> m.gelbana@gmail.com> έγραψε:
>
> > '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
> >
>

Re: An exception after rewriting a casting expression to a scalar subquery

Posted by Stamatis Zampetakis <za...@gmail.com>.
Hi Gelbana,

I am not sure why the scalar type is always nullable at this part of the
code but I would expect that the type is obtained as follows:

final RelDataType type = typeFactory.copyType(fieldList.get(0).getType());
// which copies also the nullability of the type

instead of

final RelDataType type =
typeFactory.createTypeWithNullability(fieldList.get(0).getType(),
fieldList.get(0).getType().isNullable());

Best,
Stamatis

Στις Τρί, 5 Μαρ 2019 στις 2:01 μ.μ., ο/η Muhammad Gelbana <
m.gelbana@gmail.com> έγραψε:

> '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
>