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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * hashjoin.h
  4.  *   internal structures for hash joins
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: hashjoin.h,v 1.13 1999/05/25 22:42:45 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef HASHJOIN_H
  14. #define HASHJOIN_H
  15. #include "access/htup.h"
  16. #include "storage/fd.h"
  17. #include "utils/mcxt.h"
  18. /* ----------------------------------------------------------------
  19.  * hash-join hash table structures
  20.  *
  21.  * Each active hashjoin has a HashJoinTable control block which is
  22.  * palloc'd in the executor's context. All other storage needed for
  23.  * the hashjoin is kept in a private "named portal", one for each hashjoin.
  24.  * This makes it easy and fast to release the storage when we don't need it
  25.  * anymore.
  26.  *
  27.  * The portal manager guarantees that portals will be discarded at end of
  28.  * transaction, so we have no problem with a memory leak if the join is
  29.  * aborted early by an error.  (Likewise, any temporary files we make will
  30.  * be cleaned up by the virtual file manager in event of an error.)
  31.  *
  32.  * Storage that should live through the entire join is allocated from the
  33.  * portal's "variable context", while storage that is only wanted for the
  34.  * current batch is allocated in the portal's "heap context".  By popping
  35.  * the portal's heap at the end of a batch, we free all the per-batch storage
  36.  * reliably and without tedium.
  37.  * ----------------------------------------------------------------
  38.  */
  39. typedef struct HashJoinTupleData
  40. {
  41. struct HashJoinTupleData *next; /* link to next tuple in same
  42.  * bucket */
  43. HeapTupleData htup; /* tuple header */
  44. } HashJoinTupleData;
  45. typedef HashJoinTupleData *HashJoinTuple;
  46. typedef struct HashTableData
  47. {
  48. int nbuckets; /* buckets in use during this batch */
  49. int totalbuckets; /* total number of (virtual) buckets */
  50. HashJoinTuple *buckets; /* buckets[i] is head of list of tuples */
  51. /* buckets array is per-batch storage, as are all the tuples */
  52. int nbatch; /* number of batches; 0 means 1-pass join */
  53. int curbatch; /* current batch #, or 0 during 1st pass */
  54. /*
  55.  * all these arrays are allocated for the life of the hash join, but
  56.  * only if nbatch > 0:
  57.  */
  58. BufFile   **innerBatchFile; /* buffered virtual temp file per batch */
  59. BufFile   **outerBatchFile; /* buffered virtual temp file per batch */
  60. long    *outerBatchSize; /* count of tuples in each outer batch
  61.  * file */
  62. long    *innerBatchSize; /* count of tuples in each inner batch
  63.  * file */
  64. /*
  65.  * During 1st scan of inner relation, we get tuples from executor. If
  66.  * nbatch > 0 then tuples that don't belong in first nbuckets logical
  67.  * buckets get dumped into inner-batch temp files. The same statements
  68.  * apply for the 1st scan of the outer relation, except we write
  69.  * tuples to outer-batch temp files. If nbatch > 0 then we do the
  70.  * following for each batch: 1. Read tuples from inner batch file,
  71.  * load into hash buckets. 2. Read tuples from outer batch file, match
  72.  * to hash buckets and output.
  73.  */
  74. /*
  75.  * Ugly kluge: myPortal ought to be declared as type Portal (ie,
  76.  * PortalD*) but if we try to include utils/portal.h here, we end up
  77.  * with a circular dependency of include files!  Until the various
  78.  * node.h files are restructured in a cleaner way, we have to fake it.
  79.  * The most reliable fake seems to be to declare myPortal as void *
  80.  * and then cast it to the right things in nodeHash.c.
  81.  */
  82. void    *myPortal; /* where to keep working storage */
  83. MemoryContext hashCxt; /* context for whole-hash-join storage */
  84. MemoryContext batchCxt; /* context for this-batch-only storage */
  85. } HashTableData;
  86. typedef HashTableData *HashJoinTable;
  87. #endif  /* HASHJOIN_H */