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