diff options
-rw-r--r-- | arel.gemspec | 2 | ||||
-rw-r--r-- | lib/arel/collectors/plain_string.rb | 2 | ||||
-rw-r--r-- | lib/arel/nodes/bind_param.rb | 10 | ||||
-rw-r--r-- | lib/arel/visitors/bind_visitor.rb | 40 | ||||
-rw-r--r-- | test/collectors/test_sql_string.rb | 2 | ||||
-rw-r--r-- | test/collectors/test_substitute_bind_collector.rb (renamed from test/collectors/test_bind_collector.rb) | 10 | ||||
-rw-r--r-- | test/nodes/test_bind_param.rb | 11 | ||||
-rw-r--r-- | test/test_update_manager.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_bind_visitor.rb | 61 | ||||
-rw-r--r-- | test/visitors/test_dot.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_oracle.rb | 8 | ||||
-rw-r--r-- | test/visitors/test_oracle12.rb | 4 | ||||
-rw-r--r-- | test/visitors/test_postgres.rb | 4 | ||||
-rw-r--r-- | test/visitors/test_to_sql.rb | 4 |
14 files changed, 37 insertions, 125 deletions
diff --git a/arel.gemspec b/arel.gemspec index a1bc944f70..d953512bf3 100644 --- a/arel.gemspec +++ b/arel.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| s.rdoc_options = ["--main", "README.md"] s.extra_rdoc_files = ["History.txt", "MIT-LICENSE.txt", "README.md"] - s.files = ["History.txt","MIT-LICENSE.txt","README.md","lib/arel.rb","lib/arel/alias_predication.rb","lib/arel/attributes.rb","lib/arel/attributes/attribute.rb","lib/arel/collectors/substitute_binds.rb","lib/arel/collectors/plain_string.rb","lib/arel/collectors/sql_string.rb","lib/arel/compatibility/wheres.rb","lib/arel/crud.rb","lib/arel/delete_manager.rb","lib/arel/errors.rb","lib/arel/expressions.rb","lib/arel/factory_methods.rb","lib/arel/insert_manager.rb","lib/arel/math.rb","lib/arel/nodes.rb","lib/arel/nodes/and.rb","lib/arel/nodes/ascending.rb","lib/arel/nodes/binary.rb","lib/arel/nodes/bind_param.rb","lib/arel/nodes/case.rb","lib/arel/nodes/casted.rb","lib/arel/nodes/count.rb","lib/arel/nodes/delete_statement.rb","lib/arel/nodes/descending.rb","lib/arel/nodes/equality.rb","lib/arel/nodes/extract.rb","lib/arel/nodes/false.rb","lib/arel/nodes/full_outer_join.rb","lib/arel/nodes/function.rb","lib/arel/nodes/grouping.rb","lib/arel/nodes/in.rb","lib/arel/nodes/infix_operation.rb","lib/arel/nodes/inner_join.rb","lib/arel/nodes/insert_statement.rb","lib/arel/nodes/join_source.rb","lib/arel/nodes/matches.rb","lib/arel/nodes/named_function.rb","lib/arel/nodes/node.rb","lib/arel/nodes/outer_join.rb","lib/arel/nodes/over.rb","lib/arel/nodes/regexp.rb","lib/arel/nodes/right_outer_join.rb","lib/arel/nodes/select_core.rb","lib/arel/nodes/select_statement.rb","lib/arel/nodes/sql_literal.rb","lib/arel/nodes/string_join.rb","lib/arel/nodes/table_alias.rb","lib/arel/nodes/terminal.rb","lib/arel/nodes/true.rb","lib/arel/nodes/unary.rb","lib/arel/nodes/unary_operation.rb","lib/arel/nodes/unqualified_column.rb","lib/arel/nodes/update_statement.rb","lib/arel/nodes/values.rb","lib/arel/nodes/window.rb","lib/arel/nodes/with.rb","lib/arel/order_predications.rb","lib/arel/predications.rb","lib/arel/select_manager.rb","lib/arel/table.rb","lib/arel/tree_manager.rb","lib/arel/update_manager.rb","lib/arel/visitors.rb","lib/arel/visitors/bind_visitor.rb","lib/arel/visitors/depth_first.rb","lib/arel/visitors/dot.rb","lib/arel/visitors/ibm_db.rb","lib/arel/visitors/informix.rb","lib/arel/visitors/mssql.rb","lib/arel/visitors/mysql.rb","lib/arel/visitors/oracle.rb","lib/arel/visitors/oracle12.rb","lib/arel/visitors/postgresql.rb","lib/arel/visitors/reduce.rb","lib/arel/visitors/sqlite.rb","lib/arel/visitors/to_sql.rb","lib/arel/visitors/visitor.rb","lib/arel/visitors/where_sql.rb","lib/arel/window_predications.rb"] + s.files = ["History.txt","MIT-LICENSE.txt","README.md","lib/arel.rb","lib/arel/alias_predication.rb","lib/arel/attributes.rb","lib/arel/attributes/attribute.rb","lib/arel/collectors/substitute_binds.rb","lib/arel/collectors/plain_string.rb","lib/arel/collectors/sql_string.rb","lib/arel/compatibility/wheres.rb","lib/arel/crud.rb","lib/arel/delete_manager.rb","lib/arel/errors.rb","lib/arel/expressions.rb","lib/arel/factory_methods.rb","lib/arel/insert_manager.rb","lib/arel/math.rb","lib/arel/nodes.rb","lib/arel/nodes/and.rb","lib/arel/nodes/ascending.rb","lib/arel/nodes/binary.rb","lib/arel/nodes/bind_param.rb","lib/arel/nodes/case.rb","lib/arel/nodes/casted.rb","lib/arel/nodes/count.rb","lib/arel/nodes/delete_statement.rb","lib/arel/nodes/descending.rb","lib/arel/nodes/equality.rb","lib/arel/nodes/extract.rb","lib/arel/nodes/false.rb","lib/arel/nodes/full_outer_join.rb","lib/arel/nodes/function.rb","lib/arel/nodes/grouping.rb","lib/arel/nodes/in.rb","lib/arel/nodes/infix_operation.rb","lib/arel/nodes/inner_join.rb","lib/arel/nodes/insert_statement.rb","lib/arel/nodes/join_source.rb","lib/arel/nodes/matches.rb","lib/arel/nodes/named_function.rb","lib/arel/nodes/node.rb","lib/arel/nodes/outer_join.rb","lib/arel/nodes/over.rb","lib/arel/nodes/regexp.rb","lib/arel/nodes/right_outer_join.rb","lib/arel/nodes/select_core.rb","lib/arel/nodes/select_statement.rb","lib/arel/nodes/sql_literal.rb","lib/arel/nodes/string_join.rb","lib/arel/nodes/table_alias.rb","lib/arel/nodes/terminal.rb","lib/arel/nodes/true.rb","lib/arel/nodes/unary.rb","lib/arel/nodes/unary_operation.rb","lib/arel/nodes/unqualified_column.rb","lib/arel/nodes/update_statement.rb","lib/arel/nodes/values.rb","lib/arel/nodes/window.rb","lib/arel/nodes/with.rb","lib/arel/order_predications.rb","lib/arel/predications.rb","lib/arel/select_manager.rb","lib/arel/table.rb","lib/arel/tree_manager.rb","lib/arel/update_manager.rb","lib/arel/visitors.rb","lib/arel/visitors/depth_first.rb","lib/arel/visitors/dot.rb","lib/arel/visitors/ibm_db.rb","lib/arel/visitors/informix.rb","lib/arel/visitors/mssql.rb","lib/arel/visitors/mysql.rb","lib/arel/visitors/oracle.rb","lib/arel/visitors/oracle12.rb","lib/arel/visitors/postgresql.rb","lib/arel/visitors/reduce.rb","lib/arel/visitors/sqlite.rb","lib/arel/visitors/to_sql.rb","lib/arel/visitors/visitor.rb","lib/arel/visitors/where_sql.rb","lib/arel/window_predications.rb"] s.require_paths = ["lib"] s.add_development_dependency('minitest', '~> 5.4') diff --git a/lib/arel/collectors/plain_string.rb b/lib/arel/collectors/plain_string.rb index 1e8d2a2152..4c8c15cc9c 100644 --- a/lib/arel/collectors/plain_string.rb +++ b/lib/arel/collectors/plain_string.rb @@ -3,7 +3,7 @@ module Arel module Collectors class PlainString def initialize - @str = ''.dup + @str = String.new end def value diff --git a/lib/arel/nodes/bind_param.rb b/lib/arel/nodes/bind_param.rb index 9e297831cd..d55f4c1c8e 100644 --- a/lib/arel/nodes/bind_param.rb +++ b/lib/arel/nodes/bind_param.rb @@ -2,8 +2,16 @@ module Arel module Nodes class BindParam < Node + attr_reader :value + + def initialize(value) + @value = value + super() + end + def ==(other) - other.is_a?(BindParam) + other.is_a?(BindParam) && + value == other.value end end end diff --git a/lib/arel/visitors/bind_visitor.rb b/lib/arel/visitors/bind_visitor.rb deleted file mode 100644 index 8a5570cf5c..0000000000 --- a/lib/arel/visitors/bind_visitor.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true -module Arel - module Visitors - module BindVisitor - def initialize target - @block = nil - super - end - - def accept node, collector, &block - @block = block if block_given? - super - end - - private - - def visit_Arel_Nodes_Assignment o, collector - if o.right.is_a? Arel::Nodes::BindParam - collector = visit o.left, collector - collector << " = " - visit o.right, collector - else - super - end - end - - def visit_Arel_Nodes_BindParam o, collector - if @block - val = @block.call - if String === val - collector << val - end - else - super - end - end - - end - end -end diff --git a/test/collectors/test_sql_string.rb b/test/collectors/test_sql_string.rb index 769c2e6d53..8651296ff8 100644 --- a/test/collectors/test_sql_string.rb +++ b/test/collectors/test_sql_string.rb @@ -27,7 +27,7 @@ module Arel end def test_compile - bv = Nodes::BindParam.new + bv = Nodes::BindParam.new(nil) collector = collect ast_with_binds bv sql = collector.compile ["hello", "world"] diff --git a/test/collectors/test_bind_collector.rb b/test/collectors/test_substitute_bind_collector.rb index fef157782b..adcaf98319 100644 --- a/test/collectors/test_bind_collector.rb +++ b/test/collectors/test_substitute_bind_collector.rb @@ -4,7 +4,7 @@ require 'arel/collectors/substitute_binds' module Arel module Collectors - class TestBindCollector < Arel::Test + class TestSubstituteBindCollector < Arel::Test def setup @conn = FakeRecord::Base.new @visitor = Visitors::ToSql.new @conn.connection @@ -28,14 +28,14 @@ module Arel end def test_leaves_binds - node = Nodes::BindParam.new + node = Nodes::BindParam.new(nil) list = compile node assert_equal node, list.first assert_equal node.class, list.first.class end def test_adds_strings - bv = Nodes::BindParam.new + bv = Nodes::BindParam.new(nil) list = compile ast_with_binds bv assert_operator list.length, :>, 0 assert_equal bv, list.grep(Nodes::BindParam).first @@ -43,7 +43,7 @@ module Arel end def test_substitute_binds - bv = Nodes::BindParam.new + bv = Nodes::BindParam.new(nil) collector = collect ast_with_binds bv values = collector.value @@ -60,7 +60,7 @@ module Arel end def test_compile - bv = Nodes::BindParam.new + bv = Nodes::BindParam.new(nil) collector = collect ast_with_binds bv sql = collector.compile ["hello", "world"] diff --git a/test/nodes/test_bind_param.rb b/test/nodes/test_bind_param.rb index 011de6410c..482bb24f33 100644 --- a/test/nodes/test_bind_param.rb +++ b/test/nodes/test_bind_param.rb @@ -4,12 +4,17 @@ require 'helper' module Arel module Nodes describe 'BindParam' do - it 'is equal to other bind params' do - BindParam.new.must_equal(BindParam.new) + it 'is equal to other bind params with the same value' do + BindParam.new(1).must_equal(BindParam.new(1)) + BindParam.new("foo").must_equal(BindParam.new("foo")) end it 'is not equal to other nodes' do - BindParam.new.wont_equal(Node.new) + BindParam.new(nil).wont_equal(Node.new) + end + + it 'is not equal to bind params with different values' do + BindParam.new(1).wont_equal(BindParam.new(2)) end end end diff --git a/test/test_update_manager.rb b/test/test_update_manager.rb index 85abbf3875..187ded12f6 100644 --- a/test/test_update_manager.rb +++ b/test/test_update_manager.rb @@ -13,7 +13,7 @@ module Arel table = Table.new(:users) um = Arel::UpdateManager.new um.table table - um.set [[table[:name], Arel::Nodes::BindParam.new]] + um.set [[table[:name], Arel::Nodes::BindParam.new(nil)]] um.to_sql.must_be_like %{ UPDATE "users" SET "name" = ? } end diff --git a/test/visitors/test_bind_visitor.rb b/test/visitors/test_bind_visitor.rb deleted file mode 100644 index 3e0578a6a1..0000000000 --- a/test/visitors/test_bind_visitor.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true -require 'helper' -require 'arel/visitors/bind_visitor' -require 'support/fake_record' - -module Arel - module Visitors - class TestBindVisitor < Arel::Test - attr_reader :collector - - def setup - @collector = Collectors::SQLString.new - super - end - - ## - # Tests visit_Arel_Nodes_Assignment correctly - # substitutes binds with values from block - def test_assignment_binds_are_substituted - table = Table.new(:users) - um = Arel::UpdateManager.new - bp = Nodes::BindParam.new - um.set [[table[:name], bp]] - visitor = Class.new(Arel::Visitors::ToSql) { - include Arel::Visitors::BindVisitor - }.new Table.engine.connection - - assignment = um.ast.values[0] - actual = visitor.accept(assignment, collector) { - "replace" - } - assert actual - value = actual.value - assert_like "\"name\" = replace", value - end - - def test_visitor_yields_on_binds - visitor = Class.new(Arel::Visitors::ToSql) { - include Arel::Visitors::BindVisitor - }.new nil - - bp = Nodes::BindParam.new - called = false - visitor.accept(bp, collector) { called = true } - assert called - end - - def test_visitor_only_yields_on_binds - visitor = Class.new(Arel::Visitors::ToSql) { - include Arel::Visitors::BindVisitor - }.new(nil) - - bp = Arel.sql 'omg' - called = false - - visitor.accept(bp, collector) { called = true } - refute called - end - end - end -end diff --git a/test/visitors/test_dot.rb b/test/visitors/test_dot.rb index 1d27d1a5cb..8067ff5b49 100644 --- a/test/visitors/test_dot.rb +++ b/test/visitors/test_dot.rb @@ -74,7 +74,7 @@ module Arel end def test_Arel_Nodes_BindParam - node = Arel::Nodes::BindParam.new + node = Arel::Nodes::BindParam.new(nil) collector = Collectors::PlainString.new assert_match '[label="<f0>Arel::Nodes::BindParam"]', @visitor.accept(node, collector).value end diff --git a/test/visitors/test_oracle.rb b/test/visitors/test_oracle.rb index b1921f0cbc..cdadec8b15 100644 --- a/test/visitors/test_oracle.rb +++ b/test/visitors/test_oracle.rb @@ -127,8 +127,8 @@ module Arel it 'creates a subquery when there is limit and offset with BindParams' do stmt = Nodes::SelectStatement.new - stmt.limit = Nodes::Limit.new(Nodes::BindParam.new) - stmt.offset = Nodes::Offset.new(Nodes::BindParam.new) + stmt.limit = Nodes::Limit.new(Nodes::BindParam.new(nil)) + stmt.offset = Nodes::Offset.new(Nodes::BindParam.new(nil)) sql = compile stmt sql.must_be_like %{ SELECT * FROM ( @@ -184,8 +184,8 @@ module Arel describe "Nodes::BindParam" do it "increments each bind param" do - query = @table[:name].eq(Arel::Nodes::BindParam.new) - .and(@table[:id].eq(Arel::Nodes::BindParam.new)) + query = @table[:name].eq(Arel::Nodes::BindParam.new(nil)) + .and(@table[:id].eq(Arel::Nodes::BindParam.new(nil))) compile(query).must_be_like %{ "users"."name" = :a1 AND "users"."id" = :a2 } diff --git a/test/visitors/test_oracle12.rb b/test/visitors/test_oracle12.rb index c908a51d4f..a6bbfe3077 100644 --- a/test/visitors/test_oracle12.rb +++ b/test/visitors/test_oracle12.rb @@ -48,8 +48,8 @@ module Arel describe "Nodes::BindParam" do it "increments each bind param" do - query = @table[:name].eq(Arel::Nodes::BindParam.new) - .and(@table[:id].eq(Arel::Nodes::BindParam.new)) + query = @table[:name].eq(Arel::Nodes::BindParam.new(nil)) + .and(@table[:id].eq(Arel::Nodes::BindParam.new(nil))) compile(query).must_be_like %{ "users"."name" = :a1 AND "users"."id" = :a2 } diff --git a/test/visitors/test_postgres.rb b/test/visitors/test_postgres.rb index 26cc721871..3b4fdc0427 100644 --- a/test/visitors/test_postgres.rb +++ b/test/visitors/test_postgres.rb @@ -176,8 +176,8 @@ module Arel describe "Nodes::BindParam" do it "increments each bind param" do - query = @table[:name].eq(Arel::Nodes::BindParam.new) - .and(@table[:id].eq(Arel::Nodes::BindParam.new)) + query = @table[:name].eq(Arel::Nodes::BindParam.new(nil)) + .and(@table[:id].eq(Arel::Nodes::BindParam.new(nil))) compile(query).must_be_like %{ "users"."name" = $1 AND "users"."id" = $2 } diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb index 31279b0ae2..445d9c476c 100644 --- a/test/visitors/test_to_sql.rb +++ b/test/visitors/test_to_sql.rb @@ -17,13 +17,13 @@ module Arel end it 'works with BindParams' do - node = Nodes::BindParam.new + node = Nodes::BindParam.new(nil) sql = compile node sql.must_be_like '?' end it 'does not quote BindParams used as part of a Values' do - bp = Nodes::BindParam.new + bp = Nodes::BindParam.new(nil) values = Nodes::Values.new([bp]) sql = compile values sql.must_be_like 'VALUES (?)' |