Skip to content

Commit f537b36

Browse files
committed
Merge pull request rails#37525 from chrismo/cte-in-pg-read-only-fix
Allow CTEs in read-only query with postgresql
1 parent 4404329 commit f537b36

File tree

6 files changed

+34
-3
lines changed

6 files changed

+34
-3
lines changed

activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def query(sql, name = nil) # :nodoc:
2020
end
2121

2222
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
23-
:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :describe, :desc
23+
:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :describe, :desc, :with
2424
) # :nodoc:
2525
private_constant :READ_QUERY
2626

activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def query(sql, name = nil) #:nodoc:
6767
end
6868
end
6969

70-
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback) # :nodoc:
70+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :with) # :nodoc:
7171
private_constant :READ_QUERY
7272

7373
def write_query?(sql) # :nodoc:

activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module ActiveRecord
44
module ConnectionAdapters
55
module SQLite3
66
module DatabaseStatements
7-
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback) # :nodoc:
7+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback, :with) # :nodoc:
88
private_constant :READ_QUERY
99

1010
def write_query?(sql) # :nodoc:

activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,15 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve
232232
end
233233
end
234234

235+
def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes
236+
@conn.execute("INSERT INTO `engines` (`car_id`) VALUES ('138853948594')")
237+
238+
@connection_handler.while_preventing_writes do
239+
sql = "WITH matching_cars AS (SELECT `engines`.* FROM `engines` WHERE `engines`.`car_id` = '138853948594') SELECT * FROM matching_cars"
240+
assert_equal 1, @conn.execute(sql).entries.count
241+
end
242+
end
243+
235244
def test_statement_timeout_error_codes
236245
raw_conn = @conn.raw_connection
237246
assert_raises(ActiveRecord::StatementTimeout) do

activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,17 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve
457457
end
458458
end
459459

460+
def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes
461+
with_example_table do
462+
@connection.execute("INSERT INTO ex (data) VALUES ('138853948594')")
463+
464+
@connection_handler.while_preventing_writes do
465+
sql = "WITH matching_ex_values AS (SELECT * FROM ex WHERE data = '138853948594') SELECT * FROM matching_ex_values"
466+
assert_equal 1, @connection.execute(sql).entries.count
467+
end
468+
end
469+
end
470+
460471
private
461472

462473
def with_example_table(definition = "id serial primary key, number integer, data character varying(255)", &block)

activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,17 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve
653653
end
654654
end
655655

656+
def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes
657+
with_example_table "id int, data string" do
658+
@conn.execute("INSERT INTO ex (data) VALUES ('138853948594')")
659+
660+
@connection_handler.while_preventing_writes do
661+
sql = "WITH matching_ex_values AS (SELECT * FROM ex WHERE data = '138853948594') SELECT * FROM matching_ex_values"
662+
assert_equal 1, @conn.execute(sql).entries.count
663+
end
664+
end
665+
end
666+
656667
private
657668

658669
def assert_logged(logs)

0 commit comments

Comments
 (0)