aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2017-02-09 23:20:13 -0300
committerGitHub <noreply@github.com>2017-02-09 23:20:13 -0300
commit55d66e214825b89442383f90adf575cf8c96568c (patch)
treee57b54ef0314076221077bd29f121bdaf2671b71
parentf04a49b033e3da54a52f76289863ec87a3c30438 (diff)
parent61241833ec54fbb030da490eecc5bc69f44dc86e (diff)
downloadrails-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`
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb18
-rw-r--r--activerecord/test/cases/primary_keys_test.rb10
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