postgresql/src/include/commands
Richard Guo 247dea89f7 Introduce an RTE for the grouping step
If there are subqueries in the grouping expressions, each of these
subqueries in the targetlist and HAVING clause is expanded into
distinct SubPlan nodes.  As a result, only one of these SubPlan nodes
would be converted to reference to the grouping key column output by
the Agg node; others would have to get evaluated afresh.  This is not
efficient, and with grouping sets this can cause wrong results issues
in cases where they should go to NULL because they are from the wrong
grouping set.  Furthermore, during re-evaluation, these SubPlan nodes
might use nulled column values from grouping sets, which is not
correct.

This issue is not limited to subqueries.  For other types of
expressions that are part of grouping items, if they are transformed
into another form during preprocessing, they may fail to match lower
target items.  This can also lead to wrong results with grouping sets.

To fix this issue, we introduce a new kind of RTE representing the
output of the grouping step, with columns that are the Vars or
expressions being grouped on.  In the parser, we replace the grouping
expressions in the targetlist and HAVING clause with Vars referencing
this new RTE, so that the output of the parser directly expresses the
semantic requirement that the grouping expressions be gotten from the
grouping output rather than computed some other way.  In the planner,
we first preprocess all the columns of this new RTE and then replace
any Vars in the targetlist and HAVING clause that reference this new
RTE with the underlying grouping expressions, so that we will have
only one instance of a SubPlan node for each subquery contained in the
grouping expressions.

Bump catversion because this changes the querytree produced by the
parser.

Thanks to Tom Lane for the idea to invent a new kind of RTE.

Per reports from Geoff Winkless, Tobias Wendorff, Richard Guo from
various threads.

Author: Richard Guo
Reviewed-by: Ashutosh Bapat, Sutou Kouhei
Discussion: https://postgr.es/m/CAMbWs4_dp7e7oTwaiZeBX8+P1rXw4ThkZxh1QG81rhu9Z47VsQ@mail.gmail.com
2024-09-10 12:35:34 +09:00
..
alter.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
async.h Improve performance of subsystems on top of SLRU 2024-02-28 17:05:31 +01:00
cluster.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
collationcmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
comment.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
conversioncmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
copy.h Add new COPY option LOG_VERBOSITY. 2024-04-01 15:25:25 +09:00
copyfrom_internal.h Revert "Refactor CopyReadAttributes{CSV,Text}() to use a callback in COPY FROM" 2024-02-14 10:07:22 +09:00
createas.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
dbcommands.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
dbcommands_xlog.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
defrem.h Revert temporal primary keys and foreign keys 2024-05-16 08:17:46 +02:00
discard.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
event_trigger.h Remove ObjectClass type 2024-03-26 10:08:56 +01:00
explain.h Introduce an RTE for the grouping step 2024-09-10 12:35:34 +09:00
extension.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
lockcmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
matview.h Add is_create parameter to RefreshMatviewByOid(). 2024-07-31 16:42:19 -07:00
policy.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
portalcmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
prepare.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
proclang.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
progress.h Reintroduce dead tuple counter in pg_stat_progress_vacuum. 2024-06-14 10:08:15 +09:00
publicationcmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
schemacmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
seclabel.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
sequence.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
subscriptioncmds.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tablecmds.h Reintroduce MAINTAIN privilege and pg_maintain predefined role. 2024-03-13 14:49:26 -05:00
tablespace.h Move all extern declarations for GUC variables to header files 2024-07-24 06:31:07 +02:00
trigger.h Revert: Allow locking updated tuples in tuple_update() and tuple_delete() 2024-04-11 16:01:34 +03:00
typecmds.h Repair ALTER EXTENSION ... SET SCHEMA. 2024-05-09 12:19:52 -04:00
user.h Add new GUC createrole_self_grant. 2023-01-10 12:44:49 -05:00
vacuum.h revert: Generalize relation analyze in table AM interface 2024-04-16 13:14:20 +03:00
view.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
waitlsn.h Implement pg_wal_replay_wait() stored procedure 2024-08-02 21:16:56 +03:00