gram.y.patch

text/plain

Filename: gram.y.patch
Type: text/plain
Part: 0
Message: Re: [HACKERS] Re: subselects
*** ../src/backend/parser/gram.y.orig	Sat Jan 10 05:44:36 1998
--- ../src/backend/parser/gram.y	Sat Jan 10 19:29:37 1998
***************
*** 195,200 ****
--- 195,201 ----
  				having_clause
  %type <list>	row_descriptor, row_list
  %type <node>	row_expr
+ %type <str>		RowOp, row_opt
  %type <list>	OptCreateAs, CreateAsList
  %type <node>	CreateAsElement
  %type <value>	NumConst
***************
*** 242,248 ****
   */
  
  /* Keywords (in SQL92 reserved words) */
! %token	ACTION, ADD, ALL, ALTER, AND, AS, ASC,
  		BEGIN_TRANS, BETWEEN, BOTH, BY,
  		CASCADE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COLLATE, COLUMN, COMMIT, 
  		CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME, 
--- 243,249 ----
   */
  
  /* Keywords (in SQL92 reserved words) */
! %token	ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
  		BEGIN_TRANS, BETWEEN, BOTH, BY,
  		CASCADE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COLLATE, COLUMN, COMMIT, 
  		CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME, 
***************
*** 258,264 ****
  		ON, OPTION, OR, ORDER, OUTER_P,
  		PARTIAL, POSITION, PRECISION, PRIMARY, PRIVILEGES, PROCEDURE, PUBLIC,
  		REFERENCES, REVOKE, RIGHT, ROLLBACK,
! 		SECOND_P, SELECT, SET, SUBSTRING,
  		TABLE, TIME, TIMESTAMP, TO, TRAILING, TRANSACTION, TRIM,
  		UNION, UNIQUE, UPDATE, USING,
  		VALUES, VARCHAR, VARYING, VERBOSE, VERSION, VIEW,
--- 259,265 ----
  		ON, OPTION, OR, ORDER, OUTER_P,
  		PARTIAL, POSITION, PRECISION, PRIMARY, PRIVILEGES, PROCEDURE, PUBLIC,
  		REFERENCES, REVOKE, RIGHT, ROLLBACK,
! 		SECOND_P, SELECT, SET, SOME, SUBSTRING,
  		TABLE, TIME, TIMESTAMP, TO, TRAILING, TRANSACTION, TRIM,
  		UNION, UNIQUE, UPDATE, USING,
  		VALUES, VARCHAR, VARYING, VERBOSE, VERSION, VIEW,
***************
*** 2853,2866 ****
  /* Expressions using row descriptors
   * Define row_descriptor to allow yacc to break the reduce/reduce conflict
   *  with singleton expressions.
   */
  row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
  				{
! 					$$ = NULL;
  				}
  		| '(' row_descriptor ')' NOT IN '(' SubSelect ')'
  				{
! 					$$ = NULL;
  				}
  		| '(' row_descriptor ')' '=' '(' row_descriptor ')'
  				{
--- 2854,2878 ----
  /* Expressions using row descriptors
   * Define row_descriptor to allow yacc to break the reduce/reduce conflict
   *  with singleton expressions.
+  *
+  * Note that "SOME" is the same as "ANY" in syntax.
+  * - thomas 1998-01-10
   */
  row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
  				{
! 					$$ = makeA_Expr(OP, "=any", (Node *)$2, (Node *)$6);
  				}
  		| '(' row_descriptor ')' NOT IN '(' SubSelect ')'
  				{
! 					$$ = makeA_Expr(OP, "<>any", (Node *)$2, (Node *)$7);
! 				}
! 		| '(' row_descriptor ')' RowOp row_opt '(' SubSelect ')'
! 				{
! 					char *opr;
! 					opr = palloc(strlen($4)+strlen($5)+1);
! 					strcpy(opr, $4);
! 					strcat(opr, $5);
! 					$$ = makeA_Expr(OP, opr, (Node *)$2, (Node *)$7);
  				}
  		| '(' row_descriptor ')' '=' '(' row_descriptor ')'
  				{
***************
*** 2880,2885 ****
--- 2892,2907 ----
  				}
  		;
  
+ RowOp:  '='						{ $$ = "="; }
+ 		| '<'					{ $$ = "<"; }
+ 		| '>'					{ $$ = ">"; }
+ 		;
+ 
+ row_opt:  ALL					{ $$ = "all"; }
+ 		| ANY					{ $$ = "any"; }
+ 		| SOME					{ $$ = "any"; }
+ 		;
+ 
  row_descriptor:  row_list ',' a_expr
  				{
  					$$ = lappend($1, $3);
***************
*** 3432,3441 ****
  		;
  
  in_expr:  SubSelect
! 				{
! 					elog(ERROR,"IN (SUBSELECT) not yet implemented");
! 					$$ = $1;
! 				}
  		| in_expr_nodes
  				{	$$ = $1; }
  		;
--- 3454,3460 ----
  		;
  
  in_expr:  SubSelect
! 				{	$$ = makeA_Expr(OP, "=", saved_In_Expr, (Node *)$1); }
  		| in_expr_nodes
  				{	$$ = $1; }
  		;
***************
*** 3449,3458 ****
  		;
  
  not_in_expr:  SubSelect
! 				{
! 					elog(ERROR,"NOT IN (SUBSELECT) not yet implemented");
! 					$$ = $1;
! 				}
  		| not_in_expr_nodes
  				{	$$ = $1; }
  		;
--- 3468,3474 ----
  		;
  
  not_in_expr:  SubSelect
! 				{	$$ = makeA_Expr(OP, "<>", saved_In_Expr, (Node *)$1); }
  		| not_in_expr_nodes
  				{	$$ = $1; }
  		;