Files
2026-08-01 16:11:49 +03:00

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.