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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list