Bug: citext not working in non-public schema

Lists: pgsql-hackers
From: Anders Steinlein <anders(at)steinlein(dot)no>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Bug: citext not working in non-public schema
Date: 2010-10-25 19:46:02
Message-ID: 4CC5DE7A.5050103@steinlein.no
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Researching a nasty bug discovered in our application led me to this bug
report and its follow-ups:
http://archives.postgresql.org/pgsql-bugs/2010-03/msg00058.php

This bit us hard (on PostgreSQL 8.4.4). We have a custom domain for
email addresses based on citext, placed in the public schema, while each
user of our application has their own private schemas. The search path
is set to their private schemas, and the few queries which required
explicit access to the type prefixes the type with the public schema,
i.e. WHERE 'text(at)example(dot)com'::public.email = email_column.

This *seems* to work, in that no error or warning is thrown, but
comparisons are simply silently wrong. This led to a nasty bug in our
application as it broke our expectation that the database should enforce
this case-insensitive checks.

Any possibility of getting this fixed? Obliviously I would prefer citext
to work as advertised across schemas. If not, an out-right error thrown
would be much better and consistent than the current situation.

Regards,
-- anders


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Anders Steinlein <anders(at)steinlein(dot)no>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Bug: citext not working in non-public schema
Date: 2010-10-25 22:51:40
Message-ID: 8155.1288047100@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Anders Steinlein <anders(at)steinlein(dot)no> writes:
> http://archives.postgresql.org/pgsql-bugs/2010-03/msg00058.php

> This bit us hard (on PostgreSQL 8.4.4). We have a custom domain for
> email addresses based on citext, placed in the public schema, while each
> user of our application has their own private schemas. The search path
> is set to their private schemas, and the few queries which required
> explicit access to the type prefixes the type with the public schema,
> i.e. WHERE 'text(at)example(dot)com'::public.email = email_column.

Put the citext stuff in a schema that *is* in everyone's search path.
It doesn't have to be "public", but it does have to be visible.

> Any possibility of getting this fixed? Obliviously I would prefer citext
> to work as advertised across schemas. If not, an out-right error thrown
> would be much better and consistent than the current situation.

The only way to have an error be thrown would be if you remove the
implicit cast from citext to text ... which is going to be a far worse
notational pain in the rear than fixing your search_path.

regards, tom lane