Hackers,

I am trying to do something like this:

    CREATE TYPE source AS ENUM(
        'fred', 'wilma', 'barney', 'betty'
    );

    CREATE EXTENSION btree_gist;

    CREATE TABLE things (
        source source NOT NULL,
        within tstzrange NOT NULL,
        EXCLUDE USING gist (source WITH =, within WITH &&)
    );

Alas, enums are not supported by btree_gist:

    try.sql:13: ERROR:  data type source has no default operator class for 
access method "gist"
    HINT:  You must specify an operator class for the index or define a default 
operator class for the data type.

Well, maybe I can cast it? But no, changing the EXCLUDE line to

        EXCLUDE USING gist (source::text WITH =, within WITH &&)

Yields a syntax error:

    try.sql:13: ERROR:  syntax error at or near "::"
    LINE 4:     EXCLUDE USING gist (source::text WITH =, within WITH &&)

So that's out. Why shouldn't :: be allowed?

No problem, I can use CAST(), right? So I try:

        EXCLUDE USING gist (CAST(source AS text) WITH =, within WITH &&)

Not so much:

    try.sql:13: ERROR:  functions in index expression must be marked IMMUTABLE

I guess it's because locale settings might change, and therefore change the 
text representation? Seems unlikely, though.

I guess I can create my own IMMUTABLE function over the ENUM:

    CREATE FUNCTION source_to_text(
        source
    ) RETURNS TEXT LANGUAGE sql STRICT IMMUTABLE AS $$
        SELECT $1::text;
    $$;

So this works:

    EXCLUDE USING gist (source_to_text(source) WITH =, within WITH &&)

So I guess that’s good enough for now. But should :: really be a syntax error 
in index expressions?

Thanks,

David

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to