diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-22 00:07:00 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-22 00:07:00 +0000 |
commit | e2114817c7f7c72c5159ed225fe6832505c2bd5f (patch) | |
tree | 77b163d61744291e8619fbdf61dc6399a541ec10 /src/backend/optimizer/plan/createplan.c | |
parent | a4482f4c4c4e052f954f4f333ae8f5ce999613ab (diff) | |
download | postgresql-e2114817c7f7c72c5159ed225fe6832505c2bd5f.tar.gz postgresql-e2114817c7f7c72c5159ed225fe6832505c2bd5f.zip |
Implement choice between hash-based and sort-based grouping for doing
DISTINCT processing on the output of an IN sub-select.
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index b7b1204e76e..eb7e922d9a1 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -10,12 +10,13 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.132 2003/01/20 18:54:52 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.133 2003/01/22 00:07:00 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" +#include <limits.h> #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -418,6 +419,7 @@ create_unique_plan(Query *root, UniquePath *best_path) Plan *plan; Plan *subplan; List *sub_targetlist; + List *my_tlist; List *l; subplan = create_plan(root, best_path->subpath); @@ -474,21 +476,39 @@ create_unique_plan(Query *root, UniquePath *best_path) subplan->targetlist = newtlist; } + my_tlist = new_unsorted_tlist(subplan->targetlist); + if (best_path->use_hash) { - elog(ERROR, "create_unique_plan: hash case not implemented yet"); - plan = NULL; + int numGroupCols = length(my_tlist); + long numGroups; + AttrNumber *groupColIdx; + int i; + + numGroups = (long) Min(best_path->rows, (double) LONG_MAX); + + groupColIdx = (AttrNumber *) palloc(numGroupCols * sizeof(AttrNumber)); + for (i = 0; i < numGroupCols; i++) + groupColIdx[i] = i+1; + + plan = (Plan *) make_agg(root, + my_tlist, + NIL, + AGG_HASHED, + numGroupCols, + groupColIdx, + numGroups, + 0, + subplan); } else { - List *sort_tlist; List *sortList; - sort_tlist = new_unsorted_tlist(subplan->targetlist); - sortList = addAllTargetsToSortList(NIL, sort_tlist); - plan = (Plan *) make_sort_from_sortclauses(root, sort_tlist, + sortList = addAllTargetsToSortList(NIL, my_tlist); + plan = (Plan *) make_sort_from_sortclauses(root, my_tlist, subplan, sortList); - plan = (Plan *) make_unique(sort_tlist, plan, sortList); + plan = (Plan *) make_unique(my_tlist, plan, sortList); } plan->plan_rows = best_path->rows; |