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 */ }; /*