mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Allow ALTER TYPE to change some properties of a base type.
Specifically, this patch allows ALTER TYPE to: * Change the default TOAST strategy for a toastable base type; * Promote a non-toastable type to toastable; * Add/remove binary I/O functions for a type; * Add/remove typmod I/O functions for a type; * Add/remove a custom ANALYZE statistics functions for a type. The first of these can be done by the type's owner; all the others require superuser privilege since misuse could cause problems. The main motivation for this patch is to allow extensions to upgrade the feature sets of their data types, so the set of alterable properties is biased towards that use-case. However it's also true that changing some other properties would be a lot harder, as they get baked into physical storage and/or stored expressions that depend on the type. Along the way, refactor GenerateTypeDependencies() to make it easier to call, refactor DefineType's volatility checks so they can be shared by AlterType, and teach typcache.c that it might have to reload data from the type's pg_type row, a scenario it never handled before. Also rearrange alter_type.sgml a bit for clarity (put the composite-type operations together). Tomas Vondra and Tom Lane Discussion: https://postgr.es/m/20200228004440.b23ein4qvmxnlpht@development
This commit is contained in:
@ -249,7 +249,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
|
||||
AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
|
||||
AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
|
||||
AlterOperatorStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
|
||||
AlterOperatorStmt AlterTypeStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
|
||||
AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
|
||||
AlterCompositeTypeStmt AlterUserMappingStmt
|
||||
AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt AlterStatsStmt
|
||||
@ -847,6 +847,7 @@ stmt :
|
||||
| AlterObjectSchemaStmt
|
||||
| AlterOwnerStmt
|
||||
| AlterOperatorStmt
|
||||
| AlterTypeStmt
|
||||
| AlterPolicyStmt
|
||||
| AlterSeqStmt
|
||||
| AlterSystemStmt
|
||||
@ -9365,6 +9366,24 @@ operator_def_arg:
|
||||
| Sconst { $$ = (Node *)makeString($1); }
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ALTER TYPE name SET define
|
||||
*
|
||||
* We repurpose ALTER OPERATOR's version of "definition" here
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
AlterTypeStmt:
|
||||
ALTER TYPE_P any_name SET '(' operator_def_list ')'
|
||||
{
|
||||
AlterTypeStmt *n = makeNode(AlterTypeStmt);
|
||||
n->typeName = $3;
|
||||
n->options = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ALTER THING name OWNER TO newname
|
||||
|
Reference in New Issue
Block a user