Commit acbfb38c authored by lenz@mysql.com's avatar lenz@mysql.com

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

into mysql.com:/space/my/mysql-4.1
parents 1abd960e 4958b543
...@@ -100,4 +100,4 @@ tags: ...@@ -100,4 +100,4 @@ tags:
# Test installation # Test installation
test: test:
cd mysql-test; ./mysql-test-run && ./mysql-test-run --ps-protocol cd mysql-test; perl mysql-test-run.pl && perl mysql-test-run.pl --ps-protocol
...@@ -322,6 +322,10 @@ SOURCE=..\mysys\mulalloc.c ...@@ -322,6 +322,10 @@ SOURCE=..\mysys\mulalloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\mysys\my_access.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_alloc.c SOURCE=..\mysys\my_alloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -295,6 +295,10 @@ SOURCE=..\mysys\mulalloc.c ...@@ -295,6 +295,10 @@ SOURCE=..\mysys\mulalloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\mysys\my_access.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_alloc.c SOURCE=..\mysys\my_alloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -989,7 +989,8 @@ static int read_lines(bool execute_commands) ...@@ -989,7 +989,8 @@ static int read_lines(bool execute_commands)
a nil, it still needs the space in the linebuffer for it. This is, a nil, it still needs the space in the linebuffer for it. This is,
naturally, undocumented. naturally, undocumented.
*/ */
} while (linebuffer[0] <= linebuffer[1] + 1); } while ((unsigned char)linebuffer[0] <=
(unsigned char)linebuffer[1] + 1);
line= buffer.c_ptr(); line= buffer.c_ptr();
#endif /* __NETWARE__ */ #endif /* __NETWARE__ */
#else #else
......
...@@ -398,7 +398,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query, ...@@ -398,7 +398,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
Hack: instead of init_queue, we'll use reinit queue to be able Hack: instead of init_queue, we'll use reinit queue to be able
to alloc queue with alloc_root() to alloc queue with alloc_root()
*/ */
res=ftb->queue.max_elements=1+query_len/(min(ft_min_word_len,2)+1); res=ftb->queue.max_elements=1+query_len/2;
if (!(ftb->queue.root= if (!(ftb->queue.root=
(byte **)alloc_root(&ftb->mem_root, (res+1)*sizeof(void*)))) (byte **)alloc_root(&ftb->mem_root, (res+1)*sizeof(void*))))
goto err; goto err;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# and is part of the translation of the Bourne shell script with the # and is part of the translation of the Bourne shell script with the
# same name. # same name.
use File::Basename;
use strict; use strict;
sub collect_test_cases ($); sub collect_test_cases ($);
...@@ -39,6 +40,7 @@ sub collect_test_cases ($) { ...@@ -39,6 +40,7 @@ sub collect_test_cases ($) {
if ( @::opt_cases ) if ( @::opt_cases )
{ {
foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort
$tname= basename($tname, ".test");
my $elem= "$tname.test"; my $elem= "$tname.test";
if ( ! -f "$testdir/$elem") if ( ! -f "$testdir/$elem")
{ {
...@@ -161,52 +163,73 @@ sub collect_one_test_case($$$$$) { ...@@ -161,52 +163,73 @@ sub collect_one_test_case($$$$$) {
my $slave_sh= "$testdir/$tname-slave.sh"; my $slave_sh= "$testdir/$tname-slave.sh";
my $disabled= "$testdir/$tname.disabled"; my $disabled= "$testdir/$tname.disabled";
$tinfo->{'master_opt'}= ["--default-time-zone=+3:00"]; $tinfo->{'master_opt'}= $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
$tinfo->{'slave_opt'}= ["--default-time-zone=+3:00"]; $tinfo->{'slave_opt'}= $::glob_win32 ? ["--default-time-zone=+3:00"] : [];
$tinfo->{'slave_mi'}= []; $tinfo->{'slave_mi'}= [];
if ( -f $master_opt_file ) if ( -f $master_opt_file )
{ {
$tinfo->{'master_restart'}= 1; # We think so for now $tinfo->{'master_restart'}= 1; # We think so for now
# This is a dirty hack from old mysql-test-run, we use the opt file
# to flag other things as well, it is not a opt list at all
$tinfo->{'master_opt'}= mtr_get_opts_from_file($master_opt_file);
foreach my $opt (@{$tinfo->{'master_opt'}}) MASTER_OPT:
{ {
my $value; my $master_opt= mtr_get_opts_from_file($master_opt_file);
$value= mtr_match_prefix($opt, "--timezone="); foreach my $opt ( @$master_opt )
if ( defined $value )
{ {
$tinfo->{'timezone'}= $value; my $value;
$tinfo->{'master_opt'}= [];
$tinfo->{'master_restart'}= 0;
last;
}
$value= mtr_match_prefix($opt, "--result-file="); # This is a dirty hack from old mysql-test-run, we use the opt
# file to flag other things as well, it is not a opt list at
# all
if ( defined $value ) $value= mtr_match_prefix($opt, "--timezone=");
{ if ( defined $value )
$tinfo->{'result_file'}= "r/$value.result"; {
if ( $::opt_result_ext and $::opt_record or $tinfo->{'timezone'}= $value;
-f "$tinfo->{'result_file'}$::opt_result_ext") $tinfo->{'skip'}= 1 if $::glob_win32; # FIXME server unsets TZ
last MASTER_OPT;
}
$value= mtr_match_prefix($opt, "--result-file=");
if ( defined $value )
{
$tinfo->{'result_file'}= "r/$value.result";
if ( $::opt_result_ext and $::opt_record or
-f "$tinfo->{'result_file'}$::opt_result_ext")
{
$tinfo->{'result_file'}.= $::opt_result_ext;
}
$tinfo->{'master_restart'}= 0;
last MASTER_OPT;
}
# If we set default time zone, remove the one we have
$value= mtr_match_prefix($opt, "--default-time-zone=");
if ( defined $value )
{ {
$tinfo->{'result_file'}.= $::opt_result_ext; $tinfo->{'master_opt'}= [];
} }
$tinfo->{'master_opt'}= [];
$tinfo->{'master_restart'}= 0;
last;
} }
# Ok, this was a real option list, add it
push(@{$tinfo->{'master_opt'}}, @$master_opt);
} }
} }
if ( -f $slave_opt_file ) if ( -f $slave_opt_file )
{ {
$tinfo->{'slave_opt'}= mtr_get_opts_from_file($slave_opt_file);
$tinfo->{'slave_restart'}= 1; $tinfo->{'slave_restart'}= 1;
my $slave_opt= mtr_get_opts_from_file($slave_opt_file);
foreach my $opt ( @$slave_opt )
{
# If we set default time zone, remove the one we have
my $value= mtr_match_prefix($opt, "--default-time-zone=");
$tinfo->{'slave_opt'}= [] if defined $value;
}
push(@{$tinfo->{'slave_opt'}}, @$slave_opt);
} }
if ( -f $slave_mi_file ) if ( -f $slave_mi_file )
......
...@@ -9,6 +9,9 @@ use strict; ...@@ -9,6 +9,9 @@ use strict;
sub mtr_full_hostname (); sub mtr_full_hostname ();
sub mtr_init_args ($); sub mtr_init_args ($);
sub mtr_add_arg ($$); sub mtr_add_arg ($$);
sub mtr_path_exists(@);
sub mtr_script_exists(@);
sub mtr_exe_exists(@);
############################################################################## ##############################################################################
# #
...@@ -47,4 +50,53 @@ sub mtr_add_arg ($$) { ...@@ -47,4 +50,53 @@ sub mtr_add_arg ($$) {
push(@$args, sprintf($format, @fargs)); push(@$args, sprintf($format, @fargs));
} }
##############################################################################
sub mtr_path_exists (@) {
foreach my $path ( @_ )
{
return $path if -e $path;
}
if ( @_ == 1 )
{
mtr_error("Could not find $_[0]");
}
else
{
mtr_error("Could not find any of " . join(" ", @_));
}
}
sub mtr_script_exists (@) {
foreach my $path ( @_ )
{
return $path if -x $path;
}
if ( @_ == 1 )
{
mtr_error("Could not find $_[0]");
}
else
{
mtr_error("Could not find any of " . join(" ", @_));
}
}
sub mtr_exe_exists (@) {
foreach my $path ( @_ )
{
$path.= ".exe" if $::opt_win32;
return $path if -x $path;
}
if ( @_ == 1 )
{
mtr_error("Could not find $_[0]");
}
else
{
mtr_error("Could not find any of " . join(" ", @_));
}
}
1; 1;
...@@ -38,6 +38,13 @@ sub mtr_show_failed_diff ($) { ...@@ -38,6 +38,13 @@ sub mtr_show_failed_diff ($) {
my $result_file= "r/$tname.result"; my $result_file= "r/$tname.result";
my $eval_file= "r/$tname.eval"; my $eval_file= "r/$tname.eval";
if ( $::opt_suite ne "main" )
{
$reject_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$reject_file";
$result_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$result_file";
$eval_file= "$::glob_mysql_test_dir/suite/$::opt_suite/$eval_file";
}
if ( -f $eval_file ) if ( -f $eval_file )
{ {
$result_file= $eval_file; $result_file= $eval_file;
......
This diff is collapsed.
...@@ -338,7 +338,7 @@ insert into t2 values (3, 1, 'xxbuz'); ...@@ -338,7 +338,7 @@ insert into t2 values (3, 1, 'xxbuz');
select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode); select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode);
t1_id name t2_id t1_id name t1_id name t2_id t1_id name
1 data1 1 1 xxfoo 1 data1 1 1 xxfoo
select * from t2 where match name against ('a* b* c* d* e* f*' in boolean mode); select * from t2 where match name against ('*a*b*c*d*e*f*' in boolean mode);
t2_id t1_id name t2_id t1_id name
drop table t1,t2; drop table t1,t2;
create table t1 (a text, fulltext key (a)); create table t1 (a text, fulltext key (a));
......
...@@ -722,3 +722,22 @@ WHERE hostname LIKE '%aol%' ...@@ -722,3 +722,22 @@ WHERE hostname LIKE '%aol%'
GROUP BY hostname; GROUP BY hostname;
hostname no hostname no
cache-dtc-af05.proxy.aol.com 1 cache-dtc-af05.proxy.aol.com 1
DROP TABLE t1;
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (1,2), (1,3);
SELECT a, b FROM t1 GROUP BY 'const';
a b
1 2
SELECT DISTINCT a, b FROM t1 GROUP BY 'const';
a b
1 2
DROP TABLE t1;
CREATE TABLE t1 (id INT, dt DATETIME);
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
SELECT dt DIV 1 AS f, id FROM t1 GROUP BY f;
f id
20050501123000 1
DROP TABLE t1;
...@@ -557,3 +557,9 @@ id ...@@ -557,3 +557,9 @@ id
3 3
deallocate prepare stmt; deallocate prepare stmt;
drop table t1, t2; drop table t1, t2;
create table t1 (id int);
prepare stmt from "insert into t1 (id) select id from t1 union select id from t1";
execute stmt;
execute stmt;
deallocate prepare stmt;
drop table t1;
...@@ -253,9 +253,9 @@ insert into t2 values (3, 1, 'xxbuz'); ...@@ -253,9 +253,9 @@ insert into t2 values (3, 1, 'xxbuz');
select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode); select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode);
# #
# bug with many short (< ft_min_word_len) words in boolean search # Bug #7858: bug with many short (< ft_min_word_len) words in boolean search
# #
select * from t2 where match name against ('a* b* c* d* e* f*' in boolean mode); select * from t2 where match name against ('*a*b*c*d*e*f*' in boolean mode);
drop table t1,t2; drop table t1,t2;
# #
......
# Initialise # Initialise
--disable_warnings --disable_warnings
drop table if exists t1,t2,t3; drop table if exists t1,t2,t3;
...@@ -524,7 +525,7 @@ select min(b) from t1; ...@@ -524,7 +525,7 @@ select min(b) from t1;
drop table t1; drop table t1;
# #
# Test for bug #11088: GROUP BY a BLOB colimn with COUNT(DISTINCT column1) # Test for bug #11088: GROUP BY a BLOB column with COUNT(DISTINCT column1)
# #
CREATE TABLE t1 (id int PRIMARY KEY, user_id int, hostname longtext); CREATE TABLE t1 (id int PRIMARY KEY, user_id int, hostname longtext);
...@@ -539,3 +540,28 @@ SELECT hostname, COUNT(DISTINCT user_id) as no FROM t1 ...@@ -539,3 +540,28 @@ SELECT hostname, COUNT(DISTINCT user_id) as no FROM t1
WHERE hostname LIKE '%aol%' WHERE hostname LIKE '%aol%'
GROUP BY hostname; GROUP BY hostname;
DROP TABLE t1;
#
# Test for bug #8614: GROUP BY 'const' with DISTINCT
#
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (1,2), (1,3);
SELECT a, b FROM t1 GROUP BY 'const';
SELECT DISTINCT a, b FROM t1 GROUP BY 'const';
DROP TABLE t1;
#
# Test for bug #11385: GROUP BY for datetime converted to decimals
#
CREATE TABLE t1 (id INT, dt DATETIME);
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
INSERT INTO t1 VALUES ( 1, '2005-05-01 12:30:00' );
SELECT dt DIV 1 AS f, id FROM t1 GROUP BY f;
DROP TABLE t1;
...@@ -569,3 +569,15 @@ select t2.id from t2, t1 where (t1.id=1 and t2.t1_id=t1.id); ...@@ -569,3 +569,15 @@ select t2.id from t2, t1 where (t1.id=1 and t2.t1_id=t1.id);
deallocate prepare stmt; deallocate prepare stmt;
drop table t1, t2; drop table t1, t2;
#
# Bug#11060 "Server crashes on calling stored procedure with INSERT SELECT
# UNION SELECT" aka "Server crashes on re-execution of prepared INSERT ...
# SELECT with UNION".
#
create table t1 (id int);
prepare stmt from "insert into t1 (id) select id from t1 union select id from t1";
execute stmt;
execute stmt;
deallocate prepare stmt;
drop table t1;
...@@ -104,8 +104,8 @@ DEFS = -DMYSQL_SERVER \ ...@@ -104,8 +104,8 @@ DEFS = -DMYSQL_SERVER \
-DDATADIR="\"$(MYSQLDATAdir)\"" \ -DDATADIR="\"$(MYSQLDATAdir)\"" \
-DSHAREDIR="\"$(MYSQLSHAREdir)\"" \ -DSHAREDIR="\"$(MYSQLSHAREdir)\"" \
@DEFS@ @DEFS@
# Don't put lex_hash.h in BUILT_SOURCES as this will give infinite recursion
BUILT_SOURCES = sql_yacc.cc sql_yacc.h BUILT_SOURCES = sql_yacc.cc sql_yacc.h lex_hash.h
EXTRA_DIST = udf_example.cc $(BUILT_SOURCES) EXTRA_DIST = udf_example.cc $(BUILT_SOURCES)
AM_YFLAGS = -d AM_YFLAGS = -d
...@@ -123,9 +123,6 @@ link_sources: mysql_tzinfo_to_sql.cc ...@@ -123,9 +123,6 @@ link_sources: mysql_tzinfo_to_sql.cc
rm -f my_time.c rm -f my_time.c
@LN_CP_F@ ../sql-common/my_time.c my_time.c @LN_CP_F@ ../sql-common/my_time.c my_time.c
gen_lex_hash.o: gen_lex_hash.cc lex.h
$(CXXCOMPILE) -c $(INCLUDES) $<
mysql_tzinfo_to_sql.o: $(mysql_tzinfo_to_sql_SOURCES) mysql_tzinfo_to_sql.o: $(mysql_tzinfo_to_sql_SOURCES)
$(CXXCOMPILE) -c $(INCLUDES) -DTZINFO2SQL $< $(CXXCOMPILE) -c $(INCLUDES) -DTZINFO2SQL $<
...@@ -140,13 +137,9 @@ sql_yacc.o: sql_yacc.cc sql_yacc.h $(HEADERS) ...@@ -140,13 +137,9 @@ sql_yacc.o: sql_yacc.cc sql_yacc.h $(HEADERS)
@echo "If it fails, re-run configure with --with-low-memory" @echo "If it fails, re-run configure with --with-low-memory"
$(CXXCOMPILE) $(LM_CFLAGS) -c $< $(CXXCOMPILE) $(LM_CFLAGS) -c $<
lex_hash.h: lex.h gen_lex_hash.cc sql_yacc.h lex_hash.h: gen_lex_hash$(EXEEXT)
$(MAKE) gen_lex_hash$(EXEEXT)
./gen_lex_hash$(EXEEXT) > $@ ./gen_lex_hash$(EXEEXT) > $@
# Hack to ensure that lex_hash.h is built early
sql_lex.o: lex_hash.h
# For testing of udf_example.so; Works on platforms with gcc # For testing of udf_example.so; Works on platforms with gcc
# (This is not part of our build process but only provided as an example) # (This is not part of our build process but only provided as an example)
udf_example.so: udf_example.cc udf_example.so: udf_example.cc
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#endif #endif
#define NOT_FIXED_DEC 31 #define NOT_FIXED_DEC 31
#define DATETIME_DEC 6
class Send_field; class Send_field;
class Protocol; class Protocol;
...@@ -861,6 +862,7 @@ public: ...@@ -861,6 +862,7 @@ public:
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
#endif #endif
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
uint decimals() const { return DATETIME_DEC; }
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr); int store(longlong nr);
......
...@@ -1578,10 +1578,21 @@ bool delayed_insert::handle_inserts(void) ...@@ -1578,10 +1578,21 @@ bool delayed_insert::handle_inserts(void)
int int
select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u) select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
{ {
int res;
LEX *lex= thd->lex;
SELECT_LEX *lex_current_select_save= lex->current_select;
DBUG_ENTER("select_insert::prepare"); DBUG_ENTER("select_insert::prepare");
unit= u; unit= u;
if (check_insert_fields(thd, table, *fields, values)) /*
Since table in which we are going to insert is added to the first
select, LEX::current_select should point to the first select while
we are fixing fields from insert list.
*/
lex->current_select= &lex->select_lex;
res= check_insert_fields(thd, table, *fields, values);
lex->current_select= lex_current_select_save;
if (res)
DBUG_RETURN(1); DBUG_RETURN(1);
restore_record(table,default_values); // Get empty record restore_record(table,default_values); // Get empty record
......
...@@ -678,9 +678,14 @@ JOIN::optimize() ...@@ -678,9 +678,14 @@ JOIN::optimize()
DBUG_RETURN(1); DBUG_RETURN(1);
} }
simple_group= 0; simple_group= 0;
group_list= remove_const(this, group_list, conds, {
rollup.state == ROLLUP::STATE_NONE, ORDER *old_group_list;
&simple_group); group_list= remove_const(this, (old_group_list= group_list), conds,
rollup.state == ROLLUP::STATE_NONE,
&simple_group);
if (old_group_list && !group_list)
select_distinct= 0;
}
if (!group_list && group) if (!group_list && group)
{ {
order=0; // The output has only one row order=0; // The output has only one row
......
...@@ -379,6 +379,7 @@ int vio_close_pipe(Vio * vio) ...@@ -379,6 +379,7 @@ int vio_close_pipe(Vio * vio)
void vio_ignore_timeout(Vio *vio __attribute__((unused)), void vio_ignore_timeout(Vio *vio __attribute__((unused)),
uint which __attribute__((unused)),
uint timeout __attribute__((unused))) uint timeout __attribute__((unused)))
{ {
} }
......
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