mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Syntax support and documentation for event triggers.
They don't actually do anything yet; that will get fixed in a follow-on commit. But this gets the basic infrastructure in place, including CREATE/ALTER/DROP EVENT TRIGGER; support for COMMENT, SECURITY LABEL, and ALTER EXTENSION .. ADD/DROP EVENT TRIGGER; pg_dump and psql support; and documentation for the anticipated initial feature set. Dimitri Fontaine, with review and a bunch of additional hacking by me. Thom Brown extensively reviewed earlier versions of this patch set, but there's not a whole lot of that code left in this commit, as it turns out.
This commit is contained in:
@ -55,6 +55,7 @@
|
||||
#include "catalog/namespace.h"
|
||||
#include "catalog/pg_trigger.h"
|
||||
#include "commands/defrem.h"
|
||||
#include "commands/trigger.h"
|
||||
#include "nodes/makefuncs.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
#include "parser/gramparse.h"
|
||||
@ -194,6 +195,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
|
||||
}
|
||||
|
||||
%type <node> stmt schema_stmt
|
||||
AlterEventTrigStmt
|
||||
AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
|
||||
AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
|
||||
AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt
|
||||
@ -207,7 +209,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
|
||||
CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
|
||||
CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
|
||||
CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
|
||||
CreateAssertStmt CreateTrigStmt
|
||||
CreateAssertStmt CreateTrigStmt CreateEventTrigStmt
|
||||
CreateUserStmt CreateUserMappingStmt CreateRoleStmt
|
||||
CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
|
||||
DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
|
||||
@ -268,6 +270,10 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
|
||||
%type <value> TriggerFuncArg
|
||||
%type <node> TriggerWhen
|
||||
|
||||
%type <list> event_trigger_when_list event_trigger_value_list
|
||||
%type <defelt> event_trigger_when_item
|
||||
%type <chr> enable_trigger
|
||||
|
||||
%type <str> copy_file_name
|
||||
database_name access_method_clause access_method attr_name
|
||||
name cursor_name file_name
|
||||
@ -505,7 +511,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
|
||||
DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
|
||||
DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
|
||||
|
||||
EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT
|
||||
EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
|
||||
EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
|
||||
EXTENSION EXTERNAL EXTRACT
|
||||
|
||||
@ -674,7 +680,8 @@ stmtmulti: stmtmulti ';' stmt
|
||||
;
|
||||
|
||||
stmt :
|
||||
AlterDatabaseStmt
|
||||
AlterEventTrigStmt
|
||||
| AlterDatabaseStmt
|
||||
| AlterDatabaseSetStmt
|
||||
| AlterDefaultPrivilegesStmt
|
||||
| AlterDomainStmt
|
||||
@ -725,6 +732,7 @@ stmt :
|
||||
| CreateStmt
|
||||
| CreateTableSpaceStmt
|
||||
| CreateTrigStmt
|
||||
| CreateEventTrigStmt
|
||||
| CreateRoleStmt
|
||||
| CreateUserStmt
|
||||
| CreateUserMappingStmt
|
||||
@ -3554,6 +3562,15 @@ AlterExtensionContentsStmt:
|
||||
n->objname = list_make1(makeString($6));
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER EXTENSION name add_drop EVENT TRIGGER name
|
||||
{
|
||||
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
|
||||
n->extname = $3;
|
||||
n->action = $4;
|
||||
n->objtype = OBJECT_EVENT_TRIGGER;
|
||||
n->objname = list_make1(makeString($7));
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER EXTENSION name add_drop TABLE any_name
|
||||
{
|
||||
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
|
||||
@ -4282,6 +4299,75 @@ DropTrigStmt:
|
||||
;
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERIES :
|
||||
* CREATE EVENT TRIGGER ...
|
||||
* DROP EVENT TRIGGER ...
|
||||
* ALTER EVENT TRIGGER ...
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
CreateEventTrigStmt:
|
||||
CREATE EVENT TRIGGER name ON ColLabel
|
||||
EXECUTE PROCEDURE func_name '(' ')'
|
||||
{
|
||||
CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
|
||||
n->trigname = $4;
|
||||
n->eventname = $6;
|
||||
n->whenclause = NULL;
|
||||
n->funcname = $9;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| CREATE EVENT TRIGGER name ON ColLabel
|
||||
WHEN event_trigger_when_list
|
||||
EXECUTE PROCEDURE func_name '(' ')'
|
||||
{
|
||||
CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
|
||||
n->trigname = $4;
|
||||
n->eventname = $6;
|
||||
n->whenclause = $8;
|
||||
n->funcname = $11;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
event_trigger_when_list:
|
||||
event_trigger_when_item
|
||||
{ $$ = list_make1($1); }
|
||||
| event_trigger_when_list AND event_trigger_when_item
|
||||
{ $$ = lappend($1, $3); }
|
||||
;
|
||||
|
||||
event_trigger_when_item:
|
||||
ColId IN_P '(' event_trigger_value_list ')'
|
||||
{ $$ = makeDefElem($1, (Node *) $4); }
|
||||
;
|
||||
|
||||
event_trigger_value_list:
|
||||
SCONST
|
||||
{ $$ = list_make1(makeString($1)); }
|
||||
| event_trigger_value_list ',' SCONST
|
||||
{ $$ = lappend($1, makeString($3)); }
|
||||
;
|
||||
|
||||
AlterEventTrigStmt:
|
||||
ALTER EVENT TRIGGER name enable_trigger
|
||||
{
|
||||
AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt);
|
||||
n->trigname = $4;
|
||||
n->tgenabled = $5;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
;
|
||||
|
||||
enable_trigger:
|
||||
ENABLE_P { $$ = TRIGGER_FIRES_ON_ORIGIN; }
|
||||
| ENABLE_P REPLICA { $$ = TRIGGER_FIRES_ON_REPLICA; }
|
||||
| ENABLE_P ALWAYS { $$ = TRIGGER_FIRES_ALWAYS; }
|
||||
| DISABLE_P { $$ = TRIGGER_DISABLED; }
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERIES :
|
||||
@ -4868,6 +4954,7 @@ drop_type: TABLE { $$ = OBJECT_TABLE; }
|
||||
| VIEW { $$ = OBJECT_VIEW; }
|
||||
| INDEX { $$ = OBJECT_INDEX; }
|
||||
| FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
|
||||
| EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
|
||||
| TYPE_P { $$ = OBJECT_TYPE; }
|
||||
| DOMAIN_P { $$ = OBJECT_DOMAIN; }
|
||||
| COLLATION { $$ = OBJECT_COLLATION; }
|
||||
@ -4931,7 +5018,7 @@ opt_restart_seqs:
|
||||
* EXTENSION | ROLE | TEXT SEARCH PARSER |
|
||||
* TEXT SEARCH DICTIONARY | TEXT SEARCH TEMPLATE |
|
||||
* TEXT SEARCH CONFIGURATION | FOREIGN TABLE |
|
||||
* FOREIGN DATA WRAPPER | SERVER ] <objname> |
|
||||
* FOREIGN DATA WRAPPER | SERVER | EVENT TRIGGER ] <objname> |
|
||||
* AGGREGATE <aggname> (arg1, ...) |
|
||||
* FUNCTION <funcname> (arg1, arg2, ...) |
|
||||
* OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
|
||||
@ -5113,6 +5200,7 @@ comment_type:
|
||||
| FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
|
||||
| SERVER { $$ = OBJECT_FOREIGN_SERVER; }
|
||||
| FOREIGN DATA_P WRAPPER { $$ = OBJECT_FDW; }
|
||||
| EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
|
||||
;
|
||||
|
||||
comment_text:
|
||||
@ -5195,6 +5283,7 @@ opt_provider: FOR ColId_or_Sconst { $$ = $2; }
|
||||
security_label_type:
|
||||
COLUMN { $$ = OBJECT_COLUMN; }
|
||||
| DATABASE { $$ = OBJECT_DATABASE; }
|
||||
| EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
|
||||
| FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
|
||||
| SCHEMA { $$ = OBJECT_SCHEMA; }
|
||||
| SEQUENCE { $$ = OBJECT_SEQUENCE; }
|
||||
@ -6850,6 +6939,14 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
|
||||
n->missing_ok = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER EVENT TRIGGER name RENAME TO name
|
||||
{
|
||||
RenameStmt *n = makeNode(RenameStmt);
|
||||
n->renameType = OBJECT_EVENT_TRIGGER;
|
||||
n->subname = $4;
|
||||
n->newname = $7;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER ROLE RoleId RENAME TO RoleId
|
||||
{
|
||||
RenameStmt *n = makeNode(RenameStmt);
|
||||
@ -7329,6 +7426,14 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
|
||||
n->newowner = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER EVENT TRIGGER name OWNER TO RoleId
|
||||
{
|
||||
AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
|
||||
n->objectType = OBJECT_EVENT_TRIGGER;
|
||||
n->object = list_make1(makeString($4));
|
||||
n->newowner = $7;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user