You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add SET search_path to all SECURITY DEFINER functions
Add SET search_path = sql_saga, pg_catalog, public to all 25 SECURITY
DEFINER functions that lacked it. This prevents schema-spoofing attacks
where a caller's search_path could cause unqualified references to
resolve to attacker-controlled schemas.
Add regression test 009_security_definer_search_path that queries
pg_proc.proconfig to verify every SECURITY DEFINER function in the
sql_saga schema has a search_path setting. This guards against future
regressions when new functions are added.
Expected output changes are from PostgreSQL showing unqualified function
names in CONTEXT lines when search_path is set on the function.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ERROR: table "simple_pk" has a simple PRIMARY KEY that does not include the temporal range column ("valid_range"); this is incompatible with SCD Type 2 history
246
-
CONTEXT: PL/pgSQL function sql_saga.add_unique_key(regclass,name[],name,sql_saga.unique_key_type,boolean,name,name,name,text,name[]) line 159 at RAISE
246
+
CONTEXT: PL/pgSQL function add_unique_key(regclass,name[],name,unique_key_type,boolean,name,name,name,text,name[]) line 159 at RAISE
ERROR: table "generated_always" has a GENERATED ALWAYS AS IDENTITY column ("id"); this is incompatible with SCD Type 2 history as it prevents inserting new historical versions of an entity
274
-
CONTEXT: PL/pgSQL function sql_saga.add_unique_key(regclass,name[],name,sql_saga.unique_key_type,boolean,name,name,name,text,name[]) line 140 at RAISE
274
+
CONTEXT: PL/pgSQL function add_unique_key(regclass,name[],name,unique_key_type,boolean,name,name,name,text,name[]) line 140 at RAISE
NOTICE: sql_saga: Created trigger "establishment_synchronize_temporal_columns_trigger" on table establishment to synchronize columns: valid_from, valid_until
106
+
NOTICE: sql_saga: Created trigger "establishment_synchronize_temporal_columns_trigger" on table saga_bug_test.establishment to synchronize columns: valid_from, valid_until
107
107
NOTICE: sql_saga: Created GIST index "establishment_valid_range_gist_idx" on column saga_bug_test.establishment.valid_range for temporal_merge performance
'correct_table_uk' -- This UK is on saga_bug_test.legal_unit
131
131
);
132
-
NOTICE: sql_saga: No compatible index found for foreign key on table establishment. Creating new index: CREATE INDEX establishment_legal_unit_id_valid_gist_idx ON establishment USING GIST (legal_unit_id, valid_range)
132
+
NOTICE: sql_saga: No compatible index found for foreign key on table saga_bug_test.establishment. Creating new index: CREATE INDEX establishment_legal_unit_id_valid_gist_idx ON saga_bug_test.establishment USING GIST (legal_unit_id, valid_range)
CONTEXT: SQL statement "ALTER TABLE public.contractors ADD CONSTRAINT contractors_name_valid_excl EXCLUDE USING gist (name WITH =, valid_range WITH &&) WHERE (agency_id IS NOT NULL) DEFERRABLE"
171
-
PL/pgSQL function sql_saga.add_unique_key(regclass,name[],name,sql_saga.unique_key_type,boolean,name,name,name,text,name[]) line 459 at EXECUTE
171
+
PL/pgSQL function add_unique_key(regclass,name[],name,unique_key_type,boolean,name,name,name,text,name[]) line 459 at EXECUTE
172
172
-- Correct the data by deleting one of the conflicting records.
173
173
DELETE FROM contractors WHERE id = 102;
174
174
-- Try adding the unique key again. This should now succeed.
NOTICE: sql_saga: Added constraints to table pk_consistency.composite_pk_b: ALTER COLUMN org_id SET NOT NULL; ALTER COLUMN unit_id SET NOT NULL; ADD PRIMARY KEY (org_id, unit_id, valid_range WITHOUT OVERLAPS)
367
367
ERROR: cannot add primary key (org_id, unit_id) to table "pk_consistency.composite_pk_b" because its stable part (org_id, unit_id) is composite, which is not supported for consistency enforcement required by existing natural keys
368
-
CONTEXT: PL/pgSQL function sql_saga.add_unique_key(regclass,name[],name,sql_saga.unique_key_type,boolean,name,name,name,text,name[]) line 545 at RAISE
368
+
CONTEXT: PL/pgSQL function add_unique_key(regclass,name[],name,unique_key_type,boolean,name,name,name,text,name[]) line 545 at RAISE
Copy file name to clipboardExpand all lines: expected/040_fk_temporal_to_temporal.out
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -385,7 +385,7 @@ CONTEXT: SQL statement "
385
385
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
386
386
DEFERRABLE
387
387
"
388
-
PL/pgSQL function sql_saga.add_temporal_foreign_key(regclass,name[],name,name,sql_saga.fk_match_types,sql_saga.fk_actions,sql_saga.fk_actions,name,name,name,boolean) line 111 at EXECUTE
388
+
PL/pgSQL function add_temporal_foreign_key(regclass,name[],name,name,fk_match_types,fk_actions,fk_actions,name,name,name,boolean) line 111 at EXECUTE
389
389
ROLLBACK TO SAVEPOINT s;
390
390
-- it fails on a table with a completely-uncovered foreign key
391
391
SAVEPOINT s;
@@ -455,7 +455,7 @@ CONTEXT: SQL statement "
455
455
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
456
456
DEFERRABLE
457
457
"
458
-
PL/pgSQL function sql_saga.add_temporal_foreign_key(regclass,name[],name,name,sql_saga.fk_match_types,sql_saga.fk_actions,sql_saga.fk_actions,name,name,name,boolean) line 111 at EXECUTE
458
+
PL/pgSQL function add_temporal_foreign_key(regclass,name[],name,name,fk_match_types,fk_actions,fk_actions,name,name,name,boolean) line 111 at EXECUTE
459
459
ROLLBACK TO SAVEPOINT s;
460
460
-- it fails on a table with a partially-covered foreign key
461
461
SAVEPOINT s;
@@ -525,7 +525,7 @@ CONTEXT: SQL statement "
525
525
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
526
526
DEFERRABLE
527
527
"
528
-
PL/pgSQL function sql_saga.add_temporal_foreign_key(regclass,name[],name,name,sql_saga.fk_match_types,sql_saga.fk_actions,sql_saga.fk_actions,name,name,name,boolean) line 111 at EXECUTE
528
+
PL/pgSQL function add_temporal_foreign_key(regclass,name[],name,name,fk_match_types,fk_actions,fk_actions,name,name,name,boolean) line 111 at EXECUTE
NOTICE: sql_saga: No compatible index found for foreign key on table child_t. Creating new index: CREATE INDEX child_t_parent_id_valid_gist_idx ON child_t USING GIST (parent_id, valid_range)
63
+
NOTICE: sql_saga: No compatible index found for foreign key on table fk_idx.child_t. Creating new index: CREATE INDEX child_t_parent_id_valid_gist_idx ON fk_idx.child_t USING GIST (parent_id, valid_range)
64
64
add_foreign_key
65
65
-------------------
66
66
child_parent_fk_1
@@ -120,7 +120,7 @@ NOTICE: sql_saga: Created GIST index "parent_t_valid_range_gist_idx" on column
NOTICE: sql_saga: No compatible index found for foreign key on table child_t. Creating new index: CREATE INDEX child_t_parent_id_valid_gist_idx ON child_t USING GIST (parent_id, valid_range)
270
+
NOTICE: sql_saga: No compatible index found for foreign key on table fk_idx.child_t. Creating new index: CREATE INDEX child_t_parent_id_valid_gist_idx ON fk_idx.child_t USING GIST (parent_id, valid_range)
271
271
add_foreign_key
272
272
-------------------
273
273
child_parent_fk_4
@@ -326,7 +326,7 @@ NOTICE: sql_saga: Created GIST index "parent_r_valid_range_gist_idx" on column
NOTICE: sql_saga: No compatible index found for foreign key on table child_r. Creating new index: CREATE INDEX child_r_parent_id_idx ON child_r USING BTREE (parent_id)
341
+
NOTICE: sql_saga: No compatible index found for foreign key on table fk_idx.child_r. Creating new index: CREATE INDEX child_r_parent_id_idx ON fk_idx.child_r USING BTREE (parent_id)
342
342
add_foreign_key
343
343
---------------------
344
344
child_parent_r_fk_1
@@ -389,7 +389,7 @@ NOTICE: sql_saga: Created GIST index "parent_r_valid_range_gist_idx" on column
0 commit comments