diff options
author | Kevin Grittner <kgrittn@postgresql.org> | 2013-04-09 13:02:49 -0500 |
---|---|---|
committer | Kevin Grittner <kgrittn@postgresql.org> | 2013-04-09 13:02:49 -0500 |
commit | 52e6e33ab495cb2b0e694ee480ba7c6394315053 (patch) | |
tree | cf957e2ae91863e97b46f4692f09a339b5cf696f /src/backend/commands/cluster.c | |
parent | 0bf42a5f3b62cde41cb366d3442585429c6d9c50 (diff) | |
download | postgresql-52e6e33ab495cb2b0e694ee480ba7c6394315053.tar.gz postgresql-52e6e33ab495cb2b0e694ee480ba7c6394315053.zip |
Create a distinction between a populated matview and a scannable one.
The intent was that being populated would, long term, be just one
of the conditions which could affect whether a matview was
scannable; being populated should be necessary but not always
sufficient to scan the relation. Since only CREATE and REFRESH
currently determine the scannability, names and comments
accidentally conflated these concepts, leading to confusion.
Also add missing locking for the SQL function which allows a
test for scannability, and fix a modularity violatiion.
Per complaints from Tom Lane, although its not clear that these
will satisfy his concerns. Hopefully this will at least better
frame the discussion.
Diffstat (limited to 'src/backend/commands/cluster.c')
-rw-r--r-- | src/backend/commands/cluster.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index ef9c5f1adc7..ed62246cc52 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -381,13 +381,14 @@ cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose, check_index_is_clusterable(OldHeap, indexOid, recheck, AccessExclusiveLock); /* - * Quietly ignore the request if the a materialized view is not scannable. - * No harm is done because there is nothing no data to deal with, and we - * don't want to throw an error if this is part of a multi-relation - * request -- for example, CLUSTER was run on the entire database. + * Quietly ignore the request if this is a materialized view which has not + * been populated from its query. No harm is done because there is no data + * to deal with, and we don't want to throw an error if this is part of a + * multi-relation request -- for example, CLUSTER was run on the entire + * database. */ if (OldHeap->rd_rel->relkind == RELKIND_MATVIEW && - !OldHeap->rd_isscannable) + !OldHeap->rd_ispopulated) { relation_close(OldHeap, AccessExclusiveLock); return; @@ -923,7 +924,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, if (OldHeap->rd_rel->relkind == RELKIND_MATVIEW) /* Make sure the heap looks good even if no rows are written. */ - SetRelationIsScannable(NewHeap); + SetMatViewToPopulated(NewHeap); /* * Scan through the OldHeap, either in OldIndex order or sequentially; |