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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * hashutils.c
  4.  *   Utilities for finding applicable merge clauses and pathkeys
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.16.2.1 1999/08/02 06:26:57 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "optimizer/clauses.h"
  16. #include "optimizer/paths.h"
  17. static HashInfo *match_hashop_hashinfo(Oid hashop, List *hashinfo_list);
  18. /*
  19.  * group_clauses_by_hashop
  20.  *   If a join clause node in 'restrictinfo_list' is hashjoinable, store
  21.  *   it within a hashinfo node containing other clause nodes with the same
  22.  *   hash operator.
  23.  *
  24.  * 'restrictinfo_list' is the list of restrictinfo nodes
  25.  * 'inner_relids' is the list of relids in the inner join relation
  26.  *  (used to determine whether a join var is inner or outer)
  27.  *
  28.  * Returns the new list of hashinfo nodes.
  29.  *
  30.  */
  31. List *
  32. group_clauses_by_hashop(List *restrictinfo_list,
  33. Relids inner_relids)
  34. {
  35. List    *hashinfo_list = NIL;
  36. RestrictInfo *restrictinfo;
  37. List    *i;
  38. Oid hashjoinop;
  39. foreach(i, restrictinfo_list)
  40. {
  41. restrictinfo = (RestrictInfo *) lfirst(i);
  42. hashjoinop = restrictinfo->hashjoinoperator;
  43. /*
  44.  * Create a new hashinfo node and add it to 'hashinfo_list' if one
  45.  * does not yet exist for this hash operator.
  46.  */
  47. if (hashjoinop)
  48. {
  49. Expr    *clause = restrictinfo->clause;
  50. Var    *leftop = get_leftop(clause);
  51. Var    *rightop = get_rightop(clause);
  52. HashInfo   *xhashinfo;
  53. JoinKey    *joinkey;
  54. xhashinfo = match_hashop_hashinfo(hashjoinop, hashinfo_list);
  55. joinkey = makeNode(JoinKey);
  56. if (intMember(leftop->varno, inner_relids))
  57. {
  58. joinkey->outer = rightop;
  59. joinkey->inner = leftop;
  60. }
  61. else
  62. {
  63. joinkey->outer = leftop;
  64. joinkey->inner = rightop;
  65. }
  66. if (xhashinfo == NULL)
  67. {
  68. xhashinfo = makeNode(HashInfo);
  69. xhashinfo->hashop = hashjoinop;
  70. xhashinfo->jmethod.jmkeys = NIL;
  71. xhashinfo->jmethod.clauses = NIL;
  72. hashinfo_list = lcons(xhashinfo, hashinfo_list);
  73. }
  74. xhashinfo->jmethod.clauses = lcons(clause,
  75.  xhashinfo->jmethod.clauses);
  76. xhashinfo->jmethod.jmkeys = lcons(joinkey,
  77.   xhashinfo->jmethod.jmkeys);
  78. }
  79. }
  80. return hashinfo_list;
  81. }
  82. /*
  83.  * match_hashop_hashinfo
  84.  *   Searches the list 'hashinfo_list' for a hashinfo node whose hash op
  85.  *   field equals 'hashop'.
  86.  *
  87.  * Returns the node if it exists.
  88.  *
  89.  */
  90. static HashInfo *
  91. match_hashop_hashinfo(Oid hashop, List *hashinfo_list)
  92. {
  93. Oid key = 0;
  94. HashInfo   *xhashinfo = (HashInfo *) NULL;
  95. List    *i = NIL;
  96. foreach(i, hashinfo_list)
  97. {
  98. xhashinfo = (HashInfo *) lfirst(i);
  99. key = xhashinfo->hashop;
  100. if (hashop == key)
  101. { /* found */
  102. return xhashinfo; /* should be a hashinfo node ! */
  103. }
  104. }
  105. return (HashInfo *) NIL;
  106. }