Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 34A196322D4 for ; Mon, 19 Jan 2009 17:02:21 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 52155-04 for ; Mon, 19 Jan 2009 17:02:17 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from dd1514.kasserver.com (dd1514.kasserver.com [85.13.128.107]) by mail.postgresql.org (Postfix) with ESMTP id 4ED546322BC for ; Mon, 19 Jan 2009 17:02:15 -0400 (AST) Received: from [10.211.55.6] (dslb-088-078-125-030.pools.arcor-ip.net [88.78.125.30]) by dd1514.kasserver.com (Postfix) with ESMTP id 5A4891874122; Mon, 19 Jan 2009 22:02:08 +0100 (CET) Date: Mon, 19 Jan 2009 22:02:11 +0100 From: Bernd Helmle To: Peter Eisentraut cc: pgsql-hackers@postgresql.org Subject: Re: WIP: Automatic view update rules Message-ID: X-Mailer: Mulberry/4.0.8 (Linux/x86) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==========E79AC61B170484DCB665==========" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200901/1414 X-Sequence-Number: 132058 --==========E79AC61B170484DCB665========== Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline --On Samstag, Januar 17, 2009 02:01:15 +0200 Peter Eisentraut 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 --==========E79AC61B170484DCB665========== Content-Type: application/octet-stream; name="view_update_20090119.patch.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="view_update_20090119.patch.bz2"; size=22289 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 zSA= --==========E79AC61B170484DCB665==========--