Commit 11c794f2 authored by Tom Lane's avatar Tom Lane

Use guc.c's parse_int() instead of pg_atoi() to parse fillfactor in

default_reloptions().  The previous coding was really a bug because pg_atoi()
will always throw elog on bad input data, whereas default_reloptions is not
supposed to complain about bad input unless its validate parameter is true.
Right now you could only expose the problem by hand-modifying
pg_class.reloptions into an invalid state, so it doesn't seem worth
back-patching; but we should get it right in HEAD because there might be other
situations in future.  Noted while studying GIN fast-update patch.
parent 509303a5
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.10 2008/04/17 21:37:28 alvherre Exp $ * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.11 2008/07/23 17:29:53 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "nodes/makefuncs.h" #include "nodes/makefuncs.h"
#include "utils/array.h" #include "utils/array.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/guc.h"
#include "utils/rel.h" #include "utils/rel.h"
...@@ -287,7 +288,7 @@ default_reloptions(Datum reloptions, bool validate, ...@@ -287,7 +288,7 @@ default_reloptions(Datum reloptions, bool validate,
{ {
static const char *const default_keywords[1] = {"fillfactor"}; static const char *const default_keywords[1] = {"fillfactor"};
char *values[1]; char *values[1];
int32 fillfactor; int fillfactor;
StdRdOptions *result; StdRdOptions *result;
parseRelOptions(reloptions, 1, default_keywords, values, validate); parseRelOptions(reloptions, 1, default_keywords, values, validate);
...@@ -300,7 +301,16 @@ default_reloptions(Datum reloptions, bool validate, ...@@ -300,7 +301,16 @@ default_reloptions(Datum reloptions, bool validate,
if (values[0] == NULL) if (values[0] == NULL)
return NULL; return NULL;
fillfactor = pg_atoi(values[0], sizeof(int32), 0); if (!parse_int(values[0], &fillfactor, 0, NULL))
{
if (validate)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("fillfactor must be an integer: \"%s\"",
values[0])));
return NULL;
}
if (fillfactor < minFillfactor || fillfactor > 100) if (fillfactor < minFillfactor || fillfactor > 100)
{ {
if (validate) if (validate)
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.464 2008/07/10 22:08:17 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.465 2008/07/23 17:29:53 tgl Exp $
* *
*-------------------------------------------------------------------- *--------------------------------------------------------------------
*/ */
...@@ -4115,7 +4115,7 @@ parse_bool(const char *value, bool *result) ...@@ -4115,7 +4115,7 @@ parse_bool(const char *value, bool *result)
* If not okay and hintmsg is not NULL, *hintmsg is set to a suitable * If not okay and hintmsg is not NULL, *hintmsg is set to a suitable
* HINT message, or NULL if no hint provided. * HINT message, or NULL if no hint provided.
*/ */
static bool bool
parse_int(const char *value, int *result, int flags, const char **hintmsg) parse_int(const char *value, int *result, int flags, const char **hintmsg)
{ {
int64 val; int64 val;
...@@ -4322,7 +4322,7 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg) ...@@ -4322,7 +4322,7 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg)
* If the string parses okay, return true, else false. * If the string parses okay, return true, else false.
* If okay and result is not NULL, return the value in *result. * If okay and result is not NULL, return the value in *result.
*/ */
static bool bool
parse_real(const char *value, double *result) parse_real(const char *value, double *result)
{ {
double val; double val;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Copyright (c) 2000-2008, PostgreSQL Global Development Group * Copyright (c) 2000-2008, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
* *
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.97 2008/06/30 22:10:43 momjian Exp $ * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.98 2008/07/23 17:29:53 tgl Exp $
*-------------------------------------------------------------------- *--------------------------------------------------------------------
*/ */
#ifndef GUC_H #ifndef GUC_H
...@@ -224,6 +224,9 @@ extern void AtEOXact_GUC(bool isCommit, int nestLevel); ...@@ -224,6 +224,9 @@ extern void AtEOXact_GUC(bool isCommit, int nestLevel);
extern void BeginReportingGUCOptions(void); extern void BeginReportingGUCOptions(void);
extern void ParseLongOption(const char *string, char **name, char **value); extern void ParseLongOption(const char *string, char **name, char **value);
extern bool parse_bool(const char *value, bool *result); extern bool parse_bool(const char *value, bool *result);
extern bool parse_int(const char *value, int *result, int flags,
const char **hintmsg);
extern bool parse_real(const char *value, double *result);
extern bool set_config_option(const char *name, const char *value, extern bool set_config_option(const char *name, const char *value,
GucContext context, GucSource source, GucContext context, GucSource source,
GucAction action, bool changeVal); GucAction action, bool changeVal);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment