diff options
author | Bruce Momjian <bruce@momjian.us> | 1998-03-30 16:36:43 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1998-03-30 16:36:43 +0000 |
commit | c579ce0fb03aaf92d184adf369cf13be013adf1b (patch) | |
tree | 679a8e287af5009d916fd4936483322d22375614 /src/backend/executor/nodeAgg.c | |
parent | 9c93fa2e4af9bb67261ecdedef2b5a97a9283f34 (diff) | |
download | postgresql-c579ce0fb03aaf92d184adf369cf13be013adf1b.tar.gz postgresql-c579ce0fb03aaf92d184adf369cf13be013adf1b.zip |
I started adding the Having Clause and it works quite fine for
sequential scans! (I think it will also work with hash, index, etc
but I did not check it out! I made some High level changes which
should work for all access methods, but maybe I'm wrong. Please
let me know.)
Now it is possible to make queries like:
select s.sname, max(p.pid), min(p.pid) from part p, supplier s
where s.sid=p.sid group by s.sname having max(pid)=6 and min(pid)=1
or avg(pid)=4;
Having does not work yet for queries that contain a subselect
statement in the Having clause, I'll try to fix this in the next
days.
If there are some bugs, please let me know, I'll start to read the
mailinglists now!
Now here is the patch against the original 6.3 version (no snapshot!!):
Stefan
Diffstat (limited to 'src/backend/executor/nodeAgg.c')
-rw-r--r-- | src/backend/executor/nodeAgg.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 848bd616bf0..c2b77c6e050 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -29,6 +29,7 @@ #include "storage/bufmgr.h" #include "utils/palloc.h" #include "utils/syscache.h" +#include "optimizer/clauses.h" /* * AggFuncInfo - @@ -109,10 +110,16 @@ ExecAgg(Agg *node) isNull1 = FALSE, isNull2 = FALSE; + + /***S*H***/ + do { + + /* --------------------- * get state info from node * --------------------- */ + aggstate = node->aggstate; if (aggstate->agg_done) return NULL; @@ -229,6 +236,7 @@ ExecAgg(Agg *node) } } } + /* ---------------- * for each tuple from the the outer plan, apply all the aggregates @@ -477,11 +485,19 @@ ExecAgg(Agg *node) * slot and return it. * ---------------- */ + + /***S*H***/ + } + while((ExecQual(fix_opids(node->plan.qual),econtext)!=true) && + (node->plan.qual!=NULL)); + + ExecStoreTuple(oneTuple, aggstate->csstate.css_ScanTupleSlot, InvalidBuffer, false); econtext->ecxt_scantuple = aggstate->csstate.css_ScanTupleSlot; + resultSlot = ExecProject(projInfo, &isDone); if (oneTuple) |