Permalink
Browse files

Correctly send the string given to lock! and reload(:lock) to the loc…

…k scope - fixes #13788

As per the documentation at lock!, if the :lock option is a string it should use the given SQL to generate the lock statement.
  • Loading branch information...
1 parent f142527 commit 66e533f9b13f2ea1f56a19246af55621cc368489 @mauricio mauricio committed Jan 29, 2014
View
@@ -1,3 +1,13 @@
+* Correctly send an user provided statement to a `lock!()` call.
+
+ person.lock! 'FOR SHARE NOWAIT'
+ # Before: SELECT * ... LIMIT 1 FOR UPDATE
+ # After: SELECT * ... LIMIT 1 FOR SHARE NOWAIT
+
+ Fixes #13788.
+
+ *Maurício Linhares*
+
* Handle aliased attributes `select()`, `order()` and `reorder()`.
*Tsutomu Kuroda*
@@ -389,7 +389,7 @@ def reload(options = nil)
fresh_object =
if options && options[:lock]
- self.class.unscoped { self.class.lock.find(id) }
+ self.class.unscoped { self.class.lock(options[:lock]).find(id) }
else
self.class.unscoped { self.class.find(id) }
end
@@ -431,6 +431,17 @@ def test_with_lock_rolls_back_transaction
assert_equal old, person.reload.first_name
end
+ if current_adapter?(:PostgreSQLAdapter)
+ def test_lock_sending_custom_lock_statement
+ Person.transaction do
+ person = Person.find(1)
+ assert_sql(/LIMIT 1 FOR SHARE NOWAIT/) do
+ person.lock!('FOR SHARE NOWAIT')
+ end
+ end
+ end
+ end
+
if current_adapter?(:PostgreSQLAdapter, :OracleAdapter)
def test_no_locks_no_wait
first, second = duel { Person.find 1 }

0 comments on commit 66e533f

Please sign in to comment.