summaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorTom Lane2004-06-09 19:08:20 +0000
committerTom Lane2004-06-09 19:08:20 +0000
commit7e64dbc6b5e516a2510ae41c8c7999d1d8d25872 (patch)
treec819b78903b490e720b4c20969ed6cf8816889d1 /src/backend/nodes
parent3a0df651da253879bf133a8556853acfb1f664fd (diff)
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')
-rw-r--r--src/backend/nodes/copyfuncs.c35
-rw-r--r--src/backend/nodes/equalfuncs.c26
-rw-r--r--src/backend/nodes/outfuncs.c85
-rw-r--r--src/backend/nodes/readfuncs.c47
4 files changed, 136 insertions, 57 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index f3086c84b16..bfcb82447d8 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.284 2004/05/30 23:40:27 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.285 2004/06/09 19:08:15 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -845,6 +845,22 @@ _copyFieldSelect(FieldSelect *from)
}
/*
+ * _copyFieldStore
+ */
+static FieldStore *
+_copyFieldStore(FieldStore *from)
+{
+ FieldStore *newnode = makeNode(FieldStore);
+
+ COPY_NODE_FIELD(arg);
+ COPY_NODE_FIELD(newvals);
+ COPY_NODE_FIELD(fieldnums);
+ COPY_SCALAR_FIELD(resulttype);
+
+ return newnode;
+}
+
+/*
* _copyRelabelType
*/
static RelabelType *
@@ -1275,7 +1291,6 @@ _copyColumnRef(ColumnRef *from)
ColumnRef *newnode = makeNode(ColumnRef);
COPY_NODE_FIELD(fields);
- COPY_NODE_FIELD(indirection);
return newnode;
}
@@ -1286,8 +1301,6 @@ _copyParamRef(ParamRef *from)
ParamRef *newnode = makeNode(ParamRef);
COPY_SCALAR_FIELD(number);
- COPY_NODE_FIELD(fields);
- COPY_NODE_FIELD(indirection);
return newnode;
}
@@ -1347,13 +1360,12 @@ _copyAIndices(A_Indices *from)
return newnode;
}
-static ExprFieldSelect *
-_copyExprFieldSelect(ExprFieldSelect *from)
+static A_Indirection *
+_copyA_Indirection(A_Indirection *from)
{
- ExprFieldSelect *newnode = makeNode(ExprFieldSelect);
+ A_Indirection *newnode = makeNode(A_Indirection);
COPY_NODE_FIELD(arg);
- COPY_NODE_FIELD(fields);
COPY_NODE_FIELD(indirection);
return newnode;
@@ -2648,6 +2660,9 @@ copyObject(void *from)
case T_FieldSelect:
retval = _copyFieldSelect(from);
break;
+ case T_FieldStore:
+ retval = _copyFieldStore(from);
+ break;
case T_RelabelType:
retval = _copyRelabelType(from);
break;
@@ -2984,8 +2999,8 @@ copyObject(void *from)
case T_A_Indices:
retval = _copyAIndices(from);
break;
- case T_ExprFieldSelect:
- retval = _copyExprFieldSelect(from);
+ case T_A_Indirection:
+ retval = _copyA_Indirection(from);
break;
case T_ResTarget:
retval = _copyResTarget(from);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index ca2511ea095..fec550836b3 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -18,7 +18,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.223 2004/05/30 23:40:27 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.224 2004/06/09 19:08:15 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -351,6 +351,17 @@ _equalFieldSelect(FieldSelect *a, FieldSelect *b)
}
static bool
+_equalFieldStore(FieldStore *a, FieldStore *b)
+{
+ COMPARE_NODE_FIELD(arg);
+ COMPARE_NODE_FIELD(newvals);
+ COMPARE_NODE_FIELD(fieldnums);
+ COMPARE_SCALAR_FIELD(resulttype);
+
+ return true;
+}
+
+static bool
_equalRelabelType(RelabelType *a, RelabelType *b)
{
COMPARE_NODE_FIELD(arg);
@@ -1428,7 +1439,6 @@ static bool
_equalColumnRef(ColumnRef *a, ColumnRef *b)
{
COMPARE_NODE_FIELD(fields);
- COMPARE_NODE_FIELD(indirection);
return true;
}
@@ -1437,8 +1447,6 @@ static bool
_equalParamRef(ParamRef *a, ParamRef *b)
{
COMPARE_SCALAR_FIELD(number);
- COMPARE_NODE_FIELD(fields);
- COMPARE_NODE_FIELD(indirection);
return true;
}
@@ -1474,10 +1482,9 @@ _equalAIndices(A_Indices *a, A_Indices *b)
}
static bool
-_equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
+_equalA_Indirection(A_Indirection *a, A_Indirection *b)
{
COMPARE_NODE_FIELD(arg);
- COMPARE_NODE_FIELD(fields);
COMPARE_NODE_FIELD(indirection);
return true;
@@ -1805,6 +1812,9 @@ equal(void *a, void *b)
case T_FieldSelect:
retval = _equalFieldSelect(a, b);
break;
+ case T_FieldStore:
+ retval = _equalFieldStore(a, b);
+ break;
case T_RelabelType:
retval = _equalRelabelType(a, b);
break;
@@ -2127,8 +2137,8 @@ equal(void *a, void *b)
case T_A_Indices:
retval = _equalAIndices(a, b);
break;
- case T_ExprFieldSelect:
- retval = _equalExprFieldSelect(a, b);
+ case T_A_Indirection:
+ retval = _equalA_Indirection(a, b);
break;
case T_ResTarget:
retval = _equalResTarget(a, b);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index cb6964c2d88..1984ced756f 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.238 2004/05/30 23:40:27 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.239 2004/06/09 19:08:15 tgl Exp $
*
* NOTES
* Every node type that can appear in stored rules' parsetrees *must*
@@ -746,6 +746,17 @@ _outFieldSelect(StringInfo str, FieldSelect *node)
}
static void
+_outFieldStore(StringInfo str, FieldStore *node)
+{
+ WRITE_NODE_TYPE("FIELDSTORE");
+
+ WRITE_NODE_FIELD(arg);
+ WRITE_NODE_FIELD(newvals);
+ WRITE_NODE_FIELD(fieldnums);
+ WRITE_OID_FIELD(resulttype);
+}
+
+static void
_outRelabelType(StringInfo str, RelabelType *node)
{
WRITE_NODE_TYPE("RELABELTYPE");
@@ -1166,8 +1177,24 @@ _outSelectStmt(StringInfo str, SelectStmt *node)
{
WRITE_NODE_TYPE("SELECT");
- /* XXX this is pretty durn incomplete */
WRITE_NODE_FIELD(whereClause);
+ WRITE_NODE_FIELD(distinctClause);
+ WRITE_NODE_FIELD(into);
+ WRITE_NODE_FIELD(intoColNames);
+ WRITE_ENUM_FIELD(intoHasOids, ContainsOids);
+ WRITE_NODE_FIELD(targetList);
+ WRITE_NODE_FIELD(fromClause);
+ WRITE_NODE_FIELD(whereClause);
+ WRITE_NODE_FIELD(groupClause);
+ WRITE_NODE_FIELD(havingClause);
+ WRITE_NODE_FIELD(sortClause);
+ WRITE_NODE_FIELD(limitOffset);
+ WRITE_NODE_FIELD(limitCount);
+ WRITE_NODE_FIELD(forUpdate);
+ WRITE_ENUM_FIELD(op, SetOperation);
+ WRITE_BOOL_FIELD(all);
+ WRITE_NODE_FIELD(larg);
+ WRITE_NODE_FIELD(rarg);
}
static void
@@ -1182,6 +1209,15 @@ _outFuncCall(StringInfo str, FuncCall *node)
}
static void
+_outDefElem(StringInfo str, DefElem *node)
+{
+ WRITE_NODE_TYPE("DEFELEM");
+
+ WRITE_STRING_FIELD(defname);
+ WRITE_NODE_FIELD(arg);
+}
+
+static void
_outColumnDef(StringInfo str, ColumnDef *node)
{
WRITE_NODE_TYPE("COLUMNDEF");
@@ -1439,7 +1475,6 @@ _outColumnRef(StringInfo str, ColumnRef *node)
WRITE_NODE_TYPE("COLUMNREF");
WRITE_NODE_FIELD(fields);
- WRITE_NODE_FIELD(indirection);
}
static void
@@ -1448,30 +1483,46 @@ _outParamRef(StringInfo str, ParamRef *node)
WRITE_NODE_TYPE("PARAMREF");
WRITE_INT_FIELD(number);
- WRITE_NODE_FIELD(fields);
- WRITE_NODE_FIELD(indirection);
}
static void
_outAConst(StringInfo str, A_Const *node)
{
- WRITE_NODE_TYPE("CONST ");
+ WRITE_NODE_TYPE("A_CONST");
_outValue(str, &(node->val));
WRITE_NODE_FIELD(typename);
}
static void
-_outExprFieldSelect(StringInfo str, ExprFieldSelect *node)
+_outA_Indices(StringInfo str, A_Indices *node)
{
- WRITE_NODE_TYPE("EXPRFIELDSELECT");
+ WRITE_NODE_TYPE("A_INDICES");
+
+ WRITE_NODE_FIELD(lidx);
+ WRITE_NODE_FIELD(uidx);
+}
+
+static void
+_outA_Indirection(StringInfo str, A_Indirection *node)
+{
+ WRITE_NODE_TYPE("A_INDIRECTION");
WRITE_NODE_FIELD(arg);
- WRITE_NODE_FIELD(fields);
WRITE_NODE_FIELD(indirection);
}
static void
+_outResTarget(StringInfo str, ResTarget *node)
+{
+ WRITE_NODE_TYPE("RESTARGET");
+
+ WRITE_STRING_FIELD(name);
+ WRITE_NODE_FIELD(indirection);
+ WRITE_NODE_FIELD(val);
+}
+
+static void
_outConstraint(StringInfo str, Constraint *node)
{
WRITE_NODE_TYPE("CONSTRAINT");
@@ -1666,6 +1717,9 @@ _outNode(StringInfo str, void *obj)
case T_FieldSelect:
_outFieldSelect(str, obj);
break;
+ case T_FieldStore:
+ _outFieldStore(str, obj);
+ break;
case T_RelabelType:
_outRelabelType(str, obj);
break;
@@ -1815,8 +1869,14 @@ _outNode(StringInfo str, void *obj)
case T_A_Const:
_outAConst(str, obj);
break;
- case T_ExprFieldSelect:
- _outExprFieldSelect(str, obj);
+ case T_A_Indices:
+ _outA_Indices(str, obj);
+ break;
+ case T_A_Indirection:
+ _outA_Indirection(str, obj);
+ break;
+ case T_ResTarget:
+ _outResTarget(str, obj);
break;
case T_Constraint:
_outConstraint(str, obj);
@@ -1827,6 +1887,9 @@ _outNode(StringInfo str, void *obj)
case T_FuncCall:
_outFuncCall(str, obj);
break;
+ case T_DefElem:
+ _outDefElem(str, obj);
+ break;
default:
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))