From 49932adb8e626036b8d8edf26ed1465f39db82bd Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 12 Jul 2023 10:16:53 +0200 Subject: [PATCH v12] fixup! Add UPDATE/DELETE FOR PORTION OF --- doc/src/sgml/ref/delete.sgml | 2 ++ doc/src/sgml/ref/update.sgml | 2 ++ src/backend/parser/analyze.c | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/delete.sgml b/doc/src/sgml/ref/delete.sgml index 868cf0d1f9..aec593239b 100644 --- a/doc/src/sgml/ref/delete.sgml +++ b/doc/src/sgml/ref/delete.sgml @@ -55,6 +55,7 @@ Description circumstances. + The optional RETURNING clause causes DELETE diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml index f2042e0b25..62e9e0e1f0 100644 --- a/doc/src/sgml/ref/update.sgml +++ b/doc/src/sgml/ref/update.sgml @@ -52,6 +52,7 @@ Description circumstances. + The optional RETURNING clause causes UPDATE diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 0b2109d1bb..c6d2b7e1d1 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -1247,6 +1247,7 @@ transformForPortionOfClause(ParseState *pstate, char *range_name = forPortionOf->range_name; char *range_type_name = NULL; int range_attno = InvalidAttrNumber; + Form_pg_attribute attr; ForPortionOfExpr *result; List *targetList; Node *target_start, *target_end; @@ -1264,7 +1265,7 @@ transformForPortionOfClause(ParseState *pstate, range_name, RelationGetRelationName(targetrel)), parser_errposition(pstate, forPortionOf->range_name_location))); - Form_pg_attribute attr = TupleDescAttr(targetrel->rd_att, range_attno - 1); + attr = TupleDescAttr(targetrel->rd_att, range_attno - 1); // TODO: check attr->attisdropped (?), // and figure out concurrency issues with that in general. // It should work the same as updating any other column. @@ -1317,12 +1318,12 @@ transformForPortionOfClause(ParseState *pstate, * Now make sure we update the start/end time of the record. * For a range col (r) this is `r = r * targetRange`. */ - targetList = NIL; Expr *rangeSetExpr = (Expr *) makeSimpleA_Expr(AEXPR_OP, "*", (Node *) copyObject(rangeVar), (Node *) fc, forPortionOf->range_name_location); TargetEntry *tle; + targetList = NIL; rangeSetExpr = (Expr *) transformExpr(pstate, (Node *) rangeSetExpr, EXPR_KIND_UPDATE_PORTION); tle = makeTargetEntry(rangeSetExpr, range_attno, -- 2.41.0