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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list