Hi Viliam,

I don't see a problem with the current plan. It seems correct and more
intuitive than the one with the DUMMY projection.

LogicalAggregate(group=[{}], EXPR$0=[COUNT($0)])
    LogicalTableScan(table=foo)

The code you cited in SqlToRelConverter seems an attempt to handle empty
records/tuples that we are not handling very well in general [1].
Doesn't seem related to performance as the use-case you mentioned.

Best,
Stamatis

[1] https://lists.apache.org/thread/dtsz159x4nk3l9b3topgykqpsml024tv

On Fri, Jan 14, 2022 at 12:57 PM Viliam Durina <[email protected]> wrote:

> I noticed this two pieces of code:
>
> 1. in SqlToRelConverter:
>
>   if (preExprs.size() == 0) {
>     // Special case for COUNT(*), where we can end up with no inputs
>     // at all.  The rest of the system doesn't like 0-tuples, so we
>     // select a dummy constant here.
>     final RexNode zero = rexBuilder.makeExactLiteral(BigDecimal.ZERO);
>     preExprs = ImmutableList.of(Pair.of(zero, null));
>   }
>
> 2. in RelBuilder:
>
>    // Some parts of the system can't handle rows with zero fields, so
>   // pretend that one field is used.
>   if (fieldsUsed.isEmpty()) {
>     r = ((Project) r).getInput();
>   }
>
> They run in this order, and the 2nd overrides the former. The end result is
> that for query `SELECT COUNT(*) FROM foo`, the result of sql-to-rel
> conversion is:
>
> LogicalAggregate(group=[{}], EXPR$0=[COUNT($0)])
>     LogicalTableScan(table=foo)
>
> instead of:
>
> LogicalAggregate(group=[{}], EXPR$0=[COUNT($0)])
>   LogicalProject(DUMMY=[0])
>     LogicalTableScan(table=foo)
>
> In our implementation we push the projection to table scan. Without the
> project, we fetch full rows, even though the aggregation uses no row.
>
> The code was introduced in
> https://issues.apache.org/jira/browse/CALCITE-3763, but maybe it was
> broken
> later.
>
> Do you think this is an issue?
>
> Viliam
>
> --
> This message contains confidential information and is intended only for
> the
> individuals named. If you are not the named addressee you should not
> disseminate, distribute or copy this e-mail. Please notify the sender
> immediately by e-mail if you have received this e-mail by mistake and
> delete this e-mail from your system. E-mail transmission cannot be
> guaranteed to be secure or error-free as information could be intercepted,
> corrupted, lost, destroyed, arrive late or incomplete, or contain viruses.
> The sender therefore does not accept liability for any errors or omissions
> in the contents of this message, which arise as a result of e-mail
> transmission. If verification is required, please request a hard-copy
> version. -Hazelcast
>

Reply via email to