Postgres: Add support for text search types (#1889)

This commit is contained in:
Mohamed Abdeen 2025-06-22 08:02:51 +01:00 committed by GitHub
parent 204d3b484d
commit 1d0dc7cdd8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 49 additions and 0 deletions

View file

@ -446,6 +446,14 @@ pub enum DataType {
/// ///
/// [PostgreSQL]: https://www.postgresql.org/docs/9.5/functions-geometry.html /// [PostgreSQL]: https://www.postgresql.org/docs/9.5/functions-geometry.html
GeometricType(GeometricTypeKind), GeometricType(GeometricTypeKind),
/// PostgreSQL text search vectors, see [PostgreSQL].
///
/// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-textsearch.html
TsVector,
/// PostgreSQL text search query, see [PostgreSQL].
///
/// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-textsearch.html
TsQuery,
} }
impl fmt::Display for DataType { impl fmt::Display for DataType {
@ -738,6 +746,8 @@ impl fmt::Display for DataType {
write!(f, "{} TABLE ({})", name, display_comma_separated(columns)) write!(f, "{} TABLE ({})", name, display_comma_separated(columns))
} }
DataType::GeometricType(kind) => write!(f, "{}", kind), DataType::GeometricType(kind) => write!(f, "{}", kind),
DataType::TsVector => write!(f, "TSVECTOR"),
DataType::TsQuery => write!(f, "TSQUERY"),
} }
} }
} }

View file

@ -935,6 +935,8 @@ define_keywords!(
TRY, TRY,
TRY_CAST, TRY_CAST,
TRY_CONVERT, TRY_CONVERT,
TSQUERY,
TSVECTOR,
TUPLE, TUPLE,
TYPE, TYPE,
UBIGINT, UBIGINT,

View file

@ -9909,6 +9909,12 @@ impl<'a> Parser<'a> {
Ok(DataType::Unsigned) Ok(DataType::Unsigned)
} }
} }
Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
Ok(DataType::TsVector)
}
Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
Ok(DataType::TsQuery)
}
_ => { _ => {
self.prev_token(); self.prev_token();
let type_name = self.parse_object_name(false)?; let type_name = self.parse_object_name(false)?;

View file

@ -6201,3 +6201,34 @@ fn parse_alter_table_replica_identity() {
_ => unreachable!(), _ => unreachable!(),
} }
} }
#[test]
fn parse_ts_datatypes() {
match pg_and_generic().verified_stmt("CREATE TABLE foo (x TSVECTOR)") {
Statement::CreateTable(CreateTable { columns, .. }) => {
assert_eq!(
columns,
vec![ColumnDef {
name: "x".into(),
data_type: DataType::TsVector,
options: vec![],
}]
);
}
_ => unreachable!(),
}
match pg_and_generic().verified_stmt("CREATE TABLE foo (x TSQUERY)") {
Statement::CreateTable(CreateTable { columns, .. }) => {
assert_eq!(
columns,
vec![ColumnDef {
name: "x".into(),
data_type: DataType::TsQuery,
options: vec![],
}]
);
}
_ => unreachable!(),
}
}