Repeated array type info caching code

Поиск
Список
Период
Сортировка
От Craig Ringer
Тема Repeated array type info caching code
Дата
Msg-id 51F20A13.7060308@2ndquadrant.com
обсуждение исходный текст
Список pgsql-hackers
Hi all

While reading the array functions in varlena.c, arrayfuncs.c and
array_userfuncs.c, I noticed code to cache the array type info in
fn_extra repeated three times, and in adding an "array_idx" function
(generic version of intarray's 'idx') I'm expecting to need a fourth copy.

The ArrayMetaState type is already shared between all these usages. Is
there any reason the lookup its self isn't?

Would it be reasonable to define something along the lines of:

get_cached_arrmetastate(arrayv, fcinfo);

to populate a ArrayMetaState pointed to by fc_extra, allocating it if
necessary? So the resulting code would instead become at most:

   ArrayMetaState * my_extra;   ArrayType      * v = PG_GETARG_ARRAYTYPE_P(0);   int16       typlen;   bool
typbyval;  char        typalign;   /* ... */   my_extra = get_cached_arrmetastate(v, fcinfo);   typlen =
my_extra->typlen;  typbyval = my_extra->typbyval;   typalign = my_extra->typalign;
 


instead of:

   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;   }
 
   if (my_extra->element_type != element_type)   {       /*        * Get info about element type, including its output
     * conversion proc        */       get_type_io_data(element_type, IOFunc_output,
&my_extra->typlen,&my_extra->typbyval,                        &my_extra->typalign, &my_extra->typdelim,
      &my_extra->typioparam, &my_extra->typiofunc);       fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
         fcinfo->flinfo->fn_mcxt);       my_extra->element_type = element_type;   }   typlen = my_extra->typlen;
typbyval= my_extra->typbyval;   typalign = my_extra->typalign;
 


?

If nobody yells "idiot" I'll follow up with a patch in a bit, as the
alternative of copying and pasting that code squicks me a bit.

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



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alvaro Herrera
Дата:
Сообщение: Re: ALTER SYSTEM SET command to change postgresql.conf parameters (RE: Proposal for Allow postgresql.conf values to be changed via SQL [review])
Следующее
От: didier
Дата:
Сообщение: Re: Design proposal: fsync absorb linear slider