Re: [HACKERS] [PATCH] Generic type subscripting

Pavel Stehule <pavel.stehule@gmail.com>

From: Pavel Stehule <pavel.stehule@gmail.com>
To: Dmitry Dolgov <9erthalion6@gmail.com>
Cc: Justin Pryzby <pryzby@telsasoft.com>, Tom Lane <tgl@sss.pgh.pa.us>, David Steele <david@pgmasters.net>, Nikita Glukhov <n.gluhov@postgrespro.ru>, Alvaro Herrera <alvherre@2ndquadrant.com>, David Fetter <david@fetter.org>, Thomas Munro <thomas.munro@gmail.com>, Thomas Munro <thomas.munro@enterprisedb.com>, Oleksandr Shulgin <oleksandr.shulgin@zalando.de>, Robert Haas <robertmhaas@gmail.com>, Andres Freund <andres@anarazel.de>, Michael Paquier <michael.paquier@gmail.com>, Oleg Bartunov <obartunov@gmail.com>, Peter Eisentraut <peter.eisentraut@2ndquadrant.com>, PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2020-09-16T11:52:27Z
Lists: pgsql-hackers
st 16. 9. 2020 v 11:36 odesílatel Dmitry Dolgov <9erthalion6@gmail.com>
napsal:

> > st 9. 9. 2020 v 23:04 Justin Pryzby <pryzby@telsasoft.com> wrote:
> >
> > This seems to already hit a merge conflict (8febfd185).
> > Would you re-rebase ?
>
> Thanks. Sure, will post a rebased version soon.
>
> > On Tue, Sep 15, 2020 at 08:42:40PM +0200, Pavel Stehule wrote:
> >
> > Maybe I found a another issue.
> >
> > create table foo(a jsonb);
> >
> > postgres=# select * from foo;
> > ┌───────────────────────────────────────────────────────────────────┐
> > │                                 a                                 │
> > ╞═══════════════════════════════════════════════════════════════════╡
> > │ [0, null, null, null, null, null, null, null, null, null, "ahoj"] │
> > └───────────────────────────────────────────────────────────────────┘
> > (1 row)
> >
> > It is working like I expect
> >
> > but
> >
> > postgres=# truncate foo;
> > TRUNCATE TABLE
> > postgres=# insert into foo values('[]');
> > INSERT 0 1
> > postgres=# update foo set a[10] = 'ahoj';
> > UPDATE 1
> > postgres=# select * from foo;
> > ┌──────────┐
> > │    a     │
> > ╞══════════╡
> > │ ["ahoj"] │
> > └──────────┘
> > (1 row)
>
> Thanks for looking at the last patch, I appreciate! The situation you've
> mention is an interesting edge case. If I understand correctly, the
> first example is the result of some operations leading to filling gaps
> between 0 and "ahoj". In the second case there is no such gap that's why
> nothing was "filled in", although one could expect presence of a "start
> position" and fill with nulls everything from it to the new element, is
> that what you mean?
>

I expect any time

a[10] := 10;

? a[10] --> 10

===


postgres=# truncate foo;
TRUNCATE TABLE
postgres=# insert into foo values('[]');
INSERT 0 1
postgres=# update foo set a[10] = 'AHOJ';
UPDATE 1
postgres=# select (a)[10] from foo;
┌───┐
│ a │
╞═══╡
│ ∅ │
└───┘
(1 row)

There should be consistency

postgres=# create table foo2(a text[]);
CREATE TABLE
postgres=# insert into foo2 values('{}');
INSERT 0 1
postgres=# update foo set a[10] = 'AHOJ';
UPDATE 1
postgres=# select (a)[10] from foo;
┌────────┐
│   a    │
╞════════╡
│ "AHOJ" │
└────────┘
(1 row)

and some natural behaviour - any special case with different behaviour is a
bad thing generally.

Regards

Pavel

Commits

  1. Throw error when assigning jsonb scalar instead of a composite object

  2. Filling array gaps during jsonb subscripting

  3. Implementation of subscripting for jsonb

  4. Allow ALTER TYPE to update an existing type's typsubscript value.

  5. Allow subscripting of hstore values.

  6. Support subscripting of arbitrary types, not only arrays.

  7. jit: Reference function pointer types via llvmjit_types.c.

  8. Teach contain_leaked_vars that assignment SubscriptingRefs are leaky.

  9. jit: Correct parameter type for generated expression evaluation functions.

  10. Renaming for new subscripting mechanism

  11. Fix assertion failure for SSL connections.

  12. Teach eval_const_expressions() to handle some more cases.