Changeset: c59cf5099b33 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c59cf5099b33
Modified Files:
        gdk/gdk_calc.c
        sql/backends/monet5/sql_upgrades.c
        sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.ppc64.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.ppc64
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.ppc64.int128
        sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
        sql/test/emptydb/Tests/check.stable.out
        sql/test/emptydb/Tests/check.stable.out.32bit
        sql/test/emptydb/Tests/check.stable.out.int128
        sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade/Tests/upgrade.stable.out
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:

Merge with Jul2021 branch.


diffs (truncated from 31361 to 300 lines):

diff --git a/ctest/tools/monetdbe/cmocka_test.c 
b/ctest/tools/monetdbe/cmocka_test.c
--- a/ctest/tools/monetdbe/cmocka_test.c
+++ b/ctest/tools/monetdbe/cmocka_test.c
@@ -14,23 +14,23 @@
 #include "cmocka.h"
 #include "test_helper.h"
 
-#define error(msg) {fprintf(stderr, "Failure: %s\n", msg); return -1;}
+#define error(msg) do{fprintf(stderr, "Failure: %s\n", msg); return 
-1;}while(0)
 
 static int setup(void **state) {
        monetdbe_database mdbe = NULL;
        if (monetdbe_open(&mdbe, NULL, NULL))
-               error("Failed to open database")
+               error("Failed to open database");
 
        *state = mdbe;
-     return 0;
+       return 0;
 }
 
 static int teardown(void **state) {
        monetdbe_database mdbe = *state;
 
        if (monetdbe_close(mdbe))
-               error("Failed to close database")
-     return 0;
+               error("Failed to close database");
+       return 0;
 }
 
 static void create_table_test(void **state) {
@@ -47,12 +47,12 @@ static void populate_table_test(void **s
     char* err;
 
        err = monetdbe_query(mdbe,
-       "INSERT INTO test VALUES "
-               "(4, 40, 400, 'aaa', x'aaaaaa', '2020-06-17', '12:00:00', 
'2020-06-17 12:00:00'),"
-               "(6, 60, 600, 'ccc', x'cccccc', '2022-06-17', '14:00:00', 
'2022-06-17 14:00:00'),"
-               "(5, 50, 500, 'bbb', x'bbbbbb', '2021-06-17', '13:00:00', 
'2021-06-17 13:00:00'),"
-               "(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)",
-       NULL, NULL);
+               "INSERT INTO test VALUES "
+                       "(4, 40, 400, 'aaa', x'aaaaaa', '2020-06-17', 
'12:00:00', '2020-06-17 12:00:00'),"
+                       "(6, 60, 600, 'ccc', x'cccccc', '2022-06-17', 
'14:00:00', '2022-06-17 14:00:00'),"
+                       "(5, 50, 500, 'bbb', x'bbbbbb', '2021-06-17', 
'13:00:00', '2021-06-17 13:00:00'),"
+                       "(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)",
+               NULL, NULL);
 
        assert_null(err);
 }
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -4428,9 +4428,9 @@ BATcalcadd(BAT *b1, BAT *b2, BAT *s1, BA
        /* if both inputs are sorted the same way, and no overflow
         * occurred (we only know for sure if abort_on_error is set),
         * the result is also sorted */
-       bn->tsorted = (abort_on_error && b1->tsorted & b2->tsorted && nils == 0)
+       bn->tsorted = (abort_on_error && b1->tsorted && b2->tsorted && nils == 
0)
                || ncand <= 1 || nils == ncand;
-       bn->trevsorted = (abort_on_error && b1->trevsorted & b2->trevsorted && 
nils == 0)
+       bn->trevsorted = (abort_on_error && b1->trevsorted && b2->trevsorted && 
nils == 0)
                || ncand <= 1 || nils == ncand;
        bn->tkey = ncand <= 1;
        bn->tnil = nils != 0;
diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -546,35 +546,54 @@ static char *RAPIinstalladdons(void) {
 static str
 empty_return(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, size_t retcols, oid 
seqbase)
 {
+       str msg = MAL_SUCCEED;
+       void **res = GDKzalloc(retcols * sizeof(void*));
+
+       if (!res) {
+               msg = createException(MAL, "pyapi3.eval", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+
        for (size_t i = 0; i < retcols; i++) {
                if (isaBatType(getArgType(mb, pci, i))) {
                        BAT *b = COLnew(seqbase, getBatType(getArgType(mb, pci, 
i)), 0, TRANSIENT);
                        if (!b) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
-                               }
-                               return createException(MAL, "rapi.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               msg = createException(MAL, "pyapi3.eval", 
GDK_EXCEPTION);
+                               goto bailout;
                        }
-                       *getArgReference_bat(stk, pci, i) = b->batCacheid;
-                       BBPkeepref(b->batCacheid);
+                       ((BAT**)res)[i] = b;
                } else { // single value return, only for non-grouped 
aggregations
                        // return NULL to conform to SQL aggregates
                        int tpe = getArgType(mb, pci, i);
                        if (!VALinit(&stk->stk[pci->argv[i]], tpe, 
ATOMnilptr(tpe))) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
+                               msg = createException(MAL, "pyapi3.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       }
+                       ((ValPtr*)res)[i] = &stk->stk[pci->argv[i]];
+               }
+       }
+
+bailout:
+       if (res) {
+               for (size_t i = 0; i < retcols; i++) {
+                       if (isaBatType(getArgType(mb, pci, i))) {
+                               BAT *b = ((BAT**)res)[i];
+
+                               if (b && msg) {
+                                       BBPreclaim(b);
+                               } else if (b) {
+                                       BBPkeepref(*getArgReference_bat(stk, 
pci, i) = b->batCacheid);
                                }
-                               return createException(MAL, "rapi.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       } else if (msg) {
+                               ValPtr pt = ((ValPtr*)res)[i];
+
+                               if (pt)
+                                       VALclear(pt);
                        }
                }
+               GDKfree(res);
        }
-       return MAL_SUCCEED;
+       return msg;
 }
 
 static str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
bit grouped) {
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -793,8 +793,9 @@ ALGcrossproduct(bat *l, bat *r, const ba
        BAT *sl = NULL, *sr = NULL;
        gdk_return ret;
 
-       if ((L = BATdescriptor(*left)) == NULL ||
-               (R = BATdescriptor(*right)) == NULL) {
+       L = BATdescriptor(*left);
+       R = BATdescriptor(*right);
+       if (L == NULL || R == NULL) {
                if (L)
                        BBPunfix(L->batCacheid);
                if (R)
diff --git a/sql/backends/monet5/UDF/capi/capi.c 
b/sql/backends/monet5/UDF/capi/capi.c
--- a/sql/backends/monet5/UDF/capi/capi.c
+++ b/sql/backends/monet5/UDF/capi/capi.c
@@ -382,35 +382,54 @@ static char valid_path_characters[] = "a
 static str
 empty_return(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, size_t retcols, oid 
seqbase)
 {
+       str msg = MAL_SUCCEED;
+       void **res = GDKzalloc(retcols * sizeof(void*));
+
+       if (!res) {
+               msg = createException(MAL, "pyapi3.eval", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+
        for (size_t i = 0; i < retcols; i++) {
                if (isaBatType(getArgType(mb, pci, i))) {
                        BAT *b = COLnew(seqbase, getBatType(getArgType(mb, pci, 
i)), 0, TRANSIENT);
                        if (!b) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
-                               }
-                               return createException(MAL, "cudf.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               msg = createException(MAL, "pyapi3.eval", 
GDK_EXCEPTION);
+                               goto bailout;
                        }
-                       *getArgReference_bat(stk, pci, i) = b->batCacheid;
-                       BBPkeepref(b->batCacheid);
+                       ((BAT**)res)[i] = b;
                } else { // single value return, only for non-grouped 
aggregations
                        // return NULL to conform to SQL aggregates
                        int tpe = getArgType(mb, pci, i);
                        if (!VALinit(&stk->stk[pci->argv[i]], tpe, 
ATOMnilptr(tpe))) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
+                               msg = createException(MAL, "pyapi3.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       }
+                       ((ValPtr*)res)[i] = &stk->stk[pci->argv[i]];
+               }
+       }
+
+bailout:
+       if (res) {
+               for (size_t i = 0; i < retcols; i++) {
+                       if (isaBatType(getArgType(mb, pci, i))) {
+                               BAT *b = ((BAT**)res)[i];
+
+                               if (b && msg) {
+                                       BBPreclaim(b);
+                               } else if (b) {
+                                       BBPkeepref(*getArgReference_bat(stk, 
pci, i) = b->batCacheid);
                                }
-                               return createException(MAL, "cudf.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       } else if (msg) {
+                               ValPtr pt = ((ValPtr*)res)[i];
+
+                               if (pt)
+                                       VALclear(pt);
                        }
                }
+               GDKfree(res);
        }
-       return MAL_SUCCEED;
+       return msg;
 }
 
 static str CUDFeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci,
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c 
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -1636,37 +1636,56 @@ wrapup:
 }
 
 static str CreateEmptyReturn(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci,
-                                                         size_t retcols, oid 
seqbase)
+                                                        size_t retcols, oid 
seqbase)
 {
+       str msg = MAL_SUCCEED;
+       void **res = GDKzalloc(retcols * sizeof(void*));
+
+       if (!res) {
+               msg = createException(MAL, "pyapi3.eval", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+
        for (size_t i = 0; i < retcols; i++) {
                if (isaBatType(getArgType(mb, pci, i))) {
                        BAT *b = COLnew(seqbase, getBatType(getArgType(mb, pci, 
i)), 0, TRANSIENT);
                        if (!b) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
-                               }
-                               return createException(MAL, "pyapi3.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               msg = createException(MAL, "pyapi3.eval", 
GDK_EXCEPTION);
+                               goto bailout;
                        }
-                       *getArgReference_bat(stk, pci, i) = b->batCacheid;
-                       BBPkeepref(b->batCacheid);
+                       ((BAT**)res)[i] = b;
                } else { // single value return, only for non-grouped 
aggregations
                        // return NULL to conform to SQL aggregates
                        int tpe = getArgType(mb, pci, i);
                        if (!VALinit(&stk->stk[pci->argv[i]], tpe, 
ATOMnilptr(tpe))) {
-                               for (size_t j = 0; j < i; j++) {
-                                       if (isaBatType(getArgType(mb, pci, j)))
-                                               
BBPunfix(*getArgReference_bat(stk, pci, j));
-                                       else
-                                               
VALclear(&stk->stk[pci->argv[j]]);
+                               msg = createException(MAL, "pyapi3.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       }
+                       ((ValPtr*)res)[i] = &stk->stk[pci->argv[i]];
+               }
+       }
+
+bailout:
+       if (res) {
+               for (size_t i = 0; i < retcols; i++) {
+                       if (isaBatType(getArgType(mb, pci, i))) {
+                               BAT *b = ((BAT**)res)[i];
+
+                               if (b && msg) {
+                                       BBPreclaim(b);
+                               } else if (b) {
+                                       BBPkeepref(*getArgReference_bat(stk, 
pci, i) = b->batCacheid);
                                }
-                               return createException(MAL, "pyapi3.eval", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       } else if (msg) {
+                               ValPtr pt = ((ValPtr*)res)[i];
+
+                               if (pt)
+                                       VALclear(pt);
                        }
                }
+               GDKfree(res);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to