Skip to content

Commit 2182419

Browse files
committed
Allow IN with subselect to be preparable
1 parent 84c4598 commit 2182419

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

activerecord/lib/arel/visitors/to_sql.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,10 +586,11 @@ def visit_Arel_Table(o, collector)
586586
end
587587

588588
def visit_Arel_Nodes_In(o, collector)
589-
collector.preparable = false
590589
attr, values = o.left, o.right
591590

592591
if Array === values
592+
collector.preparable = false
593+
593594
unless values.empty?
594595
values.delete_if { |value| unboundable?(value) }
595596
end
@@ -602,10 +603,11 @@ def visit_Arel_Nodes_In(o, collector)
602603
end
603604

604605
def visit_Arel_Nodes_NotIn(o, collector)
605-
collector.preparable = false
606606
attr, values = o.left, o.right
607607

608608
if Array === values
609+
collector.preparable = false
610+
609611
unless values.empty?
610612
values.delete_if { |value| unboundable?(value) }
611613
end

activerecord/test/cases/arel/visitors/to_sql_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,24 @@ def dispatch
520520
"users"."id" IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron')
521521
}
522522
end
523+
524+
it "is not preparable when an array" do
525+
node = @attr.in [1, 2, 3]
526+
527+
collector = Collectors::SQLString.new.tap { |c| c.preparable = true }
528+
@visitor.accept(node, collector)
529+
_(collector.preparable).must_equal false
530+
end
531+
532+
it "is preparable when a subselect" do
533+
table = Table.new(:users)
534+
subquery = table.project(table[:id]).where(table[:name].eq("Aaron"))
535+
node = @attr.in subquery
536+
537+
collector = Collectors::SQLString.new.tap { |c| c.preparable = true }
538+
@visitor.accept(node, collector)
539+
_(collector.preparable).must_equal true
540+
end
523541
end
524542

525543
describe "Nodes::InfixOperation" do
@@ -682,6 +700,24 @@ def dispatch
682700
"users"."id" NOT IN (SELECT id FROM "users" WHERE "users"."name" = 'Aaron')
683701
}
684702
end
703+
704+
it "is not preparable when an array" do
705+
node = @attr.not_in [1, 2, 3]
706+
707+
collector = Collectors::SQLString.new.tap { |c| c.preparable = true }
708+
@visitor.accept(node, collector)
709+
_(collector.preparable).must_equal false
710+
end
711+
712+
it "is preparable when a subselect" do
713+
table = Table.new(:users)
714+
subquery = table.project(table[:id]).where(table[:name].eq("Aaron"))
715+
node = @attr.not_in subquery
716+
717+
collector = Collectors::SQLString.new.tap { |c| c.preparable = true }
718+
@visitor.accept(node, collector)
719+
_(collector.preparable).must_equal true
720+
end
685721
end
686722

687723
describe "Constants" do

0 commit comments

Comments
 (0)