Re: [HACKERS] [PATCH] Generic type subscripting

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Dmitry Dolgov <9erthalion6(at)gmail(dot)com>
Cc: Nikita Glukhov <n(dot)gluhov(at)postgrespro(dot)ru>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, David Fetter <david(at)fetter(dot)org>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Thomas Munro <thomas(dot)munro(at)enterprisedb(dot)com>, Oleksandr Shulgin <oleksandr(dot)shulgin(at)zalando(dot)de>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Robert Haas <robertmhaas(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, Oleg Bartunov <obartunov(at)gmail(dot)com>, Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com>, David Steele <david(at)pgmasters(dot)net>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [HACKERS] [PATCH] Generic type subscripting
Date: 2020-02-13 09:15:14
Message-ID: CAFj8pRB5DrNAVv7_OoVLu8Dfd21Nba_9WOh7QA3CD0aLtTO6tQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi

čt 19. 12. 2019 v 15:20 odesílatel Dmitry Dolgov <9erthalion6(at)gmail(dot)com>
napsal:

> > On Sun, Nov 10, 2019 at 01:32:08PM +0100, Dmitry Dolgov wrote:
> >
> > > I had to write new assignment logic reusing only some parts of
> setPath(),
> > > because the loop in setPath() should be broken on every level. During
> this
> > > process, I decided to implement assignment behavior similar to
> PostgreSQL's
> > > array behavior and added two new features:
> > > - creation of jsonb arrays/objects container from NULL values
> > > - appending/prepending array elements on the specified position, gaps
> filled
> > > with nulls (JavaScript has similar behavior)
> >
> > What is the reason for the last one?
>
> I've splitted the last patch into polymorphic itself and jsonb array
> behaviour changes, since I'm afraid it could be a questionable part.
>

I tested last set of patches.

I like patch 0006 - filling gaps by NULLs - it fixed my objections if I
remember correctly. Patch 0005 - polymorphic subscribing - I had not a
idea, what is a use case? Maybe can be good to postpone this patch. I have
not strong opinion about it, but generally is good to reduce size of
initial patch. I have nothing against a compatibility with SQL, but this
case doesn't looks too realistic for me, and can be postponed without
future compatibility issues.

I did some notes:

It needs rebase, I had to fix some issues.

I miss deeper comments for

+static Oid
+findTypeSubscriptingFunction(List *procname, Oid typeOid, bool parseFunc)

+/* Callback function signatures --- see xsubscripting.sgml for more info.
*/
+typedef SubscriptingRef * (*SubscriptingPrepare) (bool isAssignment,
SubscriptingRef *sbsef);
+
+typedef SubscriptingRef * (*SubscriptingValidate) (bool isAssignment,
SubscriptingRef *sbsef,
+<-><--><--><--><--><--><--><--><--><--><--><--> struct ParseState
*pstate);
+
+typedef Datum (*SubscriptingFetch) (Datum source, struct
SubscriptingRefState *sbsrefstate);
+
+typedef Datum (*SubscriptingAssign) (Datum source, struct
SubscriptingRefState *sbrsefstate);
+
+typedef struct SubscriptRoutines
+{
+<->SubscriptingPrepare><-->prepare; #### .
+<->SubscriptingValidate<-->validate;
+<->SubscriptingFetch<-><-->fetch;
+<->SubscriptingAssign<><-->assign;
+
+} SubscriptRoutines;
+

regress tests fails

+Datum
+array_subscript_fetch(Datum containerSource, SubscriptingRefState *sbstate)

there is a variable "is_slice". Original code had not this variable.
Personally I think so original code was better readable without this
variable.

so instead

+<->if (is_slice)
+<->{
+<-><-->for(i = 0; i < sbstate->numlower; i++)
+<-><--><-->l_index.indx[i] = DatumGetInt32(sbstate->lowerindex[i]);
+<->}

is more readable

if (sbstate->numlower > 0)
{
/* read lower part of indexes */
for (i = 0; i < sbstate->numlower; ...

I miss comments (what is checked here - some like - subscript have to be
int4 and number of subscripts should be less than MAXDIM)

+
+SubscriptingRef *
+array_subscript_prepare(bool isAssignment, SubscriptingRef *sbsref)

+SubscriptingRef *
+array_subscript_validate(bool isAssignment, SubscriptingRef *sbsref,
+<-><--><--><--><--> ParseState *pstate)

Regression tests fails - see a attachment

I really miss a PLpgSQL support

postgres=# do $$
declare j jsonb = '{"a":10, "b":20}';
begin
raise notice '%', j;
raise notice '%', j['a'];
j['a'] = '20';
raise notice '%', j;
end;
$$;
NOTICE: {"a": 10, "b": 20}
NOTICE: 10
ERROR: subscripted object is not an array
CONTEXT: PL/pgSQL function inline_code_block line 6 at assignment

With PLpgSQL support it will be great patch, and really important
functionality. It can perfectly cover some gaps of plpgsql.

Regards

Pavel

Attachment Content-Type Size
regression.out application/octet-stream 13.1 KB
regression.diffs application/octet-stream 2.3 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Julien Rouhaud 2020-02-13 09:39:45 Re: [PATCH] Erase the distinctClause if the result is unique by definition
Previous Message Julien Rouhaud 2020-02-13 09:14:28 Re: backend type in log_line_prefix?