Skip to content

Latest commit

 

History

History
1429 lines (991 loc) · 52.4 KB

CHANGELOG.md

File metadata and controls

1429 lines (991 loc) · 52.4 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

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 #774
    • Added postgres-vector feature flag
    • Added Value::Vector, ColumnType::Vector, ColumnDef::vector(), PgBinOper::EuclideanDistance, PgBinOper::NegativeInnerProduct and PgBinOper::CosineDistance
    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 #791
  • Support partial index CREATE INDEX .. WHERE .. #478

Enhancements

  • Replace Educe with manual implementations #817

sea-query-derive

  • Merged #[enum_def] into sea-query-derive
  • #[enum_def] now impl additional IdenStatic and AsRef<str> #769

sea-query-attr

  • Updated syn, heck and darling
  • sea-query-attr is now deprecated

Upgrades

  • Upgrade sqlx to 0.8 #798
  • Upgrade bigdecimal to 0.4 #798
  • Upgrade rusqlite to 0.32 #802

0.31.1 - 2024-10-05

Enhancements

  • Derive Eq, Ord, Hash for Alias #818
  • Added Func::md5 function #786
  • Added Postgres Json functions: JSON_BUILD_OBJECT and JSON_AGG #787
  • Added cast_as_quoted #789
  • Added IF NOT EXISTS to ALTER TYPE ADD VALUE #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 #759
  • Added ColumnType::Blob #777

Breaking Changes

  • Rework SQLite type mapping #735
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
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
/// 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<u8> 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<MySqlYear>) 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 #765
  • Added non-TLS runtime #783

House keeping

  • Added ColumnType mapping documentation
  • Replace derivative with educe #763

Upgrades

  • Upgrade rusqlite to 0.31 #755
  • Upgrade time to 0.3.36 #788

0.30.8 - Pending

Enhancements

  • Added InsertStatement::values_from_panic #739

0.30.7 - 2024-01-12

Enhancements

  • Added SelectStatement::apply #730

House keeping

  • Slight refactors and documentation update

0.30.6 - 2024-01-01

House keeping

  • Fix clippy warnings on Rust 1.75 #729

sea-query-rusqlite 0.5.0 - 2023-12-29

  • Upgrade rusqlite to 0.30 #728

0.30.5 - 2023-12-14

New Features

  • Added feature flag option-more-parentheses to have more parentheses in expressions #723
  • Added feature flag option-sqlite-exact-column-type to only use integer for SQLite
  • Support COUNT(DISTINCT "column") #700
  • Support index hints for MySQL (via extension::mysql::MySqlSelectStatementExt) #636
  • Support expressions for ON CONFLICT targets #692

Enhancements

  • Add from_clear to allow emptying current from tables in select statement #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 #604
  • Improved parenthesis omission logic #675

Bug Fixes

  • Fixed BIGINT PRIMARY KEY AUTOINCREMENT for SQLite #689

Upgrades

  • Upgrade chrono to 0.4.27

Breaking changes

  • Removed ToTokens for PgInterval #710

sea-query-derive 0.4.1 - 2023-10-19

  • Upgrade syn to 2

0.30.2 - 2023-09-23

Bug Fixes

  • Fixed incorrect behavior when adding an autoincrement column for Postgres #697

Enhancements

  • Make ValueTuple hashable

0.30.1 - 2023-08-25

Versions

New Features

  • Added Func::round and Func::round_with_precision #671

Enhancements

  • Added some getters to FunctionCall #677

Bug Fixes

  • Fixed bytea literal syntax for Postgres #666
  • Fixed issues with semantics of parenthesis removal #675
  • Fixed behaviour in FunctionCall when calling arg multiple times #687

Breaking changes

  • As part of #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:

Versions

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

New Features

  • Added ValueTuple::Many for tuple with length up to 12 #564
  • Added CREATE TABLE CHECK constraints #567
  • Added support generated column spec #581
  • Added BIT_AND, BIT_OR functions #582
  • Added implementation SqlxBinder, RusqliteBinder and PostgresBinder for WithQuery #580
  • Added new type Asteriks #596
  • Added IF NOT EXISTS for DROP INDEX in Postgres and Sqlite #610
  • Added -> and ->> operators for Postgres #617
  • Added TableCreateStatement::set_extra and TableCreateStatement::get_extra #611
  • Added TableCreateStatement::comment and ColumnDef::comment for MySQL comments #622
  • Added PgExpr::get_json_field and PgExpr::cast_json_field methods for constructing Postgres JSON expressions #630
  • Added PgBinOper::Regex and PgBinOper::RegexCaseInsensitive for Postgres Regex operators
  • Added BinOper::Custom for defining custom binary operators
  • Added GLOB operator for Sqlite #651
  • Added CREATE or DROP EXTENSION statements for Postgres #616
  • Added a feature flag hashable-value, which will impl Hash for Value; when enabled, Value::Float(NaN) == Value::Float(NaN) would be true #598
  • Added PgBinOper::Overlap for Postgres operators #653

Enhancements

  • Implemented PartialEq for DynIden, SimpleExpr and related types #620

Breaking changes

  • Removed variants Four, Five, Six from enum ValueTuple as part of #564
  • Removed Expr::tbl, Expr::greater_than, Expr::greater_or_equal, Expr::less_than, Expr::less_or_equal, Expr::into_simple_expr #551
  • Removed SimpleExpr::equals and SimpleExpr::not_equals #551
  • Removed InsertStatement::exprs, InsertStatement::exprs_panic #551
  • Removed OnConflict::update_value, OnConflict::update_values, OnConflict::update_expr, OnConflict::update_exprs #551
  • Removed UpdateStatement::exprs, UpdateStatement::col_expr, UpdateStatement::value_expr #551
  • BigInteger now maps to bigint instead of integer on SQLite #556
  • Table::truncate now panic for Sqlite #590
  • Deprecated Expr::asteriks and Expr::table_asteriks #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<String> #594
  • OnConflict::values and OnConflict::update_columns will append the new values keeping the old values intact instead of erasing them #609
  • As part of #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.
// new definition
struct SeaRc<I>(RcOrArc<I>);
// remains unchanged
type DynIden = SeaRc<dyn Iden>;

// 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:
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 #552
  • Changed all version = "^x.y.z" into version = "x.y.z" in all Cargo.toml #547
  • Disabled default features and enable only the needed ones #547
  • tests_cfg module is available only if you enabled tests-cfg feature #584
  • Removed hard coded quotes #613
  • Enabled required syn v1 features #624
  • Fix macro hygiene (any! / all!) #639 #640

Bug fixes

  • ALTER TABLE now panic if has multiple column for Sqlite #595
  • Fixed alter primary key column statements for Postgres #646

0.28.5 - 2023-05-11

  • Added implementation SqlxBinder, RusqliteBinder and PostgresBinder for WithQuery #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 #576
  • Added comma if multiple names are passed to TypeDropStatement #623

0.28.3 - 2023-01-18

Enhancements

  • Added getter for the UpdateStatement::values field #578
  • Implements PartialEq for ColumnType #579
  • Added helper function to construct ColumnType::Custom #579

0.28.2 - 2023-01-04

Enhancements

  • Added Cow<str> conversion to Value #550
  • Added convert various UUID defined in uuid::fmt module into sea_query::Value::Uuid #563

0.28.1 - 2022-12-29

Bug fixes

  • Fixes Postgres GEN_RANDOM_UUID #568

0.28.0 - 2022-12-09

New Features

  • New struct FunctionCall which hold function and arguments #475
  • New trait IdenStatic with method fn as_str(&self) -> &'static str #508
  • New traits PgExpr and SqliteExpr for custom expressions #519
  • Support BigDecimal, IpNetwork and MacAddress for sea-query-postgres #503

API Additions

  • Added SelectStatement::from_function #475
  • Added binary operators from the Postgres pg_trgm extension #486
  • Added ILIKE and NOT ILIKE operators #473
  • Added the mul and div methods for SimpleExpr #510
  • Added the MATCH, -> and ->> operators for SQLite #513
  • Added the FULL OUTER JOIN #497
  • Added PgFunc::get_random_uuid #530
  • Added SimpleExpr::eq, SimpleExpr::ne, Expr::not_equals #528
  • Added PgFunc::starts_with #529
  • Added Expr::custom_keyword and SimpleExpr::not #535
  • Added SimpleExpr::like, SimpleExpr::not_like and Expr::cast_as #539
  • Added support for NULLS NOT DISTINCT clause for Postgres #532
  • Added Expr::cust_with_expr and Expr::cust_with_exprs #531
  • Added support for converting &String to Value #537

Enhancements

  • Made value::with_array module public and therefore making NotU8 trait public #511
  • Drop the Sized requirement on implementers of SchemaBuilders #524

Bug fixes

  • Wrap unions into parenthesis #498
  • Syntax error on empty condition #505
// 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 #535
  • ColumnType::Array definition changed from Array(SeaRc<Box<ColumnType>>) to Array(SeaRc<ColumnType>) #492
  • Func::* now returns FunctionCall instead of SimpleExpr #475
  • Func::coalesce now accepts IntoIterator<Item = SimpleExpr> instead of IntoIterator<Item = Into<SimpleExpr> #475
  • Removed Expr::arg and Expr::args - these functions are no longer needed #475
  • Moved all Postgres specific operators to PgBinOper #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<SimpleExpr> instead of Into<Value> #476
  • Expr::is_in, Expr::is_not_in now accepts Into<SimpleExpr> instead of Into<Value> and convert it to SimpleExpr::Tuple instead of SimpleExpr::Values #476
  • Expr::expr now accepts Into<SimpleExpr> instead of SimpleExpr #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 #519
  • Expr::equals now accepts C: IntoColumnRef instead of T: IntoIden, C: IntoIden #528
  • Removed integer and date time column types' display length / precision option #525

Deprecations

  • Deprecated Expr::greater_than, Expr::greater_or_equal, Expr::less_than and Expr::less_or_equal #476
  • Deprecated SimpleExpr::equals, SimpleExpr::not_equals #528
  • Deprecated Expr::tbl, please use Expr::col with a tuple #540

House keeping

  • Replace impl Default with #[derive(Default)] #535
  • Exclude sqlx default features #543
  • Use dtolnay/rust-toolchain instead of actions-rs/toolchain in CI #544

0.27.2 - 2022-11-14

  • Made value::with_array module public and therefore making NotU8 trait public #511

sea-query-binder 0.2.2

  • Enable SQLx features only if SQLx optional dependency is enabled #517

0.27.1 - 2022-10-18

  • Fix consecutive spacing on schema statements #481
  • SQLite bind rust_decimal & bigdecimal as f64 #480

0.27.0 - 2022-10-16

New Features

  • Support CROSS JOIN #376
  • We are going through series of changes to how database drivers work (#416, #423):
    1. sea-query-binder is now the recommended way (trait based) of working with SQLx, replacing sea-query-driver (macro based) #434
    2. sea-query-binder is now a separate dependency, instead of integrated with sea-query #432
    3. rusqlite support is moved to sea-query-rusqlite #422
    4. postgres support is moved to sea-query-postgres #433
  • Added sub-query operators: EXISTS, ALL, ANY, SOME #379
  • Added support to ON CONFLICT WHERE #447
  • Added support DROP COLUMN for SQLite #455
  • Added YEAR, BIT and VARBIT types #466
  • Added support one dimension Postgres array for SQLx #467

Enhancements

  • Handle Postgres schema name for schema statements #385
  • Added %, << and >> binary operators #419
  • Added RAND function #430
  • Implements Display for Value #425
  • Added INTERSECT and EXCEPT to UnionType #438
  • Added OnConflict::value and OnConflict::values #451
  • ColumnDef::default now accepts both Value and SimpleExpr #436
  • OrderedStatement::order_by_customs, OrderedStatement::order_by_columns, OverStatement::partition_by_customs, OverStatement::partition_by_columns now accepts IntoIterator<Item = T> instead of Vec<T> #448
  • Expr::case, CaseStatement::case and CaseStatement::finally now accepts Into<SimpleExpr> instead of Into<Expr> #460
  • UpdateStatement::value now accept Into<SimpleExpr> instead of Into<Value> #460
  • TableAlterStatement::rename_column, TableAlterStatement::drop_column, ColumnDef::new, ColumnDef::new_with_type now accepts IntoIden instead of Iden #472

Bug Fixes

  • distinct_on properly handles ColumnRef #450
  • Removed ON for DROP INDEX for SQLite #462
  • Change datetime string format to include microseconds #468
  • ALTER TABLE for PosgreSQL with UNIQUE constraint #472

Breaking changes

  • Changed in_tuples interface to accept IntoValueTuple #386
  • Removed deprecated methods (or_where, or_having, table_column etc) #380
  • Changed cond_where chaining semantics #417
// 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 #441
  • Update SQLite boolean type from integer to boolean #400
  • Changed type of ColumnType::Enum from (String, Vec<String>) to: #435
Enum {
    name: DynIden,
    variants: Vec<DynIden>,
}
  • 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 #460
  • InsertStatement::values, UpdateStatement::values now accepts IntoIterator<Item = SimpleExpr> instead of IntoIterator<Item = Value> #460
  • Use native api from SQLx for SQLite to work with time #412

House keeping

  • Cleanup IndexBuilder trait methods #426
  • Introduce SqlWriter trait #436
  • Remove unneeded vec! from examples #448

Upgrades

  • Upgrade sqlx driver to 0.6.1

0.26.4 - 2022-10-13

New Features

  • Added support DROP COLUMN for SQLite #455

Bug Fixes

  • Removed ON for DROP INDEX for SQLite #462
  • Changed datetime display format to include microseconds #468

0.26.3 - 2022-08-18

Bug Fixes

  • DROP NOT NULL for Postgres ALTER COLUMN #394

House keeping

  • Exclude chrono default-features #410
  • Fix clippy warnings #415

0.26.2 - 2022-07-21

Bug Fixes

  • Rename postgres-* features to with-* on postgres driver #377

0.26.0 - 2022-07-02

New Features

  • Add support for VALUES lists #351
  • Introduce sea-query-binder #275
  • Convert from IpNetwork and MacAddress to Value #364

Enhancements

  • Move escape and unescape string to backend #306
  • LIKE ESCAPE support #352 #353)
  • clear_order_by for OrderedStatement
  • Add method to make a column nullable #365
  • Add is & is_not to Expr #348
  • Add CURRENT_TIMESTAMP function #349
  • Add in_tuples method to Expr #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:
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 #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 #275

Enhancements

  • Add method to make a column nullable #365
  • Add is & is_not to Expr #348
  • Add CURRENT_TIMESTAMP function #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 #304
  • Add support for Ip(4,6)Network and MacAddress #309
  • [sea-query-attr] macro for deriving Iden enum from struct #300
  • Add ability to alter foreign keys #299
  • Select DISTINCT ON #313

Enhancements

  • Insert Default #266
  • Make sea-query-driver an optional dependency #324
  • Add ABS function #334
  • Support IF NOT EXISTS when create index #332
  • Support different blob types in MySQL #314
  • Add VarBinary column type #331
  • Returning expression supporting SimpleExpr #335

Bug fixes

  • Fix arguments when nesting custom expressions #333
  • Fix clippy warnings for manual map #337

Breaking Changes

  • Introducing a dedicated ReturningClause instead of reusing Select on returning: #317
.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
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 ?

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<u32>) 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 #324

0.24.5 - 2022-05-09

  • Insert or_default_values #266

0.24.4 - 2022-04-26

  • update sea-query-driver

0.24.3 - 2022-04-26

Bug fixes

  • Fix MySQL index create statement #308

Enhancements

  • Add length check on condition array #307

0.24.2 - 2022-04-18

Bug fixes

  • Fixed #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 #297

Bug fixes

  • CTE optional columns #301

0.24.0 - 2022-04-05

New Features

  • Add LOWER and UPPER func #276
  • Insert ON CONFLICT support #279
  • #174 Add support for WINDOWS statement #271
  • #142 full support lock in select #289
  • #269 add support for postgres ANY, SOME, ALL #283

Enhancements

  • Add support for multiple ALTER operations #277
  • #229 add column if not exists #278
  • #255 Add support to CommonTableExpression columns method #284
  • #280 Rewrite drivers using proc-macro #292

Bug fixes

  • #285 Fix timestamp_with_time_zone_len #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 #267

Enhancements

  • Allow for trailing commas in any and all macros #270

Bug fixes

  • Fix UNIQUE table index expression syntax for sqlite #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 #261
  • Add support for replace insert by @Sytten in #262
  • Add ColumnType unsigned integer types by @billy1624 in #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 #221

New Features

  • Implement RETURNING for SQLite by @SpyrosRoum in #194
  • Support 'NULLS LAST' and 'NULLS FIRST' by @qyihua in #210
  • [join-lateral] by @rex-remind101 in #224
  • Insert from select by @05storm26 in #238
  • Add Expr::asterisk() and Expr::tbl_asterisk(table: DynIden) methods - Fix #217 by @RomainMazB in #219

Enhancements

  • Implement ToTokens for IntervalField by @autarch in #195
  • Implemented 'Array' type for Postgres. by @kev0960 in #205
  • Add Value::DateTimeLocal by @billy1624 in #249
  • Add ColumnRef::SchemaTableColumn by @billy1624 in #206
  • Datetime utc by @tyt2y3 in #241
  • Support the use of chrono::DateTime using the type alias DateTim… by @charleschege in #222

Bug Fixes

  • Fix Postgres ColumnType::TinyInteger mapping by @billy1624 in #207
  • PR without clippy warmings in file changed tab by @billy1624 in #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 #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<FixedOffset> for SQLx MySQL & SQLite by @billy1624 in #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 #200
  • Basic Benchmark by @tyt2y3 in #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 #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 #186
  • Add ColumnType::Enum by @billy1624 in #188
  • Update to Rust Edition 2021 by @billy1624 in #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 #166
  • Add binary method to expr by @Progdrasil in #173
  • Cast expression as custom type by @billy1624 in #170
  • Support tuple expression by @shuoli84 in #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

0.18.0 - 2021-10-15

  • [#159] Add ValueType::column_type
  • [#160] Add FromValueTuple trait

0.17.3 - 2021-10-26

  • [#171] Fix bug in Condition::add where Condition negation is ignored

0.17.2 - 2021-10-15

  • [#164] Revert "Fix SQLite chrono::NaiveTime binding"

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:

pub fn as_ref_json(&self) -> &Json;

Is now

pub fn as_ref_json(&self) -> Option<&Json>;

0.16.6 - 2021-10-26

  • [#171] Fix bug in Condition::add where Condition negation is ignored

0.16.5 - 2021-09-30

  • [#145] Add Condition::not
  • [#149] Fix SQLite chrono::NaiveTime binding

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<FixedOffset>

0.16.2 - 2021-09-15

  • [#120] Support RETURNING for DeleteStatement
  • [#128] Support UNION clause for SelectStatement

0.16.1 - 2021-09-10

  • [#129] MySql ColumnType::Binary(None) maps to "blob"

0.16.0 - 2021-09-02

  • [#112] Introduce Nullable trait to permit custom Option<T>

  • [#113] ValueType trait should have a non-panic-ing method

  • [#114] ValueType revamp

    1. Remove ValueTypeDefault
    2. Change type_name to return String
  • [#115] Postgres concatenate operator (||)

  • [#117] Lock support (FOR SHARE, FOR UPDATE) for SELECT statement

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:

Query::insert()
    .values_panic(vec![
        Value::Null,
        2.1345.into(),
    ])

After:

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:

let query = Query::insert()
    .into_table(Glyph::Table)
    .json(json!({
        "aspect": 2.1345,
        "image": "24B",
    }));
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:

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:

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))]))
);

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

0.12.12 - 2021-08-14

  • [#98] Support Postgres full text search

0.12.11 - 2021-08-13

  • Support SeaORM

0.12.10 - 2021-08-11

  • [#89] flattening iden enums in derive macro

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

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