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