Changeset: 1047c63ab5fe for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1047c63ab5fe
Modified Files:
        monetdb5/modules/mal/tablet.c
        sql/backends/monet5/sql_result.c
        
sql/test/BugDay_2005-11-09_2.9.3/Tests/hang_on_copy_into.SF-1100504.stable.err
        sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py
        sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.zip
Branch: int128
Log Message:

Merge with Jan2014 branch.


diffs (truncated from 311 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
@@ -55,6 +55,7 @@
 
 tablet_export str CMDtablet_input(int *ret, int *nameid, int *sepid, int 
*typeid, stream *s, int *nr);
 
+static MT_Lock errorlock MT_LOCK_INITIALIZER("errorlock");
 
 static BAT *
 void_bat_create(int adt, BUN nr)
@@ -206,12 +207,17 @@ TABLETcreate_bats(Tablet *as, BUN est)
 {
        Column *fmt = as->format;
        BUN i;
+       char errbuf[42];
 
        for (i = 0; i < as->nr_attrs; i++) {
                fmt[i].c = void_bat_create(fmt[i].adt, est);
                fmt[i].ci = bat_iterator(fmt[i].c);
                if (!fmt[i].c) {
-                       GDKerror("TABLETcreate_bats: Failed to create bat of 
size " BUNFMT "\n", as->nr);
+                       snprintf(errbuf, sizeof(errbuf), "Failed to create bat 
of size " BUNFMT "\n", as->nr);
+                       MT_lock_set(&errorlock, "TABLETcreate_bats");
+                       if (as->error == NULL && (as->error = 
GDKstrdup(errbuf)) == NULL)
+                               as->error = M5OutOfMemory;
+                       MT_lock_unset(&errorlock, "TABLETcreate_bats");
                        return -1;
                }
        }
@@ -225,6 +231,7 @@ TABLETcollect(Tablet *as)
        Column *fmt = as->format;
        BUN i;
        BUN cnt = BATcount(fmt[0].c);
+       char errbuf[42];
 
        if (bats == NULL)
                return NULL;
@@ -235,8 +242,11 @@ TABLETcollect(Tablet *as)
                BATderiveProps(fmt[i].c, 1);
 
                if (cnt != BATcount(fmt[i].c)) {
-                       if (as->error == 0)     /* a new error */
-                               GDKerror("Error: column " BUNFMT "  count " 
BUNFMT " differs from " BUNFMT "\n", i, BATcount(fmt[i].c), cnt);
+                       snprintf(errbuf, sizeof(errbuf), "Error: column " 
BUNFMT "  count " BUNFMT " differs from " BUNFMT "\n", i, BATcount(fmt[i].c), 
cnt);
+                       MT_lock_set(&errorlock, "TABLETcollect");
+                       if (as->error == NULL && (as->error = 
GDKstrdup(errbuf)) == NULL)
+                               as->error = M5OutOfMemory;
+                       MT_lock_unset(&errorlock, "TABLETcollect");
                        return NULL;
                }
        }
@@ -250,6 +260,7 @@ TABLETcollect_parts(Tablet *as, BUN offs
        Column *fmt = as->format;
        BUN i;
        BUN cnt = BATcount(fmt[0].c);
+       char errbuf[42];
 
        if (bats == NULL)
                return NULL;
@@ -274,8 +285,11 @@ TABLETcollect_parts(Tablet *as, BUN offs
                b->batDirty = TRUE;
 
                if (cnt != BATcount(b)) {
-                       if (as->error == 0)     /* a new error */
-                               GDKerror("Error: column " BUNFMT "  count " 
BUNFMT " differs from " BUNFMT "\n", i, BATcount(b), cnt);
+                       snprintf(errbuf, sizeof(errbuf), "Error: column " 
BUNFMT "  count " BUNFMT " differs from " BUNFMT "\n", i, BATcount(b), cnt);
+                       MT_lock_set(&errorlock, "TABLETcollect_parts");
+                       if (as->error == NULL && (as->error = 
GDKstrdup(errbuf)) == NULL)
+                               as->error = M5OutOfMemory;
+                       MT_lock_unset(&errorlock, "TABLETcollect_parts");
                        return NULL;
                }
        }
@@ -701,11 +715,15 @@ SQLload_error(READERtask *task, int idx)
                else
                        sz += task->seplen;
 
-       line = (str) GDKzalloc(sz + task->rseplen + 1);
+       line = (str) GDKmalloc(sz + task->rseplen + 1);
        if (line == 0) {
-               task->as->error = M5OutOfMemory;
+               MT_lock_set(&errorlock, "SQLload_error");
+               if (task->as->error == NULL)
+                       task->as->error = M5OutOfMemory;
+               MT_lock_unset(&errorlock, "SQLload_error");
                return 0;
        }
+       line[0] = 0;
        for (i = 0; i < task->as->nr_attrs; i++) {
                if (task->fields[i][idx])
                        strcat(line, task->fields[i][idx]);
@@ -803,8 +821,10 @@ SQLworker_column(READERtask *task, int c
        MT_lock_set(&mal_copyLock, "tablet insert value");
        if (BATcapacity(fmt[col].c) < BATcount(fmt[col].c) + task->next) {
                if ((fmt[col].c = BATextend(fmt[col].c, BATgrows(fmt[col].c) + 
task->limit)) == NULL) {
+                       MT_lock_set(&errorlock, "SQLworker_column");
                        if (task->as->error == NULL)
-                               task->as->error = GDKstrdup("Failed to extend 
the BAT, perhaps disk full");
+                               task->as->error = GDKstrdup("Failed to extend 
the BAT, perhaps disk full\n");
+                       MT_lock_unset(&errorlock, "SQLworker_column");
                        MT_lock_unset(&mal_copyLock, "tablet insert value");
                        mnstr_printf(GDKout, "Failed to extend the BAT, perhaps 
disk full");
                        return -1;
@@ -819,8 +839,10 @@ SQLworker_column(READERtask *task, int c
                                MT_lock_set(&mal_copyLock, "tablet insert 
value");
                                if (!task->as->tryall) {
                                        /* watch out for concurrent threads */
+                                       MT_lock_set(&errorlock, 
"SQLworker_column");
                                        if (task->as->error == NULL)
                                                task->as->error = err;  /* 
restore for upper layers */
+                                       MT_lock_unset(&errorlock, 
"SQLworker_column");
                                } else
                                        BUNins(task->as->complaints, NULL, err, 
TRUE);
                                MT_lock_unset(&mal_copyLock, "tablet insert 
value");
@@ -831,8 +853,10 @@ SQLworker_column(READERtask *task, int c
        if (err) {
                /* watch out for concurrent threads */
                MT_lock_set(&mal_copyLock, "tablet insert value");
+               MT_lock_set(&errorlock, "SQLworker_column");
                if (task->as->error == NULL)
                        task->as->error = err;  /* restore for upper layers */
+               MT_lock_unset(&errorlock, "SQLworker_column");
                MT_lock_unset(&mal_copyLock, "tablet insert value");
        }
        return err ? -1 : 0;
@@ -870,8 +894,6 @@ SQLload_file_line(READERtask *task, int 
                                                 " field " BUNFMT "\n",
                                                 task->quote, (errline ? 
errline : ""),
                                                 BATcount(as->format->c) + 
task->next + 1, i);
-                               if (errline)
-                                       GDKerror("%s", errmsg);
                                GDKfree(errline);
                                goto errors;
                        }
@@ -898,12 +920,16 @@ SQLload_file_line(READERtask *task, int 
                        MT_lock_set(&mal_copyLock, "tablet line break");
                        if (as->tryall)
                                BUNins(as->complaints, NULL, errmsg, TRUE);
+                       MT_lock_set(&errorlock, "SQLload_file_line");
                        if (as->error) {
                                str s = GDKstrdup(errmsg);
                                snprintf(errmsg, BUFSIZ, "%s%s", as->error, s);
                                GDKfree(s);
+                               if (as->error != M5OutOfMemory)
+                                       GDKfree(as->error);
                        }
                        as->error = GDKstrdup(errmsg);
+                       MT_lock_unset(&errorlock, "SQLload_file_line");
                        MT_lock_unset(&mal_copyLock, "tablet line break");
                        for (i = 0; i < as->nr_attrs; i++)
                                task->fields[i][idx] = NULL;
@@ -998,7 +1024,10 @@ SQLworkdivider(READERtask *task, READERt
        }
        loc = (lng *) GDKzalloc(sizeof(lng) * threads);
        if (loc == 0) {
-               task->as->error = M5OutOfMemory;
+               MT_lock_set(&errorlock, "SQLworkdivider");
+               if (task->as->error == NULL)
+                       task->as->error = M5OutOfMemory;
+               MT_lock_unset(&errorlock, "SQLworkdivider");
                return;
        }
        /* use of load directives */
@@ -1080,7 +1109,10 @@ SQLload_file(Client cntxt, Tablet *as, b
                ptask[i].cols = 0;
 
        if (task == 0) {
-               as->error = M5OutOfMemory;
+               MT_lock_set(&errorlock, "SQLload_file");
+               if (task->as->error == NULL)
+                       as->error = M5OutOfMemory;
+               MT_lock_unset(&errorlock, "SQLload_file");
                return BUN_NONE;
        }
 
@@ -1100,7 +1132,10 @@ SQLload_file(Client cntxt, Tablet *as, b
        task->basesize = b->size + 2;
 
        if (task->fields == 0 || task->cols == 0 || task->time == 0 || 
task->base == 0) {
-               as->error = M5OutOfMemory;
+               MT_lock_set(&errorlock, "SQLload_file");
+               if (task->as->error == NULL)
+                       as->error = M5OutOfMemory;
+               MT_lock_unset(&errorlock, "SQLload_file");
                goto bailout;
        }
 
@@ -1126,7 +1161,9 @@ SQLload_file(Client cntxt, Tablet *as, b
        mlock(task->time, as->nr_attrs * sizeof(lng));
        mlock(task->base, b->size + 2);
 #endif
+       MT_lock_set(&errorlock, "SQLload_file");
        as->error = NULL;
+       MT_lock_unset(&errorlock, "SQLload_file");
 
        /* there is no point in creating more threads than we have columns */
        if (as->nr_attrs < (BUN) threads)
@@ -1138,7 +1175,10 @@ SQLload_file(Client cntxt, Tablet *as, b
        for (i = 0; i < as->nr_attrs; i++) {
                task->fields[i] = GDKzalloc(sizeof(char *) * task->limit);
                if (task->fields[i] == 0) {
-                       as->error = M5OutOfMemory;
+                       MT_lock_set(&errorlock, "SQLload_file");
+                       if (task->as->error == NULL)
+                               as->error = M5OutOfMemory;
+                       MT_lock_unset(&errorlock, "SQLload_file");
                        goto bailout;
                }
 #ifdef MLOCK_TST
@@ -1156,7 +1196,10 @@ SQLload_file(Client cntxt, Tablet *as, b
                ptask[j].id = j;
                ptask[j].cols = (int *) GDKzalloc(as->nr_attrs * sizeof(int));
                if (ptask[j].cols == 0) {
-                       as->error = M5OutOfMemory;
+                       MT_lock_set(&errorlock, "SQLload_file");
+                       if (task->as->error == NULL)
+                               as->error = M5OutOfMemory;
+                       MT_lock_unset(&errorlock, "SQLload_file");
                        goto bailout;
                }
 #ifdef MLOCK_TST
@@ -1185,8 +1228,14 @@ SQLload_file(Client cntxt, Tablet *as, b
                if (task->errbuf && task->errbuf[0]) {
                        msg = catchKernelException(cntxt, msg);
                        if (msg) {
-                               showException(task->out, MAL, "copy_from", 
"%s", msg);
-                               GDKfree(msg);
+                               MT_lock_set(&errorlock, "SQLload_file");
+                               if (as->error == NULL)
+                                       as->error = msg;
+                               else {
+                                       showException(task->out, MAL, 
"copy_from", "%s", msg);
+                                       GDKfree(msg);
+                               }
+                               MT_lock_unset(&errorlock, "SQLload_file");
                                goto bailout;
                        }
                }
@@ -1397,7 +1446,12 @@ SQLload_file(Client cntxt, Tablet *as, b
        }
 
        if (task->b->pos < task->b->len && cnt < (BUN) maxrow && task->ateof) {
-               showException(task->out, MAL, "copy_from", "Incomplete record 
at end of file.\n");
+               MT_lock_set(&errorlock, "SQLload_file");
+               if (as->error == NULL)
+                       as->error = GDKstrdup("Incomplete record at end of 
file.\n");
+               else
+                       showException(task->out, MAL, "copy_from", "Incomplete 
record at end of file.\n");
+               MT_lock_unset(&errorlock, "SQLload_file");
                /* indicate that we did read everything (even if we couldn't
                 * deal with it */
                task->b->pos = task->b->len;
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -767,8 +767,12 @@ mvc_import_table(Client cntxt, mvc *m, b
                                BBPunfix(b->batCacheid);
                        }
                }
-               if (as.error)
+               if (as.error) {
                        sql_error(m, 500, "%s", as.error);
+                       if (as.error != M5OutOfMemory)
+                               GDKfree(as.error);
+                       as.error = NULL;
+               }
                for (n = t->columns.set->h, i = 0; n; n = n->next, i++) {
                        fmt[i].sep = NULL;
                        fmt[i].rsep = NULL;
diff --git 
a/sql/test/BugDay_2005-11-09_2.9.3/Tests/hang_on_copy_into.SF-1100504.stable.err
 
b/sql/test/BugDay_2005-11-09_2.9.3/Tests/hang_on_copy_into.SF-1100504.stable.err
--- 
a/sql/test/BugDay_2005-11-09_2.9.3/Tests/hang_on_copy_into.SF-1100504.stable.err
+++ 
b/sql/test/BugDay_2005-11-09_2.9.3/Tests/hang_on_copy_into.SF-1100504.stable.err
@@ -76,7 +76,7 @@ stderr of test 'hang_on_copy_into.SF-110
 # 23:26:36 >  mclient -lsql -i --host=eir --port=38510 
 # 23:26:36 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225
+MAPI  = (monetdb) /var/tmp/mtest-30338/.s.monetdb.31716
 QUERY = COPY 1 RECORDS INTO "news" FROM stdin USING DELIMITERS '\t', '\n', 
'''';
         1      'dwerg.net word volwassen, er is eindelijk content
         en het voicemail archief begint al aardig vol te lopen.
@@ -89,7 +89,7 @@ QUERY = COPY 1 RECORDS INTO "news" FROM 
         allemaal nogal lang duurt, maar in principe is het nog
         maar een uurtje of 6 werk om het goed te krijgen. Zoals
         je kan zien heb ik bij de voicemails al wat leuke
-ERROR = !MALException:copy_from:Incomplete record at end of file.
+ERROR = !Incomplete record at end of file.
         !failed to import table
 
 # 23:26:36 >  
diff --git a/sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py 
b/sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py
--- a/sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py
+++ b/sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py
@@ -34,7 +34,7 @@ create table utf8bom (
     city string,
     id integer
 );
-copy into utf8bom from '%s' using delimiters ',','\\r\\n','"';
+copy into utf8bom from '%s' using delimiters ',','\\n','"';
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to