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;
