Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
On 2015-07-17 19:57:22 +0100, Andrew Gierth wrote: Attached is the current version of my fix (with Jeevan's regression tests plus one of mine). Pushed, thanks for the report and fix! -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
On 2015-07-17 11:37:26 +0530, Jeevan Chalke wrote: However I wonder why we are supporting GROUPING SETS inside GROUPING SETS. On Oracle, it is throwing an error. We are not trying to be Oracle compatible, but just curious to know. The SQL specification seems to be pretty unambigous about supporting nested grouping set specifications. Check 7.9 group by clause: grouping set (nested inside a grouping sets specification) can contain grouping sets specification. Regards, Andres -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
Hello, At Mon, 20 Jul 2015 15:45:21 +0530, Jeevan Chalke jeevan.cha...@enterprisedb.com wrote in CAM2+6=X9QWgbjJrR-dcLXh-RvvpGy=9enhuoghzrxhcj2kv...@mail.gmail.com On Sat, Jul 18, 2015 at 12:27 AM, Andrew Gierth and...@tao11.riddles.org.uk wrote: Kyotaro == Kyotaro HORIGUCHI horiguchi.kyot...@lab.ntt.co.jp writes: Kyotaro Hello, this looks to be a kind of thinko. The attached patch Kyotaro fixes it. No, that's still wrong. Just knowing that there is a List is not enough to tell whether to concat it or append it. Thank you. I've missed the non-grouping-set cases. Jeevan's original patch tries to get around this by making the RowExpr case wrap another List around its result (which is then removed by the concat), but this is the wrong approach too because it breaks nested RowExprs (which isn't valid syntax in the spec, because the spec allows only column references in GROUP BY, not arbitrary expressions, but which we have no reason not to support). Attached is the current version of my fix (with Jeevan's regression tests plus one of mine). Looks good to me. It also looks for me to work as expected and to be in good shape. The two foreach loops for T_GroupingSet and T_List became to look very simiar but they don't seem can be merged in reasonable shape. regards, -- Kyotaro Horiguchi NTT Open Source Software Center -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
On Sat, Jul 18, 2015 at 12:27 AM, Andrew Gierth and...@tao11.riddles.org.uk wrote: Kyotaro == Kyotaro HORIGUCHI horiguchi.kyot...@lab.ntt.co.jp writes: Kyotaro Hello, this looks to be a kind of thinko. The attached patch Kyotaro fixes it. No, that's still wrong. Just knowing that there is a List is not enough to tell whether to concat it or append it. Jeevan's original patch tries to get around this by making the RowExpr case wrap another List around its result (which is then removed by the concat), but this is the wrong approach too because it breaks nested RowExprs (which isn't valid syntax in the spec, because the spec allows only column references in GROUP BY, not arbitrary expressions, but which we have no reason not to support). Attached is the current version of my fix (with Jeevan's regression tests plus one of mine). Looks good to me. -- Andrew (irc:RhodiumToad) -- Jeevan B Chalke Principal Software Engineer, Product Development EnterpriseDB Corporation The Enterprise PostgreSQL Company
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
On Wed, Jul 15, 2015 at 10:21 PM, Andrew Gierth and...@tao11.riddles.org.uk wrote: Jeevan == Jeevan Chalke jeevan.cha...@enterprisedb.com writes: Jeevan Hi, Jeevan It looks like we do support nested GROUPING SETS, I mean Sets Jeevan withing Sets, not other types. However this nesting is broken. Good catch, but I'm not yet sure your fix is correct; I'll need to look into that. Sure. Thanks. However I wonder why we are supporting GROUPING SETS inside GROUPING SETS. On Oracle, it is throwing an error. We are not trying to be Oracle compatible, but just curious to know. I have tried restricting it in attached patch. But it may require few comment adjustment. Thanks -- Andrew (irc:RhodiumToad) -- Jeevan B Chalke Principal Software Engineer, Product Development EnterpriseDB Corporation The Enterprise PostgreSQL Company diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e0ff6f1..738715f 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -371,9 +371,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); relation_expr_list dostmt_opt_list transform_element_list transform_type_list -%type list group_by_list +%type list group_by_list grouping_sets_list %type node group_by_item empty_grouping_set rollup_clause cube_clause -%type node grouping_sets_clause +%type node grouping_sets_clause grouping_sets_item %type list opt_fdw_options fdw_options %type defelt fdw_option @@ -10343,6 +10343,18 @@ group_by_item: | grouping_sets_clause { $$ = $1; } ; +grouping_sets_list: + grouping_sets_item{ $$ = list_make1($1); } + | grouping_sets_list ',' grouping_sets_item { $$ = lappend($1,$3); } + ; + +grouping_sets_item: + a_expr { $$ = $1; } + | empty_grouping_set { $$ = $1; } + | cube_clause { $$ = $1; } + | rollup_clause { $$ = $1; } + ; + empty_grouping_set: '(' ')' { @@ -10371,7 +10383,7 @@ cube_clause: ; grouping_sets_clause: - GROUPING SETS '(' group_by_list ')' + GROUPING SETS '(' grouping_sets_list ')' { $$ = (Node *) makeGroupingSet(GROUPING_SET_SETS, $4, @1); } diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index 842c2ae..e75dceb 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -145,6 +145,25 @@ select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum | | 12 | 36 (6 rows) +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets(((a, b + order by 1 desc; +ERROR: syntax error at or near sets +LINE 2: group by grouping sets((), grouping sets(((a, b + ^ +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c + order by 1 desc; +ERROR: syntax error at or near sets +LINE 2: group by grouping sets(grouping sets(rollup(c), grouping s... + ^ +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; +ERROR: syntax error at or near sets +LINE 2: group by grouping sets(grouping sets(a, grouping sets(a), ... + ^ -- empty input: first is 0 rows, second 1, third 3 etc. select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); a | b | sum | count diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql index 0bffb85..b7e4826 100644 --- a/src/test/regress/sql/groupingsets.sql +++ b/src/test/regress/sql/groupingsets.sql @@ -73,6 +73,17 @@ select grouping(a), a, array_agg(b), select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum from gstest2 group by rollup (a,b) order by rsum, a, b; +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets(((a, b + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; + -- empty input: first is 0 rows, second 1, third 3 etc. select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),()); -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
Hello, this looks to be a kind of thinko. The attached patch fixes it. === According to the comment of transformGroupingSet, it assumes that the given GROUPING SETS node is already flatted out and flatten_grouping_sets() does that. The details of the transformation is described in the comment for the function. The problmen is what does the function for nested grouping sets. Node *n2 = flatten_grouping_sets(lfirst(l2), false, NULL); result_set = lappend(result_set, n2); This does not flattens the list as required. n2 should be concatenated if it is a list. The attached small patch fixes it and the problematic query returns sane (perhaps) result. # Though I don't know the exact definition of the syntax.. =# select sum(c) from gstest2 group by grouping sets ((), grouping sets ((), grouping sets ((; sum - 12 12 12 (3 rows) =# select sum(c) from gstest2 group by grouping sets ((a), grouping sets ((b), grouping sets ((c; sum - 10 2 6 6 8 4 (6 rows) regards, At Fri, 17 Jul 2015 11:37:26 +0530, Jeevan Chalke jeevan.cha...@enterprisedb.com wrote in CAM2+6=xprgumbqwtsczbecc3xjv4zh1ryq3fwds5uajon1i...@mail.gmail.com Jeevan It looks like we do support nested GROUPING SETS, I mean Sets Jeevan withing Sets, not other types. However this nesting is broken. Good catch, but I'm not yet sure your fix is correct; I'll need to look into that. Sure. Thanks. However I wonder why we are supporting GROUPING SETS inside GROUPING SETS. On Oracle, it is throwing an error. We are not trying to be Oracle compatible, but just curious to know. I have tried restricting it in attached patch. But it may require few comment adjustment. -- Kyotaro Horiguchi NTT Open Source Software Center diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index e90e1d6..708ebc9 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -1804,8 +1804,10 @@ flatten_grouping_sets(Node *expr, bool toplevel, bool *hasGroupingSets) foreach(l2, gset-content) { Node *n2 = flatten_grouping_sets(lfirst(l2), false, NULL); - - result_set = lappend(result_set, n2); + if (IsA(n2, List)) + result_set = list_concat(result_set, (List *)n2); + else + result_set = lappend(result_set, n2); } /* -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
Kyotaro == Kyotaro HORIGUCHI horiguchi.kyot...@lab.ntt.co.jp writes: Kyotaro Hello, this looks to be a kind of thinko. The attached patch Kyotaro fixes it. No, that's still wrong. Just knowing that there is a List is not enough to tell whether to concat it or append it. Jeevan's original patch tries to get around this by making the RowExpr case wrap another List around its result (which is then removed by the concat), but this is the wrong approach too because it breaks nested RowExprs (which isn't valid syntax in the spec, because the spec allows only column references in GROUP BY, not arbitrary expressions, but which we have no reason not to support). Attached is the current version of my fix (with Jeevan's regression tests plus one of mine). -- Andrew (irc:RhodiumToad) diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index e90e1d6..5a48a02 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -1734,7 +1734,7 @@ findTargetlistEntrySQL99(ParseState *pstate, Node *node, List **tlist, * Inside a grouping set (ROLLUP, CUBE, or GROUPING SETS), we expect the * content to be nested no more than 2 deep: i.e. ROLLUP((a,b),(c,d)) is * ok, but ROLLUP((a,(b,c)),d) is flattened to ((a,b,c),d), which we then - * normalize to ((a,b,c),(d)). + * (later) normalize to ((a,b,c),(d)). * * CUBE or ROLLUP can be nested inside GROUPING SETS (but not the reverse), * and we leave that alone if we find it. But if we see GROUPING SETS inside @@ -1803,9 +1803,16 @@ flatten_grouping_sets(Node *expr, bool toplevel, bool *hasGroupingSets) foreach(l2, gset-content) { - Node *n2 = flatten_grouping_sets(lfirst(l2), false, NULL); + Node *n1 = lfirst(l2); + Node *n2 = flatten_grouping_sets(n1, false, NULL); - result_set = lappend(result_set, n2); + if (IsA(n1, GroupingSet) + ((GroupingSet *)n1)-kind == GROUPING_SET_SETS) + { + result_set = list_concat(result_set, (List *) n2); + } + else + result_set = lappend(result_set, n2); } /* diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index 842c2ae..ff3ba9b 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -145,6 +145,127 @@ select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum | | 12 | 36 (6 rows) +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(( + order by 1 desc; + sum +- + 12 + 12 + 12 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(((a, b) + order by 1 desc; + sum +- + 12 + 12 + 8 + 2 + 2 +(5 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c + order by 1 desc; + sum +- + 12 + 12 + 6 + 6 + 6 + 6 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(a, grouping sets(a, cube(b))) + order by 1 desc; + sum +- + 12 + 10 + 10 + 8 + 4 + 2 + 2 +(7 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, (b + order by 1 desc; + sum +- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, b))) + order by 1 desc; + sum +- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; + sum +- + 10 + 10 + 10 + 2 + 2 + 2 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a)) + order by 1 desc; + sum +- + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 +(16 rows) + +select sum(c) from gstest2 + group by grouping sets((a,(a,b)), grouping sets((a,(a,b)),a)) + order by 1 desc; + sum +- + 10 + 8 + 8 + 2 + 2 + 2 + 2 + 2 +(8 rows) + -- empty input: first is 0 rows, second 1, third 3 etc. select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); a | b | sum | count diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql index 0bffb85..d886fae 100644 --- a/src/test/regress/sql/groupingsets.sql +++ b/src/test/regress/sql/groupingsets.sql @@ -73,6 +73,35 @@ select grouping(a), a, array_agg(b), select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum from gstest2 group by rollup (a,b) order by rsum, a, b; +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(( + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(((a, b) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping
Re: [HACKERS] Grouping Sets: Fix unrecognized node type bug
Jeevan == Jeevan Chalke jeevan.cha...@enterprisedb.com writes: Jeevan Hi, Jeevan It looks like we do support nested GROUPING SETS, I mean Sets Jeevan withing Sets, not other types. However this nesting is broken. Good catch, but I'm not yet sure your fix is correct; I'll need to look into that. -- Andrew (irc:RhodiumToad) -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
[HACKERS] Grouping Sets: Fix unrecognized node type bug
Hi, It looks like we do support nested GROUPING SETS, I mean Sets withing Sets, not other types. However this nesting is broken. Here is the simple example where I would expect three rows in the result. But unfortunately it is giving unrecognized node type error. Which is something weird and need a fix. postgres=# create table gstest2 (a integer, b integer, c integer); postgres=# insert into gstest2 values (1,1,1), (1,1,1), (1,1,1), (1,1,1), (1,1,1), (1,1,1), (1,1,2), (1,2,2), (2,2,2); postgres=# select sum(c) from gstest2 group by grouping sets((), grouping sets((), grouping sets(( order by 1 desc; ERROR: unrecognized node type: 926 I spend much time to understand the cause and was looking into transformGroupingSet() and transformGroupClauseList() function. I have tried fixing unrecognized node type: 926 error there, but later it is failing with unrecognized node type: 656. Later I have realized that we have actually have an issue while flattening grouping sets. If we have nested grouping sets like above, then we are getting GroupingSet node inside the list and transformGroupClauseList() does not expect that and end up with this error. I have tried fixing this issue in flatten_grouping_sets(), after flattening grouping sets node, we need to concat the result with the existing list and should not append. This alone does not solve the issue as we need a list when we have ROW expression. Thus there, if not top level, I am creating a list now. Attached patch with few testcases too. Please have a look. Thanks -- Jeevan B Chalke Principal Software Engineer, Product Development EnterpriseDB Corporation The Enterprise PostgreSQL Company diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index e90e1d6..31d4331 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -1779,8 +1779,19 @@ flatten_grouping_sets(Node *expr, bool toplevel, bool *hasGroupingSets) RowExpr*r = (RowExpr *) expr; if (r-row_format == COERCE_IMPLICIT_CAST) - return flatten_grouping_sets((Node *) r-args, - false, NULL); +{ + Node *n1 = flatten_grouping_sets((Node *) r-args, + false, NULL); + + /* + * Make a list for row expression if toplevel is false, + * return flatten list otherwise + */ + if (toplevel) + return (Node *) n1; + else + return (Node *) list_make1(n1); +} } break; case T_GroupingSet: @@ -1805,7 +1816,10 @@ flatten_grouping_sets(Node *expr, bool toplevel, bool *hasGroupingSets) { Node *n2 = flatten_grouping_sets(lfirst(l2), false, NULL); - result_set = lappend(result_set, n2); + if (IsA(n2, List)) + result_set = list_concat(result_set, (List *) n2); + else + result_set = lappend(result_set, n2); } /* diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index adb39b3..5c47717 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -145,6 +145,112 @@ select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum | | 12 | 36 (6 rows) +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(( + order by 1 desc; + sum +- + 12 + 12 + 12 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(((a, b) + order by 1 desc; + sum +- + 12 + 12 + 8 + 2 + 2 +(5 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c + order by 1 desc; + sum +- + 12 + 12 + 6 + 6 + 6 + 6 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(a, grouping sets(a, cube(b))) + order by 1 desc; + sum +- + 12 + 10 + 10 + 8 + 4 + 2 + 2 +(7 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, (b + order by 1 desc; + sum +- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, b))) + order by 1 desc; + sum +- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; + sum +- + 10 + 10 + 10 + 2 + 2 + 2 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a)) + order by 1 desc; + sum +- + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 +(16 rows) + -- empty input: first is 0 rows, second 1, third 3 etc. select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); a | b | sum | count diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql index 0883afd..e478d34 100644 ---
[HACKERS] Grouping Sets
http://www.postgresql.org/list/pgsql-hackers/since/200905171950Hello, Am looking for the patch related to 'Implementation of GROUPING SETS'. Where can get this from? Related thread: http://www.postgresql.org/message-id/162867790905121420p7c910054x24d8e327abd58...@mail.gmail.com Regards...
Re: [HACKERS] Grouping Sets
Hello 2013/7/4 Dev Kumkar devdas.kum...@gmail.com: Hello, Am looking for the patch related to 'Implementation of GROUPING SETS'. Where can get this from? Related thread: http://www.postgresql.org/message-id/162867790905121420p7c910054x24d8e327abd58...@mail.gmail.com I don't work on this topic now, and my code is not usable for production. Regards Pavel Stehule Regards... -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets
On Thu, Jul 4, 2013 at 6:31 PM, Pavel Stehule pavel.steh...@gmail.comwrote: Hello I don't work on this topic now, and my code is not usable for production. Ok, no problem. Will await for any other pointers regarding any related patch here. Currently using UNION to archive similar results but looking if anything is already done here. Looks like GROUPING SET was in the TODO list long back. http://grokbase.com/t/postgresql/pgsql-general/06aaa4g7cq/cube-rollup-grouping-sets Am I missing anything here? Regards...
Re: [HACKERS] Grouping Sets
On Thu, Jul 4, 2013 at 6:56 PM, Dev Kumkar devdas.kum...@gmail.com wrote: On Thu, Jul 4, 2013 at 6:31 PM, Pavel Stehule pavel.steh...@gmail.com wrote: Hello I don't work on this topic now, and my code is not usable for production. Ok, no problem. Will await for any other pointers regarding any related patch here. Currently using UNION to archive similar results but looking if anything is already done here. Looks like GROUPING SET was in the TODO list long back. http://grokbase.com/t/postgresql/pgsql-general/06aaa4g7cq/cube-rollup-grouping-sets Am I missing anything here? Regards... Me and RhodiumToad discussed the idea recently, after David Fetter suggested that we work on it. We may start work on it soon, haven't thought in detail yet though. -- Regards, Atri l'apprenant -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets
On Thu, Jul 4, 2013 at 7:53 PM, Atri Sharma atri.j...@gmail.com wrote: On Thu, Jul 4, 2013 at 6:56 PM, Dev Kumkar devdas.kum...@gmail.com wrote: Ok, no problem. Will await for any other pointers regarding any related patch here. Currently using UNION to archive similar results but looking if anything is already done here. Looks like GROUPING SET was in the TODO list long back. http://grokbase.com/t/postgresql/pgsql-general/06aaa4g7cq/cube-rollup-grouping-sets Am I missing anything here? Regards... Me and RhodiumToad discussed the idea recently, after David Fetter suggested that we work on it. We may start work on it soon, haven't thought in detail yet though. Ok, 9.3 feature wise looks all done. So I believe it will be in any 9.3 + release? Till then will continue UNION approach as looks like it gives the necessary functionality. Any loopholes here friends? Regards...
Re: [HACKERS] Grouping Sets
Since it seems that you have spent some considerable time investigating and producing a working concept, what would your best guess time estimate be, assuming the requisite skills/talent/will in (planner/executor/etc.), to have a solid working module put together? Are we looking at something like 40 hours or more like 5000 hours, in your estimate? Thanks. -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Monday, September 19, 2011 10:45 PM To: edwbro...@gmail.com Cc: pgsql-hackers@postgresql.org Subject: Re: [HACKERS] Grouping Sets Hello 2011/9/20 David Rinaldi edwbro...@gmail.com: Paul, I was able to apply the patch to 9.0.4 and so far looks good. My Oracle results match. Nice. But, when trying to calculate some percentages and control some rounding, the results are coming back as null for some reason. I have tried casting, to_char, etc to try to get them to show up..no love ensued. I was wondering if you have any idea what could by happening. I have attached some test results based on the grouping sets wiki. One of the examples is just using group by, as a sanity check. Any ideas or help would be much appreciated. sorry, I have not any useful idea. This work was a concept and it is probable, so there will be some corner issues :(. This feature needs more love and some more significant changes in planner and executor. Regards Pavel CREATE TABLE cars2 (name CHARACTER VARYING , place CHARACTER VARYING , sales real, cost real ); insert into cars2 values('skoda', 'czech rep.', 1, 8000); insert into cars2 values('skoda', 'germany', 5000, 6000); insert into cars2 values('bmw', 'czech rep.', 6000, 4000); insert into cars2 values('bmw', 'germany', 18000, 15000); insert into cars2 values('opel', 'czech rep.', 7000, 5000); insert into cars2 values('opel', 'germany', 7000, 5000); --grouping sets test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by rollup(name, place); name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 (null) (null) skoda germany 5000 6000 1.2 (null) (null) opel czech rep. 7000 5000 0.7143 (null) (null) opel germany 7000 5000 0.7143 (null) (null) skoda czech rep. 1 8000 0.8 (null) (null) bmw germany 18000 15000 0.8333 (null) (null) bmw (null) 24000 19000 0.7917 (null) (null) skoda (null) 15000 14000 0.9333 (null) (null) opel (null) 14000 1 0.7143 (null) (null) (null) (null) 53000 43000 0.8113 (null) (null) --group by sanity test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by name, place; name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 66.6667 67 skoda germany 5000 6000 1.2 120 120 opel czech rep. 7000 5000 0.7143 71.4286 71 opel germany 7000 5000 0.7143 71.4286 71 skoda czech rep. 1 8000 0.8 80 80 bmw germany 18000 15000 0.8333 83. 83 Thanks -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Sunday, September 18, 2011 2:34 PM To: David Rinaldi Subject: Re: [HACKERS] Grouping Sets Hello A last patch should be applied on 8.4 or 9.0 - should to try it. I worked with developer version. http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php Regards Pavel Stehule 2011/9/18 David Rinaldi edwbro...@gmail.com: Hi, I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? -- Regards David -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets
Hello 2011/9/20 David Rinaldi edwbro...@gmail.com: Since it seems that you have spent some considerable time investigating and producing a working concept, what would your best guess time estimate be, assuming the requisite skills/talent/will in (planner/executor/etc.), to have a solid working module put together? Are we looking at something like 40 hours or more like 5000 hours, in your estimate? it depends on your knowledge of pg internals and your motivation :). I thing so it can be less than 40 hours for elimination of these issues and next 40 hours for some finalisation. If I remember well, I had a prototype after one week of hacking, and I am not a strong programmer. Regards Pavel Stehule Thanks. -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Monday, September 19, 2011 10:45 PM To: edwbro...@gmail.com Cc: pgsql-hackers@postgresql.org Subject: Re: [HACKERS] Grouping Sets Hello 2011/9/20 David Rinaldi edwbro...@gmail.com: Paul, I was able to apply the patch to 9.0.4 and so far looks good. My Oracle results match. Nice. But, when trying to calculate some percentages and control some rounding, the results are coming back as null for some reason. I have tried casting, to_char, etc to try to get them to show up..no love ensued. I was wondering if you have any idea what could by happening. I have attached some test results based on the grouping sets wiki. One of the examples is just using group by, as a sanity check. Any ideas or help would be much appreciated. sorry, I have not any useful idea. This work was a concept and it is probable, so there will be some corner issues :(. This feature needs more love and some more significant changes in planner and executor. Regards Pavel CREATE TABLE cars2 (name CHARACTER VARYING , place CHARACTER VARYING , sales real, cost real ); insert into cars2 values('skoda', 'czech rep.', 1, 8000); insert into cars2 values('skoda', 'germany', 5000, 6000); insert into cars2 values('bmw', 'czech rep.', 6000, 4000); insert into cars2 values('bmw', 'germany', 18000, 15000); insert into cars2 values('opel', 'czech rep.', 7000, 5000); insert into cars2 values('opel', 'germany', 7000, 5000); --grouping sets test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by rollup(name, place); name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 (null) (null) skoda germany 5000 6000 1.2 (null) (null) opel czech rep. 7000 5000 0.7143 (null) (null) opel germany 7000 5000 0.7143 (null) (null) skoda czech rep. 1 8000 0.8 (null) (null) bmw germany 18000 15000 0.8333 (null) (null) bmw (null) 24000 19000 0.7917 (null) (null) skoda (null) 15000 14000 0.9333 (null) (null) opel (null) 14000 1 0.7143 (null) (null) (null) (null) 53000 43000 0.8113 (null) (null) --group by sanity test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by name, place; name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 66.6667 67 skoda germany 5000 6000 1.2 120 120 opel czech rep. 7000 5000 0.7143 71.4286 71 opel germany 7000 5000 0.7143 71.4286 71 skoda czech rep. 1 8000 0.8 80 80 bmw germany 18000 15000 0.8333 83. 83 Thanks -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Sunday, September 18, 2011 2:34 PM To: David Rinaldi Subject: Re: [HACKERS] Grouping Sets Hello A last patch should be applied on 8.4 or 9.0 - should to try it. I worked with developer version. http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php Regards Pavel Stehule 2011/9/18 David Rinaldi edwbro...@gmail.com: Hi, I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? -- Regards David -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets
On Sun, Sep 18, 2011 at 02:08:01PM -0500, David Rinaldi wrote: I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? Your best bet is probably to get the code from approximately the date of the patch. As far as I know it hasn't been touched in a while, and didn't work well back when it was being actively developed. -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com pgpeMKakIJ2SX.pgp Description: PGP signature
Re: [HACKERS] Grouping Sets
Paul, I was able to apply the patch to 9.0.4 and so far looks good. My Oracle results match. Nice. But, when trying to calculate some percentages and control some rounding, the results are coming back as null for some reason. I have tried casting, to_char, etc to try to get them to show up..no love ensued. I was wondering if you have any idea what could by happening. I have attached some test results based on the grouping sets wiki. One of the examples is just using group by, as a sanity check. Any ideas or help would be much appreciated. CREATE TABLE cars2 (name CHARACTER VARYING , place CHARACTER VARYING , sales real, cost real ); insert into cars2 values('skoda', 'czech rep.', 1, 8000); insert into cars2 values('skoda', 'germany', 5000, 6000); insert into cars2 values('bmw', 'czech rep.', 6000, 4000); insert into cars2 values('bmw', 'germany', 18000, 15000); insert into cars2 values('opel', 'czech rep.', 7000, 5000); insert into cars2 values('opel', 'germany', 7000, 5000); --grouping sets test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by rollup(name, place); nameplace sales costcost_sales_ratiocost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 600040000.6667 (null) (null) skoda germany 500060001.2 (null) (null) opelczech rep. 700050000.7143 (null) (null) opelgermany 700050000.7143 (null) (null) skoda czech rep. 1 80000.8 (null) (null) bmw germany 18000 15000 0.8333 (null) (null) bmw (null) 24000 19000 0.7917 (null) (null) skoda (null) 15000 14000 0.9333 (null) (null) opel(null) 14000 1 0.7143 (null) (null) (null) (null) 53000 43000 0.8113 (null) (null) --group by sanity test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by name, place; nameplace sales costcost_sales_ratiocost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 600040000.6667 66.6667 67 skoda germany 500060001.2 120 120 opelczech rep. 700050000.7143 71.4286 71 opelgermany 700050000.7143 71.4286 71 skoda czech rep. 1 80000.8 80 80 bmw germany 18000 15000 0.8333 83. 83 Thanks -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Sunday, September 18, 2011 2:34 PM To: David Rinaldi Subject: Re: [HACKERS] Grouping Sets Hello A last patch should be applied on 8.4 or 9.0 - should to try it. I worked with developer version. http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php Regards Pavel Stehule 2011/9/18 David Rinaldi edwbro...@gmail.com: Hi, I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? -- Regards David -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] Grouping Sets
Hello 2011/9/20 David Rinaldi edwbro...@gmail.com: Paul, I was able to apply the patch to 9.0.4 and so far looks good. My Oracle results match. Nice. But, when trying to calculate some percentages and control some rounding, the results are coming back as null for some reason. I have tried casting, to_char, etc to try to get them to show up..no love ensued. I was wondering if you have any idea what could by happening. I have attached some test results based on the grouping sets wiki. One of the examples is just using group by, as a sanity check. Any ideas or help would be much appreciated. sorry, I have not any useful idea. This work was a concept and it is probable, so there will be some corner issues :(. This feature needs more love and some more significant changes in planner and executor. Regards Pavel CREATE TABLE cars2 (name CHARACTER VARYING , place CHARACTER VARYING , sales real, cost real ); insert into cars2 values('skoda', 'czech rep.', 1, 8000); insert into cars2 values('skoda', 'germany', 5000, 6000); insert into cars2 values('bmw', 'czech rep.', 6000, 4000); insert into cars2 values('bmw', 'germany', 18000, 15000); insert into cars2 values('opel', 'czech rep.', 7000, 5000); insert into cars2 values('opel', 'germany', 7000, 5000); --grouping sets test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by rollup(name, place); name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 (null) (null) skoda germany 5000 6000 1.2 (null) (null) opel czech rep. 7000 5000 0.7143 (null) (null) opel germany 7000 5000 0.7143 (null) (null) skoda czech rep. 1 8000 0.8 (null) (null) bmw germany 18000 15000 0.8333 (null) (null) bmw (null) 24000 19000 0.7917 (null) (null) skoda (null) 15000 14000 0.9333 (null) (null) opel (null) 14000 1 0.7143 (null) (null) (null) (null) 53000 43000 0.8113 (null) (null) --group by sanity test-- select name, place, sum(sales) as sales, sum(cost) as cost, sum(cost) / sum(sales) as cost_sales_ratio, (sum(cost) / sum(sales)) * 100 as cost_sales_ratio_per, round(((sum(cost) / sum(sales)) * 100),0) as cost_sales_ratio_per_rnd from cars2 group by name, place; name place sales cost cost_sales_ratio cost_sales_ratio_per cost_sales_ratio_per_rnd bmw czech rep. 6000 4000 0.6667 66.6667 67 skoda germany 5000 6000 1.2 120 120 opel czech rep. 7000 5000 0.7143 71.4286 71 opel germany 7000 5000 0.7143 71.4286 71 skoda czech rep. 1 8000 0.8 80 80 bmw germany 18000 15000 0.8333 83. 83 Thanks -- Regards David -Original Message- From: Pavel Stehule [mailto:pavel.steh...@gmail.com] Sent: Sunday, September 18, 2011 2:34 PM To: David Rinaldi Subject: Re: [HACKERS] Grouping Sets Hello A last patch should be applied on 8.4 or 9.0 - should to try it. I worked with developer version. http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php Regards Pavel Stehule 2011/9/18 David Rinaldi edwbro...@gmail.com: Hi, I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? -- Regards David -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
[HACKERS] Grouping Sets
Hi, I tried to apply the Grouping Sets Patch to 8.4, but received several Hunks failed messages, does anyone know if the failing hunks can be applied manually? Or what version they were applied to specifically? -- Regards David
Re: [HACKERS] Grouping Sets
Hello I have not any newest patch related to GROUPING SETS. The last version of this patch is probably correct, but it is not well tested. Actually, this patch has not quality to production usage :(. It is just concept. You can test it. Regards Pavel Stehule 2011/6/18 Mariano Mara mariano.m...@gmail.com: Hi hackers (and specially Pavel Stehule), I could really use the grouping set feature for some complex queries I'm migrating from other db vendor. If my WEB searching is precise, this wiki page [1] and this thread[2] are the last updates on the subject. I'm willing to test how these functions in my project but some questions first: 1- is there an up-to-date version of the patch that I should be aware of? 2- Can I apply that patch to 8.4.8? 3- any extra recommendations? TIA, Mariano [1] http://wiki.postgresql.org/wiki/Grouping_Sets [2] http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
[HACKERS] Grouping Sets
Hi hackers (and specially Pavel Stehule), I could really use the grouping set feature for some complex queries I'm migrating from other db vendor. If my WEB searching is precise, this wiki page [1] and this thread[2] are the last updates on the subject. I'm willing to test how these functions in my project but some questions first: 1- is there an up-to-date version of the patch that I should be aware of? 2- Can I apply that patch to 8.4.8? 3- any extra recommendations? TIA, Mariano [1] http://wiki.postgresql.org/wiki/Grouping_Sets [2] http://archives.postgresql.org/pgsql-hackers/2010-08/msg00647.php -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
Hello I found a break in GROUPING SETS implementation. Now I am playing with own executor and planner node and I can't to go forward :(. Probably this feature will need a significant update of our agg implementation. Probably needs a some similar structure like CTE but it can be a little bit reduced - there are a simple relation between source query and result query - I am not sure, if this has to be implemented via subqueries? The second question is relative big differencies between GROUP BY behave and GROUP BY GROUPING SETS behave. Now I don't know about way to join GROUP BY and GROUPING SETS together Any ideas welcome Regards Pavel -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
Hello I was confused when I though so I found a solution of 1 shift/reduce conflict :( All identificators used for buildin functions have to be a col_name_keywords or reserved keyword. There is conflict with our (probably obsolete) feature SELECT colname(tabname). So for this moment the real solution is removing CUBE and ROLLUP from keywords and dynamically testing a funcname in transformation stage - what is slower and more ugly. ideas? Regards Pavel Stehule 2010/8/7 Pavel Stehule pavel.steh...@gmail.com: 2010/8/7 Joshua Tolley eggyk...@gmail.com: On Thu, Aug 05, 2010 at 04:46:51PM +0200, Pavel Stehule wrote: I am sending a updated version. I've been looking at the changes to gram.y, and noted the comment under func_expr where you added CUBE and ROLLUP definitions. It says that CUBE can't be a reserved keyword because it's already used in the cube contrib module. But then the changes to kwlist.h include this: I am little bit confused now - it's bad comment - and I have to verify it. What I remember, we cannot to use a two parser's rules, because it going to a conflict. So there have to be used a trick with a moving to decision to transform stage, where we have a context info. I have to recheck a minimal level - probably it can't be a RESERVED_KEYWORD. Because then we can't to create a function cube. + PG_KEYWORD(cube, CUBE, RESERVED_KEYWORD) ... + PG_KEYWORD(rollup, ROLLUP, RESERVED_KEYWORD) ...and CUBE and ROLLUP are added in gram.y under the reserved_keyword list. I realize things like CURRENT_TIME, that also have special entries in the func_expr grammar, are also reserved keywords, but this all seems at odds with the comment. What am I missing? Is the comment simply pointing out that the designation of CUBE and ROLLUP as reserved keywords will have to change at some point, but it hasn't been implemented yet (or no one has figured out how to do it)? -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxcjSIACgkQRiRfCGf1UMPpCwCcCHBh/1NiLykIcVYgPyfbIegF xq0AoID75rCPiW8yf29OSkaJVza1FQt5 =PcLs -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] grouping sets - updated patch
On Mon, Aug 09, 2010 at 10:59:26PM +0200, Pavel Stehule wrote: Hello I fixed an issues with empty sets. It just work, but there are some ugly hacks. It's really needs own planner node - now grouping functions are not supported by ORDER BY clause. I haven't made it through the last version much, but I'll poke through this instead. I have a few days of family business coming up, and might be unrespondive during that time. -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] grouping sets - updated patch
2010/8/10 Joshua Tolley eggyk...@gmail.com: On Mon, Aug 09, 2010 at 10:59:26PM +0200, Pavel Stehule wrote: Hello I fixed an issues with empty sets. It just work, but there are some ugly hacks. It's really needs own planner node - now grouping functions are not supported by ORDER BY clause. I haven't made it through the last version much, but I'll poke through this instead. I have a few days of family business coming up, and might be unrespondive during that time. ok, Pavel -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxgxlgACgkQRiRfCGf1UMM3NwCgkJ3EEWIj6MLiDcU2SHT/hH7a 4BsAn2hTqqzsLYLFZbflIJK/x/WMsZ2d =dIod -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
On Thu, Aug 05, 2010 at 04:46:51PM +0200, Pavel Stehule wrote: I am sending a updated version. I've been looking at the changes to gram.y, and noted the comment under func_expr where you added CUBE and ROLLUP definitions. It says that CUBE can't be a reserved keyword because it's already used in the cube contrib module. But then the changes to kwlist.h include this: + PG_KEYWORD(cube, CUBE, RESERVED_KEYWORD) ... + PG_KEYWORD(rollup, ROLLUP, RESERVED_KEYWORD) ...and CUBE and ROLLUP are added in gram.y under the reserved_keyword list. I realize things like CURRENT_TIME, that also have special entries in the func_expr grammar, are also reserved keywords, but this all seems at odds with the comment. What am I missing? Is the comment simply pointing out that the designation of CUBE and ROLLUP as reserved keywords will have to change at some point, but it hasn't been implemented yet (or no one has figured out how to do it)? -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] GROUPING SETS revisited
2010/8/7 Joshua Tolley eggyk...@gmail.com: On Thu, Aug 05, 2010 at 04:46:51PM +0200, Pavel Stehule wrote: I am sending a updated version. I've been looking at the changes to gram.y, and noted the comment under func_expr where you added CUBE and ROLLUP definitions. It says that CUBE can't be a reserved keyword because it's already used in the cube contrib module. But then the changes to kwlist.h include this: I am little bit confused now - it's bad comment - and I have to verify it. What I remember, we cannot to use a two parser's rules, because it going to a conflict. So there have to be used a trick with a moving to decision to transform stage, where we have a context info. I have to recheck a minimal level - probably it can't be a RESERVED_KEYWORD. Because then we can't to create a function cube. + PG_KEYWORD(cube, CUBE, RESERVED_KEYWORD) ... + PG_KEYWORD(rollup, ROLLUP, RESERVED_KEYWORD) ...and CUBE and ROLLUP are added in gram.y under the reserved_keyword list. I realize things like CURRENT_TIME, that also have special entries in the func_expr grammar, are also reserved keywords, but this all seems at odds with the comment. What am I missing? Is the comment simply pointing out that the designation of CUBE and ROLLUP as reserved keywords will have to change at some point, but it hasn't been implemented yet (or no one has figured out how to do it)? -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxcjSIACgkQRiRfCGf1UMPpCwCcCHBh/1NiLykIcVYgPyfbIegF xq0AoID75rCPiW8yf29OSkaJVza1FQt5 =PcLs -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
On Thu, Aug 05, 2010 at 04:46:51PM +0200, Pavel Stehule wrote: So Joshua, can you look on code? Sure... thanks :) -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] GROUPING SETS revisited
I found other issue :( postgres=# select name, place from cars group by grouping sets(name, place,()); name | place ---+ bmw | skoda | opel | | germany | czech rep. skoda | czech rep. skoda | germany bmw | czech rep. bmw | germany opel | czech rep. opel | germany (11 rows) postgres=# explain select name, place from cars group by grouping sets(name, place,()); QUERY PLAN -- Append (cost=36.98..88.55 rows=1230 width=54) CTE GroupingSets - Seq Scan on cars (cost=0.00..18.30 rows=830 width=68) - HashAggregate (cost=18.68..20.68 rows=200 width=32) - CTE Scan on GroupingSets (cost=0.00..16.60 rows=830 width=32) - HashAggregate (cost=18.68..20.68 rows=200 width=32) - CTE Scan on GroupingSets (cost=0.00..16.60 rows=830 width=32) - CTE Scan on GroupingSets (cost=0.00..16.60 rows=830 width=64) (8 rows) the combination of nonagregates and empty sets do a problems - because we can't ensure agg mode without aggregates or group by. But it is only minor issue 2010/8/5 Joshua Tolley eggyk...@gmail.com: On Thu, Aug 05, 2010 at 04:46:51PM +0200, Pavel Stehule wrote: So Joshua, can you look on code? Sure... thanks :) -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxa1NsACgkQRiRfCGf1UMPwzQCgjz52P86Yx4ac4aRkKwjn8OHK 6/EAoJ/CjXEyPaLpx39SI5bKQPz+AwBR =Mi2J -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
On Wed, Aug 04, 2010 at 04:44:05AM +0200, Pavel Stehule wrote: Yeah, I seem to have done a poor job of producing the patch based on the repository I was working from. That said, it seems Pavel's working actively on a patch anyway, so perhaps my updating the old one isn't all that worthwhile. Pavel, is your code somewhere that we can get to it? not now. please wait a week. That works for me. I'm glad to try doing a better job of putting together my version of the patch, if anyone thinks it's useful, but it seems that since Pavel's code is due to appear sometime in the foreseeable future, there's not much point in my doing that. -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] GROUPING SETS revisited
2010/8/4 Joshua Tolley eggyk...@gmail.com: On Wed, Aug 04, 2010 at 04:44:05AM +0200, Pavel Stehule wrote: Yeah, I seem to have done a poor job of producing the patch based on the repository I was working from. That said, it seems Pavel's working actively on a patch anyway, so perhaps my updating the old one isn't all that worthwhile. Pavel, is your code somewhere that we can get to it? not now. please wait a week. That works for me. I'm glad to try doing a better job of putting together my version of the patch, if anyone thinks it's useful, but it seems that since Pavel's code is due to appear sometime in the foreseeable future, there's not much point in my doing that. I hope, so next week you can do own work on this job - I am not a native speaker, and my code will need a checking and fixing comments Regards Pavel -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxZkp8ACgkQRiRfCGf1UMMUcwCfcPayQbWRUYwhpCF1f24LsdD9 H/gAnRzCEq6yLX/RVLLi88ROhurOzbhK =gUPx -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
On Thu, Aug 05, 2010 at 06:21:18AM +0200, Pavel Stehule wrote: I hope, so next week you can do own work on this job - I am not a native speaker, and my code will need a checking and fixing comments I haven't entirely figured out how the code in the old patch works, but I promise I *can* edit comments/docs :) -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] GROUPING SETS revisited
Hello 2010/8/3 Joshua Tolley eggyk...@gmail.com: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. I am plaing with it now :). I have a plan to replace CTE with similar but explicit executor node. The main issue of existing patch was using just transformation to CTE. I agree, so it isn't too much extensiable in future. Now I am cleaning identifiers little bit. Any colaboration is welcome. My plan: 1) clean CTE patch 2) replace CTE with explicit executor node, but still based on tuplestore 3) when will be possible parallel processing based on hash agg - then we don't need to use tuplestore comments?? Regards Pavel [1] http://archives.postgresql.org/pgsql-hackers/2009-05/msg00700.php -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxXrggACgkQRiRfCGf1UMMlCQCglaIdtPj8Qe6G60V2LHn5pFNn kgIAniXRgIQEbVrK/eDVZnmKCzw33lT9 =XVVV -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
2010/8/3 Pavel Stehule pavel.steh...@gmail.com: Hello 2010/8/3 Joshua Tolley eggyk...@gmail.com: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. I am plaing with it now :). I have a plan to replace CTE with similar but explicit executor node. The main issue of existing patch was using just transformation to CTE. I agree, so it isn't too much extensiable in future. Now I am cleaning identifiers little bit. Any colaboration is welcome. My plan: 1) clean CTE patch 2) replace CTE with explicit executor node, but still based on tuplestore 3) when will be possible parallel processing based on hash agg - then we don't need to use tuplestore Couldn't you explain what exactly explicit executor node? I hope we can share your image to develop it further than only transformation to CTE. Regards, -- Hitoshi Harada -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
2010/8/3 Hitoshi Harada umi.tan...@gmail.com: 2010/8/3 Pavel Stehule pavel.steh...@gmail.com: Hello 2010/8/3 Joshua Tolley eggyk...@gmail.com: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. I am plaing with it now :). I have a plan to replace CTE with similar but explicit executor node. The main issue of existing patch was using just transformation to CTE. I agree, so it isn't too much extensiable in future. Now I am cleaning identifiers little bit. Any colaboration is welcome. My plan: 1) clean CTE patch 2) replace CTE with explicit executor node, but still based on tuplestore 3) when will be possible parallel processing based on hash agg - then we don't need to use tuplestore Couldn't you explain what exactly explicit executor node? I hope we can share your image to develop it further than only transformation to CTE. I have a one reason Implementation based on CTE doesn't create space for possible optimalisations (I think now, maybe it isn't true). It is good for initial or referencial implementation - but it can be too complex, when we will try to append some optimalizations - like parallel hash agg processing, direct data reading without tuplestore. If you are, as CTE author, thinking so these features are possible in non recursive CTE too, I am not agains. I hope so this week I'll have a CTE based patch - and we can talk about next direction. I see as possible performance issue using a tuplestore - there are lot of cases where repeating of source query can be faster. If I remember well, Tom has a objection, so transformation to CTE is too early - in parser. So It will be first change. Executor node can be CTE. regards Pavel p.s. I am sure, so there are lot of task, that can be solved together with non recursive CTE. Regards, -- Hitoshi Harada -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GROUPING SETS revisited
On Mon, Aug 02, 2010 at 11:50:00PM -0600, Josh Tolley wrote: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. [1] http://archives.postgresql.org/pgsql-hackers/2009-05/msg00700.php I've added back one file in the patch enclosed here. I'm still getting compile fails from CC=ccache gcc ./configure --prefix=$PG_PREFIX --with-pgport=$PGPORT --with-perl --with-libxml --enable-debug --enable-cassert make Log from that also enclosed. Cheers, David. -- David Fetter da...@fetter.org http://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david.fet...@gmail.com iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index a8f4c07..fb248a6 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -15,7 +15,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) OBJS= analyze.o gram.o keywords.o kwlookup.o parser.o \ parse_agg.o parse_clause.o parse_coerce.o parse_cte.o parse_expr.o \ parse_func.o parse_node.o parse_oper.o parse_param.o parse_relation.o \ - parse_target.o parse_type.o parse_utilcmd.o scansup.o + parse_target.o parse_type.o parse_utilcmd.o scansup.o parse_gsets.o FLEXFLAGS = -CF diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 6b99a10..1b579a8 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -34,6 +34,7 @@ #include parser/parse_clause.h #include parser/parse_coerce.h #include parser/parse_cte.h +#include parser/parse_gsets.h #include parser/parse_oper.h #include parser/parse_param.h #include parser/parse_relation.h @@ -150,6 +151,163 @@ parse_sub_analyze(Node *parseTree, ParseState *parentParseState, } /* + * process GROUPING SETS + */ +static SelectStmt * +makeSelectStmt(List *targetList, List *fromClause) +{ + SelectStmt *n = makeNode(SelectStmt); + n-distinctClause = NULL; + n-intoClause = NULL; + n-targetList = targetList; + n-fromClause = fromClause; + n-whereClause = NULL; + n-groupClause = NULL; + n-havingClause = NULL; + n-windowClause = NIL; + n-withClause = NULL; + n-valuesLists = NIL; + n-sortClause = NIL; + n-limitOffset = NULL; + n-limitCount = NULL; + n-lockingClause = NIL; + n-op = SETOP_NONE; + n-all = false; + n-larg = NULL; + n-rarg = NULL; + return n; +} + +static List * +makeStarTargetList(void) +{ + ResTarget *rt = makeNode(ResTarget); + + rt-name = NULL; + rt-indirection = NIL; + rt-val = (Node *) makeNode(ColumnRef); + ((ColumnRef *) rt-val)-fields = list_make1(makeNode(A_Star)); + rt-location = -1; + + return list_make1(rt); +} + +static SelectStmt * +transformGroupingSets(ParseState *pstate, SelectStmt *stmt) +{ + if (stmt-groupClause IsA(stmt-groupClause, GroupByClause)) + { + GroupingSetsSpec *gss = (GroupingSetsSpec *) expandGroupingSets(pstate, + (List *)((GroupByClause *)stmt-groupClause)-fields); + + if (pstate-p_hasGroupingSets) + { + CommonTableExpr *cte = makeNode(CommonTableExpr); + SelectStmt *cteedstmt; + int ngroupingsets = list_length(gss-set_list) + (gss-has_empty_set ? 1 : 0); + boolall = ((GroupByClause *) stmt-groupClause)-all; + + cteedstmt = makeSelectStmt(NIL, NIL); + cteedstmt-intoClause = stmt-intoClause; + cteedstmt-sortClause = stmt-sortClause; + cteedstmt-limitOffset = stmt-limitOffset; + cteedstmt-limitCount = stmt-limitCount; + cteedstmt-lockingClause = stmt-lockingClause; + + cte-ctename = **g**; + cte-ctequery = (Node *) stmt; + cte-location = -1; + + cteedstmt-withClause = makeNode(WithClause); + cteedstmt-withClause-ctes = list_make1(cte); + cteedstmt-withClause-recursive = false; +
Re: [HACKERS] GROUPING SETS revisited
On Tue, Aug 03, 2010 at 12:58:03PM -0700, David Fetter wrote: On Mon, Aug 02, 2010 at 11:50:00PM -0600, Josh Tolley wrote: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. [1] http://archives.postgresql.org/pgsql-hackers/2009-05/msg00700.php I've added back one file in the patch enclosed here. I'm still getting compile fails from CC=ccache gcc ./configure --prefix=$PG_PREFIX --with-pgport=$PGPORT --with-perl --with-libxml --enable-debug --enable-cassert make Log from that also enclosed. Yeah, I seem to have done a poor job of producing the patch based on the repository I was working from. That said, it seems Pavel's working actively on a patch anyway, so perhaps my updating the old one isn't all that worthwhile. Pavel, is your code somewhere that we can get to it? -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com signature.asc Description: Digital signature
Re: [HACKERS] GROUPING SETS revisited
2010/8/3 Joshua Tolley eggyk...@gmail.com: On Tue, Aug 03, 2010 at 12:58:03PM -0700, David Fetter wrote: On Mon, Aug 02, 2010 at 11:50:00PM -0600, Josh Tolley wrote: In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. [1] http://archives.postgresql.org/pgsql-hackers/2009-05/msg00700.php I've added back one file in the patch enclosed here. I'm still getting compile fails from CC=ccache gcc ./configure --prefix=$PG_PREFIX --with-pgport=$PGPORT --with-perl --with-libxml --enable-debug --enable-cassert make Log from that also enclosed. Yeah, I seem to have done a poor job of producing the patch based on the repository I was working from. That said, it seems Pavel's working actively on a patch anyway, so perhaps my updating the old one isn't all that worthwhile. Pavel, is your code somewhere that we can get to it? not now. please wait a week. Regards Pavel -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkxYeiQACgkQRiRfCGf1UMPlEQCff+I4sCGtR+lzUs6Wb5JKi7Uu 3qYAnjLHzHzyMSHHX55QsphkaBbEJ0Zf =uRqV -END PGP SIGNATURE- -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
[HACKERS] GROUPING SETS revisited
In case anyone's interested, I've taken the CTE-based grouping sets patch from [1] and made it apply to 9.1, attached. I haven't yet done things like checked it for whitespace consistency, style conformity, or anything else, but (tuits permitting) hope to figure out how it works and get it closer to commitability in some upcoming commitfest. I mention it here so that if someone else is working on it, we can avoid duplicated effort, and to see if a CTE-based grouping sets implementation is really the way we think we want to go. [1] http://archives.postgresql.org/pgsql-hackers/2009-05/msg00700.php -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index a8f4c07..fb248a6 100644 *** a/src/backend/parser/Makefile --- b/src/backend/parser/Makefile *** override CPPFLAGS := -I. -I$(srcdir) $(C *** 15,21 OBJS= analyze.o gram.o keywords.o kwlookup.o parser.o \ parse_agg.o parse_clause.o parse_coerce.o parse_cte.o parse_expr.o \ parse_func.o parse_node.o parse_oper.o parse_param.o parse_relation.o \ ! parse_target.o parse_type.o parse_utilcmd.o scansup.o FLEXFLAGS = -CF --- 15,21 OBJS= analyze.o gram.o keywords.o kwlookup.o parser.o \ parse_agg.o parse_clause.o parse_coerce.o parse_cte.o parse_expr.o \ parse_func.o parse_node.o parse_oper.o parse_param.o parse_relation.o \ ! parse_target.o parse_type.o parse_utilcmd.o scansup.o parse_gsets.o FLEXFLAGS = -CF diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 6b99a10..1b579a8 100644 *** a/src/backend/parser/analyze.c --- b/src/backend/parser/analyze.c *** *** 34,39 --- 34,40 #include parser/parse_clause.h #include parser/parse_coerce.h #include parser/parse_cte.h + #include parser/parse_gsets.h #include parser/parse_oper.h #include parser/parse_param.h #include parser/parse_relation.h *** parse_sub_analyze(Node *parseTree, Parse *** 150,155 --- 151,313 } /* + * process GROUPING SETS + */ + static SelectStmt * + makeSelectStmt(List *targetList, List *fromClause) + { + SelectStmt *n = makeNode(SelectStmt); + n-distinctClause = NULL; + n-intoClause = NULL; + n-targetList = targetList; + n-fromClause = fromClause; + n-whereClause = NULL; + n-groupClause = NULL; + n-havingClause = NULL; + n-windowClause = NIL; + n-withClause = NULL; + n-valuesLists = NIL; + n-sortClause = NIL; + n-limitOffset = NULL; + n-limitCount = NULL; + n-lockingClause = NIL; + n-op = SETOP_NONE; + n-all = false; + n-larg = NULL; + n-rarg = NULL; + return n; + } + + static List * + makeStarTargetList(void) + { + ResTarget *rt = makeNode(ResTarget); + + rt-name = NULL; + rt-indirection = NIL; + rt-val = (Node *) makeNode(ColumnRef); + ((ColumnRef *) rt-val)-fields = list_make1(makeNode(A_Star)); + rt-location = -1; + + return list_make1(rt); + } + + static SelectStmt * + transformGroupingSets(ParseState *pstate, SelectStmt *stmt) + { + if (stmt-groupClause IsA(stmt-groupClause, GroupByClause)) + { + GroupingSetsSpec *gss = (GroupingSetsSpec *) expandGroupingSets(pstate, + (List *)((GroupByClause *)stmt-groupClause)-fields); + + if (pstate-p_hasGroupingSets) + { + CommonTableExpr *cte = makeNode(CommonTableExpr); + SelectStmt *cteedstmt; + int ngroupingsets = list_length(gss-set_list) + (gss-has_empty_set ? 1 : 0); + bool all = ((GroupByClause *) stmt-groupClause)-all; + + cteedstmt = makeSelectStmt(NIL, NIL); + cteedstmt-intoClause = stmt-intoClause; + cteedstmt-sortClause = stmt-sortClause; + cteedstmt-limitOffset = stmt-limitOffset; + cteedstmt-limitCount = stmt-limitCount; + cteedstmt-lockingClause = stmt-lockingClause; + + cte-ctename = **g**; + cte-ctequery = (Node *) stmt; + cte-location = -1; + + cteedstmt-withClause = makeNode(WithClause); + cteedstmt-withClause-ctes = list_make1(cte); + cteedstmt-withClause-recursive = false; + cteedstmt-withClause-location = -1; + + /* when is more than one grouping set, then we should generate setop node */ + if (ngroupingsets 1) + { + /* add quuery under union all for every grouping set */ + SelectStmt *larg = NULL; + SelectStmt *rarg; + ListCell*lc; + + foreach(lc, gss-set_list) + { + List *groupClause; + + Assert(IsA(lfirst(lc), List)); + groupClause = (List *) lfirst(lc); + + if (larg == NULL) + { + larg = makeSelectStmt(copyObject(stmt-targetList), + list_make1(makeRangeVar(NULL, **g**, -1))); + larg-groupClause = (Node *) groupClause; + larg-havingClause = copyObject(stmt-havingClause); + } + else + { + SelectStmt *setop = makeSelectStmt(NIL, NIL); + + rarg = makeSelectStmt(copyObject(stmt-targetList), +
[HACKERS] Grouping sets
Hello I got a possibility to continue on GROUPING SETS see http://wiki.postgresql.org/wiki/Grouping_Sets My last patch was based on an sharing functionality with non recursive CTE. I would to recapitulate all options here and I would to prepare this patch for next commitfest. a) using actualised patch - review: http://archives.postgresql.org/message-id/162867790811240316y52227d88xe53527399b329...@mail.gmail.com + it is simple (share lot of code) + it is near to natural implementation - result is in good order + allows full implementation of ANSI SQL syntax - GROUP BY [ALL|DISTINCT] GROUPING SETS(.. - is serial - I read some objections - it is only syntactic sugar b) modification of a (directly using tuple store without CTE code) + add some new code - it isn't syntactic sugar c) go back to my first patch and use feeders - add some complexity to GROUP BY planner ( :-( ) +/- add new concept to PostgreSQL - semi parallel execution - when datatype isn't hashable, then have to use serial processing - have to solve some corner behave of our hashtable support - should be very fast I still prefer option a (with some cleaning) I invite any comments and helpers. Regards Pavel Stehule -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers