joininfo.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * joininfo.c
  4.  *   JoinInfo node manipulation routines
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/util/joininfo.c,v 1.21.2.1 1999/08/02 06:27:07 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "optimizer/clauses.h"
  16. #include "optimizer/joininfo.h"
  17. /*
  18.  * joininfo_member
  19.  *   Determines whether a node has already been created for a join
  20.  *   between a set of join relations and the relation described by
  21.  *   'joininfo_list'.
  22.  *
  23.  * 'join_relids' is a list of relids corresponding to the join relation
  24.  * 'joininfo_list' is the list of joininfo nodes against which this is
  25.  * checked
  26.  *
  27.  * Returns the corresponding node in 'joininfo_list' if such a node
  28.  * exists.
  29.  *
  30.  */
  31. JoinInfo   *
  32. joininfo_member(List *join_relids, List *joininfo_list)
  33. {
  34. List    *i;
  35. foreach(i, joininfo_list)
  36. {
  37. JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
  38. if (same(join_relids, joininfo->unjoined_relids))
  39. return joininfo;
  40. }
  41. return NULL;
  42. }
  43. /*
  44.  * find_joininfo_node
  45.  *   Find the joininfo node within a relation entry corresponding
  46.  *   to a join between 'this_rel' and the relations in 'join_relids'. A
  47.  *   new node is created and added to the relation entry's joininfo
  48.  *   field if the desired one can't be found.
  49.  *
  50.  * Returns a joininfo node.
  51.  *
  52.  */
  53. JoinInfo   *
  54. find_joininfo_node(RelOptInfo *this_rel, Relids join_relids)
  55. {
  56. JoinInfo   *joininfo = joininfo_member(join_relids,
  57.    this_rel->joininfo);
  58. if (joininfo == NULL)
  59. {
  60. joininfo = makeNode(JoinInfo);
  61. joininfo->unjoined_relids = join_relids;
  62. joininfo->jinfo_restrictinfo = NIL;
  63. joininfo->mergejoinable = false;
  64. joininfo->hashjoinable = false;
  65. this_rel->joininfo = lcons(joininfo, this_rel->joininfo);
  66. }
  67. return joininfo;
  68. }
  69. /*
  70.  * other_join_clause_var
  71.  *   Determines whether a var node is contained within a joinclause
  72.  *   of the form(op var var).
  73.  *
  74.  * Returns the other var node in the joinclause if it is, nil if not.
  75.  *
  76.  */
  77. Var *
  78. other_join_clause_var(Var *var, Expr *clause)
  79. {
  80. Var    *retval;
  81. Var    *l,
  82.    *r;
  83. retval = (Var *) NULL;
  84. if (var != NULL && is_joinable((Node *) clause))
  85. {
  86. l = (Var *) get_leftop(clause);
  87. r = (Var *) get_rightop(clause);
  88. if (equal(var, l))
  89. retval = r;
  90. else if (equal(var, r))
  91. retval = l;
  92. }
  93. return retval;
  94. }