Skip to content

Commit c6d5c58

Browse files
committed
fix query
1 parent be70c7e commit c6d5c58

File tree

2 files changed

+83
-11
lines changed

2 files changed

+83
-11
lines changed

pgdog/src/backend/schema/columns.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,72 @@ mod test {
221221
.await
222222
.unwrap();
223223
}
224+
225+
#[tokio::test]
226+
async fn test_load_composite_foreign_keys() {
227+
let pool = pool();
228+
let mut conn = pool.get(&Request::default()).await.unwrap();
229+
230+
// Create test tables with composite FK
231+
conn.execute("DROP TABLE IF EXISTS fk_comp_child CASCADE")
232+
.await
233+
.unwrap();
234+
conn.execute("DROP TABLE IF EXISTS fk_comp_parent CASCADE")
235+
.await
236+
.unwrap();
237+
238+
conn.execute(
239+
"CREATE TABLE fk_comp_parent (
240+
tenant_id INTEGER NOT NULL,
241+
id INTEGER NOT NULL,
242+
name TEXT,
243+
PRIMARY KEY (tenant_id, id)
244+
)",
245+
)
246+
.await
247+
.unwrap();
248+
249+
conn.execute(
250+
"CREATE TABLE fk_comp_child (
251+
id SERIAL PRIMARY KEY,
252+
parent_tenant INTEGER NOT NULL,
253+
parent_id INTEGER NOT NULL,
254+
FOREIGN KEY (parent_tenant, parent_id) REFERENCES fk_comp_parent(tenant_id, id)
255+
)",
256+
)
257+
.await
258+
.unwrap();
259+
260+
let columns = Column::load(&mut conn).await.unwrap();
261+
262+
let child_columns = columns
263+
.get(&("pgdog".to_string(), "fk_comp_child".to_string()))
264+
.expect("fk_comp_child table should exist");
265+
266+
// Check parent_tenant column FK
267+
let parent_tenant_col = child_columns
268+
.iter()
269+
.find(|c| c.column_name == "parent_tenant")
270+
.expect("parent_tenant column should exist");
271+
assert_eq!(parent_tenant_col.foreign_keys.len(), 1);
272+
assert_eq!(parent_tenant_col.foreign_keys[0].table, "fk_comp_parent");
273+
assert_eq!(parent_tenant_col.foreign_keys[0].column, "tenant_id");
274+
275+
// Check parent_id column FK
276+
let parent_id_col = child_columns
277+
.iter()
278+
.find(|c| c.column_name == "parent_id")
279+
.expect("parent_id column should exist");
280+
assert_eq!(parent_id_col.foreign_keys.len(), 1);
281+
assert_eq!(parent_id_col.foreign_keys[0].table, "fk_comp_parent");
282+
assert_eq!(parent_id_col.foreign_keys[0].column, "id");
283+
284+
// Clean up
285+
conn.execute("DROP TABLE IF EXISTS fk_comp_child CASCADE")
286+
.await
287+
.unwrap();
288+
conn.execute("DROP TABLE IF EXISTS fk_comp_parent CASCADE")
289+
.await
290+
.unwrap();
291+
}
224292
}

pgdog/src/backend/schema/foreign_keys.sql

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,29 @@ SELECT
22
kcu.table_schema::text AS source_schema,
33
kcu.table_name::text AS source_table,
44
kcu.column_name::text AS source_column,
5-
ccu.table_schema::text AS ref_schema,
6-
ccu.table_name::text AS ref_table,
7-
ccu.column_name::text AS ref_column,
5+
ref_kcu.table_schema::text AS ref_schema,
6+
ref_kcu.table_name::text AS ref_table,
7+
ref_kcu.column_name::text AS ref_column,
88
rc.delete_rule::text AS on_delete,
99
rc.update_rule::text AS on_update
1010
FROM
1111
information_schema.table_constraints tc
1212
JOIN
1313
information_schema.key_column_usage kcu
14-
ON tc.constraint_name = kcu.constraint_name
15-
AND tc.table_schema = kcu.table_schema
16-
JOIN
17-
information_schema.constraint_column_usage ccu
18-
ON tc.constraint_name = ccu.constraint_name
19-
AND tc.table_schema = ccu.table_schema
14+
ON tc.constraint_catalog = kcu.constraint_catalog
15+
AND tc.constraint_schema = kcu.constraint_schema
16+
AND tc.constraint_name = kcu.constraint_name
2017
JOIN
2118
information_schema.referential_constraints rc
22-
ON tc.constraint_name = rc.constraint_name
23-
AND tc.table_schema = rc.constraint_schema
19+
ON tc.constraint_catalog = rc.constraint_catalog
20+
AND tc.constraint_schema = rc.constraint_schema
21+
AND tc.constraint_name = rc.constraint_name
22+
JOIN
23+
information_schema.key_column_usage ref_kcu
24+
ON rc.unique_constraint_catalog = ref_kcu.constraint_catalog
25+
AND rc.unique_constraint_schema = ref_kcu.constraint_schema
26+
AND rc.unique_constraint_name = ref_kcu.constraint_name
27+
AND kcu.position_in_unique_constraint = ref_kcu.ordinal_position
2428
WHERE
2529
tc.constraint_type = 'FOREIGN KEY'
2630
AND tc.table_schema NOT IN ('pg_catalog', 'information_schema')

0 commit comments

Comments
 (0)