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 -- [email protected]
To unsubscribe send an email to [email protected]