Re: Newbie, Howto access Array-Slots in user defined functions? - Mailing list pgsql-general

From Tom Lane
Subject Re: Newbie, Howto access Array-Slots in user defined functions?
Date
Msg-id 18185.970892876@sss.pgh.pa.us
Whole thread Raw
In response to Re: Newbie, Howto access Array-Slots in user defined functions?  (100.179370@germanynet.de (Martin Jacobs))
Responses Re: Newbie, Howto access Array-Slots in user defined functions?  (100.179370@germanynet.de (Martin Jacobs))
List pgsql-general
100.179370@germanynet.de (Martin Jacobs) writes:
>     CREATE FUNCTION lessbyte (_bytea, _bytea) RETURNS bool AS
>     'SELECT $1[1] < $2[1];' LANGUAGE 'sql';
> ERROR:  Unable to identify an operator '<' for types 'bytea' and 'bytea'
>         You will have to retype this query using an explicit cast

There is nothing wrong with your syntax --- you've declared a function
that takes two arrays of bytea, selects the first element of each, and
compares 'em.  But bytea doesn't support comparison operators ... or
much of anything, actually.  There is a get_byte function, so you could
conceivably build what you want starting with

create function lessbyte(bytea, bytea) returns bool as
'select get_byte($1,0) < get_byte($2,0)' language 'sql';

However, I don't see any reasonable way to deal with variable-length
inputs without a loop, and SQL functions don't have looping constructs.

Given the lack of operators, type bytea isn't currently useful for
much except plain storage and retrieval of raw byte sequences.
Have you got a strong reason for using bytea, rather than some
better-supported type like text?  Heck, even array of char would
work better:

regression=# CREATE FUNCTION lessbyte(_char, _char) returns bool as
regression-# 'SELECT $1[1] < $2[1];' LANGUAGE 'sql';
CREATE

            regards, tom lane

pgsql-general by date:

Previous
From:
Date:
Subject: Re: Re: URL Type
Next
From: Michael Meskes
Date:
Subject: Re: Using UnixODBC and postgresql