|
7 | 7 | *
|
8 | 8 | *
|
9 | 9 | * IDENTIFICATION
|
10 |
| - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.69 2000/03/16 03:23:18 tgl Exp $ |
| 10 | + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.70 2000/04/04 02:30:52 tgl Exp $ |
11 | 11 | *
|
12 | 12 | *-------------------------------------------------------------------------
|
13 | 13 | */
|
|
20 | 20 | #include"nodes/makefuncs.h"
|
21 | 21 | #include"optimizer/clauses.h"
|
22 | 22 | #include"optimizer/prep.h"
|
| 23 | +#include"optimizer/var.h" |
23 | 24 | #include"parser/analyze.h"
|
24 | 25 | #include"parser/parse_expr.h"
|
25 | 26 | #include"parser/parse_relation.h"
|
@@ -437,19 +438,19 @@ modifyAggrefDropQual(Node *node, Node *targetNode)
|
437 | 438 | staticSubLink*
|
438 | 439 | modifyAggrefMakeSublink(Aggref*aggref,Query*parsetree)
|
439 | 440 | {
|
440 |
| -/* target and rte point to old structures: */ |
441 |
| -Var*target; |
| 441 | +List*aggVarNos; |
| 442 | +/* rte points to old structure: */ |
442 | 443 | RangeTblEntry*rte;
|
443 | 444 | /* these point to newly-created structures: */
|
444 | 445 | Query*subquery;
|
445 | 446 | SubLink*sublink;
|
446 | 447 | TargetEntry*tle;
|
447 | 448 | Resdom*resdom;
|
448 | 449 |
|
449 |
| -target=(Var*)(aggref->target); |
450 |
| -if (!IsA(target,Var)) |
451 |
| -elog(ERROR,"rewrite: aggregates of views only allowed onsimple variables for now"); |
452 |
| -rte=rt_fetch(target->varno,parsetree->rtable); |
| 450 | +aggVarNos=pull_varnos(aggref->target); |
| 451 | +if (length(aggVarNos)!=1) |
| 452 | +elog(ERROR,"rewrite: aggregates of views only allowed onsingle tables for now"); |
| 453 | +rte=rt_fetch(lfirsti(aggVarNos),parsetree->rtable); |
453 | 454 |
|
454 | 455 | resdom=makeNode(Resdom);
|
455 | 456 | resdom->resno=1;
|
@@ -503,11 +504,13 @@ modifyAggrefMakeSublink(Aggref *aggref, Query *parsetree)
|
503 | 504 | /* Increment all varlevelsup fields in the new subquery */
|
504 | 505 | IncrementVarSublevelsUp((Node*)subquery,1,0);
|
505 | 506 |
|
506 |
| -/* Replace references to the target table with correct local varno. |
507 |
| - * Note +1 here to account for effects of previous line! |
| 507 | +/* Replace references to the target table with correct local varno, 1. |
| 508 | + * Note that because of previous line, these references have |
| 509 | + * varlevelsup = 1, which must be changed to 0. |
508 | 510 | */
|
509 |
| -modifyAggrefChangeVarnodes((Node*)subquery,target->varno, |
510 |
| -1,target->varlevelsup+1,0); |
| 511 | +modifyAggrefChangeVarnodes((Node*)subquery, |
| 512 | +lfirsti(aggVarNos),1, |
| 513 | +1,0); |
511 | 514 |
|
512 | 515 | returnsublink;
|
513 | 516 | }
|
|