From 1079564979dc2fecfadaddd6808ea2343a782ba6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 23 Mar 2009 16:36:27 +0000 Subject: [PATCH] Const-ify the parse table passed to fillRelOptions. The previous coding meant it had to be built on-the-fly at each entry to default_reloptions. --- src/backend/access/common/reloptions.c | 27 +++++++++++++------------- src/include/access/reloptions.h | 21 ++++++++++---------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 0060be6a02..b926689c5c 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.22 2009/02/28 00:10:51 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.23 2009/03/23 16:36:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -175,7 +175,7 @@ static relopt_real realRelOpts[] = { { NULL } } }; -static relopt_string stringRelOpts[] = +static relopt_string stringRelOpts[] = { /* list terminator */ { { NULL } } @@ -739,7 +739,7 @@ extractRelOptions(HeapTuple tuple, TupleDesc tupdesc, Oid amoptions) options = NULL; /* keep compiler quiet */ break; } - + return options; } @@ -972,16 +972,17 @@ allocateReloptStruct(Size base, relopt_value *options, int numoptions) * struct (previously allocated with allocateReloptStruct) with the parsed * values. * - * rdopts is the pointer to the allocated struct to be filled; basesize is - * the sizeof(struct) that was passed to allocateReloptStruct. options and - * numoptions are parseRelOptions' output. elems and numelems is the array - * of elements to be parsed. Note that when validate is true, it is expected - * that all options are also in elems. + * rdopts is the pointer to the allocated struct to be filled. + * basesize is the sizeof(struct) that was passed to allocateReloptStruct. + * options, of length numoptions, is parseRelOptions' output. + * elems, of length numelems, is the table describing the allowed options. + * When validate is true, it is expected that all options appear in elems. */ void -fillRelOptions(void *rdopts, Size basesize, relopt_value *options, - int numoptions, bool validate, relopt_parse_elt *elems, - int numelems) +fillRelOptions(void *rdopts, Size basesize, + relopt_value *options, int numoptions, + bool validate, + const relopt_parse_elt *elems, int numelems) { int i; int offset = basesize; @@ -1044,7 +1045,7 @@ fillRelOptions(void *rdopts, Size basesize, relopt_value *options, } } if (validate && !found) - elog(ERROR, "storate parameter \"%s\" not found in parse table", + elog(ERROR, "reloption \"%s\" not found in parse table", options[i].gen->name); } SET_VARSIZE(rdopts, offset); @@ -1061,7 +1062,7 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind) relopt_value *options; StdRdOptions *rdopts; int numoptions; - relopt_parse_elt tab[] = { + static const relopt_parse_elt tab[] = { {"fillfactor", RELOPT_TYPE_INT, offsetof(StdRdOptions, fillfactor)}, {"autovacuum_enabled", RELOPT_TYPE_BOOL, offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, enabled)}, diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 7c02f3b12b..b40d95a0fb 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/reloptions.h,v 1.12 2009/02/02 19:31:39 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/access/reloptions.h,v 1.13 2009/03/23 16:36:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -106,12 +106,12 @@ typedef struct relopt_string char default_val[1]; /* variable length, zero-terminated */ } relopt_string; -/* This is the input type for fillRelOptions */ +/* This is the table datatype for fillRelOptions */ typedef struct { - char *optname; - relopt_type opttype; - int offset; + const char *optname; /* option's name */ + relopt_type opttype; /* option's datatype */ + int offset; /* offset of field in result struct */ } relopt_parse_elt; @@ -149,8 +149,8 @@ typedef struct * } * * Note that this is more or less the same that fillRelOptions does, so only - * use this if you need to do something non-standard within some options' - * block. + * use this if you need to do something non-standard within some option's + * code block. */ #define HAVE_RELOPTION(optname, option) \ (pg_strncasecmp(option.gen->name, optname, option.gen->namelen + 1) == 0) @@ -252,9 +252,10 @@ extern relopt_value *parseRelOptions(Datum options, bool validate, relopt_kind kind, int *numrelopts); extern void *allocateReloptStruct(Size base, relopt_value *options, int numoptions); -extern void fillRelOptions(void *rdopts, Size basesize, relopt_value *options, - int numoptions, bool validate, relopt_parse_elt *elems, - int nelems); +extern void fillRelOptions(void *rdopts, Size basesize, + relopt_value *options, int numoptions, + bool validate, + const relopt_parse_elt *elems, int nelems); extern bytea *default_reloptions(Datum reloptions, bool validate, relopt_kind kind);