def foreign_key_list(table, opts=OPTS)
out_identifier, in_identifier = identifier_convertors(opts)
schema, table = schema_or_current_and_table(table, opts)
sql_table = in_identifier.call(table)
columns_dataset = metadata_dataset.
select(:tc__table_name___table_name,
:tc__table_schema___table_schema,
:tc__is_deferrable___deferrable,
:kc__column_name___column_name,
:kc__constraint_schema___schema,
:kc__constraint_name___name,
:rc__update_rule___on_update,
:rc__delete_rule___on_delete).
from(Sequel.as(:information_schema__table_constraints, 'tc')).
join(Sequel.as(:information_schema__key_column_usage, 'kc'),
[:constraint_schema, :constraint_name]).
join(Sequel.as(:information_schema__referential_constraints, 'rc'),
[:constraint_name, :constraint_schema]).
where(:tc__table_name => sql_table,
:tc__table_schema => schema,
:tc__constraint_type => 'FOREIGN KEY')
keys_dataset = metadata_dataset.
select(:rc__constraint_schema___schema,
:rc__constraint_name___name,
:kc__table_name___key_table,
:kc__column_name___key_column).
from(Sequel.as(:information_schema__table_constraints, 'tc')).
join(Sequel.as(:information_schema__referential_constraints, 'rc'),
[:constraint_schema, :constraint_name]).
join(Sequel.as(:information_schema__key_column_usage, 'kc'),
:kc__constraint_schema => :rc__unique_constraint_schema,
:kc__constraint_name => :rc__unique_constraint_name).
where(:tc__table_name => sql_table,
:tc__table_schema => schema,
:tc__constraint_type => 'FOREIGN KEY')
foreign_keys = {}
columns_dataset.each do |row|
foreign_key = foreign_keys.fetch(row[:name]) do |key|
foreign_keys[row[:name]] = row
row[:name] = out_identifier.call(row[:name])
row[:columns] = []
row[:key] = []
row
end
foreign_key[:columns] << out_identifier.call(row[:column_name])
end
keys_dataset.each do |row|
foreign_key = foreign_keys[row[:name]]
foreign_key[:table] = out_identifier.call(row[:key_table])
foreign_key[:key] << out_identifier.call(row[:key_column])
end
foreign_keys.values
end