diff --git a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb index ac0ba254412a84c7d938dd56ee379a59d0a3dec0..fa627bf6e15c4db76971fb90d0ff443137a2b1aa 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb @@ -20,7 +20,7 @@ def query(sql, name = nil) # :nodoc: end READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp( - :begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :describe, :desc + :begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :describe, :desc, :with ) # :nodoc: private_constant :READ_QUERY diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb b/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb index 45ec79ca784dca91b78ac8ef2fafb9642f6bf863..b01b8977b8ce9b1dbf61bff55b5faaf0d1974845 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb @@ -67,7 +67,7 @@ def query(sql, name = nil) #:nodoc: end end - READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback) # :nodoc: + READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :with) # :nodoc: private_constant :READ_QUERY def write_query?(sql) # :nodoc: diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb b/activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb index 85053acf91452b6d5b810f225412553d2875c2f0..c15bb09745d95f4100e854b3273f123760445f45 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb @@ -4,7 +4,7 @@ module ActiveRecord module ConnectionAdapters module SQLite3 module DatabaseStatements - READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback) # :nodoc: + READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback, :with) # :nodoc: private_constant :READ_QUERY def write_query?(sql) # :nodoc: diff --git a/activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb b/activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb index 311bb7dee47efd1f1b96d8a19a1a1499d82cce8b..ae2d0ad027db197f1c4826c4787428f73171c22f 100644 --- a/activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb +++ b/activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb @@ -232,6 +232,15 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve end end + def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes + @conn.execute("INSERT INTO `engines` (`car_id`) VALUES ('138853948594')") + + @connection_handler.while_preventing_writes do + sql = "WITH matching_cars AS (SELECT `engines`.* FROM `engines` WHERE `engines`.`car_id` = '138853948594') SELECT * FROM matching_cars" + assert_equal 1, @conn.execute(sql).entries.count + end + end + def test_read_timeout_exception ActiveRecord::Base.establish_connection( ActiveRecord::Base.configurations[:arunit].merge("read_timeout" => 1) diff --git a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb index 830c0892d3c50a087dad8168ce8ef2dae81cb595..a188afa1722190127a603fa5d678b83df89e24a4 100644 --- a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb +++ b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb @@ -457,6 +457,17 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve end end + def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes + with_example_table do + @connection.execute("INSERT INTO ex (data) VALUES ('138853948594')") + + @connection_handler.while_preventing_writes do + sql = "WITH matching_ex_values AS (SELECT * FROM ex WHERE data = '138853948594') SELECT * FROM matching_ex_values" + assert_equal 1, @connection.execute(sql).entries.count + end + end + end + private def with_example_table(definition = "id serial primary key, number integer, data character varying(255)", &block) super(@connection, "ex", definition, &block) diff --git a/activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb b/activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb index 4b1773c82af27917e4a88eb12643809577219d7e..79257e44e423755270e9b421982b3a217911ea6b 100644 --- a/activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +++ b/activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb @@ -652,6 +652,17 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve end end + def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes + with_example_table "id int, data string" do + @conn.execute("INSERT INTO ex (data) VALUES ('138853948594')") + + @connection_handler.while_preventing_writes do + sql = "WITH matching_ex_values AS (SELECT * FROM ex WHERE data = '138853948594') SELECT * FROM matching_ex_values" + assert_equal 1, @conn.execute(sql).entries.count + end + end + end + private def assert_logged(logs) subscriber = SQLSubscriber.new