diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-09-28 20:51:43 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-09-28 20:51:43 +0000 |
| commit | f213131f2024bcb85aea7d2a7dfadef6a0ee1b31 (patch) | |
| tree | 090a85694dfd64f735732bc49b8489835186d83b /src/include | |
| parent | d3aa4a8e33bee5e5274615cfd461aac810d7bbc1 (diff) | |
| download | postgresql-f213131f2024bcb85aea7d2a7dfadef6a0ee1b31.tar.gz | |
Fix IS NULL and IS NOT NULL tests on row-valued expressions to conform to
the SQL spec, viz IS NULL is true if all the row's fields are null, IS NOT
NULL is true if all the row's fields are not null. The former coding got
this right for a limited number of cases with IS NULL (ie, those where it
could disassemble a ROW constructor at parse time), but was entirely wrong
for IS NOT NULL. Per report from Teodor.
I desisted from changing the behavior for arrays, since on closer inspection
it's not clear that there's any support for that in the SQL spec. This
probably needs more consideration.
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/nodes/execnodes.h | 15 | ||||
| -rw-r--r-- | src/include/nodes/nodes.h | 3 | ||||
| -rw-r--r-- | src/include/nodes/primnodes.h | 9 | ||||
| -rw-r--r-- | src/include/utils/lsyscache.h | 3 |
4 files changed, 24 insertions, 6 deletions
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 35ee8a20d0..5cbe5a5428 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.160 2006/08/25 04:06:56 tgl Exp $ + * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.161 2006/09/28 20:51:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -706,6 +706,19 @@ typedef struct MinMaxExprState } MinMaxExprState; /* ---------------- + * NullTestState node + * ---------------- + */ +typedef struct NullTestState +{ + ExprState xprstate; + ExprState *arg; /* input expression */ + bool argisrow; /* T if input is of a composite type */ + /* used only if argisrow: */ + TupleDesc argdesc; /* tupdesc for most recent input */ +} NullTestState; + +/* ---------------- * CoerceToDomainState node * ---------------- */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index eb31fd2b6e..c7abfba91a 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.187 2006/08/02 01:59:47 joe Exp $ + * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.188 2006/09/28 20:51:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -165,6 +165,7 @@ typedef enum NodeTag T_RowCompareExprState, T_CoalesceExprState, T_MinMaxExprState, + T_NullTestState, T_CoerceToDomainState, T_DomainConstraintState, diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 17c3a894b0..c84bab9287 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -10,7 +10,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.115 2006/07/27 19:52:07 tgl Exp $ + * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.116 2006/09/28 20:51:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -717,9 +717,12 @@ typedef OpExpr NullIfExpr; * NullTest * * NullTest represents the operation of testing a value for NULLness. - * Currently, we only support scalar input values, but eventually a - * row-constructor input should be supported. * The appropriate test is performed and returned as a boolean Datum. + * + * NOTE: the semantics of this for rowtype inputs are noticeably different + * from the scalar case. It would probably be a good idea to include an + * "argisrow" flag in the struct to reflect that, but for the moment, + * we do not do so to avoid forcing an initdb during 8.2beta. * ---------------- */ diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index ad2d9e30a6..208cba3047 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.105 2006/07/13 17:47:02 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.106 2006/09/28 20:51:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -90,6 +90,7 @@ extern void get_type_io_data(Oid typid, extern char get_typstorage(Oid typid); extern Node *get_typdefault(Oid typid); extern char get_typtype(Oid typid); +extern bool type_is_rowtype(Oid typid); extern Oid get_typ_typrelid(Oid typid); extern Oid get_element_type(Oid typid); extern Oid get_array_type(Oid typid); |
