PostgreSQL Source Code  git master
restrictinfo.h File Reference
#include "nodes/pathnodes.h"
Include dependency graph for restrictinfo.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define make_simple_restrictinfo(root, clause)   make_restrictinfo(root, clause, true, false, false, 0, NULL, NULL, NULL)
 

Functions

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)
 

Macro Definition Documentation

◆ make_simple_restrictinfo

#define make_simple_restrictinfo (   root,
  clause 
)    make_restrictinfo(root, clause, true, false, false, 0, NULL, NULL, NULL)

Function Documentation

◆ commute_restrictinfo()

RestrictInfo* commute_restrictinfo ( RestrictInfo rinfo,
Oid  comm_op 
)

Definition at line 317 of file restrictinfo.c.

References OpExpr::args, Assert, castNode, RestrictInfo::clause, 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().

318 {
319  RestrictInfo *result;
320  OpExpr *newclause;
321  OpExpr *clause = castNode(OpExpr, rinfo->clause);
322 
323  Assert(list_length(clause->args) == 2);
324 
325  /* flat-copy all the fields of clause ... */
326  newclause = makeNode(OpExpr);
327  memcpy(newclause, clause, sizeof(OpExpr));
328 
329  /* ... and adjust those we need to change to commute it */
330  newclause->opno = comm_op;
331  newclause->opfuncid = InvalidOid;
332  newclause->args = list_make2(lsecond(clause->args),
333  linitial(clause->args));
334 
335  /* likewise, flat-copy all the fields of rinfo ... */
336  result = makeNode(RestrictInfo);
337  memcpy(result, rinfo, sizeof(RestrictInfo));
338 
339  /*
340  * ... and adjust those we need to change. Note in particular that we can
341  * preserve any cached selectivity or cost estimates, since those ought to
342  * be the same for the new clause. Likewise we can keep the source's
343  * parent_ec.
344  */
345  result->clause = (Expr *) newclause;
346  result->left_relids = rinfo->right_relids;
347  result->right_relids = rinfo->left_relids;
348  Assert(result->orclause == NULL);
349  result->left_ec = rinfo->right_ec;
350  result->right_ec = rinfo->left_ec;
351  result->left_em = rinfo->right_em;
352  result->right_em = rinfo->left_em;
353  result->scansel_cache = NIL; /* not worth updating this */
354  if (rinfo->hashjoinoperator == clause->opno)
355  result->hashjoinoperator = comm_op;
356  else
357  result->hashjoinoperator = InvalidOid;
358  result->left_bucketsize = rinfo->right_bucketsize;
359  result->right_bucketsize = rinfo->left_bucketsize;
360  result->left_mcvfreq = rinfo->right_mcvfreq;
361  result->right_mcvfreq = rinfo->left_mcvfreq;
362 
363  return result;
364 }
#define list_make2(x1, x2)
Definition: pg_list.h:208
#define NIL
Definition: pg_list.h:65
Selectivity right_mcvfreq
Definition: pathnodes.h:2070
#define castNode(_type_, nodeptr)
Definition: nodes.h:602
Expr * orclause
Definition: pathnodes.h:2037
Relids left_relids
Definition: pathnodes.h:2033
EquivalenceClass * right_ec
Definition: pathnodes.h:2055
#define lsecond(l)
Definition: pg_list.h:179
#define linitial(l)
Definition: pg_list.h:174
EquivalenceMember * left_em
Definition: pathnodes.h:2056
EquivalenceMember * right_em
Definition: pathnodes.h:2057
Expr * clause
Definition: pathnodes.h:2006
Oid opfuncid
Definition: primnodes.h:538
#define InvalidOid
Definition: postgres_ext.h:36
Selectivity left_bucketsize
Definition: pathnodes.h:2067
#define makeNode(_type_)
Definition: nodes.h:581
Relids right_relids
Definition: pathnodes.h:2034
#define Assert(condition)
Definition: c.h:804
Selectivity left_mcvfreq
Definition: pathnodes.h:2069
Oid hashjoinoperator
Definition: pathnodes.h:2064
static int list_length(const List *l)
Definition: pg_list.h:149
Selectivity right_bucketsize
Definition: pathnodes.h:2068
EquivalenceClass * left_ec
Definition: pathnodes.h:2054
Oid opno
Definition: primnodes.h:537
List * args
Definition: primnodes.h:543
List * scansel_cache
Definition: pathnodes.h:2058

◆ 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 460 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().

464 {
465  ListCell *l;
466 
467  *joinquals = NIL;
468  *otherquals = NIL;
469 
470  foreach(l, restrictinfo_list)
471  {
473 
474  if (RINFO_IS_PUSHED_DOWN(rinfo, joinrelids))
475  {
476  if (!rinfo->pseudoconstant)
477  *otherquals = lappend(*otherquals, rinfo->clause);
478  }
479  else
480  {
481  /* joinquals shouldn't have been marked pseudoconstant */
482  Assert(!rinfo->pseudoconstant);
483  *joinquals = lappend(*joinquals, rinfo->clause);
484  }
485  }
486 }
#define NIL
Definition: pg_list.h:65
bool pseudoconstant
Definition: pathnodes.h:2014
#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:2006
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids)
Definition: pathnodes.h:2083
#define Assert(condition)
Definition: c.h:804

◆ get_actual_clauses()

List* get_actual_clauses ( List restrictinfo_list)

Definition at line 410 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().

411 {
412  List *result = NIL;
413  ListCell *l;
414 
415  foreach(l, restrictinfo_list)
416  {
418 
419  Assert(!rinfo->pseudoconstant);
420 
421  result = lappend(result, rinfo->clause);
422  }
423  return result;
424 }
#define NIL
Definition: pg_list.h:65
bool pseudoconstant
Definition: pathnodes.h:2014
#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:2006
#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 588 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().

591 {
592  /* Clause must be evaluable given available context */
593  if (!bms_is_subset(rinfo->clause_relids, current_and_outer))
594  return false;
595 
596  /* Clause must physically reference at least one target rel */
597  if (!bms_overlap(currentrelids, rinfo->clause_relids))
598  return false;
599 
600  /* Cannot move an outer-join clause into the join's outer side */
601  if (bms_overlap(currentrelids, rinfo->outer_relids))
602  return false;
603 
604  /*
605  * Target rel(s) must not be nullable below the clause. This is
606  * approximate, in the safe direction, because the current join might be
607  * above the join where the nulling would happen, in which case the clause
608  * would work correctly here. But we don't have enough info to be sure.
609  */
610  if (bms_overlap(currentrelids, rinfo->nullable_relids))
611  return false;
612 
613  return true;
614 }
Relids clause_relids
Definition: pathnodes.h:2021
Relids outer_relids
Definition: pathnodes.h:2027
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
Definition: bitmapset.c:315
Relids nullable_relids
Definition: pathnodes.h:2030
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 515 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().

516 {
517  /* Clause must physically reference target rel */
518  if (!bms_is_member(baserel->relid, rinfo->clause_relids))
519  return false;
520 
521  /* Cannot move an outer-join clause into the join's outer side */
522  if (bms_is_member(baserel->relid, rinfo->outer_relids))
523  return false;
524 
525  /* Target rel must not be nullable below the clause */
526  if (bms_is_member(baserel->relid, rinfo->nullable_relids))
527  return false;
528 
529  /* Clause must not use any rels with LATERAL references to this rel */
530  if (bms_overlap(baserel->lateral_referencers, rinfo->clause_relids))
531  return false;
532 
533  return true;
534 }
Relids clause_relids
Definition: pathnodes.h:2021
Relids outer_relids
Definition: pathnodes.h:2027
Index relid
Definition: pathnodes.h:698
Relids lateral_referencers
Definition: pathnodes.h:706
Relids nullable_relids
Definition: pathnodes.h:2030
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:234
#define Assert(condition)
Definition: c.h:804

◆ restriction_is_or_clause()

bool restriction_is_or_clause ( RestrictInfo restrictinfo)

Definition at line 372 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().

373 {
374  if (restrictinfo->orclause != NULL)
375  return true;
376  else
377  return false;
378 }
Expr * orclause
Definition: pathnodes.h:2037

◆ restriction_is_securely_promotable()

bool restriction_is_securely_promotable ( RestrictInfo restrictinfo,
RelOptInfo rel 
)

Definition at line 387 of file restrictinfo.c.

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

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

389 {
390  /*
391  * It's okay if there are no baserestrictinfo clauses for the rel that
392  * would need to go before this one, *or* if this one is leakproof.
393  */
394  if (restrictinfo->security_level <= rel->baserestrict_min_security ||
395  restrictinfo->leakproof)
396  return true;
397  else
398  return false;
399 }
Index security_level
Definition: pathnodes.h:2018
bool leakproof
Definition: pathnodes.h:2016
Index baserestrict_min_security
Definition: pathnodes.h:736