Skip to content
Snippets Groups Projects
Select Git revision
  • benchmark-tools
  • postgres-lambda
  • master default
  • REL9_4_25
  • REL9_5_20
  • REL9_6_16
  • REL_10_11
  • REL_11_6
  • REL_12_1
  • REL_12_0
  • REL_12_RC1
  • REL_12_BETA4
  • REL9_4_24
  • REL9_5_19
  • REL9_6_15
  • REL_10_10
  • REL_11_5
  • REL_12_BETA3
  • REL9_4_23
  • REL9_5_18
  • REL9_6_14
  • REL_10_9
  • REL_11_4
23 results

relnode.c

Blame
  • relnode.c 2.83 KiB
    /*-------------------------------------------------------------------------
     *
     * relnode.c--
     *	  Relation manipulation routines
     *
     * Copyright (c) 1994, Regents of the University of California
     *
     *
     * IDENTIFICATION
     *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.10 1999/02/03 20:15:43 momjian Exp $
     *
     *-------------------------------------------------------------------------
     */
    #include "postgres.h"
    
    #include "nodes/relation.h"
    
    #include "optimizer/internal.h"
    #include "optimizer/pathnode.h" /* where the decls go */
    #include "optimizer/plancat.h"
    
    
    
    /*
     * get_base_rel--
     *	  Returns relation entry corresponding to 'relid', creating a new one if
     *	  necessary. This is for base relations.
     *
     */
    RelOptInfo *
    get_base_rel(Query *root, int relid)
    {
    	List	   *relids;
    	RelOptInfo *rel;
    
    	relids = lconsi(relid, NIL);
    	rel = rel_member(relids, root->base_rel_list);
    	if (rel == NULL)
    	{
    		rel = makeNode(RelOptInfo);
    		rel->relids = relids;
    		rel->indexed = false;
    		rel->pages = 0;
    		rel->tuples = 0;
    		rel->width = 0;
    		rel->targetlist = NIL;
    		rel->pathlist = NIL;
    		rel->unorderedpath = (Path *) NULL;
    		rel->cheapestpath = (Path *) NULL;
    		rel->pruneable = true;
    		rel->classlist = NULL;
    		rel->ordering = NULL;
    		rel->relam = InvalidOid;
    		rel->restrictinfo = NIL;
    		rel->joininfo = NIL;
    		rel->innerjoin = NIL;
    		rel->superrels = NIL;
    
    		root->base_rel_list = lcons(rel, root->base_rel_list);
    
    		/*
    		 * ??? the old lispy C code (get_rel) do a listp(relid) here but
    		 * that can never happen since we already established relid is not
    		 * a list.								-ay 10/94
    		 */
    		if (relid < 0)
    		{
    
    			/*
    			 * If the relation is a materialized relation, assume
    			 * constants for sizes.
    			 */
    			rel->pages = _TEMP_RELATION_PAGES_;
    			rel->tuples = _TEMP_RELATION_TUPLES_;
    
    		}
    		else
    		{
    			bool		hasindex;
    			int			pages,
    						tuples;
    
    			/*
    			 * Otherwise, retrieve relation characteristics from the
    			 * system catalogs.
    			 */
    			relation_info(root, relid, &hasindex, &pages, &tuples);
    			rel->indexed = hasindex;
    			rel->pages = pages;
    			rel->tuples = tuples;
    		}
    	}
    	return rel;
    }
    
    /*
     * get_join_rel--
     *	  Returns relation entry corresponding to 'relid' (a list of relids),
     *	  creating a new one if necessary. This is for join relations.
     *
     */
    RelOptInfo *
    get_join_rel(Query *root, List *relid)
    {
    	return rel_member(relid, root->join_rel_list);
    }
    
    /*
     * rel-member--
     *	  Determines whether a relation of id 'relid' is contained within a list
     *	  'rels'.
     *
     * Returns the corresponding entry in 'rels' if it is there.
     *
     */
    RelOptInfo *
    rel_member(List *relid, List *rels)
    {
    	List	   *temp = NIL;
    	List	   *temprelid = NIL;
    
    	if (relid != NIL && rels != NIL)
    	{
    		foreach(temp, rels)
    		{
    			temprelid = ((RelOptInfo *) lfirst(temp))->relids;
    			if (same(temprelid, relid))
    				return (RelOptInfo *) (lfirst(temp));
    		}
    	}
    	return NULL;
    }