Thread: Implementing CustomScan over an index

Implementing CustomScan over an index

From
Chris Cleveland
Date:
I've built a custom type of index. I implemented an index access method, but have run into roadblocks. I need to:

1. See the other quals in the where clause.
2. Extract some things from the projection.
3. Insert some things in the projection.
4. Push some aggregations down into the index.

So I started implementing a CustomScan. It's not trivial.

I've learned that the system executes ExecInitCustomScan automatically, but I probably need it to do most of the stuff in ExecInitIndexScan, and then execute the scan mostly the way it's done in IndexNext.

Basically, I want just a normal index scan, but with the ability to do custom things with the quals and the projection.

So... what's the best approach?

Is there any sample code that does this? A search of github doesn't turn up much.

Is there any way to do this without duplicating everything in nodeIndexscan.c myself?

--
Chris Cleveland
312-339-2677 mobile

Re: Implementing CustomScan over an index

From
Aleksander Alekseev
Date:
Hi,

> So I started implementing a CustomScan. It's not trivial.
>
> I've learned that the system executes ExecInitCustomScan automatically, but I probably need it to do most of the
stuffin ExecInitIndexScan, and then execute the scan mostly the way it's done in IndexNext.
 
>
> Basically, I want just a normal index scan, but with the ability to do custom things with the quals and the
projection.
>
> So... what's the best approach?
>
> Is there any sample code that does this? A search of github doesn't turn up much.
>
> Is there any way to do this without duplicating everything in nodeIndexscan.c myself?

Yes, unfortunately it is not quite trivial.

There is a "Writing a Custom Scan Provider" chapter in the
documentation that may help [1]. TimescaleDB uses CustomScans, maybe
using its code as an example will help [2]. Hint: exploring `git log`
is often helpful too.

If something in the documentation is not clear, maybe it can be
improved. Let us know here or (even better) provide a patch. If you
have a particular piece of code that doesn't do what you want, try
uploading a minimal example on GitHub and asking here.

By a quick look I couldn't find an example of implementing a
CustomScan in ./contrib/ or ./src/test/. If you can think of a usage
example of CustomScans, consider contributing a test case.

[1]: https://www.postgresql.org/docs/current/custom-scan.html
[2]: https://github.com/timescale/timescaledb/


-- 
Best regards,
Aleksander Alekseev