PostgreSQL Source Code  git master
restrictinfo.c File Reference
#include "postgres.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/clauses.h"
#include "optimizer/optimizer.h"
#include "optimizer/restrictinfo.h"
Include dependency graph for restrictinfo.c:

Go to the source code of this file.

Functions

static RestrictInfomake_restrictinfo_internal (PlannerInfo *root, Expr *clause, Expr *orclause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
 
static Exprmake_sub_restrictinfos (PlannerInfo *root, Expr *clause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
 
RestrictInfomake_restrictinfo (PlannerInfo *root, Expr *clause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
 
RestrictInfocommute_restrictinfo (RestrictInfo *rinfo, Oid comm_op)
 
bool restriction_is_or_clause (RestrictInfo *restrictinfo)
 
bool restriction_is_securely_promotable (RestrictInfo *restrictinfo, RelOptInfo *rel)
 
Listget_actual_clauses (List *restrictinfo_list)
 
Listextract_actual_clauses (List *restrictinfo_list, bool pseudoconstant)
 
void extract_actual_join_clauses (List *restrictinfo_list, Relids joinrelids, List **joinquals, List **otherquals)
 
bool join_clause_is_movable_to (RestrictInfo *rinfo, RelOptInfo *baserel)
 
bool join_clause_is_movable_into (RestrictInfo *rinfo, Relids currentrelids, Relids current_and_outer)
 

Function Documentation

◆ commute_restrictinfo()

RestrictInfo* commute_restrictinfo ( RestrictInfo rinfo,
Oid  comm_op 
)

Definition at line 326 of file restrictinfo.c.

References OpExpr::args, Assert, castNode, RestrictInfo::clause, RestrictInfo::hasheqoperator, RestrictInfo::hashjoinoperator, InvalidOid, RestrictInfo::left_bucketsize, RestrictInfo::left_ec, RestrictInfo::left_em, RestrictInfo::left_mcvfreq, RestrictInfo::left_relids, linitial, list_length(), list_make2, lsecond, makeNode, NIL, OpExpr::opfuncid, OpExpr::opno, RestrictInfo::orclause, RestrictInfo::right_bucketsize, RestrictInfo::right_ec, RestrictInfo::right_em, RestrictInfo::right_mcvfreq, RestrictInfo::right_relids, and RestrictInfo::scansel_cache.

Referenced by match_opclause_to_indexcol().

327 {
328  RestrictInfo *result;
329  OpExpr *newclause;
330  OpExpr *clause = castNode(OpExpr, rinfo->clause);
331 
332  Assert(list_length(clause->args) == 2);
333 
334  /* flat-copy all the fields of clause ... */
335  newclause = makeNode(OpExpr);
336  memcpy(newclause, clause, sizeof(OpExpr));
337 
338  /* ... and adjust those we need to change to commute it */
339  newclause->opno = comm_op;
340  newclause->opfuncid = InvalidOid;
341  newclause->args = list_make2(lsecond(clause->args),
342  linitial(clause->args));
343 
344  /* likewise, flat-copy all the fields of rinfo ... */
345  result = makeNode(RestrictInfo);
346  memcpy(result, rinfo, sizeof(RestrictInfo));
347 
348  /*
349  * ... and adjust those we need to change. Note in particular that we can
350  * preserve any cached selectivity or cost estimates, since those ought to
351  * be the same for the new clause. Likewise we can keep the source's
352  * parent_ec.
353  */
354  result->clause = (Expr *) newclause;
355  result->left_relids = rinfo->right_relids;
356  result->right_relids = rinfo->left_relids;
357  Assert(result->orclause == NULL);
358  result->left_ec = rinfo->right_ec;
359  result->right_ec = rinfo->left_ec;
360  result->left_em = rinfo->right_em;
361  result->right_em = rinfo->left_em;
362  result->scansel_cache = NIL; /* not worth updating this */
363  if (rinfo->hashjoinoperator == clause->opno)
364  result->hashjoinoperator = comm_op;
365  else
366  result->hashjoinoperator = InvalidOid;
367  result->left_bucketsize = rinfo->right_bucketsize;
368  result->right_bucketsize = rinfo->left_bucketsize;
369  result->left_mcvfreq = rinfo->right_mcvfreq;
370  result->right_mcvfreq = rinfo->left_mcvfreq;
371  result->hasheqoperator = InvalidOid;
372 
373  return result;
374 }
#define list_make2(x1, x2)
Definition: pg_list.h:208
#define NIL
Definition: pg_list.h:65
Selectivity right_mcvfreq
Definition: pathnodes.h:2115
#define castNode(_type_, nodeptr)
Definition: nodes.h:608
Expr * orclause
Definition: pathnodes.h:2082
Relids left_relids
Definition: pathnodes.h:2078
EquivalenceClass * right_ec
Definition: pathnodes.h:2100
#define lsecond(l)
Definition: pg_list.h:179
#define linitial(l)
Definition: pg_list.h:174
EquivalenceMember * left_em
Definition: pathnodes.h:2101
Oid hasheqoperator
Definition: pathnodes.h:2118
EquivalenceMember * right_em
Definition: pathnodes.h:2102
Expr * clause
Definition: pathnodes.h:2048
Oid opfuncid
Definition: primnodes.h:543
#define InvalidOid
Definition: postgres_ext.h:36
Selectivity left_bucketsize
Definition: pathnodes.h:2112
#define makeNode(_type_)
Definition: nodes.h:587
Relids right_relids
Definition: pathnodes.h:2079
#define Assert(condition)
Definition: c.h:804
Selectivity left_mcvfreq
Definition: pathnodes.h:2114
Oid hashjoinoperator
Definition: pathnodes.h:2109
static int list_length(const List *l)
Definition: pg_list.h:149
Selectivity right_bucketsize
Definition: pathnodes.h:2113
EquivalenceClass * left_ec
Definition: pathnodes.h:2099
Oid opno
Definition: primnodes.h:542
List * args
Definition: primnodes.h:548
List * scansel_cache
Definition: pathnodes.h:2103

◆ extract_actual_clauses()

List* extract_actual_clauses ( List restrictinfo_list,
bool  pseudoconstant 
)

◆ extract_actual_join_clauses()

void extract_actual_join_clauses ( List restrictinfo_list,
Relids  joinrelids,
List **  joinquals,
List **  otherquals 
)

Definition at line 470 of file restrictinfo.c.

References Assert, RestrictInfo::clause, lappend(), lfirst_node, NIL, RestrictInfo::pseudoconstant, and RINFO_IS_PUSHED_DOWN.

Referenced by create_hashjoin_plan(), create_mergejoin_plan(), and create_nestloop_plan().

474 {
475  ListCell *l;
476 
477  *joinquals = NIL;
478  *otherquals = NIL;
479 
480  foreach(l, restrictinfo_list)
481  {
483 
484  if (RINFO_IS_PUSHED_DOWN(rinfo, joinrelids))
485  {
486  if (!rinfo->pseudoconstant)
487  *otherquals = lappend(*otherquals, rinfo->clause);
488  }
489  else
490  {
491  /* joinquals shouldn't have been marked pseudoconstant */
492  Assert(!rinfo->pseudoconstant);
493  *joinquals = lappend(*joinquals, rinfo->clause);
494  }
495  }
496 }
#define NIL
Definition: pg_list.h:65
bool pseudoconstant
Definition: pathnodes.h:2056
#define lfirst_node(type, lc)
Definition: pg_list.h:172
List * lappend(List *list, void *datum)
Definition: list.c:336
Expr * clause
Definition: pathnodes.h:2048
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids)
Definition: pathnodes.h:2131
#define Assert(condition)
Definition: c.h:804

◆ get_actual_clauses()

List* get_actual_clauses ( List restrictinfo_list)

Definition at line 420 of file restrictinfo.c.

References Assert, RestrictInfo::clause, lappend(), lfirst_node, NIL, and RestrictInfo::pseudoconstant.

Referenced by create_bitmap_subplan(), create_hashjoin_plan(), create_join_plan(), and create_mergejoin_plan().

421 {
422  List *result = NIL;
423  ListCell *l;
424 
425  foreach(l, restrictinfo_list)
426  {
428 
429  Assert(!rinfo->pseudoconstant);
430 
431  result = lappend(result, rinfo->clause);
432  }
433  return result;
434 }
#define NIL
Definition: pg_list.h:65
bool pseudoconstant
Definition: pathnodes.h:2056
#define lfirst_node(type, lc)
Definition: pg_list.h:172
List * lappend(List *list, void *datum)
Definition: list.c:336
Expr * clause
Definition: pathnodes.h:2048
#define Assert(condition)
Definition: c.h:804
Definition: pg_list.h:50

◆ join_clause_is_movable_into()

bool join_clause_is_movable_into ( RestrictInfo rinfo,
Relids  currentrelids,
Relids  current_and_outer 
)

Definition at line 598 of file restrictinfo.c.

References bms_is_subset(), bms_overlap(), RestrictInfo::clause_relids, RestrictInfo::nullable_relids, and RestrictInfo::outer_relids.

Referenced by create_nestloop_path(), get_baserel_parampathinfo(), get_joinrel_parampathinfo(), and has_indexed_join_quals().

601 {
602  /* Clause must be evaluable given available context */
603  if (!bms_is_subset(rinfo->clause_relids, current_and_outer))
604  return false;
605 
606  /* Clause must physically reference at least one target rel */
607  if (!bms_overlap(currentrelids, rinfo->clause_relids))
608  return false;
609 
610  /* Cannot move an outer-join clause into the join's outer side */
611  if (bms_overlap(currentrelids, rinfo->outer_relids))
612  return false;
613 
614  /*
615  * Target rel(s) must not be nullable below the clause. This is
616  * approximate, in the safe direction, because the current join might be
617  * above the join where the nulling would happen, in which case the clause
618  * would work correctly here. But we don't have enough info to be sure.
619  */
620  if (bms_overlap(currentrelids, rinfo->nullable_relids))
621  return false;
622 
623  return true;
624 }
Relids clause_relids
Definition: pathnodes.h:2066
Relids outer_relids
Definition: pathnodes.h:2072
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:315
Relids nullable_relids
Definition: pathnodes.h:2075
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:494

◆ join_clause_is_movable_to()

bool join_clause_is_movable_to ( RestrictInfo rinfo,
RelOptInfo baserel 
)

Definition at line 525 of file restrictinfo.c.

References bms_is_member(), bms_overlap(), RestrictInfo::clause_relids, RelOptInfo::lateral_referencers, RestrictInfo::nullable_relids, RestrictInfo::outer_relids, and RelOptInfo::relid.

Referenced by BuildParameterizedTidPaths(), check_index_predicates(), extract_restriction_or_clauses(), match_join_clauses_to_index(), and postgresGetForeignPaths().

526 {
527  /* Clause must physically reference target rel */
528  if (!bms_is_member(baserel->relid, rinfo->clause_relids))
529  return false;
530 
531  /* Cannot move an outer-join clause into the join's outer side */
532  if (bms_is_member(baserel->relid, rinfo->outer_relids))
533  return false;
534 
535  /* Target rel must not be nullable below the clause */
536  if (bms_is_member(baserel->relid, rinfo->nullable_relids))
537  return false;
538 
539  /* Clause must not use any rels with LATERAL references to this rel */
540  if (bms_overlap(baserel->lateral_referencers, rinfo->clause_relids))
541  return false;
542 
543  return true;
544 }
Relids clause_relids
Definition: pathnodes.h:2066
Relids outer_relids
Definition: pathnodes.h:2072
Index relid
Definition: pathnodes.h:704
Relids lateral_referencers
Definition: pathnodes.h:712
Relids nullable_relids
Definition: pathnodes.h:2075
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:494
bool bms_is_member(int x, const Bitmapset *a)
Definition: bitmapset.c:427

◆ make_restrictinfo()

RestrictInfo* make_restrictinfo ( PlannerInfo root,
Expr clause,
bool  is_pushed_down,
bool  outerjoin_delayed,
bool  pseudoconstant,
Index  security_level,
Relids  required_relids,
Relids  outer_relids,
Relids  nullable_relids 
)

Definition at line 61 of file restrictinfo.c.

References Assert, is_andclause(), is_orclause(), make_restrictinfo_internal(), and make_sub_restrictinfos().

Referenced by apply_child_basequals(), build_implied_join_equality(), consider_new_or_clause(), distribute_qual_to_rels(), foreign_grouping_ok(), process_equivalence(), and process_implied_equality().

70 {
71  /*
72  * If it's an OR clause, build a modified copy with RestrictInfos inserted
73  * above each subclause of the top-level AND/OR structure.
74  */
75  if (is_orclause(clause))
76  return (RestrictInfo *) make_sub_restrictinfos(root,
77  clause,
78  is_pushed_down,
79  outerjoin_delayed,
80  pseudoconstant,
81  security_level,
82  required_relids,
83  outer_relids,
84  nullable_relids);
85 
86  /* Shouldn't be an AND clause, else AND/OR flattening messed up */
87  Assert(!is_andclause(clause));
88 
89  return make_restrictinfo_internal(root,
90  clause,
91  NULL,
92  is_pushed_down,
93  outerjoin_delayed,
94  pseudoconstant,
95  security_level,
96  required_relids,
97  outer_relids,
98  nullable_relids);
99 }
static bool is_orclause(const void *clause)
Definition: nodeFuncs.h:106
static RestrictInfo * make_restrictinfo_internal(PlannerInfo *root, Expr *clause, Expr *orclause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
Definition: restrictinfo.c:107
static bool is_andclause(const void *clause)
Definition: nodeFuncs.h:97
static Expr * make_sub_restrictinfos(PlannerInfo *root, Expr *clause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
Definition: restrictinfo.c:243
#define Assert(condition)
Definition: c.h:804

◆ make_restrictinfo_internal()

static RestrictInfo * make_restrictinfo_internal ( PlannerInfo root,
Expr clause,
Expr orclause,
bool  is_pushed_down,
bool  outerjoin_delayed,
bool  pseudoconstant,
Index  security_level,
Relids  required_relids,
Relids  outer_relids,
Relids  nullable_relids 
)
static

Definition at line 107 of file restrictinfo.c.

References generate_unaccent_rules::args, Assert, bms_is_empty(), bms_overlap(), bms_union(), RestrictInfo::can_join, RestrictInfo::clause, RestrictInfo::clause_relids, contain_leaked_vars(), RestrictInfo::eval_cost, get_leftop(), get_rightop(), RestrictInfo::has_volatile, RestrictInfo::hasheqoperator, RestrictInfo::hashjoinoperator, InvalidOid, is_opclause(), RestrictInfo::is_pushed_down, RestrictInfo::leakproof, RestrictInfo::left_bucketsize, RestrictInfo::left_ec, RestrictInfo::left_em, RestrictInfo::left_mcvfreq, RestrictInfo::left_relids, list_length(), makeNode, RestrictInfo::mergeopfamilies, NIL, RestrictInfo::norm_selec, RestrictInfo::nullable_relids, RestrictInfo::orclause, RestrictInfo::outer_is_left, RestrictInfo::outer_relids, RestrictInfo::outer_selec, RestrictInfo::outerjoin_delayed, RestrictInfo::parent_ec, RestrictInfo::pseudoconstant, pull_varnos(), RestrictInfo::required_relids, RestrictInfo::right_bucketsize, RestrictInfo::right_ec, RestrictInfo::right_em, RestrictInfo::right_mcvfreq, RestrictInfo::right_relids, RestrictInfo::scansel_cache, RestrictInfo::security_level, QualCost::startup, and VOLATILITY_UNKNOWN.

Referenced by make_restrictinfo(), and make_sub_restrictinfos().

117 {
118  RestrictInfo *restrictinfo = makeNode(RestrictInfo);
119 
120  restrictinfo->clause = clause;
121  restrictinfo->orclause = orclause;
122  restrictinfo->is_pushed_down = is_pushed_down;
123  restrictinfo->outerjoin_delayed = outerjoin_delayed;
124  restrictinfo->pseudoconstant = pseudoconstant;
125  restrictinfo->can_join = false; /* may get set below */
126  restrictinfo->security_level = security_level;
127  restrictinfo->outer_relids = outer_relids;
128  restrictinfo->nullable_relids = nullable_relids;
129 
130  /*
131  * If it's potentially delayable by lower-level security quals, figure out
132  * whether it's leakproof. We can skip testing this for level-zero quals,
133  * since they would never get delayed on security grounds anyway.
134  */
135  if (security_level > 0)
136  restrictinfo->leakproof = !contain_leaked_vars((Node *) clause);
137  else
138  restrictinfo->leakproof = false; /* really, "don't know" */
139 
140  /*
141  * Mark volatility as unknown. The contain_volatile_functions function
142  * will determine if there are any volatile functions when called for the
143  * first time with this RestrictInfo.
144  */
145  restrictinfo->has_volatile = VOLATILITY_UNKNOWN;
146 
147  /*
148  * If it's a binary opclause, set up left/right relids info. In any case
149  * set up the total clause relids info.
150  */
151  if (is_opclause(clause) && list_length(((OpExpr *) clause)->args) == 2)
152  {
153  restrictinfo->left_relids = pull_varnos(root, get_leftop(clause));
154  restrictinfo->right_relids = pull_varnos(root, get_rightop(clause));
155 
156  restrictinfo->clause_relids = bms_union(restrictinfo->left_relids,
157  restrictinfo->right_relids);
158 
159  /*
160  * Does it look like a normal join clause, i.e., a binary operator
161  * relating expressions that come from distinct relations? If so we
162  * might be able to use it in a join algorithm. Note that this is a
163  * purely syntactic test that is made regardless of context.
164  */
165  if (!bms_is_empty(restrictinfo->left_relids) &&
166  !bms_is_empty(restrictinfo->right_relids) &&
167  !bms_overlap(restrictinfo->left_relids,
168  restrictinfo->right_relids))
169  {
170  restrictinfo->can_join = true;
171  /* pseudoconstant should certainly not be true */
172  Assert(!restrictinfo->pseudoconstant);
173  }
174  }
175  else
176  {
177  /* Not a binary opclause, so mark left/right relid sets as empty */
178  restrictinfo->left_relids = NULL;
179  restrictinfo->right_relids = NULL;
180  /* and get the total relid set the hard way */
181  restrictinfo->clause_relids = pull_varnos(root, (Node *) clause);
182  }
183 
184  /* required_relids defaults to clause_relids */
185  if (required_relids != NULL)
186  restrictinfo->required_relids = required_relids;
187  else
188  restrictinfo->required_relids = restrictinfo->clause_relids;
189 
190  /*
191  * Fill in all the cacheable fields with "not yet set" markers. None of
192  * these will be computed until/unless needed. Note in particular that we
193  * don't mark a binary opclause as mergejoinable or hashjoinable here;
194  * that happens only if it appears in the right context (top level of a
195  * joinclause list).
196  */
197  restrictinfo->parent_ec = NULL;
198 
199  restrictinfo->eval_cost.startup = -1;
200  restrictinfo->norm_selec = -1;
201  restrictinfo->outer_selec = -1;
202 
203  restrictinfo->mergeopfamilies = NIL;
204 
205  restrictinfo->left_ec = NULL;
206  restrictinfo->right_ec = NULL;
207  restrictinfo->left_em = NULL;
208  restrictinfo->right_em = NULL;
209  restrictinfo->scansel_cache = NIL;
210 
211  restrictinfo->outer_is_left = false;
212 
213  restrictinfo->hashjoinoperator = InvalidOid;
214 
215  restrictinfo->left_bucketsize = -1;
216  restrictinfo->right_bucketsize = -1;
217  restrictinfo->left_mcvfreq = -1;
218  restrictinfo->right_mcvfreq = -1;
219 
220  restrictinfo->hasheqoperator = InvalidOid;
221 
222  return restrictinfo;
223 }
QualCost eval_cost
Definition: pathnodes.h:2088
#define NIL
Definition: pg_list.h:65
Relids pull_varnos(PlannerInfo *root, Node *node)
Definition: var.c:97
bool contain_leaked_vars(Node *clause)
Definition: clauses.c:1148
Index security_level
Definition: pathnodes.h:2063
Relids required_relids
Definition: pathnodes.h:2069
Selectivity right_mcvfreq
Definition: pathnodes.h:2115
bool leakproof
Definition: pathnodes.h:2058
Expr * orclause
Definition: pathnodes.h:2082
Relids clause_relids
Definition: pathnodes.h:2066
bool pseudoconstant
Definition: pathnodes.h:2056
Definition: nodes.h:539
Relids left_relids
Definition: pathnodes.h:2078
EquivalenceClass * right_ec
Definition: pathnodes.h:2100
List * mergeopfamilies
Definition: pathnodes.h:2096
Cost startup
Definition: pathnodes.h:45
Relids outer_relids
Definition: pathnodes.h:2072
Selectivity norm_selec
Definition: pathnodes.h:2089
EquivalenceMember * left_em
Definition: pathnodes.h:2101
EquivalenceClass * parent_ec
Definition: pathnodes.h:2085
bool outerjoin_delayed
Definition: pathnodes.h:2052
bool outer_is_left
Definition: pathnodes.h:2106
Selectivity outer_selec
Definition: pathnodes.h:2092
static Node * get_leftop(const void *clause)
Definition: nodeFuncs.h:73
VolatileFunctionStatus has_volatile
Definition: pathnodes.h:2060
Oid hasheqoperator
Definition: pathnodes.h:2118
EquivalenceMember * right_em
Definition: pathnodes.h:2102
Expr * clause
Definition: pathnodes.h:2048
bool bms_is_empty(const Bitmapset *a)
Definition: bitmapset.c:701
Relids nullable_relids
Definition: pathnodes.h:2075
static Node * get_rightop(const void *clause)
Definition: nodeFuncs.h:85
#define InvalidOid
Definition: postgres_ext.h:36
bool is_pushed_down
Definition: pathnodes.h:2050
Selectivity left_bucketsize
Definition: pathnodes.h:2112
#define makeNode(_type_)
Definition: nodes.h:587
Relids right_relids
Definition: pathnodes.h:2079
#define Assert(condition)
Definition: c.h:804
Selectivity left_mcvfreq
Definition: pathnodes.h:2114
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:225
Oid hashjoinoperator
Definition: pathnodes.h:2109
static int list_length(const List *l)
Definition: pg_list.h:149
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:494
Selectivity right_bucketsize
Definition: pathnodes.h:2113
EquivalenceClass * left_ec
Definition: pathnodes.h:2099
static bool is_opclause(const void *clause)
Definition: nodeFuncs.h:66
List * scansel_cache
Definition: pathnodes.h:2103

◆ make_sub_restrictinfos()

static Expr * make_sub_restrictinfos ( PlannerInfo root,
Expr clause,
bool  is_pushed_down,
bool  outerjoin_delayed,
bool  pseudoconstant,
Index  security_level,
Relids  required_relids,
Relids  outer_relids,
Relids  nullable_relids 
)
static

Definition at line 243 of file restrictinfo.c.

References generate_unaccent_rules::args, is_andclause(), is_orclause(), lappend(), lfirst, make_andclause(), make_orclause(), make_restrictinfo_internal(), and NIL.

Referenced by make_restrictinfo().

252 {
253  if (is_orclause(clause))
254  {
255  List *orlist = NIL;
256  ListCell *temp;
257 
258  foreach(temp, ((BoolExpr *) clause)->args)
259  orlist = lappend(orlist,
261  lfirst(temp),
262  is_pushed_down,
263  outerjoin_delayed,
264  pseudoconstant,
265  security_level,
266  NULL,
267  outer_relids,
268  nullable_relids));
269  return (Expr *) make_restrictinfo_internal(root,
270  clause,
271  make_orclause(orlist),
272  is_pushed_down,
273  outerjoin_delayed,
274  pseudoconstant,
275  security_level,
276  required_relids,
277  outer_relids,
278  nullable_relids);
279  }
280  else if (is_andclause(clause))
281  {
282  List *andlist = NIL;
283  ListCell *temp;
284 
285  foreach(temp, ((BoolExpr *) clause)->args)
286  andlist = lappend(andlist,
288  lfirst(temp),
289  is_pushed_down,
290  outerjoin_delayed,
291  pseudoconstant,
292  security_level,
293  required_relids,
294  outer_relids,
295  nullable_relids));
296  return make_andclause(andlist);
297  }
298  else
299  return (Expr *) make_restrictinfo_internal(root,
300  clause,
301  NULL,
302  is_pushed_down,
303  outerjoin_delayed,
304  pseudoconstant,
305  security_level,
306  required_relids,
307  outer_relids,
308  nullable_relids);
309 }
#define NIL
Definition: pg_list.h:65
static bool is_orclause(const void *clause)
Definition: nodeFuncs.h:106
static RestrictInfo * make_restrictinfo_internal(PlannerInfo *root, Expr *clause, Expr *orclause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
Definition: restrictinfo.c:107
static bool is_andclause(const void *clause)
Definition: nodeFuncs.h:97
Expr * make_orclause(List *orclauses)
Definition: makefuncs.c:652
static Expr * make_sub_restrictinfos(PlannerInfo *root, Expr *clause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
Definition: restrictinfo.c:243
Expr * make_andclause(List *andclauses)
Definition: makefuncs.c:636
List * lappend(List *list, void *datum)
Definition: list.c:336
#define lfirst(lc)
Definition: pg_list.h:169
Definition: pg_list.h:50

◆ restriction_is_or_clause()

bool restriction_is_or_clause ( RestrictInfo restrictinfo)

Definition at line 382 of file restrictinfo.c.

References RestrictInfo::orclause.

Referenced by extract_or_clause(), extract_restriction_or_clauses(), generate_bitmap_or_paths(), match_join_clauses_to_index(), and TidQualFromRestrictInfoList().

383 {
384  if (restrictinfo->orclause != NULL)
385  return true;
386  else
387  return false;
388 }
Expr * orclause
Definition: pathnodes.h:2082

◆ restriction_is_securely_promotable()

bool restriction_is_securely_promotable ( RestrictInfo restrictinfo,
RelOptInfo rel 
)

Definition at line 397 of file restrictinfo.c.

References RelOptInfo::baserestrict_min_security, RestrictInfo::leakproof, and RestrictInfo::security_level.

Referenced by BuildParameterizedTidPaths(), match_clause_to_index(), and TidQualFromRestrictInfo().

399 {
400  /*
401  * It's okay if there are no baserestrictinfo clauses for the rel that
402  * would need to go before this one, *or* if this one is leakproof.
403  */
404  if (restrictinfo->security_level <= rel->baserestrict_min_security ||
405  restrictinfo->leakproof)
406  return true;
407  else
408  return false;
409 }
Index security_level
Definition: pathnodes.h:2063
bool leakproof
Definition: pathnodes.h:2058
Index baserestrict_min_security
Definition: pathnodes.h:742