mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge rurik.mysql.com:/home/igor/mysql-5.0
into rurik.mysql.com:/home/igor/dev/mysql-5.0-0
This commit is contained in:
@@ -45,6 +45,7 @@ int decimal_result_size(decimal *from1, decimal *from2, char op, int param);
|
|||||||
|
|
||||||
int decimal_add(decimal *from1, decimal *from2, decimal *to);
|
int decimal_add(decimal *from1, decimal *from2, decimal *to);
|
||||||
int decimal_sub(decimal *from1, decimal *from2, decimal *to);
|
int decimal_sub(decimal *from1, decimal *from2, decimal *to);
|
||||||
|
int decimal_cmp(decimal *from1, decimal *from2);
|
||||||
int decimal_mul(decimal *from1, decimal *from2, decimal *to);
|
int decimal_mul(decimal *from1, decimal *from2, decimal *to);
|
||||||
int decimal_div(decimal *from1, decimal *from2, decimal *to, int scale_incr);
|
int decimal_div(decimal *from1, decimal *from2, decimal *to, int scale_incr);
|
||||||
int decimal_mod(decimal *from1, decimal *from2, decimal *to);
|
int decimal_mod(decimal *from1, decimal *from2, decimal *to);
|
||||||
|
@@ -1897,3 +1897,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
drop table t3;
|
drop table t3;
|
||||||
|
create table t1 (
|
||||||
|
a varchar(30), b varchar(30), primary key(a), key(b)
|
||||||
|
) engine=innodb;
|
||||||
|
select distinct a from t1;
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
@@ -1630,3 +1630,37 @@ show status like "binlog_cache_disk_use";
|
|||||||
Variable_name Value
|
Variable_name Value
|
||||||
Binlog_cache_disk_use 1
|
Binlog_cache_disk_use 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (x bigint unsigned not null primary key) engine=innodb;
|
||||||
|
insert into t1(x) values (0xfffffffffffffff0),(0xfffffffffffffff1);
|
||||||
|
select * from t1;
|
||||||
|
x
|
||||||
|
18446744073709551600
|
||||||
|
18446744073709551601
|
||||||
|
select count(*) from t1 where x>0;
|
||||||
|
count(*)
|
||||||
|
2
|
||||||
|
select count(*) from t1 where x=0;
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
select count(*) from t1 where x<0;
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
select count(*) from t1 where x < -16;
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
select count(*) from t1 where x = -16;
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
explain select count(*) from t1 where x > -16;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL 1 Using where; Using index
|
||||||
|
select count(*) from t1 where x > -16;
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
select * from t1 where x > -16;
|
||||||
|
x
|
||||||
|
18446744073709551601
|
||||||
|
select count(*) from t1 where x = 18446744073709551601;
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
@@ -547,38 +547,3 @@ select count(*) from t2 where x = 18446744073709551601;
|
|||||||
count(*)
|
count(*)
|
||||||
0
|
0
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (x bigint unsigned not null primary key) engine=innodb;
|
|
||||||
insert into t1(x) values (0xfffffffffffffff0),(0xfffffffffffffff1);
|
|
||||||
select * from t1;
|
|
||||||
x
|
|
||||||
18446744073709551600
|
|
||||||
18446744073709551601
|
|
||||||
select count(*) from t1 where x>0;
|
|
||||||
count(*)
|
|
||||||
2
|
|
||||||
select count(*) from t1 where x=0;
|
|
||||||
count(*)
|
|
||||||
0
|
|
||||||
select count(*) from t1 where x<0;
|
|
||||||
count(*)
|
|
||||||
0
|
|
||||||
select count(*) from t1 where x < -16;
|
|
||||||
count(*)
|
|
||||||
0
|
|
||||||
select count(*) from t1 where x = -16;
|
|
||||||
count(*)
|
|
||||||
0
|
|
||||||
explain select count(*) from t1 where x > -16;
|
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
|
||||||
1 SIMPLE t1 index PRIMARY PRIMARY 8 NULL 2 Using where; Using index
|
|
||||||
select count(*) from t1 where x > -16;
|
|
||||||
count(*)
|
|
||||||
2
|
|
||||||
select * from t1 where x > -16;
|
|
||||||
x
|
|
||||||
18446744073709551600
|
|
||||||
18446744073709551601
|
|
||||||
select count(*) from t1 where x = 18446744073709551601;
|
|
||||||
count(*)
|
|
||||||
1
|
|
||||||
drop table t1;
|
|
||||||
|
@@ -805,7 +805,7 @@ col1 col2
|
|||||||
1.7e+308 1.7e+308
|
1.7e+308 1.7e+308
|
||||||
-2.2e-308 0
|
-2.2e-308 0
|
||||||
1.7e+308 1.7e+308
|
1.7e+308 1.7e+308
|
||||||
-0 NULL
|
0 NULL
|
||||||
2 NULL
|
2 NULL
|
||||||
NULL NULL
|
NULL NULL
|
||||||
1.79769313486232e+308 0
|
1.79769313486232e+308 0
|
||||||
|
@@ -577,3 +577,13 @@ explain select sum(ord(a1)) from t1 where (a1 > 'a') group by a1,a2,b;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
drop table t3;
|
drop table t3;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6142: a problem with the empty innodb table
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
a varchar(30), b varchar(30), primary key(a), key(b)
|
||||||
|
) engine=innodb;
|
||||||
|
select distinct a from t1;
|
||||||
|
drop table t1;
|
||||||
|
@@ -1155,5 +1155,27 @@ delete from t1;
|
|||||||
commit;
|
commit;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# range optimizer problem
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (x bigint unsigned not null primary key) engine=innodb;
|
||||||
|
insert into t1(x) values (0xfffffffffffffff0),(0xfffffffffffffff1);
|
||||||
|
select * from t1;
|
||||||
|
select count(*) from t1 where x>0;
|
||||||
|
select count(*) from t1 where x=0;
|
||||||
|
select count(*) from t1 where x<0;
|
||||||
|
select count(*) from t1 where x < -16;
|
||||||
|
select count(*) from t1 where x = -16;
|
||||||
|
explain select count(*) from t1 where x > -16;
|
||||||
|
|
||||||
|
# The following result should be (2). To be fixed when we add 'unsigned flag' to
|
||||||
|
# Field::store(longlong)
|
||||||
|
select count(*) from t1 where x > -16;
|
||||||
|
select * from t1 where x > -16;
|
||||||
|
select count(*) from t1 where x = 18446744073709551601;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
@@ -418,23 +418,4 @@ select count(*) from t2 where x > -16;
|
|||||||
select count(*) from t2 where x = 18446744073709551601;
|
select count(*) from t2 where x = 18446744073709551601;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
--disable_warnings
|
|
||||||
create table t1 (x bigint unsigned not null primary key) engine=innodb;
|
|
||||||
--enable_warnings
|
|
||||||
insert into t1(x) values (0xfffffffffffffff0),(0xfffffffffffffff1);
|
|
||||||
select * from t1;
|
|
||||||
select count(*) from t1 where x>0;
|
|
||||||
select count(*) from t1 where x=0;
|
|
||||||
select count(*) from t1 where x<0;
|
|
||||||
select count(*) from t1 where x < -16;
|
|
||||||
select count(*) from t1 where x = -16;
|
|
||||||
explain select count(*) from t1 where x > -16;
|
|
||||||
|
|
||||||
# The following result should be (2). To be fixed when we add 'unsigned flag' to
|
|
||||||
# Field::store(longlong)
|
|
||||||
select count(*) from t1 where x > -16;
|
|
||||||
select * from t1 where x > -16;
|
|
||||||
select count(*) from t1 where x = 18446744073709551601;
|
|
||||||
|
|
||||||
drop table t1;
|
|
||||||
|
|
||||||
|
@@ -556,6 +556,8 @@ INSERT IGNORE INTO t1 (col1) values (1/0);
|
|||||||
--error 1367
|
--error 1367
|
||||||
INSERT IGNORE INTO t1 VALUES (+1.9E+309,-1.9E+309);
|
INSERT IGNORE INTO t1 VALUES (+1.9E+309,-1.9E+309);
|
||||||
INSERT IGNORE INTO t1 VALUES ('+2.0E+309','-2.0E+309');
|
INSERT IGNORE INTO t1 VALUES ('+2.0E+309','-2.0E+309');
|
||||||
|
# stupid...
|
||||||
|
--replace_result -0 0
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
@@ -7134,17 +7134,14 @@ get_constant_key_infix(KEY *index_info, SEL_ARG *index_range_tree,
|
|||||||
static inline uint
|
static inline uint
|
||||||
get_field_keypart(KEY *index, Field *field)
|
get_field_keypart(KEY *index, Field *field)
|
||||||
{
|
{
|
||||||
KEY_PART_INFO *part= index->key_part;
|
KEY_PART_INFO *part, *end;
|
||||||
uint key_part_num= 0;
|
|
||||||
|
|
||||||
while (part != part + index->key_parts)
|
for (part= index->key_part, end= part + index->key_parts; part < end; part++)
|
||||||
{
|
{
|
||||||
key_part_num++;
|
|
||||||
if (field->eq(part->field))
|
if (field->eq(part->field))
|
||||||
return key_part_num;
|
return part - index->key_part + 1;
|
||||||
part++;
|
|
||||||
}
|
}
|
||||||
return key_part_num;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -983,7 +983,8 @@ static int do_add(decimal *from1, decimal *from2, decimal *to)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* to=from1-from2 */
|
/* to=from1-from2.
|
||||||
|
if to==0, return -1/0/+1 - the result of the comparison */
|
||||||
static int do_sub(decimal *from1, decimal *from2, decimal *to)
|
static int do_sub(decimal *from1, decimal *from2, decimal *to)
|
||||||
{
|
{
|
||||||
int intg1=ROUND_UP(from1->intg), intg2=ROUND_UP(from2->intg),
|
int intg1=ROUND_UP(from1->intg), intg2=ROUND_UP(from2->intg),
|
||||||
@@ -991,8 +992,6 @@ static int do_sub(decimal *from1, decimal *from2, decimal *to)
|
|||||||
int frac0=max(frac1, frac2), error;
|
int frac0=max(frac1, frac2), error;
|
||||||
dec1 *buf1, *buf2, *buf0, *stop1, *stop2, *start1, *start2, carry=0;
|
dec1 *buf1, *buf2, *buf0, *stop1, *stop2, *start1, *start2, carry=0;
|
||||||
|
|
||||||
to->sign=from1->sign;
|
|
||||||
|
|
||||||
/* let carry:=1 if from2 > from1 */
|
/* let carry:=1 if from2 > from1 */
|
||||||
start1=buf1=from1->buf; stop1=buf1+intg1;
|
start1=buf1=from1->buf; stop1=buf1+intg1;
|
||||||
start2=buf2=from2->buf; stop2=buf2+intg2;
|
start2=buf2=from2->buf; stop2=buf2+intg2;
|
||||||
@@ -1026,10 +1025,18 @@ static int do_sub(decimal *from1, decimal *from2, decimal *to)
|
|||||||
carry=1;
|
carry=1;
|
||||||
else /* short-circuit everything: from1 == from2 */
|
else /* short-circuit everything: from1 == from2 */
|
||||||
{
|
{
|
||||||
|
if (to == 0) /* decimal_cmp() */
|
||||||
|
return 0;
|
||||||
MAKE_ZERO(to);
|
MAKE_ZERO(to);
|
||||||
return E_DEC_OK;
|
return E_DEC_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (to == 0) /* decimal_cmp() */
|
||||||
|
return carry == from1->sign ? 1 : -1;
|
||||||
|
|
||||||
|
to->sign=from1->sign;
|
||||||
|
|
||||||
/* ensure that always from1 > from2 (and intg1 >= intg2) */
|
/* ensure that always from1 > from2 (and intg1 >= intg2) */
|
||||||
if (carry)
|
if (carry)
|
||||||
{
|
{
|
||||||
@@ -1109,6 +1116,13 @@ int decimal_sub(decimal *from1, decimal *from2, decimal *to)
|
|||||||
return do_add(from1, from2, to);
|
return do_add(from1, from2, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int decimal_cmp(decimal *from1, decimal *from2)
|
||||||
|
{
|
||||||
|
if (likely(from1->sign == from2->sign))
|
||||||
|
return do_sub(from1, from2, 0);
|
||||||
|
return from1->sign > from2->sign ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
multiply two decimals
|
multiply two decimals
|
||||||
|
|
||||||
@@ -1685,6 +1699,17 @@ void test_ds(char *s1, char *s2)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_dc(char *s1, char *s2)
|
||||||
|
{
|
||||||
|
char s[100];
|
||||||
|
int res;
|
||||||
|
sprintf(s, "'%s' <=> '%s'", s1, s2);
|
||||||
|
string2decimal(s1, &a, 0);
|
||||||
|
string2decimal(s2, &b, 0);
|
||||||
|
res=decimal_cmp(&a, &b);
|
||||||
|
printf("%-40s => res=%d\n", s, res);
|
||||||
|
}
|
||||||
|
|
||||||
void test_dm(char *s1, char *s2)
|
void test_dm(char *s1, char *s2)
|
||||||
{
|
{
|
||||||
char s[100];
|
char s[100];
|
||||||
@@ -1899,6 +1924,15 @@ main()
|
|||||||
test_d2b2d("-.000000012345000098765", 30, 20);
|
test_d2b2d("-.000000012345000098765", 30, 20);
|
||||||
test_d2b2d("1234500009876.5", 30, 5);
|
test_d2b2d("1234500009876.5", 30, 5);
|
||||||
|
|
||||||
|
printf("==== decimal_cmp ====\n");
|
||||||
|
test_dc("12","13");
|
||||||
|
test_dc("13","12");
|
||||||
|
test_dc("-10","10");
|
||||||
|
test_dc("10","-10");
|
||||||
|
test_dc("-12","-13");
|
||||||
|
test_dc("0","12");
|
||||||
|
test_dc("-10","0");
|
||||||
|
test_dc("4","4");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user