Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.255
diff -c -c -r1.255 func.sgml
*** doc/src/sgml/func.sgml	14 Jun 2005 21:04:38 -0000	1.255
--- doc/src/sgml/func.sgml	14 Jun 2005 23:46:19 -0000
***************
*** 282,287 ****
--- 282,293 ----
      There is no difference between the two respective forms apart from
      the <acronym>CPU</acronym> cycles required to rewrite the first one
      into the second one internally.
+     <indexterm>
+      <primary>BETWEEN SYMETRIC</primary>
+     </indexterm>
+     <token>BETWEEN SYMMETRIC</> is the same as <literal>BETWEEN</>
+     except there is no requirement that the argument to the left of <literal>AND</> be less than
+     or equal to the argument on the right;  the proper range is automatically determined.
     </para>
  
     <para>
Index: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.492
diff -c -c -r2.492 gram.y
*** src/backend/parser/gram.y	8 Jun 2005 21:15:28 -0000	2.492
--- src/backend/parser/gram.y	14 Jun 2005 23:46:23 -0000
***************
*** 338,344 ****
  /* ordinary key words in alphabetical order */
  %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
  	AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
! 	ASSERTION ASSIGNMENT AT AUTHORIZATION
  
  	BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
  	BOOLEAN_P BOTH BY
--- 338,344 ----
  /* ordinary key words in alphabetical order */
  %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
  	AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
! 	ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION
  
  	BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
  	BOOLEAN_P BOTH BY
***************
*** 399,405 ****
  	SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
  	SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
  	SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
! 	STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID
  
  	TABLE TABLESPACE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
  	TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
--- 399,406 ----
  	SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
  	SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
  	SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
! 	STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYMMETRIC
! 	SYSID
  
  	TABLE TABLESPACE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
  	TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
***************
*** 6333,6350 ****
  				{
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
  				}
! 			| a_expr BETWEEN b_expr AND b_expr			%prec BETWEEN
  				{
  					$$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3),
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $5));
  				}
! 			| a_expr NOT BETWEEN b_expr AND b_expr		%prec BETWEEN
  				{
  					$$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $4),
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $6));
  				}
  			| a_expr IN_P in_expr
  				{
  					/* in_expr returns a SubLink or a list of a_exprs */
--- 6334,6374 ----
  				{
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
  				}
! 			| a_expr BETWEEN opt_asymmetric b_expr AND b_expr			%prec BETWEEN
  				{
  					$$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4),
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6));
  				}
! 			| a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr		%prec BETWEEN
  				{
  					$$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5),
! 						(Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7));
  				}
+ 				
+ 			| a_expr BETWEEN SYMMETRIC b_expr AND b_expr			%prec BETWEEN
+ 				{
+ 					$$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
+ 						(Node *) makeA_Expr(AEXPR_AND, NIL,
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4),
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6)),
+ 						(Node *) makeA_Expr(AEXPR_AND, NIL,
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $6),
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $4)));					
+ 				}
+ 			| a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr		%prec BETWEEN
+ 				{
+ 					$$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
+ 						(Node *) makeA_Expr(AEXPR_OR, NIL,
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5),
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7)),
+ 						(Node *) makeA_Expr(AEXPR_OR, NIL,
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $7),
+ 						    (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $5)));					
+ 				}
+ 				
+ 				
  			| a_expr IN_P in_expr
  				{
  					/* in_expr returns a SubLink or a list of a_exprs */
***************
*** 6443,6448 ****
--- 6467,6477 ----
  				}
  		;
  
+ opt_asymmetric:		ASYMMETRIC									{}
+ 			    | /*EMPTY*/								{}
+ 		;
+ 
+ 
  /*
   * Restricted expressions
   *
***************
*** 7721,7726 ****
--- 7750,7756 ----
  			| ALTER
  			| ASSERTION
  			| ASSIGNMENT
+ 			| ASYMMETRIC
  			| AT
  			| BACKWARD
  			| BEFORE
***************
*** 7867,7872 ****
--- 7897,7903 ----
  			| STDIN
  			| STDOUT
  			| STORAGE
+ 			| SYMMETRIC
  			| SYSID
  			| STRICT_P
  			| TABLESPACE
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.155
diff -c -c -r1.155 keywords.c
*** src/backend/parser/keywords.c	7 May 2005 02:22:47 -0000	1.155
--- src/backend/parser/keywords.c	14 Jun 2005 23:46:24 -0000
***************
*** 49,54 ****
--- 49,55 ----
  	{"asc", ASC},
  	{"assertion", ASSERTION},
  	{"assignment", ASSIGNMENT},
+ 	{"asymmetric", ASYMMETRIC},
  	{"at", AT},
  	{"authorization", AUTHORIZATION},
  	{"backward", BACKWARD},
***************
*** 296,301 ****
--- 297,303 ----
  	{"storage", STORAGE},
  	{"strict", STRICT_P},
  	{"substring", SUBSTRING},
+ 	{"symmetric", SYMMETRIC},
  	{"sysid", SYSID},
  	{"table", TABLE},
  	{"tablespace", TABLESPACE},
