diff --git a/Build-tools/Bootstrap b/Build-tools/Bootstrap index 969ab748e80..9f5fc37736d 100755 --- a/Build-tools/Bootstrap +++ b/Build-tools/Bootstrap @@ -30,6 +30,7 @@ chomp ($LOGFILE= `pwd`); $LOGFILE.= "/Bootstrap.log"; chomp ($opt_directory= `pwd`); $opt_docdir= $opt_directory . "/mysqldoc"; +$opt_build_command= undef; $opt_changelog= undef; $opt_delete= undef; $opt_dry_run= undef; @@ -44,6 +45,7 @@ $opt_skip_manual= undef; $version= "unknown"; GetOptions( + "build-command|b=s", "changelog|c:s", "directory|d=s", "delete", @@ -54,7 +56,6 @@ GetOptions( "log|l:s", "mail|m=s", "revision|r=s", - "revision|r=s", "skip-check|s", "skip-manual", "suffix=s", @@ -81,6 +82,14 @@ if (defined $opt_log) } } +# +# Override predefined build command +# +if (defined $opt_build_command) +{ + $build_command= $opt_build_command; +} + print_help("") if ($opt_help); defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!"); @@ -329,36 +338,41 @@ archive is being created. Options: --c, --changelog[=] Add a ChangeLog [down to revision ] - This will automatically be included in the source - distribution. To get a ChangeLog down to the last - tagged Changeset, simply use "last" as the revision - number. ---delete Delete an already existing distribution directory - in the target directory instead of renaming it. --d, --directory= Specify the target directory - (default is "$opt_directory") ---docdir= Use the MySQL documentation BK tree located in in - (default is "$opt_docdir") ---dry-run Dry run without executing --e, --export-only Just export (and add the ChangeLog, if requested), - do not build or test the source distribution --h, --help Print this help message --l, --log[=] Write a log file [to ] - (default is "$LOGFILE") --m, --mail=
Mail a failure report to the given address (and - include a log file snippet, if logging is enabled) - Note that the \@-Sign needs to be quoted! - Example: --mail=user\\\@domain.com --r, --revision= Export the tree as of revision - (default is up to the latest revision) --s, --skip-check Skip checking the distribution with "make distcheck" ---skip-manual Skip updating the manual from the mysqldoc tree ---suffix= Append to the version number in configure.in. - Using the special suffix "YMD" will add the current - date as the suffix (e.g. "-20020518"). --t, --test Run the test suite after build --v, --verbose Be verbose +-b, --build-command= Use to compile the sources before packing + the distribution. + (default is "$build_command") +-c, --changelog[=] Add a ChangeLog [down to revision ] + This will automatically be included in the source + distribution. To get a ChangeLog down to the last + tagged Changeset, simply use "last" as the revision + number. +--delete Delete an already existing distribution directory + in the target directory instead of renaming it. +-d, --directory= Specify the target directory + (default is "$opt_directory") +--docdir= Use the MySQL documentation BK tree located + in + (default is "$opt_docdir") +--dry-run Dry run without executing +-e, --export-only Just export (and add the ChangeLog, if requested), + do not build or test the source distribution +-h, --help Print this help message +-l, --log[=] Write a log file [to ] + (default is "$LOGFILE") +-m, --mail=
Mail a failure report to the given address (and + include a log file snippet, if logging is enabled) + Note that the \@-Sign needs to be quoted! + Example: --mail=user\\\@domain.com +-r, --revision= Export the tree as of revision + (default is up to the latest revision) +-s, --skip-check Skip checking the distribution with "make distcheck" +--skip-manual Skip updating the manual from the mysqldoc tree +--suffix= Append to the version number in + configure.in. Using the special suffix "YMD" will + add the current date as the suffix + (e.g. "-20020518"). +-t, --test Run the test suite after build +-v, --verbose Be verbose Example: diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index 0694e284115..f73c4d7f8af 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -569,3 +569,22 @@ a MAX(b) MAKE_SET(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 1 4 c 10 43 a,b,d,f drop table t1; +create table t1 (id int not null, qty int not null); +insert into t1 values (1,2),(1,3),(2,4),(2,5); +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sum(qty)>2 and cqty>1; +id sqty cqty +1 5 2 +2 9 2 +select id, sum(qty) as sqty from t1 group by id having sqty>2 and count(qty)>1; +id sqty +1 5 +2 9 +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sqty>2 and cqty>1; +id sqty cqty +1 5 2 +2 9 2 +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sum(qty)>2 and count(qty)>1; +id sqty cqty +1 5 2 +2 9 2 +drop table t1; diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test index 5875f9a9ba9..9e5ee4b8b2a 100644 --- a/mysql-test/t/group_by.test +++ b/mysql-test/t/group_by.test @@ -417,3 +417,15 @@ select a, MAX(b), CONCAT_WS(MAX(b), '43', '4', '5') from t1 group by a; select a, MAX(b), ELT(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f') from t1 group by a; select a, MAX(b), MAKE_SET(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') from t1 group by a; drop table t1; + +# +# Problem with group by and alias +# + +create table t1 (id int not null, qty int not null); +insert into t1 values (1,2),(1,3),(2,4),(2,5); +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sum(qty)>2 and cqty>1; +select id, sum(qty) as sqty from t1 group by id having sqty>2 and count(qty)>1; +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sqty>2 and cqty>1; +select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sum(qty)>2 and count(qty)>1; +drop table t1; diff --git a/sql-bench/crash-me.sh b/sql-bench/crash-me.sh index 79090e3e6db..61468d69fb1 100644 --- a/sql-bench/crash-me.sh +++ b/sql-bench/crash-me.sh @@ -2210,6 +2210,40 @@ if ($limits{'foreign_key'} eq 'yes') } } +if ($limits{'func_sql_character_length'} eq 'yes') +{ + my $result = 'error'; + my ($resultset); + my $key = 'length_of_varchar_field'; + my $prompt='CHARACTER_LENGTH(varchar_field)'; + print $prompt," = "; + if (!defined($limits{$key})) { + save_incomplete($key,$prompt); + safe_query_l($key,[ + "CREATE TABLE crash_me1 (S1 VARCHAR(100))", + "INSERT INTO crash_me1 VALUES ('X')" + ]); + my $recset = get_recordset($key, + "SELECT CHARACTER_LENGTH(S1) FROM crash_me1"); + print_recordset($key,$recset); + if (defined($recset)){ + if ( $recset->[0][0] eq 1 ) { + $result = 'actual length'; + } elsif( $recset->[0][0] eq 100 ) { + $result = 'defined length'; + }; + } else { + add_log($key,$DBI::errstr); + } + safe_query_l($key, "drop table crash_me1 $drop_attr"); + save_config_data($key,$result,$prompt); + } else { + $result = $limits{$key}; + }; + print "$result\n"; +} + + check_constraint("Column constraints","constraint_check", "create table crash_q (a int check (a>0))", "insert into crash_q values(0)", @@ -2873,6 +2907,81 @@ sub make_date { } +sub print_recordset{ + my ($key,$recset) = @_; + my $rec; + foreach $rec (@$recset) + { + add_log($key, " > ".join(',', map(repr($_), @$rec))); + } +} + +# +# read result recordset from sql server. +# returns arrayref to (arrayref to) values +# or undef (in case of sql errors) +# +sub get_recordset{ + my ($key,$query) = @_; + add_log($key, "< $query"); + return $dbh->selectall_arrayref($query); +} + +# function for comparing recordset (that was returned by get_recordset) +# and arrayref of (arrayref of) values. +# +# returns : zero if recordset equal that array, 1 if it doesn't equal +# +# parameters: +# $key - current operation (for logging) +# $recset - recordset +# $mustbe - array of values that we expect +# +# example: $a=get_recordset('some_parameter','select a,b from c'); +# if (compare_recordset('some_parameter',$a,[[1,1],[1,2],[1,3]]) neq 0) +# { +# print "unexpected result\n"; +# } ; +# +sub compare_recordset { + my ($key,$recset,$mustbe) = @_; + my $rec,$recno,$fld,$fldno,$fcount; + add_log($key,"\n Check recordset:"); + $recno=0; + foreach $rec (@$recset) + { + add_log($key," " . join(',', map(repr($_),@$rec)) . " expected: " . + join(',', map(repr($_), @{$mustbe->[$recno]} ) )); + $fcount = @$rec; + $fcount--; + foreach $fldno (0 .. $fcount ) + { + if ($mustbe->[$recno][$fldno] ne $rec->[$fldno]) + { + add_log($key," Recordset doesn't correspond with template"); + return 1; + }; + } + $recno++; + } + add_log($key," Recordset corresponds with template"); + return 0; +} + +# +# converts inner perl value to printable representation +# for example: undef maps to 'NULL', +# string -> 'string' +# int -> int +# +sub repr { + my $s = shift; + return "'$s'"if ($s =~ /\D/); + return 'NULL'if ( not defined($s)); + return $s; +} + + sub version { print "$0 Ver $version\n"; diff --git a/sql/item.cc b/sql/item.cc index 0046f53c6fb..4fefae7358f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -665,6 +665,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables) maybe_null= (*ref)->maybe_null; decimals= (*ref)->decimals; binary= (*ref)->binary; + with_sum_func= (*ref)->with_sum_func; } return 0; } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ad7ccaf8f38..1bb1fd9d39a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2061,6 +2061,16 @@ mysql_execute_command(void) { if (check_table_access(thd,DROP_ACL,tables)) goto error; /* purecov: inspected */ + /* + If this is a slave thread, we may sometimes execute some + DROP / * 40005 TEMPORARY * / TABLE + that come from parts of binlogs (likely if we use RESET SLAVE or CHANGE + MASTER TO), while the temporary table has already been dropped. + To not generate such irrelevant "table does not exist errors", we silently + add IF EXISTS if TEMPORARY was used. + */ + if (thd->slave_thread && lex->drop_temporary) + lex->drop_if_exists= 1; if (end_active_trans(thd)) res= -1; else