Changeset: acba25365e71 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/acba25365e71
Branch: string_imprints
Log Message:

Merge with default


diffs (242 lines):

diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,10 +24,6 @@ set(CMAKE_PROJECT_HOMEPAGE_URL "https://
 set(C_STANDARD_REQUIRED ON)
 set(CMAKE_C_STANDARD 99)
 
-if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0")
-  cmake_policy(SET CMP0076 OLD)
-endif()
-
 # We give precedence to UNIX include directories over
 # OS X Frameworks directories
 set(CMAKE_FIND_FRAMEWORK LAST)
diff --git a/sql/ChangeLog.Jul2021 b/sql/ChangeLog.Jul2021
--- a/sql/ChangeLog.Jul2021
+++ b/sql/ChangeLog.Jul2021
@@ -1,3 +1,9 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Thu Oct 28 2021 Sjoerd Mullender <sjo...@acm.org>
+- Number parsing for SQL was fixed.  If a number was immediately followed
+  by letters (i.e. without a space), the number was accepted and the
+  alphanumeric string starting with the letter was interpreted as an alias
+  (if aliases were allowed in that position).
+
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -3650,6 +3650,7 @@ sql_update_default(Client c, mvc *sql, c
                                        "drop view sys.describe_privileges;\n"
                                        "drop view sys.describe_comments;\n"
                                        "drop view sys.describe_tables;\n"
+                                       "drop function sys.schema_guard(string, 
string, string);\n"
                                        "drop function 
sys.get_remote_table_expressions(string, string);\n"
                                        "drop function 
sys.get_merge_table_partition_expressions(int);\n"
                                        "drop view sys.describe_constraints;\n"
@@ -3659,6 +3660,10 @@ sql_update_default(Client c, mvc *sql, c
        pos += snprintf(buf + pos, bufsize - pos,
                                        "CREATE FUNCTION sys.SQ (s STRING) 
RETURNS STRING BEGIN RETURN '''' || sys.replace(s,'''','''''') || ''''; END;\n"
                                        "CREATE FUNCTION sys.FQN(s STRING, t 
STRING) RETURNS STRING BEGIN RETURN '\"' || sys.replace(s,'\"','\"\"') || 
'\".\"' || sys.replace(t,'\"','\"\"') || '\"'; END;\n"
+                                       "CREATE FUNCTION sys.schema_guard(sch 
STRING, nme STRING, stmt STRING) RETURNS STRING BEGIN\n"
+                                       "RETURN\n"
+                                       "    SELECT sys.replace_first(stmt, 
'(\\\\s*\"?' || sch ||  '\"?\\\\s*\\\\.|)\\\\s*\"?' || nme || '\"?\\\\s*', ' ' 
|| sys.FQN(sch, nme) || ' ', 'imsx');\n"
+                                       "END;\n"
                                        "CREATE VIEW sys.describe_constraints 
AS\n"
                                        "       SELECT\n"
                                        "               s.name sch,\n"
@@ -3883,7 +3888,7 @@ sql_update_default(Client c, mvc *sql, c
                                        "               LEFT OUTER JOIN 
sys.function_languages fl ON f.language = fl.language_id\n"
                                        "       WHERE s.name <> 'tmp' AND NOT 
f.system;\n");
        pos += snprintf(buf + pos, bufsize - pos,
-                                       "update sys.functions set system = true 
where system <> true and name in ('sq', 'fqn', 
'get_merge_table_partition_expressions', 'get_remote_table_expressions') and 
schema_id = 2000 and type = %d;\n", F_FUNC);
+                                       "update sys.functions set system = true 
where system <> true and name in ('sq', 'fqn', 
'get_merge_table_partition_expressions', 'get_remote_table_expressions', 
'schema_guard') and schema_id = 2000 and type = %d;\n", F_FUNC);
        pos += snprintf(buf + pos, bufsize - pos,
                                "update sys._tables set system = true where 
name in ('describe_constraints', 'describe_tables', 'describe_comments', 
'describe_privileges', 'describe_partition_tables', 'describe_functions') AND 
schema_id = 2000;\n");
 
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
@@ -896,53 +896,88 @@ static int
 number(mvc * c, int cur)
 {
        struct scanner *lc = &c->scanner;
-       int token = sqlINT;
-       int before_cur = EOF;
+       int token = cur == '0' ? sqlINT : 0;
 
+       /* a number has one of these forms (expressed in regular expressions):
+        * 0x[0-9A-Fa-f]+                   -- (hexadecimal) INTEGER
+        * \.[0-9]+                         -- DECIMAL
+        * [0-9]+\.[0-9]*                   -- DECIMAL
+        * [0-9]+@0                         -- OID
+        * [0-9]*\.[0-9]+[eE][-+]?[0-9]+    -- REAL
+        * [0-9]+(\.[0-9]*)?[eE][-+]?[0-9]+ -- REAL
+        * [0-9]+                           -- (decimal) INTEGER
+        */
        lc->started = 1;
+       /* after this block, cur contains the first character after the
+        * parsed number (which may be the first causing it not to be a number);
+        * it token == 0 after this block, a parse error was detected */
        if (cur == '0' && (cur = scanner_getc(lc)) == 'x') {
-               while ((cur = scanner_getc(lc)) != EOF &&
-                      (iswdigit(cur) ||
-                                (cur >= 'A' && cur <= 'F') ||
-                                (cur >= 'a' && cur <= 'f')))
+               cur = scanner_getc(lc);
+               while (cur != EOF && iswxdigit(cur)) {
                        token = HEXADECIMAL;
-               if (token == sqlINT)
-                       before_cur = 'x';
+                       cur = scanner_getc(lc);
+               }
+               if (token != HEXADECIMAL) {
+                       /* 0x not followed by a hex digit: show 'x' as 
erroneous */
+                       utf8_putchar(lc, cur);
+                       cur = 'x';
+                       token = 0;
+               }
        } else {
-               if (iswdigit(cur))
-                       while ((cur = scanner_getc(lc)) != EOF && iswdigit(cur))
-                               ;
+               while (cur != EOF && iswdigit(cur)) {
+                       token = sqlINT;
+                       cur = scanner_getc(lc);
+               }
                if (cur == '@') {
-                       token = OIDNUM;
-                       cur = scanner_getc(lc);
-                       if (cur == '0')
+                       if (token == sqlINT) {
+                               cur = scanner_getc(lc);
+                               if (cur == '0') {
+                                       cur = scanner_getc(lc);
+                                       token = OIDNUM;
+                               } else {
+                                       /* number + '@' not followed by 0: show 
'@' as erroneous */
+                                       utf8_putchar(lc, cur);
+                                       cur = '@';
+                                       token = 0;
+                               }
+                       }
+               } else {
+                       if (cur == '.') {
                                cur = scanner_getc(lc);
-               }
-
-               if (cur == '.') {
-                       token = INTNUM;
-
-                       while ((cur = scanner_getc(lc)) != EOF && iswdigit(cur))
-                               ;
-               }
-               if (cur == 'e' || cur == 'E') {
-                       token = APPROXNUM;
-                       cur = scanner_getc(lc);
-                       if (cur == '-' || cur == '+')
-                               token = 0;
-                       while ((cur = scanner_getc(lc)) != EOF && iswdigit(cur))
-                               token = APPROXNUM;
+                               if (token == sqlINT || iswdigit(cur)) {
+                                       token = INTNUM;
+                                       while (iswdigit(cur))
+                                               cur = scanner_getc(lc);
+                               } else {
+                                       token = 0;
+                               }
+                       }
+                       if (cur == 'e' || cur == 'E') {
+                               if (token != 0) {
+                                       cur = scanner_getc(lc);
+                                       if (cur == '+' || cur == '-')
+                                               cur = scanner_getc(lc);
+                                       while (cur != EOF && iswdigit(cur)) {
+                                               token = APPROXNUM;
+                                               cur = scanner_getc(lc);
+                                       }
+                                       if (token != APPROXNUM)
+                                               token = 0;
+                               }
+                       }
                }
        }
 
        if (cur == EOF && lc->rs->buf == NULL) /* malloc failure */
                return EOF;
 
+       if (cur != EOF) {
+               if (iswalnum(cur) || cur == '_' /* || cur == '"' || cur == '\'' 
*/)
+                       token = 0;
+               utf8_putchar(lc, cur);
+       }
+
        if (token) {
-               if (cur != EOF)
-                       utf8_putchar(lc, cur);
-               if (before_cur != EOF)
-                       utf8_putchar(lc, before_cur);
                return scanner_token(lc, token);
        } else {
                (void)sql_error( c, 2, SQLSTATE(42000) "Unexpected symbol %lc", 
(wint_t) cur);
diff --git a/sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.test 
b/sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.test
--- a/sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.test
+++ b/sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.test
@@ -108,15 +108,13 @@ select 0xF
 ----
 15
 
-query I rowsort
+statement error
 select 0xg
 ----
-0
 
-query I rowsort
+statement error
 select 0xG
 ----
-0
 
 query I rowsort
 select 0x00
@@ -620,15 +618,13 @@ select -0xF
 ----
 -15
 
-query I rowsort
+statement error
 select -0xg
 ----
-0
 
-query I rowsort
+statement error
 select -0xG
 ----
-0
 
 query I rowsort
 select -0x00
diff --git a/sql/test/sql_dump/Tests/dump.test 
b/sql/test/sql_dump/Tests/dump.test
--- a/sql/test/sql_dump/Tests/dump.test
+++ b/sql/test/sql_dump/Tests/dump.test
@@ -1,3 +1,6 @@
+statement ok
+SET TIME ZONE INTERVAL '02:00' HOUR TO MINUTE
+
 statement ok
 START TRANSACTION
 
diff --git a/sql/test/sys-schema/Tests/webExamplesCastFunctionsOperators.test 
b/sql/test/sys-schema/Tests/webExamplesCastFunctionsOperators.test
--- a/sql/test/sys-schema/Tests/webExamplesCastFunctionsOperators.test
+++ b/sql/test/sys-schema/Tests/webExamplesCastFunctionsOperators.test
@@ -1,3 +1,6 @@
+statement ok
+SET TIME ZONE INTERVAL '02:00' HOUR TO MINUTE
+
 query T rowsort
 select cast(123 as varchar(10))
 ----
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to