Thread: ERROR: "failed to locate grouping columns"

ERROR: "failed to locate grouping columns"

From
"Dickson S. Guedes"
Date:
Hi all,

I'm sending this to -hackers because i don't now if it is a bug or a
expected behavior.

I have the view bellow (if the selects bellow shows unformated in this
email, i put this in http://guedesoft.net/txt/vw_error.txt too. ):

CREATE OR REPLACE VIEW vw_my_test ASSELECT    DISTINCT    cv.cv_cdct AS cdct, -- returns a int4   cv.cv_cdcp AS cdcp,
--returns a numeric   ( SELECT cp.cp_nmfts          FROM cptv cp         WHERE cp.cp_cdcp = cv.cv_cdcp) AS nmfts, --
returnsa varchar   epr.epr_nrctn AS nrctn,                        -- returns a numeric   cv.cv_tpvnc AS tpvnc,
               -- returns a int4   ( SELECT rg.rg_dsc          FROM rgst rg         WHERE rg.rg_idrg = cv.cv_tpvnc) AS
dsc_vnc,-- returns a varchar   cv.cv_ndcdv AS ndcdv_prnc,                     -- returns a varchar   ( SELECT ps.ps_nm
       FROM pss ps         WHERE ps.ps_nrdc = cv.cv_ndcdv) AS nmdvprnc, -- returns a varchar   cvd.cvd_nmdvsld AS
ndcdv_sld,                 -- returns a varchar   ( SELECT ps.ps_nm          FROM pss ps         WHERE ps.ps_nrdc =
cvd.cvd_nmdvsld)AS nmdvsld, -- returns a varchar   cv.cv_vltt AS vltt,                                -- returns a
numeric(18,2)  ( SELECT max(oc.oc_dtagn) AS max          FROM ocr oc         WHERE oc.oc_cdct = ev.ev_cdct) AS dtagn,
 -- returns a date   ( SELECT                CASE                   WHEN abs(min(pe.pe_dtvnc) - date(now())) <= 15 THEN
1231230                  WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 16 AND abs(min(pe.pe_dtvnc) - date(now())) <= 30
THEN1341231                   WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 31 AND abs(min(pe.pe_dtvnc) - date(now())) <=
45THEN 2345342                   WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 46 AND abs(min(pe.pe_dtvnc) - date(now()))
<=60 THEN 654653                   WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 61 AND abs(min(pe.pe_dtvnc) -
date(now()))<= 90 THEN 45254                   WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 91 AND abs(min(pe.pe_dtvnc)
-date(now())) <= 180 THEN 13425                   WHEN abs(min(pe.pe_dtvnc) - date(now())) >= 181 AND
abs(min(pe.pe_dtvnc)- date(now())) <= 360 THEN 12346                   ELSE 13417               END AS "case"
FROMpcep pe         WHERE pe.pe_nrcntr = ev.ev_nrcntr) AS dsatr,    cv.cv_stc AS stc,    rg.rg_cdrgs AS cdrgs,
rg.rg_dscAS dsc_stcFROM epvnc evJOIN ctvn cv ON cv.cv_cdct = ev.ev_cdctJOIN eptm epr ON epr.epr_nrcntr =
ev.ev_nrcntrJOINrgst rg ON cv.cv_stc = rg.rg_idrgLEFT JOIN cvdvsld cvd ON cvd.cvd_cdct = cv.cv_cdct
 
;

And bellow is the select that returns: "ERROR: failed to locate grouping columns"
when no rows is returned by the View above, but it runs well when one or more
rows is returned by same view.

---
SELECT cdcp, nmfts, nrctn, tpvnc, dsc_vnc, ndcdv_prnc, nmdvpr, ndcdv_sld, max(vltt)
FROM vw_my_test_
GROUP BY cdcp, nmfts, nrctn, tpvnc, dsc_vnc, ndcdv_prnc, nmdvpr, ndcdv_sld;
---

If i group only by the *int* or *numeric* fields the error don't occurs, 
it only shows if i use a varchar in group by and the view returns 0 records

If i change the view above to use JOINs then all works fine... meaning the 
problem is something in SUBSELECTs and VARCHAR used in that way.

Is this a bug or a expected behavior?

best regards.
-- 
Dickson S. Guedes 
-
mail/xmpp: guedes@guedesoft.net - skype: guediz
http://guedesoft.net - http://planeta.postgresql.org.br




Re: ERROR: "failed to locate grouping columns"

From
Tom Lane
Date:
"Dickson S. Guedes" <listas@guedesoft.net> writes:
> And bellow is the select that returns: "ERROR: failed to locate grouping columns"
> when no rows is returned by the View above, but it runs well when one or more
> rows is returned by same view.

I really have a hard time believing that whether you get that error is
contingent on whether the view returns some rows or not.  That's a
planner message and couldn't possibly have to do with what happens
at runtime.

Would you put together a complete example, instead of leaving us to
guess what's underlying the view?  And what PG version is this?
        regards, tom lane


Re: ERROR: "failed to locate grouping columns"

From
"Dickson S. Guedes"
Date:
Em Sáb, 2009-03-07 às 19:38 -0500, Tom Lane escreveu:
> "Dickson S. Guedes" <listas@guedesoft.net> writes:
> > And bellow is the select that returns: "ERROR: failed to locate grouping columns"
> > when no rows is returned by the View above, but it runs well when one or more
> > rows is returned by same view.
> 
> I really have a hard time believing that whether you get that error is
> contingent on whether the view returns some rows or not.  That's a
> planner message and couldn't possibly have to do with what happens
> at runtime.

And I was really confused when I've tested. I've seen that it's a
planner message, then I discard SUBSELECTs and use JOINs and it works.

> Would you put together a complete example, instead of leaving us to
> guess what's underlying the view? 

Ok, I'll prepare a full test and send it.

>  And what PG version is this?

Oh! I forgot to say, the version is 8.3.6.

Thanks.
-- 
Dickson S. Guedes 
-
mail/xmpp: guedes@guedesoft.net - skype: guediz
http://guedesoft.net - http://planeta.postgresql.org.br



Re: ERROR: "failed to locate grouping columns"

From
"Dickson S. Guedes"
Date:
Em Sáb, 2009-03-07 às 19:38 -0500, Tom Lane escreveu:
> I really have a hard time believing that whether you get that error is
> contingent on whether the view returns some rows or not.  That's a
> planner message and couldn't possibly have to do with what happens
> at runtime.

Well, today I have more time to study the environment and I'd see that
was a coincidence in the fact that when the grouping by in the view
works fine and it was returning values, it was tested in a 8.1.4 PG
version.

Now I made a complete test in 8.1.4 and 8.3.6. In the first the error
not occurs, in the last yes.

> Would you put together a complete example, instead of leaving us to
> guess what's underlying the view?  And what PG version is this?

Attached there is a dump with the tables and views related:

vw_cnt_vnc_tst -> is my view before I changed sub-selects to JOIN

vw_that_works - an example view that works without grouping some columns
vw_that_not_works -> an example view that throws an error

thanks.
--
Dickson S. Guedes
-
mail/xmpp: guedes@guedesoft.net - skype: guediz
http://guedesoft.net - http://planeta.postgresql.org.br


Attachment

Re: ERROR: "failed to locate grouping columns"

From
Tom Lane
Date:
"Dickson S. Guedes" <listas@guedesoft.net> writes:
> Em Sáb, 2009-03-07 às 19:38 -0500, Tom Lane escreveu:
>> Would you put together a complete example, instead of leaving us to
>> guess what's underlying the view?  And what PG version is this?

> Attached there is a dump with the tables and views related:
> vw_that_works - an example view that works without grouping some columns
> vw_that_not_works -> an example view that throws an error

OK, reproduced here on HEAD:

dg=# select * from vw_that_not_works;
ERROR:  failed to locate grouping columns

Off to do some debugging.  Thanks for the test case!
        regards, tom lane


Re: ERROR: "failed to locate grouping columns"

From
Tom Lane
Date:
OK, I poked into this.  The test case can be simplified to this:

regression=# create table t1 (f1 numeric(14,0), f2 varchar(30));
CREATE TABLE
regression=# create view vv as select distinct f1,f2,(select f2 from t1 x where x.f1=aa.f1) as fs   from t1 aa;
CREATE VIEW
regression=# select * from vv group by f1,f2,fs;
ERROR:  failed to locate grouping columns

The reason that locate_grouping_columns fails is that it's being asked
to match up a Var with type varchar(30) (representing the result of the
view's fs column) to a Var with typmod -1, and those are not equal
according to equal().  The Var with default typmod is being manufactured
by build_physical_tlist(), which is looking at a subquery RTE whose
targetlist contains a SubPlan node.  Since exprTypmod just punts on
SubPlans, it constructs a Var with typmod -1.

So there are a couple of places we could assign blame here:

1. Subqueries in RTE nodes are supposed to be virgin, unplanned
querytrees, so finding a SubPlan in the targetlist is unexpected.
On this theory, the fault is that of set_subquery_pathlist(), which
ought to copy the RTE's subquery before it turns subquery_planner
loose on it (not to mention the changes it itself makes...).  More
generally it's another reason to fix the planner to not scribble on
its input, but that's a task for some other day.

2. It would still work if only SubPlans didn't lose information relative
to SubLinks.  On this theory we ought to add a firstColTypmod field to
SubPlan.  (The reason we didn't see this behavior before 8.3 is that
exprTypmod punted on SubLinks, too, before 8.3, and so the output of
the calling view would have been assigned typmod -1 anyway.)

Solution #1 is a bit annoying from a planner performance point of view,
but is probably the safest thing in the near term.  Solution #2 is
seeming like a good idea in the long run; but it also seems like it is
just fixing one symptom of the general issue that we're scribbling on
the content of a subquery RTE.  I'm also a tad hesitant to back-patch it
because I'm not sure if there are any places where it would change
user-visible behavior in unexpected ways.

So what I'm inclined to do is insert a copyObject() call into
set_subquery_pathlist(), and maybe in the future add a typmod field to
SubPlan.  I remain a bit uncertain about how far back to back-patch.
We know that 8.3 is broken and that 8.2 and before do not exhibit this
particular symptom.  It seems like there might be other problems with
the same root cause that do afflict pre-8.3 versions, but if we've gone
this long without finding them, are they really there?  Should we slow
down the planner in back versions to prevent a hypothetical problem?
        regards, tom lane