Skip to content

Commit

Permalink
Parse Postgres VARBIT datatype (#1703)
Browse files Browse the repository at this point in the history
  • Loading branch information
mvzink authored Feb 8, 2025
1 parent 86abbd6 commit cad4923
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/ast/data_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -328,10 +328,15 @@ pub enum DataType {
/// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/bit-type.html
/// [MSSQL]: https://learn.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver16
Bit(Option<u64>),
/// Variable-length bit string e.g. [Postgres]
/// `BIT VARYING(n)`: Variable-length bit string e.g. [Postgres]
///
/// [Postgres]: https://www.postgresql.org/docs/current/datatype-bit.html
BitVarying(Option<u64>),
/// `VARBIT(n)`: Variable-length bit string. [Postgres] alias for `BIT VARYING`
///
/// [Postgres]: https://www.postgresql.org/docs/current/datatype.html
VarBit(Option<u64>),
///
/// Custom type such as enums
Custom(ObjectName, Vec<String>),
/// Arrays
Expand Down Expand Up @@ -550,6 +555,7 @@ impl fmt::Display for DataType {
DataType::BitVarying(size) => {
format_type_with_optional_length(f, "BIT VARYING", size, false)
}
DataType::VarBit(size) => format_type_with_optional_length(f, "VARBIT", size, false),
DataType::Array(ty) => match ty {
ArrayElemTypeDef::None => write!(f, "ARRAY"),
ArrayElemTypeDef::SquareBracket(t, None) => write!(f, "{t}[]"),
Expand Down
1 change: 1 addition & 0 deletions src/keywords.rs
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,7 @@ define_keywords!(
VALUES,
VALUE_OF,
VARBINARY,
VARBIT,
VARCHAR,
VARIABLES,
VARYING,
Expand Down
1 change: 1 addition & 0 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8779,6 +8779,7 @@ impl<'a> Parser<'a> {
Ok(DataType::Bit(self.parse_optional_precision()?))
}
}
Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
Keyword::UUID => Ok(DataType::Uuid),
Keyword::DATE => Ok(DataType::Date),
Keyword::DATE32 => Ok(DataType::Date32),
Expand Down
26 changes: 26 additions & 0 deletions tests/sqlparser_postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5327,3 +5327,29 @@ fn parse_bitstring_literal() {
))]
);
}

#[test]
fn parse_varbit_datatype() {
match pg_and_generic().verified_stmt("CREATE TABLE foo (x VARBIT, y VARBIT(42))") {
Statement::CreateTable(CreateTable { columns, .. }) => {
assert_eq!(
columns,
vec![
ColumnDef {
name: "x".into(),
data_type: DataType::VarBit(None),
collation: None,
options: vec![],
},
ColumnDef {
name: "y".into(),
data_type: DataType::VarBit(Some(42)),
collation: None,
options: vec![],
}
]
);
}
_ => unreachable!(),
}
}

0 comments on commit cad4923

Please sign in to comment.