On Tue, 2002-09-10 at 17:22, Vanmunin Chea wrote:
> Hey Tom,
>
> Thanks for the tips, Tom. I have that feeling from the start
> (with the two different implementation) but never actually have a chance
> to confirm with someone.
>
> 1. It there a way to store the dynamic array at all ?
>
>
> I notice psql has a similar type - Single Dynamic Dimensional
> Array. However there isn't any built in operators(<,<=,==,>,>=) for Array
> to do sorting.
>
> 2. Can I write one up ?
See attachment.
Unfortunately I ran out of time before figuring out how to make btree
index use it ;(
Also, in 7.3 there are a lot more ops for in contrib/intarray than was
in 7.2.
-------------
Hannu
CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS
'/usr/lib/pgsql/plpgsql.so' LANGUAGE 'C';
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
HANDLER plpgsql_call_handler
LANCOMPILER 'PL/pgSQL';
-- first the 'worker' function
DROP FUNCTION intarray_compare(INT[],INT[]);
CREATE FUNCTION intarray_compare(INT[],INT[]) RETURNS INT AS '
DECLARE
I INTEGER := 1;
BEGIN
LOOP
IF ($1[I] > $2[I]) THEN
RETURN 1;
ELSE
IF ($1[I] < $2[I]) THEN
RETURN -1;
END IF;
END IF;
IF ($1[I] IS NULL) THEN
IF ($2[I] IS NULL) THEN RETURN 0; END IF;
RETURN -1;
END IF;
IF ($2[I] IS NULL) THEN RETURN 1; END IF;
I := I + 1;
EXIT WHEN I > 1000;
END LOOP;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_gt(INT[],INT[]);
create FUNCTION intarray_gt(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) = 1;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_gte(INT[],INT[]);
create FUNCTION intarray_gte(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) >= 0;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_lt(INT[],INT[]);
create FUNCTION intarray_lt(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) = -1;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_lte(INT[],INT[]);
create FUNCTION intarray_lte(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) <= 0;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_eq(INT[],INT[]);
create FUNCTION intarray_eq(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) = 0;
END;
' LANGUAGE 'plpgsql';
DROP FUNCTION intarray_neq(INT[],INT[]);
create FUNCTION intarray_neq(INT[],INT[]) RETURNS BOOLEAN AS '
BEGIN
RETURN intarray_compare($1,$2) != 0;
END;
' LANGUAGE 'plpgsql';
-- now greate the operators
CREATE OPERATOR < (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_lt,
commutator = > ,
negator = >=
);
CREATE OPERATOR <= (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_lte,
commutator = >= ,
negator = >
);
CREATE OPERATOR > (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_gt,
commutator = < ,
negator = <=
);
CREATE OPERATOR >= (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_gte,
commutator = <= ,
negator = <
);
CREATE OPERATOR = (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_eq,
commutator = = ,
negator = !=
);
CREATE OPERATOR != (
leftarg = INT[],
rightarg = INT[],
procedure = intarray_neq,
commutator = != ,
negator = =
);
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly