aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-08-13 18:55:15 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-08-13 18:55:15 -0700
commit74a27a0d83ecd7ed4975851ea92ee517a1581faf (patch)
treeb120548f12566bd6a9c32a142c6191ae17eadf38
parent9fc70e22f9bf7df8485b90b3d7e4a5c58cb0ebbb (diff)
downloadrails-74a27a0d83ecd7ed4975851ea92ee517a1581faf.tar.gz
rails-74a27a0d83ecd7ed4975851ea92ee517a1581faf.tar.bz2
rails-74a27a0d83ecd7ed4975851ea92ee517a1581faf.zip
inserts have the correct syntax
-rw-r--r--lib/arel/select_manager.rb2
-rw-r--r--lib/arel/visitors/to_sql.rb18
-rw-r--r--spec/arel/insert_manager_spec.rb28
-rw-r--r--spec/arel/visitors/to_sql_spec.rb17
4 files changed, 56 insertions, 9 deletions
diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb
index 1728311d59..444ca8f716 100644
--- a/lib/arel/select_manager.rb
+++ b/lib/arel/select_manager.rb
@@ -30,7 +30,7 @@ module Arel
def insert values
im = InsertManager.new @engine
im.insert values
- raise
+ @engine.connection.execute im.to_sql
end
end
end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 74b7dd9385..d47c621f6a 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -15,8 +15,15 @@ module Arel
def visit_Arel_Nodes_InsertStatement o
[
"INSERT INTO #{visit o.relation}",
- ("(#{o.columns.map { |x| visit x }.join ', '})" unless o.columns.empty?),
- ("VALUES (#{o.values.map { |x| quote visit x }.join ', '})" unless o.values.empty?),
+
+ ("(#{o.columns.map { |x|
+ quote_column_name x.name
+ }.join ', '})" unless o.columns.empty?),
+
+ ("VALUES (#{o.values.map { |value|
+ value ? quote(visit(value)) : 'NULL'
+ }.join ', '})" unless o.values.empty?),
+
].compact.join ' '
end
@@ -43,12 +50,15 @@ module Arel
"#{visit o.left} = #{visit o.right}"
end
- def visit_Arel_Attributes_Integer o
+ def visit_Arel_Attributes_Attribute o
"#{quote_table_name o.relation.name}.#{quote_column_name o.name}"
end
- alias :visit_Arel_Attributes_String :visit_Arel_Attributes_Integer
+ alias :visit_Arel_Attributes_Integer :visit_Arel_Attributes_Attribute
+ alias :visit_Arel_Attributes_String :visit_Arel_Attributes_Attribute
+ alias :visit_Arel_Attributes_Time :visit_Arel_Attributes_Attribute
def visit_Fixnum o; o end
+ alias :visit_Time :visit_Fixnum
alias :visit_String :visit_Fixnum
alias :visit_Arel_Nodes_SqlLiteral :visit_Fixnum
alias :visit_Arel_SqlLiteral :visit_Fixnum # This is deprecated
diff --git a/spec/arel/insert_manager_spec.rb b/spec/arel/insert_manager_spec.rb
index 073c9c30cb..14cb749b25 100644
--- a/spec/arel/insert_manager_spec.rb
+++ b/spec/arel/insert_manager_spec.rb
@@ -9,13 +9,33 @@ module Arel
end
describe 'insert' do
+ it "inserts null" do
+ table = Table.new(:users)
+ manager = Arel::InsertManager.new Table.engine
+ manager.insert [[table[:id], nil]]
+ manager.to_sql.should be_like %{
+ INSERT INTO "users" ("id") VALUES (NULL)
+ }
+ end
+
+ it "inserts time" do
+ table = Table.new(:users)
+ manager = Arel::InsertManager.new Table.engine
+
+ time = Time.now
+ manager.insert [[table[:id], time]]
+ manager.to_sql.should be_like %{
+ INSERT INTO "users" ("id") VALUES (#{Table.engine.connection.quote time})
+ }
+ end
+
it 'takes a list of lists' do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager.into table
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.should be_like %{
- INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron')
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
}
end
@@ -24,7 +44,7 @@ module Arel
manager = Arel::InsertManager.new Table.engine
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.should be_like %{
- INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron')
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
}
end
@@ -57,7 +77,7 @@ module Arel
manager.into table
manager.columns << table[:id]
manager.to_sql.should be_like %{
- INSERT INTO "users" ("users"."id")
+ INSERT INTO "users" ("id")
}
end
end
@@ -86,7 +106,7 @@ module Arel
manager.columns << table[:id]
manager.columns << table[:name]
manager.to_sql.should be_like %{
- INSERT INTO "users" ("users"."id", "users"."name") VALUES (1, 'aaron')
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
}
end
end
diff --git a/spec/arel/visitors/to_sql_spec.rb b/spec/arel/visitors/to_sql_spec.rb
new file mode 100644
index 0000000000..7600d53862
--- /dev/null
+++ b/spec/arel/visitors/to_sql_spec.rb
@@ -0,0 +1,17 @@
+require 'spec_helper'
+
+module Arel
+ module Visitors
+ describe 'the to_sql visitor' do
+ before do
+ @visitor = ToSql.new Table.engine
+ @attr = Table.new(:users)[:id]
+ end
+
+ it "should visit visit_Arel_Attributes_Time" do
+ attr = Attributes::Time.new(@attr.relation, @attr.name, @attr.column)
+ @visitor.accept attr
+ end
+ end
+ end
+end