Skip to content

Commit 8f167b4

Browse files
committed
Fix postgres foreign_keys test, it became pg gem specific
- it became pg gem specific when composite keys support was added - conKey and confkey and not casted by pg gem.
1 parent 48febf3 commit 8f167b4

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

lib/arjdbc/postgresql/adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
require 'active_record/connection_adapters/postgresql/schema_statements'
1414
require 'active_record/connection_adapters/postgresql/type_metadata'
1515
require 'active_record/connection_adapters/postgresql/utils'
16+
1617
require 'arjdbc/abstract/core'
1718
require 'arjdbc/abstract/connection_management'
1819
require 'arjdbc/abstract/database_statements'
@@ -21,6 +22,8 @@
2122
require 'arjdbc/postgresql/base/array_decoder'
2223
require 'arjdbc/postgresql/base/array_encoder'
2324
require 'arjdbc/postgresql/name'
25+
require 'arjdbc/postgresql/schema_statements'
26+
2427
require 'active_model'
2528

2629
module ArJdbc
@@ -751,6 +754,7 @@ class PostgreSQLAdapter < AbstractAdapter
751754

752755
require 'arjdbc/postgresql/oid_types'
753756
include ::ArJdbc::PostgreSQL::OIDTypes
757+
include ::ArJdbc::PostgreSQL::SchemaStatements
754758

755759
include ::ArJdbc::PostgreSQL::ColumnHelpers
756760

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# frozen_string_literal: true
2+
3+
module ArJdbc
4+
module PostgreSQL
5+
module SchemaStatements
6+
ForeignKeyDefinition = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition
7+
Utils = ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
8+
9+
def foreign_keys(table_name)
10+
scope = quoted_scope(table_name)
11+
fk_info = internal_exec_query(<<~SQL, "SCHEMA", allow_retry: true, materialize_transactions: false)
12+
SELECT t2.oid::regclass::text AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete, c.convalidated AS valid, c.condeferrable AS deferrable, c.condeferred AS deferred, c.conkey, c.confkey, c.conrelid, c.confrelid
13+
FROM pg_constraint c
14+
JOIN pg_class t1 ON c.conrelid = t1.oid
15+
JOIN pg_class t2 ON c.confrelid = t2.oid
16+
JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid
17+
JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
18+
JOIN pg_namespace t3 ON c.connamespace = t3.oid
19+
WHERE c.contype = 'f'
20+
AND t1.relname = #{scope[:name]}
21+
AND t3.nspname = #{scope[:schema]}
22+
ORDER BY c.conname
23+
SQL
24+
25+
fk_info.map do |row|
26+
to_table = Utils.unquote_identifier(row["to_table"])
27+
# conkey = row["conkey"].scan(/\d+/).map(&:to_i)
28+
# confkey = row["confkey"].scan(/\d+/).map(&:to_i)
29+
conkey = row["conkey"]
30+
confkey = row["confkey"]
31+
32+
if conkey.size > 1
33+
column = column_names_from_column_numbers(row["conrelid"], conkey)
34+
primary_key = column_names_from_column_numbers(row["confrelid"], confkey)
35+
else
36+
column = Utils.unquote_identifier(row["column"])
37+
primary_key = row["primary_key"]
38+
end
39+
40+
options = {
41+
column: column,
42+
name: row["name"],
43+
primary_key: primary_key
44+
}
45+
46+
options[:on_delete] = extract_foreign_key_action(row["on_delete"])
47+
options[:on_update] = extract_foreign_key_action(row["on_update"])
48+
options[:deferrable] = extract_constraint_deferrable(row["deferrable"], row["deferred"])
49+
50+
options[:validate] = row["valid"]
51+
52+
ForeignKeyDefinition.new(table_name, to_table, options)
53+
end
54+
end
55+
end
56+
end
57+
end

test/db/postgresql/simple_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ def test_foreign_keys
344344
t.string :title
345345
t.references :db_type, :index => true, :foreign_key => true
346346
end
347+
347348
assert_equal 1, connection.foreign_keys('db_posts').size
348349
assert_equal 'db_posts', connection.foreign_keys('db_posts')[0].from_table
349350
assert_equal 'db_types', connection.foreign_keys('db_posts')[0].to_table

test/db/postgresql/table_name_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ class SerialWithTrigger < ActiveRecord::Base;
8888

8989
test 'serial with trigger' do
9090
sn = SerialWithTrigger.create! :value => 1234567890.to_s
91-
assert sn.reload
9291

92+
assert sn.reload
9393
SerialWithTrigger.columns
9494
end
9595

0 commit comments

Comments
 (0)