diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2017-02-09 23:20:13 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-09 23:20:13 -0300 |
commit | 55d66e214825b89442383f90adf575cf8c96568c (patch) | |
tree | e57b54ef0314076221077bd29f121bdaf2671b71 /activerecord | |
parent | f04a49b033e3da54a52f76289863ec87a3c30438 (diff) | |
parent | 61241833ec54fbb030da490eecc5bc69f44dc86e (diff) | |
download | rails-55d66e214825b89442383f90adf575cf8c96568c.tar.gz rails-55d66e214825b89442383f90adf575cf8c96568c.tar.bz2 rails-55d66e214825b89442383f90adf575cf8c96568c.zip |
Merge pull request #27957 from kamipo/fix_test_composite_primary_key_out_of_order
Fix `test_composite_primary_key_out_of_order`
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb | 18 | ||||
-rw-r--r-- | activerecord/test/cases/primary_keys_test.rb | 10 |
2 files changed, 18 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb index bd8aab526e..a4b1723fc7 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb @@ -426,14 +426,16 @@ module ActiveRecord def primary_keys(table_name) # :nodoc: select_values(<<-SQL.strip_heredoc, "SCHEMA") - SELECT a.attname - FROM pg_index i - CROSS JOIN unnest(i.indkey) as k - JOIN pg_attribute a - ON a.attrelid = i.indrelid - AND a.attnum = k - WHERE i.indrelid = #{quote(quote_table_name(table_name))}::regclass - AND i.indisprimary + WITH pk_constraint AS ( + SELECT conrelid, unnest(conkey) AS connum FROM pg_constraint + WHERE contype = 'p' + AND conrelid = #{quote(quote_table_name(table_name))}::regclass + ), cons AS ( + SELECT conrelid, connum, row_number() OVER() AS rownum FROM pk_constraint + ) + SELECT attr.attname FROM pg_attribute attr + INNER JOIN cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.connum + ORDER BY cons.rownum SQL end diff --git a/activerecord/test/cases/primary_keys_test.rb b/activerecord/test/cases/primary_keys_test.rb index 0c6799c015..c147b01daf 100644 --- a/activerecord/test/cases/primary_keys_test.rb +++ b/activerecord/test/cases/primary_keys_test.rb @@ -314,7 +314,7 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase def test_composite_primary_key_out_of_order skip if current_adapter?(:SQLite3Adapter) - assert_equal ["region", "code"], @connection.primary_keys("barcodes") + assert_equal ["code", "region"], @connection.primary_keys("barcodes_reverse") end def test_primary_key_issues_warning @@ -329,10 +329,16 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase assert_match(/WARNING: Active Record does not support composite primary key\./, warning) end - def test_collectly_dump_composite_primary_key + def test_dumping_composite_primary_key schema = dump_table_schema "barcodes" assert_match %r{create_table "barcodes", primary_key: \["region", "code"\]}, schema end + + def test_dumping_composite_primary_key_out_of_order + skip if current_adapter?(:SQLite3Adapter) + schema = dump_table_schema "barcodes_reverse" + assert_match %r{create_table "barcodes_reverse", primary_key: \["code", "region"\]}, schema + end end class PrimaryKeyIntegerNilDefaultTest < ActiveRecord::TestCase |