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
This commit is contained in:
thoshiai 2022-12-15 19:03:49 +09:00 committed by GitHub
parent e857213281
commit 59081de628
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 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,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)

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;