diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index c7b411d14..73b0c12c5 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -92,6 +92,8 @@ #include "distributed/shard_pruning.h" #include "distributed/version_compat.h" +bool EnableOuterJoinsWithPseudoconstantQualsPrePG17 = false; + /* * RecursivePlanningContext is used to recursively plan subqueries * and CTEs, pull results to the coordinator, and push it back into @@ -483,7 +485,7 @@ ShouldRecursivelyPlanOuterJoins(Query *query, RecursivePlanningContext *context) bool hasOuterJoin = context->plannerRestrictionContext->joinRestrictionContext->hasOuterJoin; - if (!hasOuterJoin) + if (!EnableOuterJoinsWithPseudoconstantQualsPrePG17 && !hasOuterJoin) { /* * PG15 commit d1ef5631e620f9a5b6480a32bb70124c857af4f1 diff --git a/src/backend/distributed/shared_library_init.c b/src/backend/distributed/shared_library_init.c index 268fb964a..5d468cd76 100644 --- a/src/backend/distributed/shared_library_init.c +++ b/src/backend/distributed/shared_library_init.c @@ -1404,6 +1404,23 @@ RegisterCitusConfigVariables(void) GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE, NULL, NULL, NULL); + DefineCustomBoolVariable( + "citus.enable_outer_joins_with_pseudoconstant_quals_pre_pg17", + gettext_noop("Enables running distributed queries with outer joins " + "and pseudoconstant quals pre PG17."), + gettext_noop("Set to false by default. If set to true, enables " + "running distributed queries with outer joins and " + "pseudoconstant quals, at user's own risk, because " + "pre PG17, Citus doesn't have access to " + "set_join_pathlist_hook, which doesn't guarantee correct" + "query results. Note that in PG17+, this GUC has no effect" + "and the user can run such queries"), + &EnableOuterJoinsWithPseudoconstantQualsPrePG17, + false, + PGC_USERSET, + GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE, + NULL, NULL, NULL); + DefineCustomBoolVariable( "citus.enable_repartition_joins", gettext_noop("Allows Citus to repartition data between nodes."), diff --git a/src/include/distributed/recursive_planning.h b/src/include/distributed/recursive_planning.h index c37eba343..c2fb25047 100644 --- a/src/include/distributed/recursive_planning.h +++ b/src/include/distributed/recursive_planning.h @@ -20,6 +20,7 @@ #include "distributed/log_utils.h" #include "distributed/relation_restriction_equivalence.h" +extern bool EnableOuterJoinsWithPseudoconstantQualsPrePG17; typedef struct RecursivePlanningContextInternal RecursivePlanningContext; typedef struct RangeTblEntryIndex