77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.35 1999/05/16 19:45:37 tgl Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.36 1999/05/18 21:36:10 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -37,7 +37,6 @@ static List *match_unsorted_outer(RelOptInfo *joinrel, RelOptInfo *outerrel, Rel
3737List * mergeinfo_list );
3838static List * match_unsorted_inner (RelOptInfo * joinrel ,RelOptInfo * outerrel ,RelOptInfo * innerrel ,
3939List * innerpath_list ,List * mergeinfo_list );
40- static bool EnoughMemoryForHashjoin (RelOptInfo * hashrel );
4140static List * hash_inner_and_outer (RelOptInfo * joinrel ,RelOptInfo * outerrel ,RelOptInfo * innerrel ,
4241List * hashinfo_list );
4342
@@ -490,27 +489,6 @@ match_unsorted_inner(RelOptInfo *joinrel,
490489return mp_list ;
491490}
492491
493- static bool
494- EnoughMemoryForHashjoin (RelOptInfo * hashrel )
495- {
496- int ntuples ;
497- int tupsize ;
498- int pages ;
499-
500- ntuples = hashrel -> size ;
501- if (ntuples == 0 )
502- ntuples = 1000 ;
503- tupsize = hashrel -> width + sizeof (HeapTupleData );
504- pages = page_size (ntuples ,tupsize );
505-
506- /*
507- * if amount of buffer space below hashjoin threshold, return false
508- */
509- if (ceil (sqrt ((double )pages ))> NBuffers )
510- return false;
511- return true;
512- }
513-
514492/*
515493 * hash_inner_and_outer--XXX HASH
516494 * Create hashjoin join paths by explicitly hashing both the outer and
@@ -530,17 +508,17 @@ hash_inner_and_outer(RelOptInfo *joinrel,
530508RelOptInfo * innerrel ,
531509List * hashinfo_list )
532510{
533- HashInfo * xhashinfo = (HashInfo * )NULL ;
534511List * hjoin_list = NIL ;
535- HashPath * temp_node = (HashPath * )NULL ;
536- List * i = NIL ;
537- List * outerkeys = NIL ;
538- List * innerkeys = NIL ;
539- List * hash_pathkeys = NIL ;
512+ List * i ;
540513
541514foreach (i ,hashinfo_list )
542515{
543- xhashinfo = (HashInfo * )lfirst (i );
516+ HashInfo * xhashinfo = (HashInfo * )lfirst (i );
517+ List * outerkeys ;
518+ List * innerkeys ;
519+ List * hash_pathkeys ;
520+ HashPath * temp_node ;
521+
544522outerkeys = make_pathkeys_from_joinkeys (
545523 ((JoinMethod * )xhashinfo )-> jmkeys ,
546524outerrel -> targetlist ,
@@ -549,26 +527,31 @@ hash_inner_and_outer(RelOptInfo *joinrel,
549527 ((JoinMethod * )xhashinfo )-> jmkeys ,
550528innerrel -> targetlist ,
551529INNER );
530+ /* We cannot assume that the output of the hashjoin appears in any
531+ * particular order, so it should have NIL pathkeys.
532+ */
533+ #ifdef NOT_USED
552534hash_pathkeys = new_join_pathkeys (outerkeys ,
553535joinrel -> targetlist ,
554536 ((JoinMethod * )xhashinfo )-> clauses );
555-
556- if ( EnoughMemoryForHashjoin ( innerrel ))
557- {
558- temp_node = create_hashjoin_path ( joinrel ,
559- outerrel -> size ,
560- innerrel -> size ,
561- outerrel -> width ,
562- innerrel -> width ,
563- ( Path * ) outerrel -> cheapestpath ,
564- (Path * )innerrel -> cheapestpath ,
565- hash_pathkeys ,
566- xhashinfo -> hashop ,
567- (( JoinMethod * ) xhashinfo ) -> clauses ,
568- outerkeys ,
569- innerkeys );
570- hjoin_list = lappend ( hjoin_list , temp_node );
571- }
537+ #else
538+ hash_pathkeys = NIL ;
539+ #endif
540+
541+ temp_node = create_hashjoin_path ( joinrel ,
542+ outerrel -> size ,
543+ innerrel -> size ,
544+ outerrel -> width ,
545+ innerrel -> width ,
546+ (Path * )outerrel -> cheapestpath ,
547+ ( Path * ) innerrel -> cheapestpath ,
548+ hash_pathkeys ,
549+ xhashinfo -> hashop ,
550+ (( JoinMethod * ) xhashinfo ) -> clauses ,
551+ outerkeys ,
552+ innerkeys );
553+ hjoin_list = lappend ( hjoin_list , temp_node );
572554}
555+
573556return hjoin_list ;
574557}