home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / planner / util / relnode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  2.8 KB  |  126 lines

  1.  
  2. /*     
  3.  *      FILE
  4.  *         relnode
  5.  *     
  6.  *      DESCRIPTION
  7.  *         Relation manipulation routines
  8.  *     
  9.  *      EXPORTS
  10.  *             get_rel
  11.  *             rel-member
  12.  *
  13.  *    $Header: /private/postgres/src/planner/util/RCS/relnode.c,v 1.14 1992/03/31 23:15:08 mer Exp $
  14.  */
  15.  
  16. #include "planner/internal.h"
  17. #include "planner/relnode.h"
  18. #include "nodes/relation.h"
  19. #include "planner/plancat.h"
  20.  
  21. /* ----------------
  22.  *    Rel creator declaration
  23.  * ----------------
  24.  */
  25. extern Rel RMakeRel();
  26.  
  27. /*    
  28.  *        get_rel
  29.  *    
  30.  *        Returns relation entry corresponding to 'relid', creating a new one if
  31.  *        necessary.  
  32.  *    
  33.  */
  34.  
  35. /*  .. add-clause-to-rels, add-join-clause-info-to-rels, add-vars-to-rels
  36.  *  .. find-all-join-paths, find-clause-joins, find-clauseless-joins
  37.  *  .. initialize-targetlist
  38.  */
  39.  
  40. Rel
  41. get_rel(relid)
  42.      LispValue relid ;
  43. {
  44.     Rel rel;
  45.  
  46.     if (listp(relid)) {
  47.     rel = rel_member(relid, _join_relation_list_);
  48.       }
  49.     else {
  50.     List relids = lispCons(relid, LispNil);
  51.     rel = rel_member(relids, _base_relation_list_);
  52.     if (null(rel)) {
  53.         rel = RMakeRel();
  54.         set_relids(rel,relids);
  55.         set_indexed(rel,false);
  56.         set_pages(rel, 0);
  57.         set_tuples(rel,0);
  58.         set_width(rel,0);
  59.         set_targetlist(rel,LispNil);
  60.         set_pathlist(rel,LispNil);
  61.         set_unorderedpath(rel,(PathPtr)NULL);
  62.         set_cheapestpath(rel,(PathPtr)NULL);
  63.         set_classlist(rel,(List)NULL);
  64.         set_ordering(rel,LispNil);
  65.         set_clauseinfo(rel,LispNil);
  66.         set_joininfo(rel,LispNil);
  67.         set_innerjoin(rel,LispNil);
  68.         set_superrels(rel,LispNil);
  69.  
  70.         _base_relation_list_ = lispCons((LispValue)rel,
  71.                         _base_relation_list_);
  72.  
  73.         if(listp(relid)) {
  74.         /*    If the relation is a materialized relation, assume 
  75.               constants for sizes. */
  76.         set_pages(rel,_TEMP_RELATION_PAGES_);
  77.         set_tuples(rel,_TEMP_RELATION_TUPLES_);
  78.  
  79.         } else {
  80.         /*    Otherwise, retrieve relation characteristics from the */
  81.         /*    system catalogs. */
  82.  
  83.           int reltuples = 0;
  84.           LispValue relinfo = relation_info((ObjectId)CInteger(relid));
  85.  
  86.           reltuples = CInteger(CADDR(relinfo));
  87.           set_indexed(rel, !zerop(nth(0,relinfo)));
  88.           set_pages(rel,(Count)CInteger(CADR(relinfo)));
  89.           set_tuples(rel,(Count)reltuples);
  90.         } 
  91.     }
  92.       }
  93.     return(rel);
  94. }
  95.  
  96. /*    
  97.  *        rel-member
  98.  *    
  99.  *        Determines whether a relation of id 'relid' is contained within a list
  100.  *        'rels'.  
  101.  *    
  102.  *        Returns the corresponding entry in 'rels' if it is there.
  103.  *    
  104.  */
  105.  
  106. /*  .. find-all-join-paths, get_rel
  107.  */
  108.  
  109. Rel
  110. rel_member(relid, rels)
  111.      List relid;
  112.      List rels;
  113. {
  114.     LispValue temp = LispNil;
  115.     LispValue temprelid = LispNil;
  116.     
  117.     if(consp(relid) && consp(rels)) {
  118.     foreach(temp,rels) {
  119.         temprelid = (LispValue)get_relids((Rel)CAR(temp));
  120.         if(same(temprelid, relid))   
  121.           return((Rel)(CAR(temp)));
  122.       }
  123.       } 
  124.     return(NULL);
  125. }
  126.