When you write an application involving foreign tables, you frequently end up with queries that are just too inefficient because they bring too much data over from the foreign server. For a trivial example, consider "SELECT count(*) FROM t" where t is a foreign table. This will pull the entire table over the network just to count up the rows. If the writer of the foreign data wrapper was clever enough, this may only pull one column from the foreign server, but that can still be a lot of data.
To solve (or work around) this problem, it would be convenient to have a pass-through query mechanism associated with foreign servers. A pass-through query would look like a table function, but would use the name of the foreign server as the function name. For example: CREATE SERVER foo ...; CREATE USER MAPPING ...; CREATE FOREIGN TABLE t (...) SERVER foo ... OPTIONS (table 't'); SELECT size FROM foo('SELECT count(*) FROM t') AS t(size BIGINT); The SELECT above will execute the quoted string as a query on the foreign server represented by foo. (Notice that only the CREATE SERVER and CREATE USER MAPPING are needed for the SELECT to work. I just added the CREATE FOREIGN TABLE for context.) I can think of two ways to implement this. I think it would pretty easy to just add a table function foo that does the right thing. This would require the author of the foreign data wrapper to provide another callback function to send the query and get back the results. Such a callback function would largely duplicate the functionality of the current callback functions and --because of the current implementation of table functions-- it would materialize the entire result set before returning it. A more difficult solution (for me, at least) would be to construct a sort of temporary foreign table from the pass-through query then let it go through the usual foreign-table handling code. This also would require some changes to foreign data wrappers. Current wrappers have to construct a query to scan a foreign table but with a pass-through query the query is already constructed. But this probably requires less work for the authors of foreign data wrappers and it doesn't materialize the results of the foreign query unnecessarily. Any suggestions or hints? Regards, David Gudeman http://unobtainabol.blogspot.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers