Changeset: 8c21324a4af8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c21324a4af8
Modified Files:
        sql/server/sql_semantic.c
        sql/test/SQLancer/Tests/sqlancer09.stable.err
        sql/test/SQLancer/Tests/sqlancer09.stable.out
        sql/test/SQLancer/Tests/sqlancer10.stable.err
        sql/test/SQLancer/Tests/sqlancer10.stable.out
Branch: Oct2020
Log Message:

Add more digits when converting from numeric types to char types and approved 
ouput. We have more strict conversion rules on set operations, so the error is 
right


diffs (103 lines):

diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -302,8 +302,19 @@ supertype(sql_subtype *super, sql_subtyp
                sql_find_subtype(&lsuper, tpe, 0, 0);
        } else {
                /* for strings use the max of both */
-               digits = EC_VARCHAR(eclass) ? sql_max(idigits, rdigits) :
-                                sql_max(idigits - i->scale, rdigits - 
r->scale);
+               if (eclass == EC_CHAR) {
+                       if (i->type->eclass == EC_NUM)
+                               idigits++; /* add '-' */
+                       else if (i->type->eclass == EC_DEC || i->type->eclass 
== EC_FLT)
+                               idigits+=2; /* add '-' and '.' TODO for 
floating-points maybe more is needed */
+                       if (r->type->eclass == EC_NUM)
+                               rdigits++;
+                       else if (r->type->eclass == EC_DEC || r->type->eclass 
== EC_FLT)
+                               rdigits+=2;
+                       digits = sql_max(idigits, rdigits);
+               } else {
+                       digits = sql_max(idigits - i->scale, rdigits - 
r->scale);
+               }
                sql_find_subtype(&lsuper, tpe, digits+scale, scale);
        }
        *super = lsuper;
diff --git a/sql/test/SQLancer/Tests/sqlancer09.stable.err 
b/sql/test/SQLancer/Tests/sqlancer09.stable.err
--- a/sql/test/SQLancer/Tests/sqlancer09.stable.err
+++ b/sql/test/SQLancer/Tests/sqlancer09.stable.err
@@ -9,11 +9,7 @@ MAPI  = (monetdb) /var/tmp/mtest-133412/
 QUERY = INSERT INTO t2 VALUES (COALESCE(1 BETWEEN 2 AND 3, 1));
 ERROR = !INSERT INTO: PRIMARY KEY constraint 't2.t2_c0_pkey' violated
 CODE  = 40002
-MAPI  = (monetdb) /var/tmp/mtest-349169/.s.monetdb.38512
-QUERY = values (0.51506835), (2), (least('a', 0.5667308));
-ERROR = !value too long for type (var)char(8)
-CODE  = 22001
-MAPI  = (monetdb) /var/tmp/mtest-307586/.s.monetdb.36528
+MAPI  = (monetdb) /var/tmp/mtest-417038/.s.monetdb.32277
 QUERY = select 1 from v74 cross join v84 join (values ('b'), ('a'), (1)) as 
sub0 on (v84.vc0)^(-9223372036854775807) is not null;
 ERROR = !overflow in calculation 1XOR-9223372036854775807.
 CODE  = 22003
diff --git a/sql/test/SQLancer/Tests/sqlancer09.stable.out 
b/sql/test/SQLancer/Tests/sqlancer09.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer09.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer09.stable.out
@@ -167,6 +167,14 @@ stdout of test 'sqlancer09` in directory
 % 1 # length
 [ 0    ]
 #ROLLBACK;
+#values (0.51506835), (2), (least('a', 0.5667308));
+% .%1 # table_name
+% %1 # name
+% decimal # type
+% 20 # length
+[ 0.51506835   ]
+[ 2.00000000   ]
+[ 0.56673080   ]
 #START TRANSACTION;
 #CREATE TABLE "sys"."t2" ("c0" BIGINT,"c1" BIGINT,"c2" REAL);
 #COPY 21 RECORDS INTO "sys"."t2" FROM stdin USING DELIMITERS E'\t',E'\n','"';
diff --git a/sql/test/SQLancer/Tests/sqlancer10.stable.err 
b/sql/test/SQLancer/Tests/sqlancer10.stable.err
--- a/sql/test/SQLancer/Tests/sqlancer10.stable.err
+++ b/sql/test/SQLancer/Tests/sqlancer10.stable.err
@@ -5,6 +5,10 @@ stderr of test 'sqlancer10` in directory
 # 13:59:46 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-215607" "--port=30526"
 # 13:59:46 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-485092/.s.monetdb.38732
+QUERY = (select v3.vc0 from v3) intersect (select greatest('-1115800120', 
v7.vc0) from v7);
+ERROR = !types char(18,0) and decimal(20,2) are not equal
+CODE  = 42000
 
 # 13:59:46 >  
 # 13:59:46 >  "Done."
diff --git a/sql/test/SQLancer/Tests/sqlancer10.stable.out 
b/sql/test/SQLancer/Tests/sqlancer10.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer10.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer10.stable.out
@@ -66,6 +66,26 @@ stdout of test 'sqlancer10` in directory
 % tinyint # type
 % 1 # length
 #ROLLBACK;
+#START TRANSACTION;
+#create view v3(vc0, vc1) as (values (0.67,NULL),(18.50, 3),(0.70, 6));
+#create view v7(vc0) as (values (8505133838.114197),(NULL));
+#ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE t1(c0 int);
+#CREATE VIEW v4(vc0) AS ((SELECT NULL FROM t1 AS l0t1) UNION ALL (SELECT 
true));
+#INSERT INTO t1(c0) VALUES(12), (2), (6), (3), (1321), (10), (8), (1), (2), 
(3), (9);
+[ 11   ]
+#DELETE FROM t1 WHERE true;
+[ 11   ]
+#INSERT INTO t1(c0) VALUES(9), (1), (3), (2), (5);
+[ 5    ]
+#SELECT 1 FROM v4 JOIN (SELECT 2) AS sub0 ON COALESCE(v4.vc0, v4.vc0 BETWEEN 
v4.vc0 AND v4.vc0);
+% .%13 # table_name
+% %13 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+#ROLLBACK;
 
 # 13:59:46 >  
 # 13:59:46 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to