From d5bfa72a4afda36bbb7cb3991ab18013ebace5f1 Mon Sep 17 00:00:00 2001 From: thoshiai Date: Tue, 8 Aug 2023 17:32:16 +0900 Subject: [PATCH] Add restriction of SubLink in pg_ivm sublink in targetlist is not supported, so add this restrict and testcase. --- createas.c | 6 ++++++ expected/pg_ivm.out | 3 +++ sql/pg_ivm.sql | 1 + 3 files changed, 10 insertions(+) diff --git a/createas.c b/createas.c index d17285a..5b50293 100644 --- a/createas.c +++ b/createas.c @@ -968,6 +968,12 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context) case T_TargetEntry: { TargetEntry *tle = (TargetEntry *)node; + if (IsA(tle->expr, SubLink)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("this query is not allowed on incrementally maintainable materialized view"), + errhint("sublink only supports subquery with EXISTS clause in WHERE clause"))); + if (isIvmName(tle->resname)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), diff --git a/expected/pg_ivm.out b/expected/pg_ivm.out index 8936b7f..b7990a4 100644 --- a/expected/pg_ivm.out +++ b/expected/pg_ivm.out @@ -845,6 +845,9 @@ ERROR: this query is not allowed on incrementally maintainable materialized vie HINT: OR or NOT conditions and EXISTS condition are not used together SELECT create_immv('mv_ivm_subquery', 'SELECT a.j FROM mv_base_a a WHERE EXISTS(SELECT 1 FROM mv_base_a a2 WHERE EXISTS(SELECT 1 FROM mv_base_b b WHERE a2.i = b.i))'); ERROR: nested sublink is not supported on incrementally maintainable materialized view +SELECT create_immv('mv_ivm_subquery', 'SELECT EXISTS(SELECT 1 from mv_base_b) FROM mv_base_a a'); +ERROR: this query is not allowed on incrementally maintainable materialized view +HINT: sublink only supports subquery with EXISTS clause in WHERE clause -- support join subquery in FROM clause BEGIN; SELECT create_immv('mv_ivm_join_subquery', 'SELECT i, j, k FROM ( SELECT i, a.j, b.k FROM mv_base_b b INNER JOIN mv_base_a a USING(i)) tmp'); diff --git a/sql/pg_ivm.sql b/sql/pg_ivm.sql index 186efb3..80f0c88 100644 --- a/sql/pg_ivm.sql +++ b/sql/pg_ivm.sql @@ -271,6 +271,7 @@ SELECT create_immv('mv_ivm_subquery', 'SELECT * FROM generate_series(1, (SELECT SELECT create_immv('mv_ivm_subquery', 'SELECT a.j FROM mv_base_a a WHERE EXISTS(SELECT 1 FROM mv_base_b b WHERE a.i = b.i)'); SELECT create_immv('mv_ivm_subquery', 'SELECT a.i,a.j FROM mv_base_a a WHERE EXISTS(SELECT 1 FROM mv_base_b b WHERE a.i = b.i) OR a.i > 2'); SELECT create_immv('mv_ivm_subquery', 'SELECT a.j FROM mv_base_a a WHERE EXISTS(SELECT 1 FROM mv_base_a a2 WHERE EXISTS(SELECT 1 FROM mv_base_b b WHERE a2.i = b.i))'); +SELECT create_immv('mv_ivm_subquery', 'SELECT EXISTS(SELECT 1 from mv_base_b) FROM mv_base_a a'); -- support join subquery in FROM clause BEGIN;