diff options
| author | Tom Lane | 2003-03-23 05:14:37 +0000 |
|---|---|---|
| committer | Tom Lane | 2003-03-23 05:14:37 +0000 |
| commit | 8d9e025e7fcc68737d5a0e99b457417ed595af46 (patch) | |
| tree | feca4424957b7784e94428b5ed938454a4c71fdf /src/backend | |
| parent | efeffae2457c69802eed7e4c45c1c3c97528a6fe (diff) | |
Instead of storing pg_statistic stavalues entries as text strings, store
them as arrays of the internal datatype. This requires treating the
stavalues columns as 'anyarray' rather than 'text[]', which is not 100%
kosher but seems to work fine for the purposes we need for pg_statistic.
Perhaps in the future 'anyarray' will be allowed more generally.
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/catalog/heap.c | 10 | ||||
| -rw-r--r-- | src/backend/commands/analyze.c | 36 | ||||
| -rw-r--r-- | src/backend/utils/adt/selfuncs.c | 7 | ||||
| -rw-r--r-- | src/backend/utils/cache/lsyscache.c | 58 |
4 files changed, 41 insertions, 70 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 105026a50e9..802f5932f73 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.240 2003/03/20 03:34:55 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.241 2003/03/23 05:14:36 tgl Exp $ * * * INTERFACE ROUTINES @@ -421,8 +421,12 @@ CheckAttributeType(const char *attname, Oid atttypid) "\n\tProceeding with relation creation anyway", attname); else if (att_typtype == 'p') - elog(ERROR, "Attribute \"%s\" has pseudo-type %s", - attname, format_type_be(atttypid)); + { + /* Special hack for pg_statistic: allow ANYARRAY during initdb */ + if (atttypid != ANYARRAYOID || IsUnderPostmaster) + elog(ERROR, "Attribute \"%s\" has pseudo-type %s", + attname, format_type_be(atttypid)); + } else if (att_typtype == 'c') { Oid typrelid = get_typ_typrelid(atttypid); diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 2af7a3cd7c3..09862f6d840 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.51 2002/11/29 21:39:10 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.52 2003/03/23 05:14:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1694,7 +1694,6 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats) for (attno = 0; attno < natts; attno++) { VacAttrStats *stats = vacattrstats[attno]; - FmgrInfo out_function; HeapTuple stup, oldtup; int i, @@ -1708,8 +1707,6 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats) if (!stats->stats_valid) continue; - fmgr_info(stats->attrtype->typoutput, &out_function); - /* * Construct a new pg_statistic tuple */ @@ -1758,33 +1755,16 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats) } for (k = 0; k < STATISTIC_NUM_SLOTS; k++) { - int ntxt = stats->numvalues[k]; - - if (ntxt > 0) + if (stats->numvalues[k] > 0) { - Datum *txtdatums = (Datum *) palloc(ntxt * sizeof(Datum)); ArrayType *arry; - for (n = 0; n < ntxt; n++) - { - /* - * Convert data values to a text string to be inserted - * into the text array. - */ - Datum stringdatum; - - stringdatum = - FunctionCall3(&out_function, - stats->stavalues[k][n], - ObjectIdGetDatum(stats->attrtype->typelem), - Int32GetDatum(stats->attr->atttypmod)); - txtdatums[n] = DirectFunctionCall1(textin, stringdatum); - pfree(DatumGetPointer(stringdatum)); - } - /* XXX knows more than it should about type text: */ - arry = construct_array(txtdatums, ntxt, - TEXTOID, - -1, false, 'i'); + 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 diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 208b7eb2908..2a5ceb767f4 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.133 2003/03/23 01:49:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.134 2003/03/23 05:14:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1826,16 +1826,11 @@ mergejoinscansel(Query *root, Node *clause, /* * Now skip any binary-compatible relabeling; there can only be one level * since constant-expression folder eliminates adjacent RelabelTypes. - * - * XXX can't enable this quite yet, it exposes regproc uncertainty problems - * in regression tests. FIXME soon. */ -#if 0 if (IsA(left, RelabelType)) left = (Var *) ((RelabelType *) left)->arg; if (IsA(right, RelabelType)) right = (Var *) ((RelabelType *) right)->arg; -#endif /* Can't do anything if inputs are not Vars */ if (!IsA(left, Var) || diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index abc00a9204e..277793905e0 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.90 2003/02/03 21:15:44 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.91 2003/03/23 05:14:36 tgl Exp $ * * NOTES * Eventually, the index information should go through here, too. @@ -28,6 +28,7 @@ #include "nodes/makefuncs.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/datum.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -1387,8 +1388,7 @@ get_attstatsslot(HeapTuple statstuple, ArrayType *statarray; int narrayelem; HeapTuple typeTuple; - FmgrInfo inputproc; - Oid typelem; + Form_pg_type typeForm; for (i = 0; i < STATISTIC_NUM_SLOTS; i++) { @@ -1408,48 +1408,40 @@ get_attstatsslot(HeapTuple statstuple, elog(ERROR, "get_attstatsslot: stavalues is null"); statarray = DatumGetArrayTypeP(val); - /* - * Do initial examination of the array. This produces a list of - * text Datums --- ie, pointers into the text array value. - */ - deconstruct_array(statarray, - TEXTOID, -1, false, 'i', - values, nvalues); - narrayelem = *nvalues; - - /* - * We now need to replace each text Datum by its internal - * equivalent. - * - * Get the type input proc and typelem for the column datatype. - */ + /* Need to get info about the array element type */ typeTuple = SearchSysCache(TYPEOID, ObjectIdGetDatum(atttype), 0, 0, 0); if (!HeapTupleIsValid(typeTuple)) elog(ERROR, "get_attstatsslot: Cache lookup failed for type %u", atttype); - fmgr_info(((Form_pg_type) GETSTRUCT(typeTuple))->typinput, &inputproc); - typelem = ((Form_pg_type) GETSTRUCT(typeTuple))->typelem; - ReleaseSysCache(typeTuple); + typeForm = (Form_pg_type) GETSTRUCT(typeTuple); + + /* Deconstruct array into Datum elements */ + deconstruct_array(statarray, + atttype, + typeForm->typlen, + typeForm->typbyval, + typeForm->typalign, + values, nvalues); /* - * Do the conversions. The palloc'd array of Datums is reused in - * place. + * If the element type is pass-by-reference, we now have a bunch + * of Datums that are pointers into the syscache value. Copy them + * to avoid problems if syscache decides to drop the entry. */ - for (j = 0; j < narrayelem; j++) + if (!typeForm->typbyval) { - char *strval; - - strval = DatumGetCString(DirectFunctionCall1(textout, - (*values)[j])); - (*values)[j] = FunctionCall3(&inputproc, - CStringGetDatum(strval), - ObjectIdGetDatum(typelem), - Int32GetDatum(atttypmod)); - pfree(strval); + for (j = 0; j < *nvalues; j++) + { + (*values)[j] = datumCopy((*values)[j], + typeForm->typbyval, + typeForm->typlen); + } } + ReleaseSysCache(typeTuple); + /* * Free statarray if it's a detoasted copy. */ |
