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