From be8100d64ec93ccd8160b37379ba189aab4d0ef1 Mon Sep 17 00:00:00 2001 From: Neil Conway Date: Sun, 11 Dec 2005 10:54:28 +0000 Subject: [PATCH] Implement IS NOT DISTINCT FROM, update the regression tests and docs. Patch from Pavel Stehule, minor fixups by myself. --- doc/src/sgml/func.sgml | 18 +++++++++---- src/backend/parser/gram.y | 14 ++++++++++- src/test/regress/expected/select_distinct.out | 25 +++++++++++++++++++ src/test/regress/sql/select_distinct.sql | 6 +++++ 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index f3df618179..8e60ba63c8 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,5 +1,5 @@ @@ -345,16 +345,24 @@ PostgreSQL documentation IS DISTINCT FROM + + IS NOT DISTINCT FROM + The ordinary comparison operators yield null (signifying unknown) when either input is null. Another way to do comparisons is with the IS DISTINCT FROM construct: expression IS DISTINCT FROM expression +expression IS NOT DISTINCT FROM expression - For non-null inputs this is the same as the <> operator. - However, when both inputs are null it will return false, and when just - one input is null it will return true. Thus it effectively acts as though - null were a normal data value, rather than unknown. + For non-null inputs, IS DISTINCT FROM this is + the same as the <> operator. However, when both + inputs are null it will return false, and when just one input is + null it will return true. Similarly, IS NOT DISTINCT + FROM is identical to = for non-null + inputs, returns true when both inputs are null, and false + otherwise. Thus, these constructs effectively act as though null + were a normal data value, rather than unknown. diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 876e8b53ff..16fdde7b9b 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.516 2005/11/28 04:35:31 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.517 2005/12/11 10:54:27 neilc Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -6715,6 +6715,13 @@ a_expr: c_expr { $$ = $1; } { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); } + | a_expr IS NOT DISTINCT FROM a_expr %prec IS + { + $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, + (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, + "=", $1, $6)); + + } | a_expr IS OF '(' type_list ')' %prec IS { $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5); @@ -6880,6 +6887,11 @@ b_expr: c_expr { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); } + | b_expr IS NOT DISTINCT FROM b_expr %prec IS + { + $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, + NULL, (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $6)); + } | b_expr IS OF '(' type_list ')' %prec IS { $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5); diff --git a/src/test/regress/expected/select_distinct.out b/src/test/regress/expected/select_distinct.out index 019638ed17..abe34ae7ae 100644 --- a/src/test/regress/expected/select_distinct.out +++ b/src/test/regress/expected/select_distinct.out @@ -195,3 +195,28 @@ SELECT null IS DISTINCT FROM null as "no"; f (1 row) +-- ANSI SQL 2003 form +SELECT 1 IS NOT DISTINCT FROM 2 as "no"; + no +---- + f +(1 row) + +SELECT 2 IS NOT DISTINCT FROM 2 as "yes"; + yes +----- + t +(1 row) + +SELECT 2 IS NOT DISTINCT FROM null as "no"; + no +---- + f +(1 row) + +SELECT null IS NOT DISTINCT FROM null as "yes"; + yes +----- + t +(1 row) + diff --git a/src/test/regress/sql/select_distinct.sql b/src/test/regress/sql/select_distinct.sql index 94032c312e..c4a63aaf16 100644 --- a/src/test/regress/sql/select_distinct.sql +++ b/src/test/regress/sql/select_distinct.sql @@ -56,3 +56,9 @@ SELECT 1 IS DISTINCT FROM 2 as "yes"; SELECT 2 IS DISTINCT FROM 2 as "no"; SELECT 2 IS DISTINCT FROM null as "yes"; SELECT null IS DISTINCT FROM null as "no"; + +-- ANSI SQL 2003 form +SELECT 1 IS NOT DISTINCT FROM 2 as "no"; +SELECT 2 IS NOT DISTINCT FROM 2 as "yes"; +SELECT 2 IS NOT DISTINCT FROM null as "no"; +SELECT null IS NOT DISTINCT FROM null as "yes"; -- 2.49.0