Re: WIP: multivariate statistics / proof of concept - Mailing list pgsql-hackers
From | Tomas Vondra |
---|---|
Subject | Re: WIP: multivariate statistics / proof of concept |
Date | |
Msg-id | 5460244C.8080109@fuzzy.cz Whole thread Raw |
In response to | Re: WIP: multivariate statistics / proof of concept (David Rowley <dgrowleyml@gmail.com>) |
List | pgsql-hackers |
On 30.10.2014 10:23, David Rowley wrote: > On Thu, Oct 30, 2014 at 12:21 AM, Tomas Vondra <tv@fuzzy.cz > <mailto:tv@fuzzy.cz>> wrote: > > Dne 29 Říjen 2014, 10:41, David Rowley napsal(a): > > I'm quite interested in reviewing your work on this, but it > appears that > > some of your changes are not C89: > > > > src\backend\commands\analyze.c(3774): error C2057: expected constant > > expression [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(3774): error C2466: cannot allocate an > > array of constant size 0 [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(3774): error C2133: 'indexes' : > unknown > > size [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4302): error C2057: expected constant > > expression [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4302): error C2466: cannot allocate an > > array of constant size 0 [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4302): error C2133: 'ndistincts' : > unknown > > size [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4775): error C2057: expected constant > > expression [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4775): error C2466: cannot allocate an > > array of constant size 0 [D:\Postgres\a\postgres.vcxproj] > > src\backend\commands\analyze.c(4775): error C2133: 'keys' : > unknown size > > [D:\Postgres\a\postgres.vcxproj] > > > > I'll look into that. The thing is I don't have access to MSVC, so > it's a bit difficult to spot / fix those issues :-( > > > It should be a pretty simple fix, just use the files and line > numbers from the above. It's just a problem that in those 3 places > you're declaring an array of a variable size, which is not allowed in > C89. The thing to do instead would just be to palloc() the size you > need and the pfree() it when you're done. Attached is a patch that should fix these issues. The bad news is there are a few installcheck failures (and were in the previous patch, but I haven't noticed for some reason). Apparently, there's some mixup in how the patch handles Var->varno in some causes, causing issues with a handful of regression tests. The problem is that is_mv_compatible (checking whether the condition is compatible with multivariate stats) does this if (! ((varRelid == 0) || (varRelid == var->varno))) return false; /* Also skip special varno values, and system attributes ... */ if ((IS_SPECIAL_VARNO(var->varno)) || (! AttrNumberIsForUserDefinedAttr(var->varattno))) return false; assuming that after this, varno represents an index into the range table, and passes it out to the caller. And the caller (collect_mv_attnums) does this: RelOptInfo *rel = find_base_rel(root, varno); which fails with errors like these: ERROR: no relation entry for relid 0 ERROR: no relation entry for relid 1880 or whatever. What's even stranger is this: regression=# SELECT table_name, is_updatable, is_insertable_into regression-# FROM information_schema.views regression-# WHERE table_name = 'rw_view1'; ERROR: no relation entry for relid 0 regression=# SELECT table_name, is_updatable, is_insertable_into regression-# FROM information_schema.views regression-# ; regression=# SELECT table_name, is_updatable, is_insertable_into regression-# FROM information_schema.views regression-# WHERE table_name = 'rw_view1'; table_name | is_updatable | is_insertable_into ------------+--------------+-------------------- (0 rows) regression=# explain SELECT table_name, is_updatable, is_insertable_into FROM information_schema.views WHERE table_name = 'rw_view1'; ERROR: no relation entry for relid 0 So, the query fails. After removing the WHERE clause it works, and this somehow fixes the original query (with the WHERE clause). Nevertheless, I still can't do explain on the query. Clearly, I'm doing something wrong. I suspect it's caused either by conditions involving function calls, or the fact that the view is a join of multiple tables. But what? For simple queries (single table, ...) it seems to be working fine. regards Tomas
Attachment
pgsql-hackers by date: