mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 03:51:50 +01:00
Merge
This commit is contained in:
commit
f343afe02b
7 changed files with 114 additions and 30 deletions
|
@ -4335,7 +4335,7 @@ com_status(String *buffer __attribute__((unused)),
|
||||||
Don't remove "limit 1",
|
Don't remove "limit 1",
|
||||||
it is protection againts SQL_SELECT_LIMIT=0
|
it is protection againts SQL_SELECT_LIMIT=0
|
||||||
*/
|
*/
|
||||||
if (mysql_store_result_for_lazy(&result))
|
if (!mysql_store_result_for_lazy(&result))
|
||||||
{
|
{
|
||||||
MYSQL_ROW cur=mysql_fetch_row(result);
|
MYSQL_ROW cur=mysql_fetch_row(result);
|
||||||
if (cur)
|
if (cur)
|
||||||
|
@ -4379,7 +4379,7 @@ com_status(String *buffer __attribute__((unused)),
|
||||||
if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)
|
if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_store_result_for_lazy(&result))
|
if (!mysql_store_result_for_lazy(&result))
|
||||||
{
|
{
|
||||||
MYSQL_ROW cur=mysql_fetch_row(result);
|
MYSQL_ROW cur=mysql_fetch_row(result);
|
||||||
if (cur)
|
if (cur)
|
||||||
|
|
13
mysql-test/r/bug47671.result
Normal file
13
mysql-test/r/bug47671.result
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#
|
||||||
|
# Bug#47671 - wrong character-set after upgrade from 5.1.34 to 5.1.39
|
||||||
|
#
|
||||||
|
# Extract only charset information from 'status' command output using regex
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Server characterset: utf8
|
||||||
|
Db characterset: utf8
|
||||||
|
Client characterset: utf8
|
||||||
|
Conn. characterset: utf8
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
|
@ -1604,6 +1604,39 @@ str_to_date('', '%Y-%m-%d')
|
||||||
0000-00-00
|
0000-00-00
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
#
|
#
|
||||||
|
# Bug#48459: valgrind errors with query using 'Range checked for each
|
||||||
|
# record'
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a INT,
|
||||||
|
b CHAR(2),
|
||||||
|
c INT,
|
||||||
|
d INT,
|
||||||
|
KEY ( c ),
|
||||||
|
KEY ( d, a, b ( 2 ) ),
|
||||||
|
KEY ( b ( 1 ) )
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES ( NULL, 'a', 1, 2 ), ( NULL, 'a', 1, 2 ),
|
||||||
|
( 1, 'a', 1, 2 ), ( 1, 'a', 1, 2 );
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a INT,
|
||||||
|
c INT,
|
||||||
|
e INT,
|
||||||
|
KEY ( e )
|
||||||
|
);
|
||||||
|
INSERT INTO t2 VALUES ( 1, 1, NULL ), ( 1, 1, NULL );
|
||||||
|
# Should not give Valgrind warnings
|
||||||
|
SELECT 1
|
||||||
|
FROM t1, t2
|
||||||
|
WHERE t1.d <> '1' AND t1.b > '1'
|
||||||
|
AND t1.a = t2.a AND t1.c = t2.c;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
# Bug #48665: sql-bench's insert test fails due to wrong result
|
# Bug #48665: sql-bench's insert test fails due to wrong result
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a));
|
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a));
|
||||||
|
|
1
mysql-test/t/bug47671-master.opt
Normal file
1
mysql-test/t/bug47671-master.opt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
--default-character-set=utf8 --skip-character-set-client-handshake
|
6
mysql-test/t/bug47671.test
Normal file
6
mysql-test/t/bug47671.test
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#47671 - wrong character-set after upgrade from 5.1.34 to 5.1.39
|
||||||
|
--echo #
|
||||||
|
--echo # Extract only charset information from 'status' command output using regex
|
||||||
|
--replace_regex /.*mysql.*// /Connection.*// /Current.*// /SSL.*// /Using.*// /Server version.*// /Protocol.*// /UNIX.*// /Uptime.*// /Threads.*//
|
||||||
|
--exec $MYSQL -u root test -e "status";
|
|
@ -1260,6 +1260,39 @@ SELECT str_to_date('', '%Y-%m-%d');
|
||||||
|
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#48459: valgrind errors with query using 'Range checked for each
|
||||||
|
--echo # record'
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a INT,
|
||||||
|
b CHAR(2),
|
||||||
|
c INT,
|
||||||
|
d INT,
|
||||||
|
KEY ( c ),
|
||||||
|
KEY ( d, a, b ( 2 ) ),
|
||||||
|
KEY ( b ( 1 ) )
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES ( NULL, 'a', 1, 2 ), ( NULL, 'a', 1, 2 ),
|
||||||
|
( 1, 'a', 1, 2 ), ( 1, 'a', 1, 2 );
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a INT,
|
||||||
|
c INT,
|
||||||
|
e INT,
|
||||||
|
KEY ( e )
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO t2 VALUES ( 1, 1, NULL ), ( 1, 1, NULL );
|
||||||
|
|
||||||
|
--echo # Should not give Valgrind warnings
|
||||||
|
SELECT 1
|
||||||
|
FROM t1, t2
|
||||||
|
WHERE t1.d <> '1' AND t1.b > '1'
|
||||||
|
AND t1.a = t2.a AND t1.c = t2.c;
|
||||||
|
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug #48665: sql-bench's insert test fails due to wrong result
|
--echo # Bug #48665: sql-bench's insert test fails due to wrong result
|
||||||
|
@ -1280,5 +1313,4 @@ SELECT * FROM t1 FORCE INDEX (PRIMARY)
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
|
@ -446,9 +446,9 @@ public:
|
||||||
range_key, *range_key_flag);
|
range_key, *range_key_flag);
|
||||||
*range_key_flag|= key_tree->min_flag;
|
*range_key_flag|= key_tree->min_flag;
|
||||||
if (key_tree->next_key_part &&
|
if (key_tree->next_key_part &&
|
||||||
|
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
|
||||||
key_tree->next_key_part->part == key_tree->part+1 &&
|
key_tree->next_key_part->part == key_tree->part+1 &&
|
||||||
!(*range_key_flag & (NO_MIN_RANGE | NEAR_MIN)) &&
|
!(*range_key_flag & (NO_MIN_RANGE | NEAR_MIN)))
|
||||||
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE)
|
|
||||||
res+= key_tree->next_key_part->store_min_key(key, range_key,
|
res+= key_tree->next_key_part->store_min_key(key, range_key,
|
||||||
range_key_flag);
|
range_key_flag);
|
||||||
return res;
|
return res;
|
||||||
|
@ -462,9 +462,9 @@ public:
|
||||||
range_key, *range_key_flag);
|
range_key, *range_key_flag);
|
||||||
(*range_key_flag)|= key_tree->max_flag;
|
(*range_key_flag)|= key_tree->max_flag;
|
||||||
if (key_tree->next_key_part &&
|
if (key_tree->next_key_part &&
|
||||||
|
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
|
||||||
key_tree->next_key_part->part == key_tree->part+1 &&
|
key_tree->next_key_part->part == key_tree->part+1 &&
|
||||||
!(*range_key_flag & (NO_MAX_RANGE | NEAR_MAX)) &&
|
!(*range_key_flag & (NO_MAX_RANGE | NEAR_MAX)))
|
||||||
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE)
|
|
||||||
res+= key_tree->next_key_part->store_max_key(key, range_key,
|
res+= key_tree->next_key_part->store_max_key(key, range_key,
|
||||||
range_key_flag);
|
range_key_flag);
|
||||||
return res;
|
return res;
|
||||||
|
@ -1700,6 +1700,7 @@ SEL_ARG *SEL_ARG::clone(RANGE_OPT_PARAM *param, SEL_ARG *new_parent,
|
||||||
tmp->prev= *next_arg; // Link into next/prev chain
|
tmp->prev= *next_arg; // Link into next/prev chain
|
||||||
(*next_arg)->next=tmp;
|
(*next_arg)->next=tmp;
|
||||||
(*next_arg)= tmp;
|
(*next_arg)= tmp;
|
||||||
|
tmp->part= this->part;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -7290,27 +7291,25 @@ int test_rb_tree(SEL_ARG *element,SEL_ARG *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
Count how many times SEL_ARG graph "root" refers to its part "key"
|
Count how many times SEL_ARG graph "root" refers to its part "key" via
|
||||||
|
transitive closure.
|
||||||
|
|
||||||
SYNOPSIS
|
@param root An RB-Root node in a SEL_ARG graph.
|
||||||
count_key_part_usage()
|
@param key Another RB-Root node in that SEL_ARG graph.
|
||||||
root An RB-Root node in a SEL_ARG graph.
|
|
||||||
key Another RB-Root node in that SEL_ARG graph.
|
|
||||||
|
|
||||||
DESCRIPTION
|
The passed "root" node may refer to "key" node via root->next_key_part,
|
||||||
The passed "root" node may refer to "key" node via root->next_key_part,
|
root->next->n
|
||||||
root->next->n
|
|
||||||
|
|
||||||
This function counts how many times the node "key" is referred (via
|
This function counts how many times the node "key" is referred (via
|
||||||
SEL_ARG::next_key_part) by
|
SEL_ARG::next_key_part) by
|
||||||
- intervals of RB-tree pointed by "root",
|
- intervals of RB-tree pointed by "root",
|
||||||
- intervals of RB-trees that are pointed by SEL_ARG::next_key_part from
|
- intervals of RB-trees that are pointed by SEL_ARG::next_key_part from
|
||||||
intervals of RB-tree pointed by "root",
|
intervals of RB-tree pointed by "root",
|
||||||
- and so on.
|
- and so on.
|
||||||
|
|
||||||
Here is an example (horizontal links represent next_key_part pointers,
|
Here is an example (horizontal links represent next_key_part pointers,
|
||||||
vertical links - next/prev prev pointers):
|
vertical links - next/prev prev pointers):
|
||||||
|
|
||||||
+----+ $
|
+----+ $
|
||||||
|root|-----------------+
|
|root|-----------------+
|
||||||
|
@ -7330,8 +7329,8 @@ int test_rb_tree(SEL_ARG *element,SEL_ARG *parent)
|
||||||
... +---+ $ |
|
... +---+ $ |
|
||||||
| |------------+
|
| |------------+
|
||||||
+---+ $
|
+---+ $
|
||||||
RETURN
|
@return
|
||||||
Number of links to "key" from nodes reachable from "root".
|
Number of links to "key" from nodes reachable from "root".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static ulong count_key_part_usage(SEL_ARG *root, SEL_ARG *key)
|
static ulong count_key_part_usage(SEL_ARG *root, SEL_ARG *key)
|
||||||
|
@ -7586,8 +7585,8 @@ check_quick_keys(PARAM *param, uint idx, SEL_ARG *key_tree,
|
||||||
param->first_null_comp= key_tree->part+1;
|
param->first_null_comp= key_tree->part+1;
|
||||||
|
|
||||||
if (key_tree->next_key_part &&
|
if (key_tree->next_key_part &&
|
||||||
key_tree->next_key_part->part == key_tree->part+1 &&
|
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
|
||||||
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE)
|
key_tree->next_key_part->part == key_tree->part+1)
|
||||||
{ // const key as prefix
|
{ // const key as prefix
|
||||||
if (min_key_length == max_key_length &&
|
if (min_key_length == max_key_length &&
|
||||||
!memcmp(min_key, max_key, (uint) (tmp_max_key - max_key)) &&
|
!memcmp(min_key, max_key, (uint) (tmp_max_key - max_key)) &&
|
||||||
|
@ -7868,8 +7867,8 @@ get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
|
||||||
&tmp_max_key,max_key_flag);
|
&tmp_max_key,max_key_flag);
|
||||||
|
|
||||||
if (key_tree->next_key_part &&
|
if (key_tree->next_key_part &&
|
||||||
key_tree->next_key_part->part == key_tree->part+1 &&
|
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
|
||||||
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE)
|
key_tree->next_key_part->part == key_tree->part+1)
|
||||||
{ // const key as prefix
|
{ // const key as prefix
|
||||||
if ((tmp_min_key - min_key) == (tmp_max_key - max_key) &&
|
if ((tmp_min_key - min_key) == (tmp_max_key - max_key) &&
|
||||||
memcmp(min_key, max_key, (uint)(tmp_max_key - max_key))==0 &&
|
memcmp(min_key, max_key, (uint)(tmp_max_key - max_key))==0 &&
|
||||||
|
|
Loading…
Add table
Reference in a new issue