On 10/19/07, Gregory Stark <stark@xxxxxxxxxxxxxxxx> wrote: > "Kynn Jones" <kynnjo@xxxxxxxxx> writes: > > > CREATE OR REPLACE FUNCTION canonicalize( anyelement, anyelement ) > > RETURNS anyarray AS > > $$ > > BEGIN > > IF $1 < $2 THEN RETURN ARRAY[ $1, $2 ]; > > ELSE RETURN ARRAY[ $2, $1 ]; > > END IF; > > END; > > $$ LANGUAGE plpgsql; > > You need to add IMMUTABLE as well. > > > and this function works as expected, but when I try to use it in a > > constraint I get the error: > > > > -> ALTER TABLE foo ADD CONSTRAINT foo_uniq_x_y UNIQUE(canonicalize(x,y)); > > ERROR: 42601: syntax error at or near "(" > > LINE 1: ...E foo ADD CONSTRAINT foo_uniq_x_y UNIQUE(canonicalize(x,y)); > > What you need is: > > CREATE UNIQUE INDEX foo_uniq_x_y on foo (canonicalize(x,y)); Yep, that did the trick. > > I found this puzzling; it's not clear to me why UNIQUE(UPPER(x)) is OK > > syntax but not UNIQUE(my_function(x)). > > Really? It doesn't work for me in the ADD CONSTRAINT syntax. My mistake, sorry. I was probably misremembering something I saw in a CREATE INDEX statement. Thanks! kj ---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings