>
> >
> > Would you be ok with a function like attribute_statistics_update, but
> purely with cstring args? Obviously the callers would have to modify their
> calls each time a new stat param is added, but that is seemingly preferable
> for you than the current situation.
>
> I feel pretty strongly that we want a way to identify the relation by
> OID rather than by schema and name.


Previous versions of pg_set_attribute_stats() were like that, but it went
away as the use-cases folded into pg_restore_attribute_stats(). So it's
do-able, but will make sharing code with the existing function harder in
the near term. We may have to settle for something that takes the oid, but
then plugs into the existing functions until such time as we can refactor
the existing callers.


> I'm not sure whether attributes
> should be identified by name or by number in this context. Apart from
> those things, if passing strings and leaving it up to the called
> function to interpret them makes most sense, that's OK with me.
>

Identifying attributes by attnum is mostly for index expressions, so
attname would be the preference here.


> I agree with you that getting rid of SPI is a much higher priority
> than getting rid of the FunctionCallInfo stuff altogether. I could
> live with DirectFunctionCall if we don't have a better option.
>

Ok, good to know that I have that as a fallback position.

I think the right first step is to create the functions
import_relation_stats() and import_attribute_stats() which take the oid of
the destination relation and the rest of the parameters are const char
pointers, which is the ideal case for a bunch of values being fetched from
PQgetValue(). Those functions will for now just make the call to
attribute_statistics_update() / relation_statistics_update(), but at least
it will be localized inside relation_stats.c and attribute_stats.c where we
can make internal refactors without disturbing anyone else.

Now, we *could* make these 2 new functions take the oid/oid+attname
followed by a variadic array of keyname+value string pairs like the
existing pg_restore_*_stats() functions, so the functions call signature
would be somewhat future-proofed. Let me know if that violates your vision
of what this should be.


>  I'm a
> bit suspicious that this will lead to code bloat in postgres_fdw or
> elsewhere, but maybe not.
>

postgres_fdw will get slimmer for not having SPI in it. relation_stats.c
and attribute_stats.c will have some temporary bloat until things can be
refactored.

Reply via email to