From 59081de6280e7d49e206ce9d4d5728869e17e8d2 Mon Sep 17 00:00:00 2001 From: thoshiai <45982834+thoshiai@users.noreply.github.com> Date: Thu, 15 Dec 2022 19:03:49 +0900 Subject: [PATCH] Fix segmentation fault in incorrect view def (#39) A segfault was occurred when non-SELECT query was specified in create_immv since the statement type was not checked. issue #37 --- expected/create_immv.out | 11 +++++++++++ pg_ivm.c | 6 ++++++ sql/create_immv.sql | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/expected/create_immv.out b/expected/create_immv.out index 22e0e18..da9f95d 100644 --- a/expected/create_immv.out +++ b/expected/create_immv.out @@ -31,6 +31,17 @@ SELECT create_immv('mv_in_immv01', 'SELECT i FROM mv'); ERROR: including IMMV in definition is not supported on incrementally maintainable materialized view SELECT create_immv('mv_in_immv02', 'SELECT t.i FROM t INNER JOIN mv2 ON t.i = mv2.x'); ERROR: including IMMV in definition is not supported on incrementally maintainable materialized view +-- SQL other than SELECT +SELECT create_immv('mv_in_create', 'CREATE TABLE in_create(i int)'); +ERROR: view definition must specify SELECT statement +SELECT create_immv('mv_in_insert', 'INSERT INTO t VALUES(10)'); +ERROR: view definition must specify SELECT statement +SELECT create_immv('mv_in_update', 'UPDATE t SET i = 10'); +ERROR: view definition must specify SELECT statement +SELECT create_immv('mv_in_delete', 'DELETE FROM t'); +ERROR: view definition must specify SELECT statement +SELECT create_immv('mv_in_drop', 'DROP TABLE t'); +ERROR: view definition must specify SELECT statement DROP TABLE t; ERROR: cannot drop table t because other objects depend on it DETAIL: table mv depends on table t diff --git a/pg_ivm.c b/pg_ivm.c index b61967d..02c96a6 100644 --- a/pg_ivm.c +++ b/pg_ivm.c @@ -197,6 +197,12 @@ create_immv(PG_FUNCTION_ARGS) parsetree = linitial_node(RawStmt, parsetree_list); + /* view definition should spcify SELECT query */ + if (!IsA(parsetree->stmt, SelectStmt)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("view definition must specify SELECT statement"))); + ctas = makeNode(CreateTableAsStmt); ctas->query = parsetree->stmt; #if defined(PG_VERSION_NUM) && (PG_VERSION_NUM >= 140000) diff --git a/sql/create_immv.sql b/sql/create_immv.sql index 8d1602e..c8d3415 100644 --- a/sql/create_immv.sql +++ b/sql/create_immv.sql @@ -12,6 +12,13 @@ SELECT immvrelid, get_immv_def(immvrelid) FROM pg_ivm_immv ORDER BY 1; SELECT create_immv('mv_in_immv01', 'SELECT i FROM mv'); SELECT create_immv('mv_in_immv02', 'SELECT t.i FROM t INNER JOIN mv2 ON t.i = mv2.x'); +-- SQL other than SELECT +SELECT create_immv('mv_in_create', 'CREATE TABLE in_create(i int)'); +SELECT create_immv('mv_in_insert', 'INSERT INTO t VALUES(10)'); +SELECT create_immv('mv_in_update', 'UPDATE t SET i = 10'); +SELECT create_immv('mv_in_delete', 'DELETE FROM t'); +SELECT create_immv('mv_in_drop', 'DROP TABLE t'); + DROP TABLE t; DROP TABLE mv;