Custom types and array equality
Hi,
This should be a relatively simple question... I just made a custom type
in C, which I will use to build an array in one of my tables. I defined
an equality function in C, and declared an operator = on my custom type
that calls my equality operator.
Along the lines of:
CREATE OPERATOR = (
leftarg = mytype, rightarg = mytype, procedure = mytype_equal,
commutator = =
);
However, I cant seem to add a useful unique constraint on the table that
includes a column of type mytype[]. When I insert a new record it
complains that it can't find a comparison operator for the type. I did a
bit of digging and found in array.c that error message is produced when
calling array_cmp and the type has no defined comparison operator...
However, should array_eq be called for unique constraints? What am I
missing here to get this system working? The operator itself works when
I call it explicitly on two arrays of mytype.
Thanks for any help ahead of time!
Morgan Kita <mkita@verseon.com> writes:
This should be a relatively simple question... I just made a custom type
in C, which I will use to build an array in one of my tables. ...
However, should array_eq be called for unique constraints? What am I
missing here to get this system working?
array_eq couldn't care less whether you have an operator named '='.
What it wants to find is a default btree index opclass for your datatype.
That represents an actual assertion that the operators behave in a
certain way, whereas an operator merely named '=' might do anything.
There's a fair amount of other infrastructure that also relies on
btree opclasses to tell it how operators behave, so it's worth your
trouble to jump through this hoop.
regards, tom lane