Commit 2e8cb7c3 authored by guilhem@mysql.com's avatar guilhem@mysql.com

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

into mysql.com:/home/mysql_src/mysql-4.0
parents 28d3c3d7 8a52c2d2
...@@ -24,6 +24,7 @@ heikki@donna.mysql.fi ...@@ -24,6 +24,7 @@ heikki@donna.mysql.fi
heikki@hundin.mysql.fi heikki@hundin.mysql.fi
heikki@rescue. heikki@rescue.
heikki@work.mysql.com heikki@work.mysql.com
hf@deer.(none)
hf@deer.mysql.r18.ru hf@deer.mysql.r18.ru
hf@genie.(none) hf@genie.(none)
igor@hundin.mysql.fi igor@hundin.mysql.fi
......
...@@ -640,9 +640,6 @@ typedef long my_ptrdiff_t; ...@@ -640,9 +640,6 @@ typedef long my_ptrdiff_t;
typedef long long my_ptrdiff_t; typedef long long my_ptrdiff_t;
#endif #endif
/* typedef used for length of string; Should be unsigned! */
typedef ulong size_str;
#define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1)) #define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1))
#define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double)) #define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double))
/* Size to make adressable obj. */ /* Size to make adressable obj. */
...@@ -711,6 +708,9 @@ typedef long longlong; ...@@ -711,6 +708,9 @@ typedef long longlong;
#endif #endif
#endif #endif
/* typedef used for length of string; Should be unsigned! */
typedef ulong size_str;
#ifdef USE_RAID #ifdef USE_RAID
/* /*
The following is done with a if to not get problems with pre-processors The following is done with a if to not get problems with pre-processors
......
...@@ -138,7 +138,7 @@ extern int NEAR my_errno; /* Last error in mysys */ ...@@ -138,7 +138,7 @@ extern int NEAR my_errno; /* Last error in mysys */
#define QUICK_SAFEMALLOC sf_malloc_quick=1 #define QUICK_SAFEMALLOC sf_malloc_quick=1
#define NORMAL_SAFEMALLOC sf_malloc_quick=0 #define NORMAL_SAFEMALLOC sf_malloc_quick=0
extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick; extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
extern ulonglong safemalloc_mem_limit; extern ulonglong sf_malloc_mem_limit;
#define CALLER_INFO_PROTO , const char *sFile, uint uLine #define CALLER_INFO_PROTO , const char *sFile, uint uLine
#define CALLER_INFO , __FILE__, __LINE__ #define CALLER_INFO , __FILE__, __LINE__
...@@ -239,7 +239,7 @@ extern int NEAR my_umask, /* Default creation mask */ ...@@ -239,7 +239,7 @@ extern int NEAR my_umask, /* Default creation mask */
NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */ NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
NEAR my_dont_interrupt; /* call remember_intr when set */ NEAR my_dont_interrupt; /* call remember_intr when set */
extern my_bool NEAR mysys_uses_curses, my_use_symdir; extern my_bool NEAR mysys_uses_curses, my_use_symdir;
extern long lCurMemory,lMaxMemory; /* from safemalloc */ extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
extern ulong my_default_record_cache_size; extern ulong my_default_record_cache_size;
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io, extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
......
...@@ -329,6 +329,9 @@ insert into t1 values ('2001-01-12 12:23:40'); ...@@ -329,6 +329,9 @@ insert into t1 values ('2001-01-12 12:23:40');
select ctime, hour(ctime) from t1; select ctime, hour(ctime) from t1;
ctime hour(ctime) ctime hour(ctime)
2001-01-12 12:23:40 12 2001-01-12 12:23:40 12
select ctime from t1 where extract(MONTH FROM ctime) = 1 AND extract(YEAR FROM ctime) = 2001;
ctime
2001-01-12 12:23:40
drop table t1; drop table t1;
create table t1 (id int); create table t1 (id int);
create table t2 (id int, date date); create table t2 (id int, date date);
......
...@@ -123,6 +123,8 @@ select extract(MONTH FROM "2001-02-00"); ...@@ -123,6 +123,8 @@ select extract(MONTH FROM "2001-02-00");
create table t1 (ctime varchar(20)); create table t1 (ctime varchar(20));
insert into t1 values ('2001-01-12 12:23:40'); insert into t1 values ('2001-01-12 12:23:40');
select ctime, hour(ctime) from t1; select ctime, hour(ctime) from t1;
# test bug 614 (multiple extracts in where)
select ctime from t1 where extract(MONTH FROM ctime) = 1 AND extract(YEAR FROM ctime) = 2001;
drop table t1; drop table t1;
# #
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
** --print-defaults ; Print the modified command line and exit ** --print-defaults ; Print the modified command line and exit
****************************************************************************/ ****************************************************************************/
#undef SAFEMALLOC /* safe_malloc is not yet initailized */
#include "mysys_priv.h" #include "mysys_priv.h"
#include "m_string.h" #include "m_string.h"
#include "m_ctype.h" #include "m_ctype.h"
......
...@@ -609,9 +609,9 @@ static ulonglong getopt_ull(char *arg, const struct my_option *optp, int *err) ...@@ -609,9 +609,9 @@ static ulonglong getopt_ull(char *arg, const struct my_option *optp, int *err)
ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp) ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp)
{ {
if ((ulonglong) num > (ulonglong) (ulong) optp->max_value && if ((ulonglong) num > (ulonglong) optp->max_value &&
optp->max_value) /* if max value is not set -> no upper limit */ optp->max_value) /* if max value is not set -> no upper limit */
num= (ulonglong) (ulong) optp->max_value; num= (ulonglong) optp->max_value;
if (optp->block_size > 1) if (optp->block_size > 1)
{ {
num/= (ulonglong) optp->block_size; num/= (ulonglong) optp->block_size;
......
...@@ -69,14 +69,13 @@ uint sf_malloc_prehunc=0, /* If you have problem with core- */ ...@@ -69,14 +69,13 @@ uint sf_malloc_prehunc=0, /* If you have problem with core- */
sf_malloc_endhunc=0, /* dump when malloc-message.... */ sf_malloc_endhunc=0, /* dump when malloc-message.... */
/* set theese to 64 or 128 */ /* set theese to 64 or 128 */
sf_malloc_quick=0; /* set if no calls to sanity */ sf_malloc_quick=0; /* set if no calls to sanity */
long lCurMemory = 0L; /* Current memory usage */ ulong sf_malloc_cur_memory= 0L; /* Current memory usage */
long lMaxMemory = 0L; /* Maximum memory usage */ ulong sf_malloc_max_memory= 0L; /* Maximum memory usage */
uint cNewCount = 0; /* Number of times NEW() was called */ uint sf_malloc_count= 0; /* Number of times NEW() was called */
byte *sf_min_adress= (byte*) ~(unsigned long) 0L, byte *sf_min_adress= (byte*) ~(unsigned long) 0L,
*sf_max_adress= (byte*) 0L; *sf_max_adress= (byte*) 0L;
/* Root of the linked list of struct st_irem */
/* Root of the linked list of remembers */ struct st_irem *sf_malloc_root = NULL;
struct remember *pRememberRoot = NULL;
/* from my_alarm */ /* from my_alarm */
int volatile my_have_got_alarm=0; /* declare variable to reset */ int volatile my_have_got_alarm=0; /* declare variable to reset */
......
...@@ -33,27 +33,23 @@ struct st_remember { ...@@ -33,27 +33,23 @@ struct st_remember {
}; };
/* /*
The size of the following structure MUST be dividable by 8 to not cause Structure that stores information of a allocated memory block
alignment problems on some cpu's The data is at &struct_adr+sizeof(ALIGN_SIZE(sizeof(struct irem)))
The lspecialvalue is at the previous 4 bytes from this, which may not
necessarily be in the struct if the struct size isn't aligned at a 8 byte
boundary.
*/ */
struct irem struct st_irem
{ {
struct remember *_pNext; /* Linked list of structures */ struct st_irem *next; /* Linked list of structures */
struct remember *_pPrev; /* Other link */ struct st_irem *prev; /* Other link */
char *_sFileName; /* File in which memory was new'ed */ char *filename; /* File in which memory was new'ed */
uint32 _uLineNum; /* Line number in above file */ uint32 linenum; /* Line number in above file */
uint32 _uDataSize; /* Size requested */ uint32 datasize; /* Size requested */
#if SIZEOF_CHARP == 8 uint32 SpecialValue; /* Underrun marker value */
long _filler; /* For alignment */
#endif
long _lSpecialValue; /* Underrun marker value */
}; };
struct remember {
struct irem tInt;
char aData[1];
};
extern char NEAR curr_dir[FN_REFLEN],NEAR home_dir_buff[FN_REFLEN]; extern char NEAR curr_dir[FN_REFLEN],NEAR home_dir_buff[FN_REFLEN];
...@@ -70,8 +66,8 @@ extern int _my_tempnam_used; ...@@ -70,8 +66,8 @@ extern int _my_tempnam_used;
#endif #endif
extern byte *sf_min_adress,*sf_max_adress; extern byte *sf_min_adress,*sf_max_adress;
extern uint cNewCount; extern uint sf_malloc_count;
extern struct remember *pRememberRoot; extern struct st_irem *sf_malloc_root;
#if defined(THREAD) && !defined(__WIN__) #if defined(THREAD) && !defined(__WIN__)
extern sigset_t my_signals; /* signals blocked by mf_brkhant */ extern sigset_t my_signals; /* signals blocked by mf_brkhant */
......
This diff is collapsed.
...@@ -14,12 +14,14 @@ $Param->{host}=''; ...@@ -14,12 +14,14 @@ $Param->{host}='';
$Param->{user}=''; $Param->{user}='';
$Param->{password}=''; $Param->{password}='';
$Param->{PrintError}=0; $Param->{PrintError}=0;
$Param->{socket}='';
if (!GetOptions ('date|d:i' => \$Param->{ViewDate}, if (!GetOptions ('date|d:i' => \$Param->{ViewDate},
'host|h:s' => \$Param->{host}, 'host|h:s' => \$Param->{host},
'user|u:s' => \$Param->{user}, 'user|u:s' => \$Param->{user},
'password|p:s' => \$Param->{password}, 'password|p:s' => \$Param->{password},
'printerror|e:s' => \$Param->{PrintError}, 'printerror|e:s' => \$Param->{PrintError},
'socket|s:s' => \$Param->{socket},
)) { )) {
ShowOptions(); ShowOptions();
} }
...@@ -50,7 +52,7 @@ else { ...@@ -50,7 +52,7 @@ else {
#print "Date=$Param->{ViewDate}, host=$Param->{host}, user=$Param->{user}, password=$Param->{password}\n"; #print "Date=$Param->{ViewDate}, host=$Param->{host}, user=$Param->{user}, password=$Param->{password}\n";
$Param->{dbh}=DBI->connect("DBI:mysql:host=$Param->{host}",$Param->{user},$Param->{password},{PrintError=>0}); $Param->{dbh}=DBI->connect("DBI:mysql:host=$Param->{host}".($Param->{socket}?";mysql_socket=$Param->{socket}":""),$Param->{user},$Param->{password},{PrintError=>0});
if (DBI::err()) { if (DBI::err()) {
print "Error: " . DBI::errstr() . "\n"; print "Error: " . DBI::errstr() . "\n";
} }
...@@ -313,6 +315,8 @@ Usage: $0 [OPTIONS] < LOGFILE ...@@ -313,6 +315,8 @@ Usage: $0 [OPTIONS] < LOGFILE
-u=USERNAME -u=USERNAME
--password=PASSWORD password of db-user --password=PASSWORD password of db-user
-p=PASSWORD -p=PASSWORD
--socket=SOCKET mysqld socket file to connect
-s=SOCKET
Read logfile from STDIN an try to EXPLAIN all SELECT statements. All UPDATE statements are rewritten to an EXPLAIN SELECT statement. The results of the EXPLAIN statement are collected and counted. All results with type=ALL are collected in an separete list. Results are printed to STDOUT. Read logfile from STDIN an try to EXPLAIN all SELECT statements. All UPDATE statements are rewritten to an EXPLAIN SELECT statement. The results of the EXPLAIN statement are collected and counted. All results with type=ALL are collected in an separete list. Results are printed to STDOUT.
...@@ -344,7 +348,7 @@ Then add indices to avoid table scans and remove those which aren't used. ...@@ -344,7 +348,7 @@ Then add indices to avoid table scans and remove those which aren't used.
=head1 USAGE =head1 USAGE
explain_log.pl [--date=YYMMDD] --host=dbhost] [--user=dbuser] [--password=dbpw] < logfile explain_log.pl [--date=YYMMDD] --host=dbhost] [--user=dbuser] [--password=dbpw] [--socket=/path/to/socket] < logfile
--date=YYMMDD select only entrys of date --date=YYMMDD select only entrys of date
...@@ -362,14 +366,19 @@ explain_log.pl [--date=YYMMDD] --host=dbhost] [--user=dbuser] [--password=dbpw] ...@@ -362,14 +366,19 @@ explain_log.pl [--date=YYMMDD] --host=dbhost] [--user=dbuser] [--password=dbpw]
-p=PASSWORD -p=PASSWORD
--socket=SOCKET change path to the socket
-s=SOCKET
=head1 EXAMPLE =head1 EXAMPLE
explain_log.pl --host=localhost --user=foo --password=bar < /var/lib/mysql/mobile.log explain_log.pl --host=localhost --user=foo --password=bar < /var/lib/mysql/mobile.log
=head1 AUTHOR =head1 AUTHORS
Stefan Nitz Stefan Nitz
Jan Willamowius <jan@mobile.de>, http://www.mobile.de Jan Willamowius <jan@mobile.de>, http://www.mobile.de
Dennis Haney <davh@davh.dk> (Added socket support)
=head1 RECRUITING =head1 RECRUITING
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
# mysql.server works by first doing a cd to the base directory and from there # mysql.server works by first doing a cd to the base directory and from there
# executing mysqld_safe # executing mysqld_safe
KILL_MYSQLD=1;
trap '' 1 2 3 15 # we shouldn't let anyone kill us trap '' 1 2 3 15 # we shouldn't let anyone kill us
umask 007 umask 007
...@@ -34,6 +36,9 @@ parse_arguments() { ...@@ -34,6 +36,9 @@ parse_arguments() {
for arg do for arg do
case "$arg" in case "$arg" in
--skip-kill-mysqld*)
KILL_MYSQLD=0;
;;
# these get passed explicitly to mysqld # these get passed explicitly to mysqld
--basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;; --basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
--datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;; --datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
...@@ -70,6 +75,7 @@ parse_arguments() { ...@@ -70,6 +75,7 @@ parse_arguments() {
MYSQLD="mysqld" MYSQLD="mysqld"
fi fi
;; ;;
--nice=*) niceness=`echo "$arg" | sed -e "s;--nice=;;"` ;;
*) *)
if test -n "$pick_args" if test -n "$pick_args"
then then
...@@ -82,6 +88,7 @@ parse_arguments() { ...@@ -82,6 +88,7 @@ parse_arguments() {
done done
} }
MY_PWD=`pwd` MY_PWD=`pwd`
# Check if we are starting this relative (for the binary release) # Check if we are starting this relative (for the binary release)
if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \ if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
...@@ -110,6 +117,7 @@ fi ...@@ -110,6 +117,7 @@ fi
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@} MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}
MYSQL_TCP_PORT=${MYSQL_TCP_PORT:-@MYSQL_TCP_PORT@} MYSQL_TCP_PORT=${MYSQL_TCP_PORT:-@MYSQL_TCP_PORT@}
user=@MYSQLD_USER@ user=@MYSQLD_USER@
niceness=0
# Use the mysqld-max binary by default if the user doesn't specify a binary # Use the mysqld-max binary by default if the user doesn't specify a binary
if test -x $ledir/mysqld-max if test -x $ledir/mysqld-max
...@@ -167,7 +175,12 @@ export MYSQL_UNIX_PORT ...@@ -167,7 +175,12 @@ export MYSQL_UNIX_PORT
export MYSQL_TCP_PORT export MYSQL_TCP_PORT
NOHUP_NICENESS="nohup" if test $niceness -eq 0
then
NOHUP_NICENESS="nohup"
else
NOHUP_NICENESS="nohup nice -$niceness"
fi
# Using nice with no args to get the niceness level is GNU-specific. # Using nice with no args to get the niceness level is GNU-specific.
# This check could be extended for other operating systems (e.g., # This check could be extended for other operating systems (e.g.,
...@@ -198,8 +211,10 @@ then ...@@ -198,8 +211,10 @@ then
nice --$nice_value_diff echo testing > /dev/null 2>&1 nice --$nice_value_diff echo testing > /dev/null 2>&1
then then
# nohup increases the priority (bad), and we are permitted # nohup increases the priority (bad), and we are permitted
# to lower the priority # to lower the priority with respect to the value the user
NOHUP_NICENESS="nice --$nice_value_diff nohup" # might have been given
niceness=`expr $niceness - $nice_value_diff`
NOHUP_NICENESS="nice -$niceness nohup"
fi fi
fi fi
else else
...@@ -289,7 +304,7 @@ do ...@@ -289,7 +304,7 @@ do
break break
fi fi
if @IS_LINUX@ if test @IS_LINUX@ -a $KILL_MYSQLD -eq 1
then then
# Test if one process was hanging. # Test if one process was hanging.
# This is only a fix for Linux (running as base 3 mysqld processes) # This is only a fix for Linux (running as base 3 mysqld processes)
......
...@@ -1137,6 +1137,22 @@ longlong Item_extract::val_int() ...@@ -1137,6 +1137,22 @@ longlong Item_extract::val_int()
return 0; // Impossible return 0; // Impossible
} }
bool Item_extract::eq(const Item *item, bool binary_cmp) const
{
if (this == item)
return 1;
if (item->type() != FUNC_ITEM ||
func_name() != ((Item_func*)item)->func_name())
return 0;
Item_extract* ie= (Item_extract*)item;
if (ie->int_type != int_type)
return 0;
if (!args[0]->eq(ie->args[0], binary_cmp))
return 0;
return 1;
}
void Item_typecast::print(String *str) void Item_typecast::print(String *str)
{ {
......
...@@ -422,6 +422,7 @@ class Item_extract :public Item_int_func ...@@ -422,6 +422,7 @@ class Item_extract :public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "extract"; } const char *func_name() const { return "extract"; }
void fix_length_and_dec(); void fix_length_and_dec();
bool eq(const Item *item, bool binary_cmp) const;
unsigned int size_of() { return sizeof(*this);} unsigned int size_of() { return sizeof(*this);}
}; };
......
...@@ -4292,7 +4292,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -4292,7 +4292,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
break; break;
case OPT_SAFEMALLOC_MEM_LIMIT: case OPT_SAFEMALLOC_MEM_LIMIT:
#if !defined(DBUG_OFF) && defined(SAFEMALLOC) #if !defined(DBUG_OFF) && defined(SAFEMALLOC)
safemalloc_mem_limit = atoi(argument); sf_malloc_mem_limit = atoi(argument);
#endif #endif
break; break;
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
......
...@@ -1208,9 +1208,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1208,9 +1208,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
opened_tables,refresh_version, cached_tables(), opened_tables,refresh_version, cached_tables(),
uptime ? (float)thd->query_id/(float)uptime : 0); uptime ? (float)thd->query_id/(float)uptime : 0);
#ifdef SAFEMALLOC #ifdef SAFEMALLOC
if (lCurMemory) // Using SAFEMALLOC if (sf_malloc_cur_memory) // Using SAFEMALLOC
sprintf(strend(buff), " Memory in use: %ldK Max memory used: %ldK", sprintf(strend(buff), " Memory in use: %ldK Max memory used: %ldK",
(lCurMemory+1023L)/1024L,(lMaxMemory+1023L)/1024L); (sf_malloc_cur_memory+1023L)/1024L,
(sf_malloc_max_memory+1023L)/1024L);
#endif #endif
VOID(my_net_write(net, buff,(uint) strlen(buff))); VOID(my_net_write(net, buff,(uint) strlen(buff)));
VOID(net_flush(net)); VOID(net_flush(net));
...@@ -2476,8 +2477,10 @@ mysql_execute_command(void) ...@@ -2476,8 +2477,10 @@ mysql_execute_command(void)
res = mysql_ha_close(thd, tables); res = mysql_ha_close(thd, tables);
break; break;
case SQLCOM_HA_READ: case SQLCOM_HA_READ:
if (check_db_used(thd,tables) || /* there is no need to check for table permissions here, because
check_table_access(thd,SELECT_ACL, tables)) if a user has no permissions to read a table, he won't be
able to open it (with SQLCOM_HA_OPEN) in the first place. */
if (check_db_used(thd,tables))
goto error; goto error;
res = mysql_ha_read(thd, tables, lex->ha_read_mode, lex->backup_dir, res = mysql_ha_read(thd, tables, lex->ha_read_mode, lex->backup_dir,
lex->insert_list, lex->ha_rkey_mode, select_lex->where, lex->insert_list, lex->ha_rkey_mode, select_lex->where,
......
...@@ -327,7 +327,7 @@ install -m755 $MBD/support-files/mysql.server $RBR/etc/init.d/mysql ...@@ -327,7 +327,7 @@ install -m755 $MBD/support-files/mysql.server $RBR/etc/init.d/mysql
# Create a symlink "rcmysql", pointing to the init.script. SuSE users # Create a symlink "rcmysql", pointing to the init.script. SuSE users
# will appreciate that, as all services usually offer this. # will appreciate that, as all services usually offer this.
ln -s ../../sbin/init.d/mysql $RPM_BUILD_ROOT/usr/sbin/rcmysql ln -s ../../etc/init.d/mysql $RPM_BUILD_ROOT/usr/sbin/rcmysql
# Create symbolic compatibility link safe_mysqld -> mysqld_safe # Create symbolic compatibility link safe_mysqld -> mysqld_safe
# (safe_mysqld will be gone in MySQL 4.1) # (safe_mysqld will be gone in MySQL 4.1)
......
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