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