diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 505ae0af85..410a14ed95 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -3655,6 +3655,40 @@ eval_const_expressions_mutator(Node *node, context); } break; + case T_Var: + if (context->root && context->root->parse->rtable) + { + Var *var; + Query *query; + RangeTblEntry *pointedNode; + + var = (Var *)node; + query = context->root->parse; + + if (var->varlevelsup != 0) + break; + + pointedNode = list_nth(query->rtable, var->varno - 1); + Assert(IsA(pointedNode, RangeTblEntry)); + + if (pointedNode->rtekind == RTE_FUNCTION && pointedNode->functions->length == 1) + { + Node *result; + RangeTblFunction *tblFunction = pointedNode->functions->head->data.ptr_value; + + Assert(IsA(tblFunction, RangeTblFunction)); + result = eval_const_expressions(context->root, tblFunction->funcexpr); + + if (result->type == T_FuncExpr) + { + pfree(result); + return node; + } + + return result; + } + } + break; default: break; } diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index cbc882d47b..eb92f556d8 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -3021,23 +3021,23 @@ select * from int4(sin(1)) q1, int4(sin(0)) q2 where q1 = thousand or q2 = thousand; - QUERY PLAN ------------------------------------------------------------------------- - Hash Join - Hash Cond: (tenk1.twothousand = int4_tbl.f1) + QUERY PLAN +------------------------------------------------------------------------- + Nested Loop -> Nested Loop - -> Nested Loop - -> Function Scan on q1 - -> Function Scan on q2 - -> Bitmap Heap Scan on tenk1 - Recheck Cond: ((q1.q1 = thousand) OR (q2.q2 = thousand)) - -> BitmapOr - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (q1.q1 = thousand) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (q2.q2 = thousand) - -> Hash - -> Seq Scan on int4_tbl + -> Hash Join + Hash Cond: (tenk1.twothousand = int4_tbl.f1) + -> Bitmap Heap Scan on tenk1 + Recheck Cond: ((1 = thousand) OR (0 = thousand)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (1 = thousand) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (0 = thousand) + -> Hash + -> Seq Scan on int4_tbl + -> Function Scan on q1 + -> Function Scan on q2 (15 rows) explain (costs off) @@ -3046,20 +3046,20 @@ select * from int4(sin(1)) q1, int4(sin(0)) q2 where thousand = (q1 + q2); - QUERY PLAN --------------------------------------------------------------- - Hash Join - Hash Cond: (tenk1.twothousand = int4_tbl.f1) + QUERY PLAN +------------------------------------------------------------------- + Nested Loop -> Nested Loop - -> Nested Loop - -> Function Scan on q1 - -> Function Scan on q2 - -> Bitmap Heap Scan on tenk1 - Recheck Cond: (thousand = (q1.q1 + q2.q2)) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (thousand = (q1.q1 + q2.q2)) - -> Hash - -> Seq Scan on int4_tbl + -> Hash Join + Hash Cond: (tenk1.twothousand = int4_tbl.f1) + -> Bitmap Heap Scan on tenk1 + Recheck Cond: (thousand = 1) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = 1) + -> Hash + -> Seq Scan on int4_tbl + -> Function Scan on q1 + -> Function Scan on q2 (12 rows) -- diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out index 34ca0ef890..973242c33c 100644 --- a/src/test/regress/expected/rangefuncs.out +++ b/src/test/regress/expected/rangefuncs.out @@ -1978,7 +1978,7 @@ select x from int8_tbl, extractq2(int8_tbl) f(x); QUERY PLAN ------------------------------------------ Nested Loop - Output: f.x + Output: int8_tbl.q2 -> Seq Scan on public.int8_tbl Output: int8_tbl.q1, int8_tbl.q2 -> Function Scan on f