select_common_collation callers way too ready to throw error

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Peter Eisentraut <peter_e(at)gmx(dot)net>
Cc: pgsql-hackers(at)postgreSQL(dot)org
Subject: select_common_collation callers way too ready to throw error
Date: 2011-03-09 23:07:12
Message-ID: 6738.1299712032@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

db1=# create table t1 (f1 text collate "aa_DJ.utf8",
f2 text collate "an_ES.utf8" );
CREATE TABLE
db1=# select f1 < f2 from t1;
ERROR: collation mismatch between implicit collations "aa_DJ.utf8" and "an_ES.utf8"
LINE 1: select f1 < f2 from t1;
^
HINT: You can override the collation by applying the COLLATE clause to one or both expressions.
db1=# select f1 || f2 from t1;
ERROR: collation mismatch between implicit collations "aa_DJ.utf8" and "an_ES.utf8"
LINE 1: select f1 || f2 from t1;
^
HINT: You can override the collation by applying the COLLATE clause to one or both expressions.

The first of these errors is OK, but surely the second is not, because ||
doesn't give a fig about collations. I think instead of this:

/* XXX: If we knew which functions required collation information,
* we could selectively set the last argument to true here. */
funccollid = select_common_collation(pstate, fargs, false);

we need:

/*
* If we knew which functions required collation information,
* we could selectively set the last argument to false here,
* allowing the error to be reported at parse time not runtime.
*/
funccollid = select_common_collation(pstate, fargs, true);

Now the downside of that is that a runtime failure won't give you an
parse error pointer to indicate which function is having trouble ...
but having an error pointer for an error that shouldn't be thrown in
the first place is small consolation.

regards, tom lane

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Anton 2011-03-09 23:08:16 Re: Native XML
Previous Message Tom Lane 2011-03-09 21:49:28 FuncExpr.collid/OpExpr.collid unworkably serving double duty