diff options
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 7 | ||||
-rw-r--r-- | activerecord/test/fixtures/db_definitions/postgresql.sql | 5 |
3 files changed, 9 insertions, 5 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index e64cebc782..7fe0f3ae9b 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* PostgreSQL: more robust sequence name discovery. #3087 [Rick Olson] + * Oracle: use syntax compatible with Oracle 8. #3131 [Michael Schoen] * MySQL: work around ruby-mysql/mysql-ruby inconsistency with mysql.stat. Eliminate usage of mysql.ping because it doesn't guarantee reconnect. Explicitly close and reopen the connection instead. [Jeremy Kemper] diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 8619da8c5b..8f2ba6e6c4 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -251,7 +251,7 @@ module ActiveRecord # First try looking for a sequence with a dependency on the # given table's primary key. result = execute(<<-end_sql, 'PK and serial sequence')[0] - SELECT attr.attname, (name.nspname || '.' || seq.relname) + SELECT attr.attname, name.nspname, seq.relname FROM pg_class seq, pg_attribute attr, pg_depend dep, @@ -274,7 +274,7 @@ module ActiveRecord # the 8.1+ nextval('foo'::regclass). # TODO: assumes sequence is in same schema as table. result = execute(<<-end_sql, 'PK and custom sequence')[0] - SELECT attr.attname, (name.nspname || '.' || split_part(def.adsrc, '\\\'', 2)) + SELECT attr.attname, name.nspname, split_part(def.adsrc, '\\\'', 2) FROM pg_class t JOIN pg_namespace name ON (t.relnamespace = name.oid) JOIN pg_attribute attr ON (t.oid = attrelid) @@ -285,7 +285,8 @@ module ActiveRecord AND def.adsrc ~* 'nextval' end_sql end - result + # check for existence of . in sequence name as in public.foo_sequence. if it does not exist, join the current namespace + result.last['.'] ? [result.first, result.last] : [result.first, "#{result[1]}.#{result[2]}"] rescue nil end diff --git a/activerecord/test/fixtures/db_definitions/postgresql.sql b/activerecord/test/fixtures/db_definitions/postgresql.sql index 67f3673734..cce4eec890 100644 --- a/activerecord/test/fixtures/db_definitions/postgresql.sql +++ b/activerecord/test/fixtures/db_definitions/postgresql.sql @@ -1,10 +1,11 @@ +CREATE SEQUENCE public.accounts_id_seq START 100; + CREATE TABLE accounts ( - id serial, + id integer DEFAULT nextval('public.accounts_id_seq'), firm_id integer, credit_limit integer, PRIMARY KEY (id) ); -SELECT setval('accounts_id_seq', 100); CREATE SEQUENCE companies_nonstd_seq START 101; |