mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 06:18:17 +00:00
feat: support pg type alias (#933)
This commit is contained in:
parent
53593f1982
commit
0ddb853410
4 changed files with 163 additions and 2 deletions
|
@ -97,6 +97,14 @@ pub enum DataType {
|
||||||
TinyInt(Option<u64>),
|
TinyInt(Option<u64>),
|
||||||
/// Unsigned tiny integer with optional display width e.g. TINYINT UNSIGNED or TINYINT(3) UNSIGNED
|
/// Unsigned tiny integer with optional display width e.g. TINYINT UNSIGNED or TINYINT(3) UNSIGNED
|
||||||
UnsignedTinyInt(Option<u64>),
|
UnsignedTinyInt(Option<u64>),
|
||||||
|
/// Int2 as alias for SmallInt in [postgresql]
|
||||||
|
/// Note: Int2 mean 2 bytes in postgres (not 2 bits)
|
||||||
|
/// Int2 with optional display width e.g. INT2 or INT2(5)
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
Int2(Option<u64>),
|
||||||
|
/// Unsigned Int2 with optional display width e.g. INT2 Unsigned or INT2(5) Unsigned
|
||||||
|
UnsignedInt2(Option<u64>),
|
||||||
/// Small integer with optional display width e.g. SMALLINT or SMALLINT(5)
|
/// Small integer with optional display width e.g. SMALLINT or SMALLINT(5)
|
||||||
SmallInt(Option<u64>),
|
SmallInt(Option<u64>),
|
||||||
/// Unsigned small integer with optional display width e.g. SMALLINT UNSIGNED or SMALLINT(5) UNSIGNED
|
/// Unsigned small integer with optional display width e.g. SMALLINT UNSIGNED or SMALLINT(5) UNSIGNED
|
||||||
|
@ -109,20 +117,44 @@ pub enum DataType {
|
||||||
///
|
///
|
||||||
/// [1]: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
|
/// [1]: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
|
||||||
UnsignedMediumInt(Option<u64>),
|
UnsignedMediumInt(Option<u64>),
|
||||||
/// Integer with optional display width e.g. INT or INT(11)
|
/// Int with optional display width e.g. INT or INT(11)
|
||||||
Int(Option<u64>),
|
Int(Option<u64>),
|
||||||
|
/// Int4 as alias for Integer in [postgresql]
|
||||||
|
/// Note: Int4 mean 4 bytes in postgres (not 4 bits)
|
||||||
|
/// Int4 with optional display width e.g. Int4 or Int4(11)
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
Int4(Option<u64>),
|
||||||
/// Integer with optional display width e.g. INTEGER or INTEGER(11)
|
/// Integer with optional display width e.g. INTEGER or INTEGER(11)
|
||||||
Integer(Option<u64>),
|
Integer(Option<u64>),
|
||||||
/// Unsigned integer with optional display width e.g. INT UNSIGNED or INT(11) UNSIGNED
|
/// Unsigned int with optional display width e.g. INT UNSIGNED or INT(11) UNSIGNED
|
||||||
UnsignedInt(Option<u64>),
|
UnsignedInt(Option<u64>),
|
||||||
|
/// Unsigned int4 with optional display width e.g. INT4 UNSIGNED or INT4(11) UNSIGNED
|
||||||
|
UnsignedInt4(Option<u64>),
|
||||||
/// Unsigned integer with optional display width e.g. INTGER UNSIGNED or INTEGER(11) UNSIGNED
|
/// Unsigned integer with optional display width e.g. INTGER UNSIGNED or INTEGER(11) UNSIGNED
|
||||||
UnsignedInteger(Option<u64>),
|
UnsignedInteger(Option<u64>),
|
||||||
/// Big integer with optional display width e.g. BIGINT or BIGINT(20)
|
/// Big integer with optional display width e.g. BIGINT or BIGINT(20)
|
||||||
BigInt(Option<u64>),
|
BigInt(Option<u64>),
|
||||||
/// Unsigned big integer with optional display width e.g. BIGINT UNSIGNED or BIGINT(20) UNSIGNED
|
/// Unsigned big integer with optional display width e.g. BIGINT UNSIGNED or BIGINT(20) UNSIGNED
|
||||||
UnsignedBigInt(Option<u64>),
|
UnsignedBigInt(Option<u64>),
|
||||||
|
/// Int8 as alias for Bigint in [postgresql]
|
||||||
|
/// Note: Int8 mean 8 bytes in postgres (not 8 bits)
|
||||||
|
/// Int8 with optional display width e.g. INT8 or INT8(11)
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
Int8(Option<u64>),
|
||||||
|
/// Unsigned Int8 with optional display width e.g. INT8 UNSIGNED or INT8(11) UNSIGNED
|
||||||
|
UnsignedInt8(Option<u64>),
|
||||||
|
/// FLOAT4 as alias for Real in [postgresql]
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
FLOAT4,
|
||||||
/// Floating point e.g. REAL
|
/// Floating point e.g. REAL
|
||||||
Real,
|
Real,
|
||||||
|
/// FLOAT8 as alias for Double in [postgresql]
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
FLOAT8,
|
||||||
/// Double
|
/// Double
|
||||||
Double,
|
Double,
|
||||||
/// Double PRECISION e.g. [standard], [postgresql]
|
/// Double PRECISION e.g. [standard], [postgresql]
|
||||||
|
@ -130,6 +162,10 @@ pub enum DataType {
|
||||||
/// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type
|
/// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type
|
||||||
/// [postgresql]: https://www.postgresql.org/docs/current/datatype-numeric.html
|
/// [postgresql]: https://www.postgresql.org/docs/current/datatype-numeric.html
|
||||||
DoublePrecision,
|
DoublePrecision,
|
||||||
|
/// Bool as alias for Boolean in [postgresql]
|
||||||
|
///
|
||||||
|
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
|
||||||
|
Bool,
|
||||||
/// Boolean
|
/// Boolean
|
||||||
Boolean,
|
Boolean,
|
||||||
/// Date
|
/// Date
|
||||||
|
@ -213,6 +249,12 @@ impl fmt::Display for DataType {
|
||||||
DataType::UnsignedTinyInt(zerofill) => {
|
DataType::UnsignedTinyInt(zerofill) => {
|
||||||
format_type_with_optional_length(f, "TINYINT", zerofill, true)
|
format_type_with_optional_length(f, "TINYINT", zerofill, true)
|
||||||
}
|
}
|
||||||
|
DataType::Int2(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT2", zerofill, false)
|
||||||
|
}
|
||||||
|
DataType::UnsignedInt2(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT2", zerofill, true)
|
||||||
|
}
|
||||||
DataType::SmallInt(zerofill) => {
|
DataType::SmallInt(zerofill) => {
|
||||||
format_type_with_optional_length(f, "SMALLINT", zerofill, false)
|
format_type_with_optional_length(f, "SMALLINT", zerofill, false)
|
||||||
}
|
}
|
||||||
|
@ -229,6 +271,12 @@ impl fmt::Display for DataType {
|
||||||
DataType::UnsignedInt(zerofill) => {
|
DataType::UnsignedInt(zerofill) => {
|
||||||
format_type_with_optional_length(f, "INT", zerofill, true)
|
format_type_with_optional_length(f, "INT", zerofill, true)
|
||||||
}
|
}
|
||||||
|
DataType::Int4(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT4", zerofill, false)
|
||||||
|
}
|
||||||
|
DataType::UnsignedInt4(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT4", zerofill, true)
|
||||||
|
}
|
||||||
DataType::Integer(zerofill) => {
|
DataType::Integer(zerofill) => {
|
||||||
format_type_with_optional_length(f, "INTEGER", zerofill, false)
|
format_type_with_optional_length(f, "INTEGER", zerofill, false)
|
||||||
}
|
}
|
||||||
|
@ -241,9 +289,18 @@ impl fmt::Display for DataType {
|
||||||
DataType::UnsignedBigInt(zerofill) => {
|
DataType::UnsignedBigInt(zerofill) => {
|
||||||
format_type_with_optional_length(f, "BIGINT", zerofill, true)
|
format_type_with_optional_length(f, "BIGINT", zerofill, true)
|
||||||
}
|
}
|
||||||
|
DataType::Int8(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT8", zerofill, false)
|
||||||
|
}
|
||||||
|
DataType::UnsignedInt8(zerofill) => {
|
||||||
|
format_type_with_optional_length(f, "INT8", zerofill, true)
|
||||||
|
}
|
||||||
DataType::Real => write!(f, "REAL"),
|
DataType::Real => write!(f, "REAL"),
|
||||||
|
DataType::FLOAT4 => write!(f, "FLOAT4"),
|
||||||
DataType::Double => write!(f, "DOUBLE"),
|
DataType::Double => write!(f, "DOUBLE"),
|
||||||
|
DataType::FLOAT8 => write!(f, "FLOAT8"),
|
||||||
DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"),
|
DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"),
|
||||||
|
DataType::Bool => write!(f, "BOOL"),
|
||||||
DataType::Boolean => write!(f, "BOOLEAN"),
|
DataType::Boolean => write!(f, "BOOLEAN"),
|
||||||
DataType::Date => write!(f, "DATE"),
|
DataType::Date => write!(f, "DATE"),
|
||||||
DataType::Time(precision, timezone_info) => {
|
DataType::Time(precision, timezone_info) => {
|
||||||
|
|
|
@ -111,6 +111,7 @@ define_keywords!(
|
||||||
BINARY,
|
BINARY,
|
||||||
BLOB,
|
BLOB,
|
||||||
BLOOMFILTER,
|
BLOOMFILTER,
|
||||||
|
BOOL,
|
||||||
BOOLEAN,
|
BOOLEAN,
|
||||||
BOTH,
|
BOTH,
|
||||||
BTREE,
|
BTREE,
|
||||||
|
@ -263,6 +264,8 @@ define_keywords!(
|
||||||
FIRST,
|
FIRST,
|
||||||
FIRST_VALUE,
|
FIRST_VALUE,
|
||||||
FLOAT,
|
FLOAT,
|
||||||
|
FLOAT4,
|
||||||
|
FLOAT8,
|
||||||
FLOOR,
|
FLOOR,
|
||||||
FOLLOWING,
|
FOLLOWING,
|
||||||
FOR,
|
FOR,
|
||||||
|
@ -317,6 +320,9 @@ define_keywords!(
|
||||||
INSENSITIVE,
|
INSENSITIVE,
|
||||||
INSERT,
|
INSERT,
|
||||||
INT,
|
INT,
|
||||||
|
INT2,
|
||||||
|
INT4,
|
||||||
|
INT8,
|
||||||
INTEGER,
|
INTEGER,
|
||||||
INTERSECT,
|
INTERSECT,
|
||||||
INTERSECTION,
|
INTERSECTION,
|
||||||
|
|
|
@ -4560,8 +4560,11 @@ impl<'a> Parser<'a> {
|
||||||
let mut data = match next_token.token {
|
let mut data = match next_token.token {
|
||||||
Token::Word(w) => match w.keyword {
|
Token::Word(w) => match w.keyword {
|
||||||
Keyword::BOOLEAN => Ok(DataType::Boolean),
|
Keyword::BOOLEAN => Ok(DataType::Boolean),
|
||||||
|
Keyword::BOOL => Ok(DataType::Bool),
|
||||||
Keyword::FLOAT => Ok(DataType::Float(self.parse_optional_precision()?)),
|
Keyword::FLOAT => Ok(DataType::Float(self.parse_optional_precision()?)),
|
||||||
Keyword::REAL => Ok(DataType::Real),
|
Keyword::REAL => Ok(DataType::Real),
|
||||||
|
Keyword::FLOAT4 => Ok(DataType::FLOAT4),
|
||||||
|
Keyword::FLOAT8 => Ok(DataType::FLOAT8),
|
||||||
Keyword::DOUBLE => {
|
Keyword::DOUBLE => {
|
||||||
if self.parse_keyword(Keyword::PRECISION) {
|
if self.parse_keyword(Keyword::PRECISION) {
|
||||||
Ok(DataType::DoublePrecision)
|
Ok(DataType::DoublePrecision)
|
||||||
|
@ -4577,6 +4580,14 @@ impl<'a> Parser<'a> {
|
||||||
Ok(DataType::TinyInt(optional_precision?))
|
Ok(DataType::TinyInt(optional_precision?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Keyword::INT2 => {
|
||||||
|
let optional_precision = self.parse_optional_precision();
|
||||||
|
if self.parse_keyword(Keyword::UNSIGNED) {
|
||||||
|
Ok(DataType::UnsignedInt2(optional_precision?))
|
||||||
|
} else {
|
||||||
|
Ok(DataType::Int2(optional_precision?))
|
||||||
|
}
|
||||||
|
}
|
||||||
Keyword::SMALLINT => {
|
Keyword::SMALLINT => {
|
||||||
let optional_precision = self.parse_optional_precision();
|
let optional_precision = self.parse_optional_precision();
|
||||||
if self.parse_keyword(Keyword::UNSIGNED) {
|
if self.parse_keyword(Keyword::UNSIGNED) {
|
||||||
|
@ -4601,6 +4612,14 @@ impl<'a> Parser<'a> {
|
||||||
Ok(DataType::Int(optional_precision?))
|
Ok(DataType::Int(optional_precision?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Keyword::INT4 => {
|
||||||
|
let optional_precision = self.parse_optional_precision();
|
||||||
|
if self.parse_keyword(Keyword::UNSIGNED) {
|
||||||
|
Ok(DataType::UnsignedInt4(optional_precision?))
|
||||||
|
} else {
|
||||||
|
Ok(DataType::Int4(optional_precision?))
|
||||||
|
}
|
||||||
|
}
|
||||||
Keyword::INTEGER => {
|
Keyword::INTEGER => {
|
||||||
let optional_precision = self.parse_optional_precision();
|
let optional_precision = self.parse_optional_precision();
|
||||||
if self.parse_keyword(Keyword::UNSIGNED) {
|
if self.parse_keyword(Keyword::UNSIGNED) {
|
||||||
|
@ -4617,6 +4636,14 @@ impl<'a> Parser<'a> {
|
||||||
Ok(DataType::BigInt(optional_precision?))
|
Ok(DataType::BigInt(optional_precision?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Keyword::INT8 => {
|
||||||
|
let optional_precision = self.parse_optional_precision();
|
||||||
|
if self.parse_keyword(Keyword::UNSIGNED) {
|
||||||
|
Ok(DataType::UnsignedInt8(optional_precision?))
|
||||||
|
} else {
|
||||||
|
Ok(DataType::Int8(optional_precision?))
|
||||||
|
}
|
||||||
|
}
|
||||||
Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
|
Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
|
||||||
Keyword::NVARCHAR => Ok(DataType::Nvarchar(self.parse_optional_precision()?)),
|
Keyword::NVARCHAR => Ok(DataType::Nvarchar(self.parse_optional_precision()?)),
|
||||||
Keyword::CHARACTER => {
|
Keyword::CHARACTER => {
|
||||||
|
|
|
@ -2945,3 +2945,74 @@ fn parse_truncate() {
|
||||||
truncate
|
truncate
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_create_table_with_alias() {
|
||||||
|
let sql = "CREATE TABLE public.datatype_aliases
|
||||||
|
(
|
||||||
|
int8_col INT8,
|
||||||
|
int4_col INT4,
|
||||||
|
int2_col INT2,
|
||||||
|
float8_col FLOAT8,
|
||||||
|
float4_col FLOAT4,
|
||||||
|
bool_col BOOL,
|
||||||
|
);";
|
||||||
|
match pg_and_generic().one_statement_parses_to(sql, "") {
|
||||||
|
Statement::CreateTable {
|
||||||
|
name,
|
||||||
|
columns,
|
||||||
|
constraints,
|
||||||
|
with_options: _with_options,
|
||||||
|
if_not_exists: false,
|
||||||
|
external: false,
|
||||||
|
file_format: None,
|
||||||
|
location: None,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
assert_eq!("public.datatype_aliases", name.to_string());
|
||||||
|
assert_eq!(
|
||||||
|
columns,
|
||||||
|
vec![
|
||||||
|
ColumnDef {
|
||||||
|
name: "int8_col".into(),
|
||||||
|
data_type: DataType::Int8(None),
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: "int4_col".into(),
|
||||||
|
data_type: DataType::Int4(None),
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: "int2_col".into(),
|
||||||
|
data_type: DataType::Int2(None),
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: "float8_col".into(),
|
||||||
|
data_type: DataType::FLOAT8,
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: "float4_col".into(),
|
||||||
|
data_type: DataType::FLOAT4,
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: "bool_col".into(),
|
||||||
|
data_type: DataType::Bool,
|
||||||
|
collation: None,
|
||||||
|
options: vec![]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
);
|
||||||
|
assert!(constraints.is_empty());
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue