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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * relnode.c
  4.  *   Relation 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/relnode.c,v 1.16.2.1 1999/08/02 06:27:08 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "optimizer/internal.h"
  16. #include "optimizer/pathnode.h" 
  17. #include "optimizer/plancat.h"
  18. /*
  19.  * get_base_rel
  20.  *   Returns relation entry corresponding to 'relid', creating a new one if
  21.  *   necessary. This is for base relations.
  22.  *
  23.  */
  24. RelOptInfo *
  25. get_base_rel(Query *root, int relid)
  26. {
  27. Relids relids;
  28. RelOptInfo *rel;
  29. relids = lconsi(relid, NIL);
  30. rel = rel_member(relids, root->base_rel_list);
  31. if (rel == NULL)
  32. {
  33. rel = makeNode(RelOptInfo);
  34. rel->relids = relids;
  35. rel->indexed = false;
  36. rel->pages = 0;
  37. rel->tuples = 0;
  38. rel->width = 0;
  39. rel->targetlist = NIL;
  40. rel->pathlist = NIL;
  41. rel->cheapestpath = (Path *) NULL;
  42. rel->pruneable = true;
  43. rel->classlist = NULL;
  44. rel->ordering = NULL;
  45. rel->relam = InvalidOid;
  46. rel->restrictinfo = NIL;
  47. rel->joininfo = NIL;
  48. rel->innerjoin = NIL;
  49. root->base_rel_list = lcons(rel, root->base_rel_list);
  50. /*
  51.  * ??? the old lispy C code (get_rel) do a listp(relid) here but
  52.  * that can never happen since we already established relid is not
  53.  * a list. -ay 10/94
  54.  */
  55. if (relid < 0)
  56. {
  57. /*
  58.  * If the relation is a materialized relation, assume
  59.  * constants for sizes.
  60.  */
  61. rel->pages = _NONAME_RELATION_PAGES_;
  62. rel->tuples = _NONAME_RELATION_TUPLES_;
  63. }
  64. else
  65. {
  66. bool hasindex;
  67. int pages,
  68. tuples;
  69. /*
  70.  * Otherwise, retrieve relation characteristics from the
  71.  * system catalogs.
  72.  */
  73. relation_info(root, relid, &hasindex, &pages, &tuples);
  74. rel->indexed = hasindex;
  75. rel->pages = pages;
  76. rel->tuples = tuples;
  77. }
  78. }
  79. return rel;
  80. }
  81. /*
  82.  * get_join_rel
  83.  *   Returns relation entry corresponding to 'relid' (a list of relids),
  84.  *   or NULL.
  85.  */
  86. RelOptInfo *
  87. get_join_rel(Query *root, Relids relid)
  88. {
  89. return rel_member(relid, root->join_rel_list);
  90. }
  91. /*
  92.  * rel_member
  93.  *   Determines whether a relation of id 'relid' is contained within a list
  94.  *   'rels'.
  95.  *
  96.  * Returns the corresponding entry in 'rels' if it is there.
  97.  *
  98.  */
  99. RelOptInfo *
  100. rel_member(Relids relids, List *rels)
  101. {
  102. List    *temp = NIL;
  103. List    *temprelid = NIL;
  104. if (relids != NIL && rels != NIL)
  105. {
  106. foreach(temp, rels)
  107. {
  108. temprelid = ((RelOptInfo *) lfirst(temp))->relids;
  109. if (same(temprelid, relids))
  110. return (RelOptInfo *) (lfirst(temp));
  111. }
  112. }
  113. return NULL;
  114. }