4242 * Portions Copyright (c) 1994, Regents of the University of California
4343 *
4444 * IDENTIFICATION
45- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.81 2002/03/0106:01:19 tgl Exp $
45+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.82 2002/03/0120:50:20 tgl Exp $
4646 *
4747 *-------------------------------------------------------------------------
4848 */
@@ -467,10 +467,11 @@ cost_sort(Path *path, Query *root,
467467}
468468
469469/*
470- * Note: should we bother to assign a nonzero run_cost to reflect the
471- * overhead of extracting tuples from the sort result?Probably not
472- * worth worrying about.
470+ * Also charge a small amount (arbitrarily set equal to operator cost)
471+ * per extracted tuple.
473472 */
473+ run_cost += cpu_operator_cost * tuples ;
474+
474475path -> startup_cost = startup_cost ;
475476path -> total_cost = startup_cost + run_cost ;
476477}
@@ -567,11 +568,12 @@ cost_mergejoin(Path *path, Query *root,
567568Cost run_cost = 0 ;
568569Cost cpu_per_tuple ;
569570RestrictInfo * firstclause ;
571+ Var * leftvar ;
570572double outer_rows ,
571573inner_rows ;
572574double ntuples ;
573- Selectivity leftscan ,
574- rightscan ;
575+ Selectivity outerscansel ,
576+ innerscansel ;
575577Path sort_path ;/* dummy for result of cost_sort */
576578
577579if (!enable_mergejoin )
@@ -592,11 +594,24 @@ cost_mergejoin(Path *path, Query *root,
592594mergejoinscansel (root , (Node * )firstclause -> clause ,
593595& firstclause -> left_mergescansel ,
594596& firstclause -> right_mergescansel );
595- leftscan = firstclause -> left_mergescansel ;
596- rightscan = firstclause -> right_mergescansel ;
597597
598- outer_rows = outer_path -> parent -> rows * leftscan ;
599- inner_rows = inner_path -> parent -> rows * rightscan ;
598+ leftvar = get_leftop (firstclause -> clause );
599+ Assert (IsA (leftvar ,Var ));
600+ if (intMember (leftvar -> varno ,outer_path -> parent -> relids ))
601+ {
602+ /* left side of clause is outer */
603+ outerscansel = firstclause -> left_mergescansel ;
604+ innerscansel = firstclause -> right_mergescansel ;
605+ }
606+ else
607+ {
608+ /* left side of clause is inner */
609+ outerscansel = firstclause -> right_mergescansel ;
610+ innerscansel = firstclause -> left_mergescansel ;
611+ }
612+
613+ outer_rows = outer_path -> parent -> rows * outerscansel ;
614+ inner_rows = inner_path -> parent -> rows * innerscansel ;
600615
601616/* cost of source data */
602617
@@ -616,13 +631,13 @@ cost_mergejoin(Path *path, Query *root,
616631outer_path -> parent -> width );
617632startup_cost += sort_path .startup_cost ;
618633run_cost += (sort_path .total_cost - sort_path .startup_cost )
619- * leftscan ;
634+ * outerscansel ;
620635}
621636else
622637{
623638startup_cost += outer_path -> startup_cost ;
624639run_cost += (outer_path -> total_cost - outer_path -> startup_cost )
625- * leftscan ;
640+ * outerscansel ;
626641}
627642
628643if (innersortkeys )/* do we need to sort inner? */
@@ -635,13 +650,13 @@ cost_mergejoin(Path *path, Query *root,
635650inner_path -> parent -> width );
636651startup_cost += sort_path .startup_cost ;
637652run_cost += (sort_path .total_cost - sort_path .startup_cost )
638- * rightscan ;
653+ * innerscansel ;
639654}
640655else
641656{
642657startup_cost += inner_path -> startup_cost ;
643658run_cost += (inner_path -> total_cost - inner_path -> startup_cost )
644- * rightscan ;
659+ * innerscansel ;
645660}
646661
647662/*