mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-03 13:58:15 +00:00
Support for BigQuery struct
, array
and bytes
, int64
, float64
datatypes (#1003)
This commit is contained in:
parent
65317edcb9
commit
2f437db2a6
8 changed files with 901 additions and 65 deletions
|
@ -23,8 +23,8 @@ use sqlparser::ast::SelectItem::UnnamedExpr;
|
|||
use sqlparser::ast::TableFactor::{Pivot, Unpivot};
|
||||
use sqlparser::ast::*;
|
||||
use sqlparser::dialect::{
|
||||
AnsiDialect, BigQueryDialect, ClickHouseDialect, DuckDbDialect, GenericDialect, HiveDialect,
|
||||
MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect, SQLiteDialect,
|
||||
AnsiDialect, BigQueryDialect, ClickHouseDialect, Dialect, DuckDbDialect, GenericDialect,
|
||||
HiveDialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect, SQLiteDialect,
|
||||
SnowflakeDialect,
|
||||
};
|
||||
use sqlparser::keywords::ALL_KEYWORDS;
|
||||
|
@ -2516,45 +2516,72 @@ fn parse_create_table() {
|
|||
#[test]
|
||||
fn parse_create_table_hive_array() {
|
||||
// Parsing [] type arrays does not work in MsSql since [ is used in is_delimited_identifier_start
|
||||
let dialects = TestedDialects {
|
||||
dialects: vec![Box::new(PostgreSqlDialect {}), Box::new(HiveDialect {})],
|
||||
options: None,
|
||||
};
|
||||
let sql = "CREATE TABLE IF NOT EXISTS something (name int, val array<int>)";
|
||||
match dialects.one_statement_parses_to(
|
||||
sql,
|
||||
"CREATE TABLE IF NOT EXISTS something (name INT, val INT[])",
|
||||
) {
|
||||
Statement::CreateTable {
|
||||
if_not_exists,
|
||||
name,
|
||||
columns,
|
||||
..
|
||||
} => {
|
||||
assert!(if_not_exists);
|
||||
assert_eq!(name, ObjectName(vec!["something".into()]));
|
||||
assert_eq!(
|
||||
for (dialects, angle_bracket_syntax) in [
|
||||
(
|
||||
vec![Box::new(PostgreSqlDialect {}) as Box<dyn Dialect>],
|
||||
false,
|
||||
),
|
||||
(
|
||||
vec![
|
||||
Box::new(HiveDialect {}) as Box<dyn Dialect>,
|
||||
Box::new(BigQueryDialect {}) as Box<dyn Dialect>,
|
||||
],
|
||||
true,
|
||||
),
|
||||
] {
|
||||
let dialects = TestedDialects {
|
||||
dialects,
|
||||
options: None,
|
||||
};
|
||||
|
||||
let sql = format!(
|
||||
"CREATE TABLE IF NOT EXISTS something (name INT, val {})",
|
||||
if angle_bracket_syntax {
|
||||
"ARRAY<INT>"
|
||||
} else {
|
||||
"INT[]"
|
||||
}
|
||||
);
|
||||
|
||||
let expected = Box::new(DataType::Int(None));
|
||||
let expected = if angle_bracket_syntax {
|
||||
ArrayElemTypeDef::AngleBracket(expected)
|
||||
} else {
|
||||
ArrayElemTypeDef::SquareBracket(expected)
|
||||
};
|
||||
|
||||
match dialects.one_statement_parses_to(sql.as_str(), sql.as_str()) {
|
||||
Statement::CreateTable {
|
||||
if_not_exists,
|
||||
name,
|
||||
columns,
|
||||
vec![
|
||||
ColumnDef {
|
||||
name: Ident::new("name"),
|
||||
data_type: DataType::Int(None),
|
||||
collation: None,
|
||||
options: vec![],
|
||||
},
|
||||
ColumnDef {
|
||||
name: Ident::new("val"),
|
||||
data_type: DataType::Array(Some(Box::new(DataType::Int(None)))),
|
||||
collation: None,
|
||||
options: vec![],
|
||||
},
|
||||
],
|
||||
)
|
||||
..
|
||||
} => {
|
||||
assert!(if_not_exists);
|
||||
assert_eq!(name, ObjectName(vec!["something".into()]));
|
||||
assert_eq!(
|
||||
columns,
|
||||
vec![
|
||||
ColumnDef {
|
||||
name: Ident::new("name"),
|
||||
data_type: DataType::Int(None),
|
||||
collation: None,
|
||||
options: vec![],
|
||||
},
|
||||
ColumnDef {
|
||||
name: Ident::new("val"),
|
||||
data_type: DataType::Array(expected),
|
||||
collation: None,
|
||||
options: vec![],
|
||||
},
|
||||
],
|
||||
)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
// SnowflakeDialect using array diffrent
|
||||
// SnowflakeDialect using array different
|
||||
let dialects = TestedDialects {
|
||||
dialects: vec![
|
||||
Box::new(PostgreSqlDialect {}),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue