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.
         */
-- 
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

Reply via email to