extend VacAttrStats to allow stavalues of different types - Mailing list pgsql-patches

From Jan Urbański
Subject extend VacAttrStats to allow stavalues of different types
Date
Msg-id 482CB95B.5060009@students.mimuw.edu.pl
Whole thread Raw
Responses Re: extend VacAttrStats to allow stavalues of different types  (Jan Urbański <j.urbanski@students.mimuw.edu.pl>)
Re: extend VacAttrStats to allow stavalues of different types  ("Heikki Linnakangas" <heikki@enterprisedb.com>)
List pgsql-patches
Following the conclusion here:
http://archives.postgresql.org/pgsql-hackers/2008-05/msg00273.php
here's a patch that extends VacAttrStats to allow typanalyze functions
to store statistic values of different types than the underlying column.

The XXX comment can be taken into consideration or just dropped as
unimportant.

Cheers,
--
Jan Urbanski
GPG key ID: E583D7D2

ouden estin
*** src/backend/commands/analyze.c
--- src/backend/commands/analyze.c    2008-05-15 20:08:27.000000000 +0200
***************
*** 1319,1350 ****
              {
                  ArrayType  *arry;

!                 /*
!                  * XXX horrible hack - we're creating a pg_statistic tuple for
!                  * a tsvector, but need to store an array of cstrings.
!                  *
!                  * Temporary measures...
!                  */
!                 if (stats->stakind[0] == STATISTIC_KIND_MCL)
!                 {
!                     elog(NOTICE, "severly breaking stuff by brute force hackage");
!                     arry = construct_array(stats->stavalues[k],
!                                            stats->numvalues[k],
!                                            CSTRINGOID,
!                                            -2, /* typlen, -2 for cstring, per
!                                                 * comment from pg_type.h */
!                                            false,
!                                            'c');
!                 }
!                 else
!                 {
!                     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
--- 1319,1330 ----
              {
                  ArrayType  *arry;

!                 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
***************
*** 1874,1879 ****
--- 1854,1867 ----
              stats->numnumbers[0] = num_mcv;
              stats->stavalues[0] = mcv_values;
              stats->numvalues[0] = num_mcv;
+             /*
+              * MCV entries have the same element type as the analyzed
+              * attribute.
+              */
+             stats->statypid[0] = stats->attr->atttypid;
+             stats->statyplen[0] = stats->attrtype->typlen;
+             stats->statypbyval[0] = stats->attrtype->typbyval;
+             stats->statypalign[0] = stats->attrtype->typalign;
          }
      }
      else if (null_cnt > 0)
***************
*** 2217,2222 ****
--- 2205,2218 ----
              stats->numnumbers[slot_idx] = num_mcv;
              stats->stavalues[slot_idx] = mcv_values;
              stats->numvalues[slot_idx] = num_mcv;
+             /*
+              * MCV entries have the same element type as the analyzed
+              * attribute.
+              */
+             stats->statypid[slot_idx] = stats->attr->atttypid;
+             stats->statyplen[slot_idx] = stats->attrtype->typlen;
+             stats->statypbyval[slot_idx] = stats->attrtype->typbyval;
+             stats->statypalign[slot_idx] = stats->attrtype->typalign;
              slot_idx++;
          }

***************
*** 2301,2306 ****
--- 2297,2310 ----
              stats->staop[slot_idx] = mystats->ltopr;
              stats->stavalues[slot_idx] = hist_values;
              stats->numvalues[slot_idx] = num_hist;
+             /*
+              * Histogram entries have the same element type as the analyzed
+              * attribute.
+              */
+             stats->statypid[slot_idx] = stats->attr->atttypid;
+             stats->statyplen[slot_idx] = stats->attrtype->typlen;
+             stats->statypbyval[slot_idx] = stats->attrtype->typbyval;
+             stats->statypalign[slot_idx] = stats->attrtype->typalign;
              slot_idx++;
          }

*** src/include/commands/vacuum.h
--- src/include/commands/vacuum.h    2008-05-16 00:11:20.000000000 +0200
***************
*** 94,99 ****
--- 94,119 ----
      Datum       *stavalues[STATISTIC_NUM_SLOTS];

      /*
+      * These fields describe the stavalues[n] element types. They will
+      * typically be the same as the column's that's underlying the slot, but
+      * sometimes a custom typanalyze function might want to store an array of
+      * something other that the analyzed column's elements. This must be filled
+      * in by the compute_stats routine.
+      *
+      * XXX or maybe fall back on attrtype-> stuff when these are NULL? That way
+      * we won't break other people's custom typanalyze functions. Not sure if
+      * any exist, though.
+      *
+      * Another concern is that typlen, typbyval and typalign are reduntant
+      * given the OID. But the caller is in better position to cache this so
+      * maybe we shouldn't worry about it?
+      */
+     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:

Previous
From: Andreas 'ads' Scherbaum
Date:
Subject: Re: create or replace language
Next
From: Gregory Stark
Date:
Subject: Re: Patch to change psql default banner v6