Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Richard Huxton
Jaime Casanova wrote:
In a galaxy far, far away Bernd wrote:
The context:
http://archives.postgresql.org/pgsql-hackers/2004-03/msg00999.php

so joined views are even not updateable, too.

I don't find the why of this on the specs and the 
threads about this issue ignore the comment.
BEGIN QUOTE
In O'Reilly there are also the conditions mentioned a view has to pass 
when declaring it updateable (also SQL99):

- The SELECT of the CREATE VIEW command depends only on one table
- UNION, EXCEPT and INTERSECT are not part of the View's SELECT
- No GROUP BY or HAVING
- Pseudo-Columns are forbidden, too (but i think that can improved to 
functions)
- No Aggregates
- No DISTINCT

so joined views are even not updateable, too.
END QUOTE
Well, I haven't checked the specs, but this list is clearly incorrect 
from a theoretical point of view (I've been thinking about this recently).

There are two things (AFAICT) you need to be able to do to update (NOTE 
- not insert) a view.
 1. Identify the underlying table(s) for the updated column(s)
 2. Identify (primary) key values for the table(s) being updated.
So - I could have a join listing users and how many email aliases they 
have (so sum()) and still update their name, so long as the key for the 
users table was present in the view.

Any summarising rules out updates for the summarised tables (because you 
no longer have a key available). Similarly, expression/function columns 
can't be updated (except in certain special cases).

UNION etc doesn't necessarily mean you can't update, so long as the 
underlying table/key can be identified.

For INSERTing to a view, the same rules apply, but obviously you need to 
 be able to identify table/keys for all columns in the view. This 
clearly rules out aggregates etc.

--
  Richard Huxton
  Archonet Ltd
---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
   (send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Yann Michel
Hi,

On Wed, Dec 22, 2004 at 09:41:40AM +, Richard Huxton wrote:
 UNION etc doesn't necessarily mean you can't update, so long as the 
 underlying table/key can be identified.

I think you mean UNION ALL, i.e. the set addition, don't you?
Otherwise UNION (wothout ALL) is kind of a aggregation due to it only
adds a row once to the resulting set wheter it is found twice or not.
Therefore any updates are not possible.

Regards,
Yann

---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Richard Huxton
Yann Michel wrote:
Hi,
On Wed, Dec 22, 2004 at 09:41:40AM +, Richard Huxton wrote:
UNION etc doesn't necessarily mean you can't update, so long as the 
underlying table/key can be identified.

I think you mean UNION ALL, i.e. the set addition, don't you?
Otherwise UNION (wothout ALL) is kind of a aggregation due to it only
adds a row once to the resulting set wheter it is found twice or not.
Therefore any updates are not possible.
Not if you can identify the underlying table(s) and key(s). If the UNION 
hides that information, then you are correct. Imagine the case where you 
were running a calendar system and had people_invited unioned with 
rooms_booked - you could in theory alter the name on both.

--
  Richard Huxton
  Archonet Ltd
---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
 subscribe-nomail command to [EMAIL PROTECTED] so that your
 message can get through to the mailing list cleanly


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Tom Lane
Richard Huxton dev@archonet.com writes:
 There are two things (AFAICT) you need to be able to do to update (NOTE 
 - not insert) a view.
   1. Identify the underlying table(s) for the updated column(s)
   2. Identify (primary) key values for the table(s) being updated.
 So - I could have a join listing users and how many email aliases they 
 have (so sum()) and still update their name, so long as the key for the 
 users table was present in the view.

No; you'd also have to have some guarantee that a given underlying table
row gives rise to at most one join row.  If the same table row gives
rise to multiple join rows, then a request specifying an UPDATE of just
one of those join rows can't be satisfied.

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Bernd Helmle
--On Mittwoch, Dezember 22, 2004 11:25:42 -0500 Tom Lane 
[EMAIL PROTECTED] wrote:

Richard Huxton dev@archonet.com writes:
There are two things (AFAICT) you need to be able to do to update (NOTE
- not insert) a view.
  1. Identify the underlying table(s) for the updated column(s)
  2. Identify (primary) key values for the table(s) being updated.
So - I could have a join listing users and how many email aliases they
have (so sum()) and still update their name, so long as the key for the
users table was present in the view.
No; you'd also have to have some guarantee that a given underlying table
row gives rise to at most one join row.  If the same table row gives
rise to multiple join rows, then a request specifying an UPDATE of just
one of those join rows can't be satisfied.
Not sure if i understand correctly, but that means JOINs between 1:n 
relations
falls under the not updateable category, because the parent row 
triggers updates to n possible child rows?


--
 Bernd
---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Tom Lane
Richard Huxton dev@archonet.com writes:
 Yann Michel wrote:
 I think you mean UNION ALL, i.e. the set addition, don't you?

 Not if you can identify the underlying table(s) and key(s). If the UNION 
 hides that information, then you are correct.

If a unique key of the underlying table is included in the UNION data, then
there can't be any duplicate rows and so the UNION really reduces to
UNION ALL.  However, I'm unconvinced that there are any cases like this
that are interesting in practice.  Consider

CREATE TABLE a (id int primary key, ...);

CREATE TABLE b (id int primary key, ...);

CREATE VIEW v AS SELECT * FROM a UNION SELECT * FROM b;

If a and b have disjoint key sets then the UNION is theoretically
updatable, but there is no way to specify such a constraint and thus
no way for the system to know that the UNION is updatable.

regards, tom lane

---(end of broadcast)---
TIP 8: explain analyze is your friend


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Richard Huxton
Tom Lane wrote:
Richard Huxton dev@archonet.com writes:
There are two things (AFAICT) you need to be able to do to update (NOTE 
- not insert) a view.
 1. Identify the underlying table(s) for the updated column(s)
 2. Identify (primary) key values for the table(s) being updated.
So - I could have a join listing users and how many email aliases they 
have (so sum()) and still update their name, so long as the key for the 
users table was present in the view.

No; you'd also have to have some guarantee that a given underlying table
row gives rise to at most one join row.  If the same table row gives
rise to multiple join rows, then a request specifying an UPDATE of just
one of those join rows can't be satisfied.
But you can't specify an update of a single row, only those where 
certain values match. Say you have a view user_email_vw with the 
following columns (from obvious tables):
 user_email_vw: u_id, u_name, e_id, e_address

Updating the view WHERE u_id=123 may well update more than one row 
(where a user has multiple emails), but that's exactly equivalent to 
updating the user-table WHERE u_name = 'John Smith'. In the view 
(u_id) is not a key any more.

If you have a many-many relationship, (say worker=department) then 
again you may update multiple rows in the view (WHERE dept_id=123), 
but so what - that's what you asked to do.

I'm not saying this is always the behaviour you'd want. Imagine an 
address table where you have a country-code field and a lookup table of 
countries. I almost certainly DON'T want the lookup table updated via 
the view, but there's no easy solution to that - it's to do with the 
semantics of the join, not its syntax.

--
  Richard Huxton
  Archonet Ltd
---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Tom Lane
Richard Huxton dev@archonet.com writes:
 Tom Lane wrote:
 No; you'd also have to have some guarantee that a given underlying table
 row gives rise to at most one join row.  If the same table row gives
 rise to multiple join rows, then a request specifying an UPDATE of just
 one of those join rows can't be satisfied.

 But you can't specify an update of a single row, only those where 
 certain values match. Say you have a view user_email_vw with the 
 following columns (from obvious tables):
   user_email_vw: u_id, u_name, e_id, e_address

 Updating the view WHERE u_id=123 may well update more than one row 
 (where a user has multiple emails), but that's exactly equivalent to 
 updating the user-table WHERE u_name = 'John Smith'. In the view 
 (u_id) is not a key any more.

Consider a request like
UPDATE vw SET u_name = 'Joe' WHERE u_id = 123 AND e_id = 456;
where u_id 123 links to multiple e_ids including 456.  There is no way
to update the underlying tables in such a way that only this row of the
view changes.  Therefore you can't sustain the illusion that the view is
an updatable table.

regards, tom lane

---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Richard Huxton
Tom Lane wrote:
Richard Huxton dev@archonet.com writes:
Yann Michel wrote:
I think you mean UNION ALL, i.e. the set addition, don't you?

Not if you can identify the underlying table(s) and key(s). If the UNION 
hides that information, then you are correct.

If a unique key of the underlying table is included in the UNION data, then
there can't be any duplicate rows and so the UNION really reduces to
UNION ALL.  However, I'm unconvinced that there are any cases like this
that are interesting in practice.  Consider
CREATE TABLE a (id int primary key, ...);
CREATE TABLE b (id int primary key, ...);
CREATE VIEW v AS SELECT * FROM a UNION SELECT * FROM b;
If a and b have disjoint key sets then the UNION is theoretically
updatable, but there is no way to specify such a constraint and thus
no way for the system to know that the UNION is updatable.
What about:
  CREATE TABLE a(id int primary key check  100, ...)
  CREATE TABLE b(id int primary key check  100, ...)
In any case, imagine a diary system where you might have an booking 
involving one or more people and/or resources (room/projector). You'd 
quite possibly have:

SELECT 'P' as res_type, p_id, p_name FROM event_person
UNION
SELECT 'R', r_id, r_type FROM event_resource
WHERE ...
Again, updatable (although I'm not sure how you'd detect the implied 
CHECK on the first column).

None of this is easy, or even practical but I'm fairly sure it's all 
possible.
--
  Richard Huxton
  Archonet Ltd

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
   (send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-12-22 Thread Richard Huxton
Tom Lane wrote:
Richard Huxton dev@archonet.com writes:
Tom Lane wrote:
No; you'd also have to have some guarantee that a given underlying table
row gives rise to at most one join row.  If the same table row gives
rise to multiple join rows, then a request specifying an UPDATE of just
one of those join rows can't be satisfied.

But you can't specify an update of a single row, only those where 
certain values match. Say you have a view user_email_vw with the 
following columns (from obvious tables):
 user_email_vw: u_id, u_name, e_id, e_address

Updating the view WHERE u_id=123 may well update more than one row 
(where a user has multiple emails), but that's exactly equivalent to 
updating the user-table WHERE u_name = 'John Smith'. In the view 
(u_id) is not a key any more.

Consider a request like
UPDATE vw SET u_name = 'Joe' WHERE u_id = 123 AND e_id = 456;
where u_id 123 links to multiple e_ids including 456.  There is no way
to update the underlying tables in such a way that only this row of the
view changes.  Therefore you can't sustain the illusion that the view is
an updatable table.
Agreed, but the reason we can't maintain the illusion that it's a 
simple table (i.e. plain CREATE TABLE) is that it's not. I might have 
a shelf_position column that, when I update it fires a trigger to 
renumber all the positions for that shelf. That breaks the illusion too.

Perhaps a more common example. A column updated_ts that always gets 
set to now() regardless of supplied value. That's non-intuitive (or at 
least implicit) behaviour, but perfectly common (and reasonable, I'd argue).

Now, on the client I'll grant we've got a problem unless we re-fetch 
after each update, or have some server-driven signalling. However, 
Microsoft have some sort of solution because their resultset-style model 
of the world in VB etc encounter this sort of thing.
--
  Richard Huxton
  Archonet Ltd

---(end of broadcast)---
TIP 7: don't forget to increase your free space map settings


Re: [HACKERS] Thoughts about updateable views

2004-12-21 Thread Jaime Casanova
In a galaxy far, far away Bernd wrote:

The context:
http://archives.postgresql.org/pgsql-hackers/2004-03/msg00999.php

 so joined views are even not updateable, too.

I don't find the why of this on the specs and the 
threads about this issue ignore the comment.

Is this right?

regards,
Jaime Casanova


_
Do You Yahoo!?
Información de Estados Unidos y América Latina, en Yahoo! Noticias.
Visítanos en http://noticias.espanol.yahoo.com

---(end of broadcast)---
TIP 7: don't forget to increase your free space map settings


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Gavin Sherry
On Mon, 22 Mar 2004, Bernd Helmle wrote:

 I am currently thinking of updateable views for a possible student research
 project. In this
 case there comes some points to my mind, i want to share with the list.

 a) Definition of an updateable view?

The SQL spec. You should definately get a look at at least the SQL92
definition before proceeding.

 b) The creation of an automatic INSERT/UPDATE or DELETE Rule had to be done
 with
 the creation of the SELECT Rule. I understand how PostgreSQL handles views
 with its Rule
 System, but what happens when no appropiate Rule can be created? Reject the

CREATE VIEW needs to check if all columns in the target list and the base
table are updatable or insertable into. Eg: How can you update: select
foo, random() from bar?

If the user specifically asked for an updatable view, then they can't have
one. If they didn't specifically ask, they get the usual read only view.

Gavin

---(end of broadcast)---
TIP 7: don't forget to increase your free space map settings


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bernd Helmle [EMAIL PROTECTED] writes:
 a) Definition of an updateable view?

 The first thing what i thought about was, what defines a updateable view. 

The SQL spec clearly defines the requirements for a view to be
updateable.  It seems sufficient to me to handle the cases required by
the spec.

 b) The creation of an automatic INSERT/UPDATE or DELETE Rule had to be done 
 with
 the creation of the SELECT Rule. I understand how PostgreSQL handles views 
 with its Rule
 System, but what happens when no appropiate Rule can be created?

You don't create it.  This corresponds to the view not being updateable.
AFAICS the spec expects CREATE VIEW to create both kinds of view without
the implementation making any particular comment about it.

We might need to mark automatically created rules as such, and be
prepared to drop them if the user then defines a manually-created rule.
Otherwise we will have backwards-compatibility problems with existing
databases.

regards, tom lane

---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faqs/FAQ.html


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Bruce Momjian
Tom Lane wrote:
 Bernd Helmle [EMAIL PROTECTED] writes:
  a) Definition of an updateable view?
 
  The first thing what i thought about was, what defines a updateable view. 
 
 The SQL spec clearly defines the requirements for a view to be
 updateable.  It seems sufficient to me to handle the cases required by
 the spec.
 
  b) The creation of an automatic INSERT/UPDATE or DELETE Rule had to be done 
  with
  the creation of the SELECT Rule. I understand how PostgreSQL handles views 
  with its Rule
  System, but what happens when no appropiate Rule can be created?
 
 You don't create it.  This corresponds to the view not being updateable.
 AFAICS the spec expects CREATE VIEW to create both kinds of view without
 the implementation making any particular comment about it.
 
 We might need to mark automatically created rules as such, and be
 prepared to drop them if the user then defines a manually-created rule.
 Otherwise we will have backwards-compatibility problems with existing
 databases.

I was thinking we create an updatable view if possible, and throw an
error if they try to insert/update/delete into a non-updatable view. 
Right now we ignore such activity, but that seems wrong.

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  [EMAIL PROTECTED]   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073

---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faqs/FAQ.html


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bruce Momjian [EMAIL PROTECTED] writes:
 I was thinking we create an updatable view if possible, and throw an
 error if they try to insert/update/delete into a non-updatable view. 

Right.

 Right now we ignore such activity, but that seems wrong.

Nonsense.

regression=# create view bar as select * from foo;
CREATE VIEW
regression=# insert into bar values (1);
ERROR:  cannot insert into a view
HINT:  You need an unconditional ON INSERT DO INSTEAD rule.
regression=#

The only backwards-compatibility risk I see is if there's a manually
created ON-whatever rule; this probably has to override the automatic ones.

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Bruce Momjian
Tom Lane wrote:
 Bruce Momjian [EMAIL PROTECTED] writes:
  I was thinking we create an updatable view if possible, and throw an
  error if they try to insert/update/delete into a non-updatable view. 
 
 Right.
 
  Right now we ignore such activity, but that seems wrong.
 
 Nonsense.
 
 regression=# create view bar as select * from foo;
 CREATE VIEW
 regression=# insert into bar values (1);
 ERROR:  cannot insert into a view
 HINT:  You need an unconditional ON INSERT DO INSTEAD rule.
 regression=#
 
 The only backwards-compatibility risk I see is if there's a manually
 created ON-whatever rule; this probably has to override the automatic ones.

Oh, good.   What release fixed this?  I sure hope it is 7.5 because I
don't see any mention of it in the release notes.  :-)  I poked around
in CVS and can't see when it was added.  No matter --- it is fixed now.

-- 
  Bruce Momjian|  http://candle.pha.pa.us
  [EMAIL PROTECTED]   |  (610) 359-1001
  +  If your life is a hard drive, |  13 Roberts Road
  +  Christ can be your backup.|  Newtown Square, Pennsylvania 19073

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bruce Momjian [EMAIL PROTECTED] writes:
 Tom Lane wrote:
 regression=# insert into bar values (1);
 ERROR:  cannot insert into a view

 Oh, good.   What release fixed this?

[experiments...]  7.1.

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Bernd Helmle
--On Montag, März 22, 2004 16:17:34 -0500 Tom Lane [EMAIL PROTECTED] 
wrote:

Bernd Helmle [EMAIL PROTECTED] writes:
[...]

We might need to mark automatically created rules as such, and be
prepared to drop them if the user then defines a manually-created rule.
Otherwise we will have backwards-compatibility problems with existing
databases.
Not going into deeper details, but where should such information be stored? 
It sounds like to have this in pg_rewrite?



--
 Bernd
---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?
  http://www.postgresql.org/docs/faqs/FAQ.html


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bernd Helmle [EMAIL PROTECTED] writes:
 --On Montag, März 22, 2004 16:17:34 -0500 Tom Lane [EMAIL PROTECTED] 
 wrote:
 We might need to mark automatically created rules as such, and be
 prepared to drop them if the user then defines a manually-created rule.

 Not going into deeper details, but where should such information be stored? 
 It sounds like to have this in pg_rewrite?

Yes, a boolean column added to pg_rewrite is what I was thinking of.

regards, tom lane

---(end of broadcast)---
TIP 9: the planner will ignore your desire to choose an index scan if your
  joining column's datatypes do not match


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bernd Helmle [EMAIL PROTECTED] writes:
 Currently no SQL spec handy (i will have one soon) , i took a look onto 
 O'Reillys SQL in a
 Nutshell, where the WITH CHECK OPTION is defined as follows (translated 
 from German):

 Only data that can be read from the specific view can be updated, fields 
 that aren't
 part of the view can't be updated. E.g. if a view is defined to display 
 only the monthly
 salary of an employee, it wouldn't be possible to modify an employees 
 hourly salary.

That sounds bogus to me.  It's obvious that columns not present in the
view can't be updated through the view --- you simply do not have a way
to name them, so how could you affect them?

What the spec actually says, if I'm reading it correctly, is that CHECK
OPTION forbids you from using the view to insert/update *rows* that
would not appear in the view.  For example given

CREATE VIEW v AS SELECT * FROM t WHERE flag != 42
WITH CHECK OPTION;

you could see the flag column in the view, and could set it on insert
or update --- so long as you didn't try to set it to 42.  That would
mean that the result row was invisible in the view, which is what CHECK
OPTION forbids.

In the general case with complicated WHERE conditions, it seems this
would be extremely expensive to enforce.  It would certainly be very
difficult to do it using only Postgres RULE mechanisms.  So I'd suggest
not implementing the WITH CHECK OPTION feature; certainly not as part of
your first cut.

(But: it looks to me like the spec gives license to be restrictive about
the form of WHERE clauses in updatable views, so it might be that
something could be done about WITH CHECK OPTION with less pain than I'm
imagining.)

regards, tom lane

---(end of broadcast)---
TIP 7: don't forget to increase your free space map settings


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Tom Lane
Bernd Helmle [EMAIL PROTECTED] writes:
 Currently no SQL spec handy (i will have one soon) ,

BTW, I find that the SQL92 spec is vastly more readable than SQL99,
partly because it's vastly shorter, and partly because the SQL99 authors
seem to have been into unnecessary formalism and obscurantism.  It's
usually a good idea to read SQL92 first to see what the feature is
actually intended to do, before you try to make sense of SQL99's
treatment.

You can find draft copies of both the 92 and 99 specs for free on the
web (I think there are links in our developer's FAQ).  I tend to use
these even though I have the official PDFs, mainly because plain ASCII
text is much easier to search than a PDF.

regards, tom lane

---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faqs/FAQ.html


Re: [HACKERS] Thoughts about updateable views

2004-03-22 Thread Bernd Helmle
--On Montag, März 22, 2004 18:00:55 -0500 Tom Lane [EMAIL PROTECTED] 
wrote:

That sounds bogus to me.  It's obvious that columns not present in the
view can't be updated through the view --- you simply do not have a way
to name them, so how could you affect them?
What the spec actually says, if I'm reading it correctly, is that CHECK
OPTION forbids you from using the view to insert/update *rows* that
would not appear in the view.  For example given
CREATE VIEW v AS SELECT * FROM t WHERE flag != 42
WITH CHECK OPTION;
you could see the flag column in the view, and could set it on insert
or update --- so long as you didn't try to set it to 42.  That would
mean that the result row was invisible in the view, which is what CHECK
OPTION forbids.
Ah, okay. I should have read this more carefully. Thanks for the 
clarification. No it
makes sense

--
 Bernd
---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
   (send unregister YourEmailAddressHere to [EMAIL PROTECTED])