File tree 3 files changed +52
-4
lines changed
3 files changed +52
-4
lines changed Original file line number Diff line number Diff line change @@ -2404,11 +2404,15 @@ pub enum Statement {
2404
2404
/// Note: this is a PostgreSQL-specific statement.
2405
2405
Deallocate { name : Ident , prepare : bool } ,
2406
2406
/// ```sql
2407
- /// EXECUTE name [ ( parameter [, ...] ) ]
2407
+ /// EXECUTE name [ ( parameter [, ...] ) ] [USING <expr>]
2408
2408
/// ```
2409
2409
///
2410
2410
/// Note: this is a PostgreSQL-specific statement.
2411
- Execute { name : Ident , parameters : Vec < Expr > } ,
2411
+ Execute {
2412
+ name : Ident ,
2413
+ parameters : Vec < Expr > ,
2414
+ using : Vec < Expr > ,
2415
+ } ,
2412
2416
/// ```sql
2413
2417
/// PREPARE name [ ( data_type [, ...] ) ] AS statement
2414
2418
/// ```
@@ -3824,11 +3828,18 @@ impl fmt::Display for Statement {
3824
3828
prepare = if * prepare { "PREPARE " } else { "" } ,
3825
3829
name = name,
3826
3830
) ,
3827
- Statement :: Execute { name, parameters } => {
3831
+ Statement :: Execute {
3832
+ name,
3833
+ parameters,
3834
+ using,
3835
+ } => {
3828
3836
write ! ( f, "EXECUTE {name}" ) ?;
3829
3837
if !parameters. is_empty ( ) {
3830
3838
write ! ( f, "({})" , display_comma_separated( parameters) ) ?;
3831
3839
}
3840
+ if !using. is_empty ( ) {
3841
+ write ! ( f, " USING {}" , display_comma_separated( using) ) ?;
3842
+ } ;
3832
3843
Ok ( ( ) )
3833
3844
}
3834
3845
Statement :: Prepare {
Original file line number Diff line number Diff line change @@ -8948,7 +8948,20 @@ impl<'a> Parser<'a> {
8948
8948
self . expect_token ( & Token :: RParen ) ?;
8949
8949
}
8950
8950
8951
- Ok ( Statement :: Execute { name, parameters } )
8951
+ let mut using = vec ! [ ] ;
8952
+ if self . parse_keyword ( Keyword :: USING ) {
8953
+ using. push ( self . parse_expr ( ) ?) ;
8954
+
8955
+ while self . consume_token ( & Token :: Comma ) {
8956
+ using. push ( self . parse_expr ( ) ?) ;
8957
+ }
8958
+ } ;
8959
+
8960
+ Ok ( Statement :: Execute {
8961
+ name,
8962
+ parameters,
8963
+ using,
8964
+ } )
8952
8965
}
8953
8966
8954
8967
pub fn parse_prepare ( & mut self ) -> Result < Statement , ParserError > {
Original file line number Diff line number Diff line change @@ -1421,6 +1421,7 @@ fn parse_execute() {
1421
1421
Statement :: Execute {
1422
1422
name: "a" . into( ) ,
1423
1423
parameters: vec![ ] ,
1424
+ using: vec![ ]
1424
1425
}
1425
1426
) ;
1426
1427
@@ -1433,6 +1434,29 @@ fn parse_execute() {
1433
1434
Expr :: Value ( number( "1" ) ) ,
1434
1435
Expr :: Value ( Value :: SingleQuotedString ( "t" . to_string( ) ) )
1435
1436
] ,
1437
+ using: vec![ ]
1438
+ }
1439
+ ) ;
1440
+
1441
+ let stmt = pg_and_generic ( )
1442
+ . verified_stmt ( "EXECUTE a USING CAST(1337 AS SMALLINT), CAST(7331 AS SMALLINT)" ) ;
1443
+ assert_eq ! (
1444
+ stmt,
1445
+ Statement :: Execute {
1446
+ name: "a" . into( ) ,
1447
+ parameters: vec![ ] ,
1448
+ using: vec![
1449
+ Expr :: Cast {
1450
+ expr: Box :: new( Expr :: Value ( Value :: Number ( "1337" . parse( ) . unwrap( ) , false ) ) ) ,
1451
+ data_type: DataType :: SmallInt ( None ) ,
1452
+ format: None
1453
+ } ,
1454
+ Expr :: Cast {
1455
+ expr: Box :: new( Expr :: Value ( Value :: Number ( "7331" . parse( ) . unwrap( ) , false ) ) ) ,
1456
+ data_type: DataType :: SmallInt ( None ) ,
1457
+ format: None
1458
+ } ,
1459
+ ]
1436
1460
}
1437
1461
) ;
1438
1462
}
You can’t perform that action at this time.
0 commit comments