Обсуждение: How to inspect tuples during execution of a plan?
Hello all,
I'd like to inspect the content of tuples as they are sent during the
execution of a query in order to react to their values.
I guess I could do it with a FDW, but that's a bit clumsy so I took a
look at the hooks but have two questions:
1.) Would ExecutorRun_hook be the correct place to implement such an
'tuple inspector'?
2.) If yes, how? As far as I understand the source code, I would have
to provide my own implementation based on standard_ExecutorRun and
replace the ExecutePlan function with my own one that takes a look at
each 'slot' like so
if (estate->es_junkFilter != NULL)1589 slot = ExecFilterJunk(estate->es_junkFilter, slot);1590
Tuple inspection here
1591 /*1592 * If we are supposed to send the tuple somewhere, do so. (In1593 * practice, this
isprobably always the case at this point.)1594 */1595 if (sendTuples)1596 {
If there is a better way, please advise. I'm really a newbie to this.
Best regards,
Ernst-Georg Schmid
On Mon, Oct 10, 2016 at 1:39 PM, Ernst-Georg Schmid
<ernst.georg.schmid@googlemail.com> wrote:
> Hello all,
>
> I'd like to inspect the content of tuples as they are sent during the
> execution of a query in order to react to their values.
The correct answer will depend upon the purpose of this inspection.
You may write a function, which can be invoked through a query
wrapping the original query OR you may add a new planner code (check
custom scans) which does the inspection. These are many ways to do
this with different degrees of invasive-ness. They may or may not
suite your purpose.
>
> I guess I could do it with a FDW, but that's a bit clumsy so I took a
> look at the hooks but have two questions:
>
> 1.) Would ExecutorRun_hook be the correct place to implement such an
> 'tuple inspector'?
> 2.) If yes, how? As far as I understand the source code, I would have
> to provide my own implementation based on standard_ExecutorRun and
> replace the ExecutePlan function with my own one that takes a look at
> each 'slot' like so
>
> if (estate->es_junkFilter != NULL)
> 1589 slot = ExecFilterJunk(estate->es_junkFilter, slot);
> 1590
>
> Tuple inspection here
>
> 1591 /*
> 1592 * If we are supposed to send the tuple somewhere, do so. (In
> 1593 * practice, this is probably always the case at this point.)
> 1594 */
> 1595 if (sendTuples)
> 1596 {
>
> If there is a better way, please advise. I'm really a newbie to this.
Either of those would do, if you want to write change the executor.
--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company
Hello, > > Either of those would do, if you want to write change the executor. > I used the ExeceutorRun_hook and it seems to work. The drawback is, that I have to provide my own implementation of ExecutePlan() which could make it incompatible over versions of PostgreSQL. I don't know how stable that function is over time. https://github.com/ergo70/pg_sentinel Thank you, Ernst-Georg
On 10/12/16 2:58 AM, Ernst-Georg Schmid wrote: >> Either of those would do, if you want to write change the executor. >> > > I used the ExeceutorRun_hook and it seems to work. The drawback is, > that I have to provide my own implementation of ExecutePlan() which > could make it incompatible over versions of PostgreSQL. I don't know > how stable that function is over time. There might be another possibility, which would be to use one of the earlier hooks to change the query destination, and to implement a custom receiver. -- Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX Experts in Analytics, Data Architecture and PostgreSQL Data in Trouble? Get it in Treble! http://BlueTreble.com 855-TREBLE2 (855-873-2532) mobile: 512-569-9461