From 7e64dbc6b5e516a2510ae41c8c7999d1d8d25872 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 9 Jun 2004 19:08:20 +0000 Subject: 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. --- src/backend/nodes/readfuncs.c | 47 +++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) (limited to 'src/backend/nodes/readfuncs.c') diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 225bf6241f..e3fa983cea 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 @@ -543,6 +543,22 @@ _readFieldSelect(void) READ_DONE(); } +/* + * _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 */ @@ -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)) -- cgit v1.2.1