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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * prune.c
  4.  *   Routines to prune redundant paths and relations
  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/prune.c,v 1.39.2.1 1999/08/02 06:26:59 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "optimizer/cost.h"
  16. #include "optimizer/pathnode.h"
  17. #include "optimizer/paths.h"
  18. static List *merge_rel_with_same_relids(RelOptInfo *rel, Relids unjoined_relids);
  19. /*
  20.  * merge_rels_with_same_relids
  21.  *   Removes any redundant relation entries from a list of rel nodes
  22.  *   'rel_list'.  Obviously, the first relation can't be a duplicate.
  23.  *
  24.  * Returns the resulting list.
  25.  *
  26.  */
  27. void
  28. merge_rels_with_same_relids(List *rel_list)
  29. {
  30. List    *i;
  31. /*
  32.  * rel_list can shorten while running as duplicate relations are
  33.  * deleted
  34.  */
  35. foreach(i, rel_list)
  36. lnext(i) = merge_rel_with_same_relids((RelOptInfo *) lfirst(i), lnext(i));
  37. }
  38. /*
  39.  * merge_rel_with_same_relids
  40.  *   Prunes those relations from 'unjoined_relids' that are redundant with
  41.  *   'rel'.  A relation is redundant if it is built up of the same
  42.  *   relations as 'rel'.  Paths for the redundant relation are merged into
  43.  *   the pathlist of 'rel'.
  44.  *
  45.  * Returns a list of non-redundant relations, and sets the pathlist field
  46.  * of 'rel' appropriately.
  47.  *
  48.  */
  49. static List *
  50. merge_rel_with_same_relids(RelOptInfo *rel, Relids unjoined_relids)
  51. {
  52. List    *i = NIL;
  53. List    *result = NIL;
  54. foreach(i, unjoined_relids)
  55. {
  56. RelOptInfo *unjoined_rel = (RelOptInfo *) lfirst(i);
  57. if (same(rel->relids, unjoined_rel->relids))
  58. /*
  59.  * This are on the same relations, so get the best of their
  60.  * pathlists.
  61.  */
  62. rel->pathlist = add_pathlist(rel,
  63.  rel->pathlist,
  64.  unjoined_rel->pathlist);
  65. else
  66. result = lappend(result, unjoined_rel);
  67. }
  68. return result;
  69. }
  70. /*
  71.  * rels_set_cheapest
  72.  *   For each relation entry in 'rel_list' (which corresponds to a join
  73.  *   relation), set pointers to the cheapest path
  74.  */
  75. void
  76. rels_set_cheapest(List *rel_list)
  77. {
  78. List    *x = NIL;
  79. RelOptInfo *rel = (RelOptInfo *) NULL;
  80. JoinPath   *cheapest;
  81. foreach(x, rel_list)
  82. {
  83. rel = (RelOptInfo *) lfirst(x);
  84. cheapest = (JoinPath *) set_cheapest(rel, rel->pathlist);
  85. if (IsA_JoinPath(cheapest))
  86. rel->size = compute_joinrel_size(cheapest);
  87. else
  88. elog(ERROR, "non JoinPath called");
  89. }
  90. }