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
This commit is contained in:
parent
ebe30ad59b
commit
73d78e11a0
@ -115,6 +115,10 @@ optionally_create_toast_tables(void)
|
|||||||
"c.relkind IN ('r', 'm') AND "
|
"c.relkind IN ('r', 'm') AND "
|
||||||
"c.reltoastrelid = 0");
|
"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);
|
ntups = PQntuples(res);
|
||||||
i_nspname = PQfnumber(res, "nspname");
|
i_nspname = PQfnumber(res, "nspname");
|
||||||
i_relname = PQfnumber(res, "relname");
|
i_relname = PQfnumber(res, "relname");
|
||||||
@ -125,13 +129,16 @@ optionally_create_toast_tables(void)
|
|||||||
OPTIONALLY_CREATE_TOAST_OID));
|
OPTIONALLY_CREATE_TOAST_OID));
|
||||||
|
|
||||||
/* dummy command that also triggers check for required TOAST table */
|
/* 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_nspname)),
|
||||||
quote_identifier(PQgetvalue(res, rowno, i_relname))));
|
quote_identifier(PQgetvalue(res, rowno, i_relname))));
|
||||||
}
|
}
|
||||||
|
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
|
PQclear(executeQueryOrDie(conn, "RESET client_min_messages;"));
|
||||||
|
PQclear(executeQueryOrDie(conn, "RESET log_min_messages;"));
|
||||||
|
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,6 +307,8 @@ static void initialize_reloptions(void);
|
|||||||
static void parse_one_reloption(relopt_value *option, char *text_str,
|
static void parse_one_reloption(relopt_value *option, char *text_str,
|
||||||
int text_len, bool validate);
|
int text_len, bool validate);
|
||||||
|
|
||||||
|
static bool is_valid_reloption(char *name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* initialize_reloptions
|
* initialize_reloptions
|
||||||
* initialization routine, must be called before parsing
|
* initialization routine, must be called before parsing
|
||||||
@ -381,6 +383,25 @@ initialize_reloptions(void)
|
|||||||
need_initialization = false;
|
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
|
* add_reloption_kind
|
||||||
* Create a new relopt_kind value, to be used in custom reloptions by
|
* 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 (isReset)
|
||||||
{
|
{
|
||||||
|
if (!is_valid_reloption(def->defname))
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||||
|
errmsg("unrecognized parameter \"%s\"", def->defname)));
|
||||||
|
|
||||||
if (def->arg != NULL)
|
if (def->arg != NULL)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user