Commit 2266c99b authored by guilhem@mysql.com's avatar guilhem@mysql.com

Merge gbichot@213.136.52.20:/home/bk/mysql-4.1

into mysql.com:/home/mysql_src/mysql-4.1
parents dcab920a 8d05911d
...@@ -19,3 +19,34 @@ SELECT * FROM t1; ...@@ -19,3 +19,34 @@ SELECT * FROM t1;
c1 c2 c3 c1 c2 c3
aaaabbbbcccc aaaabbbbcccc aaaabbbbcccc aaaabbbbcccc aaaabbbbcccc aaaabbbbcccc
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a CHAR(4) CHARACTER SET utf8, KEY key_a(a(3)));
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(4) character set utf8 default NULL,
KEY `key_a` (`a`(3))
) TYPE=MyISAM CHARSET=latin1
SHOW KEYS FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 key_a 1 a A NULL 9 NULL YES BTREE
ALTER TABLE t1 CHANGE a a CHAR(4);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(4) default NULL,
KEY `key_a` (`a`(3))
) TYPE=MyISAM CHARSET=latin1
SHOW KEYS FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 key_a 1 a A NULL 3 NULL YES BTREE
ALTER TABLE t1 CHANGE a a CHAR(4) CHARACTER SET utf8;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(4) character set utf8 default NULL,
KEY `key_a` (`a`(3))
) TYPE=MyISAM CHARSET=latin1
SHOW KEYS FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 key_a 1 a A NULL 9 NULL YES BTREE
DROP TABLE t1;
...@@ -10,7 +10,7 @@ a ...@@ -10,7 +10,7 @@ a
3 3
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 1 Qcache_queries_in_cache 0
drop table t1; drop table t1;
commit; commit;
set autocommit=1; set autocommit=1;
...@@ -24,7 +24,7 @@ a ...@@ -24,7 +24,7 @@ a
3 3
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 1 Qcache_queries_in_cache 0
drop table t1; drop table t1;
commit; commit;
create table t1 (a int not null) type=innodb; create table t1 (a int not null) type=innodb;
...@@ -90,14 +90,14 @@ a ...@@ -90,14 +90,14 @@ a
2 2
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 3 Qcache_queries_in_cache 1
show status like "Qcache_hits"; show status like "Qcache_hits";
Variable_name Value Variable_name Value
Qcache_hits 4 Qcache_hits 4
commit; commit;
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 3 Qcache_queries_in_cache 1
drop table if exists t1; drop table if exists t1;
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB; CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
select count(*) from t1; select count(*) from t1;
......
...@@ -6,3 +6,14 @@ SHOW CREATE TABLE t1; ...@@ -6,3 +6,14 @@ SHOW CREATE TABLE t1;
INSERT INTO t1 VALUES ('aaaabbbbccccdddd','aaaabbbbccccdddd','aaaabbbbccccdddd'); INSERT INTO t1 VALUES ('aaaabbbbccccdddd','aaaabbbbccccdddd','aaaabbbbccccdddd');
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a CHAR(4) CHARACTER SET utf8, KEY key_a(a(3)));
SHOW CREATE TABLE t1;
SHOW KEYS FROM t1;
ALTER TABLE t1 CHANGE a a CHAR(4);
SHOW CREATE TABLE t1;
SHOW KEYS FROM t1;
ALTER TABLE t1 CHANGE a a CHAR(4) CHARACTER SET utf8;
SHOW CREATE TABLE t1;
SHOW KEYS FROM t1;
DROP TABLE t1;
...@@ -769,9 +769,18 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) ...@@ -769,9 +769,18 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
STRUCT_LOCK(&structure_guard_mutex); STRUCT_LOCK(&structure_guard_mutex);
if (query_cache_size == 0) if (query_cache_size == 0)
{
STRUCT_UNLOCK(&structure_guard_mutex);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
}
DUMP(this); DUMP(this);
if (ask_handler_allowance(thd, tables_used))
{
STRUCT_UNLOCK(&structure_guard_mutex);
DBUG_VOID_RETURN;
}
/* Key is query + database + flag */ /* Key is query + database + flag */
if (thd->db_length) if (thd->db_length)
{ {
...@@ -2548,6 +2557,39 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, ...@@ -2548,6 +2557,39 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len,
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/*
Check handler allowence to cache query with this tables
SYNOPSYS
Query_cache::ask_handler_allowance()
thd - thread handlers
tables_used - tables list used in query
RETURN
0 - caching allowed
1 - caching disallowed
*/
my_bool Query_cache::ask_handler_allowance(THD *thd,
TABLE_LIST *tables_used)
{
DBUG_ENTER("Query_cache::is_cacheable");
for (; tables_used; tables_used= tables_used->next)
{
TABLE *table= tables_used->table;
if (!handler::caching_allowed(thd, table->table_cache_key,
table->key_length,
table->file->table_cache_type()))
{
DBUG_PRINT("qcache", ("Handler does not allow caching for %s.%s",
tables_used->db, tables_used->alias));
thd->lex.safe_to_cache_query= 0; // Don't try to cache this
DBUG_RETURN(1);
}
}
DBUG_RETURN(0);
}
/***************************************************************************** /*****************************************************************************
Packing Packing
......
...@@ -345,6 +345,8 @@ class Query_cache ...@@ -345,6 +345,8 @@ class Query_cache
TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query, TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query,
LEX *lex, TABLE_LIST *tables_used, LEX *lex, TABLE_LIST *tables_used,
uint8 *tables_type); uint8 *tables_type);
static my_bool ask_handler_allowance(THD *thd, TABLE_LIST *tables_used);
public: public:
Query_cache(ulong query_cache_limit = ULONG_MAX, Query_cache(ulong query_cache_limit = ULONG_MAX,
......
...@@ -1214,7 +1214,9 @@ store_create_info(THD *thd, TABLE *table, String *packet) ...@@ -1214,7 +1214,9 @@ store_create_info(THD *thd, TABLE *table, String *packet)
!(key_info->flags & HA_FULLTEXT))) !(key_info->flags & HA_FULLTEXT)))
{ {
buff[0] = '('; buff[0] = '(';
char* end=int10_to_str((long) key_part->length, buff + 1,10); char* end=int10_to_str((long) key_part->length /
key_part->field->charset()->mbmaxlen,
buff + 1,10);
*end++ = ')'; *end++ = ')';
packet->append(buff,(uint) (end-buff)); packet->append(buff,(uint) (end-buff));
} }
......
...@@ -729,6 +729,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, ...@@ -729,6 +729,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
*/ */
if (key->type == Key::FULLTEXT) if (key->type == Key::FULLTEXT)
column->length=test(f_is_blob(sql_field->pack_flag)); column->length=test(f_is_blob(sql_field->pack_flag));
else
column->length*= sql_field->charset->mbmaxlen;
if (f_is_blob(sql_field->pack_flag)) if (f_is_blob(sql_field->pack_flag))
{ {
if (!(file->table_flags() & HA_BLOB_KEY)) if (!(file->table_flags() & HA_BLOB_KEY))
...@@ -2099,10 +2102,11 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -2099,10 +2102,11 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
{ // Check if sub key { // Check if sub key
if (cfield->field->type() != FIELD_TYPE_BLOB && if (cfield->field->type() != FIELD_TYPE_BLOB &&
(cfield->field->pack_length() == key_part_length || (cfield->field->pack_length() == key_part_length ||
cfield->length != cfield->pack_length || cfield->length <= key_part_length /
cfield->pack_length <= key_part_length)) key_part->field->charset()->mbmaxlen))
key_part_length=0; // Use whole field key_part_length=0; // Use whole field
} }
key_part_length /= key_part->field->charset()->mbmaxlen;
key_parts.push_back(new key_part_spec(cfield->field_name, key_parts.push_back(new key_part_spec(cfield->field_name,
key_part_length)); key_part_length));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment