[ 
https://issues.apache.org/jira/browse/CALCITE-4334?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde updated CALCITE-4334:
---------------------------------
    Description: 
It would be useful to have an (internal) aggregate function that has no 
arguments and returns a constant value, regardless of how many rows are in the 
group. We suggest {{TRUE_AGG}}, which always returns the {{BOOLEAN}} value 
{{TRUE}}.

If there are reasons why it would be better to return other constants (such as 
0, 1, FALSE or the empty string) we will consider them.

For example, when rewriting sub-queries (see SubQueryRemoveRule) we introduce 
add "true as indicator" to the SELECT clause of sub-queries. It can be used to 
detect rows generated by an outer join. If it is an aggregate query, we would 
have to write "min(true) as indicator", which necessitates an extra {{Project}} 
below the {{Aggregate}} to provide the  "true" value. A TRUE_AGG aggregate 
function allows us to avoid the extra {{Project}}.

Another example came up during CALCITE-4317. We would like to make 
{{RelBuilder.aggregate(groupKey())}} throw when given an empty group key and no 
aggregate calls. (Because it would create an {{Aggregate}} that has zero 
fields, and that is problematic elsewhere in Calcite.) But we would also like a 
pattern where an aggregate with an empty group key becomes a constant 
single-row relational expression. So, {{RelBulder.aggregate(groupKey(), 
aggregateCall(TRUE_AGG))}} should generate {{VALUES TRUE}}.

  was:
It would be useful to have an (internal) aggregate function that has no 
arguments and returns a constant value, regardless of how many rows are in the 
group. We suggest {{TRUE_AGG}}, which always returns the {{BOOLEAN}} value 
{{TRUE}}.

If there are reasons why it would be better to return other constants (such as 
0, 1, FALSE or the empty string) we will consider them.

For example, when rewriting sub-queries (see SubQueryRemoveRule) we introduce 
add "true as indicator" to the SELECT clause of sub-queries. It can be used to 
detect rows generated by an outer join. If it is an aggregate query, we would 
have to write "min(true) as indicator", which necessitates an extra {{Project}} 
below the {{Aggregate}} to provide the  "true" value.

Another example. We would like to make {{RelBuilder.aggregate(groupKey())}} 
throw when given an empty group key and no aggregate calls. (Because it would 
create an {{Aggregate}} that has zero fields, and that is problematic elsewhere 
in Calcite.) But we would also like a pattern to generate a constant single-row 
relational expression. So, {{RelBulder.aggregate(groupKey(), 
aggregateCall(TRUE_AGG))}} should generate {{VALUES TRUE}}. 


> TRUE_AGG, an aggregate function that always returns TRUE
> --------------------------------------------------------
>
>                 Key: CALCITE-4334
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4334
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Priority: Major
>
> It would be useful to have an (internal) aggregate function that has no 
> arguments and returns a constant value, regardless of how many rows are in 
> the group. We suggest {{TRUE_AGG}}, which always returns the {{BOOLEAN}} 
> value {{TRUE}}.
> If there are reasons why it would be better to return other constants (such 
> as 0, 1, FALSE or the empty string) we will consider them.
> For example, when rewriting sub-queries (see SubQueryRemoveRule) we introduce 
> add "true as indicator" to the SELECT clause of sub-queries. It can be used 
> to detect rows generated by an outer join. If it is an aggregate query, we 
> would have to write "min(true) as indicator", which necessitates an extra 
> {{Project}} below the {{Aggregate}} to provide the  "true" value. A TRUE_AGG 
> aggregate function allows us to avoid the extra {{Project}}.
> Another example came up during CALCITE-4317. We would like to make 
> {{RelBuilder.aggregate(groupKey())}} throw when given an empty group key and 
> no aggregate calls. (Because it would create an {{Aggregate}} that has zero 
> fields, and that is problematic elsewhere in Calcite.) But we would also like 
> a pattern where an aggregate with an empty group key becomes a constant 
> single-row relational expression. So, {{RelBulder.aggregate(groupKey(), 
> aggregateCall(TRUE_AGG))}} should generate {{VALUES TRUE}}.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to