BUG #5781: unaccent() function should be marked IMMUTABLE

Started by Grant Hutchins and Peter Jarosover 15 years ago7 messagesbugs
Jump to latest

The following bug has been logged online:

Bug reference: 5781
Logged by: Grant Hutchins and Peter Jaros
Email address: grant@pivotallabs.com
PostgreSQL version: 9.0.1
Operating system: Mac OS X 10.6.4
Description: unaccent() function should be marked IMMUTABLE
Details:

The unaccent(text) function supplied by contrib/unaccent is marked VOLATILE.
This prevents it from being used in indexes. We believe that the function
meets the requirements to be marked IMMUTABLE.

=# CREATE TABLE foo ();
CREATE TABLE
=# CREATE INDEX bar ON foo ( unaccent('baz') );
ERROR: functions in index expression must be marked IMMUTABLE
=# ALTER FUNCTION unaccent(text) IMMUTABLE;
ALTER FUNCTION
=# CREATE INDEX bar ON foo ( unaccent('baz') );
CREATE INDEX

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Grant Hutchins and Peter Jaros (#1)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

"Grant Hutchins and Peter Jaros" <grant@pivotallabs.com> writes:

The unaccent(text) function supplied by contrib/unaccent is marked VOLATILE.
This prevents it from being used in indexes. We believe that the function
meets the requirements to be marked IMMUTABLE.

No, it most certainly doesn't. It depends on the behavior of a
dictionary that it has no hard-wired connection to, so the specific
behavior of the dictionary is uncertain. Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Arguably it'd be reasonable to change the function's marking from
volatile to stable, but that's not going to be enough to allow use in
indexes.

regards, tom lane

#3Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#2)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

On Fri, Dec 3, 2010 at 4:50 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Don't we have precedent for this in assuming that things like tsearch
dictionaries and parsers and system locales don't change underneath
us?

--
greg

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#3)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

Greg Stark <gsstark@mit.edu> writes:

On Fri, Dec 3, 2010 at 4:50 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Don't we have precedent for this in assuming that things like tsearch
dictionaries and parsers and system locales don't change underneath
us?

The precedent is to assume such things are stable, not immutable.

Even if you want to assume that, the implementation of unaccent(text) is
such that its results depend on search_path, which is *definitely* not
acceptable for an immutable function. It would need a better way of
tying the function to the dictionary.

regards, tom lane

#5Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#2)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

Tom Lane wrote:

"Grant Hutchins and Peter Jaros" <grant@pivotallabs.com> writes:

The unaccent(text) function supplied by contrib/unaccent is marked VOLATILE.
This prevents it from being used in indexes. We believe that the function
meets the requirements to be marked IMMUTABLE.

No, it most certainly doesn't. It depends on the behavior of a
dictionary that it has no hard-wired connection to, so the specific
behavior of the dictionary is uncertain. Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Arguably it'd be reasonable to change the function's marking from
volatile to stable, but that's not going to be enough to allow use in
indexes.

So, should we change unaccent() from VOLATILE to STABLE?

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

#6Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#5)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

On Wed, Dec 22, 2010 at 8:45 PM, Bruce Momjian <bruce@momjian.us> wrote:

Tom Lane wrote:

"Grant Hutchins and Peter Jaros" <grant@pivotallabs.com> writes:

The unaccent(text) function supplied by contrib/unaccent is marked VOLATILE.
This prevents it from being used in indexes. We believe that the function
meets the requirements to be marked IMMUTABLE.

No, it most certainly doesn't.  It depends on the behavior of a
dictionary that it has no hard-wired connection to, so the specific
behavior of the dictionary is uncertain.  Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Arguably it'd be reasonable to change the function's marking from
volatile to stable, but that's not going to be enough to allow use in
indexes.

So, should we change unaccent() from VOLATILE to STABLE?

Sounds like it, but it doesn't sound like it will help much. :-(

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#7Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#6)
Re: BUG #5781: unaccent() function should be marked IMMUTABLE

Robert Haas wrote:

On Wed, Dec 22, 2010 at 8:45 PM, Bruce Momjian <bruce@momjian.us> wrote:

Tom Lane wrote:

"Grant Hutchins and Peter Jaros" <grant@pivotallabs.com> writes:

The unaccent(text) function supplied by contrib/unaccent is marked VOLATILE.
This prevents it from being used in indexes. We believe that the function
meets the requirements to be marked IMMUTABLE.

No, it most certainly doesn't. ?It depends on the behavior of a
dictionary that it has no hard-wired connection to, so the specific
behavior of the dictionary is uncertain. ?Even if you're willing to
assume that the dictionary being used is the one defined by this
module, that dictionary depends on external configuration files
which are easily changeable.

Arguably it'd be reasonable to change the function's marking from
volatile to stable, but that's not going to be enough to allow use in
indexes.

So, should we change unaccent() from VOLATILE to STABLE?

Sounds like it, but it doesn't sound like it will help much. :-(

OK, done, with attached, applied patch.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

Attachments:

/rtmp/unaccent.difftext/x-diffDownload+4-4