Commit 01441bc5 authored by unknown's avatar unknown

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

into laptop.sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.0

parents 90211196 79e34760
......@@ -535,3 +535,4 @@ Docs/internals.html
Docs/internals.pdf
Docs/internals.txt
Docs/internals_toc.html
scripts/make_win_src_distribution
......@@ -238,7 +238,7 @@ static int get_options(int *argc, char ***argv)
static int write_to_table(char *filename, MYSQL *sock)
{
char tablename[FN_REFLEN], hard_path[FN_REFLEN],
sql_statement[FN_REFLEN*2+256], *end;
sql_statement[FN_REFLEN*16+256], *end;
my_bool local_file;
DBUG_ENTER("write_to_table");
DBUG_PRINT("enter",("filename: %s",filename));
......
......@@ -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 */
......
......@@ -1400,21 +1400,22 @@ static int mi_sort_records(MI_CHECK *param,
if (!(((ulonglong) 1 << sort_key) & share->state.key_map))
{
mi_check_print_error(param,"Can't sort table '%s' on key %d; No such key",
mi_check_print_warning(param,
"Can't sort table '%s' on key %d; No such key",
name,sort_key+1);
param->error_printed=0;
DBUG_RETURN(0); /* Nothing to do */
}
if (keyinfo->flag & HA_FULLTEXT)
{
mi_check_print_error(param,"Can't sort table '%s' on FULLTEXT key %d",
mi_check_print_warning(param,"Can't sort table '%s' on FULLTEXT key %d",
name,sort_key+1);
param->error_printed=0;
DBUG_RETURN(0); /* Nothing to do */
}
if (share->data_file_type == COMPRESSED_RECORD)
{
mi_check_print_error(param,"Can't sort read-only table '%s'", name);
mi_check_print_warning(param,"Can't sort read-only table '%s'", name);
param->error_printed=0;
DBUG_RETURN(0); /* Nothing to do */
}
......
......@@ -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,73 +38,60 @@
*/
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));
#ifdef __WIN__
if (oldsize > newlength)
#if defined(HAVE_SETFILEPOINTER)
/* This is for the moment only true on windows */
{
LARGE_INTEGER new_length;
HANDLE win_file;
win_file= (HANDLE)_get_osfhandle(fd);
HANDLE 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);
my_errno= errno;
goto err;
}
#elif defined(HAVE_CHSIZE)
if (oldsize > newlength || filler == 0)
#elif defined(HAVE_FTRUNCATE)
{
if (chsize(fd,(off_t) newlength))
if (ftruncate(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);
my_errno= errno;
goto err;
}
else
{
if (filler == 0)
DBUG_RETURN(0);
}
}
#elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength)
#elif defined(HAVE_CHSIZE)
{
if (ftruncate(fd, (off_t) newlength))
if (chsize(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);
goto err;
}
DBUG_RETURN(0);
}
#else
if (oldsize > newlength)
{ /* Fill diff with null */
{
/*
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 0 until it's as big as requested */
/* Full file with 'filler' until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
{
......@@ -115,12 +102,10 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err;
DBUG_RETURN(0);
err:
err:
DBUG_PRINT("error", ("errno: %d", errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),my_errno);
DBUG_PRINT("error",("errno: %d",my_errno));
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
DBUG_RETURN(1);
}
} /* my_chsize */
......@@ -1020,14 +1020,25 @@ int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
void ha_key_cache(void)
{
if (keybuff_size)
(void) init_key_cache((ulong) keybuff_size);
/*
The following mutex is not really needed as long as keybuff_size is
treated as a long value, but we use the mutex here to guard for future
changes.
*/
pthread_mutex_lock(&LOCK_global_system_variables);
long tmp= keybuff_size;
pthread_mutex_unlock(&LOCK_global_system_variables);
if (tmp)
(void) init_key_cache(tmp);
}
void ha_resize_key_cache(void)
{
(void) resize_key_cache((ulong) keybuff_size);
pthread_mutex_lock(&LOCK_global_system_variables);
long tmp= keybuff_size;
pthread_mutex_unlock(&LOCK_global_system_variables);
(void) resize_key_cache(tmp);
}
......
......@@ -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);
......
......@@ -507,7 +507,8 @@ void mysqld_list_processes(THD *thd,const char *user,bool verbose);
int mysqld_show_status(THD *thd);
int mysqld_show_variables(THD *thd,const char *wild);
int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
enum enum_var_type value_type);
enum enum_var_type value_type,
pthread_mutex_t *mutex);
/* sql_handler.cc */
int mysql_ha_open(THD *thd, TABLE_LIST *tables);
......
......@@ -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));
}
......
......@@ -729,10 +729,12 @@ void fix_max_relay_log_size(THD *thd, enum_var_type type)
bool sys_var_long_ptr::update(THD *thd, set_var *var)
{
ulonglong tmp= var->value->val_int();
pthread_mutex_lock(&LOCK_global_system_variables);
if (option_limits)
*value= (ulong) getopt_ull_limit_value(tmp, option_limits);
else
*value= (ulong) tmp;
pthread_mutex_unlock(&LOCK_global_system_variables);
return 0;
}
......@@ -746,17 +748,21 @@ void sys_var_long_ptr::set_default(THD *thd, enum_var_type type)
bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var)
{
ulonglong tmp= var->value->val_int();
pthread_mutex_lock(&LOCK_global_system_variables);
if (option_limits)
*value= (ulonglong) getopt_ull_limit_value(tmp, option_limits);
else
*value= (ulonglong) tmp;
pthread_mutex_unlock(&LOCK_global_system_variables);
return 0;
}
void sys_var_ulonglong_ptr::set_default(THD *thd, enum_var_type type)
{
pthread_mutex_lock(&LOCK_global_system_variables);
*value= (ulonglong) option_limits->def_value;
pthread_mutex_unlock(&LOCK_global_system_variables);
}
......@@ -1000,9 +1006,21 @@ Item *sys_var::item(THD *thd, enum_var_type var_type)
case SHOW_LONG:
return new Item_uint((int32) *(ulong*) value_ptr(thd, var_type));
case SHOW_LONGLONG:
return new Item_int(*(longlong*) value_ptr(thd, var_type));
{
longlong value;
pthread_mutex_lock(&LOCK_global_system_variables);
value= *(longlong*) value_ptr(thd, var_type);
pthread_mutex_unlock(&LOCK_global_system_variables);
return new Item_int(value);
}
case SHOW_HA_ROWS:
return new Item_int((longlong) *(ha_rows*) value_ptr(thd, var_type));
{
ha_rows value;
pthread_mutex_lock(&LOCK_global_system_variables);
value= *(ha_rows*) value_ptr(thd, var_type);
pthread_mutex_unlock(&LOCK_global_system_variables);
return new Item_int((longlong) value);
}
case SHOW_MY_BOOL:
return new Item_int((int32) *(my_bool*) value_ptr(thd, var_type),1);
case SHOW_CHAR:
......
......@@ -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;
}
}
}
......
......@@ -2146,11 +2146,12 @@ mysql_execute_command(void)
break;
case SQLCOM_SHOW_STATUS:
res= mysqld_show(thd,(lex->wild ? lex->wild->ptr() : NullS),status_vars,
OPT_GLOBAL);
OPT_GLOBAL, &LOCK_status);
break;
case SQLCOM_SHOW_VARIABLES:
res= mysqld_show(thd, (lex->wild ? lex->wild->ptr() : NullS),
init_vars, lex->option_type);
init_vars, lex->option_type,
&LOCK_global_system_variables);
break;
case SQLCOM_SHOW_LOGS:
{
......@@ -3579,8 +3580,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,11 +972,8 @@ 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;
}
}
join.having=having; // Actually a parameter
thd->proc_info="Sending data";
error=do_select(&join,&fields,NULL,procedure);
......@@ -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,
......
......@@ -1158,7 +1158,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
enum enum_var_type value_type)
enum enum_var_type value_type,
pthread_mutex_t *mutex)
{
char buff[8192];
String packet2(buff,sizeof(buff));
......@@ -1171,8 +1172,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
if (send_fields(thd,field_list,1))
DBUG_RETURN(1); /* purecov: inspected */
/* pthread_mutex_lock(&THR_LOCK_keycache); */
pthread_mutex_lock(&LOCK_status);
pthread_mutex_lock(mutex);
for (; variables->name; variables++)
{
if (!(wild && wild[0] && wild_case_compare(variables->name,wild)))
......@@ -1413,14 +1413,12 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
goto err; /* purecov: inspected */
}
}
pthread_mutex_unlock(&LOCK_status);
/* pthread_mutex_unlock(&THR_LOCK_keycache); */
pthread_mutex_unlock(mutex);
send_eof(&thd->net);
DBUG_RETURN(0);
err:
pthread_mutex_unlock(&LOCK_status);
/* pthread_mutex_unlock(&THR_LOCK_keycache); */
pthread_mutex_unlock(mutex);
DBUG_RETURN(1);
}
......
......@@ -22,7 +22,11 @@ EXTRA_DIST = Info.plist.sh \
StartupParameters.plist.sh \
postinstall.sh \
preinstall.sh \
ReadMe.txt
ReadMe.txt \
MySQL \
StartupItem.Description.plist \
StartupItem.Info.plist \
StartupItem.postinstall
pkgdata_DATA = Info.plist \
Description.plist \
......
#!/bin/sh
#
# /Library/StartupItems/MySQL/MySQL
#
# A script to automatically start up MySQL on system bootup
# for Mac OS X. This is actually just a wrapper script around
# the standard mysql.server init script, which is included in
# the binary distribution.
#
# (c) 2003 MySQL AB
# Written by Lenz Grimmer <lenz@mysql.com>
#
# Source the common setup functions for startup scripts
test -r /etc/rc.common || exit 1
. /etc/rc.common
# The path to the mysql.server init script. The official MySQL
# Mac OS X packages are being installed into /usr/local/mysql.
SCRIPT="/usr/local/mysql/support-files/mysql.server"
StartService ()
{
if [ "${MYSQLCOM:=-NO-}" = "-YES-" ] ; then
ConsoleMessage "Starting MySQL database server"
$SCRIPT start > /dev/null 2>&1
fi
}
StopService ()
{
ConsoleMessage "Stopping MySQL database server"
$SCRIPT stop > /dev/null 2>&1
}
RestartService ()
{
ConsoleMessage "Restarting MySQL database server"
$SCRIPT restart > /dev/null 2>&1
}
if test -x $SCRIPT ; then
RunService "$1"
else
ConsoleMessage "Could not find MySQL startup script!"
fi
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IFPkgDescriptionDeleteWarning</key>
<string></string>
<key>IFPkgDescriptionDescription</key>
<string>This package enables MySQL to be started up automatically
on system bootup.</string>
<key>IFPkgDescriptionTitle</key>
<string>MySQL Startup Item</string>
<key>IFPkgDescriptionVersion</key>
<string>1.0</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleGetInfoString</key>
<string>MySQL Startup Item</string>
<key>CFBundleIdentifier</key>
<string>com.mysql.mysqlstartup</string>
<key>CFBundleName</key>
<string>MySQL Startup Item</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>IFMajorVersion</key>
<integer>1</integer>
<key>IFMinorVersion</key>
<integer>0</integer>
<key>IFPkgFlagAllowBackRev</key>
<false/>
<key>IFPkgFlagAuthorizationAction</key>
<string>RootAuthorization</string>
<key>IFPkgFlagDefaultLocation</key>
<string>/Library/StartupItems/</string>
<key>IFPkgFlagInstallFat</key>
<false/>
<key>IFPkgFlagIsRequired</key>
<false/>
<key>IFPkgFlagOverwritePermissions</key>
<true/>
<key>IFPkgFlagRelocatable</key>
<false/>
<key>IFPkgFlagRestartAction</key>
<string>NoRestart</string>
<key>IFPkgFlagRootVolumeOnly</key>
<true/>
<key>IFPkgFlagUpdateInstalledLanguages</key>
<false/>
<key>IFPkgFlagUseUserMask</key>
<false/>
<key>IFPkgFormatVersion</key>
<real>0.10000000149011612</real>
</dict>
</plist>
#!/bin/sh
#
# postinstall script for the MySQL Startup Item Installation package
#
# This script modifies /etc/hostconfig in the following ways:
#
# - On Mac OS X Server, it disables the startup of the default MySQL
# installation by changing the "MYSQL" start variable to "-NO-".
# - If not existent already, it adds a "MYSQLCOM" start variable, which
# defaults to "-YES-". An already existing MYSQLCOM variable will remain
# untouched.
#
# (c) 2003 MySQL AB
# Author: Lenz Grimmer <lenz@mysql.com>
#
CONFFILE="/etc/hostconfig"
TMPFILE=`basename $CONFFILE` || exit 1
TMPFILE=`mktemp -t $TMPFILE.tmp` || exit 1
test -e $CONFFILE || exit 1
# Disable the startup of the default MySQL installation that ships with
# Mac OS X Server to avoid conflicts with our installation on bootup
sed -e s/^MYSQL=-YES-/MYSQL=-NO-/g < $CONFFILE > $TMPFILE
# Add our MYSQLCOM startup variable (enabled by default)
grep -q "^MYSQLCOM" $CONFFILE > /dev/null 2>&1
if [ $? -ne 0 ] ; then
echo "MYSQLCOM=-YES-" >> $TMPFILE
fi
# Install the modified file into the default location
cp -f $CONFFILE $CONFFILE~ || exit 1
mv -f $TMPFILE $CONFFILE || echo "Error while installing new $CONFFILE!"
chmod 644 $CONFFILE
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