Changeset: d5e5a3bba7df for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5e5a3bba7df
Added Files:
sql/test/SQLancer/Tests/All
sql/test/SQLancer/Tests/sqlancer01.sql
sql/test/SQLancer/Tests/sqlancer01.stable.err
sql/test/SQLancer/Tests/sqlancer01.stable.out
Modified Files:
sql/backends/monet5/UDF/udf/udf.c
sql/backends/monet5/rel_bin.c
sql/server/rel_exp.c
Branch: default
Log Message:
Merged with Jun2020
diffs (truncated from 318 to 300 lines):
diff --git a/sql/backends/monet5/UDF/udf/udf.c
b/sql/backends/monet5/UDF/udf/udf.c
--- a/sql/backends/monet5/UDF/udf/udf.c
+++ b/sql/backends/monet5/UDF/udf/udf.c
@@ -27,9 +27,7 @@ UDFreverse_(char **ret, const char *src)
if (strNil(src)) {
*ret = GDKstrdup(str_nil);
if (*ret == NULL)
- throw(MAL, "udf.reverse",
- "failed to create copy of str_nil");
-
+ throw(MAL, "udf.reverse", "failed to create copy of
str_nil");
return MAL_SUCCEED;
}
@@ -37,13 +35,48 @@ UDFreverse_(char **ret, const char *src)
len = strlen(src);
*ret = dst = GDKmalloc(len + 1);
if (dst == NULL)
- throw(MAL, "udf.reverse",
- "failed to allocate string of length %zu", len + 1);
+ throw(MAL, "udf.reverse", "failed to allocate string of length
%zu", len + 1);
- /* copy characters from src to dst in reverse order */
dst[len] = 0;
- while (len > 0)
- *dst++ = src[--len];
+ /* all strings in MonetDB are encoded using UTF-8; we must
+ * make sure that the reversed string is also encoded in valid
+ * UTF-8, so we treat multibyte characters as single units */
+ while (*src) {
+ if ((*src & 0xF8) == 0xF0) {
+ /* 4 byte UTF-8 sequence */
+ assert(len >= 4);
+ dst[len - 4] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 3] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 2] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 1] = *src++;
+ len -= 4;
+ } else if ((*src & 0xF0) == 0xE0) {
+ /* 3 byte UTF-8 sequence */
+ assert(len >= 3);
+ dst[len - 3] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 2] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 1] = *src++;
+ len -= 3;
+ } else if ((*src & 0xE0) == 0xC0) {
+ /* 2 byte UTF-8 sequence */
+ assert(len >= 2);
+ dst[len - 2] = *src++;
+ assert((*src & 0xC0) == 0x80);
+ dst[len - 1] = *src++;
+ len -= 2;
+ } else {
+ /* 1 byte UTF-8 "sequence" */
+ assert(len >= 1);
+ assert((*src & 0x80) == 0);
+ dst[--len] = *src++;
+ }
+ }
+ assert(len == 0);
return MAL_SUCCEED;
}
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -880,8 +880,6 @@ exp_bin(backend *be, sql_exp *e, stmt *l
int swapped = 0, is_select = 0;
sql_exp *re = e->r, *re2 = e->f;
- assert((reduce && !depth) || e->flag == cmp_in || e->flag ==
cmp_notin);
-
/* general predicate, select and join */
if (e->flag == cmp_filter) {
list *args;
@@ -1070,7 +1068,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
} else {
if (r2) {
- if (l->nrcols == 0 && r->nrcols == 0 &&
r2->nrcols == 0) {
+ if (!reduce || (l->nrcols == 0 && r->nrcols ==
0 && r2->nrcols == 0)) {
sql_subtype *bt =
sql_bind_localtype("bit");
sql_subfunc *lf =
sql_bind_func(sql->sa, sql->session->schema,
compare_func(range2lcompare(e->flag), 0),
@@ -1113,7 +1111,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
} else {
/* value compare or select */
- if (l->nrcols == 0 && r->nrcols == 0 &&
(e->flag == mark_in || e->flag == mark_notin)) {
+ if (!reduce || (l->nrcols == 0 && r->nrcols ==
0 && (e->flag == mark_in || e->flag == mark_notin))) {
sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, "=", tail_type(l), tail_type(l), F_FUNC);
assert(f);
s = stmt_binop(be, l, r, f);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -991,7 +991,7 @@ exp_subtype( sql_exp *e )
return NULL;
}
case e_cmp:
- /* return bit */
+ return sql_bind_localtype("bit");
case e_psm:
if (e->tpe.type)
return &e->tpe;
diff --git a/sql/test/SQLancer/Tests/All b/sql/test/SQLancer/Tests/All
new file mode 100644
--- /dev/null
+++ b/sql/test/SQLancer/Tests/All
@@ -0,0 +1,1 @@
+sqlancer01
diff --git a/sql/test/SQLancer/Tests/sqlancer01.sql
b/sql/test/SQLancer/Tests/sqlancer01.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/SQLancer/Tests/sqlancer01.sql
@@ -0,0 +1,38 @@
+CREATE TABLE tbl_ProductSales (ColID int, Product_Category varchar(64),
Product_Name varchar(64), TotalSales int);
+INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO
Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
+CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT, col6
INT, col7 INT, col8 INT);
+INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88),
(111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
+CREATE TABLE integers(i INTEGER);
+INSERT INTO integers VALUES (1), (2), (3), (NULL);
+
+START TRANSACTION;
+-- Bug 6883
+select 1 from integers where (((0.7161494983624688) in (integers.i)) = true) =
false;
+ -- 1
+ -- 1
+ -- 1
+
+delete from integers where (((0.7161494983624688) in (integers.i)) = true) =
false;
+ -- 3 rows affected
+select i from integers;
+ -- NULL
+
+CREATE TABLE t0 (a1 INT, a2 int, a3 int); --Bug 6884
+UPDATE t0 SET a2 = (- (- (t0.a1))), a3 =
(ascii(CAST(ascii('}悂Y8K*韖5<c>^n8_X1X|p(''bX') AS STRING(920)))) WHERE NOT
(((0.27023923567918073) NOT IN (0.9149447665258329)) = FALSE);
+ --0 rows affected
+
+insert into integers(i) values(((length(reverse('8
\rcr੧[bp1eMY쫺4j5s뮯!<Rn4*}')))>>(((- (- (528640982)))&(ascii('528640982'))))));
--Bug 6885
+SELECT i from integers order by i;
+ -- NULL
+ -- 0
+select reverse('8 \rcr੧[bp1eMY쫺4j5s뮯!<Rn4*}');
+
+-- Bug 6886
+INSERT INTO another_t(col4) VALUES(-589206676), (-1557408577);
+DELETE FROM another_t WHERE ((another_t.col8)<=(+ (another_t.col8)));
+ALTER TABLE another_t ADD UNIQUE(col8, col1, col6, col3);
+ROLLBACK;
+
+DROP TABLE tbl_ProductSales;
+DROP TABLE another_T;
+DROP TABLE integers;
diff --git a/sql/test/SQLancer/Tests/sqlancer01.stable.err
b/sql/test/SQLancer/Tests/sqlancer01.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/SQLancer/Tests/sqlancer01.stable.err
@@ -0,0 +1,31 @@
+stderr of test 'sqlancer01` in directory 'sql/test/SQLancer` itself:
+
+
+# 11:08:10 >
+# 11:08:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=30085" "--set"
"mapi_usock=/var/tmp/mtest-117725/.s.monetdb.30085" "--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/MonetDB/mTests_sql_test_SQLancer"
"--set" "embedded_c=true"
+# 11:08:10 >
+
+# builtin opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_ipv6 = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# builtin opt raw_strings = false
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 30085
+# cmdline opt mapi_usock = /var/tmp/mtest-117725/.s.monetdb.30085
+# cmdline opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/MonetDB/mTests_sql_test_SQLancer
+# cmdline opt embedded_c = true
+
+# 11:08:12 >
+# 11:08:12 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-117725" "--port=30085"
+# 11:08:12 >
+
+
+# 11:08:12 >
+# 11:08:12 > "Done."
+# 11:08:12 >
+
diff --git a/sql/test/SQLancer/Tests/sqlancer01.stable.out
b/sql/test/SQLancer/Tests/sqlancer01.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/SQLancer/Tests/sqlancer01.stable.out
@@ -0,0 +1,118 @@
+stdout of test 'sqlancer01` in directory 'sql/test/SQLancer` itself:
+
+
+# 11:08:10 >
+# 11:08:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=30085" "--set"
"mapi_usock=/var/tmp/mtest-117725/.s.monetdb.30085" "--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-Jun2020/BUILD/var/MonetDB/mTests_sql_test_SQLancer"
"--set" "embedded_c=true"
+# 11:08:10 >
+
+# MonetDB 5 server v11.37.0 (hg id: a964bf319dab)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_SQLancer', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.496 GiB available main-memory of which we use 12.629 GiB
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2020 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on
mapi:monetdb://localhost.localdomain:30085/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-117725/.s.monetdb.30085
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 58_hot_snapshot.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 61_wlcr.sql
+# loading sql script: 72_fits.sql
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
+# loading sql script: 75_shp.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 80_udf_hge.sql
+# loading sql script: 81_tracer.sql
+# loading sql script: 90_generator.sql
+# loading sql script: 90_generator_hge.sql
+# loading sql script: 99_system.sql
+# MonetDB/SQL module loaded
+
+# 11:08:12 >
+# 11:08:12 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-117725" "--port=30085"
+# 11:08:12 >
+
+#CREATE TABLE tbl_ProductSales (ColID int, Product_Category varchar(64),
Product_Name varchar(64), TotalSales int);
+#INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO
Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
+[ 4 ]
+#CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT,
col6 INT, col7 INT, col8 INT);
+#INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88),
(111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
+[ 4 ]
+#CREATE TABLE integers(i INTEGER);
+#INSERT INTO integers VALUES (1), (2), (3), (NULL);
+[ 4 ]
+#START TRANSACTION;
+#select 1 from integers where (((0.7161494983624688) in (integers.i)) = true)
= false;
+% .%4 # table_name
+% %4 # name
+% tinyint # type
+% 1 # length
+[ 1 ]
+[ 1 ]
+[ 1 ]
+#delete from integers where (((0.7161494983624688) in (integers.i)) = true) =
false;
+[ 3 ]
+#select i from integers;
+% sys.integers # table_name
+% i # name
+% int # type
+% 1 # length
+[ NULL ]
+#CREATE TABLE t0 (a1 INT, a2 int, a3 int); --Bug 6884
+#UPDATE t0 SET a2 = (- (- (t0.a1))), a3 =
(ascii(CAST(ascii('}悂Y8K*韖5<c>^n8_X1X|p(''bX') AS STRING(920)))) WHERE NOT
(((0.27023923567918073) NOT IN (0.9149447665258329)) = FALSE);
+[ 0 ]
+#insert into integers(i) values(((length(reverse('8
\rcr੧[bp1eMY쫺4j5s뮯!<Rn4*}')))>>(((- (- (528640982)))&(ascii('528640982'))))));
--Bug 6885
+[ 1 ]
+#SELECT i from integers order by i;
+% sys.integers # table_name
+% i # name
+% int # type
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list