1- /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.336 2006/09/03 19:30:43 tgl Exp $*/
1+ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.337 2006/09/05 10:00:52 meskes Exp $*/
22
33/* Copyright comment*/
44%{
@@ -478,8 +478,8 @@ add_additional_variables(char *name, bool insert)
478478%type <str> ColConstraint ColConstraintElem drop_type Bconst Iresult
479479%type <str> TableConstraint OptTableElementList Xconst opt_transaction
480480%type <str> ConstraintElem key_actions ColQualList type_name
481- %type <str> target_list target_el update_target_list alias_clause
482- %type <str> update_target_el qualified_name database_name alter_using
481+ %type <str> target_list target_el alias_clause
482+ %type <str> qualified_name database_name alter_using
483483%type <str> access_method attr_name index_name name func_name
484484%type <str> file_name AexprConst c_expr ConstTypename var_list
485485%type <str> a_expr b_expr TruncateStmt CommentStmt OnCommitOption opt_by
@@ -545,7 +545,7 @@ add_additional_variables(char *name, bool insert)
545545%type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
546546%type <str> handler_name any_name_list any_name opt_as insert_column_list
547547%type <str> columnref function_name values_clause AllConstVar
548- %type <str> values_list insert_column_item DropRuleStmt values_item
548+ %type <str> insert_column_item DropRuleStmt ctext_expr
549549%type <str> createfunc_opt_item set_rest var_list_or_default alter_rel_cmd
550550%type <str> CreateFunctionStmt createfunc_opt_list func_table
551551%type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
@@ -577,7 +577,7 @@ add_additional_variables(char *name, bool insert)
577577%type <str> reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
578578%type <str> col_name_keyword func_name_keyword precision opt_scale
579579%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
580- %type <str> using_descriptor into_descriptor
580+ %type <str> using_descriptor into_descriptor
581581%type <str> prepared_name struct_union_type_with_symbol OptConsTableSpace
582582%type <str> ECPGunreserved ECPGunreserved_interval cvariable opt_bit_field
583583%type <str> AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
@@ -589,8 +589,8 @@ add_additional_variables(char *name, bool insert)
589589%type <str> locked_rels_list opt_granted_by RevokeRoleStmt alterdb_opt_item using_clause
590590%type <str> GrantRoleStmt opt_asymmetric aggr_args aggr_args_list old_aggr_definition
591591%type <str> old_aggr_elem for_locking_items TableLikeOptionList TableLikeOption
592- %type <str> update_target_lists_list set_opt update_target_lists_el update_col_list
593- %type <str> update_value_list update_col_list_el
592+ %type <str> set_target_list set_clause_list set_clause multiple_set_clause
593+ %type <str> ctext_expr_list ctext_row single_set_clause set_target
594594
595595%type <struct_union> s_struct_union_symbol
596596
@@ -3176,16 +3176,35 @@ opt_nowait: NOWAIT { $$ = make_str("nowait"); }
31763176 *****************************************************************************/
31773177
31783178UpdateStmt :UPDATE relation_expr_opt_alias
3179- SET set_opt
3179+ SET set_clause_list
31803180from_clause
31813181where_clause
31823182returning_clause
31833183{$$ = cat_str(7 , make_str(" update" ),$2 , make_str(" set" ),$4 ,$5 ,$6 ,$7 ); }
31843184;
31853185
3186- set_opt :
3187- update_target_list {$$ =$1 ; }
3188- | update_target_lists_list {$$ =$1 ; }
3186+ set_clause_list :
3187+ set_clause {$$ =$1 ; }
3188+ | set_clause_list ' ,' set_clause {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3189+ ;
3190+
3191+ set_clause :
3192+ single_set_clause {$$ =$1 ; }
3193+ | multiple_set_clause {$$ =$1 ; }
3194+ ;
3195+
3196+ single_set_clause :
3197+ set_target ' =' ctext_expr {$$ = cat_str(3 ,$1 , make_str(" =" ),$3 ); };
3198+
3199+ multiple_set_clause :
3200+ ' (' set_target_list ' )' ' =' ctext_row {$$ = cat_str(4 , make_str(" (" ),$2 , make_str(" )=" ),$5 ); };
3201+
3202+ set_target :
3203+ ColId opt_indirection {$$ = cat2_str($1 ,$2 ); };
3204+
3205+ set_target_list :
3206+ set_target {$$ =$1 ; }
3207+ | set_target_list ' ,' set_target {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
31893208;
31903209
31913210/* ****************************************************************************
@@ -3433,47 +3452,10 @@ locked_rels_list:
34333452| /* EMPTY*/ {$$ = EMPTY; }
34343453;
34353454
3436- values_clause :VALUES ' (' values_list ' )'
3437- {$$ = cat_str(3 , make_str(" values(" ),$3 , make_str(" )" )); }
3438- | values_clause ' ,' ' (' values_list ' )'
3439- {$$ = cat_str(4 ,$1 , make_str(" , (" ),$4 , make_str(" )" )); }
3440- ;
3441-
3442- values_list :values_item {$$ =$1 ; }
3443- | values_list ' ,' values_item {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3444- ;
3445-
3446- values_item :a_expr {$$ =$1 ; }
3447- | DEFAULT {$$ = make_str(" DEFAULT" ); }
3448- ;
3449-
3450- update_target_lists_list :
3451- update_target_lists_el {$$ =$1 ; }
3452- | update_target_lists_list ' ,' update_target_lists_el {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3453- ;
3454-
3455- update_target_lists_el :
3456- ' (' update_col_list ' )' ' =' ' (' update_value_list ' )'
3457- {
3458- $$ = cat_str(5 , make_str(" (" ),$2 , make_str(" )=(" ),$6 , make_str(" )" ));
3459- }
3460- ;
3461-
3462- update_col_list :
3463- update_col_list_el {$$ =$1 ; }
3464- | update_col_list ' ,' update_col_list_el {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3465- ;
3466-
3467- update_col_list_el :
3468- ColId opt_indirection
3469- {
3470- $$ = cat2_str($1 ,$2 );
3471- }
3472- ;
3473-
3474- update_value_list :
3475- values_item {$$ =$1 ; }
3476- | update_value_list ' ,' values_item {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3455+ values_clause :VALUES ctext_row
3456+ {$$ = cat2_str(make_str(" values" ),$2 ); }
3457+ | values_clause ' ,' ctext_row
3458+ {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
34773459;
34783460
34793461/* ****************************************************************************
@@ -4356,9 +4338,21 @@ opt_asymmetric: ASYMMETRIC{ $$ = make_str("asymmetric"); }
43564338| /* EMPTY*/ {$$ = EMPTY; }
43574339;
43584340
4341+ ctext_expr :
4342+ a_expr {$$ =$1 ; }
4343+ | DEFAULT {$$ = make_str(" default" ); }
4344+ ;
4345+
4346+ ctext_expr_list :
4347+ ctext_expr {$$ =$1 ; }
4348+ | ctext_expr_list ' ,' ctext_expr {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
4349+ ;
4350+
4351+ ctext_row :' (' ctext_expr_list ' )' {$$ = cat_str(3 , make_str(" (" ),$2 , make_str(" )" ));};
4352+
43594353/* ****************************************************************************
43604354 *
4361- *target lists for SELECT, UPDATE, INSERT
4355+ *target lists for SELECT
43624356 *
43634357 *****************************************************************************/
43644358
@@ -4377,11 +4371,8 @@ target_el:a_expr AS ColLabel
43774371{$$ = make_str(" *" ); }
43784372;
43794373
4380- /* Target list as found in UPDATE table SET ...*/
4381- update_target_list :update_target_list ' ,' update_target_el
4382- {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 );}
4383- /* INFORMIX workaround, no longer needed
4384- | '(' inf_col_list ')' '=' '(' inf_val_list ')'
4374+ /* INFORMIX workaround, no longer needed
4375+ update_target_list: '(' inf_col_list ')' '=' '(' inf_val_list ')'
43854376{
43864377struct inf_compat_col *ptrc;
43874378struct inf_compat_val *ptrv;
@@ -4404,12 +4395,10 @@ update_target_list: update_target_list ',' update_target_el
44044395vals = cat_str( 3, vals, ptrv->val, make_str(")") );
44054396}
44064397$$ = cat_str( 3, cols, make_str("="), vals );
4407- }*/
4408- | update_target_el
4409- {$$ =$1 ;}
4398+ }
44104399;
44114400
4412- /* inf_col_list: ColId opt_indirection
4401+ inf_col_list: ColId opt_indirection
44134402{
44144403struct inf_compat_col *ptr = mm_alloc(sizeof(struct inf_compat_col));
44154404
@@ -4448,12 +4437,6 @@ inf_val_list: a_expr
44484437;
44494438*/
44504439
4451- update_target_el :ColId opt_indirection ' =' a_expr
4452- {$$ = cat_str(4 ,$1 ,$2 , make_str(" =" ),$4 ); }
4453- | ColId opt_indirection ' =' DEFAULT
4454- {$$ = cat_str(3 ,$1 ,$2 , make_str(" = default" )); }
4455- ;
4456-
44574440/* ****************************************************************************
44584441 *
44594442 * Names and constants