alamb opened a new issue, #11529:
URL: https://github.com/apache/datafusion/issues/11529
### Describe the bug
If you execute `SHOW NONSENSE` via FlightSQL (or any other value after
`SHOW`) you get an empty result:
### To Reproduce
```sql
DataFusion CLI v40.0.0
> show nonsense;
+------+-------+
| name | value |
+------+-------+
+------+-------+
0 row(s) fetched.
Elapsed 0.054 seconds.
```
### Expected behavior
We expect the query to error/fail
However, other values like `SHOW ALL` should continue to work, for example
```sql
DataFusion CLI v40.0.0
> show all;
+-------------------------------------------------------------------------+---------------------------+
| name |
value |
+-------------------------------------------------------------------------+---------------------------+
| datafusion.catalog.create_default_catalog_and_schema |
true |
| datafusion.catalog.default_catalog |
datafusion |
| datafusion.catalog.default_schema |
public |
| datafusion.catalog.format |
|
| datafusion.catalog.has_header |
false |
| datafusion.catalog.information_schema |
true |
| datafusion.catalog.location |
|
| datafusion.execution.aggregate.scalar_update_factor |
10 |
| datafusion.execution.batch_size |
8192 |
| datafusion.execution.coalesce_batches |
true |
| datafusion.execution.collect_statistics |
false |
| datafusion.execution.enable_recursive_ctes |
true |
```
And
```sql
> show datafusion.catalog.format ;
+---------------------------+-------+
| name | value |
+---------------------------+-------+
| datafusion.catalog.format | |
+---------------------------+-------+
1 row(s) fetched.
Elapsed 0.006 seconds.
```
### Additional context
This is based on a code / report filed by @crepererum and @itsjunetime
```rust
/// `{variable}` is not a valid config value and not a special-cased
value, like `all`. If this
/// statement does contain such a statement, return an error.
fn check_stmt_for_invalid_show(state: &SessionState, stmt: &Statement)
-> Result<()> {
// these are the special cases which, if added after a `SHOW` command
static SHOW_SPECIAL_CASES: [&str; 3] = ["all", "timezone",
"time.zone"];
match stmt {
Statement::Statement(query) => match **query {
SQLStatement::ShowVariable { variable: ref vars } => {
// if they specified `verbose` as the last argument,
that's also allowed and
// special-cased. Once again, pulled from
`show_variable_to_plan()`.
let vars = if vars.last().is_some_and(|id| id.value ==
"verbose") {
&vars[..vars.len() - 1]
} else {
vars.as_slice()
};
// if someone inputs something like
datafusion.configuration.something, `vars`
// is `["datafusion", "configuration", "something"]`.
For some reason, it's
// split out (it seems that you could also enter it like
`SHOW datafusion
// contiruation something` and that would be valid as
well, based on
// `show_variable_to_plan()`) and we need to join it
back together to get the
// whole variable that we want to check against the
valid options
let idents_str = vars
.iter()
.map(|id| id.to_string())
.collect::<Vec<_>>()
.join(".");
// try to find the first variable that doesn't exist and
isn't special-cased
// for convenience
let is_invalid = !state
// config_options is used to create the
information_schema table, so that's
// why we're using it here to check against the
requested variables.
.config_options()
.entries()
.iter()
.map(|opt| opt.key.as_str())
.chain(SHOW_SPECIAL_CASES)
.any(|var| var == idents_str);
if is_invalid {
Err(plan_datafusion_err!("Cannot show variable
'{idents_str}' as it is not a valid configuration value"))
} else {
Ok(())
}
}
_ => Ok(()),
},
_ => Ok(()),
}
}
```
Here are some error cases (should be in slt in datafusion tests)
```rust
assert_eq!(
planner.sql("SHOW NONSENSE",
StatementParams::default()).await.unwrap_err().strip_backtrace(),
"Error during planning: Cannot show variable 'NONSENSE' as it is
not a valid configuration value"
);
assert_eq!(
planner.sql("SHOW whatever",
StatementParams::default()).await.unwrap_err().strip_backtrace(),
"Error during planning: Cannot show variable 'whatever' as it is
not a valid configuration value"
);
assert_eq!(
planner.sql("SHOW still invalid verbose",
StatementParams::default()).await.unwrap_err().strip_backtrace(),
"Error during planning: Cannot show variable 'still.invalid' as
it is not a valid configuration value"
);
// message is kind of confusing. Should we special-case this error case
too?
assert_eq!(
planner.sql("SHOW verbose",
StatementParams::default()).await.unwrap_err().strip_backtrace(),
"Error during planning: Cannot show variable '' as it is not a
valid configuration value"
);
}
```
Here are some postitive cases (may already be covered by slt)
```rust
assert!(planner
.sql("SHOW all", StatementParams::default())
.await
.is_ok());
assert!(planner
.sql("SHOW all verbose", StatementParams::default())
.await
.is_ok());
assert!(planner
.sql(
"SHOW datafusion.catalog.location",
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]