diff --git a/Makefile b/Makefile index 2b4b36e..7680762 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ DATA = pg_ivm--1.0.sql \ pg_ivm--1.10.sql \ pg_ivm--1.10--1.11.sql pg_ivm--1.11--1.12.sql -REGRESS = pg_ivm create_immv refresh_immv +REGRESS = pg_ivm create_immv refresh_immv preload_libraries_warning PGVER = $(shell $(PG_CONFIG) --version | sed "s/^[^ ]* \([0-9]*\).*$$/\1/" 2>/dev/null) diff --git a/expected/pg_ivm.out b/expected/pg_ivm.out index 841c7db..55348a7 100644 --- a/expected/pg_ivm.out +++ b/expected/pg_ivm.out @@ -1,3 +1,11 @@ +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +\c - CREATE EXTENSION pg_ivm; GRANT ALL ON SCHEMA public TO public; -- create a table to use as a basis for views and materialized views in various combinations diff --git a/expected/preload_libraries_warning.out b/expected/preload_libraries_warning.out new file mode 100644 index 0000000..530e95f --- /dev/null +++ b/expected/preload_libraries_warning.out @@ -0,0 +1,51 @@ +-- SQL tests to validate that the session_preload_libraries warning is emitted +-- whenever pg_ivm is not in session_preload_libraries. +DROP EXTENSION IF EXISTS pg_ivm CASCADE; +NOTICE: drop cascades to 12 other objects +DETAIL: drop cascades to trigger IVM_trigger_ins_before_17633 on table t +drop cascades to trigger IVM_trigger_del_before_17634 on table t +drop cascades to trigger IVM_trigger_upd_before_17635 on table t +drop cascades to trigger IVM_trigger_truncate_before_17636 on table t +drop cascades to trigger IVM_trigger_ins_after_17637 on table t +drop cascades to trigger IVM_trigger_del_after_17638 on table t +drop cascades to trigger IVM_trigger_upd_after_17639 on table t +drop cascades to trigger IVM_trigger_truncate_after_17640 on table t +drop cascades to trigger IVM_prevent_immv_change_17621 on table mv +drop cascades to trigger IVM_prevent_immv_change_17622 on table mv +drop cascades to trigger IVM_prevent_immv_change_17623 on table mv +drop cascades to trigger IVM_prevent_immv_change_17624 on table mv +-- Validate that pg_ivm 1.10 cannot be created if pg_ivm is not in +-- session_preload_libraries. +ALTER SYSTEM RESET session_preload_libraries; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +\c - +CREATE EXTENSION pg_ivm VERSION '1.9'; -- expect success +ALTER EXTENSION pg_ivm UPDATE; -- expect failure +ERROR: pg_ivm is not loaded in shared_preload_libraries or session_preload_libraries +HINT: Add pg_ivm to session_preload_libraries and restart the session. Or, add pg_ivm to shared_preload_libraries and restart Postgres. +CONTEXT: PL/pgSQL function inline_code_block line 13 at RAISE +DROP EXTENSION pg_ivm; +CREATE EXTENSION pg_ivm; -- expect failure +ERROR: pg_ivm is not loaded in shared_preload_libraries or session_preload_libraries +HINT: Add pg_ivm to session_preload_libraries and restart the session. Or, add pg_ivm to shared_preload_libraries and restart Postgres. +CONTEXT: PL/pgSQL function inline_code_block line 13 at RAISE +-- Validate that pg_ivm 1.10 can be created if pg_ivm is in +-- session_preload_libraries. +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +\c - +CREATE EXTENSION pg_ivm VERSION '1.9'; -- expect success +ALTER EXTENSION pg_ivm UPDATE; -- expect success +DROP EXTENSION pg_ivm; +CREATE EXTENSION pg_ivm; -- expect success +DROP EXTENSION pg_ivm CASCADE; diff --git a/pg_ivm--1.10.sql b/pg_ivm--1.10.sql index 98f0145..d7e1a27 100644 --- a/pg_ivm--1.10.sql +++ b/pg_ivm--1.10.sql @@ -1,3 +1,24 @@ +DO $$ + DECLARE + shared_pl text; + session_pl text; + BEGIN + SELECT setting INTO shared_pl FROM pg_catalog.pg_settings + WHERE name = 'shared_preload_libraries'; + + SELECT setting INTO session_pl FROM pg_catalog.pg_settings + WHERE name = 'session_preload_libraries'; + + IF shared_pl !~ '\mpg_ivm\M' AND session_pl !~ '\mpg_ivm\M' THEN + RAISE EXCEPTION 'pg_ivm is not loaded in shared_preload_libraries ' + 'or session_preload_libraries' + USING HINT = 'Add pg_ivm to session_preload_libraries and ' + 'restart the session. Or, add pg_ivm to ' + 'shared_preload_libraries and restart Postgres.'; + END IF; + END +$$; + CREATE SCHEMA pgivm; -- catalog diff --git a/pg_ivm--1.9--1.10.sql b/pg_ivm--1.9--1.10.sql index f117add..2f4e678 100644 --- a/pg_ivm--1.9--1.10.sql +++ b/pg_ivm--1.9--1.10.sql @@ -1,3 +1,24 @@ +DO $$ + DECLARE + shared_pl text; + session_pl text; + BEGIN + SELECT setting INTO shared_pl FROM pg_catalog.pg_settings + WHERE name = 'shared_preload_libraries'; + + SELECT setting INTO session_pl FROM pg_catalog.pg_settings + WHERE name = 'session_preload_libraries'; + + IF shared_pl !~ '\mpg_ivm\M' AND session_pl !~ '\mpg_ivm\M' THEN + RAISE EXCEPTION 'pg_ivm is not loaded in shared_preload_libraries ' + 'or session_preload_libraries' + USING HINT = 'Add pg_ivm to session_preload_libraries and ' + 'restart the session. Or, add pg_ivm to ' + 'shared_preload_libraries and restart Postgres.'; + END IF; + END +$$; + -- create a new schema pgivm and change the objects' schema to it CREATE SCHEMA pgivm; diff --git a/sql/pg_ivm.sql b/sql/pg_ivm.sql index d274bc3..51147f8 100644 --- a/sql/pg_ivm.sql +++ b/sql/pg_ivm.sql @@ -1,3 +1,7 @@ +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); +\c - + CREATE EXTENSION pg_ivm; GRANT ALL ON SCHEMA public TO public; diff --git a/sql/preload_libraries_warning.sql b/sql/preload_libraries_warning.sql new file mode 100644 index 0000000..5d93534 --- /dev/null +++ b/sql/preload_libraries_warning.sql @@ -0,0 +1,28 @@ +-- SQL tests to validate that the session_preload_libraries warning is emitted +-- whenever pg_ivm is not in session_preload_libraries. + +DROP EXTENSION IF EXISTS pg_ivm CASCADE; + +-- Validate that pg_ivm 1.10 cannot be created if pg_ivm is not in +-- session_preload_libraries. +ALTER SYSTEM RESET session_preload_libraries; +SELECT pg_reload_conf(); +\c - + +CREATE EXTENSION pg_ivm VERSION '1.9'; -- expect success +ALTER EXTENSION pg_ivm UPDATE; -- expect failure +DROP EXTENSION pg_ivm; +CREATE EXTENSION pg_ivm; -- expect failure + +-- Validate that pg_ivm 1.10 can be created if pg_ivm is in +-- session_preload_libraries. +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); +\c - + +CREATE EXTENSION pg_ivm VERSION '1.9'; -- expect success +ALTER EXTENSION pg_ivm UPDATE; -- expect success +DROP EXTENSION pg_ivm; +CREATE EXTENSION pg_ivm; -- expect success + +DROP EXTENSION pg_ivm CASCADE;