Thread: Polymorphic?
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/>
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
>> 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/>