From bd6776c7ff23c0fba7b1abc51713975e640a3830 Mon Sep 17 00:00:00 2001 From: Takuma Hoshiai Date: Sun, 18 Sep 2022 06:14:19 +0900 Subject: [PATCH] fix an irregular case of get_immv_def() Add test case, when an argument of immvrelid is not IMMV oids. --- expected/pg_ivm.out | 18 ++++++++++++++++++ pg_ivm.c | 10 +++++++++- sql/pg_ivm.sql | 5 +++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/expected/pg_ivm.out b/expected/pg_ivm.out index 46bffdd..ba0a3b0 100644 --- a/expected/pg_ivm.out +++ b/expected/pg_ivm.out @@ -1043,6 +1043,24 @@ DELETE FROM mv_ivm_1; ERROR: cannot change materialized view "mv_ivm_1" TRUNCATE mv_ivm_1; ERROR: cannot change materialized view "mv_ivm_1" +-- get_immv_def function +SELECT immvrelid, get_immv_def(immvrelid) FROM pg_ivm_immv ORDER BY 1; + immvrelid | get_immv_def +-----------+---------------------------------- + mv_ivm_1 | SELECT a.i, + + | a.j, + + | b.k + + | FROM (mv_base_a a + + | JOIN mv_base_b b USING (i)) +(1 row) + +-- mv_base_b is not immv +SELECT 'mv_base_b'::regclass, get_immv_def('mv_base_b'); + regclass | get_immv_def +-----------+-------------- + mv_base_b | +(1 row) + DROP TABLE mv_base_b CASCADE; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table mv_ivm_1 diff --git a/pg_ivm.c b/pg_ivm.c index dc7e8fc..29b567b 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -330,12 +330,20 @@ get_immv_def(PG_FUNCTION_ARGS) { Oid matviewOid = PG_GETARG_OID(0); Relation matviewRel = NULL; - char * querystring = NULL; + Query *query = NULL; + char *querystring = NULL; matviewRel = table_open(matviewOid, AccessShareLock); /* Make sure IMMV is a table. */ Assert(matviewRel->rd_rel->relkind == RELKIND_RELATION); + query = get_immv_query(matviewRel); + if (query == NULL) + { + table_close(matviewRel, NoLock); + PG_RETURN_TEXT_P(cstring_to_text("")); + } + querystring = pg_ivm_get_querydef(get_immv_query(matviewRel), false); table_close(matviewRel, NoLock); diff --git a/sql/pg_ivm.sql b/sql/pg_ivm.sql index 32dfe14..6c6a9f4 100644 --- a/sql/pg_ivm.sql +++ b/sql/pg_ivm.sql @@ -460,5 +460,10 @@ UPDATE mv_ivm_1 SET k = 1 WHERE i = 1; DELETE FROM mv_ivm_1; TRUNCATE mv_ivm_1; +-- get_immv_def function +SELECT immvrelid, get_immv_def(immvrelid) FROM pg_ivm_immv ORDER BY 1; +-- mv_base_b is not immv +SELECT 'mv_base_b'::regclass, get_immv_def('mv_base_b'); + DROP TABLE mv_base_b CASCADE; DROP TABLE mv_base_a CASCADE;