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

Reply via email to