|
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 | static SubLink *
|
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 on simple 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 on single 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 | return sublink;
|
513 | 516 | }
|
|
0 commit comments