Re: BUG #16583: merge join on tables with different DB collation behind postgres_fdw fails
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: jurafejfar@gmail.com
Cc: pgsql-bugs@lists.postgresql.org
Date: 2020-08-17T15:26:48Z
Lists: pgsql-bugs, pgsql-hackers
PG Bug reporting form <noreply@postgresql.org> writes: > Joining two identical tables placed on separate DBs with different collation > accessed through postgres_fdw failed when joined with merge join. Some > records are missing (7 vs. 16 rows in example) in output. See this snippet > https://gitlab.com/-/snippets/2004522 (or code pasted below) for psql script > reproducing error also with expected output (working fine on alpine linux). So I think what is happening here is that postgres_fdw's version of IMPORT FOREIGN SCHEMA translates "COLLATE default" on the remote server to "COLLATE default" on the local one, which of course is a big fail if the defaults don't match. That allows the local planner to believe that remote ORDER BYs on the two foreign tables will give compatible results, causing the merge join to not work very well at all. We probably need to figure out some way of substituting the remote database's actual lc_collate setting when we see "COLLATE default". I'm also thinking that the documentation is way too cavalier about dismissing non-matching collation names by just saying that you can turn off import_collate. The fact is that doing so is likely to be disastrous, the more so the more optimization intelligence we add to postgres_fdw. I wonder if we could do something like this: * Change postgresImportForeignSchema() as above, so that it will never apply "COLLATE default" to an imported column, except in the case where you turn off import_collate. * In postgres_fdw planning, treat "COLLATE default" on a foreign table column as meaning "we don't know the collation"; never believe that that column can be ordered in a way that matches any local collation. (It'd be better perhaps if there were an explicit way to say "COLLATE unknown", but I hesitate to invent such a concept in general.) * Document that in manual creation of a postgres_fdw foreign table with a text column, you need to explicitly write the correct collation if you want the best query plans to be generated. This seems like too big a behavioral change to consider back-patching, unfortunately. regards, tom lane
Commits
-
Doc: extend warnings about collation-mismatch hazards in postgres_fdw.
- 2aa255588756 9.6.24 landed
- 1d7e8e772453 10.19 landed
- b274c982db67 11.14 landed
- 97c5651cea0f 12.9 landed
- 7b0be9fb2ddd 15.0 landed
- 739b872f6c98 13.5 landed
- 02c4e3533926 14.0 landed
-
Add support for asynchronous execution.
- 27e1f14563cf 14.0 cited
-
Suppress unnecessary RelabelType nodes in yet more cases.
- 814a57065ec9 12.5 landed
- 69ffc2f83899 13.0 landed
- 207293240780 14.0 landed