Changeset: 82187f24d94e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=82187f24d94e Modified Files: sql/server/sql_parser.y sql/server/sql_scan.c sql/server/sql_scan.h Branch: default Log Message:
Generate understandable error message from scanner. In addition, don't dump random data on the output channel (e.g. if input was not UTF-8). This keeps tests in pg_regress from crashing. diffs (78 lines): diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -5545,9 +5545,20 @@ int sqlerror(mvc * c, const char *err) sqlstate = ""; err++; } - (void)sql_error( c, 4, - "!%s%s in: \"%s\"\n", - sqlstate, err, QUERY(c->scanner)); + if (c->scanner.errstr) { + if (c->scanner.errstr[0] == '!') + (void)sql_error(c, 4, + "!%s%s: %s\n", + sqlstate, err, c->scanner.errstr + 1); + else + (void)sql_error(c, 4, + "!%s%s: %s in \"%.80s\"\n", + sqlstate, err, c->scanner.errstr, + QUERY(c->scanner)); + } else + (void)sql_error(c, 4, + "!%s%s in: \"%.80s\"\n", + sqlstate, err, QUERY(c->scanner)); return 1; } diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c --- a/sql/server/sql_scan.c +++ b/sql/server/sql_scan.c @@ -512,8 +512,11 @@ scanner_getc(struct scanner *lc) int c; int n, m, mask; - if (scanner_read_more(lc, 1) == EOF) + if (scanner_read_more(lc, 1) == EOF) { + lc->errstr = "end of input stream"; return EOF; + } + lc->errstr = NULL; s = (unsigned char *) b->buf + b->pos + lc->yycur++; if (((c = *s) & 0x80) == 0) { @@ -527,6 +530,7 @@ scanner_getc(struct scanner *lc) /* incorrect UTF-8 sequence */ /* n==0: c == 10xxxxxx */ /* n>=6: c == 1111111x */ + lc->errstr = "!invalid start of UTF-8 sequence"; goto error; } @@ -542,12 +546,14 @@ scanner_getc(struct scanner *lc) if (((m = *s++) & 0xC0) != 0x80) { /* incorrect UTF-8 sequence: byte is not 10xxxxxx */ /* this includes end-of-string (m == 0) */ + lc->errstr = "!invalid continuation in UTF-8 sequence"; goto error; } c |= m & 0x3F; } if ((c & mask) == 0) { /* incorrect UTF-8 sequence: not shortest possible */ + lc->errstr = "!not shortest possible UTF-8 sequence"; goto error; } diff --git a/sql/server/sql_scan.h b/sql/server/sql_scan.h --- a/sql/server/sql_scan.h +++ b/sql/server/sql_scan.h @@ -44,6 +44,8 @@ struct scanner { prot mode; /* which mode (line (1,N), blocked) */ char *schema; /* Keep schema name of create statement, needed AUTO_INCREMENT, SERIAL */ + char *errstr; /* error message from the bowels of + * the scanner */ }; #define QUERY(scanner) (scanner.rs->buf+scanner.rs->pos) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list