Changeset: afbe79587c5b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afbe79587c5b
Removed Files:
        sql/test/SQLancer/Tests/sqlancer09.sql
        sql/test/SQLancer/Tests/sqlancer10.sql
Modified Files:
        sql/common/sql_types.c
        sql/server/sql_semantic.c
        sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test
        sql/test/SQLancer/Tests/sqlancer09.test
        sql/test/SQLancer/Tests/sqlancer10.test
        sql/test/subquery/Tests/subquery6.test
Branch: default
Log Message:

Merged with Oct2020


diffs (truncated from 364 to 300 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -505,7 +505,7 @@ sql_dup_subfunc(sql_allocator *sa, sql_f
                                        } else if (r->scale)
                                                scale = r->scale;
                                }
-                               if (member && f->fix_scale == INOUT)
+                               if (member && (f->fix_scale == INOUT || 
r->type->eclass == EC_ANY))
                                        digits = member->digits;
                                if (IS_ANALYTIC(f) && mscale)
                                        scale = mscale;
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
@@ -266,8 +266,10 @@ static sql_subfunc *
                        scale = member->scale;
                }
                /* same type as the input */
-               if (r->type->eclass == EC_ANY && member)
+               if (r->type->eclass == EC_ANY && member) {
                        r = member;
+                       digits = member->digits;
+               }
                if (!EC_SCALE(r->type->eclass))
                        scale = 0;
                res = sql_create_subtype(sa, r->type, digits, scale);
@@ -955,14 +957,14 @@ result_datatype(sql_subtype *super, sql_
                char *tpe = "varchar";
                unsigned int digits = 0;
                if (!EC_VARCHAR(lclass)) {
-                               tpe = r->type->sqlname;
-                               digits = (!l->digits)?0:r->digits;
+                       tpe = r->type->sqlname;
+                       digits = (!l->digits)?0:r->digits;
                } else if (!EC_VARCHAR(rclass)) {
-                               tpe = l->type->sqlname;
-                               digits = (!r->digits)?0:l->digits;
+                       tpe = l->type->sqlname;
+                       digits = (!r->digits)?0:l->digits;
                } else { /* both */
-                               tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
-                               digits = 
(!l->digits||!r->digits)?0:sql_max(l->digits, r->digits);
+                       tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
+                       digits = (!l->digits||!r->digits)?0:sql_max(l->digits, 
r->digits);
                }
                sql_find_subtype(super, tpe, digits, 0);
        /* case b blob */
@@ -976,30 +978,38 @@ result_datatype(sql_subtype *super, sql_
                char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
                unsigned int digits = sql_max(l->digits, r->digits);
                unsigned int scale = sql_max(l->scale, r->scale);
-               if (l->type->radix == 10 || r->type->radix == 10) {
-                       digits = 0;
-                       /* change to radix 10 */
-                       if (l->type->radix == 2 && r->type->radix == 10) {
-                               digits = bits2digits(l->type->digits);
-                               digits = sql_max(r->digits, digits);
-                               scale = r->scale;
-                       } else if (l->type->radix == 10 && r->type->radix == 2) 
{
-                               digits = bits2digits(r->type->digits);
-                               digits = sql_max(l->digits, digits);
-                               scale = l->scale;
+
+               if (l->type->radix == 10 && r->type->radix == 10) {
+                       digits = scale + (sql_max(l->digits - l->scale, 
r->digits - r->scale));
+#ifdef HAVE_HGE
+                       if (digits > 39) {
+                               digits = 39;
+#else
+                       if (digits > 19) {
+                               digits = 19;
+#endif
+                               scale = MIN(scale, digits - 1);
                        }
+               } else if (l->type->radix == 2 && r->type->radix == 10) { /* 
change to radix 10 */
+                       digits = bits2digits(l->type->digits);
+                       digits = sql_max(r->digits, digits);
+                       scale = r->scale;
+               } else if (l->type->radix == 10 && r->type->radix == 2) { /* 
change to radix 10 */
+                       digits = bits2digits(r->type->digits);
+                       digits = sql_max(l->digits, digits);
+                       scale = l->scale;
                }
                sql_find_subtype(super, tpe, digits, scale);
        /* case d approximate numeric */
        } else if (EC_APPNUM(lclass) || EC_APPNUM(rclass)) {
                if (!EC_APPNUM(lclass)) {
-                               *super = *r;
+                       *super = *r;
                } else if (!EC_APPNUM(rclass)) {
-                               *super = *l;
+                       *super = *l;
                } else { /* both */
-                               char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
-                               unsigned int digits = sql_max(l->digits, 
r->digits); /* bits precision */
-                               sql_find_subtype(super, tpe, digits, 0);
+                       char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
+                       unsigned int digits = sql_max(l->digits, r->digits); /* 
bits precision */
+                       sql_find_subtype(super, tpe, digits, 0);
                }
        /* now its getting serious, ie e any 'case e' datetime data type */
        /* 'case f' interval types */
@@ -1064,8 +1074,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/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test 
b/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test
--- a/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test
+++ b/sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.test
@@ -23,7 +23,7 @@ from sys.tables t join sys.columns c on 
 dummy6
 key
 varchar
-0
+32
 dummy6
 val4
 int
@@ -43,7 +43,7 @@ from sys.tables t join sys.columns c on 
 dummy7
 key
 varchar
-0
+32
 dummy7
 val4
 int
diff --git a/sql/test/SQLancer/Tests/sqlancer09.test 
b/sql/test/SQLancer/Tests/sqlancer09.test
--- a/sql/test/SQLancer/Tests/sqlancer09.test
+++ b/sql/test/SQLancer/Tests/sqlancer09.test
@@ -268,8 +268,12 @@ 0
 statement ok
 ROLLBACK
 
-statement error
+query R rowsort
 values (0.51506835), (2), (least('a', 0.5667308))
+----
+0.515
+0.567
+2.000
 
 statement ok
 START TRANSACTION
@@ -305,7 +309,7 @@ 239480113   NULL    NULL
 statement ok
 create view v2(vc0, vc1, vc2) as (values (((((+ 
(0.51506835))&(-2)))<<(scale_down(least(31552,
 0.3), cast(1500294098 as int)))),
-((- (((44257622)-(0.6))))>=(least(-15958291, -1534974396))), case - 
(sql_min(0.632858,
+((- (((44257622)-(0.6))))>=(least(-3, -4))), case - (sql_min(0.632858,
 0.3)) when ((((0.5)^(0.4)))+(((0.4)/(5))))
 then sql_max(cast(5293 as decimal), ((0.5)-
 (0.5))) end),(charindex(r'934079707', r'35305325'), not (false),
diff --git a/sql/test/SQLancer/Tests/sqlancer10.test 
b/sql/test/SQLancer/Tests/sqlancer10.test
--- a/sql/test/SQLancer/Tests/sqlancer10.test
+++ b/sql/test/SQLancer/Tests/sqlancer10.test
@@ -101,6 +101,21 @@ statement ok
 START TRANSACTION
 
 statement ok
+create view v3(vc0, vc1) as (values (0.67,NULL),(18.50, 3),(0.70, 6))
+
+statement ok
+create view v7(vc0) as (values (8505133838.114197),(NULL))
+
+statement error
+(select v3.vc0 from v3) intersect (select greatest('-1115800120', v7.vc0) from 
v7)
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
 CREATE TABLE t1(c0 int)
 
 statement ok
diff --git a/sql/test/subquery/Tests/subquery6.test 
b/sql/test/subquery/Tests/subquery6.test
--- a/sql/test/subquery/Tests/subquery6.test
+++ b/sql/test/subquery/Tests/subquery6.test
@@ -51,10 +51,10 @@ WHERE ctr1.ctr_total_return >
 statement error
 SELECT i FROM integers i1 WHERE (SELECT CASE WHEN i1.i IS NULL THEN (SELECT 
FALSE FROM integers i2) ELSE TRUE END)
 
-query I rowsort
+query T rowsort
 SELECT (SELECT (SELECT SUM(col1)) IN (MAX(col2))) FROM another_t
 ----
-0
+False
 
 statement error
 SELECT 1 IN (col4, MIN(col2)) FROM another_t
@@ -62,10 +62,10 @@ SELECT 1 IN (col4, MIN(col2)) FROM anoth
 statement error
 SELECT (SELECT col1) IN ('not a number') FROM another_t
 
-query I rowsort
+query T rowsort
 SELECT (SELECT (SELECT SUM(col1)) IN (MAX(col2), '12')) FROM another_t
 ----
-0
+False
 
 query I rowsort
 SELECT CASE WHEN ColID IS NULL THEN CAST(Product_Category AS INT) ELSE 
TotalSales END FROM tbl_ProductSales
@@ -186,10 +186,10 @@ SELECT (SELECT t2.col2 FROM another_t t2
 statement error
 SELECT 1 > (SELECT 2 FROM integers)
 
-query I rowsort
+query T rowsort
 SELECT (SELECT 1) > ANY(SELECT 1)
 ----
-0
+False
 
 statement ok
 CREATE FUNCTION debugme() RETURNS INT
@@ -205,20 +205,20 @@ SELECT debugme()
 statement ok
 DROP FUNCTION debugme
 
-query III rowsort
+query TTT rowsort
 SELECT i = ALL(i), i < ANY(i), i = ANY(NULL) FROM integers
 ----
-1
-0
-NULL
-1
-0
-NULL
-1
-0
 NULL
 NULL
 NULL
+True
+False
+NULL
+True
+False
+NULL
+True
+False
 NULL
 
 query I rowsort
@@ -423,61 +423,61 @@ select (select sum(i2.i) in (select sum(
 statement error
 select (select sum(i1.i + i2.i) in (select sum(i1.i + i2.i)) from integers i2 
group by i2.i) from integers i1 group by i1.i
 
-query I rowsort
+query T rowsort
 select (select sum(i1.i + i2.i) in (select sum(i1.i + i2.i)) from integers i2) 
from integers i1
 ----
-1
-1
-1
 NULL
+True
+True
+True
 
-query I rowsort
+query T rowsort
 select (select sum(i1.i + i2.i) > (select sum(i1.i + i2.i)) from integers i2) 
from integers i1
 ----
-0
-0
-0
+False
+False
+False
 NULL
 
 statement error
 select (select sum(i1.i) > (select sum(i1.i + i2.i)) from integers i2) from 
integers i1
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to