Changeset: 6bfbf16160a6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6bfbf16160a6 Modified Files: sql/common/sql_types.c sql/test/BugTracker-2014/Tests/round-properties.Bug-3515.stable.out sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out.int128 sql/test/Tests/round.stable.out sql/test/pg_regress/Tests/numeric.stable.err sql/test/pg_regress/Tests/numeric.stable.out.int128 Branch: Jul2017 Log Message:
Implement special case for round(): result has type of first argument. diffs (264 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 @@ -643,14 +643,25 @@ sql_dup_subfunc(sql_allocator *sa, sql_f } else if (IS_FUNC(f) || IS_UNION(f) || IS_ANALYTIC(f)) { /* not needed for PROC */ unsigned int mscale = 0, mdigits = 0; - if (ops) for (tn = ops->h; tn; tn = tn->next) { - sql_subtype *a = tn->data; + if (ops) { + if (ops->h && ops->h->data && f->imp && + strcmp(f->imp, "round") == 0) { + /* special case for round(): result is + * same type as first argument */ + sql_subtype *a = ops->h->data; + mscale = a->scale; + mdigits = a->digits; + } else { + for (tn = ops->h; tn; tn = tn->next) { + sql_subtype *a = tn->data; - /* same scale as the input */ - if (a && a->scale > mscale) - mscale = a->scale; - if (a && f->fix_scale == INOUT) - mdigits = a->digits; + /* same scale as the input */ + if (a && a->scale > mscale) + mscale = a->scale; + if (a && f->fix_scale == INOUT) + mdigits = a->digits; + } + } } if (!member) { diff --git a/sql/test/BugTracker-2014/Tests/round-properties.Bug-3515.stable.out b/sql/test/BugTracker-2014/Tests/round-properties.Bug-3515.stable.out --- a/sql/test/BugTracker-2014/Tests/round-properties.Bug-3515.stable.out +++ b/sql/test/BugTracker-2014/Tests/round-properties.Bug-3515.stable.out @@ -63,7 +63,7 @@ Ready. % sys.ceil_floor_round, sys.L3 # table_name % a, L3 # name % decimal, decimal # type -% 20, 10 # length +% 20, 20 # length [ -5.500, -6.000 ] [ -5.499, -5.000 ] [ 0.000, 0.000 ] diff --git a/sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out.int128 b/sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out.int128 --- a/sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out.int128 +++ b/sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out.int128 @@ -50,7 +50,7 @@ Ready. % sys.t1, sys.t2, sys.L4 # table_name % id, id, L4 # name % int, int, decimal # type -% 1, 1, 7 # length +% 1, 1, 38 # length [ 1, 1, 0.00000000000000000000 ] [ 1, 2, 0.00000000000000000000 ] [ 2, 1, 0.00000000000000000000 ] diff --git a/sql/test/Tests/round.stable.out b/sql/test/Tests/round.stable.out --- a/sql/test/Tests/round.stable.out +++ b/sql/test/Tests/round.stable.out @@ -28,31 +28,31 @@ Ready. % .L2, .L4, .L6, .L10 # table_name % L2, L4, L6, L10 # name % decimal, decimal, decimal, decimal # type -% 3, 4, 4, 5 # length +% 7, 7, 7, 7 # length [ 750.00, 700.00, 1000.00, 0.00 ] #SELECT ROUND(123.9994, 3),ROUND(123.9995, 3); % .L2, .L4 # table_name % L2, L4 # name % decimal, decimal # type -% 4, 4 # length +% 9, 9 # length [ 123.9990, 124.0000 ] #SELECT ROUND(123.4545, 2); % .L2 # table_name % L2 # name % decimal # type -% 4 # length +% 9 # length [ 123.4500 ] #SELECT ROUND(123.45, -2); % .L2 # table_name % L2 # name % decimal # type -% 4 # length +% 7 # length [ 100.00 ] #SELECT ROUND(150.75, 0); % .L2 # table_name % L2 # name % decimal # type -% 10 # length +% 7 # length [ 151.00 ] # 15:17:10 > diff --git a/sql/test/pg_regress/Tests/numeric.stable.err b/sql/test/pg_regress/Tests/numeric.stable.err --- a/sql/test/pg_regress/Tests/numeric.stable.err +++ b/sql/test/pg_regress/Tests/numeric.stable.err @@ -108,31 +108,7 @@ ERROR = !decimal (NaN) doesn't have form MAPI = (monetdb) /var/tmp/mtest-31608/.s.monetdb.31061 QUERY = INSERT INTO num_exp_power_10_ln VALUES (1,'NaN'); ERROR = !decimal (NaN) doesn't have format (38.19) -MAPI = (monetdb) /var/tmp/mtest-31608/.s.monetdb.31061 -QUERY = SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 20) as expected - FROM num_result t1, num_exp_add t2 - WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 - AND t1.result <> round(t2.expected, 20); -ERROR = !value (-343384922153970470000000000) exceeds limits of type int -MAPI = (monetdb) /var/tmp/mtest-31608/.s.monetdb.31061 -QUERY = SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) as expected - FROM num_result t1, num_exp_sub t2 - WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 - AND t1.result <> round(t2.expected, 40); -ERROR = !value (343384922153970470000000000) exceeds limits of type int -MAPI = (monetdb) /var/tmp/mtest-31769/.s.monetdb.32802 -QUERY = SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected - FROM num_result t1, num_exp_mul t2 - WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 - AND t1.result <> round(t2.expected, 30); -ERROR = !value (11791320476268835968621358563202090) exceeds limits of type int -MAPI = (monetdb) /var/tmp/mtest-31769/.s.monetdb.32802 -QUERY = SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected - FROM num_result t1, num_exp_div t2 - WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 - AND t1.result <> round(t2.expected, 80); -ERROR = !value (10000000000000000000) exceeds limits of type int -MAPI = (monetdb) /var/tmp/mtest-31769/.s.monetdb.32802 +MAPI = (monetdb) /var/tmp/mtest-30227/.s.monetdb.36405 QUERY = SELECT STDDEV(val) FROM num_data; ERROR = !SELECT: no such unary operator 'stddev(decimal)' MAPI = (monetdb) /var/tmp/mtest-27483/.s.monetdb.35395 diff --git a/sql/test/pg_regress/Tests/numeric.stable.out.int128 b/sql/test/pg_regress/Tests/numeric.stable.out.int128 --- a/sql/test/pg_regress/Tests/numeric.stable.out.int128 +++ b/sql/test/pg_regress/Tests/numeric.stable.out.int128 @@ -909,6 +909,14 @@ Ready. #INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 20) # FROM num_data t1, num_data t2; [ 100 ] +#SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 20) as expected +# FROM num_result t1, num_exp_add t2 +# WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 +# AND t1.result <> round(t2.expected, 20); +% sys.t1, sys.t1, sys.t1, sys.L5 # table_name +% id1, id2, result, expected # name +% int, int, decimal, decimal # type +% 1, 1, 40, 40 # length #DELETE FROM num_result; [ 100 ] #INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val @@ -927,6 +935,14 @@ Ready. #INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) # FROM num_data t1, num_data t2; [ 100 ] +#SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) as expected +# FROM num_result t1, num_exp_sub t2 +# WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 +# AND t1.result <> round(t2.expected, 40); +% sys.t1, sys.t1, sys.t1, sys.L5 # table_name +% id1, id2, result, expected # name +% int, int, decimal, decimal # type +% 1, 1, 40, 40 # length #DELETE FROM num_result; [ 100 ] #INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val @@ -945,6 +961,14 @@ Ready. #INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) # FROM num_data t1, num_data t2 ORDER BY 1, 2; [ 100 ] +#SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected +# FROM num_result t1, num_exp_mul t2 +# WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 +# AND t1.result <> round(t2.expected, 30); +% sys.t1, sys.t1, sys.t1, sys.L5 # table_name +% id1, id2, result, expected # name +% int, int, decimal, decimal # type +% 1, 1, 40, 40 # length #DELETE FROM num_result; [ 100 ] #INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val @@ -1022,6 +1046,70 @@ Ready. # FROM num_data t1, num_data t2 # WHERE t2.val <> '0.0'; [ 80 ] +#SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected +# FROM num_result t1, num_exp_div t2 +# WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 +# AND t1.result <> round(t2.expected, 80); +% sys.t1, sys.t1, sys.t1, sys.L5 # table_name +% id1, id2, result, expected # name +% int, int, decimal, decimal # type +% 1, 1, 40, 40 # length +[ 2, 3, -7967167.5673775050000000000, -7967167.5673775051044083527 ] +[ 2, 4, -4.4026748000000000000, -4.4026748004683011669 ] +[ 2, 5, -2094.1886691450000000000, -2094.1886691456353549643 ] +[ 2, 6, -365.6859989140000000000, -365.6859989147976644094 ] +[ 2, 7, 0.4135748370000000000, 0.4135748377848523552 ] +[ 2, 8, -458.5741672170000000000, -458.5741672172787088848 ] +[ 2, 9, 1.3775729990000000000, 1.3775729994643893181 ] +[ 3, 2, -0.0000001250000000000, -0.0000001255151208435 ] +[ 3, 4, 0.0000005520000000000, 0.0000005526022596155 ] +[ 3, 5, 0.0002628520000000000, 0.0002628523438769550 ] +[ 3, 6, 0.0000458990000000000, 0.0000458991223445760 ] +[ 3, 7, -0.0000000510000000000, -0.0000000519098957424 ] +[ 3, 8, 0.0000575570000000000, 0.0000575579920139955 ] +[ 3, 9, -0.0000001720000000000, -0.0000001729062414985 ] +[ 4, 2, -0.2271346500000000000, -0.2271346500299392039 ] +[ 4, 3, 1809619.8171461710000000000, 1809619.8171461716937354988 ] +[ 4, 5, 475.6628104630000000000, 475.6628104630580268606 ] +[ 4, 6, 83.0599613840000000000, 83.0599613843612949961 ] +[ 4, 7, -0.0939371760000000000, -0.0939371760414513164 ] +[ 4, 8, 104.1580829830000000000, 104.1580829836674189714 ] +[ 4, 9, -0.3128945610000000000, -0.3128945611240376941 ] +[ 5, 2, -0.0004775110000000000, -0.0004775118950519245 ] +[ 5, 3, 3804.4172832940000000000, 3804.4172832946635730858 ] +[ 5, 4, 0.0021023290000000000, 0.0021023295872689719 ] +[ 5, 6, 0.1746194140000000000, 0.1746194143357610269 ] +[ 5, 7, -0.0001974860000000000, -0.0001974869045364371 ] +[ 5, 8, 0.2189746190000000000, 0.2189746196097808523 ] +[ 5, 9, -0.0006578070000000000, -0.0006578074935466043 ] +[ 6, 2, -0.0027345860000000000, -0.0027345865112899582 ] +[ 6, 3, 21786.9089629370000000000, 21786.9089629373549883991 ] +[ 6, 4, 0.0120394950000000000, 0.0120394951229568247 ] +[ 6, 5, 5.7267400860000000000, 5.7267400867419235968 ] +[ 6, 7, -0.0011309560000000000, -0.0011309561728153898 ] +[ 6, 8, 1.2540107320000000000, 1.2540107320983961218 ] +[ 6, 9, -0.0037670920000000000, -0.0037670925426525679 ] +[ 7, 2, 2.4179420710000000000, 2.4179420715150338570 ] +[ 7, 3, -19264149.6519721570000000000, -19264149.6519721577726218097 ] +[ 7, 4, -10.6454126270000000000, -10.6454126272513624769 ] +[ 7, 5, -5063.6268888170000000000, -5063.6268888173094183657 ] +[ 7, 6, -884.2075617400000000000, -884.2075617400902877029 ] +[ 7, 8, -1108.8057718240000000000, -1108.8057718246284104112 ] +[ 7, 9, 3.3308917110000000000, 3.3308917119881041338 ] +[ 8, 2, -0.0021806720000000000, -0.0021806723350078862 ] +[ 8, 3, 17373.7819025520000000000, 17373.7819025522041763341 ] +[ 8, 4, 0.0096007910000000000, 0.0096007911374175896 ] +[ 8, 5, 4.5667392950000000000, 4.5667392950928701946 ] +[ 8, 6, 0.7974413410000000000, 0.7974413411332231442 ] +[ 8, 7, -0.0009018710000000000, -0.0009018712072128017 ] +[ 8, 9, -0.0030040350000000000, -0.0030040353293858274 ] +[ 9, 2, 0.7259143430000000000, 0.7259143438415296153 ] +[ 9, 3, -5783481.2169483570000000000, -5783481.2169483573085846868 ] +[ 9, 4, -3.1959647880000000000, -3.1959647889295841648 ] +[ 9, 5, -1520.2015936430000000000, -1520.2015936432200450581 ] +[ 9, 6, -265.4567119540000000000, -265.4567119542696575128 ] +[ 9, 7, 0.3002199060000000000, 0.3002199069999581469 ] +[ 9, 8, -332.8855656980000000000, -332.8855656982067547175 ] #DELETE FROM num_result; [ 80 ] #INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) @@ -1171,7 +1259,7 @@ Ready. % sys.ceil_floor_round, sys.L3 # table_name % a, L3 # name % decimal, decimal # type -% 20, 10 # length +% 20, 20 # length [ -5.500, -6.000 ] [ -5.500, -6.000 ] [ 9.500, 10.000 ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list