Extend VacAttrStats to allow typanalyze functions to store statistic values
authorHeikki Linnakangas <heikki@enterprisedb.com>
Tue, 1 Jul 2008 10:33:09 +0000 (10:33 +0000)
committerHeikki Linnakangas <heikki@enterprisedb.com>
Tue, 1 Jul 2008 10:33:09 +0000 (10:33 +0000)
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

src/backend/commands/analyze.c
src/include/commands/vacuum.h

index 1b2945ebd47cc2729b7f9fe7aaf38c4b180db531..0331f73533835978652d0f360a50a80257ee1695 100644 (file)
@@ -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 */
@@ -711,6 +712,20 @@ examine_attribute(Relation onerel, int attnum)
        stats->anl_context = anl_context;
        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++;
                }
 
index 05ba32cb830fa7e014ab69fb70e30bb4f74b6740..535f81b4ab001fe136fd1adf35dea18985deeefb 100644 (file)
@@ -93,6 +93,18 @@ typedef struct VacAttrStats
        int                     numvalues[STATISTIC_NUM_SLOTS];
        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.