77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.50 1999/03/01 00:10:33 tgl Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.51 1999/04/30 04:04:27 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
3232#include "utils/builtins.h"
3333
3434#include "optimizer/restrictinfo.h"
35+ #include "optimizer/cost.h"
3536#include "optimizer/clauses.h"
3637#include "optimizer/planmain.h"
3738#include "optimizer/tlist.h"
@@ -65,7 +66,7 @@ static Node *fix_indxqual_references(Node *clause, Path *index_path);
6566static Noname * make_noname (List * tlist ,List * pathkeys ,Oid * operators ,
6667Plan * plan_node ,int nonametype );
6768static IndexScan * make_indexscan (List * qptlist ,List * qpqual ,Index scanrelid ,
68- List * indxid ,List * indxqual ,List * indxqualorig , Cost cost );
69+ List * indxid ,List * indxqual ,List * indxqualorig );
6970static NestLoop * make_nestloop (List * qptlist ,List * qpqual ,Plan * lefttree ,
7071Plan * righttree );
7172static HashJoin * make_hashjoin (List * tlist ,List * qpqual ,
@@ -75,6 +76,7 @@ static MergeJoin *make_mergejoin(List *tlist, List *qpqual,
7576List * mergeclauses ,Plan * righttree ,Plan * lefttree );
7677static Material * make_material (List * tlist ,Oid nonameid ,Plan * lefttree ,
7778int keycount );
79+ static void copy_costsize (Plan * dest ,Plan * src );
7880
7981/*
8082 * create_plan
@@ -403,8 +405,9 @@ create_indexscan_node(IndexPath *best_path,
403405lfirsti (best_path -> path .parent -> relids ),
404406best_path -> indexid ,
405407fixed_indxqual ,
406- indxqual ,
407- best_path -> path .path_cost );
408+ indxqual );
409+
410+ scan_node -> scan .plan .cost = best_path -> path .path_cost ;
408411
409412return scan_node ;
410413}
@@ -535,29 +538,23 @@ create_mergejoin_node(MergePath *best_path,
535538Oid * outer_order = generate_merge_input_sortorder (
536539best_path -> outersortkeys ,
537540best_path -> jpath .path .pathorder -> ord .merge );
538- Noname * sorted_outer_node = make_noname (outer_tlist ,
539- best_path -> outersortkeys ,
540- outer_order ,
541- outer_node ,
542- NONAME_SORT );
543-
544- sorted_outer_node -> plan .cost = outer_node -> cost ;
545- outer_node = (Plan * )sorted_outer_node ;
541+ outer_node = (Plan * )make_noname (outer_tlist ,
542+ best_path -> outersortkeys ,
543+ outer_order ,
544+ outer_node ,
545+ NONAME_SORT );
546546}
547547
548548if (best_path -> innersortkeys )
549549{
550550Oid * inner_order = generate_merge_input_sortorder (
551551best_path -> innersortkeys ,
552552best_path -> jpath .path .pathorder -> ord .merge );
553- Noname * sorted_inner_node = make_noname (inner_tlist ,
554- best_path -> innersortkeys ,
555- inner_order ,
556- inner_node ,
557- NONAME_SORT );
558-
559- sorted_inner_node -> plan .cost = outer_node -> cost ;/* XXX not inner_node? */
560- inner_node = (Plan * )sorted_inner_node ;
553+ inner_node = (Plan * )make_noname (inner_tlist ,
554+ best_path -> innersortkeys ,
555+ inner_order ,
556+ inner_node ,
557+ NONAME_SORT );
561558}
562559
563560join_node = make_mergejoin (tlist ,
@@ -619,6 +616,7 @@ create_hashjoin_node(HashPath *best_path,
619616hashclauses ,
620617outer_node ,
621618 (Plan * )hash_node );
619+
622620join_node -> join .cost = best_path -> jpath .path .path_cost ;
623621
624622return join_node ;
@@ -869,6 +867,30 @@ set_noname_tlist_operators(List *tlist, List *pathkeys, Oid *operators)
869867return tlist ;
870868}
871869
870+ /*
871+ * Copy cost and size info from a lower plan node to an inserted node.
872+ * This is not critical, since the decisions have already been made,
873+ * but it helps produce more reasonable-looking EXPLAIN output.
874+ */
875+
876+ static void
877+ copy_costsize (Plan * dest ,Plan * src )
878+ {
879+ if (src )
880+ {
881+ dest -> cost = src -> cost ;
882+ dest -> plan_size = src -> plan_size ;
883+ dest -> plan_width = src -> plan_width ;
884+ }
885+ else
886+ {
887+ dest -> cost = 0 ;
888+ dest -> plan_size = 0 ;
889+ dest -> plan_width = 0 ;
890+ }
891+ }
892+
893+
872894/*****************************************************************************
873895 *
874896 *
@@ -940,7 +962,7 @@ make_seqscan(List *qptlist,
940962SeqScan * node = makeNode (SeqScan );
941963Plan * plan = & node -> plan ;
942964
943- plan -> cost = ( lefttree ? lefttree -> cost : 0 );
965+ copy_costsize ( plan , lefttree );
944966plan -> state = (EState * )NULL ;
945967plan -> targetlist = qptlist ;
946968plan -> qual = qpqual ;
@@ -958,13 +980,12 @@ make_indexscan(List *qptlist,
958980Index scanrelid ,
959981List * indxid ,
960982List * indxqual ,
961- List * indxqualorig ,
962- Cost cost )
983+ List * indxqualorig )
963984{
964985IndexScan * node = makeNode (IndexScan );
965986Plan * plan = & node -> scan .plan ;
966987
967- plan -> cost = cost ;
988+ copy_costsize ( plan , NULL ) ;
968989plan -> state = (EState * )NULL ;
969990plan -> targetlist = qptlist ;
970991plan -> qual = qpqual ;
@@ -989,6 +1010,9 @@ make_nestloop(List *qptlist,
9891010NestLoop * node = makeNode (NestLoop );
9901011Plan * plan = & node -> join ;
9911012
1013+ /* this cost estimate is entirely bogus...
1014+ * hopefully it will be overwritten by caller.
1015+ */
9921016plan -> cost = (lefttree ?lefttree -> cost :0 )+
9931017(righttree ?righttree -> cost :0 );
9941018plan -> state = (EState * )NULL ;
@@ -1011,9 +1035,11 @@ make_hashjoin(List *tlist,
10111035HashJoin * node = makeNode (HashJoin );
10121036Plan * plan = & node -> join ;
10131037
1038+ /* this cost estimate is entirely bogus...
1039+ * hopefully it will be overwritten by caller.
1040+ */
10141041plan -> cost = (lefttree ?lefttree -> cost :0 )+
10151042(righttree ?righttree -> cost :0 );
1016- plan -> cost = 0.0 ;
10171043plan -> state = (EState * )NULL ;
10181044plan -> targetlist = tlist ;
10191045plan -> qual = qpqual ;
@@ -1034,8 +1060,7 @@ make_hash(List *tlist, Var *hashkey, Plan *lefttree)
10341060Hash * node = makeNode (Hash );
10351061Plan * plan = & node -> plan ;
10361062
1037- plan -> cost = (lefttree ?lefttree -> cost :0 );
1038- plan -> cost = 0.0 ;
1063+ copy_costsize (plan ,lefttree );
10391064plan -> state = (EState * )NULL ;
10401065plan -> targetlist = tlist ;
10411066plan -> qual = NULL ;
@@ -1059,6 +1084,9 @@ make_mergejoin(List *tlist,
10591084MergeJoin * node = makeNode (MergeJoin );
10601085Plan * plan = & node -> join ;
10611086
1087+ /* this cost estimate is entirely bogus...
1088+ * hopefully it will be overwritten by caller.
1089+ */
10621090plan -> cost = (lefttree ?lefttree -> cost :0 )+
10631091(righttree ?righttree -> cost :0 );
10641092plan -> state = (EState * )NULL ;
@@ -1077,7 +1105,8 @@ make_sort(List *tlist, Oid nonameid, Plan *lefttree, int keycount)
10771105Sort * node = makeNode (Sort );
10781106Plan * plan = & node -> plan ;
10791107
1080- plan -> cost = (lefttree ?lefttree -> cost :0 );
1108+ copy_costsize (plan ,lefttree );
1109+ plan -> cost += cost_sort (NULL ,plan -> plan_size ,plan -> plan_width , true);
10811110plan -> state = (EState * )NULL ;
10821111plan -> targetlist = tlist ;
10831112plan -> qual = NIL ;
@@ -1098,7 +1127,7 @@ make_material(List *tlist,
10981127Material * node = makeNode (Material );
10991128Plan * plan = & node -> plan ;
11001129
1101- plan -> cost = ( lefttree ? lefttree -> cost : 0 );
1130+ copy_costsize ( plan , lefttree );
11021131plan -> state = (EState * )NULL ;
11031132plan -> targetlist = tlist ;
11041133plan -> qual = NIL ;
@@ -1115,7 +1144,7 @@ make_agg(List *tlist, Plan *lefttree)
11151144{
11161145Agg * node = makeNode (Agg );
11171146
1118- node -> plan . cost = ( lefttree ? lefttree -> cost : 0 );
1147+ copy_costsize ( & node -> plan , lefttree );
11191148node -> plan .state = (EState * )NULL ;
11201149node -> plan .qual = NULL ;
11211150node -> plan .targetlist = tlist ;
@@ -1135,7 +1164,7 @@ make_group(List *tlist,
11351164{
11361165Group * node = makeNode (Group );
11371166
1138- node -> plan . cost = ( lefttree ? lefttree -> plan . cost : 0 );
1167+ copy_costsize ( & node -> plan , ( Plan * ) lefttree );
11391168node -> plan .state = (EState * )NULL ;
11401169node -> plan .qual = NULL ;
11411170node -> plan .targetlist = tlist ;
@@ -1162,7 +1191,7 @@ make_unique(List *tlist, Plan *lefttree, char *uniqueAttr)
11621191Unique * node = makeNode (Unique );
11631192Plan * plan = & node -> plan ;
11641193
1165- plan -> cost = ( lefttree ? lefttree -> cost : 0 );
1194+ copy_costsize ( plan , lefttree );
11661195plan -> state = (EState * )NULL ;
11671196plan -> targetlist = tlist ;
11681197plan -> qual = NIL ;