Commit 02d844ee authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-4.0

into mashka.mysql.fi:/home/my/mysql-4.0

parents 9ac61d15 ccd82890
...@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value) ...@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */ #define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE #define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT #define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER
#ifdef NOT_USED #ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */ #define HAVE_SNPRINTF /* Gave link error */
......
...@@ -108,3 +108,6 @@ flush privileges; ...@@ -108,3 +108,6 @@ flush privileges;
drop table t1; drop table t1;
GRANT FILE on mysqltest.* to mysqltest_1@localhost; GRANT FILE on mysqltest.* to mysqltest_1@localhost;
Wrong usage of DB GRANT and GLOBAL PRIVILEGES Wrong usage of DB GRANT and GLOBAL PRIVILEGES
select 1;
1
1
...@@ -12,7 +12,10 @@ create table t1(n int not null auto_increment primary key); ...@@ -12,7 +12,10 @@ create table t1(n int not null auto_increment primary key);
insert into t1 values (NULL); insert into t1 values (NULL);
drop table t1; drop table t1;
create table t1 (word char(20) not null); create table t1 (word char(20) not null);
load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines;
select count(*) from t1;
count(*)
69
drop table t1; drop table t1;
show binlog events; show binlog events;
Log_name Pos Event_type Server_id Orig_log_pos Info Log_name Pos Event_type Server_id Orig_log_pos Info
......
...@@ -72,5 +72,10 @@ delete from mysql.tables_priv where user='mysqltest_1'; ...@@ -72,5 +72,10 @@ delete from mysql.tables_priv where user='mysqltest_1';
delete from mysql.columns_priv where user='mysqltest_1'; delete from mysql.columns_priv where user='mysqltest_1';
flush privileges; flush privileges;
drop table t1; drop table t1;
#
# Test some error conditions
#
--error 1221 --error 1221
GRANT FILE on mysqltest.* to mysqltest_1@localhost; GRANT FILE on mysqltest.* to mysqltest_1@localhost;
select 1; -- To test that the previous command didn't cause problems
...@@ -13,7 +13,8 @@ create table t1(n int not null auto_increment primary key); ...@@ -13,7 +13,8 @@ create table t1(n int not null auto_increment primary key);
insert into t1 values (NULL); insert into t1 values (NULL);
drop table t1; drop table t1;
create table t1 (word char(20) not null); create table t1 (word char(20) not null);
load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines;
select count(*) from t1;
drop table t1; drop table t1;
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
show binlog events; show binlog events;
...@@ -35,8 +36,8 @@ flush logs; ...@@ -35,8 +36,8 @@ flush logs;
# So, depending on a few milliseconds, we end up with 2 rotate events in the # So, depending on a few milliseconds, we end up with 2 rotate events in the
# relay log or one, which influences the output of SHOW SLAVE STATUS, making # relay log or one, which influences the output of SHOW SLAVE STATUS, making
# it not predictable and causing random test failures. # it not predictable and causing random test failures.
# To make it predictable, we do a useless update now, but which has the interest # To make it predictable, we do a useless update now, but which has the
# of making the slave catch both rotate events. # interest of making the slave catch both rotate events.
create table t5 (a int); create table t5 (a int);
drop table t5; drop table t5;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
MyFlags Flags MyFlags Flags
DESCRIPTION DESCRIPTION
my_chsize() truncates file if shorter, else fill with the filler character my_chsize() truncates file if shorter else fill with the filler character
RETURN VALUE RETURN VALUE
0 Ok 0 Ok
...@@ -38,89 +38,74 @@ ...@@ -38,89 +38,74 @@
*/ */
int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
{ {
my_off_t oldsize;
char buff[IO_SIZE];
DBUG_ENTER("my_chsize"); DBUG_ENTER("my_chsize");
DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength, DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
MyFlags)); MyFlags));
/* if file is shorter, expand with null, else fill unused part with null */
{
my_off_t oldsize;
char buff[IO_SIZE];
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE)); oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize)); DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
#ifdef __WIN__ if (oldsize > newlength)
if (oldsize > newlength) #if defined(HAVE_SETFILEPOINTER)
{ /* This is for the moment only true on windows */
LARGE_INTEGER new_length; {
HANDLE win_file; LARGE_INTEGER new_length;
win_file= (HANDLE)_get_osfhandle(fd); HANDLE win_file= (HANDLE) _get_osfhandle(fd);
new_length.QuadPart = newlength; new_length.QuadPart = newlength;
if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN)) if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{
if (SetEndOfFile(win_file))
DBUG_RETURN(0);
}
DBUG_PRINT("error",("errno: %d",errno));
my_errno=errno;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1);
}
#elif defined(HAVE_CHSIZE)
if (oldsize > newlength || filler == 0)
{ {
if (chsize(fd,(off_t) newlength)) if (SetEndOfFile(win_file))
{ DBUG_RETURN(0);
DBUG_PRINT("error",("errno: %d",errno));
my_errno=errno;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1);
}
else
{
if (filler == 0)
DBUG_RETURN(0);
}
} }
my_errno= errno;
goto err;
}
#elif defined(HAVE_FTRUNCATE) #elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength) {
if (ftruncate(fd, (off_t) newlength))
{ {
if (ftruncate(fd, (off_t) newlength)) my_errno= errno;
{ goto err;
my_errno=errno;
DBUG_PRINT("error",("errno: %d",errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), errno);
DBUG_RETURN(1);
}
DBUG_RETURN(0);
}
#else
if (oldsize > newlength)
{ /* Fill diff with null */
VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap(my_off_t, newlength, oldsize);
} }
#endif DBUG_RETURN(0);
/* Full file with 0 until it's as big as requested */ }
bfill(buff, IO_SIZE, filler); #elif defined(HAVE_CHSIZE)
while (newlength-oldsize > IO_SIZE) {
if (chsize(fd, (off_t) newlength))
{ {
if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP))) my_errno=errno;
goto err;
oldsize+= IO_SIZE;
}
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err; goto err;
}
DBUG_RETURN(0); DBUG_RETURN(0);
err:
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),my_errno);
DBUG_PRINT("error",("errno: %d",my_errno));
DBUG_RETURN(1);
} }
} /* my_chsize */ #else
{
/*
Fill space between requested length and true length with 'filler'
We should never come here on any modern machine
*/
VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap(my_off_t, newlength, oldsize);
}
#endif
/* Full file with 'filler' until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
{
if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
goto err;
oldsize+= IO_SIZE;
}
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err;
DBUG_RETURN(0);
err:
DBUG_PRINT("error", ("errno: %d", errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
DBUG_RETURN(1);
} /* my_chsize */
...@@ -329,8 +329,14 @@ void Load_log_event::pack_info(String* packet) ...@@ -329,8 +329,14 @@ void Load_log_event::pack_info(String* packet)
pretty_print_str(&tmp, sql_ex.line_start, sql_ex.line_start_len); pretty_print_str(&tmp, sql_ex.line_start, sql_ex.line_start_len);
} }
if ((int)skip_lines > 0) if ((long) skip_lines > 0)
tmp.append( " IGNORE %ld LINES ", (long) skip_lines); {
char nr_buff[32], *end;
tmp.append( " IGNORE ");
end= longlong10_to_str((longlong) skip_lines, nr_buff, 10);
tmp.append(nr_buff, (uint) (end-nr_buff));
tmp.append( " LINES");
}
if (num_fields) if (num_fields)
{ {
...@@ -1338,8 +1344,8 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db) ...@@ -1338,8 +1344,8 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db)
pretty_print_str(file, sql_ex.line_start, sql_ex.line_start_len); pretty_print_str(file, sql_ex.line_start, sql_ex.line_start_len);
} }
if ((int)skip_lines > 0) if ((long) skip_lines > 0)
fprintf(file, " IGNORE %ld LINES ", (long) skip_lines); fprintf(file, " IGNORE %ld LINES", (long) skip_lines);
if (num_fields) if (num_fields)
{ {
...@@ -1934,20 +1940,22 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, ...@@ -1934,20 +1940,22 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
else if (sql_ex.opt_flags & IGNORE_FLAG) else if (sql_ex.opt_flags & IGNORE_FLAG)
handle_dup= DUP_IGNORE; handle_dup= DUP_IGNORE;
else else
{
/* /*
Note that when replication is running fine, if it was DUP_ERROR on the When replication is running fine, if it was DUP_ERROR on the
master then we could choose DUP_IGNORE here, because if DUP_ERROR master then we could choose DUP_IGNORE here, because if DUP_ERROR
suceeded on master, and data is identical on the master and slave, suceeded on master, and data is identical on the master and slave,
then there should be no uniqueness errors on slave, so DUP_IGNORE is then there should be no uniqueness errors on slave, so DUP_IGNORE is
the same as DUP_ERROR. But in the unlikely case of uniqueness errors the same as DUP_ERROR. But in the unlikely case of uniqueness errors
(because the data on the master and slave happen to be different (user (because the data on the master and slave happen to be different
error or bug), we want LOAD DATA to print an error message on the (user error or bug), we want LOAD DATA to print an error message on
slave to discover the problem. the slave to discover the problem.
If reading from net (a 3.23 master), mysql_load() will change this If reading from net (a 3.23 master), mysql_load() will change this
to DUP_IGNORE. to DUP_IGNORE.
*/ */
handle_dup= DUP_ERROR; handle_dup= DUP_ERROR;
}
sql_exchange ex((char*)fname, sql_ex.opt_flags & DUMPFILE_FLAG); sql_exchange ex((char*)fname, sql_ex.opt_flags & DUMPFILE_FLAG);
String field_term(sql_ex.field_term,sql_ex.field_term_len); String field_term(sql_ex.field_term,sql_ex.field_term_len);
......
...@@ -798,7 +798,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond) ...@@ -798,7 +798,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
table_map ref_tables=cond->used_tables(); table_map ref_tables=cond->used_tables();
if (cond->type() != Item::FUNC_ITEM) if (cond->type() != Item::FUNC_ITEM)
{ // Should be a field { // Should be a field
if (ref_tables & param->current_table) if ((ref_tables & param->current_table) ||
(ref_tables & ~(param->prev_tables | param->read_tables)))
DBUG_RETURN(0); DBUG_RETURN(0);
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE)); DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE));
} }
......
...@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, ...@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list,
else else
{ {
net_printf(&thd->net,ER_WRONG_USAGE,"DB GRANT","GLOBAL PRIVILEGES"); net_printf(&thd->net,ER_WRONG_USAGE,"DB GRANT","GLOBAL PRIVILEGES");
result= -1; result= 1;
} }
} }
} }
......
...@@ -3579,8 +3579,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) ...@@ -3579,8 +3579,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
if (options & REFRESH_LOG) if (options & REFRESH_LOG)
{ {
/* /*
Flush the normal query log, the update log, the binary log, the slow query Flush the normal query log, the update log, the binary log,
log, and the relay log (if it exists). the slow query log, and the relay log (if it exists).
*/ */
mysql_log.new_file(1); mysql_log.new_file(1);
mysql_update_log.new_file(1); mysql_update_log.new_file(1);
......
...@@ -972,10 +972,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -972,10 +972,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
group ? group : order, group ? group : order,
select_limit, select_limit,
thd->select_limit)) thd->select_limit))
{ goto err;
if (!join.join_tab[join.const_tables].select->quick)
goto err;
}
} }
join.having=having; // Actually a parameter join.having=having; // Actually a parameter
thd->proc_info="Sending data"; thd->proc_info="Sending data";
...@@ -1493,11 +1490,15 @@ add_key_field(KEY_FIELD **key_fields,uint and_level, ...@@ -1493,11 +1490,15 @@ add_key_field(KEY_FIELD **key_fields,uint and_level,
} }
} }
DBUG_ASSERT(num_values == 1); DBUG_ASSERT(num_values == 1);
// DBUG_ASSERT(eq_func); /* QQ: Can I uncomment this ASSERT ? */ /*
For the moment eq_func is always true. This slot is reserved for future
extensions where we want to remembers other things than just eq comparisons
*/
DBUG_ASSERT(eq_func);
/* Store possible eq field */ /* Store possible eq field */
(*key_fields)->field=field; (*key_fields)->field=field;
(*key_fields)->eq_func=eq_func; (*key_fields)->eq_func=eq_func;
(*key_fields)->val=*value; (*key_fields)->val= *value;
(*key_fields)->level=(*key_fields)->const_level=and_level; (*key_fields)->level=(*key_fields)->const_level=and_level;
(*key_fields)->exists_optimize=exists_optimize; (*key_fields)->exists_optimize=exists_optimize;
(*key_fields)++; (*key_fields)++;
...@@ -1585,6 +1586,8 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, ...@@ -1585,6 +1586,8 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level,
if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM) if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM)
{ {
Item *tmp=new Item_null; Item *tmp=new Item_null;
if (!tmp) // Should never be true
return;
add_key_field(key_fields,*and_level, add_key_field(key_fields,*and_level,
((Item_field*) (cond_func->arguments()[0]))->field, ((Item_field*) (cond_func->arguments()[0]))->field,
cond_func->functype() == Item_func::ISNULL_FUNC, cond_func->functype() == Item_func::ISNULL_FUNC,
......
...@@ -2024,7 +2024,7 @@ simple_expr: ...@@ -2024,7 +2024,7 @@ simple_expr:
{ {
LEX *lex=Lex; LEX *lex=Lex;
$$= new Item_func_week($3,new Item_int((char*) "0", $$= new Item_func_week($3,new Item_int((char*) "0",
lex->thd->variables.default_week_format,1)); lex->thd->variables.default_week_format,1));
} }
| WEEK_SYM '(' expr ',' expr ')' | WEEK_SYM '(' expr ',' expr ')'
{ $$= new Item_func_week($3,$5); } { $$= new Item_func_week($3,$5); }
......
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