File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -2404,11 +2404,15 @@ pub enum Statement {
24042404 /// Note: this is a PostgreSQL-specific statement.
24052405 Deallocate { name : Ident , prepare : bool } ,
24062406 /// ```sql
2407- /// EXECUTE name [ ( parameter [, ...] ) ]
2407+ /// EXECUTE name [ ( parameter [, ...] ) ] [USING <expr>]
24082408 /// ```
24092409 ///
24102410 /// 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+ } ,
24122416 /// ```sql
24132417 /// PREPARE name [ ( data_type [, ...] ) ] AS statement
24142418 /// ```
@@ -3824,11 +3828,18 @@ impl fmt::Display for Statement {
38243828 prepare = if * prepare { "PREPARE " } else { "" } ,
38253829 name = name,
38263830 ) ,
3827- Statement :: Execute { name, parameters } => {
3831+ Statement :: Execute {
3832+ name,
3833+ parameters,
3834+ using,
3835+ } => {
38283836 write ! ( f, "EXECUTE {name}" ) ?;
38293837 if !parameters. is_empty ( ) {
38303838 write ! ( f, "({})" , display_comma_separated( parameters) ) ?;
38313839 }
3840+ if !using. is_empty ( ) {
3841+ write ! ( f, " USING {}" , display_comma_separated( using) ) ?;
3842+ } ;
38323843 Ok ( ( ) )
38333844 }
38343845 Statement :: Prepare {
Original file line number Diff line number Diff line change @@ -8948,7 +8948,20 @@ impl<'a> Parser<'a> {
89488948 self . expect_token ( & Token :: RParen ) ?;
89498949 }
89508950
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+ } )
89528965 }
89538966
89548967 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() {
14211421 Statement :: Execute {
14221422 name: "a" . into( ) ,
14231423 parameters: vec![ ] ,
1424+ using: vec![ ]
14241425 }
14251426 ) ;
14261427
@@ -1433,6 +1434,29 @@ fn parse_execute() {
14331434 Expr :: Value ( number( "1" ) ) ,
14341435 Expr :: Value ( Value :: SingleQuotedString ( "t" . to_string( ) ) )
14351436 ] ,
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+ ]
14361460 }
14371461 ) ;
14381462}
You can’t perform that action at this time.
0 commit comments