Add support for EXECUTE IMMEDIATE (#1717)

This commit is contained in:
Ifeanyi Ubah 2025-02-19 18:54:14 +01:00 committed by GitHub
parent 3e90a18f6d
commit b482562618
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 122 additions and 35 deletions

View file

@ -10745,7 +10745,7 @@ fn parse_call() {
#[test]
fn parse_execute_stored_procedure() {
let expected = Statement::Execute {
name: ObjectName::from(vec![
name: Some(ObjectName::from(vec![
Ident {
value: "my_schema".to_string(),
quote_style: None,
@ -10756,13 +10756,15 @@ fn parse_execute_stored_procedure() {
quote_style: None,
span: Span::empty(),
},
]),
])),
parameters: vec![
Expr::Value(Value::NationalStringLiteral("param1".to_string())),
Expr::Value(Value::NationalStringLiteral("param2".to_string())),
],
has_parentheses: false,
immediate: false,
using: vec![],
into: vec![],
};
assert_eq!(
// Microsoft SQL Server does not use parentheses around arguments for EXECUTE
@ -10779,6 +10781,41 @@ fn parse_execute_stored_procedure() {
);
}
#[test]
fn parse_execute_immediate() {
let dialects = all_dialects_where(|d| d.supports_execute_immediate());
let expected = Statement::Execute {
parameters: vec![Expr::Value(Value::SingleQuotedString(
"SELECT 1".to_string(),
))],
immediate: true,
using: vec![ExprWithAlias {
expr: Expr::Value(number("1")),
alias: Some(Ident::new("b")),
}],
into: vec![Ident::new("a")],
name: None,
has_parentheses: false,
};
let stmt = dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a USING 1 AS b");
assert_eq!(expected, stmt);
dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a, b USING 1 AS x, y");
dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' USING 1 AS x, y");
dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a, b");
dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1'");
dialects.verified_stmt("EXECUTE 'SELECT 1'");
assert_eq!(
ParserError::ParserError("Expected: identifier, found: ,".to_string()),
dialects
.parse_sql_statements("EXECUTE IMMEDIATE 'SELECT 1' USING 1 AS, y")
.unwrap_err()
);
}
#[test]
fn parse_create_table_collate() {
pg_and_generic().verified_stmt("CREATE TABLE tbl (foo INT, bar TEXT COLLATE \"de_DE\")");