aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/index.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index a0898e00488..53b4c3c59bf 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1741,9 +1741,14 @@ index_build(Relation heapRelation,
Assert(PointerIsValid(stats));
/*
- * If this is an unlogged index, we need to write out an init fork for it.
- */
- if (heapRelation->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
+ * If this is an unlogged index, we may need to write out an init fork for
+ * it -- but we must first check whether one already exists. If, for
+ * example, an unlogged relation is truncated in the transaction that
+ * created it, or truncated twice in a subsequent transaction, the
+ * relfilenode won't change, and nothing needs to be done here.
+ */
+ if (heapRelation->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED
+ && !smgrexists(indexRelation->rd_smgr, INIT_FORKNUM))
{
RegProcedure ambuildempty = indexRelation->rd_am->ambuildempty;