SQL/JSON: functions

Started by Nikita Glukhovover 8 years ago151 messageshackers
Jump to latest
#1Nikita Glukhov
n.gluhov@postgrespro.ru

Attached patches implementing all SQL/JSON functions excluding JSON_TABLE:

JSON_OBJECT()
JSON_OBJECTAGG()
JSON_ARRAY()
JSON_ARRAYAGG()

JSON_EXISTS()
JSON_VALUE()
JSON_QUERY()

IS JSON predicate

This patchset depends on 8th version of jsonpath patchset that was
posted in
/messages/by-id/48f13b75-0be7-c356-ff26-1db743add56e@postgrespro.ru

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0008-add-invisible-coercion-form-v08.patchtext/x-patch; name=0008-add-invisible-coercion-form-v08.patchDownload+45-75
0009-add-function-formats-v08.patchtext/x-patch; name=0009-add-function-formats-v08.patchDownload+76-6
0010-sqljson-v08.patchtext/x-patch; name=0010-sqljson-v08.patchDownload+8227-88
0011-sqljson-json-v08.patchtext/x-patch; name=0011-sqljson-json-v08.patchDownload+1386-55
#2Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#1)
Re: SQL/JSON: functions

Attached 9th version of SQL/JSON patches rebased onto the latest master.

Displayed column name for SQL/JSON functions was fixed.

Documentation drafts written by Oleg Bartunov:
https://github.com/obartunov/sqljsondoc

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0007-add-invisible-coercion-form-v09.patchtext/x-patch; name=0007-add-invisible-coercion-form-v09.patchDownload+45-75
0008-add-function-formats-v09.patchtext/x-patch; name=0008-add-function-formats-v09.patchDownload+76-6
0009-sqljson-v09.patchtext/x-patch; name=0009-sqljson-v09.patchDownload+8230-88
0010-sqljson-json-v09.patchtext/x-patch; name=0010-sqljson-json-v09.patchDownload+1386-55
#3Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#2)
Re: SQL/JSON: functions

Attached 10th version of SQL/JSON patches rebased onto the latest master.

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0009-add-invisible-coercion-form-v10.patchtext/x-patch; name=0009-add-invisible-coercion-form-v10.patchDownload+45-75
0010-add-function-formats-v10.patchtext/x-patch; name=0010-add-function-formats-v10.patchDownload+76-6
0011-sqljson-v10.patchtext/x-patch; name=0011-sqljson-v10.patchDownload+8292-88
0012-sqljson-json-v10.patchtext/x-patch; name=0012-sqljson-json-v10.patchDownload+1448-55
#4Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#3)
Re: SQL/JSON: functions

Attached 11th version of SQL/JSON patches rebased onto the latest master.

Fixed uninitialized FORMAT JSON location in gram.y and column names for
JSON constructors.

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0009-add-invisible-coercion-form-v11.patchtext/x-patch; name=0009-add-invisible-coercion-form-v11.patchDownload+45-75
0010-add-function-formats-v11.patchtext/x-patch; name=0010-add-function-formats-v11.patchDownload+76-6
0011-sqljson-v11.patchtext/x-patch; name=0011-sqljson-v11.patchDownload+8306-88
0012-sqljson-json-v11.patchtext/x-patch; name=0012-sqljson-json-v11.patchDownload+1448-55
#5Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#4)
Re: SQL/JSON: functions

Attached 12th version of SQL/JSON patches rebased onto the latest master.

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0010-add-invisible-coercion-form-v12.patchtext/x-patch; name=0010-add-invisible-coercion-form-v12.patchDownload+45-75
0011-add-function-formats-v12.patchtext/x-patch; name=0011-add-function-formats-v12.patchDownload+76-6
0012-sqljson-v12.patchtext/x-patch; name=0012-sqljson-v12.patchDownload+8306-88
0013-sqljson-json-v12.patchtext/x-patch; name=0013-sqljson-json-v12.patchDownload+1448-55
#6Simon Riggs
simon@2ndQuadrant.com
In reply to: Nikita Glukhov (#5)
Re: SQL/JSON: functions

On 7 March 2018 at 14:34, Nikita Glukhov <n.gluhov@postgrespro.ru> wrote:

Attached 12th version of SQL/JSON patches rebased onto the latest master.

Please write some docs or notes to go with this.

If you drop a big pile of code with no explanation it will just be ignored.

I think many people want SQL/JSON, but the purpose of a patch
submission is to allow a committer to review and commit without
needing to edit anything. It shouldn't be like assembling flat pack
furniture while wearing a blindfold.

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

#7Oleg Bartunov
oleg@sai.msu.su
In reply to: Simon Riggs (#6)
Re: SQL/JSON: functions

On Tue, Mar 13, 2018 at 2:04 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 7 March 2018 at 14:34, Nikita Glukhov <n.gluhov@postgrespro.ru> wrote:

Attached 12th version of SQL/JSON patches rebased onto the latest master.

Please write some docs or notes to go with this.

If you drop a big pile of code with no explanation it will just be ignored.

I think many people want SQL/JSON, but the purpose of a patch
submission is to allow a committer to review and commit without
needing to edit anything. It shouldn't be like assembling flat pack
furniture while wearing a blindfold.

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write in more
friendly way. We'll have time to convert it to postgres format.

Show quoted text

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

#8Michael Paquier
michael@paquier.xyz
In reply to: Oleg Bartunov (#7)
Re: SQL/JSON: functions

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write in more
friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such, this is much acceptable in my
opinion and the CF is running short in time.
--
Michael

#9Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#8)
Re: SQL/JSON: functions

On 2018-03-14 07:54:35 +0900, Michael Paquier wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write in more
friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such, this is much acceptable in my
opinion and the CF is running short in time.

Given that this patch still uses PG_TRY/CATCH around as wide paths of
code as a whole ExecEvalExpr() invocation, basically has gotten no
review, I don't see this going anywhere for v11.

Greetings,

Andres Freund

#10Oleg Bartunov
oleg@sai.msu.su
In reply to: Michael Paquier (#8)
Re: SQL/JSON: functions

On 14 Mar 2018 01:54, "Michael Paquier" <michael@paquier.xyz> wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write in

more

friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such,

Exactly. SQL/JSON is rather complex thing and "converting" the standard to
the user level understanding is a separate challenge and I'd like to
continue to work on it. It's mostly written, we need to understand how to
organize it.

this

is much acceptable in my
opinion and the CF is running short in time.
--
Michael

#11Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#9)
Re: SQL/JSON: functions

On Wed, Mar 14, 2018 at 2:10 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-14 07:54:35 +0900, Michael Paquier wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write

in more

friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such, this is much acceptable in my
opinion and the CF is running short in time.

Given that this patch still uses PG_TRY/CATCH around as wide paths of
code as a whole ExecEvalExpr() invocation,

I agree that we should either use PG_TRY/CATCH over some small and safe
codepaths or surround PG_TRY/CATCH with subtransactions. PG_TRY/CATCH over
ExecEvalExpr() looks really unacceptable.

basically has gotten no

review, I don't see this going anywhere for v11.

I wouldn't be co categorical at this point. Patchset is there for about
year.
Some parts of code received more of review while some parts receives less.
We can surround all dangerous PG_TRY/CATCH pairs with subtransactions,
tolerate performance penalty and leave further optimizations for future
releases.
In worst case, we can remove codepaths which use PG_TRY/CATCH and
leave only ERROR ON ERROR behavior of SQL/JSON.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#12Pavel Stehule
pavel.stehule@gmail.com
In reply to: Alexander Korotkov (#11)
Re: SQL/JSON: functions

2018-03-14 15:11 GMT+01:00 Alexander Korotkov <a.korotkov@postgrespro.ru>:

On Wed, Mar 14, 2018 at 2:10 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-14 07:54:35 +0900, Michael Paquier wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.j

sonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to

write in more

friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such, this is much acceptable in my
opinion and the CF is running short in time.

Given that this patch still uses PG_TRY/CATCH around as wide paths of
code as a whole ExecEvalExpr() invocation,

I agree that we should either use PG_TRY/CATCH over some small and safe
codepaths or surround PG_TRY/CATCH with subtransactions. PG_TRY/CATCH
over
ExecEvalExpr() looks really unacceptable.

basically has gotten no

review, I don't see this going anywhere for v11.

I wouldn't be co categorical at this point. Patchset is there for about
year.
Some parts of code received more of review while some parts receives less.
We can surround all dangerous PG_TRY/CATCH pairs with subtransactions,
tolerate performance penalty and leave further optimizations for future
releases.
In worst case, we can remove codepaths which use PG_TRY/CATCH and
leave only ERROR ON ERROR behavior of SQL/JSON.

I am thinking so using subtransactions on few places are acceptable.
PLpgSQL uses it years, and it is working good enough.

Regards

Pavel

Show quoted text

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#13Oleg Bartunov
oleg@sai.msu.su
In reply to: Alexander Korotkov (#11)
Re: SQL/JSON: functions

On 14 Mar 2018 17:11, "Alexander Korotkov" <a.korotkov@postgrespro.ru>
wrote:

On Wed, Mar 14, 2018 at 2:10 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-14 07:54:35 +0900, Michael Paquier wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here
https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md

It's not easy to write docs for SQL/JSON in xml, so I decided to write

in more

friendly way. We'll have time to convert it to postgres format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the feature freeze
using a dedicated open item or such, this is much acceptable in my
opinion and the CF is running short in time.

Given that this patch still uses PG_TRY/CATCH around as wide paths of
code as a whole ExecEvalExpr() invocation,

I agree that we should either use PG_TRY/CATCH over some small and safe
codepaths or surround PG_TRY/CATCH with subtransactions. PG_TRY/CATCH over
ExecEvalExpr() looks really unacceptable.

basically has gotten no

review, I don't see this going anywhere for v11.

I wouldn't be co categorical at this point. Patchset is there for about
year.
Some parts of code received more of review while some parts receives less.
We can surround all dangerous PG_TRY/CATCH pairs with subtransactions,
tolerate performance penalty and leave further optimizations for future
releases.

Agree it's not difficult.

In worst case, we can remove codepaths which use PG_TRY/CATCH and
leave only ERROR ON ERROR behavior of SQL/JSON.

No-no, json user will be really upset on this. Our goal is to be the first
relational database with strong standard compliance.

------
Alexander Korotkov

Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#14Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Oleg Bartunov (#13)
Re: SQL/JSON: functions

Attached 13th version of the patches:

* Subtransactions in PG_TRY/CATCH in ExecEvalJsonExpr() were made unconditional,
regardless of the volatility of expressions.

* PG_TRY/CATCH in ExecEvalExprPassingCaseValue() was removed along with the
entire function.

On 15.03.2018 11:08, Oleg Bartunov wrote:

On 14 Mar 2018 17:11, "Alexander Korotkov" <a.korotkov@postgrespro.ru
<mailto:a.korotkov@postgrespro.ru>> wrote:

On Wed, Mar 14, 2018 at 2:10 AM, Andres Freund <andres@anarazel.de
<mailto:andres@anarazel.de>> wrote:

On 2018-03-14 07:54:35 +0900, Michael Paquier wrote:

On Tue, Mar 13, 2018 at 04:08:01PM +0300, Oleg Bartunov wrote:

The docs are here

https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md
<https://github.com/obartunov/sqljsondoc/blob/master/README.jsonpath.md&gt;

It's not easy to write docs for SQL/JSON in xml, so I

decided to write in more

friendly way. We'll have time to convert it to postgres

format.

If you aim at getting a feature committed first without its
documentation, and getting the docs written after the

feature freeze

using a dedicated open item or such, this is much acceptable

in my

opinion and the CF is running short in time.

Given that this patch still uses PG_TRY/CATCH around as wide
paths of
code as a whole ExecEvalExpr() invocation,

I agree that we should either use PG_TRY/CATCH over some small and
safe
codepaths or surround PG_TRY/CATCH with subtransactions.
PG_TRY/CATCH over
ExecEvalExpr() looks really unacceptable.

basically has gotten no
review, I don't see this going anywhere for v11.

I wouldn't be co categorical at this point. Patchset is there for
about year.
Some parts of code received more of review while some parts
receives less.
We can surround all dangerous PG_TRY/CATCH pairs with subtransactions,
tolerate performance penalty and leave further optimizations for
future releases.

Agree it's not difficult.

In worst case, we can remove codepaths which use PG_TRY/CATCH and
leave only ERROR ON ERROR behavior of SQL/JSON.

No-no, json user will be really upset on this. Our goal is to be the
first relational database with strong standard compliance.

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0010-add-invisible-coercion-form-v13.patchtext/x-patch; name=0010-add-invisible-coercion-form-v13.patchDownload+45-75
0011-add-function-formats-v13.patchtext/x-patch; name=0011-add-function-formats-v13.patchDownload+76-6
0012-sqljson-v13.patchtext/x-patch; name=0012-sqljson-v13.patchDownload+8204-139
0013-sqljson-json-v13.patchtext/x-patch; name=0013-sqljson-json-v13.patchDownload+1448-55
#15Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#14)
Re: SQL/JSON: functions

On 15.03.2018 20:04, Nikita Glukhov wrote:

Attached 13th version of the patches:

* Subtransactions in PG_TRY/CATCH in ExecEvalJsonExpr() were made unconditional,
regardless of the volatility of expressions.

* PG_TRY/CATCH in ExecEvalExprPassingCaseValue() was removed along with the
entire function.

Attached 15th version of the patches:
* disabled parallel execution of SQL/JSON query functions when internal
subtransactions are used (if ERROR ON ERROR is not specified)
* added experimental optimization of internal subtransactions (see below)

The new patch #14 is an experimental attempt to reduce overhead of
subtransaction start/commit which can result in 2x-slowdown in the simplest
cases. By the idea of Alexander Korotkov, subtransaction is not really
committed if it has not touched the database and its XID has not been assigned
(DB modification is not expected in type casts functions) and then can be reused
when the next subtransaction is started. So, all rows in JsonExpr can be
executed in the single cached subtransaction. This optimization really helps
to reduce overhead from 100% to 5-10%:

-- without subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean ERROR ON ERROR)
FROM generate_series(1, 10000000) i;
...
Execution Time: 2785.410 ms

-- cached subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean)
FROM generate_series(1, 10000000) i;
...
Execution Time: 2939.363 ms

-- ordinary subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean)
FROM generate_series(1, 10000000) i;
...
Execution Time: 5417.268 ms

But, unfortunately, I don't believe that this patch is completely correct,
mainly because the behavior of subtransaction callbacks (and their expectations
about subtransaction's lifecycle too) seems unpredictable to me.

Even with this optimization, internal subtransactions still have one major
drawback -- they disallow parallel query execution, because background
workers do not support subtransactions now. Example:

=# CREATE TABLE test_parallel_json_value AS
SELECT i::text::jsonb AS js FROM generate_series(1, 5000000) i;
CREATE TABLE

=# EXPLAIN ANALYZE
SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR))
FROM test_parallel_json_value;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=79723.15..79723.16 rows=1 width=32) (actual time=455.062..455.062 rows=1 loops=1)
-> Gather (cost=79722.93..79723.14 rows=2 width=32) (actual time=455.052..455.055 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Partial Aggregate (cost=78722.93..78722.94 rows=1 width=32) (actual time=446.000..446.000 rows=1 loops=3)
-> Parallel Seq Scan on t (cost=0.00..52681.30 rows=2083330 width=18) (actual time=0.023..104.779 rows=1666667 loops=3)
Planning Time: 0.044 ms
Execution Time: 456.460 ms
(8 rows)

=# EXPLAIN ANALYZE
SELECT sum(JSON_VALUE(js, '$' RETURNING numeric))
FROM test_parallel_json_value;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Aggregate (cost=144347.82..144347.83 rows=1 width=32) (actual time=1381.938..1381.938 rows=1 loops=1)
-> Seq Scan on t (cost=0.00..81847.92 rows=4999992 width=18) (actual time=0.076..309.676 rows=5000000 loops=1)
Planning Time: 0.082 ms
Execution Time: 1384.133 ms
(4 rows)

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0010-add-invisible-coercion-form-v15.patchtext/x-patch; name=0010-add-invisible-coercion-form-v15.patchDownload+45-75
0011-add-function-formats-v15.patchtext/x-patch; name=0011-add-function-formats-v15.patchDownload+76-6
0012-sqljson-v15.patchtext/x-patch; name=0012-sqljson-v15.patchDownload+8313-139
0013-sqljson-json-v15.patchtext/x-patch; name=0013-sqljson-json-v15.patchDownload+1448-55
0014-optimize-sqljson-subtransactions-v15.patchtext/x-patch; name=0014-optimize-sqljson-subtransactions-v15.patchDownload+130-10
#16Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#15)
Re: SQL/JSON: functions

2018-06-28 2:18 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru>:

On 15.03.2018 20:04, Nikita Glukhov wrote:

Attached 13th version of the patches:

* Subtransactions in PG_TRY/CATCH in ExecEvalJsonExpr() were made
unconditional,
regardless of the volatility of expressions.

* PG_TRY/CATCH in ExecEvalExprPassingCaseValue() was removed along with
the
entire function.

Attached 15th version of the patches:
* disabled parallel execution of SQL/JSON query functions when internal
subtransactions are used (if ERROR ON ERROR is not specified)
* added experimental optimization of internal subtransactions (see below)

The new patch #14 is an experimental attempt to reduce overhead of
subtransaction start/commit which can result in 2x-slowdown in the simplest
cases. By the idea of Alexander Korotkov, subtransaction is not really
committed if it has not touched the database and its XID has not been
assigned
(DB modification is not expected in type casts functions) and then can be
reused
when the next subtransaction is started. So, all rows in JsonExpr can be
executed in the single cached subtransaction. This optimization really
helps
to reduce overhead from 100% to 5-10%:

I read a technical report for SQL/JSON. If I understand it well, then ON
ERROR clause is primary related to structural errors, not to all errors.

So your implementation is maybe too tolerant, what has this issue. There
was not any example, so this clause should to handle cast errors or any
other errors than JSON structural.

The playing with other implementation of subtransactions doesn't look like
safe way, more if it is not necessary

The other possible error are casts errors. We can introduce new exception
safe input functions. These functions can be interesting for fault tolerant
COPY for example.

Regards

Pavel

Show quoted text

-- without subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean ERROR ON ERROR)
FROM generate_series(1, 10000000) i;
...
Execution Time: 2785.410 ms

-- cached subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean)
FROM generate_series(1, 10000000) i;
...
Execution Time: 2939.363 ms

-- ordinary subtransactions
=# EXPLAIN ANALYZE
SELECT JSON_VALUE('true'::jsonb, '$' RETURNING boolean)
FROM generate_series(1, 10000000) i;
...
Execution Time: 5417.268 ms

But, unfortunately, I don't believe that this patch is completely correct,
mainly because the behavior of subtransaction callbacks (and their
expectations
about subtransaction's lifecycle too) seems unpredictable to me.

Even with this optimization, internal subtransactions still have one major
drawback -- they disallow parallel query execution, because background
workers do not support subtransactions now. Example:

=# CREATE TABLE test_parallel_json_value AS
SELECT i::text::jsonb AS js FROM generate_series(1, 5000000) i;
CREATE TABLE

=# EXPLAIN ANALYZE
SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR))
FROM test_parallel_json_value;
QUERY PLAN
------------------------------------------------------------
------------------------------------------------------------
-----------------
Finalize Aggregate (cost=79723.15..79723.16 rows=1 width=32) (actual
time=455.062..455.062 rows=1 loops=1)
-> Gather (cost=79722.93..79723.14 rows=2 width=32) (actual
time=455.052..455.055 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Partial Aggregate (cost=78722.93..78722.94 rows=1 width=32)
(actual time=446.000..446.000 rows=1 loops=3)
-> Parallel Seq Scan on t (cost=0.00..52681.30
rows=2083330 width=18) (actual time=0.023..104.779 rows=1666667 loops=3)
Planning Time: 0.044 ms
Execution Time: 456.460 ms
(8 rows)

=# EXPLAIN ANALYZE
SELECT sum(JSON_VALUE(js, '$' RETURNING numeric))
FROM test_parallel_json_value;
QUERY PLAN
------------------------------------------------------------
--------------------------------------------------------
Aggregate (cost=144347.82..144347.83 rows=1 width=32) (actual
time=1381.938..1381.938 rows=1 loops=1)
-> Seq Scan on t (cost=0.00..81847.92 rows=4999992 width=18) (actual
time=0.076..309.676 rows=5000000 loops=1)
Planning Time: 0.082 ms
Execution Time: 1384.133 ms
(4 rows)

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#17Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#16)
Re: SQL/JSON: functions

Attached 16th version of the patches:
* changed type of new SQL keyword STRING
(STRING is used as a function parameter name in Pl/Tcl tests)
* removed implicit coercion via I/O from JSON_VALUE (see below)

On 28.06.2018 07:25, Pavel Stehule wrote:

2018-06-28 2:18 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru
<mailto:n.gluhov@postgrespro.ru>>:

On 15.03.2018 20:04, Nikita Glukhov wrote:

Attached 13th version of the patches:

* Subtransactions in PG_TRY/CATCH in ExecEvalJsonExpr() were
made unconditional,
  regardless of the volatility of expressions.

* PG_TRY/CATCH in ExecEvalExprPassingCaseValue() was removed
along with the
  entire function.

Attached 15th version of the patches:
 * disabled parallel execution of SQL/JSON query functions when
internal
   subtransactions are used (if ERROR ON ERROR is not specified)
 * added experimental optimization of internal subtransactions
(see below)

The new patch #14 is an experimental attempt to reduce overhead of
subtransaction start/commit which can result in 2x-slowdown in the
simplest
cases.  By the idea of Alexander Korotkov, subtransaction is not
really
committed if it has not touched the database and its XID has not
been assigned
(DB modification is not expected in type casts functions) and then
can be reused
when the next subtransaction is started.  So, all rows in JsonExpr
can be
executed in the single cached subtransaction.  This optimization
really helps
to reduce overhead from 100% to 5-10%:

I read a technical report for SQL/JSON. If I understand it well, then
ON ERROR clause is primary related to structural errors, not to all
errors.

So your implementation is maybe too tolerant, what has this issue.
There was not any example, so this clause should to handle cast errors
or any other errors than JSON structural.

The playing with other implementation of subtransactions doesn't look
like safe way, more if it is not necessary

The other possible error are casts errors. We can introduce new
exception safe input functions. These functions can be interesting for
fault tolerant COPY for example.

SQL/JSON standard requires handling of cast errors too.

9.40 Casting an SQL/JSON sequence to an SQL type (pages 724-725):

4) If TEMPST is successful completion, then:
b) If the length of SEQ is 1 (one), then let I be the SQL/JSON item in SEQ.
Case:
...
iii) Otherwise, let IDT be the data type of I.
Case:
1) If IDT cannot be cast to target type DT according to the Syntax Rules
of Subclause 6.13, "<cast specification>", then let TEMPST be data
exception — SQL/JSON item cannot be cast to target type.
2) Otherwise, let X be an SQL variable whose value is I. Let V be the
value of CAST (X AS DT). If an exception condition is raised by this
<cast specification>, then let TEMPST be that exception condition.
...
5) Case:
a) If TEMPST is successful completion, then let OUTST be successful
completion.
b) If ONERROR is ERROR, then let OUTST be TEMPST.
c) If ONERROR is NULL, then let V be the SQL null value and let OUTST be
successful completion.
d) If ONERROR immediately contains DEFAULT, then let VE be the
<value expression> immediately contained in ONERROR. Let V be the value of
CAST (VE AS DT)
Case:
i) If an exception condition is raised by this <cast specification>, then
let OUTST be that exception condition.
ii) Otherwise, let OUTST be successful completion.

In 4.b.iii.1 said that there should be an error if the desired cast does not exist.
In the previous versions of the patches there was implicit coercion via I/O here
instead of error, so I decided to fix it the last version (fix is combined with a
minor refactoring of ExecEvalJsonExpr()).

--
Nikita Glukhov
Postgres Professional:http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0010-add-invisible-coercion-form-v16.patchtext/x-patch; name=0010-add-invisible-coercion-form-v16.patchDownload+45-75
0011-add-function-formats-v16.patchtext/x-patch; name=0011-add-function-formats-v16.patchDownload+76-6
0012-sqljson-v16.patchtext/x-patch; name=0012-sqljson-v16.patchDownload+8324-139
0013-sqljson-json-v16.patchtext/x-patch; name=0013-sqljson-json-v16.patchDownload+1442-54
0014-optimize-sqljson-subtransactions-v16.patchtext/x-patch; name=0014-optimize-sqljson-subtransactions-v16.patchDownload+130-10
#18Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#17)
Re: SQL/JSON: functions

2018-07-03 14:30 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru>:

Attached 16th version of the patches:
* changed type of new SQL keyword STRING
(STRING is used as a function parameter name in Pl/Tcl tests)
* removed implicit coercion via I/O from JSON_VALUE (see below)

On 28.06.2018 07:25, Pavel Stehule wrote:

2018-06-28 2:18 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru>:

On 15.03.2018 20:04, Nikita Glukhov wrote:

Attached 13th version of the patches:

* Subtransactions in PG_TRY/CATCH in ExecEvalJsonExpr() were made
unconditional,
regardless of the volatility of expressions.

* PG_TRY/CATCH in ExecEvalExprPassingCaseValue() was removed along with
the
entire function.

Attached 15th version of the patches:
* disabled parallel execution of SQL/JSON query functions when internal
subtransactions are used (if ERROR ON ERROR is not specified)
* added experimental optimization of internal subtransactions (see below)

The new patch #14 is an experimental attempt to reduce overhead of
subtransaction start/commit which can result in 2x-slowdown in the
simplest
cases. By the idea of Alexander Korotkov, subtransaction is not really
committed if it has not touched the database and its XID has not been
assigned
(DB modification is not expected in type casts functions) and then can be
reused
when the next subtransaction is started. So, all rows in JsonExpr can be
executed in the single cached subtransaction. This optimization really
helps
to reduce overhead from 100% to 5-10%:

I read a technical report for SQL/JSON. If I understand it well, then ON
ERROR clause is primary related to structural errors, not to all errors.

So your implementation is maybe too tolerant, what has this issue. There
was not any example, so this clause should to handle cast errors or any
other errors than JSON structural.

The playing with other implementation of subtransactions doesn't look like
safe way, more if it is not necessary

The other possible error are casts errors. We can introduce new exception
safe input functions. These functions can be interesting for fault tolerant
COPY for example.

SQL/JSON standard requires handling of cast errors too.

I didn't speak something else. But cast (and in this case it is from JSON

to some else) can be exception safe.

Regards

Pavel

Show quoted text

9.40 Casting an SQL/JSON sequence to an SQL type (pages 724-725):

4) If TEMPST is successful completion, then:
b) If the length of SEQ is 1 (one), then let I be the SQL/JSON item in SEQ.
Case:
...
iii) Otherwise, let IDT be the data type of I.
Case:
1) If IDT cannot be cast to target type DT according to the Syntax Rules
of Subclause 6.13, "<cast specification>", then let TEMPST be data
exception — SQL/JSON item cannot be cast to target type.
2) Otherwise, let X be an SQL variable whose value is I. Let V be the
value of CAST (X AS DT). If an exception condition is raised by this
<cast specification>, then let TEMPST be that exception condition.
...
5) Case:
a) If TEMPST is successful completion, then let OUTST be successful
completion.
b) If ONERROR is ERROR, then let OUTST be TEMPST.
c) If ONERROR is NULL, then let V be the SQL null value and let OUTST be
successful completion.
d) If ONERROR immediately contains DEFAULT, then let VE be the
<value expression> immediately contained in ONERROR. Let V be the value of
CAST (VE AS DT)
Case:
i) If an exception condition is raised by this <cast specification>, then
let OUTST be that exception condition.
ii) Otherwise, let OUTST be successful completion.

In 4.b.iii.1 said that there should be an error if the desired cast does not exist.
In the previous versions of the patches there was implicit coercion via I/O here
instead of error, so I decided to fix it the last version (fix is combined with a
minor refactoring of ExecEvalJsonExpr()).

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#19Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Pavel Stehule (#18)
Re: SQL/JSON: functions

On Tue, Jul 3, 2018 at 2:57 PM Pavel Stehule <pavel.stehule@gmail.com> wrote:

2018-07-03 14:30 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru>:

Attached 16th version of the patches:
* changed type of new SQL keyword STRING
(STRING is used as a function parameter name in Pl/Tcl tests)
* removed implicit coercion via I/O from JSON_VALUE (see below)

Unfortunately, the current version of patch 0010-add-invisible-coercion-form
doesn't not apply anymore without conflicts, could you please rebase it?

#20Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Dmitry Dolgov (#19)
Re: SQL/JSON: functions

On 26.11.2018 15:57, Dmitry Dolgov wrote:

On Tue, Jul 3, 2018 at 2:57 PM Pavel Stehule <pavel.stehule@gmail.com> wrote:

2018-07-03 14:30 GMT+02:00 Nikita Glukhov <n.gluhov@postgrespro.ru>:

Attached 16th version of the patches:
* changed type of new SQL keyword STRING
(STRING is used as a function parameter name in Pl/Tcl tests)
* removed implicit coercion via I/O from JSON_VALUE (see below)

Unfortunately, the current version of patch 0010-add-invisible-coercion-form
doesn't not apply anymore without conflicts, could you please rebase it?

Attached 20th version of the patches rebased onto the current master.

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

0009-Optimize-SQL-JSON-subtransactions-v20.patchtext/x-patch; name=0009-Optimize-SQL-JSON-subtransactions-v20.patchDownload+130-11
0005-Add-invisible-coercion-form-v20.patchtext/x-patch; name=0005-Add-invisible-coercion-form-v20.patchDownload+45-76
0006-Add-function-formats-v20.patchtext/x-patch; name=0006-Add-function-formats-v20.patchDownload+76-7
0007-SQL-JSON-functions-v20.patchtext/x-patch; name=0007-SQL-JSON-functions-v20.patchDownload+8332-144
0008-SQL-JSON-functions-for-json-type-v20.patchtext/x-patch; name=0008-SQL-JSON-functions-for-json-type-v20.patchDownload+1445-55
#21Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Nikita Glukhov (#20)
#22Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Dmitry Dolgov (#21)
#23Andres Freund
andres@anarazel.de
In reply to: Nikita Glukhov (#22)
#24Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Andres Freund (#23)
#25Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#24)
#26Andrew Alsup
bluesbreaker@gmail.com
In reply to: Nikita Glukhov (#25)
#27Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andrew Alsup (#26)
#28Thomas Munro
thomas.munro@gmail.com
In reply to: Andrew Alsup (#26)
#29Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Thomas Munro (#28)
#30Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Nikita Glukhov (#29)
#31Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Alvaro Herrera (#30)
#32Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#31)
#33Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Nikita Glukhov (#32)
#34Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Alvaro Herrera (#33)
#35Andrew Alsup
bluesbreaker@gmail.com
In reply to: Nikita Glukhov (#34)
#36Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Andrew Alsup (#35)
#37Andrew Alsup
bluesbreaker@gmail.com
In reply to: Nikita Glukhov (#36)
#38Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Nikita Glukhov (#34)
#39Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#38)
#40Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#39)
#41Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#40)
#42Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#41)
#43Erik Rijkers
er@xs4all.nl
In reply to: Nikita Glukhov (#42)
#44Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Erik Rijkers (#43)
#45Erik Rijkers
er@xs4all.nl
In reply to: Nikita Glukhov (#44)
#46Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#44)
#47Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#46)
#48Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#47)
#49Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#48)
#50Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#49)
#51Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#50)
#52Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#51)
#53Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#52)
#54Pavel Stehule
pavel.stehule@gmail.com
In reply to: Nikita Glukhov (#53)
#55Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Pavel Stehule (#54)
#56Alexander Korotkov
aekorotkov@gmail.com
In reply to: Nikita Glukhov (#55)
#57Justin Pryzby
pryzby@telsasoft.com
In reply to: Nikita Glukhov (#55)
#58Andrew Dunstan
andrew@dunslane.net
In reply to: Justin Pryzby (#57)
#59Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#58)
#60Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Andrew Dunstan (#59)
#61Andrew Dunstan
andrew@dunslane.net
In reply to: Nikita Glukhov (#60)
#62Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Andrew Dunstan (#61)
#63Andrew Dunstan
andrew@dunslane.net
In reply to: Nikita Glukhov (#62)
#64Michael Paquier
michael@paquier.xyz
In reply to: Andrew Dunstan (#63)
#65Simon Riggs
simon@2ndQuadrant.com
In reply to: Nikita Glukhov (#62)
#66Pavel Stehule
pavel.stehule@gmail.com
In reply to: Simon Riggs (#65)
#67Oleg Bartunov
oleg@sai.msu.su
In reply to: Simon Riggs (#65)
#68Oleg Bartunov
oleg@sai.msu.su
In reply to: Pavel Stehule (#66)
#69Pavel Stehule
pavel.stehule@gmail.com
In reply to: Oleg Bartunov (#68)
#70Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Michael Paquier (#64)
#71Zhihong Yu
zyu@yugabyte.com
In reply to: Nikita Glukhov (#70)
#72Zhihong Yu
zyu@yugabyte.com
In reply to: Zhihong Yu (#71)
#73Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Zhihong Yu (#72)
#74Erik Rijkers
er@xs4all.nl
In reply to: Nikita Glukhov (#73)
#75Ibrar Ahmed
ibrar.ahmad@gmail.com
In reply to: Erik Rijkers (#74)
#76Andrew Dunstan
andrew@dunslane.net
In reply to: Ibrar Ahmed (#75)
#77Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#76)
#78Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#77)
#79Nikita Glukhov
n.gluhov@postgrespro.ru
In reply to: Andrew Dunstan (#78)
#80Andrew Dunstan
andrew@dunslane.net
In reply to: Nikita Glukhov (#79)
#81Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#80)
#82Zhihong Yu
zyu@yugabyte.com
In reply to: Andrew Dunstan (#81)
#83Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#81)
#84Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#83)
#85Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#84)
#86Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#85)
#87Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Andrew Dunstan (#86)
#88Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#87)
#89Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Andrew Dunstan (#88)
#90Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Andrew Dunstan (#86)
#91Peter Eisentraut
peter_e@gmx.net
In reply to: Himanshu Upadhyaya (#90)
#92Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#90)
#93Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#90)
#94Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Andrew Dunstan (#92)
#95Pavel Stehule
pavel.stehule@gmail.com
In reply to: Himanshu Upadhyaya (#94)
#96Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#94)
#97Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#86)
#98Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Himanshu Upadhyaya (#90)
#99Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#98)
#100Himanshu Upadhyaya
upadhyaya.himanshu@gmail.com
In reply to: Andrew Dunstan (#97)
#101Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#100)
#102Andrew Dunstan
andrew@dunslane.net
In reply to: Himanshu Upadhyaya (#90)
#103Julien Rouhaud
rjuju123@gmail.com
In reply to: Andrew Dunstan (#102)
#104Andrew Dunstan
andrew@dunslane.net
In reply to: Julien Rouhaud (#103)
#105Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#102)
#106Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#105)
#107Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#106)
#108Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#107)
#109Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#108)
#110Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#109)
#111Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#110)
#112Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#111)
#113Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#112)
#114Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#113)
#115Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#112)
#116Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#114)
#117Justin Pryzby
pryzby@telsasoft.com
In reply to: Andrew Dunstan (#109)
#118Andrew Dunstan
andrew@dunslane.net
In reply to: Justin Pryzby (#117)
#119Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#118)
#120Justin Pryzby
pryzby@telsasoft.com
In reply to: Andrew Dunstan (#118)
#121Andrew Dunstan
andrew@dunslane.net
In reply to: Justin Pryzby (#120)
#122Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#121)
#123Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#116)
#124Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#123)
#125Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#124)
#126Andrew Dunstan
andrew@dunslane.net
In reply to: Andres Freund (#125)
#127Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#123)
#128Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#127)
#129Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#128)
#130Nikola Ivanov
kolioffx@gmail.com
In reply to: Andrew Dunstan (#129)
#131Andrew Dunstan
andrew@dunslane.net
In reply to: Nikola Ivanov (#130)
#132Andres Freund
andres@anarazel.de
In reply to: Nikola Ivanov (#130)
#133Nikola Ivanov
kolioffx@gmail.com
In reply to: Andres Freund (#132)
#134Nikola Ivanov
kolioffx@gmail.com
In reply to: Nikola Ivanov (#133)
#135Andrew Dunstan
andrew@dunslane.net
In reply to: Nikola Ivanov (#134)
#136Andres Freund
andres@anarazel.de
In reply to: Andrew Dunstan (#135)
#137Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#136)
#138Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#137)
#139Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#138)
#140Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#138)
#141Nikola Ivanov
kolioffx@gmail.com
In reply to: Andres Freund (#140)
#142Bruce Momjian
bruce@momjian.us
In reply to: Andrew Dunstan (#139)
#143Andrew Dunstan
andrew@dunslane.net
In reply to: Bruce Momjian (#142)
#144Justin Pryzby
pryzby@telsasoft.com
In reply to: Andrew Dunstan (#143)
#145Andrew Dunstan
andrew@dunslane.net
In reply to: Justin Pryzby (#144)
#146Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#145)
#147Justin Pryzby
pryzby@telsasoft.com
In reply to: Andrew Dunstan (#146)
#148Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#147)
#149a.kozhemyakin
a.kozhemyakin@postgrespro.ru
In reply to: Andrew Dunstan (#143)
#150Andrew Dunstan
andrew@dunslane.net
In reply to: a.kozhemyakin (#149)
#151Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#150)