(txn *sql.Tx)
| 116 | } |
| 117 | |
| 118 | func getForeignKeys(txn *sql.Tx) (map[db.TableKey][]*storepb.ForeignKeyMetadata, error) { |
| 119 | query := ` |
| 120 | SELECT |
| 121 | n.nspname AS fk_schema, |
| 122 | quote_ident(fk_nsp.nspname) || '.' || quote_ident(fk_cls.relname) AS fk_table, |
| 123 | conname AS fk_name, |
| 124 | ref_nsp.nspname AS fk_ref_schema, |
| 125 | quote_ident(ref_nsp.nspname) || '.' || quote_ident(ref_cls.relname) AS fk_ref_table, |
| 126 | confdeltype AS delete_option, |
| 127 | confupdtype AS update_option, |
| 128 | confmatchtype AS match_option, |
| 129 | pg_get_constraintdef(c.oid) AS fk_def |
| 130 | FROM |
| 131 | pg_constraint c |
| 132 | JOIN pg_namespace n ON n.oid = c.connamespace |
| 133 | JOIN pg_class fk_cls ON fk_cls.oid = c.conrelid |
| 134 | JOIN pg_namespace fk_nsp ON fk_nsp.oid = fk_cls.relnamespace |
| 135 | JOIN pg_class ref_cls ON ref_cls.oid = c.confrelid |
| 136 | JOIN pg_namespace ref_nsp ON ref_nsp.oid = ref_cls.relnamespace |
| 137 | WHERE |
| 138 | n.nspname NOT IN('pg_catalog', 'information_schema') |
| 139 | AND c.contype = 'f' |
| 140 | ORDER BY fk_schema, fk_table, fk_name; |
| 141 | ` |
| 142 | foreignKeysMap := make(map[db.TableKey][]*storepb.ForeignKeyMetadata) |
| 143 | rows, err := txn.Query(query) |
| 144 | if err != nil { |
| 145 | return nil, err |
| 146 | } |
| 147 | defer rows.Close() |
| 148 | |
| 149 | for rows.Next() { |
| 150 | var fkMetadata storepb.ForeignKeyMetadata |
| 151 | var fkSchema, fkTable, fkDefinition string |
| 152 | if err := rows.Scan( |
| 153 | &fkSchema, |
| 154 | &fkTable, |
| 155 | &fkMetadata.Name, |
| 156 | &fkMetadata.ReferencedSchema, |
| 157 | &fkMetadata.ReferencedTable, |
| 158 | &fkMetadata.OnDelete, |
| 159 | &fkMetadata.OnUpdate, |
| 160 | &fkMetadata.MatchType, |
| 161 | &fkDefinition, |
| 162 | ); err != nil { |
| 163 | return nil, err |
| 164 | } |
| 165 | |
| 166 | fkTable = formatTableNameFromRegclass(fkTable) |
| 167 | fkMetadata.ReferencedTable = formatTableNameFromRegclass(fkMetadata.ReferencedTable) |
| 168 | fkMetadata.OnDelete = convertForeignKeyActionCode(fkMetadata.OnDelete) |
| 169 | fkMetadata.OnUpdate = convertForeignKeyActionCode(fkMetadata.OnUpdate) |
| 170 | fkMetadata.MatchType = convertForeignKeyMatchType(fkMetadata.MatchType) |
| 171 | |
| 172 | if fkMetadata.Columns, fkMetadata.ReferencedColumns, err = getForeignKeyColumnsAndReferencedColumns(fkDefinition); err != nil { |
| 173 | return nil, err |
| 174 | } |
| 175 | key := db.TableKey{Schema: fkSchema, Table: fkTable} |
no test coverage detected