131 lines
5.8 KiB
Markdown
131 lines
5.8 KiB
Markdown
## Release Notes: sea-query 1.0.0-rc.34
|
|
|
|
*(since 1.0.0-rc.33)*
|
|
|
|
### Highlights
|
|
|
|
* Added `CREATE TABLE` partitioning support for PostgreSQL and MySQL.
|
|
* Added SQLx and rusqlite binder support for Jiff values.
|
|
* Fixed PostgreSQL unsigned integer column mappings to avoid overflow-prone type choices.
|
|
* Fixed MySQL `IndexCreateStatement::cond_where` behavior so partial index filters are no longer silently dropped.
|
|
* Refactored the PostgreSQL `JSON_TABLE` builder API.
|
|
|
|
### Breaking Changes
|
|
|
|
* Changed PostgreSQL type mapping for unsigned integer columns to use wider signed integer types https://github.com/SeaQL/sea-query/pull/1028
|
|
|
|
PostgreSQL does not have unsigned integer types. SeaQuery now maps unsigned column types to signed types that can represent a wider range:
|
|
|
|
| ColumnType | 0.32.x PostgreSQL type | 1.0.0-rc.34 PostgreSQL type |
|
|
| --- | --- | --- |
|
|
| `TinyUnsigned` | `smallint` | `smallint` |
|
|
| `SmallUnsigned` | `smallint` | `integer` |
|
|
| `Unsigned` | `integer` | `bigint` |
|
|
| `BigUnsigned` | `bigint` | `bigint` |
|
|
|
|
This affects generated PostgreSQL schema SQL. Existing migrations remain unchanged, but newly generated migrations may produce different column types for `SmallUnsigned` and `Unsigned`.
|
|
|
|
* MySQL index creation now emits `cond_where` filters instead of silently dropping them https://github.com/SeaQL/sea-query/pull/1067
|
|
|
|
MySQL does not support partial indexes. SeaQuery now keeps the `WHERE` clause when `IndexCreateStatement::cond_where` is used with `MysqlQueryBuilder`, causing the database to reject the statement instead of silently creating an index with different semantics.
|
|
|
|
* Removed `jiff::Zoned` support from the `with-jiff` value API https://github.com/SeaQL/sea-query/pull/1061
|
|
|
|
The Jiff value mapping now excludes `jiff::Zoned`, because the SQLx Jiff binder does not support lossless `Zoned` values. Code using `Value::jiff_zoned`, `Value::JiffZoned`, `ArrayType::JiffZoned`, `is_jiff_zoned`, or `as_ref_jiff_zoned` should migrate to a supported Jiff type or store zoned datetimes as an application-defined text value.
|
|
|
|
* Changed Jiff datetime type mappings https://github.com/SeaQL/sea-query/pull/1061
|
|
|
|
Jiff datetime mappings now align with SQLx binder support:
|
|
|
|
| Rust type | Previous SeaQuery column type | 1.0.0-rc.34 column type |
|
|
| --- | --- | --- |
|
|
| `jiff::civil::DateTime` | `DateTime` | `Timestamp` |
|
|
| `jiff::Timestamp` | `Timestamp` | `TimestampWithTimeZone` |
|
|
|
|
* Refactored `PgFunc::json_table` builder APIs https://github.com/SeaQL/sea-query/pull/1029
|
|
|
|
The PostgreSQL `JSON_TABLE` API now uses value objects for columns and nested paths instead of chained sub-builders:
|
|
|
|
| Previous API | New API |
|
|
| --- | --- |
|
|
| `json_path_name(...)` | `path_name(...)` |
|
|
| `ordinality_column(...)` | `for_ordinality(...)` |
|
|
| `column(name, ty).path(...).build_column()` | `column(json_table::Column::new(name, ty).path(...))` |
|
|
| `exists_column(name, ty).path(...).build_column()` | `exists(json_table::ExistsColumn::new(name, ty).path(...))` |
|
|
| `nested(path).column(...).build_nested()` | `nested(json_table::NestedPath::new(path).column(...))` |
|
|
|
|
`explicit_path` was removed. Nested paths now render as `NESTED PATH ...`.
|
|
|
|
### New Features
|
|
|
|
* Added table partitioning support for `CREATE TABLE` https://github.com/SeaQL/sea-query/pull/1039
|
|
|
|
PostgreSQL support includes:
|
|
|
|
* `PARTITION BY RANGE`
|
|
* `PARTITION BY LIST`
|
|
* `PARTITION BY HASH`
|
|
* `PARTITION OF`
|
|
* `FOR VALUES IN`
|
|
* `FOR VALUES FROM ... TO`
|
|
* `FOR VALUES WITH`
|
|
|
|
MySQL support includes:
|
|
|
|
* `PARTITION BY RANGE`
|
|
* `PARTITION BY LIST`
|
|
* `PARTITION BY HASH`
|
|
* `PARTITION BY KEY`
|
|
* Partition definitions with `VALUES IN` and `VALUES LESS THAN`
|
|
|
|
`PartitionDefinition` is kept crate-private; users create partition definitions through `TableCreateStatement::add_partition`.
|
|
|
|
* Added SQLx and rusqlite binder support for Jiff values, except `jiff::Zoned` https://github.com/SeaQL/sea-query/pull/1061
|
|
|
|
Supported Jiff values:
|
|
|
|
| Rust type | SeaQuery value variant |
|
|
| --- | --- |
|
|
| `jiff::civil::Date` | `Value::JiffDate` |
|
|
| `jiff::civil::Time` | `Value::JiffTime` |
|
|
| `jiff::civil::DateTime` | `Value::JiffDateTime` |
|
|
| `jiff::Timestamp` | `Value::JiffTimestamp` |
|
|
|
|
`sea-query-sqlx` intentionally rejects `with-jiff` together with `sqlx-mysql` or `sqlx-any` unless the `unimplemented-jiff-sqlx-mysql` feature is enabled to acknowledge the limitation.
|
|
|
|
### Fixes
|
|
|
|
* Wrapped PostgreSQL `ON CONFLICT` index expressions in parentheses where required by PostgreSQL syntax https://github.com/SeaQL/sea-query/pull/1055
|
|
|
|
For example, SeaQuery now renders:
|
|
|
|
```sql
|
|
ON CONFLICT ("name", ("variant" IS NULL)) DO NOTHING
|
|
```
|
|
|
|
instead of:
|
|
|
|
```sql
|
|
ON CONFLICT ("name", "variant" IS NULL) DO NOTHING
|
|
```
|
|
|
|
This matches PostgreSQL's `conflict_target` grammar for index expressions.
|
|
|
|
* Fixed MySQL partial index filters being silently ignored https://github.com/SeaQL/sea-query/pull/1067
|
|
|
|
`IndexCreateStatement::cond_where` now renders the filter for both standalone MySQL `CREATE INDEX` statements and inline indexes inside `CREATE TABLE`.
|
|
|
|
### Documentation And Tests
|
|
|
|
* Added documentation for the unsigned integer PostgreSQL type mapping changes.
|
|
* Added table partitioning doctests and backend-specific coverage for PostgreSQL and MySQL.
|
|
* Added focused PostgreSQL `JSON_TABLE` tests for the refactored API.
|
|
* Added documentation and regression tests for MySQL `cond_where` behavior on indexes.
|
|
|
|
### Migration Notes
|
|
|
|
* Review newly generated PostgreSQL migrations for `SmallUnsigned` and `Unsigned` column type changes.
|
|
* Replace old `PgFunc::json_table` chained sub-builder calls with `json_table::Column`, `json_table::ExistsColumn`, and `json_table::NestedPath`.
|
|
* Replace any `jiff::Zoned` `Value` usage with supported Jiff types or application-level text storage.
|
|
* Treat MySQL partial indexes as unsupported. SeaQuery now emits invalid MySQL SQL intentionally when `cond_where` is used, so applications should branch by backend when they need a partial index on PostgreSQL or SQLite only.
|