improve_commit_with_OCDR_v2.patch
application/octet-stream
Filename: improve_commit_with_OCDR_v2.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/access/heap/heapam.c | 8 | 0 |
| src/backend/commands/tablecmds.c | 12 | 2 |
| src/include/utils/rel.h | 2 | 0 |
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index b19d1cf..319d6cd 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -2056,6 +2056,14 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
heap_freetuple(heaptup);
}
+ /*
+ * We want to identify TEMP tables that have had any rows inserted into them
+ * in this transaction, so that at the end of transaction we can skip
+ * truncating those TEMP tables that have no rows.
+ */
+ if (RelationUsesLocalBuffers(relation))
+ relation->rd_rows_inserted = true;
+
return HeapTupleGetOid(tup);
}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index cad8311..ad30c55 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -10118,8 +10118,18 @@ PreCommit_on_commit_actions(void)
/* Do nothing (there shouldn't be such entries, actually) */
break;
case ONCOMMIT_DELETE_ROWS:
- oids_to_truncate = lappend_oid(oids_to_truncate, oc->relid);
- break;
+ {
+ Relation rel = heap_open(oc->relid, AccessShareLock);
+
+ if (rel->rd_rows_inserted)
+ {
+ rel->rd_rows_inserted = false;
+ oids_to_truncate = lappend_oid(oids_to_truncate, oc->relid);
+ }
+
+ heap_close(rel, AccessShareLock);
+ break;
+ }
case ONCOMMIT_DROP:
{
ObjectAddress object;
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index bde5f17..4bc0600 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -174,6 +174,8 @@ typedef struct RelationData
*/
Oid rd_toastoid; /* Real TOAST table's OID, or InvalidOid */
+ bool rd_rows_inserted;/* Did we insert any rows into this relation */
+
/* use "struct" here to avoid needing to include pgstat.h: */
struct PgStat_TableStatus *pgstat_info; /* statistics collection area */
} RelationData;