mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
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);
|
||||
|
||||
if (cube_yyparse(&result) != 0)
|
||||
cube_yyerror(&result, "bogus input");
|
||||
cube_yyerror(&result, "cube parser failed");
|
||||
|
||||
cube_scanner_finish();
|
||||
|
||||
@ -254,12 +254,9 @@ cube_subset(PG_FUNCTION_ARGS)
|
||||
for (i = 0; i < dim; i++)
|
||||
{
|
||||
if ((dx[i] <= 0) || (dx[i] > DIM(c)))
|
||||
{
|
||||
pfree(result);
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
|
||||
errmsg("Index out of bounds")));
|
||||
}
|
||||
result->x[i] = c->x[dx[i] - 1];
|
||||
if (!IS_POINT(c))
|
||||
result->x[i + dim] = c->x[dx[i] + DIM(c) - 1];
|
||||
@ -276,27 +273,15 @@ cube_out(PG_FUNCTION_ARGS)
|
||||
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));
|
||||
appendStringInfoString(&buf, float8out_internal(LL_COORD(cube, i)));
|
||||
}
|
||||
appendStringInfoChar(&buf, ')');
|
||||
|
||||
@ -307,7 +292,7 @@ cube_out(PG_FUNCTION_ARGS)
|
||||
{
|
||||
if (i > 0)
|
||||
appendStringInfoString(&buf, ", ");
|
||||
appendStringInfo(&buf, "%.*g", ndig, UR_COORD(cube, i));
|
||||
appendStringInfoString(&buf, float8out_internal(UR_COORD(cube, i)));
|
||||
}
|
||||
appendStringInfoChar(&buf, ')');
|
||||
}
|
||||
@ -370,9 +355,6 @@ g_cube_union(PG_FUNCTION_ARGS)
|
||||
NDBOX *tmp;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "union\n");
|
||||
*/
|
||||
tmp = DatumGetNDBOX(entryvec->vector[0].key);
|
||||
|
||||
/*
|
||||
@ -441,9 +423,6 @@ g_cube_penalty(PG_FUNCTION_ARGS)
|
||||
rt_cube_size(DatumGetNDBOX(origentry->key), &tmp2);
|
||||
*result = (float) (tmp1 - tmp2);
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result);
|
||||
*/
|
||||
PG_RETURN_FLOAT8(*result);
|
||||
}
|
||||
|
||||
@ -484,9 +463,6 @@ g_cube_picksplit(PG_FUNCTION_ARGS)
|
||||
*right;
|
||||
OffsetNumber maxoff;
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "picksplit\n");
|
||||
*/
|
||||
maxoff = entryvec->n - 2;
|
||||
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
|
||||
v->spl_left = (OffsetNumber *) palloc(nbytes);
|
||||
@ -617,9 +593,6 @@ g_cube_same(PG_FUNCTION_ARGS)
|
||||
else
|
||||
*result = FALSE;
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "same: %s\n", (*result ? "TRUE" : "FALSE" ));
|
||||
*/
|
||||
PG_RETURN_NDBOX(result);
|
||||
}
|
||||
|
||||
@ -633,9 +606,6 @@ g_cube_leaf_consistent(NDBOX *key,
|
||||
{
|
||||
bool retval;
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "leaf_consistent, %d\n", strategy);
|
||||
*/
|
||||
switch (strategy)
|
||||
{
|
||||
case RTOverlapStrategyNumber:
|
||||
@ -665,9 +635,6 @@ g_cube_internal_consistent(NDBOX *key,
|
||||
{
|
||||
bool retval;
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "internal_consistent, %d\n", strategy);
|
||||
*/
|
||||
switch (strategy)
|
||||
{
|
||||
case RTOverlapStrategyNumber:
|
||||
@ -865,12 +832,8 @@ cube_size(PG_FUNCTION_ARGS)
|
||||
{
|
||||
NDBOX *a = PG_GETARG_NDBOX(0);
|
||||
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_RETURN_FLOAT8(result);
|
||||
}
|
||||
@ -878,17 +841,26 @@ cube_size(PG_FUNCTION_ARGS)
|
||||
void
|
||||
rt_cube_size(NDBOX *a, double *size)
|
||||
{
|
||||
double result;
|
||||
int i;
|
||||
|
||||
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
|
||||
{
|
||||
*size = 1.0;
|
||||
result = 1.0;
|
||||
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
|
||||
@ -1155,10 +1127,6 @@ cube_overlap_v0(NDBOX *a, NDBOX *b)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* This *very bad* error was found in the source: if ( (a==NULL) ||
|
||||
* (b=NULL) ) return(FALSE);
|
||||
*/
|
||||
if ((a == NULL) || (b == NULL))
|
||||
return (FALSE);
|
||||
|
||||
@ -1370,7 +1338,9 @@ g_cube_distance(PG_FUNCTION_ARGS)
|
||||
{
|
||||
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)];
|
||||
else
|
||||
retval = Min(cube->x[(coord - 1) % DIM(cube)],
|
||||
|
@ -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
|
||||
@ -29,6 +33,7 @@ typedef struct NDBOX
|
||||
double x[FLEXIBLE_ARRAY_MEMBER];
|
||||
} NDBOX;
|
||||
|
||||
/* NDBOX access macros */
|
||||
#define POINT_BIT 0x80000000
|
||||
#define DIM_MASK 0x7fffffff
|
||||
|
||||
@ -43,10 +48,12 @@ typedef struct NDBOX
|
||||
#define POINT_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim))
|
||||
#define CUBE_SIZE(_dim) (offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
|
||||
|
||||
/* fmgr interface macros */
|
||||
#define DatumGetNDBOX(x) ((NDBOX *) PG_DETOAST_DATUM(x))
|
||||
#define PG_GETARG_NDBOX(x) DatumGetNDBOX(PG_GETARG_DATUM(x))
|
||||
#define PG_RETURN_NDBOX(x) PG_RETURN_POINTER(x)
|
||||
|
||||
/* GiST operator strategy numbers */
|
||||
#define CubeKNNDistanceCoord 15 /* ~> */
|
||||
#define CubeKNNDistanceTaxicab 16 /* <#> */
|
||||
#define CubeKNNDistanceEuclid 17 /* <-> */
|
||||
|
@ -4,12 +4,13 @@
|
||||
/* NdBox = [(lowerleft),(upperright)] */
|
||||
/* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */
|
||||
|
||||
#define YYSTYPE char *
|
||||
#define YYDEBUG 1
|
||||
|
||||
#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,9 +26,9 @@
|
||||
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);
|
||||
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);
|
||||
|
||||
%}
|
||||
|
||||
@ -46,47 +47,48 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
|
||||
{
|
||||
int dim;
|
||||
|
||||
dim = delim_count($2, ',') + 1;
|
||||
if ((delim_count($4, ',') + 1) != dim)
|
||||
dim = item_count($2, ',');
|
||||
if (item_count($4, ',') != dim)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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) {
|
||||
if (dim > CUBE_MAX_DIM)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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 = delim_count($1, ',') + 1;
|
||||
|
||||
if ( (delim_count($3, ',') + 1) != dim ) {
|
||||
dim = item_count($1, ',');
|
||||
if (item_count($3, ',') != dim)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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) {
|
||||
if (dim > CUBE_MAX_DIM)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||
errmsg("invalid input syntax for cube"),
|
||||
errdetail("A cube cannot have more than %d dimensions.",
|
||||
CUBE_MAX_DIM)));
|
||||
YYABORT;
|
||||
@ -99,33 +101,36 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
|
||||
{
|
||||
int dim;
|
||||
|
||||
dim = delim_count($1, ',') + 1;
|
||||
if (dim > CUBE_MAX_DIM) {
|
||||
dim = item_count($1, ',');
|
||||
if (dim > CUBE_MAX_DIM)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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($1, dim);
|
||||
*result = write_point_as_box(dim, $1);
|
||||
}
|
||||
|
||||
| list
|
||||
{
|
||||
int dim;
|
||||
|
||||
dim = delim_count($1, ',') + 1;
|
||||
if (dim > CUBE_MAX_DIM) {
|
||||
dim = item_count($1, ',');
|
||||
if (dim > CUBE_MAX_DIM)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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($1, dim);
|
||||
|
||||
*result = write_point_as_box(dim, $1);
|
||||
}
|
||||
;
|
||||
|
||||
@ -133,6 +138,10 @@ paren_list: O_PAREN list C_PAREN
|
||||
{
|
||||
$$ = $2;
|
||||
}
|
||||
| O_PAREN C_PAREN
|
||||
{
|
||||
$$ = pstrdup("");
|
||||
}
|
||||
;
|
||||
|
||||
list: CUBEFLOAT
|
||||
@ -151,24 +160,30 @@ list: CUBEFLOAT
|
||||
|
||||
%%
|
||||
|
||||
/* This assumes the string has been normalized by productions above */
|
||||
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++;
|
||||
s++;
|
||||
nitems++;
|
||||
while ((s = strchr(s, delim)) != NULL)
|
||||
{
|
||||
nitems++;
|
||||
s++;
|
||||
}
|
||||
}
|
||||
return (ndelim);
|
||||
return nitems;
|
||||
}
|
||||
|
||||
static NDBOX *
|
||||
write_box(unsigned int dim, char *str1, char *str2)
|
||||
write_box(int dim, char *str1, char *str2)
|
||||
{
|
||||
NDBOX *bp;
|
||||
char *s;
|
||||
char *endptr;
|
||||
int i;
|
||||
int size = CUBE_SIZE(dim);
|
||||
bool point = true;
|
||||
@ -178,50 +193,58 @@ write_box(unsigned int dim, char *str1, char *str2)
|
||||
SET_DIM(bp, dim);
|
||||
|
||||
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)
|
||||
{
|
||||
s++; i++;
|
||||
bp->x[i] = strtod(s, NULL);
|
||||
s++;
|
||||
bp->x[i++] = float8in_internal(s, &endptr, "cube", str1);
|
||||
}
|
||||
Assert(i == dim);
|
||||
|
||||
s = str2;
|
||||
bp->x[i=dim] = strtod(s, NULL);
|
||||
if (bp->x[dim] != bp->x[0])
|
||||
point = false;
|
||||
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++; i++;
|
||||
bp->x[i] = strtod(s, NULL);
|
||||
if (bp->x[i] != bp->x[i-dim])
|
||||
point = false;
|
||||
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
|
||||
* 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.
|
||||
* 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);
|
||||
return bp;
|
||||
}
|
||||
|
||||
static NDBOX *
|
||||
write_point_as_box(char *str, int dim)
|
||||
write_point_as_box(int dim, char *str)
|
||||
{
|
||||
NDBOX *bp;
|
||||
int i,
|
||||
size;
|
||||
double x;
|
||||
char *s = str;
|
||||
char *s;
|
||||
char *endptr;
|
||||
|
||||
size = POINT_SIZE(dim);
|
||||
bp = palloc0(size);
|
||||
@ -229,17 +252,18 @@ write_point_as_box(char *str, int dim)
|
||||
SET_DIM(bp, dim);
|
||||
SET_POINT_BIT(bp);
|
||||
|
||||
s = str;
|
||||
i = 0;
|
||||
x = strtod(s, NULL);
|
||||
bp->x[0] = x;
|
||||
if (dim > 0)
|
||||
bp->x[i++] = float8in_internal(s, &endptr, "cube", str);
|
||||
while ((s = strchr(s, ',')) != NULL)
|
||||
{
|
||||
s++; i++;
|
||||
x = strtod(s, NULL);
|
||||
bp->x[i] = x;
|
||||
s++;
|
||||
bp->x[i++] = float8in_internal(s, &endptr, "cube", str);
|
||||
}
|
||||
Assert(i == dim);
|
||||
|
||||
return(bp);
|
||||
return bp;
|
||||
}
|
||||
|
||||
#include "cubescan.c"
|
||||
|
@ -38,36 +38,41 @@ n [0-9]+
|
||||
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;
|
||||
\, 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_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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_SYNTAX_ERROR),
|
||||
errmsg("bad cube representation"),
|
||||
(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)));
|
||||
}
|
||||
|
@ -126,16 +126,34 @@ SELECT '-1.0e-7'::cube AS cube;
|
||||
(-1e-07)
|
||||
(1 row)
|
||||
|
||||
SELECT '1e-700'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
(0)
|
||||
SELECT '1e-300'::cube AS cube;
|
||||
cube
|
||||
----------
|
||||
(1e-300)
|
||||
(1 row)
|
||||
|
||||
SELECT '-1e-700'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
(0)
|
||||
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;
|
||||
@ -175,6 +193,12 @@ SELECT '-.1234567890123456'::cube AS cube;
|
||||
(1 row)
|
||||
|
||||
-- simple lists (points)
|
||||
SELECT '()'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
()
|
||||
(1 row)
|
||||
|
||||
SELECT '1,2'::cube AS cube;
|
||||
cube
|
||||
--------
|
||||
@ -200,6 +224,12 @@ SELECT '(1,2,3,4,5)'::cube AS cube;
|
||||
(1 row)
|
||||
|
||||
-- double lists (cubes)
|
||||
SELECT '(),()'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
()
|
||||
(1 row)
|
||||
|
||||
SELECT '(0),(0)'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
@ -250,146 +280,145 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
||||
|
||||
-- invalid input: parse errors
|
||||
SELECT ''::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
LINE 1: SELECT '()'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near ")"
|
||||
SELECT '[]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
ERROR: invalid input syntax for cube
|
||||
LINE 1: SELECT '[]'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near "]"
|
||||
SELECT '[()]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
ERROR: invalid input syntax for cube
|
||||
LINE 1: SELECT '[()]'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near ")"
|
||||
DETAIL: syntax error at or near "]"
|
||||
SELECT '[(1)]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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
|
||||
--
|
||||
@ -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.
|
||||
--
|
||||
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...
|
||||
^
|
||||
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
|
||||
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.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -126,16 +126,34 @@ SELECT '-1.0e-7'::cube AS cube;
|
||||
(-1e-007)
|
||||
(1 row)
|
||||
|
||||
SELECT '1e-700'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
(0)
|
||||
SELECT '1e-300'::cube AS cube;
|
||||
cube
|
||||
----------
|
||||
(1e-300)
|
||||
(1 row)
|
||||
|
||||
SELECT '-1e-700'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
(0)
|
||||
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;
|
||||
@ -175,6 +193,12 @@ SELECT '-.1234567890123456'::cube AS cube;
|
||||
(1 row)
|
||||
|
||||
-- simple lists (points)
|
||||
SELECT '()'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
()
|
||||
(1 row)
|
||||
|
||||
SELECT '1,2'::cube AS cube;
|
||||
cube
|
||||
--------
|
||||
@ -200,6 +224,12 @@ SELECT '(1,2,3,4,5)'::cube AS cube;
|
||||
(1 row)
|
||||
|
||||
-- double lists (cubes)
|
||||
SELECT '(),()'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
()
|
||||
(1 row)
|
||||
|
||||
SELECT '(0),(0)'::cube AS cube;
|
||||
cube
|
||||
------
|
||||
@ -250,146 +280,145 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
||||
|
||||
-- invalid input: parse errors
|
||||
SELECT ''::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
LINE 1: SELECT '()'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near ")"
|
||||
SELECT '[]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
ERROR: invalid input syntax for cube
|
||||
LINE 1: SELECT '[]'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near "]"
|
||||
SELECT '[()]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
ERROR: invalid input syntax for cube
|
||||
LINE 1: SELECT '[()]'::cube AS cube;
|
||||
^
|
||||
DETAIL: syntax error at or near ")"
|
||||
DETAIL: syntax error at or near "]"
|
||||
SELECT '[(1)]'::cube AS cube;
|
||||
ERROR: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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: bad cube representation
|
||||
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
|
||||
--
|
||||
@ -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.
|
||||
--
|
||||
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...
|
||||
^
|
||||
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
|
||||
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.
|
||||
|
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 '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 '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;
|
||||
@ -39,12 +42,14 @@ SELECT '+.1234567890123456'::cube AS cube;
|
||||
SELECT '-.1234567890123456'::cube AS cube;
|
||||
|
||||
-- simple lists (points)
|
||||
SELECT '()'::cube AS cube;
|
||||
SELECT '1,2'::cube AS cube;
|
||||
SELECT '(1,2)'::cube AS cube;
|
||||
SELECT '1,2,3,4,5'::cube AS cube;
|
||||
SELECT '(1,2,3,4,5)'::cube AS cube;
|
||||
|
||||
-- double lists (cubes)
|
||||
SELECT '(),()'::cube AS cube;
|
||||
SELECT '(0),(0)'::cube AS cube;
|
||||
SELECT '(0),(1)'::cube AS cube;
|
||||
SELECT '[(0),(0)]'::cube AS cube;
|
||||
@ -57,7 +62,6 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
|
||||
-- invalid input: parse errors
|
||||
SELECT ''::cube AS cube;
|
||||
SELECT 'ABC'::cube AS cube;
|
||||
SELECT '()'::cube AS cube;
|
||||
SELECT '[]'::cube AS cube;
|
||||
SELECT '[()]'::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,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
|
||||
|
Loading…
Reference in New Issue
Block a user