Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/backend/commands/matview.c
Original file line number Diff line number Diff line change
Expand Up @@ -1352,9 +1352,12 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
*
* ExecRefreshMatView() checks that after taking the exclusive lock on the
* matview. So at least one unique index is guaranteed to exist here
* because the lock is still being held; so an Assert seems sufficient.
* because the lock is still being held. (One known exception is if a
* function called as part of refreshing the matview drops the index.
* That's a pretty silly thing to do.)
*/
Assert(foundUniqueIndex);
if (!foundUniqueIndex)
elog(ERROR, "could not find suitable unique index on materialized view");



Expand Down
18 changes: 18 additions & 0 deletions src/test/regress/expected/matview.out
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,24 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo;
REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo;
DROP OWNED BY regress_user_mvtest CASCADE;
DROP ROLE regress_user_mvtest;
-- Concurrent refresh requires a unique index on the materialized
-- view. Test what happens if it's dropped during the refresh.
SET allow_segment_DML = ON;
CREATE OR REPLACE FUNCTION mvtest_drop_the_index()
RETURNS bool AS $$
BEGIN
EXECUTE 'DROP INDEX IF EXISTS mvtest_drop_idx';
RETURN true;
END;
$$ LANGUAGE plpgsql;
CREATE MATERIALIZED VIEW drop_idx_matview AS
SELECT 1 as i WHERE mvtest_drop_the_index();
NOTICE: index "mvtest_drop_idx" does not exist, skipping
CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i);
REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview;
ERROR: could not find suitable unique index on materialized view
DROP MATERIALIZED VIEW drop_idx_matview; -- clean up
RESET allow_segment_DML;
-- make sure that create WITH NO DATA works via SPI
BEGIN;
CREATE FUNCTION mvtest_func()
Expand Down
19 changes: 19 additions & 0 deletions src/test/regress/sql/matview.sql
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,25 @@ REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo;
DROP OWNED BY regress_user_mvtest CASCADE;
DROP ROLE regress_user_mvtest;

-- Concurrent refresh requires a unique index on the materialized
-- view. Test what happens if it's dropped during the refresh.
SET allow_segment_DML = ON;
CREATE OR REPLACE FUNCTION mvtest_drop_the_index()
RETURNS bool AS $$
BEGIN
EXECUTE 'DROP INDEX IF EXISTS mvtest_drop_idx';
RETURN true;
END;
$$ LANGUAGE plpgsql;

CREATE MATERIALIZED VIEW drop_idx_matview AS
SELECT 1 as i WHERE mvtest_drop_the_index();

CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i);
REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview;
DROP MATERIALIZED VIEW drop_idx_matview; -- clean up
RESET allow_segment_DML;

-- make sure that create WITH NO DATA works via SPI
BEGIN;
CREATE FUNCTION mvtest_func()
Expand Down
Loading