aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/createplan.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-01-22 00:07:00 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-01-22 00:07:00 +0000
commite2114817c7f7c72c5159ed225fe6832505c2bd5f (patch)
tree77b163d61744291e8619fbdf61dc6399a541ec10 /src/backend/optimizer/plan/createplan.c
parenta4482f4c4c4e052f954f4f333ae8f5ce999613ab (diff)
downloadpostgresql-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.c36
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;