From 73d78e11a0f7183c80b93eefbbb6026fe9664015 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 25 Aug 2014 17:06:40 -0400 Subject: [PATCH] Throw error for ALTER TABLE RESET of an invalid option MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Also adjust pg_upgrade to not use this method for optional TOAST table creation. Patch by Fabrízio de Royes Mello --- contrib/pg_upgrade/dump.c | 9 ++++++++- src/backend/access/common/reloptions.c | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c index e623a22632..29a68c07a2 100644 --- a/contrib/pg_upgrade/dump.c +++ b/contrib/pg_upgrade/dump.c @@ -115,6 +115,10 @@ optionally_create_toast_tables(void) "c.relkind IN ('r', 'm') AND " "c.reltoastrelid = 0"); + /* Suppress NOTICE output from non-existant constraints */ + PQclear(executeQueryOrDie(conn, "SET client_min_messages = warning;")); + PQclear(executeQueryOrDie(conn, "SET log_min_messages = warning;")); + ntups = PQntuples(res); i_nspname = PQfnumber(res, "nspname"); i_relname = PQfnumber(res, "relname"); @@ -125,13 +129,16 @@ optionally_create_toast_tables(void) OPTIONALLY_CREATE_TOAST_OID)); /* dummy command that also triggers check for required TOAST table */ - PQclear(executeQueryOrDie(conn, "ALTER TABLE %s.%s RESET (binary_upgrade_dummy_option);", + PQclear(executeQueryOrDie(conn, "ALTER TABLE %s.%s DROP CONSTRAINT IF EXISTS binary_upgrade_dummy_constraint;", quote_identifier(PQgetvalue(res, rowno, i_nspname)), quote_identifier(PQgetvalue(res, rowno, i_relname)))); } PQclear(res); + PQclear(executeQueryOrDie(conn, "RESET client_min_messages;")); + PQclear(executeQueryOrDie(conn, "RESET log_min_messages;")); + PQfinish(conn); } diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index e0b81b9eb5..97a4e227a3 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -307,6 +307,8 @@ static void initialize_reloptions(void); static void parse_one_reloption(relopt_value *option, char *text_str, int text_len, bool validate); +static bool is_valid_reloption(char *name); + /* * initialize_reloptions * initialization routine, must be called before parsing @@ -381,6 +383,25 @@ initialize_reloptions(void) need_initialization = false; } +/* + * is_valid_reloption + * check if a reloption exists + * + */ +static bool +is_valid_reloption(char *name) +{ + int i; + + for (i = 0; relOpts[i]; i++) + { + if (pg_strcasecmp(relOpts[i]->name, name) == 0) + return true; + } + + return false; +} + /* * add_reloption_kind * Create a new relopt_kind value, to be used in custom reloptions by @@ -672,6 +693,11 @@ transformRelOptions(Datum oldOptions, List *defList, char *namspace, if (isReset) { + if (!is_valid_reloption(def->defname)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized parameter \"%s\"", def->defname))); + if (def->arg != NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), -- 2.40.0