From dbd2fc8907e7fa4756ea26c5c52334cd4baefd2b Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Sun, 19 Mar 2017 19:10:07 +0900 Subject: Fix `primary_keys` across multiple schemas Fixes #28470. --- .../connection_adapters/postgresql/schema_statements.rb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'activerecord/lib') 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 a332375b78..2927a76385 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb @@ -362,16 +362,14 @@ module ActiveRecord end def primary_keys(table_name) # :nodoc: - scope = quoted_scope(table_name) select_values(<<-SQL.strip_heredoc, "SCHEMA") - SELECT column_name - FROM information_schema.key_column_usage kcu - JOIN information_schema.table_constraints tc - USING (table_schema, table_name, constraint_name) - WHERE constraint_type = 'PRIMARY KEY' - AND kcu.table_name = #{scope[:name]} - AND kcu.table_schema = #{scope[:schema]} - ORDER BY kcu.ordinal_position + SELECT a.attname FROM pg_index i + CROSS JOIN generate_subscripts(i.indkey, 1) k + JOIN pg_attribute a + ON a.attrelid = i.indrelid + AND a.attnum = i.indkey[k] + WHERE i.indrelid = #{quote(quote_table_name(table_name))}::regclass + AND i.indisprimary SQL end -- cgit v1.2.3