Commit 57192cb6 authored by acurtis@xiphis.org's avatar acurtis@xiphis.org

Merge acurtis@bk-internal.mysql.com:/home/bk/mysql-5.0

into xiphis.org:/usr/home/antony/work2/p1-bug11028.4
parents 36a4f39b 3b8c3bd7
...@@ -3871,6 +3871,14 @@ int update_state_info(MI_CHECK *param, MI_INFO *info,uint update) ...@@ -3871,6 +3871,14 @@ int update_state_info(MI_CHECK *param, MI_INFO *info,uint update)
if (!share->state.create_time) if (!share->state.create_time)
share->state.create_time=share->state.check_time; share->state.create_time=share->state.check_time;
} }
/*
When tables are locked we haven't synched the share state and the
real state for a while so we better do it here before synching
the share state to disk. Only when table is write locked is it
necessary to perform this synch.
*/
if (info->lock_type == F_WRLCK)
share->state.state= *info->state;
if (mi_state_info_write(share->kfile,&share->state,1+2)) if (mi_state_info_write(share->kfile,&share->state,1+2))
goto err; goto err;
share->changed=0; share->changed=0;
......
create table t1 (a bigint);
lock tables t1 write;
insert into t1 values(0);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
unlock tables;
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
lock tables t1 write;
delete from t1;
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
unlock tables;
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
...@@ -596,3 +596,9 @@ ERROR 42000: Incorrect database name 'xyz' ...@@ -596,3 +596,9 @@ ERROR 42000: Incorrect database name 'xyz'
create table t1(t1.name int); create table t1(t1.name int);
create table t2(test.t2.name int); create table t2(test.t2.name int);
drop table t1,t2; drop table t1,t2;
create database mysqltest;
use mysqltest;
drop database mysqltest;
create table test.t1 like x;
ERROR 42000: Incorrect database name 'NULL'
drop table if exists test.t1;
...@@ -132,6 +132,22 @@ a b ...@@ -132,6 +132,22 @@ a b
handler t2 read last; handler t2 read last;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next;
a b
14 aaa
handler t1 read a next;
a b
15 bbb
handler t1 close;
handler t1 open;
handler t1 read a prev;
a b
22 iii
handler t1 read a prev;
a b
21 hhh
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
a b a b
......
...@@ -138,6 +138,8 @@ t1 CREATE TABLE `t1` ( ...@@ -138,6 +138,8 @@ t1 CREATE TABLE `t1` (
`min_num` decimal(7,6) default '0.000001' `min_num` decimal(7,6) default '0.000001'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1 ; drop table t1 ;
set @@SQL_MODE=NULL;
ERROR 42000: Variable 'sql_mode' can't be set to the value of 'NULL'
SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=''; SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE='';
show local variables like 'SQL_MODE'; show local variables like 'SQL_MODE';
Variable_name Value Variable_name Value
......
#
# Bug #10901 Analyze Table on new table destroys table
# This is minimal test case to get error
# The problem was that analyze table wrote the shared state to the file and this
# didn't include the inserts while locked. A check was needed to ensure that
# state information was not updated when executing analyze table for a locked table.
# The analyze table had to be within locks and check table had to be after unlocking
# since then it brings the wrong state from disk rather than from the currently
# correct internal state. The insert is needed since it changes the file state,
# number of records.
# The fix is to synchronise the state of the shared state and the current state before
# calling mi_state_info_write
#
create table t1 (a bigint);
lock tables t1 write;
insert into t1 values(0);
analyze table t1;
unlock tables;
check table t1;
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
lock tables t1 write;
delete from t1;
analyze table t1;
unlock tables;
check table t1;
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
analyze table t1;
check table t1;
drop table t1;
...@@ -503,3 +503,14 @@ create table t1(t1.name int); ...@@ -503,3 +503,14 @@ create table t1(t1.name int);
create table t2(test.t2.name int); create table t2(test.t2.name int);
drop table t1,t2; drop table t1,t2;
#
# Bug#11028: Crash on create table like
#
create database mysqltest;
use mysqltest;
drop database mysqltest;
--error 1102
create table test.t1 like x;
--disable_warnings
drop table if exists test.t1;
--enable_warnings
...@@ -69,6 +69,16 @@ handler t2 read next; ...@@ -69,6 +69,16 @@ handler t2 read next;
handler t2 read last; handler t2 read last;
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next; # this used to crash as a bug#5373
handler t1 read a next;
handler t1 close;
handler t1 open;
handler t1 read a prev; # this used to crash as a bug#5373
handler t1 read a prev;
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
alter table t1 engine=innodb; alter table t1 engine=innodb;
......
...@@ -80,6 +80,11 @@ create table t1 ( min_num dec(6,6) default .000001); ...@@ -80,6 +80,11 @@ create table t1 ( min_num dec(6,6) default .000001);
show create table t1; show create table t1;
drop table t1 ; drop table t1 ;
#
# Bug #10732: Set SQL_MODE to NULL gives garbled error message
#
--error 1231
set @@SQL_MODE=NULL;
# #
# test for # test for
......
...@@ -158,32 +158,52 @@ FILE *my_fdopen(File Filedes, const char *name, int Flags, myf MyFlags) ...@@ -158,32 +158,52 @@ FILE *my_fdopen(File Filedes, const char *name, int Flags, myf MyFlags)
DBUG_RETURN(fd); DBUG_RETURN(fd);
} /* my_fdopen */ } /* my_fdopen */
/*
/* Make a filehandler-open-typestring from ordinary inputflags */ make_ftype
Make a filehandler-open-typestring from ordinary inputflags
Note: This routine attempts to find the best possible match
between a numeric option and a string option that could be
fed to fopen. There is not a 1 to 1 mapping between the two.
r == O_RDONLY
w == O_WRONLY|O_TRUNC|O_CREAT
a == O_WRONLY|O_APPEND|O_CREAT
r+ == O_RDWR
w+ == O_RDWR|O_TRUNC|O_CREAT
a+ == O_RDWR|O_APPEND|O_CREAT
*/
static void make_ftype(register my_string to, register int flag) static void make_ftype(register my_string to, register int flag)
{ {
#if FILE_BINARY /* If we have binary-files */ #if FILE_BINARY
/* If we have binary-files */
reg3 int org_flag=flag; reg3 int org_flag=flag;
#endif #endif
flag&= ~FILE_BINARY; /* remove binary bit */ flag&= ~FILE_BINARY; /* remove binary bit */
if (flag == O_RDONLY)
*to++= 'r'; /* check some possible invalid combinations */
else if (flag == O_WRONLY) DBUG_ASSERT(flag & (O_TRUNC|O_APPEND) != O_TRUNC|O_APPEND);
if (flag & (O_RDONLY|O_WRONLY) == O_WRONLY)
*to++= (flag & O_APPEND) ? 'a' : 'w';
else if (flag & O_RDWR)
{
/* Add '+' after theese */
if (flag & (O_TRUNC | O_CREAT))
*to++= 'w'; *to++= 'w';
else
{ /* Add '+' after theese */
if (flag == O_RDWR)
*to++= 'r';
else if (flag & O_APPEND) else if (flag & O_APPEND)
*to++= 'a'; *to++= 'a';
else else
*to++= 'w'; /* Create file */ *to++= 'r';
*to++= '+'; *to++= '+';
} }
else
*to++= 'r';
#if FILE_BINARY /* If we have binary-files */ #if FILE_BINARY /* If we have binary-files */
if (org_flag & FILE_BINARY) if (org_flag & FILE_BINARY)
*to++='b'; *to++='b';
#endif #endif
*to='\0'; *to='\0';
} /* make_ftype */ } /* make_ftype */
...@@ -13,7 +13,7 @@ save_args=$* ...@@ -13,7 +13,7 @@ save_args=$*
VERSION="ndb-autotest.sh version 1.04" VERSION="ndb-autotest.sh version 1.04"
DATE=`date '+%Y-%m-%d'` DATE=`date '+%Y-%m-%d'`
HOST=`hostname -s` HOST=`hostname`
export DATE HOST export DATE HOST
set -e set -e
...@@ -330,8 +330,11 @@ start(){ ...@@ -330,8 +330,11 @@ start(){
tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE
scp /tmp/res.$2.$$.tgz \ scp /tmp/res.$2.$$.tgz \
$result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz $result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz
if [ $? -eq 0 ]
then
rm -f /tmp/res.$2.$$.tgz rm -f /tmp/res.$2.$$.tgz
fi fi
fi
} }
######################################### #########################################
......
...@@ -1616,7 +1616,10 @@ bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names) ...@@ -1616,7 +1616,10 @@ bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
if (var->value->result_type() == STRING_RESULT) if (var->value->result_type() == STRING_RESULT)
{ {
if (!(res= var->value->val_str(&str))) if (!(res= var->value->val_str(&str)))
{
strmake(buff, "NULL", 4);
goto err; goto err;
}
var->save_result.ulong_value= ((ulong) var->save_result.ulong_value= ((ulong)
find_set(enum_names, res->c_ptr(), find_set(enum_names, res->c_ptr(),
res->length(), res->length(),
......
...@@ -188,7 +188,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -188,7 +188,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
ACL_HOST host; ACL_HOST host;
update_hostname(&host.host,get_field(&mem, table->field[0])); update_hostname(&host.host,get_field(&mem, table->field[0]));
host.db= get_field(&mem, table->field[1]); host.db= get_field(&mem, table->field[1]);
if (lower_case_table_names) if (lower_case_table_names && host.db)
{ {
/* /*
convert db to lower case and give a warning if the db wasn't convert db to lower case and give a warning if the db wasn't
...@@ -210,7 +210,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -210,7 +210,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'host' entry '%s|%s' " sql_print_warning("'host' entry '%s|%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
host.host.hostname, host.db, host.host.hostname); host.host.hostname, host.db?host.db:"");
continue; continue;
} }
#ifndef TO_BE_REMOVED #ifndef TO_BE_REMOVED
...@@ -278,7 +278,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -278,7 +278,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'user' entry '%s@%s' " sql_print_warning("'user' entry '%s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
user.user, user.host.hostname, user.host.hostname); user.user, user.host.hostname);
continue; continue;
} }
...@@ -414,7 +414,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -414,7 +414,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'db' entry '%s %s@%s' " sql_print_warning("'db' entry '%s %s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
db.db, db.user, db.host.hostname, db.host.hostname); db.db, db.user, db.host.hostname);
continue; continue;
} }
db.access=get_access(table,3); db.access=get_access(table,3);
...@@ -3232,7 +3232,7 @@ my_bool grant_init(THD *org_thd) ...@@ -3232,7 +3232,7 @@ my_bool grant_init(THD *org_thd)
sql_print_warning("'procs_priv' entry '%s %s@%s' " sql_print_warning("'procs_priv' entry '%s %s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
mem_check->tname, mem_check->user, mem_check->tname, mem_check->user,
mem_check->host, mem_check->host); mem_check->host);
continue; continue;
} }
} }
......
...@@ -413,8 +413,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -413,8 +413,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1))) cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1)))
goto err0; goto err0;
table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it
if (keyname) if (keyname)
{ {
if ((keyno=find_type(keyname, &table->s->keynames, 1+2)-1)<0) if ((keyno=find_type(keyname, &table->s->keynames, 1+2)-1)<0)
...@@ -422,8 +420,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -422,8 +420,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias); my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias);
goto err0; goto err0;
} }
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
} }
if (insert_fields(thd, tables, tables->db, tables->alias, &it, 0, 0)) if (insert_fields(thd, tables, tables->db, tables->alias, &it, 0, 0))
...@@ -449,9 +445,22 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -449,9 +445,22 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
for (num_rows=0; num_rows < select_limit_cnt; ) for (num_rows=0; num_rows < select_limit_cnt; )
{ {
switch (mode) { switch (mode) {
case RNEXT:
if (table->file->inited != handler::NONE)
{
error=keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]);
break;
}
/* else fall through */
case RFIRST: case RFIRST:
if (keyname) if (keyname)
{
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
error= table->file->index_first(table->record[0]); error= table->file->index_first(table->record[0]);
}
else else
{ {
table->file->ha_index_or_rnd_end(); table->file->ha_index_or_rnd_end();
...@@ -460,20 +469,21 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -460,20 +469,21 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
mode=RNEXT; mode=RNEXT;
break; break;
case RPREV:
DBUG_ASSERT(keyname != 0);
if (table->file->inited != handler::NONE)
{
error=table->file->index_prev(table->record[0]);
break;
}
/* else fall through */
case RLAST: case RLAST:
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
error= table->file->index_last(table->record[0]); error= table->file->index_last(table->record[0]);
mode=RPREV; mode=RPREV;
break; break;
case RNEXT:
error= (keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]));
break;
case RPREV:
DBUG_ASSERT(keyname != 0);
error= table->file->index_prev(table->record[0]);
break;
case RNEXT_SAME: case RNEXT_SAME:
/* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */ /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
...@@ -508,6 +518,8 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -508,6 +518,8 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len)))) if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len))))
goto err; goto err;
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
key_copy(key, table->record[0], table->key_info + keyno, key_len); key_copy(key, table->record[0], table->key_info + keyno, key_len);
error= table->file->index_read(table->record[0], error= table->file->index_read(table->record[0],
key,key_len,ha_rkey_mode); key,key_len,ha_rkey_mode);
......
...@@ -2589,28 +2589,33 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -2589,28 +2589,33 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
char src_path[FN_REFLEN], dst_path[FN_REFLEN]; char src_path[FN_REFLEN], dst_path[FN_REFLEN];
char *db= table->db; char *db= table->db;
char *table_name= table->table_name; char *table_name= table->table_name;
char *src_db= thd->db; char *src_db;
char *src_table= table_ident->table.str; char *src_table= table_ident->table.str;
int err; int err;
bool res= TRUE; bool res= TRUE;
TABLE_LIST src_tables_list; TABLE_LIST src_tables_list;
DBUG_ENTER("mysql_create_like_table"); DBUG_ENTER("mysql_create_like_table");
src_db= table_ident->db.str ? table_ident->db.str : thd->db;
/* /*
Validate the source table Validate the source table
*/ */
if (table_ident->table.length > NAME_LEN || if (table_ident->table.length > NAME_LEN ||
(table_ident->table.length && (table_ident->table.length &&
check_table_name(src_table,table_ident->table.length)) || check_table_name(src_table,table_ident->table.length)))
table_ident->db.str && check_db_name((src_db= table_ident->db.str)))
{ {
my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table); my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (!src_db || check_db_name(src_db))
{
my_error(ER_WRONG_DB_NAME, MYF(0), src_db ? src_db : "NULL");
DBUG_RETURN(-1);
}
bzero((gptr)&src_tables_list, sizeof(src_tables_list)); bzero((gptr)&src_tables_list, sizeof(src_tables_list));
src_tables_list.db= table_ident->db.str ? table_ident->db.str : thd->db; src_tables_list.db= src_db;
src_tables_list.table_name= table_ident->table.str; src_tables_list.table_name= src_table;
if (lock_and_wait_for_table_name(thd, &src_tables_list)) if (lock_and_wait_for_table_name(thd, &src_tables_list))
goto err; goto err;
......
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