From 8b84aebddf02a34b07b22d368a0cf72341278921 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 14 Jun 2005 23:47:39 +0000 Subject: [PATCH] Add BETWEEN SYMMETRIC. Pavel Stehule --- doc/src/sgml/func.sgml | 8 +++++- src/backend/parser/gram.y | 49 ++++++++++++++++++++++++++++------- src/backend/parser/keywords.c | 4 ++- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 43df7d595c..4fe5e1d6fc 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,5 +1,5 @@ @@ -282,6 +282,12 @@ PostgreSQL documentation 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. diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index c54d6de890..37ad49eed5 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.492 2005/06/08 21:15:28 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.493 2005/06/14 23:47:39 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -338,7 +338,7 @@ static void doNegateFloat(Value *v); /* 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 + ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BOOLEAN_P BOTH BY @@ -399,7 +399,8 @@ static void doNegateFloat(Value *v); 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 + 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,18 +6334,41 @@ a_expr: c_expr { $$ = $1; } { $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6); } - | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN + | a_expr BETWEEN opt_asymmetric 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)); + (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4), + (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6)); } - | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN + | 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, $4), - (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $6)); + (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,6 +6467,11 @@ a_expr: c_expr { $$ = $1; } } ; +opt_asymmetric: ASYMMETRIC {} + | /*EMPTY*/ {} + ; + + /* * Restricted expressions * @@ -7721,6 +7750,7 @@ unreserved_keyword: | ALTER | ASSERTION | ASSIGNMENT + | ASYMMETRIC | AT | BACKWARD | BEFORE @@ -7867,6 +7897,7 @@ unreserved_keyword: | STDIN | STDOUT | STORAGE + | SYMMETRIC | SYSID | STRICT_P | TABLESPACE diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 359fb84565..9296067dfa 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.155 2005/05/07 02:22:47 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.156 2005/06/14 23:47:39 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -49,6 +49,7 @@ static const ScanKeyword ScanKeywords[] = { {"asc", ASC}, {"assertion", ASSERTION}, {"assignment", ASSIGNMENT}, + {"asymmetric", ASYMMETRIC}, {"at", AT}, {"authorization", AUTHORIZATION}, {"backward", BACKWARD}, @@ -296,6 +297,7 @@ static const ScanKeyword ScanKeywords[] = { {"storage", STORAGE}, {"strict", STRICT_P}, {"substring", SUBSTRING}, + {"symmetric", SYMMETRIC}, {"sysid", SYSID}, {"table", TABLE}, {"tablespace", TABLESPACE}, -- 2.40.0