Rules and views (was Re: [HACKERS] Rules: 2nd patch) - Mailing list pgsql-hackers

From jwieck@debis.com (Jan Wieck)
Subject Rules and views (was Re: [HACKERS] Rules: 2nd patch)
Date
Msg-id m0z9Bnc-000EBPC@orion.SAPserv.Hamburg.dsh.de
Whole thread Raw
In response to Rules: 2nd patch  (jwieck@debis.com (Jan Wieck))
Responses Re: Rules and views (was Re: [HACKERS] Rules: 2nd patch)
List pgsql-hackers
>     Next patch will allow instead  nothing  on  select  rules  to
>     return  no  tuples at all instead of one with all NULL fields
>     (as it is now).

    Ooops  -  though  it would be so easy - but it isn't. Instead
    rules for select are a damned thing. Select rules are applied
    totally different from the others, since the parsetree cannot
    get splitted.  Anything I tried resulted  in  something  that
    doesn't  work  at all, except for unqualified instead nothing
    rule (but what is a write-only table good for? :-). So up  to
    now they make no sense for me. Qualified instead nothing is a
    topic for a view, with the handmade negated qualification.

    Next thing will be the UPDATE NEW stuff then.

    Another rule related topic though:
    As the rule system becomes more and more useful now, wouldn't
    it   be   nice  to  enable  them  for  users?  I  think  rule
    creation/deletion must be restricted to the table  owner  (or
    superuser).  And  anything  the  rule  does has to be checked
    against the permissions of the rule owner.

    Next rule related topic:
    My new function get_ruledef(name) has now  a  little  sister.
    Her name is get_viewdef(name) and when called with a relation
    name she's telling either 'Not a view' or the complete SELECT
    statement,  that  builds  the  view. I've defined them in the
    regression database and setup a view xx_view. Now I can do

regression=> select * from xx_view;
viewname|definition

--------+--------------------------------------------------------------------------------------------------------------------------------------------------
pg_user |SELECT usename, usesysid, usecreatedb, usetrace, usesuper, usecatupd, '********'::text AS passwd, valuntil
FROMpg_shadow; 
street  |SELECT r.name, r.thepath, c.cname FROM road r, real_city c WHERE c.outline ## r.thepath;
iexit   |SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE
ih.thepath## r.thepath; 
toyemp  |SELECT name, age, location, '12'::int4 * salary AS annualsal FROM emp;
rtest_v1|SELECT a, b FROM rtest_t1;
xx_view |SELECT relname AS viewname, get_viewdef(relname) AS definition FROM pg_class WHERE (relhasrules) AND
(get_viewdef(relname)<> 'Not a view'::text); 
(6 rows)

regression=>

    (Sorry for the long lines)

    Except for the explicit type casting on all  constants,  they
    are  exactly  the  definitions of the original views. And the
    postgres parser accepts that as input to produce bit  by  bit
    the same rules/views again.

    I  tought them how to handle aggregates and group by and will
    tell them about isnull soon.

    If nobody votes against, I would like to make  them  builtins
    as  pg_get_ruledef()  and pg_get_viewdef() and then setup the
    appropriate views  (pg_rule  and  pg_view)  in  template1  by
    initdb  like we do it with pg_user. It cannot break anything,
    except that a rule action the  two  functions  cannot  handle
    will  make  the new views unusable.  But it would be a really
    powerful possibility for pg_dump or just useful to  see  what
    that damn event qual and parsetree's in pg_rewrite came from.

    Comments?


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#======================================== jwieck@debis.com (Jan Wieck) #

pgsql-hackers by date:

Previous
From: "Dr. Michael Meskes"
Date:
Subject: Re: [HACKERS] initb won't work
Next
From: Bruce Momjian
Date:
Subject: Re: Rules and views (was Re: [HACKERS] Rules: 2nd patch)