aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2017-02-14 05:47:32 -0500
committerGitHub <noreply@github.com>2017-02-14 05:47:32 -0500
commitb9661c786a6dd5322659af35944731e82118baa7 (patch)
tree214c1e22cc344b8d93437877c890b6afd7fd1d8e /activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
parent437020aa6dd4bae19706628daab6725fcb786a45 (diff)
parentb8e3af79ed0c2121c11bbb675dbf47126e95e0a0 (diff)
downloadrails-b9661c786a6dd5322659af35944731e82118baa7.tar.gz
rails-b9661c786a6dd5322659af35944731e82118baa7.tar.bz2
rails-b9661c786a6dd5322659af35944731e82118baa7.zip
Merge pull request #27961 from jordanlewis/simplify-postgres-primary-keys-v2
Simplify and optimize Postgres query for primary_keys()
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb20
1 files changed, 10 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 eebc688686..863a0dd997 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
@@ -430,17 +430,17 @@ module ActiveRecord
end
def primary_keys(table_name) # :nodoc:
+ name = Utils.extract_schema_qualified_name(table_name.to_s)
select_values(<<-SQL.strip_heredoc, "SCHEMA")
- 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
+ SELECT column_name
+ FROM information_schema.key_column_usage kcu
+ JOIN information_schema.table_constraints tc
+ ON kcu.table_name = tc.table_name
+ AND kcu.table_schema = tc.table_schema
+ AND kcu.constraint_name = tc.constraint_name
+ WHERE constraint_type = 'PRIMARY KEY'
+ AND kcu.table_name = #{quote(name.identifier)}
+ AND kcu.table_schema = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
SQL
end