Changeset: 6b0c46923a9f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6b0c46923a9f
Modified Files:
        monetdb5/modules/kernel/batmmath.c
        monetdb5/modules/kernel/mmath.c
Branch: Dec2025
Log Message:

Improved error reporting for bulk math functions: added SQLSTATE.
Fixes #7940.


diffs (235 lines):

diff --git a/monetdb5/modules/kernel/batmmath.c 
b/monetdb5/modules/kernel/batmmath.c
--- a/monetdb5/modules/kernel/batmmath.c
+++ b/monetdb5/modules/kernel/batmmath.c
@@ -26,6 +26,7 @@ CMDscienceUNARY(MalStkPtr stk, InstrPtr 
        BUN i;
        BUN nils = 0;
        int e = 0, ex = 0;
+       bool inf = false;
        BATiter bi;
 
        bid = *getArgReference_bat(stk, pci, 1);
@@ -67,6 +68,12 @@ CMDscienceUNARY(MalStkPtr stk, InstrPtr 
                                nils++;
                        } else {
                                fdst[i] = ffunc(fsrc[x]);
+                               e = errno;
+                               ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | 
FE_OVERFLOW);
+                               if (e != 0 || ex != 0) {
+                                       inf = isinf(fdst[i]);
+                                       break;
+                               }
                        }
                }
                break;
@@ -81,6 +88,12 @@ CMDscienceUNARY(MalStkPtr stk, InstrPtr 
                                nils++;
                        } else {
                                ddst[i] = dfunc(dsrc[x]);
+                               e = errno;
+                               ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | 
FE_OVERFLOW);
+                               if (e != 0 || ex != 0) {
+                                       inf = isinf(ddst[i]);
+                                       break;
+                               }
                        }
                }
                break;
@@ -89,23 +102,34 @@ CMDscienceUNARY(MalStkPtr stk, InstrPtr 
                assert(0);
        }
        bat_iterator_end(&bi);
-       e = errno;
-       ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
        BBPunfix(b->batCacheid);
        BBPreclaim(s);
        if (e != 0 || ex != 0) {
                const char *err;
+               const char *sqlstate;
                char buf[128];
-               BBPunfix(bn->batCacheid);
-               if (e)
-                       err = GDKstrerror(e, buf, 128);
-               else if (ex & FE_DIVBYZERO)
+               if (ex & FE_DIVBYZERO) {
                        err = "Divide by zero";
-               else if (ex & FE_OVERFLOW)
+                       sqlstate = SQLSTATE(22012);
+               } else if (ex & FE_OVERFLOW || (e == ERANGE && inf)) {
                        err = "Overflow";
-               else
+                       sqlstate = SQLSTATE(22003);
+               } else if (e == EDOM) {
+                       err = "Invalid argumewnt";
+                       if (strncmp(malfunc, "batmmath.log", 12) == 0)
+                               sqlstate = SQLSTATE(2201E);
+                       else if (strcmp(malfunc, "batmmath.pow") == 0)
+                               sqlstate = SQLSTATE(2201F);
+                       else
+                               sqlstate = SQLSTATE(22003);
+               } else if (e) {
+                       err = GDKstrerror(e, buf, sizeof(buf));
+                       sqlstate = "";
+               } else {
                        err = "Invalid result";
-               throw(MAL, malfunc, "Math exception: %s", err);
+                       sqlstate = SQLSTATE(22023);
+               }
+               throw(MAL, malfunc, "%sMath exception: %s", sqlstate, err);
        }
 
        BATsetcount(bn, ci.ncand);
@@ -133,6 +157,7 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
        oid x1, x2, off1, off2;
        BUN i, ncand, nils = 0;
        int e = 0, ex = 0;
+       bool inf = false;
        BATiter b1i, b2i;
 
        tp1 = stk->stk[getArg(pci, 1)].vtype;
@@ -227,6 +252,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        fdst[i] = ffunc(fsrc1[x1], fsrc2[x2]);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(fdst[i]);
+                                               break;
+                                       }
                                }
                        }
                } else if (b1) {
@@ -240,6 +271,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        fdst[i] = ffunc(fsrc1[x1], fval2);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(fdst[i]);
+                                               break;
+                                       }
                                }
                        }
                } else {                                /* b2 == NULL */
@@ -253,6 +290,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        fdst[i] = ffunc(fval1, fsrc2[x2]);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(fdst[i]);
+                                               break;
+                                       }
                                }
                        }
                }
@@ -270,6 +313,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        ddst[i] = dfunc(dsrc1[x1], dsrc2[x2]);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(ddst[i]);
+                                               break;
+                                       }
                                }
                        }
                } else if (b1) {
@@ -283,6 +332,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        ddst[i] = dfunc(dsrc1[x1], dval2);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(ddst[i]);
+                                               break;
+                                       }
                                }
                        }
                } else {                                /* b2 == NULL */
@@ -296,6 +351,12 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                                        nils++;
                                } else {
                                        ddst[i] = dfunc(dval1, dsrc2[x2]);
+                                       e = errno;
+                                       ex = fetestexcept(FE_INVALID | 
FE_DIVBYZERO | FE_OVERFLOW);
+                                       if (e != 0 || ex != 0) {
+                                               inf = isinf(ddst[i]);
+                                               break;
+                                       }
                                }
                        }
                }
@@ -303,8 +364,6 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
        default:
                assert(0);
        }
-       e = errno;
-       ex = fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
        bat_iterator_end(&b1i);
        bat_iterator_end(&b2i);
 
@@ -324,17 +383,30 @@ CMDscienceBINARY(MalStkPtr stk, InstrPtr
                throw(MAL, malfunc, GDK_EXCEPTION);
        if (e != 0 || ex != 0) {
                const char *err;
+               const char *sqlstate;
                char buf[128];
-               BBPunfix(bn->batCacheid);
-               if (e)
-                       err = GDKstrerror(e, buf, 128);
-               else if (ex & FE_DIVBYZERO)
+               if (ex & FE_DIVBYZERO) {
                        err = "Divide by zero";
-               else if (ex & FE_OVERFLOW)
+                       sqlstate = SQLSTATE(22012);
+               } else if (ex & FE_OVERFLOW || (e == ERANGE && inf)) {
                        err = "Overflow";
-               else
+                       sqlstate = SQLSTATE(22003);
+               } else if (e == EDOM) {
+                       err = "Invalid argumewnt";
+                       if (strncmp(malfunc, "batmmath.log", 12) == 0)
+                               sqlstate = SQLSTATE(2201E);
+                       else if (strcmp(malfunc, "batmmath.pow") == 0)
+                               sqlstate = SQLSTATE(2201F);
+                       else
+                               sqlstate = SQLSTATE(22003);
+               } else if (e) {
+                       err = GDKstrerror(e, buf, sizeof(buf));
+                       sqlstate = "";
+               } else {
                        err = "Invalid result";
-               throw(MAL, malfunc, "Math exception: %s", err);
+                       sqlstate = SQLSTATE(22023);
+               }
+               throw(MAL, malfunc, "%sMath exception: %s", sqlstate, err);
        }
        *getArgReference_bat(stk, pci, 0) = bn->batCacheid;
        BBPkeepref(bn);
diff --git a/monetdb5/modules/kernel/mmath.c b/monetdb5/modules/kernel/mmath.c
--- a/monetdb5/modules/kernel/mmath.c
+++ b/monetdb5/modules/kernel/mmath.c
@@ -116,7 +116,7 @@ MATHunary##NAME##TYPE(Client ctx, TYPE *
                                else                                            
                                                \
                                        sqlstate = SQLSTATE(22003);             
                                \
                        } else if (e) {                                         
                                        \
-                               err = GDKstrerror(e, buf, 128);                 
                        \
+                               err = GDKstrerror(e, buf, sizeof(buf));         
                \
                                sqlstate = "";                                  
                                        \
                        } else {                                                
                                                \
                                err = "Invalid result";                         
                                \
@@ -167,7 +167,7 @@ MATHbinary##NAME##TYPE(Client ctx, TYPE 
                                else                                            
                                                \
                                        sqlstate = SQLSTATE(22003);             
                                \
                        } else if (e) {                                         
                                        \
-                               err = GDKstrerror(e, buf, 128);                 
                        \
+                               err = GDKstrerror(e, buf, sizeof(buf));         
                \
                                sqlstate = "";                                  
                                        \
                        } else {                                                
                                                \
                                err = "Invalid result";                         
                                \
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to