mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	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.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); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -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), | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user