mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-24 06:32:32 +00:00
Allow to use the TABLE keyword in DESC|DESCRIBE|EXPLAIN TABLE statement (#1351)
This commit is contained in:
parent
547d82f07d
commit
7fdb2ec5d1
3 changed files with 42 additions and 12 deletions
|
@ -2699,6 +2699,11 @@ pub enum Statement {
|
||||||
describe_alias: DescribeAlias,
|
describe_alias: DescribeAlias,
|
||||||
/// Hive style `FORMATTED | EXTENDED`
|
/// Hive style `FORMATTED | EXTENDED`
|
||||||
hive_format: Option<HiveDescribeFormat>,
|
hive_format: Option<HiveDescribeFormat>,
|
||||||
|
/// Snowflake and ClickHouse support `DESC|DESCRIBE TABLE <table_name>` syntax
|
||||||
|
///
|
||||||
|
/// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/desc-table.html)
|
||||||
|
/// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/describe-table)
|
||||||
|
has_table_keyword: bool,
|
||||||
/// Table name
|
/// Table name
|
||||||
#[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
|
#[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
|
||||||
table_name: ObjectName,
|
table_name: ObjectName,
|
||||||
|
@ -2872,6 +2877,7 @@ impl fmt::Display for Statement {
|
||||||
Statement::ExplainTable {
|
Statement::ExplainTable {
|
||||||
describe_alias,
|
describe_alias,
|
||||||
hive_format,
|
hive_format,
|
||||||
|
has_table_keyword,
|
||||||
table_name,
|
table_name,
|
||||||
} => {
|
} => {
|
||||||
write!(f, "{describe_alias} ")?;
|
write!(f, "{describe_alias} ")?;
|
||||||
|
@ -2879,6 +2885,9 @@ impl fmt::Display for Statement {
|
||||||
if let Some(format) = hive_format {
|
if let Some(format) = hive_format {
|
||||||
write!(f, "{} ", format)?;
|
write!(f, "{} ", format)?;
|
||||||
}
|
}
|
||||||
|
if *has_table_keyword {
|
||||||
|
write!(f, "TABLE ")?;
|
||||||
|
}
|
||||||
|
|
||||||
write!(f, "{table_name}")
|
write!(f, "{table_name}")
|
||||||
}
|
}
|
||||||
|
|
|
@ -7972,10 +7972,13 @@ impl<'a> Parser<'a> {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// only allow to use TABLE keyword for DESC|DESCRIBE statement
|
||||||
|
let has_table_keyword = self.parse_keyword(Keyword::TABLE);
|
||||||
let table_name = self.parse_object_name(false)?;
|
let table_name = self.parse_object_name(false)?;
|
||||||
Ok(Statement::ExplainTable {
|
Ok(Statement::ExplainTable {
|
||||||
describe_alias,
|
describe_alias,
|
||||||
hive_format,
|
hive_format,
|
||||||
|
has_table_keyword,
|
||||||
table_name,
|
table_name,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -4186,31 +4186,49 @@ fn run_explain_analyze(
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_explain_table() {
|
fn parse_explain_table() {
|
||||||
let validate_explain =
|
let validate_explain =
|
||||||
|query: &str, expected_describe_alias: DescribeAlias| match verified_stmt(query) {
|
|query: &str, expected_describe_alias: DescribeAlias, expected_table_keyword| {
|
||||||
|
match verified_stmt(query) {
|
||||||
Statement::ExplainTable {
|
Statement::ExplainTable {
|
||||||
describe_alias,
|
describe_alias,
|
||||||
hive_format,
|
hive_format,
|
||||||
|
has_table_keyword,
|
||||||
table_name,
|
table_name,
|
||||||
} => {
|
} => {
|
||||||
assert_eq!(describe_alias, expected_describe_alias);
|
assert_eq!(describe_alias, expected_describe_alias);
|
||||||
assert_eq!(hive_format, None);
|
assert_eq!(hive_format, None);
|
||||||
|
assert_eq!(has_table_keyword, expected_table_keyword);
|
||||||
assert_eq!("test_identifier", table_name.to_string());
|
assert_eq!("test_identifier", table_name.to_string());
|
||||||
}
|
}
|
||||||
_ => panic!("Unexpected Statement, must be ExplainTable"),
|
_ => panic!("Unexpected Statement, must be ExplainTable"),
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
validate_explain("EXPLAIN test_identifier", DescribeAlias::Explain);
|
validate_explain("EXPLAIN test_identifier", DescribeAlias::Explain, false);
|
||||||
validate_explain("DESCRIBE test_identifier", DescribeAlias::Describe);
|
validate_explain("DESCRIBE test_identifier", DescribeAlias::Describe, false);
|
||||||
|
validate_explain("DESC test_identifier", DescribeAlias::Desc, false);
|
||||||
|
validate_explain(
|
||||||
|
"EXPLAIN TABLE test_identifier",
|
||||||
|
DescribeAlias::Explain,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
validate_explain(
|
||||||
|
"DESCRIBE TABLE test_identifier",
|
||||||
|
DescribeAlias::Describe,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
validate_explain("DESC TABLE test_identifier", DescribeAlias::Desc, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn explain_describe() {
|
fn explain_describe() {
|
||||||
verified_stmt("DESCRIBE test.table");
|
verified_stmt("DESCRIBE test.table");
|
||||||
|
verified_stmt("DESCRIBE TABLE test.table");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn explain_desc() {
|
fn explain_desc() {
|
||||||
verified_stmt("DESC test.table");
|
verified_stmt("DESC test.table");
|
||||||
|
verified_stmt("DESC TABLE test.table");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue