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