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