In bug #14300 it's pointed out that cube_in rejects zero-element cubes, as well as infinity and NaN coordinate values. Since it's easy to make such cube values via the cube-from-float-array constructors, this is a dump/reload hazard. The attached proposed patch attempts to fix it up.
To deal with the infinity/NaN issues, I made cube_in and cube_out rely on float8in_internal and float8out_internal, as we recently did for the core geometric types. That causes the response to "1e-700" to be an out-of-range error rather than silent underflow, which seems to me to be fine, especially since it removes the platform dependency that's responsible for needing the separate cube_1.out and cube_3.out files. I also took the opportunity to make cube_in's error strings and ERRCODE results match project convention. This is maybe a bit more debatable, but I think it's worth doing as long as we're touching the function's behavior. I found only one other place that seemed to be assuming that cubes aren't zero-length, but it would be worth someone reviewing it again to see if I missed anything. I'll put this on the commitfest queue. regards, tom lane
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c index 3feddef..9f81ec8 100644 *** a/contrib/cube/cube.c --- b/contrib/cube/cube.c *************** cube_in(PG_FUNCTION_ARGS) *** 122,128 **** cube_scanner_init(str); if (cube_yyparse(&result) != 0) ! cube_yyerror(&result, "bogus input"); cube_scanner_finish(); --- 122,128 ---- cube_scanner_init(str); if (cube_yyparse(&result) != 0) ! cube_yyerror(&result, "cube parser failed"); cube_scanner_finish(); *************** cube_out(PG_FUNCTION_ARGS) *** 276,302 **** StringInfoData buf; int dim = DIM(cube); int i; - int ndig; initStringInfo(&buf); - /* - * Get the number of digits to display. - */ - ndig = DBL_DIG + extra_float_digits; - if (ndig < 1) - ndig = 1; - - /* - * while printing the first (LL) corner, check if it is equal to the - * second one - */ appendStringInfoChar(&buf, '('); for (i = 0; i < dim; i++) { if (i > 0) appendStringInfoString(&buf, ", "); ! appendStringInfo(&buf, "%.*g", ndig, LL_COORD(cube, i)); } appendStringInfoChar(&buf, ')'); --- 276,290 ---- StringInfoData buf; int dim = DIM(cube); int i; initStringInfo(&buf); appendStringInfoChar(&buf, '('); for (i = 0; i < dim; i++) { if (i > 0) appendStringInfoString(&buf, ", "); ! appendStringInfoString(&buf, float8out_internal(LL_COORD(cube, i))); } appendStringInfoChar(&buf, ')'); *************** cube_out(PG_FUNCTION_ARGS) *** 307,313 **** { if (i > 0) appendStringInfoString(&buf, ", "); ! appendStringInfo(&buf, "%.*g", ndig, UR_COORD(cube, i)); } appendStringInfoChar(&buf, ')'); } --- 295,301 ---- { if (i > 0) appendStringInfoString(&buf, ", "); ! appendStringInfoString(&buf, float8out_internal(UR_COORD(cube, i))); } appendStringInfoChar(&buf, ')'); } *************** g_cube_distance(PG_FUNCTION_ARGS) *** 1370,1376 **** { int coord = PG_GETARG_INT32(1); ! if (IS_POINT(cube)) retval = cube->x[(coord - 1) % DIM(cube)]; else retval = Min(cube->x[(coord - 1) % DIM(cube)], --- 1358,1366 ---- { int coord = PG_GETARG_INT32(1); ! if (DIM(cube) == 0) ! retval = 0.0; ! else if (IS_POINT(cube)) retval = cube->x[(coord - 1) % DIM(cube)]; else retval = Min(cube->x[(coord - 1) % DIM(cube)], diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h index 7eaac39..7dd9b11 100644 *** a/contrib/cube/cubedata.h --- b/contrib/cube/cubedata.h *************** *** 1,5 **** --- 1,9 ---- /* contrib/cube/cubedata.h */ + /* + * This limit is pretty arbitrary, but don't make it so large that you + * risk overflow in sizing calculations. + */ #define CUBE_MAX_DIM (100) typedef struct NDBOX diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y index 33606c7..1b65fa9 100644 *** a/contrib/cube/cubeparse.y --- b/contrib/cube/cubeparse.y *************** *** 4,15 **** /* NdBox = [(lowerleft),(upperright)] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ - #define YYSTYPE char * - #define YYDEBUG 1 - #include "postgres.h" #include "cubedata.h" /* * Bison doesn't allocate anything that needs to live across parser calls, --- 4,16 ---- /* NdBox = [(lowerleft),(upperright)] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ #include "postgres.h" #include "cubedata.h" + #include "utils/builtins.h" + + /* All grammar constructs return strings */ + #define YYSTYPE char * /* * Bison doesn't allocate anything that needs to live across parser calls, *************** *** 25,33 **** static char *scanbuf; static int scanbuflen; ! static int delim_count(char *s, char delim); ! static NDBOX * write_box(unsigned int dim, char *str1, char *str2); ! static NDBOX * write_point_as_box(char *s, int dim); %} --- 26,34 ---- static char *scanbuf; static int scanbuflen; ! static int item_count(const char *s, char delim); ! static NDBOX *write_box(int dim, char *str1, char *str2); ! static NDBOX *write_point_as_box(int dim, char *str); %} *************** box: O_BRACKET paren_list COMMA paren_li *** 46,92 **** { int dim; ! dim = delim_count($2, ',') + 1; ! if ((delim_count($4, ',') + 1) != dim) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("Different point dimensions in (%s) and (%s).", $2, $4))); YYABORT; } ! if (dim > CUBE_MAX_DIM) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } *result = write_box( dim, $2, $4 ); - } | paren_list COMMA paren_list { int dim; ! dim = delim_count($1, ',') + 1; ! ! if ( (delim_count($3, ',') + 1) != dim ) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("Different point dimensions in (%s) and (%s).", $1, $3))); YYABORT; } ! if (dim > CUBE_MAX_DIM) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; --- 47,94 ---- { int dim; ! dim = item_count($2, ','); ! if (item_count($4, ',') != dim) { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("Different point dimensions in (%s) and (%s).", $2, $4))); YYABORT; } ! if (dim > CUBE_MAX_DIM) ! { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } *result = write_box( dim, $2, $4 ); } | paren_list COMMA paren_list { int dim; ! dim = item_count($1, ','); ! if (item_count($3, ',') != dim) ! { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("Different point dimensions in (%s) and (%s).", $1, $3))); YYABORT; } ! if (dim > CUBE_MAX_DIM) ! { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; *************** box: O_BRACKET paren_list COMMA paren_li *** 99,131 **** { int dim; ! dim = delim_count($1, ',') + 1; ! if (dim > CUBE_MAX_DIM) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } ! *result = write_point_as_box($1, dim); } | list { int dim; ! dim = delim_count($1, ',') + 1; ! if (dim > CUBE_MAX_DIM) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } ! *result = write_point_as_box($1, dim); } ; --- 101,136 ---- { int dim; ! dim = item_count($1, ','); ! if (dim > CUBE_MAX_DIM) ! { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } ! *result = write_point_as_box(dim, $1); } | list { int dim; ! dim = item_count($1, ','); ! if (dim > CUBE_MAX_DIM) ! { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), errdetail("A cube cannot have more than %d dimensions.", CUBE_MAX_DIM))); YYABORT; } ! ! *result = write_point_as_box(dim, $1); } ; *************** paren_list: O_PAREN list C_PAREN *** 133,138 **** --- 138,147 ---- { $$ = $2; } + | O_PAREN C_PAREN + { + $$ = pstrdup(""); + } ; list: CUBEFLOAT *************** list: CUBEFLOAT *** 151,174 **** %% static int ! delim_count(char *s, char delim) { ! int ndelim = 0; ! while ((s = strchr(s, delim)) != NULL) { ! ndelim++; ! s++; } ! return (ndelim); } static NDBOX * ! write_box(unsigned int dim, char *str1, char *str2) { NDBOX *bp; char *s; int i; int size = CUBE_SIZE(dim); bool point = true; --- 160,189 ---- %% + /* This assumes the string has been normalized by productions above */ static int ! item_count(const char *s, char delim) { ! int nitems = 0; ! if (s[0] != '\0') { ! nitems++; ! while ((s = strchr(s, delim)) != NULL) ! { ! nitems++; ! s++; ! } } ! return nitems; } static NDBOX * ! write_box(int dim, char *str1, char *str2) { NDBOX *bp; char *s; + char *endptr; int i; int size = CUBE_SIZE(dim); bool point = true; *************** write_box(unsigned int dim, char *str1, *** 178,227 **** SET_DIM(bp, dim); s = str1; ! bp->x[i=0] = strtod(s, NULL); while ((s = strchr(s, ',')) != NULL) { ! s++; i++; ! bp->x[i] = strtod(s, NULL); } s = str2; ! bp->x[i=dim] = strtod(s, NULL); ! if (bp->x[dim] != bp->x[0]) ! point = false; while ((s = strchr(s, ',')) != NULL) { ! s++; i++; ! bp->x[i] = strtod(s, NULL); ! if (bp->x[i] != bp->x[i-dim]) ! point = false; } if (point) { /* * The value turned out to be a point, ie. all the upper-right * coordinates were equal to the lower-left coordinates. Resize the ! * the cube we constructed. Note: we don't bother to repalloc() it ! * smaller, it's unlikely that the tiny amount of memory free'd that ! * way would be useful. */ size = POINT_SIZE(dim); SET_VARSIZE(bp, size); SET_POINT_BIT(bp); } ! return(bp); } static NDBOX * ! write_point_as_box(char *str, int dim) { NDBOX *bp; int i, size; ! double x; ! char *s = str; size = POINT_SIZE(dim); bp = palloc0(size); --- 193,250 ---- SET_DIM(bp, dim); s = str1; ! i = 0; ! if (dim > 0) ! bp->x[i++] = float8in_internal(s, &endptr, "cube", str1); while ((s = strchr(s, ',')) != NULL) { ! s++; ! bp->x[i++] = float8in_internal(s, &endptr, "cube", str1); } + Assert(i == dim); s = str2; ! if (dim > 0) ! { ! bp->x[i] = float8in_internal(s, &endptr, "cube", str2); ! /* code this way to do right thing with NaN */ ! point &= (bp->x[i] == bp->x[0]); ! i++; ! } while ((s = strchr(s, ',')) != NULL) { ! s++; ! bp->x[i] = float8in_internal(s, &endptr, "cube", str2); ! point &= (bp->x[i] == bp->x[i - dim]); ! i++; } + Assert(i == dim * 2); if (point) { /* * The value turned out to be a point, ie. all the upper-right * coordinates were equal to the lower-left coordinates. Resize the ! * cube we constructed. Note: we don't bother to repalloc() it ! * smaller, as it's unlikely that the tiny amount of memory freed ! * that way would be useful, and the output is always short-lived. */ size = POINT_SIZE(dim); SET_VARSIZE(bp, size); SET_POINT_BIT(bp); } ! return bp; } static NDBOX * ! write_point_as_box(int dim, char *str) { NDBOX *bp; int i, size; ! char *s; ! char *endptr; size = POINT_SIZE(dim); bp = palloc0(size); *************** write_point_as_box(char *str, int dim) *** 229,245 **** SET_DIM(bp, dim); SET_POINT_BIT(bp); i = 0; ! x = strtod(s, NULL); ! bp->x[0] = x; while ((s = strchr(s, ',')) != NULL) { ! s++; i++; ! x = strtod(s, NULL); ! bp->x[i] = x; } ! return(bp); } #include "cubescan.c" --- 252,269 ---- SET_DIM(bp, dim); SET_POINT_BIT(bp); + s = str; i = 0; ! if (dim > 0) ! bp->x[i++] = float8in_internal(s, &endptr, "cube", str); while ((s = strchr(s, ',')) != NULL) { ! s++; ! bp->x[i++] = float8in_internal(s, &endptr, "cube", str); } + Assert(i == dim); ! return bp; } #include "cubescan.c" diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index 4408e28..dada917 100644 *** a/contrib/cube/cubescan.l --- b/contrib/cube/cubescan.l *************** n [0-9]+ *** 38,73 **** integer [+-]?{n} real [+-]?({n}\.{n}?|\.{n}) float ({integer}|{real})([eE]{integer})? %% {float} yylval = yytext; return CUBEFLOAT; \[ yylval = "("; return O_BRACKET; \] yylval = ")"; return C_BRACKET; \( yylval = "("; return O_PAREN; \) yylval = ")"; return C_PAREN; ! \, yylval = ")"; return COMMA; [ \t\n\r\f]+ /* discard spaces */ . return yytext[0]; /* alert parser of the garbage */ %% void yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), /* translator: %s is typically "syntax error" */ errdetail("%s at end of input", message))); } else { ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("bad cube representation"), /* translator: first %s is typically "syntax error" */ errdetail("%s at or near \"%s\"", message, yytext))); } --- 38,78 ---- integer [+-]?{n} real [+-]?({n}\.{n}?|\.{n}) float ({integer}|{real})([eE]{integer})? + infinity [+-]?[iI][nN][fF]([iI][nN][iI][tT][yY])? + NaN [nN][aA][nN] %% {float} yylval = yytext; return CUBEFLOAT; + {infinity} yylval = yytext; return CUBEFLOAT; + {NaN} yylval = yytext; return CUBEFLOAT; \[ yylval = "("; return O_BRACKET; \] yylval = ")"; return C_BRACKET; \( yylval = "("; return O_PAREN; \) yylval = ")"; return C_PAREN; ! \, yylval = ","; return COMMA; [ \t\n\r\f]+ /* discard spaces */ . return yytext[0]; /* alert parser of the garbage */ %% + /* result is not used, but Bison expects this signature */ void yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), /* translator: %s is typically "syntax error" */ errdetail("%s at end of input", message))); } else { ereport(ERROR, ! (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), ! errmsg("invalid input syntax for cube"), /* translator: first %s is typically "syntax error" */ errdetail("%s at or near \"%s\"", message, yytext))); } diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out index e9e2c0f..095491f 100644 *** a/contrib/cube/expected/cube.out --- b/contrib/cube/expected/cube.out *************** SELECT '-1.0e-7'::cube AS cube; *** 126,141 **** (-1e-07) (1 row) ! SELECT '1e-700'::cube AS cube; ! cube ! ------ ! (0) (1 row) ! SELECT '-1e-700'::cube AS cube; ! cube ! ------ ! (0) (1 row) SELECT '1234567890123456'::cube AS cube; --- 126,159 ---- (-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 ! ------------ ! (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; *************** SELECT '-.1234567890123456'::cube AS cub *** 175,180 **** --- 193,204 ---- (1 row) -- simple lists (points) + SELECT '()'::cube AS cube; + cube + ------ + () + (1 row) + SELECT '1,2'::cube AS cube; cube -------- *************** SELECT '(1,2,3,4,5)'::cube AS cube; *** 200,205 **** --- 224,235 ---- (1 row) -- double lists (cubes) + SELECT '(),()'::cube AS cube; + cube + ------ + () + (1 row) + SELECT '(0),(0)'::cube AS cube; cube ------ *************** SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS *** 250,395 **** -- invalid input: parse errors SELECT ''::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT ''::cube AS cube; ^ DETAIL: syntax error at end of input SELECT 'ABC'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT 'ABC'::cube AS cube; ^ DETAIL: syntax error at or near "A" - SELECT '()'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '()'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" SELECT '[]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[()]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[()]'::cube AS cube; ^ ! DETAIL: syntax error at or near ")" SELECT '[(1)]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1)]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[(1),]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[(1),2]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),2]'::cube AS cube; ^ DETAIL: syntax error at or near "2" SELECT '[(1),(2),(3)]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube; ^ DETAIL: syntax error at or near "," SELECT '1,'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,'::cube AS cube; ^ DETAIL: syntax error at end of input SELECT '1,2,'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,2,'::cube AS cube; ^ DETAIL: syntax error at end of input SELECT '1,,2'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,,2'::cube AS cube; ^ DETAIL: syntax error at or near "," SELECT '(1,)'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '(1,)'::cube AS cube; ^ DETAIL: syntax error at or near ")" SELECT '(1,2,)'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '(1,2,)'::cube AS cube; ^ DETAIL: syntax error at or near ")" SELECT '(1,,2)'::cube AS cube; ! ERROR: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation LINE 1: SELECT '(1,2)('::cube AS cube; ^ DETAIL: syntax error at or near "(" SELECT '1,2ab'::cube AS cube; -- 6 ! ERROR: bad cube representation LINE 1: SELECT '1,2ab'::cube AS cube; ^ DETAIL: syntax error at or near "a" SELECT '1 e7'::cube AS cube; -- 6 ! ERROR: bad cube representation LINE 1: SELECT '1 e7'::cube AS cube; ^ DETAIL: syntax error at or near "e" SELECT '1,2a'::cube AS cube; -- 7 ! ERROR: bad cube representation LINE 1: SELECT '1,2a'::cube AS cube; ^ DETAIL: syntax error at or near "a" SELECT '1..2'::cube AS cube; -- 7 ! ERROR: bad cube representation LINE 1: SELECT '1..2'::cube AS cube; ^ DETAIL: syntax error at or near ".2" -- -- Testing building cubes from float8 values -- --- 280,424 ---- -- 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(cube(1,2), 42, 24); -- cube_ *** 556,567 **** -- 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: bad cube representation 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: bad cube representation 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. --- 585,596 ---- -- 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. diff --git a/contrib/cube/expected/cube_1.out b/contrib/cube/expected/cube_1.out index c40fabc..e69de29 100644 *** a/contrib/cube/expected/cube_1.out --- b/contrib/cube/expected/cube_1.out *************** *** 1,1710 **** - -- - -- Test cube datatype - -- - CREATE EXTENSION cube; - -- - -- 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+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-700'::cube AS cube; - cube - ------ - (0) - (1 row) - - SELECT '-1e-700'::cube AS cube; - cube - ------ - (-0) - (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 - --------------------- - (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 '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 '(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: bad cube representation - LINE 1: SELECT ''::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT 'ABC'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT 'ABC'::cube AS cube; - ^ - DETAIL: syntax error at or near "A" - SELECT '()'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '()'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '[]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[()]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[()]'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '[(1)]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1)]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[(1),]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[(1),2]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),2]'::cube AS cube; - ^ - DETAIL: syntax error at or near "2" - SELECT '[(1),(2),(3)]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube; - ^ - DETAIL: syntax error at or near "," - SELECT '1,'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,'::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT '1,2,'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,2,'::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT '1,,2'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,,2'::cube AS cube; - ^ - DETAIL: syntax error at or near "," - SELECT '(1,)'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '(1,)'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '(1,2,)'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '(1,2,)'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '(1,,2)'::cube AS cube; - ERROR: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - LINE 1: SELECT '(1,2)('::cube AS cube; - ^ - DETAIL: syntax error at or near "(" - SELECT '1,2ab'::cube AS cube; -- 6 - ERROR: bad cube representation - LINE 1: SELECT '1,2ab'::cube AS cube; - ^ - DETAIL: syntax error at or near "a" - SELECT '1 e7'::cube AS cube; -- 6 - ERROR: bad cube representation - LINE 1: SELECT '1 e7'::cube AS cube; - ^ - DETAIL: syntax error at or near "e" - SELECT '1,2a'::cube AS cube; -- 7 - ERROR: bad cube representation - LINE 1: SELECT '1,2a'::cube AS cube; - ^ - DETAIL: syntax error at or near "a" - SELECT '1..2'::cube AS cube; -- 7 - ERROR: bad cube representation - LINE 1: SELECT '1..2'::cube AS cube; - ^ - DETAIL: syntax error at or near ".2" - -- - -- 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: bad cube representation - 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: bad cube representation - 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 coodinate 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 coodinate values) - -- - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 1); - cube_ur_coord - --------------- - 2 - (1 row) - - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 2); - cube_ur_coord - --------------- - 1 - (1 row) - - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 1); - cube_ur_coord - --------------- - 1 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 2); - cube_ur_coord - --------------- - 2 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 1); - cube_ur_coord - --------------- - 42 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 2); - cube_ur_coord - --------------- - 137 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - -- Test of cube_is_point - -- - SELECT cube_is_point('(0)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2),(0,1,2)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2),(-1,1,2)'::cube); - cube_is_point - --------------- - f - (1 row) - - SELECT cube_is_point('(0,1,2),(0,-1,2)'::cube); - cube_is_point - --------------- - f - (1 row) - - SELECT cube_is_point('(0,1,2),(0,1,-2)'::cube); - cube_is_point - --------------- - f - (1 row) - - -- Test of cube_enlarge (enlarging and shrinking cubes) - -- - SELECT cube_enlarge('(0)'::cube, 0, 0); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 0, 1); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 0, 2); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, 0, 4); - cube_enlarge - -------------- - (-2),(2) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 0); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 1); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 2); - cube_enlarge - ----------------- - (-1, -1),(1, 1) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, 1, 4); - cube_enlarge - ------------------------------- - (-3, -1, -1, -1),(3, 1, 1, 1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 0); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 1); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 2); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, -1, 4); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0,0,0)'::cube, 1, 0); - cube_enlarge - ------------------------ - (-1, -1, -1),(1, 1, 1) - (1 row) - - SELECT cube_enlarge('(0,0,0)'::cube, 1, 2); - cube_enlarge - ------------------------ - (-1, -1, -1),(1, 1, 1) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 1, 2); - cube_enlarge - ----------------- - (-4, -3),(3, 8) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 3, 2); - cube_enlarge - ------------------ - (-6, -5),(5, 10) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -1, 2); - cube_enlarge - ----------------- - (-2, -1),(1, 6) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -3, 2); - cube_enlarge - --------------------- - (-0.5, 1),(-0.5, 4) - (1 row) - - SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -23, 5); - cube_enlarge - -------------- - (42, 0, 0) - (1 row) - - SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -24, 5); - cube_enlarge - -------------- - (42, 0, 0) - (1 row) - - -- Test of cube_union (MBR for two cubes) - -- - SELECT cube_union('(1,2),(3,4)'::cube, '(5,6,7),(8,9,10)'::cube); - cube_union - ---------------------- - (1, 2, 0),(8, 9, 10) - (1 row) - - SELECT cube_union('(1,2)'::cube, '(4,2,0,0)'::cube); - cube_union - --------------------------- - (1, 2, 0, 0),(4, 2, 0, 0) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(4,2),(4,2)'::cube); - cube_union - --------------- - (1, 2),(4, 2) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(1,2),(1,2)'::cube); - cube_union - ------------ - (1, 2) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(1,2,0),(1,2,0)'::cube); - cube_union - ------------ - (1, 2, 0) - (1 row) - - -- Test of cube_inter - -- - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (16,15)'::cube); -- intersects - cube_inter - ----------------- - (3, 4),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (6,5)'::cube); -- includes - cube_inter - --------------- - (3, 4),(6, 5) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(13,14), (16,15)'::cube); -- no intersection - cube_inter - ------------------- - (13, 14),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,14), (16,15)'::cube); -- no intersection, but one dimension intersects - cube_inter - ------------------ - (3, 14),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(10,11), (16,15)'::cube); -- point intersection - cube_inter - ------------ - (10, 11) - (1 row) - - SELECT cube_inter('(1,2,3)'::cube, '(1,2,3)'::cube); -- point args - cube_inter - ------------ - (1, 2, 3) - (1 row) - - SELECT cube_inter('(1,2,3)'::cube, '(5,6,3)'::cube); -- point args - cube_inter - --------------------- - (5, 6, 3),(1, 2, 3) - (1 row) - - -- Test of cube_size - -- - SELECT cube_size('(4,8),(15,16)'::cube); - cube_size - ----------- - 88 - (1 row) - - SELECT cube_size('(42,137)'::cube); - cube_size - ----------- - 0 - (1 row) - - -- Test of distances - -- - SELECT cube_distance('(1,1)'::cube, '(4,5)'::cube); - cube_distance - --------------- - 5 - (1 row) - - SELECT '(1,1)'::cube <-> '(4,5)'::cube as d_e; - d_e - ----- - 5 - (1 row) - - SELECT distance_chebyshev('(1,1)'::cube, '(4,5)'::cube); - distance_chebyshev - -------------------- - 4 - (1 row) - - SELECT '(1,1)'::cube <=> '(4,5)'::cube as d_c; - d_c - ----- - 4 - (1 row) - - SELECT distance_taxicab('(1,1)'::cube, '(4,5)'::cube); - distance_taxicab - ------------------ - 7 - (1 row) - - SELECT '(1,1)'::cube <#> '(4,5)'::cube as d_t; - d_t - ----- - 7 - (1 row) - - -- zero for overlapping - SELECT cube_distance('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - cube_distance - --------------- - 0 - (1 row) - - SELECT distance_chebyshev('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - distance_chebyshev - -------------------- - 0 - (1 row) - - SELECT distance_taxicab('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - distance_taxicab - ------------------ - 0 - (1 row) - - -- coordinate access - SELECT cube(array[10,20,30], array[40,50,60])->1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])->1; - ?column? - ---------- - 40 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])->6; - ?column? - ---------- - 60 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])->0; - ERROR: cube index 0 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->7; - ERROR: cube index 7 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->-1; - ERROR: cube index -1 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->-6; - ERROR: cube index -6 is out of bounds - SELECT cube(array[10,20,30])->3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[10,20,30])->6; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[10,20,30])->-6; - ERROR: cube index -6 is out of bounds - -- "normalized" coordinate access - SELECT cube(array[10,20,30], array[40,50,60])~>1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])~>2; - ?column? - ---------- - 20 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>2; - ?column? - ---------- - 20 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])~>3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>0; - ERROR: cube index 0 is out of bounds - SELECT cube(array[40,50,60], array[10,20,30])~>4; - ?column? - ---------- - 40 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>(-1); - ERROR: cube index -1 is out of bounds - -- Load some example data and build the index - -- - CREATE TABLE test_cube (c cube); - \copy test_cube from 'data/test_cube.data' - CREATE INDEX test_cube_ix ON test_cube USING gist (c); - SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' ORDER BY c; - c - -------------------------- - (337, 455),(240, 359) - (759, 187),(662, 163) - (1444, 403),(1346, 344) - (1594, 1043),(1517, 971) - (2424, 160),(2424, 81) - (5 rows) - - -- Test sorting - SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c; - c - -------------------------- - (337, 455),(240, 359) - (759, 187),(662, 163) - (1444, 403),(1346, 344) - (1594, 1043),(1517, 971) - (2424, 160),(2424, 81) - (5 rows) - - -- kNN with index - SELECT *, c <-> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <-> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------------------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (948, 1201),(907, 1156) | 772.000647668122 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (5 rows) - - SELECT *, c <=> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <=> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (948, 1201),(907, 1156) | 656 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (5 rows) - - SELECT *, c <#> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <#> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (948, 1201),(907, 1156) | 1063 - (5 rows) - - -- kNN-based sorting - SELECT * FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by 1st coordinate of lower left corner - c - --------------------------- - (54, 38679),(3, 38602) - (83, 10271),(15, 10265) - (122, 46832),(64, 46762) - (167, 17214),(92, 17184) - (161, 24465),(107, 24374) - (162, 26040),(120, 25963) - (154, 4019),(138, 3990) - (259, 1850),(175, 1820) - (207, 40886),(179, 40879) - (288, 49588),(204, 49571) - (270, 32616),(226, 32607) - (318, 31489),(235, 31404) - (337, 455),(240, 359) - (270, 29508),(264, 29440) - (369, 1457),(278, 1409) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by 2nd coordinate or upper right corner - c - --------------------------- - (30333, 50),(30273, 6) - (43301, 75),(43227, 43) - (19650, 142),(19630, 51) - (2424, 160),(2424, 81) - (3449, 171),(3354, 108) - (18037, 155),(17941, 109) - (28511, 208),(28479, 114) - (19946, 217),(19941, 118) - (16906, 191),(16816, 139) - (759, 187),(662, 163) - (22684, 266),(22656, 181) - (24423, 255),(24360, 213) - (45989, 249),(45910, 222) - (11399, 377),(11360, 294) - (12162, 389),(12103, 309) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>1 DESC LIMIT 15; -- descending by 1st coordinate of lower left corner - c - ------------------------------- - (50027, 49230),(49951, 49214) - (49980, 35004),(49937, 34963) - (49985, 6436),(49927, 6338) - (49999, 27218),(49908, 27176) - (49954, 1340),(49905, 1294) - (49944, 25163),(49902, 25153) - (49981, 34876),(49898, 34786) - (49957, 43390),(49897, 43384) - (49853, 18504),(49848, 18503) - (49902, 41752),(49818, 41746) - (49907, 30225),(49810, 30158) - (49843, 5175),(49808, 5145) - (49887, 24274),(49805, 24184) - (49847, 7128),(49798, 7067) - (49820, 7990),(49771, 7967) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>4 DESC LIMIT 15; -- descending by 2nd coordinate or upper right corner - c - ------------------------------- - (36311, 50073),(36258, 49987) - (30746, 50040),(30727, 49992) - (2168, 50012),(2108, 49914) - (21551, 49983),(21492, 49885) - (17954, 49975),(17865, 49915) - (3531, 49962),(3463, 49934) - (19128, 49932),(19112, 49849) - (31287, 49923),(31236, 49913) - (43925, 49912),(43888, 49878) - (29261, 49910),(29247, 49818) - (14913, 49873),(14849, 49836) - (20007, 49858),(19921, 49778) - (38266, 49852),(38233, 49844) - (37595, 49849),(37581, 49834) - (46151, 49848),(46058, 49830) - (15 rows) - - -- same thing for index with points - CREATE TABLE test_point(c cube); - INSERT INTO test_point(SELECT cube(array[c->1,c->2,c->3,c->4]) FROM test_cube); - CREATE INDEX ON test_point USING gist(c); - SELECT * FROM test_point ORDER BY c~>1, c~>2 LIMIT 15; -- ascending by 1st then by 2nd coordinate - c - -------------------------- - (54, 38679, 3, 38602) - (83, 10271, 15, 10265) - (122, 46832, 64, 46762) - (154, 4019, 138, 3990) - (161, 24465, 107, 24374) - (162, 26040, 120, 25963) - (167, 17214, 92, 17184) - (207, 40886, 179, 40879) - (259, 1850, 175, 1820) - (270, 29508, 264, 29440) - (270, 32616, 226, 32607) - (288, 49588, 204, 49571) - (318, 31489, 235, 31404) - (326, 18837, 285, 18817) - (337, 455, 240, 359) - (15 rows) - - SELECT * FROM test_point ORDER BY c~>4 DESC LIMIT 15; -- descending by 1st coordinate - c - ------------------------------ - (30746, 50040, 30727, 49992) - (36311, 50073, 36258, 49987) - (3531, 49962, 3463, 49934) - (17954, 49975, 17865, 49915) - (2168, 50012, 2108, 49914) - (31287, 49923, 31236, 49913) - (21551, 49983, 21492, 49885) - (43925, 49912, 43888, 49878) - (19128, 49932, 19112, 49849) - (38266, 49852, 38233, 49844) - (14913, 49873, 14849, 49836) - (37595, 49849, 37581, 49834) - (46151, 49848, 46058, 49830) - (29261, 49910, 29247, 49818) - (19233, 49824, 19185, 49794) - (15 rows) - --- 0 ---- diff --git a/contrib/cube/expected/cube_2.out b/contrib/cube/expected/cube_2.out index fef749c..eaeae45 100644 *** a/contrib/cube/expected/cube_2.out --- b/contrib/cube/expected/cube_2.out *************** SELECT '-1.0e-7'::cube AS cube; *** 126,141 **** (-1e-007) (1 row) ! SELECT '1e-700'::cube AS cube; ! cube ! ------ ! (0) (1 row) ! SELECT '-1e-700'::cube AS cube; ! cube ! ------ ! (0) (1 row) SELECT '1234567890123456'::cube AS cube; --- 126,159 ---- (-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; *************** SELECT '-.1234567890123456'::cube AS cub *** 175,180 **** --- 193,204 ---- (1 row) -- simple lists (points) + SELECT '()'::cube AS cube; + cube + ------ + () + (1 row) + SELECT '1,2'::cube AS cube; cube -------- *************** SELECT '(1,2,3,4,5)'::cube AS cube; *** 200,205 **** --- 224,235 ---- (1 row) -- double lists (cubes) + SELECT '(),()'::cube AS cube; + cube + ------ + () + (1 row) + SELECT '(0),(0)'::cube AS cube; cube ------ *************** SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS *** 250,395 **** -- invalid input: parse errors SELECT ''::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT ''::cube AS cube; ^ DETAIL: syntax error at end of input SELECT 'ABC'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT 'ABC'::cube AS cube; ^ DETAIL: syntax error at or near "A" - SELECT '()'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '()'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" SELECT '[]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[()]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[()]'::cube AS cube; ^ ! DETAIL: syntax error at or near ")" SELECT '[(1)]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1)]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[(1),]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),]'::cube AS cube; ^ DETAIL: syntax error at or near "]" SELECT '[(1),2]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),2]'::cube AS cube; ^ DETAIL: syntax error at or near "2" SELECT '[(1),(2),(3)]'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube; ^ DETAIL: syntax error at or near "," SELECT '1,'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,'::cube AS cube; ^ DETAIL: syntax error at end of input SELECT '1,2,'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,2,'::cube AS cube; ^ DETAIL: syntax error at end of input SELECT '1,,2'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '1,,2'::cube AS cube; ^ DETAIL: syntax error at or near "," SELECT '(1,)'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '(1,)'::cube AS cube; ^ DETAIL: syntax error at or near ")" SELECT '(1,2,)'::cube AS cube; ! ERROR: bad cube representation LINE 1: SELECT '(1,2,)'::cube AS cube; ^ DETAIL: syntax error at or near ")" SELECT '(1,,2)'::cube AS cube; ! ERROR: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation 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: bad cube representation LINE 1: SELECT '(1,2)('::cube AS cube; ^ DETAIL: syntax error at or near "(" SELECT '1,2ab'::cube AS cube; -- 6 ! ERROR: bad cube representation LINE 1: SELECT '1,2ab'::cube AS cube; ^ DETAIL: syntax error at or near "a" SELECT '1 e7'::cube AS cube; -- 6 ! ERROR: bad cube representation LINE 1: SELECT '1 e7'::cube AS cube; ^ DETAIL: syntax error at or near "e" SELECT '1,2a'::cube AS cube; -- 7 ! ERROR: bad cube representation LINE 1: SELECT '1,2a'::cube AS cube; ^ DETAIL: syntax error at or near "a" SELECT '1..2'::cube AS cube; -- 7 ! ERROR: bad cube representation LINE 1: SELECT '1..2'::cube AS cube; ^ DETAIL: syntax error at or near ".2" -- -- Testing building cubes from float8 values -- --- 280,424 ---- -- 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(cube(1,2), 42, 24); -- cube_ *** 556,567 **** -- 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: bad cube representation 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: bad cube representation 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. --- 585,596 ---- -- 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. diff --git a/contrib/cube/expected/cube_3.out b/contrib/cube/expected/cube_3.out index 31d2d1a..e69de29 100644 *** a/contrib/cube/expected/cube_3.out --- b/contrib/cube/expected/cube_3.out *************** *** 1,1710 **** - -- - -- Test cube datatype - -- - CREATE EXTENSION cube; - -- - -- 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-700'::cube AS cube; - cube - ------ - (0) - (1 row) - - SELECT '-1e-700'::cube AS cube; - cube - ------ - (-0) - (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 '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 '(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: bad cube representation - LINE 1: SELECT ''::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT 'ABC'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT 'ABC'::cube AS cube; - ^ - DETAIL: syntax error at or near "A" - SELECT '()'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '()'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '[]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[()]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[()]'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '[(1)]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1)]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[(1),]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),]'::cube AS cube; - ^ - DETAIL: syntax error at or near "]" - SELECT '[(1),2]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),2]'::cube AS cube; - ^ - DETAIL: syntax error at or near "2" - SELECT '[(1),(2),(3)]'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube; - ^ - DETAIL: syntax error at or near "," - SELECT '1,'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,'::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT '1,2,'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,2,'::cube AS cube; - ^ - DETAIL: syntax error at end of input - SELECT '1,,2'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '1,,2'::cube AS cube; - ^ - DETAIL: syntax error at or near "," - SELECT '(1,)'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '(1,)'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '(1,2,)'::cube AS cube; - ERROR: bad cube representation - LINE 1: SELECT '(1,2,)'::cube AS cube; - ^ - DETAIL: syntax error at or near ")" - SELECT '(1,,2)'::cube AS cube; - ERROR: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - 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: bad cube representation - LINE 1: SELECT '(1,2)('::cube AS cube; - ^ - DETAIL: syntax error at or near "(" - SELECT '1,2ab'::cube AS cube; -- 6 - ERROR: bad cube representation - LINE 1: SELECT '1,2ab'::cube AS cube; - ^ - DETAIL: syntax error at or near "a" - SELECT '1 e7'::cube AS cube; -- 6 - ERROR: bad cube representation - LINE 1: SELECT '1 e7'::cube AS cube; - ^ - DETAIL: syntax error at or near "e" - SELECT '1,2a'::cube AS cube; -- 7 - ERROR: bad cube representation - LINE 1: SELECT '1,2a'::cube AS cube; - ^ - DETAIL: syntax error at or near "a" - SELECT '1..2'::cube AS cube; -- 7 - ERROR: bad cube representation - LINE 1: SELECT '1..2'::cube AS cube; - ^ - DETAIL: syntax error at or near ".2" - -- - -- 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: bad cube representation - 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: bad cube representation - 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 coodinate 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 coodinate values) - -- - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 1); - cube_ur_coord - --------------- - 2 - (1 row) - - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 2); - cube_ur_coord - --------------- - 1 - (1 row) - - SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 1); - cube_ur_coord - --------------- - 1 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 2); - cube_ur_coord - --------------- - 2 - (1 row) - - SELECT cube_ur_coord('(1,2),(1,2)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 1); - cube_ur_coord - --------------- - 42 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 2); - cube_ur_coord - --------------- - 137 - (1 row) - - SELECT cube_ur_coord('(42,137)'::cube, 3); - cube_ur_coord - --------------- - 0 - (1 row) - - -- Test of cube_is_point - -- - SELECT cube_is_point('(0)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2),(0,1,2)'::cube); - cube_is_point - --------------- - t - (1 row) - - SELECT cube_is_point('(0,1,2),(-1,1,2)'::cube); - cube_is_point - --------------- - f - (1 row) - - SELECT cube_is_point('(0,1,2),(0,-1,2)'::cube); - cube_is_point - --------------- - f - (1 row) - - SELECT cube_is_point('(0,1,2),(0,1,-2)'::cube); - cube_is_point - --------------- - f - (1 row) - - -- Test of cube_enlarge (enlarging and shrinking cubes) - -- - SELECT cube_enlarge('(0)'::cube, 0, 0); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 0, 1); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 0, 2); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, 0, 4); - cube_enlarge - -------------- - (-2),(2) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 0); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 1); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, 1, 2); - cube_enlarge - ----------------- - (-1, -1),(1, 1) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, 1, 4); - cube_enlarge - ------------------------------- - (-3, -1, -1, -1),(3, 1, 1, 1) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 0); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 1); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(0)'::cube, -1, 2); - cube_enlarge - -------------- - (0) - (1 row) - - SELECT cube_enlarge('(2),(-2)'::cube, -1, 4); - cube_enlarge - -------------- - (-1),(1) - (1 row) - - SELECT cube_enlarge('(0,0,0)'::cube, 1, 0); - cube_enlarge - ------------------------ - (-1, -1, -1),(1, 1, 1) - (1 row) - - SELECT cube_enlarge('(0,0,0)'::cube, 1, 2); - cube_enlarge - ------------------------ - (-1, -1, -1),(1, 1, 1) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 1, 2); - cube_enlarge - ----------------- - (-4, -3),(3, 8) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, 3, 2); - cube_enlarge - ------------------ - (-6, -5),(5, 10) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -1, 2); - cube_enlarge - ----------------- - (-2, -1),(1, 6) - (1 row) - - SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -3, 2); - cube_enlarge - --------------------- - (-0.5, 1),(-0.5, 4) - (1 row) - - SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -23, 5); - cube_enlarge - -------------- - (42, 0, 0) - (1 row) - - SELECT cube_enlarge('(42,-23,-23),(42,23,23)'::cube, -24, 5); - cube_enlarge - -------------- - (42, 0, 0) - (1 row) - - -- Test of cube_union (MBR for two cubes) - -- - SELECT cube_union('(1,2),(3,4)'::cube, '(5,6,7),(8,9,10)'::cube); - cube_union - ---------------------- - (1, 2, 0),(8, 9, 10) - (1 row) - - SELECT cube_union('(1,2)'::cube, '(4,2,0,0)'::cube); - cube_union - --------------------------- - (1, 2, 0, 0),(4, 2, 0, 0) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(4,2),(4,2)'::cube); - cube_union - --------------- - (1, 2),(4, 2) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(1,2),(1,2)'::cube); - cube_union - ------------ - (1, 2) - (1 row) - - SELECT cube_union('(1,2),(1,2)'::cube, '(1,2,0),(1,2,0)'::cube); - cube_union - ------------ - (1, 2, 0) - (1 row) - - -- Test of cube_inter - -- - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (16,15)'::cube); -- intersects - cube_inter - ----------------- - (3, 4),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (6,5)'::cube); -- includes - cube_inter - --------------- - (3, 4),(6, 5) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(13,14), (16,15)'::cube); -- no intersection - cube_inter - ------------------- - (13, 14),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(3,14), (16,15)'::cube); -- no intersection, but one dimension intersects - cube_inter - ------------------ - (3, 14),(10, 11) - (1 row) - - SELECT cube_inter('(1,2),(10,11)'::cube, '(10,11), (16,15)'::cube); -- point intersection - cube_inter - ------------ - (10, 11) - (1 row) - - SELECT cube_inter('(1,2,3)'::cube, '(1,2,3)'::cube); -- point args - cube_inter - ------------ - (1, 2, 3) - (1 row) - - SELECT cube_inter('(1,2,3)'::cube, '(5,6,3)'::cube); -- point args - cube_inter - --------------------- - (5, 6, 3),(1, 2, 3) - (1 row) - - -- Test of cube_size - -- - SELECT cube_size('(4,8),(15,16)'::cube); - cube_size - ----------- - 88 - (1 row) - - SELECT cube_size('(42,137)'::cube); - cube_size - ----------- - 0 - (1 row) - - -- Test of distances - -- - SELECT cube_distance('(1,1)'::cube, '(4,5)'::cube); - cube_distance - --------------- - 5 - (1 row) - - SELECT '(1,1)'::cube <-> '(4,5)'::cube as d_e; - d_e - ----- - 5 - (1 row) - - SELECT distance_chebyshev('(1,1)'::cube, '(4,5)'::cube); - distance_chebyshev - -------------------- - 4 - (1 row) - - SELECT '(1,1)'::cube <=> '(4,5)'::cube as d_c; - d_c - ----- - 4 - (1 row) - - SELECT distance_taxicab('(1,1)'::cube, '(4,5)'::cube); - distance_taxicab - ------------------ - 7 - (1 row) - - SELECT '(1,1)'::cube <#> '(4,5)'::cube as d_t; - d_t - ----- - 7 - (1 row) - - -- zero for overlapping - SELECT cube_distance('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - cube_distance - --------------- - 0 - (1 row) - - SELECT distance_chebyshev('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - distance_chebyshev - -------------------- - 0 - (1 row) - - SELECT distance_taxicab('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); - distance_taxicab - ------------------ - 0 - (1 row) - - -- coordinate access - SELECT cube(array[10,20,30], array[40,50,60])->1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])->1; - ?column? - ---------- - 40 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])->6; - ?column? - ---------- - 60 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])->0; - ERROR: cube index 0 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->7; - ERROR: cube index 7 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->-1; - ERROR: cube index -1 is out of bounds - SELECT cube(array[10,20,30], array[40,50,60])->-6; - ERROR: cube index -6 is out of bounds - SELECT cube(array[10,20,30])->3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[10,20,30])->6; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[10,20,30])->-6; - ERROR: cube index -6 is out of bounds - -- "normalized" coordinate access - SELECT cube(array[10,20,30], array[40,50,60])~>1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>1; - ?column? - ---------- - 10 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])~>2; - ?column? - ---------- - 20 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>2; - ?column? - ---------- - 20 - (1 row) - - SELECT cube(array[10,20,30], array[40,50,60])~>3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>3; - ?column? - ---------- - 30 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>0; - ERROR: cube index 0 is out of bounds - SELECT cube(array[40,50,60], array[10,20,30])~>4; - ?column? - ---------- - 40 - (1 row) - - SELECT cube(array[40,50,60], array[10,20,30])~>(-1); - ERROR: cube index -1 is out of bounds - -- Load some example data and build the index - -- - CREATE TABLE test_cube (c cube); - \copy test_cube from 'data/test_cube.data' - CREATE INDEX test_cube_ix ON test_cube USING gist (c); - SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' ORDER BY c; - c - -------------------------- - (337, 455),(240, 359) - (759, 187),(662, 163) - (1444, 403),(1346, 344) - (1594, 1043),(1517, 971) - (2424, 160),(2424, 81) - (5 rows) - - -- Test sorting - SELECT * FROM test_cube WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c; - c - -------------------------- - (337, 455),(240, 359) - (759, 187),(662, 163) - (1444, 403),(1346, 344) - (1594, 1043),(1517, 971) - (2424, 160),(2424, 81) - (5 rows) - - -- kNN with index - SELECT *, c <-> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <-> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------------------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (948, 1201),(907, 1156) | 772.000647668122 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (5 rows) - - SELECT *, c <=> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <=> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (948, 1201),(907, 1156) | 656 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (5 rows) - - SELECT *, c <#> '(100, 100),(500, 500)'::cube as dist FROM test_cube ORDER BY c <#> '(100, 100),(500, 500)'::cube LIMIT 5; - c | dist - -------------------------+------ - (337, 455),(240, 359) | 0 - (759, 187),(662, 163) | 162 - (1444, 403),(1346, 344) | 846 - (369, 1457),(278, 1409) | 909 - (948, 1201),(907, 1156) | 1063 - (5 rows) - - -- kNN-based sorting - SELECT * FROM test_cube ORDER BY c~>1 LIMIT 15; -- ascending by 1st coordinate of lower left corner - c - --------------------------- - (54, 38679),(3, 38602) - (83, 10271),(15, 10265) - (122, 46832),(64, 46762) - (167, 17214),(92, 17184) - (161, 24465),(107, 24374) - (162, 26040),(120, 25963) - (154, 4019),(138, 3990) - (259, 1850),(175, 1820) - (207, 40886),(179, 40879) - (288, 49588),(204, 49571) - (270, 32616),(226, 32607) - (318, 31489),(235, 31404) - (337, 455),(240, 359) - (270, 29508),(264, 29440) - (369, 1457),(278, 1409) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>4 LIMIT 15; -- ascending by 2nd coordinate or upper right corner - c - --------------------------- - (30333, 50),(30273, 6) - (43301, 75),(43227, 43) - (19650, 142),(19630, 51) - (2424, 160),(2424, 81) - (3449, 171),(3354, 108) - (18037, 155),(17941, 109) - (28511, 208),(28479, 114) - (19946, 217),(19941, 118) - (16906, 191),(16816, 139) - (759, 187),(662, 163) - (22684, 266),(22656, 181) - (24423, 255),(24360, 213) - (45989, 249),(45910, 222) - (11399, 377),(11360, 294) - (12162, 389),(12103, 309) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>1 DESC LIMIT 15; -- descending by 1st coordinate of lower left corner - c - ------------------------------- - (50027, 49230),(49951, 49214) - (49980, 35004),(49937, 34963) - (49985, 6436),(49927, 6338) - (49999, 27218),(49908, 27176) - (49954, 1340),(49905, 1294) - (49944, 25163),(49902, 25153) - (49981, 34876),(49898, 34786) - (49957, 43390),(49897, 43384) - (49853, 18504),(49848, 18503) - (49902, 41752),(49818, 41746) - (49907, 30225),(49810, 30158) - (49843, 5175),(49808, 5145) - (49887, 24274),(49805, 24184) - (49847, 7128),(49798, 7067) - (49820, 7990),(49771, 7967) - (15 rows) - - SELECT * FROM test_cube ORDER BY c~>4 DESC LIMIT 15; -- descending by 2nd coordinate or upper right corner - c - ------------------------------- - (36311, 50073),(36258, 49987) - (30746, 50040),(30727, 49992) - (2168, 50012),(2108, 49914) - (21551, 49983),(21492, 49885) - (17954, 49975),(17865, 49915) - (3531, 49962),(3463, 49934) - (19128, 49932),(19112, 49849) - (31287, 49923),(31236, 49913) - (43925, 49912),(43888, 49878) - (29261, 49910),(29247, 49818) - (14913, 49873),(14849, 49836) - (20007, 49858),(19921, 49778) - (38266, 49852),(38233, 49844) - (37595, 49849),(37581, 49834) - (46151, 49848),(46058, 49830) - (15 rows) - - -- same thing for index with points - CREATE TABLE test_point(c cube); - INSERT INTO test_point(SELECT cube(array[c->1,c->2,c->3,c->4]) FROM test_cube); - CREATE INDEX ON test_point USING gist(c); - SELECT * FROM test_point ORDER BY c~>1, c~>2 LIMIT 15; -- ascending by 1st then by 2nd coordinate - c - -------------------------- - (54, 38679, 3, 38602) - (83, 10271, 15, 10265) - (122, 46832, 64, 46762) - (154, 4019, 138, 3990) - (161, 24465, 107, 24374) - (162, 26040, 120, 25963) - (167, 17214, 92, 17184) - (207, 40886, 179, 40879) - (259, 1850, 175, 1820) - (270, 29508, 264, 29440) - (270, 32616, 226, 32607) - (288, 49588, 204, 49571) - (318, 31489, 235, 31404) - (326, 18837, 285, 18817) - (337, 455, 240, 359) - (15 rows) - - SELECT * FROM test_point ORDER BY c~>4 DESC LIMIT 15; -- descending by 1st coordinate - c - ------------------------------ - (30746, 50040, 30727, 49992) - (36311, 50073, 36258, 49987) - (3531, 49962, 3463, 49934) - (17954, 49975, 17865, 49915) - (2168, 50012, 2108, 49914) - (31287, 49923, 31236, 49913) - (21551, 49983, 21492, 49885) - (43925, 49912, 43888, 49878) - (19128, 49932, 19112, 49849) - (38266, 49852, 38233, 49844) - (14913, 49873, 14849, 49836) - (37595, 49849, 37581, 49834) - (46151, 49848, 46058, 49830) - (29261, 49910, 29247, 49818) - (19233, 49824, 19185, 49794) - (15 rows) - --- 0 ---- diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql index e225fb7..cc5a1ce 100644 *** a/contrib/cube/sql/cube.sql --- b/contrib/cube/sql/cube.sql *************** SELECT '1e-7'::cube AS cube; *** 29,36 **** SELECT '-1e-7'::cube AS cube; SELECT '1.0e-7'::cube AS cube; SELECT '-1.0e-7'::cube AS cube; ! SELECT '1e-700'::cube AS cube; ! SELECT '-1e-700'::cube AS cube; SELECT '1234567890123456'::cube AS cube; SELECT '+1234567890123456'::cube AS cube; SELECT '-1234567890123456'::cube AS cube; --- 29,39 ---- 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 cub *** 39,50 **** --- 42,55 ---- SELECT '-.1234567890123456'::cube AS cube; -- simple lists (points) + SELECT '()'::cube AS cube; SELECT '1,2'::cube AS cube; SELECT '(1,2)'::cube AS cube; SELECT '1,2,3,4,5'::cube AS cube; SELECT '(1,2,3,4,5)'::cube AS cube; -- double lists (cubes) + SELECT '(),()'::cube AS cube; SELECT '(0),(0)'::cube AS cube; SELECT '(0),(1)'::cube AS cube; SELECT '[(0),(0)]'::cube AS cube; *************** SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS *** 57,63 **** -- invalid input: parse errors SELECT ''::cube AS cube; SELECT 'ABC'::cube AS cube; - SELECT '()'::cube AS cube; SELECT '[]'::cube AS cube; SELECT '[()]'::cube AS cube; SELECT '[(1)]'::cube AS cube; --- 62,67 ---- *************** SELECT '1,2ab'::cube AS cube; -- 6 *** 85,90 **** --- 89,95 ---- SELECT '1 e7'::cube AS cube; -- 6 SELECT '1,2a'::cube AS cube; -- 7 SELECT '1..2'::cube AS cube; -- 7 + SELECT '-1e-700'::cube AS cube; -- out of range -- -- Testing building cubes from float8 values
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers