aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
diff options
context:
space:
mode:
authorArthur Neves <arthurnn@gmail.com>2014-12-30 12:36:37 -0500
committerArthur Neves <arthurnn@gmail.com>2014-12-30 12:36:37 -0500
commit5acd24bbeae0e9e5e81e87b5929e17f35527b2ea (patch)
tree2c9612fb542c1a96f94f39cdd7362e27ab6cbdb4 /activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
parent20ea1a2adf85ef33496fda879e565f7ee72456e9 (diff)
downloadrails-5acd24bbeae0e9e5e81e87b5929e17f35527b2ea.tar.gz
rails-5acd24bbeae0e9e5e81e87b5929e17f35527b2ea.tar.bz2
rails-5acd24bbeae0e9e5e81e87b5929e17f35527b2ea.zip
Ensures that primary_key method will return nil when multi-pk
When table has a composite primary key, the `primary_key` method for sqlite3 and postgresql was only returning the first field of the key. Ensures that it will return nil instead, as AR dont support composite pks.
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.rb8
1 files changed, 4 insertions, 4 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 74b0833a7e..b2a7b40ded 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
@@ -385,15 +385,15 @@ module ActiveRecord
# Returns just a table's primary key
def primary_key(table)
- row = exec_query(<<-end_sql, 'SCHEMA').rows.first
+ pks = exec_query(<<-end_sql, 'SCHEMA').rows
SELECT attr.attname
FROM pg_attribute attr
- INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[1]
+ INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey)
WHERE cons.contype = 'p'
AND cons.conrelid = '#{quote_table_name(table)}'::regclass
end_sql
-
- row && row.first
+ return nil unless pks.count == 1
+ pks[0][0]
end
# Renames a table.