Skip to content

Commit b94a482

Browse files
author
hf@deer.(none)
committed
Precision Math implementation
1 parent 6e6daf8 commit b94a482

File tree

104 files changed

+9118
-1717
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+9118
-1717
lines changed

.bzrignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,3 +1056,6 @@ include/mysqld_ername.h
10561056
include/mysqld_error.h
10571057
include/sql_state.h
10581058
support-files/ndb-config-2-node.ini
1059+
client/decimal.c
1060+
client/my_decimal.cc
1061+
client/my_decimal.h

client/Makefile.am

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ mysqltest_SOURCES= mysqltest.c $(top_srcdir)/mysys/my_getsystime.c
3434
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
3535
mysqlbinlog_SOURCES = mysqlbinlog.cc $(top_srcdir)/mysys/mf_tempdir.c
3636
mysqlmanagerc_SOURCES = mysqlmanagerc.c
37-
sql_src=log_event.h mysql_priv.h log_event.cc
37+
sql_src=log_event.h mysql_priv.h log_event.cc my_decimal.h my_decimal.cc
38+
strings_src=decimal.c
3839

3940
# Fix for mit-threads
4041
DEFS = -DUNDEF_THREADS_HACK
@@ -43,7 +44,11 @@ link_sources:
4344
for f in $(sql_src) ; do \
4445
rm -f $(srcdir)/$$f; \
4546
@LN_CP_F@ $(top_srcdir)/sql/$$f $(srcdir)/$$f; \
46-
done;
47+
done; \
48+
for f in $(strings_src) ; do \
49+
rm -f $(srcdir)/$$f; \
50+
@LN_CP_F@ $(top_srcdir)/strings/$$f $(srcdir)/$$f; \
51+
done;
4752

4853
# Don't update the files from bitkeeper
4954
%::SCCS/s.%

client/mysqlbinlog.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,8 +1280,14 @@ int main(int argc, char** argv)
12801280
*/
12811281

12821282
#ifdef __WIN__
1283+
#include "my_decimal.h"
1284+
#include "decimal.c"
1285+
#include "my_decimal.cpp"
12831286
#include "log_event.cpp"
12841287
#else
1288+
#include "my_decimal.h"
1289+
#include "decimal.c"
1290+
#include "my_decimal.cc"
12851291
#include "log_event.cc"
12861292
#endif
12871293

include/decimal.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ typedef struct st_decimal {
2626
decimal_digit *buf;
2727
} decimal;
2828

29-
int decimal2string(decimal *from, char *to, int *to_len);
29+
int decimal2string(decimal *from, char *to, int *to_len,
30+
int fixed_precision, int fixed_decimals,
31+
char filler);
3032
int string2decimal(char *from, decimal *to, char **end);
3133
int string2decimal_fixed(char *from, decimal *to, char **end);
3234
int decimal2ulonglong(decimal *from, ulonglong *to);
@@ -35,6 +37,7 @@ int decimal2longlong(decimal *from, longlong *to);
3537
int longlong2decimal(longlong from, decimal *to);
3638
int decimal2double(decimal *from, double *to);
3739
int double2decimal(double from, decimal *to);
40+
void decimal_optimize_fraction(decimal *from);
3841
int decimal2bin(decimal *from, char *to, int precision, int scale);
3942
int bin2decimal(char *from, decimal *to, int precision, int scale);
4043

@@ -50,6 +53,7 @@ int decimal_div(decimal *from1, decimal *from2, decimal *to, int scale_incr);
5053
int decimal_mod(decimal *from1, decimal *from2, decimal *to);
5154
int decimal_round(decimal *from, decimal *to, int new_scale, decimal_round_mode mode);
5255
int decimal_is_zero(decimal *from);
56+
void max_decimal(int precision, int frac, decimal *to);
5357

5458
/* set a decimal to zero */
5559

@@ -65,7 +69,8 @@ int decimal_is_zero(decimal *from);
6569
of the decimal (including decimal dot, possible sign and \0)
6670
*/
6771

68-
#define decimal_string_size(dec) ((dec)->intg + (dec)->frac + ((dec)->frac > 0) + 2)
72+
#define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \
73+
(dec)->frac + ((dec)->frac > 0) + 2)
6974

7075
/* negate a decimal */
7176
#define decimal_neg(dec) do { (dec)->sign^=1; } while(0)

include/mysql_com.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
211211
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
212212
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
213213
MYSQL_TYPE_BIT,
214+
MYSQL_TYPE_NEWDECIMAL=246,
214215
MYSQL_TYPE_ENUM=247,
215216
MYSQL_TYPE_SET=248,
216217
MYSQL_TYPE_TINY_BLOB=249,
@@ -226,6 +227,7 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
226227
/* For backward compatibility */
227228
#define CLIENT_MULTI_QUERIES CLIENT_MULTI_STATEMENTS
228229
#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL
230+
#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL
229231
#define FIELD_TYPE_TINY MYSQL_TYPE_TINY
230232
#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT
231233
#define FIELD_TYPE_LONG MYSQL_TYPE_LONG
@@ -341,7 +343,8 @@ struct rand_struct {
341343

342344
/* The following is for user defined functions */
343345

344-
enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT};
346+
enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT,
347+
DECIMAL_RESULT};
345348

346349
typedef struct st_udf_args
347350
{

libmysql/libmysql.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3186,6 +3186,8 @@ my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)
31863186
case MYSQL_TYPE_VARCHAR:
31873187
case MYSQL_TYPE_VAR_STRING:
31883188
case MYSQL_TYPE_STRING:
3189+
case MYSQL_TYPE_DECIMAL:
3190+
case MYSQL_TYPE_NEWDECIMAL:
31893191
param->store_param_func= store_param_str;
31903192
/*
31913193
For variable length types user must set either length or
@@ -3512,6 +3514,8 @@ static void fetch_string_with_conversion(MYSQL_BIND *param, char *value,
35123514
case MYSQL_TYPE_MEDIUM_BLOB:
35133515
case MYSQL_TYPE_LONG_BLOB:
35143516
case MYSQL_TYPE_BLOB:
3517+
case MYSQL_TYPE_DECIMAL:
3518+
case MYSQL_TYPE_NEWDECIMAL:
35153519
default:
35163520
{
35173521
/*
@@ -4249,6 +4253,8 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field)
42494253
break;
42504254
case MYSQL_TYPE_VAR_STRING:
42514255
case MYSQL_TYPE_STRING:
4256+
case MYSQL_TYPE_DECIMAL:
4257+
case MYSQL_TYPE_NEWDECIMAL:
42524258
DBUG_ASSERT(param->buffer_length != 0);
42534259
param->fetch_result= fetch_result_str;
42544260
break;
@@ -4308,6 +4314,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field)
43084314
field->max_length= MAX_DATE_STRING_REP_LENGTH;
43094315
break;
43104316
case MYSQL_TYPE_DECIMAL:
4317+
case MYSQL_TYPE_NEWDECIMAL:
43114318
case MYSQL_TYPE_ENUM:
43124319
case MYSQL_TYPE_SET:
43134320
case MYSQL_TYPE_GEOMETRY:

libmysqld/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
6262
unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \
6363
spatial.cc gstream.cc sql_help.cc tztime.cc protocol_cursor.cc \
6464
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
65-
parse_file.cc sql_view.cc sql_trigger.cc
65+
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc
6666

6767
libmysqld_int_a_SOURCES= $(libmysqld_sources) $(libmysqlsources) $(sqlsources) $(sqlexamplessources)
6868
libmysqld_a_SOURCES=

mysql-test/r/bigint.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ select 9223372036854775807,-009223372036854775808;
77
9223372036854775807 -9223372036854775808
88
select +9999999999999999999,-9999999999999999999;
99
9999999999999999999 -9999999999999999999
10-
9999999999999999999 -10000000000000000000
10+
9999999999999999999 -9999999999999999999
1111
select cast(9223372036854775808 as unsigned)+1;
1212
cast(9223372036854775808 as unsigned)+1
1313
9223372036854775809
@@ -16,7 +16,7 @@ select 9223372036854775808+1;
1616
9223372036854775809
1717
select -(0-3),round(-(0-3)), round(9999999999999999999);
1818
-(0-3) round(-(0-3)) round(9999999999999999999)
19-
3 3 10000000000000000000
19+
3 3 9999999999999999999
2020
create table t1 (a bigint unsigned not null, primary key(a));
2121
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612);
2222
select * from t1;

mysql-test/r/case.result

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ CASE WHEN 1 THEN 'a' ELSE 1.0 END AS c5,
9191
CASE WHEN 1 THEN 1.0 ELSE 'a' END AS c6,
9292
CASE WHEN 1 THEN 1 ELSE 1.0 END AS c7,
9393
CASE WHEN 1 THEN 1.0 ELSE 1 END AS c8,
94-
CASE WHEN 1 THEN 1.0 END AS c9
94+
CASE WHEN 1 THEN 1.0 END AS c9,
95+
CASE WHEN 1 THEN 0.1e1 else 0.1 END AS c10,
96+
CASE WHEN 1 THEN 0.1e1 else 1 END AS c11,
97+
CASE WHEN 1 THEN 0.1e1 else '1' END AS c12
9598
;
9699
SHOW CREATE TABLE t1;
97100
Table Create Table
@@ -100,11 +103,14 @@ t1 CREATE TABLE `t1` (
100103
`c2` varchar(1) character set latin1 collate latin1_danish_ci NOT NULL default '',
101104
`c3` varbinary(1) NOT NULL default '',
102105
`c4` varbinary(1) NOT NULL default '',
103-
`c5` varbinary(3) NOT NULL default '',
104-
`c6` varbinary(3) NOT NULL default '',
105-
`c7` double(3,1) NOT NULL default '0.0',
106-
`c8` double(3,1) NOT NULL default '0.0',
107-
`c9` double(3,1) default NULL
106+
`c5` varbinary(4) NOT NULL default '',
107+
`c6` varbinary(4) NOT NULL default '',
108+
`c7` decimal(5,1) NOT NULL default '0.0',
109+
`c8` decimal(5,1) NOT NULL default '0.0',
110+
`c9` decimal(5,1) default NULL,
111+
`c10` double NOT NULL default '0',
112+
`c11` double NOT NULL default '0',
113+
`c12` varbinary(5) NOT NULL default ''
108114
) ENGINE=MyISAM DEFAULT CHARSET=latin1
109115
DROP TABLE t1;
110116
SELECT CASE
@@ -146,11 +152,11 @@ SHOW CREATE TABLE t1;
146152
Table Create Table
147153
t1 CREATE TABLE `t1` (
148154
`COALESCE(1)` int(1) NOT NULL default '0',
149-
`COALESCE(1.0)` double(3,1) NOT NULL default '0.0',
155+
`COALESCE(1.0)` decimal(5,1) NOT NULL default '0.0',
150156
`COALESCE('a')` varchar(1) NOT NULL default '',
151-
`COALESCE(1,1.0)` double(3,1) NOT NULL default '0.0',
157+
`COALESCE(1,1.0)` decimal(5,1) NOT NULL default '0.0',
152158
`COALESCE(1,'1')` varbinary(1) NOT NULL default '',
153-
`COALESCE(1.1,'1')` varbinary(3) NOT NULL default '',
159+
`COALESCE(1.1,'1')` varbinary(4) NOT NULL default '',
154160
`COALESCE('a' COLLATE latin1_bin,'b')` varchar(1) character set latin1 collate latin1_bin NOT NULL default ''
155161
) ENGINE=MyISAM DEFAULT CHARSET=latin1
156162
DROP TABLE t1;

mysql-test/r/create.result

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ Field Type Null Key Default Extra
103103
a datetime NO 0000-00-00 00:00:00
104104
b time NO 00:00:00
105105
c date NO 0000-00-00
106-
d bigint(17) NO 0
107-
e double(18,1) NO 0.0
108-
f bigint(17) NO 0
106+
d int(2) NO 0
107+
e decimal(6,1) NO 0.0
108+
f bigint(18) NO 0
109109
drop table t2;
110110
create table t2 select CAST("2001-12-29" AS DATE) as d, CAST("20:45:11" AS TIME) as t, CAST("2001-12-29 20:45:11" AS DATETIME) as dt;
111111
describe t2;
@@ -418,7 +418,7 @@ d date YES NULL
418418
e varchar(1) NO
419419
f datetime YES NULL
420420
g time YES NULL
421-
h longblob NO
421+
h varbinary(23) NO
422422
dd time YES NULL
423423
select * from t2;
424424
a b c d e f g h dd
@@ -437,7 +437,7 @@ t2 CREATE TABLE `t2` (
437437
`ifnull(e,e)` bigint(20) default NULL,
438438
`ifnull(f,f)` float(3,2) default NULL,
439439
`ifnull(g,g)` double(4,3) default NULL,
440-
`ifnull(h,h)` decimal(5,4) default NULL,
440+
`ifnull(h,h)` decimal(6,4) default NULL,
441441
`ifnull(i,i)` year(4) default NULL,
442442
`ifnull(j,j)` date default NULL,
443443
`ifnull(k,k)` datetime NOT NULL default '0000-00-00 00:00:00',

0 commit comments

Comments
 (0)