I've sorted this one thanks to John Berkus. Thanks guys. I've included the solution below for your interest.
======================================================= DROP TABLE rtest; DROP INDEX rtest_xz_index; DROP INDEX rtest_yz_index; DROP INDEX rtest_xy_index; CREATE TABLE rtest ( xz BOX, yz BOX, xy BOX); CREATE INDEX rtest_xz_index ON rtest USING RTREE (xz bigbox_ops); CREATE INDEX rtest_yz_index ON rtest USING RTREE (yz bigbox_ops); CREATE INDEX rtest_xy_index ON rtest USING RTREE (xy bigbox_ops); DROP FUNCTION cube (float,float,float, float,float,float); CREATE FUNCTION cube (float,float,float,float,float,float) RETURNS text AS 'DECLARE x1 ALIAS FOR $1; y1 ALIAS FOR $2; z1 ALIAS FOR $3; x2 ALIAS FOR $4; y2 ALIAS FOR $5; z2 ALIAS FOR $6; xz_ BOX; yz_ BOX; xy_ BOX; left VARCHAR; right VARCHAR; BEGIN left := to_char(x1,''99999.999'') || '','' || to_char(z1,''99999.999''); right := to_char(x2,''99999.999'') || '','' || to_char(z2,''99999.999''); xz_ := left || '','' || right; left := to_char(y1,''99999.999'') || '','' || to_char(z1,''99999.999''); right := to_char(y2,''99999.999'') || '','' || to_char(z2,''99999.999''); yz_ := left || '','' || right; left := to_char(x1,''99999.999'') || '','' || to_char(y1,''99999.999''); right := to_char(x2,''99999.999'') || '','' || to_char(y2,''99999.999''); xy_ := left || '','' || right; INSERT INTO rtest(xz,yz,xy) VALUES (xz_, yz_, xy_); RETURN null; END;' LANGUAGE 'plpgsql'; SELECT cube(1,2,3,10,20,30); SELECT * FROM rtest ORDER BY xz USING <<; SELECT xy, yz, xz FROM rtest WHERE xz @ '(0.0,0.0),(2.5,2.5)'::box AND yz @ '(0.0,0.0),(2.5,2.5)'::box AND xy @ '(0.0,0.0),(2.5,2.5)'::box ORDER BY xy USING <<; ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])