Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'pg'

  • Loading branch information...
commit 6b280e5b54fb406b4e0fa3626a01c8992ff8ebfb 2 parents 0ad0bdc + 03bf727
@jeremy jeremy authored
View
2  activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*Edge*
+* PostgreSQL: use 'INSERT ... RETURNING id' for 8.2 and later. [Jeremy Kemper]
+
* Added SQL escaping for :limit and :offset in MySQL [Jonathan Wiess]
View
23 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -323,6 +323,12 @@ def supports_standard_conforming_strings?
has_support
end
+ def supports_insert_with_returning?
+ @supports_insert_with_returning ||=
+ @connection.respond_to?(:server_version) &&
+ @connection.server_version >= 80200
+ end
+
# Returns the configured supported identifier length supported by PostgreSQL,
# or report the default of 63 on PostgreSQL 7.x.
def table_alias_length
@@ -415,12 +421,23 @@ def select_rows(sql, name = nil)
# Executes an INSERT query and returns the new record's ID
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
+ # Extract the table from the insert sql. Yuck.
+ table = sql.split(" ", 4)[2].gsub('"', '')
+
+ # Try an insert with 'returning id' if available (PG >= 8.2)
+ if supports_insert_with_returning?
+ pk, sequence_name = *pk_and_sequence_for(table) unless pk
+ if pk
+ id = select_value("#{sql} RETURNING #{quote_column_name(pk)}")
+ clear_query_cache
+ return id
+ end
+ end
+
+ # Otherwise, insert then grab last_insert_id.
if insert_id = super
insert_id
else
- # Extract the table from the insert sql. Yuck.
- table = sql.split(" ", 4)[2].gsub('"', '')
-
# If neither pk nor sequence name is given, look them up.
unless pk || sequence_name
pk, sequence_name = *pk_and_sequence_for(table)
Please sign in to comment.
Something went wrong with that request. Please try again.