pgsql: Automatic view update rules Bernd Helmle

Started by Peter Eisentrautabout 17 years ago382 messageshackers
Jump to latest
#1Peter Eisentraut
peter_e@gmx.net

Log Message:
-----------
Automatic view update rules

Bernd Helmle

Modified Files:
--------------
pgsql/doc/src/sgml:
catalogs.sgml (r2.189 -> r2.190)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/catalogs.sgml?r1=2.189&r2=2.190)
intro.sgml (r1.32 -> r1.33)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/intro.sgml?r1=1.32&r2=1.33)
pgsql/doc/src/sgml/ref:
create_view.sgml (r1.39 -> r1.40)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/doc/src/sgml/ref/create_view.sgml?r1=1.39&r2=1.40)
pgsql/src/backend/commands:
view.c (r1.111 -> r1.112)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/commands/view.c?r1=1.111&r2=1.112)
pgsql/src/backend/rewrite:
Makefile (r1.17 -> r1.18)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/Makefile?r1=1.17&r2=1.18)
rewriteDefine.c (r1.134 -> r1.135)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/rewriteDefine.c?r1=1.134&r2=1.135)
rewriteHandler.c (r1.182 -> r1.183)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/rewriteHandler.c?r1=1.182&r2=1.183)
rewriteRemove.c (r1.75 -> r1.76)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/rewriteRemove.c?r1=1.75&r2=1.76)
pgsql/src/backend/utils/cache:
relcache.c (r1.280 -> r1.281)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/cache/relcache.c?r1=1.280&r2=1.281)
pgsql/src/bin/pg_dump:
pg_dump.c (r1.514 -> r1.515)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/bin/pg_dump/pg_dump.c?r1=1.514&r2=1.515)
pg_dump.h (r1.147 -> r1.148)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/bin/pg_dump/pg_dump.h?r1=1.147&r2=1.148)
pgsql/src/include/catalog:
pg_rewrite.h (r1.31 -> r1.32)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/catalog/pg_rewrite.h?r1=1.31&r2=1.32)
pgsql/src/include/rewrite:
prs2lock.h (r1.25 -> r1.26)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/rewrite/prs2lock.h?r1=1.25&r2=1.26)
rewriteDefine.h (r1.31 -> r1.32)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/rewrite/rewriteDefine.h?r1=1.31&r2=1.32)
rewriteRemove.h (r1.25 -> r1.26)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/rewrite/rewriteRemove.h?r1=1.25&r2=1.26)
pgsql/src/test/regress:
parallel_schedule (r1.53 -> r1.54)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/parallel_schedule?r1=1.53&r2=1.54)
serial_schedule (r1.50 -> r1.51)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/serial_schedule?r1=1.50&r2=1.51)
pgsql/src/test/regress/expected:
alter_table.out (r1.112 -> r1.113)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/alter_table.out?r1=1.112&r2=1.113)
create_view.out (r1.16 -> r1.17)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/create_view.out?r1=1.16&r2=1.17)
drop_if_exists.out (r1.2 -> r1.3)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/drop_if_exists.out?r1=1.2&r2=1.3)
plancache.out (r1.7 -> r1.8)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/plancache.out?r1=1.7&r2=1.8)
portals.out (r1.19 -> r1.20)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/portals.out?r1=1.19&r2=1.20)
privileges.out (r1.41 -> r1.42)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/privileges.out?r1=1.41&r2=1.42)
returning.out (r1.4 -> r1.5)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/returning.out?r1=1.4&r2=1.5)
rules.out (r1.146 -> r1.147)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/rules.out?r1=1.146&r2=1.147)
subselect.out (r1.19 -> r1.20)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/subselect.out?r1=1.19&r2=1.20)

Added Files:
-----------
pgsql/src/backend/rewrite:
viewUpdate.c (r1.1)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/rewrite/viewUpdate.c?rev=1.1&content-type=text/x-cvsweb-markup)
pgsql/src/include/rewrite:
viewUpdate.h (r1.1)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/rewrite/viewUpdate.h?rev=1.1&content-type=text/x-cvsweb-markup)
pgsql/src/test/regress/expected:
view_update.out (r1.1)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/expected/view_update.out?rev=1.1&content-type=text/x-cvsweb-markup)
pgsql/src/test/regress/sql:
view_update.sql (r1.1)
(http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/test/regress/sql/view_update.sql?rev=1.1&content-type=text/x-cvsweb-markup)

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#1)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

petere@postgresql.org (Peter Eisentraut) writes:

Automatic view update rules

This patch is still a few bricks shy of a load ... within a few moments
of starting to look at it I'd noticed two different failure conditions

regression=# \d box_tbl
Table "public.box_tbl"
Column | Type | Modifiers
--------+------+-----------
f1 | box |

regression=# create view v1 as select * from box_tbl;
ERROR: could not identify an equality operator for type box
regression=# create view v1 as select box_tbl from box_tbl;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.

and I'm sure there are quite a few more. These things are not that hard
to fix in themselves, but what disturbs me more is the basic nature of
the generated rules.

regression=# create view v1 as select * from int8_tbl where q1 > 1000;
NOTICE: CREATE VIEW has created automatic view update rules
CREATE VIEW
regression=# \d v1
View "public.v1"
Column | Type | Modifiers
--------+--------+-----------
q1 | bigint |
q2 | bigint |
View definition:
SELECT int8_tbl.q1, int8_tbl.q2
FROM int8_tbl
WHERE int8_tbl.q1 > 1000;
Rules:
"_DELETE" AS
ON DELETE TO v1 DO INSTEAD DELETE FROM int8_tbl
WHERE (old.q1 IS NULL AND int8_tbl.q1 IS NULL OR old.q1 = int8_tbl.q1) AND (old.q2 IS NULL AND int8_tbl.q2 IS NULL OR old.q2 = int8_tbl.q2)
RETURNING old.q1, old.q2
"_INSERT" AS
ON INSERT TO v1 DO INSTEAD INSERT INTO int8_tbl (q1, q2)
VALUES (new.q1, new.q2)
RETURNING new.q1, new.q2
"_UPDATE" AS
ON UPDATE TO v1 DO INSTEAD UPDATE int8_tbl SET q1 = new.q1, q2 = new.q2
WHERE (old.q1 IS NULL AND int8_tbl.q1 IS NULL OR old.q1 = int8_tbl.q1) AND (old.q2 IS NULL AND int8_tbl.q2 IS NULL OR old.q2 = int8_tbl.q2)
RETURNING new.q1, new.q2

This has got two big problems. The first is the incredibly inefficient
nature of the resulting plans, e.g,

regression=# explain update v1 set q1 = q1 + 1000 where q1 = 42;
QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------
Nested Loop (cost=0.00..2.20 rows=1 width=22)
Join Filter: ((((public.int8_tbl.q1 IS NULL) AND (public.int8_tbl.q1 IS NULL)) OR (public.int8_tbl.q1 = public.int8_tbl.q1)) AND (((public.int8_tbl.q2 IS NULL) AND (public.int8_tbl.q2 IS NULL)) OR (public.int8_tbl.q2 = public.int8_tbl.q2)))
-> Seq Scan on int8_tbl (cost=0.00..1.07 rows=1 width=16)
Filter: ((q1 > 1000) AND (q1 = 42))
-> Seq Scan on int8_tbl (cost=0.00..1.05 rows=5 width=22)
(5 rows)

If we ship this, we will be a laughingstock. The other problem (which
is related to the first failure condition exhibited above) is the
assumption that the default btree equality operator for a data type is
"real" equality. Even if it exists, that's a bad assumption --- it
falls down for float8 and numeric let alone any more-interesting
datatypes such as the geometric types.

It would probably be better if we insisted that the view's base be a
plain relation and used ctid equality in the update rules (which will in
turn require supporting TidScan as an inner join indexscan, but that's
doable).

In short, I don't feel that this was ready to be applied. It's probably
fixable with a week or so's work, but do we want to be expending that
kind of effort on it at this stage of the release cycle?

regards, tom lane

#3Bernd Helmle
mailings@oopsware.de
In reply to: Tom Lane (#2)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On 23. Januar 2009 13:28:27 -0500 Tom Lane <tgl@sss.pgh.pa.us> wrote:

In short, I don't feel that this was ready to be applied. It's probably
fixable with a week or so's work, but do we want to be expending that
kind of effort on it at this stage of the release cycle?

Uh well, i'd be happier if such review comments would have been made
earlier in the CommitFest.

If i understand you correctly we have the choice between

a) revert this patch, fix all remaining issues which will likely postpone
this for 8.5
b) don't revert, but try to fix the issues currently existing in HEAD.

It seems you're unsure wether b) is an option at all, because the amount of
remaining work exceeds the time left for this release cycle?

To be honest: I'm disappointed. If it tooks only a few steps to identify
those (obviously important) issues, i get the opinion that there's very few
motivating interest in this functionality (And yes, i'm annoyed about
myself to not consider those operator issues).

Bernd

#4Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bernd Helmle (#3)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Bernd Helmle wrote:

If i understand you correctly we have the choice between

a) revert this patch, fix all remaining issues which will likely postpone
this for 8.5
b) don't revert, but try to fix the issues currently existing in HEAD.

c) revert and expect an updated patch to apply very soon before this
commitfest is finished

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bernd Helmle (#3)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Bernd Helmle <mailings@oopsware.de> writes:

--On 23. Januar 2009 13:28:27 -0500 Tom Lane <tgl@sss.pgh.pa.us> wrote:

In short, I don't feel that this was ready to be applied.

Uh well, i'd be happier if such review comments would have been made
earlier in the CommitFest.

[ shrug... ] I've been busting my butt since 1 November to try to
review everything. Some things are going to get left to the end.
I have to admit having ranked this one lower because it was marked
WIP for a good part of the commitfest, and so I'd assumed it was not
really a serious candidate to get applied.

Anyway, it's here now, and what we have to figure out is whether it's
fixable on a time scale that's realistic for 8.4. I would really rather
sidestep the whole btree-equality issue if possible, but that doesn't
seem possible without some amount of changes to the rule mechanism
itself. The idea I was toying with when I posted earlier is that the
rules should look more like

on update to view do instead
update base_table set c1 = new.c1, etc
where base_table.ctid = old.ctid

but of course that doesn't work as-is because views don't expose
old.ctid, and even if they did (which doesn't seem impossible) we'd need
some planner fixes in order to get a non-silly plan out of it, because
joins on ctid aren't implemented very well today.

Another gotcha is that read-committed updates wouldn't work properly.
If the row first identified by the view has been outdated by someone
else's update, we're supposed to try to apply the update to the newest
version of the row, if it still passes the update's WHERE clause.
This would fail a priori with the ctid-based approach since the new row
version is guaranteed not to have the same ctid. Even in the current
equate-all-the-visible-fields approach it doesn't work if the someone
else updated any of the visible fields: the row would now fail one of
the added where conditions, which have got nothing to do with anything
that the user wrote, so it's not expected behavior.

I'm inclined to think that this is all pretty much insoluble within the
current rule mechanism. The existing definition of rules makes it
basically impossible to do INSTEAD UPDATE or INSTEAD DELETE without
creating a self-join; if we don't get around that somehow we're never
going to be very satisfied with either the performance or the
corner-case semantics of this thing. What we get now from a rewritten
view update is something that looks like

UPDATE base_table new SET ... FROM base_table old
WHERE view's-conditions-on-old AND user's-conditions-on-old
AND exposed-fields-of-new-and-old-are-equal

and just replacing the last part of that with a ctid equality is only
nibbling at the margins of its suckiness. What we really want is that
the rewritten query is just

UPDATE base_table SET ...
WHERE view's-conditions AND user's-conditions

with no join at all.

Perhaps the right answer is to invent some new rule syntax to "redirect"
inserts/updates/deletes, say something like

on update to foo do instead redirect to bar

and then put some logic that's not so much different from what you've
got here into the rule engine itself ... or maybe better, just have the
rule engine automatically try to redirect if it's faced with having to
raise error for lack of a rule? It seems to me that the rule engine
has probably got all the infrastructure needed to convert the query the
way we'd like, we just don't have a suitable API to tell it to do that.

regards, tom lane

#6Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#5)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

On Fri, 2009-01-23 at 17:32 -0500, Tom Lane wrote:

Bernd Helmle <mailings@oopsware.de> writes:

--On 23. Januar 2009 13:28:27 -0500 Tom Lane <tgl@sss.pgh.pa.us> wrote:

In short, I don't feel that this was ready to be applied.

Uh well, i'd be happier if such review comments would have been made
earlier in the CommitFest.

[ shrug... ] I've been busting my butt since 1 November to try to
review everything. Some things are going to get left to the end.

I don't think anyone is suggesting differently and if they are I will be
happy to go all JD on them. I think the author is just (rightfully)
frustrated at the process in general. We lack certain resources. *shrug*

The good news is :) this release cycle has been much better than any
previous release cycle that I have been a part of.

Sincerely,

Joshua D. Drake

--
PostgreSQL - XMPP: jdrake@jabber.postgresql.org
Consulting, Development, Support, Training
503-667-4564 - http://www.commandprompt.com/
The PostgreSQL Company, serving since 1997

#7Josh Berkus
josh@agliodbs.com
In reply to: Bernd Helmle (#3)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Bernd,

To be honest: I'm disappointed. If it tooks only a few steps to identify
those (obviously important) issues, i get the opinion that there's very
few motivating interest in this functionality (And yes, i'm annoyed
about myself to not consider those operator issues).

Well, that *is* the problem with getting your patch into the last
commitfest, and why I tried to get everyone to submit earlier. You only
have to miss one difficult problem to miss the release.

If it makes you feel any better, I certainly didn't think of the
operator issue, and neither did Robert.

--Josh

#8Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Josh Berkus (#7)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

On Fri, Jan 23, 2009 at 5:52 PM, Josh Berkus <josh@agliodbs.com> wrote:

Bernd,

If it makes you feel any better, I certainly didn't think of the operator
issue, and neither did Robert.

to be honest, i feel like that was commented in the last (or the last
before the last) release cycle well this patch originally appears.
but i have no time in this moment to confirm that

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157

#9Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#5)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

On Fri, Jan 23, 2009 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Perhaps the right answer is to invent some new rule syntax to "redirect"
inserts/updates/deletes, say something like

on update to foo do instead redirect to bar

and then put some logic that's not so much different from what you've
got here into the rule engine itself ... or maybe better, just have the
rule engine automatically try to redirect if it's faced with having to
raise error for lack of a rule? It seems to me that the rule engine
has probably got all the infrastructure needed to convert the query the
way we'd like, we just don't have a suitable API to tell it to do that.

and what about default values? if we redirect we will have to use the
table's default (something i like) and AFAIU we won't have the ability
to change it for the view at least not without manually create a new
DO INSTEAD rule (something i don't like)...

i'm missing something? or can we implement such "REDIRECT" with the
ability to respect view's own defaults?

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157

#10Bernd Helmle
mailings@oopsware.de
In reply to: Tom Lane (#5)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On 23. Januar 2009 17:32:55 -0500 Tom Lane <tgl@sss.pgh.pa.us> wrote:

Bernd Helmle <mailings@oopsware.de> writes:

--On 23. Januar 2009 13:28:27 -0500 Tom Lane <tgl@sss.pgh.pa.us> wrote:

In short, I don't feel that this was ready to be applied.

Uh well, i'd be happier if such review comments would have been made
earlier in the CommitFest.

[ shrug... ] I've been busting my butt since 1 November to try to
review everything. Some things are going to get left to the end.
I have to admit having ranked this one lower because it was marked
WIP for a good part of the commitfest, and so I'd assumed it was not
really a serious candidate to get applied.

Oh, please, don't get me wrong: i never intended to attack you personally.
I can imagine how much of work you are faced with this release. I got the
feeling that it's simply the wrong way chosen, a little bit frustrating,
isn't it?

Apologize for that.

Anyway, it's here now, and what we have to figure out is whether it's
fixable on a time scale that's realistic for 8.4. I would really rather
sidestep the whole btree-equality issue if possible, but that doesn't
seem possible without some amount of changes to the rule mechanism
itself. The idea I was toying with when I posted earlier is that the
rules should look more like

on update to view do instead
update base_table set c1 = new.c1, etc
where base_table.ctid = old.ctid

but of course that doesn't work as-is because views don't expose
old.ctid, and even if they did (which doesn't seem impossible) we'd need
some planner fixes in order to get a non-silly plan out of it, because
joins on ctid aren't implemented very well today.

Another gotcha is that read-committed updates wouldn't work properly.
If the row first identified by the view has been outdated by someone
else's update, we're supposed to try to apply the update to the newest
version of the row, if it still passes the update's WHERE clause.
This would fail a priori with the ctid-based approach since the new row
version is guaranteed not to have the same ctid. Even in the current
equate-all-the-visible-fields approach it doesn't work if the someone
else updated any of the visible fields: the row would now fail one of
the added where conditions, which have got nothing to do with anything
that the user wrote, so it's not expected behavior.

Yeah, that's exactly the same feeling i got when reading your last mail.
I'm very uncomfortable now that we know the "real" gotchas with the whole
rule approach. Normally you'll get some ideas when thinking about a
solution, but instead i have to think "omg, is that really doable within
the rewriter in any ways?" getting disappointed.

What we get now from a rewritten
view update is something that looks like

UPDATE base_table new SET ... FROM base_table old
WHERE view's-conditions-on-old AND user's-conditions-on-old
AND exposed-fields-of-new-and-old-are-equal

and just replacing the last part of that with a ctid equality is only
nibbling at the margins of its suckiness. What we really want is that
the rewritten query is just

UPDATE base_table SET ...
WHERE view's-conditions AND user's-conditions

with no join at all.

Perhaps the right answer is to invent some new rule syntax to "redirect"
inserts/updates/deletes, say something like

on update to foo do instead redirect to bar

Hmm this would mean that the rewriter bypasses all the rule stuff itself
when faced with a view update and completely replacing the original query?
Looks kinda of it. Oracle has INSTEAD OF triggers which are going to do
nearly the same thing, afaiks.

Bernd

#11Bernd Helmle
mailings@oopsware.de
In reply to: Jaime Casanova (#8)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On 23. Januar 2009 18:02:55 -0500 Jaime Casanova
<jcasanov@systemguards.com.ec> wrote:

to be honest, i feel like that was commented in the last (or the last
before the last) release cycle well this patch originally appears.

I know that i've changed something in the operator lookup code regarding
some discussions last year, but i can't remember. Anyways, we have to fix
it in some other way.

And of course, CTID looks like a mess (and i'm sure there are much more
issues with them than we can imagine now, because it's in some direction
theoretically much the same problem as multi action rules).

Bernd

#12Bernd Helmle
mailings@oopsware.de
In reply to: Jaime Casanova (#9)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On 23. Januar 2009 18:07:38 -0500 Jaime Casanova
<jcasanov@systemguards.com.ec> wrote:

and what about default values? if we redirect we will have to use the
table's default (something i like) and AFAIU we won't have the ability
to change it for the view at least not without manually create a new
DO INSTEAD rule (something i don't like)...

i'm missing something? or can we implement such "REDIRECT" with the
ability to respect view's own defaults?

It's too late for me to think technically about it, but you're right,
something to keep this behavior would be nice. I don't know wether the
standard has a notion about such behavior, too (have to look at it).

Note that a possible solution obviously has to allow the old behavior, so
in the first place this behavior can be easily restored.

Bernd

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jaime Casanova (#9)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Jaime Casanova <jcasanov@systemguards.com.ec> writes:

On Fri, Jan 23, 2009 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Perhaps the right answer is to invent some new rule syntax to "redirect"
inserts/updates/deletes, say something like
on update to foo do instead redirect to bar

and what about default values?

I don't see the issue. View defaults would get inserted the same way
they are now.

There is another thing that's bothering me, though, which is that the
present approach to dumping rules isn't adequate. Consider the
following scenario:

1. You create a view that the system considers updatable, so it creates
some automatic rules.

2. You don't want those rules, so you delete them, leaving you with the
traditional behavior where attempted inserts etc on the view fail.

3. All is well until you dump and restore, whereupon you'll be swearing
at those ^$^@#! rules having come back.

I think that we probably want the rules to show up automatically during
an upgrade from an older version, but it does not follow that they
should come back after being intentionally removed from an 8.4
installation. (This is *particularly* true if we are unable to squash
every last one of the semantic gotchas; but even if we can, it's not
impossible that someone might want the no-update behavior for some
views.)

We could imagine attaching a "no auto rules please" property to views
(hm, perhaps this is an application for reloptions for a view).
Or we could invent a new rule action type "DO INSTEAD ERROR",
so that you could get the failure behavior as the result of a rule
manually substituted for the automatic ones. But right now there's
a hole in the definition.

regards, tom lane

#14Robert Haas
robertmhaas@gmail.com
In reply to: Bernd Helmle (#3)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Uh well, i'd be happier if such review comments would have been made earlier
in the CommitFest.

Well, as one of original reviewers of this patch, I feel a little bad
that I didn't consider these issues - the rules looked messy to me,
but I didn't consider that the whole approach might be wrong. But...
I have to admit I didn't look at this patch very hard. When I first
reviewed it on November 11th, it didn't even pass regression tests,
and you didn't submit a new version until December 26th, by which time
I had long since moved onto other things.

In the future, I think we should have an expectation that resubmits
within the same CommitFest should happen within a week, and that if no
revision is forthcoming within two weeks the patch is declared dead
(and the submitter can add it to the next CommitFest when they
resubmit). Don't think I'm picking on you, either: there was quite a
bit of it this CommitFest, and it's bad, because:

- reviewers are afraid to move on to new patches, because they don't
know when or if they'll suddenly be called upon to go re-review old
patches, and
- the commitfest takes forever, which is probably hard on the
committers as well as the reviewers, and
- when the FINAL commitfest takes this long, it creates an extremely
long window during which it's hard to get started on any new work for
8.5.

On the flip side, as I've said before, some of the big patches were
not reviewed until quite late. I think next time we should focus on
assigning reviewers to the big patches first (maybe two reviewers each
just to make sure we get good coverage...) and then review the smaller
patches afterwards. But that's a separate issue from how long the
submitter takes to respond to feedback once it's given.

...Robert

#15Bernd Helmle
mailings@oopsware.de
In reply to: Bernd Helmle (#12)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On 23. Januar 2009 21:18:19 -0500 Robert Haas <robertmhaas@gmail.com>
wrote:

In the future, I think we should have an expectation that resubmits
within the same CommitFest should happen within a week, and that if no
revision is forthcoming within two weeks the patch is declared dead
(and the submitter can add it to the next CommitFest when they
resubmit). Don't think I'm picking on you, either: there was quite a
bit of it this CommitFest, and it's bad, because:

yes, i'd be happier if i could have spent more time on it, being more
responsive, especially in late December. But it wasn't possible, my fault :(

You're suggestion doesn't help with the problem that (like Joshua already
mentioned) core developers are too busy with reviewing stuff during the
CommitFest. Because of this it's really hard to get the necessary time of
somebody who is able to evaluate the architecture of a new feature and
(more important) its side-effects on the whole system. Especially the last
CommitFest before Feature Freeze is becoming heavily busted with many many
interesting patches, because people want to have their WIP reviewed at
least for the upcoming release (like me). I don't see how postponing
patches would make it better?

The lesson i've learned is to post more, post often and not waiting until
the last CommitFest begins.

Bernd

#16Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#5)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

I wrote:

... It seems to me that the rule engine
has probably got all the infrastructure needed to convert the query the
way we'd like, we just don't have a suitable API to tell it to do that.

I have in mind a couple of quite different approaches to this, and wanted
to solicit some feedback about which direction to pursue.

The idea I'd originally had was something along the lines of

ON UPDATE DO INSTEAD SUBSTITUTE base_table [ (base_column_name, ...) ]

where the intended transformation is that you take the update command
on the view as-written, substitute base_table for the view name and
appropriate base_column_names for each view column name, and presto
you have your update command for the base table. The list of column names
would be there to let you specify the correspondence between base columns
and view columns. One thing this is lacking is anything corresponding
to the view's WHERE clause to ensure that the update is restricted to
rows that are visible through the view. We could just have the rewriter
copy over the view's WHERE clause, or we could insist that the clause
be repeated in the rule, ie

ON UPDATE DO INSTEAD SUBSTITUTE base_table [ (base_column_name, ...) ]
[ WHERE ... ]

That would be pretty tedious to write or maintain by hand, but in simple
cases the automatic rewriter should do it for you.

(Note: I'm focusing on UPDATE here because that's the hardest case.
DELETE is easier because there's no new column values to compute,
and INSERT is easy because there's no need to worry about matching
to an existing view row.)

Plan B was to not have any of this syntax exposed at all, but just have
the rewriter try to do it automatically when no update rule exists for
a view. I think the main argument in favor of exposing syntax would be if
the syntax allows you to do things above and beyond the cases that we're
willing to take care of automatically. Some examples of that would be
ignoring attempted updates on derived columns of a view, or reversing
invertible functions in the view. (A trivial example of that: if the
view exposes "base_col + 1", you could allow updates that subtract one
from the value the user tries to store.) The above syntax doesn't work
very well for doing such things, though.

I came up with a Plan C, which is to keep mostly the current syntax for
update rules but invent some notation that says "apply the update to the
view's underlying row". There's an obvious candidate for existing syntax
to abuse for this purpose: WHERE CURRENT OF. So we'd write something like

ON UPDATE DO INSTEAD
UPDATE base_table SET base_col_1 = new.derived_col_1, base_col_2 ...
WHERE CURRENT OF VIEW;

and the rewriter would interpret this appropriately. You'd end up with
essentially the same results as with the other syntax, but there is more
flexibility here to omit columns, store results computed from columns,
etc.

This is a bit ugly because of the potential conflict with regular
"WHERE CURRENT OF cursor", but I find it hard to see a use-case for that
in a rule, since cursors are so much shorter-lived than rules. Anyway
you could avoid the conflict by not naming your cursor "view". A bigger
objection is that the semantics would be just a little bit different from
regular WHERE CURRENT OF cursor, because our implementation of that is
effectively a ctid match; and as I explained before, that's not what we
want for an updatable view.

Does anyone find any of these examples particularly attractive or
horrific? Got any better ideas?

regards, tom lane

#17Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#16)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Tom Lane <tgl@sss.pgh.pa.us> writes:

ON UPDATE DO INSTEAD SUBSTITUTE base_table [ (base_column_name, ...) ]
[ WHERE ... ]

ON UPDATE DO INSTEAD
UPDATE base_table SET base_col_1 = new.derived_col_1, base_col_2 ...
WHERE CURRENT OF VIEW;

What would happen with these if the view is defined with "SELECT *" and I add
a new column or drop columns from the table? It seems like the former with the
optional list of columns would magically apply to the new columns which would
make it behave differently from the normal select rule. Or would you expand an
ommitted column list like we do with "select *"

In any case the fact that the latter allows you to extend things with computed
values seems pretty attractive. We could always allow shortcuts like "SET *
WHERE CURRENT OF VIEW" analogous to "SELECT *" for manually created views. We
could also allow the rhs of the expressions to be skipped so you could do

UPDATE base_table SET col1, col2, col, base_col = new.derived_col - 1
WHERE CURRENT OF VIEW

This same machinery isn't present in the normal executor is it? I mean, if I
can update a view then ISTM I should be able to update a view written inline
in the query like:

UPDATE (select * from a where x=1) set y=2

just like I can with SELECTs. This does incidentally work in Oracle and is its
way of doing what we do with UPDATE...FROM. It's the only way AFAIK to get
merge join update plans out of it.

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Get trained by Bruce Momjian - ask me about EnterpriseDB's PostgreSQL training!

#18Bernd Helmle
mailings@oopsware.de
In reply to: Tom Lane (#16)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

--On Samstag, Januar 24, 2009 14:17:58 -0500 Tom Lane <tgl@sss.pgh.pa.us>
wrote:

ON UPDATE DO INSTEAD
UPDATE base_table SET base_col_1 = new.derived_col_1, base_col_2 ...
WHERE CURRENT OF VIEW;

and the rewriter would interpret this appropriately. You'd end up with
essentially the same results as with the other syntax, but there is more
flexibility here to omit columns, store results computed from columns,
etc.

I like this idea more than Plan A or B, since it's much closer to the
current rule syntax. What i'm missing is some notion about CHECK OPTION. We
surely want to support that in way.

--
Thanks

Bernd

#19Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#17)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Gregory Stark <stark@enterprisedb.com> writes:

Tom Lane <tgl@sss.pgh.pa.us> writes:

ON UPDATE DO INSTEAD SUBSTITUTE base_table [ (base_column_name, ...) ]
[ WHERE ... ]

ON UPDATE DO INSTEAD
UPDATE base_table SET base_col_1 = new.derived_col_1, base_col_2 ...
WHERE CURRENT OF VIEW;

What would happen with these if the view is defined with "SELECT *" and I add
a new column or drop columns from the table?

Nothing, just as happens now, because the * got expanded to a set column
list by the parser before the view ever got defined.

This same machinery isn't present in the normal executor is it? I mean, if I
can update a view then ISTM I should be able to update a view written inline
in the query like:
UPDATE (select * from a where x=1) set y=2

That is not a view; the primary reason why not being that there are no
applicable rules.

regards, tom lane

#20Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bernd Helmle (#18)
Re: [COMMITTERS] pgsql: Automatic view update rules Bernd Helmle

Bernd Helmle <mailings@oopsware.de> writes:

What i'm missing is some notion about CHECK OPTION. We
surely want to support that in way.

Feel free to insist on that, if you want to make dead certain that
updatable views don't make it into 8.4 ;-)

My recollection of the discussion two years ago is that we concluded
that WITH CHECK OPTION is simply not implementable using a rule-based
infrastructure, because of the multiple-evaluation problem. Perhaps
it could be done with some kind of extension to the constraint-checking
logic, but I freely admit I don't see how to do it in any detail.
That seems like something to tackle later on.

regards, tom lane

#21Robert Haas
robertmhaas@gmail.com
In reply to: Bernd Helmle (#15)
#22Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#21)
#23Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#13)
#24Guillaume Smet
guillaume.smet@gmail.com
In reply to: Tom Lane (#13)
#25Bernd Helmle
mailings@oopsware.de
In reply to: Guillaume Smet (#24)
#26Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#22)
#27Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#26)
#28Bernd Helmle
mailings@oopsware.de
In reply to: Bruce Momjian (#27)
#29Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#27)
#30Guillaume Smet
guillaume.smet@gmail.com
In reply to: Bernd Helmle (#25)
#31Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bernd Helmle (#25)
#32Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#27)
#33Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#31)
#34Bernd Helmle
mailings@oopsware.de
In reply to: Andrew Dunstan (#33)
#35Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#32)
#36Pavel Stehule
pavel.stehule@gmail.com
In reply to: Bernd Helmle (#34)
#37Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bernd Helmle (#34)
#38Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#32)
#39Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#31)
#40Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#31)
#41KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#32)
#42KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Robert Haas (#35)
#43Bernd Helmle
mailings@oopsware.de
In reply to: Tom Lane (#37)
#44Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#32)
#45Devrim GÜNDÜZ
devrim@gunduz.org
In reply to: Tom Lane (#32)
#46Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Simon Riggs (#44)
#47Zeugswetter Andreas ADI SD
Andreas.Zeugswetter@s-itsolutions.at
In reply to: Tom Lane (#13)
#48Dave Page
dpage@pgadmin.org
In reply to: Heikki Linnakangas (#46)
#49Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#32)
#50Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#32)
#51Robert Haas
robertmhaas@gmail.com
In reply to: Jonah H. Harris (#49)
#52Simon Riggs
simon@2ndQuadrant.com
In reply to: Heikki Linnakangas (#46)
#53Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Simon Riggs (#52)
#54Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jonah H. Harris (#49)
#55Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Robert Haas (#51)
#56KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Robert Haas (#51)
#57Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#53)
#58Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#50)
#59Bruce Momjian
bruce@momjian.us
In reply to: Heikki Linnakangas (#54)
#60Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#58)
#61Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Zeugswetter Andreas ADI SD (#47)
#62Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#60)
#63Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#60)
#64Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#54)
#65Merlin Moncure
mmoncure@gmail.com
In reply to: Tom Lane (#60)
#66Jonah H. Harris
jonah.harris@gmail.com
In reply to: Merlin Moncure (#65)
#67Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#63)
#68Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#67)
#69Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#66)
#70Merlin Moncure
mmoncure@gmail.com
In reply to: Jonah H. Harris (#66)
#71Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#69)
#72Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#67)
#73KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Dave Page (#68)
#74Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#68)
#75Chris Browne
cbbrowne@acm.org
In reply to: Jonah H. Harris (#71)
#76Robert Haas
robertmhaas@gmail.com
In reply to: Merlin Moncure (#70)
#77Laurent Coustet
ed@debian-fr.net
In reply to: Robert Haas (#76)
#78Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#76)
#79Josh Berkus
josh@agliodbs.com
In reply to: Joshua D. Drake (#78)
#80Joshua D. Drake
jd@commandprompt.com
In reply to: Josh Berkus (#79)
#81Merlin Moncure
mmoncure@gmail.com
In reply to: Josh Berkus (#79)
#82Josh Berkus
josh@agliodbs.com
In reply to: Merlin Moncure (#81)
#83Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Josh Berkus (#79)
#84Josh Berkus
josh@agliodbs.com
In reply to: Jaime Casanova (#83)
#85Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#79)
#86Bruce Momjian
bruce@momjian.us
In reply to: Merlin Moncure (#81)
#87Dave Page
dpage@pgadmin.org
In reply to: Josh Berkus (#84)
#88Merlin Moncure
mmoncure@gmail.com
In reply to: Bruce Momjian (#86)
#89Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#86)
#90Hans-Jürgen Schönig
postgres@cybertec.at
In reply to: Josh Berkus (#79)
#91Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#86)
#92Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#85)
#93Simon Riggs
simon@2ndQuadrant.com
In reply to: Merlin Moncure (#88)
#94Chad Sellers
csellers@tresys.com
In reply to: Joshua Brindle (#92)
#95Rick Vernam
rickv@hobi.com
In reply to: Tom Lane (#85)
#96Josh Berkus
josh@agliodbs.com
In reply to: Joshua Brindle (#92)
#97Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#89)
#98Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Bruce Momjian (#86)
#99Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#37)
#100Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Bruce Momjian (#99)
#101Josh Berkus
josh@agliodbs.com
In reply to: Bruce Momjian (#99)
#102Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Bruce Momjian (#86)
#103Joshua Brindle
method@manicmethod.com
In reply to: Josh Berkus (#96)
#104Bruce Momjian
bruce@momjian.us
In reply to: Ron Mayer (#102)
#105Bruce Momjian
bruce@momjian.us
In reply to: Joshua Brindle (#103)
#106Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#85)
#107Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stephen Frost (#106)
#108Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Tom Lane (#85)
#109Bruce Momjian
bruce@momjian.us
In reply to: Jaime Casanova (#100)
#110Rick Vernam
rickv@hobi.com
In reply to: Ron Mayer (#108)
#111Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#107)
#112Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ron Mayer (#108)
#113Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Tom Lane (#112)
#114Stephen Frost
sfrost@snowman.net
In reply to: Ron Mayer (#113)
#115Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua D. Drake (#111)
#116Joshua D. Drake
jd@commandprompt.com
In reply to: Stephen Frost (#114)
#117Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Tom Lane (#115)
#118Stephen Frost
sfrost@snowman.net
In reply to: Ron Mayer (#117)
#119Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#115)
#120Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#112)
#121Josh Berkus
josh@agliodbs.com
In reply to: Bruce Momjian (#109)
#122Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stephen Frost (#118)
#123KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#107)
#124KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Jaime Casanova (#83)
#125Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#122)
#126Bruce Momjian
bruce@momjian.us
In reply to: Joshua Brindle (#92)
#127KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#112)
#128Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Josh Berkus (#121)
#129Joshua D. Drake
jd@commandprompt.com
In reply to: KaiGai Kohei (#127)
#130Dann Corbit
DCorbit@connx.com
In reply to: Joshua D. Drake (#129)
#131KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Dann Corbit (#130)
#132Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua Brindle (#120)
#133Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#58)
#134Josh Berkus
josh@agliodbs.com
In reply to: Jaime Casanova (#128)
#135Josh Berkus
josh@agliodbs.com
In reply to: Bruce Momjian (#133)
#136Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#135)
#137Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#136)
#138Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#136)
#139Josh Berkus
josh@agliodbs.com
In reply to: Robert Haas (#138)
#140Robert Haas
robertmhaas@gmail.com
In reply to: Josh Berkus (#139)
#141Pavel Stehule
pavel.stehule@gmail.com
In reply to: Joshua D. Drake (#137)
#142Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#104)
#143Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Pavel Stehule (#141)
#144Pavel Stehule
pavel.stehule@gmail.com
In reply to: Jaime Casanova (#143)
#145Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Pavel Stehule (#144)
#146KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#132)
#147KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Bruce Momjian (#133)
#148Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#139)
#149Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#85)
#150Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#107)
#151Mark Kirkwood
mark.kirkwood@catalyst.net.nz
In reply to: Dave Page (#149)
#152Bernd Helmle
mailings@oopsware.de
In reply to: Josh Berkus (#134)
#153Rick Gigger
rick@alpinenetworking.com
In reply to: Mark Kirkwood (#151)
#154Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#136)
#155Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#13)
#156Peter Eisentraut
peter_e@gmx.net
In reply to: Jaime Casanova (#128)
#157Peter Eisentraut
peter_e@gmx.net
In reply to: Jaime Casanova (#100)
#158KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Simon Riggs (#150)
#159Peter Eisentraut
peter_e@gmx.net
In reply to: Ron Mayer (#102)
#160Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#142)
#161Dave Page
dpage@pgadmin.org
In reply to: Alvaro Herrera (#160)
#162Bernd Helmle
mailings@oopsware.de
In reply to: Peter Eisentraut (#156)
#163Magnus Hagander
magnus@hagander.net
In reply to: Dave Page (#161)
#164Marko Kreen
markokr@gmail.com
In reply to: Alvaro Herrera (#160)
#165Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#32)
#166Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Bruce Momjian (#133)
#167Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#107)
#168Dave Page
dpage@pgadmin.org
In reply to: Peter Eisentraut (#165)
#169Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Simon Riggs (#150)
#170Magnus Hagander
magnus@hagander.net
In reply to: Dave Page (#48)
#171Robert Haas
robertmhaas@gmail.com
In reply to: Magnus Hagander (#163)
#172Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Peter Eisentraut (#159)
#173Stephen Frost
sfrost@snowman.net
In reply to: Peter Eisentraut (#167)
#174Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Dave Page (#168)
#175Sam Mason
sam@samason.me.uk
In reply to: Ron Mayer (#169)
#176Robert Haas
robertmhaas@gmail.com
In reply to: Bernd Helmle (#162)
#177Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#132)
#178Andrew Dunstan
andrew@dunslane.net
In reply to: Robert Haas (#176)
#179Robert Haas
robertmhaas@gmail.com
In reply to: Andrew Dunstan (#178)
#180Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#155)
#181Joshua Brindle
method@manicmethod.com
In reply to: Stephen Frost (#154)
#182Brendan Jurd
direvus@gmail.com
In reply to: Robert Haas (#171)
#183Robert Haas
robertmhaas@gmail.com
In reply to: Brendan Jurd (#182)
#184Joshua D. Drake
jd@commandprompt.com
In reply to: Pavel Stehule (#141)
#185Andrew Dunstan
andrew@dunslane.net
In reply to: Robert Haas (#179)
#186Joshua D. Drake
jd@commandprompt.com
In reply to: Jaime Casanova (#143)
#187David Fetter
david@fetter.org
In reply to: Tom Lane (#85)
#188Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#168)
#189Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#188)
#190Joshua D. Drake
jd@commandprompt.com
In reply to: Dave Page (#168)
#191Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#149)
#192Dave Page
dpage@pgadmin.org
In reply to: Joshua D. Drake (#190)
#193Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#132)
#194Joshua D. Drake
jd@commandprompt.com
In reply to: Dave Page (#192)
#195Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#191)
#196Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#189)
#197Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#193)
#198Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#196)
#199Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#197)
#200Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Fetter (#187)
#201Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#196)
#202Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#200)
#203Peter Eisentraut
peter_e@gmx.net
In reply to: Dave Page (#189)
#204Dave Page
dpage@pgadmin.org
In reply to: Peter Eisentraut (#203)
#205Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Joshua D. Drake (#201)
#206Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#199)
#207Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#197)
#208Joshua D. Drake
jd@commandprompt.com
In reply to: Heikki Linnakangas (#205)
#209Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#200)
#210Bruce Momjian
bruce@momjian.us
In reply to: Joshua D. Drake (#201)
#211David Fetter
david@fetter.org
In reply to: Tom Lane (#200)
#212Tom Lane
tgl@sss.pgh.pa.us
In reply to: Brendan Jurd (#182)
#213Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#206)
#214Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#132)
#215Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#206)
#216Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#192)
#217Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#216)
#218Stephen Frost
sfrost@snowman.net
In reply to: Bruce Momjian (#213)
#219Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#206)
#220Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#217)
#221Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#219)
#222Andrew Sullivan
ajs@crankycanuck.ca
In reply to: Stephen Frost (#218)
#223Josh Berkus
josh@agliodbs.com
In reply to: Stephen Frost (#218)
#224Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#223)
#225Josh Berkus
josh@agliodbs.com
In reply to: Tom Lane (#212)
#226Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#225)
#227Joshua Brindle
method@manicmethod.com
In reply to: Josh Berkus (#223)
#228Jeff Davis
pgsql@j-davis.com
In reply to: Peter Eisentraut (#165)
#229Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#224)
#230Josh Berkus
josh@agliodbs.com
In reply to: Tom Lane (#226)
#231Josh Berkus
josh@agliodbs.com
In reply to: Joshua Brindle (#227)
#232Joshua Brindle
method@manicmethod.com
In reply to: Josh Berkus (#231)
#233Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#230)
#234Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#221)
#235Stephen Frost
sfrost@snowman.net
In reply to: Andrew Sullivan (#222)
#236Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua Brindle (#229)
#237Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#236)
#238Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Stephen Frost (#218)
#239Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#236)
#240Joshua Brindle
method@manicmethod.com
In reply to: Stephen Frost (#237)
#241Robert Haas
robertmhaas@gmail.com
In reply to: Jeff Davis (#228)
#242Simon Riggs
simon@2ndQuadrant.com
In reply to: Joshua Brindle (#232)
#243Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#226)
#244Joshua Brindle
method@manicmethod.com
In reply to: Ron Mayer (#238)
#245Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#236)
#246Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#234)
#247Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Tom Lane (#236)
#248Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#236)
#249Stephen Frost
sfrost@snowman.net
In reply to: Joshua Brindle (#240)
#250Joshua Brindle
method@manicmethod.com
In reply to: Stephen Frost (#249)
#251Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ron Mayer (#238)
#252Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#246)
#253Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#242)
#254Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#241)
#255Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#253)
#256Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#180)
#257Peter Eisentraut
peter_e@gmx.net
In reply to: Marko Kreen (#164)
#258Peter Eisentraut
peter_e@gmx.net
In reply to: Sam Mason (#175)
#259Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ron Mayer (#247)
#260Peter Eisentraut
peter_e@gmx.net
In reply to: Stephen Frost (#173)
#261Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#251)
#262Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#256)
#263Peter Eisentraut
peter_e@gmx.net
In reply to: Bruce Momjian (#213)
#264Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#263)
#265Stephen Frost
sfrost@snowman.net
In reply to: Peter Eisentraut (#260)
#266Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#264)
#267Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#260)
#268Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stephen Frost (#266)
#269Marko Kreen
markokr@gmail.com
In reply to: Peter Eisentraut (#257)
#270Jeff Davis
pgsql@j-davis.com
In reply to: Tom Lane (#254)
#271Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#267)
#272Joshua Brindle
method@manicmethod.com
In reply to: Tom Lane (#268)
#273Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#268)
#274Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#262)
#275Devrim GÜNDÜZ
devrim@gunduz.org
In reply to: Tom Lane (#251)
#276Joshua Brindle
method@manicmethod.com
In reply to: Devrim GÜNDÜZ (#275)
#277Stephen Frost
sfrost@snowman.net
In reply to: Devrim GÜNDÜZ (#275)
In reply to: Tom Lane (#115)
#279Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#264)
#280Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Joshua Brindle (#276)
#281Robert Treat
xzilla@users.sourceforge.net
In reply to: Dave Page (#87)
#282Magnus Hagander
magnus@hagander.net
In reply to: Marko Kreen (#269)
#283Robert Treat
xzilla@users.sourceforge.net
In reply to: Simon Riggs (#209)
#284Josh Berkus
josh@agliodbs.com
In reply to: Robert Treat (#283)
#285Chad Sellers
csellers@tresys.com
In reply to: Ron Mayer (#280)
#286Robert Treat
xzilla@users.sourceforge.net
In reply to: Joshua D. Drake (#184)
#287Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Treat (#281)
#288Greg Smith
gsmith@gregsmith.com
In reply to: Chad Sellers (#285)
#289Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Treat (#286)
#290Robert Treat
xzilla@users.sourceforge.net
In reply to: Tom Lane (#287)
#291KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Stephen Frost (#218)
#292Robert Treat
xzilla@users.sourceforge.net
In reply to: Tom Lane (#289)
#293KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Joshua Brindle (#261)
#294Chad Sellers
csellers@tresys.com
In reply to: Greg Smith (#288)
#295Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Treat (#292)
#296Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#295)
#297KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Andrew Sullivan (#222)
#298Ron Mayer
rm_pg@cheapcomplexdevices.com
In reply to: Tom Lane (#295)
#299KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#236)
#300Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ron Mayer (#298)
#301KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Joshua Brindle (#250)
#302Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#295)
#303Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Tom Lane (#236)
#304Greg Smith
gsmith@gregsmith.com
In reply to: KaiGai Kohei (#299)
#305KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Tom Lane (#246)
#306KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Jaime Casanova (#303)
#307KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Greg Smith (#304)
#308Robert Treat
xzilla@users.sourceforge.net
In reply to: Tom Lane (#295)
#309Peter Eisentraut
peter_e@gmx.net
In reply to: Magnus Hagander (#282)
#310Richard Huxton
dev@archonet.com
In reply to: Greg Smith (#304)
#311Peter Eisentraut
peter_e@gmx.net
In reply to: Greg Smith (#288)
#312KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Richard Huxton (#310)
#313Magnus Hagander
magnus@hagander.net
In reply to: Peter Eisentraut (#309)
#314Cédric Villemain
cedric.villemain@dalibo.com
In reply to: Magnus Hagander (#313)
#315Jonah H. Harris
jonah.harris@gmail.com
In reply to: Peter Eisentraut (#311)
#316Magnus Hagander
magnus@hagander.net
In reply to: Robert Treat (#290)
#317Magnus Hagander
magnus@hagander.net
In reply to: Josh Berkus (#284)
#318Magnus Hagander
magnus@hagander.net
In reply to: Robert Haas (#302)
#319Bruce Momjian
bruce@momjian.us
In reply to: Magnus Hagander (#317)
#320Andrew Sullivan
ajs@crankycanuck.ca
In reply to: KaiGai Kohei (#297)
#321Simon Riggs
simon@2ndQuadrant.com
In reply to: Magnus Hagander (#316)
#322Robert Treat
xzilla@users.sourceforge.net
In reply to: Magnus Hagander (#316)
#323Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Treat (#322)
#324Dimitri Fontaine
dimitri@2ndQuadrant.fr
In reply to: Simon Riggs (#321)
#325Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dimitri Fontaine (#324)
#326Bruce Momjian
bruce@momjian.us
In reply to: Zdenek Kotala (#166)
#327Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#326)
#328Robert Treat
xzilla@users.sourceforge.net
In reply to: Tom Lane (#323)
#329Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#246)
#330Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#248)
#331Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#252)
#332Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#329)
#333Bruce Momjian
bruce@momjian.us
In reply to: Peter Eisentraut (#260)
#334Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#279)
#335Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#325)
#336Bruce Momjian
bruce@momjian.us
In reply to: Robert Treat (#292)
#337Bruce Momjian
bruce@momjian.us
In reply to: Robert Treat (#308)
#338Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#319)
#339Robert Treat
xzilla@users.sourceforge.net
In reply to: Bruce Momjian (#336)
#340Andrew Dunstan
andrew@dunslane.net
In reply to: Robert Treat (#339)
#341Bruce Momjian
bruce@momjian.us
In reply to: Peter Eisentraut (#309)
#342Robert Haas
robertmhaas@gmail.com
In reply to: Robert Treat (#339)
#343The Hermit Hacker
scrappy@hub.org
In reply to: Bruce Momjian (#341)
#344Bruce Momjian
bruce@momjian.us
In reply to: The Hermit Hacker (#343)
#345Bruce Momjian
bruce@momjian.us
In reply to: KaiGai Kohei (#147)
#346Robert Treat
xzilla@users.sourceforge.net
In reply to: Robert Haas (#342)
#347Magnus Hagander
magnus@hagander.net
In reply to: Bruce Momjian (#341)
#348Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Magnus Hagander (#347)
#349Magnus Hagander
magnus@hagander.net
In reply to: Stefan Kaltenbrunner (#348)
#350Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Magnus Hagander (#349)
#351Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#344)
#352Robert Haas
robertmhaas@gmail.com
In reply to: Robert Treat (#346)
#353Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#352)
#354Peter Eisentraut
peter_e@gmx.net
In reply to: Stefan Kaltenbrunner (#350)
#355Robert Treat
xzilla@users.sourceforge.net
In reply to: Bruce Momjian (#353)
#356Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#353)
#357Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Peter Eisentraut (#354)
#358Bruce Momjian
bruce@momjian.us
In reply to: Stefan Kaltenbrunner (#357)
#359Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Bruce Momjian (#358)
#360Josh Berkus
josh@agliodbs.com
In reply to: Bruce Momjian (#344)
#361Joshua D. Drake
jd@commandprompt.com
In reply to: Josh Berkus (#360)
#362Josh Berkus
josh@agliodbs.com
In reply to: Joshua D. Drake (#361)
#363Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#362)
#364Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Stefan Kaltenbrunner (#357)
#365Robert Treat
xzilla@users.sourceforge.net
In reply to: Robert Haas (#356)
#366Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Peter Eisentraut (#354)
#367Bruce Momjian
bruce@momjian.us
In reply to: Robert Treat (#365)
#368Fujii Masao
masao.fujii@gmail.com
In reply to: Bruce Momjian (#367)
#369Koichi Suzuki
koichi.szk@gmail.com
In reply to: Fujii Masao (#368)
#370Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#196)
#371Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#370)
#372KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Joshua D. Drake (#371)
#373Joshua D. Drake
jd@commandprompt.com
In reply to: KaiGai Kohei (#372)
#374KaiGai Kohei
kaigai@ak.jp.nec.com
In reply to: Joshua D. Drake (#373)
#375Joshua D. Drake
jd@commandprompt.com
In reply to: KaiGai Kohei (#374)
#376Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Robert Haas (#370)
#377Josh Berkus
josh@agliodbs.com
In reply to: Heikki Linnakangas (#376)
#378Joshua D. Drake
jd@commandprompt.com
In reply to: Josh Berkus (#377)
#379Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Josh Berkus (#377)
#380Dave Page
dpage@pgadmin.org
In reply to: Joshua D. Drake (#378)
#381Robert Haas
robertmhaas@gmail.com
In reply to: Dave Page (#380)
#382Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#381)