postgresql/contrib/cube/expected/cube_2.out
Tom Lane de1d042f59 Support index-only scans in contrib/cube and contrib/seg GiST indexes.
To do this, we only have to remove the compress and decompress support
functions, which have never done anything more than detoasting.
In the wake of commit d3a4f89d8, this results in automatically enabling
index-only scans, since the core code will now know that the stored
representation is the same as the original data (up to detoasting).

The only exciting part of this is that ALTER OPERATOR FAMILY lacks
a way to drop a support function that was declared as being part of
an opclass rather than being loose in the family.  For the moment,
we'll hack our way to a solution with a manual update of the pg_depend
entry type, which is what distinguishes the two cases.  Perhaps
someday it'll be worth providing a cleaner way to do that, but for
now it seems like a very niche problem.

Note that the underlying C functions remain, to support use of the shared
libraries with older versions of the modules' SQL declarations.  Someday
we may be able to remove them, but not soon.

Andrey Borodin, reviewed by me

Discussion: https://postgr.es/m/D0F53A05-4F4A-4DEC-8339-3C069FA0EE11@yandex-team.ru
2017-11-20 20:25:18 -05:00

1770 lines
35 KiB
Plaintext

--
-- Test cube datatype
--
CREATE EXTENSION cube;
-- Check whether any of our opclasses fail amvalidate
SELECT amname, opcname
FROM pg_opclass opc LEFT JOIN pg_am am ON am.oid = opcmethod
WHERE opc.oid >= 16384 AND NOT amvalidate(opc.oid);
amname | opcname
--------+---------
(0 rows)
--
-- testing the input and output functions
--
-- Any number (a one-dimensional point)
SELECT '1'::cube AS cube;
cube
------
(1)
(1 row)
SELECT '-1'::cube AS cube;
cube
------
(-1)
(1 row)
SELECT '1.'::cube AS cube;
cube
------
(1)
(1 row)
SELECT '-1.'::cube AS cube;
cube
------
(-1)
(1 row)
SELECT '.1'::cube AS cube;
cube
-------
(0.1)
(1 row)
SELECT '-.1'::cube AS cube;
cube
--------
(-0.1)
(1 row)
SELECT '1.0'::cube AS cube;
cube
------
(1)
(1 row)
SELECT '-1.0'::cube AS cube;
cube
------
(-1)
(1 row)
SELECT '1e27'::cube AS cube;
cube
----------
(1e+027)
(1 row)
SELECT '-1e27'::cube AS cube;
cube
-----------
(-1e+027)
(1 row)
SELECT '1.0e27'::cube AS cube;
cube
----------
(1e+027)
(1 row)
SELECT '-1.0e27'::cube AS cube;
cube
-----------
(-1e+027)
(1 row)
SELECT '1e+27'::cube AS cube;
cube
----------
(1e+027)
(1 row)
SELECT '-1e+27'::cube AS cube;
cube
-----------
(-1e+027)
(1 row)
SELECT '1.0e+27'::cube AS cube;
cube
----------
(1e+027)
(1 row)
SELECT '-1.0e+27'::cube AS cube;
cube
-----------
(-1e+027)
(1 row)
SELECT '1e-7'::cube AS cube;
cube
----------
(1e-007)
(1 row)
SELECT '-1e-7'::cube AS cube;
cube
-----------
(-1e-007)
(1 row)
SELECT '1.0e-7'::cube AS cube;
cube
----------
(1e-007)
(1 row)
SELECT '-1.0e-7'::cube AS cube;
cube
-----------
(-1e-007)
(1 row)
SELECT '1e-300'::cube AS cube;
cube
----------
(1e-300)
(1 row)
SELECT '-1e-300'::cube AS cube;
cube
-----------
(-1e-300)
(1 row)
SELECT 'infinity'::cube AS cube;
cube
------------
(Infinity)
(1 row)
SELECT '-infinity'::cube AS cube;
cube
-------------
(-Infinity)
(1 row)
SELECT 'NaN'::cube AS cube;
cube
-------
(NaN)
(1 row)
SELECT '1234567890123456'::cube AS cube;
cube
-------------------------
(1.23456789012346e+015)
(1 row)
SELECT '+1234567890123456'::cube AS cube;
cube
-------------------------
(1.23456789012346e+015)
(1 row)
SELECT '-1234567890123456'::cube AS cube;
cube
--------------------------
(-1.23456789012346e+015)
(1 row)
SELECT '.1234567890123456'::cube AS cube;
cube
---------------------
(0.123456789012346)
(1 row)
SELECT '+.1234567890123456'::cube AS cube;
cube
---------------------
(0.123456789012346)
(1 row)
SELECT '-.1234567890123456'::cube AS cube;
cube
----------------------
(-0.123456789012346)
(1 row)
-- simple lists (points)
SELECT '()'::cube AS cube;
cube
------
()
(1 row)
SELECT '1,2'::cube AS cube;
cube
--------
(1, 2)
(1 row)
SELECT '(1,2)'::cube AS cube;
cube
--------
(1, 2)
(1 row)
SELECT '1,2,3,4,5'::cube AS cube;
cube
-----------------
(1, 2, 3, 4, 5)
(1 row)
SELECT '(1,2,3,4,5)'::cube AS cube;
cube
-----------------
(1, 2, 3, 4, 5)
(1 row)
-- double lists (cubes)
SELECT '(),()'::cube AS cube;
cube
------
()
(1 row)
SELECT '(0),(0)'::cube AS cube;
cube
------
(0)
(1 row)
SELECT '(0),(1)'::cube AS cube;
cube
---------
(0),(1)
(1 row)
SELECT '[(0),(0)]'::cube AS cube;
cube
------
(0)
(1 row)
SELECT '[(0),(1)]'::cube AS cube;
cube
---------
(0),(1)
(1 row)
SELECT '(0,0,0,0),(0,0,0,0)'::cube AS cube;
cube
--------------
(0, 0, 0, 0)
(1 row)
SELECT '(0,0,0,0),(1,0,0,0)'::cube AS cube;
cube
---------------------------
(0, 0, 0, 0),(1, 0, 0, 0)
(1 row)
SELECT '[(0,0,0,0),(0,0,0,0)]'::cube AS cube;
cube
--------------
(0, 0, 0, 0)
(1 row)
SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
cube
---------------------------
(0, 0, 0, 0),(1, 0, 0, 0)
(1 row)
-- invalid input: parse errors
SELECT ''::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT ''::cube AS cube;
^
DETAIL: syntax error at end of input
SELECT 'ABC'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT 'ABC'::cube AS cube;
^
DETAIL: syntax error at or near "A"
SELECT '[]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[]'::cube AS cube;
^
DETAIL: syntax error at or near "]"
SELECT '[()]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[()]'::cube AS cube;
^
DETAIL: syntax error at or near "]"
SELECT '[(1)]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1)]'::cube AS cube;
^
DETAIL: syntax error at or near "]"
SELECT '[(1),]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1),]'::cube AS cube;
^
DETAIL: syntax error at or near "]"
SELECT '[(1),2]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1),2]'::cube AS cube;
^
DETAIL: syntax error at or near "2"
SELECT '[(1),(2),(3)]'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube;
^
DETAIL: syntax error at or near ","
SELECT '1,'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '1,'::cube AS cube;
^
DETAIL: syntax error at end of input
SELECT '1,2,'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '1,2,'::cube AS cube;
^
DETAIL: syntax error at end of input
SELECT '1,,2'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '1,,2'::cube AS cube;
^
DETAIL: syntax error at or near ","
SELECT '(1,)'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,)'::cube AS cube;
^
DETAIL: syntax error at or near ")"
SELECT '(1,2,)'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2,)'::cube AS cube;
^
DETAIL: syntax error at or near ")"
SELECT '(1,,2)'::cube AS cube;
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,,2)'::cube AS cube;
^
DETAIL: syntax error at or near ","
-- invalid input: semantic errors and trailing garbage
SELECT '[(1),(2)],'::cube AS cube; -- 0
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1),(2)],'::cube AS cube;
^
DETAIL: syntax error at or near ","
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1,2,3),(2,3)]'::cube AS cube;
^
DETAIL: Different point dimensions in (1,2,3) and (2,3).
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
ERROR: invalid input syntax for cube
LINE 1: SELECT '[(1,2),(1,2,3)]'::cube AS cube;
^
DETAIL: Different point dimensions in (1,2) and (1,2,3).
SELECT '(1),(2),'::cube AS cube; -- 2
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1),(2),'::cube AS cube;
^
DETAIL: syntax error at or near ","
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2,3),(2,3)'::cube AS cube;
^
DETAIL: Different point dimensions in (1,2,3) and (2,3).
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2),(1,2,3)'::cube AS cube;
^
DETAIL: Different point dimensions in (1,2) and (1,2,3).
SELECT '(1,2,3)ab'::cube AS cube; -- 4
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2,3)ab'::cube AS cube;
^
DETAIL: syntax error at or near "a"
SELECT '(1,2,3)a'::cube AS cube; -- 5
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2,3)a'::cube AS cube;
^
DETAIL: syntax error at or near "a"
SELECT '(1,2)('::cube AS cube; -- 5
ERROR: invalid input syntax for cube
LINE 1: SELECT '(1,2)('::cube AS cube;
^
DETAIL: syntax error at or near "("
SELECT '1,2ab'::cube AS cube; -- 6
ERROR: invalid input syntax for cube
LINE 1: SELECT '1,2ab'::cube AS cube;
^
DETAIL: syntax error at or near "a"
SELECT '1 e7'::cube AS cube; -- 6
ERROR: invalid input syntax for cube
LINE 1: SELECT '1 e7'::cube AS cube;
^
DETAIL: syntax error at or near "e"
SELECT '1,2a'::cube AS cube; -- 7
ERROR: invalid input syntax for cube
LINE 1: SELECT '1,2a'::cube AS cube;
^
DETAIL: syntax error at or near "a"
SELECT '1..2'::cube AS cube; -- 7
ERROR: invalid input syntax for cube
LINE 1: SELECT '1..2'::cube AS cube;
^
DETAIL: syntax error at or near ".2"
SELECT '-1e-700'::cube AS cube; -- out of range
ERROR: "-1e-700" is out of range for type double precision
LINE 1: SELECT '-1e-700'::cube AS cube;
^
--
-- Testing building cubes from float8 values
--
SELECT cube(0::float8);
cube
------
(0)
(1 row)
SELECT cube(1::float8);
cube
------
(1)
(1 row)
SELECT cube(1,2);
cube
---------
(1),(2)
(1 row)
SELECT cube(cube(1,2),3);
cube
---------------
(1, 3),(2, 3)
(1 row)
SELECT cube(cube(1,2),3,4);
cube
---------------
(1, 3),(2, 4)
(1 row)
SELECT cube(cube(cube(1,2),3,4),5);
cube
---------------------
(1, 3, 5),(2, 4, 5)
(1 row)
SELECT cube(cube(cube(1,2),3,4),5,6);
cube
---------------------
(1, 3, 5),(2, 4, 6)
(1 row)
--
-- Test that the text -> cube cast was installed.
--
SELECT '(0)'::text::cube;
cube
------
(0)
(1 row)
--
-- Test the float[] -> cube cast
--
SELECT cube('{0,1,2}'::float[], '{3,4,5}'::float[]);
cube
---------------------
(0, 1, 2),(3, 4, 5)
(1 row)
SELECT cube('{0,1,2}'::float[], '{3}'::float[]);
ERROR: UR and LL arrays must be of same length
SELECT cube(NULL::float[], '{3}'::float[]);
cube
------
(1 row)
SELECT cube('{0,1,2}'::float[]);
cube
-----------
(0, 1, 2)
(1 row)
SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]);
cube_subset
---------------------------
(5, 3, 1, 1),(8, 7, 6, 6)
(1 row)
SELECT cube_subset(cube('(1,3,5),(1,3,5)'), ARRAY[3,2,1,1]);
cube_subset
--------------
(5, 3, 1, 1)
(1 row)
SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[4,0]);
ERROR: Index out of bounds
SELECT cube_subset(cube('(6,7,8),(6,7,8)'), ARRAY[4,0]);
ERROR: Index out of bounds
--
-- Test point processing
--
SELECT cube('(1,2),(1,2)'); -- cube_in
cube
--------
(1, 2)
(1 row)
SELECT cube('{0,1,2}'::float[], '{0,1,2}'::float[]); -- cube_a_f8_f8
cube
-----------
(0, 1, 2)
(1 row)
SELECT cube('{5,6,7,8}'::float[]); -- cube_a_f8
cube
--------------
(5, 6, 7, 8)
(1 row)
SELECT cube(1.37); -- cube_f8
cube
--------
(1.37)
(1 row)
SELECT cube(1.37, 1.37); -- cube_f8_f8
cube
--------
(1.37)
(1 row)
SELECT cube(cube(1,1), 42); -- cube_c_f8
cube
---------
(1, 42)
(1 row)
SELECT cube(cube(1,2), 42); -- cube_c_f8
cube
-----------------
(1, 42),(2, 42)
(1 row)
SELECT cube(cube(1,1), 42, 42); -- cube_c_f8_f8
cube
---------
(1, 42)
(1 row)
SELECT cube(cube(1,1), 42, 24); -- cube_c_f8_f8
cube
-----------------
(1, 42),(1, 24)
(1 row)
SELECT cube(cube(1,2), 42, 42); -- cube_c_f8_f8
cube
-----------------
(1, 42),(2, 42)
(1 row)
SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
cube
-----------------
(1, 42),(2, 24)
(1 row)
--
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
--
select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'::cube;
ERROR: invalid input syntax for cube
LINE 1: select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...
^
DETAIL: A cube cannot have more than 100 dimensions.
select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'::cube;
ERROR: invalid input syntax for cube
LINE 1: select '(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...
^
DETAIL: A cube cannot have more than 100 dimensions.
--
-- testing the operators
--
-- equality/inequality:
--
SELECT '24, 33.20'::cube = '24, 33.20'::cube AS bool;
bool
------
t
(1 row)
SELECT '24, 33.20'::cube != '24, 33.20'::cube AS bool;
bool
------
f
(1 row)
SELECT '24, 33.20'::cube = '24, 33.21'::cube AS bool;
bool
------
f
(1 row)
SELECT '24, 33.20'::cube != '24, 33.21'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
bool
------
f
(1 row)
-- "lower than" / "greater than"
-- (these operators are not useful for anything but ordering)
--
SELECT '1'::cube > '2'::cube AS bool;
bool
------
f
(1 row)
SELECT '1'::cube < '2'::cube AS bool;
bool
------
t
(1 row)
SELECT '1,1'::cube > '1,2'::cube AS bool;
bool
------
f
(1 row)
SELECT '1,1'::cube < '1,2'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0,0,0,0),(3,1,0,0,1)'::cube > '(2,0),(3,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0,0,0,0),(3,1,0,0,1)'::cube < '(2,0),(3,1)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0,0,0,1),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0,0,0,1),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(2,0,0,0,0),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(2,0,0,0,0),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool;
bool
------
f
(1 row)
-- "overlap"
--
SELECT '1'::cube && '1'::cube AS bool;
bool
------
t
(1 row)
SELECT '1'::cube && '2'::cube AS bool;
bool
------
f
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '0'::cube AS bool;
bool
------
t
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '1'::cube AS bool;
bool
------
t
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '1,1,1'::cube AS bool;
bool
------
t
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1,1),(2,2,2)]'::cube AS bool;
bool
------
t
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1),(2,2)]'::cube AS bool;
bool
------
t
(1 row)
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(2,1,1),(2,2,2)]'::cube AS bool;
bool
------
f
(1 row)
-- "contained in" (the left operand is the cube entirely enclosed by
-- the right operand):
--
SELECT '0'::cube <@ '0'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0,0'::cube <@ '0,0,0'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0'::cube <@ '0,0,1'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0,0'::cube <@ '0,0,1'::cube AS bool;
bool
------
f
(1 row)
SELECT '1,0,0'::cube <@ '0,0,1'::cube AS bool;
bool
------
f
(1 row)
SELECT '(1,0,0),(0,0,1)'::cube <@ '(1,0,0),(0,0,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(1,0,0),(0,0,1)'::cube <@ '(-1,-1,-1),(1,1,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(1,0,0),(0,0,1)'::cube <@ '(-1,-1,-1,-1),(1,1,1,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '0'::cube <@ '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '1'::cube <@ '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '-1'::cube <@ '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube <@ '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube <@ '(-1,-1),(1,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-2),(1)'::cube <@ '(-1),(1)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(-2),(1)'::cube <@ '(-1,-1),(1,1)'::cube AS bool;
bool
------
f
(1 row)
-- "contains" (the left operand is the cube that entirely encloses the
-- right operand)
--
SELECT '0'::cube @> '0'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0,0'::cube @> '0,0,0'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0,1'::cube @> '0,0'::cube AS bool;
bool
------
t
(1 row)
SELECT '0,0,1'::cube @> '0,0,0'::cube AS bool;
bool
------
f
(1 row)
SELECT '0,0,1'::cube @> '1,0,0'::cube AS bool;
bool
------
f
(1 row)
SELECT '(1,0,0),(0,0,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1,-1,-1),(1,1,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1,-1,-1,-1),(1,1,1,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube @> '0'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube @> '1'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube @> '-1'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube @> '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1,-1),(1,1)'::cube @> '(-1),(1)'::cube AS bool;
bool
------
t
(1 row)
SELECT '(-1),(1)'::cube @> '(-2),(1)'::cube AS bool;
bool
------
f
(1 row)
SELECT '(-1,-1),(1,1)'::cube @> '(-2),(1)'::cube AS bool;
bool
------
f
(1 row)
-- Test of distance function
--
SELECT cube_distance('(0)'::cube,'(2,2,2,2)'::cube);
cube_distance
---------------
4
(1 row)
SELECT cube_distance('(0)'::cube,'(.3,.4)'::cube);
cube_distance
---------------
0.5
(1 row)
SELECT cube_distance('(2,3,4)'::cube,'(2,3,4)'::cube);
cube_distance
---------------
0
(1 row)
SELECT cube_distance('(42,42,42,42)'::cube,'(137,137,137,137)'::cube);
cube_distance
---------------
190
(1 row)
SELECT cube_distance('(42,42,42)'::cube,'(137,137)'::cube);
cube_distance
------------------
140.762210837994
(1 row)
-- Test of cube function (text to cube)
--
SELECT cube('(1,1.2)'::text);
cube
----------
(1, 1.2)
(1 row)
SELECT cube(NULL);
cube
------
(1 row)
-- Test of cube_dim function (dimensions stored in cube)
--
SELECT cube_dim('(0)'::cube);
cube_dim
----------
1
(1 row)
SELECT cube_dim('(0,0)'::cube);
cube_dim
----------
2
(1 row)
SELECT cube_dim('(0,0,0)'::cube);
cube_dim
----------
3
(1 row)
SELECT cube_dim('(42,42,42),(42,42,42)'::cube);
cube_dim
----------
3
(1 row)
SELECT cube_dim('(4,8,15,16,23),(4,8,15,16,23)'::cube);
cube_dim
----------
5
(1 row)
-- Test of cube_ll_coord function (retrieves LL coordinate values)
--
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 1);
cube_ll_coord
---------------
-1
(1 row)
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 2);
cube_ll_coord
---------------
-2
(1 row)
SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 3);
cube_ll_coord
---------------
0
(1 row)
SELECT cube_ll_coord('(1,2),(1,2)'::cube, 1);
cube_ll_coord
---------------
1
(1 row)
SELECT cube_ll_coord('(1,2),(1,2)'::cube, 2);
cube_ll_coord
---------------
2
(1 row)
SELECT cube_ll_coord('(1,2),(1,2)'::cube, 3);
cube_ll_coord
---------------
0
(1 row)
SELECT cube_ll_coord('(42,137)'::cube, 1);
cube_ll_coord
---------------
42
(1 row)
SELECT cube_ll_coord('(42,137)'::cube, 2);
cube_ll_coord
---------------
137
(1 row)
SELECT cube_ll_coord('(42,137)'::cube, 3);
cube_ll_coord
---------------
0
(1 row)
-- Test of cube_ur_coord function (retrieves UR coordinate values)
--
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 1);
cube_ur_coord
---------------
2
(1 row)
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 2);
cube_ur_coord
---------------
1
(1 row)
SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 3);
cube_ur_coord
---------------
0
(1 row)
SELECT cube_ur_coord('(1,2),(1,2)'::cube, 1);
cube_ur_coord
---------------
1
(1 row)
SELECT cube_ur_coord('(1,2),(1,2)'::cube, 2);
cube_ur_coord
---------------
2
(1 row)
SELECT cube_ur_coord('(1,2),(1,2)'::cube, 3);
cube_ur_coord
---------------
0
(1 row)
SELECT cube_ur_coord('(42,137)'::cube, 1);
cube_ur_coord
---------------
42
(1 row)
SELECT cube_ur_coord('(42,137)'::cube, 2);
cube_ur_coord
---------------
137
(1 row)
SELECT cube_ur_coord('(42,137)'::cube, 3);
cube_ur_coord
---------------
0
(1 row)
-- Test of cube_is_point
--
SELECT cube_is_point('(0)'::cube);
cube_is_point
---------------
t
(1 row)
SELECT cube_is_point('(0,1,2)'::cube);
cube_is_point
---------------
t
(1 row)
SELECT cube_is_point('(0,1,2),(0,1,2)'::cube);
cube_is_point
---------------
t
(1 row)
SELECT cube_is_point('(0,1,2),(-1,1,2)'::cube);
cube_is_point
---------------
f
(1 row)
SELECT cube_is_point('(0,1,2),(0,-1,2)'::cube);
cube_is_point
---------------
f
(1 row)
SELECT cube_is_point('(0,1,2),(0,1,-2)'::cube);
cube_is_point
---------------
f
(1 row)
-- Test of cube_enlarge (enlarging and shrinking cubes)
--
SELECT cube_enlarge('(0)'::cube, 0, 0);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(0)'::cube, 0, 1);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(0)'::cube, 0, 2);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(2),(-2)'::cube, 0, 4);
cube_enlarge
--------------
(-2),(2)
(1 row)
SELECT cube_enlarge('(0)'::cube, 1, 0);
cube_enlarge
--------------
(-1),(1)
(1 row)
SELECT cube_enlarge('(0)'::cube, 1, 1);
cube_enlarge
--------------
(-1),(1)
(1 row)
SELECT cube_enlarge('(0)'::cube, 1, 2);
cube_enlarge
-----------------
(-1, -1),(1, 1)
(1 row)
SELECT cube_enlarge('(2),(-2)'::cube, 1, 4);
cube_enlarge
-------------------------------
(-3, -1, -1, -1),(3, 1, 1, 1)
(1 row)
SELECT cube_enlarge('(0)'::cube, -1, 0);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(0)'::cube, -1, 1);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(0)'::cube, -1, 2);
cube_enlarge
--------------
(0)
(1 row)
SELECT cube_enlarge('(2),(-2)'::cube, -1, 4);
cube_enlarge
--------------
(-1),(1)
(1 row)
SELECT cube_enlarge('(0,0,0)'::cube, 1, 0);
cube_enlarge
------------------------
(-1, -1, -1),(1, 1, 1)
(1 row)
SELECT cube_enlarge('(0,0,0)'::cube, 1, 2);
cube_enlarge
------------------------
(-1, -1, -1),(1, 1, 1)
(1 row)
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 1, 2);
cube_enlarge
-----------------
(-4, -3),(3, 8)
(1 row)
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 3, 2);
cube_enlarge
------------------
(-6, -5),(5, 10)
(1 row)
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -1, 2);
cube_enlarge
-----------------
(-2, -1),(1, 6)
(1 row)
SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -3, 2);
cube_enlarge
---------------------
(-0.5, 1),(-0.5, 4)
(1 row)
SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -23, 5);
cube_enlarge
--------------
(42, 0, 0)
(1 row)
SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -24, 5);
cube_enlarge
--------------
(42, 0, 0)
(1 row)
-- Test of cube_union (MBR for two cubes)
--
SELECT cube_union('(1,2),(3,4)'::cube, '(5,6,7),(8,9,10)'::cube);
cube_union
----------------------
(1, 2, 0),(8, 9, 10)
(1 row)
SELECT cube_union('(1,2)'::cube, '(4,2,0,0)'::cube);
cube_union
---------------------------
(1, 2, 0, 0),(4, 2, 0, 0)
(1 row)
SELECT cube_union('(1,2),(1,2)'::cube, '(4,2),(4,2)'::cube);
cube_union
---------------
(1, 2),(4, 2)
(1 row)
SELECT cube_union('(1,2),(1,2)'::cube, '(1,2),(1,2)'::cube);
cube_union
------------
(1, 2)
(1 row)
SELECT cube_union('(1,2),(1,2)'::cube, '(1,2,0),(1,2,0)'::cube);
cube_union
------------
(1, 2, 0)
(1 row)
-- Test of cube_inter
--
SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (16,15)'::cube); -- intersects
cube_inter
-----------------
(3, 4),(10, 11)
(1 row)
SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (6,5)'::cube); -- includes
cube_inter
---------------
(3, 4),(6, 5)
(1 row)
SELECT cube_inter('(1,2),(10,11)'::cube, '(13,14), (16,15)'::cube); -- no intersection
cube_inter
-------------------
(13, 14),(10, 11)
(1 row)
SELECT cube_inter('(1,2),(10,11)'::cube, '(3,14), (16,15)'::cube); -- no intersection, but one dimension intersects
cube_inter
------------------
(3, 14),(10, 11)
(1 row)
SELECT cube_inter('(1,2),(10,11)'::cube, '(10,11), (16,15)'::cube); -- point intersection
cube_inter
------------
(10, 11)
(1 row)
SELECT cube_inter('(1,2,3)'::cube, '(1,2,3)'::cube); -- point args
cube_inter
------------
(1, 2, 3)
(1 row)
SELECT cube_inter('(1,2,3)'::cube, '(5,6,3)'::cube); -- point args
cube_inter
---------------------
(5, 6, 3),(1, 2, 3)
(1 row)
-- Test of cube_size
--
SELECT cube_size('(4,8),(15,16)'::cube);
cube_size
-----------
88
(1 row)
SELECT cube_size('(42,137)'::cube);
cube_size
-----------
0
(1 row)
-- Test of distances
--
SELECT cube_distance('(1,1)'::cube, '(4,5)'::cube);
cube_distance
---------------
5
(1 row)
SELECT '(1,1)'::cube <-> '(4,5)'::cube as d_e;
d_e
-----
5
(1 row)
SELECT distance_chebyshev('(1,1)'::cube, '(4,5)'::cube);
distance_chebyshev
--------------------
4
(1 row)
SELECT '(1,1)'::cube <=> '(4,5)'::cube as d_c;
d_c
-----
4
(1 row)
SELECT distance_taxicab('(1,1)'::cube, '(4,5)'::cube);
distance_taxicab
------------------
7
(1 row)
SELECT '(1,1)'::cube <#> '(4,5)'::cube as d_t;
d_t
-----
7
(1 row)
-- zero for overlapping
SELECT cube_distance('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube);
cube_distance
---------------
0
(1 row)
SELECT distance_chebyshev('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube);
distance_chebyshev
--------------------
0
(1 row)
SELECT distance_taxicab('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube);
distance_taxicab
------------------
0
(1 row)
-- coordinate access
SELECT cube(array[10,20,30], array[40,50,60])->1;
?column?
----------
10
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])->1;
?column?
----------
40
(1 row)
SELECT cube(array[10,20,30], array[40,50,60])->6;
?column?
----------
60
(1 row)
SELECT cube(array[10,20,30], array[40,50,60])->0;
ERROR: cube index 0 is out of bounds
SELECT cube(array[10,20,30], array[40,50,60])->7;
ERROR: cube index 7 is out of bounds
SELECT cube(array[10,20,30], array[40,50,60])->-1;
ERROR: cube index -1 is out of bounds
SELECT cube(array[10,20,30], array[40,50,60])->-6;
ERROR: cube index -6 is out of bounds
SELECT cube(array[10,20,30])->3;
?column?
----------
30
(1 row)
SELECT cube(array[10,20,30])->6;
?column?
----------
30
(1 row)
SELECT cube(array[10,20,30])->-6;
ERROR: cube index -6 is out of bounds
-- "normalized" coordinate access
SELECT cube(array[10,20,30], array[40,50,60])~>1;
?column?
----------
10
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])~>1;
?column?
----------
10
(1 row)
SELECT cube(array[10,20,30], array[40,50,60])~>2;
?column?
----------
20
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])~>2;
?column?
----------
20
(1 row)
SELECT cube(array[10,20,30], array[40,50,60])~>3;
?column?
----------
30
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])~>3;
?column?
----------
30
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])~>0;
ERROR: cube index 0 is out of bounds
SELECT cube(array[40,50,60], array[10,20,30])~>4;
?column?
----------
40
(1 row)
SELECT cube(array[40,50,60], array[10,20,30])~>(-1);
ERROR: cube index -1 is out of bounds
-- Load some example data and build the index
--
CREATE TABLE test_cube (c cube);
\copy test_cube from 'data/test_cube.data'
CREATE INDEX test_cube_ix ON test_cube USING gist (c);
SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' ORDER BY c;
c
--------------------------
(337, 455),(240, 359)
(759, 187),(662, 163)
(1444, 403),(1346, 344)
(1594, 1043),(1517, 971)
(2424, 160),(2424, 81)
(5 rows)
-- Test sorting
SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c;
c
--------------------------
(337, 455),(240, 359)
(759, 187),(662, 163)
(1444, 403),(1346, 344)
(1594, 1043),(1517, 971)
(2424, 160),(2424, 81)
(5 rows)
-- Test index-only scans
SET enable_bitmapscan = false;
EXPLAIN (COSTS OFF)
SELECT c FROM test_cube WHERE c <@ '(3000,1000),(0,0)' ORDER BY c;
QUERY PLAN
--------------------------------------------------------
Sort
Sort Key: c
-> Index Only Scan using test_cube_ix on test_cube
Index Cond: (c <@ '(3000, 1000),(0, 0)'::cube)
(4 rows)
SELECT c FROM test_cube WHERE c <@ '(3000,1000),(0,0)' ORDER BY c;
c
-------------------------
(337, 455),(240, 359)
(759, 187),(662, 163)
(1444, 403),(1346, 344)
(2424, 160),(2424, 81)
(4 rows)
RESET enable_bitmapscan;
-- kNN with index
SELECT *, c <-> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <-> '(100, 100),(500, 500)'::cube LIMIT 5;
c | dist
-------------------------+------------------
(337, 455),(240, 359) | 0
(759, 187),(662, 163) | 162
(948, 1201),(907, 1156) | 772.000647668122
(1444, 403),(1346, 344) | 846
(369, 1457),(278, 1409) | 909
(5 rows)
SELECT *, c <=> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <=> '(100, 100),(500, 500)'::cube LIMIT 5;
c | dist
-------------------------+------
(337, 455),(240, 359) | 0
(759, 187),(662, 163) | 162
(948, 1201),(907, 1156) | 656
(1444, 403),(1346, 344) | 846
(369, 1457),(278, 1409) | 909
(5 rows)
SELECT *, c <#> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <#> '(100, 100),(500, 500)'::cube LIMIT 5;
c | dist
-------------------------+------
(337, 455),(240, 359) | 0
(759, 187),(662, 163) | 162
(1444, 403),(1346, 344) | 846
(369, 1457),(278, 1409) | 909
(948, 1201),(907, 1156) | 1063
(5 rows)
-- kNN-based sorting
SELECT * FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by 1st coordinate of lower left corner
c
---------------------------
(54, 38679),(3, 38602)
(83, 10271),(15, 10265)
(122, 46832),(64, 46762)
(167, 17214),(92, 17184)
(161, 24465),(107, 24374)
(162, 26040),(120, 25963)
(154, 4019),(138, 3990)
(259, 1850),(175, 1820)
(207, 40886),(179, 40879)
(288, 49588),(204, 49571)
(270, 32616),(226, 32607)
(318, 31489),(235, 31404)
(337, 455),(240, 359)
(270, 29508),(264, 29440)
(369, 1457),(278, 1409)
(15 rows)
SELECT * FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by 2nd coordinate or upper right corner
c
---------------------------
(30333, 50),(30273, 6)
(43301, 75),(43227, 43)
(19650, 142),(19630, 51)
(2424, 160),(2424, 81)
(3449, 171),(3354, 108)
(18037, 155),(17941, 109)
(28511, 208),(28479, 114)
(19946, 217),(19941, 118)
(16906, 191),(16816, 139)
(759, 187),(662, 163)
(22684, 266),(22656, 181)
(24423, 255),(24360, 213)
(45989, 249),(45910, 222)
(11399, 377),(11360, 294)
(12162, 389),(12103, 309)
(15 rows)
SELECT * FROM test_cube ORDER BY c~>1 DESC LIMIT 15; -- descending by 1st coordinate of lower left corner
c
-------------------------------
(50027, 49230),(49951, 49214)
(49980, 35004),(49937, 34963)
(49985, 6436),(49927, 6338)
(49999, 27218),(49908, 27176)
(49954, 1340),(49905, 1294)
(49944, 25163),(49902, 25153)
(49981, 34876),(49898, 34786)
(49957, 43390),(49897, 43384)
(49853, 18504),(49848, 18503)
(49902, 41752),(49818, 41746)
(49907, 30225),(49810, 30158)
(49843, 5175),(49808, 5145)
(49887, 24274),(49805, 24184)
(49847, 7128),(49798, 7067)
(49820, 7990),(49771, 7967)
(15 rows)
SELECT * FROM test_cube ORDER BY c~>4 DESC LIMIT 15; -- descending by 2nd coordinate or upper right corner
c
-------------------------------
(36311, 50073),(36258, 49987)
(30746, 50040),(30727, 49992)
(2168, 50012),(2108, 49914)
(21551, 49983),(21492, 49885)
(17954, 49975),(17865, 49915)
(3531, 49962),(3463, 49934)
(19128, 49932),(19112, 49849)
(31287, 49923),(31236, 49913)
(43925, 49912),(43888, 49878)
(29261, 49910),(29247, 49818)
(14913, 49873),(14849, 49836)
(20007, 49858),(19921, 49778)
(38266, 49852),(38233, 49844)
(37595, 49849),(37581, 49834)
(46151, 49848),(46058, 49830)
(15 rows)
-- same thing for index with points
CREATE TABLE test_point(c cube);
INSERT INTO test_point(SELECT cube(array[c->1,c->2,c->3,c->4]) FROM test_cube);
CREATE INDEX ON test_point USING gist(c);
SELECT * FROM test_point ORDER BY c~>1, c~>2 LIMIT 15; -- ascending by 1st then by 2nd coordinate
c
--------------------------
(54, 38679, 3, 38602)
(83, 10271, 15, 10265)
(122, 46832, 64, 46762)
(154, 4019, 138, 3990)
(161, 24465, 107, 24374)
(162, 26040, 120, 25963)
(167, 17214, 92, 17184)
(207, 40886, 179, 40879)
(259, 1850, 175, 1820)
(270, 29508, 264, 29440)
(270, 32616, 226, 32607)
(288, 49588, 204, 49571)
(318, 31489, 235, 31404)
(326, 18837, 285, 18817)
(337, 455, 240, 359)
(15 rows)
SELECT * FROM test_point ORDER BY c~>4 DESC LIMIT 15; -- descending by 1st coordinate
c
------------------------------
(30746, 50040, 30727, 49992)
(36311, 50073, 36258, 49987)
(3531, 49962, 3463, 49934)
(17954, 49975, 17865, 49915)
(2168, 50012, 2108, 49914)
(31287, 49923, 31236, 49913)
(21551, 49983, 21492, 49885)
(43925, 49912, 43888, 49878)
(19128, 49932, 19112, 49849)
(38266, 49852, 38233, 49844)
(14913, 49873, 14849, 49836)
(37595, 49849, 37581, 49834)
(46151, 49848, 46058, 49830)
(29261, 49910, 29247, 49818)
(19233, 49824, 19185, 49794)
(15 rows)