Changeset: 1bffd4f2a9fd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1bffd4f2a9fd
Modified Files:
        monetdb5/modules/mal/tablet.c
Branch: directappend
Log Message:

Factor conversion error handling out of SQLinsert_val


diffs (156 lines):

diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -796,6 +796,7 @@ SQLload_error(READERtask *task, lng idx,
 }
 
 static void report_append_failed(READERtask *task, Column *fmt, int idx, lng 
col);
+static int report_conversion_failed(READERtask *task, Column *fmt, int idx, 
lng col, char *s);
 
 /*
  * The parsing of the individual values is straightforward. If the value 
represents
@@ -814,7 +815,6 @@ SQLinsert_val(READERtask *task, int col,
        const void *adt;
        char buf[BUFSIZ];
        char *s = task->fields[col][idx];
-       char *err = NULL;
        int ret = 0;
 
        /* include testing on the terminating null byte !! */
@@ -839,66 +839,17 @@ SQLinsert_val(READERtask *task, int col,
                        adt = fmt->frstr(fmt, fmt->adt, s);
        }
 
-       /* col is zero-based, but for error messages it needs to be
-        * one-based, and from here on, we only use col anymore to produce
-        * error messages */
-       col++;
+       /* col is zero-based, but for error messages it needs to be one-based. 
*/
+       lng colno = col + 1;
 
        if (adt == NULL) {
-               lng row = task->cnt + idx + 1;
-               snprintf(buf, sizeof(buf), "'%s' expected", fmt->type);
-               err = SQLload_error(task, idx, task->as->nr_attrs);
-               if (task->rowerror) {
-                       if (s) {
-                               size_t slen = mystrlen(s);
-                               char *scpy = GDKmalloc(slen + 1);
-                               if ( scpy == NULL){
-                                       task->rowerror[idx]++;
-                                       task->errorcnt++;
-                                       task->besteffort = 0; /* no longer best 
effort */
-                                       if (task->cntxt->error_row == NULL ||
-                                               
BUNappend(task->cntxt->error_row, &row, false) != GDK_SUCCEED ||
-                                               
BUNappend(task->cntxt->error_fld, &col, false) != GDK_SUCCEED ||
-                                               
BUNappend(task->cntxt->error_msg, SQLSTATE(HY013) MAL_MALLOC_FAIL, false) != 
GDK_SUCCEED ||
-                                               
BUNappend(task->cntxt->error_input, err, false) != GDK_SUCCEED) {
-                                               ;               /* ignore error 
here: we're already not best effort */
-                                       }
-                                       GDKfree(err);
-                                       return -1;
-                               }
-                               mycpstr(scpy, s);
-                               s = scpy;
-                       }
-                       MT_lock_set(&errorlock);
-                       snprintf(buf, sizeof(buf),
-                                        "line " LLFMT " field %s '%s' 
expected%s%s%s",
-                                        task->startlineno[task->cur][idx], 
fmt->name ? fmt->name : "", fmt->type,
-                                        s ? " in '" : "", s ? s : "", s ? "'" 
: "");
-                       GDKfree(s);
-                       if (task->as->error == NULL && (task->as->error = 
GDKstrdup(buf)) == NULL)
-                               task->as->error = createException(MAL, 
"sql.copy_from", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                       task->rowerror[idx]++;
-                       task->errorcnt++;
-                       if (task->cntxt->error_row == NULL ||
-                               BUNappend(task->cntxt->error_row, &row, false) 
!= GDK_SUCCEED ||
-                               BUNappend(task->cntxt->error_fld, &col, false) 
!= GDK_SUCCEED ||
-                               BUNappend(task->cntxt->error_msg, buf, false) 
!= GDK_SUCCEED ||
-                               BUNappend(task->cntxt->error_input, err, false) 
!= GDK_SUCCEED) {
-                               GDKfree(err);
-                               task->besteffort = 0; /* no longer best effort 
*/
-                               MT_lock_unset(&errorlock);
-                               return -1;
-                       }
-                       MT_lock_unset(&errorlock);
-               }
-               ret = -!task->besteffort; /* yep, two unary operators ;-) */
-               GDKfree(err);
-               err = NULL;
+               ret = report_conversion_failed(task, fmt, idx, colno, s);
                /* replace it with a nil */
                adt = fmt->nildata;
                if (fmt->c)
                        fmt->c->tnonil = false;
        }
+
        if (task->loadops) {
                if (!one_by_one)
                        return ret;
@@ -910,10 +861,64 @@ SQLinsert_val(READERtask *task, int col,
        } else if (bunfastapp(fmt->c, adt) == GDK_SUCCEED)
                return ret;
 
-       report_append_failed(task, fmt, idx, col);
+       report_append_failed(task, fmt, idx, colno);
        return -1;
 }
 
+static int
+report_conversion_failed(READERtask *task, Column *fmt, int idx, lng col, char 
*s)
+{
+       char buf[1024];
+       lng row = task->cnt + idx + 1;
+       snprintf(buf, sizeof(buf), "'%s' expected", fmt->type);
+       char *err = SQLload_error(task, idx, task->as->nr_attrs);
+       if (task->rowerror) {
+               if (s) {
+                       size_t slen = mystrlen(s);
+                       char *scpy = GDKmalloc(slen + 1);
+                       if ( scpy == NULL){
+                               task->rowerror[idx]++;
+                               task->errorcnt++;
+                               task->besteffort = 0; /* no longer best effort 
*/
+                               if (task->cntxt->error_row == NULL ||
+                                       BUNappend(task->cntxt->error_row, &row, 
false) != GDK_SUCCEED ||
+                                       BUNappend(task->cntxt->error_fld, &col, 
false) != GDK_SUCCEED ||
+                                       BUNappend(task->cntxt->error_msg, 
SQLSTATE(HY013) MAL_MALLOC_FAIL, false) != GDK_SUCCEED ||
+                                       BUNappend(task->cntxt->error_input, 
err, false) != GDK_SUCCEED) {
+                                       ;               /* ignore error here: 
we're already not best effort */
+                               }
+                               GDKfree(err);
+                               return -1;
+                       }
+                       mycpstr(scpy, s);
+                       s = scpy;
+               }
+               MT_lock_set(&errorlock);
+               snprintf(buf, sizeof(buf),
+                                       "line " LLFMT " field %s '%s' 
expected%s%s%s",
+                                       task->startlineno[task->cur][idx], 
fmt->name ? fmt->name : "", fmt->type,
+                                       s ? " in '" : "", s ? s : "", s ? "'" : 
"");
+               GDKfree(s);
+               if (task->as->error == NULL && (task->as->error = 
GDKstrdup(buf)) == NULL)
+                       task->as->error = createException(MAL, "sql.copy_from", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               task->rowerror[idx]++;
+               task->errorcnt++;
+               if (task->cntxt->error_row == NULL ||
+                       BUNappend(task->cntxt->error_row, &row, false) != 
GDK_SUCCEED ||
+                       BUNappend(task->cntxt->error_fld, &col, false) != 
GDK_SUCCEED ||
+                       BUNappend(task->cntxt->error_msg, buf, false) != 
GDK_SUCCEED ||
+                       BUNappend(task->cntxt->error_input, err, false) != 
GDK_SUCCEED) {
+                       GDKfree(err);
+                       task->besteffort = 0; /* no longer best effort */
+                       MT_lock_unset(&errorlock);
+                       return -1;
+               }
+               MT_lock_unset(&errorlock);
+       }
+       GDKfree(err);
+       return task->besteffort ? 0 : -1;
+}
+
 static void
 report_append_failed(READERtask *task, Column *fmt, int idx, lng col)
 {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to