diff options
author | Robert Haas <rhaas@postgresql.org> | 2013-01-21 18:00:24 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2013-01-21 18:00:24 -0500 |
commit | 841a5150c575ccd89e4b03aec66eeeefb21f3cbe (patch) | |
tree | 38799645974b15dfa7745d1d9d5d0676c766b3bc /src/backend/tcop/utility.c | |
parent | 765cbfdc9263bf7c90b9d1f1044c6950b8b7088c (diff) | |
download | postgresql-841a5150c575ccd89e4b03aec66eeeefb21f3cbe.tar.gz postgresql-841a5150c575ccd89e4b03aec66eeeefb21f3cbe.zip |
Add ddl_command_end support for event triggers.
Dimitri Fontaine, with slight changes by me
Diffstat (limited to 'src/backend/tcop/utility.c')
-rw-r--r-- | src/backend/tcop/utility.c | 273 |
1 files changed, 150 insertions, 123 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index ad5e30384d9..598e20f91c3 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -340,6 +340,34 @@ ProcessUtility(Node *parsetree, dest, completionTag, context); } +#define InvokeDDLCommandEventTriggers(parsetree, fncall) \ + do { \ + if (isCompleteQuery) \ + { \ + EventTriggerDDLCommandStart(parsetree); \ + } \ + fncall; \ + if (isCompleteQuery) \ + { \ + EventTriggerDDLCommandEnd(parsetree); \ + } \ + } while (0) + +#define InvokeDDLCommandEventTriggersIfSupported(parsetree, fncall, objtype) \ + do { \ + bool _supported = EventTriggerSupportsObjectType(objtype); \ + \ + if (_supported) \ + { \ + EventTriggerDDLCommandStart(parsetree); \ + } \ + fncall; \ + if (_supported) \ + { \ + EventTriggerDDLCommandEnd(parsetree); \ + } \ + } while (0) + void standard_ProcessUtility(Node *parsetree, const char *queryString, @@ -507,10 +535,10 @@ standard_ProcessUtility(Node *parsetree, * relation and attribute manipulation */ case T_CreateSchemaStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateSchemaCommand((CreateSchemaStmt *) parsetree, - queryString); + InvokeDDLCommandEventTriggers( + parsetree, + CreateSchemaCommand((CreateSchemaStmt *) parsetree, + queryString)); break; case T_CreateStmt: @@ -583,6 +611,9 @@ standard_ProcessUtility(Node *parsetree, if (lnext(l) != NULL) CommandCounterIncrement(); } + + if (isCompleteQuery) + EventTriggerDDLCommandEnd(parsetree); } break; @@ -604,63 +635,63 @@ standard_ProcessUtility(Node *parsetree, break; case T_CreateExtensionStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateExtension((CreateExtensionStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateExtension((CreateExtensionStmt *) parsetree)); break; case T_AlterExtensionStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree)); break; case T_AlterExtensionContentsStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree)); break; case T_CreateFdwStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateForeignDataWrapper((CreateFdwStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateForeignDataWrapper((CreateFdwStmt *) parsetree)); break; case T_AlterFdwStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterForeignDataWrapper((AlterFdwStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterForeignDataWrapper((AlterFdwStmt *) parsetree)); break; case T_CreateForeignServerStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateForeignServer((CreateForeignServerStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateForeignServer((CreateForeignServerStmt *) parsetree)); break; case T_AlterForeignServerStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterForeignServer((AlterForeignServerStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterForeignServer((AlterForeignServerStmt *) parsetree)); break; case T_CreateUserMappingStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateUserMapping((CreateUserMappingStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateUserMapping((CreateUserMappingStmt *) parsetree)); break; case T_AlterUserMappingStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterUserMapping((AlterUserMappingStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterUserMapping((AlterUserMappingStmt *) parsetree)); break; case T_DropUserMappingStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - RemoveUserMapping((DropUserMappingStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + RemoveUserMapping((DropUserMappingStmt *) parsetree)); break; case T_DropStmt: @@ -689,6 +720,11 @@ standard_ProcessUtility(Node *parsetree, RemoveObjects((DropStmt *) parsetree); break; } + + if (isCompleteQuery + && EventTriggerSupportsObjectType(stmt->removeType)) + EventTriggerDDLCommandEnd(parsetree); + break; } @@ -736,37 +772,29 @@ standard_ProcessUtility(Node *parsetree, */ case T_RenameStmt: { - RenameStmt *stmt; + RenameStmt *stmt = (RenameStmt *) parsetree; - stmt = (RenameStmt *) parsetree; - if (isCompleteQuery && - EventTriggerSupportsObjectType(stmt->renameType)) - EventTriggerDDLCommandStart(parsetree); - ExecRenameStmt(stmt); + InvokeDDLCommandEventTriggersIfSupported(parsetree, + ExecRenameStmt(stmt), + stmt->renameType); break; } case T_AlterObjectSchemaStmt: { - AlterObjectSchemaStmt *stmt; - - stmt = (AlterObjectSchemaStmt *) parsetree; - if (isCompleteQuery && - EventTriggerSupportsObjectType(stmt->objectType)) - EventTriggerDDLCommandStart(parsetree); - ExecAlterObjectSchemaStmt(stmt); + AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree; + InvokeDDLCommandEventTriggersIfSupported(parsetree, + ExecAlterObjectSchemaStmt(stmt), + stmt->objectType); break; } case T_AlterOwnerStmt: { - AlterOwnerStmt *stmt; - - stmt = (AlterOwnerStmt *) parsetree; - if (isCompleteQuery && - EventTriggerSupportsObjectType(stmt->objectType)) - EventTriggerDDLCommandStart(parsetree); - ExecAlterOwnerStmt(stmt); + AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree; + InvokeDDLCommandEventTriggersIfSupported(parsetree, + ExecAlterOwnerStmt(stmt), + stmt->objectType); break; } @@ -889,9 +917,9 @@ standard_ProcessUtility(Node *parsetree, break; case T_AlterDefaultPrivilegesStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree)); break; /* @@ -950,47 +978,46 @@ standard_ProcessUtility(Node *parsetree, { CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree; - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - - DefineCompositeType(stmt->typevar, stmt->coldeflist); + InvokeDDLCommandEventTriggers( + parsetree, + DefineCompositeType(stmt->typevar, stmt->coldeflist)); } break; case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineEnum((CreateEnumStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineEnum((CreateEnumStmt *) parsetree)); break; case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineRange((CreateRangeStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineRange((CreateRangeStmt *) parsetree)); break; case T_AlterEnumStmt: /* ALTER TYPE (enum) */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterEnum((AlterEnumStmt *) parsetree, isTopLevel); + InvokeDDLCommandEventTriggers( + parsetree, + AlterEnum((AlterEnumStmt *) parsetree, isTopLevel)); break; case T_ViewStmt: /* CREATE VIEW */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineView((ViewStmt *) parsetree, queryString); + InvokeDDLCommandEventTriggers( + parsetree, + DefineView((ViewStmt *) parsetree, queryString)); break; case T_CreateFunctionStmt: /* CREATE FUNCTION */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateFunction((CreateFunctionStmt *) parsetree, queryString); + InvokeDDLCommandEventTriggers( + parsetree, + CreateFunction((CreateFunctionStmt *) parsetree, queryString)); break; case T_AlterFunctionStmt: /* ALTER FUNCTION */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterFunction((AlterFunctionStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterFunction((AlterFunctionStmt *) parsetree)); break; case T_IndexStmt: /* CREATE INDEX */ @@ -1019,21 +1046,21 @@ standard_ProcessUtility(Node *parsetree, break; case T_RuleStmt: /* CREATE RULE */ - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineRule((RuleStmt *) parsetree, queryString); + InvokeDDLCommandEventTriggers( + parsetree, + DefineRule((RuleStmt *) parsetree, queryString)); break; case T_CreateSeqStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineSequence((CreateSeqStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineSequence((CreateSeqStmt *) parsetree)); break; case T_AlterSeqStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterSequence((AlterSeqStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterSequence((AlterSeqStmt *) parsetree)); break; case T_DoStmt: @@ -1131,10 +1158,10 @@ standard_ProcessUtility(Node *parsetree, break; case T_CreateTableAsStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - ExecCreateTableAs((CreateTableAsStmt *) parsetree, - queryString, params, completionTag); + InvokeDDLCommandEventTriggers( + parsetree, + ExecCreateTableAs((CreateTableAsStmt *) parsetree, + queryString, params, completionTag)); break; case T_VariableSetStmt: @@ -1156,10 +1183,10 @@ standard_ProcessUtility(Node *parsetree, break; case T_CreateTrigStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - (void) CreateTrigger((CreateTrigStmt *) parsetree, queryString, - InvalidOid, InvalidOid, false); + InvokeDDLCommandEventTriggers( + parsetree, + (void) CreateTrigger((CreateTrigStmt *) parsetree, queryString, + InvalidOid, InvalidOid, false)); break; case T_CreateEventTrigStmt: @@ -1173,18 +1200,18 @@ standard_ProcessUtility(Node *parsetree, break; case T_CreatePLangStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateProceduralLanguage((CreatePLangStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateProceduralLanguage((CreatePLangStmt *) parsetree)); break; /* * ******************************** DOMAIN statements **** */ case T_CreateDomainStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineDomain((CreateDomainStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineDomain((CreateDomainStmt *) parsetree)); break; /* @@ -1288,45 +1315,45 @@ standard_ProcessUtility(Node *parsetree, break; case T_CreateConversionStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateConversionCommand((CreateConversionStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateConversionCommand((CreateConversionStmt *) parsetree)); break; case T_CreateCastStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - CreateCast((CreateCastStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + CreateCast((CreateCastStmt *) parsetree)); break; case T_CreateOpClassStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineOpClass((CreateOpClassStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineOpClass((CreateOpClassStmt *) parsetree)); break; case T_CreateOpFamilyStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - DefineOpFamily((CreateOpFamilyStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + DefineOpFamily((CreateOpFamilyStmt *) parsetree)); break; case T_AlterOpFamilyStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterOpFamily((AlterOpFamilyStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterOpFamily((AlterOpFamilyStmt *) parsetree)); break; case T_AlterTSDictionaryStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterTSDictionary((AlterTSDictionaryStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterTSDictionary((AlterTSDictionaryStmt *) parsetree)); break; case T_AlterTSConfigurationStmt: - if (isCompleteQuery) - EventTriggerDDLCommandStart(parsetree); - AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree); + InvokeDDLCommandEventTriggers( + parsetree, + AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree)); break; default: |