Skip to content

Commit

Permalink
fixing column escape for IN nodes. [resolves:5732]
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Sep 29, 2010
1 parent c8f83d6 commit 7a625bf
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 6 deletions.
5 changes: 5 additions & 0 deletions lib/arel/visitors/dot.rb
Expand Up @@ -28,6 +28,10 @@ def accept object
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"
Expand Down Expand Up @@ -104,6 +108,7 @@ def visit_Arel_Nodes_Equality o
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
Expand Down
13 changes: 7 additions & 6 deletions lib/arel/visitors/to_sql.rb
Expand Up @@ -7,13 +7,13 @@ class ToSql
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
Expand Down Expand Up @@ -195,8 +195,9 @@ def visit_Arel_Table o

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
Expand Down Expand Up @@ -243,7 +244,7 @@ def visit_Arel_Nodes_UnqualifiedColumn o
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
Expand All @@ -257,7 +258,7 @@ def visit_Fixnum o; o end
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
Expand Down
15 changes: 15 additions & 0 deletions spec/visitors/to_sql_spec.rb
Expand Up @@ -94,6 +94,21 @@ module Visitors
"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
Expand Down

0 comments on commit 7a625bf

Please sign in to comment.