Hello

I trying to implement GROUPING SETS feature. But there is basic
difference between PostgreSQL and ANSI. Pg allows expressions, ANSI
only column reference. I have syntax:

group_clause:
                        GROUP_P BY grouping_element_list
                        | /*EMPTY*/
                ;

grouping_element_list:
                        grouping_element
                                {
                                        $$ = list_make1($1);
                                }
                        | grouping_element_list ',' grouping_element
                                {
                                        $$ = lappend($1, $3);
                                }
                ;

grouping_element:
                        ordinary_grouping_set
                                {
                                }
                        | ROLLUP '(' ordinary_grouping_set_list ')'
                                {
                                }
                        | CUBE '(' ordinary_grouping_set_list ')'
                                {
                                }
                        | GROUPING SETS '(' grouping_element_list ')'
                                {
                                }
                        | '(' ')'
                                {
                                }
                ;


ordinary_grouping_set:
                    grouping_column_ref
                                {
                                }
                    | '(' grouping_ref_list ')'
                                {
                                }
                ;

grouping_ref_list:
                    grouping_column_ref
                                {
                                }
                    | grouping_ref_list ',' grouping_column_ref
                                {
                                }
                ;

ordinary_grouping_set_list:
                    ordinary_grouping_set
                                {
                                }
                    |  ordinary_grouping_set_list ',' ordinary_grouping_set
                                {
                                }
                ;

grouping_column_ref:
                        columnref
                                {}
                        | Iconst
                                {}
                ;
     ;

this works well, but it is ANSI compliant not pg compliant

after change:
grouping_column_ref:
                        a_expr
                                {}
                ;

I getting
[EMAIL PROTECTED] parser]$ bison  gram.y
gram.y: conflicts: 1 shift/reduce, 1 reduce/reduce

so I cannot find any way to remove shift/reduce.

any ideas?
*** ./gram.y.orig	2008-08-05 10:06:05.000000000 +0200
--- ./gram.y	2008-08-05 14:15:16.000000000 +0200
***************
*** 362,367 ****
--- 362,372 ----
  %type <node>	xml_root_version opt_xml_root_standalone
  %type <ival>	document_or_content
  %type <boolean> xml_whitespace_option
+ %type <list>	grouping_element_list
+ %type <node>	grouping_element
+ %type <list>	grouping_ref_list
+ %type <list>	ordinary_grouping_set ordinary_grouping_set_list
+ %type <node>	grouping_column_ref
  
  
  /*
***************
*** 384,390 ****
  	CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
  	COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
  	CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB
! 	CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE
  	CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
  
  	DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
--- 389,395 ----
  	CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
  	COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
  	CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB
! 	CREATEROLE CREATEUSER CROSS CSV CUBE CURRENT_P CURRENT_DATE CURRENT_ROLE
  	CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
  
  	DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
***************
*** 397,403 ****
  	FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
  	FREEZE FROM FULL FUNCTION
  
! 	GLOBAL GRANT GRANTED GREATEST GROUP_P
  
  	HANDLER HAVING HEADER_P HOLD HOUR_P
  
--- 402,408 ----
  	FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
  	FREEZE FROM FULL FUNCTION
  
! 	GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING
  
  	HANDLER HAVING HEADER_P HOLD HOUR_P
  
***************
*** 431,440 ****
  
  	READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME
  	REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE
! 	RIGHT ROLE ROLLBACK ROW ROWS RULE
  
  	SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE
! 	SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
  	SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT
  	STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
  	SYMMETRIC SYSID SYSTEM_P
--- 436,445 ----
  
  	READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME
  	REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE
! 	RIGHT ROLE ROLLBACK ROLLUP ROW ROWS RULE
  
  	SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE
! 	SERIALIZABLE SESSION SESSION_USER SET SETOF SETS SHARE
  	SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT
  	STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
  	SYMMETRIC SYSID SYSTEM_P
***************
*** 6470,6479 ****
  		;
  
  group_clause:
! 			GROUP_P BY expr_list					{ $$ = $3; }
  			| /*EMPTY*/								{ $$ = NIL; }
  		;
  
  having_clause:
  			HAVING a_expr							{ $$ = $2; }
  			| /*EMPTY*/								{ $$ = NULL; }
--- 6475,6547 ----
  		;
  
  group_clause:
! 			GROUP_P BY grouping_element_list				{ $$ = NIL; }
  			| /*EMPTY*/								{ $$ = NIL; }
  		;
  
+ grouping_element_list:
+ 			grouping_element
+ 				{
+ 					$$ = list_make1($1);
+ 				}
+ 			| grouping_element_list ',' grouping_element
+ 				{
+ 					$$ = lappend($1, $3);
+ 				}
+ 		;
+ 
+ grouping_element:
+ 			ordinary_grouping_set
+ 				{
+ 				}
+ 			| ROLLUP '(' ordinary_grouping_set_list ')'
+ 				{
+ 				}
+ 			| CUBE '(' ordinary_grouping_set_list ')'
+ 				{
+ 				}
+ 			| GROUPING SETS '(' grouping_element_list ')'
+ 				{
+ 				}
+ 			| '(' ')'
+ 				{
+ 				}
+ 		;
+ 
+ 
+ ordinary_grouping_set:
+ 		    grouping_column_ref
+ 				{
+ 				}
+ 		    | '(' grouping_ref_list ')'
+ 				{
+ 				}
+ 		;
+ 
+ grouping_ref_list:
+ 		    grouping_column_ref
+ 				{
+ 				}
+ 		    | grouping_ref_list ',' grouping_column_ref
+ 				{
+ 				}
+ 		;
+ 
+ ordinary_grouping_set_list:
+ 		    ordinary_grouping_set
+ 				{
+ 				}
+ 		    |  ordinary_grouping_set_list ',' ordinary_grouping_set
+ 				{
+ 				}
+ 		;
+ 
+ grouping_column_ref:
+ 			a_expr
+ 				{}
+ 		;
+ 
+ 
  having_clause:
  			HAVING a_expr							{ $$ = $2; }
  			| /*EMPTY*/								{ $$ = NULL; }
***************
*** 9228,9233 ****
--- 9296,9302 ----
  			| SERIALIZABLE
  			| SESSION
  			| SET
+ 			| SETS
  			| SHARE
  			| SHOW
  			| SIMPLE
***************
*** 9394,9399 ****
--- 9463,9469 ----
  			| COLUMN
  			| CONSTRAINT
  			| CREATE
+ 			| CUBE
  			| CURRENT_DATE
  			| CURRENT_ROLE
  			| CURRENT_TIME
***************
*** 9413,9418 ****
--- 9483,9489 ----
  			| FROM
  			| GRANT
  			| GROUP_P
+ 			| GROUPING
  			| HAVING
  			| IN_P
  			| INITIALLY
***************
*** 9436,9441 ****
--- 9507,9513 ----
  			| PRIMARY
  			| REFERENCES
  			| RETURNING
+ 			| ROLLUP
  			| SELECT
  			| SESSION_USER
  			| SOME
*** ./keywords.c.orig	2008-08-05 10:06:10.000000000 +0200
--- ./keywords.c	2008-08-05 10:15:40.000000000 +0200
***************
*** 114,119 ****
--- 114,120 ----
  	{"createuser", CREATEUSER, UNRESERVED_KEYWORD},
  	{"cross", CROSS, TYPE_FUNC_NAME_KEYWORD},
  	{"csv", CSV, UNRESERVED_KEYWORD},
+ 	{"cube", CUBE, RESERVED_KEYWORD},
  	{"current", CURRENT_P, UNRESERVED_KEYWORD},
  	{"current_date", CURRENT_DATE, RESERVED_KEYWORD},
  	{"current_role", CURRENT_ROLE, RESERVED_KEYWORD},
***************
*** 180,185 ****
--- 181,187 ----
  	{"granted", GRANTED, UNRESERVED_KEYWORD},
  	{"greatest", GREATEST, COL_NAME_KEYWORD},
  	{"group", GROUP_P, RESERVED_KEYWORD},
+ 	{"grouping", GROUPING, RESERVED_KEYWORD},
  	{"handler", HANDLER, UNRESERVED_KEYWORD},
  	{"having", HAVING, RESERVED_KEYWORD},
  	{"header", HEADER_P, UNRESERVED_KEYWORD},
***************
*** 321,326 ****
--- 323,329 ----
  	{"right", RIGHT, TYPE_FUNC_NAME_KEYWORD},
  	{"role", ROLE, UNRESERVED_KEYWORD},
  	{"rollback", ROLLBACK, UNRESERVED_KEYWORD},
+ 	{"rollup", ROLLUP, RESERVED_KEYWORD},
  	{"row", ROW, COL_NAME_KEYWORD},
  	{"rows", ROWS, UNRESERVED_KEYWORD},
  	{"rule", RULE, UNRESERVED_KEYWORD},
***************
*** 337,342 ****
--- 340,346 ----
  	{"session_user", SESSION_USER, RESERVED_KEYWORD},
  	{"set", SET, UNRESERVED_KEYWORD},
  	{"setof", SETOF, COL_NAME_KEYWORD},
+ 	{"sets", SETS, UNRESERVED_KEYWORD},
  	{"share", SHARE, UNRESERVED_KEYWORD},
  	{"show", SHOW, UNRESERVED_KEYWORD},
  	{"similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD},
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to