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:
parent
e857213281
commit
59081de628
3 changed files with 24 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
6
pg_ivm.c
6
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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue