aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb33
2 files changed, 22 insertions, 13 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 8be783c5fc..1958a7ef4e 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*1.12.1*
+* Correct PostgreSQL primary key sequence detection. #2507 [tmornini@infomania.com]
+
* Added support for using limits in eager loads that involve has_many and has_and_belongs_to_many associations
*1.12.0* (October 16th, 2005)
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index 203d390046..ec02110f6e 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -205,8 +205,8 @@ module ActiveRecord
# Set the sequence to the max value of the table's pk.
def reset_pk_sequence!(table)
- sequence, pk = sequence_and_pk_for(table)
- if sequence and pk
+ pk, sequence = pk_and_sequence_for(table)
+ if pk and sequence
select_value <<-end_sql, 'Reset sequence'
SELECT setval('#{sequence}', (SELECT COALESCE(MAX(#{pk})+(SELECT increment_by FROM #{sequence}), (SELECT min_value FROM #{sequence})) FROM #{table}), false)
end_sql
@@ -214,19 +214,26 @@ module ActiveRecord
end
# Find a table's primary key and sequence.
- def sequence_and_pk_for(table, column = nil)
+ def pk_and_sequence_for(table)
execute(<<-end_sql, 'Find pk sequence')[0]
- SELECT (name.nspname || '.' || seq.relname) AS sequence, attr.attname AS pk
- FROM pg_class seq, pg_attribute attr, pg_depend dep, pg_namespace name, pg_constraint cons
- WHERE seq.oid = dep.objid
- AND seq.relnamespace = name.oid
- AND attr.attrelid = dep.refobjid
- AND attr.attnum = dep.refobjsubid
- AND attr.attrelid = cons.conrelid
- AND attr.attnum = cons.conkey[1]
- AND cons.contype = 'p'
- AND dep.refobjid = '#{table}'::regclass
+ SELECT attr.attname, (name.nspname || '.' || seq.relname)
+ FROM pg_class seq,
+ pg_attribute attr,
+ pg_depend dep,
+ pg_namespace name,
+ pg_constraint cons
+ WHERE seq.oid = dep.objid
+ AND seq.relnamespace = name.oid
+ AND seq.relkind = 'S'
+ AND attr.attrelid = dep.refobjid
+ AND attr.attnum = dep.refobjsubid
+ AND attr.attrelid = cons.conrelid
+ AND attr.attnum = cons.conkey[1]
+ AND cons.contype = 'p'
+ AND dep.refobjid = '#{table}'::regclass
end_sql
+ rescue
+ nil
end