sequel 5.26.0 → 5.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +12 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/lib/sequel/adapters/shared/postgres.rb +5 -0
- data/lib/sequel/adapters/shared/sqlite.rb +7 -2
- data/lib/sequel/dataset/features.rb +6 -0
- data/lib/sequel/dataset/sql.rb +17 -4
- data/lib/sequel/extensions/pg_array_ops.rb +10 -6
- data/lib/sequel/extensions/pg_enum.rb +4 -1
- data/lib/sequel/sql.rb +1 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +5 -7
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +15 -1
- data/spec/extensions/pg_array_ops_spec.rb +3 -3
- data/spec/integration/dataset_test.rb +25 -0
- data/spec/integration/plugin_test.rb +1 -1
- data/spec/integration/spec_helper.rb +7 -1
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 512f72ad99402b33be776e759611a9299b638f49344fb1f349120c8cd1643107
         | 
| 4 | 
            +
              data.tar.gz: ea0852b3ea61ef9a5a192637a2b457fe47f2374c8ee2eb20d9b02e6eb25a25ac
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4397a4a7530bd3234d7c1e3bf8b1c2b8a6845e659b86b7177dc704edf8ebf2185c499ac7ba04bb7d52006cf1367b8c0835787be1483e7bb481fa4ea2d775680b
         | 
| 7 | 
            +
              data.tar.gz: 653238c46ae32bd74127bddb87dc4c99637f5eadfb7515a51e8da5bc57df10de57c2e9a97d085828cc45b97303fa66580c1c8832a5f6fbb5cdaffd585ce0ff86
         | 
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,3 +1,15 @@ | |
| 1 | 
            +
            === 5.27.0 (2019-12-01)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Add Sequel::DEFAULT for a DEFAULT expression, useful for assigning to default values (jeremyevans)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Make Postgres::ArrayOp#join in pg_array_ops extension work correctly on PostgreSQL <9.1 (jeremyevans)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Make pg_enum extension work correctly on PostgreSQL 8.3-9.0 (jeremyevans)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * Emulate FILTER clause for aggregate functions using CASE on databases not supporting it directly (jeremyevans)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            * Support ordering by NULLS FIRST/NULLS LAST without emulation on SQLite 3.30+ (jeremyevans)
         | 
| 12 | 
            +
             | 
| 1 13 | 
             
            === 5.26.0 (2019-11-01)
         | 
| 2 14 |  | 
| 3 15 | 
             
            * Recognize two additional foreign key constraint violation codes on MySQL 8.0.13+ (rianmcguire) (#1657)
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            = New Features
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Sequel::DEFAULT has been added a constant for the DEFAULT expression,
         | 
| 4 | 
            +
              useful in inserts and especially updates:
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                DB[:a].where(:id=>1).update(:b=>Sequel::DEFAULT)
         | 
| 7 | 
            +
                # UPDATE "a" SET "b" = DEFAULT WHERE "id" = 1
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * SQL::Function#filter for filtered aggregate functions is now
         | 
| 10 | 
            +
              supported on all databases.  On databases not supporting it natively
         | 
| 11 | 
            +
              (all except PostgreSQL 9.4+ and SQLite 3.30+), a CASE statement is
         | 
| 12 | 
            +
              used to emulate the support.
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            = Other Improvements
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            * NULLS FIRST/LAST is now used without emulation on SQLite 3.30+.
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            * The pg_enum extension now works correctly on PostgreSQL 8.3-9.0.
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            * Postgres::ArrayOp#join in the pg_array_ops extension now works
         | 
| 21 | 
            +
              correctly on PostgreSQL <9.1.
         | 
| @@ -1955,6 +1955,11 @@ module Sequel | |
| 1955 1955 | 
             
                    db.server_version(@opts[:server])
         | 
| 1956 1956 | 
             
                  end
         | 
| 1957 1957 |  | 
| 1958 | 
            +
                  # PostgreSQL 9.4+ supports the FILTER clause for aggregate functions.
         | 
| 1959 | 
            +
                  def supports_filtered_aggregates?
         | 
| 1960 | 
            +
                    server_version >= 90400
         | 
| 1961 | 
            +
                  end
         | 
| 1962 | 
            +
             | 
| 1958 1963 | 
             
                  # PostgreSQL supports quoted function names.
         | 
| 1959 1964 | 
             
                  def supports_quoted_function_names?
         | 
| 1960 1965 | 
             
                    true
         | 
| @@ -869,9 +869,9 @@ module Sequel | |
| 869 869 | 
             
                    end
         | 
| 870 870 | 
             
                  end
         | 
| 871 871 |  | 
| 872 | 
            -
                  # SQLite  | 
| 872 | 
            +
                  # SQLite supports NULLS FIRST/LAST natively in 3.30+.
         | 
| 873 873 | 
             
                  def requires_emulating_nulls_first?
         | 
| 874 | 
            -
                     | 
| 874 | 
            +
                    db.sqlite_version < 33000
         | 
| 875 875 | 
             
                  end
         | 
| 876 876 |  | 
| 877 877 | 
             
                  # SQLite does not support FOR UPDATE, but silently ignore it
         | 
| @@ -897,6 +897,11 @@ module Sequel | |
| 897 897 | 
             
                    false
         | 
| 898 898 | 
             
                  end
         | 
| 899 899 |  | 
| 900 | 
            +
                  # SQLite 3.30 supports the FILTER clause for aggregate functions.
         | 
| 901 | 
            +
                  def supports_filtered_aggregates?
         | 
| 902 | 
            +
                    db.sqlite_version >= 33000
         | 
| 903 | 
            +
                  end
         | 
| 904 | 
            +
             | 
| 900 905 | 
             
                  # SQLite supports quoted function names.
         | 
| 901 906 | 
             
                  def supports_quoted_function_names?
         | 
| 902 907 | 
             
                    true
         | 
| @@ -230,6 +230,12 @@ module Sequel | |
| 230 230 | 
             
                  supports_cte_in_subqueries?
         | 
| 231 231 | 
             
                end
         | 
| 232 232 |  | 
| 233 | 
            +
                # Whether the dataset supports the FILTER clause for aggregate functions.
         | 
| 234 | 
            +
                # If not, support is emulated using CASE.
         | 
| 235 | 
            +
                def supports_filtered_aggregates?
         | 
| 236 | 
            +
                  false
         | 
| 237 | 
            +
                end
         | 
| 238 | 
            +
             | 
| 233 239 | 
             
                # Whether the database supports quoting function names.
         | 
| 234 240 | 
             
                def supports_quoted_function_names?
         | 
| 235 241 | 
             
                  false
         | 
    
        data/lib/sequel/dataset/sql.rb
    CHANGED
    
    | @@ -492,11 +492,24 @@ module Sequel | |
| 492 492 | 
             
                  end
         | 
| 493 493 |  | 
| 494 494 | 
             
                  sql << '('
         | 
| 495 | 
            +
                  if filter = opts[:filter]
         | 
| 496 | 
            +
                    filter = filter_expr(filter, &opts[:filter_block])
         | 
| 497 | 
            +
                  end
         | 
| 495 498 | 
             
                  if opts[:*]
         | 
| 496 | 
            -
                     | 
| 499 | 
            +
                    if filter && !supports_filtered_aggregates?
         | 
| 500 | 
            +
                      literal_append(sql, Sequel.case({filter=>1}, nil))
         | 
| 501 | 
            +
                      filter = nil
         | 
| 502 | 
            +
                    else
         | 
| 503 | 
            +
                      sql <<  '*'
         | 
| 504 | 
            +
                    end
         | 
| 497 505 | 
             
                  else
         | 
| 498 506 | 
             
                    sql << "DISTINCT " if opts[:distinct]
         | 
| 499 | 
            -
                     | 
| 507 | 
            +
                    if filter && !supports_filtered_aggregates?
         | 
| 508 | 
            +
                      expression_list_append(sql, f.args.map{|arg| Sequel.case({filter=>arg}, nil)})
         | 
| 509 | 
            +
                      filter = nil
         | 
| 510 | 
            +
                    else
         | 
| 511 | 
            +
                      expression_list_append(sql, f.args)
         | 
| 512 | 
            +
                    end
         | 
| 500 513 | 
             
                    if order = opts[:order]
         | 
| 501 514 | 
             
                      sql << " ORDER BY "
         | 
| 502 515 | 
             
                      expression_list_append(sql, order)
         | 
| @@ -510,9 +523,9 @@ module Sequel | |
| 510 523 | 
             
                    sql << ')'
         | 
| 511 524 | 
             
                  end
         | 
| 512 525 |  | 
| 513 | 
            -
                  if filter | 
| 526 | 
            +
                  if filter
         | 
| 514 527 | 
             
                    sql << " FILTER (WHERE "
         | 
| 515 | 
            -
                    literal_append(sql,  | 
| 528 | 
            +
                    literal_append(sql, filter)
         | 
| 516 529 | 
             
                    sql << ')'
         | 
| 517 530 | 
             
                  end
         | 
| 518 531 |  | 
| @@ -51,8 +51,8 @@ | |
| 51 51 | 
             
            #   ia.length(2)       # array_length(int_array_column, 2)
         | 
| 52 52 | 
             
            #   ia.lower           # array_lower(int_array_column, 1)
         | 
| 53 53 | 
             
            #   ia.lower(2)        # array_lower(int_array_column, 2)
         | 
| 54 | 
            -
            #   ia.join            # array_to_string(int_array_column, '' | 
| 55 | 
            -
            #   ia.join(':')       # array_to_string(int_array_column, ':' | 
| 54 | 
            +
            #   ia.join            # array_to_string(int_array_column, '')
         | 
| 55 | 
            +
            #   ia.join(':')       # array_to_string(int_array_column, ':')
         | 
| 56 56 | 
             
            #   ia.join(':', ' ')  # array_to_string(int_array_column, ':', ' ')
         | 
| 57 57 | 
             
            #   ia.unnest          # unnest(int_array_column)
         | 
| 58 58 | 
             
            #   ia.unnest(:b)      # unnest(int_array_column, b)
         | 
| @@ -217,12 +217,16 @@ module Sequel | |
| 217 217 |  | 
| 218 218 | 
             
                  # Call the array_to_string method:
         | 
| 219 219 | 
             
                  #
         | 
| 220 | 
            -
                  #   array_op.join           # array_to_string(array, '' | 
| 221 | 
            -
                  #   array_op.to_string      # array_to_string(array, '' | 
| 222 | 
            -
                  #   array_op.join(":")      # array_to_string(array, ':' | 
| 220 | 
            +
                  #   array_op.join           # array_to_string(array, '')
         | 
| 221 | 
            +
                  #   array_op.to_string      # array_to_string(array, '')
         | 
| 222 | 
            +
                  #   array_op.join(":")      # array_to_string(array, ':')
         | 
| 223 223 | 
             
                  #   array_op.join(":", "*") # array_to_string(array, ':', '*')
         | 
| 224 224 | 
             
                  def to_string(joiner="", null=nil)
         | 
| 225 | 
            -
                     | 
| 225 | 
            +
                    if null.nil?
         | 
| 226 | 
            +
                      function(:array_to_string, joiner)
         | 
| 227 | 
            +
                    else
         | 
| 228 | 
            +
                      function(:array_to_string, joiner, null)
         | 
| 229 | 
            +
                    end
         | 
| 226 230 | 
             
                  end
         | 
| 227 231 | 
             
                  alias join to_string
         | 
| 228 232 |  | 
| @@ -133,8 +133,11 @@ module Sequel | |
| 133 133 | 
             
                  # the pg_type table to get names and array oids for
         | 
| 134 134 | 
             
                  # enums.
         | 
| 135 135 | 
             
                  def parse_enum_labels
         | 
| 136 | 
            +
                    order = [:enumtypid]
         | 
| 137 | 
            +
                    order << :enumsortorder if server_version >= 90100
         | 
| 138 | 
            +
             | 
| 136 139 | 
             
                    enum_labels = metadata_dataset.from(:pg_enum).
         | 
| 137 | 
            -
                      order( | 
| 140 | 
            +
                      order(*order).
         | 
| 138 141 | 
             
                      select_hash_groups(Sequel.cast(:enumtypid, Integer).as(:v), :enumlabel).freeze
         | 
| 139 142 | 
             
                    enum_labels.each_value(&:freeze)
         | 
| 140 143 |  | 
    
        data/lib/sequel/sql.rb
    CHANGED
    
    | @@ -1317,6 +1317,7 @@ module Sequel | |
| 1317 1317 | 
             
                  CURRENT_DATE = Constant.new(:CURRENT_DATE)
         | 
| 1318 1318 | 
             
                  CURRENT_TIME = Constant.new(:CURRENT_TIME)
         | 
| 1319 1319 | 
             
                  CURRENT_TIMESTAMP = Constant.new(:CURRENT_TIMESTAMP)
         | 
| 1320 | 
            +
                  DEFAULT = Constant.new(:DEFAULT)
         | 
| 1320 1321 | 
             
                  SQLTRUE = TRUE = BooleanConstant.new(true)
         | 
| 1321 1322 | 
             
                  SQLFALSE = FALSE = BooleanConstant.new(false)
         | 
| 1322 1323 | 
             
                  NULL = BooleanConstant.new(nil)
         | 
    
        data/lib/sequel/version.rb
    CHANGED
    
    | @@ -6,7 +6,7 @@ module Sequel | |
| 6 6 |  | 
| 7 7 | 
             
              # The minor version of Sequel.  Bumped for every non-patch level
         | 
| 8 8 | 
             
              # release, generally around once a month.
         | 
| 9 | 
            -
              MINOR =  | 
| 9 | 
            +
              MINOR = 27
         | 
| 10 10 |  | 
| 11 11 | 
             
              # The tiny version of Sequel.  Usually 0, only bumped for bugfix
         | 
| 12 12 | 
             
              # releases that fix regressions from previous versions.
         | 
| @@ -70,7 +70,7 @@ describe "PostgreSQL", '#create_table' do | |
| 70 70 |  | 
| 71 71 | 
             
              it "should create an unlogged table" do
         | 
| 72 72 | 
             
                @db.create_table(:unlogged_dolls, :unlogged => true){text :name}
         | 
| 73 | 
            -
              end
         | 
| 73 | 
            +
              end if DB.server_version >= 90100
         | 
| 74 74 |  | 
| 75 75 | 
             
              it "should create a table inheriting from another table" do
         | 
| 76 76 | 
             
                @db.create_table(:unlogged_dolls){text :name}
         | 
| @@ -615,10 +615,6 @@ describe "A PostgreSQL dataset" do | |
| 615 615 | 
             
                @d.from{generate_series(1,3,1).as(:a)}.select{(a.sql_number % 2).as(:a)}.from_self.get{mode.function.within_group(:a)}.must_equal 1
         | 
| 616 616 | 
             
              end if DB.server_version >= 90400
         | 
| 617 617 |  | 
| 618 | 
            -
              it "should support filtered aggregate functions" do
         | 
| 619 | 
            -
                @d.from{generate_series(1,3,1).as(:a)}.select{(a.sql_number % 2).as(:a)}.from_self.get{count(:a).filter(:a=>1)}.must_equal 2
         | 
| 620 | 
            -
              end if DB.server_version >= 90400
         | 
| 621 | 
            -
             | 
| 622 618 | 
             
              it "should support functions with ordinality" do
         | 
| 623 619 | 
             
                @d.from{generate_series(1,10,3).with_ordinality}.select_map([:generate_series, :ordinality]).must_equal [[1, 1], [4, 2], [7, 3], [10, 4]]
         | 
| 624 620 | 
             
              end if DB.server_version >= 90400
         | 
| @@ -1272,7 +1268,7 @@ describe "A PostgreSQL database" do | |
| 1272 1268 | 
             
              end
         | 
| 1273 1269 |  | 
| 1274 1270 | 
             
              it "should support indexes with index type" do
         | 
| 1275 | 
            -
                @db.create_table(:posts){ | 
| 1271 | 
            +
                @db.create_table(:posts){box :geom; index :geom, :type => 'gist'}
         | 
| 1276 1272 | 
             
              end
         | 
| 1277 1273 |  | 
| 1278 1274 | 
             
              it "should support unique indexes with index type" do
         | 
| @@ -2704,6 +2700,8 @@ describe 'PostgreSQL array handling' do | |
| 2704 2700 | 
             
                if @db.server_version >= 90000
         | 
| 2705 2701 | 
             
                  @ds.get(Sequel.pg_array(:i5).join).must_equal '15'
         | 
| 2706 2702 | 
             
                  @ds.get(Sequel.pg_array(:i5).join(':')).must_equal '1:5'
         | 
| 2703 | 
            +
                end
         | 
| 2704 | 
            +
                if @db.server_version >= 90100
         | 
| 2707 2705 | 
             
                  @ds.get(Sequel.pg_array(:i5).join(':', '*')).must_equal '1:*:5'
         | 
| 2708 2706 | 
             
                end
         | 
| 2709 2707 | 
             
                if @db.server_version >= 90300
         | 
| @@ -4475,4 +4473,4 @@ describe "pg_auto_constraint_validations plugin" do | |
| 4475 4473 | 
             
                  File.delete(cache_file) if File.file?(cache_file)
         | 
| 4476 4474 | 
             
                end
         | 
| 4477 4475 | 
             
              end
         | 
| 4478 | 
            -
            end if DB.respond_to?(:error_info)
         | 
| 4476 | 
            +
            end if DB.respond_to?(:error_info) && DB.server_version >= 90300
         | 
| @@ -623,7 +623,7 @@ describe "SQLite", 'INSERT ON CONFLICT' do | |
| 623 623 | 
             
                @ds.insert_conflict(:target=>:a).insert(1, 3, 4, false)
         | 
| 624 624 | 
             
                @ds.insert_conflict(:target=>:c, :conflict_where=>:c_is_unique).insert(11, 12, 3, true)
         | 
| 625 625 | 
             
                @ds.all.must_equal [{:a=>1, :b=>2, :c=>3, :c_is_unique=>false}, {:a=>10, :b=>11, :c=>3, :c_is_unique=>true}]
         | 
| 626 | 
            -
              end
         | 
| 626 | 
            +
              end unless DB.adapter_scheme == :amalgalite
         | 
| 627 627 |  | 
| 628 628 | 
             
              it "Dataset#insert_ignore and insert_conflict should work with multi_insert/import" do
         | 
| 629 629 | 
             
                @ds.insert(1, 2, 3, false)
         | 
| @@ -353,6 +353,11 @@ describe "Blockless Ruby Filters" do | |
| 353 353 | 
             
                @d.l({:x => Sequel::FALSE}).must_equal '(x IS FALSE)'
         | 
| 354 354 | 
             
                @d.l({:x => Sequel::SQLTRUE}).must_equal '(x IS TRUE)'
         | 
| 355 355 | 
             
                @d.l({:x => Sequel::SQLFALSE}).must_equal '(x IS FALSE)'
         | 
| 356 | 
            +
             | 
| 357 | 
            +
                @d.l({:x => Sequel::CURRENT_DATE}).must_equal '(x = CURRENT_DATE)'
         | 
| 358 | 
            +
                @d.l({:x => Sequel::CURRENT_TIME}).must_equal '(x = CURRENT_TIME)'
         | 
| 359 | 
            +
                @d.l({:x => Sequel::CURRENT_TIMESTAMP}).must_equal '(x = CURRENT_TIMESTAMP)'
         | 
| 360 | 
            +
                @d.l({:x => Sequel::DEFAULT}).must_equal '(x = DEFAULT)'
         | 
| 356 361 | 
             
              end
         | 
| 357 362 |  | 
| 358 363 | 
             
              it "should support negation of SQL::Constants" do
         | 
| @@ -741,14 +746,23 @@ describe Sequel::SQL::VirtualRow do | |
| 741 746 | 
             
                @d.l{mode.function.within_group(:a, :b)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a", "b")' 
         | 
| 742 747 | 
             
              end
         | 
| 743 748 |  | 
| 749 | 
            +
              it "should handle emualted filtered aggregate function calls" do
         | 
| 750 | 
            +
                @d.l{count.function.*.filter(Sequel.&(:a, :b))}.must_equal 'count((CASE WHEN ("a" AND "b") THEN 1 ELSE NULL END))' 
         | 
| 751 | 
            +
                @d.l{count.function.*.filter(:a=>1)}.must_equal 'count((CASE WHEN ("a" = 1) THEN 1 ELSE NULL END))'
         | 
| 752 | 
            +
                @d.l{count(:a).filter{b > 1}}.must_equal 'count((CASE WHEN ("b" > 1) THEN "a" ELSE NULL END))'
         | 
| 753 | 
            +
                @d.l{count(:a).filter(:a=>1){b > 1}}.must_equal 'count((CASE WHEN (("a" = 1) AND ("b" > 1)) THEN "a" ELSE NULL END))'
         | 
| 754 | 
            +
              end
         | 
| 755 | 
            +
             | 
| 744 756 | 
             
              it "should handle filtered aggregate function calls" do
         | 
| 757 | 
            +
                @d = @d.with_extend{def supports_filtered_aggregates?; true end}
         | 
| 745 758 | 
             
                @d.l{count.function.*.filter(Sequel.&(:a, :b))}.must_equal 'count(*) FILTER (WHERE ("a" AND "b"))' 
         | 
| 746 759 | 
             
                @d.l{count.function.*.filter(:a=>1)}.must_equal 'count(*) FILTER (WHERE ("a" = 1))'
         | 
| 747 760 | 
             
                @d.l{count.function.*.filter{b > 1}}.must_equal 'count(*) FILTER (WHERE ("b" > 1))'
         | 
| 748 761 | 
             
                @d.l{count.function.*.filter(:a=>1){b > 1}}.must_equal 'count(*) FILTER (WHERE (("a" = 1) AND ("b" > 1)))'
         | 
| 749 762 | 
             
              end
         | 
| 750 763 |  | 
| 751 | 
            -
              it "should handle  | 
| 764 | 
            +
              it "should handle filtered ordered-set and hypothetical-set function calls" do
         | 
| 765 | 
            +
                @d = @d.with_extend{def supports_filtered_aggregates?; true end}
         | 
| 752 766 | 
             
                @d.l{mode.function.within_group(:a).filter(:a=>1)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a") FILTER (WHERE ("a" = 1))' 
         | 
| 753 767 | 
             
              end
         | 
| 754 768 |  | 
| @@ -83,9 +83,9 @@ describe "Sequel::Postgres::ArrayOp" do | |
| 83 83 | 
             
              end
         | 
| 84 84 |  | 
| 85 85 | 
             
              it "#to_string/join should use the array_to_string function" do
         | 
| 86 | 
            -
                @db.literal(@a.to_string).must_equal "array_to_string(a, '' | 
| 87 | 
            -
                @db.literal(@a.join).must_equal "array_to_string(a, '' | 
| 88 | 
            -
                @db.literal(@a.join(':')).must_equal "array_to_string(a, ':' | 
| 86 | 
            +
                @db.literal(@a.to_string).must_equal "array_to_string(a, '')"
         | 
| 87 | 
            +
                @db.literal(@a.join).must_equal "array_to_string(a, '')"
         | 
| 88 | 
            +
                @db.literal(@a.join(':')).must_equal "array_to_string(a, ':')"
         | 
| 89 89 | 
             
                @db.literal(@a.join(':', '*')).must_equal "array_to_string(a, ':', '*')"
         | 
| 90 90 | 
             
              end
         | 
| 91 91 |  | 
| @@ -92,6 +92,17 @@ describe "Simple Dataset operations" do | |
| 92 92 | 
             
                @ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.must_equal [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
         | 
| 93 93 | 
             
              end
         | 
| 94 94 |  | 
| 95 | 
            +
              cspecify "should have insert and update work with Sequel::DEFAULT", :sqlite do
         | 
| 96 | 
            +
                @db.create_table!(:items) do
         | 
| 97 | 
            +
                  Integer :number, :default=>10
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
                @ds.insert(:number=>Sequel::DEFAULT)
         | 
| 100 | 
            +
                @ds.select_map(:number).must_equal [10]
         | 
| 101 | 
            +
                @ds.insert(:number=>20)
         | 
| 102 | 
            +
                @ds.update(:number=>Sequel::DEFAULT)
         | 
| 103 | 
            +
                @ds.select_map(:number).must_equal [10, 10]
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
             | 
| 95 106 | 
             
              cspecify "should have insert work correctly when inserting a row with all NULL values", :hsqldb do
         | 
| 96 107 | 
             
                @db.create_table!(:items) do
         | 
| 97 108 | 
             
                  String :name
         | 
| @@ -443,6 +454,20 @@ describe Sequel::Dataset do | |
| 443 454 | 
             
                @d.extension(:sequel_4_dataset_methods).interval(:value).to_i.must_equal 6
         | 
| 444 455 | 
             
              end
         | 
| 445 456 |  | 
| 457 | 
            +
              it "should support or emulate filtered aggregate functions" do
         | 
| 458 | 
            +
                @d.insert(:name => 'abc', :value => 123)
         | 
| 459 | 
            +
                @d.insert(:name => 'abc', :value => 456)
         | 
| 460 | 
            +
                @d.insert(:name => 'def', :value => 324)
         | 
| 461 | 
            +
                @d.get{count.function.*.filter{value > 100}}.must_equal 3
         | 
| 462 | 
            +
                @d.get{count.function.*.filter{value > 200}}.must_equal 2
         | 
| 463 | 
            +
                @d.get{count.function.*.filter{value > 400}}.must_equal 1
         | 
| 464 | 
            +
                @d.get{count.function.*.filter{value > 500}}.must_equal 0
         | 
| 465 | 
            +
                @d.get{count(:value).filter{value > 100}}.must_equal 3
         | 
| 466 | 
            +
                @d.get{count(:value).filter{value > 200}}.must_equal 2
         | 
| 467 | 
            +
                @d.get{count(:value).filter{value > 400}}.must_equal 1
         | 
| 468 | 
            +
                @d.get{count(:value).filter{value > 500}}.must_equal 0
         | 
| 469 | 
            +
              end
         | 
| 470 | 
            +
             | 
| 446 471 | 
             
              it "should return the correct records" do
         | 
| 447 472 | 
             
                @d.to_a.must_equal []
         | 
| 448 473 | 
             
                @d.insert(:name => 'abc', :value => 123)
         | 
| @@ -2393,7 +2393,7 @@ describe "string_agg extension" do | |
| 2393 2393 | 
             
              cspecify "should have string_agg return aggregated concatenation for distinct values", :mssql, :sqlite, :oracle, :db2, :derby do
         | 
| 2394 2394 | 
             
                @ds.select_group(:id).select_append(Sequel.string_agg(:s).order(:s).distinct.as(:v)).map([:id, :v]).must_equal [[1, 'a,b,c'], [2, 'aa,bb']]
         | 
| 2395 2395 | 
             
              end
         | 
| 2396 | 
            -
            end
         | 
| 2396 | 
            +
            end if (DB.database_type != :postgres || DB.server_version >= 90000)
         | 
| 2397 2397 |  | 
| 2398 2398 | 
             
            describe "insert_conflict plugin" do
         | 
| 2399 2399 | 
             
              before(:all) do
         | 
| @@ -62,4 +62,10 @@ if ENV['SEQUEL_FREEZE_DATABASE'] | |
| 62 62 | 
             
              DB.freeze
         | 
| 63 63 | 
             
            end
         | 
| 64 64 |  | 
| 65 | 
            -
             | 
| 65 | 
            +
            version = if DB.respond_to?(:server_version)
         | 
| 66 | 
            +
              DB.server_version
         | 
| 67 | 
            +
            elsif DB.respond_to?(:sqlite_version)
         | 
| 68 | 
            +
              DB.sqlite_version
         | 
| 69 | 
            +
            end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            puts "running #{defined?(SEQUEL_ADAPTER_TEST) ? SEQUEL_ADAPTER_TEST : "integration (database type: #{DB.database_type})"} specs on #{RUBY_ENGINE} #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION} with #{DB.adapter_scheme} adapter#{" (database version: #{version})" if version}"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sequel
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 5. | 
| 4 | 
            +
              version: 5.27.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jeremy Evans
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-12-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: minitest
         | 
| @@ -224,6 +224,7 @@ extra_rdoc_files: | |
| 224 224 | 
             
            - doc/release_notes/5.24.0.txt
         | 
| 225 225 | 
             
            - doc/release_notes/5.25.0.txt
         | 
| 226 226 | 
             
            - doc/release_notes/5.26.0.txt
         | 
| 227 | 
            +
            - doc/release_notes/5.27.0.txt
         | 
| 227 228 | 
             
            files:
         | 
| 228 229 | 
             
            - CHANGELOG
         | 
| 229 230 | 
             
            - MIT-LICENSE
         | 
| @@ -321,6 +322,7 @@ files: | |
| 321 322 | 
             
            - doc/release_notes/5.24.0.txt
         | 
| 322 323 | 
             
            - doc/release_notes/5.25.0.txt
         | 
| 323 324 | 
             
            - doc/release_notes/5.26.0.txt
         | 
| 325 | 
            +
            - doc/release_notes/5.27.0.txt
         | 
| 324 326 | 
             
            - doc/release_notes/5.3.0.txt
         | 
| 325 327 | 
             
            - doc/release_notes/5.4.0.txt
         | 
| 326 328 | 
             
            - doc/release_notes/5.5.0.txt
         |