Tom Lane wrote: > "Daniel Verite" <dan...@manitou-mail.org> writes: > > One consequence of using the "C" collation in the catalog versus > > the db collation is that pg_dump -t with a regexp may not find > > the same tables as before. It happens when these conditions are > > all met: > > - the collation of the database is not "C" > > - the regexp has locale-dependant parts > > - the names to match include characters that are sensitive to > > locale-dependant matching > > Hm, interesting. > > > It seems that to fix that, we could qualify the references to columns such > > as "relname" and "schema_name" with COLLATE "default" clauses in the > > queries that use pattern-matching in client-side tools, AFAICS > > pg_dump and psql. > > Seems reasonable. I was initially worried that this might interfere with > query optimization, but some experimentation says that the planner > successfully derives prefix index clauses anyway (which is correct, > because matching a fixed regex prefix doesn't depend on locale). > > It might be better to attach the COLLATE clause to the pattern constant > instead of the column name; that'd be less likely to break if sent to > an older server. > > > Before going any further with this idea, is there agreement that it's an > > issue to address and does this look like the best way to do that? > > That is a question worth asking. We're going to be forcing people to get > used to this when working directly in SQL, so I don't know if masking it > in a subset of tools is really a win or not.
I think psql and pg_dump need to adjust, just like the 3rd party tools will, at least those that support collation-aware search in the catalog. PFA a patch that implements the slight changes needed. I'll add an entry for it in the next CF. Best regards, -- Daniel Vérité PostgreSQL-powered mailer: http://www.manitou-mail.org Twitter: @DanielVerite
diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 5c1732a..69ac6f9 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -808,6 +808,8 @@ appendReloptionsArray(PQExpBuffer buffer, const char *reloptions, * to limit the set of objects returned. The WHERE clauses are appended * to the already-partially-constructed query in buf. Returns whether * any clause was added. + * The pattern matching uses the collation of the database through explicit + * COLLATE "default" clauses. * * conn: connection query will be sent to (consulted for escaping rules). * buf: output parameter. @@ -971,17 +973,18 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, appendPQExpBuffer(buf, "(%s OPERATOR(pg_catalog.~) ", namevar); appendStringLiteralConn(buf, namebuf.data, conn); + appendPQExpBufferStr(buf, " COLLATE \"default\""); appendPQExpBuffer(buf, "\n OR %s OPERATOR(pg_catalog.~) ", altnamevar); appendStringLiteralConn(buf, namebuf.data, conn); - appendPQExpBufferStr(buf, ")\n"); + appendPQExpBufferStr(buf, " COLLATE \"default\" )\n"); } else { appendPQExpBuffer(buf, "%s OPERATOR(pg_catalog.~) ", namevar); appendStringLiteralConn(buf, namebuf.data, conn); - appendPQExpBufferChar(buf, '\n'); + appendPQExpBufferStr(buf, " COLLATE \"default\"\n"); } } } @@ -997,7 +1000,7 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, WHEREAND(); appendPQExpBuffer(buf, "%s OPERATOR(pg_catalog.~) ", schemavar); appendStringLiteralConn(buf, schemabuf.data, conn); - appendPQExpBufferChar(buf, '\n'); + appendPQExpBufferStr(buf, " COLLATE \"default\"\n"); } } else