mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Support CREATE ACCESS METHOD
This enables external code to create access methods. This is useful so that extensions can add their own access methods which can be formally tracked for dependencies, so that DROP operates correctly. Also, having explicit support makes pg_dump work correctly. Currently only index AMs are supported, but we expect different types to be added in the future. Authors: Alexander Korotkov, Petr Jelínek Reviewed-By: Teodor Sigaev, Petr Jelínek, Jim Nasby Commitfest-URL: https://commitfest.postgresql.org/9/353/ Discussion: https://www.postgresql.org/message-id/CAPpHfdsXwZmojm6Dx+TJnpYk27kT4o7Ri6X_4OSWcByu1Rm+VA@mail.gmail.com
This commit is contained in:
@ -51,6 +51,7 @@
|
||||
|
||||
#include "catalog/index.h"
|
||||
#include "catalog/namespace.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_trigger.h"
|
||||
#include "commands/defrem.h"
|
||||
#include "commands/trigger.h"
|
||||
@ -263,7 +264,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
DeallocateStmt PrepareStmt ExecuteStmt
|
||||
DropOwnedStmt ReassignOwnedStmt
|
||||
AlterTSConfigurationStmt AlterTSDictionaryStmt
|
||||
CreateMatViewStmt RefreshMatViewStmt
|
||||
CreateMatViewStmt RefreshMatViewStmt CreateAmStmt
|
||||
|
||||
%type <node> select_no_parens select_with_parens select_clause
|
||||
simple_select values_clause
|
||||
@ -604,7 +605,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
|
||||
LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
|
||||
|
||||
MAPPING MATCH MATERIALIZED MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
|
||||
MAPPING MATCH MATERIALIZED MAXVALUE METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE
|
||||
|
||||
NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NO NONE
|
||||
NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
|
||||
@ -789,6 +790,7 @@ stmt :
|
||||
| CommentStmt
|
||||
| ConstraintsSetStmt
|
||||
| CopyStmt
|
||||
| CreateAmStmt
|
||||
| CreateAsStmt
|
||||
| CreateAssertStmt
|
||||
| CreateCastStmt
|
||||
@ -4706,6 +4708,23 @@ row_security_cmd:
|
||||
| DELETE_P { $$ = "delete"; }
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERY:
|
||||
* CREATE ACCESS METHOD name HANDLER handler_name
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
CreateAmStmt: CREATE ACCESS METHOD name TYPE_P INDEX HANDLER handler_name
|
||||
{
|
||||
CreateAmStmt *n = makeNode(CreateAmStmt);
|
||||
n->amname = $4;
|
||||
n->handler_name = $8;
|
||||
n->amtype = AMTYPE_INDEX;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERIES :
|
||||
@ -5612,6 +5631,7 @@ drop_type: TABLE { $$ = OBJECT_TABLE; }
|
||||
| MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
|
||||
| INDEX { $$ = OBJECT_INDEX; }
|
||||
| FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
|
||||
| ACCESS METHOD { $$ = OBJECT_ACCESS_METHOD; }
|
||||
| EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
|
||||
| COLLATION { $$ = OBJECT_COLLATION; }
|
||||
| CONVERSION_P { $$ = OBJECT_CONVERSION; }
|
||||
@ -13778,6 +13798,7 @@ unreserved_keyword:
|
||||
| MATCH
|
||||
| MATERIALIZED
|
||||
| MAXVALUE
|
||||
| METHOD
|
||||
| MINUTE_P
|
||||
| MINVALUE
|
||||
| MODE
|
||||
|
@ -1709,7 +1709,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt)
|
||||
* else dump and reload will produce a different index (breaking
|
||||
* pg_upgrade in particular).
|
||||
*/
|
||||
if (index_rel->rd_rel->relam != get_am_oid(DEFAULT_INDEX_TYPE, false))
|
||||
if (index_rel->rd_rel->relam != get_index_am_oid(DEFAULT_INDEX_TYPE, false))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("index \"%s\" is not a btree", index_name),
|
||||
|
Reference in New Issue
Block a user