diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index a13861e925..4d62a1960f 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -308,7 +308,6 @@ heap_create(const char *relname,
 			TransactionId *relfrozenxid,
 			MultiXactId *relminmxid)
 {
-	bool		create_storage;
 	Relation	rel;
 
 	/* The caller must have provided an OID for the relation. */
@@ -343,19 +342,6 @@ heap_create(const char *relname,
 	if (!RELKIND_HAS_TABLESPACE(relkind))
 		reltablespace = InvalidOid;
 
-	/*
-	 * Decide whether to create storage. If caller passed a valid relfilenode,
-	 * storage is already created, so don't do it here.  Also don't create it
-	 * for relkinds without physical storage.
-	 */
-	if (!RELKIND_HAS_STORAGE(relkind) || OidIsValid(relfilenode))
-		create_storage = false;
-	else
-	{
-		create_storage = true;
-		relfilenode = relid;
-	}
-
 	/*
 	 * Never allow a pg_class entry to explicitly specify the database's
 	 * default tablespace in reltablespace; force it to zero instead. This
@@ -376,7 +362,7 @@ heap_create(const char *relname,
 									 tupDesc,
 									 relid,
 									 accessmtd,
-									 relfilenode,
+									 relfilenode ? relfilenode : relid,
 									 reltablespace,
 									 shared_relation,
 									 mapped_relation,
@@ -384,20 +370,23 @@ heap_create(const char *relname,
 									 relkind);
 
 	/*
-	 * Have the storage manager create the relation's disk file, if needed.
+	 * If caller gave us a valid relfilenode, storage is already created.
+	 * Otherwise, create one now if the relkind requires it.
 	 *
 	 * For tables, the AM callback creates both the main and the init fork.
 	 * For others, only the main fork is created; the other forks will be
 	 * created on demand.
 	 */
-	if (create_storage)
+	if (!OidIsValid(relfilenode))
 	{
-		if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind))
+		if (RELKIND_HAS_TABLE_AM(relkind))
 			table_relation_set_new_filenode(rel, &rel->rd_node,
 											relpersistence,
 											relfrozenxid, relminmxid);
-		else
+		else if (RELKIND_HAS_STORAGE(relkind))
 			RelationCreateStorage(rel->rd_node, relpersistence);
+		else
+			Assert(false);
 	}
 
 	/*
