1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

fixing column escape for IN nodes. [resolves:5732]

This commit is contained in:
Aaron Patterson 2010-09-29 14:18:18 -07:00
parent c8f83d61a1
commit 7a625bf74e
3 changed files with 27 additions and 6 deletions

View file

@ -28,6 +28,10 @@ module Arel
end
private
def visit_Arel_Nodes_Grouping o
visit_edge o, "expr"
end
def visit_Arel_Nodes_TableAlias o
visit_edge o, "name"
visit_edge o, "relation"
@ -104,6 +108,7 @@ module Arel
alias :visit_Arel_Nodes_GreaterThan :visit_Arel_Nodes_Equality
alias :visit_Arel_Nodes_GreaterThanOrEqual :visit_Arel_Nodes_Equality
alias :visit_Arel_Nodes_Assignment :visit_Arel_Nodes_Equality
alias :visit_Arel_Nodes_In :visit_Arel_Nodes_Equality
def visit_String o
@node_stack.last.fields << o

View file

@ -7,13 +7,13 @@ module Arel
def initialize engine
@engine = engine
@connection = nil
@last_column = []
@last_column = nil
@quoted_tables = {}
@quoted_columns = {}
end
def accept object
@last_column = []
@last_column = nil
@engine.connection_pool.with_connection do |conn|
@connection = conn
visit object
@ -195,8 +195,9 @@ module Arel
def visit_Arel_Nodes_In o
right = o.right
right = right.empty? ? 'NULL' : right.map { |x| visit x }.join(', ')
"#{visit o.left} IN (#{right})"
"#{visit o.left} IN (#{
right.empty? ? 'NULL' : right.map { |x| visit x }.join(', ')
})"
end
def visit_Arel_Nodes_NotIn o
@ -243,7 +244,7 @@ module Arel
end
def visit_Arel_Attributes_Attribute o
@last_column.push o.column
@last_column = o.column
join_name = o.relation.table_alias || o.relation.name
"#{quote_table_name join_name}.#{quote_column_name o.name}"
end
@ -257,7 +258,7 @@ module Arel
alias :visit_Arel_Nodes_SqlLiteral :visit_Fixnum
alias :visit_Arel_SqlLiteral :visit_Fixnum # This is deprecated
def visit_String o; quote(o, @last_column.pop) end
def visit_String o; quote(o, @last_column) end
alias :visit_ActiveSupport_Multibyte_Chars :visit_String
alias :visit_BigDecimal :visit_String

View file

@ -94,6 +94,21 @@ module Arel
"users"."id" >= 1 AND "users"."id" < 3
}
end
it 'uses the same column for escaping values' do
visitor = Class.new(ToSql) do
attr_accessor :expected
def quote value, column = nil
raise unless column == expected
super
end
end
in_node = Nodes::In.new @attr, %w{ a b c }
visitor = visitor.new(Table.engine)
visitor.expected = @attr.column
lambda { visitor.accept(in_node) }.should_not raise_error
end
end
describe 'Equality' do