aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-09-27 11:32:04 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-09-27 11:32:04 -0700
commitec998ae9a6aeda09ad64bb94a50ac8b9fccd246d (patch)
treed2a14792d04c89549473173000517093ce4d7ef0
parenta25b9cbc391e7040fbbbccc932339cb57d11e531 (diff)
downloadrails-ec998ae9a6aeda09ad64bb94a50ac8b9fccd246d.tar.gz
rails-ec998ae9a6aeda09ad64bb94a50ac8b9fccd246d.tar.bz2
rails-ec998ae9a6aeda09ad64bb94a50ac8b9fccd246d.zip
using the last seen column for quoting
-rw-r--r--lib/arel/visitors/to_sql.rb5
-rw-r--r--spec/insert_manager_spec.rb5
-rw-r--r--spec/support/fake_record.rb5
-rw-r--r--spec/visitors/to_sql_spec.rb11
4 files changed, 23 insertions, 3 deletions
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index b9379da8cc..deb087b390 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -6,11 +6,13 @@ module Arel
def initialize engine
@engine = engine
@connection = nil
+ @last_column = []
@quoted_tables = {}
@quoted_columns = {}
end
def accept object
+ @last_column = []
@engine.connection_pool.with_connection do |conn|
@connection = conn
visit object
@@ -226,6 +228,7 @@ module Arel
end
def visit_Arel_Attributes_Attribute o
+ @last_column.push o.column
join_name = o.relation.table_alias || o.relation.name
"#{quote_table_name join_name}.#{quote_column_name o.name}"
end
@@ -238,7 +241,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) end
+ def visit_String o; quote(o, @last_column.pop) end
alias :visit_ActiveSupport_Multibyte_Chars :visit_String
alias :visit_BigDecimal :visit_String
diff --git a/spec/insert_manager_spec.rb b/spec/insert_manager_spec.rb
index 1cd61ae630..9d6045a913 100644
--- a/spec/insert_manager_spec.rb
+++ b/spec/insert_manager_spec.rb
@@ -37,7 +37,10 @@ module Arel
manager = Arel::InsertManager.new Table.engine
time = Time.now
- manager.insert [[table[:id], time]]
+ attribute = table[:id]
+ attribute.column.type = :date
+
+ manager.insert [[attribute, time]]
manager.to_sql.should be_like %{
INSERT INTO "users" ("id") VALUES (#{Table.engine.connection.quote time})
}
diff --git a/spec/support/fake_record.rb b/spec/support/fake_record.rb
index eb6aa2c472..2aba0c10f2 100644
--- a/spec/support/fake_record.rb
+++ b/spec/support/fake_record.rb
@@ -39,6 +39,11 @@ module FakeRecord
end
def quote thing, column = nil
+ if column && column.type == :integer
+ return 'NULL' if thing.nil?
+ return thing.to_i
+ end
+
case thing
when true
"'t'"
diff --git a/spec/visitors/to_sql_spec.rb b/spec/visitors/to_sql_spec.rb
index 25642ee947..c234a2d58e 100644
--- a/spec/visitors/to_sql_spec.rb
+++ b/spec/visitors/to_sql_spec.rb
@@ -13,6 +13,12 @@ module Arel
sql = @visitor.accept Nodes::Equality.new(false, false)
sql.should be_like %{ 'f' = 'f' }
end
+
+ it 'should use the column to quote' do
+ table = Table.new(:users)
+ sql = @visitor.accept Nodes::Equality.new(table[:id], '1-fooo')
+ sql.should be_like %{ "users"."id" = 1 }
+ end
end
it "should visit_DateTime" do
@@ -55,7 +61,9 @@ module Arel
end
it "should visit_TrueClass" do
- @visitor.accept(@attr.eq(true)).should be_like %{ "users"."id" = 't' }
+ test = @attr.eq(true)
+ test.left.column.type = :boolean
+ @visitor.accept(test).should be_like %{ "users"."id" = 't' }
end
describe "Nodes::In" do
@@ -91,6 +99,7 @@ module Arel
describe 'Equality' do
it "should escape strings" do
test = @attr.eq 'Aaron Patterson'
+ test.left.column.type = :string
@visitor.accept(test).should be_like %{
"users"."id" = 'Aaron Patterson'
}