Implement GROUP BY DISTINCT
authorTomas Vondra <tomas.vondra@postgresql.org>
Thu, 18 Mar 2021 16:45:38 +0000 (17:45 +0100)
committerTomas Vondra <tomas.vondra@postgresql.org>
Thu, 18 Mar 2021 17:22:18 +0000 (18:22 +0100)
commitbe45be9c33a85e72cdaeb9967e9f6d2d00199e09
treec728067c32404e7475ebf4c66561d7edf2dd35b3
parentcd91de0d17952b5763466cfa663e98318f26d357
Implement GROUP BY DISTINCT

With grouping sets, it's possible that some of the grouping sets are
duplicate.  This is especially common with CUBE and ROLLUP clauses. For
example GROUP BY CUBE (a,b), CUBE (b,c) is equivalent to

  GROUP BY GROUPING SETS (
    (a, b, c),
    (a, b, c),
    (a, b, c),
    (a, b),
    (a, b),
    (a, b),
    (a),
    (a),
    (a),
    (c, a),
    (c, a),
    (c, a),
    (c),
    (b, c),
    (b),
    ()
  )

Some of the grouping sets are calculated multiple times, which is mostly
unnecessary.  This commit implements a new GROUP BY DISTINCT feature, as
defined in the SQL standard, which eliminates the duplicate sets.

Author: Vik Fearing
Reviewed-by: Erik Rijkers, Georgios Kokolatos, Tomas Vondra
Discussion: https://postgr.es/m/bf3805a8-d7d1-ae61-fece-761b7ff41ecc@postgresfriends.org
18 files changed:
doc/src/sgml/queries.sgml
doc/src/sgml/ref/select.sgml
src/backend/catalog/sql_features.txt
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/list.c
src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c
src/backend/optimizer/plan/planner.c
src/backend/parser/analyze.c
src/backend/parser/gram.y
src/backend/parser/parse_agg.c
src/backend/utils/adt/ruleutils.c
src/include/nodes/parsenodes.h
src/include/nodes/pg_list.h
src/include/parser/parse_agg.h
src/test/regress/expected/groupingsets.out
src/test/regress/sql/groupingsets.sql