summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2000-01-04 17:27:26 +0000
committerTom Lane2000-01-04 17:27:26 +0000
commit65806683924e0932a06cab1746bd815f2da8a716 (patch)
tree86889ae9158d7eb5062d8c11f1dc111751799597
parent621e3721895f0f64cdc602306ae5c144fed06938 (diff)
Back-patch fix for problems with oversize pg_statistic tuples when both
the min and max values of a column are long.
-rw-r--r--src/backend/commands/vacuum.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 0ce01efd574..bd315ffeda6 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.110.2.3 1999/08/25 12:01:45 ishii Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.110.2.4 2000/01/04 17:27:26 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2405,10 +2405,21 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
stup = heap_formtuple(sd->rd_att, values, nulls);
/* ----------------
- * insert the tuple in the relation and get the tuple's oid.
+ * Watch out for oversize tuple, which can happen if
+ * both of the saved data values are long.
+ * Our fallback strategy is just to not store the
+ * pg_statistic tuple at all in that case. (We could
+ * replace the values by NULLs and still store the
+ * numeric stats, but presently selfuncs.c couldn't
+ * do anything useful with that case anyway.)
* ----------------
*/
- heap_insert(sd, stup);
+ if (MAXALIGN(stup->t_len) <= MaxTupleSize)
+ {
+ /* OK to store tuple */
+ heap_insert(sd, stup);
+ }
+
pfree(DatumGetPointer(values[3]));
pfree(DatumGetPointer(values[4]));
pfree(stup);