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 CPU cycles required to rewrite the first one into the second one internally. + + BETWEEN SYMETRIC + + BETWEEN SYMMETRIC is the same as BETWEEN + except there is no requirement that the argument to the left of AND be less than + or equal to the argument on the right; the proper range is automatically determined. 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 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 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},