summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sasha@asksasha.com>2005-09-19 15:45:01 -0600
committerunknown <sasha@asksasha.com>2005-09-19 15:45:01 -0600
commit5cf25d8019db1800c63e080aba87b825c90301f6 (patch)
tree4e3f9a564dd7b81e605425aa8182904e36250c20
parentce7e95d41d7c8aa2fef96728d8b2036ff22b5e5c (diff)
parentf903f8e3a2af33c7269dfe9f4434e7585a87798e (diff)
downloadmariadb-git-5cf25d8019db1800c63e080aba87b825c90301f6.tar.gz
Merge spachev@bk-internal.mysql.com:/home/bk/mysql-4.1
into asksasha.com:/reiser-data/mysql-dev/mysql-4.1-bug11139
-rw-r--r--client/mysqltest.c43
-rw-r--r--man/which.254
-rwxr-xr-xmysql-test/mysql-test-run.pl21
-rw-r--r--mysql-test/r/innodb.result9
-rw-r--r--mysql-test/t/innodb.test9
-rw-r--r--ndb/src/ndbapi/Ndbinit.cpp3
-rw-r--r--ndb/src/ndbapi/ObjectMap.hpp33
-rw-r--r--sql/opt_sum.cc3
8 files changed, 90 insertions, 85 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 374f0cb1336..f5facccee3a 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -97,6 +97,10 @@
#define DEFAULT_DELIMITER ";"
#define MAX_DELIMITER 16
+#define RESULT_OK 0
+#define RESULT_CONTENT_MISMATCH 1
+#define RESULT_LENGTH_MISMATCH 2
+
enum {OPT_MANAGER_USER=256,OPT_MANAGER_HOST,OPT_MANAGER_PASSWD,
OPT_MANAGER_PORT,OPT_MANAGER_WAIT_TIMEOUT, OPT_SKIP_SAFEMALLOC,
OPT_SSL_SSL, OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH,
@@ -650,7 +654,7 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname)
{
DBUG_PRINT("info",("Size differs: result size: %u file size: %u",
ds->length, stat_info.st_size));
- DBUG_RETURN(2);
+ DBUG_RETURN(RESULT_LENGTH_MISMATCH);
}
if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME))))
die(NullS);
@@ -667,7 +671,7 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname)
res_ptr = res_ds.str;
if ((res_len = res_ds.length) != ds->length)
{
- res = 2;
+ res= RESULT_LENGTH_MISMATCH;
goto err;
}
}
@@ -677,7 +681,8 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname)
res_len = stat_info.st_size;
}
- res = (memcmp(res_ptr, ds->str, res_len)) ? 1 : 0;
+ res= (memcmp(res_ptr, ds->str, res_len)) ?
+ RESULT_CONTENT_MISMATCH : RESULT_OK;
err:
if (res && eval_result)
@@ -694,21 +699,21 @@ err:
static int check_result(DYNAMIC_STRING* ds, const char *fname,
my_bool require_option)
{
- int error = 0;
- int res=dyn_string_cmp(ds, fname);
+ int error= RESULT_OK;
+ int res= dyn_string_cmp(ds, fname);
if (res && require_option)
abort_not_supported_test();
switch (res) {
- case 0:
+ case RESULT_OK:
break; /* ok */
- case 2:
+ case RESULT_LENGTH_MISMATCH:
verbose_msg("Result length mismatch");
- error = 1;
+ error= RESULT_LENGTH_MISMATCH;
break;
- case 1:
+ case RESULT_CONTENT_MISMATCH:
verbose_msg("Result content mismatch");
- error = 1;
+ error= RESULT_CONTENT_MISMATCH;
break;
default: /* impossible */
die("Unknown error code from dyn_string_cmp()");
@@ -3738,8 +3743,9 @@ int main(int argc, char **argv)
{
int error = 0;
struct st_query *q;
- my_bool require_file=0, q_send_flag=0;
+ my_bool require_file=0, q_send_flag=0, query_executed= 0;
char save_file[FN_REFLEN];
+ MY_STAT res_info;
MY_INIT(argv[0]);
{
DBUG_ENTER("main");
@@ -3932,6 +3938,7 @@ int main(int argc, char **argv)
save_file[0]=0;
}
error |= run_query(&cur_con->mysql, q, flags);
+ query_executed= 1;
q->last_argument= q->end;
break;
}
@@ -3952,6 +3959,7 @@ int main(int argc, char **argv)
is given on this connection.
*/
error |= run_query(&cur_con->mysql, q, QUERY_SEND);
+ query_executed= 1;
q->last_argument= q->end;
break;
case Q_RESULT:
@@ -3992,6 +4000,7 @@ int main(int argc, char **argv)
break;
case Q_EXEC:
do_exec(q);
+ query_executed= 1;
break;
case Q_START_TIMER:
/* Overwrite possible earlier start of timer */
@@ -4048,6 +4057,18 @@ int main(int argc, char **argv)
parser.current_line += current_line_inc;
}
+ if (!query_executed && result_file && my_stat(result_file, &res_info, 0))
+ {
+ /*
+ my_stat() successful on result file. Check if we have not run a
+ single query, but we do have a result file that contains data.
+ Note that we don't care, if my_stat() fails. For example for
+ non-existing or non-readable file we assume it's fine to have
+ no query output from the test file, e.g. regarded as no error.
+ */
+ if (res_info.st_size)
+ error|= (RESULT_CONTENT_MISMATCH | RESULT_LENGTH_MISMATCH);
+ }
if (result_file && ds_res.length && !error)
{
if (!record)
diff --git a/man/which.2 b/man/which.2
deleted file mode 100644
index 30d5557ed01..00000000000
--- a/man/which.2
+++ /dev/null
@@ -1,54 +0,0 @@
-.TH WHICH 1 "20 December 2000"
-.SH NAME
-which - Jani please supply one.
-.SH USAGE
-which [options] [--] programname [...]
-.SH SYNOPSIS
-.B which
-.RB [ \-\-version | \-[vV] ]
-.RB [ \-\-skip\-dot ]
-.RB [ \-\-skip\-tilde ]
-.RB [ \-\-show\-dot ]
-.RB [ \-\-show\-tilde ]
-.RB [ \-\-tty\-only ]
-.RB [ \-\-all | \-a ]
-.RB [ \-\-read\-alias | \-i ]
-.RB [ \-\-skip\-alias ]
-.SH DESCRIPTION
-.TP
-.BR which
-supports by executing
-.TP
-.BR \-\-version | \-[vV]
-Print version and exit successfully.
-.TP
-.BR \-\-skip\-dot
-Skip directories in PATH that start with a dot.
-.TP
-.BR \-\-skip\-tilde
-Skip directories in PATH that start with a tilde.
-.TP
-.BR \-\-show\-dot
-Don\'t expand a dot to current directory in output.
-.TP
-.BR \-\-show\-tilde
-Output a tilde for HOME directory for non-root.
-.TP
-.BR \-\-tty\-only
-Stop processing options on the right if not on tty.
-.TP
-.BR \-\-all | \-a
-Print all matches in PATH, not just the first
-.TP
-.BR \-\-read\-alias | \-i
-Read list of aliases from stdin.
-.TP
-.BR \-\-skip\-alias
-Ignore option
-.BR --read-alias;
-don\'t read stdin.
-.SH "SEE ALSO"
-isamchk (1), isamlog (1), mysqlaccess (1), mysqladmin (1), mysqlbug (1), mysqld (1), mysqldump (1), mysqlshow (1), msql2mysql (1), perror (1), replace (1), mysqld_safe (1), which1 (1), zap (1),
-.SH AUTHOR
-Ver 1.0, distribution 3.23.29a Michael (Monty) Widenius (monty@tcx.se), TCX Datakonsult AB (http://www.tcx.se). This software comes with no warranty. Manual page by L. (Kill-9) Pedersen (kill-9@kill-9.dk), Mercurmedia Data Model Architect / system developer (http://www.mercurmedia.com)
-.\" end of man page \ No newline at end of file
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index cfb67dcae7c..cd182e8fc73 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -258,6 +258,7 @@ our $opt_user;
our $opt_user_test;
our $opt_valgrind;
+our $opt_valgrind_mysqltest;
our $opt_valgrind_all;
our $opt_valgrind_options;
@@ -512,6 +513,7 @@ sub command_line_setup () {
'gcov' => \$opt_gcov,
'gprof' => \$opt_gprof,
'valgrind:s' => \$opt_valgrind,
+ 'valgrind-mysqltest:s' => \$opt_valgrind_mysqltest,
'valgrind-all:s' => \$opt_valgrind_all,
'valgrind-options=s' => \$opt_valgrind_options,
@@ -696,9 +698,15 @@ sub command_line_setup () {
# "" option set with no argument
# "somestring" option is name/path of valgrind executable
- if ( defined $opt_valgrind_all and ! $opt_valgrind )
+ # Take executable path from any of them, if any
+ $opt_valgrind= $opt_valgrind_mysqltest if $opt_valgrind_mysqltest;
+ $opt_valgrind= $opt_valgrind_all if $opt_valgrind_all;
+
+ # If valgrind flag not defined, define if other valgrind flags are
+ unless ( defined $opt_valgrind )
{
- $opt_valgrind= $opt_valgrind_all;
+ $opt_valgrind= ""
+ if defined $opt_valgrind_mysqltest or defined $opt_valgrind_all;
}
if ( ! $opt_testcase_timeout )
@@ -2110,7 +2118,7 @@ sub run_mysqltest ($) {
mtr_init_args(\$args);
- if ( defined $opt_valgrind )
+ if ( defined $opt_valgrind_mysqltest )
{
valgrind_arguments($args, \$exe);
}
@@ -2208,6 +2216,8 @@ sub valgrind_arguments {
mtr_add_arg($args, "--alignment=8");
mtr_add_arg($args, "--leak-check=yes");
mtr_add_arg($args, "--num-callers=16");
+ mtr_add_arg($args, "--suppressions=%s/valgrind.supp", $glob_mysql_test_dir)
+ if -f "$glob_mysql_test_dir/valgrind.supp";
if ( defined $opt_valgrind_all )
{
@@ -2293,10 +2303,11 @@ Options for coverage, profiling etc
gcov FIXME
gprof FIXME
- valgrind[=exe] Run the "mysqltest" executable as well as the "mysqld"
+ valgrind[=EXE] Run the "mysqltest" executable as well as the "mysqld"
server using valgrind, optionally specifying the
executable path/name
- valgrind-all FIXME
+ valgrind-mysqltest[=EXE] In addition, run the "mysqltest" executable with valgrind
+ valgrind-all[=EXE] Adds verbose flag, and --show-reachable to valgrind
valgrind-options=ARGS Extra options to give valgrind
Misc options
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index f47c78c9768..c7aef8ed792 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -1685,3 +1685,12 @@ explain select * from t1 order by a,b,c,d;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using filesort
drop table t1;
+create table t1 (a char(1), b char(1), key(a, b)) engine=innodb;
+insert into t1 values ('8', '6'), ('4', '7');
+select min(a) from t1;
+min(a)
+4
+select min(b) from t1 where a='8';
+min(b)
+6
+drop table t1;
diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test
index a14370c6543..b966ea5b281 100644
--- a/mysql-test/t/innodb.test
+++ b/mysql-test/t/innodb.test
@@ -1230,4 +1230,13 @@ select * from t1 order by a,b,c,d;
explain select * from t1 order by a,b,c,d;
drop table t1;
+#
+# BUG#11039,#13218 Wrong key length in min()
+#
+
+create table t1 (a char(1), b char(1), key(a, b)) engine=innodb;
+insert into t1 values ('8', '6'), ('4', '7');
+select min(a) from t1;
+select min(b) from t1 where a='8';
+drop table t1;
# End of 4.1 tests
diff --git a/ndb/src/ndbapi/Ndbinit.cpp b/ndb/src/ndbapi/Ndbinit.cpp
index a11dd842495..cbb344d3680 100644
--- a/ndb/src/ndbapi/Ndbinit.cpp
+++ b/ndb/src/ndbapi/Ndbinit.cpp
@@ -296,7 +296,8 @@ NdbImpl::NdbImpl(Ndb_cluster_connection *ndb_cluster_connection,
: m_ndb_cluster_connection(ndb_cluster_connection->m_impl),
m_dictionary(ndb),
theCurrentConnectIndex(0),
- theNdbObjectIdMap(1024,1024),
+ theNdbObjectIdMap(ndb_cluster_connection->m_impl.m_transporter_facade->theMutexPtr,
+ 1024,1024),
theNoOfDBnodes(0)
{
int i;
diff --git a/ndb/src/ndbapi/ObjectMap.hpp b/ndb/src/ndbapi/ObjectMap.hpp
index 21407279f0b..c730d1ce6b1 100644
--- a/ndb/src/ndbapi/ObjectMap.hpp
+++ b/ndb/src/ndbapi/ObjectMap.hpp
@@ -30,7 +30,7 @@ class NdbObjectIdMap //: NdbLockable
{
public:
STATIC_CONST( InvalidId = ~(Uint32)0 );
- NdbObjectIdMap(Uint32 initalSize = 128, Uint32 expandSize = 10);
+ NdbObjectIdMap(NdbMutex*, Uint32 initalSize = 128, Uint32 expandSize = 10);
~NdbObjectIdMap();
Uint32 map(void * object);
@@ -46,14 +46,16 @@ private:
void * m_obj;
} * m_map;
+ NdbMutex * m_mutex;
void expand(Uint32 newSize);
};
inline
-NdbObjectIdMap::NdbObjectIdMap(Uint32 sz, Uint32 eSz) {
+NdbObjectIdMap::NdbObjectIdMap(NdbMutex* mutex, Uint32 sz, Uint32 eSz) {
m_size = 0;
m_firstFree = InvalidId;
m_map = 0;
+ m_mutex = mutex;
m_expandSize = eSz;
expand(sz);
#ifdef DEBUG_OBJECTMAP
@@ -131,21 +133,26 @@ NdbObjectIdMap::getObject(Uint32 id){
inline void
NdbObjectIdMap::expand(Uint32 incSize){
+ NdbMutex_Lock(m_mutex);
Uint32 newSize = m_size + incSize;
- MapEntry * tmp = (MapEntry*)malloc(newSize * sizeof(MapEntry));
+ MapEntry * tmp = (MapEntry*)realloc(m_map, newSize * sizeof(MapEntry));
- if (m_map) {
- memcpy(tmp, m_map, m_size * sizeof(MapEntry));
- free((void*)m_map);
+ if (likely(tmp != 0))
+ {
+ m_map = tmp;
+
+ for(Uint32 i = m_size; i<newSize; i++){
+ m_map[i].m_next = i + 1;
+ }
+ m_firstFree = m_size;
+ m_map[newSize-1].m_next = InvalidId;
+ m_size = newSize;
}
- m_map = tmp;
-
- for(Uint32 i = m_size; i<newSize; i++){
- m_map[i].m_next = i + 1;
+ else
+ {
+ ndbout_c("NdbObjectIdMap::expand unable to expand!!");
}
- m_firstFree = m_size;
- m_map[newSize-1].m_next = InvalidId;
- m_size = newSize;
+ NdbMutex_Unlock(m_mutex);
}
#endif
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 4ab506cc4e1..cb8e3c2d273 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -661,7 +661,8 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
If key_part2 may be NULL, then we want to find the first row
that is not null
*/
- ref->key_buff[ref->key_length++]= 1;
+ ref->key_buff[ref->key_length]= 1;
+ ref->key_length+= part->store_length;
*range_fl&= ~NO_MIN_RANGE;
*range_fl|= NEAR_MIN; // > NULL
}