Commit cedaeb4b authored by marko@hundin.mysql.fi's avatar marko@hundin.mysql.fi

Merge marko@bk-internal.mysql.com:/home/bk/mysql-4.1

into hundin.mysql.fi:/home/marko/mysql-4.1
parents dd20809e 50a6dc4e
...@@ -57,7 +57,7 @@ unlink $temp or warn "Unable to remove tempfile ($!)\n"; ...@@ -57,7 +57,7 @@ unlink $temp or warn "Unable to remove tempfile ($!)\n";
# First get some info # First get some info
$fullname =~ s,/+$,,; # Remove ending slash if any $fullname =~ s,/+$,,; # Remove ending slash if any
$fullname =~ /^((mysql)-\w+-?\w+?)-([\d\.]+\w?)-.+$/ $fullname =~ /^((mysql)(?:-\w+){1,3})-([\d\.]+\w?)-.+$/
or die "This name is not what I expected - \"$fullname\""; or die "This name is not what I expected - \"$fullname\"";
$default{"name"}= $2; $default{"name"}= $2;
......
...@@ -137,6 +137,8 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -137,6 +137,8 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
keyinfo->write_key= hp_write_key; keyinfo->write_key= hp_write_key;
keyinfo->hash_buckets= 0; keyinfo->hash_buckets= 0;
} }
if ((keyinfo->flag & HA_AUTO_KEY) && create_info->with_auto_increment)
share->auto_key= i + 1;
} }
share->min_records= min_records; share->min_records= min_records;
share->max_records= max_records; share->max_records= max_records;
...@@ -147,7 +149,6 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -147,7 +149,6 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
share->keys= keys; share->keys= keys;
share->max_key_length= max_length; share->max_key_length= max_length;
share->changed= 0; share->changed= 0;
share->auto_key= create_info->auto_key;
share->auto_key_type= create_info->auto_key_type; share->auto_key_type= create_info->auto_key_type;
share->auto_increment= create_info->auto_increment; share->auto_increment= create_info->auto_increment;
/* Must be allocated separately for rename to work */ /* Must be allocated separately for rename to work */
......
...@@ -183,10 +183,10 @@ typedef struct st_heap_info ...@@ -183,10 +183,10 @@ typedef struct st_heap_info
typedef struct st_heap_create_info typedef struct st_heap_create_info
{ {
uint auto_key;
uint auto_key_type; uint auto_key_type;
ulong max_table_size; ulong max_table_size;
ulonglong auto_increment; ulonglong auto_increment;
my_bool with_auto_increment;
} HP_CREATE_INFO; } HP_CREATE_INFO;
/* Prototypes for heap-functions */ /* Prototypes for heap-functions */
......
...@@ -249,3 +249,45 @@ a ...@@ -249,3 +249,45 @@ a
3 3
2 2
drop table t1; drop table t1;
create table t1 (a bigint unsigned auto_increment primary key, b int,
key (b, a)) engine=heap;
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
select * from t1;
a b
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
drop table t1;
create table t1 (a int not null, b int not null auto_increment,
primary key(a, b), key(b)) engine=heap;
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
select * from t1;
a b
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
drop table t1;
...@@ -195,3 +195,32 @@ delete from t1 where a is null; ...@@ -195,3 +195,32 @@ delete from t1 where a is null;
insert into t1 values ('2'), ('3'); insert into t1 values ('2'), ('3');
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Bug #8489: Strange auto_increment behaviour
#
create table t1 (a bigint unsigned auto_increment primary key, b int,
key (b, a)) engine=heap;
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
insert t1 (b) values (1);
select * from t1;
drop table t1;
create table t1 (a int not null, b int not null auto_increment,
primary key(a, b), key(b)) engine=heap;
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
insert t1 (a) values (1);
select * from t1;
drop table t1;
...@@ -452,8 +452,11 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -452,8 +452,11 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
if (*killed) if (*killed)
{ {
DBUG_PRINT("info",("Sort killed by user")); DBUG_PRINT("info",("Sort killed by user"));
if (!indexfile && !quick_select)
{
(void) file->extra(HA_EXTRA_NO_CACHE); (void) file->extra(HA_EXTRA_NO_CACHE);
file->ha_rnd_end(); file->ha_rnd_end();
}
DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
} }
if (error == 0) if (error == 0)
......
...@@ -446,6 +446,7 @@ int ha_heap::create(const char *name, TABLE *table_arg, ...@@ -446,6 +446,7 @@ int ha_heap::create(const char *name, TABLE *table_arg,
HA_KEYSEG *seg; HA_KEYSEG *seg;
char buff[FN_REFLEN]; char buff[FN_REFLEN];
int error; int error;
bool found_real_auto_increment= 0;
for (key= parts= 0; key < table_arg->keys; key++) for (key= parts= 0; key < table_arg->keys; key++)
parts+= table_arg->key_info[key].key_parts; parts+= table_arg->key_info[key].key_parts;
...@@ -506,17 +507,20 @@ int ha_heap::create(const char *name, TABLE *table_arg, ...@@ -506,17 +507,20 @@ int ha_heap::create(const char *name, TABLE *table_arg,
seg->null_bit= 0; seg->null_bit= 0;
seg->null_pos= 0; seg->null_pos= 0;
} }
// We have to store field->key_type() as seg->type can differ from it
if (field->flags & AUTO_INCREMENT_FLAG) if (field->flags & AUTO_INCREMENT_FLAG)
{
auto_key= key + 1;
auto_key_type= field->key_type(); auto_key_type= field->key_type();
} }
} }
if (table_arg->found_next_number_field)
{
keydef[table_arg->next_number_index].flag|= HA_AUTO_KEY;
found_real_auto_increment= table_arg->next_number_key_offset == 0;
} }
mem_per_row+= MY_ALIGN(table_arg->reclength + 1, sizeof(char*)); mem_per_row+= MY_ALIGN(table_arg->reclength + 1, sizeof(char*));
HP_CREATE_INFO hp_create_info; HP_CREATE_INFO hp_create_info;
hp_create_info.auto_key= auto_key;
hp_create_info.auto_key_type= auto_key_type; hp_create_info.auto_key_type= auto_key_type;
hp_create_info.with_auto_increment= found_real_auto_increment;
hp_create_info.auto_increment= (create_info->auto_increment_value ? hp_create_info.auto_increment= (create_info->auto_increment_value ?
create_info->auto_increment_value - 1 : 0); create_info->auto_increment_value - 1 : 0);
hp_create_info.max_table_size=current_thd->variables.max_heap_table_size; hp_create_info.max_table_size=current_thd->variables.max_heap_table_size;
......
...@@ -54,6 +54,17 @@ else ...@@ -54,6 +54,17 @@ else
bindir="$basedir/bin" bindir="$basedir/bin"
fi fi
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
source $lsb_functions
else
alias log_success_msg="echo \ SUCCESS! "
alias log_failure_msg="echo \ ERROR! "
fi
PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin
export PATH export PATH
...@@ -75,6 +86,20 @@ parse_arguments() { ...@@ -75,6 +86,20 @@ parse_arguments() {
done done
} }
wait_for_pid () {
for((i=0; i<35; i++)); do
sleep 1
test -s $pid_file && i='' && break
echo $echo_n ".$echo_c"
done
if test -z "$i" ; then
log_success_msg
else
log_failure_msg
fi
}
# Get arguments from the my.cnf file, # Get arguments from the my.cnf file,
# groups [mysqld] [mysql_server] and [mysql.server] # groups [mysqld] [mysql_server] and [mysql.server]
if test -x ./bin/my_print_defaults if test -x ./bin/my_print_defaults
...@@ -151,14 +176,17 @@ case "$mode" in ...@@ -151,14 +176,17 @@ case "$mode" in
then then
# Give extra arguments to mysqld with the my.cnf file. This script may # Give extra arguments to mysqld with the my.cnf file. This script may
# be overwritten at next upgrade. # be overwritten at next upgrade.
echo $echo_n "Starting MySQL"
$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file >/dev/null 2>&1 & $bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file >/dev/null 2>&1 &
wait_for_pid
# Make lock for RedHat / SuSE # Make lock for RedHat / SuSE
if test -w /var/lock/subsys if test -w /var/lock/subsys
then then
touch /var/lock/subsys/mysql touch /var/lock/subsys/mysql
fi fi
else else
echo "Can't execute $bindir/mysqld_safe from dir $basedir" log_failure_msg "Can't execute $bindir/mysqld_safe"
fi fi
;; ;;
...@@ -168,29 +196,18 @@ case "$mode" in ...@@ -168,29 +196,18 @@ case "$mode" in
if test -s "$pid_file" if test -s "$pid_file"
then then
mysqld_pid=`cat $pid_file` mysqld_pid=`cat $pid_file`
echo "Killing mysqld with pid $mysqld_pid" echo $echo_n "Shutting down MySQL"
kill $mysqld_pid kill $mysqld_pid
# mysqld should remove the pid_file when it exits, so wait for it. # mysqld should remove the pid_file when it exits, so wait for it.
wait_for_pid
sleep 1
while [ -s $pid_file -a "$flags" != aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ]
do
[ -z "$flags" ] && echo $echo_n "Wait for mysqld to exit$echo_c" || echo $echo_n ".$echo_c"
flags=a$flags
sleep 1
done
if [ -s $pid_file ]
then echo " gave up waiting!"
elif [ -n "$flags" ]
then echo " done"
fi
# delete lock for RedHat / SuSE # delete lock for RedHat / SuSE
if test -f /var/lock/subsys/mysql if test -f /var/lock/subsys/mysql
then then
rm -f /var/lock/subsys/mysql rm -f /var/lock/subsys/mysql
fi fi
else else
echo "No mysqld pid file found. Looked for $pid_file." log_failure_msg "MySQL PID file could not be found!"
fi fi
;; ;;
...@@ -201,9 +218,19 @@ case "$mode" in ...@@ -201,9 +218,19 @@ case "$mode" in
$0 start $0 start
;; ;;
'reload')
if test -s "$pid_file" ; then
mysqld_pid=`cat $pid_file`
kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
touch $pid_file
else
log_failure_msg "MySQL PID file could not be found!"
fi
;;
*) *)
# usage # usage
echo "Usage: $0 start|stop|restart" echo "Usage: $0 start|stop|restart|reload"
exit 1 exit 1
;; ;;
esac esac
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