Re: WIP: Automatic view update rules - Mailing list pgsql-hackers

From Bernd Helmle
Subject Re: WIP: Automatic view update rules
Date
Msg-id E3C0E65F7653B087DB6EBBDE@teje
Whole thread Raw
In response to WIP: Automatic view update rules  (Bernd Helmle <mailings@oopsware.de>)
Responses Re: WIP: Automatic view update rules
List pgsql-hackers
--On Samstag, Januar 17, 2009 02:01:15 +0200 Peter Eisentraut
<peter_e@gmx.net> wrote:

> Here is my updated patch based on yours.
>
> Outstanding issues, as far as I can see, are:
>
> Critical:
>
> * Updatability check must reject views where the select list references
> the same column more than once.
>

checkTree() will recheck this against reused varattno's within the query
tree and will reject such view definitions as non-updatable now.

> * Various scenarios of REPLACE VIEW misbehave.  I have marked these as
> FIXME in the regression test.  I think all this would behave better if
> REPLACE VIEW dropped all automatic rules and reassembled them from
> scratch for the new view.  The infrastructure for this is already there,
> so it should be a small change.
>

DefineViewRules() will drop all implicit rules when REPLACE is used now.

> Important:
>
> * Array support should be clarified.  checkTree() appears to reject most
> variants of array references, but other parts of the code try to handle
> it.  Should be cleaned up.
>

I'm currently working on this.

> * It is not clear how automatic rules and manual DO ALSO rules should
> interact.  A manual DO ALSO rule will currently clear out an automatic
> INSTEAD rule, which I find to be illogical.
>

What i've done so far is to replace implicit DO INSTEAD rules only, when
the new explicit one is DO INSTEAD, too. An additional DO ALSO rule will be
added to the view without dropping any automatic rules now.

> Optional:
>
> * The use of must_replace is create_update_rule() seems a bit useless.
> You might as well just always pass replace = true.
>

Fixed

> * You may want to consider writing the rule qualifications
>
> WHERE ((CASE WHEN (old.a IS NOT NULL) THEN (old.a = vutestv20.x) ELSE
> (vutestv20.x IS NULL) END))
>
> more like
>
> WHERE ((old.a = vutestv20.x) OR (old IS NULL AND vutestv20.x IS NULL))
>
> for better optimizability.

Done.

Please note that i haven't fixed the regression test yet. Thanks very much
for reviewing!



--
  Thanks

                    Bernd
Attachment

pgsql-hackers by date:

Previous
From: Zdenek Kotala
Date:
Subject: Re: foreign_data test fails with non-C locale
Next
From: "Todd A. Cook"
Date:
Subject: is 8.4 array_agg() supposed to work with array values?