diff --git a/datafusion/sql/src/statement.rs b/datafusion/sql/src/statement.rs index e7088c8a3d6f..8c94610f7764 100644 --- a/datafusion/sql/src/statement.rs +++ b/datafusion/sql/src/statement.rs @@ -886,6 +886,10 @@ impl SqlToRel<'_, S> { "Execute statement with DEFAULT is not supported" ); } + let name = name.ok_or_else(|| { + plan_datafusion_err!("EXECUTE statement requires a name") + })?; + let empty_schema = DFSchema::empty(); let parameters = parameters .into_iter() @@ -893,7 +897,7 @@ impl SqlToRel<'_, S> { .collect::>>()?; Ok(LogicalPlan::Statement(PlanStatement::Execute(Execute { - name: object_name_to_string(&name.unwrap()), + name: object_name_to_string(&name), parameters, }))) } diff --git a/datafusion/sqllogictest/test_files/prepare.slt b/datafusion/sqllogictest/test_files/prepare.slt index 8e8b1cd8e6ad..16e41834a312 100644 --- a/datafusion/sqllogictest/test_files/prepare.slt +++ b/datafusion/sqllogictest/test_files/prepare.slt @@ -53,6 +53,25 @@ PREPARE my_plan(INT, INT) AS SELECT 1 + $1; statement error SQL error: ParserError PREPARE my_plan(INT) AS SELECT id, age FROM person WHERE age is $1; +# EXEC/EXECUTE with parentheses but no statement name must error instead of panic +statement error EXECUTE statement requires a name +EXEC(); + +statement error EXECUTE statement requires a name +EXEC(''); + +statement error EXECUTE statement requires a name +EXEC('any-string'); + +statement error EXECUTE statement requires a name +EXEC(unknown_column); + +statement error EXECUTE statement requires a name +EXECUTE(); + +statement error EXECUTE statement requires a name +EXEC ('a'); + # ####################### # Test prepare and execute statements