Dimension limit in contrib/cube (dump/restore hazard?)
contrib/cube has an arbitrary limit of 100 on the number of dimensions
in a cube, but it actually enforces that only in cube_in and
cube_enlarge, with the other cube creation functions happy to create
cubes of more dimensions.
I haven't actually tested, but this implies that one can create cubes
that will break dump/restore.
Should this limit be kept, and if so what should it be? (There's
obviously a limit on the size of indexable cubes)
(Noticed because an irc user was trying to use cubes with 512
dimensions with partial success)
--
Andrew (irc:RhodiumToad)
Hi!
28 авг. 2018 г., в 8:29, Andrew Gierth <andrew@tao11.riddles.org.uk> написал(а):
contrib/cube has an arbitrary limit of 100 on the number of dimensions
in a cube, but it actually enforces that only in cube_in and
cube_enlarge, with the other cube creation functions happy to create
cubes of more dimensions.I haven't actually tested, but this implies that one can create cubes
that will break dump/restore.Should this limit be kept, and if so what should it be? (There's
obviously a limit on the size of indexable cubes)(Noticed because an irc user was trying to use cubes with 512
dimensions with partial success)
+1
This can cause very unpleasant fails like
postgres=# create table y as select cube(array(SELECT random() as a FROM generate_series(1,1000))) from generate_series(1,1e3,1);
SELECT 1000
postgres=# create index on y using gist(cube );
ERROR: index row size 8016 exceeds maximum 8152 for index "y_cube_idx"
postgres=# create table y as select cube(array(SELECT random() as a FROM generate_series(1,800))) from generate_series(1,1e3,1);
SELECT 1000
postgres=# create index on y using gist(cube );
ERROR: failed to add item to index page in "y_cube_idx"
I belive cube construction from array\arrays should check size of arrays.
Also there are some unexpected cube dimensionality reduction like in cube_enlarge
if (n > CUBE_MAX_DIM)
n = CUBE_MAX_DIM;
You wanted larger cube, but got cube of another dimension.
I think we should something like this
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index dfa8465d74..38739b1df2 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -151,6 +151,12 @@ cube_a_f8_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (ARRNELEMS(ll) != dim)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
@@ -208,6 +214,11 @@ cube_a_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
dur = ARRPTR(ur);
Best regards, Andrey Borodin.
Hi!
On Tue, Aug 28, 2018 at 6:21 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
I belive cube construction from array\arrays should check size of arrays.
Makes sense to me.
Also there are some unexpected cube dimensionality reduction like in cube_enlarge
if (n > CUBE_MAX_DIM)
n = CUBE_MAX_DIM;
You wanted larger cube, but got cube of another dimension.I think we should something like this
OK, but I think cube_c_f8() and cube_c_f8_f8() also need to be
revised. Also, I think this behavior should be covered by regression
tests.
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
28 авг. 2018 г., в 14:18, Alexander Korotkov <a.korotkov@postgrespro.ru> написал(а):
OK, but I think cube_c_f8() and cube_c_f8_f8() also need to be
revised. Also, I think this behavior should be covered by regression
tests.
True. Also there's one case in cube_subset.
Best regards, Andrey Borodin.
Attachments:
cube_check_dim.diffapplication/octet-stream; name=cube_check_dim.diff; x-unix-mode=0644Download
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index dfa8465d74..3630372a3e 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -151,6 +151,12 @@ cube_a_f8_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (ARRNELEMS(ll) != dim)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
@@ -208,6 +214,11 @@ cube_a_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
dur = ARRPTR(ur);
@@ -242,6 +253,12 @@ cube_subset(PG_FUNCTION_ARGS)
dx = (int32 *) ARR_DATA_PTR(idx);
dim = ARRNELEMS(idx);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
size = IS_POINT(c) ? POINT_SIZE(dim) : CUBE_SIZE(dim);
result = (NDBOX *) palloc0(size);
SET_VARSIZE(result, size);
@@ -1755,6 +1772,12 @@ cube_c_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube))
{
size = POINT_SIZE((DIM(cube) + 1));
@@ -1796,6 +1819,12 @@ cube_c_f8_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube) && (x1 == x2))
{
size = POINT_SIZE((DIM(cube) + 1));
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index 6378db3004..9c32020031 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -592,6 +592,7 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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;
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...
@@ -602,6 +603,30 @@ 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.
+-- from an array
+select cube(array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+ERROR: A cube cannot have more than 100 dimensions.
--
-- testing the operators
--
diff --git a/contrib/cube/expected/cube_2.out b/contrib/cube/expected/cube_2.out
index 75fe405c49..95be525703 100644
--- a/contrib/cube/expected/cube_2.out
+++ b/contrib/cube/expected/cube_2.out
@@ -592,6 +592,7 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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;
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...
@@ -602,6 +603,30 @@ 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.
+-- from an array
+select cube(array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+ERROR: A cube cannot have more than 100 dimensions.
--
-- testing the operators
--
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql
index f599e7f7c0..851669df6c 100644
--- a/contrib/cube/sql/cube.sql
+++ b/contrib/cube/sql/cube.sql
@@ -144,9 +144,21 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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(SELECT 0 as a FROM generate_series(1,101)));
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+
--
-- testing the operators
Hi!
On Tue, Aug 28, 2018 at 10:30 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
28 авг. 2018 г., в 14:18, Alexander Korotkov <a.korotkov@postgrespro.ru> написал(а):
OK, but I think cube_c_f8() and cube_c_f8_f8() also need to be
revised. Also, I think this behavior should be covered by regression
tests.True. Also there's one case in cube_subset.
In general looks good for me. Personally I get tired with cube.out
and cube_2.out. They are different with only few checks involving
scientific notation. But all the patches touching cube regression
tests should update both cube.out and cube_2.out. I propose to split
scientific notation checks into separate test. I've also add check
for sube_subset().
I'm going to check this patchset on Windows and commit if no objections.
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
0001-cube-split-scientific-notation-test-v1.patchapplication/octet-stream; name=0001-cube-split-scientific-notation-test-v1.patchDownload
commit 173eb698ffc0dcc69cb63a7a8f5fa9965acc0e8e
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu Aug 30 14:09:25 2018 +0300
Split contrib/cube platform-depended checks into separate test
We're currently maintaining two outputs for cube regression test. But that
appears to be unsuitable, because these outputs are different in out few checks
involving scientific notation. So, split checks involving scientific notation
into separate test, making contrib/cube easier to maintain.
diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile
index a679ac626ee..5e7b524dc22 100644
--- a/contrib/cube/Makefile
+++ b/contrib/cube/Makefile
@@ -11,7 +11,7 @@ PGFILEDESC = "cube - multidimensional cube data type"
HEADERS = cubedata.h
-REGRESS = cube
+REGRESS = cube cube_sci
EXTRA_CLEAN = y.tab.c y.tab.h
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index 6378db3004e..ac5f0bf7a8d 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -62,90 +62,6 @@ SELECT '-1.0'::cube AS cube;
(-1)
(1 row)
-SELECT '1e27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1e27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1.0e27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1.0e27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1e+27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1e+27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1.0e+27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1.0e+27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1e-7'::cube AS cube;
- cube
----------
- (1e-07)
-(1 row)
-
-SELECT '-1e-7'::cube AS cube;
- cube
-----------
- (-1e-07)
-(1 row)
-
-SELECT '1.0e-7'::cube AS cube;
- cube
----------
- (1e-07)
-(1 row)
-
-SELECT '-1.0e-7'::cube AS cube;
- cube
-----------
- (-1e-07)
-(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
------------
@@ -164,24 +80,6 @@ SELECT 'NaN'::cube AS cube;
(NaN)
(1 row)
-SELECT '1234567890123456'::cube AS cube;
- cube
-------------------------
- (1.23456789012346e+15)
-(1 row)
-
-SELECT '+1234567890123456'::cube AS cube;
- cube
-------------------------
- (1.23456789012346e+15)
-(1 row)
-
-SELECT '-1234567890123456'::cube AS cube;
- cube
--------------------------
- (-1.23456789012346e+15)
-(1 row)
-
SELECT '.1234567890123456'::cube AS cube;
cube
---------------------
diff --git a/contrib/cube/expected/cube_2.out b/contrib/cube/expected/cube_2.out
deleted file mode 100644
index 75fe405c497..00000000000
--- a/contrib/cube/expected/cube_2.out
+++ /dev/null
@@ -1,2006 +0,0 @@
---
--- 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?
-----------
- 40
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>2;
- ?column?
-----------
- 40
-(1 row)
-
-SELECT cube(array[10,20,30], array[40,50,60])~>3;
- ?column?
-----------
- 20
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>3;
- ?column?
-----------
- 20
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>0;
-ERROR: zero cube index is not defined
-SELECT cube(array[40,50,60], array[10,20,30])~>4;
- ?column?
-----------
- 50
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>(-1);
- ?column?
-----------
- -10
-(1 row)
-
--- 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;
--- Test kNN
-INSERT INTO test_cube VALUES ('(1,1)'), ('(100000)'), ('(0, 100000)'); -- Some corner cases
-SET enable_seqscan = false;
--- Test different metrics
-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
- (1, 1) | 140.007142674936
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 772.000647668122
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 99
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 656
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 198
- (1444, 403),(1346, 344) | 846
- (369, 1457),(278, 1409) | 909
-(5 rows)
-
--- Test sorting by coordinates
-SELECT c~>1, c FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by left bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 3 | (54, 38679),(3, 38602)
- 15 | (83, 10271),(15, 10265)
- 64 | (122, 46832),(64, 46762)
- 92 | (167, 17214),(92, 17184)
- 107 | (161, 24465),(107, 24374)
- 120 | (162, 26040),(120, 25963)
- 138 | (154, 4019),(138, 3990)
- 175 | (259, 1850),(175, 1820)
- 179 | (207, 40886),(179, 40879)
- 204 | (288, 49588),(204, 49571)
- 226 | (270, 32616),(226, 32607)
- 235 | (318, 31489),(235, 31404)
- 240 | (337, 455),(240, 359)
-(15 rows)
-
-SELECT c~>2, c FROM test_cube ORDER BY c~>2 LIMIT 15; -- ascending by right bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 54 | (54, 38679),(3, 38602)
- 83 | (83, 10271),(15, 10265)
- 122 | (122, 46832),(64, 46762)
- 154 | (154, 4019),(138, 3990)
- 161 | (161, 24465),(107, 24374)
- 162 | (162, 26040),(120, 25963)
- 167 | (167, 17214),(92, 17184)
- 207 | (207, 40886),(179, 40879)
- 259 | (259, 1850),(175, 1820)
- 270 | (270, 29508),(264, 29440)
- 270 | (270, 32616),(226, 32607)
- 288 | (288, 49588),(204, 49571)
- 318 | (318, 31489),(235, 31404)
-(15 rows)
-
-SELECT c~>3, c FROM test_cube ORDER BY c~>3 LIMIT 15; -- ascending by lower bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 6 | (30333, 50),(30273, 6)
- 43 | (43301, 75),(43227, 43)
- 51 | (19650, 142),(19630, 51)
- 81 | (2424, 160),(2424, 81)
- 108 | (3449, 171),(3354, 108)
- 109 | (18037, 155),(17941, 109)
- 114 | (28511, 208),(28479, 114)
- 118 | (19946, 217),(19941, 118)
- 139 | (16906, 191),(16816, 139)
- 163 | (759, 187),(662, 163)
- 181 | (22684, 266),(22656, 181)
- 213 | (24423, 255),(24360, 213)
- 222 | (45989, 249),(45910, 222)
-(15 rows)
-
-SELECT c~>4, c FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by upper bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 50 | (30333, 50),(30273, 6)
- 75 | (43301, 75),(43227, 43)
- 142 | (19650, 142),(19630, 51)
- 155 | (18037, 155),(17941, 109)
- 160 | (2424, 160),(2424, 81)
- 171 | (3449, 171),(3354, 108)
- 187 | (759, 187),(662, 163)
- 191 | (16906, 191),(16816, 139)
- 208 | (28511, 208),(28479, 114)
- 217 | (19946, 217),(19941, 118)
- 249 | (45989, 249),(45910, 222)
- 255 | (24423, 255),(24360, 213)
- 266 | (22684, 266),(22656, 181)
-(15 rows)
-
-SELECT c~>(-1), c FROM test_cube ORDER BY c~>(-1) LIMIT 15; -- descending by left bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -49951 | (50027, 49230),(49951, 49214)
- -49937 | (49980, 35004),(49937, 34963)
- -49927 | (49985, 6436),(49927, 6338)
- -49908 | (49999, 27218),(49908, 27176)
- -49905 | (49954, 1340),(49905, 1294)
- -49902 | (49944, 25163),(49902, 25153)
- -49898 | (49981, 34876),(49898, 34786)
- -49897 | (49957, 43390),(49897, 43384)
- -49848 | (49853, 18504),(49848, 18503)
- -49818 | (49902, 41752),(49818, 41746)
- -49810 | (49907, 30225),(49810, 30158)
- -49808 | (49843, 5175),(49808, 5145)
- -49805 | (49887, 24274),(49805, 24184)
- -49798 | (49847, 7128),(49798, 7067)
-(15 rows)
-
-SELECT c~>(-2), c FROM test_cube ORDER BY c~>(-2) LIMIT 15; -- descending by right bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -50027 | (50027, 49230),(49951, 49214)
- -49999 | (49999, 27218),(49908, 27176)
- -49985 | (49985, 6436),(49927, 6338)
- -49981 | (49981, 34876),(49898, 34786)
- -49980 | (49980, 35004),(49937, 34963)
- -49957 | (49957, 43390),(49897, 43384)
- -49954 | (49954, 1340),(49905, 1294)
- -49944 | (49944, 25163),(49902, 25153)
- -49907 | (49907, 30225),(49810, 30158)
- -49902 | (49902, 41752),(49818, 41746)
- -49887 | (49887, 24274),(49805, 24184)
- -49853 | (49853, 18504),(49848, 18503)
- -49847 | (49847, 7128),(49798, 7067)
- -49843 | (49843, 5175),(49808, 5145)
-(15 rows)
-
-SELECT c~>(-3), c FROM test_cube ORDER BY c~>(-3) LIMIT 15; -- descending by lower bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -49992 | (30746, 50040),(30727, 49992)
- -49987 | (36311, 50073),(36258, 49987)
- -49934 | (3531, 49962),(3463, 49934)
- -49915 | (17954, 49975),(17865, 49915)
- -49914 | (2168, 50012),(2108, 49914)
- -49913 | (31287, 49923),(31236, 49913)
- -49885 | (21551, 49983),(21492, 49885)
- -49878 | (43925, 49912),(43888, 49878)
- -49849 | (19128, 49932),(19112, 49849)
- -49844 | (38266, 49852),(38233, 49844)
- -49836 | (14913, 49873),(14849, 49836)
- -49834 | (37595, 49849),(37581, 49834)
- -49830 | (46151, 49848),(46058, 49830)
- -49818 | (29261, 49910),(29247, 49818)
-(15 rows)
-
-SELECT c~>(-4), c FROM test_cube ORDER BY c~>(-4) LIMIT 15; -- descending by upper bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -50073 | (36311, 50073),(36258, 49987)
- -50040 | (30746, 50040),(30727, 49992)
- -50012 | (2168, 50012),(2108, 49914)
- -49983 | (21551, 49983),(21492, 49885)
- -49975 | (17954, 49975),(17865, 49915)
- -49962 | (3531, 49962),(3463, 49934)
- -49932 | (19128, 49932),(19112, 49849)
- -49923 | (31287, 49923),(31236, 49913)
- -49912 | (43925, 49912),(43888, 49878)
- -49910 | (29261, 49910),(29247, 49818)
- -49873 | (14913, 49873),(14849, 49836)
- -49858 | (20007, 49858),(19921, 49778)
- -49852 | (38266, 49852),(38233, 49844)
- -49849 | (37595, 49849),(37581, 49834)
-(15 rows)
-
--- Same queries with sequential scan (should give the same results as above)
-RESET enable_seqscan;
-SET enable_indexscan = OFF;
-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
- (1, 1) | 140.007142674936
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 772.000647668122
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 99
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 656
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 198
- (1444, 403),(1346, 344) | 846
- (369, 1457),(278, 1409) | 909
-(5 rows)
-
-SELECT c~>1, c FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by left bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 3 | (54, 38679),(3, 38602)
- 15 | (83, 10271),(15, 10265)
- 64 | (122, 46832),(64, 46762)
- 92 | (167, 17214),(92, 17184)
- 107 | (161, 24465),(107, 24374)
- 120 | (162, 26040),(120, 25963)
- 138 | (154, 4019),(138, 3990)
- 175 | (259, 1850),(175, 1820)
- 179 | (207, 40886),(179, 40879)
- 204 | (288, 49588),(204, 49571)
- 226 | (270, 32616),(226, 32607)
- 235 | (318, 31489),(235, 31404)
- 240 | (337, 455),(240, 359)
-(15 rows)
-
-SELECT c~>2, c FROM test_cube ORDER BY c~>2 LIMIT 15; -- ascending by right bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 54 | (54, 38679),(3, 38602)
- 83 | (83, 10271),(15, 10265)
- 122 | (122, 46832),(64, 46762)
- 154 | (154, 4019),(138, 3990)
- 161 | (161, 24465),(107, 24374)
- 162 | (162, 26040),(120, 25963)
- 167 | (167, 17214),(92, 17184)
- 207 | (207, 40886),(179, 40879)
- 259 | (259, 1850),(175, 1820)
- 270 | (270, 29508),(264, 29440)
- 270 | (270, 32616),(226, 32607)
- 288 | (288, 49588),(204, 49571)
- 318 | (318, 31489),(235, 31404)
-(15 rows)
-
-SELECT c~>3, c FROM test_cube ORDER BY c~>3 LIMIT 15; -- ascending by lower bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 6 | (30333, 50),(30273, 6)
- 43 | (43301, 75),(43227, 43)
- 51 | (19650, 142),(19630, 51)
- 81 | (2424, 160),(2424, 81)
- 108 | (3449, 171),(3354, 108)
- 109 | (18037, 155),(17941, 109)
- 114 | (28511, 208),(28479, 114)
- 118 | (19946, 217),(19941, 118)
- 139 | (16906, 191),(16816, 139)
- 163 | (759, 187),(662, 163)
- 181 | (22684, 266),(22656, 181)
- 213 | (24423, 255),(24360, 213)
- 222 | (45989, 249),(45910, 222)
-(15 rows)
-
-SELECT c~>4, c FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by upper bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 50 | (30333, 50),(30273, 6)
- 75 | (43301, 75),(43227, 43)
- 142 | (19650, 142),(19630, 51)
- 155 | (18037, 155),(17941, 109)
- 160 | (2424, 160),(2424, 81)
- 171 | (3449, 171),(3354, 108)
- 187 | (759, 187),(662, 163)
- 191 | (16906, 191),(16816, 139)
- 208 | (28511, 208),(28479, 114)
- 217 | (19946, 217),(19941, 118)
- 249 | (45989, 249),(45910, 222)
- 255 | (24423, 255),(24360, 213)
- 266 | (22684, 266),(22656, 181)
-(15 rows)
-
-SELECT c~>(-1), c FROM test_cube ORDER BY c~>(-1) LIMIT 15; -- descending by left bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -49951 | (50027, 49230),(49951, 49214)
- -49937 | (49980, 35004),(49937, 34963)
- -49927 | (49985, 6436),(49927, 6338)
- -49908 | (49999, 27218),(49908, 27176)
- -49905 | (49954, 1340),(49905, 1294)
- -49902 | (49944, 25163),(49902, 25153)
- -49898 | (49981, 34876),(49898, 34786)
- -49897 | (49957, 43390),(49897, 43384)
- -49848 | (49853, 18504),(49848, 18503)
- -49818 | (49902, 41752),(49818, 41746)
- -49810 | (49907, 30225),(49810, 30158)
- -49808 | (49843, 5175),(49808, 5145)
- -49805 | (49887, 24274),(49805, 24184)
- -49798 | (49847, 7128),(49798, 7067)
-(15 rows)
-
-SELECT c~>(-2), c FROM test_cube ORDER BY c~>(-2) LIMIT 15; -- descending by right bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -50027 | (50027, 49230),(49951, 49214)
- -49999 | (49999, 27218),(49908, 27176)
- -49985 | (49985, 6436),(49927, 6338)
- -49981 | (49981, 34876),(49898, 34786)
- -49980 | (49980, 35004),(49937, 34963)
- -49957 | (49957, 43390),(49897, 43384)
- -49954 | (49954, 1340),(49905, 1294)
- -49944 | (49944, 25163),(49902, 25153)
- -49907 | (49907, 30225),(49810, 30158)
- -49902 | (49902, 41752),(49818, 41746)
- -49887 | (49887, 24274),(49805, 24184)
- -49853 | (49853, 18504),(49848, 18503)
- -49847 | (49847, 7128),(49798, 7067)
- -49843 | (49843, 5175),(49808, 5145)
-(15 rows)
-
-SELECT c~>(-3), c FROM test_cube ORDER BY c~>(-3) LIMIT 15; -- descending by lower bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -49992 | (30746, 50040),(30727, 49992)
- -49987 | (36311, 50073),(36258, 49987)
- -49934 | (3531, 49962),(3463, 49934)
- -49915 | (17954, 49975),(17865, 49915)
- -49914 | (2168, 50012),(2108, 49914)
- -49913 | (31287, 49923),(31236, 49913)
- -49885 | (21551, 49983),(21492, 49885)
- -49878 | (43925, 49912),(43888, 49878)
- -49849 | (19128, 49932),(19112, 49849)
- -49844 | (38266, 49852),(38233, 49844)
- -49836 | (14913, 49873),(14849, 49836)
- -49834 | (37595, 49849),(37581, 49834)
- -49830 | (46151, 49848),(46058, 49830)
- -49818 | (29261, 49910),(29247, 49818)
-(15 rows)
-
-SELECT c~>(-4), c FROM test_cube ORDER BY c~>(-4) LIMIT 15; -- descending by upper bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -50073 | (36311, 50073),(36258, 49987)
- -50040 | (30746, 50040),(30727, 49992)
- -50012 | (2168, 50012),(2108, 49914)
- -49983 | (21551, 49983),(21492, 49885)
- -49975 | (17954, 49975),(17865, 49915)
- -49962 | (3531, 49962),(3463, 49934)
- -49932 | (19128, 49932),(19112, 49849)
- -49923 | (31287, 49923),(31236, 49913)
- -49912 | (43925, 49912),(43888, 49878)
- -49910 | (29261, 49910),(29247, 49818)
- -49873 | (14913, 49873),(14849, 49836)
- -49858 | (20007, 49858),(19921, 49778)
- -49852 | (38266, 49852),(38233, 49844)
- -49849 | (37595, 49849),(37581, 49834)
-(15 rows)
-
-RESET enable_indexscan;
diff --git a/contrib/cube/expected/cube_sci.out b/contrib/cube/expected/cube_sci.out
new file mode 100644
index 00000000000..1e8269cdf00
--- /dev/null
+++ b/contrib/cube/expected/cube_sci.out
@@ -0,0 +1,106 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+SELECT '1e27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1e27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1.0e27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1.0e27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1e+27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1e+27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1.0e+27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1.0e+27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1e-7'::cube AS cube;
+ cube
+---------
+ (1e-07)
+(1 row)
+
+SELECT '-1e-7'::cube AS cube;
+ cube
+----------
+ (-1e-07)
+(1 row)
+
+SELECT '1.0e-7'::cube AS cube;
+ cube
+---------
+ (1e-07)
+(1 row)
+
+SELECT '-1.0e-7'::cube AS cube;
+ cube
+----------
+ (-1e-07)
+(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 '1234567890123456'::cube AS cube;
+ cube
+------------------------
+ (1.23456789012346e+15)
+(1 row)
+
+SELECT '+1234567890123456'::cube AS cube;
+ cube
+------------------------
+ (1.23456789012346e+15)
+(1 row)
+
+SELECT '-1234567890123456'::cube AS cube;
+ cube
+-------------------------
+ (-1.23456789012346e+15)
+(1 row)
+
diff --git a/contrib/cube/expected/cube_sci_1.out b/contrib/cube/expected/cube_sci_1.out
new file mode 100644
index 00000000000..6b1ba9e2fee
--- /dev/null
+++ b/contrib/cube/expected/cube_sci_1.out
@@ -0,0 +1,106 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+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 '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)
+
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql
index f599e7f7c03..03f1ba16bcd 100644
--- a/contrib/cube/sql/cube.sql
+++ b/contrib/cube/sql/cube.sql
@@ -22,26 +22,9 @@ SELECT '.1'::cube AS cube;
SELECT '-.1'::cube AS cube;
SELECT '1.0'::cube AS cube;
SELECT '-1.0'::cube AS cube;
-SELECT '1e27'::cube AS cube;
-SELECT '-1e27'::cube AS cube;
-SELECT '1.0e27'::cube AS cube;
-SELECT '-1.0e27'::cube AS cube;
-SELECT '1e+27'::cube AS cube;
-SELECT '-1e+27'::cube AS cube;
-SELECT '1.0e+27'::cube AS cube;
-SELECT '-1.0e+27'::cube AS cube;
-SELECT '1e-7'::cube AS cube;
-SELECT '-1e-7'::cube AS cube;
-SELECT '1.0e-7'::cube AS cube;
-SELECT '-1.0e-7'::cube AS cube;
-SELECT '1e-300'::cube AS cube;
-SELECT '-1e-300'::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;
SELECT '.1234567890123456'::cube AS cube;
SELECT '+.1234567890123456'::cube AS cube;
SELECT '-.1234567890123456'::cube AS cube;
diff --git a/contrib/cube/sql/cube_sci.sql b/contrib/cube/sql/cube_sci.sql
new file mode 100644
index 00000000000..35a540779a8
--- /dev/null
+++ b/contrib/cube/sql/cube_sci.sql
@@ -0,0 +1,22 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+
+SELECT '1e27'::cube AS cube;
+SELECT '-1e27'::cube AS cube;
+SELECT '1.0e27'::cube AS cube;
+SELECT '-1.0e27'::cube AS cube;
+SELECT '1e+27'::cube AS cube;
+SELECT '-1e+27'::cube AS cube;
+SELECT '1.0e+27'::cube AS cube;
+SELECT '-1.0e+27'::cube AS cube;
+SELECT '1e-7'::cube AS cube;
+SELECT '-1e-7'::cube AS cube;
+SELECT '1.0e-7'::cube AS cube;
+SELECT '-1.0e-7'::cube AS cube;
+SELECT '1e-300'::cube AS cube;
+SELECT '-1e-300'::cube AS cube;
+SELECT '1234567890123456'::cube AS cube;
+SELECT '+1234567890123456'::cube AS cube;
+SELECT '-1234567890123456'::cube AS cube;
0002-cube-enforce-dimension-checks-v1.patchapplication/octet-stream; name=0002-cube-enforce-dimension-checks-v1.patchDownload
commit a0d7d7e7e42a35542f37ffa2d31113ef749cbedc
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu Aug 30 14:18:53 2018 +0300
Enforce cube dimension limit in all cube construction functions
contrib/cube has a limit to 100 dimensions for cube datatype. However, it's
not enforced everywhere, and one can actually construct cube with more than
100 dimensions having then trouble with dump/restore. This commit add checks
for dimensions limit in all functions responsible for cube construction.
Backpatch to all supported versions.
Reported-by: Andrew Gierth
Discussion: https://postgr.es/m/87va7uybt4.fsf%40news-spur.riddles.org.uk
Author: Andrey Borodin with small additions by me
Backpatch-through: 9.3
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index dfa8465d746..3630372a3ed 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -151,6 +151,12 @@ cube_a_f8_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (ARRNELEMS(ll) != dim)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
@@ -208,6 +214,11 @@ cube_a_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
dur = ARRPTR(ur);
@@ -242,6 +253,12 @@ cube_subset(PG_FUNCTION_ARGS)
dx = (int32 *) ARR_DATA_PTR(idx);
dim = ARRNELEMS(idx);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
size = IS_POINT(c) ? POINT_SIZE(dim) : CUBE_SIZE(dim);
result = (NDBOX *) palloc0(size);
SET_VARSIZE(result, size);
@@ -1755,6 +1772,12 @@ cube_c_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube))
{
size = POINT_SIZE((DIM(cube) + 1));
@@ -1796,6 +1819,12 @@ cube_c_f8_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube) && (x1 == x2))
{
size = POINT_SIZE((DIM(cube) + 1));
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index ac5f0bf7a8d..790bb12eb3b 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -418,6 +418,16 @@ 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 for limits: this should pass
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,100)));
+ cube_subset
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
+(1 row)
+
+-- and this should fail
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
--
-- Test point processing
--
@@ -490,6 +500,7 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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;
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...
@@ -500,6 +511,30 @@ 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.
+-- from an array
+select cube(array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+ERROR: A cube cannot have more than 100 dimensions.
--
-- testing the operators
--
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql
index 03f1ba16bcd..59e7e4159d6 100644
--- a/contrib/cube/sql/cube.sql
+++ b/contrib/cube/sql/cube.sql
@@ -108,6 +108,12 @@ 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(SELECT 1 as a FROM generate_series(1,100)));
+-- and this should fail
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,101)));
+
+
--
-- Test point processing
@@ -127,9 +133,21 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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(SELECT 0 as a FROM generate_series(1,101)));
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+
--
-- testing the operators
Alexander Korotkov <a.korotkov@postgrespro.ru> writes:
I'm going to check this patchset on Windows and commit if no objections.
These error messages do not conform to our message style guidelines:
you've copied an errdetail message as primary error message, but the
rules are different for that (no complete sentences, no initial cap,
no period).
Using ERRCODE_ARRAY_ELEMENT_ERROR seems pretty random as well --- so far
as I can see, that's generally used for cases like "this array has the
wrong type of data elements". Perhaps ERRCODE_PROGRAM_LIMIT_EXCEEDED
would be the best choice.
regards, tom lane
On Thu, Aug 30, 2018 at 4:59 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Alexander Korotkov <a.korotkov@postgrespro.ru> writes:
I'm going to check this patchset on Windows and commit if no objections.
These error messages do not conform to our message style guidelines:
you've copied an errdetail message as primary error message, but the
rules are different for that (no complete sentences, no initial cap,
no period).Using ERRCODE_ARRAY_ELEMENT_ERROR seems pretty random as well --- so far
as I can see, that's generally used for cases like "this array has the
wrong type of data elements". Perhaps ERRCODE_PROGRAM_LIMIT_EXCEEDED
would be the best choice.
Thank you for catching this! I'll be more careful about error messages.
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
0001-cube-split-scientific-notation-test-v2.patchapplication/x-patch; name=0001-cube-split-scientific-notation-test-v2.patchDownload
commit 173eb698ffc0dcc69cb63a7a8f5fa9965acc0e8e
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu Aug 30 14:09:25 2018 +0300
Split contrib/cube platform-depended checks into separate test
We're currently maintaining two outputs for cube regression test. But that
appears to be unsuitable, because these outputs are different in out few checks
involving scientific notation. So, split checks involving scientific notation
into separate test, making contrib/cube easier to maintain.
diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile
index a679ac626ee..5e7b524dc22 100644
--- a/contrib/cube/Makefile
+++ b/contrib/cube/Makefile
@@ -11,7 +11,7 @@ PGFILEDESC = "cube - multidimensional cube data type"
HEADERS = cubedata.h
-REGRESS = cube
+REGRESS = cube cube_sci
EXTRA_CLEAN = y.tab.c y.tab.h
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index 6378db3004e..ac5f0bf7a8d 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -62,90 +62,6 @@ SELECT '-1.0'::cube AS cube;
(-1)
(1 row)
-SELECT '1e27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1e27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1.0e27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1.0e27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1e+27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1e+27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1.0e+27'::cube AS cube;
- cube
----------
- (1e+27)
-(1 row)
-
-SELECT '-1.0e+27'::cube AS cube;
- cube
-----------
- (-1e+27)
-(1 row)
-
-SELECT '1e-7'::cube AS cube;
- cube
----------
- (1e-07)
-(1 row)
-
-SELECT '-1e-7'::cube AS cube;
- cube
-----------
- (-1e-07)
-(1 row)
-
-SELECT '1.0e-7'::cube AS cube;
- cube
----------
- (1e-07)
-(1 row)
-
-SELECT '-1.0e-7'::cube AS cube;
- cube
-----------
- (-1e-07)
-(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
------------
@@ -164,24 +80,6 @@ SELECT 'NaN'::cube AS cube;
(NaN)
(1 row)
-SELECT '1234567890123456'::cube AS cube;
- cube
-------------------------
- (1.23456789012346e+15)
-(1 row)
-
-SELECT '+1234567890123456'::cube AS cube;
- cube
-------------------------
- (1.23456789012346e+15)
-(1 row)
-
-SELECT '-1234567890123456'::cube AS cube;
- cube
--------------------------
- (-1.23456789012346e+15)
-(1 row)
-
SELECT '.1234567890123456'::cube AS cube;
cube
---------------------
diff --git a/contrib/cube/expected/cube_2.out b/contrib/cube/expected/cube_2.out
deleted file mode 100644
index 75fe405c497..00000000000
--- a/contrib/cube/expected/cube_2.out
+++ /dev/null
@@ -1,2006 +0,0 @@
---
--- 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?
-----------
- 40
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>2;
- ?column?
-----------
- 40
-(1 row)
-
-SELECT cube(array[10,20,30], array[40,50,60])~>3;
- ?column?
-----------
- 20
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>3;
- ?column?
-----------
- 20
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>0;
-ERROR: zero cube index is not defined
-SELECT cube(array[40,50,60], array[10,20,30])~>4;
- ?column?
-----------
- 50
-(1 row)
-
-SELECT cube(array[40,50,60], array[10,20,30])~>(-1);
- ?column?
-----------
- -10
-(1 row)
-
--- 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;
--- Test kNN
-INSERT INTO test_cube VALUES ('(1,1)'), ('(100000)'), ('(0, 100000)'); -- Some corner cases
-SET enable_seqscan = false;
--- Test different metrics
-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
- (1, 1) | 140.007142674936
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 772.000647668122
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 99
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 656
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 198
- (1444, 403),(1346, 344) | 846
- (369, 1457),(278, 1409) | 909
-(5 rows)
-
--- Test sorting by coordinates
-SELECT c~>1, c FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by left bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 3 | (54, 38679),(3, 38602)
- 15 | (83, 10271),(15, 10265)
- 64 | (122, 46832),(64, 46762)
- 92 | (167, 17214),(92, 17184)
- 107 | (161, 24465),(107, 24374)
- 120 | (162, 26040),(120, 25963)
- 138 | (154, 4019),(138, 3990)
- 175 | (259, 1850),(175, 1820)
- 179 | (207, 40886),(179, 40879)
- 204 | (288, 49588),(204, 49571)
- 226 | (270, 32616),(226, 32607)
- 235 | (318, 31489),(235, 31404)
- 240 | (337, 455),(240, 359)
-(15 rows)
-
-SELECT c~>2, c FROM test_cube ORDER BY c~>2 LIMIT 15; -- ascending by right bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 54 | (54, 38679),(3, 38602)
- 83 | (83, 10271),(15, 10265)
- 122 | (122, 46832),(64, 46762)
- 154 | (154, 4019),(138, 3990)
- 161 | (161, 24465),(107, 24374)
- 162 | (162, 26040),(120, 25963)
- 167 | (167, 17214),(92, 17184)
- 207 | (207, 40886),(179, 40879)
- 259 | (259, 1850),(175, 1820)
- 270 | (270, 29508),(264, 29440)
- 270 | (270, 32616),(226, 32607)
- 288 | (288, 49588),(204, 49571)
- 318 | (318, 31489),(235, 31404)
-(15 rows)
-
-SELECT c~>3, c FROM test_cube ORDER BY c~>3 LIMIT 15; -- ascending by lower bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 6 | (30333, 50),(30273, 6)
- 43 | (43301, 75),(43227, 43)
- 51 | (19650, 142),(19630, 51)
- 81 | (2424, 160),(2424, 81)
- 108 | (3449, 171),(3354, 108)
- 109 | (18037, 155),(17941, 109)
- 114 | (28511, 208),(28479, 114)
- 118 | (19946, 217),(19941, 118)
- 139 | (16906, 191),(16816, 139)
- 163 | (759, 187),(662, 163)
- 181 | (22684, 266),(22656, 181)
- 213 | (24423, 255),(24360, 213)
- 222 | (45989, 249),(45910, 222)
-(15 rows)
-
-SELECT c~>4, c FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by upper bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 50 | (30333, 50),(30273, 6)
- 75 | (43301, 75),(43227, 43)
- 142 | (19650, 142),(19630, 51)
- 155 | (18037, 155),(17941, 109)
- 160 | (2424, 160),(2424, 81)
- 171 | (3449, 171),(3354, 108)
- 187 | (759, 187),(662, 163)
- 191 | (16906, 191),(16816, 139)
- 208 | (28511, 208),(28479, 114)
- 217 | (19946, 217),(19941, 118)
- 249 | (45989, 249),(45910, 222)
- 255 | (24423, 255),(24360, 213)
- 266 | (22684, 266),(22656, 181)
-(15 rows)
-
-SELECT c~>(-1), c FROM test_cube ORDER BY c~>(-1) LIMIT 15; -- descending by left bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -49951 | (50027, 49230),(49951, 49214)
- -49937 | (49980, 35004),(49937, 34963)
- -49927 | (49985, 6436),(49927, 6338)
- -49908 | (49999, 27218),(49908, 27176)
- -49905 | (49954, 1340),(49905, 1294)
- -49902 | (49944, 25163),(49902, 25153)
- -49898 | (49981, 34876),(49898, 34786)
- -49897 | (49957, 43390),(49897, 43384)
- -49848 | (49853, 18504),(49848, 18503)
- -49818 | (49902, 41752),(49818, 41746)
- -49810 | (49907, 30225),(49810, 30158)
- -49808 | (49843, 5175),(49808, 5145)
- -49805 | (49887, 24274),(49805, 24184)
- -49798 | (49847, 7128),(49798, 7067)
-(15 rows)
-
-SELECT c~>(-2), c FROM test_cube ORDER BY c~>(-2) LIMIT 15; -- descending by right bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -50027 | (50027, 49230),(49951, 49214)
- -49999 | (49999, 27218),(49908, 27176)
- -49985 | (49985, 6436),(49927, 6338)
- -49981 | (49981, 34876),(49898, 34786)
- -49980 | (49980, 35004),(49937, 34963)
- -49957 | (49957, 43390),(49897, 43384)
- -49954 | (49954, 1340),(49905, 1294)
- -49944 | (49944, 25163),(49902, 25153)
- -49907 | (49907, 30225),(49810, 30158)
- -49902 | (49902, 41752),(49818, 41746)
- -49887 | (49887, 24274),(49805, 24184)
- -49853 | (49853, 18504),(49848, 18503)
- -49847 | (49847, 7128),(49798, 7067)
- -49843 | (49843, 5175),(49808, 5145)
-(15 rows)
-
-SELECT c~>(-3), c FROM test_cube ORDER BY c~>(-3) LIMIT 15; -- descending by lower bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -49992 | (30746, 50040),(30727, 49992)
- -49987 | (36311, 50073),(36258, 49987)
- -49934 | (3531, 49962),(3463, 49934)
- -49915 | (17954, 49975),(17865, 49915)
- -49914 | (2168, 50012),(2108, 49914)
- -49913 | (31287, 49923),(31236, 49913)
- -49885 | (21551, 49983),(21492, 49885)
- -49878 | (43925, 49912),(43888, 49878)
- -49849 | (19128, 49932),(19112, 49849)
- -49844 | (38266, 49852),(38233, 49844)
- -49836 | (14913, 49873),(14849, 49836)
- -49834 | (37595, 49849),(37581, 49834)
- -49830 | (46151, 49848),(46058, 49830)
- -49818 | (29261, 49910),(29247, 49818)
-(15 rows)
-
-SELECT c~>(-4), c FROM test_cube ORDER BY c~>(-4) LIMIT 15; -- descending by upper bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -50073 | (36311, 50073),(36258, 49987)
- -50040 | (30746, 50040),(30727, 49992)
- -50012 | (2168, 50012),(2108, 49914)
- -49983 | (21551, 49983),(21492, 49885)
- -49975 | (17954, 49975),(17865, 49915)
- -49962 | (3531, 49962),(3463, 49934)
- -49932 | (19128, 49932),(19112, 49849)
- -49923 | (31287, 49923),(31236, 49913)
- -49912 | (43925, 49912),(43888, 49878)
- -49910 | (29261, 49910),(29247, 49818)
- -49873 | (14913, 49873),(14849, 49836)
- -49858 | (20007, 49858),(19921, 49778)
- -49852 | (38266, 49852),(38233, 49844)
- -49849 | (37595, 49849),(37581, 49834)
-(15 rows)
-
--- Same queries with sequential scan (should give the same results as above)
-RESET enable_seqscan;
-SET enable_indexscan = OFF;
-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
- (1, 1) | 140.007142674936
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 772.000647668122
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 99
- (759, 187),(662, 163) | 162
- (948, 1201),(907, 1156) | 656
- (1444, 403),(1346, 344) | 846
-(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
- (1, 1) | 198
- (1444, 403),(1346, 344) | 846
- (369, 1457),(278, 1409) | 909
-(5 rows)
-
-SELECT c~>1, c FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by left bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 3 | (54, 38679),(3, 38602)
- 15 | (83, 10271),(15, 10265)
- 64 | (122, 46832),(64, 46762)
- 92 | (167, 17214),(92, 17184)
- 107 | (161, 24465),(107, 24374)
- 120 | (162, 26040),(120, 25963)
- 138 | (154, 4019),(138, 3990)
- 175 | (259, 1850),(175, 1820)
- 179 | (207, 40886),(179, 40879)
- 204 | (288, 49588),(204, 49571)
- 226 | (270, 32616),(226, 32607)
- 235 | (318, 31489),(235, 31404)
- 240 | (337, 455),(240, 359)
-(15 rows)
-
-SELECT c~>2, c FROM test_cube ORDER BY c~>2 LIMIT 15; -- ascending by right bound
- ?column? | c
-----------+---------------------------
- 0 | (0, 100000)
- 1 | (1, 1)
- 54 | (54, 38679),(3, 38602)
- 83 | (83, 10271),(15, 10265)
- 122 | (122, 46832),(64, 46762)
- 154 | (154, 4019),(138, 3990)
- 161 | (161, 24465),(107, 24374)
- 162 | (162, 26040),(120, 25963)
- 167 | (167, 17214),(92, 17184)
- 207 | (207, 40886),(179, 40879)
- 259 | (259, 1850),(175, 1820)
- 270 | (270, 29508),(264, 29440)
- 270 | (270, 32616),(226, 32607)
- 288 | (288, 49588),(204, 49571)
- 318 | (318, 31489),(235, 31404)
-(15 rows)
-
-SELECT c~>3, c FROM test_cube ORDER BY c~>3 LIMIT 15; -- ascending by lower bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 6 | (30333, 50),(30273, 6)
- 43 | (43301, 75),(43227, 43)
- 51 | (19650, 142),(19630, 51)
- 81 | (2424, 160),(2424, 81)
- 108 | (3449, 171),(3354, 108)
- 109 | (18037, 155),(17941, 109)
- 114 | (28511, 208),(28479, 114)
- 118 | (19946, 217),(19941, 118)
- 139 | (16906, 191),(16816, 139)
- 163 | (759, 187),(662, 163)
- 181 | (22684, 266),(22656, 181)
- 213 | (24423, 255),(24360, 213)
- 222 | (45989, 249),(45910, 222)
-(15 rows)
-
-SELECT c~>4, c FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by upper bound
- ?column? | c
-----------+---------------------------
- 0 | (100000)
- 1 | (1, 1)
- 50 | (30333, 50),(30273, 6)
- 75 | (43301, 75),(43227, 43)
- 142 | (19650, 142),(19630, 51)
- 155 | (18037, 155),(17941, 109)
- 160 | (2424, 160),(2424, 81)
- 171 | (3449, 171),(3354, 108)
- 187 | (759, 187),(662, 163)
- 191 | (16906, 191),(16816, 139)
- 208 | (28511, 208),(28479, 114)
- 217 | (19946, 217),(19941, 118)
- 249 | (45989, 249),(45910, 222)
- 255 | (24423, 255),(24360, 213)
- 266 | (22684, 266),(22656, 181)
-(15 rows)
-
-SELECT c~>(-1), c FROM test_cube ORDER BY c~>(-1) LIMIT 15; -- descending by left bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -49951 | (50027, 49230),(49951, 49214)
- -49937 | (49980, 35004),(49937, 34963)
- -49927 | (49985, 6436),(49927, 6338)
- -49908 | (49999, 27218),(49908, 27176)
- -49905 | (49954, 1340),(49905, 1294)
- -49902 | (49944, 25163),(49902, 25153)
- -49898 | (49981, 34876),(49898, 34786)
- -49897 | (49957, 43390),(49897, 43384)
- -49848 | (49853, 18504),(49848, 18503)
- -49818 | (49902, 41752),(49818, 41746)
- -49810 | (49907, 30225),(49810, 30158)
- -49808 | (49843, 5175),(49808, 5145)
- -49805 | (49887, 24274),(49805, 24184)
- -49798 | (49847, 7128),(49798, 7067)
-(15 rows)
-
-SELECT c~>(-2), c FROM test_cube ORDER BY c~>(-2) LIMIT 15; -- descending by right bound
- ?column? | c
-----------+-------------------------------
- -100000 | (100000)
- -50027 | (50027, 49230),(49951, 49214)
- -49999 | (49999, 27218),(49908, 27176)
- -49985 | (49985, 6436),(49927, 6338)
- -49981 | (49981, 34876),(49898, 34786)
- -49980 | (49980, 35004),(49937, 34963)
- -49957 | (49957, 43390),(49897, 43384)
- -49954 | (49954, 1340),(49905, 1294)
- -49944 | (49944, 25163),(49902, 25153)
- -49907 | (49907, 30225),(49810, 30158)
- -49902 | (49902, 41752),(49818, 41746)
- -49887 | (49887, 24274),(49805, 24184)
- -49853 | (49853, 18504),(49848, 18503)
- -49847 | (49847, 7128),(49798, 7067)
- -49843 | (49843, 5175),(49808, 5145)
-(15 rows)
-
-SELECT c~>(-3), c FROM test_cube ORDER BY c~>(-3) LIMIT 15; -- descending by lower bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -49992 | (30746, 50040),(30727, 49992)
- -49987 | (36311, 50073),(36258, 49987)
- -49934 | (3531, 49962),(3463, 49934)
- -49915 | (17954, 49975),(17865, 49915)
- -49914 | (2168, 50012),(2108, 49914)
- -49913 | (31287, 49923),(31236, 49913)
- -49885 | (21551, 49983),(21492, 49885)
- -49878 | (43925, 49912),(43888, 49878)
- -49849 | (19128, 49932),(19112, 49849)
- -49844 | (38266, 49852),(38233, 49844)
- -49836 | (14913, 49873),(14849, 49836)
- -49834 | (37595, 49849),(37581, 49834)
- -49830 | (46151, 49848),(46058, 49830)
- -49818 | (29261, 49910),(29247, 49818)
-(15 rows)
-
-SELECT c~>(-4), c FROM test_cube ORDER BY c~>(-4) LIMIT 15; -- descending by upper bound
- ?column? | c
-----------+-------------------------------
- -100000 | (0, 100000)
- -50073 | (36311, 50073),(36258, 49987)
- -50040 | (30746, 50040),(30727, 49992)
- -50012 | (2168, 50012),(2108, 49914)
- -49983 | (21551, 49983),(21492, 49885)
- -49975 | (17954, 49975),(17865, 49915)
- -49962 | (3531, 49962),(3463, 49934)
- -49932 | (19128, 49932),(19112, 49849)
- -49923 | (31287, 49923),(31236, 49913)
- -49912 | (43925, 49912),(43888, 49878)
- -49910 | (29261, 49910),(29247, 49818)
- -49873 | (14913, 49873),(14849, 49836)
- -49858 | (20007, 49858),(19921, 49778)
- -49852 | (38266, 49852),(38233, 49844)
- -49849 | (37595, 49849),(37581, 49834)
-(15 rows)
-
-RESET enable_indexscan;
diff --git a/contrib/cube/expected/cube_sci.out b/contrib/cube/expected/cube_sci.out
new file mode 100644
index 00000000000..1e8269cdf00
--- /dev/null
+++ b/contrib/cube/expected/cube_sci.out
@@ -0,0 +1,106 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+SELECT '1e27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1e27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1.0e27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1.0e27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1e+27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1e+27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1.0e+27'::cube AS cube;
+ cube
+---------
+ (1e+27)
+(1 row)
+
+SELECT '-1.0e+27'::cube AS cube;
+ cube
+----------
+ (-1e+27)
+(1 row)
+
+SELECT '1e-7'::cube AS cube;
+ cube
+---------
+ (1e-07)
+(1 row)
+
+SELECT '-1e-7'::cube AS cube;
+ cube
+----------
+ (-1e-07)
+(1 row)
+
+SELECT '1.0e-7'::cube AS cube;
+ cube
+---------
+ (1e-07)
+(1 row)
+
+SELECT '-1.0e-7'::cube AS cube;
+ cube
+----------
+ (-1e-07)
+(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 '1234567890123456'::cube AS cube;
+ cube
+------------------------
+ (1.23456789012346e+15)
+(1 row)
+
+SELECT '+1234567890123456'::cube AS cube;
+ cube
+------------------------
+ (1.23456789012346e+15)
+(1 row)
+
+SELECT '-1234567890123456'::cube AS cube;
+ cube
+-------------------------
+ (-1.23456789012346e+15)
+(1 row)
+
diff --git a/contrib/cube/expected/cube_sci_1.out b/contrib/cube/expected/cube_sci_1.out
new file mode 100644
index 00000000000..6b1ba9e2fee
--- /dev/null
+++ b/contrib/cube/expected/cube_sci_1.out
@@ -0,0 +1,106 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+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 '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)
+
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql
index f599e7f7c03..03f1ba16bcd 100644
--- a/contrib/cube/sql/cube.sql
+++ b/contrib/cube/sql/cube.sql
@@ -22,26 +22,9 @@ SELECT '.1'::cube AS cube;
SELECT '-.1'::cube AS cube;
SELECT '1.0'::cube AS cube;
SELECT '-1.0'::cube AS cube;
-SELECT '1e27'::cube AS cube;
-SELECT '-1e27'::cube AS cube;
-SELECT '1.0e27'::cube AS cube;
-SELECT '-1.0e27'::cube AS cube;
-SELECT '1e+27'::cube AS cube;
-SELECT '-1e+27'::cube AS cube;
-SELECT '1.0e+27'::cube AS cube;
-SELECT '-1.0e+27'::cube AS cube;
-SELECT '1e-7'::cube AS cube;
-SELECT '-1e-7'::cube AS cube;
-SELECT '1.0e-7'::cube AS cube;
-SELECT '-1.0e-7'::cube AS cube;
-SELECT '1e-300'::cube AS cube;
-SELECT '-1e-300'::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;
SELECT '.1234567890123456'::cube AS cube;
SELECT '+.1234567890123456'::cube AS cube;
SELECT '-.1234567890123456'::cube AS cube;
diff --git a/contrib/cube/sql/cube_sci.sql b/contrib/cube/sql/cube_sci.sql
new file mode 100644
index 00000000000..35a540779a8
--- /dev/null
+++ b/contrib/cube/sql/cube_sci.sql
@@ -0,0 +1,22 @@
+---
+--- Testing cube output in scientific notation. This was put into separate
+--- test, because has platform-depending output.
+---
+
+SELECT '1e27'::cube AS cube;
+SELECT '-1e27'::cube AS cube;
+SELECT '1.0e27'::cube AS cube;
+SELECT '-1.0e27'::cube AS cube;
+SELECT '1e+27'::cube AS cube;
+SELECT '-1e+27'::cube AS cube;
+SELECT '1.0e+27'::cube AS cube;
+SELECT '-1.0e+27'::cube AS cube;
+SELECT '1e-7'::cube AS cube;
+SELECT '-1e-7'::cube AS cube;
+SELECT '1.0e-7'::cube AS cube;
+SELECT '-1.0e-7'::cube AS cube;
+SELECT '1e-300'::cube AS cube;
+SELECT '-1e-300'::cube AS cube;
+SELECT '1234567890123456'::cube AS cube;
+SELECT '+1234567890123456'::cube AS cube;
+SELECT '-1234567890123456'::cube AS cube;
0002-cube-enforce-dimension-checks-v2.patchapplication/octet-stream; name=0002-cube-enforce-dimension-checks-v2.patchDownload
commit 887a18fb89099ef9e65390cab340174ba768942a
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu Aug 30 14:18:53 2018 +0300
Enforce cube dimension limit in all cube construction functions
contrib/cube has a limit to 100 dimensions for cube datatype. However, it's
not enforced everywhere, and one can actually construct cube with more than
100 dimensions having then trouble with dump/restore. This commit add checks
for dimensions limit in all functions responsible for cube construction.
Backpatch to all supported versions.
Reported-by: Andrew Gierth
Discussion: https://postgr.es/m/87va7uybt4.fsf%40news-spur.riddles.org.uk
Author: Andrey Borodin with small additions by me
Rewire: Tom Lane
Backpatch-through: 9.3
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index dfa8465d746..3bbfbf2847b 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -151,6 +151,13 @@ cube_a_f8_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("can't extend cube"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (ARRNELEMS(ll) != dim)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
@@ -208,6 +215,12 @@ cube_a_f8(PG_FUNCTION_ARGS)
errmsg("cannot work with arrays containing NULLs")));
dim = ARRNELEMS(ur);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array is too long"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
dur = ARRPTR(ur);
@@ -242,6 +255,13 @@ cube_subset(PG_FUNCTION_ARGS)
dx = (int32 *) ARR_DATA_PTR(idx);
dim = ARRNELEMS(idx);
+ if (dim > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array is too long"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
size = IS_POINT(c) ? POINT_SIZE(dim) : CUBE_SIZE(dim);
result = (NDBOX *) palloc0(size);
SET_VARSIZE(result, size);
@@ -1755,6 +1775,13 @@ cube_c_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("can't extend cube"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube))
{
size = POINT_SIZE((DIM(cube) + 1));
@@ -1796,6 +1823,13 @@ cube_c_f8_f8(PG_FUNCTION_ARGS)
int size;
int i;
+ if (DIM(cube) + 1 > CUBE_MAX_DIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("can't extend cube"),
+ errdetail("A cube cannot have more than %d dimensions.",
+ CUBE_MAX_DIM)));
+
if (IS_POINT(cube) && (x1 == x2))
{
size = POINT_SIZE((DIM(cube) + 1));
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index ac5f0bf7a8d..790bb12eb3b 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -418,6 +418,16 @@ 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 for limits: this should pass
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,100)));
+ cube_subset
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
+(1 row)
+
+-- and this should fail
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
--
-- Test point processing
--
@@ -490,6 +500,7 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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;
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...
@@ -500,6 +511,30 @@ 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.
+-- from an array
+select cube(array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+ERROR: A cube cannot have more than 100 dimensions.
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+ cube
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+(1 row)
+
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+ERROR: A cube cannot have more than 100 dimensions.
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+ERROR: A cube cannot have more than 100 dimensions.
--
-- testing the operators
--
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql
index 03f1ba16bcd..59e7e4159d6 100644
--- a/contrib/cube/sql/cube.sql
+++ b/contrib/cube/sql/cube.sql
@@ -108,6 +108,12 @@ 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(SELECT 1 as a FROM generate_series(1,100)));
+-- and this should fail
+SELECT cube_subset(cube('(6,7,8),(6,7,8)'), array(SELECT 1 as a FROM generate_series(1,101)));
+
+
--
-- Test point processing
@@ -127,9 +133,21 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
--
-- 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(SELECT 0 as a FROM generate_series(1,101)));
+select cube(array(SELECT 0 as a FROM generate_series(1,101)),array(SELECT 0 as a FROM generate_series(1,101)));
+
+-- extend cube beyond limit
+-- this should work
+select cube(array(SELECT 0 as a FROM generate_series(1,100)));
+select cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100)));
+-- this should fail
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100))), 0);
+select cube(cube(array(SELECT 0 as a FROM generate_series(1,100)),array(SELECT 0 as a FROM generate_series(1,100))), 0, 0);
+
--
-- testing the operators
On Thu, Aug 30, 2018 at 02:28:20PM +0300, Alexander Korotkov wrote:
In general looks good for me. Personally I get tired with cube.out
and cube_2.out. They are different with only few checks involving
scientific notation. But all the patches touching cube regression
tests should update both cube.out and cube_2.out. I propose to split
scientific notation checks into separate test.
+1.
--
Michael
On 2018-Aug-30, Alexander Korotkov wrote:
Personally I get tired with cube.out
and cube_2.out. They are different with only few checks involving
scientific notation. But all the patches touching cube regression
tests should update both cube.out and cube_2.out. I propose to split
scientific notation checks into separate test.
Good idea.
--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Fri, Aug 31, 2018 at 6:18 PM Alvaro Herrera <alvherre@2ndquadrant.com> wrote:
On 2018-Aug-30, Alexander Korotkov wrote:
Personally I get tired with cube.out
and cube_2.out. They are different with only few checks involving
scientific notation. But all the patches touching cube regression
tests should update both cube.out and cube_2.out. I propose to split
scientific notation checks into separate test.Good idea.
Thank you for the feedback! Pushed.
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company