[postgis-commits] svn - r3113 - in trunk: liblwgeom lwgeom regress
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Wed Oct 15 08:03:54 PDT 2008
Author: mcayland
Date: 2008-10-15 08:03:54 -0700 (Wed, 15 Oct 2008)
New Revision: 3113
Modified:
trunk/liblwgeom/liblwgeom.h
trunk/liblwgeom/lwgparse.c
trunk/liblwgeom/lwgunparse.c
trunk/liblwgeom/wktparse.h
trunk/lwgeom/lwgeom_pg.c
trunk/lwgeom/lwgeom_pg.h
trunk/regress/regress_expected
trunk/regress/regress_ogc_expected
trunk/regress/wkt_expected
Log:
Update the LWGEOM parser to provide error HINTs when being called from PostgreSQL, and update regression tests accordingly.
Modified: trunk/liblwgeom/liblwgeom.h
===================================================================
--- trunk/liblwgeom/liblwgeom.h 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/liblwgeom/liblwgeom.h 2008-10-15 15:03:54 UTC (rev 3113)
@@ -1121,6 +1121,7 @@
*/
typedef struct struct_lwgeom_parser_result
{
+ const char *wkinput; /* Copy of pointer to input WKT/WKB */
uchar *serialized_lwgeom; /* Pointer to serialized LWGEOM */
int size; /* Size of serialized LWGEOM in bytes */
const char *message; /* Error/warning message */
@@ -1143,6 +1144,7 @@
*/
typedef struct struct_lwgeom_unparser_result
{
+ uchar *serialized_lwgeom; /* Copy of pointer to input serialized LWGEOM */
char *wkoutput; /* Pointer to WKT or WKB output */
int size; /* Size of serialized LWGEOM in bytes */
const char *message; /* Error/warning message */
Modified: trunk/liblwgeom/lwgparse.c
===================================================================
--- trunk/liblwgeom/lwgparse.c 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/liblwgeom/lwgparse.c 2008-10-15 15:03:54 UTC (rev 3113)
@@ -1179,6 +1179,7 @@
current_parser_check_flags = flags;
lwg_parser_result->serialized_lwgeom = NULL;
lwg_parser_result->size = 0;
+ lwg_parser_result->wkinput = geometry;
init_parser(geometry);
Modified: trunk/liblwgeom/lwgunparse.c
===================================================================
--- trunk/liblwgeom/lwgunparse.c 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/liblwgeom/lwgunparse.c 2008-10-15 15:03:54 UTC (rev 3113)
@@ -628,6 +628,7 @@
current_unparser_check_flags = flags;
lwg_unparser_result->wkoutput = NULL;
lwg_unparser_result->size = 0;
+ lwg_unparser_result->serialized_lwgeom = serialized;
unparser_ferror_occured = 0;
local_malloc=alloc;
@@ -956,6 +957,7 @@
current_unparser_check_flags = flags;
lwg_unparser_result->wkoutput = NULL;
lwg_unparser_result->size = 0;
+ lwg_unparser_result->serialized_lwgeom = serialized;
unparser_ferror_occured = 0;
local_malloc=alloc;
Modified: trunk/liblwgeom/wktparse.h
===================================================================
--- trunk/liblwgeom/wktparse.h 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/liblwgeom/wktparse.h 2008-10-15 15:03:54 UTC (rev 3113)
@@ -22,6 +22,7 @@
typedef struct struct_lwgeom_parser_result
{
+ const char *wkinput;
SERIALIZED_LWGEOM *serialized_lwgeom;
int size;
const char *message;
@@ -30,6 +31,7 @@
typedef struct struct_lwgeom_unparser_result
{
+ uchar *serialized_lwgeom;
char *wkoutput;
int size;
const char *message;
Modified: trunk/lwgeom/lwgeom_pg.c
===================================================================
--- trunk/lwgeom/lwgeom_pg.c 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/lwgeom/lwgeom_pg.c 2008-10-15 15:03:54 UTC (rev 3113)
@@ -19,12 +19,50 @@
PG_MODULE_MAGIC;
#endif
+
/*
- * Global pointer for parser/unparser error messages
+ * Error message parsing functions
+ *
+ * Produces nicely formatted messages for parser/unparser errors with optional HINT
*/
-char *parser_message;
+void
+pg_parser_errhint(LWGEOM_PARSER_RESULT *lwg_parser_result)
+{
+ char hintbuffer[128];
+ char *hintstart;
+ char *hintfinish;
+ /* Generate the HINT string as the last 40 chars up until the error location */
+ hintbuffer[0] = '\0';
+ hintfinish = (char *)lwg_parser_result->wkinput + lwg_parser_result->errlocation;
+
+ if (lwg_parser_result->errlocation <= 40)
+ hintstart = (char *)lwg_parser_result->wkinput;
+ else
+ hintstart = hintfinish - 40;
+
+ /* If we are not at the start of the buffer, prefix with "..." */
+ if (hintstart != lwg_parser_result->wkinput)
+ strncpy(hintbuffer, "...", 3);
+
+ /* Append to the existing string */
+ strncat(hintbuffer, hintstart, hintfinish-hintstart);
+
+ ereport(ERROR,
+ (errmsg("%s", lwg_parser_result->message),
+ errhint("\"%s\" <-- parse error at position %d within geometry", hintbuffer, lwg_parser_result->errlocation))
+ );
+}
+
+void
+pg_unparser_errhint(LWGEOM_UNPARSER_RESULT *lwg_unparser_result)
+{
+ /* For the unparser simply output the error message without any associated HINT */
+ elog(ERROR, "%s", lwg_unparser_result->message);
+}
+
+
void *
pg_alloc(size_t size)
{
@@ -416,5 +454,3 @@
return lw_get_int32(loc);
}
-
-
Modified: trunk/lwgeom/lwgeom_pg.h
===================================================================
--- trunk/lwgeom/lwgeom_pg.h 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/lwgeom/lwgeom_pg.h 2008-10-15 15:03:54 UTC (rev 3113)
@@ -48,9 +48,13 @@
/*
* Standard macro for reporting parser errors to PostgreSQL
*/
+
+extern void pg_parser_errhint(LWGEOM_PARSER_RESULT *lwg_parser_result);
+extern void pg_unparser_errhint(LWGEOM_UNPARSER_RESULT *lwg_unparser_result);
+
#define PG_PARSER_ERROR(lwg_parser_result) \
do { \
- elog(ERROR, "%s", lwg_parser_result.message); \
+ pg_parser_errhint(&lwg_parser_result); \
} while(0);
/*
@@ -58,7 +62,7 @@
*/
#define PG_UNPARSER_ERROR(lwg_unparser_result) \
do { \
- elog(ERROR, "%s", lwg_unparser_result.message); \
+ pg_unparser_errhint(&lwg_unparser_result); \
} while(0);
Modified: trunk/regress/regress_expected
===================================================================
--- trunk/regress/regress_expected 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/regress/regress_expected 2008-10-15 15:03:54 UTC (rev 3113)
@@ -48,20 +48,33 @@
48|MULTIPOINT(-1 -2 -3,5.4 6.6 7.77,-5.4 -6.6 -7.77,1000000 1e-6 -1000000,-1.3e-6 -1.4e-5 0)
49|GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1 1)))
ERROR: parse error - invalid geometry
+HINT: "POINT()" <-- parse error at position 7 within geometry
ERROR: parse error - invalid geometry
+HINT: "POINT(1)" <-- parse error at position 8 within geometry
ERROR: parse error - invalid geometry
+HINT: "POINT(," <-- parse error at position 7 within geometry
ERROR: parse error - invalid geometry
+HINT: "MULTIPOINT(," <-- parse error at position 12 within geometry
ERROR: parse error - invalid geometry
+HINT: "POINT(" <-- parse error at position 6 within geometry
ERROR: parse error - invalid geometry
+HINT: "MULTIPOINT()" <-- parse error at position 12 within geometry
ERROR: geometry contains non-closed rings
+HINT: "POLYGON( (0 0, 10 0, 10 10, 0 10)" <-- parse error at position 33 within geometry
ERROR: geometry contains non-closed rings
+HINT: "... 10 10, 0 10, 0 0),(5 5, 7 5, 7 7 , 5 7)" <-- parse error at position 60 within geometry
ERROR: parse error - invalid geometry
+HINT: "...TILINESTRING((0 0, 1 1),(0 0, 1 1, 2 2,)" <-- parse error at position 43 within geometry
ERROR: parse error - invalid geometry
+HINT: "POINT(1 2 3," <-- parse error at position 12 within geometry
ERROR: parse error - invalid geometry
+HINT: "POINT(1 2 3 4 5" <-- parse error at position 15 within geometry
ERROR: geometry requires more points
+HINT: "LINESTRING(1 1)" <-- parse error at position 15 within geometry
62|POINT(inf 0)
63|POINT(-inf 0)
ERROR: parse error - invalid geometry
+HINT: "MULTIPOINT(1 1, 2 2" <-- parse error at position 19 within geometry
65|t
66|f
67|t
Modified: trunk/regress/regress_ogc_expected
===================================================================
--- trunk/regress/regress_ogc_expected 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/regress/regress_ogc_expected 2008-10-15 15:03:54 UTC (rev 3113)
@@ -73,6 +73,7 @@
linemerge149|LINESTRING(-5 -5,0 0,1 1,4 4)
intersects|f
ERROR: geometry requires more points
+HINT: "POLYGON((0 0, 1 1, 0 0)" <-- parse error at position 23 within geometry
buffer|POLYGON((1 0,0.707107 -0.707107,0 -1,-0.707107 -0.707107,-1 0,-0.707107 0.707107,0 1,0.707107 0.707107,1 0))
geomunion|MULTIPOINT(0 0,1 1)
unite_garray|t
Modified: trunk/regress/wkt_expected
===================================================================
--- trunk/regress/wkt_expected 2008-10-15 13:43:59 UTC (rev 3112)
+++ trunk/regress/wkt_expected 2008-10-15 15:03:54 UTC (rev 3113)
@@ -1,32 +1,47 @@
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "POINT(EMPTY" <-- parse error at position 11 within geometry
POINT(0 0)
ERROR: parse error - invalid geometry
+HINT: "POINT((" <-- parse error at position 7 within geometry
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "MULTIPOINT(EMPTY" <-- parse error at position 16 within geometry
MULTIPOINT(0 0,2 0)
MULTIPOINT(0 0,2 0)
ERROR: parse error - invalid geometry
+HINT: "MULTIPOINT((0 0), (2 0), EMPTY" <-- parse error at position 30 within geometry
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "LINESTRING(EMPTY" <-- parse error at position 16 within geometry
LINESTRING(0 0,1 1)
ERROR: parse error - invalid geometry
+HINT: "LINESTRING((" <-- parse error at position 12 within geometry
ERROR: parse error - invalid geometry
+HINT: "LINESTRING((" <-- parse error at position 12 within geometry
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "MULTILINESTRING(EMPTY" <-- parse error at position 21 within geometry
ERROR: parse error - invalid geometry
+HINT: "MULTILINESTRING(0" <-- parse error at position 17 within geometry
MULTILINESTRING((0 0,2 0))
MULTILINESTRING((0 0,2 0),(1 1,2 2))
ERROR: parse error - invalid geometry
+HINT: "...LINESTRING((0 0, 2 0), (1 1, 2 2), EMPTY" <-- parse error at position 45 within geometry
ERROR: parse error - invalid geometry
+HINT: "...INESTRING((0 0, 2 0), (1 1, 2 2), (EMPTY" <-- parse error at position 46 within geometry
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "POLYGON(EMPTY" <-- parse error at position 13 within geometry
POLYGON((0 0,1 0,1 1,0 1,0 0))
POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "MULTIPOLYGON(EMPTY" <-- parse error at position 18 within geometry
ERROR: parse error - invalid geometry
+HINT: "MULTIPOLYGON((EMPTY" <-- parse error at position 19 within geometry
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2)))
GEOMETRYCOLLECTION EMPTY
GEOMETRYCOLLECTION EMPTY
ERROR: parse error - invalid geometry
+HINT: "GEOMETRYCOLLECTION((" <-- parse error at position 20 within geometry
More information about the postgis-commits
mailing list