= New Features

* Model#validates_no_null_byte has been added to the
  validation_helpers.  It checks that the value being validated does
  not contain an ASCII NUL ('\0') byte.  Some databases will return an
  error if a string contains a NUL byte.

  The auto_validations plugin will now automatically add no_null_byte
  validations for all string columns in the model's table.  This will
  change exceptions raised by NUL bytes from database errors to
  validation failures.
  
  If you are using auto_validations and would like to have a table
  accept NUL bytes in string columns, use the following code inside
  the model:

    skip_auto_validations(:no_null_byte)

* JSONB subscripts are now supported on PostgreSQL 14+ when using the
  pg_json_ops extension.  You can use JSONB subscripts to more easily
  update part of a JSONB column:

    DB[:table].update(Sequel.pg_jsonb_op(:column)['key'] => 'value')
    UPDATE "table" SET "column"['key'] = 'value'

* hstore subscripts are now supported on PostgreSQL 14+ when using the
  pg_hstore_ops extension.  You can use hstore subscripts to more
  easily update part of an hstore column:

    DB[:table].update(Sequel.hstore_op(:column)['key'] => 'value')
    UPDATE "table" SET "column"['key'] = 'value'

* Sequel now supports table aliases for JOIN USING columns on
  PostgreSQL 14+.  These allow you to reference the USING columns in
  the query using a qualified identifier. To use this support, pass an
  SQL::AliasedExpression as the expression to join on:

    DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
    # SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"

* Database#create_trigger on PostgreSQL now supports a :replace option
  for CREATE OR REPLACE TRIGGER (supported in PostgreSQL 14+).

* SQL::Expression#sequel_ast_transform has been added to support
  AST transforms of custom expression classes.

= Other Improvements

* Sequel now supports calling PostgreSQL procedures without arguments
  when using Database#call_procedure.  Previously, attempts to call
  procuredures without arguments would call the procedure with a
  single NULL argument.

* Sequel now uses defined?(yield) instead of block_given? internally
  for better performance on CRuby.  defined?(yield) is faster as it is
  built into the VM, while block_given? is a regular method and has
  the overhead of calling a regular method.  Note that defined?(yield)
  is not implemented correctly on JRuby before 9.0.0.0, so this
  release of Sequel drops support for JRuby versions before 9.0.0.0.
