Thread: Polymorphic?

Polymorphic?

From
Itai Zukerman
Date:
I'd like to define a C function that takes two arguments of type
"array of <fixed-length type>" and returns an INT4.  The function
would make use of the <, <=, =, >=, > operators on the base type.  Any
examples of or documentation on how to:

1.  Extract information about the underlying type from the arrays, in   particular the size of the type?

2.  Apply an operator from within C?

-- 
Itai Zukerman  <http://www.math-hat.com/~zukerman/>


Re: Polymorphic?

From
Tom Lane
Date:
Itai Zukerman <zukerman@math-hat.com> writes:
> I'd like to define a C function that takes two arguments of type
> "array of <fixed-length type>" and returns an INT4.  The function
> would make use of the <, <=, =, >=, > operators on the base type.  Any
> examples of or documentation on how to:

> 1.  Extract information about the underlying type from the arrays, in
>     particular the size of the type?
> 2.  Apply an operator from within C?

contrib/array might be a useful example of array manipulation.  As for
the other stuff, do you actually want to invoke those operators
specifically, or are you looking for sorting?  In any case you might
prefer to use any_ordering_op, SelectSortFunction and ApplySortFunction
rather than nailing down your own assumptions about what to compare
with.
        regards, tom lane


Re: Polymorphic?

From
Itai Zukerman
Date:
>> 1.  Extract information about the underlying type from the arrays, in
>>     particular the size of the type?
>> 2.  Apply an operator from within C?
>
> contrib/array might be a useful example of array manipulation.  As for
> the other stuff, do you actually want to invoke those operators
> specifically, or are you looking for sorting?  In any case you might
> prefer to use any_ordering_op, SelectSortFunction and ApplySortFunction
> rather than nailing down your own assumptions about what to compare
> with.

I think ApplySortFunction is exactly what I wanted.

I'm not sure when I'm going to get to it, but what I'd like to do is:
given an existing order relation on a type, extend it to an order on
arrays of that type.  I've done it for INT4[], and it looks like the
general case is possible, just a question of figuring out which pegs
go in which slots.  So far PostgreSQL's been a pleasure to work with;
kudos!
 CREATE FUNCTION arr_int4_lt(int4[], int4[]) RETURNS boolean AS 'arr_ops', 'generic_lt' LANGUAGE 'C' STRICT;
 CREATE FUNCTION arr_foo_lt(foo, foo) RETURNS boolean AS 'arr_ops', 'generic_lt' LANGUAGE 'C' STRICT;

etc.

-- 
Itai Zukerman  <http://www.math-hat.com/~zukerman/>