Re: [HACKERS] 6.5 TODO list

From: jwieck(at)debis(dot)com (Jan Wieck)
To: jwieck(at)debis(dot)com
Cc: maillist(at)candle(dot)pha(dot)pa(dot)us, tgl(at)sss(dot)pgh(dot)pa(dot)us, hackers(at)postgreSQL(dot)org
Subject: Re: [HACKERS] 6.5 TODO list
Date: 1999-05-11 16:01:54
Message-ID: m10hEyg-000EBXC@orion.SAPserv.Hamburg.dsh.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

>
> Bruce Momjian wrote:
>
> > > > GROUP BY can reference columns not in target list
> > >
> > > What's wrong with that?
> >
> > Is that not a problem. What possible use would GROUP BY on columns not
> > in target list be of use. Maybe it is. I remember someone asking for
> > something like this. I will remove the item unless someone complains.
> > I thought you were the one complaining about it.
>
> This can happen if the GROUP BY clause is coming from a view,
> but the grouping columns of the view aren't in the
> targetlist.
>
> Usually the view's grouping is required because of use of
> aggregates in the view, so omitting them isn't a good idea.
>
> I'm actually testing what happens if I use junk TLE's for
> rule generated GROUP BY entries...

Oh jesus - what a mess!

I've tested it and it solved the problem with

CREATE TABLE t1 (a int4, b int4);
CREATE VIEW v1 AS SELECT b, count(b) AS n
FROM t1 GROUP BY b;
SELECT n FROM v1;

This one produces now the correct output. But it does not
handle

SELECT n FROM v1 WHERE 2 < n;

because the group clause isn't added to the aggregate
subplan, the rule system generated for the qual - that's
maybe fixable. Worse is, that one of the queries in the rules
regression test fails, because a GROUP BY attribute wasn't
found in the targetlist.

The problem is that the planner modifies the targetlist if
the operation is an INSERT/DELETE by first creating a clean
one representing the result relation and then moving the old
expressions into. Then it adds some junk stuff and specially
marked TLE's from the original targetlist.

BUT - during this (preprocess_targetlist()) all the resno's
can get reassigned and later the planner tries to match the
GROUP BY entries only by resno. But the resno's in the group
clauses haven't been adjusted!

Another interesting detail I found is this:

CREATE TABLE t1 (a int4, b int4);
-- insert some stuff into t1
CREATE TABLE t2 (b int4, n int4);

-- This one is working correct:
SELECT b, count(b) FROM t1 GROUP BY b;

-- This one doesn't
INSERT INTO t2 SELECT b, count(b) FROM t1 GROUP BY b;
ERROR: Illegal use of aggregates or non-group column in target list

Ooops - I think it should work - especially because the plain
SELECT returned the correct result. But it fail during the
parse already and I don't get a parser debug output at all
from tcop. As soon as this is fixed, I assume a problem with
a query like this:

INSERT INTO t2 (n) SELECT count(b) FROM t1 GROUP BY b;

(currently it tells "Aggregates not allowed in GROUP BY
clause" - what's totally braindead) The problem I expect is
that the parser creates resno 1 for "count(b)" and a junk TLE
with resno 2 for "b" which is referenced in the group clause.
preprocess_targetlist() will now create the new targetlist
with resno 1 = "b" = NULL, resno 2 = "n" = "count(b)" and
maybe the junk resno 3 for the grouping. Voila, the group
clause will reference the wrong TLE (still resno 2)!

Currently I think the correct solution would be to expand the
targetlist already in the rewrite system and leave it
untouched in the planner. Comments?

Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck(at)debis(dot)com (Jan Wieck) #

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 1999-05-11 16:04:32 Re: [HACKERS] 6.5 cvs ERROR: copyObject: don't know how to copy 604
Previous Message Oliver Elphick 1999-05-11 15:52:24 Re: [HACKERS] Re: [SQL] plpgsql error