Skip to content

Commit 68b52a4

Browse files
Support EXECUTE ... USING for Postgres (#1153)
1 parent 9db9d22 commit 68b52a4

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

src/ast/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff 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 {

src/parser/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff 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> {

tests/sqlparser_postgres.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff 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
}

0 commit comments

Comments
 (0)