Hi hackers,

We use postgres_fdw to connect two databases. Both DBs have an extension installed which provides a custom string data type. Our extension is known to the FDW as we created the foreign server with our extension listed in the "extensions" option.

The filter clause of the query SELECT * FROM test WHERE col = 'foo' OR col = 'bar' is pushed down to the remote, while the filter clause of the semantically equivalent query SELECT * FROM test WHERE col IN ('foo', 'bar') is not.

I traced this down to getExtensionOfObject() called from lookup_shippable(). getExtensionOfObject() doesn't recurse but only checks first level dependencies and only checks for extension dependencies. However, the IN operator takes an array of our custom data type as argument (type is typically prefixed with _ in pg_type). This array type is only dependent on our extension via the custom data type in two steps which postgres_fdw doesn't see. Therefore, postgres_fdw doesn't allow for push-down of the IN.

Thoughts?

--
David Geier
(ServiceNow)



Reply via email to