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