diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-06-09 19:08:20 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-06-09 19:08:20 +0000 |
commit | 7e64dbc6b5e516a2510ae41c8c7999d1d8d25872 (patch) | |
tree | c819b78903b490e720b4c20969ed6cf8816889d1 /src/backend/nodes/readfuncs.c | |
parent | 3a0df651da253879bf133a8556853acfb1f664fd (diff) | |
download | postgresql-7e64dbc6b5e516a2510ae41c8c7999d1d8d25872.tar.gz postgresql-7e64dbc6b5e516a2510ae41c8c7999d1d8d25872.zip |
Support assignment to subfields of composite columns in UPDATE and INSERT.
As a side effect, cause subscripts in INSERT targetlists to do something
more or less sensible; previously we evaluated such subscripts and then
effectively ignored them. Another side effect is that UPDATE-ing an
element or slice of an array value that is NULL now produces a non-null
result, namely an array containing just the assigned-to positions.
Diffstat (limited to 'src/backend/nodes/readfuncs.c')
-rw-r--r-- | src/backend/nodes/readfuncs.c | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 225bf6241fa..e3fa983cea0 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.171 2004/05/30 23:40:27 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.172 2004/06/09 19:08:15 tgl Exp $ * * NOTES * Path and Plan nodes do not have any readfuncs support, because we @@ -544,6 +544,22 @@ _readFieldSelect(void) } /* + * _readFieldStore + */ +static FieldStore * +_readFieldStore(void) +{ + READ_LOCALS(FieldStore); + + READ_NODE_FIELD(arg); + READ_NODE_FIELD(newvals); + READ_NODE_FIELD(fieldnums); + READ_OID_FIELD(resulttype); + + READ_DONE(); +} + +/* * _readRelabelType */ static RelabelType * @@ -814,17 +830,6 @@ _readFromExpr(void) * Stuff from parsenodes.h. */ -static ColumnRef * -_readColumnRef(void) -{ - READ_LOCALS(ColumnRef); - - READ_NODE_FIELD(fields); - READ_NODE_FIELD(indirection); - - READ_DONE(); -} - static ColumnDef * _readColumnDef(void) { @@ -859,18 +864,6 @@ _readTypeName(void) READ_DONE(); } -static ExprFieldSelect * -_readExprFieldSelect(void) -{ - READ_LOCALS(ExprFieldSelect); - - READ_NODE_FIELD(arg); - READ_NODE_FIELD(fields); - READ_NODE_FIELD(indirection); - - READ_DONE(); -} - /* * _readRangeTblEntry */ @@ -974,6 +967,8 @@ parseNodeString(void) return_value = _readSubLink(); else if (MATCH("FIELDSELECT", 11)) return_value = _readFieldSelect(); + else if (MATCH("FIELDSTORE", 10)) + return_value = _readFieldStore(); else if (MATCH("RELABELTYPE", 11)) return_value = _readRelabelType(); else if (MATCH("CASE", 4)) @@ -1008,14 +1003,10 @@ parseNodeString(void) return_value = _readJoinExpr(); else if (MATCH("FROMEXPR", 8)) return_value = _readFromExpr(); - else if (MATCH("COLUMNREF", 9)) - return_value = _readColumnRef(); else if (MATCH("COLUMNDEF", 9)) return_value = _readColumnDef(); else if (MATCH("TYPENAME", 8)) return_value = _readTypeName(); - else if (MATCH("EXPRFIELDSELECT", 15)) - return_value = _readExprFieldSelect(); else if (MATCH("RTE", 3)) return_value = _readRangeTblEntry(); else if (MATCH("NOTIFY", 6)) |