aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/engines/sql/relations/writes.rb20
-rw-r--r--spec/arel/engines/sql/unit/relations/update_spec.rb18
2 files changed, 30 insertions, 8 deletions
diff --git a/lib/arel/engines/sql/relations/writes.rb b/lib/arel/engines/sql/relations/writes.rb
index f7073654e9..471fceabd8 100644
--- a/lib/arel/engines/sql/relations/writes.rb
+++ b/lib/arel/engines/sql/relations/writes.rb
@@ -24,8 +24,7 @@ module Arel
build_query \
"UPDATE #{table_sql} SET",
assignment_sql,
- ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
- ("LIMIT #{taken}" unless taken.blank? )
+ build_update_conditions_sql
end
protected
@@ -39,5 +38,22 @@ module Arel
assignments.value
end
end
+
+ def build_update_conditions_sql
+ conditions = ""
+ conditions << " WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank?
+ conditions << " ORDER BY #{order_clauses.join(', ')}" unless orders.blank?
+
+ unless taken.blank?
+ conditions << " LIMIT #{taken}"
+
+ if engine.adapter_name != "MySQL"
+ quote_primary_key = engine.quote_column_name(table.name.classify.constantize.primary_key)
+ conditions = "WHERE #{quote_primary_key} IN (SELECT #{quote_primary_key} FROM #{engine.connection.quote_table_name table.name} #{conditions})"
+ end
+ end
+
+ conditions
+ end
end
end
diff --git a/spec/arel/engines/sql/unit/relations/update_spec.rb b/spec/arel/engines/sql/unit/relations/update_spec.rb
index 4d728eb241..4b1d824ce5 100644
--- a/spec/arel/engines/sql/unit/relations/update_spec.rb
+++ b/spec/arel/engines/sql/unit/relations/update_spec.rb
@@ -1,5 +1,11 @@
require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
+class User
+ def self.primary_key
+ "id"
+ end
+end
+
module Arel
describe Update do
before do
@@ -45,17 +51,17 @@ module Arel
adapter_is :sqlite3 do
sql.should be_like(%Q{
- UPDATE "users"
- SET "name" = 'nick'
- LIMIT 1
+ UPDATE "users" SET
+ "name" = 'nick'
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
})
end
adapter_is :postgresql do
sql.should be_like(%Q{
- UPDATE "users"
- SET "name" = E'nick'
- LIMIT 1
+ UPDATE "users" SET
+ "name" = E'nick'
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
})
end
end