Re: proposal: searching in array function - array_position

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Petr Jelinek <petr(at)2ndquadrant(dot)com>, Jim Nasby <Jim(dot)Nasby(at)bluetreble(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: proposal: searching in array function - array_position
Date: 2015-03-10 18:27:16
Message-ID: CAFj8pRATG-0fQoC7NxDqVws8ak1R0VL7vg51JAYTn7rAMm1xPg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

2015-03-10 15:30 GMT+01:00 Robert Haas <robertmhaas(at)gmail(dot)com>:

> On Sat, Mar 7, 2015 at 1:06 PM, Petr Jelinek <petr(at)2ndquadrant(dot)com> wrote:
> > You still duplicate the type cache code, but many other array functions
> do
> > that too so I will not hold that against you. (Maybe somebody should
> write
> > separate patch that would put all that duplicate code into common
> function?)
> >
> > I think this patch is ready for committer so I am going to mark it as
> such.
>
> The documentation in this patch needs some improvements to the
> English. Can anyone help with that?
>
> The documentation should discuss what happens if the array is
> multi-dimensional.
>
> The code for array_offset and for array_offset_start appear to be
> byte-for-byte identical. There's no comment explaining why, but I bet
> it's to make the opr_sanity test pass. How about adding a comment?
>
> The comment for array_offset_common refers to array_offset_start as
> array_offset_startpos.
>

yes, it is a reason. I'll comment it.

>
> I am sure in agreement with the idea that it would be good to factor
> out the common typecache code (for setting up my_extra). Any chance
> we get a preliminary patch that does that refactoring, and then rebase
> the main patch on top of it? I agree that it's not really this
> patch's job to solve that problem, but it would be nice.
>

The common part is following code:

my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,

sizeof(ArrayMetaState));
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}

and

if (my_extra->element_type != element_type)
{
get_typlenbyvalalign(element_type,
&my_extra->typlen,
&my_extra->typbyval,
&my_extra->typalign);

my_extra->element_type = element_type;
}

so we can design function like

(ArrayMetaState *)
GetCachedArrayMetaState(FunctionCallInfo fcinfo, Oid element_type, bool
*reused)
{
ArrayMetaState *state = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
if (state == NULL)
{
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,

sizeof(ArrayMetaState));
state = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
state->element_type = ~element_type;
}
if (state->element_type != element_type)
{
get_typlenbyvalalign(element_type,
&my_extra->typlen,
&my_extra->typbyval,
&my_extra->typalign);

state->element_type = element_type;
*resused = false;
}
else
*reused = true;
}

Usage in code:

array_state = GetCachedArrayMetaState(fceinfo, element_type, &reused);
if (!reused)
{
// some other initialization
}

The content is relatively clean, but the most big problem is naming (as
usual)

Comments?

Regards

Pavel

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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2015-03-10 18:28:14 Re: Doing better at HINTing an appropriate column within errorMissingColumn()
Previous Message Robert Haas 2015-03-10 18:15:38 Re: Precedence of standard comparison operators