Skip to content

Commit

Permalink
Disallow usage of paged_delete in paged_operations plugin on MSSQL wi…
Browse files Browse the repository at this point in the history
…th emulated offsets
  • Loading branch information
jeremyevans committed Sep 28, 2023
1 parent a0d281c commit 3fd272a
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
4 changes: 2 additions & 2 deletions lib/sequel/plugins/paged_operations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ def paged_datasets(opts=OPTS)
# :rows_per_page :: The maximum number of rows affected by each DELETE query
# (unless concurrent modifications are made to the table).
def paged_delete(opts=OPTS)
if db.database_type == :oracle && !supports_fetch_next_rows?
raise Error, "paged_delete is not supported on Oracle when using emulated offsets"
if (db.database_type == :oracle && !supports_fetch_next_rows?) || (db.database_type == :mssql && !is_2012_or_later?)
raise Error, "paged_delete is not supported on MSSQL/Oracle when using emulated offsets"
end
pk = _paged_operations_pk(:paged_delete)
rows_deleted = 0
Expand Down
8 changes: 8 additions & 0 deletions spec/extensions/paged_operations_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,14 @@
proc{@ds.limit(1).paged_datasets{}}.must_raise Sequel::Error
end

it "should raise error paged_delete for MSSQL with emulated offsets" do
db = Sequel.connect('mock://mssql')
def db.server_version(_=nil); 10000000; end
@c.dataset = db[:t]
ds = @c.dataset
proc{ds.paged_delete}.must_raise Sequel::Error
end

it "should raise error for DB2 with emulated offsets" do
@c.dataset = Sequel.connect('mock://db2')[:t]
ds = @c.dataset
Expand Down
4 changes: 2 additions & 2 deletions spec/integration/plugin_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3048,7 +3048,7 @@ def set(k, v, ttl) self[k] = v end
end
@model.paged_delete.must_equal 100
@model.count.must_equal 0
end unless (DB.database_type == :oracle && !DB.dataset.supports_fetch_next_rows?)
end unless (DB.database_type == :oracle && !DB.dataset.supports_fetch_next_rows?) || (DB.database_type == :mssql && !DB.dataset.send(:is_2012_or_later?))

it "Model#paged_update should work on unfiltered dataset" do
expected = 100.times.map{|i| [i+1, i+200]}
Expand Down Expand Up @@ -3089,7 +3089,7 @@ def set(k, v, ttl) self[k] = v end
ds.paged_delete.must_equal 49
ds.count.must_equal 0
@model.count.must_equal 51
end unless (DB.database_type == :oracle && !DB.dataset.supports_fetch_next_rows?)
end unless (DB.database_type == :oracle && !DB.dataset.supports_fetch_next_rows?) || (DB.database_type == :mssql && !DB.dataset.send(:is_2012_or_later?))

it "Model#paged_update should work on filtered dataset" do
ds = @model.where{id < 50}
Expand Down

0 comments on commit 3fd272a

Please sign in to comment.