From 23e897c32ea8916ddfbf11839c46c3862252a010 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 16:18:12 +0000 Subject: [PATCH 1/9] Helper functions to check params --- pg_ivm.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pg_ivm.h | 2 ++ 2 files changed, 65 insertions(+) diff --git a/pg_ivm.c b/pg_ivm.c index 19d0e0e..7b7cb25 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -21,6 +21,7 @@ #include "catalog/pg_namespace_d.h" #include "catalog/pg_trigger_d.h" #include "commands/trigger.h" +#include "miscadmin.h" #include "parser/analyze.h" #include "parser/parser.h" #include "parser/scansup.h" @@ -50,6 +51,8 @@ static void parseNameAndColumns(const char *string, List **names, List **colName static void PgIvmObjectAccessHook(ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg); +static bool check_string_in_guc_list(const char *str, const char *guc_var, + const char *guc_name); /* SQL callable functions */ PG_FUNCTION_INFO_V1(create_immv); @@ -458,3 +461,63 @@ PgIvmFuncName(char *name) { return list_make2(makeString("pgivm"), makeString(name)); } + +/* + * pgIvmIsInSharedPreloadLibraries + * + * Check if pg_ivm is in the shared_preload_libraries parameter. + */ +bool +pgIvmIsInSharedPreloadLibraries() +{ + return check_string_in_guc_list("pg_ivm", shared_preload_libraries_string, + "shared_preload_libraries"); +} + +/* + * pgIvmIsInSessionPreloadLibraries + * + * Check if pg_ivm is in the session_preload_libraries parameter. + */ +bool +pgIvmIsInSessionPreloadLibraries() +{ + return check_string_in_guc_list("pg_ivm", session_preload_libraries_string, + "session_preload_libraries"); +} + +/* + * check_string_in_guc_list + * + * Check if a string is contained in a GUC parameter consisting of a + * comma-separated list of fields. + */ +static bool +check_string_in_guc_list(const char *str, const char *guc_var, + const char *guc_name) +{ + bool match = false; + char *guc_copy; + List *guc_list = NIL; + ListCell *lc; + + guc_copy = pstrdup(guc_var); + if (!SplitGUCList(guc_copy, ',', &guc_list)) + elog(ERROR, "could not parse %s", guc_name); + + foreach(lc, guc_list) + { + char *guc_str = (char *) lfirst(lc); + + if (strcmp(guc_str, str) == 0) + { + match = true; + break; + } + } + + pfree(guc_copy); + list_free(guc_list); + + return match; +} diff --git a/pg_ivm.h b/pg_ivm.h index 88d7003..081d4f8 100644 --- a/pg_ivm.h +++ b/pg_ivm.h @@ -34,6 +34,8 @@ extern Oid PgIvmImmvRelationId(void); extern Oid PgIvmImmvPrimaryKeyIndexId(void); extern bool isImmv(Oid immv_oid); extern List *PgIvmFuncName(char *name); +extern bool pgIvmIsInSharedPreloadLibraries(void); +extern bool pgIvmIsInSessionPreloadLibraries(void); /* createas.c */ From 0757f1f97ac92b69eb96428de3c223d49155a330 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 16:29:16 +0000 Subject: [PATCH 2/9] Emit warning --- pg_ivm.c | 42 ++++++++++++++++++++++++++++++++++-------- pg_ivm.h | 3 +-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/pg_ivm.c b/pg_ivm.c index 7b7cb25..32641dd 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -269,13 +269,19 @@ IVM_prevent_immv_change(PG_FUNCTION_ARGS) TriggerData *trigdata = (TriggerData *) fcinfo->context; Relation rel = trigdata->tg_relation; - if (!ImmvIncrementalMaintenanceIsEnabled()) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot change materialized view \"%s\"", - RelationGetRelationName(rel)))); + if (ImmvIncrementalMaintenanceIsEnabled()) + return PointerGetDatum(NULL); - return PointerGetDatum(NULL); + /* + * If we are maintaining an IMMV, this warning would have been emitted by + * the IVM_immediate_* triggers, so there is no need to emit it again. + */ + warnIfPgIvmNotPreloaded(); + + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change materialized view \"%s\"", + RelationGetRelationName(rel)))); } /* @@ -467,7 +473,7 @@ PgIvmFuncName(char *name) * * Check if pg_ivm is in the shared_preload_libraries parameter. */ -bool +static bool pgIvmIsInSharedPreloadLibraries() { return check_string_in_guc_list("pg_ivm", shared_preload_libraries_string, @@ -479,13 +485,33 @@ pgIvmIsInSharedPreloadLibraries() * * Check if pg_ivm is in the session_preload_libraries parameter. */ -bool +static bool pgIvmIsInSessionPreloadLibraries() { return check_string_in_guc_list("pg_ivm", session_preload_libraries_string, "session_preload_libraries"); } +/* + * warnIfPgIvmNotPreloaded + * + * Emit a warning if pg_ivm is not in shared_preload_libraries or + * session_preload_libraries. + */ +void +warnIfPgIvmNotPreloaded() +{ + if (!pgIvmIsInSharedPreloadLibraries() && + !pgIvmIsInSessionPreloadLibraries()) + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pg_ivm is not loaded in shared_preload_libraries or " + "session_preload_libraries"), + errhint("Add pg_ivm to session_preload_libraries and restart " + "the session. Or, add pg_ivm to " + "shared_preload_libraries and restart Postgres."))); +} + /* * check_string_in_guc_list * diff --git a/pg_ivm.h b/pg_ivm.h index 081d4f8..c6c8e0e 100644 --- a/pg_ivm.h +++ b/pg_ivm.h @@ -34,8 +34,7 @@ extern Oid PgIvmImmvRelationId(void); extern Oid PgIvmImmvPrimaryKeyIndexId(void); extern bool isImmv(Oid immv_oid); extern List *PgIvmFuncName(char *name); -extern bool pgIvmIsInSharedPreloadLibraries(void); -extern bool pgIvmIsInSessionPreloadLibraries(void); +extern void warnIfPgIvmNotPreloaded(void); /* createas.c */ From 6d1646db7a512163a6b7af939af2e85d8106e553 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 17:23:20 +0000 Subject: [PATCH 3/9] Add warnings to SQL scripts --- pg_ivm--1.10.sql | 21 +++++++++++++++++++++ pg_ivm--1.9--1.10.sql | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) 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; From 7f71f7c5e7fd94e68aff21067982259686dd7a8b Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 22:13:46 +0000 Subject: [PATCH 4/9] Add warnings to user-callable functions --- pg_ivm.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pg_ivm.c b/pg_ivm.c index 32641dd..569e920 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -191,6 +191,8 @@ create_immv(PG_FUNCTION_ARGS) CreateTableAsStmt *ctas; StringInfoData command_buf; + warnIfPgIvmNotPreloaded(); + parseNameAndColumns(relname, &names, &colNames); initStringInfo(&command_buf); @@ -250,6 +252,8 @@ refresh_immv(PG_FUNCTION_ARGS) QueryCompletion qc; StringInfoData command_buf; + warnIfPgIvmNotPreloaded(); + initStringInfo(&command_buf); appendStringInfo(&command_buf, "SELECT refresh_immv('%s, %s);", relname, ispopulated ? "true" : "false"); @@ -364,6 +368,8 @@ get_immv_def(PG_FUNCTION_ARGS) Query *query = NULL; char *querystring = NULL; + warnIfPgIvmNotPreloaded(); + /* Make sure IMMV is a table. */ if (get_rel_relkind(matviewOid) != RELKIND_RELATION) PG_RETURN_NULL(); From 7ad10b48efe23a7aa1dc593e70058c3796d883b8 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 22:25:49 +0000 Subject: [PATCH 5/9] Move warning --- pg_ivm.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pg_ivm.c b/pg_ivm.c index 569e920..9603ea8 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -273,19 +273,20 @@ IVM_prevent_immv_change(PG_FUNCTION_ARGS) TriggerData *trigdata = (TriggerData *) fcinfo->context; Relation rel = trigdata->tg_relation; - if (ImmvIncrementalMaintenanceIsEnabled()) - return PointerGetDatum(NULL); - /* - * If we are maintaining an IMMV, this warning would have been emitted by - * the IVM_immediate_* triggers, so there is no need to emit it again. + * This warning is shown regardless of whether the user is manually + * modifying the materialized view, or the extension is performing + * incremental maintenance. */ warnIfPgIvmNotPreloaded(); - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot change materialized view \"%s\"", - RelationGetRelationName(rel)))); + if (!ImmvIncrementalMaintenanceIsEnabled()) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change materialized view \"%s\"", + RelationGetRelationName(rel)))); + + return PointerGetDatum(NULL); } /* From f76a76ed9e9dce59fc61494dc818f5acf8c83d4b Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 22:31:23 +0000 Subject: [PATCH 6/9] Update existing tests --- expected/pg_ivm.out | 8 ++++++++ sql/pg_ivm.sql | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/expected/pg_ivm.out b/expected/pg_ivm.out index 524e300..52fd8a4 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/sql/pg_ivm.sql b/sql/pg_ivm.sql index 5dbd396..85ee8c2 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; From c4a5ed7fd4f75f658162ded2eb86813df45f7e06 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Tue, 4 Mar 2025 22:39:28 +0000 Subject: [PATCH 7/9] Add new test --- Makefile | 2 +- expected/preload_libraries_warning.out | 123 +++++++++++++++++++++++++ sql/preload_libraries_warning.sql | 51 ++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 expected/preload_libraries_warning.out create mode 100644 sql/preload_libraries_warning.sql diff --git a/Makefile b/Makefile index 9f770f6..048aa37 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ DATA = pg_ivm--1.0.sql \ pg_ivm--1.9--1.10.sql \ pg_ivm--1.10.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/preload_libraries_warning.out b/expected/preload_libraries_warning.out new file mode 100644 index 0000000..91513d7 --- /dev/null +++ b/expected/preload_libraries_warning.out @@ -0,0 +1,123 @@ +-- 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_17637 on table t +drop cascades to trigger IVM_trigger_del_before_17638 on table t +drop cascades to trigger IVM_trigger_upd_before_17639 on table t +drop cascades to trigger IVM_trigger_truncate_before_17640 on table t +drop cascades to trigger IVM_trigger_ins_after_17641 on table t +drop cascades to trigger IVM_trigger_del_after_17642 on table t +drop cascades to trigger IVM_trigger_upd_after_17643 on table t +drop cascades to trigger IVM_trigger_truncate_after_17644 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 +-- Verify that the warning is emitted when each SQL function is called. +ALTER SYSTEM RESET session_preload_libraries; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +\c - +CREATE TABLE mytab (i int primary key, a text); +SELECT pgivm.create_immv('myview', 'SELECT i, reverse(a) FROM mytab'); +WARNING: 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. +NOTICE: created index "myview_index" on immv "myview" + create_immv +------------- + 0 +(1 row) + +SELECT pgivm.refresh_immv('myview', true); +WARNING: 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. + refresh_immv +-------------- + 0 +(1 row) + +SELECT pgivm.get_immv_def('myview'); +WARNING: 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. + get_immv_def +--------------------------- + SELECT i, + + reverse(a) AS reverse+ + FROM mytab +(1 row) + +-- Verify that the warning is emitted by the maintenance triggers. +INSERT INTO mytab VALUES (1, 'asdf'); +WARNING: 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. +-- Verify that the warning is not emitted after pg_ivm is added to +-- session_preload_libraries. +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +\c - +SELECT pgivm.create_immv('myview2', 'SELECT i, reverse(a) FROM mytab'); +NOTICE: created index "myview2_index" on immv "myview2" + create_immv +------------- + 1 +(1 row) + +SELECT pgivm.refresh_immv('myview2', true); + refresh_immv +-------------- + 1 +(1 row) + +SELECT pgivm.get_immv_def('myview2'); + get_immv_def +--------------------------- + SELECT i, + + reverse(a) AS reverse+ + FROM mytab +(1 row) + +INSERT INTO mytab VALUES (2, 'qwer'); diff --git a/sql/preload_libraries_warning.sql b/sql/preload_libraries_warning.sql new file mode 100644 index 0000000..e42aa2b --- /dev/null +++ b/sql/preload_libraries_warning.sql @@ -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; + +-- 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 + +-- Verify that the warning is emitted when each SQL function is called. +ALTER SYSTEM RESET session_preload_libraries; +SELECT pg_reload_conf(); +\c - + +CREATE TABLE mytab (i int primary key, a text); +SELECT pgivm.create_immv('myview', 'SELECT i, reverse(a) FROM mytab'); +SELECT pgivm.refresh_immv('myview', true); +SELECT pgivm.get_immv_def('myview'); + +-- Verify that the warning is emitted by the maintenance triggers. +INSERT INTO mytab VALUES (1, 'asdf'); + +-- Verify that the warning is not emitted after pg_ivm is added to +-- session_preload_libraries. +ALTER SYSTEM SET session_preload_libraries = pg_ivm; +SELECT pg_reload_conf(); +\c - + +SELECT pgivm.create_immv('myview2', 'SELECT i, reverse(a) FROM mytab'); +SELECT pgivm.refresh_immv('myview2', true); +SELECT pgivm.get_immv_def('myview2'); +INSERT INTO mytab VALUES (2, 'qwer'); + From 480b52d44873754116e9b75e80b047ce85ee9076 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Mon, 17 Mar 2025 21:26:17 +0000 Subject: [PATCH 8/9] Remove warnings --- expected/preload_libraries_warning.out | 90 +++--------------------- pg_ivm.c | 95 -------------------------- pg_ivm.h | 1 - sql/preload_libraries_warning.sql | 25 +------ 4 files changed, 10 insertions(+), 201 deletions(-) diff --git a/expected/preload_libraries_warning.out b/expected/preload_libraries_warning.out index 91513d7..530e95f 100644 --- a/expected/preload_libraries_warning.out +++ b/expected/preload_libraries_warning.out @@ -2,14 +2,14 @@ -- 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_17637 on table t -drop cascades to trigger IVM_trigger_del_before_17638 on table t -drop cascades to trigger IVM_trigger_upd_before_17639 on table t -drop cascades to trigger IVM_trigger_truncate_before_17640 on table t -drop cascades to trigger IVM_trigger_ins_after_17641 on table t -drop cascades to trigger IVM_trigger_del_after_17642 on table t -drop cascades to trigger IVM_trigger_upd_after_17643 on table t -drop cascades to trigger IVM_trigger_truncate_after_17644 on table t +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 @@ -48,76 +48,4 @@ 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 --- Verify that the warning is emitted when each SQL function is called. -ALTER SYSTEM RESET session_preload_libraries; -SELECT pg_reload_conf(); - pg_reload_conf ----------------- - t -(1 row) - -\c - -CREATE TABLE mytab (i int primary key, a text); -SELECT pgivm.create_immv('myview', 'SELECT i, reverse(a) FROM mytab'); -WARNING: 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. -NOTICE: created index "myview_index" on immv "myview" - create_immv -------------- - 0 -(1 row) - -SELECT pgivm.refresh_immv('myview', true); -WARNING: 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. - refresh_immv --------------- - 0 -(1 row) - -SELECT pgivm.get_immv_def('myview'); -WARNING: 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. - get_immv_def ---------------------------- - SELECT i, + - reverse(a) AS reverse+ - FROM mytab -(1 row) - --- Verify that the warning is emitted by the maintenance triggers. -INSERT INTO mytab VALUES (1, 'asdf'); -WARNING: 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. --- Verify that the warning is not emitted after pg_ivm is added to --- session_preload_libraries. -ALTER SYSTEM SET session_preload_libraries = pg_ivm; -SELECT pg_reload_conf(); - pg_reload_conf ----------------- - t -(1 row) - -\c - -SELECT pgivm.create_immv('myview2', 'SELECT i, reverse(a) FROM mytab'); -NOTICE: created index "myview2_index" on immv "myview2" - create_immv -------------- - 1 -(1 row) - -SELECT pgivm.refresh_immv('myview2', true); - refresh_immv --------------- - 1 -(1 row) - -SELECT pgivm.get_immv_def('myview2'); - get_immv_def ---------------------------- - SELECT i, + - reverse(a) AS reverse+ - FROM mytab -(1 row) - -INSERT INTO mytab VALUES (2, 'qwer'); +DROP EXTENSION pg_ivm CASCADE; diff --git a/pg_ivm.c b/pg_ivm.c index 9603ea8..0a21544 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -51,8 +51,6 @@ static void parseNameAndColumns(const char *string, List **names, List **colName static void PgIvmObjectAccessHook(ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg); -static bool check_string_in_guc_list(const char *str, const char *guc_var, - const char *guc_name); /* SQL callable functions */ PG_FUNCTION_INFO_V1(create_immv); @@ -191,8 +189,6 @@ create_immv(PG_FUNCTION_ARGS) CreateTableAsStmt *ctas; StringInfoData command_buf; - warnIfPgIvmNotPreloaded(); - parseNameAndColumns(relname, &names, &colNames); initStringInfo(&command_buf); @@ -252,8 +248,6 @@ refresh_immv(PG_FUNCTION_ARGS) QueryCompletion qc; StringInfoData command_buf; - warnIfPgIvmNotPreloaded(); - initStringInfo(&command_buf); appendStringInfo(&command_buf, "SELECT refresh_immv('%s, %s);", relname, ispopulated ? "true" : "false"); @@ -273,13 +267,6 @@ IVM_prevent_immv_change(PG_FUNCTION_ARGS) TriggerData *trigdata = (TriggerData *) fcinfo->context; Relation rel = trigdata->tg_relation; - /* - * This warning is shown regardless of whether the user is manually - * modifying the materialized view, or the extension is performing - * incremental maintenance. - */ - warnIfPgIvmNotPreloaded(); - if (!ImmvIncrementalMaintenanceIsEnabled()) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -369,8 +356,6 @@ get_immv_def(PG_FUNCTION_ARGS) Query *query = NULL; char *querystring = NULL; - warnIfPgIvmNotPreloaded(); - /* Make sure IMMV is a table. */ if (get_rel_relkind(matviewOid) != RELKIND_RELATION) PG_RETURN_NULL(); @@ -474,83 +459,3 @@ PgIvmFuncName(char *name) { return list_make2(makeString("pgivm"), makeString(name)); } - -/* - * pgIvmIsInSharedPreloadLibraries - * - * Check if pg_ivm is in the shared_preload_libraries parameter. - */ -static bool -pgIvmIsInSharedPreloadLibraries() -{ - return check_string_in_guc_list("pg_ivm", shared_preload_libraries_string, - "shared_preload_libraries"); -} - -/* - * pgIvmIsInSessionPreloadLibraries - * - * Check if pg_ivm is in the session_preload_libraries parameter. - */ -static bool -pgIvmIsInSessionPreloadLibraries() -{ - return check_string_in_guc_list("pg_ivm", session_preload_libraries_string, - "session_preload_libraries"); -} - -/* - * warnIfPgIvmNotPreloaded - * - * Emit a warning if pg_ivm is not in shared_preload_libraries or - * session_preload_libraries. - */ -void -warnIfPgIvmNotPreloaded() -{ - if (!pgIvmIsInSharedPreloadLibraries() && - !pgIvmIsInSessionPreloadLibraries()) - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pg_ivm is not loaded in shared_preload_libraries or " - "session_preload_libraries"), - errhint("Add pg_ivm to session_preload_libraries and restart " - "the session. Or, add pg_ivm to " - "shared_preload_libraries and restart Postgres."))); -} - -/* - * check_string_in_guc_list - * - * Check if a string is contained in a GUC parameter consisting of a - * comma-separated list of fields. - */ -static bool -check_string_in_guc_list(const char *str, const char *guc_var, - const char *guc_name) -{ - bool match = false; - char *guc_copy; - List *guc_list = NIL; - ListCell *lc; - - guc_copy = pstrdup(guc_var); - if (!SplitGUCList(guc_copy, ',', &guc_list)) - elog(ERROR, "could not parse %s", guc_name); - - foreach(lc, guc_list) - { - char *guc_str = (char *) lfirst(lc); - - if (strcmp(guc_str, str) == 0) - { - match = true; - break; - } - } - - pfree(guc_copy); - list_free(guc_list); - - return match; -} diff --git a/pg_ivm.h b/pg_ivm.h index c6c8e0e..88d7003 100644 --- a/pg_ivm.h +++ b/pg_ivm.h @@ -34,7 +34,6 @@ extern Oid PgIvmImmvRelationId(void); extern Oid PgIvmImmvPrimaryKeyIndexId(void); extern bool isImmv(Oid immv_oid); extern List *PgIvmFuncName(char *name); -extern void warnIfPgIvmNotPreloaded(void); /* createas.c */ diff --git a/sql/preload_libraries_warning.sql b/sql/preload_libraries_warning.sql index e42aa2b..5d93534 100644 --- a/sql/preload_libraries_warning.sql +++ b/sql/preload_libraries_warning.sql @@ -25,27 +25,4 @@ ALTER EXTENSION pg_ivm UPDATE; -- expect success DROP EXTENSION pg_ivm; CREATE EXTENSION pg_ivm; -- expect success --- Verify that the warning is emitted when each SQL function is called. -ALTER SYSTEM RESET session_preload_libraries; -SELECT pg_reload_conf(); -\c - - -CREATE TABLE mytab (i int primary key, a text); -SELECT pgivm.create_immv('myview', 'SELECT i, reverse(a) FROM mytab'); -SELECT pgivm.refresh_immv('myview', true); -SELECT pgivm.get_immv_def('myview'); - --- Verify that the warning is emitted by the maintenance triggers. -INSERT INTO mytab VALUES (1, 'asdf'); - --- Verify that the warning is not emitted after pg_ivm is added to --- session_preload_libraries. -ALTER SYSTEM SET session_preload_libraries = pg_ivm; -SELECT pg_reload_conf(); -\c - - -SELECT pgivm.create_immv('myview2', 'SELECT i, reverse(a) FROM mytab'); -SELECT pgivm.refresh_immv('myview2', true); -SELECT pgivm.get_immv_def('myview2'); -INSERT INTO mytab VALUES (2, 'qwer'); - +DROP EXTENSION pg_ivm CASCADE; From ac2bff13f7de591a2ad4316cece11a686d78afe6 Mon Sep 17 00:00:00 2001 From: Adam Guo Date: Mon, 17 Mar 2025 21:30:52 +0000 Subject: [PATCH 9/9] Remove unused header --- pg_ivm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/pg_ivm.c b/pg_ivm.c index 0a21544..19d0e0e 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -21,7 +21,6 @@ #include "catalog/pg_namespace_d.h" #include "catalog/pg_trigger_d.h" #include "commands/trigger.h" -#include "miscadmin.h" #include "parser/analyze.h" #include "parser/parser.h" #include "parser/scansup.h"