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)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER
#ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */
......
......@@ -108,3 +108,6 @@ flush privileges;
drop table t1;
GRANT FILE on mysqltest.* to mysqltest_1@localhost;
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);
insert into t1 values (NULL);
drop table t1;
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;
show binlog events;
Log_name Pos Event_type Server_id Orig_log_pos Info
......
......@@ -72,5 +72,10 @@ delete from mysql.tables_priv where user='mysqltest_1';
delete from mysql.columns_priv where user='mysqltest_1';
flush privileges;
drop table t1;
#
# Test some error conditions
#
--error 1221
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);
insert into t1 values (NULL);
drop table t1;
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;
--replace_result $VERSION VERSION
show binlog events;
......@@ -35,8 +36,8 @@ flush logs;
# 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
# it not predictable and causing random test failures.
# To make it predictable, we do a useless update now, but which has the interest
# of making the slave catch both rotate events.
# To make it predictable, we do a useless update now, but which has the
# interest of making the slave catch both rotate events.
create table t5 (a int);
drop table t5;
......
......@@ -30,7 +30,7 @@
MyFlags Flags
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
0 Ok
......@@ -38,89 +38,74 @@
*/
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_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
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));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
#ifdef __WIN__
if (oldsize > newlength)
{
LARGE_INTEGER new_length;
HANDLE win_file;
win_file= (HANDLE)_get_osfhandle(fd);
new_length.QuadPart = newlength;
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 (oldsize > newlength)
#if defined(HAVE_SETFILEPOINTER)
/* This is for the moment only true on windows */
{
LARGE_INTEGER new_length;
HANDLE win_file= (HANDLE) _get_osfhandle(fd);
new_length.QuadPart = newlength;
if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{
if (chsize(fd,(off_t) newlength))
{
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);
}
if (SetEndOfFile(win_file))
DBUG_RETURN(0);
}
my_errno= errno;
goto err;
}
#elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength)
{
if (ftruncate(fd, (off_t) newlength))
{
if (ftruncate(fd, (off_t) newlength))
{
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);
my_errno= errno;
goto err;
}
#endif
/* Full file with 0 until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
DBUG_RETURN(0);
}
#elif defined(HAVE_CHSIZE)
{
if (chsize(fd, (off_t) newlength))
{
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)))
my_errno=errno;
goto err;
}
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)
pretty_print_str(&tmp, sql_ex.line_start, sql_ex.line_start_len);
}
if ((int)skip_lines > 0)
tmp.append( " IGNORE %ld LINES ", (long) skip_lines);
if ((long) skip_lines > 0)
{
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)
{
......@@ -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);
}
if ((int)skip_lines > 0)
fprintf(file, " IGNORE %ld LINES ", (long) skip_lines);
if ((long) skip_lines > 0)
fprintf(file, " IGNORE %ld LINES", (long) skip_lines);
if (num_fields)
{
......@@ -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)
handle_dup= DUP_IGNORE;
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
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
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
error or bug), we want LOAD DATA to print an error message on the
slave to discover the problem.
(because the data on the master and slave happen to be different
(user error or bug), we want LOAD DATA to print an error message on
the slave to discover the problem.
If reading from net (a 3.23 master), mysql_load() will change this
to DUP_IGNORE.
*/
handle_dup= DUP_ERROR;
}
sql_exchange ex((char*)fname, sql_ex.opt_flags & DUMPFILE_FLAG);
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)
table_map ref_tables=cond->used_tables();
if (cond->type() != Item::FUNC_ITEM)
{ // 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(new SEL_TREE(SEL_TREE::MAYBE));
}
......
......@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list,
else
{
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)
if (options & REFRESH_LOG)
{
/*
Flush the normal query log, the update log, the binary log, the slow query
log, and the relay log (if it exists).
Flush the normal query log, the update log, the binary log,
the slow query log, and the relay log (if it exists).
*/
mysql_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,
group ? group : order,
select_limit,
thd->select_limit))
{
if (!join.join_tab[join.const_tables].select->quick)
goto err;
}
goto err;
}
join.having=having; // Actually a parameter
thd->proc_info="Sending data";
......@@ -1493,11 +1490,15 @@ add_key_field(KEY_FIELD **key_fields,uint and_level,
}
}
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 */
(*key_fields)->field=field;
(*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)->exists_optimize=exists_optimize;
(*key_fields)++;
......@@ -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)
{
Item *tmp=new Item_null;
if (!tmp) // Should never be true
return;
add_key_field(key_fields,*and_level,
((Item_field*) (cond_func->arguments()[0]))->field,
cond_func->functype() == Item_func::ISNULL_FUNC,
......
......@@ -2024,7 +2024,7 @@ simple_expr:
{
LEX *lex=Lex;
$$= 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 ')'
{ $$= 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