Re: extend VacAttrStats to allow stavalues of different types - Mailing list pgsql-patches
| From | Jan Urbański |
|---|---|
| Subject | Re: extend VacAttrStats to allow stavalues of different types |
| Date | |
| Msg-id | 484418B8.6060004@students.mimuw.edu.pl Whole thread Raw |
| In response to | Re: extend VacAttrStats to allow stavalues of different types (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: extend VacAttrStats to allow stavalues of different types
|
| List | pgsql-patches |
Tom Lane wrote:
> I think the correct solution is to initialize the fields to match the
> column type before calling the typanalyze function. Then you don't
> break compatibility for existing typanalyze functions. It's also less
> code, since the standard typanalyze functions can rely on those preset
> values.
Right. Updated patch attached.
--
Jan Urbanski
GPG key ID: E583D7D2
ouden estin
*** src/backend/commands/analyze.c
--- /tmp/.diff_sIxSwv 2008-06-02 17:55:58.000000000 +0200
***************
*** 683,688 ****
--- 683,689 ----
Form_pg_attribute attr = onerel->rd_att->attrs[attnum - 1];
HeapTuple typtuple;
VacAttrStats *stats;
+ int i;
bool ok;
/* Never analyze dropped columns */
***************
*** 711,716 ****
--- 712,730 ----
stats->tupattnum = attnum;
/*
+ * Initialize fields describing the stats->stavalues[n] element types, so
+ * the typanalyze function will have some defaults in case it neglects to
+ * set them itself.
+ */
+ 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().
*/
***************
*** 1321,1330 ****
arry = construct_array(stats->stavalues[k],
stats->numvalues[k],
! stats->attr->atttypid,
! stats->attrtype->typlen,
! stats->attrtype->typbyval,
! stats->attrtype->typalign);
values[i++] = PointerGetDatum(arry); /* stavaluesN */
}
else
--- 1335,1344 ----
arry = construct_array(stats->stavalues[k],
stats->numvalues[k],
! stats->statypid[k],
! stats->statyplen[k],
! stats->statypbyval[k],
! stats->statypalign[k]);
values[i++] = PointerGetDatum(arry); /* stavaluesN */
}
else
***************
*** 1854,1859 ****
--- 1868,1877 ----
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)
***************
*** 2197,2202 ****
--- 2215,2224 ----
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++;
}
***************
*** 2281,2286 ****
--- 2303,2312 ----
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++;
}
*** src/include/commands/vacuum.h
--- /tmp/.diff_YRgK4O 2008-06-02 17:55:58.000000000 +0200
***************
*** 94,99 ****
--- 94,111 ----
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 that 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.
*/
pgsql-patches by date: