Skip to content

Commit

Permalink
Guard against trailing crap in the SELECT.
Browse files Browse the repository at this point in the history
[git-p4: depot-paths = "//src/cached_model/dev/": change = 3022]
  • Loading branch information
drbrain committed Feb 14, 2007
1 parent fcdf08a commit 2856eb8
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/cached_model.rb
Expand Up @@ -133,7 +133,7 @@ def self.find(*args)
# Find by primary key from the cache.

def self.find_by_sql(*args)
return super unless args.first =~ /^SELECT \* FROM #{table_name} WHERE \(#{table_name}\.#{primary_key} = '?(\d+)'?\)/
return super unless args.first =~ /^SELECT \* FROM #{table_name} WHERE \(#{table_name}\.#{primary_key} = '?(\d+)'?\)( +LIMIT 1|\Z)/

id = $1.to_i

Expand Down
35 changes: 34 additions & 1 deletion test/test_cached_model.rb
Expand Up @@ -324,8 +324,14 @@ def test_class_find_not_cached
assert_equal record, util_memcache(record)
end

def test_class_find_by_sql
def test_class_find_by_sql_1_1_x
CachedModel.use_local_cache = true
util_set

q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id}) LIMIT 1"
record = Concrete.find_by_sql(q).first
assert_equal @model.id, record.id

q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id + 1}) LIMIT 1"
record = Concrete.find_by_sql(q).first
assert_equal @model.id + 1, record.id
Expand All @@ -334,6 +340,21 @@ def test_class_find_by_sql
assert_equal record, util_memcache(record)
end

def test_class_find_by_sql_1_2_x
CachedModel.use_local_cache = true
util_set
q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id})"
record = Concrete.find_by_sql(q).first
assert_equal @model.id, record.id

q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id + 1})"
record = Concrete.find_by_sql(q).first
assert_equal @model.id + 1, record.id

assert_equal record, util_local(record)
assert_equal record, util_memcache(record)
end

def test_class_find_by_sql_extra_space
CachedModel.use_local_cache = true
q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id + 1}) LIMIT 1"
Expand All @@ -344,6 +365,18 @@ def test_class_find_by_sql_extra_space
assert_equal record, util_memcache(record)
end

def test_class_find_by_sql_trailing_stuff
CachedModel.use_local_cache = true
util_set

q = "SELECT * FROM concrete WHERE (concrete.id = #{@model.id}) AND 1 = 1"
record = Concrete.find_by_sql(q).first
assert_equal @model.id + 1, record.id

assert_equal nil, util_local(record)
assert_equal nil, util_memcache(record)
end

def test_class_find_by_sql_no_record
q = "SELECT * FROM concrete WHERE (concrete.id = -1) LIMIT 1"

Expand Down

0 comments on commit 2856eb8

Please sign in to comment.