Fix segmentation fault in incorrect view def

A segfault was occurred, if create_immv specify query other than SELECT. A
query syntax checked, but did not check statement type.

issue #37
This commit is contained in:
Takuma Hoshiai 2022-12-15 02:16:02 +09:00
parent e857213281
commit 9ac5a2c42e
3 changed files with 22 additions and 0 deletions

View file

@ -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

View file

@ -197,6 +197,10 @@ create_immv(PG_FUNCTION_ARGS)
parsetree = linitial_node(RawStmt, parsetree_list);
/* view definition should spcify SELECT query */
if (!IsA(parsetree->stmt, SelectStmt))
elog(ERROR, "view definition must specify SELECT statement");
ctas = makeNode(CreateTableAsStmt);
ctas->query = parsetree->stmt;
#if defined(PG_VERSION_NUM) && (PG_VERSION_NUM >= 140000)

View file

@ -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;