Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita1b8c41

Browse files
committed
Make some small planner API cleanups.
Move a few very simple node-creation and node-type-testing functionsfrom the planner's clauses.c to nodes/makefuncs and nodes/nodeFuncs.There's nothing planner-specific about them, as evidenced by thenumber of other places that were using them.While at it, rename and_clause() etc to is_andclause() etc, to clarifythat they are node-type-testing functions not node-creation functions.And use "static inline" implementations for the shortest ones.Also, modify flatten_join_alias_vars() and some subsidiary functionsto take a Query not a PlannerInfo to define the join structure thatVars should be translated according to. They were only using the"parse" field of the PlannerInfo anyway, so this just requires removingone level of indirection. The advantage is that now parse_agg.c canuse flatten_join_alias_vars() without the horrid kluge of creating anincomplete PlannerInfo, which will allow that file to be decoupled fromrelation.h in a subsequent patch.Discussion:https://postgr.es/m/11460.1548706639@sss.pgh.pa.us
1 parente77cfa5 commita1b8c41

File tree

30 files changed

+309
-345
lines changed

30 files changed

+309
-345
lines changed

‎src/backend/commands/explain.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include"foreign/fdwapi.h"
2323
#include"jit/jit.h"
2424
#include"nodes/extensible.h"
25+
#include"nodes/makefuncs.h"
2526
#include"nodes/nodeFuncs.h"
2627
#include"optimizer/clauses.h"
2728
#include"optimizer/planmain.h"

‎src/backend/executor/nodeSubplan.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
#include"executor/executor.h"
3434
#include"executor/nodeSubplan.h"
3535
#include"nodes/makefuncs.h"
36+
#include"nodes/nodeFuncs.h"
3637
#include"miscadmin.h"
37-
#include"optimizer/clauses.h"
3838
#include"utils/array.h"
3939
#include"utils/lsyscache.h"
4040
#include"utils/memutils.h"
@@ -888,7 +888,7 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
888888
/* single combining operator */
889889
oplist=list_make1(subplan->testexpr);
890890
}
891-
elseif (and_clause((Node*)subplan->testexpr))
891+
elseif (is_andclause(subplan->testexpr))
892892
{
893893
/* multiple combining operators */
894894
oplist=castNode(BoolExpr,subplan->testexpr)->args;

‎src/backend/executor/nodeTidscan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include"executor/execdebug.h"
2929
#include"executor/nodeTidscan.h"
3030
#include"miscadmin.h"
31-
#include"optimizer/clauses.h"
31+
#include"nodes/nodeFuncs.h"
3232
#include"storage/bufmgr.h"
3333
#include"utils/array.h"
3434
#include"utils/rel.h"

‎src/backend/nodes/makefuncs.c

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,141 @@ makeFuncCall(List *name, List *args, int location)
598598
returnn;
599599
}
600600

601+
/*
602+
* make_opclause
603+
* Creates an operator clause given its operator info, left operand
604+
* and right operand (pass NULL to create single-operand clause),
605+
* and collation info.
606+
*/
607+
Expr*
608+
make_opclause(Oidopno,Oidopresulttype,boolopretset,
609+
Expr*leftop,Expr*rightop,
610+
Oidopcollid,Oidinputcollid)
611+
{
612+
OpExpr*expr=makeNode(OpExpr);
613+
614+
expr->opno=opno;
615+
expr->opfuncid=InvalidOid;
616+
expr->opresulttype=opresulttype;
617+
expr->opretset=opretset;
618+
expr->opcollid=opcollid;
619+
expr->inputcollid=inputcollid;
620+
if (rightop)
621+
expr->args=list_make2(leftop,rightop);
622+
else
623+
expr->args=list_make1(leftop);
624+
expr->location=-1;
625+
return (Expr*)expr;
626+
}
627+
628+
/*
629+
* make_andclause
630+
*
631+
* Creates an 'and' clause given a list of its subclauses.
632+
*/
633+
Expr*
634+
make_andclause(List*andclauses)
635+
{
636+
BoolExpr*expr=makeNode(BoolExpr);
637+
638+
expr->boolop=AND_EXPR;
639+
expr->args=andclauses;
640+
expr->location=-1;
641+
return (Expr*)expr;
642+
}
643+
644+
/*
645+
* make_orclause
646+
*
647+
* Creates an 'or' clause given a list of its subclauses.
648+
*/
649+
Expr*
650+
make_orclause(List*orclauses)
651+
{
652+
BoolExpr*expr=makeNode(BoolExpr);
653+
654+
expr->boolop=OR_EXPR;
655+
expr->args=orclauses;
656+
expr->location=-1;
657+
return (Expr*)expr;
658+
}
659+
660+
/*
661+
* make_notclause
662+
*
663+
* Create a 'not' clause given the expression to be negated.
664+
*/
665+
Expr*
666+
make_notclause(Expr*notclause)
667+
{
668+
BoolExpr*expr=makeNode(BoolExpr);
669+
670+
expr->boolop=NOT_EXPR;
671+
expr->args=list_make1(notclause);
672+
expr->location=-1;
673+
return (Expr*)expr;
674+
}
675+
676+
/*
677+
* make_and_qual
678+
*
679+
* Variant of make_andclause for ANDing two qual conditions together.
680+
* Qual conditions have the property that a NULL nodetree is interpreted
681+
* as 'true'.
682+
*
683+
* NB: this makes no attempt to preserve AND/OR flatness; so it should not
684+
* be used on a qual that has already been run through prepqual.c.
685+
*/
686+
Node*
687+
make_and_qual(Node*qual1,Node*qual2)
688+
{
689+
if (qual1==NULL)
690+
returnqual2;
691+
if (qual2==NULL)
692+
returnqual1;
693+
return (Node*)make_andclause(list_make2(qual1,qual2));
694+
}
695+
696+
/*
697+
* The planner and executor usually represent qualification expressions
698+
* as lists of boolean expressions with implicit AND semantics.
699+
*
700+
* These functions convert between an AND-semantics expression list and the
701+
* ordinary representation of a boolean expression.
702+
*
703+
* Note that an empty list is considered equivalent to TRUE.
704+
*/
705+
Expr*
706+
make_ands_explicit(List*andclauses)
707+
{
708+
if (andclauses==NIL)
709+
return (Expr*)makeBoolConst(true, false);
710+
elseif (list_length(andclauses)==1)
711+
return (Expr*)linitial(andclauses);
712+
else
713+
returnmake_andclause(andclauses);
714+
}
715+
716+
List*
717+
make_ands_implicit(Expr*clause)
718+
{
719+
/*
720+
* NB: because the parser sets the qual field to NULL in a query that has
721+
* no WHERE clause, we must consider a NULL input clause as TRUE, even
722+
* though one might more reasonably think it FALSE.
723+
*/
724+
if (clause==NULL)
725+
returnNIL;/* NULL -> NIL list == TRUE */
726+
elseif (is_andclause(clause))
727+
return ((BoolExpr*)clause)->args;
728+
elseif (IsA(clause,Const)&&
729+
!((Const*)clause)->constisnull&&
730+
DatumGetBool(((Const*)clause)->constvalue))
731+
returnNIL;/* constant TRUE input -> NIL list */
732+
else
733+
returnlist_make1(clause);
734+
}
735+
601736
/*
602737
* makeGroupingSet
603738
*

‎src/backend/nodes/print.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
#include"access/printtup.h"
2323
#include"lib/stringinfo.h"
24+
#include"nodes/nodeFuncs.h"
2425
#include"nodes/print.h"
25-
#include"optimizer/clauses.h"
26+
#include"nodes/relation.h"
2627
#include"parser/parsetree.h"
2728
#include"utils/lsyscache.h"
2829

‎src/backend/optimizer/path/clausesel.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include"postgres.h"
1616

1717
#include"nodes/makefuncs.h"
18+
#include"nodes/nodeFuncs.h"
1819
#include"optimizer/clauses.h"
1920
#include"optimizer/cost.h"
2021
#include"optimizer/pathnode.h"
@@ -688,7 +689,7 @@ clause_selectivity(PlannerInfo *root,
688689
/* XXX any way to do better than default? */
689690
}
690691
}
691-
elseif (not_clause(clause))
692+
elseif (is_notclause(clause))
692693
{
693694
/* inverse of the selectivity of the underlying clause */
694695
s1=1.0-clause_selectivity(root,
@@ -697,7 +698,7 @@ clause_selectivity(PlannerInfo *root,
697698
jointype,
698699
sjinfo);
699700
}
700-
elseif (and_clause(clause))
701+
elseif (is_andclause(clause))
701702
{
702703
/* share code with clauselist_selectivity() */
703704
s1=clauselist_selectivity(root,
@@ -706,7 +707,7 @@ clause_selectivity(PlannerInfo *root,
706707
jointype,
707708
sjinfo);
708709
}
709-
elseif (or_clause(clause))
710+
elseif (is_orclause(clause))
710711
{
711712
/*
712713
* Selectivities for an OR clause are computed as s1+s2 - s1*s2 to

‎src/backend/optimizer/path/costsize.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
#include"executor/executor.h"
8080
#include"executor/nodeHash.h"
8181
#include"miscadmin.h"
82+
#include"nodes/makefuncs.h"
8283
#include"nodes/nodeFuncs.h"
8384
#include"optimizer/clauses.h"
8485
#include"optimizer/cost.h"

‎src/backend/optimizer/path/indxpath.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
12971297
List*indlist;
12981298

12991299
/* OR arguments should be ANDs or sub-RestrictInfos */
1300-
if (and_clause(orarg))
1300+
if (is_andclause(orarg))
13011301
{
13021302
List*andargs= ((BoolExpr*)orarg)->args;
13031303

@@ -3368,7 +3368,7 @@ match_boolean_index_clause(Node *clause,
33683368
if (match_index_to_operand(clause,indexcol,index))
33693369
return true;
33703370
/* NOT clause? */
3371-
if (not_clause(clause))
3371+
if (is_notclause(clause))
33723372
{
33733373
if (match_index_to_operand((Node*)get_notclausearg((Expr*)clause),
33743374
indexcol,index))
@@ -3680,7 +3680,7 @@ expand_boolean_index_clause(Node *clause,
36803680
InvalidOid,InvalidOid);
36813681
}
36823682
/* NOT clause? */
3683-
if (not_clause(clause))
3683+
if (is_notclause(clause))
36843684
{
36853685
Node*arg= (Node*)get_notclausearg((Expr*)clause);
36863686

‎src/backend/optimizer/path/joinrels.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include"postgres.h"
1616

1717
#include"miscadmin.h"
18+
#include"nodes/nodeFuncs.h"
1819
#include"optimizer/appendinfo.h"
1920
#include"optimizer/clauses.h"
2021
#include"optimizer/joininfo.h"
@@ -1554,8 +1555,7 @@ have_partkey_equi_join(RelOptInfo *joinrel,
15541555
if (!rinfo->mergeopfamilies&& !OidIsValid(rinfo->hashjoinoperator))
15551556
continue;
15561557

1557-
opexpr= (OpExpr*)rinfo->clause;
1558-
Assert(is_opclause(opexpr));
1558+
opexpr=castNode(OpExpr,rinfo->clause);
15591559

15601560
/*
15611561
* The equi-join between partition keys is strict if equi-join between

‎src/backend/optimizer/path/tidpath.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ TidQualFromRestrictInfoList(List *rlist, RelOptInfo *rel)
250250
List*sublist;
251251

252252
/* OR arguments should be ANDs or sub-RestrictInfos */
253-
if (and_clause(orarg))
253+
if (is_andclause(orarg))
254254
{
255255
List*andargs= ((BoolExpr*)orarg)->args;
256256

‎src/backend/optimizer/plan/initsplan.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include"catalog/pg_type.h"
1818
#include"catalog/pg_class.h"
19+
#include"nodes/makefuncs.h"
1920
#include"nodes/nodeFuncs.h"
2021
#include"optimizer/clauses.h"
2122
#include"optimizer/cost.h"

‎src/backend/optimizer/plan/planner.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,8 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
849849
*/
850850
if (rte->lateral&&root->hasJoinRTEs)
851851
rte->subquery= (Query*)
852-
flatten_join_alias_vars(root, (Node*)rte->subquery);
852+
flatten_join_alias_vars(root->parse,
853+
(Node*)rte->subquery);
853854
}
854855
elseif (rte->rtekind==RTE_FUNCTION)
855856
{
@@ -1054,7 +1055,7 @@ preprocess_expression(PlannerInfo *root, Node *expr, int kind)
10541055
kind==EXPRKIND_VALUES||
10551056
kind==EXPRKIND_TABLESAMPLE||
10561057
kind==EXPRKIND_TABLEFUNC))
1057-
expr=flatten_join_alias_vars(root,expr);
1058+
expr=flatten_join_alias_vars(root->parse,expr);
10581059

10591060
/*
10601061
* Simplify constant expressions.

‎src/backend/optimizer/plan/subselect.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ testexpr_is_hashable(Node *testexpr)
739739
if (hash_ok_operator((OpExpr*)testexpr))
740740
return true;
741741
}
742-
elseif (and_clause(testexpr))
742+
elseif (is_andclause(testexpr))
743743
{
744744
ListCell*l;
745745

@@ -1693,7 +1693,7 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context)
16931693
* propagates down in both cases. (Note that this is unlike the meaning
16941694
* of "top level qual" used in most other places in Postgres.)
16951695
*/
1696-
if (and_clause(node))
1696+
if (is_andclause(node))
16971697
{
16981698
List*newargs=NIL;
16991699
ListCell*l;
@@ -1706,15 +1706,15 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context)
17061706
Node*newarg;
17071707

17081708
newarg=process_sublinks_mutator(lfirst(l),&locContext);
1709-
if (and_clause(newarg))
1709+
if (is_andclause(newarg))
17101710
newargs=list_concat(newargs, ((BoolExpr*)newarg)->args);
17111711
else
17121712
newargs=lappend(newargs,newarg);
17131713
}
17141714
return (Node*)make_andclause(newargs);
17151715
}
17161716

1717-
if (or_clause(node))
1717+
if (is_orclause(node))
17181718
{
17191719
List*newargs=NIL;
17201720
ListCell*l;
@@ -1727,7 +1727,7 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context)
17271727
Node*newarg;
17281728

17291729
newarg=process_sublinks_mutator(lfirst(l),&locContext);
1730-
if (or_clause(newarg))
1730+
if (is_orclause(newarg))
17311731
newargs=list_concat(newargs, ((BoolExpr*)newarg)->args);
17321732
else
17331733
newargs=lappend(newargs,newarg);

‎src/backend/optimizer/prep/prepjointree.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ pull_up_sublinks_qual_recurse(PlannerInfo *root, Node *node,
497497
/* Else return it unmodified */
498498
returnnode;
499499
}
500-
if (not_clause(node))
500+
if (is_notclause(node))
501501
{
502502
/* If the immediate argument of NOT is EXISTS, try to convert */
503503
SubLink*sublink= (SubLink*)get_notclausearg((Expr*)node);
@@ -564,7 +564,7 @@ pull_up_sublinks_qual_recurse(PlannerInfo *root, Node *node,
564564
/* Else return it unmodified */
565565
returnnode;
566566
}
567-
if (and_clause(node))
567+
if (is_andclause(node))
568568
{
569569
/* Recurse into AND clause */
570570
List*newclauses=NIL;
@@ -968,7 +968,7 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte,
968968
* maybe even in the rewriter; but for now let's just fix this case here.)
969969
*/
970970
subquery->targetList= (List*)
971-
flatten_join_alias_vars(subroot, (Node*)subquery->targetList);
971+
flatten_join_alias_vars(subroot->parse, (Node*)subquery->targetList);
972972

973973
/*
974974
* Adjust level-0 varnos in subquery so that we can append its rangetable
@@ -3317,11 +3317,11 @@ get_relids_in_jointree(Node *jtnode, bool include_joins)
33173317
* get_relids_for_join: get set of base RT indexes making up a join
33183318
*/
33193319
Relids
3320-
get_relids_for_join(PlannerInfo*root,intjoinrelid)
3320+
get_relids_for_join(Query*query,intjoinrelid)
33213321
{
33223322
Node*jtnode;
33233323

3324-
jtnode=find_jointree_node_for_rel((Node*)root->parse->jointree,
3324+
jtnode=find_jointree_node_for_rel((Node*)query->jointree,
33253325
joinrelid);
33263326
if (!jtnode)
33273327
elog(ERROR,"could not find join node %d",joinrelid);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp