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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list