diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-07-22 17:00:23 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-07-22 17:00:23 +0000 |
commit | 846c364dd4eab27e95ad01cf3a699aedea3ebe0c (patch) | |
tree | 6ddbdec2c12221fa1354512fe6212e7b6122ee4d /src/backend/utils/misc/guc.c | |
parent | ea382424eec3c7cbb0b3cda8f650e9b88669893a (diff) | |
download | postgresql-846c364dd4eab27e95ad01cf3a699aedea3ebe0c.tar.gz postgresql-846c364dd4eab27e95ad01cf3a699aedea3ebe0c.zip |
Change do_tup_output() to take Datum/isnull arrays instead of a char * array,
so it doesn't go through BuildTupleFromCStrings. This is more or less a
wash for current uses, but will avoid inefficiency for planned changes to
EXPLAIN.
Robert Haas
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r-- | src/backend/utils/misc/guc.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index f3b42da99b1..76d3ec9da65 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.508 2009/07/16 20:55:44 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.509 2009/07/22 17:00:23 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -5986,7 +5986,8 @@ ShowAllGUCConfig(DestReceiver *dest) int i; TupOutputState *tstate; TupleDesc tupdesc; - char *values[3]; + Datum values[3]; + bool isnull[3] = { false, false, false }; /* need a tuple descriptor representing three TEXT columns */ tupdesc = CreateTemplateTupleDesc(3, false); @@ -5997,29 +5998,46 @@ ShowAllGUCConfig(DestReceiver *dest) TupleDescInitEntry(tupdesc, (AttrNumber) 3, "description", TEXTOID, -1, 0); - /* prepare for projection of tuples */ tstate = begin_tup_output_tupdesc(dest, tupdesc); for (i = 0; i < num_guc_variables; i++) { struct config_generic *conf = guc_variables[i]; + char *setting; if ((conf->flags & GUC_NO_SHOW_ALL) || ((conf->flags & GUC_SUPERUSER_ONLY) && !am_superuser)) continue; /* assign to the values array */ - values[0] = (char *) conf->name; - values[1] = _ShowOption(conf, true); - values[2] = (char *) conf->short_desc; + values[0] = PointerGetDatum(cstring_to_text(conf->name)); + + setting = _ShowOption(conf, true); + if (setting) + { + values[1] = PointerGetDatum(cstring_to_text(setting)); + isnull[1] = false; + } + else + { + values[1] = PointerGetDatum(NULL); + isnull[1] = true; + } + + values[2] = PointerGetDatum(cstring_to_text(conf->short_desc)); /* send it to dest */ - do_tup_output(tstate, values); + do_tup_output(tstate, values, isnull); /* clean up */ - if (values[1] != NULL) - pfree(values[1]); + pfree(DatumGetPointer(values[0])); + if (setting) + { + pfree(setting); + pfree(DatumGetPointer(values[1])); + } + pfree(DatumGetPointer(values[2])); } end_tup_output(tstate); |