Repair crash with unsortable data in grouping sets.
authorAndrew Gierth
Mon, 24 Apr 2017 06:53:05 +0000 (07:53 +0100)
committerAndrew Gierth
Mon, 24 Apr 2017 06:53:05 +0000 (07:53 +0100)
Previously the code would generate incorrect results, assertion
failures, or crashes if given unsortable (but hashable) columns in
grouping sets.  Handle by throwing an error instead.

Report and patch by Pavan Deolasee (though I changed the error
wording slightly); regression test by me.

(This affects 9.5 only since the planner was refactored in 9.6.)

src/backend/optimizer/plan/planner.c
src/test/regress/expected/groupingsets.out
src/test/regress/sql/groupingsets.sql

index fcb57bf411bad57db204773ef82da0e2fee337e6..f25eb9b02da25d1dd4b1894e3ed73d47ca42a5b8 100644 (file)
@@ -1756,6 +1756,11 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
 
            if (parse->groupingSets)
            {
+               if (!grouping_is_sortable(parse->groupClause))
+                   ereport(ERROR,
+                           (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                            errmsg("could not implement GROUP BY"),
+                            errdetail("Some of the datatypes do not support sorting, which is required for grouping sets.")));
                use_hashed_grouping = false;
            }
            else
index 260ccd52c87b03831133d1679e28221c9f0aca84..86d188ae22494d6778784d00ebcbdf4e888a6d3b 100644 (file)
@@ -847,4 +847,11 @@ select sum(ten) from onek group by rollup(four::text), two order by 1;
  2500
 (6 rows)
 
+-- Check for sensible failure on unsortable data
+select usort, grouping(usort), count(*) from (values ('1'::xid),('2'::xid),('1'::xid)) v(usort) group by rollup(usort);
+ERROR:  could not implement GROUP BY
+DETAIL:  Some of the datatypes do not support sorting, which is required for grouping sets.
+select id, usort, grouping(id,usort), count(*) from (values (1,'1'::xid),(1,'2'::xid),(2,'1'::xid)) v(id,usort) group by grouping sets ((id), (usort));
+ERROR:  could not implement GROUP BY
+DETAIL:  Some of the datatypes do not support sorting, which is required for grouping sets.
 -- end
index 71cc0ec90077c16ee62c38323fb9195b32a80308..891d21188bcee54c39ec769bf7b04256176f4f84 100644 (file)
@@ -224,4 +224,8 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou
 select sum(ten) from onek group by two, rollup(four::text) order by 1;
 select sum(ten) from onek group by rollup(four::text), two order by 1;
 
+-- Check for sensible failure on unsortable data
+select usort, grouping(usort), count(*) from (values ('1'::xid),('2'::xid),('1'::xid)) v(usort) group by rollup(usort);
+select id, usort, grouping(id,usort), count(*) from (values (1,'1'::xid),(1,'2'::xid),(2,'1'::xid)) v(id,usort) group by grouping sets ((id), (usort));
+
 -- end