From ab23e5ed78ff9bf1c6181622b257d2a4fbe92196 Mon Sep 17 00:00:00 2001 From: Andrey Sokolov Date: Sat, 25 Oct 2025 20:53:34 +0300 Subject: [PATCH] Don't try to use Orca for queries that it doesn't support On translating to DXL we can find out that the query is unsupported. The better time to make this decision is analyse stage, because in this case we can run Postgres planner without trying to run Orca and, as a consequence, significantly reduce planning time. Orca doesn't support gp_dist_random, queries on master-only tables, and function exec locations except for any. It's easy to detect on analyse stage, that a query contains these unsupported query properties. The number of unsupported query properties to check before translating to DXL will be increased later. --- src/backend/optimizer/plan/planner.c | 1 + src/backend/parser/analyze.c | 2 ++ src/backend/parser/parse_clause.c | 2 ++ src/backend/parser/parse_func.c | 4 ++++ src/backend/parser/parse_relation.c | 4 ++++ src/include/nodes/parsenodes.h | 1 + src/include/parser/parse_node.h | 2 ++ 7 files changed, 16 insertions(+) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index a6920be46e4..d02eed04ee6 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -231,6 +231,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) * PARALLEL RETRIEVE CURSOR is not supported by ORCA yet. */ if (optimizer && + !parse->usePostgresPlanner && GP_ROLE_DISPATCH == Gp_role && IS_QUERY_DISPATCHER() && (cursorOptions & CURSOR_OPT_PARALLEL_RETRIEVE) == 0) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index a5666f90148..a13b01b141c 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -355,6 +355,8 @@ transformStmt(ParseState *pstate, Node *parseTree) if (pstate->p_hasDynamicFunction) result->hasDynamicFunctions = true; + result->usePostgresPlanner = pstate->usePostgresPlanner; + return result; } diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 36be42a4f8d..53d610aad61 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -840,6 +840,8 @@ transformRangeFunction(ParseState *pstate, RangeFunction *r) /* Now we set our special attribute in the rte. */ rte->forceDistRandom = true; + /* Orca doesn't support gp_dist_random */ + pstate->usePostgresPlanner = true; return rte; } diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 267f5ebbbe7..dffa3695fb7 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -316,6 +316,10 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, errmsg("OVER specified, but %s is not a window function nor an aggregate function", NameListToString(funcname)), parser_errposition(pstate, location))); + + /* Orca supports only the any exec location */ + if (func_exec_location(funcid) != PROEXECLOCATION_ANY) + pstate->usePostgresPlanner = true; } else if (fdresult == FUNCDETAIL_AGGREGATE) { diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 2ebb07b1224..32698b4dbc1 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1029,6 +1029,10 @@ parserOpenTable(ParseState *pstate, const RangeVar *relation, } } + /* Orca doesn't support queries on master-only tables */ + if (rel->rd_cdbpolicy == NULL) + pstate->usePostgresPlanner = true; + cancel_parser_errposition_callback(&pcbstate); return rel; } diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index dac43d42e43..77d7be0a1c6 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -215,6 +215,7 @@ typedef struct Query */ ParentStmtType parentStmtType; bool expandMatViews; /* force expansion of materialized views during rewrite to treat as views */ + bool usePostgresPlanner; /* don't try to plan the query using Orca */ } Query; /**************************************************************************** diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h index d89088d7677..ed47ee61da8 100644 --- a/src/include/parser/parse_node.h +++ b/src/include/parser/parse_node.h @@ -177,6 +177,8 @@ struct ParseState ParseParamRefHook p_paramref_hook; CoerceParamHook p_coerce_param_hook; void *p_ref_hook_state; /* common passthrough link for above */ + bool usePostgresPlanner; /* parse analysis found out that Orca + doesn't support the query */ }; /*