# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## 1.0.1 - 2026-05-30 - [1.0.1](changelog/1.0.1.md) - Borrowed scalar primitive conversions for `Value` ## sea-query-sqlx 0.9.0 - 2026-05-29 - [sea-query-sqlx 0.9.0](changelog/sea-query-sqlx-0.9.0.md) — SQLx `0.9`, Rust `1.94.0`, temporary Jiff and pgvector binder limitations ## 1.0.0 - 2026-05-28 - [1.0.0](changelog/1.0.0.md) - Stable SeaQuery 1.0 release notes ### Release Candidates - [1.0.0-rc.34](changelog/1.0.0-rc.34.md) — Table partitioning, Jiff binder support, `JSON_TABLE` refactor - [1.0.0-rc.33](changelog/1.0.0-rc.33.md) — `Value::Enum`, Postgres advisory locks, `SelectExprTrait` - [1.0.0-rc.32](changelog/1.0.0-rc.32.md) — `EXPLAIN`, `FILTER` on aggregates, `ALTER TABLE DROP CONSTRAINT` - [1.0.0-rc.31](changelog/1.0.0-rc.31.md) — `SELECT INTO`, `eq_any`/`ne_all`, `Value::array_type` - [1.0.0-rc.30](changelog/1.0.0-rc.30.md) — Tokenizer comment parsing, dependency reductions - [1.0.0-rc.29](changelog/1.0.0-rc.29.md) — Legacy `serial` option for Postgres - [1.0.0-rc.28](changelog/1.0.0-rc.28.md) — Restore Value system - [1.0.0-rc.27](changelog/1.0.0-rc.27.md) — Revert `impl Iden for String` - [1.0.0-rc.26](changelog/1.0.0-rc.26.md) — `From> for Array`, `FromIterator for Array` - [1.0.0-rc.24](changelog/1.0.0-rc.24.md) — Array API redesign - [1.0.0-rc.23](changelog/1.0.0-rc.23.md) — `Value::Enum`, `ON CONFLICT ON CONSTRAINT`, CTE `VALUES` clause - [1.0.0-rc.22](changelog/1.0.0-rc.22.md) — Index operator class, `DROP COLUMN IF EXISTS`, nullable values - [1.0.0-rc.20](changelog/1.0.0-rc.20.md) — `ValueTupleIter`, SQLite decimal fix ### New features * Support `EXPLAIN` statements https://github.com/SeaQL/sea-query/pull/1044 * `#![forbid(unsafe_code)]` in all workspace crates https://github.com/SeaQL/sea-query/pull/930 * Unify `Expr` and `SimpleExpr` as one type. `SimpleExpr` is kept as an alias of `Expr`, but they can now be used interchangeably. There may be a few compile errors and some clippy warnings, basically just remove the redundant `.into()` https://github.com/SeaQL/sea-query/pull/889 ```rust pub type SimpleExpr = Expr; // ! impl From for SimpleExpr { .. } // now removed ``` * New `Iden` type system. Previously, `DynIden` is an alias to `SeaRc`, and is lazily rendered. Now, it's an `Cow<'static, str>`, and is eagerly rendered. `SeaRc` is no longer an alias to `Rc` / `Arc`, now is only a unit struct. As such, `Send` / `Sync` is no longer needed. It's still possible to dynamically serialize a String as identifier, see [example usage](https://github.com/SeaQL/sea-schema/blob/master/src/mysql/writer/types.rs). https://github.com/SeaQL/sea-query/pull/909 ```rust pub type DynIden = SeaRc; // old pub struct DynIden(pub(crate) Cow<'static, str>); // new pub struct SeaRc(pub(crate) RcOrArc); // old pub struct SeaRc; // new ``` * Reworked `TableRef` and `ColumnRef` variants https://github.com/SeaQL/sea-query/pull/927 ```rust // the following variants are collapsed into one: enum TableRef { Table(DynIden), SchemaTable(DynIden, DynIden), DatabaseSchemaTable(DynIden, DynIden, DynIden), TableAlias(DynIden, DynIden), SchemaTableAlias(DynIden, DynIden, DynIden), DatabaseSchemaTableAlias(DynIden, DynIden, DynIden, DynIden), .. } // now it's just: enum TableRef { Table(TableName, Option), // optional Alias .. } pub struct DatabaseName(pub DynIden); pub struct SchemaName(pub Option, pub DynIden); /// A table name, potentially qualified as [database.][schema.]table pub struct TableName(pub Option, pub DynIden); ``` ```rust // before enum ColumnRef { Column(DynIden), TableColumn(DynIden, DynIden), SchemaTableColumn(DynIden, DynIden, DynIden), Asterisk, TableAsterisk(DynIden), } // now enum ColumnRef { /// A column name, potentially qualified as [database.][schema.][table.]column Column(ColumnName), /// An `*` expression, potentially qualified as [database.][schema.][table.]* Asterisk(Option), } pub struct ColumnName(pub Option, pub DynIden); ``` ### Enhancements * Supports Jiff types except `jiff::Zoned`. At the moment this support is only available through the SQLx binder. When using SQLx with multiple backends, enable `unimplemented-jiff-sqlx-mysql` to suppress the compile-time error. After enabling it, runtime panics may occur. * Add `Expr::not_exists` https://github.com/SeaQL/sea-query/pull/983 * Add `serde` feature. Currently, enabling it allows `Value` to be serializable https://github.com/SeaQL/sea-query/pull/966 * Add `Keyword::Default` https://github.com/SeaQL/sea-query/pull/965 * Enable `clippy::nursery` https://github.com/SeaQL/sea-query/pull/938 * Removed unnecessary `'static` bounds from type signatures https://github.com/SeaQL/sea-query/pull/921 * `cast_as_quoted` now allows you to qualify the type name. https://github.com/SeaQL/sea-query/pull/922 ```rust let query = Query::select() .expr(Func::cast_as_quoted("hello", ("MySchema", "MyType"))) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT CAST('hello' AS "MySchema"."MyType")"# ); ``` * Most `Value` variants are now unboxed (except `BigDecimal` and `Array`). Previously the size is 24 bytes. https://github.com/SeaQL/sea-query/pull/925 ```rust assert_eq!(std::mem::size_of::(), 32); ``` * Merged `Func`/`Function` and `PgFunc`/`PgFunction`. Now the latter is just an alias of the former https://github.com/SeaQL/sea-query/pull/944 ```rust // old condition.add(Func::lower(Expr::col(column)).eq(SimpleExpr::FunctionCall(Func::lower(value)))) // new condition.add(Func::lower(Expr::col(*column)).eq(Func::lower(value))); ``` * `impl From for Condition`. Now you can use `Expr` instead of `ConditionExpression`, which has been removed from the public API https://github.com/SeaQL/sea-query/pull/915 ```rust Cond::all().add(ConditionExpression::Expr(Expr::new(..))) // old Cond::all().add(Expr::new(..)) // new ``` * Replaced `serial` with `GENERATED BY DEFAULT AS IDENTITY` (Postgres) https://github.com/SeaQL/sea-query/pull/918 To restore legacy behaviour, you can enable the `option-postgres-use-serial` feature flag ```rust let table = Table::create() .table(Char::Table) .col(ColumnDef::new(Char::Id).integer().not_null().auto_increment().primary_key()) .to_owned(); assert_eq!( table.to_string(PostgresQueryBuilder), [ r#"CREATE TABLE "character" ("#, r#""id" integer GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,"#, r#")"#, ].join(" ") ); // if you needed to support legacy system you can still do: let table = Table::create() .table(Char::Table) .col(ColumnDef::new(Char::Id).custom("serial").not_null().primary_key()) .to_owned(); assert_eq!( table.to_string(PostgresQueryBuilder), [ r#"CREATE TABLE "character" ("#, r#""id" serial NOT NULL PRIMARY KEY"#, r#")"#, ].join(" ") ); ``` ### Breaking Changes * Removed inherent `SimpleExpr` methods that duplicate `ExprTrait`. If you encounter the following error, please add `use sea_query::ExprTrait` in scope https://github.com/SeaQL/sea-query/pull/890 ```rust error[E0599]: no method named `like` found for enum `sea_query::Expr` in the current scope | | Expr::col((self.entity_name(), *self)).like(s) | | fn like(self, like: L) -> Expr | ---- the method is available for `sea_query::Expr` here | = help: items from traits can only be used if the trait is in scope help: trait `ExprTrait` which provides `like` is implemented but not in scope; perhaps you want to import it | -> + use sea_query::ExprTrait; ``` ```rust error[E0308]: mismatched types --> src/sqlite/discovery.rs:27:57 | | .and_where(Expr::col(Alias::new("type")).eq("table")) | -- ^^^^^^^ expected `&Expr`, found `&str` | | | arguments to this method are incorrect | = note: expected reference `&sea_query::Expr` found reference `&'static str` ``` * Added `non_exhaustive` to AST enums. It allows us to add new features and extend the AST without breaking the API. If you encounter the following error, please add a wildcard match `_ => {..}` https://github.com/SeaQL/sea-query/pull/891 ```rust error[E0004]: non-exhaustive patterns: `&_` not covered | | match table_ref { | ^^^^^^^^^ pattern `&_` not covered | note: `TableRef` defined here | | pub enum TableRef { | ^^^^^^^^^^^^^^^^^ = note: the matched value is of type `&TableRef` = note: `TableRef` is marked as non-exhaustive, so a wildcard `_` is necessary to match exhaustively help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown | | TableRef::FunctionCall(_, tbl) => SeaRc::clone(tbl), -> | &_ => todo!(), ``` * `ExprTrait::eq` collided with `std::cmp::Eq`. If you encounter the following error, please use `std::cmp::PartialEq::eq(a, b)` or `sea_query::ExprTrait::eq(a, b)` explicitly https://github.com/SeaQL/sea-query/pull/890 ```rust error[E0308]: mismatched types | | fn eq(&self, other: &Self) -> bool { | ---- expected `bool` because of return type | format!("{:?}", self.0).eq(&format!("{:?}", other.0)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Expr` For more information about this error, try `rustc --explain E0308`. error: could not compile `seaography` (lib) due to 1 previous error ``` * The method signature of `Iden::unquoted` is changed. If you're implementing `Iden` manually, you can modify it like below https://github.com/SeaQL/sea-query/pull/909 ```rust error[E0050]: method `unquoted` has 2 parameters but the declaration in trait `types::Iden::unquoted` has 1 --> src/tests_cfg.rs:31:17 | | fn unquoted(&self, s: &mut dyn std::fmt::Write) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 parameter, found 2 | ::: src/types.rs:63:17 | | fn unquoted(&self) -> &str; | ----- trait requires 1 parameter ``` ```rust impl Iden for Glyph { - fn unquoted(&self, s: &mut dyn fmt::Write) { + fn unquoted(&self) -> &str { - write!( - s, - "{}", match self { Self::Table => "glyph", Self::Id => "id", Self::Tokens => "tokens", } - ) - .unwrap(); } } ``` * Removed `ConditionExpression` from the public API. Instead, just convert between `Condition` and `Expr` using `From`/`Into` https://github.com/SeaQL/sea-query/pull/915 ```rust error[E0603]: enum `ConditionExpression` is private --> tests/mysql/query.rs:734:20 | > | use sea_query::ConditionExpression; | ^^^^^^^^^^^^^^^^^^^ private enum > | Cond::all().add(ConditionExpression::Expr(Expr::new( | ^^^^^^^^^^^^^^^^^^^ use of undeclared type `ConditionExpression` ``` Simply do the following: ```rust Cond::all().add(Expr::new(..)) ``` * Reworked `ColumnRef` variants may cause compile error. ```rust error[E0277]: the trait bound `fn(std::option::Option) -> sea_query::ColumnRef {sea_query::ColumnRef::Asterisk}: IntoColumnRef` is not satisfied --> src/executor/query.rs:1599:21 | > | .column(ColumnRef::Asterisk) | ------ ^^^^^^^^^^^^^^^^^^^ the trait `sea_query::Iden` is not implemented for fn item `fn(std::option::Option) -> sea_query::ColumnRef {sea_query::ColumnRef::Asterisk}` | | | required by a bound introduced by this call error[E0308]: mismatched types --> src/executor/query.rs:1607:54 | > | SimpleExpr::Column(ColumnRef::Column("id".into_iden())) | ----------------- ^^^^^^^^^^^^^^^^ expected `ColumnName`, found `DynIden` | | | arguments to this enum variant are incorrect ``` In the former case `Asterisk` has an additional inner `Option`, you can simply put `None`. ```rust .column(ColumnRef::Asterisk(None)) ``` In the latter case, `&'static str` can now be used in most methods that accepts `ColumnRef`. ```rust Expr::column("id") ``` * Reworked `TableRef` variants may cause compile error. ```rust error[E0061]: this enum variant takes 2 arguments but 1 argument was supplied --> src/entity/relation.rs:526:15 | > | from_tbl: TableRef::Table("foo".into_iden()), | ^^^^^^^^^^^^^^^------------------- | || | |expected `TableName`, found `DynIden` | argument #2 of type `Option` is missing ``` It's recommended to use the `IntoTableRef` trait to convert types instead of constructing AST manually. ```rust use sea_orm::sea_query::IntoTableRef; from_tbl: "foo".into_table_ref(), ``` * Replace `dyn ` with `impl ` https://github.com/SeaQL/sea-query/pull/982 This gained us up to 10% performance, however it does mean `dyn QueryBuilder` is no longer possible. ### Minor breaking changes * Changed `Into*` traits (like `IntoCondition`) to be defined as `trait IntoCondition: Into` and implemented for all `T: Into`. Now `IntoCondition` and `Into` are completely interchangable. But you can still use `.into_condition()` for readability. If you have manually implemented `Into*` traits, it may cause conflicts. You should rewrite your impls as as `impl From<..> for Condition`. Full list of changed traits: * `IntoColumnDef` https://github.com/SeaQL/sea-query/pull/975 * `IntoColumnRef` https://github.com/SeaQL/sea-query/pull/959 * `IntoCondition` https://github.com/SeaQL/sea-query/pull/939 * `IntoIden` https://github.com/SeaQL/sea-query/pull/973 * `IntoIndexColumn` https://github.com/SeaQL/sea-query/pull/976 * `IntoLikeExpr` https://github.com/SeaQL/sea-query/pull/974 * `IntoTableRef` https://github.com/SeaQL/sea-query/pull/958 * `IntoTypeRef` https://github.com/SeaQL/sea-query/pull/969 * `IntoValueTuple` https://github.com/SeaQL/sea-query/pull/960 * Unboxed `Value` variants may cause compile error. Simply remove the `Box` in these cases https://github.com/SeaQL/sea-query/pull/925 ```rust error[E0308]: mismatched types --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/sea-schema-0.17.0-rc.3/src/sqlite/def/table.rs:248:59 | > | Value::String(Some(Box::new(string_value.to_string())))); | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `Box` | | | arguments to this enum variant are incorrect ``` * Blanket-implemented `SqliteExpr` and `PgExpr` for `T where T: ExprTrait` https://github.com/SeaQL/sea-query/pull/914 Now you can use database-specific operators with all expression types. If you had custom implementations in your own code, some may no longer compile and may need to be deleted. * Replaced `ColumnSpec::Check(Expr)` with `ColumnSpec::Check(Check)` to support named check constraints https://github.com/SeaQL/sea-query/pull/920 * `SelectStatement::cross_join` no longer accepts a condition https://github.com/SeaQL/sea-query/pull/956 * Turned `TypeRef` from an enum into a struct that reuses `TableName`. https://github.com/SeaQL/sea-query/pull/969 * Changed `Expr::TypeName(DynIden)` to `Expr::TypeName(TypeRef)`, which can be [qualified](https://github.com/SeaQL/sea-query/issues/827). If you manually construct this variant and it no longer compiles, just add `.into()`. * Renamed `QueryBuilder::prepare_simple_expr` to `prepare_expr` https://github.com/SeaQL/sea-query/pull/988 * Changed signature of `Expr::Custom` https://github.com/SeaQL/sea-query/pull/940 ```rust enum Expr { - Custom(String), + Custom(Cow<'static, str>), } fn cust(s: T) -> Self where - T: Into, + T: Into>, { Self::Custom(s.into()) } ``` You many encounter the following error: ```rust | let sql = self.sql.trim(); | ^^^^^^^^ borrowed value does not live long enough ... | Expr::cust_with_values(sql, values.0) | ------------------------------------- argument requires that `self.stmt.sql` is borrowed for `'static` ``` Simply convert the `&str` to `String`: ```rust let sql = self.sql.trim().to_owned(); ``` ### Bug Fixes * Removed invalid condition requirement on `SelectStatement::cross_join` https://github.com/SeaQL/sea-query/pull/956 ### Upgrades * Upgraded to Rust Edition 2024 https://github.com/SeaQL/sea-query/pull/885 ### Maintainence * `sea-query-binder` has been superseded with `sea-query-sqlx` ## 0.32.7 - 2025-08-06 ### Enhancements * Added `ValueType::is_option` ### Bug Fixes * Fix incorrect casting of `ChronoDateTimeWithTimeZone` in `Value::Array` https://github.com/SeaQL/sea-query/pull/933 * Add missing parenthesis to `WINDOW` clause https://github.com/SeaQL/sea-query/pull/919 ```sql SELECT .. OVER "w" FROM "character" WINDOW "w" AS (PARTITION BY "ww") ``` * Fix serializing iden as a value in `ALTER TYPE ... RENAME TO ...` statements https://github.com/SeaQL/sea-query/pull/924 ```sql ALTER TYPE "font" RENAME TO "typeface" ``` * Fixed the issue where milliseconds were truncated when formatting `Value::Constant` https://github.com/SeaQL/sea-query/pull/929 ```sql '2025-01-01 00:00:00.000000' ^^^^^^^ ``` ## 0.32.6 - 2025-05-27 ### Enhancements * impl `From` and `From` for `SimpleExpr` https://github.com/SeaQL/sea-query/pull/886 ## 0.32.5 - 2025-05-07 ### New features * Support for creating functional indexes in Postgres and MySQL https://github.com/SeaQL/sea-query/pull/869 ### Enhancements * Make `RcOrArc` a documented type alias instead of a direct reexport https://github.com/SeaQL/sea-query/pull/875 * Impl `Iden` for `&'static str` (don't wrap strings in `Alias::new`) https://github.com/SeaQL/sea-query/pull/882 ## 0.32.4 - 2025-04-17 ### New Features * Added support for temporary tables https://github.com/SeaQL/sea-query/pull/878 ```rust let statement = Table::create() .table(Font::Table) .temporary() .col( ColumnDef::new(Font::Id) .integer() .not_null() .primary_key() .auto_increment() ) .col(ColumnDef::new(Font::Name).string().not_null()) .take(); assert_eq!( statement.to_string(MysqlQueryBuilder), [ "CREATE TEMPORARY TABLE `font` (", "`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT,", "`name` varchar(255) NOT NULL", ")", ] .join(" ") ); ``` * Added `Value::dummy_value` ```rust use sea_query::Value; let v = Value::Int(None); let n = v.dummy_value(); assert_eq!(n, Value::Int(Some(0))); ``` ### Bug Fixes * Quote type properly in `AsEnum` casting https://github.com/SeaQL/sea-query/pull/880 ```rust let query = Query::select() .expr(Expr::col(Char::FontSize).as_enum(TextArray)) .from(Char::Table) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT CAST("font_size" AS "text"[]) FROM "character""# ); ``` ## 0.32.3 - 2025-03-16 ### New Features * Support `Update FROM ..` https://github.com/SeaQL/sea-query/pull/861 ```rust let query = Query::update() .table(Glyph::Table) .value(Glyph::Tokens, Expr::column((Char::Table, Char::Character))) .from(Char::Table) .cond_where( Expr::col((Glyph::Table, Glyph::Image)) .eq(Expr::col((Char::Table, Char::UserData))), ) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"UPDATE "glyph" SET "tokens" = "character"."character" FROM "character" WHERE "glyph"."image" = "character"."user_data""# ); assert_eq!( query.to_string(SqliteQueryBuilder), r#"UPDATE "glyph" SET "tokens" = "character"."character" FROM "character" WHERE "glyph"."image" = "character"."user_data""# ); ``` * Support `TABLESAMPLE` (Postgres) https://github.com/SeaQL/sea-query/pull/865 ```rust use sea_query::extension::postgres::PostgresSelectStatementExt; let query = Query::select() .columns([Glyph::Image]) .from(Glyph::Table) .table_sample(SampleMethod::SYSTEM, 50.0, None) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT "image" FROM "glyph" TABLESAMPLE SYSTEM (50)"# ); ``` * Support `ALTER COLUMN USING ..` (Postgres) https://github.com/SeaQL/sea-query/pull/848 ```rust let table = Table::alter() .table(Char::Table) .modify_column( ColumnDef::new(Char::Id) .integer() .using(Expr::col(Char::Id).cast_as(Alias::new("integer"))), ) .to_owned(); assert_eq!( table.to_string(PostgresQueryBuilder), [ r#"ALTER TABLE "character""#, r#"ALTER COLUMN "id" TYPE integer USING CAST("id" AS integer)"#, ] .join(" ") ); ``` ### House Keeping * Updated `ordered-float` to `4` * Updated `thiserror` to `2` ## 0.32.2 - 2025-02-18 ### New Features * Added `with_cte` to use `WITH` clauses in all statements https://github.com/SeaQL/sea-query/pull/859 ```rust let select = SelectStatement::new() .columns([Glyph::Id, Glyph::Image, Glyph::Aspect]) .from(Glyph::Table) .to_owned(); let cte = CommonTableExpression::new() .query(select) .table_name(Alias::new("cte")) .to_owned(); let select = SelectStatement::new() .columns([Glyph::Id, Glyph::Image, Glyph::Aspect]) .from(Alias::new("cte")) .with_cte(cte) .to_owned(); assert_eq!( select.to_string(PostgresQueryBuilder), [ r#"WITH "cte" AS"#, r#"(SELECT "id", "image", "aspect""#, r#"FROM "glyph")"#, r#"SELECT "id", "image", "aspect" FROM "cte""#, ] .join(" ") ); ``` ### Enhancements * Added `Expr::column` https://github.com/SeaQL/sea-query/pull/852 * Added Postgres function `DATE_TRUNC` https://github.com/SeaQL/sea-query/pull/825 * Added `INCLUDE` clause for Postgres BTree index https://github.com/SeaQL/sea-query/pull/826 ### Bug Fixes * Write empty Postgres array as '{}' https://github.com/SeaQL/sea-query/pull/854 ## 0.32.1 - 2024-12-01 ### New Features * Added `Value::as_null` ```rust let v = Value::Int(Some(2)); let n = v.as_null(); assert_eq!(n, Value::Int(None)); ``` * Added bitwise and/or operators (`bit_and`, `bit_or`) https://github.com/SeaQL/sea-query/pull/841 ```rust let query = Query::select() .expr(1.bit_and(2).eq(3)) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT (1 & 2) = 3"# ); ``` ### Enhancements * Added `GREATEST` & `LEAST` function https://github.com/SeaQL/sea-query/pull/844 * Added `ValueType::enum_type_name()` https://github.com/SeaQL/sea-query/pull/836 * Removed "one common table" restriction on recursive CTE https://github.com/SeaQL/sea-query/pull/835 ### House keeping * Remove unnecessary string hashes https://github.com/SeaQL/sea-query/pull/815 ## 0.32.0 - 2024-10-17 ### Releases #### 2024-08-09 + `sea-query`/`0.32.0-rc.1` + `sea-query-binder`/`0.7.0-rc.1` + `sea-query-binder`/`0.7.0-rc.2` + `sea-query-rusqlite`/`0.7.0-rc.1` + `sea-query-postgres`/`0.5.0-rc.1` #### 2024-10-05 + `sea-query`/`0.32.0-rc.2` + `sea-query-attr`/`0.1.3` + `sea-query-derive`/`0.4.2` + `sea-query-rusqlite`/`0.7.0-rc.2` ### New Features * Construct Postgres query with vector extension https://github.com/SeaQL/sea-query/pull/774 * Added `postgres-vector` feature flag * Added `Value::Vector`, `ColumnType::Vector`, `ColumnDef::vector()`, `PgBinOper::EuclideanDistance`, `PgBinOper::NegativeInnerProduct` and `PgBinOper::CosineDistance` ```rust assert_eq!( Query::select() .columns([Char::Character]) .from(Char::Table) .and_where( Expr::col(Char::Character).eq(Expr::val(pgvector::Vector::from(vec![1.0, 2.0]))) ) .to_string(PostgresQueryBuilder), r#"SELECT "character" FROM "character" WHERE "character" = '[1,2]'"# ); ``` * Added `ExprTrait` to unify `Expr` and `SimpleExpr` methods https://github.com/SeaQL/sea-query/pull/791 * Support partial index `CREATE INDEX .. WHERE ..` https://github.com/SeaQL/sea-query/pull/478 ### Enhancements * Replace `Educe` with manual implementations https://github.com/SeaQL/sea-query/pull/817 #### `sea-query-derive` * Merged `#[enum_def]` into `sea-query-derive` * `#[enum_def]` now impl additional `IdenStatic` and `AsRef` https://github.com/SeaQL/sea-query/pull/769 #### `sea-query-attr` * Updated `syn`, `heck` and `darling` * `sea-query-attr` is now deprecated ### Upgrades * Upgrade `sqlx` to `0.8` https://github.com/SeaQL/sea-query/pull/798 * Upgrade `bigdecimal` to `0.4` https://github.com/SeaQL/sea-query/pull/798 * Upgrade `rusqlite` to `0.32` https://github.com/SeaQL/sea-query/pull/802 ## 0.31.1 - 2024-10-05 ### Enhancements * Derive `Eq`, `Ord`, `Hash` for `Alias` https://github.com/SeaQL/sea-query/pull/818 * Added `Func::md5` function https://github.com/SeaQL/sea-query/pull/786 * Added Postgres Json functions `JSON_BUILD_OBJECT` and `JSON_AGG` https://github.com/SeaQL/sea-query/pull/787 * Added Postgres function `ARRAY_AGG` https://github.com/SeaQL/sea-query/pull/846 * Added `Func::cast_as_quoted` https://github.com/SeaQL/sea-query/pull/789 * Added `IF NOT EXISTS` to `ALTER TYPE ADD VALUE` https://github.com/SeaQL/sea-query/pull/803 ## 0.31.0 - 2024-08-02 ### Versions + `sea-query`/`0.31.0-rc.1`: 2024-01-31 + `sea-query`/`0.31.0-rc.4`: 2024-02-02 + `sea-query`/`0.31.0-rc.5`: 2024-04-14 + `sea-query`/`0.31.0-rc.6`: 2024-05-03 + `sea-query`/`0.31.0-rc.7`: 2024-06-02 + `sea-query`/`0.31.0-rc.8`: 2024-06-19 + `sea-query-binder`/`0.6.0-rc.1`: 2024-01-31 + `sea-query-binder`/`0.6.0-rc.2`: 2024-04-14 + `sea-query-binder`/`0.6.0-rc.3`: 2024-06-19 + `sea-query-binder`/`0.6.0-rc.4`: 2024-06-25 + `sea-query-binder`/`0.6.0`: 2024-08-02 + `sea-query-rusqlite`/`0.6.0-rc.1`: 2024-02-19 + `sea-query-rusqlite`/`0.6.0`: 2024-08-02 + `sea-query-attr`/`0.1.2`: 2024-04-14 + `sea-query-diesel`/`0.2.0`: 2024-08-02 ### New Features * Added `table_name` attribute to `enum_def` macro https://github.com/SeaQL/sea-query/pull/759 * Added `ColumnType::Blob` https://github.com/SeaQL/sea-query/pull/777 ### Breaking Changes * Rework SQLite type mapping https://github.com/SeaQL/sea-query/pull/735 ```rust assert_eq!( Table::create() .table(Alias::new("strange")) .col(ColumnDef::new(Alias::new("id")).integer().not_null().auto_increment().primary_key()) .col(ColumnDef::new(Alias::new("int1")).integer()) .col(ColumnDef::new(Alias::new("int2")).tiny_integer()) .col(ColumnDef::new(Alias::new("int3")).small_integer()) .col(ColumnDef::new(Alias::new("int4")).big_integer()) .col(ColumnDef::new(Alias::new("string1")).string()) .col(ColumnDef::new(Alias::new("string2")).string_len(24)) .col(ColumnDef::new(Alias::new("char1")).char()) .col(ColumnDef::new(Alias::new("char2")).char_len(24)) .col(ColumnDef::new(Alias::new("text_col")).text()) .col(ColumnDef::new(Alias::new("json_col")).json()) .col(ColumnDef::new(Alias::new("uuid_col")).uuid()) .col(ColumnDef::new(Alias::new("decimal1")).decimal()) .col(ColumnDef::new(Alias::new("decimal2")).decimal_len(12, 4)) .col(ColumnDef::new(Alias::new("money1")).money()) .col(ColumnDef::new(Alias::new("money2")).money_len(12, 4)) .col(ColumnDef::new(Alias::new("float_col")).float()) .col(ColumnDef::new(Alias::new("double_col")).double()) .col(ColumnDef::new(Alias::new("date_col")).date()) .col(ColumnDef::new(Alias::new("time_col")).time()) .col(ColumnDef::new(Alias::new("datetime_col")).date_time()) .col(ColumnDef::new(Alias::new("boolean_col")).boolean()) .col(ColumnDef::new(Alias::new("binary2")).binary_len(1024)) .col(ColumnDef::new(Alias::new("binary3")).var_binary(1024)) .col(ColumnDef::new(Alias::new("binary4")).blob()) .to_string(SqliteQueryBuilder), [ r#"CREATE TABLE "strange" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"#, r#""int1" integer,"#, r#""int2" tinyint,"#, r#""int3" smallint,"#, r#""int4" bigint,"#, r#""string1" varchar,"#, r#""string2" varchar(24),"#, r#""char1" char,"#, r#""char2" char(24),"#, r#""text_col" text,"#, r#""json_col" json_text,"#, r#""uuid_col" uuid_text,"#, r#""decimal1" real,"#, r#""decimal2" real(12, 4),"#, r#""money1" real_money,"#, r#""money2" real_money(12, 4),"#, r#""float_col" float,"#, r#""double_col" double,"#, r#""date_col" date_text,"#, r#""time_col" time_text,"#, r#""datetime_col" datetime_text,"#, r#""boolean_col" boolean,"#, r#""binary2" blob(1024),"#, r#""binary3" varbinary_blob(1024),"#, r#""binary4" blob"#, r#")"#, ] .join(" ") ); ``` * MySQL money type maps to decimal * MySQL blob types moved to `sea_query::extension::mysql::MySqlType`; `ColumnDef::blob()` now takes no parameters ```rust assert_eq!( Table::create() .table(BinaryType::Table) .col(ColumnDef::new(BinaryType::BinaryLen).binary_len(32)) .col(ColumnDef::new(BinaryType::Binary).binary()) .col(ColumnDef::new(BinaryType::Blob).blob()) .col(ColumnDef::new(BinaryType::TinyBlob).custom(MySqlType::TinyBlob)) .col(ColumnDef::new(BinaryType::MediumBlob).custom(MySqlType::MediumBlob)) .col(ColumnDef::new(BinaryType::LongBlob).custom(MySqlType::LongBlob)) .to_string(MysqlQueryBuilder), [ "CREATE TABLE `binary_type` (", "`binlen` binary(32),", "`bin` binary(1),", "`b` blob,", "`tb` tinyblob,", "`mb` mediumblob,", "`lb` longblob", ")", ] .join(" ") ); ``` * `ColumnDef::binary()` set column type as binary with default length of 1 * Removed `BlobSize` enum * Added `StringLen` to represent length of var-char/binary ```rust /// Length for var-char/binary; default to 255 #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub enum StringLen { /// String size N(u32), Max, #[default] None, } ``` * `ValueType::columntype()` of `Vec` maps to `VarBinary(StringLen::None)` * `ValueType::columntype()` of `String` maps to `String(StringLen::None)` * `ColumnType::Bit` maps to `bit` for Postgres * `ColumnType::Binary` and `ColumnType::VarBinary` map to `bytea` for Postgres * `Value::Decimal` and `Value::BigDecimal` bind as `real` for SQLite * `ColumnType::Year(Option)` changed to `ColumnType::Year` ### Enhancements * Added `IntoColumnDef` trait, allowing `&mut ColumnDef` / `ColumnDef` as argument * Added `ColumnType::string()` and `ColumnType::var_binary()` as shim for old API * Added `ON DUPLICATE KEY DO NOTHING` polyfill for MySQL https://github.com/SeaQL/sea-query/pull/765 * Added non-TLS runtime https://github.com/SeaQL/sea-query/pull/783 ### House keeping * Added `ColumnType` mapping documentation * Replace `derivative` with `educe` https://github.com/SeaQL/sea-query/pull/763 ### Upgrades * Upgrade `rusqlite` to `0.31` https://github.com/SeaQL/sea-query/pull/755 * Upgrade `time` to `0.3.36` https://github.com/SeaQL/sea-query/pull/788 ## 0.30.8 - Pending ### Enhancements * Added `InsertStatement::values_from_panic` https://github.com/SeaQL/sea-query/pull/739 ## 0.30.7 - 2024-01-12 ### Enhancements * Added `SelectStatement::apply` https://github.com/SeaQL/sea-query/pull/730 ### House keeping * Slight refactors and documentation update ## 0.30.6 - 2024-01-01 ### House keeping * Fix clippy warnings on Rust 1.75 https://github.com/SeaQL/sea-query/pull/729 ## `sea-query-rusqlite` 0.5.0 - 2023-12-29 * Upgrade `rusqlite` to `0.30` https://github.com/SeaQL/sea-query/pull/728 ## 0.30.5 - 2023-12-14 ### New Features * Added feature flag `option-more-parentheses` to have more parentheses in expressions https://github.com/SeaQL/sea-query/pull/723 * Added feature flag `option-sqlite-exact-column-type` to only use `integer` for SQLite * Support `COUNT(DISTINCT "column")` https://github.com/SeaQL/sea-query/pull/700 * Support index hints for MySQL (via `extension::mysql::MySqlSelectStatementExt`) https://github.com/SeaQL/sea-query/pull/636 * Support expressions for `ON CONFLICT` targets https://github.com/SeaQL/sea-query/pull/692 ### Enhancements * Add `from_clear` to allow emptying current from tables in select statement https://github.com/SeaQL/sea-query/pull/716 ### Breaking Changes * Caution: do not use the `--all-features` param in Cargo. If you want to enable all features, use the `all-features` feature flag instead. ## 0.30.4 - 2023-12-01 ### Enhancements * Impl `QueryStatementWriter` as inherent methods for `WithQuery` ## 0.30.3 - 2023-11-22 ### New Features * Added `LTree` column type https://github.com/SeaQL/sea-query/pull/604 * Improved parenthesis omission logic https://github.com/SeaQL/sea-query/pull/675 ### Bug Fixes * Fixed `BIGINT PRIMARY KEY AUTOINCREMENT` for SQLite https://github.com/SeaQL/sea-query/issues/689 ### Upgrades * Upgrade `chrono` to `0.4.27` ### Breaking changes * Removed `ToTokens` for `PgInterval` https://github.com/SeaQL/sea-query/pull/710 ### `sea-query-derive` 0.4.1 - 2023-10-19 * Upgrade `syn` to `2` ## 0.30.2 - 2023-09-23 + [`sea-query-diesel`/`0.1.0`](https://crates.io/crates/sea-query-diesel/0.1.0) ### Bug Fixes * Fixed incorrect behavior when adding an autoincrement column for Postgres https://github.com/SeaQL/sea-query/pull/697 ### Enhancements * Make `ValueTuple` hashable ## 0.30.1 - 2023-08-25 ### Versions + [`sea-query-postgres`/`0.4.0`](https://crates.io/crates/sea-query-postgres/0.4.0) + [`sea-query-rusqlite`/`0.4.0`](https://crates.io/crates/sea-query-rusqlite/0.4.0) + [`sea-query-rbatis`/`0.1.0`](https://crates.io/crates/sea-query-rbatis/0.1.0) ### New Features * Added `Func::round` and `Func::round_with_precision` https://github.com/SeaQL/sea-query/pull/671 ### Enhancements * Added some getters to `FunctionCall` https://github.com/SeaQL/sea-query/pull/677 ### Bug Fixes * Fixed bytea literal syntax for Postgres https://github.com/SeaQL/sea-query/pull/666 * Fixed issues with semantics of parenthesis removal https://github.com/SeaQL/sea-query/pull/675 * Fixed behaviour in `FunctionCall` when calling `arg` multiple times https://github.com/SeaQL/sea-query/pull/687 ### Breaking changes * As part of https://github.com/SeaQL/sea-query/pull/687, calling `FunctionCall::arg` multiple times will append the arguments instead of replacing old values ## 0.30.0 - 2023-07-20 This is a small (but major) upgrade, the only changes are: * Upgrade [SQLx to `0.7`](https://github.com/launchbadge/sqlx/blob/main/CHANGELOG.md#071---2023-07-14) https://github.com/SeaQL/sea-query/pull/652 * Upgrade ipnetwork to `0.20` ### Versions + [`sea-query-binder`/`0.5.0`](https://crates.io/crates/sea-query-binder/0.5.0) ### Notes `sea-query 0.29` has a number of breaking changes, so it might be easier for you to first upgrade to `0.29`, then upgrade `sqlx` by bumping to `0.30`. ## 0.29.1 - 2023-07-12 ### Versions + `sea-query`/`0.29.0-rc.1`: 2023-03-22 + `sea-query`/`0.29.0` (Yanked) + `sea-query`/`0.29.1`: 2023-07-12 + [`sea-query-binder`/`0.4.0`](https://crates.io/crates/sea-query-binder/0.4.0) + [`sea-query-postgres`/`0.3.0`](https://crates.io/crates/sea-query-postgres/0.3.0) + [`sea-query-rusqlite`/`0.3.0`](https://crates.io/crates/sea-query-rusqlite/0.3.0) ### New Features * Added `ValueTuple::Many` for tuple with length up to 12 https://github.com/SeaQL/sea-query/pull/564 * Added `CREATE TABLE CHECK` constraints https://github.com/SeaQL/sea-query/pull/567 * Added support generated column spec https://github.com/SeaQL/sea-query/pull/581 * Added `BIT_AND`, `BIT_OR` functions https://github.com/SeaQL/sea-query/pull/582 * Added implementation `SqlxBinder`, `RusqliteBinder` and `PostgresBinder` for `WithQuery` https://github.com/SeaQL/sea-query/pull/580 * Added new type `Asteriks` https://github.com/SeaQL/sea-query/pull/596 * Added `IF NOT EXISTS` for `DROP INDEX` in Postgres and Sqlite https://github.com/SeaQL/sea-query/pull/610 * Added `->` and `->>` operators for Postgres https://github.com/SeaQL/sea-query/pull/617 * Added `TableCreateStatement::set_extra` and `TableCreateStatement::get_extra` https://github.com/SeaQL/sea-query/pull/611 * Added `TableCreateStatement::comment` and `ColumnDef::comment` for MySQL comments https://github.com/SeaQL/sea-query/pull/622 * Added `PgExpr::get_json_field` and `PgExpr::cast_json_field` methods for constructing Postgres JSON expressions https://github.com/SeaQL/sea-query/pull/630 * Added `PgBinOper::Regex` and `PgBinOper::RegexCaseInsensitive` for Postgres Regex operators * Added `BinOper::Custom` for defining custom binary operators * Added `GLOB` operator for Sqlite https://github.com/SeaQL/sea-query/pull/651/ * Added `CREATE or DROP EXTENSION` statements for Postgres https://github.com/SeaQL/sea-query/pull/616 * Added a feature flag `hashable-value`, which will `impl Hash for Value`; when enabled, `Value::Float(NaN) == Value::Float(NaN)` would be true https://github.com/SeaQL/sea-query/pull/598 * Added `PgBinOper::Overlap` for Postgres operators https://github.com/SeaQL/sea-query/pull/653 ### Enhancements * Implemented `PartialEq` for `DynIden`, `SimpleExpr` and related types https://github.com/SeaQL/sea-query/pull/620 ### Breaking changes * Removed variants `Four, Five, Six` from `enum ValueTuple` as part of https://github.com/SeaQL/sea-query/pull/564 * Removed `Expr::tbl`, `Expr::greater_than`, `Expr::greater_or_equal`, `Expr::less_than`, `Expr::less_or_equal`, `Expr::into_simple_expr` https://github.com/SeaQL/sea-query/pull/551 * Removed `SimpleExpr::equals` and `SimpleExpr::not_equals` https://github.com/SeaQL/sea-query/pull/551 * Removed `InsertStatement::exprs`, `InsertStatement::exprs_panic` https://github.com/SeaQL/sea-query/pull/551 * Removed `OnConflict::update_value`, `OnConflict::update_values`, `OnConflict::update_expr`, `OnConflict::update_exprs` https://github.com/SeaQL/sea-query/pull/551 * Removed `UpdateStatement::exprs`, `UpdateStatement::col_expr`, `UpdateStatement::value_expr` https://github.com/SeaQL/sea-query/pull/551 * `BigInteger` now maps to `bigint` instead of `integer` on SQLite https://github.com/SeaQL/sea-query/pull/556 * `Table::truncate` now panic for Sqlite https://github.com/SeaQL/sea-query/pull/590 * Deprecated `Expr::asteriks` and `Expr::table_asteriks` https://github.com/SeaQL/sea-query/pull/596 * `Expr::cust`, `Expr::cust_with_values`, `Expr::cust_with_expr`, `Expr::cust_with_exprs`, `TableForeignKey::name`, `ForeignKeyCreateStatement::name`, `ForeignKeyDropStatement::name`, `TableIndex::name`, `IndexCreateStatement::name`, `IndexDropStatement::name`, `SqlWriterValues::new`, `ColumnType::custom`, `TableCreateStatement::engine`, `TableCreateStatement::collate`, `TableCreateStatement::character_set`, `TableRef::new`, `LikeExpr::str` now accept `T: Into` https://github.com/SeaQL/sea-query/pull/594 * `OnConflict::values` and `OnConflict::update_columns` will append the new values keeping the old values intact instead of erasing them https://github.com/SeaQL/sea-query/pull/609 * As part of https://github.com/SeaQL/sea-query/pull/620, `SeaRc` now becomes a wrapper type. If you used `SeaRc` for something other than `dyn Iden`, you now have to use `RcOrArc`. However be reminded that it is not an intended use of the API anyway. ```rust // new definition struct SeaRc(RcOrArc); // remains unchanged type DynIden = SeaRc; // if you did: let _: DynIden = Rc::new(Alias::new("char")); // replace with: let _: DynIden = SeaRc::new(Alias::new("char")); ``` * Added new type `Quote` and changed the `Iden` trait: ```rust struct Quote(pub(crate) u8, pub(crate) u8); trait Iden { // then: fn prepare(&self, s: &mut dyn fmt::Write, q: char); // now: fn prepare(&self, s: &mut dyn fmt::Write, q: Quote); // then: fn quoted(&self, q: char) -> String; // now: fn quoted(&self, q: Quote) -> String; } ``` ### House keeping * Elided unnecessary lifetimes https://github.com/SeaQL/sea-query/pull/552 * Changed all `version = "^x.y.z"` into `version = "x.y.z"` in all Cargo.toml https://github.com/SeaQL/sea-query/pull/547/ * Disabled default features and enable only the needed ones https://github.com/SeaQL/sea-query/pull/547/ * `tests_cfg` module is available only if you enabled `tests-cfg` feature https://github.com/SeaQL/sea-query/pull/584 * Removed hard coded quotes https://github.com/SeaQL/sea-query/pull/613 * Enabled required `syn` v1 features https://github.com/SeaQL/sea-query/pull/624 * Fix macro hygiene (`any!` / `all!`) https://github.com/SeaQL/sea-query/pull/639 https://github.com/SeaQL/sea-query/pull/640 ### Bug fixes * `ALTER TABLE` now panic if has multiple column for Sqlite https://github.com/SeaQL/sea-query/pull/595 * Fixed alter primary key column statements for Postgres https://github.com/SeaQL/sea-query/pull/646 ## 0.28.5 - 2023-05-11 * Added implementation `SqlxBinder`, `RusqliteBinder` and `PostgresBinder` for `WithQuery` https://github.com/SeaQL/sea-query/pull/580 * `sea-query-binder` `0.3.1` * `sea-query-postgres` `0.2.1` * `sea-query-rusqlite` `0.2.1` ## 0.28.4 - 2023-04-11 ### Bug fixes * Fix quoted string bug while inserting array of strings to Postgres https://github.com/SeaQL/sea-query/pull/576 * Added comma if multiple names are passed to `TypeDropStatement` https://github.com/SeaQL/sea-query/pull/623 ## 0.28.3 - 2023-01-18 ### Enhancements * Added getter for the `UpdateStatement::values` field https://github.com/SeaQL/sea-query/pull/578 * Implements `PartialEq` for `ColumnType` https://github.com/SeaQL/sea-query/pull/579 * Added helper function to construct `ColumnType::Custom` https://github.com/SeaQL/sea-query/pull/579 ## 0.28.2 - 2023-01-04 ### Enhancements * Added `Cow` conversion to `Value` https://github.com/SeaQL/sea-query/pull/550 * Added convert various `UUID` defined in `uuid::fmt` module into `sea_query::Value::Uuid` https://github.com/SeaQL/sea-query/pull/563 ## 0.28.1 - 2022-12-29 ### Bug fixes * Fixes Postgres `GEN_RANDOM_UUID` https://github.com/SeaQL/sea-query/issues/568 ## 0.28.0 - 2022-12-09 ### New Features * New struct `FunctionCall` which hold function and arguments https://github.com/SeaQL/sea-query/pull/475 * New trait `IdenStatic` with method `fn as_str(&self) -> &'static str` https://github.com/SeaQL/sea-query/pull/508 * New traits `PgExpr` and `SqliteExpr` for custom expressions https://github.com/SeaQL/sea-query/pull/519 * Support `BigDecimal`, `IpNetwork` and `MacAddress` for `sea-query-postgres` https://github.com/SeaQL/sea-query/pull/503 ### API Additions * Added `SelectStatement::from_function` https://github.com/SeaQL/sea-query/pull/475 * Added binary operators from the Postgres `pg_trgm` extension https://github.com/SeaQL/sea-query/pull/486 * Added `ILIKE` and `NOT ILIKE` operators https://github.com/SeaQL/sea-query/pull/473 * Added the `mul` and `div` methods for `SimpleExpr` https://github.com/SeaQL/sea-query/pull/510 * Added the `MATCH`, `->` and `->>` operators for SQLite https://github.com/SeaQL/sea-query/pull/513 * Added the `FULL OUTER JOIN` https://github.com/SeaQL/sea-query/pull/497 * Added `PgFunc::get_random_uuid` https://github.com/SeaQL/sea-query/pull/530 * Added `SimpleExpr::eq`, `SimpleExpr::ne`, `Expr::not_equals` https://github.com/SeaQL/sea-query/pull/528 * Added `PgFunc::starts_with` https://github.com/SeaQL/sea-query/pull/529 * Added `Expr::custom_keyword` and `SimpleExpr::not` https://github.com/SeaQL/sea-query/pull/535 * Added `SimpleExpr::like`, `SimpleExpr::not_like` and `Expr::cast_as` https://github.com/SeaQL/sea-query/pull/539 * Added support for `NULLS NOT DISTINCT` clause for Postgres https://github.com/SeaQL/sea-query/pull/532 * Added `Expr::cust_with_expr` and `Expr::cust_with_exprs` https://github.com/SeaQL/sea-query/pull/531 * Added support for converting `&String` to Value https://github.com/SeaQL/sea-query/issues/537 ### Enhancements * Made `value::with_array` module public and therefore making `NotU8` trait public https://github.com/SeaQL/sea-query/pull/511 * Drop the `Sized` requirement on implementers of `SchemaBuilders` https://github.com/SeaQL/sea-query/pull/524 ### Bug fixes * Wrap unions into parenthesis https://github.com/SeaQL/sea-query/pull/498 * Syntax error on empty condition https://github.com/SeaQL/sea-query/pull/505 ```rust // given let (statement, values) = sea_query::Query::select() .column(Glyph::Id) .from(Glyph::Table) .cond_where(Cond::any() .add(Cond::all()) // empty all() => TRUE .add(Cond::any()) // empty any() => FALSE ) .build(sea_query::MysqlQueryBuilder); // old behavior assert_eq!(statement, r#"SELECT `id` FROM `glyph`"#); // new behavior assert_eq!( statement, r#"SELECT `id` FROM `glyph` WHERE (TRUE) OR (FALSE)"# ); ``` ### Breaking changes * MSRV is up to 1.62 https://github.com/SeaQL/sea-query/pull/535 * `ColumnType::Array` definition changed from `Array(SeaRc>)` to `Array(SeaRc)` https://github.com/SeaQL/sea-query/pull/492 * `Func::*` now returns `FunctionCall` instead of `SimpleExpr` https://github.com/SeaQL/sea-query/pull/475 * `Func::coalesce` now accepts `IntoIterator` instead of `IntoIterator` https://github.com/SeaQL/sea-query/pull/475 * Removed `Expr::arg` and `Expr::args` - these functions are no longer needed https://github.com/SeaQL/sea-query/pull/475 * Moved all Postgres specific operators to `PgBinOper` https://github.com/SeaQL/sea-query/pull/507 * `Expr::value`, `Expr::gt`, `Expr::gte`, `Expr::lt`, `Expr::lte`, `Expr::add`, `Expr::div`, `Expr::sub`, `Expr::modulo`, `Expr::left_shift`, `Expr::right_shift`, `Expr::between`, `Expr::not_between`, `Expr::is`, `Expr::is_not`, `Expr::if_null` now accepts `Into` instead of `Into` https://github.com/SeaQL/sea-query/pull/476 * `Expr::is_in`, `Expr::is_not_in` now accepts `Into` instead of `Into` and convert it to `SimpleExpr::Tuple` instead of `SimpleExpr::Values` https://github.com/SeaQL/sea-query/pull/476 * `Expr::expr` now accepts `Into` instead of `SimpleExpr` https://github.com/SeaQL/sea-query/pull/475 * Moved `Expr::ilike`, `Expr::not_ilike`, `Expr::matches`, `Expr::contains`, `Expr::contained`, `Expr::concatenate`, `Expr::concat`, `SimpleExpr::concatenate` and `SimpleExpr::concat` to new trait `PgExpr` https://github.com/SeaQL/sea-query/pull/519 * `Expr::equals` now accepts `C: IntoColumnRef` instead of `T: IntoIden, C: IntoIden` https://github.com/SeaQL/sea-query/pull/528 * Removed integer and date time column types' display length / precision option https://github.com/SeaQL/sea-query/pull/525 ### Deprecations * Deprecated `Expr::greater_than`, `Expr::greater_or_equal`, `Expr::less_than` and `Expr::less_or_equal` https://github.com/SeaQL/sea-query/pull/476 * Deprecated `SimpleExpr::equals`, `SimpleExpr::not_equals` https://github.com/SeaQL/sea-query/pull/528 * Deprecated `Expr::tbl`, please use `Expr::col` with a tuple https://github.com/SeaQL/sea-query/pull/540 ### House keeping * Replace `impl Default` with `#[derive(Default)]` https://github.com/SeaQL/sea-query/pull/535 * Exclude `sqlx` default features https://github.com/SeaQL/sea-query/pull/543 * Use `dtolnay/rust-toolchain` instead of `actions-rs/toolchain` in `CI` https://github.com/SeaQL/sea-query/pull/544 ## 0.27.2 - 2022-11-14 * Made `value::with_array` module public and therefore making `NotU8` trait public https://github.com/SeaQL/sea-query/pull/511 ## sea-query-binder 0.2.2 * Enable SQLx features only if SQLx optional dependency is enabled https://github.com/SeaQL/sea-query/pull/517 ## 0.27.1 - 2022-10-18 * Fix consecutive spacing on schema statements https://github.com/SeaQL/sea-query/pull/481 * SQLite bind `rust_decimal` & `bigdecimal` as f64 https://github.com/SeaQL/sea-query/pull/480 ## 0.27.0 - 2022-10-16 ### New Features * Support `CROSS JOIN` https://github.com/SeaQL/sea-query/pull/376 * We are going through series of changes to how database drivers work (https://github.com/SeaQL/sea-query/pull/416, https://github.com/SeaQL/sea-query/pull/423): 1. `sea-query-binder` is now the recommended way (trait based) of working with SQLx, replacing `sea-query-driver` (macro based) https://github.com/SeaQL/sea-query/pull/434 2. `sea-query-binder` is now a separate dependency, instead of integrated with `sea-query` https://github.com/SeaQL/sea-query/pull/432 3. `rusqlite` support is moved to `sea-query-rusqlite` https://github.com/SeaQL/sea-query/pull/422 4. `postgres` support is moved to `sea-query-postgres` https://github.com/SeaQL/sea-query/pull/433 * Added sub-query operators: `EXISTS`, `ALL`, `ANY`, `SOME` https://github.com/SeaQL/sea-query/pull/379 * Added support to `ON CONFLICT WHERE` https://github.com/SeaQL/sea-query/pull/447 * Added support `DROP COLUMN` for SQLite https://github.com/SeaQL/sea-query/pull/455 * Added `YEAR`, `BIT` and `VARBIT` types https://github.com/SeaQL/sea-query/pull/466 * Added support one dimension Postgres array for SQLx https://github.com/SeaQL/sea-query/pull/467 ### Enhancements * Handle Postgres schema name for schema statements https://github.com/SeaQL/sea-query/pull/385 * Added `%`, `<<` and `>>` binary operators https://github.com/SeaQL/sea-query/pull/419 * Added `RAND` function https://github.com/SeaQL/sea-query/pull/430 * Implements `Display` for `Value` https://github.com/SeaQL/sea-query/pull/425 * Added `INTERSECT` and `EXCEPT` to `UnionType` https://github.com/SeaQL/sea-query/pull/438 * Added `OnConflict::value` and `OnConflict::values` https://github.com/SeaQL/sea-query/issues/451 * `ColumnDef::default` now accepts both `Value` and `SimpleExpr` https://github.com/SeaQL/sea-query/pull/436 * `OrderedStatement::order_by_customs`, `OrderedStatement::order_by_columns`, `OverStatement::partition_by_customs`, `OverStatement::partition_by_columns` now accepts `IntoIterator` instead of `Vec` https://github.com/SeaQL/sea-query/pull/448 * `Expr::case`, `CaseStatement::case` and `CaseStatement::finally` now accepts `Into` instead of `Into` https://github.com/SeaQL/sea-query/pull/460 * `UpdateStatement::value` now accept `Into` instead of `Into` https://github.com/SeaQL/sea-query/pull/460 * `TableAlterStatement::rename_column`, `TableAlterStatement::drop_column`, `ColumnDef::new`, `ColumnDef::new_with_type` now accepts `IntoIden` instead of `Iden` https://github.com/SeaQL/sea-query/pull/472 ### Bug Fixes * `distinct_on` properly handles `ColumnRef` https://github.com/SeaQL/sea-query/pull/450 * Removed `ON` for `DROP INDEX` for SQLite https://github.com/SeaQL/sea-query/pull/462 * Change datetime string format to include microseconds https://github.com/SeaQL/sea-query/pull/468 * `ALTER TABLE` for PosgreSQL with `UNIQUE` constraint https://github.com/SeaQL/sea-query/pull/472 ### Breaking changes * Changed `in_tuples` interface to accept `IntoValueTuple` https://github.com/SeaQL/sea-query/pull/386 * Removed deprecated methods (`or_where`, `or_having`, `table_column` etc) https://github.com/SeaQL/sea-query/pull/380 * **Changed `cond_where` chaining semantics** https://github.com/SeaQL/sea-query/pull/417 ```rust // Before: will extend current Condition assert_eq!( Query::select() .cond_where(any![Expr::col(Glyph::Id).eq(1), Expr::col(Glyph::Id).eq(2)]) .cond_where(Expr::col(Glyph::Id).eq(3)) .to_owned() .to_string(PostgresQueryBuilder), r#"SELECT WHERE "id" = 1 OR "id" = 2 OR "id" = 3"# ); // Before: confusing, since it depends on the order of invocation: assert_eq!( Query::select() .cond_where(Expr::col(Glyph::Id).eq(3)) .cond_where(any![Expr::col(Glyph::Id).eq(1), Expr::col(Glyph::Id).eq(2)]) .to_owned() .to_string(PostgresQueryBuilder), r#"SELECT WHERE "id" = 3 AND ("id" = 1 OR "id" = 2)"# ); // Now: will always conjoin with `AND` assert_eq!( Query::select() .cond_where(Expr::col(Glyph::Id).eq(1)) .cond_where(any![Expr::col(Glyph::Id).eq(2), Expr::col(Glyph::Id).eq(3)]) .to_owned() .to_string(PostgresQueryBuilder), r#"SELECT WHERE "id" = 1 AND ("id" = 2 OR "id" = 3)"# ); // Now: so they are now equivalent assert_eq!( Query::select() .cond_where(any![Expr::col(Glyph::Id).eq(2), Expr::col(Glyph::Id).eq(3)]) .cond_where(Expr::col(Glyph::Id).eq(1)) .to_owned() .to_string(PostgresQueryBuilder), r#"SELECT WHERE ("id" = 2 OR "id" = 3) AND "id" = 1"# ); ``` * `CURRENT_TIMESTAMP` changed from being a function to keyword https://github.com/SeaQL/sea-query/pull/441 * Update SQLite `boolean` type from `integer` to `boolean` https://github.com/SeaQL/sea-query/pull/400 * Changed type of `ColumnType::Enum` from `(String, Vec)` to: https://github.com/SeaQL/sea-query/pull/435 ```rust Enum { name: DynIden, variants: Vec, } ``` * Deprecated `InsertStatement::exprs`, `InsertStatement::exprs_panic`, `OnConflict::update_value`, `OnConflict::update_values`, `OnConflict::update_expr`, `OnConflict::update_exprs`, `UpdateStatement::col_expr`, `UpdateStatement::value_expr`, `UpdateStatement::exprs` https://github.com/SeaQL/sea-query/pull/460 * `InsertStatement::values`, `UpdateStatement::values` now accepts `IntoIterator` instead of `IntoIterator` https://github.com/SeaQL/sea-query/pull/460 * Use native api from SQLx for SQLite to work with `time` https://github.com/SeaQL/sea-query/pull/412 ### House keeping * Cleanup `IndexBuilder` trait methods https://github.com/SeaQL/sea-query/pull/426 * Introduce `SqlWriter` trait https://github.com/SeaQL/sea-query/pull/436 * Remove unneeded `vec!` from examples https://github.com/SeaQL/sea-query/pull/448 ### Upgrades * Upgrade `sqlx` driver to 0.6.1 ## 0.26.4 - 2022-10-13 ### New Features * Added support `DROP COLUMN` for SQLite https://github.com/SeaQL/sea-query/pull/455 ### Bug Fixes * Removed `ON` for `DROP INDEX` for SQLite https://github.com/SeaQL/sea-query/pull/462 * Changed datetime display format to include microseconds https://github.com/SeaQL/sea-query/pull/468 ## 0.26.3 - 2022-08-18 ### Bug Fixes * `DROP NOT NULL` for Postgres `ALTER COLUMN` https://github.com/SeaQL/sea-query/pull/394 ### House keeping * Exclude `chrono` default-features https://github.com/SeaQL/sea-query/pull/410 * Fix clippy warnings https://github.com/SeaQL/sea-query/pull/415 ## 0.26.2 - 2022-07-21 ### Bug Fixes * Rename `postgres-*` features to `with-*` on `postgres` driver https://github.com/SeaQL/sea-query/pull/377 ## 0.26.0 - 2022-07-02 ### New Features * Add support for `VALUES` lists https://github.com/SeaQL/sea-query/pull/351 * Introduce `sea-query-binder` https://github.com/SeaQL/sea-query/pull/275 * Convert from `IpNetwork` and `MacAddress` to `Value` https://github.com/SeaQL/sea-query/pull/364 ### Enhancements * Move `escape` and `unescape` string to backend https://github.com/SeaQL/sea-query/pull/306 * `LIKE ESCAPE` support https://github.com/SeaQL/sea-query/pull/352 #353) * `clear_order_by` for `OrderedStatement` * Add method to make a column nullable https://github.com/SeaQL/sea-query/pull/365 * Add `is` & `is_not` to Expr https://github.com/SeaQL/sea-query/pull/348 * Add `CURRENT_TIMESTAMP` function https://github.com/SeaQL/sea-query/pull/349 * Add `in_tuples` method to Expr https://github.com/SeaQL/sea-query/pull/345 ### Upgrades * Upgrade `uuid` to 1.0 * Upgrade `time` to 0.3 * Upgrade `ipnetwork` to 0.19 * Upgrade `bigdecimal` to 0.3 * Upgrade `sqlx` driver to 0.6 ### Breaking changes * As part of #306, the standalone functions `escape_string` and `unescape_string` are removed, and becomes backend specific. So now, you have to: ```rust use sea_query::EscapeBuilder; let string: String = MySqlQueryBuilder.escape_string(r#" "abc" "#); let string: String = MysqlQueryBuilder.unescape_string(r#" \"abc\" "#); ``` * Replace `Value::Ipv4Network` and `Value::Ipv6Network` to `Value::IpNetwork` https://github.com/SeaQL/sea-query/pull/364 * Remove some redundant feature flags `postgres-chrono`, `postgres-json`, `postgres-uuid`, `postgres-time`. Use the `with-*` equivalence **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.25.0...0.26.0 ## 0.25.2 - 2022-07-01 ### New features * Introduce `sea-query-binder` https://github.com/SeaQL/sea-query/pull/275 ### Enhancements * Add method to make a column nullable https://github.com/SeaQL/sea-query/pull/365 * Add `is` & `is_not` to Expr https://github.com/SeaQL/sea-query/pull/348 * Add `CURRENT_TIMESTAMP` function https://github.com/SeaQL/sea-query/pull/349 ## 0.25.1 - 2022-06-26 ### Enhancements * `clear_order_by` for `OrderedStatement` ## 0.25.0 - 2022-05-28 ### New Features * CASE WHEN statement support https://github.com/SeaQL/sea-query/pull/304 * Add support for Ip(4,6)Network and MacAddress https://github.com/SeaQL/sea-query/pull/309 * [sea-query-attr] macro for deriving `Iden` enum from struct https://github.com/SeaQL/sea-query/pull/300 * Add ability to alter foreign keys https://github.com/SeaQL/sea-query/pull/299 * Select `DISTINCT ON` https://github.com/SeaQL/sea-query/pull/313 ### Enhancements * Insert Default https://github.com/SeaQL/sea-query/pull/266 * Make `sea-query-driver` an optional dependency https://github.com/SeaQL/sea-query/pull/324 * Add `ABS` function https://github.com/SeaQL/sea-query/pull/334 * Support `IF NOT EXISTS` when create index https://github.com/SeaQL/sea-query/pull/332 * Support different `blob` types in MySQL https://github.com/SeaQL/sea-query/pull/314 * Add `VarBinary` column type https://github.com/SeaQL/sea-query/pull/331 * Returning expression supporting `SimpleExpr` https://github.com/SeaQL/sea-query/pull/335 ### Bug fixes * Fix arguments when nesting custom expressions https://github.com/SeaQL/sea-query/pull/333 * Fix clippy warnings for manual map https://github.com/SeaQL/sea-query/pull/337 ### Breaking Changes * Introducing a dedicated `ReturningClause` instead of reusing `Select` on `returning`: https://github.com/SeaQL/sea-query/pull/317 ```rust .returning(Query::select().column(Glyph::Id).take()) // before .returning(Query::returning().columns([Glyph::Id])) // now ``` * In #333, the custom expression API changed for Postgres, users should change their placeholder from `?` to Postgres's `$N` ```rust let query = Query::select() .columns([Char::Character, Char::SizeW, Char::SizeH]) .from(Char::Table) .and_where(Expr::col(Char::Id).eq(1)) .and_where(Expr::cust_with_values("6 = $2 * $1", vec![3, 2]).into()) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE "id" = 1 AND 6 = 2 * 3"# ); ``` As a side effect, `??` is no longer needed for escaping `?` ```rust let query = Query::select() .expr(Expr::cust_with_values( "data @? ($1::JSONPATH)", vec!["hello"], )) .to_owned(); assert_eq!( query.to_string(PostgresQueryBuilder), r#"SELECT data @? ('hello'::JSONPATH)"# ); ``` * In #314, `ColumnType`'s `Binary(Option)` changed to `Binary(BlobSize)`, so if you used `Binary(None)` before, you should change to `Binary(BlobSize::Blob(None))` **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.24.0...0.25.0 ## 0.24.6 - 2022-05-12 * Make `sea-query-driver` an optional dependency https://github.com/SeaQL/sea-query/pull/324 ## 0.24.5 - 2022-05-09 * Insert `or_default_values` https://github.com/SeaQL/sea-query/pull/266 ## 0.24.4 - 2022-04-26 * update sea-query-driver ## 0.24.3 - 2022-04-26 ### Bug fixes * Fix MySQL index create statement https://github.com/SeaQL/sea-query/pull/308 ### Enhancements * Add length check on condition array https://github.com/SeaQL/sea-query/pull/307 ## 0.24.2 - 2022-04-18 ### Bug fixes * Fixed https://github.com/SeaQL/sea-query/issues/303 driver breakage in 0.24.0 Notes: 0.24.0 & 0.24.1 were yanked ## 0.24.1 - 2022-04-15 ### Enhancements * #295 Add parameter for SQLx path to proc-macro https://github.com/SeaQL/sea-query/pull/297 ### Bug fixes * CTE optional columns https://github.com/SeaQL/sea-query/pull/301 ## 0.24.0 - 2022-04-05 ### New Features * Add `LOWER` and `UPPER` func https://github.com/SeaQL/sea-query/pull/276 * Insert `ON CONFLICT` support https://github.com/SeaQL/sea-query/pull/279 * #174 Add support for `WINDOWS` statement https://github.com/SeaQL/sea-query/pull/271 * #142 full support lock in select https://github.com/SeaQL/sea-query/pull/289 * #269 add support for postgres `ANY`, `SOME`, `ALL` https://github.com/SeaQL/sea-query/pull/283 ### Enhancements * Add support for multiple `ALTER` operations https://github.com/SeaQL/sea-query/pull/277 * #229 add column if not exists https://github.com/SeaQL/sea-query/pull/278 * #255 Add support to CommonTableExpression columns method https://github.com/SeaQL/sea-query/pull/284 * #280 Rewrite drivers using proc-macro https://github.com/SeaQL/sea-query/pull/292 ### Bug fixes * #285 Fix timestamp_with_time_zone_len https://github.com/SeaQL/sea-query/pull/286 ### Breaking changes * The enum variants for `LockType` were renamed: `Exclusive` -> `Update` and `Shared` -> `Share` * As part of #283, the drivers are split to the `sea-query-driver` crate 1. Remove methods `Value::is_json` and `Value::as_ref_json` when feature: **with-json** is disabled 2. Remove methods `Value::is_time_*` and `Value::as_ref_time_*` when feature: **with-time** is disabled 3. Remove methods `Value::is_chrono_*` and `Value::as_ref_chrono*` when feature: **with-chrono** is disabled 4. Remove methods `Value::is_decimal`, `Value::as_ref_decimal` and `Value::decimal_to_f64` when feature: **with-rust_decimal** is disabled 5. Remove methods `Value::is_big_decimal`, `Value::as_ref_big_decimal` and `Value::big_decimal_to_f64` when feature: **with-bigdecimal** is disabled 6. Remove methods `Value::is_uuid` and `Value::as_ref_uuid` when feature: **with-uuid** is disabled 7. Remove methods `Value::is_array` and `Value::as_ref_array` when feature: **postgres-array** is disabled **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.23.0...0.24.0 ## 0.23.0 - 2022-03-15 ### New Features * Supports `time` in addition to `chrono` https://github.com/SeaQL/sea-query/pull/267 ### Enhancements * Allow for trailing commas in any and all macros https://github.com/SeaQL/sea-query/pull/270 ### Bug fixes * Fix UNIQUE table index expression syntax for sqlite https://github.com/SeaQL/sea-query/pull/227 ### Breaking changes In order to co-exist with the `time` crate, `Date`, `Time`, `DateTime` etc are renamed to `ChronoDate`, `ChronoTime`, `ChronoDateTime`. In addition, new variants `TimeDate`, `TimeTime`, `TimeDateTime` and so on are introduced to `Value`. ## 0.22.0 - 2022-02-26 ### New Features * Support multiple tables in the select from by @Sytten in https://github.com/SeaQL/sea-query/pull/261 * Add support for replace insert by @Sytten in https://github.com/SeaQL/sea-query/pull/262 * Add `ColumnType` unsigned integer types by @billy1624 in https://github.com/SeaQL/sea-query/pull/211 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.21.0...0.22.0 ## 0.21.0 - 2022-02-01 ### Breaking Changes * Use double quotes for quoting identifiers for SQLite by @SpyrosRoum in https://github.com/SeaQL/sea-query/pull/221 ### New Features * Implement `RETURNING` for SQLite by @SpyrosRoum in https://github.com/SeaQL/sea-query/pull/194 * Support 'NULLS LAST' and 'NULLS FIRST' by @qyihua in https://github.com/SeaQL/sea-query/pull/210 * [join-lateral] by @rex-remind101 in https://github.com/SeaQL/sea-query/pull/224 * Insert from select by @05storm26 in https://github.com/SeaQL/sea-query/pull/238 * Add Expr::asterisk() and Expr::tbl_asterisk(table: DynIden) methods - Fix #217 by @RomainMazB in https://github.com/SeaQL/sea-query/pull/219 ### Enhancements * Implement ToTokens for IntervalField by @autarch in https://github.com/SeaQL/sea-query/pull/195 * Implemented 'Array' type for Postgres. by @kev0960 in https://github.com/SeaQL/sea-query/pull/205 * Add `Value::DateTimeLocal` by @billy1624 in https://github.com/SeaQL/sea-query/pull/249 * Add `ColumnRef::SchemaTableColumn` by @billy1624 in https://github.com/SeaQL/sea-query/pull/206 * Datetime utc by @tyt2y3 in https://github.com/SeaQL/sea-query/pull/241 * Support the use of chrono::DateTime using the type alias DateTim… by @charleschege in https://github.com/SeaQL/sea-query/pull/222 ### Bug Fixes * Fix Postgres `ColumnType::TinyInteger` mapping by @billy1624 in https://github.com/SeaQL/sea-query/pull/207 * PR without clippy warmings in file changed tab by @billy1624 in https://github.com/SeaQL/sea-query/pull/212 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.20.0...0.21.0 ## 0.20.0 - 2021-12-11 ### Merged PRs * Add `TableRef::DatabaseSchemaTable` by @billy1624 in https://github.com/SeaQL/sea-query/pull/193 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.19.4...0.20.0 ## 0.19.4 - 2021-12-11 ### Merged PRs * Binding `DateTime` for SQLx MySQL & SQLite by @billy1624 in https://github.com/SeaQL/sea-query/pull/197 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.19.2...0.19.4 ## 0.19.2 - 2021-12-04 ### Merged PRs * Impl `ValueTuple` Up to Six by @billy1624 in https://github.com/SeaQL/sea-query/pull/200 * Basic Benchmark by @tyt2y3 in https://github.com/SeaQL/sea-query/pull/192 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.19.1...0.19.2 ## 0.19.1 - 2021-11-25 ### Merged PRs * `driver/postgres` handle non-exhaustive `Value` by @billy1624 in https://github.com/SeaQL/sea-query/pull/191 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.19.0...0.19.1 ## 0.19.0 - 2021-11-19 ### Merged PRs * `TableCreateStatement` and `TableDropStatement` takes any `IntoTableRef` table name. by @josh-codes in https://github.com/SeaQL/sea-query/pull/186 * Add `ColumnType::Enum` by @billy1624 in https://github.com/SeaQL/sea-query/pull/188 * Update to Rust Edition 2021 by @billy1624 in https://github.com/SeaQL/sea-query/pull/189 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.18.2...0.19.0 ## 0.18.2 - 2021-11-04 ### Merged PRs * Rename "where" keywords in `SelectStatement` to suppress IDEA warnings by @baoyachi in https://github.com/SeaQL/sea-query/pull/166 * Add binary method to expr by @Progdrasil in https://github.com/SeaQL/sea-query/pull/173 * Cast expression as custom type by @billy1624 in https://github.com/SeaQL/sea-query/pull/170 * Support tuple expression by @shuoli84 in https://github.com/SeaQL/sea-query/pull/178 **Full Changelog**: https://github.com/SeaQL/sea-query/compare/0.18.1...0.18.2 ## 0.18.1 - 2021-10-26 + [[#169]] Add support for Postgres interval type + [[#171]] Fix bug in `Condition::add` where Condition negation is ignored [#169]: https://github.com/SeaQL/sea-query/pull/169 [#171]: https://github.com/SeaQL/sea-query/pull/171 ## 0.18.0 - 2021-10-15 + [[#159]] Add `ValueType::column_type` + [[#160]] Add `FromValueTuple` trait [#159]: https://github.com/SeaQL/sea-query/pull/159 [#160]: https://github.com/SeaQL/sea-query/pull/160 ## 0.17.3 - 2021-10-26 + [[#171]] Fix bug in `Condition::add` where Condition negation is ignored [#171]: https://github.com/SeaQL/sea-query/pull/171 ## 0.17.2 - 2021-10-15 + [[#164]] Revert "Fix SQLite `chrono::NaiveTime` binding" [#164]: https://github.com/SeaQL/sea-query/pull/164 ## 0.17.1 - 2021-10-12 (yanked) ## 0.17.0 - 2021-10-06 + [[#157]] Fix binding nullable custom types on db drivers The `as_ref_*` methods on `Value` are changed: ```rust pub fn as_ref_json(&self) -> &Json; ``` Is now ```rust pub fn as_ref_json(&self) -> Option<&Json>; ``` [#157]: https://github.com/SeaQL/sea-query/pull/157 ## 0.16.6 - 2021-10-26 + [[#171]] Fix bug in `Condition::add` where Condition negation is ignored [#171]: https://github.com/SeaQL/sea-query/pull/171 ## 0.16.5 - 2021-09-30 + [[#145]] Add Condition::not + [[#149]] Fix SQLite `chrono::NaiveTime` binding [#145]: https://github.com/SeaQL/sea-query/pull/145 [#149]: https://github.com/SeaQL/sea-query/pull/149 ## 0.16.4 - 2021-09-26 + Fix table drop options for SQLite + Add `IndexCreateStatement::is_unique_key()` ## 0.16.3 - 2021-09-17 + [[#131]] `CAST AS` expression + [[#131]] `InsertStatement` accepts `SimpleExpr` + [[#137]] SQLx Postgres driver bind `DateTime` [#131]: https://github.com/SeaQL/sea-query/issues/131 [#137]: https://github.com/SeaQL/sea-query/pull/137 ## 0.16.2 - 2021-09-15 + [[#120]] Support `RETURNING` for `DeleteStatement` + [[#128]] Support `UNION` clause for `SelectStatement` [#120]: https://github.com/SeaQL/sea-query/issues/120 [#128]: https://github.com/SeaQL/sea-query/pull/128 ## 0.16.1 - 2021-09-10 + [[#129]] MySql `ColumnType::Binary(None)` maps to "blob" [#129]: https://github.com/SeaQL/sea-query/pull/129 ## 0.16.0 - 2021-09-02 + [[#112]] Introduce `Nullable` trait to permit custom `Option` + [[#113]] `ValueType` trait should have a non-panic-ing method + [[#114]] `ValueType` revamp 1. Remove `ValueTypeDefault` 1. Change `type_name` to return `String` + [[#115]] Postgres concatenate operator (`||`) + [[#117]] Lock support (`FOR SHARE`, `FOR UPDATE`) for SELECT statement [#112]: https://github.com/SeaQL/sea-query/pull/112 [#113]: https://github.com/SeaQL/sea-query/pull/113 [#114]: https://github.com/SeaQL/sea-query/pull/114 [#115]: https://github.com/SeaQL/sea-query/pull/115 [#117]: https://github.com/SeaQL/sea-query/pull/117 ## 0.15.0 - 2021-08-21 + [[#107]] Revamp `Value` to typed null value + Added `BigDecimal` support The `Value::Null` variant is removed. You have to use a specific variant with a `None`. Before: ```rust Query::insert() .values_panic(vec![ Value::Null, 2.1345.into(), ]) ``` After: ```rust Query::insert() .values_panic(vec![ Value::String(None), 2.1345.into(), ]) ``` Since we cannot handle the generic `Null` value on JSON, we removed the `json` method on `InsertStatement` and `UpdateStatement`. The following NO LONGER WORKS: ```rust let query = Query::insert() .into_table(Glyph::Table) .json(json!({ "aspect": 2.1345, "image": "24B", })); ``` ```rust let query = Query::update() .table(Glyph::Table) .json(json!({ "aspect": 2.1345, "image": "235m", })); ``` In addition, if you constructed `Value` manually before (instead of using `into()` which is unaffected), you have to wrap them in an `Option`: Before: ```rust let (sql, values) = query.build(PostgresQueryBuilder); assert_eq!( values, Values(vec![Value::String(Box::new("A".to_owned())), Value::Int(1), Value::Int(2), Value::Int(3)])) ); ``` After: ```rust let (sql, values) = query.build(PostgresQueryBuilder); assert_eq!( values, Values(vec![Value::String(Some(Box::new("A".to_owned()))), Value::Int(Some(1)), Value::Int(Some(2)), Value::Int(Some(3))])) ); ``` [#107]: https://github.com/SeaQL/sea-query/pull/107 ## 0.14.1 - 2021-08-15 + [[#87]] Fix inconsistent Ownership of self in Builder APIs + [[#105]] Use Arc for SeaRc with feature flag thread-safe [#87]: https://github.com/SeaQL/sea-query/pull/87 [#105]: https://github.com/SeaQL/sea-query/pull/105 ## 0.12.12 - 2021-08-14 + [[#98]] Support Postgres full text search [#98]: https://github.com/SeaQL/sea-query/pull/98 ## 0.12.11 - 2021-08-13 + Support SeaORM ## 0.12.10 - 2021-08-11 + [[#89]] flattening iden enums in derive macro [#89]: https://github.com/SeaQL/sea-query/pull/87 ## 0.12.9 - 2021-08-08 + [[#77]] Postgres `binary` type + [[#81]] example for CockroachDB + [[#84]] Fix Postgres constraint keywords + [[#75]] `DateTimeWithTimeZone` value type and `TimestampWithTimeZone` column type [#77]: https://github.com/SeaQL/sea-query/pull/77 [#81]: https://github.com/SeaQL/sea-query/pull/81 [#84]: https://github.com/SeaQL/sea-query/pull/84 [#75]: https://github.com/SeaQL/sea-query/pull/75 ## 0.12.8 - 2021-07-24 + Fix Postgres `datetime` column type mapping + `Uuid` in schema builder ## 0.12.7 - 2021-07-13 + `cust_with_values` allow escape `?` using `??` ## 0.12.6 - 2021-07-07 + Fixed build error for `sqlx-sqlite` ## 0.12.5 - 2021-07-07 + Support `Decimal` from rust_decimal ## 0.12.4 - 2021-06-23 + Added `returning` for update statement ## 0.12.3 - 2021-06-19 + Added `type_name` for ValueType + `Values` derive `Clone` + Added `Update::col_expr` + Type def Rc as `SeaRc` + getters for schema statements ## 0.12.2 - 2021-06-04 + Fixed `and_where_option` + Added `Condition::add_option` ## 0.12.1 - 2021-06-03 + Added `not_in_subquery` ## 0.12.0 - 2021-05-31 + Unify `cond_where` and `and_where`. Note: will panic if calling `or_where` after `and_where`. ## 0.11.1 - 2021-05-22 + Updated Readme ## 0.11.0 - 2021-05-19 + Added APIs to support ORM + Backend and internal refactoring + Introduced `QueryStatementBuilder` and `SchemaStatementBuilder` traits + Introduced `ConditionalStatement` and `OrderedStatement` traits + Introduced any/all style conditions for `cond_where` and `cond_having` ## 0.10.6 - 2021-05-04 + Postgres `ALTER TYPE` statements for `ENUM` ## 0.10.5 - 2021-05-02 + Updated documentation ## 0.10.4 - 2021-05-02 + `returning()` expression for Postgres insert statements + Remove redundant index name in foreign key expression of MySQL ## 0.10.3 - 2021-04-30 + custom `Error` type + Empty value list for IN + Index prefix and `IndexOrder` ## 0.10.2 - 2021-04-27 + Foreign key API `from` and `to` + Fix foreign key bug in `ON UPDATE` ## 0.10.1 - 2021-04-25 + Added `index_type()` (`FullText` and `Hash`) + Added `unique()` to `Index` + Support composite primary key ## 0.10.0 - 2021-04-23 + Use `IntoIterator` trait instead of `Vec` on most APIs + UUID support in `Value` + Rusqlite support ## 0.9.6 - 2021-04-18 + Rename `create_if_not_exists` to `if_not_exists` + Remove `partition_option` from `TableAlterStatement` + Added `ColumnDef::extra()` ## 0.9.5 - 2021-04-17 + Added `SchemaStatement` ## 0.9.4 - 2021-04-13 + Fixed `DateTime` quoting bugs ## 0.9.3 - 2021-04-08 + Update sea-query-derive to 0.1.2 ## 0.9.2 - 2021-04-05 + derive supporting enum tuple variant and custom method ## 0.9.1 - 2021-03-30 + updated docs ## 0.9.0 - 2021-03-29 + Introduced `IntoColumnRef` trait to consolidate `column` and `table.column` + Introduced `IntoTableRef` trait to consolidate `table` and `schema.table` + Introduced `IntoIden` trait to remove `*_dyn` methods ## 0.8.5 - 2021-03-29 + added `into_simple_expr()` ## 0.8.4 - 2021-03-24 + Fixing `IS NULL` ## 0.8.3 - 2021-03-23 + derive `Debug` on most structs ## 0.8.2 - 2021-03-23 + Added `unescape_string` ## 0.8.1 - 2021-03-23 + Improve documentation ## 0.8.0 - 2021-03-14 + `json` support behind features + backend as features (`backend-mysql`, `backend-postgres`, `backend-sqlite`) + added `from_schema()`, `from_schema_as()` ## 0.7.0 - 2021-03-06 + Revamp `Value` + `build()` API change + `postgres` driver support + `json` and `chrono` support ## 0.6.1 - 2021-03-05 + Added `join_as` + Deprecated `expr_alias`, `from_alias` ## 0.6.0 - 2021-02-20 + Custom expression with parameters `Expr::cust_with_values()` + Custom function call `Func::cust()` + Postgres enum `Type::create().as_enum()` ## 0.5.0 - 2021-02-09 + derive macro `#[derive(Iden)]` ## 0.4.0 - 2021-02-02 + Added JSON binary column type `ColumnDef::json_binary()` + Custom column type `ColumnDef::custom()` ## 0.3.0 - 2020-12-29 ## 0.2.0 - 2020-12-26 ## 0.1.0 - 2020-12-16 Publish to crate.io