Re: Changing SQL Inlining Behaviour (or...?) - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Changing SQL Inlining Behaviour (or...?)
Date
Msg-id 26877.1547949235@sss.pgh.pa.us
Whole thread Raw
In response to Re: Changing SQL Inlining Behaviour (or...?)  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Changing SQL Inlining Behaviour (or...?)  (Paul Ramsey <pramsey@cleverelephant.ca>)
Re: Changing SQL Inlining Behaviour (or...?)  (Andres Freund <andres@anarazel.de>)
List pgsql-hackers
I wrote:
> Paul Ramsey <pramsey@cleverelephant.ca> writes:
>> Is there a rule of thumb we can use in costing our wrappers to ensure that they always inline?

> Not really, which is a weak spot of this whole approach.

BTW, it suddenly strikes me that at least for the specific cases you've
shown in this thread, worrying about forcing inlining despite multiple
parameter occurrences is solving the wrong problem.  As I understand it,
what you're doing is basically expanding some_operation(x,y) into

    x indexable_operator y AND exact_condition(x,y)

where exact_condition(x,y) is semantically identical to
some_operation(x,y), and the point of the maneuver is to inject
an indexable operator that implements some lossy form of the
exact_condition.  But this is not an ideal solution: aside
from the possible cost of evaluating x and y twice, adding
the indexable_operator is just a dead loss if you don't end up
with an indexscan on x.

So ISTM what we *really* want is that the wrapper function is
just an alias for exact_condition() --- which eliminates the
multiple-evaluation hazards and hence the risk of not inlining ---
and then teach the planner how to extract the indexable_operator
when, and only when, it's actually useful for an indexscan.

The machinery for that sort of thing already exists; it's what
indxpath.c calls a "special index operator".  But right now it's
only applied to some built-in operators such as LIKE.  I've had
a personal TODO item for a very long time to make that ability
accessible to extensions, but it never rose to the top of the
queue.  Maybe we should be trying to make that happen, instead
of messing around with dubious changes to the inlining rules.

Does this line of thought seem like it would fix your problem,
or are there places where the inlining rules are causing you
issues but the use-case doesn't look like "add a lossy indexable
operator"?

            regards, tom lane


pgsql-hackers by date:

Previous
From: Andrew Gierth
Date:
Subject: Re: Thread-unsafe coding in ecpg
Next
From: Tom Lane
Date:
Subject: Re: Thread-unsafe coding in ecpg