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

Reply via email to