Skip to content

Commit c1513d3

Browse files
committed
fix(postgresql): prevent duplicate primary keys when tables exist in multiple schemas
When a table name exists in multiple schemas (e.g., public.users and auth.users), SQL queries joining information_schema.table_constraints with information_schema.key_column_usage were returning duplicate primary key columns. Solution: Added "AND tc.table_schema = kcu.table_schema" to all JOIN conditions to ensure primary key information is only retrieved from the target schema specified by cloudsync_schema() or current_schema().
1 parent cbf098a commit c1513d3

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

src/postgresql/database_postgresql.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ int database_count_pk (cloudsync_context *data, const char *table_name, bool not
840840
const char *sql =
841841
"SELECT COUNT(*) FROM information_schema.table_constraints tc "
842842
"JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name "
843+
" AND tc.table_schema = kcu.table_schema "
843844
"WHERE tc.table_name = $1 AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
844845
"AND tc.constraint_type = 'PRIMARY KEY'";
845846

@@ -854,6 +855,7 @@ int database_count_nonpk (cloudsync_context *data, const char *table_name) {
854855
"AND c.column_name NOT IN ("
855856
" SELECT kcu.column_name FROM information_schema.table_constraints tc "
856857
" JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name "
858+
" AND tc.table_schema = kcu.table_schema "
857859
" WHERE tc.table_name = $1 AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
858860
" AND tc.constraint_type = 'PRIMARY KEY'"
859861
")";
@@ -883,6 +885,7 @@ int database_count_notnull_without_default (cloudsync_context *data, const char
883885
"AND c.column_name NOT IN ("
884886
" SELECT kcu.column_name FROM information_schema.table_constraints tc "
885887
" JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name "
888+
" AND tc.table_schema = kcu.table_schema "
886889
" WHERE tc.table_name = $1 AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
887890
" AND tc.constraint_type = 'PRIMARY KEY'"
888891
")";
@@ -966,6 +969,7 @@ int database_create_insert_trigger (cloudsync_context *data, const char *table_n
966969
"FROM information_schema.table_constraints tc "
967970
"JOIN information_schema.key_column_usage kcu "
968971
" ON tc.constraint_name = kcu.constraint_name "
972+
" AND tc.table_schema = kcu.table_schema "
969973
"WHERE tc.table_name = '%s' AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
970974
"AND tc.constraint_type = 'PRIMARY KEY';",
971975
table_name);
@@ -1068,6 +1072,7 @@ int database_create_update_trigger (cloudsync_context *data, const char *table_n
10681072
"FROM information_schema.table_constraints tc "
10691073
"JOIN information_schema.key_column_usage kcu "
10701074
" ON tc.constraint_name = kcu.constraint_name "
1075+
" AND tc.table_schema = kcu.table_schema "
10711076
"WHERE tc.table_name = '%s' AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
10721077
"AND tc.constraint_type = 'PRIMARY KEY';",
10731078
table_name, table_name);
@@ -1093,6 +1098,7 @@ int database_create_update_trigger (cloudsync_context *data, const char *table_n
10931098
" SELECT 1 FROM information_schema.table_constraints tc "
10941099
" JOIN information_schema.key_column_usage kcu "
10951100
" ON tc.constraint_name = kcu.constraint_name "
1101+
" AND tc.table_schema = kcu.table_schema "
10961102
" WHERE tc.table_name = c.table_name "
10971103
" AND tc.table_schema = c.table_schema "
10981104
" AND tc.constraint_type = 'PRIMARY KEY' "
@@ -1205,6 +1211,7 @@ int database_create_delete_trigger (cloudsync_context *data, const char *table_n
12051211
"FROM information_schema.table_constraints tc "
12061212
"JOIN information_schema.key_column_usage kcu "
12071213
" ON tc.constraint_name = kcu.constraint_name "
1214+
" AND tc.table_schema = kcu.table_schema "
12081215
"WHERE tc.table_name = '%s' AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
12091216
"AND tc.constraint_type = 'PRIMARY KEY';",
12101217
table_name);
@@ -1413,6 +1420,7 @@ int database_pk_names (cloudsync_context *data, const char *table_name, char ***
14131420
const char *sql =
14141421
"SELECT kcu.column_name FROM information_schema.table_constraints tc "
14151422
"JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name "
1423+
" AND tc.table_schema = kcu.table_schema "
14161424
"WHERE tc.table_name = $1 AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
14171425
"AND tc.constraint_type = 'PRIMARY KEY' "
14181426
"ORDER BY kcu.ordinal_position";

src/postgresql/sql_postgresql.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ const char * const SQL_PRAGMA_TABLEINFO_LIST_NONPK_NAME_CID =
343343
"AND c.column_name NOT IN ("
344344
" SELECT kcu.column_name FROM information_schema.table_constraints tc "
345345
" JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name "
346+
" AND tc.table_schema = kcu.table_schema "
346347
" WHERE tc.table_name = '%s' AND tc.table_schema = COALESCE(cloudsync_schema(), current_schema()) "
347348
" AND tc.constraint_type = 'PRIMARY KEY'"
348349
") "

0 commit comments

Comments
 (0)