= New Features * Alternatives for the more complex virtual row method calls have been added: # Window Functions using SQL::Function#over # before: select{sum(:over, :args=>:col1, :partition=>:col2){}} select{sum(:col1).over(:partition=>:col2)} # count(*) using SQL::Function#* # before: select{count(:*){}} select{count{}.*} # count(distinct col) using SQL::Function#distinct # before: select{count(:distinct, :col){}} select{count(:col).distinct} Additionally, schema qualified functions are now supported via SQL::QualifiedIdentifier#function, and quoted functions are now supported via SQL::Identifier#function on some databases: # "func"("col") select{func.function(:col)} # "schema"."func"("col1") select{schema__func.function(:col1)} If the database does not support quoting function names, then Sequel will not quote them. * An update_or_create plugin has been added, for updating a matching object if one exists, or creating an object if it does not. For example, the following code will update the number of copies sold for album with the name 'Hello', or it will create an album with the name 'Hello' and 1000 number of copies sold: Album.plugin :update_or_create Album.update_or_create(:name=>'Hello') do |album| album.num_copies_sold = 1000 end You can also use a shorter form of this, with two hashes: Album.update_or_create({:name=>'Hello'}, {:num_copies_sold=>1000}) This plugin also adds a method named find_or_new, which does the same thing as update_or_create, except it doesn't persist any changes. * A :raise_on_save_failure option has been added for one_to_many, pg_array_to_many, and many_to_pg_array associations. This mirrors the Model.raise_on_save_failure setting, and if set to false, it will make the add/remove methods return nil instead of raising an error if there is a validation/hook error when saving the associated record. * The validates_unique validation in validation_helpers now supports a :dataset option to provide the base dataset to use to check uniqueness. This is useful when the model itself uses a filtered dataset, but the unique index in the database is on an unfiltered dataset. The auto_validations plugin uses this option to ensure that unique validations are setup correctly in subclasses using single table inheritance. = Other Improvements * Sequel now automatically rolls back transactions in killed threads on ruby 2.0+. It is still impossible to do so on ruby 1.9. * In the instance_hooks plugin, validation instance hooks are now not cleared until after a successful save. * Composite unique key constraint violations are now recognized and raised as Sequel::UniqueConstraintViolation on SQLite. * Primary key unique constraint violations are now recognized and and raised as Sequel::UniqueConstraintViolation on Microsoft SQL Server and SQLAnywhere. * If an exception occurs when using a cursor in the postgres adapter, and an exception also occurs when closing the cursor when cleaning up, the initial exception is now raised. * You can now get tables in a specific schema in the jdbc adapter using the :schema option to Database#tables. This was already supported in most jdbc subadapters because they implement #tables using database specific code instead of looking at the JDBC metadata, but it should now work for all jdbc subadapters. * Sequel::SQLTime#to_s is now defined and returns a string in HH:MM:SS format (leaving off the date). = Backwards Compatibility * The odbc adapter's :driver option is no longer deprecated, as reports were received that it still works. * If you were re-adding instance validation hooks using instance_hooks after a save failure, and then retrying the save, you may now end up with duplicate validations. You no longer need to re-add validation hooks unless the object was saved successfully.