Custom compression methods

Started by Ildus Kurbangalievover 8 years ago458 messageshackers
Jump to latest
#1Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru

Hello hackers!

I've attached a patch that implements custom compression
methods. This patch is based on Nikita Glukhov's code (which he hasn't
publish in mailing lists) for jsonb compression. This is early but
working version of the patch, and there are still few fixes and features
that should be implemented (like pg_dump support and support of
compression options for types), and it requires more testing. But I'd
like to get some feedback at the current stage first.

There's been a proposal [1]/messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com -- --- Ildus Kurbangaliev Postgres Professional: http://www.postgrespro.com Russian Postgres Company of Alexander Korotkov and some discussion
about custom compression methods before. This is an implementation of
per-datum compression. Syntax is similar to the one in proposal but not
the same.

Syntax:

CREATE COMPRESSION METHOD <cmname> HANDLER <compression_handler>;
DROP COMPRESSION METHOD <cmname>;

Compression handler is a function that returns a structure containing
compression routines:

- configure - function called when the compression method applied to
an attribute
- drop - called when the compression method is removed from an attribute
- compress - compress function
- decompress - decompress function

User can create compressed columns with the commands below:

CREATE TABLE t(a tsvector COMPRESSED <cmname> WITH <options>);
ALTER TABLE t ALTER COLUMN a SET COMPRESSED <cmname> WITH <options>;
ALTER TABLE t ALTER COLUMN a SET NOT COMPRESSED;

Also there is syntax of binding compression methods to types:

ALTER TYPE <type> SET COMPRESSED <cmname>;
ALTER TYPE <type> SET NOT COMPRESSED;

There are two new tables in the catalog, pg_compression and
pg_compression_opt. pg_compression is used as storage of compression
methods, and pg_compression_opt is used to store specific compression
options for particular column.

When user binds a compression method to some column a new record in
pg_compression_opt is created and all further attribute values will
contain compression options Oid while old values will remain unchanged.
And when we alter a compression method for
the attribute it won't change previous record in pg_compression_opt.
Instead it'll create a new one and new values will be stored
with new Oid. That way there is no need of recompression of the old
tuples. And also tuples containing compressed datums can be copied to
other tables so records in pg_compression_opt shouldn't be removed. In
the current patch they can be removed with DROP COMPRESSION METHOD
CASCADE, but after that decompression won't be possible on compressed
tuples. Maybe CASCADE should keep compression options.

I haven't changed the base logic of working with compressed datums. It
means that custom compressed datums behave exactly the same as current
LZ compressed datums, and the logic differs only in toast_compress_datum
and toast_decompress_datum.

This patch doesn't break backward compability and should work seamlessly
with older version of database. I used one of two free bits in
`va_rawsize` from `varattrib_4b->va_compressed` as flag of custom
compressed datums. Also I renamed it to `va_info` since it contains not
only rawsize now.

The patch also includes custom compression method for tsvector which is
used in tests.

[1]: /messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com -- --- Ildus Kurbangaliev Postgres Professional: http://www.postgrespro.com Russian Postgres Company
/messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com
--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

Attachments:

custom_compression_methods_v1.patchtext/x-patchDownload+2810-589
#2Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#1)
Re: Custom compression methods

On Thu, 7 Sep 2017 19:42:36 +0300
Ildus Kurbangaliev <i.kurbangaliev@postgrespro.ru> wrote:

Hello hackers!

I've attached a patch that implements custom compression
methods. This patch is based on Nikita Glukhov's code (which he hasn't
publish in mailing lists) for jsonb compression. This is early but
working version of the patch, and there are still few fixes and
features that should be implemented (like pg_dump support and support
of compression options for types), and it requires more testing. But
I'd like to get some feedback at the current stage first.

There's been a proposal [1] of Alexander Korotkov and some discussion
about custom compression methods before. This is an implementation of
per-datum compression. Syntax is similar to the one in proposal but
not the same.

Syntax:

CREATE COMPRESSION METHOD <cmname> HANDLER <compression_handler>;
DROP COMPRESSION METHOD <cmname>;

Compression handler is a function that returns a structure containing
compression routines:

- configure - function called when the compression method applied to
an attribute
- drop - called when the compression method is removed from an
attribute
- compress - compress function
- decompress - decompress function

User can create compressed columns with the commands below:

CREATE TABLE t(a tsvector COMPRESSED <cmname> WITH <options>);
ALTER TABLE t ALTER COLUMN a SET COMPRESSED <cmname> WITH <options>;
ALTER TABLE t ALTER COLUMN a SET NOT COMPRESSED;

Also there is syntax of binding compression methods to types:

ALTER TYPE <type> SET COMPRESSED <cmname>;
ALTER TYPE <type> SET NOT COMPRESSED;

There are two new tables in the catalog, pg_compression and
pg_compression_opt. pg_compression is used as storage of compression
methods, and pg_compression_opt is used to store specific compression
options for particular column.

When user binds a compression method to some column a new record in
pg_compression_opt is created and all further attribute values will
contain compression options Oid while old values will remain
unchanged. And when we alter a compression method for
the attribute it won't change previous record in pg_compression_opt.
Instead it'll create a new one and new values will be stored
with new Oid. That way there is no need of recompression of the old
tuples. And also tuples containing compressed datums can be copied to
other tables so records in pg_compression_opt shouldn't be removed. In
the current patch they can be removed with DROP COMPRESSION METHOD
CASCADE, but after that decompression won't be possible on compressed
tuples. Maybe CASCADE should keep compression options.

I haven't changed the base logic of working with compressed datums. It
means that custom compressed datums behave exactly the same as current
LZ compressed datums, and the logic differs only in
toast_compress_datum and toast_decompress_datum.

This patch doesn't break backward compability and should work
seamlessly with older version of database. I used one of two free
bits in `va_rawsize` from `varattrib_4b->va_compressed` as flag of
custom compressed datums. Also I renamed it to `va_info` since it
contains not only rawsize now.

The patch also includes custom compression method for tsvector which
is used in tests.

[1]
/messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com

Attached rebased version of the patch. Added support of pg_dump, the
code was simplified, and a separate cache for compression options was
added.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

Attachments:

custom_compression_methods_v2.patchtext/x-patchDownload+3111-640
#3Peter Eisentraut
peter_e@gmx.net
In reply to: Ildus Kurbangaliev (#2)
Re: Custom compression methods

On 9/12/17 10:55, Ildus Kurbangaliev wrote:

The patch also includes custom compression method for tsvector which
is used in tests.

[1]
/messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com

Attached rebased version of the patch. Added support of pg_dump, the
code was simplified, and a separate cache for compression options was
added.

I would like to see some more examples of how this would be used, so we
can see how it should all fit together.

So far, it's not clear to me that we need a compression method as a
standalone top-level object. It would make sense, perhaps, to have a
compression function attached to a type, so a type can provide a
compression function that is suitable for its specific storage.

The proposal here is very general: You can use any of the eligible
compression methods for any attribute. That seems very complicated to
manage. Any attribute could be compressed using either a choice of
general compression methods or a type-specific compression method, or
perhaps another type-specific compression method. That's a lot. Is
this about packing certain types better, or trying out different
compression algorithms, or about changing the TOAST thresholds, and so on?

Ideally, we would like something that just works, with minimal
configuration and nudging. Let's see a list of problems to be solved
and then we can discuss what the right set of primitives might be to
address them.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Peter Eisentraut (#3)
Re: Custom compression methods

On Wed, 1 Nov 2017 17:05:58 -0400
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> wrote:

On 9/12/17 10:55, Ildus Kurbangaliev wrote:

The patch also includes custom compression method for tsvector
which is used in tests.

[1]
/messages/by-id/CAPpHfdsdTA5uZeq6MNXL5ZRuNx+Sig4ykWzWEAfkC6ZKMDy6=Q@mail.gmail.com

Attached rebased version of the patch. Added support of pg_dump, the
code was simplified, and a separate cache for compression options
was added.

I would like to see some more examples of how this would be used, so
we can see how it should all fit together.

So far, it's not clear to me that we need a compression method as a
standalone top-level object. It would make sense, perhaps, to have a
compression function attached to a type, so a type can provide a
compression function that is suitable for its specific storage.

In this patch compression methods is suitable for MAIN and EXTENDED
storages like in current implementation in postgres. Just instead only
of LZ4 you can specify any other compression method.

Idea is not to change compression for some types, but give the user and
extension developers opportunity to change how data in some attribute
will be compressed because they know about it more than database itself.

The proposal here is very general: You can use any of the eligible
compression methods for any attribute. That seems very complicated to
manage. Any attribute could be compressed using either a choice of
general compression methods or a type-specific compression method, or
perhaps another type-specific compression method. That's a lot. Is
this about packing certain types better, or trying out different
compression algorithms, or about changing the TOAST thresholds, and
so on?

It is about extensibility of postgres, for example if you
need to store a lot of time series data you can create an extension that
stores array of timestamps in more optimized way, using delta encoding
or something else. I'm not sure that such specialized things should be
in core.

In case of array of timestamps in could look like this:

CREATE EXTENSION timeseries; -- some extension that provides compression
method

Extension installs a compression method:

CREATE OR REPLACE FUNCTION timestamps_compression_handler(INTERNAL)
RETURNS COMPRESSION_HANDLER AS 'MODULE_PATHNAME',
'timestamps_compression_handler' LANGUAGE C STRICT;

CREATE COMPRESSION METHOD cm1 HANDLER timestamps_compression_handler;

And user can specify it in his table:

CREATE TABLE t1 (
time_series_data timestamp[] COMPRESSED cm1;
)

I think generalization of some method to a type is not a good idea. For
some attribute you could be happy with builtin LZ4, for other you can
need more compressibility and so on.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#2)
Re: Custom compression methods

On Tue, 12 Sep 2017 17:55:05 +0300
Ildus Kurbangaliev <i.kurbangaliev@postgrespro.ru> wrote:

Attached rebased version of the patch. Added support of pg_dump, the
code was simplified, and a separate cache for compression options was
added.

Attached version 3 of the patch. Rebased to the current master, removed
ALTER TYPE .. SET COMPRESSED syntax, fixed bug in compression options
cache.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

Attachments:

custom_compression_methods_v3.patchtext/x-patchDownload+2688-469
#6Craig Ringer
craig@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#4)
Re: Custom compression methods

On 2 November 2017 at 17:41, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

In this patch compression methods is suitable for MAIN and EXTENDED
storages like in current implementation in postgres. Just instead only
of LZ4 you can specify any other compression method.

We've had this discussion before.

Please read the "pluggable compression support" thread. See you in a
few days ;) sorry, it's kinda long.

/messages/by-id/20130621000900.GA12425@alap2.anarazel.de

IIRC there were some concerns about what happened with pg_upgrade,
with consuming precious toast bits, and a few other things.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Oleg Bartunov
oleg@sai.msu.su
In reply to: Craig Ringer (#6)
Re: Custom compression methods

On Thu, Nov 2, 2017 at 6:02 PM, Craig Ringer <craig@2ndquadrant.com> wrote:

On 2 November 2017 at 17:41, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

In this patch compression methods is suitable for MAIN and EXTENDED
storages like in current implementation in postgres. Just instead only
of LZ4 you can specify any other compression method.

We've had this discussion before.

Please read the "pluggable compression support" thread. See you in a
few days ;) sorry, it's kinda long.

/messages/by-id/20130621000900.GA12425@alap2.anarazel.de

the proposed patch provides "pluggable" compression and let's user
decide by their own which algorithm to use.
The postgres core doesn't responsible for any patent problem.

IIRC there were some concerns about what happened with pg_upgrade,
with consuming precious toast bits, and a few other things.

yes, pg_upgrade may be a problem.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Robert Haas
robertmhaas@gmail.com
In reply to: Oleg Bartunov (#7)
Re: Custom compression methods

On Sun, Nov 5, 2017 at 2:22 PM, Oleg Bartunov <obartunov@gmail.com> wrote:

IIRC there were some concerns about what happened with pg_upgrade,
with consuming precious toast bits, and a few other things.

yes, pg_upgrade may be a problem.

A basic problem here is that, as proposed, DROP COMPRESSION METHOD may
break your database irretrievably. If there's no data compressed
using the compression method you dropped, everything is cool -
otherwise everything is broken and there's no way to recover. The
only obvious alternative is to disallow DROP altogether (or make it
not really DROP).

Both of those alternatives sound fairly unpleasant to me, but I'm not
exactly sure what to recommend in terms of how to make it better.
Ideally anything we expose as an SQL command should have a DROP
command that undoes whatever CREATE did and leaves the database in an
intact state, but that seems hard to achieve in this case.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Adam Brusselback
adambrusselback@gmail.com
In reply to: Robert Haas (#8)
Re: Custom compression methods

If there's no data compressed
using the compression method you dropped, everything is cool -
otherwise everything is broken and there's no way to recover.
The only obvious alternative is to disallow DROP altogether (or make it
not really DROP).

Wouldn't whatever was using the compression method have something
marking which method was used? If so, couldn't we just scan if there is
any data using it, and if so disallow the drop, or possibly an option to allow
the drop and rewrite the table either uncompressed, or with the default
compression method?

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#8)
Re: Custom compression methods

Robert Haas <robertmhaas@gmail.com> writes:

A basic problem here is that, as proposed, DROP COMPRESSION METHOD may
break your database irretrievably. If there's no data compressed
using the compression method you dropped, everything is cool -
otherwise everything is broken and there's no way to recover. The
only obvious alternative is to disallow DROP altogether (or make it
not really DROP).

Both of those alternatives sound fairly unpleasant to me, but I'm not
exactly sure what to recommend in terms of how to make it better.
Ideally anything we expose as an SQL command should have a DROP
command that undoes whatever CREATE did and leaves the database in an
intact state, but that seems hard to achieve in this case.

If the use of a compression method is tied to specific data types and/or
columns, then each of those could have a dependency on the compression
method, forcing a type or column drop if you did DROP COMPRESSION METHOD.
That would leave no reachable data using the removed compression method.
So that part doesn't seem unworkable on its face.

IIRC, the bigger concerns in the last discussion had to do with
replication, ie, can downstream servers make sense of the data.
Maybe that's not any worse than the issues you get with non-core
index AMs, but I'm not sure.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Craig Ringer (#6)
Re: Custom compression methods

On Thu, 2 Nov 2017 23:02:34 +0800
Craig Ringer <craig@2ndquadrant.com> wrote:

On 2 November 2017 at 17:41, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

In this patch compression methods is suitable for MAIN and EXTENDED
storages like in current implementation in postgres. Just instead
only of LZ4 you can specify any other compression method.

We've had this discussion before.

Please read the "pluggable compression support" thread. See you in a
few days ;) sorry, it's kinda long.

/messages/by-id/20130621000900.GA12425@alap2.anarazel.de

IIRC there were some concerns about what happened with pg_upgrade,
with consuming precious toast bits, and a few other things.

Thank you for the link, I didn't see that thread when I looked over
mailing lists. I read it briefly, and I can address few things
relating to my patch.

Most concerns have been related with legal issues.
Actually that was the reason I did not include any new compression
algorithms to my patch. Unlike that patch mine only provides syntax
and is just a way to give the users use their own compression algorithms
and deal with any legal issues themselves.

I use only one unused bit in header (there's still one free ;), that's
enough to determine that data is compressed or not.

I did found out that pg_upgrade doesn't work properly with my patch,
soon I will send fix for it.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#5)
Re: [HACKERS] Custom compression methods

On Thu, 2 Nov 2017 15:28:36 +0300
Ildus Kurbangaliev <i.kurbangaliev@postgrespro.ru> wrote:

On Tue, 12 Sep 2017 17:55:05 +0300
Ildus Kurbangaliev <i.kurbangaliev@postgrespro.ru> wrote:

Attached rebased version of the patch. Added support of pg_dump, the
code was simplified, and a separate cache for compression options
was added.

Attached version 3 of the patch. Rebased to the current master,
removed ALTER TYPE .. SET COMPRESSED syntax, fixed bug in compression
options cache.

Attached version 4 of the patch. Fixed pg_upgrade and few other bugs.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

Attachments:

custom_compression_methods_v4.patchtext/x-patchDownload+2771-429
#13Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Robert Haas (#8)
Re: [HACKERS] Custom compression methods

On Sun, 5 Nov 2017 17:34:23 -0500
Robert Haas <robertmhaas@gmail.com> wrote:

On Sun, Nov 5, 2017 at 2:22 PM, Oleg Bartunov <obartunov@gmail.com>
wrote:

IIRC there were some concerns about what happened with pg_upgrade,
with consuming precious toast bits, and a few other things.

yes, pg_upgrade may be a problem.

A basic problem here is that, as proposed, DROP COMPRESSION METHOD may
break your database irretrievably. If there's no data compressed
using the compression method you dropped, everything is cool -
otherwise everything is broken and there's no way to recover. The
only obvious alternative is to disallow DROP altogether (or make it
not really DROP).

In the patch I use separate table for compresssion options (because
each attribute can have additional options for compression). So basicly
compressed attribute linked to compression options, not the compression
method and this method can be safely dropped.

So in the next version of the patch I can just unlink the options from
compression methods and dropping compression method will not affect
already compressed tuples. They still could be decompressed.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

#14Robert Haas
robertmhaas@gmail.com
In reply to: Ildus Kurbangaliev (#13)
Re: [HACKERS] Custom compression methods

On Wed, Nov 15, 2017 at 4:09 AM, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

So in the next version of the patch I can just unlink the options from
compression methods and dropping compression method will not affect
already compressed tuples. They still could be decompressed.

I guess I don't understand how that can work. I mean, if somebody
removes a compression method - i.e. uninstalls the library - and you
don't have a way to make sure there are no tuples that can only be
uncompressed by that library - then you've broken the database.
Ideally, there should be a way to add a new compression method via an
extension ... and then get rid of it and all dependencies thereupon.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#15Ildar Musin
i.musin@postgrespro.ru
In reply to: Ildus Kurbangaliev (#12)
Re: [HACKERS] Custom compression methods

Hi Ildus,

On 14.11.2017 16:23, Ildus Kurbangaliev wrote:

On Thu, 2 Nov 2017 15:28:36 +0300 Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

On Tue, 12 Sep 2017 17:55:05 +0300 Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

Attached rebased version of the patch. Added support of pg_dump,
the code was simplified, and a separate cache for compression
options was added.

Attached version 3 of the patch. Rebased to the current master,
removed ALTER TYPE .. SET COMPRESSED syntax, fixed bug in
compression options cache.

Attached version 4 of the patch. Fixed pg_upgrade and few other
bugs.

I've started to review your code. And even though it's fine overall I
have few questions and comments (aside from DROP COMPRESSION METHOD
discussion).

1. I'm not sure about proposed syntax for ALTER TABLE command:

ALTER TABLE t ALTER COLUMN a SET COMPRESSED <cmname> WITH
(<options>); ALTER TABLE t ALTER COLUMN a SET NOT COMPRESSED;

ISTM it is more common for Postgres to use syntax like SET/DROP for
column options (SET/DROP NOT NULL, DEFAULT etc). My suggestion would be:

ALTER TABLE t ALTER COLUMN a SET COMPRESSED USING <compression_method>
WITH (<options>);
ALTER TABLE t ALTER COLUMN a DROP COMPRESSED;

(keyword USING here is similar to "CREATE INDEX ... USING <method>" syntax)

2. The way you changed DefineRelation() implies that caller is
responsible for creation of compression options. Probably it would be
better to create them within DefineRelation().

3. Few minor issues which seem like obsolete code:

Function freeRelOptions() is defined but never used.

Function getBaseTypeTuple() has been extracted from
getBaseTypeAndTypmod() but never used separately.

In toast_flatten_tuple_to_datum() there is untoasted_value variable
which is only used for meaningless assignment.

(Should I send a patch for that kind of issues?)

--
Ildar Musin
i.musin@postgrespro.ru

#16Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#12)
Re: [HACKERS] Custom compression methods

Hi,

On 11/14/2017 02:23 PM, Ildus Kurbangaliev wrote:

...

Attached version 4 of the patch. Fixed pg_upgrade and few other bugs.

I did a review of this today, and I think there are some things that
need improvement / fixing.

Firstly, some basic comments from just eye-balling the diff, then some
bugs I discovered after writing an extension adding lz4.

1) formatRelOptions/freeRelOptions are no longer needed (I see Ildar
already pointer that out)

2) There's unnecessary whitespace (extra newlines) on a couple of
places, which is needlessly increasing the size of the patch. Small
difference, but annoying.

3) tuptoaster.c

Why do you change 'info' from int32 to uint32? Seems unnecessary.

Adding new 'att' variable in toast_insert_or_update is confusing, as
there already is 'att' in the very next loop. Technically it's correct,
but I'd bet it'll lead to some WTF?! moments later. I propose to just
use TupleDescAttr(tupleDesc,i) on the two places where it matters,
around line 808.

There are no comments for init_compression_options_htab and
get_compression_options_info, so that needs to be fixed. Moreover, the
names are confusing because what we really get is not just 'options' but
the compression routines too.

4) gen_db_file_maps probably shouldn't do the fprints, right?

5) not sure why you modify src/tools/pgindent/exclude_file_patterns

6) I'm rather confused by AttributeCompression vs. ColumnCompression. I
mean, attribute==column, right? Of course, one is for data from parser,
the other one is for internal info. But can we make the naming clearer?

7) The docs in general are somewhat unsatisfactory, TBH. For example the
ColumnCompression has no comments, unlike everything else in parsenodes.
Similarly for the SGML docs - I suggest to expand them to resemble FDW
docs (https://www.postgresql.org/docs/10/static/fdwhandler.html) which
also follows the handler/routines pattern.

8) One of the unclear things if why we even need 'drop' routing. It
seems that if it's defined DropAttributeCompression does something. But
what should it do? I suppose dropping the options should be done using
dependencies (just like we drop columns in this case).

BTW why does DropAttributeCompression mess with att->attisdropped in
this way? That seems a bit odd.

9) configure routines that only check if (options != NIL) and then error
out (like tsvector_configure) seem a bit unnecessary. Just allow it to
be NULL in CompressionMethodRoutine, and throw an error if options is
not NIL for such compression method.

10) toast_compress_datum still does this:

if (!ac && (valsize < PGLZ_strategy_default->min_input_size ||
valsize > PGLZ_strategy_default->max_input_size))

which seems rather pglz-specific (the naming is a hint). Why shouldn't
this be specific to compression, exposed either as min/max constants, or
wrapped in another routine - size_is_valid() or something like that?

11) The comments in toast_compress_datum probably need updating, as it
still references to pglz specifically. I guess the new compression
methods do matter too.

12) get_compression_options_info organizes the compression info into a
hash table by OID. The hash table implementation assumes the hash key is
at the beginning of the entry, but AttributeCompression is defined like
this:

typedef struct
{
CompressionMethodRoutine *routine;
List *options;
Oid cmoptoid;
} AttributeCompression;

Which means get_compression_options_info is busted, will never lookup
anything, and the hash table will grow by adding more and more entries
into the same bucket. Of course, this has extremely negative impact on
performance (pretty much arbitrarily bad, depending on how many entries
you've already added to the hash table).

Moving the OID to the beginning of the struct fixes the issue.

13) When writing the experimental extension, I was extremely confused
about the regular varlena headers, custom compression headers, etc. In
the end I stole the code from tsvector.c and whacked it a bit until it
worked, but I wouldn't dare to claim I understand how it works.

This needs to be documented somewhere. For example postgres.h has a
bunch of paragraphs about varlena headers, so perhaps it should be
there? I see the patch tweaks some of the constants, but does not update
the comment at all.

Perhaps it would be useful to provide some additional macros making
access to custom-compressed varlena values easier. Or perhaps the
VARSIZE_ANY / VARSIZE_ANY_EXHDR / VARDATA_ANY already support that? This
part is not very clear to me.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

pg_lz4.tgzapplication/x-compressed-tar; name=pg_lz4.tgzDownload
#17Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#14)
Re: [HACKERS] Custom compression methods

On 11/15/2017 02:13 PM, Robert Haas wrote:

On Wed, Nov 15, 2017 at 4:09 AM, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

So in the next version of the patch I can just unlink the options from
compression methods and dropping compression method will not affect
already compressed tuples. They still could be decompressed.

I guess I don't understand how that can work. I mean, if somebody
removes a compression method - i.e. uninstalls the library - and you
don't have a way to make sure there are no tuples that can only be
uncompressed by that library - then you've broken the database.
Ideally, there should be a way to add a new compression method via an
extension ... and then get rid of it and all dependencies thereupon.

I share your confusion. Once you do DROP COMPRESSION METHOD, there must
be no remaining data compressed with it. But that's what the patch is
doing already - it enforces this using dependencies, as usual.

Ildus, can you explain what you meant? How could the data still be
decompressed after DROP COMPRESSION METHOD, and possibly after removing
the .so library?

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#18Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#17)
Re: [HACKERS] Custom compression methods

On Mon, 20 Nov 2017 00:23:23 +0100
Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote:

On 11/15/2017 02:13 PM, Robert Haas wrote:

On Wed, Nov 15, 2017 at 4:09 AM, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

So in the next version of the patch I can just unlink the options
from compression methods and dropping compression method will not
affect already compressed tuples. They still could be
decompressed.

I guess I don't understand how that can work. I mean, if somebody
removes a compression method - i.e. uninstalls the library - and you
don't have a way to make sure there are no tuples that can only be
uncompressed by that library - then you've broken the database.
Ideally, there should be a way to add a new compression method via
an extension ... and then get rid of it and all dependencies
thereupon.

I share your confusion. Once you do DROP COMPRESSION METHOD, there
must be no remaining data compressed with it. But that's what the
patch is doing already - it enforces this using dependencies, as
usual.

Ildus, can you explain what you meant? How could the data still be
decompressed after DROP COMPRESSION METHOD, and possibly after
removing the .so library?

The removal of the .so library will broke all compressed tuples. I
don't see a way to avoid it. I meant that DROP COMPRESSION METHOD could
remove the record from 'pg_compression' table, but actually the
compressed tuple needs only a record from 'pg_compression_opt' where
its options are located. And there is dependency between an extension
and the options so you can't just remove the extension without CASCADE,
postgres will complain.

Still it's a problem if the user used for example `SELECT
<compressed_column> INTO * FROM *` because postgres will copy compressed
tuples, and there will not be any dependencies between destination and
the options.

Also thank you for review. I will look into it today.

--
---
Ildus Kurbangaliev
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

#19Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#18)
Re: [HACKERS] Custom compression methods

On 11/20/2017 10:44 AM, Ildus Kurbangaliev wrote:

On Mon, 20 Nov 2017 00:23:23 +0100
Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote:

On 11/15/2017 02:13 PM, Robert Haas wrote:

On Wed, Nov 15, 2017 at 4:09 AM, Ildus Kurbangaliev
<i.kurbangaliev@postgrespro.ru> wrote:

So in the next version of the patch I can just unlink the options
from compression methods and dropping compression method will not
affect already compressed tuples. They still could be
decompressed.

I guess I don't understand how that can work. I mean, if somebody
removes a compression method - i.e. uninstalls the library - and you
don't have a way to make sure there are no tuples that can only be
uncompressed by that library - then you've broken the database.
Ideally, there should be a way to add a new compression method via
an extension ... and then get rid of it and all dependencies
thereupon.

I share your confusion. Once you do DROP COMPRESSION METHOD, there
must be no remaining data compressed with it. But that's what the
patch is doing already - it enforces this using dependencies, as
usual.

Ildus, can you explain what you meant? How could the data still be
decompressed after DROP COMPRESSION METHOD, and possibly after
removing the .so library?

The removal of the .so library will broke all compressed tuples. I
don't see a way to avoid it. I meant that DROP COMPRESSION METHOD could
remove the record from 'pg_compression' table, but actually the
compressed tuple needs only a record from 'pg_compression_opt' where
its options are located. And there is dependency between an extension
and the options so you can't just remove the extension without CASCADE,
postgres will complain.

I don't think we need to do anything smart here - it should behave just
like dropping a data type, for example. That is, error out if there are
columns using the compression method (without CASCADE), and drop all the
columns (with CASCADE).

Leaving around the pg_compression_opt is not a solution. Not only it's
confusing and I'm not aware about any extension because the user is
likely to remove the .so file (perhaps not directly, but e.g. by
removing the rpm package providing it).

Still it's a problem if the user used for example `SELECT
<compressed_column> INTO * FROM *` because postgres will copy compressed
tuples, and there will not be any dependencies between destination and
the options.

This seems like a rather fatal design flaw, though. I'd say we need to
force recompression of the data, in such cases. Otherwise all the
dependency tracking is rather pointless.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#20Evgeniy Shishkin
itparanoia@gmail.com
In reply to: Tomas Vondra (#19)
Re: [HACKERS] Custom compression methods

On Nov 20, 2017, at 18:18, Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote:

I don't think we need to do anything smart here - it should behave just
like dropping a data type, for example. That is, error out if there are
columns using the compression method (without CASCADE), and drop all the
columns (with CASCADE).

What about instead of dropping column we leave data uncompressed?

#21Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Evgeniy Shishkin (#20)
#22Evgeniy Shishkin
itparanoia@gmail.com
In reply to: Tomas Vondra (#21)
#23Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#21)
#24Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Evgeniy Shishkin (#22)
#25Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#16)
#26Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#25)
#27Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#26)
#28Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#27)
#29Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#26)
#30Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#29)
#31Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#30)
#32Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#31)
#33Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#32)
#34Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#33)
#35Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#34)
#36Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#35)
#37Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#36)
#38Michael Paquier
michael@paquier.xyz
In reply to: Tomas Vondra (#37)
#39Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#37)
#40Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#39)
#41Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#40)
#42Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#41)
#43Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#40)
#44Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#43)
#45Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#44)
#46Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#42)
#47Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#23)
#48Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#47)
#49Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#45)
#50Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#46)
#51Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#49)
#52Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#46)
#53Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#51)
#54Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#48)
#55Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Alvaro Herrera (#46)
#56Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#53)
#57Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Tomas Vondra (#56)
#58Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#56)
#59Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Konstantin Knizhnik (#57)
#60Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#58)
#61Oleg Bartunov
oleg@sai.msu.su
In reply to: Tomas Vondra (#56)
#62Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#48)
#63Robert Haas
robertmhaas@gmail.com
In reply to: Ildus Kurbangaliev (#62)
#64Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Robert Haas (#63)
#65Robert Haas
robertmhaas@gmail.com
In reply to: Ildus Kurbangaliev (#64)
#66Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#65)
#67Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#66)
#68Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#67)
#69Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#1)
#70Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Tomas Vondra (#69)
#71Alexander Korotkov
aekorotkov@gmail.com
In reply to: Ildus Kurbangaliev (#70)
#72Oleg Bartunov
oleg@sai.msu.su
In reply to: Alexander Korotkov (#71)
#73Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#68)
#74Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#69)
#75Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#74)
#76Chapman Flack
chap@anastigmatix.net
In reply to: Robert Haas (#74)
#77Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#75)
#78Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#77)
#79Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Robert Haas (#73)
#80Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#78)
#81Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#80)
#82Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#78)
#83Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#81)
#84Robert Haas
robertmhaas@gmail.com
In reply to: Ildus Kurbangaliev (#79)
#85Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#82)
#86Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#85)
#87Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Robert Haas (#84)
#88Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#86)
#89Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#88)
#90Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#87)
#91Ildar Musin
i.musin@postgrespro.ru
In reply to: Ildus Kurbangaliev (#90)
#92Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildar Musin (#91)
#93Ildar Musin
i.musin@postgrespro.ru
In reply to: Ildus Kurbangaliev (#92)
#94Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildar Musin (#93)
#95Ildar Musin
i.musin@postgrespro.ru
In reply to: Ildus Kurbangaliev (#94)
#96Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildar Musin (#95)
#97Ildar Musin
i.musin@postgrespro.ru
In reply to: Ildus Kurbangaliev (#96)
#98Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildar Musin (#97)
#99Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildar Musin (#97)
#100Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#99)
#101Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#100)
#102Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#101)
#103Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#102)
#104Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Ildus Kurbangaliev (#103)
#105Alexander Korotkov
aekorotkov@gmail.com
In reply to: Konstantin Knizhnik (#104)
#106Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Alexander Korotkov (#105)
#107Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Alexander Korotkov (#105)
#108Alexander Korotkov
aekorotkov@gmail.com
In reply to: Konstantin Knizhnik (#107)
#109Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Alexander Korotkov (#108)
#110Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Konstantin Knizhnik (#109)
#111Alexander Korotkov
aekorotkov@gmail.com
In reply to: Konstantin Knizhnik (#109)
#112Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Alexander Korotkov (#111)
#113Robert Haas
robertmhaas@gmail.com
In reply to: Konstantin Knizhnik (#109)
#114Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#112)
#115Alexander Korotkov
aekorotkov@gmail.com
In reply to: Ildus Kurbangaliev (#114)
#116Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Alexander Korotkov (#115)
#117Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Ildus Kurbangaliev (#116)
#118Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Ildus Kurbangaliev (#117)
#119Ildus Kurbangaliev
i.kurbangaliev@postgrespro.ru
In reply to: Dmitry Dolgov (#118)
#120Michael Paquier
michael@paquier.xyz
In reply to: Ildus Kurbangaliev (#119)
#121Ildus Kurbangaliev
i.kurbangaliev@gmail.com
In reply to: Ildus Kurbangaliev (#119)
#122David Steele
david@pgmasters.net
In reply to: Ildus Kurbangaliev (#121)
#123Alexander Korotkov
aekorotkov@gmail.com
In reply to: David Steele (#122)
#124David Steele
david@pgmasters.net
In reply to: Alexander Korotkov (#123)
#125Ildus Kurbangaliev
i.kurbangaliev@gmail.com
In reply to: David Steele (#124)
#126Chris Travers
chris.travers@adjust.com
In reply to: David Steele (#124)
#127Ildar Musin
ildar@adjust.com
In reply to: Ildus Kurbangaliev (#125)
#128Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#125)
#129Chris Travers
chris.travers@adjust.com
In reply to: Tomas Vondra (#128)
#130Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Chris Travers (#129)
#131Chris Travers
chris.travers@adjust.com
In reply to: Tomas Vondra (#130)
#132Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Chris Travers (#131)
#133Thomas Munro
thomas.munro@gmail.com
In reply to: Ildus Kurbangaliev (#125)
#134Alexander Korotkov
aekorotkov@gmail.com
In reply to: Thomas Munro (#133)
#135Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alexander Korotkov (#134)
#136Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alvaro Herrera (#135)
#137Ildus Kurbangaliev
i.kurbangaliev@gmail.com
In reply to: Alexander Korotkov (#136)
#138Ildus Kurbangaliev
i.kurbangaliev@gmail.com
In reply to: Ildus Kurbangaliev (#137)
#139Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Ildus Kurbangaliev (#138)
#140Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#123)
#141Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#140)
#142Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#141)
#143Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#142)
#144Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#143)
#145Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#144)
#146Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#144)
#147Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#146)
#148Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#140)
#149Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#148)
#150Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#149)
#151Amit Khandekar
amitdkhan.pg@gmail.com
In reply to: Dilip Kumar (#148)
#152Mark Dilger
mark.dilger@enterprisedb.com
In reply to: Dilip Kumar (#148)
#153Dilip Kumar
dilipbalaut@gmail.com
In reply to: Mark Dilger (#152)
#154Dilip Kumar
dilipbalaut@gmail.com
In reply to: Amit Khandekar (#151)
#155Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#150)
#156Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#155)
#157Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#156)
#158Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#157)
#159Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#158)
#160Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#159)
#161Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#159)
#162Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#161)
#163Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#162)
#164Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#163)
#165Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#164)
#166Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#165)
#167Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#166)
#168Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#167)
#169Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#167)
#170Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#168)
#171Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#170)
#172Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#171)
#173Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#172)
#174Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#173)
#175Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#174)
#176Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#175)
#177Robert Haas
robertmhaas@gmail.com
In reply to: Tomas Vondra (#170)
#178Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#176)
#179Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#178)
#180Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#177)
#181Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#179)
#182Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#181)
#183Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#182)
#184Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#183)
#185Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#184)
#186Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#185)
#187Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#186)
#188Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#187)
#189Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#188)
#190Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#188)
#191Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#190)
#192Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#191)
#193Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#192)
#194Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#193)
#195Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#194)
#196Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#194)
#197Dilip Kumar
dilipbalaut@gmail.com
In reply to: Alvaro Herrera (#196)
#198Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#188)
#199Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#198)
#200Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#199)
#201Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#188)
#202Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#201)
#203Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#202)
#204Andrey Borodin
amborodin@acm.org
In reply to: Dilip Kumar (#203)
#205Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andrey Borodin (#204)
#206Andrey Borodin
amborodin@acm.org
In reply to: Dilip Kumar (#205)
#207Andrey Borodin
amborodin@acm.org
In reply to: Andrey Borodin (#206)
#208Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#203)
#209Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#208)
#210Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#208)
#211Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#210)
#212Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#211)
#213Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#212)
#214Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#213)
#215Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#214)
#216Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#215)
#217Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#216)
#218Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#217)
#219Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#218)
#220Neha Sharma
neha.sharma@enterprisedb.com
In reply to: Dilip Kumar (#219)
#221Dilip Kumar
dilipbalaut@gmail.com
In reply to: Neha Sharma (#220)
#222Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#218)
#223Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#222)
#224Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#223)
#225Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#224)
#226Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#225)
#227Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#225)
#228Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#227)
#229Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#228)
#230Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#225)
#231Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#224)
#232Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#230)
#233Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#232)
#234Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#233)
#235Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#231)
#236Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#230)
#237Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#236)
#238Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#237)
#239Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#236)
#240Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#234)
#241Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#240)
#242Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#239)
#243Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#238)
#244Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#243)
#245Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#244)
#246Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#245)
#247Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#246)
#248Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#247)
#249Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#245)
#250Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#249)
#251Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#250)
#252Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#248)
#253Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#250)
#254Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#253)
#255Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#244)
#256Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#245)
#257Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#254)
#258Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#257)
#259Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#257)
#260Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#259)
#261Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#254)
#262Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#259)
#263Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#262)
#264Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#263)
#265Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#264)
#266Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#265)
#267Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#265)
#268Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#267)
#269Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#268)
#270Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#266)
#271Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#269)
#272Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#271)
#273Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#272)
#274Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#273)
#275Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#274)
#276Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#275)
#277Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#275)
#278Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#277)
#279Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#278)
#280Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#279)
#281Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#280)
#282Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#281)
#283Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#282)
#284Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#278)
#285Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#283)
#286Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#284)
#287Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#286)
#288Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#287)
#289Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#284)
#290Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#288)
#291Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#290)
#292Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#291)
#293Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#286)
#294Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#286)
#295Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#294)
#296Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#295)
#297Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#295)
#298Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#295)
#299Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#298)
#300Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#299)
#301Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#300)
#302Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#297)
#303Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#300)
#304Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#302)
#305Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#272)
#306Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#304)
#307Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#305)
#308Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#306)
#309Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#303)
#310Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#302)
#311Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#310)
#312Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#311)
#313Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#312)
#314Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#310)
#315Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#314)
#316Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#301)
#317Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#316)
#318Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#317)
#319Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#318)
#320Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#319)
#321Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#319)
#322Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#321)
#323Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#318)
#324Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#323)
#325Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#319)
#326Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#325)
#327Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#325)
#328Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#326)
#329Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#327)
#330Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#329)
#331Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#330)
#332Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#331)
#333Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#332)
#334Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#319)
#335Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#334)
#336Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#335)
#337Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#334)
#338Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#337)
#339Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#338)
#340Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#339)
#341Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#340)
#342Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#341)
#343Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#342)
#344Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#343)
#345Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#340)
#346Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#345)
#347Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#346)
#348Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#346)
#349Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#347)
#350Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#348)
#351Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#350)
#352Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#351)
#353Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#349)
#354Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#352)
#355Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#353)
#356Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#345)
#357Justin Pryzby
pryzby@telsasoft.com
In reply to: Tomas Vondra (#351)
#358Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#354)
#359Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#355)
#360Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#359)
#361Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#345)
#362Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#361)
#363David Steele
david@pgmasters.net
In reply to: Andres Freund (#361)
#364Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#360)
#365Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#364)
#366Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#364)
#367Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#356)
#368Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#362)
#369Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#366)
#370Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#369)
#371Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Robert Haas (#345)
#372Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tomas Vondra (#371)
#373Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Dilip Kumar (#372)
#374Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#368)
#375Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#373)
#376Justin Pryzby
pryzby@telsasoft.com
In reply to: Tomas Vondra (#375)
#377Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#374)
#378Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#377)
#379Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#378)
#380Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#378)
#381Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#380)
#382Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#380)
#383Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#381)
#384Justin Pryzby
pryzby@telsasoft.com
In reply to: Alvaro Herrera (#348)
#385Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Justin Pryzby (#384)
#386Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#384)
#387Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#344)
#388Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#387)
#389Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#388)
#390Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#368)
#391Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Justin Pryzby (#376)
#392Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#389)
#393Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#392)
#394Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#393)
#395Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#394)
#396Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#393)
#397Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dilip Kumar (#395)
#398Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#397)
#399Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#398)
#400Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#390)
#401Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#400)
#402Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#399)
#403Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#402)
#404Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#403)
#405Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#390)
#406Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#404)
#407Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#405)
#408Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#405)
#409Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dilip Kumar (#406)
#410Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#408)
#411Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#410)
#412Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#411)
#413Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#409)
#414Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#409)
#415Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#414)
#416Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#415)
#417Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#416)
#418Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#412)
#419Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#418)
#420Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#419)
#421Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#419)
#422Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#421)
#423Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#420)
#424Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#423)
#425Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#422)
#426Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#425)
#427Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Robert Haas (#345)
#428Dilip Kumar
dilipbalaut@gmail.com
In reply to: Jaime Casanova (#427)
#429Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#428)
#430Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#429)
#431Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#430)
#432Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#431)
#433Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#432)
#434Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#433)
#435Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#434)
#436Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#381)
#437Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#435)
#438Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#437)
#439Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#436)
#440Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#424)
#441Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#439)
#442Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#441)
#443Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#439)
#444Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#438)
#445Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#443)
#446Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#445)
#447Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#446)
#448Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#444)
#449Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#447)
#450Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#448)
#451Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#408)
#452Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#441)
#453Justin Pryzby
pryzby@telsasoft.com
In reply to: Andrew Dunstan (#452)
#454Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#449)
#455David Steele
david@pgmasters.net
In reply to: Tom Lane (#454)
#456Robert Haas
robertmhaas@gmail.com
In reply to: David Steele (#455)
#457Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#456)
#458Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#457)