-- Check whether any of our opclasses fail amvalidate SELECT amname, opcname FROM pg_opclass opc LEFTJOIN pg_am am ON am.oid = opcmethod WHERE opc.oid >= 16384ANDNOT amvalidate(opc.oid);
-- -- testing the input and output functions --
-- Any number (a one-dimensional point) SELECT'1'::cube AS cube; SELECT'-1'::cube AS cube; SELECT'1.'::cube AS cube; SELECT'-1.'::cube AS cube; SELECT'.1'::cube AS cube; SELECT'-.1'::cube AS cube; SELECT'1.0'::cube AS cube; SELECT'-1.0'::cube AS cube; SELECT'infinity'::cube AS cube; SELECT'-infinity'::cube AS cube; SELECT'NaN'::cube AS cube; SELECT'.1234567890123456'::cube AS cube; SELECT'+.1234567890123456'::cube AS cube; SELECT'-.1234567890123456'::cube AS cube;
-- simple lists (points) SELECT'()'::cube AS cube; SELECT'1,2'::cube AS cube; SELECT'(1,2)'::cube AS cube; SELECT'1,2,3,4,5'::cube AS cube; SELECT'(1,2,3,4,5)'::cube AS cube;
-- double lists (cubes) SELECT'(),()'::cube AS cube; SELECT'(0),(0)'::cube AS cube; SELECT'(0),(1)'::cube AS cube; SELECT'[(0),(0)]'::cube AS cube; SELECT'[(0),(1)]'::cube AS cube; SELECT'(0,0,0,0),(0,0,0,0)'::cube AS cube; SELECT'(0,0,0,0),(1,0,0,0)'::cube AS cube; SELECT'[(0,0,0,0),(0,0,0,0)]'::cube AS cube; SELECT'[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
-- invalid input: parse errors SELECT''::cube AS cube; SELECT'ABC'::cube AS cube; SELECT'[]'::cube AS cube; SELECT'[()]'::cube AS cube; SELECT'[(1)]'::cube AS cube; SELECT'[(1),]'::cube AS cube; SELECT'[(1),2]'::cube AS cube; SELECT'[(1),(2),(3)]'::cube AS cube; SELECT'1,'::cube AS cube; SELECT'1,2,'::cube AS cube; SELECT'1,,2'::cube AS cube; SELECT'(1,)'::cube AS cube; SELECT'(1,2,)'::cube AS cube; SELECT'(1,,2)'::cube AS cube;
-- invalid input: semantic errors and trailing garbage SELECT'[(1),(2)],'::cube AS cube; -- 0 SELECT'[(1,2,3),(2,3)]'::cube AS cube; -- 1 SELECT'[(1,2),(1,2,3)]'::cube AS cube; -- 1 SELECT'(1),(2),'::cube AS cube; -- 2 SELECT'(1,2,3),(2,3)'::cube AS cube; -- 3 SELECT'(1,2),(1,2,3)'::cube AS cube; -- 3 SELECT'(1,2,3)ab'::cube AS cube; -- 4 SELECT'(1,2,3)a'::cube AS cube; -- 5 SELECT'(1,2)('::cube AS cube; -- 5 SELECT'1,2ab'::cube AS cube; -- 6 SELECT'1 e7'::cube AS cube; -- 6 SELECT'1,2a'::cube AS cube; -- 7 SELECT'1..2'::cube AS cube; -- 7 SELECT'-1e-700'::cube AS cube; -- out of range
-- Also try it with non-error-throwing API SELECT pg_input_is_valid('(1,2)', 'cube'); SELECT pg_input_is_valid('[(1),]', 'cube'); SELECT pg_input_is_valid('-1e-700', 'cube'); SELECT * FROM pg_input_error_info('-1e-700', 'cube');
-- -- Testing building cubes from float8 values --
-- -- Test that the text -> cube cast was installed. --
SELECT'(0)'::text::cube;
-- -- Test the float[] -> cube cast -- SELECT cube('{0,1,2}'::float[], '{3,4,5}'::float[]); SELECT cube('{0,1,2}'::float[], '{3}'::float[]); SELECT cube(NULL::float[], '{3}'::float[]); SELECT cube('{0,1,2}'::float[]); SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]); SELECT cube_subset(cube('(1,3,5),(1,3,5)'), ARRAY[3,2,1,1]); SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[4,0]); SELECT cube_subset(cube('(6,7,8),(6,7,8)'), ARRAY[4,0]); -- test for limits: this should pass SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT1as a FROM generate_series(1,100))); -- and this should fail SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT1as a FROM generate_series(1,101)));
-- -- Testing limit of CUBE_MAX_DIM dimensions check in cube_in. -- -- create too big cube from literal 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; 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; -- from an array select cube(array(SELECT0as a FROM generate_series(1,101))); select cube(array(SELECT0as a FROM generate_series(1,101)),array(SELECT0as a FROM generate_series(1,101)));
-- extend cube beyond limit -- this should work select cube(array(SELECT0as a FROM generate_series(1,100))); select cube(array(SELECT0as a FROM generate_series(1,100)),array(SELECT0as a FROM generate_series(1,100))); -- this should fail select cube(cube(array(SELECT0as a FROM generate_series(1,100))), 0); select cube(cube(array(SELECT0as a FROM generate_series(1,100)),array(SELECT0as a FROMgenerate_series(1,100))), 0, 0);
-- -- testing the operators --
-- equality/inequality: -- SELECT'24, 33.20'::cube = '24, 33.20'::cube AS bool; SELECT'24, 33.20'::cube != '24, 33.20'::cube AS bool; SELECT'24, 33.20'::cube = '24, 33.21'::cube AS bool; SELECT'24, 33.20'::cube != '24, 33.21'::cube AS bool; SELECT'(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool; SELECT'(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool;
-- "lower than" / "greater than" -- (these operators are not useful for anything but ordering) -- SELECT'1'::cube > '2'::cube AS bool; SELECT'1'::cube < '2'::cube AS bool; SELECT'1,1'::cube > '1,2'::cube AS bool; SELECT'1,1'::cube < '1,2'::cube AS bool;
SELECT'(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool; SELECT'(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,1)'::cube AS bool; SELECT'(2,0),(3,1)'::cube > '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool; SELECT'(2,0),(3,1)'::cube < '(2,0,0,0,1),(3,1,0,0,0)'::cube AS bool; SELECT'(2,0),(3,1)'::cube > '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool; SELECT'(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,0)'::cube AS bool; SELECT'(2,0,0,0,0),(3,1,0,0,1)'::cube > '(2,0),(3,1)'::cube AS bool; SELECT'(2,0,0,0,0),(3,1,0,0,1)'::cube < '(2,0),(3,1)'::cube AS bool; SELECT'(2,0,0,0,1),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool; SELECT'(2,0,0,0,1),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool; SELECT'(2,0,0,0,0),(3,1,0,0,0)'::cube > '(2,0),(3,1)'::cube AS bool; SELECT'(2,0,0,0,0),(3,1,0,0,0)'::cube < '(2,0),(3,1)'::cube AS bool;
-- "overlap" -- SELECT'1'::cube && '1'::cube AS bool; SELECT'1'::cube && '2'::cube AS bool;
SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '0'::cube AS bool; SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '1'::cube AS bool; SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '1,1,1'::cube AS bool; SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1,1),(2,2,2)]'::cube AS bool; SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1),(2,2)]'::cube AS bool; SELECT'[(-1,-1,-1),(1,1,1)]'::cube && '[(2,1,1),(2,2,2)]'::cube AS bool;
-- "contained in" (the left operand is the cube entirely enclosed by -- the right operand): -- SELECT'0'::cube <@ '0'::cube AS bool; SELECT'0,0,0'::cube <@ '0,0,0'::cube AS bool; SELECT'0,0'::cube <@ '0,0,1'::cube AS bool; SELECT'0,0,0'::cube <@ '0,0,1'::cube AS bool; SELECT'1,0,0'::cube <@ '0,0,1'::cube AS bool; SELECT'(1,0,0),(0,0,1)'::cube <@ '(1,0,0),(0,0,1)'::cube AS bool; SELECT'(1,0,0),(0,0,1)'::cube <@ '(-1,-1,-1),(1,1,1)'::cube AS bool; SELECT'(1,0,0),(0,0,1)'::cube <@ '(-1,-1,-1,-1),(1,1,1,1)'::cube AS bool; SELECT'0'::cube <@ '(-1),(1)'::cube AS bool; SELECT'1'::cube <@ '(-1),(1)'::cube AS bool; SELECT'-1'::cube <@ '(-1),(1)'::cube AS bool; SELECT'(-1),(1)'::cube <@ '(-1),(1)'::cube AS bool; SELECT'(-1),(1)'::cube <@ '(-1,-1),(1,1)'::cube AS bool; SELECT'(-2),(1)'::cube <@ '(-1),(1)'::cube AS bool; SELECT'(-2),(1)'::cube <@ '(-1,-1),(1,1)'::cube AS bool;
-- "contains" (the left operand is the cube that entirely encloses the -- right operand) -- SELECT'0'::cube @> '0'::cube AS bool; SELECT'0,0,0'::cube @> '0,0,0'::cube AS bool; SELECT'0,0,1'::cube @> '0,0'::cube AS bool; SELECT'0,0,1'::cube @> '0,0,0'::cube AS bool; SELECT'0,0,1'::cube @> '1,0,0'::cube AS bool; SELECT'(1,0,0),(0,0,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool; SELECT'(-1,-1,-1),(1,1,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool; SELECT'(-1,-1,-1,-1),(1,1,1,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS bool; SELECT'(-1),(1)'::cube @> '0'::cube AS bool; SELECT'(-1),(1)'::cube @> '1'::cube AS bool; SELECT'(-1),(1)'::cube @> '-1'::cube AS bool; SELECT'(-1),(1)'::cube @> '(-1),(1)'::cube AS bool; SELECT'(-1,-1),(1,1)'::cube @> '(-1),(1)'::cube AS bool; SELECT'(-1),(1)'::cube @> '(-2),(1)'::cube AS bool; SELECT'(-1,-1),(1,1)'::cube @> '(-2),(1)'::cube AS bool;
-- Test of distance function -- SELECT cube_distance('(0)'::cube,'(2,2,2,2)'::cube); SELECT cube_distance('(0)'::cube,'(.3,.4)'::cube); SELECT cube_distance('(2,3,4)'::cube,'(2,3,4)'::cube); SELECT cube_distance('(42,42,42,42)'::cube,'(137,137,137,137)'::cube); SELECT cube_distance('(42,42,42)'::cube,'(137,137)'::cube);
-- Test of cube function (text to cube) -- SELECT cube('(1,1.2)'::text); SELECT cube(NULL);
-- Test of cube_dim function (dimensions stored in cube) -- SELECT cube_dim('(0)'::cube); SELECT cube_dim('(0,0)'::cube); SELECT cube_dim('(0,0,0)'::cube); SELECT cube_dim('(42,42,42),(42,42,42)'::cube); SELECT cube_dim('(4,8,15,16,23),(4,8,15,16,23)'::cube);
-- Load some example data and build the index -- CREATETABLE test_cube (c cube);
\copy test_cube from'data/test_cube.data'
CREATEINDEX test_cube_ix ON test_cube USING gist (c); SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)'ORDERBY c;
-- Test sorting SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)'GROUPBY c ORDERBY c;
-- Test index-only scans SET enable_bitmapscan = false; EXPLAIN (COSTS OFF) SELECT c FROM test_cube WHERE c <@ '(3000,1000),(0,0)'ORDERBY c; SELECT c FROM test_cube WHERE c <@ '(3000,1000),(0,0)'ORDERBY c;
RESET enable_bitmapscan;
-- Test kNN INSERTINTO test_cube VALUES ('(1,1)'), ('(100000)'), ('(0, 100000)'); -- Some corner cases SET enable_seqscan = false;
-- Test different metrics SET extra_float_digits = 0; SELECT *, c <-> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <-> '(100, 100),(500, 500)'::cube LIMIT5;
RESET extra_float_digits; SELECT *, c <=> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <=> '(100, 100),(500, 500)'::cube LIMIT5; SELECT *, c <#> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <#> '(100, 100),(500, 500)'::cube LIMIT5;
-- Test sorting by coordinates SELECT c~>1, c FROM test_cube ORDERBY c~>1LIMIT15; -- ascending by left bound SELECT c~>2, c FROM test_cube ORDERBY c~>2LIMIT15; -- ascending by right bound SELECT c~>3, c FROM test_cube ORDERBY c~>3LIMIT15; -- ascending by lower bound SELECT c~>4, c FROM test_cube ORDERBY c~>4LIMIT15; -- ascending by upper bound SELECT c~>(-1), c FROM test_cube ORDERBY c~>(-1) LIMIT15; -- descending by left bound SELECT c~>(-2), c FROM test_cube ORDERBY c~>(-2) LIMIT15; -- descending by right bound SELECT c~>(-3), c FROM test_cube ORDERBY c~>(-3) LIMIT15; -- descending by lower bound SELECT c~>(-4), c FROM test_cube ORDERBY c~>(-4) LIMIT15; -- descending by upper bound
-- Same queries with sequential scan (should give the same results as above)
RESET enable_seqscan; SET enable_indexscan = OFF; SET extra_float_digits = 0; SELECT *, c <-> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <-> '(100, 100),(500, 500)'::cube LIMIT5;
RESET extra_float_digits; SELECT *, c <=> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <=> '(100, 100),(500, 500)'::cube LIMIT5; SELECT *, c <#> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDERBY c <#> '(100, 100),(500, 500)'::cube LIMIT5; SELECT c~>1, c FROM test_cube ORDERBY c~>1LIMIT15; -- ascending by left bound SELECT c~>2, c FROM test_cube ORDERBY c~>2LIMIT15; -- ascending by right bound SELECT c~>3, c FROM test_cube ORDERBY c~>3LIMIT15; -- ascending by lower bound SELECT c~>4, c FROM test_cube ORDERBY c~>4LIMIT15; -- ascending by upper bound SELECT c~>(-1), c FROM test_cube ORDERBY c~>(-1) LIMIT15; -- descending by left bound SELECT c~>(-2), c FROM test_cube ORDERBY c~>(-2) LIMIT15; -- descending by right bound SELECT c~>(-3), c FROM test_cube ORDERBY c~>(-3) LIMIT15; -- descending by lower bound SELECT c~>(-4), c FROM test_cube ORDERBY c~>(-4) LIMIT15; -- descending by upper bound
RESET enable_indexscan;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.