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 $ */
2
2
3
3
/* Copyright comment */
4
4
%{
@@ -478,8 +478,8 @@ add_additional_variables(char *name, bool insert)
478
478
%type <str> ColConstraint ColConstraintElem drop_type Bconst Iresult
479
479
%type <str> TableConstraint OptTableElementList Xconst opt_transaction
480
480
%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
483
483
%type <str> access_method attr_name index_name name func_name
484
484
%type <str> file_name AexprConst c_expr ConstTypename var_list
485
485
%type <str> a_expr b_expr TruncateStmt CommentStmt OnCommitOption opt_by
@@ -545,7 +545,7 @@ add_additional_variables(char *name, bool insert)
545
545
%type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
546
546
%type <str> handler_name any_name_list any_name opt_as insert_column_list
547
547
%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
549
549
%type <str> createfunc_opt_item set_rest var_list_or_default alter_rel_cmd
550
550
%type <str> CreateFunctionStmt createfunc_opt_list func_table
551
551
%type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
@@ -577,7 +577,7 @@ add_additional_variables(char *name, bool insert)
577
577
%type <str> reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
578
578
%type <str> col_name_keyword func_name_keyword precision opt_scale
579
579
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
580
- %type <str> using_descriptor into_descriptor
580
+ %type <str> using_descriptor into_descriptor
581
581
%type <str> prepared_name struct_union_type_with_symbol OptConsTableSpace
582
582
%type <str> ECPGunreserved ECPGunreserved_interval cvariable opt_bit_field
583
583
%type <str> AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
@@ -589,8 +589,8 @@ add_additional_variables(char *name, bool insert)
589
589
%type <str> locked_rels_list opt_granted_by RevokeRoleStmt alterdb_opt_item using_clause
590
590
%type <str> GrantRoleStmt opt_asymmetric aggr_args aggr_args_list old_aggr_definition
591
591
%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
594
594
595
595
%type <struct_union> s_struct_union_symbol
596
596
@@ -3176,16 +3176,35 @@ opt_nowait: NOWAIT { $$ = make_str("nowait"); }
3176
3176
*****************************************************************************/
3177
3177
3178
3178
UpdateStmt : UPDATE relation_expr_opt_alias
3179
- SET set_opt
3179
+ SET set_clause_list
3180
3180
from_clause
3181
3181
where_clause
3182
3182
returning_clause
3183
3183
{$$ = cat_str(7 , make_str(" update" ), $2 , make_str(" set" ), $4 , $5 , $6 , $7 ); }
3184
3184
;
3185
3185
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 ); }
3189
3208
;
3190
3209
3191
3210
/* ****************************************************************************
@@ -3433,47 +3452,10 @@ locked_rels_list:
3433
3452
| /* EMPTY */ { $$ = EMPTY; }
3434
3453
;
3435
3454
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 ); }
3477
3459
;
3478
3460
3479
3461
/* ****************************************************************************
@@ -4356,9 +4338,21 @@ opt_asymmetric: ASYMMETRIC { $$ = make_str("asymmetric"); }
4356
4338
| /* EMPTY*/ { $$ = EMPTY; }
4357
4339
;
4358
4340
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
+
4359
4353
/* ****************************************************************************
4360
4354
*
4361
- * target lists for SELECT, UPDATE, INSERT
4355
+ * target lists for SELECT
4362
4356
*
4363
4357
*****************************************************************************/
4364
4358
@@ -4377,11 +4371,8 @@ target_el: a_expr AS ColLabel
4377
4371
{ $$ = make_str(" *" ); }
4378
4372
;
4379
4373
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 ')'
4385
4376
{
4386
4377
struct inf_compat_col *ptrc;
4387
4378
struct inf_compat_val *ptrv;
@@ -4404,12 +4395,10 @@ update_target_list: update_target_list ',' update_target_el
4404
4395
vals = cat_str( 3, vals, ptrv->val, make_str(")") );
4405
4396
}
4406
4397
$$ = cat_str( 3, cols, make_str("="), vals );
4407
- } */
4408
- | update_target_el
4409
- { $$ = $1 ; }
4398
+ }
4410
4399
;
4411
4400
4412
- /* inf_col_list: ColId opt_indirection
4401
+ inf_col_list: ColId opt_indirection
4413
4402
{
4414
4403
struct inf_compat_col *ptr = mm_alloc(sizeof(struct inf_compat_col));
4415
4404
@@ -4448,12 +4437,6 @@ inf_val_list: a_expr
4448
4437
;
4449
4438
*/
4450
4439
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
-
4457
4440
/* ****************************************************************************
4458
4441
*
4459
4442
* Names and constants
0 commit comments