Skip to content

Commit 6231ccd

Browse files
jhfclaude
andcommitted
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>
1 parent de7dcb1 commit 6231ccd

41 files changed

Lines changed: 192 additions & 57 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

expected/003_api_symmetry.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ SELECT sql_saga.drop_era('era_symmetry_test'::regclass, cleanup => true);
279279
SAVEPOINT before_fail;
280280
SELECT sql_saga.add_era('era_symmetry_test'::regclass, 'v');
281281
ERROR: range column "v" not found in table "era_symmetry_test"
282-
CONTEXT: PL/pgSQL function sql_saga.add_era(regclass,name,name,boolean,name,name,name,boolean,boolean,boolean,regtype,name,name[]) line 167 at RAISE
282+
CONTEXT: PL/pgSQL function add_era(regclass,name,name,boolean,name,name,name,boolean,boolean,boolean,regtype,name,name[]) line 167 at RAISE
283283
ROLLBACK TO SAVEPOINT before_fail;
284284
-- 4. Create columns manually, then add era
285285
ALTER TABLE era_symmetry_test ADD COLUMN v tstzrange;

expected/007_era_validation.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ SELECT sql_saga.add_era(
4141
range_column_name => 'invalid_range_col'
4242
);
4343
ERROR: column "invalid_range_col" is of type date which is not a range type
44-
CONTEXT: PL/pgSQL function sql_saga.add_era(regclass,name,name,boolean,name,name,name,boolean,boolean,boolean,regtype,name,name[]) line 175 at RAISE
44+
CONTEXT: PL/pgSQL function add_era(regclass,name,name,boolean,name,name,name,boolean,boolean,boolean,regtype,name,name[]) line 175 at RAISE
4545
ROLLBACK;
4646
\i sql/include/test_teardown.sql
4747
--
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
\i sql/include/test_setup.sql
2+
--
3+
-- test_setup.sql
4+
--
5+
-- Common setup for regression tests that need to be self-contained.
6+
-- This script creates the extension, a user role, and grants permissions.
7+
--
8+
SET datestyle = 'ISO, YMD';
9+
CREATE EXTENSION IF NOT EXISTS btree_gist;
10+
CREATE EXTENSION IF NOT EXISTS sql_saga CASCADE;
11+
DO $$
12+
BEGIN
13+
CREATE ROLE sql_saga_unprivileged_user;
14+
EXCEPTION WHEN duplicate_object THEN
15+
END
16+
$$;
17+
GRANT USAGE ON SCHEMA sql_saga TO sql_saga_unprivileged_user;
18+
GRANT SELECT ON ALL TABLES IN SCHEMA sql_saga TO sql_saga_unprivileged_user;
19+
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA sql_saga TO sql_saga_unprivileged_user;
20+
/*
21+
* Allow the unprivileged user to create tables in the public schema.
22+
* This is required for tests that create their own tables.
23+
* PG 15+ restricts this by default.
24+
*/
25+
GRANT CREATE ON SCHEMA public TO PUBLIC;
26+
BEGIN;
27+
-- =============================================================================
28+
-- Test: Every SECURITY DEFINER function must have SET search_path
29+
-- =============================================================================
30+
-- This test guards against regressions where a new SECURITY DEFINER function
31+
-- is added without a safe search_path. Without SET search_path, a SECURITY
32+
-- DEFINER function executes with the caller's search_path, which could allow
33+
-- schema-spoofing attacks.
34+
\echo '--- Verify all SECURITY DEFINER functions have search_path ---'
35+
--- Verify all SECURITY DEFINER functions have search_path ---
36+
-- This query finds SECURITY DEFINER functions in the sql_saga schema that
37+
-- do NOT have a search_path in their proconfig (SET options).
38+
SELECT p.proname AS missing_search_path
39+
FROM pg_catalog.pg_proc AS p
40+
JOIN pg_catalog.pg_namespace AS n ON n.oid = p.pronamespace
41+
WHERE n.nspname = 'sql_saga'
42+
AND p.prosecdef = true
43+
AND (
44+
p.proconfig IS NULL
45+
OR NOT EXISTS (
46+
SELECT FROM unnest(p.proconfig) AS c(setting)
47+
WHERE c.setting LIKE 'search_path=%'
48+
)
49+
)
50+
ORDER BY p.proname;
51+
missing_search_path
52+
---------------------
53+
(0 rows)
54+
55+
ROLLBACK;
56+
\i sql/include/test_teardown.sql
57+
--
58+
-- test_teardown.sql
59+
--
60+
-- Common teardown for regression tests. This script drops the unprivileged
61+
-- user role created by test_setup.sql.
62+
--
63+
-- It is important to reset the role first, in case a test fails and
64+
-- leaves the session role set to the user that is about to be dropped.
65+
RESET ROLE;
66+
-- Drop the extensions to ensure a clean state for the next test.
67+
-- Use CASCADE to remove any dependent objects created by sql_saga.
68+
DROP EXTENSION IF EXISTS sql_saga CASCADE;
69+
DROP EXTENSION IF EXISTS btree_gist CASCADE;
70+
-- Revoke any privileges held by the test user and drop any objects they own.
71+
-- This is necessary before the role can be dropped.
72+
DROP OWNED BY sql_saga_unprivileged_user;
73+
DROP ROLE IF EXISTS sql_saga_unprivileged_user;

expected/010_unique_key.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ SAVEPOINT expect_error;
243243
Attempting to add a temporal primary key to a table with a simple primary key (should fail)
244244
SELECT sql_saga.add_unique_key('public.simple_pk', '{id}', key_type => 'primary');
245245
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
247247
ROLLBACK TO SAVEPOINT expect_error;
248248
DROP TABLE public.simple_pk;
249249
\echo '--- Test: add_unique_key validation for GENERATED ALWAYS identity column ---'
@@ -271,7 +271,7 @@ SAVEPOINT expect_error_2;
271271
Attempting to add a temporal primary key to a table with a GENERATED ALWAYS identity (should fail)
272272
SELECT sql_saga.add_unique_key('public.generated_always', '{id}', key_type => 'primary');
273273
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
275275
ROLLBACK TO SAVEPOINT expect_error_2;
276276
DROP TABLE public.generated_always;
277277
ROLLBACK;

expected/011_unique_key_search_path_bug.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ CREATE TABLE saga_bug_test.establishment (
103103
PRIMARY KEY (id, valid_range)
104104
);
105105
SELECT sql_saga.add_era('saga_bug_test.establishment', 'valid_range');
106-
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
107107
NOTICE: sql_saga: Created GIST index "establishment_valid_range_gist_idx" on column saga_bug_test.establishment.valid_range for temporal_merge performance
108108
add_era
109109
---------
110110
t
111111
(1 row)
112112

113113
SELECT sql_saga.add_unique_key('saga_bug_test.establishment', ARRAY['id'], key_type => 'natural');
114-
NOTICE: sql_saga: Added constraints to table establishment: ADD CONSTRAINT establishment_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
114+
NOTICE: sql_saga: Added constraints to table saga_bug_test.establishment: ADD CONSTRAINT establishment_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
115115
add_unique_key
116116
------------------------
117117
establishment_id_valid
@@ -129,7 +129,7 @@ SELECT sql_saga.add_temporal_foreign_key(
129129
'valid',
130130
'correct_table_uk' -- This UK is on saga_bug_test.legal_unit
131131
);
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)
133133
add_temporal_foreign_key
134134
-----------------------------------
135135
establishment_legal_unit_id_valid

expected/013_unique_key_predicate.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ SELECT sql_saga.add_unique_key(
168168
ERROR: could not create exclusion constraint "contractors_name_valid_excl"
169169
DETAIL: Key (name, valid_range)=(David, [2020-01-01,2022-01-01)) conflicts with key (name, valid_range)=(David, [2021-01-01,2023-01-01)).
170170
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
172172
-- Correct the data by deleting one of the conflicting records.
173173
DELETE FROM contractors WHERE id = 102;
174174
-- Try adding the unique key again. This should now succeed.

expected/016_unique_key_pk_consistency.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ SAVEPOINT expect_error;
365365
SELECT sql_saga.add_unique_key('pk_consistency.composite_pk_b', ARRAY['org_id', 'unit_id'], key_type => 'primary'); -- fails
366366
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)
367367
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
369369
ROLLBACK TO SAVEPOINT expect_error;
370370
ROLLBACK TO SAVEPOINT s4b;
371371
-- Scenario 5: API Symmetry (Drop Key)

expected/021_system_versioning_excluded_columns.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,11 @@ SELECT id, value, null_value, flap FROM excl_history ORDER BY system_valid_range
9898
-- Test that excluding a non-existent column fails.
9999
SELECT sql_saga.set_system_time_era_excluded_columns('excl', '{nonexistent}');
100100
ERROR: column "nonexistent" does not exist in table excl
101-
CONTEXT: PL/pgSQL function sql_saga.set_system_time_era_excluded_columns(regclass,name[]) line 24 at RAISE
101+
CONTEXT: PL/pgSQL function set_system_time_era_excluded_columns(regclass,name[]) line 24 at RAISE
102102
-- Test that excluding a system column fails.
103103
SELECT sql_saga.set_system_time_era_excluded_columns('excl', '{xmin}');
104104
ERROR: cannot exclude system column "xmin"
105-
CONTEXT: PL/pgSQL function sql_saga.set_system_time_era_excluded_columns(regclass,name[]) line 34 at RAISE
105+
CONTEXT: PL/pgSQL function set_system_time_era_excluded_columns(regclass,name[]) line 34 at RAISE
106106
\i sql/include/test_teardown.sql
107107
--
108108
-- test_teardown.sql

expected/040_fk_temporal_to_temporal.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ CONTEXT: SQL statement "
385385
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
386386
DEFERRABLE
387387
"
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
389389
ROLLBACK TO SAVEPOINT s;
390390
-- it fails on a table with a completely-uncovered foreign key
391391
SAVEPOINT s;
@@ -455,7 +455,7 @@ CONTEXT: SQL statement "
455455
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
456456
DEFERRABLE
457457
"
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
459459
ROLLBACK TO SAVEPOINT s;
460460
-- it fails on a table with a partially-covered foreign key
461461
SAVEPOINT s;
@@ -525,7 +525,7 @@ CONTEXT: SQL statement "
525525
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
526526
DEFERRABLE
527527
"
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
529529
ROLLBACK TO SAVEPOINT s;
530530
ROLLBACK;
531531
\i sql/include/test_teardown.sql

expected/047_fk_index_management.out

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ NOTICE: sql_saga: Created GIST index "parent_t_valid_range_gist_idx" on column
4141
(1 row)
4242

4343
SELECT add_unique_key('parent_t'::regclass, ARRAY['id'], unique_key_name => 'parent_t_id_valid');
44-
NOTICE: sql_saga: Added constraints to table parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
44+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
4545
add_unique_key
4646
-------------------
4747
parent_t_id_valid
@@ -60,7 +60,7 @@ SELECT add_foreign_key(
6060
pk_table_oid => 'parent_t'::regclass, pk_column_names => ARRAY['id'],
6161
foreign_key_name => 'child_parent_fk_1'
6262
);
63-
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)
6464
add_foreign_key
6565
-------------------
6666
child_parent_fk_1
@@ -120,7 +120,7 @@ NOTICE: sql_saga: Created GIST index "parent_t_valid_range_gist_idx" on column
120120
(1 row)
121121

122122
SELECT add_unique_key('parent_t'::regclass, ARRAY['id'], unique_key_name => 'parent_t_id_valid');
123-
NOTICE: sql_saga: Added constraints to table parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
123+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
124124
add_unique_key
125125
-------------------
126126
parent_t_id_valid
@@ -139,8 +139,8 @@ SELECT add_foreign_key(
139139
pk_table_oid => 'parent_t'::regclass, pk_column_names => ARRAY['id'],
140140
foreign_key_name => 'child_parent_fk_2', create_index => false
141141
);
142-
WARNING: No index found on table child_t for foreign key columns ({parent_id}). Performance may be poor.
143-
HINT: Consider creating this index: CREATE INDEX child_t_parent_id_valid_gist_idx ON child_t USING GIST (parent_id, valid_range)
142+
WARNING: No index found on table fk_idx.child_t for foreign key columns ({parent_id}). Performance may be poor.
143+
HINT: Consider creating this index: CREATE INDEX child_t_parent_id_valid_gist_idx ON fk_idx.child_t USING GIST (parent_id, valid_range)
144144
add_foreign_key
145145
-------------------
146146
child_parent_fk_2
@@ -184,7 +184,7 @@ NOTICE: sql_saga: Created GIST index "parent_t_valid_range_gist_idx" on column
184184
(1 row)
185185

186186
SELECT add_unique_key('parent_t'::regclass, ARRAY['id'], unique_key_name => 'parent_t_id_valid');
187-
NOTICE: sql_saga: Added constraints to table parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
187+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
188188
add_unique_key
189189
-------------------
190190
parent_t_id_valid
@@ -248,7 +248,7 @@ NOTICE: sql_saga: Created GIST index "parent_t_valid_range_gist_idx" on column
248248
(1 row)
249249

250250
SELECT add_unique_key('parent_t'::regclass, ARRAY['id'], unique_key_name => 'parent_t_id_valid');
251-
NOTICE: sql_saga: Added constraints to table parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
251+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_t: ADD CONSTRAINT parent_t_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
252252
add_unique_key
253253
-------------------
254254
parent_t_id_valid
@@ -267,7 +267,7 @@ SELECT add_foreign_key(
267267
pk_table_oid => 'parent_t'::regclass, pk_column_names => ARRAY['id'],
268268
foreign_key_name => 'child_parent_fk_4'
269269
);
270-
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)
271271
add_foreign_key
272272
-------------------
273273
child_parent_fk_4
@@ -326,7 +326,7 @@ NOTICE: sql_saga: Created GIST index "parent_r_valid_range_gist_idx" on column
326326
(1 row)
327327

328328
SELECT add_unique_key('parent_r'::regclass, ARRAY['id'], unique_key_name => 'parent_r_id_valid');
329-
NOTICE: sql_saga: Added constraints to table parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
329+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
330330
add_unique_key
331331
-------------------
332332
parent_r_id_valid
@@ -338,7 +338,7 @@ SELECT add_foreign_key(
338338
pk_table_oid => 'parent_r'::regclass, pk_column_names => ARRAY['id'],
339339
foreign_key_name => 'child_parent_r_fk_1'
340340
);
341-
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)
342342
add_foreign_key
343343
---------------------
344344
child_parent_r_fk_1
@@ -389,7 +389,7 @@ NOTICE: sql_saga: Created GIST index "parent_r_valid_range_gist_idx" on column
389389
(1 row)
390390

391391
SELECT add_unique_key('parent_r'::regclass, ARRAY['id'], unique_key_name => 'parent_r_id_valid');
392-
NOTICE: sql_saga: Added constraints to table parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
392+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
393393
add_unique_key
394394
-------------------
395395
parent_r_id_valid
@@ -401,8 +401,8 @@ SELECT add_foreign_key(
401401
pk_table_oid => 'parent_r'::regclass, pk_column_names => ARRAY['id'],
402402
foreign_key_name => 'child_parent_r_fk_2', create_index => false
403403
);
404-
WARNING: No index found on table child_r for foreign key columns ({parent_id}). Performance may be poor.
405-
HINT: Consider creating this index: CREATE INDEX child_r_parent_id_idx ON child_r USING BTREE (parent_id)
404+
WARNING: No index found on table fk_idx.child_r for foreign key columns ({parent_id}). Performance may be poor.
405+
HINT: Consider creating this index: CREATE INDEX child_r_parent_id_idx ON fk_idx.child_r USING BTREE (parent_id)
406406
add_foreign_key
407407
---------------------
408408
child_parent_r_fk_2
@@ -441,7 +441,7 @@ NOTICE: sql_saga: Created GIST index "parent_r_valid_range_gist_idx" on column
441441
(1 row)
442442

443443
SELECT add_unique_key('parent_r'::regclass, ARRAY['id'], unique_key_name => 'parent_r_id_valid');
444-
NOTICE: sql_saga: Added constraints to table parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
444+
NOTICE: sql_saga: Added constraints to table fk_idx.parent_r: ADD CONSTRAINT parent_r_id_valid_uniq UNIQUE (id, valid_range WITHOUT OVERLAPS)
445445
add_unique_key
446446
-------------------
447447
parent_r_id_valid

0 commit comments

Comments
 (0)