diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index fba205cfc..b9c89715d 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -85,6 +85,7 @@ static int activeDropSchemaOrDBs = 0; static bool ConstraintDropped = false; +ProcessUtility_hook_type PrevProcessUtility = NULL; int UtilityHookLevel = 0; @@ -180,8 +181,8 @@ multi_ProcessUtility(PlannedStmt *pstmt, * that state. Since we never need to intercept transaction statements, * skip our checks and immediately fall into standard_ProcessUtility. */ - standard_ProcessUtility_compat(pstmt, queryString, false, context, - params, queryEnv, dest, completionTag); + PrevProcessUtility_compat(pstmt, queryString, false, context, + params, queryEnv, dest, completionTag); return; } @@ -199,8 +200,8 @@ multi_ProcessUtility(PlannedStmt *pstmt, * Ensure that utility commands do not behave any differently until CREATE * EXTENSION is invoked. */ - standard_ProcessUtility_compat(pstmt, queryString, false, context, - params, queryEnv, dest, completionTag); + PrevProcessUtility_compat(pstmt, queryString, false, context, + params, queryEnv, dest, completionTag); return; } @@ -231,8 +232,8 @@ multi_ProcessUtility(PlannedStmt *pstmt, PG_TRY(); { - standard_ProcessUtility_compat(pstmt, queryString, false, context, - params, queryEnv, dest, completionTag); + PrevProcessUtility_compat(pstmt, queryString, false, context, + params, queryEnv, dest, completionTag); StoredProcedureLevel -= 1; @@ -265,8 +266,8 @@ multi_ProcessUtility(PlannedStmt *pstmt, PG_TRY(); { - standard_ProcessUtility_compat(pstmt, queryString, false, context, - params, queryEnv, dest, completionTag); + PrevProcessUtility_compat(pstmt, queryString, false, context, + params, queryEnv, dest, completionTag); DoBlockLevel -= 1; } @@ -591,8 +592,8 @@ ProcessUtilityInternal(PlannedStmt *pstmt, citusCanBeUpdatedToAvailableVersion = !InstalledAndAvailableVersionsSame(); } - standard_ProcessUtility_compat(pstmt, queryString, false, context, - params, queryEnv, dest, completionTag); + PrevProcessUtility_compat(pstmt, queryString, false, context, + params, queryEnv, dest, completionTag); /* * if we are running ALTER EXTENSION citus UPDATE (to "") command, we may need diff --git a/src/backend/distributed/shared_library_init.c b/src/backend/distributed/shared_library_init.c index fddd1b49d..72967b3ca 100644 --- a/src/backend/distributed/shared_library_init.c +++ b/src/backend/distributed/shared_library_init.c @@ -334,9 +334,6 @@ _PG_init(void) /* intercept planner */ planner_hook = distributed_planner; - /* register utility hook */ - ProcessUtility_hook = multi_ProcessUtility; - /* register for planner hook */ set_rel_pathlist_hook = multi_relation_restriction_hook; set_join_pathlist_hook = multi_join_restriction_hook; @@ -387,6 +384,17 @@ _PG_init(void) /* ensure columnar module is loaded at the right time */ load_file(COLUMNAR_MODULE_NAME, false); + /* + * Register utility hook. This must be done after loading columnar, so + * that the citus hook is called first, followed by the columnar hook, + * followed by standard_ProcessUtility. That allows citus to distribute + * ALTER TABLE commands before columnar strips out the columnar-specific + * options. + */ + PrevProcessUtility = (ProcessUtility_hook != NULL) ? + ProcessUtility_hook : standard_ProcessUtility; + ProcessUtility_hook = multi_ProcessUtility; + /* * Now, acquire symbols from columnar module. First, acquire * the address of the set options hook, and set it so that we diff --git a/src/include/distributed/commands/utility_hook.h b/src/include/distributed/commands/utility_hook.h index 246d413d9..a057c67b6 100644 --- a/src/include/distributed/commands/utility_hook.h +++ b/src/include/distributed/commands/utility_hook.h @@ -75,6 +75,7 @@ typedef struct DDLJob List *taskList; /* worker DDL tasks to execute */ } DDLJob; +extern ProcessUtility_hook_type PrevProcessUtility; extern void multi_ProcessUtility(PlannedStmt *pstmt, const char *queryString, #if PG_VERSION_NUM >= PG_VERSION_14 diff --git a/src/include/pg_version_compat.h b/src/include/pg_version_compat.h index 2f076cf07..33cb524bd 100644 --- a/src/include/pg_version_compat.h +++ b/src/include/pg_version_compat.h @@ -77,6 +77,8 @@ RelationGetSmgr(Relation rel) standard_ProcessUtility(a, b, c, d, e, f, g, h) #define ProcessUtility_compat(a, b, c, d, e, f, g, h) \ ProcessUtility(a, b, c, d, e, f, g, h) +#define PrevProcessUtility_compat(a, b, c, d, e, f, g, h) \ + PrevProcessUtility(a, b, c, d, e, f, g, h) #define SetTuplestoreDestReceiverParams_compat(a, b, c, d, e, f) \ SetTuplestoreDestReceiverParams(a, b, c, d, e, f) #define pgproc_statusflags_compat(pgproc) ((pgproc)->statusFlags) @@ -106,6 +108,8 @@ RelationGetSmgr(Relation rel) #define standard_ProcessUtility_compat(a, b, c, d, e, f, g, h) \ standard_ProcessUtility(a, b, d, e, f, g, h) #define ProcessUtility_compat(a, b, c, d, e, f, g, h) ProcessUtility(a, b, d, e, f, g, h) +#define PrevProcessUtility_compat(a, b, c, d, e, f, g, h) \ + PrevProcessUtility(a, b, d, e, f, g, h) #define COPY_FRONTEND COPY_NEW_FE #define SetTuplestoreDestReceiverParams_compat(a, b, c, d, e, f) \ SetTuplestoreDestReceiverParams(a, b, c, d)