Skip to content

Commit d69d7a2

Browse files
authored
Various Decimal Type Fixes (#2326)
1 parent c9890ce commit d69d7a2

16 files changed

+1292
-548
lines changed

enginetest/queries/procedure_queries.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,13 @@ var ProcedureLogicTests = []ScriptTest{
7575
{
7676
Query: "CALL testabc(2, 3)",
7777
Expected: []sql.Row{
78-
{
79-
"6",
80-
},
78+
{6.0},
8179
},
8280
},
8381
{
8482
Query: "CALL testabc(9, 9.5)",
8583
Expected: []sql.Row{
86-
{
87-
"85.5",
88-
},
84+
{85.5},
8985
},
9086
},
9187
},

enginetest/queries/queries.go

Lines changed: 211 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,8 @@ var QueryTests = []QueryTest{
782782
{
783783
Query: "select 1 as x from xy having AVG(x) > 0",
784784
Expected: []sql.Row{{1}},
785-
}, {
785+
},
786+
{
786787
Query: "select 1 as x, AVG(x) from xy group by (y) having AVG(x) > 0",
787788
Expected: []sql.Row{{1, float64(1)}, {1, float64(2)}, {1, float64(3)}},
788789
},
@@ -2550,6 +2551,10 @@ Select * from (
25502551
Query: "SELECT i + 1 FROM mytable;",
25512552
Expected: []sql.Row{{int64(2)}, {int64(3)}, {int64(4)}},
25522553
},
2554+
{
2555+
Query: `select (1 / 3) * (1 / 3);`,
2556+
Expected: []sql.Row{{"0.11111111"}},
2557+
},
25532558
{
25542559
Query: "SELECT i div 2 FROM mytable order by 1;",
25552560
Expected: []sql.Row{{int64(0)}, {int64(1)}, {int64(1)}},
@@ -2734,6 +2739,34 @@ Select * from (
27342739
Query: "SELECT 'HOMER' IN (1.0)",
27352740
Expected: []sql.Row{{false}},
27362741
},
2742+
{
2743+
Query: "select 1 / 3 * 3 in (0.999999999);",
2744+
Expected: []sql.Row{{true}},
2745+
},
2746+
{
2747+
Query: "SELECT 99 NOT IN ( 98 + 97 / 99 );",
2748+
Expected: []sql.Row{{true}},
2749+
},
2750+
{
2751+
Query: "SELECT 1 NOT IN ( 97 / 99 );",
2752+
Expected: []sql.Row{{true}},
2753+
},
2754+
{
2755+
Query: `SELECT 1 NOT IN (1 / 9 * 5);`,
2756+
Expected: []sql.Row{{true}},
2757+
},
2758+
{
2759+
Query: `SELECT 1 / 9 * 5 NOT IN (1);`,
2760+
Expected: []sql.Row{{true}},
2761+
},
2762+
{
2763+
Query: `SELECT 1 / 9 * 5 IN (1 / 9 * 5);`,
2764+
Expected: []sql.Row{{true}},
2765+
},
2766+
{
2767+
Query: "select 0 in (1/100000);",
2768+
Expected: []sql.Row{{false}},
2769+
},
27372770
{
27382771
Query: `SELECT * FROM mytable WHERE i in (CAST(NULL AS SIGNED), 2, 3, 4)`,
27392772
Expected: []sql.Row{{3, "third row"}, {2, "second row"}},
@@ -4103,6 +4136,177 @@ Select * from (
41034136
Query: "select 1/2/3%4/5/6;",
41044137
Expected: []sql.Row{{"0.0055555555555556"}},
41054138
},
4139+
4140+
// check that internal precision is preserved in comparisons
4141+
{
4142+
// 0 scale + 0 scale = 9 scale
4143+
Query: "select 1 / 3 = 0.333333333;",
4144+
Expected: []sql.Row{{true}},
4145+
},
4146+
{
4147+
// 0 scale + 1 scale = 9 scale
4148+
Query: "select 1 / 3.0 = 0.333333333;",
4149+
Expected: []sql.Row{{true}},
4150+
},
4151+
{
4152+
// 0 scale + 6 scale = 18 scale
4153+
Query: "select 1 / 3.000000 = 0.333333333333333333;",
4154+
Expected: []sql.Row{{true}},
4155+
},
4156+
{
4157+
// 0 scale + 15 scale = 27 scale
4158+
Query: "select 1 / 3.000000000000000 = 0.333333333333333333333333333;",
4159+
Expected: []sql.Row{{true}},
4160+
},
4161+
{
4162+
// 0 scale + 24 scale = 36 scale
4163+
Query: "select 1 / 3.000000000000000000000000 = 0.333333333333333333333333333333333333;",
4164+
Expected: []sql.Row{{true}},
4165+
},
4166+
4167+
{
4168+
// 1 scale + 0 scale = 9 scale
4169+
Query: "select 1.0 / 3 = 0.333333333;",
4170+
Expected: []sql.Row{{true}},
4171+
},
4172+
{
4173+
// 1 scale + 1 scale = 18 scale
4174+
Query: "select 1.0 / 3.0 = 0.333333333333333333;",
4175+
Expected: []sql.Row{{true}},
4176+
},
4177+
{
4178+
// 1 scale + 10 scale = 27 scale
4179+
Query: "select 1.0 / 3.0000000000 = 0.333333333333333333333333333;",
4180+
Expected: []sql.Row{{true}},
4181+
},
4182+
{
4183+
// 1 scale + 19 scale = 36 scale
4184+
Query: "select 1.0 / 3.0000000000000000000 = 0.333333333333333333333333333333333333;",
4185+
Expected: []sql.Row{{true}},
4186+
},
4187+
4188+
{
4189+
// 6 scale + 8 scale = 18 scale
4190+
Query: "select 1.000000 / 3.00000000 = 0.333333333333333333;",
4191+
Expected: []sql.Row{{true}},
4192+
},
4193+
{
4194+
// 6 scale + 9 scale = 27 scale
4195+
Query: "select 1.000000 / 3.000000000 = 0.333333333333333333333333333;",
4196+
Expected: []sql.Row{{true}},
4197+
},
4198+
{
4199+
// 6 scale + 17 scale = 27 scale
4200+
Query: "select 1.000000 / 3.00000000000000000 = 0.333333333333333333333333333;",
4201+
Expected: []sql.Row{{true}},
4202+
},
4203+
{
4204+
// 6 scale + 18 scale = 36 scale
4205+
Query: "select 1.000000 / 3.000000000000000000 = 0.333333333333333333333333333333333333;",
4206+
Expected: []sql.Row{{true}},
4207+
},
4208+
4209+
{
4210+
// 7 scale + 7 scale = 18 scale
4211+
Query: "select 1.0000000 / 3.0000000 = 0.333333333333333333;",
4212+
Expected: []sql.Row{{true}},
4213+
},
4214+
{
4215+
// 7 scale + 8 scale = 27 scale
4216+
Query: "select 1.0000000 / 3.00000000 = 0.333333333333333333333333333;",
4217+
Expected: []sql.Row{{true}},
4218+
},
4219+
{
4220+
// 7 scale + 16 scale = 27 scale
4221+
Query: "select 1.0000000 / 3.0000000000000000 = 0.333333333333333333333333333;",
4222+
Expected: []sql.Row{{true}},
4223+
},
4224+
{
4225+
// 7 scale + 15 scale = 36 scale
4226+
Query: "select 1.0000000 / 3.00000000000000000 = 0.333333333333333333333333333333333333;",
4227+
Expected: []sql.Row{{true}},
4228+
},
4229+
4230+
{
4231+
// 8 scale + 6 scale = 18 scale
4232+
Query: "select 1.00000000 / 3.000000 = 0.333333333333333333;",
4233+
Expected: []sql.Row{{true}},
4234+
},
4235+
{
4236+
// 8 scale + 7 scale = 27 scale
4237+
Query: "select 1.00000000 / 3.0000000 = 0.333333333333333333333333333;",
4238+
Expected: []sql.Row{{true}},
4239+
},
4240+
{
4241+
// 8 scale + 15 scale = 27 scale
4242+
Query: "select 1.00000000 / 3.000000000000000 = 0.333333333333333333333333333;",
4243+
Expected: []sql.Row{{true}},
4244+
},
4245+
{
4246+
// 8 scale + 14 scale = 36 scale
4247+
Query: "select 1.00000000 / 3.0000000000000000 = 0.333333333333333333333333333333333333;",
4248+
Expected: []sql.Row{{true}},
4249+
},
4250+
4251+
{
4252+
// 9 scale + 5 scale = 18 scale
4253+
Query: "select 1.000000000 / 3.00000 = 0.333333333333333333;",
4254+
Expected: []sql.Row{{true}},
4255+
},
4256+
{
4257+
// 9 scale + 6 scale = 27 scale
4258+
Query: "select 1.000000000 / 3.000000 = 0.333333333333333333333333333;",
4259+
Expected: []sql.Row{{true}},
4260+
},
4261+
{
4262+
// 9 scale + 14 scale = 27 scale
4263+
Query: "select 1.000000000 / 3.00000000000000 = 0.333333333333333333333333333;",
4264+
Expected: []sql.Row{{true}},
4265+
},
4266+
{
4267+
// 9 scale + 13 scale = 36 scale
4268+
Query: "select 1.000000000 / 3.000000000000000 = 0.333333333333333333333333333333333333;",
4269+
Expected: []sql.Row{{true}},
4270+
},
4271+
4272+
{
4273+
// 10 scale + 1 scale = 27 scale
4274+
Query: "select 1.0000000000 / 3.0 = 0.333333333333333333333333333;",
4275+
Expected: []sql.Row{{true}},
4276+
},
4277+
{
4278+
// 10 scale + 10 scale = 36 scale
4279+
Query: "select 1.0000000000 / 3.0000000000 = 0.333333333333333333333333333333333333;",
4280+
Expected: []sql.Row{{true}},
4281+
},
4282+
4283+
// check that decimal internal precision is preserved in casts
4284+
{
4285+
// 0 scale + 0 scale = 9 scale
4286+
Query: "select cast(1 / 3 as decimal(65,30));",
4287+
Expected: []sql.Row{{"0.333333333000000000000000000000"}},
4288+
},
4289+
{
4290+
// 0 scale + 1 scale = 9 scale
4291+
Query: "select cast(1 / 3.0 as decimal(65,30));",
4292+
Expected: []sql.Row{{"0.333333333000000000000000000000"}},
4293+
},
4294+
{
4295+
// 0 scale + 6 scale = 18 scale
4296+
Query: "select cast(1 / 3.000000 as decimal(65,30));",
4297+
Expected: []sql.Row{{"0.333333333333333333000000000000"}},
4298+
},
4299+
{
4300+
// 0 scale + 15 scale = 27 scale
4301+
Query: "select cast(1 / 3.000000000000000 as decimal(65,30));",
4302+
Expected: []sql.Row{{"0.333333333333333333333333333000"}},
4303+
},
4304+
{
4305+
// 0 scale + 24 scale = 36 scale
4306+
Query: "select cast(1 / 3.000000000000000000000000 as decimal(65,30));",
4307+
Expected: []sql.Row{{"0.333333333333333333333333333333"}},
4308+
},
4309+
41064310
{
41074311
Query: "select 0.05 % 0.024;",
41084312
Expected: []sql.Row{{"0.002"}},
@@ -6228,6 +6432,7 @@ Select * from (
62286432
Expected: []sql.Row{{1}},
62296433
},
62306434
{
6435+
// TODO: Neither MySQL or MariaDB have a function called DATETIME; remove this function.
62316436
Query: `SELECT DATETIME(NOW()) - NOW()`,
62326437
Expected: []sql.Row{{int64(0)}},
62336438
},
@@ -9015,13 +9220,6 @@ var KeylessQueries = []QueryTest{
90159220

90169221
// BrokenQueries are queries that are known to be broken in the engine.
90179222
var BrokenQueries = []QueryTest{
9018-
// https://github.com/dolthub/dolt/issues/7207
9019-
{
9020-
Query: "select 0 in (1/100000);",
9021-
Expected: []sql.Row{
9022-
{false},
9023-
},
9024-
},
90259223
// union and aggregation typing are tricky
90269224
{
90279225
Query: "with recursive t (n) as (select sum('1') from dual union all select (2.00) from dual) select sum(n) from t;",
@@ -9126,6 +9324,11 @@ var BrokenQueries = []QueryTest{
91269324
Query: "SELECT STR_TO_DATE('2013 32 Tuesday', '%X %V %W')", // Tuesday of 32th week
91279325
Expected: []sql.Row{{"2013-08-13"}},
91289326
},
9327+
{
9328+
// TODO: need to properly handle datetime precision
9329+
Query: `SELECT STR_TO_DATE('01,5,2013 09:30:17','%d,%m,%Y %h:%i:%s %f') - (STR_TO_DATE('01,5,2013 09:30:17','%d,%m,%Y %h:%i:%s') - INTERVAL 1 SECOND)`,
9330+
Expected: []sql.Row{{int64(1)}},
9331+
},
91299332
{
91309333
// This panics
91319334
// The non-recursive part of the UNION ALL returns too many rows, causing index out of bounds errors

enginetest/queries/script_queries.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5401,6 +5401,35 @@ CREATE TABLE tab3 (
54015401
},
54025402
},
54035403
},
5404+
{
5405+
Name: "dividing has different rounding behavior",
5406+
SetUpScript: []string{
5407+
"CREATE TABLE tab0(col0 INTEGER, col1 INTEGER, col2 INTEGER);",
5408+
"INSERT INTO tab0 VALUES(97, 1, 99);",
5409+
},
5410+
Assertions: []ScriptTestAssertion{
5411+
{
5412+
Query: "SELECT col2 IN ( 98 + col0 / 99 ) from tab0;",
5413+
Expected: []sql.Row{
5414+
{false},
5415+
},
5416+
},
5417+
{
5418+
Query: "SELECT col2 IN ( 98 + 97 / 99 ) from tab0;",
5419+
Expected: []sql.Row{
5420+
{false},
5421+
},
5422+
},
5423+
{
5424+
Query: "SELECT * FROM tab0 WHERE col2 IN ( 98 + 97 / 99 );",
5425+
Expected: []sql.Row{},
5426+
},
5427+
{
5428+
Query: "SELECT ALL * FROM tab0 AS cor0 WHERE col2 IN ( 39 + + 89, col0 + + col1 + + ( - ( - col0 ) ) / col2, + ( col0 ) + - 99, + col1, + col2 * - + col2 * - 12 + col1 + - 66 );",
5429+
Expected: []sql.Row{},
5430+
},
5431+
},
5432+
},
54045433
}
54055434

54065435
var SpatialScriptTests = []ScriptTest{

0 commit comments

Comments
 (0)