50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/active_record/connection_adapters/firebird/schema_statements.rb', line 50
def foreign_keys(table_name)
result = query(" WITH FK_FIELDS AS (\n SELECT\n AA2.RDB$RELATION_NAME,\n AA2.RDB$CONSTRAINT_NAME,\n BB2.RDB$CONST_NAME_UQ AS LINK_UK_OR_PK,\n EE2.RDB$RELATION_NAME AS REFERENCE_TABLE,\n CC2.RDB$FIELD_NAME,\n AA2.RDB$CONSTRAINT_TYPE\n FROM\n RDB$RELATION_CONSTRAINTS AA2\n LEFT JOIN RDB$REF_CONSTRAINTS BB2 ON BB2.RDB$CONSTRAINT_NAME = AA2.RDB$CONSTRAINT_NAME\n LEFT JOIN RDB$INDEX_SEGMENTS CC2 ON CC2.RDB$INDEX_NAME = AA2.RDB$INDEX_NAME\n LEFT JOIN RDB$RELATION_FIELDS DD2 ON DD2.RDB$FIELD_NAME = CC2.RDB$FIELD_NAME AND DD2.RDB$RELATION_NAME = AA2.RDB$RELATION_NAME\n LEFT JOIN RDB$RELATION_CONSTRAINTS EE2 ON EE2.RDB$CONSTRAINT_NAME = BB2.RDB$CONST_NAME_UQ\n )\n SELECT\n AA.RDB$CONSTRAINT_NAME,\n BB.REFERENCE_TABLE,\n BB.FIELDS,\n BB.REFERENCE_FIELDS\n FROM\n RDB$RELATION_CONSTRAINTS AA\n LEFT JOIN (\n SELECT\n AA1.RDB$RELATION_NAME,\n AA1.RDB$CONSTRAINT_NAME,\n AA1.LINK_UK_OR_PK,\n AA1.REFERENCE_TABLE,\n (\n SELECT LIST(TRIM(AA3.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA3 WHERE AA3.RDB$CONSTRAINT_NAME = AA1.RDB$CONSTRAINT_NAME ROWS 1\n ) AS FIELDS,\n (\n SELECT LIST(TRIM(AA4.RDB$FIELD_NAME), ', ') FROM FK_FIELDS AA4 WHERE AA4.RDB$CONSTRAINT_NAME = AA1.LINK_UK_OR_PK ROWS 1\n ) AS REFERENCE_FIELDS\n FROM\n FK_FIELDS AA1\n GROUP BY\n AA1.RDB$RELATION_NAME,\n AA1.RDB$CONSTRAINT_NAME,\n AA1.REFERENCE_TABLE,\n AA1.LINK_UK_OR_PK\n ) BB ON BB.RDB$RELATION_NAME = AA.RDB$RELATION_NAME AND BB.RDB$CONSTRAINT_NAME = AA.RDB$CONSTRAINT_NAME\n WHERE\n AA.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'\n AND AA.RDB$RELATION_NAME = '\#{table_name.upcase}';\n SQL\n\n result.map do |row|\n options = {\n column: row[2].downcase,\n name: row[0].strip.downcase,\n primary_key: row[3].downcase\n }\n\n ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row[1].strip.downcase, options)\n end\nend\n".strip_heredoc, "SCHEMA")
|