Improve contrib/cube's handling of zero-D cubes, infinities, and NaNs.
It's always been possible to create a zero-dimensional cube by converting from a zero-length float8 array, but cube_in failed to accept the '()' representation that cube_out produced for that case, resulting in a dump/reload hazard. Make it accept the case. Also fix a couple of other places that didn't behave sanely for zero-dimensional cubes: cube_size would produce 1.0 when surely the answer should be 0.0, and g_cube_distance risked a divide-by-zero failure. Likewise, it's always been possible to create cubes containing float8 infinity or NaN coordinate values, but cube_in couldn't parse such input, and cube_out produced platform-dependent spellings of the values. Convert them to use float8in_internal and float8out_internal so that the behavior will be the same as for float8, as we recently did for the core geometric types (cf commit 50861cd68). As in that commit, I don't pretend that this patch fixes all insane corner-case behaviors that may exist for NaNs, but it's a step forward. (This change allows removal of the separate cube_1.out and cube_3.out expected-files, as the platform dependency that previously required them is now gone: an underflowing coordinate value will now produce an error not plus or minus zero.) Make errors from cube_in follow project conventions as to spelling ("invalid input syntax for cube" not "bad cube representation") and errcode (INVALID_TEXT_REPRESENTATION not SYNTAX_ERROR). Also a few marginal code cleanups and comment improvements. Tom Lane, reviewed by Amul Sul Discussion: <15085.1472494782@sss.pgh.pa.us>
This commit is contained in:
parent
51c3e9fade
commit
f31a931fad
@ -122,7 +122,7 @@ cube_in(PG_FUNCTION_ARGS)
|
|||||||
cube_scanner_init(str);
|
cube_scanner_init(str);
|
||||||
|
|
||||||
if (cube_yyparse(&result) != 0)
|
if (cube_yyparse(&result) != 0)
|
||||||
cube_yyerror(&result, "bogus input");
|
cube_yyerror(&result, "cube parser failed");
|
||||||
|
|
||||||
cube_scanner_finish();
|
cube_scanner_finish();
|
||||||
|
|
||||||
@ -254,12 +254,9 @@ cube_subset(PG_FUNCTION_ARGS)
|
|||||||
for (i = 0; i < dim; i++)
|
for (i = 0; i < dim; i++)
|
||||||
{
|
{
|
||||||
if ((dx[i] <= 0) || (dx[i] > DIM(c)))
|
if ((dx[i] <= 0) || (dx[i] > DIM(c)))
|
||||||
{
|
|
||||||
pfree(result);
|
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
|
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
|
||||||
errmsg("Index out of bounds")));
|
errmsg("Index out of bounds")));
|
||||||
}
|
|
||||||
result->x[i] = c->x[dx[i] - 1];
|
result->x[i] = c->x[dx[i] - 1];
|
||||||
if (!IS_POINT(c))
|
if (!IS_POINT(c))
|
||||||
result->x[i + dim] = c->x[dx[i] + DIM(c) - 1];
|
result->x[i + dim] = c->x[dx[i] + DIM(c) - 1];
|
||||||
@ -276,27 +273,15 @@ cube_out(PG_FUNCTION_ARGS)
|
|||||||
StringInfoData buf;
|
StringInfoData buf;
|
||||||
int dim = DIM(cube);
|
int dim = DIM(cube);
|
||||||
int i;
|
int i;
|
||||||
int ndig;
|
|
||||||
|
|
||||||
initStringInfo(&buf);
|
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, '(');
|
appendStringInfoChar(&buf, '(');
|
||||||
for (i = 0; i < dim; i++)
|
for (i = 0; i < dim; i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
appendStringInfoString(&buf, ", ");
|
appendStringInfoString(&buf, ", ");
|
||||||
appendStringInfo(&buf, "%.*g", ndig, LL_COORD(cube, i));
|
appendStringInfoString(&buf, float8out_internal(LL_COORD(cube, i)));
|
||||||
}
|
}
|
||||||
appendStringInfoChar(&buf, ')');
|
appendStringInfoChar(&buf, ')');
|
||||||
|
|
||||||
@ -307,7 +292,7 @@ cube_out(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
appendStringInfoString(&buf, ", ");
|
appendStringInfoString(&buf, ", ");
|
||||||
appendStringInfo(&buf, "%.*g", ndig, UR_COORD(cube, i));
|
appendStringInfoString(&buf, float8out_internal(UR_COORD(cube, i)));
|
||||||
}
|
}
|
||||||
appendStringInfoChar(&buf, ')');
|
appendStringInfoChar(&buf, ')');
|
||||||
}
|
}
|
||||||
@ -370,9 +355,6 @@ g_cube_union(PG_FUNCTION_ARGS)
|
|||||||
NDBOX *tmp;
|
NDBOX *tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "union\n");
|
|
||||||
*/
|
|
||||||
tmp = DatumGetNDBOX(entryvec->vector[0].key);
|
tmp = DatumGetNDBOX(entryvec->vector[0].key);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -441,9 +423,6 @@ g_cube_penalty(PG_FUNCTION_ARGS)
|
|||||||
rt_cube_size(DatumGetNDBOX(origentry->key), &tmp2);
|
rt_cube_size(DatumGetNDBOX(origentry->key), &tmp2);
|
||||||
*result = (float) (tmp1 - tmp2);
|
*result = (float) (tmp1 - tmp2);
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result);
|
|
||||||
*/
|
|
||||||
PG_RETURN_FLOAT8(*result);
|
PG_RETURN_FLOAT8(*result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,9 +463,6 @@ g_cube_picksplit(PG_FUNCTION_ARGS)
|
|||||||
*right;
|
*right;
|
||||||
OffsetNumber maxoff;
|
OffsetNumber maxoff;
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "picksplit\n");
|
|
||||||
*/
|
|
||||||
maxoff = entryvec->n - 2;
|
maxoff = entryvec->n - 2;
|
||||||
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
|
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
|
||||||
v->spl_left = (OffsetNumber *) palloc(nbytes);
|
v->spl_left = (OffsetNumber *) palloc(nbytes);
|
||||||
@ -617,9 +593,6 @@ g_cube_same(PG_FUNCTION_ARGS)
|
|||||||
else
|
else
|
||||||
*result = FALSE;
|
*result = FALSE;
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "same: %s\n", (*result ? "TRUE" : "FALSE" ));
|
|
||||||
*/
|
|
||||||
PG_RETURN_NDBOX(result);
|
PG_RETURN_NDBOX(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -633,9 +606,6 @@ g_cube_leaf_consistent(NDBOX *key,
|
|||||||
{
|
{
|
||||||
bool retval;
|
bool retval;
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "leaf_consistent, %d\n", strategy);
|
|
||||||
*/
|
|
||||||
switch (strategy)
|
switch (strategy)
|
||||||
{
|
{
|
||||||
case RTOverlapStrategyNumber:
|
case RTOverlapStrategyNumber:
|
||||||
@ -665,9 +635,6 @@ g_cube_internal_consistent(NDBOX *key,
|
|||||||
{
|
{
|
||||||
bool retval;
|
bool retval;
|
||||||
|
|
||||||
/*
|
|
||||||
* fprintf(stderr, "internal_consistent, %d\n", strategy);
|
|
||||||
*/
|
|
||||||
switch (strategy)
|
switch (strategy)
|
||||||
{
|
{
|
||||||
case RTOverlapStrategyNumber:
|
case RTOverlapStrategyNumber:
|
||||||
@ -865,12 +832,8 @@ cube_size(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
NDBOX *a = PG_GETARG_NDBOX(0);
|
NDBOX *a = PG_GETARG_NDBOX(0);
|
||||||
double result;
|
double result;
|
||||||
int i;
|
|
||||||
|
|
||||||
result = 1.0;
|
|
||||||
for (i = 0; i < DIM(a); i++)
|
|
||||||
result = result * Abs((LL_COORD(a, i) - UR_COORD(a, i)));
|
|
||||||
|
|
||||||
|
rt_cube_size(a, &result);
|
||||||
PG_FREE_IF_COPY(a, 0);
|
PG_FREE_IF_COPY(a, 0);
|
||||||
PG_RETURN_FLOAT8(result);
|
PG_RETURN_FLOAT8(result);
|
||||||
}
|
}
|
||||||
@ -878,17 +841,26 @@ cube_size(PG_FUNCTION_ARGS)
|
|||||||
void
|
void
|
||||||
rt_cube_size(NDBOX *a, double *size)
|
rt_cube_size(NDBOX *a, double *size)
|
||||||
{
|
{
|
||||||
|
double result;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (a == (NDBOX *) NULL)
|
if (a == (NDBOX *) NULL)
|
||||||
*size = 0.0;
|
{
|
||||||
|
/* special case for GiST */
|
||||||
|
result = 0.0;
|
||||||
|
}
|
||||||
|
else if (IS_POINT(a) || DIM(a) == 0)
|
||||||
|
{
|
||||||
|
/* necessarily has zero size */
|
||||||
|
result = 0.0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*size = 1.0;
|
result = 1.0;
|
||||||
for (i = 0; i < DIM(a); i++)
|
for (i = 0; i < DIM(a); i++)
|
||||||
*size = (*size) * Abs(UR_COORD(a, i) - LL_COORD(a, i));
|
result *= Abs(UR_COORD(a, i) - LL_COORD(a, i));
|
||||||
}
|
}
|
||||||
return;
|
*size = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make up a metric in which one box will be 'lower' than the other
|
/* make up a metric in which one box will be 'lower' than the other
|
||||||
@ -1155,10 +1127,6 @@ cube_overlap_v0(NDBOX *a, NDBOX *b)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
|
||||||
* This *very bad* error was found in the source: if ( (a==NULL) ||
|
|
||||||
* (b=NULL) ) return(FALSE);
|
|
||||||
*/
|
|
||||||
if ((a == NULL) || (b == NULL))
|
if ((a == NULL) || (b == NULL))
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
|
||||||
@ -1370,7 +1338,9 @@ g_cube_distance(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
int coord = PG_GETARG_INT32(1);
|
int coord = PG_GETARG_INT32(1);
|
||||||
|
|
||||||
if (IS_POINT(cube))
|
if (DIM(cube) == 0)
|
||||||
|
retval = 0.0;
|
||||||
|
else if (IS_POINT(cube))
|
||||||
retval = cube->x[(coord - 1) % DIM(cube)];
|
retval = cube->x[(coord - 1) % DIM(cube)];
|
||||||
else
|
else
|
||||||
retval = Min(cube->x[(coord - 1) % DIM(cube)],
|
retval = Min(cube->x[(coord - 1) % DIM(cube)],
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
/* contrib/cube/cubedata.h */
|
/* 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)
|
#define CUBE_MAX_DIM (100)
|
||||||
|
|
||||||
typedef struct NDBOX
|
typedef struct NDBOX
|
||||||
@ -29,6 +33,7 @@ typedef struct NDBOX
|
|||||||
double x[FLEXIBLE_ARRAY_MEMBER];
|
double x[FLEXIBLE_ARRAY_MEMBER];
|
||||||
} NDBOX;
|
} NDBOX;
|
||||||
|
|
||||||
|
/* NDBOX access macros */
|
||||||
#define POINT_BIT 0x80000000
|
#define POINT_BIT 0x80000000
|
||||||
#define DIM_MASK 0x7fffffff
|
#define DIM_MASK 0x7fffffff
|
||||||
|
|
||||||
@ -43,10 +48,12 @@ typedef struct NDBOX
|
|||||||
#define POINT_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim))
|
#define POINT_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim))
|
||||||
#define CUBE_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
|
#define CUBE_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
|
||||||
|
|
||||||
|
/* fmgr interface macros */
|
||||||
#define DatumGetNDBOX(x) ((NDBOX *) PG_DETOAST_DATUM(x))
|
#define DatumGetNDBOX(x) ((NDBOX *) PG_DETOAST_DATUM(x))
|
||||||
#define PG_GETARG_NDBOX(x) DatumGetNDBOX(PG_GETARG_DATUM(x))
|
#define PG_GETARG_NDBOX(x) DatumGetNDBOX(PG_GETARG_DATUM(x))
|
||||||
#define PG_RETURN_NDBOX(x) PG_RETURN_POINTER(x)
|
#define PG_RETURN_NDBOX(x) PG_RETURN_POINTER(x)
|
||||||
|
|
||||||
|
/* GiST operator strategy numbers */
|
||||||
#define CubeKNNDistanceCoord 15 /* ~> */
|
#define CubeKNNDistanceCoord 15 /* ~> */
|
||||||
#define CubeKNNDistanceTaxicab 16 /* <#> */
|
#define CubeKNNDistanceTaxicab 16 /* <#> */
|
||||||
#define CubeKNNDistanceEuclid 17 /* <-> */
|
#define CubeKNNDistanceEuclid 17 /* <-> */
|
||||||
|
@ -4,12 +4,13 @@
|
|||||||
/* NdBox = [(lowerleft),(upperright)] */
|
/* NdBox = [(lowerleft),(upperright)] */
|
||||||
/* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */
|
/* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */
|
||||||
|
|
||||||
#define YYSTYPE char *
|
|
||||||
#define YYDEBUG 1
|
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "cubedata.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,
|
* Bison doesn't allocate anything that needs to live across parser calls,
|
||||||
@ -25,9 +26,9 @@
|
|||||||
static char *scanbuf;
|
static char *scanbuf;
|
||||||
static int scanbuflen;
|
static int scanbuflen;
|
||||||
|
|
||||||
static int delim_count(char *s, char delim);
|
static int item_count(const char *s, char delim);
|
||||||
static NDBOX * write_box(unsigned int dim, char *str1, char *str2);
|
static NDBOX *write_box(int dim, char *str1, char *str2);
|
||||||
static NDBOX * write_point_as_box(char *s, int dim);
|
static NDBOX *write_point_as_box(int dim, char *str);
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
@ -46,47 +47,48 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
|
|||||||
{
|
{
|
||||||
int dim;
|
int dim;
|
||||||
|
|
||||||
dim = delim_count($2, ',') + 1;
|
dim = item_count($2, ',');
|
||||||
if ((delim_count($4, ',') + 1) != dim)
|
if (item_count($4, ',') != dim)
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("Different point dimensions in (%s) and (%s).",
|
errdetail("Different point dimensions in (%s) and (%s).",
|
||||||
$2, $4)));
|
$2, $4)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
if (dim > CUBE_MAX_DIM) {
|
if (dim > CUBE_MAX_DIM)
|
||||||
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("A cube cannot have more than %d dimensions.",
|
errdetail("A cube cannot have more than %d dimensions.",
|
||||||
CUBE_MAX_DIM)));
|
CUBE_MAX_DIM)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = write_box( dim, $2, $4 );
|
*result = write_box( dim, $2, $4 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
| paren_list COMMA paren_list
|
| paren_list COMMA paren_list
|
||||||
{
|
{
|
||||||
int dim;
|
int dim;
|
||||||
|
|
||||||
dim = delim_count($1, ',') + 1;
|
dim = item_count($1, ',');
|
||||||
|
if (item_count($3, ',') != dim)
|
||||||
if ( (delim_count($3, ',') + 1) != dim ) {
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("Different point dimensions in (%s) and (%s).",
|
errdetail("Different point dimensions in (%s) and (%s).",
|
||||||
$1, $3)));
|
$1, $3)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
if (dim > CUBE_MAX_DIM) {
|
if (dim > CUBE_MAX_DIM)
|
||||||
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("A cube cannot have more than %d dimensions.",
|
errdetail("A cube cannot have more than %d dimensions.",
|
||||||
CUBE_MAX_DIM)));
|
CUBE_MAX_DIM)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
@ -99,33 +101,36 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
|
|||||||
{
|
{
|
||||||
int dim;
|
int dim;
|
||||||
|
|
||||||
dim = delim_count($1, ',') + 1;
|
dim = item_count($1, ',');
|
||||||
if (dim > CUBE_MAX_DIM) {
|
if (dim > CUBE_MAX_DIM)
|
||||||
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("A cube cannot have more than %d dimensions.",
|
errdetail("A cube cannot have more than %d dimensions.",
|
||||||
CUBE_MAX_DIM)));
|
CUBE_MAX_DIM)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = write_point_as_box($1, dim);
|
*result = write_point_as_box(dim, $1);
|
||||||
}
|
}
|
||||||
|
|
||||||
| list
|
| list
|
||||||
{
|
{
|
||||||
int dim;
|
int dim;
|
||||||
|
|
||||||
dim = delim_count($1, ',') + 1;
|
dim = item_count($1, ',');
|
||||||
if (dim > CUBE_MAX_DIM) {
|
if (dim > CUBE_MAX_DIM)
|
||||||
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
errdetail("A cube cannot have more than %d dimensions.",
|
errdetail("A cube cannot have more than %d dimensions.",
|
||||||
CUBE_MAX_DIM)));
|
CUBE_MAX_DIM)));
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
*result = write_point_as_box($1, dim);
|
|
||||||
|
*result = write_point_as_box(dim, $1);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -133,6 +138,10 @@ paren_list: O_PAREN list C_PAREN
|
|||||||
{
|
{
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
}
|
}
|
||||||
|
| O_PAREN C_PAREN
|
||||||
|
{
|
||||||
|
$$ = pstrdup("");
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
list: CUBEFLOAT
|
list: CUBEFLOAT
|
||||||
@ -151,24 +160,30 @@ list: CUBEFLOAT
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
/* This assumes the string has been normalized by productions above */
|
||||||
static int
|
static int
|
||||||
delim_count(char *s, char delim)
|
item_count(const char *s, char delim)
|
||||||
{
|
{
|
||||||
int ndelim = 0;
|
int nitems = 0;
|
||||||
|
|
||||||
while ((s = strchr(s, delim)) != NULL)
|
if (s[0] != '\0')
|
||||||
{
|
{
|
||||||
ndelim++;
|
nitems++;
|
||||||
s++;
|
while ((s = strchr(s, delim)) != NULL)
|
||||||
|
{
|
||||||
|
nitems++;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (ndelim);
|
return nitems;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NDBOX *
|
static NDBOX *
|
||||||
write_box(unsigned int dim, char *str1, char *str2)
|
write_box(int dim, char *str1, char *str2)
|
||||||
{
|
{
|
||||||
NDBOX *bp;
|
NDBOX *bp;
|
||||||
char *s;
|
char *s;
|
||||||
|
char *endptr;
|
||||||
int i;
|
int i;
|
||||||
int size = CUBE_SIZE(dim);
|
int size = CUBE_SIZE(dim);
|
||||||
bool point = true;
|
bool point = true;
|
||||||
@ -178,50 +193,58 @@ write_box(unsigned int dim, char *str1, char *str2)
|
|||||||
SET_DIM(bp, dim);
|
SET_DIM(bp, dim);
|
||||||
|
|
||||||
s = str1;
|
s = str1;
|
||||||
bp->x[i=0] = strtod(s, NULL);
|
i = 0;
|
||||||
|
if (dim > 0)
|
||||||
|
bp->x[i++] = float8in_internal(s, &endptr, "cube", str1);
|
||||||
while ((s = strchr(s, ',')) != NULL)
|
while ((s = strchr(s, ',')) != NULL)
|
||||||
{
|
{
|
||||||
s++; i++;
|
s++;
|
||||||
bp->x[i] = strtod(s, NULL);
|
bp->x[i++] = float8in_internal(s, &endptr, "cube", str1);
|
||||||
}
|
}
|
||||||
|
Assert(i == dim);
|
||||||
|
|
||||||
s = str2;
|
s = str2;
|
||||||
bp->x[i=dim] = strtod(s, NULL);
|
if (dim > 0)
|
||||||
if (bp->x[dim] != bp->x[0])
|
{
|
||||||
point = false;
|
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)
|
while ((s = strchr(s, ',')) != NULL)
|
||||||
{
|
{
|
||||||
s++; i++;
|
s++;
|
||||||
bp->x[i] = strtod(s, NULL);
|
bp->x[i] = float8in_internal(s, &endptr, "cube", str2);
|
||||||
if (bp->x[i] != bp->x[i-dim])
|
point &= (bp->x[i] == bp->x[i - dim]);
|
||||||
point = false;
|
i++;
|
||||||
}
|
}
|
||||||
|
Assert(i == dim * 2);
|
||||||
|
|
||||||
if (point)
|
if (point)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The value turned out to be a point, ie. all the upper-right
|
* The value turned out to be a point, ie. all the upper-right
|
||||||
* coordinates were equal to the lower-left coordinates. Resize the
|
* coordinates were equal to the lower-left coordinates. Resize the
|
||||||
* the cube we constructed. Note: we don't bother to repalloc() it
|
* cube we constructed. Note: we don't bother to repalloc() it
|
||||||
* smaller, it's unlikely that the tiny amount of memory free'd that
|
* smaller, as it's unlikely that the tiny amount of memory freed
|
||||||
* way would be useful.
|
* that way would be useful, and the output is always short-lived.
|
||||||
*/
|
*/
|
||||||
size = POINT_SIZE(dim);
|
size = POINT_SIZE(dim);
|
||||||
SET_VARSIZE(bp, size);
|
SET_VARSIZE(bp, size);
|
||||||
SET_POINT_BIT(bp);
|
SET_POINT_BIT(bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(bp);
|
return bp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NDBOX *
|
static NDBOX *
|
||||||
write_point_as_box(char *str, int dim)
|
write_point_as_box(int dim, char *str)
|
||||||
{
|
{
|
||||||
NDBOX *bp;
|
NDBOX *bp;
|
||||||
int i,
|
int i,
|
||||||
size;
|
size;
|
||||||
double x;
|
char *s;
|
||||||
char *s = str;
|
char *endptr;
|
||||||
|
|
||||||
size = POINT_SIZE(dim);
|
size = POINT_SIZE(dim);
|
||||||
bp = palloc0(size);
|
bp = palloc0(size);
|
||||||
@ -229,17 +252,18 @@ write_point_as_box(char *str, int dim)
|
|||||||
SET_DIM(bp, dim);
|
SET_DIM(bp, dim);
|
||||||
SET_POINT_BIT(bp);
|
SET_POINT_BIT(bp);
|
||||||
|
|
||||||
|
s = str;
|
||||||
i = 0;
|
i = 0;
|
||||||
x = strtod(s, NULL);
|
if (dim > 0)
|
||||||
bp->x[0] = x;
|
bp->x[i++] = float8in_internal(s, &endptr, "cube", str);
|
||||||
while ((s = strchr(s, ',')) != NULL)
|
while ((s = strchr(s, ',')) != NULL)
|
||||||
{
|
{
|
||||||
s++; i++;
|
s++;
|
||||||
x = strtod(s, NULL);
|
bp->x[i++] = float8in_internal(s, &endptr, "cube", str);
|
||||||
bp->x[i] = x;
|
|
||||||
}
|
}
|
||||||
|
Assert(i == dim);
|
||||||
|
|
||||||
return(bp);
|
return bp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "cubescan.c"
|
#include "cubescan.c"
|
||||||
|
@ -38,36 +38,41 @@ n [0-9]+
|
|||||||
integer [+-]?{n}
|
integer [+-]?{n}
|
||||||
real [+-]?({n}\.{n}?|\.{n})
|
real [+-]?({n}\.{n}?|\.{n})
|
||||||
float ({integer}|{real})([eE]{integer})?
|
float ({integer}|{real})([eE]{integer})?
|
||||||
|
infinity [+-]?[iI][nN][fF]([iI][nN][iI][tT][yY])?
|
||||||
|
NaN [nN][aA][nN]
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
{float} yylval = yytext; return CUBEFLOAT;
|
{float} yylval = yytext; return CUBEFLOAT;
|
||||||
|
{infinity} yylval = yytext; return CUBEFLOAT;
|
||||||
|
{NaN} yylval = yytext; return CUBEFLOAT;
|
||||||
\[ yylval = "("; return O_BRACKET;
|
\[ yylval = "("; return O_BRACKET;
|
||||||
\] yylval = ")"; return C_BRACKET;
|
\] yylval = ")"; return C_BRACKET;
|
||||||
\( yylval = "("; return O_PAREN;
|
\( yylval = "("; return O_PAREN;
|
||||||
\) yylval = ")"; return C_PAREN;
|
\) yylval = ")"; return C_PAREN;
|
||||||
\, yylval = ")"; return COMMA;
|
\, yylval = ","; return COMMA;
|
||||||
[ \t\n\r\f]+ /* discard spaces */
|
[ \t\n\r\f]+ /* discard spaces */
|
||||||
. return yytext[0]; /* alert parser of the garbage */
|
. return yytext[0]; /* alert parser of the garbage */
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
/* result is not used, but Bison expects this signature */
|
||||||
void
|
void
|
||||||
yyerror(NDBOX **result, const char *message)
|
yyerror(NDBOX **result, const char *message)
|
||||||
{
|
{
|
||||||
if (*yytext == YY_END_OF_BUFFER_CHAR)
|
if (*yytext == YY_END_OF_BUFFER_CHAR)
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
/* translator: %s is typically "syntax error" */
|
/* translator: %s is typically "syntax error" */
|
||||||
errdetail("%s at end of input", message)));
|
errdetail("%s at end of input", message)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("bad cube representation"),
|
errmsg("invalid input syntax for cube"),
|
||||||
/* translator: first %s is typically "syntax error" */
|
/* translator: first %s is typically "syntax error" */
|
||||||
errdetail("%s at or near \"%s\"", message, yytext)));
|
errdetail("%s at or near \"%s\"", message, yytext)));
|
||||||
}
|
}
|
||||||
|
@ -126,16 +126,34 @@ SELECT '-1.0e-7'::cube AS cube;
|
|||||||
(-1e-07)
|
(-1e-07)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '1e-700'::cube AS cube;
|
SELECT '1e-300'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
------
|
----------
|
||||||
(0)
|
(1e-300)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '-1e-700'::cube AS cube;
|
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
|
cube
|
||||||
------
|
-------
|
||||||
(0)
|
(NaN)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '1234567890123456'::cube AS cube;
|
SELECT '1234567890123456'::cube AS cube;
|
||||||
@ -175,6 +193,12 @@ SELECT '-.1234567890123456'::cube AS cube;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- simple lists (points)
|
-- simple lists (points)
|
||||||
|
SELECT '()'::cube AS cube;
|
||||||
|
cube
|
||||||
|
------
|
||||||
|
()
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '1,2'::cube AS cube;
|
SELECT '1,2'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
--------
|
--------
|
||||||
@ -200,6 +224,12 @@ SELECT '(1,2,3,4,5)'::cube AS cube;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- double lists (cubes)
|
-- double lists (cubes)
|
||||||
|
SELECT '(),()'::cube AS cube;
|
||||||
|
cube
|
||||||
|
------
|
||||||
|
()
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '(0),(0)'::cube AS cube;
|
SELECT '(0),(0)'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
------
|
------
|
||||||
@ -250,146 +280,145 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
|||||||
|
|
||||||
-- invalid input: parse errors
|
-- invalid input: parse errors
|
||||||
SELECT ''::cube AS cube;
|
SELECT ''::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT ''::cube AS cube;
|
LINE 1: SELECT ''::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT 'ABC'::cube AS cube;
|
SELECT 'ABC'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT 'ABC'::cube AS cube;
|
LINE 1: SELECT 'ABC'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "A"
|
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;
|
SELECT '[]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[]'::cube AS cube;
|
LINE 1: SELECT '[]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[()]'::cube AS cube;
|
SELECT '[()]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[()]'::cube AS cube;
|
LINE 1: SELECT '[()]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1)]'::cube AS cube;
|
SELECT '[(1)]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1)]'::cube AS cube;
|
LINE 1: SELECT '[(1)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1),]'::cube AS cube;
|
SELECT '[(1),]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),]'::cube AS cube;
|
LINE 1: SELECT '[(1),]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1),2]'::cube AS cube;
|
SELECT '[(1),2]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),2]'::cube AS cube;
|
LINE 1: SELECT '[(1),2]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "2"
|
DETAIL: syntax error at or near "2"
|
||||||
SELECT '[(1),(2),(3)]'::cube AS cube;
|
SELECT '[(1),(2),(3)]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube;
|
LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '1,'::cube AS cube;
|
SELECT '1,'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,'::cube AS cube;
|
LINE 1: SELECT '1,'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT '1,2,'::cube AS cube;
|
SELECT '1,2,'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2,'::cube AS cube;
|
LINE 1: SELECT '1,2,'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT '1,,2'::cube AS cube;
|
SELECT '1,,2'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,,2'::cube AS cube;
|
LINE 1: SELECT '1,,2'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '(1,)'::cube AS cube;
|
SELECT '(1,)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,)'::cube AS cube;
|
LINE 1: SELECT '(1,)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near ")"
|
||||||
SELECT '(1,2,)'::cube AS cube;
|
SELECT '(1,2,)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,)'::cube AS cube;
|
LINE 1: SELECT '(1,2,)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near ")"
|
||||||
SELECT '(1,,2)'::cube AS cube;
|
SELECT '(1,,2)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,,2)'::cube AS cube;
|
LINE 1: SELECT '(1,,2)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
-- invalid input: semantic errors and trailing garbage
|
-- invalid input: semantic errors and trailing garbage
|
||||||
SELECT '[(1),(2)],'::cube AS cube; -- 0
|
SELECT '[(1),(2)],'::cube AS cube; -- 0
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),(2)],'::cube AS cube;
|
LINE 1: SELECT '[(1),(2)],'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
|
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1,2,3),(2,3)]'::cube AS cube;
|
LINE 1: SELECT '[(1,2,3),(2,3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
||||||
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
|
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1,2),(1,2,3)]'::cube AS cube;
|
LINE 1: SELECT '[(1,2),(1,2,3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
||||||
SELECT '(1),(2),'::cube AS cube; -- 2
|
SELECT '(1),(2),'::cube AS cube; -- 2
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1),(2),'::cube AS cube;
|
LINE 1: SELECT '(1),(2),'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
|
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3),(2,3)'::cube AS cube;
|
LINE 1: SELECT '(1,2,3),(2,3)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
||||||
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
|
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2),(1,2,3)'::cube AS cube;
|
LINE 1: SELECT '(1,2),(1,2,3)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
||||||
SELECT '(1,2,3)ab'::cube AS cube; -- 4
|
SELECT '(1,2,3)ab'::cube AS cube; -- 4
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3)ab'::cube AS cube;
|
LINE 1: SELECT '(1,2,3)ab'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '(1,2,3)a'::cube AS cube; -- 5
|
SELECT '(1,2,3)a'::cube AS cube; -- 5
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3)a'::cube AS cube;
|
LINE 1: SELECT '(1,2,3)a'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '(1,2)('::cube AS cube; -- 5
|
SELECT '(1,2)('::cube AS cube; -- 5
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2)('::cube AS cube;
|
LINE 1: SELECT '(1,2)('::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "("
|
DETAIL: syntax error at or near "("
|
||||||
SELECT '1,2ab'::cube AS cube; -- 6
|
SELECT '1,2ab'::cube AS cube; -- 6
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2ab'::cube AS cube;
|
LINE 1: SELECT '1,2ab'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '1 e7'::cube AS cube; -- 6
|
SELECT '1 e7'::cube AS cube; -- 6
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1 e7'::cube AS cube;
|
LINE 1: SELECT '1 e7'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "e"
|
DETAIL: syntax error at or near "e"
|
||||||
SELECT '1,2a'::cube AS cube; -- 7
|
SELECT '1,2a'::cube AS cube; -- 7
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2a'::cube AS cube;
|
LINE 1: SELECT '1,2a'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '1..2'::cube AS cube; -- 7
|
SELECT '1..2'::cube AS cube; -- 7
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1..2'::cube AS cube;
|
LINE 1: SELECT '1..2'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ".2"
|
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
|
-- Testing building cubes from float8 values
|
||||||
--
|
--
|
||||||
@ -556,12 +585,12 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
|
|||||||
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
|
-- 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;
|
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
|
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...
|
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.
|
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;
|
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
|
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...
|
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.
|
DETAIL: A cube cannot have more than 100 dimensions.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -126,16 +126,34 @@ SELECT '-1.0e-7'::cube AS cube;
|
|||||||
(-1e-007)
|
(-1e-007)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '1e-700'::cube AS cube;
|
SELECT '1e-300'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
------
|
----------
|
||||||
(0)
|
(1e-300)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '-1e-700'::cube AS cube;
|
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
|
cube
|
||||||
------
|
-------
|
||||||
(0)
|
(NaN)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '1234567890123456'::cube AS cube;
|
SELECT '1234567890123456'::cube AS cube;
|
||||||
@ -175,6 +193,12 @@ SELECT '-.1234567890123456'::cube AS cube;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- simple lists (points)
|
-- simple lists (points)
|
||||||
|
SELECT '()'::cube AS cube;
|
||||||
|
cube
|
||||||
|
------
|
||||||
|
()
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '1,2'::cube AS cube;
|
SELECT '1,2'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
--------
|
--------
|
||||||
@ -200,6 +224,12 @@ SELECT '(1,2,3,4,5)'::cube AS cube;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- double lists (cubes)
|
-- double lists (cubes)
|
||||||
|
SELECT '(),()'::cube AS cube;
|
||||||
|
cube
|
||||||
|
------
|
||||||
|
()
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '(0),(0)'::cube AS cube;
|
SELECT '(0),(0)'::cube AS cube;
|
||||||
cube
|
cube
|
||||||
------
|
------
|
||||||
@ -250,146 +280,145 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
|||||||
|
|
||||||
-- invalid input: parse errors
|
-- invalid input: parse errors
|
||||||
SELECT ''::cube AS cube;
|
SELECT ''::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT ''::cube AS cube;
|
LINE 1: SELECT ''::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT 'ABC'::cube AS cube;
|
SELECT 'ABC'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT 'ABC'::cube AS cube;
|
LINE 1: SELECT 'ABC'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "A"
|
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;
|
SELECT '[]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[]'::cube AS cube;
|
LINE 1: SELECT '[]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[()]'::cube AS cube;
|
SELECT '[()]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[()]'::cube AS cube;
|
LINE 1: SELECT '[()]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1)]'::cube AS cube;
|
SELECT '[(1)]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1)]'::cube AS cube;
|
LINE 1: SELECT '[(1)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1),]'::cube AS cube;
|
SELECT '[(1),]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),]'::cube AS cube;
|
LINE 1: SELECT '[(1),]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "]"
|
DETAIL: syntax error at or near "]"
|
||||||
SELECT '[(1),2]'::cube AS cube;
|
SELECT '[(1),2]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),2]'::cube AS cube;
|
LINE 1: SELECT '[(1),2]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "2"
|
DETAIL: syntax error at or near "2"
|
||||||
SELECT '[(1),(2),(3)]'::cube AS cube;
|
SELECT '[(1),(2),(3)]'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube;
|
LINE 1: SELECT '[(1),(2),(3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '1,'::cube AS cube;
|
SELECT '1,'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,'::cube AS cube;
|
LINE 1: SELECT '1,'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT '1,2,'::cube AS cube;
|
SELECT '1,2,'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2,'::cube AS cube;
|
LINE 1: SELECT '1,2,'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at end of input
|
DETAIL: syntax error at end of input
|
||||||
SELECT '1,,2'::cube AS cube;
|
SELECT '1,,2'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,,2'::cube AS cube;
|
LINE 1: SELECT '1,,2'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '(1,)'::cube AS cube;
|
SELECT '(1,)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,)'::cube AS cube;
|
LINE 1: SELECT '(1,)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near ")"
|
||||||
SELECT '(1,2,)'::cube AS cube;
|
SELECT '(1,2,)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,)'::cube AS cube;
|
LINE 1: SELECT '(1,2,)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ")"
|
DETAIL: syntax error at or near ")"
|
||||||
SELECT '(1,,2)'::cube AS cube;
|
SELECT '(1,,2)'::cube AS cube;
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,,2)'::cube AS cube;
|
LINE 1: SELECT '(1,,2)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
-- invalid input: semantic errors and trailing garbage
|
-- invalid input: semantic errors and trailing garbage
|
||||||
SELECT '[(1),(2)],'::cube AS cube; -- 0
|
SELECT '[(1),(2)],'::cube AS cube; -- 0
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1),(2)],'::cube AS cube;
|
LINE 1: SELECT '[(1),(2)],'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
|
SELECT '[(1,2,3),(2,3)]'::cube AS cube; -- 1
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1,2,3),(2,3)]'::cube AS cube;
|
LINE 1: SELECT '[(1,2,3),(2,3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
||||||
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
|
SELECT '[(1,2),(1,2,3)]'::cube AS cube; -- 1
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '[(1,2),(1,2,3)]'::cube AS cube;
|
LINE 1: SELECT '[(1,2),(1,2,3)]'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
||||||
SELECT '(1),(2),'::cube AS cube; -- 2
|
SELECT '(1),(2),'::cube AS cube; -- 2
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1),(2),'::cube AS cube;
|
LINE 1: SELECT '(1),(2),'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ","
|
DETAIL: syntax error at or near ","
|
||||||
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
|
SELECT '(1,2,3),(2,3)'::cube AS cube; -- 3
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3),(2,3)'::cube AS cube;
|
LINE 1: SELECT '(1,2,3),(2,3)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
DETAIL: Different point dimensions in (1,2,3) and (2,3).
|
||||||
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
|
SELECT '(1,2),(1,2,3)'::cube AS cube; -- 3
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2),(1,2,3)'::cube AS cube;
|
LINE 1: SELECT '(1,2),(1,2,3)'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
DETAIL: Different point dimensions in (1,2) and (1,2,3).
|
||||||
SELECT '(1,2,3)ab'::cube AS cube; -- 4
|
SELECT '(1,2,3)ab'::cube AS cube; -- 4
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3)ab'::cube AS cube;
|
LINE 1: SELECT '(1,2,3)ab'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '(1,2,3)a'::cube AS cube; -- 5
|
SELECT '(1,2,3)a'::cube AS cube; -- 5
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2,3)a'::cube AS cube;
|
LINE 1: SELECT '(1,2,3)a'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '(1,2)('::cube AS cube; -- 5
|
SELECT '(1,2)('::cube AS cube; -- 5
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '(1,2)('::cube AS cube;
|
LINE 1: SELECT '(1,2)('::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "("
|
DETAIL: syntax error at or near "("
|
||||||
SELECT '1,2ab'::cube AS cube; -- 6
|
SELECT '1,2ab'::cube AS cube; -- 6
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2ab'::cube AS cube;
|
LINE 1: SELECT '1,2ab'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '1 e7'::cube AS cube; -- 6
|
SELECT '1 e7'::cube AS cube; -- 6
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1 e7'::cube AS cube;
|
LINE 1: SELECT '1 e7'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "e"
|
DETAIL: syntax error at or near "e"
|
||||||
SELECT '1,2a'::cube AS cube; -- 7
|
SELECT '1,2a'::cube AS cube; -- 7
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1,2a'::cube AS cube;
|
LINE 1: SELECT '1,2a'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near "a"
|
DETAIL: syntax error at or near "a"
|
||||||
SELECT '1..2'::cube AS cube; -- 7
|
SELECT '1..2'::cube AS cube; -- 7
|
||||||
ERROR: bad cube representation
|
ERROR: invalid input syntax for cube
|
||||||
LINE 1: SELECT '1..2'::cube AS cube;
|
LINE 1: SELECT '1..2'::cube AS cube;
|
||||||
^
|
^
|
||||||
DETAIL: syntax error at or near ".2"
|
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
|
-- Testing building cubes from float8 values
|
||||||
--
|
--
|
||||||
@ -556,12 +585,12 @@ SELECT cube(cube(1,2), 42, 24); -- cube_c_f8_f8
|
|||||||
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
|
-- 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;
|
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
|
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...
|
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.
|
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;
|
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
|
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...
|
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.
|
DETAIL: A cube cannot have more than 100 dimensions.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -29,8 +29,11 @@ SELECT '1e-7'::cube AS cube;
|
|||||||
SELECT '-1e-7'::cube AS cube;
|
SELECT '-1e-7'::cube AS cube;
|
||||||
SELECT '1.0e-7'::cube AS cube;
|
SELECT '1.0e-7'::cube AS cube;
|
||||||
SELECT '-1.0e-7'::cube AS cube;
|
SELECT '-1.0e-7'::cube AS cube;
|
||||||
SELECT '1e-700'::cube AS cube;
|
SELECT '1e-300'::cube AS cube;
|
||||||
SELECT '-1e-700'::cube AS cube;
|
SELECT '-1e-300'::cube AS cube;
|
||||||
|
SELECT 'infinity'::cube AS cube;
|
||||||
|
SELECT '-infinity'::cube AS cube;
|
||||||
|
SELECT 'NaN'::cube AS cube;
|
||||||
SELECT '1234567890123456'::cube AS cube;
|
SELECT '1234567890123456'::cube AS cube;
|
||||||
SELECT '+1234567890123456'::cube AS cube;
|
SELECT '+1234567890123456'::cube AS cube;
|
||||||
SELECT '-1234567890123456'::cube AS cube;
|
SELECT '-1234567890123456'::cube AS cube;
|
||||||
@ -39,12 +42,14 @@ SELECT '+.1234567890123456'::cube AS cube;
|
|||||||
SELECT '-.1234567890123456'::cube AS cube;
|
SELECT '-.1234567890123456'::cube AS cube;
|
||||||
|
|
||||||
-- simple lists (points)
|
-- simple lists (points)
|
||||||
|
SELECT '()'::cube AS cube;
|
||||||
SELECT '1,2'::cube AS cube;
|
SELECT '1,2'::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;
|
||||||
SELECT '(1,2,3,4,5)'::cube AS cube;
|
SELECT '(1,2,3,4,5)'::cube AS cube;
|
||||||
|
|
||||||
-- double lists (cubes)
|
-- double lists (cubes)
|
||||||
|
SELECT '(),()'::cube AS cube;
|
||||||
SELECT '(0),(0)'::cube AS cube;
|
SELECT '(0),(0)'::cube AS cube;
|
||||||
SELECT '(0),(1)'::cube AS cube;
|
SELECT '(0),(1)'::cube AS cube;
|
||||||
SELECT '[(0),(0)]'::cube AS cube;
|
SELECT '[(0),(0)]'::cube AS cube;
|
||||||
@ -57,7 +62,6 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
|||||||
-- invalid input: parse errors
|
-- invalid input: parse errors
|
||||||
SELECT ''::cube AS cube;
|
SELECT ''::cube AS cube;
|
||||||
SELECT 'ABC'::cube AS cube;
|
SELECT 'ABC'::cube AS cube;
|
||||||
SELECT '()'::cube AS cube;
|
|
||||||
SELECT '[]'::cube AS cube;
|
SELECT '[]'::cube AS cube;
|
||||||
SELECT '[()]'::cube AS cube;
|
SELECT '[()]'::cube AS cube;
|
||||||
SELECT '[(1)]'::cube AS cube;
|
SELECT '[(1)]'::cube AS cube;
|
||||||
@ -85,6 +89,7 @@ SELECT '1,2ab'::cube AS cube; -- 6
|
|||||||
SELECT '1 e7'::cube AS cube; -- 6
|
SELECT '1 e7'::cube AS cube; -- 6
|
||||||
SELECT '1,2a'::cube AS cube; -- 7
|
SELECT '1,2a'::cube AS cube; -- 7
|
||||||
SELECT '1..2'::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
|
-- Testing building cubes from float8 values
|
||||||
|
Loading…
x
Reference in New Issue
Block a user