summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas2008-07-01 10:33:09 +0000
committerHeikki Linnakangas2008-07-01 10:33:09 +0000
commit91bc8b45cffe6db4aa6a9bd4b2f9d1d9e52b4bb7 (patch)
tree2306b486f10723da044a78f60e57c00e8b2d07d2
parent121ee4c6a71e271c9e3c6cd26666ce7107bb1e1b (diff)
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
-rw-r--r--src/backend/commands/analyze.c35
-rw-r--r--src/include/commands/vacuum.h12
2 files changed, 43 insertions, 4 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 1b2945ebd4..0331f73533 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -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++;
}
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 05ba32cb83..535f81b4ab 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -94,6 +94,18 @@ typedef struct VacAttrStats
Datum *stavalues[STATISTIC_NUM_SLOTS];
/*
+ * These fields describe the stavalues[n] element types. They will
+ * be initialized to be the same as the column's that's underlying the
+ * slot, but a custom typanalyze function might want to store an array of
+ * something other than the analyzed column's elements. It should then
+ * overwrite these fields.
+ */
+ Oid statypid[STATISTIC_NUM_SLOTS];
+ int2 statyplen[STATISTIC_NUM_SLOTS];
+ bool statypbyval[STATISTIC_NUM_SLOTS];
+ char statypalign[STATISTIC_NUM_SLOTS];
+
+ /*
* These fields are private to the main ANALYZE code and should not be
* looked at by type-specific functions.
*/