5.16.0.txt

doc/release_notes/5.16.0.txt
Last Update: 2019-01-02 10:09:14 -0800

New Features

  • Database#rollback_on_exit has been added, which allows you to rollback transactions instead of committing them when exiting the transaction block. Previously, the only way to rollback a transaction from inside a transaction block was to raise an exception. This allows you to tell Sequel to roll the transaction back on exit, and then use return or throw to exit the transaction block.

    Database#rollback_on_exit supports savepoints, including multiple savepoint levels, as well as canceling rollbacks:

    DB.transaction do # BEGIN
      DB.rollback_on_exit
    end # ROLLBACK
    
    DB.transaction do # BEGIN
      DB.transaction(savepoint: true) do # SAVEPOINT
        DB.rollback_on_exit(savepoint: true)
      end # ROLLBACK TO SAVEPOINT
    end # COMMIT
    
    DB.transaction do # BEGIN
      DB.transaction(savepoint: true) do # SAVEPOINT
        DB.transaction(savepoint: true) do # SAVEPOINT
          DB.rollback_on_exit(savepoint: true)
        end # ROLLBACK TO SAVEPOINT
      end # RELEASE SAVEPOINT
    end # COMMIT
    
    DB.transaction do # BEGIN
      DB.transaction(savepoint: true) do # SAVEPOINT
        DB.rollback_on_exit(savepoint: true)
      end # ROLLBACK TO SAVEPOINT
    end # COMMIT
    
    DB.transaction do # BEGIN
      DB.transaction(savepoint: true) do # SAVEPOINT
        DB.transaction(savepoint: true) do # SAVEPOINT
          DB.rollback_on_exit(savepoint: 2)
        end # ROLLBACK TO SAVEPOINT
      end # ROLLBACK TO SAVEPOINT
    end # COMMIT
    
    DB.transaction do # BEGIN
      DB.transaction(savepoint: true) do # SAVEPOINT
        DB.transaction(savepoint: true) do # SAVEPOINT
          DB.rollback_on_exit(savepoint: 3)
        end # ROLLBACK TO SAVEPOINT
      end # ROLLBACK TO SAVEPOINT
    end # ROLLBACK
    
    DB.transaction do # BEGIN
      DB.rollback_on_exit
      DB.rollback_on_exit(cancel: true)
    end # COMMIT
    
  • Sequel now supports window functions on SQLite 3.26.0+. SQLite technically supports window functions on 3.25.0+, but enabling window function support in Sequel opens up a code path that generates queries that cause older versions of SQLite to produce a segmentation fault. This bug in SQLite has been fixed in 3.26.0.

Other Improvements

  • Sequel::Model no longer overrides existing methods when defining getters and setters. Historically, it only checked for existing method definitions for methods that could be directly expressed (e.g. not requiring send). Sequel 5 broke the check for setter methods that could be directly expressed. This fixes cases where model inheritance is used and the setter methods are overridden in a parent class.

  • Alter table emulation now works correctly on SQLite 3.26.0+.

  • The one_to_one association setter does not modify reciprocal associations in cases where doing so is not necessary. This can fix some cases where the nested_attributes plugin is used.

  • The class_table_inheritance plugin can now take advantage of the schema_caching extension to prevent database queries to determine column information when the class is created.

  • The nested_attributes plugin no longer validates one_to_one associations twice when saving.

  • The class_table_inheritance plugin :qualify_tables option now correctly qualifies subclasses of subclasses.

  • SQL expressions that are subscripted are now wrapped in parentheses. This fixes at least subscripting a function expression on PostgreSQL:

    DB[:t].select{array_agg(column).sql_subscript(1)}
    # SELECT (array_agg(column))[1] FROM t
    
  • Sequel::Migrator now uses more descriptive error messages if a missing or empty migration directory is given.

  • bin/sequel -C when converting from SQLite to another database type will now use 64-bit integer columns in the other database when the SQLite column type is integer, as SQLite supports storing 64-bit values in integer columns, and most other databases only support 32-bit values in integer columns.

Backwards Compatibility

  • The mysql adapter no longer attempts to load the mysqlplus driver, it now only attempts to load the mysql driver.