20141015_analyze_transactional.patch
text/x-diff
Filename: 20141015_analyze_transactional.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/analyze.c | 4 | 2 |
| src/backend/commands/vacuum.c | 15 | 3 |
| src/backend/commands/vacuumlazy.c | 4 | 2 |
| src/include/commands/vacuum.h | 2 | 1 |
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index c09ca7e..f1e447d 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -584,7 +584,8 @@ do_analyze_rel(Relation onerel, VacuumStmt *vacstmt,
visibilitymap_count(onerel),
hasindex,
InvalidTransactionId,
- InvalidMultiXactId);
+ InvalidMultiXactId,
+ !(vacstmt->options & VACOPT_VACUUM));
/*
* Same for indexes. Vacuum always scans all indexes, so if we're part of
@@ -605,7 +606,8 @@ do_analyze_rel(Relation onerel, VacuumStmt *vacstmt,
0,
false,
InvalidTransactionId,
- InvalidMultiXactId);
+ InvalidMultiXactId,
+ !(vacstmt->options & VACOPT_VACUUM));
}
}
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e5fefa3..6f05a74 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -672,7 +672,7 @@ vac_update_relstats(Relation relation,
BlockNumber num_pages, double num_tuples,
BlockNumber num_all_visible_pages,
bool hasindex, TransactionId frozenxid,
- MultiXactId minmulti)
+ MultiXactId minmulti, bool is_vacuum)
{
Oid relid = RelationGetRelid(relation);
Relation rd;
@@ -768,9 +768,21 @@ vac_update_relstats(Relation relation,
dirty = true;
}
- /* If anything changed, write out the tuple. */
+ /*
+ * If anything changed, write out the tuple. For ANALYZE, this change
+ * needs to be transactional as this query can be run in a transaction
+ * block.
+ */
if (dirty)
- heap_inplace_update(rd, ctup);
+ {
+ if (is_vacuum)
+ {
+ simple_heap_update(rd, &ctup->t_self, ctup);
+ CatalogUpdateIndexes(rd, ctup);
+ }
+ else
+ heap_inplace_update(rd, ctup);
+ }
heap_close(rd, RowExclusiveLock);
}
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index 5d6d031..3778d9d 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -309,7 +309,8 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
new_rel_allvisible,
vacrelstats->hasindex,
new_frozen_xid,
- new_min_multi);
+ new_min_multi,
+ false);
/* report results to the stats collector, too */
new_live_tuples = new_rel_tuples - vacrelstats->new_dead_tuples;
@@ -1377,7 +1378,8 @@ lazy_cleanup_index(Relation indrel,
0,
false,
InvalidTransactionId,
- InvalidMultiXactId);
+ InvalidMultiXactId,
+ false);
ereport(elevel,
(errmsg("index \"%s\" now contains %.0f row versions in %u pages",
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index d33552a..9781926 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -156,7 +156,8 @@ extern void vac_update_relstats(Relation relation,
BlockNumber num_all_visible_pages,
bool hasindex,
TransactionId frozenxid,
- MultiXactId minmulti);
+ MultiXactId minmulti,
+ bool is_vacuum);
extern void vacuum_set_xid_limits(Relation rel,
int freeze_min_age, int freeze_table_age,
int multixact_freeze_min_age,