diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y new file mode 100644 index 4c83a63..b5f4ccf *** a/src/backend/parser/gram.y --- b/src/backend/parser/gram.y *************** set_clause: *** 10694,10712 **** $1->val = (Node *) $3; $$ = list_make1($1); } ! | '(' set_target_list ')' '=' a_expr { ! int ncolumns = list_length($2); int i = 1; ListCell *col_cell; /* Create a MultiAssignRef source for each target */ foreach(col_cell, $2) { ResTarget *res_col = (ResTarget *) lfirst(col_cell); MultiAssignRef *r = makeNode(MultiAssignRef); ! r->source = (Node *) $5; r->colno = i; r->ncolumns = ncolumns; res_col->val = (Node *) r; --- 10694,10720 ---- $1->val = (Node *) $3; $$ = list_make1($1); } ! | '(' set_target ')' '=' a_expr { ! $2->val = (Node *) $5; ! $$ = list_make1($2); ! } ! | '(' set_target_list ',' set_target ')' '=' a_expr ! { ! int ncolumns; int i = 1; ListCell *col_cell; + $2 = lappend($2,$4); + ncolumns = list_length($2); + /* Create a MultiAssignRef source for each target */ foreach(col_cell, $2) { ResTarget *res_col = (ResTarget *) lfirst(col_cell); MultiAssignRef *r = makeNode(MultiAssignRef); ! r->source = (Node *) $7; r->colno = i; r->ncolumns = ncolumns; res_col->val = (Node *) r; diff --git a/src/test/regress/expected/update.out b/src/test/regress/expected/update.out new file mode 100644 index cef70b1..90d33ad *** a/src/test/regress/expected/update.out --- b/src/test/regress/expected/update.out *************** SELECT * FROM update_test; *** 76,82 **** 100 | 21 | (4 rows) ! UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; SELECT * FROM update_test; a | b | c -----+----+------- --- 76,93 ---- 100 | 21 | (4 rows) ! -- parenthesized single column should be valid ! UPDATE update_test SET (c) = ('bungle') WHERE c = 'foo'; ! SELECT * FROM update_test; ! a | b | c ! -----+----+-------- ! 100 | 20 | ! 100 | 21 | ! 100 | 20 | bungle ! 100 | 21 | bungle ! (4 rows) ! ! UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'bungle'; SELECT * FROM update_test; a | b | c -----+----+------- diff --git a/src/test/regress/sql/update.sql b/src/test/regress/sql/update.sql new file mode 100644 index 66d1fec..0ed5f6a *** a/src/test/regress/sql/update.sql --- b/src/test/regress/sql/update.sql *************** UPDATE update_test SET a = v.* FROM (VAL *** 51,57 **** INSERT INTO update_test SELECT a,b+1,c FROM update_test; SELECT * FROM update_test; ! UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; SELECT * FROM update_test; UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; SELECT * FROM update_test; --- 51,60 ---- INSERT INTO update_test SELECT a,b+1,c FROM update_test; SELECT * FROM update_test; ! -- parenthesized single column should be valid ! UPDATE update_test SET (c) = ('bungle') WHERE c = 'foo'; ! SELECT * FROM update_test; ! UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'bungle'; SELECT * FROM update_test; UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; SELECT * FROM update_test;