aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2008-07-01 10:33:09 +0000
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2008-07-01 10:33:09 +0000
commit3ccb2c590ca5eb3d718170f6cb6cbc8b4b879a59 (patch)
treebe7318dad91538acbb5bdc81176d39b366859175 /src/backend
parentbaaad2330b13e5be886edad6d01e7866feb7ea9c (diff)
downloadpostgresql-3ccb2c590ca5eb3d718170f6cb6cbc8b4b879a59.tar.gz
postgresql-3ccb2c590ca5eb3d718170f6cb6cbc8b4b879a59.zip
Extend VacAttrStats to allow typanalyze functions to store statistic values
of different types than the underlying column. The capability isn't yet used for anything, but will be required by upcoming patch to analyze tsvector columns. Jan Urbanski
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/analyze.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index fb6f528386a..4845e6a3815 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.122 2008/06/08 22:00:47 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.123 2008/07/01 10:33:09 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -684,6 +684,7 @@ examine_attribute(Relation onerel, int attnum)
Form_pg_attribute attr = onerel->rd_att->attrs[attnum - 1];
HeapTuple typtuple;
VacAttrStats *stats;
+ int i;
bool ok;
/* Never analyze dropped columns */
@@ -712,6 +713,20 @@ examine_attribute(Relation onerel, int attnum)
stats->tupattnum = attnum;
/*
+ * The fields describing the stats->stavalues[n] element types default
+ * to the type of the field being analyzed, but the type-specific
+ * typanalyze function can change them if it wants to store something
+ * else.
+ */
+ for (i = 0; i < STATISTIC_NUM_SLOTS; i++)
+ {
+ stats->statypid[i] = stats->attr->atttypid;
+ stats->statyplen[i] = stats->attrtype->typlen;
+ stats->statypbyval[i] = stats->attrtype->typbyval;
+ stats->statypalign[i] = stats->attrtype->typalign;
+ }
+
+ /*
* Call the type-specific typanalyze function. If none is specified, use
* std_typanalyze().
*/
@@ -1322,10 +1337,10 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
arry = construct_array(stats->stavalues[k],
stats->numvalues[k],
- stats->attr->atttypid,
- stats->attrtype->typlen,
- stats->attrtype->typbyval,
- stats->attrtype->typalign);
+ stats->statypid[k],
+ stats->statyplen[k],
+ stats->statypbyval[k],
+ stats->statypalign[k]);
values[i++] = PointerGetDatum(arry); /* stavaluesN */
}
else
@@ -1855,6 +1870,10 @@ compute_minimal_stats(VacAttrStatsP stats,
stats->numnumbers[0] = num_mcv;
stats->stavalues[0] = mcv_values;
stats->numvalues[0] = num_mcv;
+ /*
+ * Accept the defaults for stats->statypid and others.
+ * They have been set before we were called (see vacuum.h)
+ */
}
}
else if (null_cnt > 0)
@@ -2198,6 +2217,10 @@ compute_scalar_stats(VacAttrStatsP stats,
stats->numnumbers[slot_idx] = num_mcv;
stats->stavalues[slot_idx] = mcv_values;
stats->numvalues[slot_idx] = num_mcv;
+ /*
+ * Accept the defaults for stats->statypid and others.
+ * They have been set before we were called (see vacuum.h)
+ */
slot_idx++;
}
@@ -2282,6 +2305,10 @@ compute_scalar_stats(VacAttrStatsP stats,
stats->staop[slot_idx] = mystats->ltopr;
stats->stavalues[slot_idx] = hist_values;
stats->numvalues[slot_idx] = num_hist;
+ /*
+ * Accept the defaults for stats->statypid and others.
+ * They have been set before we were called (see vacuum.h)
+ */
slot_idx++;
}