diff --git a/.bzrignore b/.bzrignore index 608a414ae20..460ea002bff 100644 --- a/.bzrignore +++ b/.bzrignore @@ -396,6 +396,7 @@ libmysqld/gstream.cc libmysqld/ha_archive.cc libmysqld/ha_berkeley.cc libmysqld/ha_example.cc +libmysqld/ha_federated.cc libmysqld/ha_heap.cc libmysqld/ha_innobase.cc libmysqld/ha_innodb.cc @@ -1036,6 +1037,7 @@ test/tools/verify_index test_xml tests/client_test tests/connect_test +tests/mysql_client_test thread_test tmp/* tools/my_vsnprintf.c diff --git a/client/mysql.cc b/client/mysql.cc index e178f79bcf3..bbba5be1cdf 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1430,12 +1430,6 @@ static void build_completion_hash(bool rehash, bool write_info) if (status.batch || quick || !current_db) DBUG_VOID_RETURN; // We don't need completion in batches - if (tables) - { - mysql_free_result(tables); - tables=0; - } - /* hash SQL commands */ while (cmd->name) { add_word(&ht,(char*) cmd->name); @@ -1681,8 +1675,8 @@ static int com_server_help(String *buffer __attribute__((unused)), else if (num_fields >= 2 && num_rows) { init_pager(); - char last_char; - + char last_char= 0; + int num_name= 0, num_cat= 0; LINT_INIT(num_name); LINT_INIT(num_cat); @@ -1693,7 +1687,6 @@ static int com_server_help(String *buffer __attribute__((unused)), put_info("To make a more specific request, please type 'help ',\nwhere is one of the following", INFO_INFO); num_name= 0; num_cat= 1; - last_char= '_'; } else if ((cur= mysql_fetch_row(result))) { @@ -1703,7 +1696,7 @@ static int com_server_help(String *buffer __attribute__((unused)), num_cat= 2; print_help_item(&cur,1,2,&last_char); } - + while ((cur= mysql_fetch_row(result))) print_help_item(&cur,num_name,num_cat,&last_char); tee_fprintf(PAGER, "\n"); diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 7036deab2fe..6917797c03c 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -780,11 +780,7 @@ static int check_master_version(MYSQL* mysql, if (mysql_query(mysql, "SELECT VERSION()") || !(res = mysql_store_result(mysql))) - { - mysql_close(mysql); - die("Error checking master version: %s", - mysql_error(mysql)); - } + die("Error checking master version: %s", mysql_error(mysql)); if (!(row = mysql_fetch_row(res))) { mysql_free_result(res); diff --git a/client/mysqldump.c b/client/mysqldump.c index 9b707af6107..757521fe935 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -2436,8 +2436,7 @@ static const char *check_if_ignore_table(const char *table_name) fprintf(stderr, "Error: Couldn't read status information for table %s (%s)\n", table_name, mysql_error(sock)); - if (res) - mysql_free_result(res); + mysql_free_result(res); return 0; /* assume table is ok */ } if (!(row[1])) @@ -2448,7 +2447,7 @@ static const char *check_if_ignore_table(const char *table_name) strcmp(row[1], (result= "MRG_ISAM"))) result= 0; } - mysql_free_result(res); + mysql_free_result(res); return result; } diff --git a/client/mysqltest.c b/client/mysqltest.c index 9e887f61160..4d03746a5e5 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -733,9 +733,10 @@ VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw, die("Empty variable"); } length= (uint) (var_name - save_var_name); + if (length >= MAX_VAR_NAME) + die("Too long variable name: %s", save_var_name); - if (!(v = (VAR*) hash_search(&var_hash, save_var_name, length)) && - length < MAX_VAR_NAME) + if (!(v = (VAR*) hash_search(&var_hash, save_var_name, length))) { char buff[MAX_VAR_NAME+1]; strmake(buff, save_var_name, length); diff --git a/include/my_global.h b/include/my_global.h index e8f93ee5d7a..21ba4331cb1 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -1084,7 +1084,7 @@ do { doubleget_union _tmp; \ #define float4store(V,M) memcpy_fixed((byte*) V,(byte*) (&M),sizeof(float)) #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) -#define doublestore(T,V) do { *(T)= ((byte *) &V)[4];\ +#define doublestore(T,V) do { *(((char*)T)+0)=(char) ((byte *) &V)[4];\ *(((char*)T)+1)=(char) ((byte *) &V)[5];\ *(((char*)T)+2)=(char) ((byte *) &V)[6];\ *(((char*)T)+3)=(char) ((byte *) &V)[7];\ diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 7c6b4e31ab5..c6815d2a5ce 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3077,7 +3077,7 @@ static my_bool int_is_null_false= 0; values and mysql_stmt_execute() the statement. See also: mysql_stmt_send_long_data() for sending long text/blob - data in pieces, examples in tests/client_test.c. + data in pieces, examples in tests/mysql_client_test.c. Next steps you might want to make: - execute statement with mysql_stmt_execute(), - reset statement using mysql_stmt_reset() or reprepare it with diff --git a/libmysqld/examples/Makefile.am b/libmysqld/examples/Makefile.am index ba646e282b5..85c76df1513 100644 --- a/libmysqld/examples/Makefile.am +++ b/libmysqld/examples/Makefile.am @@ -1,6 +1,7 @@ -noinst_PROGRAMS = mysqltest mysql client_test -client_sources = $(mysqltest_SOURCES) $(mysql_SOURCES) -tests_sources= $(client_test_SOURCES) +noinst_PROGRAMS = mysql +bin_PROGRAMS = mysqltest_embedded mysql_client_test_embedded +client_sources = $(mysqltest_embedded_SOURCES) $(mysql_SOURCES) +tests_sources= $(mysql_client_test_embedded_SOURCES) link_sources: for f in $(client_sources); do \ @@ -19,16 +20,16 @@ INCLUDES = @MT_INCLUDES@ -I$(top_srcdir)/include -I$(srcdir) \ LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @innodb_system_libs@ @LIBDL@ $(CXXLDFLAGS) -mysqltest_LINK = $(CXXLINK) -mysqltest_SOURCES = mysqltest.c -mysqltest_LDADD = $(LDADD) $(top_builddir)/regex/libregex.a +mysqltest_embedded_LINK = $(CXXLINK) +mysqltest_embedded_SOURCES = mysqltest.c +mysqltest_embedded_LDADD = $(LDADD) $(top_builddir)/regex/libregex.a mysql_SOURCES = mysql.cc readline.cc completion_hash.cc \ my_readline.h sql_string.h completion_hash.h mysql_LDADD = @readline_link@ @TERMCAP_LIB@ $(LDADD) -client_test_LINK = $(CXXLINK) -client_test_SOURCES = client_test.c +mysql_client_test_embedded_LINK = $(CXXLINK) +mysql_client_test_embedded_SOURCES = mysql_client_test.c clean: rm -f $(client_sources) diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index c38bffed665..4e66bd92a94 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -346,11 +346,12 @@ static void _ftb_init_index_search(FT_INFO *ftb) if (ftbe->flags & FTB_FLAG_NO || /* 2 */ ftbe->up->ythresh - ftbe->up->yweaks >1) /* 1 */ { - FTB_EXPR *top_ftbe=ftbe->up->up; + FTB_EXPR *top_ftbe=ftbe->up; ftbw->docid[0]=HA_OFFSET_ERROR; - for (ftbe=ftbw->up; ftbe != top_ftbe; ftbe=ftbe->up) - if (!(ftbe->flags & FTB_FLAG_NO)) - ftbe->yweaks++; + for (ftbe=(FTB_EXPR *)ftbw; + ftbe != top_ftbe && !(ftbe->flags & FTB_FLAG_NO); + ftbe=ftbe->up) + ftbe->up->yweaks++; ftbe=0; break; } @@ -364,7 +365,7 @@ static void _ftb_init_index_search(FT_INFO *ftb) else reset_tree(& ftb->no_dupes); } - + if (_ft2_search(ftb, ftbw, 1)) return; } diff --git a/myisam/mi_packrec.c b/myisam/mi_packrec.c index 62d15c03266..a8a27858d79 100644 --- a/myisam/mi_packrec.c +++ b/myisam/mi_packrec.c @@ -184,21 +184,14 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys) my_malloc((length+OFFSET_TABLE_SIZE)*sizeof(uint16)+ (uint) (share->pack.header_length+7), MYF(MY_WME | MY_ZEROFILL)))) - { - my_free((gptr) share->decode_trees,MYF(0)); goto err1; - } tmp_buff=share->decode_tables+length; disk_cache=(byte*) (tmp_buff+OFFSET_TABLE_SIZE); if (my_read(file,disk_cache, (uint) (share->pack.header_length-sizeof(header)), MYF(MY_NABP))) - { - my_free((gptr) share->decode_trees,MYF(0)); - my_free((gptr) share->decode_tables,MYF(0)); goto err2; - } huff_tree_bits=max_bit(trees ? trees-1 : 0); init_bit_buffer(&bit_buff, (uchar*) disk_cache, diff --git a/myisam/rt_index.c b/myisam/rt_index.c index bdf5ee9c60f..97554dca4e6 100644 --- a/myisam/rt_index.c +++ b/myisam/rt_index.c @@ -948,15 +948,14 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) /* check for redundant root (not leaf, 1 child) and eliminate */ if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) goto err1; - if (!_mi_fetch_keypage(info, keyinfo, old_root, DFLT_INIT_HITS, + if (!_mi_fetch_keypage(info, keyinfo, old_root, DFLT_INIT_HITS, info->buff, 0)) goto err1; nod_flag = mi_test_if_nod(info->buff); page_size = mi_getint(info->buff); - if (nod_flag && (page_size == 2 + key_length + - (nod_flag ? nod_flag : info->s->base.rec_reflength))) + if (nod_flag && (page_size == 2 + key_length + nod_flag)) { - my_off_t new_root = _mi_kpos(nod_flag, + my_off_t new_root = _mi_kpos(nod_flag, rt_PAGE_FIRST_KEY(info->buff, nod_flag)); if (_mi_dispose(info, keyinfo, old_root, DFLT_INIT_HITS)) goto err1; diff --git a/myisam/sort.c b/myisam/sort.c index 09dd45f388c..9d2af2e8c70 100644 --- a/myisam/sort.c +++ b/myisam/sort.c @@ -162,7 +162,10 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, { if (my_init_dynamic_array(&buffpek, sizeof(BUFFPEK), maxbuffer, maxbuffer/2)) + { my_free((gptr) sort_keys,MYF(0)); + sort_keys= 0; + } else break; } diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 953b560fe09..8bff1090fd2 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -499,13 +499,13 @@ DASH72=`$ECHO '-------------------------------------------------------'|$CUT -c # on binary, use what is installed if [ x$SOURCE_DIST = x1 ] ; then if [ "x$USE_EMBEDDED_SERVER" = "x1" ] ; then - if [ -f "$BASEDIR/libmysqld/examples/mysqltest" ] ; then - MYSQL_TEST="$VALGRIND $BASEDIR/libmysqld/examples/mysqltest" + if [ -f "$BASEDIR/libmysqld/examples/mysqltest_embedded" ] ; then + MYSQL_TEST="$VALGRIND $BASEDIR/libmysqld/examples/mysqltest_embedded" else - echo "Fatal error: Cannot find embedded server 'mysqltest'" 1>&2 + echo "Fatal error: Cannot find embedded server 'mysqltest_embedded'" 1>&2 exit 1 fi - TESTS_BINDIR="$BASEDIR/libmysqld/examples" + MYSQL_CLIENT_TEST="$BASEDIR/libmysqld/examples/mysql_client_test_embedded" else MYSQLD="$VALGRIND $BASEDIR/sql/mysqld" if [ -f "$BASEDIR/client/.libs/lt-mysqltest" ] ; then @@ -515,7 +515,7 @@ if [ x$SOURCE_DIST = x1 ] ; then else MYSQL_TEST="$BASEDIR/client/mysqltest" fi - TESTS_BINDIR="$BASEDIR/tests" + MYSQL_CLIENT_TEST="$BASEDIR/tests/mysql_client_test" fi if [ -f "$BASEDIR/client/.libs/mysqldump" ] ; then MYSQL_DUMP="$BASEDIR/client/.libs/mysqldump" @@ -545,6 +545,14 @@ if [ x$SOURCE_DIST = x1 ] ; then NDB_TOOLS_DIR="$BASEDIR/ndb/tools" NDB_MGM="$BASEDIR/ndb/src/mgmclient/ndb_mgm" else + + # We have a binary installation. Note that this can be both from + # unpacking a MySQL AB binary distribution (created using + # "scripts/make_binary_distribution", and from a "make install". + # Unfortunately the structure differs a bit, for a "make install" + # currently all binaries are in "bin", for a MySQL AB packaging + # some are in "tests". + if test -x "$BASEDIR/libexec/mysqld" then MYSQLD="$VALGRIND $BASEDIR/libexec/mysqld" @@ -578,7 +586,23 @@ else else LANGUAGE="$BASEDIR/share/english/" CHARSETSDIR="$BASEDIR/share/charsets" - fi + fi + if [ "x$USE_EMBEDDED_SERVER" = "x1" ] ; then + if [ -f "$CLIENT_BINDIR/mysqltest_embedded" ] ; then + MYSQL_TEST="$VALGRIND $CLIENT_BINDIR/mysqltest_embedded" + else + echo "Fatal error: Cannot find embedded server 'mysqltest_embedded'" 1>&2 + exit 1 + fi + if [ -d "$BASEDIR/tests/mysql_client_test_embedded" ] ; then + MYSQL_CLIENT_TEST="$TESTS_BINDIR/mysql_client_test_embedded" + else + MYSQL_CLIENT_TEST="$CLIENT_BINDIR/mysql_client_test_embedded" + fi + else + MYSQL_TEST="$CLIENT_BINDIR/mysqltest" + MYSQL_CLIENT_TEST="$CLIENT_BINDIR/mysql_client_test" + fi fi if [ -z "$MASTER_MYSQLD" ] @@ -612,13 +636,13 @@ then EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --user=root" fi - +MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST --no-defaults --testcase --user=root --socket=$MASTER_MYSOCK --port=$MYSQL_TCP_PORT --silent" MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD $EXTRA_MYSQLDUMP_OPT" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT" MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose" MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD" export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES -export CLIENT_BINDIR TESTS_BINDIR CHARSETSDIR +export CLIENT_BINDIR MYSQL_CLIENT_TEST CHARSETSDIR export NDB_TOOLS_DIR export NDB_MGM diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index a85cfd4181c..f50cae79608 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -148,6 +148,9 @@ select * from t1 where MATCH a,b AGAINST ('+(support collections) +foobar*' IN B a b select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE); a b +select * from t1 where MATCH a,b AGAINST ('+collections -supp* -foobar*' IN BOOLEAN MODE); +a b +Full-text indexes are called collections select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); a b select * from t1 where MATCH a,b AGAINST('"space model' IN BOOLEAN MODE); diff --git a/mysql-test/t/client_test.test b/mysql-test/t/client_test.test deleted file mode 100644 index 29e7c23ab35..00000000000 --- a/mysql-test/t/client_test.test +++ /dev/null @@ -1,4 +0,0 @@ -# Skip when testing the embedded server ---source include/not_embedded.inc ---disable_result_log ---exec $TESTS_BINDIR/client_test --no-defaults --testcase --user=root --socket=$MASTER_MYSOCK --port=$MYSQL_TCP_PORT --silent diff --git a/mysql-test/t/ctype_cp932.test b/mysql-test/t/ctype_cp932.test old mode 100755 new mode 100644 diff --git a/mysql-test/t/ctype_eucjpms.test b/mysql-test/t/ctype_eucjpms.test old mode 100755 new mode 100644 diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 008e965297f..62dcecaff68 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -67,6 +67,7 @@ select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('+(support collections) +foobar*' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('+(+(support collections)) +foobar*' IN BOOLEAN MODE); +select * from t1 where MATCH a,b AGAINST ('+collections -supp* -foobar*' IN BOOLEAN MODE); select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE); # bug#2708, bug#3870 crash diff --git a/mysql-test/t/mysql_client_test.test b/mysql-test/t/mysql_client_test.test new file mode 100644 index 00000000000..86aecf43cbd --- /dev/null +++ b/mysql-test/t/mysql_client_test.test @@ -0,0 +1,3 @@ +# We run with different binaries for normal and --embedded-server +--disable_result_log +--exec $MYSQL_CLIENT_TEST diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c index 5c9d1434b0c..4967b60cd68 100644 --- a/mysys/mf_keycache.c +++ b/mysys/mf_keycache.c @@ -352,6 +352,7 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, MYF(0)))) break; my_large_free(keycache->block_mem, MYF(0)); + keycache->block_mem= 0; } if (blocks < 8) { diff --git a/mysys/mf_keycaches.c b/mysys/mf_keycaches.c index fee3096de52..38fef31fdd4 100644 --- a/mysys/mf_keycaches.c +++ b/mysys/mf_keycaches.c @@ -275,7 +275,11 @@ static void safe_hash_change(SAFE_HASH *hash, byte *old_data, byte *new_data) if (entry->data == old_data) { if (new_data == hash->default_value) + { + if ((*entry->prev= entry->next)) + entry->next->prev= entry->prev; hash_delete(&hash->hash, (byte*) entry); + } else entry->data= new_data; } diff --git a/mysys/my_open.c b/mysys/my_open.c index ca5c0d8683f..a5cd3811bbf 100644 --- a/mysys/my_open.c +++ b/mysys/my_open.c @@ -69,7 +69,7 @@ File my_open(const char *FileName, int Flags, myf MyFlags) my_close() fd File sescriptor myf Special Flags - + */ int my_close(File fd, myf MyFlags) @@ -79,7 +79,12 @@ int my_close(File fd, myf MyFlags) DBUG_PRINT("my",("fd: %d MyFlags: %d",fd, MyFlags)); pthread_mutex_lock(&THR_LOCK_open); - if ((err = close(fd))) + do + { + err= close(fd); + } while (err == -1 && errno == EINTR); + + if (err) { DBUG_PRINT("error",("Got error %d on close",err)); my_errno=errno; diff --git a/mysys/my_sync.c b/mysys/my_sync.c index 317ca039346..bd372f03c87 100644 --- a/mysys/my_sync.c +++ b/mysys/my_sync.c @@ -40,15 +40,19 @@ int my_sync(File fd, myf my_flags) DBUG_ENTER("my_sync"); DBUG_PRINT("my",("Fd: %d my_flags: %d", fd, my_flags)); + do + { #if defined(HAVE_FDATASYNC) - res= fdatasync(fd); + res= fdatasync(fd); #elif defined(HAVE_FSYNC) - res=fsync(fd); + res= fsync(fd); #elif defined(__WIN__) res= _commit(fd); #else - res= 0; /* No sync (strange OS) */ + res= 0; /* No sync (strange OS) */ #endif + } while (res == -1 && errno == EINTR); + if (res) { if (!(my_errno= errno)) diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c index caef1caaf3d..19611a6027a 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -248,7 +248,7 @@ void thr_end_alarm(thr_alarm_t *alarmed) if (alarm_data->malloced) my_free((gptr) alarm_data,MYF(0)); found++; -#ifndef DBUG_OFF +#ifdef DBUG_OFF break; #endif } diff --git a/ndb/src/common/util/strdup.c b/ndb/src/common/util/strdup.c index afe2306427e..d8f4d99bd28 100644 --- a/ndb/src/common/util/strdup.c +++ b/ndb/src/common/util/strdup.c @@ -21,8 +21,8 @@ char * strdup(const char *s){ void *p2; - p2 = malloc(strlen(s)+1); - strcpy(p2, s); + if ((p2 = malloc(strlen(s)+1))) + strcpy(p2, s); return p2; } #endif diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index 69f9092f1fd..f246f70b8c4 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -126,6 +126,8 @@ else client/.libs/mysqltest client/.libs/mysqlcheck \ client/.libs/mysqlbinlog client/.libs/mysqlmanagerc \ client/.libs/mysqlmanager-pwgen tools/.libs/mysqlmanager \ + tests/.libs/mysql_client_test libmysqld/examples/mysql_client_test_embedded \ + libmysqld/examples/mysqltest_embedded \ "; fi @@ -186,7 +188,7 @@ fi if [ $BASE_SYSTEM != "netware" ] ; then if [ -d tests ] ; then - $CP tests/client_test tests/*.res tests/*.tst tests/*.pl $BASE/tests + $CP tests/*.res tests/*.tst tests/*.pl $BASE/tests fi if [ -d man ] ; then $CP man/*.1 $BASE/man/man1 diff --git a/sql/item_create.cc b/sql/item_create.cc index cec6de3eede..8a5aeb6c9b7 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -358,22 +358,19 @@ Item *create_func_sin(Item* a) Item *create_func_sha(Item* a) { - return new Item_func_sha(a); + return new Item_func_sha(a); } - + Item *create_func_space(Item *a) { CHARSET_INFO *cs= current_thd->variables.collation_connection; Item *sp; - + if (cs->mbminlen > 1) { + uint dummy_errors; sp= new Item_string("",0,cs); - if (sp) - { - uint dummy_errors; - sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors); - } + sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors); } else { diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 5d018b22055..f9843692b7b 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2519,6 +2519,9 @@ String* Item_func_export_set::val_str(String* str) case 3: sep_buf.set(",", 1, default_charset()); sep = &sep_buf; + break; + default: + DBUG_ASSERT(0); // cannot happen } null_value=0; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 0c1cd3cbad3..32813454fef 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2131,20 +2131,25 @@ void Item_char_typecast::print(String *str) String *Item_char_typecast::val_str(String *str) { DBUG_ASSERT(fixed == 1); - String *res, *res1; + String *res; uint32 length; - if (!charset_conversion && !(res= args[0]->val_str(str))) +#if 0 + if (!charset_conversion) { - null_value= 1; - return 0; + if (!(res= args[0]->val_str(str))) + { + null_value= 1; + return 0; + } } else +#endif { // Convert character set if differ uint dummy_errors; - if (!(res1= args[0]->val_str(&tmp_value)) || - str->copy(res1->ptr(), res1->length(), res1->charset(), + if (!(res= args[0]->val_str(&tmp_value)) || + str->copy(res->ptr(), res->length(), res->charset(), cast_cs, &dummy_errors)) { null_value= 1; @@ -2154,13 +2159,13 @@ String *Item_char_typecast::val_str(String *str) } res->set_charset(cast_cs); - + /* Cut the tail if cast with length and the result is longer than cast length, e.g. CAST('string' AS CHAR(1)) */ - if (cast_length >= 0 && + if (cast_length >= 0 && (res->length() > (length= (uint32) res->charpos(cast_length)))) { // Safe even if const arg if (!res->alloced_length()) @@ -2169,7 +2174,7 @@ String *Item_char_typecast::val_str(String *str) res= &str_value; } res->length((uint) length); - } + } null_value= 0; return res; } diff --git a/sql/log.cc b/sql/log.cc index d57a6b49762..6c97581d144 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2257,9 +2257,9 @@ void print_buffer_to_nt_eventlog(enum loglevel level, char *buff, DBUG_ENTER("print_buffer_to_nt_eventlog"); buffptr= buff; - if (length > (uint)(buffLen-4)) + if (length > (uint)(buffLen-5)) { - char *newBuff= new char[length + 4]; + char *newBuff= new char[length + 5]; strcpy(newBuff, buff); buffptr= newBuff; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0126a69b099..3195b442de3 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3031,6 +3031,18 @@ You should consider changing lower_case_table_names to 1 or 2", lower_case_table_names= 2; } } + else if (lower_case_table_names == 2 && + !(lower_case_file_system= + (test_if_case_insensitive(mysql_real_data_home) == 1))) + { + if (global_system_variables.log_warnings) + sql_print_warning("\ +You have forced lower_case_table_names to 2 through a command-line \ +option, even though your file system '%s' is case sensitive. This means \ +that you can create a table that you can then no longer access. \ +You should consider changing lower_case_table_names to 0.", + mysql_real_data_home); + } select_thread=pthread_self(); select_thread_in_use=1; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index e67a9881bba..c3b84564504 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -778,6 +778,7 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT() DBUG_PRINT("info", ("Freeing separate handler %p (free=%d)", file, free_file)); file->reset(); + file->external_lock(current_thd, F_UNLCK); file->close(); } } @@ -929,6 +930,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler) DBUG_RETURN(0); } + THD *thd= current_thd; if (!(file= get_new_handler(head, head->s->db_type))) goto failure; DBUG_PRINT("info", ("Allocated new handler %p", file)); @@ -937,11 +939,14 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler) /* Caller will free the memory */ goto failure; } + if (file->external_lock(thd, F_RDLCK)) + goto failure; if (file->extra(HA_EXTRA_KEYREAD) || file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) || init() || reset()) { + file->external_lock(thd, F_UNLCK); file->close(); goto failure; } diff --git a/sql/set_var.cc b/sql/set_var.cc index c5c37a86c61..e18f28dc133 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -3033,8 +3033,8 @@ int set_var_password::check(THD *thd) if (!user->host.str) user->host.str= (char*) thd->host_or_ip; /* Returns 1 as the function sends error to client */ - return check_change_password(thd, user->host.str, user->user.str, password) ? - 1 : 0; + return check_change_password(thd, user->host.str, user->user.str, + password, strlen(password)) ? 1 : 0; #else return 0; #endif diff --git a/sql/slave.cc b/sql/slave.cc index 5332dbf9c5b..0c5ebe0744a 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -2610,18 +2610,19 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name, init_abort_pos_wait= abort_pos_wait; /* - We'll need to + We'll need to handle all possible log names comparisons (e.g. 999 vs 1000). - We use ulong for string->number conversion ; this is no + We use ulong for string->number conversion ; this is no stronger limitation than in find_uniq_filename in sql/log.cc */ ulong log_name_extension; char log_name_tmp[FN_REFLEN]; //make a char[] from String - char *end= strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), - FN_REFLEN-1)); + + strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), FN_REFLEN-1)); + char *p= fn_ext(log_name_tmp); char *p_end; - if (!*p || log_pos<0) + if (!*p || log_pos<0) { error= -2; //means improper arguments goto err; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index bcad0e627f4..f9d95b2cde5 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -1240,6 +1240,10 @@ bool acl_check_host(const char *host, const char *ip) thd THD host hostname for the user user user name + new_password new password + + NOTE: + new_password cannot be NULL RETURN VALUE 0 OK @@ -1247,7 +1251,7 @@ bool acl_check_host(const char *host, const char *ip) */ bool check_change_password(THD *thd, const char *host, const char *user, - char *new_password) + char *new_password, uint new_password_len) { if (!initialized) { @@ -1296,12 +1300,13 @@ bool check_change_password(THD *thd, const char *host, const char *user, bool change_password(THD *thd, const char *host, const char *user, char *new_password) { + uint new_password_len= strlen(new_password); DBUG_ENTER("change_password"); DBUG_PRINT("enter",("host: '%s' user: '%s' new_password: '%s'", host,user,new_password)); DBUG_ASSERT(host != 0); // Ensured by parent - if (check_change_password(thd, host, user, new_password)) + if (check_change_password(thd, host, user, new_password, new_password_len)) DBUG_RETURN(1); VOID(pthread_mutex_lock(&acl_cache->lock)); @@ -1313,7 +1318,6 @@ bool change_password(THD *thd, const char *host, const char *user, DBUG_RETURN(1); } /* update loaded acl entry: */ - uint new_password_len= new_password ? strlen(new_password) : 0; set_user_salt(acl_user, new_password, new_password_len); if (update_user_table(thd, @@ -3241,7 +3245,7 @@ end: SYNOPSIS grant_reload() - thd Thread handler + thd Thread handler (can be NULL) NOTES Locked tables are checked by acl_init and doesn't have to be checked here diff --git a/sql/sql_acl.h b/sql/sql_acl.h index b129ffcdcf8..3a9df84a35d 100644 --- a/sql/sql_acl.h +++ b/sql/sql_acl.h @@ -176,7 +176,7 @@ int acl_getroot(THD *thd, USER_RESOURCES *mqh, const char *passwd, int acl_getroot_no_password(THD *thd); bool acl_check_host(const char *host, const char *ip); bool check_change_password(THD *thd, const char *host, const char *user, - char *password); + char *password, uint password_len); bool change_password(THD *thd, const char *host, const char *user, char *password); bool mysql_grant(THD *thd, const char *db, List &user_list, diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index 6a9a9e51231..ce58c585061 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -70,6 +70,9 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, field_info **f_info; DBUG_ENTER("proc_analyse_init"); + if (!pc) + DBUG_RETURN(0); + if (!(param = param->next)) { pc->max_tree_elements = MAX_TREE_ELEMENTS; @@ -81,33 +84,30 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val_real() < 0) { - delete pc; my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name); - DBUG_RETURN(0); + goto err; } pc->max_tree_elements = (uint) (*param->item)->val_int(); param = param->next; if (param->next) // no third parameter possible { my_error(ER_WRONG_PARAMCOUNT_TO_PROCEDURE, MYF(0), proc_name); - DBUG_RETURN(0); + goto err; } // second parameter if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val_real() < 0) { - delete pc; my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name); - DBUG_RETURN(0); + goto err; } pc->max_treemem = (uint) (*param->item)->val_int(); } else if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val_real() < 0) { - delete pc; my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name); - DBUG_RETURN(0); + goto err; } // if only one parameter was given, it will be the value of max_tree_elements else @@ -116,34 +116,39 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, pc->max_treemem = MAX_TREEMEM; } - if (!pc || !(pc->f_info = (field_info**) - sql_alloc(sizeof(field_info*)*field_list.elements))) - DBUG_RETURN(0); + if (!(pc->f_info= + (field_info**)sql_alloc(sizeof(field_info*)*field_list.elements))) + goto err; pc->f_end = pc->f_info + field_list.elements; pc->fields = field_list; - List_iterator_fast it(pc->fields); - f_info = pc->f_info; - - Item *item; - while ((item = it++)) { - if (item->result_type() == INT_RESULT) + List_iterator_fast it(pc->fields); + f_info = pc->f_info; + + Item *item; + while ((item = it++)) { - // Check if fieldtype is ulonglong - if (item->type() == Item::FIELD_ITEM && - ((Item_field*) item)->field->type() == FIELD_TYPE_LONGLONG && - ((Field_longlong*) ((Item_field*) item)->field)->unsigned_flag) - *f_info++ = new field_ulonglong(item, pc); - else - *f_info++ = new field_longlong(item, pc); + if (item->result_type() == INT_RESULT) + { + // Check if fieldtype is ulonglong + if (item->type() == Item::FIELD_ITEM && + ((Item_field*) item)->field->type() == FIELD_TYPE_LONGLONG && + ((Field_longlong*) ((Item_field*) item)->field)->unsigned_flag) + *f_info++ = new field_ulonglong(item, pc); + else + *f_info++ = new field_longlong(item, pc); + } + if (item->result_type() == REAL_RESULT) + *f_info++ = new field_real(item, pc); + if (item->result_type() == STRING_RESULT) + *f_info++ = new field_str(item, pc); } - if (item->result_type() == REAL_RESULT) - *f_info++ = new field_real(item, pc); - if (item->result_type() == STRING_RESULT) - *f_info++ = new field_str(item, pc); } DBUG_RETURN(pc); +err: + delete pc; + DBUG_RETURN(0); } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 709083b3dec..0aa9f842691 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -261,13 +261,19 @@ void free_io_cache(TABLE *table) DBUG_VOID_RETURN; } - /* Close all tables which aren't in use by any thread */ +/* + Close all tables which aren't in use by any thread + + THD can be NULL, but then if_wait_for_refresh must be FALSE + and tables must be NULL. +*/ bool close_cached_tables(THD *thd, bool if_wait_for_refresh, TABLE_LIST *tables) { bool result=0; DBUG_ENTER("close_cached_tables"); + DBUG_ASSERT(thd || (!if_wait_for_refresh && !tables)); VOID(pthread_mutex_lock(&LOCK_open)); if (!tables) @@ -343,7 +349,6 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh, VOID(pthread_mutex_unlock(&LOCK_open)); if (if_wait_for_refresh) { - THD *thd=current_thd; pthread_mutex_lock(&thd->mysys_var->mutex); thd->mysys_var->current_mutex= 0; thd->mysys_var->current_cond= 0; @@ -2409,11 +2414,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, strxnmov(buff,sizeof(buff)-1,db,".",table_name,NullS); table_name=buff; } - if (report_error == REPORT_ALL_ERRORS || - report_error == REPORT_EXCEPT_NON_UNIQUE) - my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, thd->where); - else - return (Field*) not_found_field; + my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, thd->where); } else if (report_error == REPORT_ALL_ERRORS || diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index f4345f8ce28..c08d3eae0e1 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1164,12 +1164,12 @@ void Query_cache::invalidate(THD *thd, TABLE_LIST *tables_used, DBUG_ASSERT(!using_transactions || tables_used->table!=0); if (tables_used->derived) continue; - if (using_transactions && - (tables_used->table->file->table_cache_type() == + if (using_transactions && + (tables_used->table->file->table_cache_type() == HA_CACHE_TBL_TRANSACT)) - /* + /* Tables_used->table can't be 0 in transaction. - Only 'drop' invalidate not opened table, but 'drop' + Only 'drop' invalidate not opened table, but 'drop' force transaction finish. */ thd->add_changed_table(tables_used->table); @@ -1217,7 +1217,7 @@ void Query_cache::invalidate(CHANGED_TABLE_LIST *tables_used) */ void Query_cache::invalidate_locked_for_write(TABLE_LIST *tables_used) { - DBUG_ENTER("Query_cache::invalidate (changed table list)"); + DBUG_ENTER("Query_cache::invalidate_locked_for_write"); if (query_cache_size > 0 && tables_used) { STRUCT_LOCK(&structure_guard_mutex); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 26929ebc432..cbd4f9049d3 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -227,7 +227,7 @@ void del_dbopt(const char *path) } -/* +/* Create database options file: DESCRIPTION @@ -246,10 +246,10 @@ static bool write_db_opt(THD *thd, const char *path, HA_CREATE_INFO *create) if (!create->default_table_charset) create->default_table_charset= thd->variables.collation_server; - + if (put_dbopt(path, create)) return 1; - + if ((file=my_create(path, CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) { ulong length; @@ -531,21 +531,21 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) if ((error=write_db_opt(thd, path, create_info))) goto exit; - /* + /* Change options if current database is being altered TODO: Delete this code */ if (thd->db && !strcmp(thd->db,db)) { - thd->db_charset= (create_info && create_info->default_table_charset) ? - create_info->default_table_charset : + thd->db_charset= create_info->default_table_charset ? + create_info->default_table_charset : thd->variables.collation_server; thd->variables.collation_database= thd->db_charset; } if (mysql_bin_log.is_open()) { - Query_log_event qinfo(thd, thd->query, thd->query_length, 0, + Query_log_event qinfo(thd, thd->query, thd->query_length, 0, /* suppress_use */ TRUE); /* @@ -627,12 +627,12 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) pthread_mutex_lock(&LOCK_open); remove_db_from_cache(db); pthread_mutex_unlock(&LOCK_open); - + error= -1; if ((deleted= mysql_rm_known_files(thd, dirp, db, path, 0)) >= 0) { ha_drop_database(path); - query_cache_invalidate1(db); + query_cache_invalidate1(db); error = 0; } } @@ -643,7 +643,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) my_casedn_str(files_charset_info, tmp_db); db= tmp_db; } - if (!silent && deleted>=0 && thd) + if (!silent && deleted>=0) { const char *query; ulong query_length; @@ -693,7 +693,7 @@ exit: have 'if (data_buf) free(data_buf)' data_buf is !=0 so this makes a DOUBLE free(). Side effects of this double free() are, randomly (depends on the machine), - when the slave is replicating a DROP DATABASE: + when the slave is replicating a DROP DATABASE: - garbage characters in the error message: "Error 'Can't drop database 'test2'; database doesn't exist' on query 'h4zI©'" diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 2f6e74225fd..43e82ff57c9 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1603,9 +1603,6 @@ void st_select_lex::print_limit(THD *thd, String *str) return; } - if (!thd) - thd= current_thd; - if (explicit_limit) { str->append(" limit ", 7); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 97be71812ac..ef976310ccb 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -897,14 +897,16 @@ static int check_connection(THD *thd) char *user= end; char *passwd= strend(user)+1; char *db= passwd; - char db_buff[NAME_LEN+1]; // buffer to store db in utf8 + char db_buff[NAME_LEN+1]; // buffer to store db in utf8 char user_buff[USERNAME_LENGTH+1]; // buffer to store user in utf8 - /* + uint dummy_errors; + + /* Old clients send null-terminated string as password; new clients send the size (1 byte) + string (not null-terminated). Hence in case of empty password both send '\0'. */ - uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ? + uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ? *passwd++ : strlen(passwd); db= thd->client_capabilities & CLIENT_CONNECT_WITH_DB ? db + passwd_len + 1 : 0; @@ -912,7 +914,6 @@ static int check_connection(THD *thd) /* Since 4.1 all database names are stored in utf8 */ if (db) { - uint dummy_errors; db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1, system_charset_info, db, strlen(db), @@ -920,14 +921,10 @@ static int check_connection(THD *thd) db= db_buff; } - if (user) - { - uint dummy_errors; - user_buff[copy_and_convert(user_buff, sizeof(user_buff)-1, - system_charset_info, user, strlen(user), - thd->charset(), &dummy_errors)]= '\0'; - user= user_buff; - } + user_buff[copy_and_convert(user_buff, sizeof(user_buff)-1, + system_charset_info, user, strlen(user), + thd->charset(), &dummy_errors)]= '\0'; + user= user_buff; if (thd->user) x_free(thd->user); @@ -3350,12 +3347,12 @@ unsent_create_error: /* If in a slave thread : ALTER DATABASE DB may not be preceded by USE DB. - For that reason, maybe db_ok() in sql/slave.cc did not check the + For that reason, maybe db_ok() in sql/slave.cc did not check the do_db/ignore_db. And as this query involves no tables, tables_ok() above was not called. So we have to check rules again here. */ #ifdef HAVE_REPLICATION - if (thd->slave_thread && + if (thd->slave_thread && (!db_ok(db, replicate_do_db, replicate_ignore_db) || !db_ok_with_wild_table(db))) { @@ -3468,8 +3465,7 @@ unsent_create_error: case SQLCOM_GRANT: { if (check_access(thd, lex->grant | lex->grant_tot_col | GRANT_ACL, - ((first_table && first_table->db) ? - first_table->db : select_lex->db), + first_table ? first_table->db : select_lex->db, first_table ? &first_table->grant.privilege : 0, first_table ? 0 : 1, 0)) goto error; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5f8e6cf1f5a..9b2fb4a9c6a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1977,10 +1977,10 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, for (table= tables; table; table= table->next_local) { char table_name[NAME_LEN*2+2]; - char* db = (table->db) ? table->db : thd->db; + char* db = table->db; bool fatal_error=0; - strxmov(table_name,db ? db : "",".",table->table_name,NullS); + strxmov(table_name, db, ".", table->table_name, NullS); thd->open_options|= extra_open_options; table->lock_type= lock_type; /* open only one table from local list of command */ diff --git a/sql/sql_update.cc b/sql/sql_update.cc index d2220cd67c3..f9ad513ea6a 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -120,7 +120,7 @@ int mysql_update(THD *thd, bool used_key_is_modified, transactional_table, log_delayed; int res; int error=0; - uint used_index; + uint used_index= MAX_KEY; #ifndef NO_EMBEDDED_ACCESS_CHECKS uint want_privilege; #endif @@ -134,7 +134,6 @@ int mysql_update(THD *thd, SELECT_LEX *select_lex= &thd->lex->select_lex; DBUG_ENTER("mysql_update"); - LINT_INIT(used_index); LINT_INIT(timestamp_query_id); if (open_tables(thd, table_list, &table_count)) @@ -273,7 +272,7 @@ int mysql_update(THD *thd, matching rows before updating the table! */ table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS); - if ( (used_index != MAX_KEY) && old_used_keys.is_set(used_index)) + if (used_index < MAX_KEY && old_used_keys.is_set(used_index)) { table->key_read=1; table->file->extra(HA_EXTRA_KEYREAD); diff --git a/sql/table.cc b/sql/table.cc index a030da95db4..82ad32341c0 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -342,12 +342,14 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, VOID(my_seek(file,pos,MY_SEEK_SET,MYF(0))); if (my_read(file,(byte*) head,288,MYF(MY_NABP))) goto err; +#ifdef HAVE_CRYPTED_FRM if (crypted) { crypted->decode((char*) head+256,288-256); if (sint2korr(head+284) != 0) // Should be 0 goto err; // Wrong password } +#endif share->fields= uint2korr(head+258); pos= uint2korr(head+260); /* Length of all screens */ @@ -375,12 +377,14 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, pos+ (uint) (n_length+int_length+com_length)); if (read_string(file,(gptr*) &disk_buff,read_length)) goto err; /* purecov: inspected */ +#ifdef HAVE_CRYPTED_FRM if (crypted) { crypted->decode((char*) disk_buff,read_length); delete crypted; crypted=0; } +#endif strpos= disk_buff+pos; share->intervals= (TYPELIB*) (field_ptr+share->fields+1); diff --git a/sql/tztime.cc b/sql/tztime.cc index b9b9e4821c4..4b769aed40c 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -1861,7 +1861,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) { ttid= (uint)table->field[1]->val_int(); - if (ttid > TZ_MAX_TYPES) + if (ttid >= TZ_MAX_TYPES) { sql_print_error("Error while loading time zone description from " "mysql.time_zone_transition_type table: too big " diff --git a/tests/Makefile.am b/tests/Makefile.am index b3693aedecb..e66637de0aa 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -26,7 +26,7 @@ EXTRA_DIST = auto_increment.res auto_increment.tst \ pmail.pl mail_to_db.pl table_types.pl \ udf_test udf_test.res myisam-big-rows.tst -bin_PROGRAMS = client_test +bin_PROGRAMS = mysql_client_test noinst_PROGRAMS = insert_test select_test thread_test # @@ -38,7 +38,7 @@ LDADD = @CLIENT_EXTRA_LDFLAGS@ \ $(top_builddir)/libmysql/libmysqlclient.la client_test_LDADD= $(LDADD) $(CXXLDFLAGS) \ $(top_builddir)/mysys/libmysys.a -client_test_SOURCES= client_test.c +client_test_SOURCES= mysql_client_test.c insert_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) select_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) diff --git a/tests/client_test.c b/tests/mysql_client_test.c similarity index 99% rename from tests/client_test.c rename to tests/mysql_client_test.c index 8be970aed29..3cbc9918d6c 100644 --- a/tests/client_test.c +++ b/tests/mysql_client_test.c @@ -11406,6 +11406,12 @@ static void test_bug5194() if (bind == 0 || query == 0 || param_str == 0) { fprintf(stderr, "Can't allocate enough memory for query structs\n"); + if (bind) + free(bind); + if (query) + free(query); + if (param_str) + free(param_str); return; } diff --git a/vio/viosocket.c b/vio/viosocket.c index de50dabba5f..858faac4f1e 100644 --- a/vio/viosocket.c +++ b/vio/viosocket.c @@ -142,23 +142,29 @@ int vio_fastsend(Vio * vio __attribute__((unused))) int r=0; DBUG_ENTER("vio_fastsend"); -#ifdef IPTOS_THROUGHPUT +#if defined(IPTOS_THROUGHPUT) && !defined(__EMX__) { -#ifndef __EMX__ int tos = IPTOS_THROUGHPUT; - if (!setsockopt(vio->sd, IPPROTO_IP, IP_TOS, (void *) &tos, sizeof(tos))) -#endif /* !__EMX__ */ - { - int nodelay = 1; - if (setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (void *) &nodelay, - sizeof(nodelay))) { - DBUG_PRINT("warning", - ("Couldn't set socket option for fast send")); - r= -1; - } - } + r= setsockopt(vio->sd, IPPROTO_IP, IP_TOS, (void *) &tos, sizeof(tos)); + } +#endif /* IPTOS_THROUGHPUT && !__EMX__ */ + if (!r) + { +#ifdef __WIN__ + BOOL nodelay= 1; + r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (const char*) &nodelay, + sizeof(nodelay)); +#else + int nodelay = 1; + r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (void*) &nodelay, + sizeof(nodelay)); +#endif /* __WIN__ */ + } + if (r) + { + DBUG_PRINT("warning", ("Couldn't set socket option for fast send")); + r= -1; } -#endif /* IPTOS_THROUGHPUT */ DBUG_PRINT("exit", ("%d", r)); DBUG_RETURN(r); }