Skip to content

Commit 9a4ff4d

Browse files
committed
Add supports_common_table_expressions? for CTE testing
1 parent f537b36 commit 9a4ff4d

File tree

10 files changed

+40
-33
lines changed

10 files changed

+40
-33
lines changed

activerecord/lib/active_record/connection_adapters/abstract_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,10 @@ def supports_optimizer_hints?
416416
false
417417
end
418418

419+
def supports_common_table_expressions?
420+
false
421+
end
422+
419423
def supports_lazy_transactions?
420424
false
421425
end

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ def supports_optimizer_hints?
110110
!mariadb? && database_version >= "5.7.7"
111111
end
112112

113+
def supports_common_table_expressions?
114+
if mariadb?
115+
database_version >= "10.2.1"
116+
else
117+
database_version >= "8.0.1"
118+
end
119+
end
120+
113121
def supports_advisory_locks?
114122
true
115123
end

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ 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, :with) # :nodoc:
70+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
71+
:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :with
72+
) # :nodoc:
7173
private_constant :READ_QUERY
7274

7375
def write_query?(sql) # :nodoc:

activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,10 @@ def supports_optimizer_hints?
361361
@has_pg_hint_plan
362362
end
363363

364+
def supports_common_table_expressions?
365+
true
366+
end
367+
364368
def supports_lazy_transactions?
365369
true
366370
end

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ 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, :with) # :nodoc:
7+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
8+
:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback, :with
9+
) # :nodoc:
810
private_constant :READ_QUERY
911

1012
def write_query?(sql) # :nodoc:

activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ def supports_json?
144144
true
145145
end
146146

147+
def supports_common_table_expressions?
148+
database_version >= "3.8.3"
149+
end
150+
147151
def supports_insert_on_conflict?
148152
database_version >= "3.24.0"
149153
end

activerecord/test/cases/adapter_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,20 @@ def test_doesnt_error_when_a_select_query_is_called_while_preventing_writes
223223
end
224224
end
225225

226+
if ActiveRecord::Base.connection.supports_common_table_expressions?
227+
def test_doesnt_error_when_a_read_query_with_a_cte_is_called_while_preventing_writes
228+
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
229+
230+
@connection_handler.while_preventing_writes do
231+
result = @connection.select_all(<<~SQL)
232+
WITH matching_subscribers AS (SELECT subscribers.* FROM subscribers WHERE nick = '138853948594')
233+
SELECT * FROM matching_subscribers
234+
SQL
235+
assert_equal 1, result.length
236+
end
237+
end
238+
end
239+
226240
def test_uniqueness_violations_are_translated_to_specific_exception
227241
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
228242
error = assert_raises(ActiveRecord::RecordNotUnique) do

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,6 @@ 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-
244235
def test_statement_timeout_error_codes
245236
raw_conn = @conn.raw_connection
246237
assert_raises(ActiveRecord::StatementTimeout) do

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -457,17 +457,6 @@ 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-
471460
private
472461

473462
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: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -653,17 +653,6 @@ 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-
667656
private
668657

669658
def assert_logged(logs)

0 commit comments

Comments
 (0)