From 283250fc3050e55661b709f2e93fb20c0aff99b2 Mon Sep 17 00:00:00 2001
From: Ryuta Kamizono <kamipo@gmail.com>
Date: Fri, 10 Feb 2017 10:36:36 +0900
Subject: Fix `test_composite_primary_key_out_of_order`

`test_composite_primary_key_out_of_order` should use `barcodes_reverse`
table.
---
 activerecord/test/cases/primary_keys_test.rb | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

(limited to 'activerecord')

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
-- 
cgit v1.2.3


From 61241833ec54fbb030da490eecc5bc69f44dc86e Mon Sep 17 00:00:00 2001
From: Ryuta Kamizono <kamipo@gmail.com>
Date: Fri, 10 Feb 2017 10:52:25 +0900
Subject: Revert "Simplify and speed up Postgres query for primary_keys"

This reverts commit d6529af2954a67bd57fda45286fa9cfd0ff6b5ac.
---
 .../postgresql/schema_statements.rb                    | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

(limited to 'activerecord')

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
 
-- 
cgit v1.2.3