postgres.git / summary / log / commit / refs
commit 73d78e11a0f7183c80b93eefbbb6026fe9664015
Author: Bruce Momjian <bruce@momjian.us>
Date: Mon Aug 25 21:06:40 2014 +0000
Throw error for ALTER TABLE RESET of an invalid option
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 e623a226327..29a68c07a2d 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 e0b81b9eb51..97a4e227a3b 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),
[parent: ebe30ad59bb2]