|
11 | 11 | *
|
12 | 12 | *
|
13 | 13 | * IDENTIFICATION
|
14 |
| - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.560 2006/09/0218:17:17 momjian Exp $ |
| 14 | + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.561 2006/09/0220:34:47 momjian Exp $ |
15 | 15 | *
|
16 | 16 | * HISTORY
|
17 | 17 | * AUTHORDATEMAJOR EVENT
|
@@ -237,7 +237,8 @@ static void doNegateFloat(Value *v);
|
237 | 237 | name_listfrom_clausefrom_listopt_array_bounds
|
238 | 238 | qualified_name_listany_nameany_name_list
|
239 | 239 | any_operatorexpr_listattrs
|
240 |
| -target_listupdate_target_listinsert_column_list |
| 240 | +target_listupdate_col_listupdate_target_list |
| 241 | +update_value_listinsert_column_list |
241 | 242 | values_listdef_listindirectionopt_indirection
|
242 | 243 | group_clauseTriggerFuncArgsselect_limit
|
243 | 244 | opt_select_limitopclass_item_list
|
@@ -308,7 +309,8 @@ static void doNegateFloat(Value *v);
|
308 | 309 | %type<jexpr>joined_table
|
309 | 310 | %type<range>relation_expr
|
310 | 311 | %type<range>relation_expr_opt_alias
|
311 |
| -%type<target>target_elupdate_target_elinsert_column_item |
| 312 | +%type<target>target_elupdate_target_elupdate_col_list_elinsert_column_item |
| 313 | +%type<list>update_target_lists_listupdate_target_lists_el |
312 | 314 |
|
313 | 315 | %type<typnam>TypenameSimpleTypenameConstTypename
|
314 | 316 | GenericTypeNumericopt_float
|
@@ -5537,6 +5539,20 @@ UpdateStmt: UPDATE relation_expr_opt_alias
|
5537 | 5539 | n->returningList =$7;
|
5538 | 5540 | $$ = (Node *)n;
|
5539 | 5541 | }
|
| 5542 | + | UPDATE relation_expr_opt_alias |
| 5543 | +SET update_target_lists_list |
| 5544 | +from_clause |
| 5545 | +where_clause |
| 5546 | +returning_clause |
| 5547 | +{ |
| 5548 | +UpdateStmt *n = makeNode(UpdateStmt); |
| 5549 | +n->relation =$2; |
| 5550 | +n->targetList =$4; |
| 5551 | +n->fromClause =$5; |
| 5552 | +n->whereClause =$6; |
| 5553 | +n->returningList =$7; |
| 5554 | +$$ = (Node *)n; |
| 5555 | +} |
5540 | 5556 | ;
|
5541 | 5557 |
|
5542 | 5558 |
|
@@ -5941,6 +5957,60 @@ values_item:
|
5941 | 5957 | | DEFAULT{$$ = (Node *) makeNode(SetToDefault); }
|
5942 | 5958 | ;
|
5943 | 5959 |
|
| 5960 | +update_target_lists_list: |
| 5961 | +update_target_lists_el {$$ =$1; } |
| 5962 | +| update_target_lists_list',' update_target_lists_el {$$ = list_concat($1,$3); } |
| 5963 | +; |
| 5964 | + |
| 5965 | +update_target_lists_el: |
| 5966 | +'(' update_col_list')''=''(' update_value_list')' |
| 5967 | +{ |
| 5968 | +ListCell *col_cell; |
| 5969 | +ListCell *val_cell; |
| 5970 | + |
| 5971 | +if (list_length($2) != list_length($6)) |
| 5972 | +{ |
| 5973 | +ereport(ERROR, |
| 5974 | +(errcode(ERRCODE_SYNTAX_ERROR), |
| 5975 | + errmsg("number of columns does not match to number of values"))); |
| 5976 | +} |
| 5977 | + |
| 5978 | +for (col_cell = list_head($2), val_cell = list_head($6); |
| 5979 | + col_cell !=NULL && val_cell !=NULL; |
| 5980 | + col_cell = lnext(col_cell), val_cell = lnext(val_cell)) |
| 5981 | +{ |
| 5982 | +/* merge update_value_list with update_col_list*/ |
| 5983 | +ResTarget *res_col = (ResTarget *) lfirst(col_cell); |
| 5984 | +ResTarget *res_val = (ResTarget *) lfirst(val_cell); |
| 5985 | + |
| 5986 | +res_col->val = (Node *)copyObject(res_val); |
| 5987 | +} |
| 5988 | + |
| 5989 | +$$ =$2; |
| 5990 | +} |
| 5991 | +; |
| 5992 | + |
| 5993 | +update_col_list: |
| 5994 | +update_col_list_el {$$ = list_make1($1); } |
| 5995 | +| update_col_list',' update_col_list_el {$$ = lappend($1,$3); } |
| 5996 | +; |
| 5997 | + |
| 5998 | +update_col_list_el: |
| 5999 | +ColId opt_indirection |
| 6000 | +{ |
| 6001 | +$$ = makeNode(ResTarget); |
| 6002 | +$$->name =$1; |
| 6003 | +$$->indirection =$2; |
| 6004 | +$$->val =NULL; |
| 6005 | +$$->location =@1; |
| 6006 | +} |
| 6007 | +; |
| 6008 | + |
| 6009 | +update_value_list: |
| 6010 | +values_item {$$ = list_make1($1); } |
| 6011 | +| update_value_list',' values_item {$$ = lappend($1,$3); } |
| 6012 | +; |
| 6013 | + |
5944 | 6014 |
|
5945 | 6015 | /*****************************************************************************
|
5946 | 6016 | *
|
@@ -8253,7 +8323,7 @@ target_el:a_expr AS ColLabel
|
8253 | 8323 | ;
|
8254 | 8324 |
|
8255 | 8325 | update_target_list:
|
8256 |
| -update_target_el{$$ = list_make1($1); } |
| 8326 | +update_target_el{$$ = list_make1($1); } |
8257 | 8327 | | update_target_list',' update_target_el {$$ = lappend($1,$3); }
|
8258 | 8328 | ;
|
8259 | 8329 |
|
|