Skip to content

Commit d44b628

Browse files
lazyatomeileencodes
authored andcommitted
Dash comments should match read query regexp
As well as allowing queries of the form /* some comment */ SELECT ... we should also allow queries of the form -- some comment SELECT ... Additionally, I've added tests for both comment forms into the general adapter test case, along with some additional checks to ensure that the regexp does not return a false-positive match if the read query signifier keyword is actually a part of the comment. This expands on the change already implemented in 12b964c.
1 parent 9fb4ce4 commit d44b628

3 files changed

Lines changed: 71 additions & 1 deletion

File tree

activerecord/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Allow double-dash comment syntax when querying read-only databases
2+
3+
*James Adam*
4+
15
* Add `values_at` method.
26

37
Returns an array containing the values associated with the given methods.

activerecord/lib/active_record/connection_adapters/abstract_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AbstractAdapter
3737
include Savepoints
3838

3939
SIMPLE_INT = /\A\d+\z/
40-
COMMENT_REGEX = %r{/\*(?:[^\*]|\*[^/])*\*/}m
40+
COMMENT_REGEX = %r{(?:\-\-.*\n)*|/\*(?:[^\*]|\*[^/])*\*/}m
4141

4242
attr_accessor :pool
4343
attr_reader :visitor, :owner, :logger, :lock

activerecord/test/cases/adapter_test.rb

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,72 @@ def test_doesnt_error_when_a_select_query_is_called_while_preventing_writes
235235
end
236236
end
237237

238+
def test_doesnt_error_when_a_select_query_starting_with_a_slash_star_comment_is_called_while_preventing_writes
239+
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
240+
241+
@connection_handler.while_preventing_writes do
242+
result = @connection.select_all("/* some comment */ SELECT subscribers.* FROM subscribers WHERE nick = '138853948594'")
243+
assert_equal 1, result.length
244+
end
245+
end
246+
247+
def test_errors_when_an_insert_query_prefixed_by_a_slash_star_comment_is_called_while_preventing_writes
248+
@connection_handler.while_preventing_writes do
249+
@connection.transaction do
250+
assert_no_queries do
251+
assert_raises(ActiveRecord::ReadOnlyError) do
252+
@connection.insert("/* some comment */ INSERT INTO subscribers(nick) VALUES ('138853948594')", nil, false)
253+
end
254+
end
255+
end
256+
end
257+
end
258+
259+
def test_doesnt_error_when_a_select_query_starting_with_double_dash_comments_is_called_while_preventing_writes
260+
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
261+
262+
@connection_handler.while_preventing_writes do
263+
result = @connection.select_all("-- some comment\n-- comment about INSERT\nSELECT subscribers.* FROM subscribers WHERE nick = '138853948594'")
264+
assert_equal 1, result.length
265+
end
266+
end
267+
268+
def test_errors_when_an_insert_query_prefixed_by_a_double_dash_comment_is_called_while_preventing_writes
269+
@connection_handler.while_preventing_writes do
270+
@connection.transaction do
271+
assert_no_queries do
272+
assert_raises(ActiveRecord::ReadOnlyError) do
273+
@connection.insert("-- some comment\nINSERT INTO subscribers(nick) VALUES ('138853948594')", nil, false)
274+
end
275+
end
276+
end
277+
end
278+
end
279+
280+
def test_errors_when_an_insert_query_prefixed_by_a_slash_star_comment_containing_read_command_is_called_while_preventing_writes
281+
@connection_handler.while_preventing_writes do
282+
@connection.transaction do
283+
assert_no_queries do
284+
assert_raises(ActiveRecord::ReadOnlyError) do
285+
@connection.insert("/* SELECT */ INSERT INTO subscribers(nick) VALUES ('138853948594')", nil, false)
286+
end
287+
end
288+
end
289+
end
290+
end
291+
292+
def test_errors_when_an_insert_query_prefixed_by_a_double_dash_comment_containing_read_command_is_called_while_preventing_writes
293+
@connection_handler.while_preventing_writes do
294+
@connection.transaction do
295+
assert_no_queries do
296+
assert_raises(ActiveRecord::ReadOnlyError) do
297+
@connection.insert("-- SELECT\nINSERT INTO subscribers(nick) VALUES ('138853948594')", nil, false)
298+
end
299+
end
300+
end
301+
end
302+
end
303+
238304
if ActiveRecord::Base.connection.supports_common_table_expressions?
239305
def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes
240306
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")

0 commit comments

Comments
 (0)