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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to