Changeset: bcf9a44588ba for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bcf9a44588ba
Modified Files:
gdk/gdk_logger.c
gdk/gdk_project.c
geom/monetdb5/geom.c
geom/monetdb5/geomBulk.c
geom/monetdb5/geom_upgrade.c
monetdb5/mal/mal_authorize.c
monetdb5/modules/kernel/aggr.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_statistics.c
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/storage/bat/bat_storage.c
sql/test/emptydb-upgrade-chain/Tests/check.stable.out.32bit
sql/test/emptydb-upgrade/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.32bit
Branch: data-vaults
Log Message:
Merge with default
diffs (truncated from 1238 to 300 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1227,18 +1227,27 @@ bm_subcommit(logger *lg, BAT *list_bid,
BAT *bids, *nmes, *tids;
tids = bm_tids(catalog_bid, dcatalog);
- bids = logbat_new(TYPE_int, BATSIZE, PERSISTENT);
- nmes = logbat_new(TYPE_str, BATSIZE, PERSISTENT);
- if (tids == NULL || bids == NULL || nmes == NULL) {
- if (tids)
- BBPunfix(tids->batCacheid);
- BBPreclaim(bids);
- BBPreclaim(nmes);
+ if (tids == NULL) {
GDKfree(n);
return GDK_FAIL;
}
- BATappend(bids, catalog_bid, tids, TRUE);
- BATappend(nmes, catalog_nme, tids, TRUE);
+ bids = logbat_new(TYPE_int, BATcount(tids), PERSISTENT);
+ nmes = logbat_new(TYPE_str, BATcount(tids), PERSISTENT);
+ if (bids == NULL || nmes == NULL) {
+ logbat_destroy(tids);
+ logbat_destroy(bids);
+ logbat_destroy(nmes);
+ GDKfree(n);
+ return GDK_FAIL;
+ }
+ if (BATappend(bids, catalog_bid, tids, TRUE) != GDK_SUCCEED ||
+ BATappend(nmes, catalog_nme, tids, TRUE) != GDK_SUCCEED) {
+ logbat_destroy(tids);
+ logbat_destroy(bids);
+ logbat_destroy(nmes);
+ GDKfree(n);
+ return GDK_FAIL;
+ }
logbat_destroy(tids);
BATclear(dcatalog, TRUE);
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -747,6 +747,7 @@ BATprojectchain(BAT **bats)
return bn;
bunins_failed:
+ GDKfree(ba);
BBPreclaim(bn);
return NULL;
}
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -464,7 +464,7 @@ wkbTransform(wkb **transformedWKB, wkb *
ret = createException(MAL, "geom.Transform", "Unknown geometry
type");
}
- if (transformedGeosGeometry) {
+ if (ret == MAL_SUCCEED && transformedGeosGeometry) {
/* set the new srid */
GEOSSetSRID(transformedGeosGeometry, *srid_dst);
/* get the wkb */
@@ -2670,7 +2670,7 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
}
//all remaining should be internal
- internalGeometries = GDKmalloc((itemsNum - 1) * sizeof(GEOSGeom
*));
+ internalGeometries = GDKmalloc((itemsNum - 1) *
sizeof(GEOSGeom));
if (internalGeometries == NULL) {
GEOSGeom_destroy(linearRingExternalGeometry);
ret = createException(MAL, "geom.MLineStringToPolygon",
MAL_MALLOC_FAIL);
@@ -2730,8 +2730,8 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
GEOSGeom_destroy(finalGeometry);
- throw(MAL, "geom.MLineStringToPolygon", "The provided
MultiLineString does not create a valid Polygon");
-
+ ret = createException(MAL, "geom.MLineStringToPolygon",
"The provided MultiLineString does not create a valid Polygon");
+ goto bailout;
}
GEOSSetSRID(finalGeometry, *srid);
@@ -3047,6 +3047,7 @@ wkbMakePolygon(wkb **out, wkb **external
GEOSGeom geosGeometry, externalGeometry, linearRingGeometry;
bit closed = 0;
GEOSCoordSeq coordSeq_copy;
+ str err;
if (wkb_isnil(*external) || *srid == int_nil) {
if ((*out = wkbNULLcopy()) == NULL)
@@ -3065,7 +3066,10 @@ wkbMakePolygon(wkb **out, wkb **external
throw(MAL, "geom.Polygon", "Geometries should be LineString");
}
//check whether the linestring is closed
- wkbIsClosed(&closed, external);
+ if ((err = wkbIsClosed(&closed, external)) != MAL_SUCCEED) {
+ GEOSGeom_destroy(externalGeometry);
+ return err;
+ }
if (!closed) {
*out = NULL;
GEOSGeom_destroy(externalGeometry);
@@ -3111,13 +3115,14 @@ str
wkbMakeLine(wkb **out, wkb **geom1WKB, wkb **geom2WKB)
{
GEOSGeom outGeometry, geom1Geometry, geom2Geometry;
- GEOSCoordSeq outCoordSeq;
+ GEOSCoordSeq outCoordSeq = NULL;
const GEOSCoordSequence *geom1CoordSeq = NULL, *geom2CoordSeq = NULL;
unsigned int i = 0, geom1Size = 0, geom2Size = 0;
unsigned geom1Dimension = 0, geom2Dimension = 0;
double x, y, z;
str err = MAL_SUCCEED;
+ *out = NULL;
if (wkb_isnil(*geom1WKB) || wkb_isnil(*geom2WKB)) {
if ((*out = wkbNULLcopy()) == NULL)
throw(MAL, "geom.MakeLine", MAL_MALLOC_FAIL);
@@ -3139,78 +3144,93 @@ wkbMakeLine(wkb **out, wkb **geom1WKB, w
//make sure the geometries are of the same srid
if (GEOSGetSRID(geom1Geometry) != GEOSGetSRID(geom2Geometry)) {
err = createException(MAL, "geom.MakeLine", "Geometries of
different SRID");
+ goto bailout;
}
//check the types of the geometries
- else if (GEOSGeomTypeId(geom1Geometry) + 1 != wkbPoint_mdb &&
+ if (GEOSGeomTypeId(geom1Geometry) + 1 != wkbPoint_mdb &&
GEOSGeomTypeId(geom1Geometry) + 1 != wkbLineString_mdb &&
GEOSGeomTypeId(geom2Geometry) + 1 != wkbPoint_mdb &&
GEOSGeomTypeId(geom2Geometry) + 1 != wkbLineString_mdb) {
err = createException(MAL, "geom.MakeLine", "Geometries should
be Point or LineString");
+ goto bailout;
}
//get the coordinate sequences of the geometries
- else if ((geom1CoordSeq = GEOSGeom_getCoordSeq(geom1Geometry)) == NULL
||
+ if ((geom1CoordSeq = GEOSGeom_getCoordSeq(geom1Geometry)) == NULL ||
(geom2CoordSeq = GEOSGeom_getCoordSeq(geom2Geometry)) == NULL)
{
err = createException(MAL, "geom.MakeLine",
"GEOSGeom_getCoordSeq failed");
+ goto bailout;
}
//make sure that the dimensions of the geometries are the same
- else if (!GEOSCoordSeq_getDimensions(geom1CoordSeq, &geom1Dimension) ||
+ if (!GEOSCoordSeq_getDimensions(geom1CoordSeq, &geom1Dimension) ||
!GEOSCoordSeq_getDimensions(geom2CoordSeq, &geom2Dimension)) {
err = createException(MAL, "geom.MakeLine",
"GEOSGeom_getDimensions failed");
- }
- else if (geom1Dimension != geom2Dimension) {
+ goto bailout;
+ }
+ if (geom1Dimension != geom2Dimension) {
err = createException(MAL, "geom.MakeLine", "Geometries should
be of the same dimension");
+ goto bailout;
}
//get the number of coordinates in the two geometries
- else if (!GEOSCoordSeq_getSize(geom1CoordSeq, &geom1Size) ||
+ if (!GEOSCoordSeq_getSize(geom1CoordSeq, &geom1Size) ||
!GEOSCoordSeq_getSize(geom2CoordSeq, &geom2Size)) {
err = createException(MAL, "geom.MakeLine", "GEOSGeom_getSize
failed");
+ goto bailout;
}
//create the coordSeq for the new geometry
- else if ((outCoordSeq = GEOSCoordSeq_create(geom1Size + geom2Size,
geom1Dimension)) == NULL) {
+ if ((outCoordSeq = GEOSCoordSeq_create(geom1Size + geom2Size,
geom1Dimension)) == NULL) {
err = createException(MAL, "geom.MakeLine",
"GEOSCoordSeq_create failed");
- }
- if (err != MAL_SUCCEED) {
- *out = NULL;
- GEOSGeom_destroy(geom1Geometry);
- GEOSGeom_destroy(geom2Geometry);
- return err;
+ goto bailout;
}
for (i = 0; i < geom1Size; i++) {
GEOSCoordSeq_getX(geom1CoordSeq, i, &x);
- GEOSCoordSeq_setX(outCoordSeq, i, x);
GEOSCoordSeq_getY(geom1CoordSeq, i, &y);
- GEOSCoordSeq_setY(outCoordSeq, i, y);
+ if (!GEOSCoordSeq_setX(outCoordSeq, i, x) ||
+ !GEOSCoordSeq_setY(outCoordSeq, i, y)) {
+ err = createException(MAL, "geom.MakeLine",
"GEOSCoordSeq_set[XY] failed");
+ goto bailout;
+ }
if (geom1Dimension > 2) {
GEOSCoordSeq_getZ(geom1CoordSeq, i, &z);
- GEOSCoordSeq_setZ(outCoordSeq, i, z);
+ if (!GEOSCoordSeq_setZ(outCoordSeq, i, z)) {
+ err = createException(MAL, "geom.MakeLine",
"GEOSCoordSeq_setZ failed");
+ goto bailout;
+ }
}
}
for (i = 0; i < geom2Size; i++) {
GEOSCoordSeq_getX(geom2CoordSeq, i, &x);
- GEOSCoordSeq_setX(outCoordSeq, i + geom1Size, x);
GEOSCoordSeq_getY(geom2CoordSeq, i, &y);
- GEOSCoordSeq_setY(outCoordSeq, i + geom1Size, y);
+ if (!GEOSCoordSeq_setX(outCoordSeq, i + geom1Size, x) ||
+ !GEOSCoordSeq_setY(outCoordSeq, i + geom1Size, y)) {
+ err = createException(MAL, "geom.MakeLine",
"GEOSCoordSeq_set[XY] failed");
+ goto bailout;
+ }
if (geom2Dimension > 2) {
GEOSCoordSeq_getZ(geom2CoordSeq, i, &z);
- GEOSCoordSeq_setZ(outCoordSeq, i + geom1Size, z);
+ if (!GEOSCoordSeq_setZ(outCoordSeq, i + geom1Size, z)) {
+ err = createException(MAL, "geom.MakeLine",
"GEOSCoordSeq_setZ failed");
+ goto bailout;
+ }
}
}
if ((outGeometry = GEOSGeom_createLineString(outCoordSeq)) == NULL) {
- *out = NULL;
- GEOSCoordSeq_destroy(outCoordSeq);
- GEOSGeom_destroy(geom1Geometry);
- GEOSGeom_destroy(geom2Geometry);
- throw(MAL, "geom.MakeLine", "GEOSGeom_createLineString failed");
- }
+ err = createException(MAL, "geom.MakeLine",
"GEOSGeom_createLineString failed");
+ goto bailout;
+ }
+ outCoordSeq = NULL;
GEOSSetSRID(outGeometry, GEOSGetSRID(geom1Geometry));
*out = geos2wkb(outGeometry);
GEOSGeom_destroy(outGeometry);
+
+ bailout:
+ if (outCoordSeq)
+ GEOSCoordSeq_destroy(outCoordSeq);
GEOSGeom_destroy(geom1Geometry);
GEOSGeom_destroy(geom2Geometry);
- return MAL_SUCCEED;
+ return err;
}
//Gets a BAT with geometries and returns a single LineString
@@ -3653,7 +3673,7 @@ wkbInteriorRings(wkba **geomArray, wkb *
if (ret != MAL_SUCCEED) {
GEOSGeom_destroy(geosGeometry);
- throw(MAL, "geom.InteriorRings", "Error in wkbNumRings");
+ return ret;
}
*geomArray = GDKmalloc(wkba_size(interiorRingsNum));
@@ -5374,13 +5394,17 @@ wkbaTOSTR(char **toStr, int *len, wkba *
dataSize = strlen(itemsNumStr);
//reserve space for an array with pointers to the partial strings, i.e.
for each wkbTOSTR
- partialStrs = GDKzalloc(items * sizeof(char **));
+ partialStrs = GDKzalloc(items * sizeof(char *));
//create the string version of each wkb
for (i = 0; i < items; i++) {
int llen = 0;
dataSize += wkbTOSTR(&partialStrs[i], &llen,
fromArray->data[i]) - 2; //remove quotes
if (strcmp(partialStrs[i], nilStr) == 0) {
+ GDKfree(itemsNumStr);
+ while (i >= 0)
+ GDKfree(partialStrs[i--]);
+ GDKfree(partialStrs);
if (*len < 4 || *toStr == NULL) {
GDKfree(*toStr);
*toStr = GDKmalloc(*len = 4);
@@ -5731,9 +5755,7 @@ wkbContains_point_bat(bat *out, wkb **a,
double *vert_x, *vert_y, **holes_x = NULL, **holes_y = NULL;
int *holes_n = NULL, j;
wkb *geom = NULL;
- str msg = NULL;
-
- str err = NULL;
+ str err = MAL_SUCCEED;
str geom_str = NULL;
char *str2, *token, *subtoken;
char *saveptr1 = NULL, *saveptr2 = NULL;
@@ -5744,11 +5766,11 @@ wkbContains_point_bat(bat *out, wkb **a,
if ((err = wkbAsText(&geom_str, &geom, NULL)) != MAL_SUCCEED) {
return err;
}
- geom_str = strchr(geom_str, '(');
- geom_str += 2;
+ token = strchr(geom_str, '(');
+ token += 2;
/*Lets get the polygon */
- token = strtok_r(geom_str, ")", &saveptr1);
+ token = strtok_r(token, ")", &saveptr1);
vert_x = GDKmalloc(POLY_NUM_VERT * sizeof(double));
vert_y = GDKmalloc(POLY_NUM_VERT * sizeof(double));
@@ -5806,11 +5828,12 @@ wkbContains_point_bat(bat *out, wkb **a,
}
if (nholes)
- msg = pnpolyWithHoles(out, (int) nvert, vert_x, vert_y, nholes,
holes_x, holes_y, holes_n, point_x, point_y);
+ err = pnpolyWithHoles(out, (int) nvert, vert_x, vert_y, nholes,
holes_x, holes_y, holes_n, point_x, point_y);
else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list