Changeset: c9f46dfe7911 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c9f46dfe7911
Modified Files:
        monetdb5/modules/mal/tablet.c
        sql/common/sql_types.c
Branch: default
Log Message:

Merge with Sep2022 branch.


diffs (truncated from 413 to 300 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
@@ -610,6 +610,8 @@ typedef struct {
        bool ateof;                                     /* io control */
        bool from_stdin;
        bool escape;                            /* whether to handle \ escapes 
*/
+       bool besteffort;
+       char quote;
        bstream *b;
        stream *out;
        MT_Id tid;
@@ -621,7 +623,6 @@ typedef struct {
        char *errbuf;
        const char *csep, *rsep;
        size_t seplen, rseplen;
-       char quote;
 
        char *base[MAXBUFFERS], *input[MAXBUFFERS];     /* buffers for row 
splitter and tokenizer */
        size_t rowlimit[MAXBUFFERS]; /* determines maximal record length buffer 
*/
@@ -632,35 +633,51 @@ typedef struct {
 
        int *cols;                                      /* columns to handle */
        char ***fields;
-       int besteffort;
        bte *rowerror;
        int errorcnt;
        bool set_qry_ctx;
 } READERtask;
 
+/* note, the column value that is passed here is the 0 based value; the
+ * lineno value on the other hand is 1 based */
 static void
-tablet_error(READERtask *task, lng row, lng lineno, int col, const char *msg, 
const char *fcn)
+tablet_error(READERtask *task, lng idx, lng lineno, int col, const char *msg, 
const char *fcn)
 {
+       assert(is_int_nil(col) || col >= 0);
+       assert(is_lng_nil(lineno) || lineno >= 1);
        MT_lock_set(&errorlock);
-       if (task->cntxt->error_row != NULL) {
-               if (BUNappend(task->cntxt->error_row, &lineno, false) != 
GDK_SUCCEED ||
-                       BUNappend(task->cntxt->error_fld, &col, false) != 
GDK_SUCCEED ||
-                       BUNappend(task->cntxt->error_msg, msg, false) != 
GDK_SUCCEED ||
-                       BUNappend(task->cntxt->error_input, fcn, false) != 
GDK_SUCCEED)
-                       task->besteffort = 0;
-               if (!is_lng_nil(row) && task->rowerror && row < task->limit)
-                       task->rowerror[row]++;
+       if (task->cntxt->error_row != NULL &&
+               (BUNappend(task->cntxt->error_row, &lineno, false) != 
GDK_SUCCEED ||
+                BUNappend(task->cntxt->error_fld, &(int){col+1}, false) != 
GDK_SUCCEED ||
+                BUNappend(task->cntxt->error_msg, msg, false) != GDK_SUCCEED ||
+                BUNappend(task->cntxt->error_input, fcn, false) != 
GDK_SUCCEED)) {
+               task->besteffort = false;
        }
+       if (!is_lng_nil(idx) && task->rowerror && idx < task->limit)
+               task->rowerror[idx]++;
        if (task->as->error == NULL) {
-               if (msg == NULL)
-                       task->besteffort = 0;
-               else if (!is_lng_nil(lineno)) {
-                       if (!is_int_nil(col))
-                               task->as->error = createException(MAL, 
"sql.copy_from", "line " LLFMT ": column %d: %s", lineno, col + 1, msg);
-                       else
+               const char *colnam = is_int_nil(col) || col < 0 || (BUN) col >= 
task->as->nr_attrs ? NULL : task->as->format[col].name;
+               if (msg == NULL) {
+                       task->besteffort = false;
+               } else if (!is_lng_nil(lineno)) {
+                       if (!is_int_nil(col)) {
+                               if (colnam)
+                                       task->as->error = createException(MAL, 
"sql.copy_from", "line " LLFMT ": column %d %s: %s", lineno, col + 1, colnam, 
msg);
+                               else
+                                       task->as->error = createException(MAL, 
"sql.copy_from", "line " LLFMT ": column %d: %s", lineno, col + 1, msg);
+                       } else {
                                task->as->error = createException(MAL, 
"sql.copy_from", "line " LLFMT ": %s", lineno, msg);
-               } else
-                       task->as->error = createException(MAL, "sql.copy_from", 
"%s", msg);
+                       }
+               } else {
+                       if (!is_int_nil(col)) {
+                               if (colnam)
+                                       task->as->error = createException(MAL, 
"sql.copy_from", "column %d %s: %s", col + 1, colnam, msg);
+                               else
+                                       task->as->error = createException(MAL, 
"sql.copy_from", "column %d: %s", col + 1, msg);
+                       } else {
+                               task->as->error = createException(MAL, 
"sql.copy_from", "%s", msg);
+                       }
+               }
        }
        task->errorcnt++;
        MT_lock_unset(&errorlock);
@@ -780,9 +797,9 @@ SQLload_error(READERtask *task, lng idx,
        }
 
        s = line = GDKmalloc(sz + task->rseplen + 1);
-       if (line == 0) {
+       if (line == NULL) {
                tablet_error(task, idx, lng_nil, int_nil, "SQLload malloc 
error", "SQLload_error");
-               return 0;
+               return NULL;
        }
        for (i = 0; i < attrs; i++) {
                if (task->fields[i][idx])
@@ -815,7 +832,7 @@ SQLinsert_val(READERtask *task, int col,
        int ret = 0;
 
        /* include testing on the terminating null byte !! */
-       if (s == 0) {
+       if (s == NULL) {
                adt = fmt->nildata;
                fmt->c->tnonil = false;
        } else {
@@ -833,61 +850,32 @@ 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++;
-
+       lng row = BATcount(fmt->c) + 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) {
+                       err = SQLload_error(task, idx, task->as->nr_attrs);
                        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 */
-                                       }
+                                       tablet_error(task, idx, row, col, 
SQLSTATE(HY013) MAL_MALLOC_FAIL, err);
+                                       task->besteffort = false; /* no longer 
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 ? "'" 
: "");
+                       snprintf(buf, sizeof(buf), "'%s' expected%s%s%s",
+                                        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);
+                       tablet_error(task, idx, row, col, buf, err);
+                       GDKfree(err);
+                       if (!task->besteffort)
                                return -1;
-                       }
                        MT_lock_unset(&errorlock);
                }
                ret = -!task->besteffort; /* yep, two unary operators ;-) */
-               GDKfree(err);
-               err = NULL;
                /* replace it with a nil */
                adt = fmt->nildata;
                fmt->c->tnonil = false;
@@ -897,21 +885,12 @@ SQLinsert_val(READERtask *task, int col,
 
        /* failure */
        if (task->rowerror) {
-               lng row = BATcount(fmt->c);
-               MT_lock_set(&errorlock);
-               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, "insert failed", 
false) != GDK_SUCCEED ||
-                       (err = SQLload_error(task, idx,task->as->nr_attrs)) == 
NULL ||
-                       BUNappend(task->cntxt->error_input, err, false) != 
GDK_SUCCEED)
-                       task->besteffort = 0;
+               char *msg = GDKerrbuf;
+               err = SQLload_error(task, idx,task->as->nr_attrs);
+               tablet_error(task, idx, row, col, msg && *msg ? msg : "insert 
failed", err);
                GDKfree(err);
-               task->rowerror[idx]++;
-               task->errorcnt++;
-               MT_lock_unset(&errorlock);
        }
-       task->besteffort = 0;           /* no longer best effort */
+       task->besteffort = false;               /* no longer best effort */
        return -1;
 }
 
@@ -964,7 +943,7 @@ SQLload_parse_row(READERtask *task, int 
        Tablet *as = task->as;
        Column *fmt = as->format;
        bool error = false;
-       str errline = 0;
+       str errline = NULL;
 
        assert(idx < task->top[task->cur]);
        assert(row);
@@ -983,7 +962,7 @@ SQLload_parse_row(READERtask *task, int 
                                if (!row) {
                                        errline = SQLload_error(task, idx, i+1);
                                        snprintf(errmsg, BUFSIZ, "Quote (%c) 
missing", task->quote);
-                                       tablet_error(task, idx, startlineno, 
(int) i + 1, errmsg, errline);
+                                       tablet_error(task, idx, startlineno, 
(int) i, errmsg, errline);
                                        GDKfree(errline);
                                        error = true;
                                        goto errors1;
@@ -1005,6 +984,7 @@ SQLload_parse_row(READERtask *task, int 
                        /* not enough fields */
                        if (i < as->nr_attrs - 1) {
                                errline = SQLload_error(task, idx, i+1);
+                               /* it's the next value that is missing */
                                tablet_error(task, idx, startlineno, (int) i + 
1, "Column value missing", errline);
                                GDKfree(errline);
                                error = true;
@@ -1040,6 +1020,7 @@ SQLload_parse_row(READERtask *task, int 
                        /* not enough fields */
                        if (i < as->nr_attrs - 1) {
                                errline = SQLload_error(task, idx,i+1);
+                               /* it's the next value that is missing */
                                tablet_error(task, idx, startlineno, (int) i + 
1, "Column value missing", errline);
                                GDKfree(errline);
                                error = true;
@@ -1060,7 +1041,7 @@ SQLload_parse_row(READERtask *task, int 
        if (row && *row && i == as->nr_attrs) {
                errline = SQLload_error(task, idx, task->as->nr_attrs);
                snprintf(errmsg, BUFSIZ, "Leftover data '%s'",row);
-               tablet_error(task, idx, startlineno, (int) i + 1, errmsg, 
errline);
+               tablet_error(task, idx, startlineno, (int) i, errmsg, errline);
                GDKfree(errline);
                error = true;
        }
@@ -1129,7 +1110,7 @@ SQLworker(void *arg)
 
   do_return:
        GDKfree(GDKerrbuf);
-       GDKsetbuf(0);
+       GDKsetbuf(NULL);
        MT_thread_set_qry_ctx(NULL);
        setClientContext(NULL);
 }
@@ -1149,7 +1130,7 @@ SQLworkdivider(READERtask *task, READERt
                        ptask[j % threads].cols[i] = task->cols[i];
                return;
        }
-       memset((char *) loc, 0, sizeof(lng) * MAXWORKERS);
+       memset(loc, 0, sizeof(loc));
        /* use of load directives */
        for (i = 0; i < nr_attrs; i++)
                for (j = 0; j < threads; j++)
diff --git a/monetdb5/modules/mal/tablet.h b/monetdb5/modules/mal/tablet.h
--- a/monetdb5/modules/mal/tablet.h
+++ b/monetdb5/modules/mal/tablet.h
@@ -63,7 +63,7 @@ typedef struct Column_t {
 typedef struct Table_t {
        BUN offset;
        BUN nr;                                         /* allocated space for 
table loads */
-       BUN nr_attrs;                           /* attributes found sofar */
+       BUN nr_attrs;                           /* attributes found so far */
        Column *format;                         /* remove later */
        str error;                                      /* last error */
        int tryall;                                     /* skip erroneous lines 
*/
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -18,7 +18,7 @@ typedef enum mat_type_t {
        mat_cnt = 3,    /* mat_grp count */
        mat_tpn = 4,    /* Phase one of topn on a mat */
        mat_slc = 5,    /* Last phase of topn (or just slice) on a mat */
-       mat_rdr = 6     /* Phase one of sorting, ie sorted the parts sofar */
+       mat_rdr = 6             /* Phase one of sorting, ie sorted the parts so 
far */
 } mat_type_t;
 
 typedef struct mat {
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -122,7 +122,7 @@ unsigned int type_digits_to_char_digits(
 /* 0 cannot convert */
 /* 1 set operations have very limited coersion rules */
 /* 2 automatic coersion (could still require dynamic checks for overflow) */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to