mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge 5.1-bugteam to 5.5-merge.
This commit is contained in:
@ -6228,8 +6228,10 @@ get_one_option(int optid, const struct my_option *opt, char *argument)
|
|||||||
print_version();
|
print_version();
|
||||||
exit(0);
|
exit(0);
|
||||||
case OPT_MYSQL_PROTOCOL:
|
case OPT_MYSQL_PROTOCOL:
|
||||||
|
#ifndef EMBEDDED_LIBRARY
|
||||||
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
|
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
|
||||||
opt->name);
|
opt->name);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
usage();
|
usage();
|
||||||
|
@ -2546,6 +2546,64 @@ LOCK TABLES t1 READ;
|
|||||||
ALTER TABLE t1 COMMENT 'test';
|
ALTER TABLE t1 COMMENT 'test';
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Bug#55656: mysqldump can be slower after bug #39653 fix
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT , b INT, c INT, d INT,
|
||||||
|
KEY (b), PRIMARY KEY (a,b)) ENGINE=INNODB;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3);
|
||||||
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
||||||
|
id 1
|
||||||
|
select_type SIMPLE
|
||||||
|
table t1
|
||||||
|
type index
|
||||||
|
possible_keys NULL
|
||||||
|
key b
|
||||||
|
key_len 4
|
||||||
|
ref NULL
|
||||||
|
rows 3
|
||||||
|
Extra Using index
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b);
|
||||||
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
||||||
|
id 1
|
||||||
|
select_type SIMPLE
|
||||||
|
table t1
|
||||||
|
type index
|
||||||
|
possible_keys NULL
|
||||||
|
key b
|
||||||
|
key_len 8
|
||||||
|
ref NULL
|
||||||
|
rows 3
|
||||||
|
Extra Using index
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b,c);
|
||||||
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
||||||
|
id 1
|
||||||
|
select_type SIMPLE
|
||||||
|
table t1
|
||||||
|
type index
|
||||||
|
possible_keys NULL
|
||||||
|
key b
|
||||||
|
key_len 13
|
||||||
|
ref NULL
|
||||||
|
rows 3
|
||||||
|
Extra Using index
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b,c,d);
|
||||||
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
||||||
|
id 1
|
||||||
|
select_type SIMPLE
|
||||||
|
table t1
|
||||||
|
type index
|
||||||
|
possible_keys NULL
|
||||||
|
key PRIMARY
|
||||||
|
key_len 8
|
||||||
|
ref NULL
|
||||||
|
rows 3
|
||||||
|
Extra Using index
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
#
|
#
|
||||||
# Test for bug #39932 "create table fails if column for FK is in different
|
# Test for bug #39932 "create table fails if column for FK is in different
|
||||||
|
@ -746,6 +746,30 @@ UNLOCK TABLES;
|
|||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#55656: mysqldump can be slower after bug #39653 fix
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT , b INT, c INT, d INT,
|
||||||
|
KEY (b), PRIMARY KEY (a,b)) ENGINE=INNODB;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3);
|
||||||
|
--query_vertical EXPLAIN SELECT COUNT(*) FROM t1
|
||||||
|
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b);
|
||||||
|
--query_vertical EXPLAIN SELECT COUNT(*) FROM t1
|
||||||
|
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b,c);
|
||||||
|
--query_vertical EXPLAIN SELECT COUNT(*) FROM t1
|
||||||
|
|
||||||
|
DROP INDEX b ON t1;
|
||||||
|
CREATE INDEX b ON t1(a,b,c,d);
|
||||||
|
--query_vertical EXPLAIN SELECT COUNT(*) FROM t1
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -13243,6 +13243,34 @@ ok:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Find shortest key suitable for full table scan.
|
||||||
|
|
||||||
|
@param table Table to scan
|
||||||
|
@param usable_keys Allowed keys
|
||||||
|
|
||||||
|
@note
|
||||||
|
As far as
|
||||||
|
1) clustered primary key entry data set is a set of all record
|
||||||
|
fields (key fields and not key fields) and
|
||||||
|
2) secondary index entry data is a union of its key fields and
|
||||||
|
primary key fields (at least InnoDB and its derivatives don't
|
||||||
|
duplicate primary key fields there, even if the primary and
|
||||||
|
the secondary keys have a common subset of key fields),
|
||||||
|
then secondary index entry data is always a subset of primary key entry.
|
||||||
|
Unfortunately, key_info[nr].key_length doesn't show the length
|
||||||
|
of key/pointer pair but a sum of key field lengths only, thus
|
||||||
|
we can't estimate index IO volume comparing only this key_length
|
||||||
|
value of secondary keys and clustered PK.
|
||||||
|
So, try secondary keys first, and choose PK only if there are no
|
||||||
|
usable secondary covering keys or found best secondary key include
|
||||||
|
all table fields (i.e. same as PK):
|
||||||
|
|
||||||
|
@return
|
||||||
|
MAX_KEY no suitable key found
|
||||||
|
key index otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
uint find_shortest_key(TABLE *table, const key_map *usable_keys)
|
uint find_shortest_key(TABLE *table, const key_map *usable_keys)
|
||||||
{
|
{
|
||||||
uint best= MAX_KEY;
|
uint best= MAX_KEY;
|
||||||
@ -13255,23 +13283,6 @@ uint find_shortest_key(TABLE *table, const key_map *usable_keys)
|
|||||||
uint min_length= (uint) ~0;
|
uint min_length= (uint) ~0;
|
||||||
for (uint nr=0; nr < table->s->keys ; nr++)
|
for (uint nr=0; nr < table->s->keys ; nr++)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
As far as
|
|
||||||
1) clustered primary key entry data set is a set of all record
|
|
||||||
fields (key fields and not key fields) and
|
|
||||||
2) secondary index entry data is a union of its key fields and
|
|
||||||
primary key fields (at least InnoDB and its derivatives don't
|
|
||||||
duplicate primary key fields there, even if the primary and
|
|
||||||
the secondary keys have a common subset of key fields),
|
|
||||||
then secondary index entry data is always a subset of primary key
|
|
||||||
entry, and the PK is always longer.
|
|
||||||
Unfortunately, key_info[nr].key_length doesn't show the length
|
|
||||||
of key/pointer pair but a sum of key field lengths only, thus
|
|
||||||
we can't estimate index IO volume comparing only this key_length
|
|
||||||
value of seconday keys and clustered PK.
|
|
||||||
So, try secondary keys first, and choose PK only if there are no
|
|
||||||
usable secondary covering keys:
|
|
||||||
*/
|
|
||||||
if (nr == usable_clustered_pk)
|
if (nr == usable_clustered_pk)
|
||||||
continue;
|
continue;
|
||||||
if (usable_keys->is_set(nr))
|
if (usable_keys->is_set(nr))
|
||||||
@ -13284,7 +13295,20 @@ uint find_shortest_key(TABLE *table, const key_map *usable_keys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return best != MAX_KEY ? best : usable_clustered_pk;
|
if (usable_clustered_pk != MAX_KEY)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
If the primary key is clustered and found shorter key covers all table
|
||||||
|
fields then primary key scan normally would be faster because amount of
|
||||||
|
data to scan is the same but PK is clustered.
|
||||||
|
It's safe to compare key parts with table fields since duplicate key
|
||||||
|
parts aren't allowed.
|
||||||
|
*/
|
||||||
|
if (best == MAX_KEY ||
|
||||||
|
table->key_info[best].key_parts >= table->s->fields)
|
||||||
|
best= usable_clustered_pk;
|
||||||
|
}
|
||||||
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -7490,13 +7490,16 @@ int finalize_schema_table(st_plugin_int *plugin)
|
|||||||
ST_SCHEMA_TABLE *schema_table= (ST_SCHEMA_TABLE *)plugin->data;
|
ST_SCHEMA_TABLE *schema_table= (ST_SCHEMA_TABLE *)plugin->data;
|
||||||
DBUG_ENTER("finalize_schema_table");
|
DBUG_ENTER("finalize_schema_table");
|
||||||
|
|
||||||
if (schema_table && plugin->plugin->deinit)
|
if (schema_table)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
|
if (plugin->plugin->deinit)
|
||||||
if (plugin->plugin->deinit(NULL))
|
|
||||||
{
|
{
|
||||||
DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
|
DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
|
||||||
plugin->name.str));
|
if (plugin->plugin->deinit(NULL))
|
||||||
|
{
|
||||||
|
DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
|
||||||
|
plugin->name.str));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
my_free(schema_table);
|
my_free(schema_table);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user