Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 7EE9063226B for ; Fri, 9 Jan 2009 12:53:38 -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 97587-01 for ; Fri, 9 Jan 2009 12:53:31 -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 B6C94632617 for ; Fri, 9 Jan 2009 12:53:29 -0400 (AST) Received: from [10.211.55.6] (dslb-088-077-003-025.pools.arcor-ip.net [88.77.3.25]) by dd1514.kasserver.com (Postfix) with ESMTP id B70B918740DF; Fri, 9 Jan 2009 17:53:24 +0100 (CET) Date: Fri, 09 Jan 2009 17:53:31 +0100 From: Bernd Helmle To: Jaime Casanova cc: Robert Haas , pgsql-hackers@postgresql.org Subject: Re: WIP: Automatic view update rules Message-ID: <3B3B2ACA2DB4AF9AF585FBAF@teje> In-Reply-To: References: <2849137C693B65CC8E86411C@imhotep.credativ.de> <94CF655A8D0DC7D5B4B81D8B@imhotep.credativ.de> <603c8f070811112006q906b3a6o59a66228b7fc997@mail.gmail.com> <7F84532C73CB3279DE8436E0@imhotep.credativ.de> <603c8f070811131344n5c087057p11f94780dae80885@mail.gmail.com> <603c8f070811252043r75db3e83v2eba1611452ee62e@mail.gmail.com> <3073cc9b0812250943x23547116ud956d8ab111e55bf@mail.gmail.com> <61043.91.48.33.48.1230474598.squirrel@tooney.at.xencon.de> X-Mailer: Mulberry/4.0.8 (Linux/x86) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==========DFEFDF3466FA445862F3==========" 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/716 X-Sequence-Number: 131360 --==========DFEFDF3466FA445862F3========== Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline --On Freitag, Januar 09, 2009 13:20:57 +0100 Bernd Helmle wrote: > That means, View1 consists of View2 and so on. What happens now if > someone is going to change View3, so that it's not updatable anymore? > What the patch actually does is, scanning all relations/views involved in > a current view (and cascading updates) und reject update rules as soon as > it finds more than one relation within a view definition. Unfortunately > this seems not to be enough, we had really check all involved views for > updatability recursively. The infrastructure for this is already there, > but i wonder if it could be made easier when we are going to maintain a > separate is_updatable flag somewhere in the catalog, which would make > checking the relation tree for updatability more easier. I've decided to check updatability of all involved views during view creation. Please find attached a new version with all other open issues adressed. -- Thanks Bernd --==========DFEFDF3466FA445862F3========== Content-Type: application/octet-stream; name="view_update.patch.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="view_update.patch.bz2"; size=12292 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 --==========DFEFDF3466FA445862F3==========--