summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bzrignore267
-rwxr-xr-xBuild-tools/mysql-copyright30
-rwxr-xr-xBuild-tools/mysql-copyright-21
-rwxr-xr-xVC++Files/InstallShield/4.0.XX-classic/File Groups/Servers.fgl72
-rwxr-xr-xVC++Files/InstallShield/4.0.XX-gpl/File Groups/Servers.fgl72
-rwxr-xr-xVC++Files/InstallShield/4.0.XX-pro/File Groups/Servers.fgl72
-rw-r--r--VC++Files/examples/udf_example/udf_example.def19
-rw-r--r--client/mysqltest.c54
-rw-r--r--include/my_global.h10
-rw-r--r--include/violite.h8
-rw-r--r--innobase/btr/btr0btr.c2
-rw-r--r--innobase/buf/buf0buf.c14
-rw-r--r--innobase/buf/buf0flu.c10
-rw-r--r--innobase/buf/buf0lru.c4
-rw-r--r--innobase/buf/buf0rea.c8
-rw-r--r--innobase/data/data0type.c2
-rw-r--r--innobase/dict/dict0dict.c6
-rw-r--r--innobase/dict/dict0mem.c6
-rw-r--r--innobase/fsp/fsp0fsp.c6
-rw-r--r--innobase/fut/fut0lst.c2
-rw-r--r--innobase/ha/hash0hash.c38
-rw-r--r--innobase/ibuf/ibuf0ibuf.c9
-rw-r--r--innobase/include/Makefile.am2
-rw-r--r--innobase/include/btr0btr.h2
-rw-r--r--innobase/include/buf0buf.h10
-rw-r--r--innobase/include/buf0buf.ic4
-rw-r--r--innobase/include/buf0flu.h2
-rw-r--r--innobase/include/buf0lru.h2
-rw-r--r--innobase/include/data0data.h6
-rw-r--r--innobase/include/data0type.h3
-rw-r--r--innobase/include/dict0dict.h14
-rw-r--r--innobase/include/dict0mem.h17
-rw-r--r--innobase/include/fsp0fsp.h2
-rw-r--r--innobase/include/fut0lst.h3
-rw-r--r--innobase/include/hash0hash.h20
-rw-r--r--innobase/include/hash0hash.ic8
-rw-r--r--innobase/include/lock0lock.h6
-rw-r--r--innobase/include/log0log.h4
-rw-r--r--innobase/include/log0log.ic2
-rw-r--r--innobase/include/mem0dbg.h17
-rw-r--r--innobase/include/mem0dbg.ic3
-rw-r--r--innobase/include/mem0mem.h12
-rw-r--r--innobase/include/mem0mem.ic18
-rw-r--r--innobase/include/mem0pool.h3
-rw-r--r--innobase/include/mtr0mtr.h16
-rw-r--r--innobase/include/pars0opt.h2
-rw-r--r--innobase/include/que0que.h38
-rw-r--r--innobase/include/que0que.ic18
-rw-r--r--innobase/include/row0ins.h5
-rw-r--r--innobase/include/row0upd.h5
-rw-r--r--innobase/include/srv0que.h53
-rw-r--r--innobase/include/sync0rw.h2
-rw-r--r--innobase/include/sync0sync.h2
-rw-r--r--innobase/include/trx0roll.h21
-rw-r--r--innobase/include/trx0trx.h31
-rw-r--r--innobase/include/usr0sess.h6
-rw-r--r--innobase/include/ut0mem.h31
-rw-r--r--innobase/lock/lock0lock.c14
-rw-r--r--innobase/log/log0log.c34
-rw-r--r--innobase/log/log0recv.c26
-rw-r--r--innobase/mem/mem0dbg.c127
-rw-r--r--innobase/mem/mem0pool.c2
-rw-r--r--innobase/mtr/mtr0mtr.c2
-rw-r--r--innobase/os/os0file.c2
-rw-r--r--innobase/pars/lexyy.c18
-rw-r--r--innobase/pars/pars0lex.l18
-rw-r--r--innobase/pars/pars0opt.c2
-rw-r--r--innobase/que/que0que.c115
-rw-r--r--innobase/rem/rem0cmp.c8
-rw-r--r--innobase/row/row0ins.c10
-rw-r--r--innobase/row/row0mysql.c50
-rw-r--r--innobase/row/row0upd.c6
-rw-r--r--innobase/srv/Makefile.am2
-rw-r--r--innobase/srv/srv0que.c113
-rw-r--r--innobase/srv/srv0srv.c1
-rw-r--r--innobase/srv/srv0start.c2
-rw-r--r--innobase/sync/sync0rw.c2
-rw-r--r--innobase/sync/sync0sync.c10
-rw-r--r--innobase/thr/thr0loc.c10
-rw-r--r--innobase/trx/trx0purge.c3
-rw-r--r--innobase/trx/trx0roll.c79
-rw-r--r--innobase/trx/trx0sys.c2
-rw-r--r--innobase/trx/trx0trx.c165
-rw-r--r--innobase/usr/usr0sess.c2
-rw-r--r--innobase/ut/ut0mem.c75
-rw-r--r--libmysql/libmysql.c27
-rw-r--r--myisam/ft_boolean_search.c9
-rw-r--r--myisam/mi_check.c2
-rw-r--r--myisam/mi_unique.c10
-rw-r--r--myisam/myisamchk.c8
-rw-r--r--mysql-test/mysql-test-run.sh4
-rw-r--r--mysql-test/r/func_if.result6
-rw-r--r--mysql-test/r/func_time.result2
-rw-r--r--mysql-test/r/range.result21
-rw-r--r--mysql-test/r/rpl_free_items.result10
-rw-r--r--mysql-test/r/rpl_get_lock.result6
-rw-r--r--mysql-test/r/subselect.result10
-rw-r--r--mysql-test/r/type_date.result6
-rw-r--r--mysql-test/r/type_decimal.result7
-rw-r--r--mysql-test/t/func_if.test9
-rw-r--r--mysql-test/t/func_time.test2
-rw-r--r--mysql-test/t/range.test27
-rw-r--r--mysql-test/t/rpl_free_items-slave.opt1
-rw-r--r--mysql-test/t/rpl_free_items.test20
-rw-r--r--mysql-test/t/rpl_get_lock.test2
-rw-r--r--mysql-test/t/subselect.test11
-rw-r--r--mysql-test/t/type_date.test9
-rw-r--r--mysql-test/t/type_decimal.test3
-rw-r--r--mysys/mf_tempfile.c2
-rwxr-xr-xnetware/BUILD/mwenv6
-rwxr-xr-xnetware/BUILD/nwbootstrap5
-rw-r--r--netware/Makefile.am2
-rw-r--r--netware/mysql_test_run.c10
-rw-r--r--netware/mysqld_safe.c534
-rw-r--r--scripts/mysql_install_db.sh11
-rw-r--r--scripts/mysqld_safe.sh8
-rw-r--r--sql-common/client.c3
-rw-r--r--sql/field.cc30
-rw-r--r--sql/field.h1
-rw-r--r--sql/item_cmpfunc.cc4
-rw-r--r--sql/mysqld.cc10
-rw-r--r--sql/net_serv.cc12
-rw-r--r--sql/opt_range.cc30
-rw-r--r--sql/sql_acl.cc4
-rw-r--r--sql/sql_class.cc3
-rw-r--r--sql/sql_parse.cc12
-rw-r--r--sql/sql_select.cc39
-rw-r--r--sql/sql_yacc.yy8
-rw-r--r--sql/table.cc2
-rw-r--r--support-files/my-huge.cnf.sh8
-rw-r--r--support-files/my-innodb-heavy-4G.cnf.sh4
-rw-r--r--support-files/my-large.cnf.sh8
-rw-r--r--support-files/my-medium.cnf.sh6
-rw-r--r--support-files/my-small.cnf.sh6
-rw-r--r--support-files/mysql.spec.sh2
135 files changed, 1910 insertions, 1074 deletions
diff --git a/.bzrignore b/.bzrignore
index ecf75375906..3344a057180 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -2,6 +2,7 @@
*.bb
*.bbg
*.core
+*.d
*.da
*.gcov
*.la
@@ -13,10 +14,10 @@
*/.pure
*~
.*.swp
-.deps
+.defs.mk
.depend
.depend.mk
-.defs.mk
+.deps
.gdb_history
.gdbinit
.libs
@@ -287,6 +288,7 @@ help.h
include/my_config.h
include/my_global.h
include/mysql_version.h
+include/readline
include/readline/*.h
include/readline/readline.h
include/widec.h
@@ -328,7 +330,9 @@ libmysqld/client.c
libmysqld/client_settings.h
libmysqld/convert.cc
libmysqld/derror.cc
+libmysqld/discover.cc
libmysqld/errmsg.c
+libmysqld/examples/client_test.c
libmysqld/examples/completion_hash.cc
libmysqld/examples/completion_hash.h
libmysqld/examples/link_sources
@@ -432,6 +436,7 @@ libmysqld/strfunc.cc
libmysqld/table.cc
libmysqld/thr_malloc.cc
libmysqld/time.cc
+libmysqld/tztime.cc
libmysqld/uniques.cc
libmysqld/unireg.cc
libtool
@@ -485,6 +490,7 @@ mysql-max-4.0.2-alpha-pc-linux-gnu-i686.tar.gz
mysql-test/gmon.out
mysql-test/install_test_db
mysql-test/mysql-test-run
+mysql-test/ndb/ndbcluster
mysql-test/r/*.reject
mysql-test/r/rpl000001.eval
mysql-test/r/rpl000002.eval
@@ -515,6 +521,130 @@ mysys/test_thr_alarm
mysys/test_thr_lock
mysys/test_vsnprintf
mysys/testhash
+ndb/bin/DbAsyncGenerator
+ndb/bin/DbCreate
+ndb/bin/acid
+ndb/bin/async-lmc-bench-l-p10.sh
+ndb/bin/async-lmc-bench-l.sh
+ndb/bin/async-lmc-bench-p10.sh
+ndb/bin/async-lmc-bench.sh
+ndb/bin/atrt
+ndb/bin/atrt-analyze-result.sh
+ndb/bin/atrt-clear-result.sh
+ndb/bin/atrt-gather-result.sh
+ndb/bin/atrt-setup.sh
+ndb/bin/bankCreator
+ndb/bin/bankMakeGL
+ndb/bin/bankSumAccounts
+ndb/bin/bankTimer
+ndb/bin/bankTransactionMaker
+ndb/bin/bankValidateAllGLs
+ndb/bin/basicTransporterTest
+ndb/bin/benchronja
+ndb/bin/bulk_copy
+ndb/bin/copy_tab
+ndb/bin/create_all_tabs
+ndb/bin/create_index
+ndb/bin/create_tab
+ndb/bin/delete_all
+ndb/bin/desc
+ndb/bin/drop_all_tabs
+ndb/bin/drop_index
+ndb/bin/drop_tab
+ndb/bin/flexAsynch
+ndb/bin/flexBench
+ndb/bin/flexHammer
+ndb/bin/flexScan
+ndb/bin/flexTT
+ndb/bin/hugoCalculator
+ndb/bin/hugoFill
+ndb/bin/hugoLoad
+ndb/bin/hugoLockRecords
+ndb/bin/hugoPkDelete
+ndb/bin/hugoPkRead
+ndb/bin/hugoPkReadRecord
+ndb/bin/hugoPkUpdate
+ndb/bin/hugoScanRead
+ndb/bin/hugoScanUpdate
+ndb/bin/index
+ndb/bin/index2
+ndb/bin/initronja
+ndb/bin/interpreterInTup
+ndb/bin/list_tables
+ndb/bin/make-config.sh
+ndb/bin/mgmtclient
+ndb/bin/mgmtsrvr
+ndb/bin/mkconfig
+ndb/bin/ndb
+ndb/bin/ndb_cpcc
+ndb/bin/ndb_cpcd
+ndb/bin/ndb_rep
+ndb/bin/ndbsql
+ndb/bin/newton_basic
+ndb/bin/newton_br
+ndb/bin/newton_pb
+ndb/bin/newton_perf
+ndb/bin/perfTransporterTest
+ndb/bin/printConfig
+ndb/bin/printSchemafile
+ndb/bin/printSysfile
+ndb/bin/redoLogFileReader
+ndb/bin/restart
+ndb/bin/restarter
+ndb/bin/restarter2
+ndb/bin/restarts
+ndb/bin/restore
+ndb/bin/select_all
+ndb/bin/select_count
+ndb/bin/telco
+ndb/bin/testBackup
+ndb/bin/testBank
+ndb/bin/testBasic
+ndb/bin/testBasicAsynch
+ndb/bin/testCopy
+ndb/bin/testDataBuffers
+ndb/bin/testDict
+ndb/bin/testGrep
+ndb/bin/testGrepVerify
+ndb/bin/testIndex
+ndb/bin/testInterpreter
+ndb/bin/testKernelDataBuffer
+ndb/bin/testLongSig
+ndb/bin/testMgm
+ndb/bin/testMgmapi
+ndb/bin/testNdbApi
+ndb/bin/testNodeRestart
+ndb/bin/testOIBasic
+ndb/bin/testOdbcDriver
+ndb/bin/testOperations
+ndb/bin/testRestartGci
+ndb/bin/testScan
+ndb/bin/testScanInterpreter
+ndb/bin/testSimplePropertiesSection
+ndb/bin/testSystemRestart
+ndb/bin/testTimeout
+ndb/bin/testTransactions
+ndb/bin/test_cpcd
+ndb/bin/test_event
+ndb/bin/verify_index
+ndb/bin/waiter
+ndb/config/autom4te.cache/*
+ndb/config/config.mk
+ndb/examples/ndbapi_example1/ndbapi_example1
+ndb/examples/ndbapi_example2/ndbapi_example2
+ndb/examples/ndbapi_example3/ndbapi_example3
+ndb/examples/ndbapi_example5/ndbapi_example5
+ndb/examples/select_all/select_all
+ndb/lib/libMGM_API.so
+ndb/lib/libNDB_API.so
+ndb/lib/libNDB_ODBC.so
+ndb/lib/libNEWTON_API.so
+ndb/lib/libNEWTON_BASICTEST_COMMON.so
+ndb/lib/libREP_API.so
+ndb/lib/libndbclient.so
+ndb/lib/libndbclient_extra.so
+ndb/src/common/mgmcommon/printConfig/*.d
+ndb/src/mgmclient/test_cpcd/*.d
pull.log
regex/re
repl-tests/test-repl-ts/repl-timestamp.master.reject
@@ -585,6 +715,7 @@ sql/gen_lex_hash
sql/gmon.out
sql/lex_hash.h
sql/mini_client_errors.c
+sql/mysql_tzinfo_to_sql
sql/mysqlbinlog
sql/mysqld
sql/mysqld-purecov
@@ -604,6 +735,7 @@ sql/sql_yacc.cc
sql/sql_yacc.h
sql/sql_yacc.output
sql/sql_yacc.yy.orig
+sql/test_time
sql/udf_example.so
sql_error.cc
sql_prepare.cc
@@ -652,134 +784,3 @@ vio/test-ssl
vio/test-sslclient
vio/test-sslserver
vio/viotest-ssl
-ndb/bin/DbAsyncGenerator
-ndb/bin/DbCreate
-ndb/bin/acid
-ndb/bin/async-lmc-bench-l-p10.sh
-ndb/bin/async-lmc-bench-l.sh
-ndb/bin/async-lmc-bench-p10.sh
-ndb/bin/async-lmc-bench.sh
-ndb/bin/atrt
-ndb/bin/atrt-analyze-result.sh
-ndb/bin/atrt-clear-result.sh
-ndb/bin/atrt-gather-result.sh
-ndb/bin/atrt-setup.sh
-ndb/bin/bankCreator
-ndb/bin/bankMakeGL
-ndb/bin/bankSumAccounts
-ndb/bin/bankTimer
-ndb/bin/bankTransactionMaker
-ndb/bin/bankValidateAllGLs
-ndb/bin/basicTransporterTest
-ndb/bin/benchronja
-ndb/bin/bulk_copy
-ndb/bin/copy_tab
-ndb/bin/create_all_tabs
-ndb/bin/create_index
-ndb/bin/create_tab
-ndb/bin/delete_all
-ndb/bin/desc
-ndb/bin/drop_all_tabs
-ndb/bin/drop_index
-ndb/bin/drop_tab
-ndb/bin/flexAsynch
-ndb/bin/flexBench
-ndb/bin/flexHammer
-ndb/bin/flexScan
-ndb/bin/flexTT
-ndb/bin/hugoCalculator
-ndb/bin/hugoFill
-ndb/bin/hugoLoad
-ndb/bin/hugoLockRecords
-ndb/bin/hugoPkDelete
-ndb/bin/hugoPkRead
-ndb/bin/hugoPkReadRecord
-ndb/bin/hugoPkUpdate
-ndb/bin/hugoScanRead
-ndb/bin/hugoScanUpdate
-ndb/bin/index
-ndb/bin/index2
-ndb/bin/initronja
-ndb/bin/interpreterInTup
-ndb/bin/list_tables
-ndb/bin/make-config.sh
-ndb/bin/mgmtclient
-ndb/bin/mgmtsrvr
-ndb/bin/mkconfig
-ndb/bin/ndb
-ndb/bin/ndb_cpcc
-ndb/bin/ndb_cpcd
-ndb/bin/ndb_rep
-ndb/bin/ndbsql
-ndb/bin/newton_basic
-ndb/bin/newton_br
-ndb/bin/newton_pb
-ndb/bin/newton_perf
-ndb/bin/perfTransporterTest
-ndb/bin/printConfig
-ndb/bin/printSchemafile
-ndb/bin/printSysfile
-ndb/bin/redoLogFileReader
-ndb/bin/restart
-ndb/bin/restarter
-ndb/bin/restarter2
-ndb/bin/restarts
-ndb/bin/restore
-ndb/bin/select_all
-ndb/bin/select_count
-ndb/bin/telco
-ndb/bin/testBackup
-ndb/bin/testBank
-ndb/bin/testBasic
-ndb/bin/testBasicAsynch
-ndb/bin/testCopy
-ndb/bin/testDataBuffers
-ndb/bin/testDict
-ndb/bin/testGrep
-ndb/bin/testGrepVerify
-ndb/bin/testIndex
-ndb/bin/testInterpreter
-ndb/bin/testKernelDataBuffer
-ndb/bin/testLongSig
-ndb/bin/testMgm
-ndb/bin/testMgmapi
-ndb/bin/testNdbApi
-ndb/bin/testNodeRestart
-ndb/bin/testOIBasic
-ndb/bin/testOdbcDriver
-ndb/bin/testOperations
-ndb/bin/testRestartGci
-ndb/bin/testScan
-ndb/bin/testScanInterpreter
-ndb/bin/testSimplePropertiesSection
-ndb/bin/testSystemRestart
-ndb/bin/testTimeout
-ndb/bin/testTransactions
-ndb/bin/test_cpcd
-ndb/bin/test_event
-ndb/bin/verify_index
-ndb/bin/waiter
-ndb/examples/ndbapi_example1/ndbapi_example1
-ndb/examples/ndbapi_example2/ndbapi_example2
-ndb/examples/ndbapi_example3/ndbapi_example3
-ndb/examples/ndbapi_example5/ndbapi_example5
-ndb/examples/select_all/select_all
-ndb/lib/libMGM_API.so
-ndb/lib/libNDB_API.so
-ndb/lib/libNDB_ODBC.so
-ndb/lib/libNEWTON_API.so
-ndb/lib/libNEWTON_BASICTEST_COMMON.so
-ndb/lib/libREP_API.so
-ndb/lib/libndbclient.so
-ndb/lib/libndbclient_extra.so
-libmysqld/discover.cc
-include/readline
-ndb/config/autom4te.cache/*
-ndb/config/config.mk
-ndb/src/common/mgmcommon/printConfig/*.d
-ndb/src/mgmclient/test_cpcd/*.d
-*.d
-libmysqld/examples/client_test.c
-sql/test_time
-sql/mysql_tzinfo_to_sql
-libmysqld/tztime.cc
diff --git a/Build-tools/mysql-copyright b/Build-tools/mysql-copyright
index b403fdf8c0a..adc4ae34a50 100755
--- a/Build-tools/mysql-copyright
+++ b/Build-tools/mysql-copyright
@@ -141,13 +141,15 @@ sub main
# remove temporary directory
chdir($WD) or print "$! Unable to move up one dir\n";
+ `cd $WD`;
my $cwd = getcwd();
print "current dir is $cwd\n" if $opt_verbose ;
- print "deleting temp dir $dir\n" if $opt_verbose;
- if (-d $dir) {
- system("rm -rf $dir") or print "$! Unable to delete $dir!\n";
+ if (-e $dir) {
+ print "Trying to delete $dir\n" if $opt_verbose;
+ if ( system("rm -rf $dir")){
+ print "$! Unable to delete $dir!\n";
+ }
}
-
}
exit(0);
}
@@ -156,14 +158,17 @@ sub main
#### mysqld and MySQL client programs have a usage printed with --help.
#### This usage includes a copyright, which needs to be modified
####
-
sub fix_usage_copyright
{
- my @Cfiles = `find . -type f -name \"*.c*\"`;
- foreach my $Cfile (@Cfiles)
+ my $findlist = `find . -type f -name \"*.c*\"`;
+ my @files = split("\n", $findlist);
+ my $cwd = getcwd();
+
+ foreach my $file (@files)
{
- chop $Cfile;
- `replace "This is free software," "This is commercial software," "and you are welcome to modify and redistribute it under the GPL license" "please see the file MySQLEULA.txt for details" -- "$Cfile"` if -f $Cfile;
+ next if ! -f $file;
+ print "processing file $file in cwd $cwd\n" if $opt_verbose;
+ `replace "This is free software," "This is commercial software," "and you are welcome to modify and redistribute it under the GPL license" "please see the file MySQLEULA.txt for details" -- "$file"` ;
}
}
@@ -173,12 +178,15 @@ sub fix_usage_copyright
sub add_copyright
{
- my @files = `find . -type f -name "*"`;
+ my $findlist = `find . -type f -name "*"`;
+ my @files = split("\n", $findlist);
+ my $cwd = getcwd();
+
foreach my $file (@files)
{
- chop $file;
next if ! -f $file;
next if -B $file;
+ print "processing file $file in cwd $cwd\n" if $opt_verbose;
`$WD/Build-tools/mysql-copyright-2 "$file"`;
}
}
diff --git a/Build-tools/mysql-copyright-2 b/Build-tools/mysql-copyright-2
index e946ed217d1..a1a870526da 100755
--- a/Build-tools/mysql-copyright-2
+++ b/Build-tools/mysql-copyright-2
@@ -89,6 +89,7 @@ sub add_copyright
elsif ($ARGV =~ /\.c$/ ||
$ARGV =~ /\.cc$/ ||
$ARGV =~ /\.h$/ ||
+ $ARGV =~ /\.cpp$/ ||
$ARGV =~ /\.yy$/)
{
$start_copyright="/* ";
diff --git a/VC++Files/InstallShield/4.0.XX-classic/File Groups/Servers.fgl b/VC++Files/InstallShield/4.0.XX-classic/File Groups/Servers.fgl
index 8a626c56253..b51c37f8db2 100755
--- a/VC++Files/InstallShield/4.0.XX-classic/File Groups/Servers.fgl
+++ b/VC++Files/InstallShield/4.0.XX-classic/File Groups/Servers.fgl
@@ -41,31 +41,55 @@ file1=C:\mysql\share\korean\errmsg.txt
fulldirectory=
[share\charsets]
-file15=C:\mysql\share\charsets\latin1.conf
-file16=C:\mysql\share\charsets\latin2.conf
-file0=C:\mysql\share\charsets\win1251ukr.conf
-file17=C:\mysql\share\charsets\latin5.conf
+file0=C:\mysql\share\charsets\cp1250.xml
+file1=C:\mysql\share\charsets\cp1251.conf
+file2=C:\mysql\share\charsets\cp1251.xml
+file3=C:\mysql\share\charsets\cp1256.xml
file1=C:\mysql\share\charsets\cp1257.conf
-file18=C:\mysql\share\charsets\Readme
-file2=C:\mysql\share\charsets\croat.conf
-file19=C:\mysql\share\charsets\swe7.conf
-file3=C:\mysql\share\charsets\danish.conf
-file4=C:\mysql\share\charsets\dec8.conf
-file5=C:\mysql\share\charsets\dos.conf
-file6=C:\mysql\share\charsets\estonia.conf
-file7=C:\mysql\share\charsets\german1.conf
-file8=C:\mysql\share\charsets\greek.conf
-file9=C:\mysql\share\charsets\hebrew.conf
-file20=C:\mysql\share\charsets\usa7.conf
-file21=C:\mysql\share\charsets\win1250.conf
-file10=C:\mysql\share\charsets\hp8.conf
-fulldirectory=
-file22=C:\mysql\share\charsets\win1251.conf
-file11=C:\mysql\share\charsets\hungarian.conf
-file23=C:\mysql\share\charsets\cp1251.conf
-file12=C:\mysql\share\charsets\Index
-file13=C:\mysql\share\charsets\koi8_ru.conf
-file14=C:\mysql\share\charsets\koi8_ukr.conf
+file4=C:\mysql\share\charsets\cp1257.xml
+file5=C:\mysql\share\charsets\cp850.xml
+file6=C:\mysql\share\charsets\cp852.xml
+file7=C:\mysql\share\charsets\cp866.xml
+file8=C:\mysql\share\charsets\croat.conf
+file9=C:\mysql\share\charsets\danish.conf
+file10=C:\mysql\share\charsets\dec8.conf
+file10=C:\mysql\share\charsets\dec8.xml
+file11=C:\mysql\share\charsets\dos.conf
+file12=C:\mysql\share\charsets\estonia.conf
+file13=C:\mysql\share\charsets\geostd8.xml
+file14=C:\mysql\share\charsets\german1.conf
+file15=C:\mysql\share\charsets\greek.xml
+file16=C:\mysql\share\charsets\greek.conf
+file17=C:\mysql\share\charsets\hebrew.xml
+file18=C:\mysql\share\charsets\hebrew.conf
+file19=C:\mysql\share\charsets\hp8.xml
+file20=C:\mysql\share\charsets\hp8.conf
+file21=C:\mysql\share\charsets\hungarian.conf
+file22=C:\mysql\share\charsets\keybcs2.xml
+file23=C:\mysql\share\charsets\koi8_ru.conf
+file24=C:\mysql\share\charsets\koi8_ukr.conf
+file25=C:\mysql\share\charsets\koi8r.xml
+file26=C:\mysql\share\charsets\koi8u.xml
+file27=C:\mysql\share\charsets\latin1.conf
+file28=C:\mysql\share\charsets\latin1.xml
+file29=C:\mysql\share\charsets\latin2.conf
+file30=C:\mysql\share\charsets\latin2.xml
+file31=C:\mysql\share\charsets\latin5.conf
+file32=C:\mysql\share\charsets\latin5.xml
+file33=C:\mysql\share\charsets\latin7.xml
+file34=C:\mysql\share\charsets\macce.xml
+file35=C:\mysql\share\charsets\macroman.xml
+file36=C:\mysql\share\charsets\swe7.conf
+file37=C:\mysql\share\charsets\swe7.xml
+file38=C:\mysql\share\charsets\usa7.conf
+file39=C:\mysql\share\charsets\win1250.conf
+file40=C:\mysql\share\charsets\win1251ukr.conf
+file41=C:\mysql\share\charsets\win1251.conf
+file42=C:\mysql\share\charsets\Index
+file43=C:\mysql\share\charsets\Index.xml
+file44=C:\mysql\share\charsets\Readme
+file45=C:\mysql\share\charsets\languages.html
+fulldirectory=
[Embedded\DLL\debug]
file0=C:\mysql\embedded\DLL\debug\libmysqld.dll
diff --git a/VC++Files/InstallShield/4.0.XX-gpl/File Groups/Servers.fgl b/VC++Files/InstallShield/4.0.XX-gpl/File Groups/Servers.fgl
index c54ff378a55..6564512de2c 100755
--- a/VC++Files/InstallShield/4.0.XX-gpl/File Groups/Servers.fgl
+++ b/VC++Files/InstallShield/4.0.XX-gpl/File Groups/Servers.fgl
@@ -43,31 +43,55 @@ file1=C:\mysql\share\korean\errmsg.txt
fulldirectory=
[share\charsets]
-file15=C:\mysql\share\charsets\latin1.conf
-file16=C:\mysql\share\charsets\latin2.conf
-file0=C:\mysql\share\charsets\win1251ukr.conf
-file17=C:\mysql\share\charsets\latin5.conf
+file0=C:\mysql\share\charsets\cp1250.xml
+file1=C:\mysql\share\charsets\cp1251.conf
+file2=C:\mysql\share\charsets\cp1251.xml
+file3=C:\mysql\share\charsets\cp1256.xml
file1=C:\mysql\share\charsets\cp1257.conf
-file18=C:\mysql\share\charsets\Readme
-file2=C:\mysql\share\charsets\croat.conf
-file19=C:\mysql\share\charsets\swe7.conf
-file3=C:\mysql\share\charsets\danish.conf
-file4=C:\mysql\share\charsets\dec8.conf
-file5=C:\mysql\share\charsets\dos.conf
-file6=C:\mysql\share\charsets\estonia.conf
-file7=C:\mysql\share\charsets\german1.conf
-file8=C:\mysql\share\charsets\greek.conf
-file9=C:\mysql\share\charsets\hebrew.conf
-file20=C:\mysql\share\charsets\usa7.conf
-file21=C:\mysql\share\charsets\win1250.conf
-file10=C:\mysql\share\charsets\hp8.conf
-fulldirectory=
-file22=C:\mysql\share\charsets\win1251.conf
-file11=C:\mysql\share\charsets\hungarian.conf
-file23=C:\mysql\share\charsets\cp1251.conf
-file12=C:\mysql\share\charsets\Index
-file13=C:\mysql\share\charsets\koi8_ru.conf
-file14=C:\mysql\share\charsets\koi8_ukr.conf
+file4=C:\mysql\share\charsets\cp1257.xml
+file5=C:\mysql\share\charsets\cp850.xml
+file6=C:\mysql\share\charsets\cp852.xml
+file7=C:\mysql\share\charsets\cp866.xml
+file8=C:\mysql\share\charsets\croat.conf
+file9=C:\mysql\share\charsets\danish.conf
+file10=C:\mysql\share\charsets\dec8.conf
+file10=C:\mysql\share\charsets\dec8.xml
+file11=C:\mysql\share\charsets\dos.conf
+file12=C:\mysql\share\charsets\estonia.conf
+file13=C:\mysql\share\charsets\geostd8.xml
+file14=C:\mysql\share\charsets\german1.conf
+file15=C:\mysql\share\charsets\greek.xml
+file16=C:\mysql\share\charsets\greek.conf
+file17=C:\mysql\share\charsets\hebrew.xml
+file18=C:\mysql\share\charsets\hebrew.conf
+file19=C:\mysql\share\charsets\hp8.xml
+file20=C:\mysql\share\charsets\hp8.conf
+file21=C:\mysql\share\charsets\hungarian.conf
+file22=C:\mysql\share\charsets\keybcs2.xml
+file23=C:\mysql\share\charsets\koi8_ru.conf
+file24=C:\mysql\share\charsets\koi8_ukr.conf
+file25=C:\mysql\share\charsets\koi8r.xml
+file26=C:\mysql\share\charsets\koi8u.xml
+file27=C:\mysql\share\charsets\latin1.conf
+file28=C:\mysql\share\charsets\latin1.xml
+file29=C:\mysql\share\charsets\latin2.conf
+file30=C:\mysql\share\charsets\latin2.xml
+file31=C:\mysql\share\charsets\latin5.conf
+file32=C:\mysql\share\charsets\latin5.xml
+file33=C:\mysql\share\charsets\latin7.xml
+file34=C:\mysql\share\charsets\macce.xml
+file35=C:\mysql\share\charsets\macroman.xml
+file36=C:\mysql\share\charsets\swe7.conf
+file37=C:\mysql\share\charsets\swe7.xml
+file38=C:\mysql\share\charsets\usa7.conf
+file39=C:\mysql\share\charsets\win1250.conf
+file40=C:\mysql\share\charsets\win1251ukr.conf
+file41=C:\mysql\share\charsets\win1251.conf
+file42=C:\mysql\share\charsets\Index
+file43=C:\mysql\share\charsets\Index.xml
+file44=C:\mysql\share\charsets\Readme
+file45=C:\mysql\share\charsets\languages.html
+fulldirectory=
[Embedded\DLL\debug]
file0=C:\mysql\embedded\DLL\debug\libmysqld.dll
diff --git a/VC++Files/InstallShield/4.0.XX-pro/File Groups/Servers.fgl b/VC++Files/InstallShield/4.0.XX-pro/File Groups/Servers.fgl
index 8a626c56253..b51c37f8db2 100755
--- a/VC++Files/InstallShield/4.0.XX-pro/File Groups/Servers.fgl
+++ b/VC++Files/InstallShield/4.0.XX-pro/File Groups/Servers.fgl
@@ -41,31 +41,55 @@ file1=C:\mysql\share\korean\errmsg.txt
fulldirectory=
[share\charsets]
-file15=C:\mysql\share\charsets\latin1.conf
-file16=C:\mysql\share\charsets\latin2.conf
-file0=C:\mysql\share\charsets\win1251ukr.conf
-file17=C:\mysql\share\charsets\latin5.conf
+file0=C:\mysql\share\charsets\cp1250.xml
+file1=C:\mysql\share\charsets\cp1251.conf
+file2=C:\mysql\share\charsets\cp1251.xml
+file3=C:\mysql\share\charsets\cp1256.xml
file1=C:\mysql\share\charsets\cp1257.conf
-file18=C:\mysql\share\charsets\Readme
-file2=C:\mysql\share\charsets\croat.conf
-file19=C:\mysql\share\charsets\swe7.conf
-file3=C:\mysql\share\charsets\danish.conf
-file4=C:\mysql\share\charsets\dec8.conf
-file5=C:\mysql\share\charsets\dos.conf
-file6=C:\mysql\share\charsets\estonia.conf
-file7=C:\mysql\share\charsets\german1.conf
-file8=C:\mysql\share\charsets\greek.conf
-file9=C:\mysql\share\charsets\hebrew.conf
-file20=C:\mysql\share\charsets\usa7.conf
-file21=C:\mysql\share\charsets\win1250.conf
-file10=C:\mysql\share\charsets\hp8.conf
-fulldirectory=
-file22=C:\mysql\share\charsets\win1251.conf
-file11=C:\mysql\share\charsets\hungarian.conf
-file23=C:\mysql\share\charsets\cp1251.conf
-file12=C:\mysql\share\charsets\Index
-file13=C:\mysql\share\charsets\koi8_ru.conf
-file14=C:\mysql\share\charsets\koi8_ukr.conf
+file4=C:\mysql\share\charsets\cp1257.xml
+file5=C:\mysql\share\charsets\cp850.xml
+file6=C:\mysql\share\charsets\cp852.xml
+file7=C:\mysql\share\charsets\cp866.xml
+file8=C:\mysql\share\charsets\croat.conf
+file9=C:\mysql\share\charsets\danish.conf
+file10=C:\mysql\share\charsets\dec8.conf
+file10=C:\mysql\share\charsets\dec8.xml
+file11=C:\mysql\share\charsets\dos.conf
+file12=C:\mysql\share\charsets\estonia.conf
+file13=C:\mysql\share\charsets\geostd8.xml
+file14=C:\mysql\share\charsets\german1.conf
+file15=C:\mysql\share\charsets\greek.xml
+file16=C:\mysql\share\charsets\greek.conf
+file17=C:\mysql\share\charsets\hebrew.xml
+file18=C:\mysql\share\charsets\hebrew.conf
+file19=C:\mysql\share\charsets\hp8.xml
+file20=C:\mysql\share\charsets\hp8.conf
+file21=C:\mysql\share\charsets\hungarian.conf
+file22=C:\mysql\share\charsets\keybcs2.xml
+file23=C:\mysql\share\charsets\koi8_ru.conf
+file24=C:\mysql\share\charsets\koi8_ukr.conf
+file25=C:\mysql\share\charsets\koi8r.xml
+file26=C:\mysql\share\charsets\koi8u.xml
+file27=C:\mysql\share\charsets\latin1.conf
+file28=C:\mysql\share\charsets\latin1.xml
+file29=C:\mysql\share\charsets\latin2.conf
+file30=C:\mysql\share\charsets\latin2.xml
+file31=C:\mysql\share\charsets\latin5.conf
+file32=C:\mysql\share\charsets\latin5.xml
+file33=C:\mysql\share\charsets\latin7.xml
+file34=C:\mysql\share\charsets\macce.xml
+file35=C:\mysql\share\charsets\macroman.xml
+file36=C:\mysql\share\charsets\swe7.conf
+file37=C:\mysql\share\charsets\swe7.xml
+file38=C:\mysql\share\charsets\usa7.conf
+file39=C:\mysql\share\charsets\win1250.conf
+file40=C:\mysql\share\charsets\win1251ukr.conf
+file41=C:\mysql\share\charsets\win1251.conf
+file42=C:\mysql\share\charsets\Index
+file43=C:\mysql\share\charsets\Index.xml
+file44=C:\mysql\share\charsets\Readme
+file45=C:\mysql\share\charsets\languages.html
+fulldirectory=
[Embedded\DLL\debug]
file0=C:\mysql\embedded\DLL\debug\libmysqld.dll
diff --git a/VC++Files/examples/udf_example/udf_example.def b/VC++Files/examples/udf_example/udf_example.def
index c1cfeea63f8..9764343e5f2 100644
--- a/VC++Files/examples/udf_example/udf_example.def
+++ b/VC++Files/examples/udf_example/udf_example.def
@@ -2,8 +2,17 @@ LIBRARY MYUDF
DESCRIPTION 'MySQL Sample for UDF'
VERSION 1.0
EXPORTS
- metaphon
- myfunc_double
- myfunc_int
- sequence
- avgcost \ No newline at end of file
+ metaphon_init
+ metaphon_deinit
+ metaphon
+ myfunc_double_init
+ myfunc_double
+ myfunc_int
+ sequence_init
+ sequence_deinit
+ sequence
+ avgcost_init
+ avgcost_deinit
+ avgcost_reset
+ avgcost_add
+ avgcost
diff --git a/client/mysqltest.c b/client/mysqltest.c
index f638053b515..88b7917612e 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -59,7 +59,8 @@
#include <sys/stat.h>
#include <violite.h>
-#define MAX_QUERY 65536
+#define MAX_QUERY 131072
+#define MAX_VAR_NAME 256
#define MAX_COLUMNS 256
#define PAD_SIZE 128
#define MAX_CONS 128
@@ -386,6 +387,7 @@ static void do_eval(DYNAMIC_STRING* query_eval, const char* query)
register char c;
register int escaped = 0;
VAR* v;
+ DBUG_ENTER("do_eval");
for (p= query; (c = *p); ++p)
{
@@ -417,6 +419,7 @@ static void do_eval(DYNAMIC_STRING* query_eval, const char* query)
break;
}
}
+ DBUG_VOID_RETURN;
}
@@ -628,6 +631,7 @@ static int check_result(DYNAMIC_STRING* ds, const char* fname,
return error;
}
+
VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw,
my_bool ignore_not_existing)
{
@@ -642,25 +646,26 @@ VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw,
if (!(digit < 10 && digit >= 0))
{
const char* save_var_name = var_name, *end;
+ uint length;
end = (var_name_end) ? *var_name_end : 0;
while (my_isvar(charset_info,*var_name) && var_name != end)
- ++var_name;
+ var_name++;
if (var_name == save_var_name)
{
if (ignore_not_existing)
DBUG_RETURN(0);
die("Empty variable");
}
+ length= (uint) (var_name - save_var_name);
- if (!(v = (VAR*) hash_search(&var_hash, save_var_name,
- var_name - save_var_name)))
+ if (!(v = (VAR*) hash_search(&var_hash, save_var_name, length)) &&
+ length < MAX_VAR_NAME)
{
- char c=*var_name, *s=(char*)var_name;;
- *s=0;
- v=var_from_env(save_var_name, "");
- *s=c;
+ char buff[MAX_VAR_NAME+1];
+ strmake(buff, save_var_name, length);
+ v= var_from_env(buff, "");
}
- --var_name; /* Point at last character */
+ var_name--; /* Point at last character */
}
else
v = var_reg + digit;
@@ -1737,6 +1742,7 @@ int read_line(char* buf, int size)
enum {R_NORMAL, R_Q1, R_ESC_Q_Q1, R_ESC_Q_Q2,
R_ESC_SLASH_Q1, R_ESC_SLASH_Q2,
R_Q2, R_COMMENT, R_LINE_START} state= R_LINE_START;
+ DBUG_ENTER("read_line");
start_lineno= *lineno;
for (; p < buf_end ;)
@@ -1750,7 +1756,7 @@ int read_line(char* buf, int size)
cur_file--;
lineno--;
if (cur_file == file_stack)
- return 1;
+ DBUG_RETURN(1);
continue;
}
@@ -1760,7 +1766,7 @@ int read_line(char* buf, int size)
if (end_of_query(c))
{
*p= 0;
- return 0;
+ DBUG_RETURN(0);
}
else if (c == '\'')
state = R_Q1;
@@ -1777,7 +1783,7 @@ int read_line(char* buf, int size)
{
*p= 0;
(*lineno)++;
- return 0;
+ DBUG_RETURN(0);
}
break;
case R_LINE_START:
@@ -1795,12 +1801,12 @@ int read_line(char* buf, int size)
{
*buf++= '}';
*buf= 0;
- return 0;
+ DBUG_RETURN(0);
}
else if (end_of_query(c) || c == '{')
{
*p= 0;
- return 0;
+ DBUG_RETURN(0);
}
else if (c == '\'')
state= R_Q1;
@@ -1820,7 +1826,7 @@ int read_line(char* buf, int size)
if (end_of_query(c))
{
*p= 0;
- return 0;
+ DBUG_RETURN(0);
}
if (c != '\'')
state= R_NORMAL;
@@ -1841,7 +1847,7 @@ int read_line(char* buf, int size)
if (end_of_query(c))
{
*p= 0;
- return 0;
+ DBUG_RETURN(0);
}
if (c != '"')
state= R_NORMAL;
@@ -1857,7 +1863,7 @@ int read_line(char* buf, int size)
*p++= c;
}
*p= 0; /* Always end with \0 */
- return feof(*cur_file);
+ DBUG_RETURN(feof(*cur_file));
}
@@ -1892,8 +1898,11 @@ int read_query(struct st_query** q_ptr)
q->type = Q_UNKNOWN;
q->query_buf= q->query= 0;
if (read_line(read_query_buf, sizeof(read_query_buf)))
+ {
+ DBUG_PRINT("warning",("too long query"));
DBUG_RETURN(1);
-
+ }
+ DBUG_PRINT("info", ("query: %s", read_query_buf));
if (*p == '#')
{
q->type = Q_COMMENT;
@@ -2259,6 +2268,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
char* query;
int query_len, got_error_on_send= 0;
DBUG_ENTER("run_query");
+ DBUG_PRINT("enter",("flags: %d", flags));
if (q->type != Q_EVAL)
{
@@ -2726,7 +2736,10 @@ int main(int argc, char **argv)
case Q_EVAL_RESULT: eval_result = 1; break;
case Q_EVAL:
if (q->query == q->query_buf)
+ {
q->query= q->first_argument;
+ q->first_word_len= 0;
+ }
/* fall through */
case Q_QUERY_VERTICAL:
case Q_QUERY_HORIZONTAL:
@@ -2736,13 +2749,16 @@ int main(int argc, char **argv)
{
/* This happens when we use 'query_..' on it's own line */
q_send_flag=1;
+ DBUG_PRINT("info",
+ ("query: '%s' first_word_len: %d send_flag=1",
+ q->query, q->first_word_len));
break;
}
/* fix up query pointer if this is * first iteration for this line */
if (q->query == q->query_buf)
q->query += q->first_word_len + 1;
display_result_vertically= (q->type==Q_QUERY_VERTICAL);
- error |= run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND);
+ error|= run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND);
display_result_vertically= old_display_result_vertically;
break;
}
diff --git a/include/my_global.h b/include/my_global.h
index ca45406355e..70b5b1af819 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -1186,16 +1186,6 @@ do { doubleget_union _tmp; \
#define statistic_add(V,C,L) (V)+=(C)
#endif
-#ifdef HAVE_OPENSSL
-#include <openssl/opensslv.h>
-#if OPENSSL_VERSION_NUMBER < 0x0090700f
-#define DES_cblock des_cblock
-#define DES_key_schedule des_key_schedule
-#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks))
-#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e))
-#endif
-#endif
-
#ifdef HAVE_CHARSET_utf8
#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8"
#else
diff --git a/include/violite.h b/include/violite.h
index b4b9f724d89..ba7de3ee175 100644
--- a/include/violite.h
+++ b/include/violite.h
@@ -83,6 +83,14 @@ my_bool vio_poll_read(Vio *vio,uint timeout);
void vio_timeout(Vio *vio,uint timeout);
#ifdef HAVE_OPENSSL
+#include <openssl/opensslv.h>
+#if OPENSSL_VERSION_NUMBER < 0x0090700f
+#define DES_cblock des_cblock
+#define DES_key_schedule des_key_schedule
+#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks))
+#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e))
+#endif
+
#define HEADER_DES_LOCL_H dummy_something
#include <openssl/ssl.h>
#include <openssl/err.h>
diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c
index 09f5c66f687..27d798f925a 100644
--- a/innobase/btr/btr0btr.c
+++ b/innobase/btr/btr0btr.c
@@ -2165,7 +2165,6 @@ btr_discard_page(
ut_ad(btr_check_node_ptr(tree, merge_page, mtr));
}
-#ifdef UNIV_DEBUG
/*****************************************************************
Prints size info of a B-tree. */
@@ -2287,7 +2286,6 @@ btr_print_tree(
btr_validate_tree(tree);
}
-#endif /* UNIV_DEBUG */
/****************************************************************
Checks that the node pointer to a page is appropriate. */
diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c
index 268d6f8e16d..5ec8998473d 100644
--- a/innobase/buf/buf0buf.c
+++ b/innobase/buf/buf0buf.c
@@ -223,14 +223,12 @@ in the free list to the frames.
buf_pool_t* buf_pool = NULL; /* The buffer buf_pool of the database */
-#ifdef UNIV_DEBUG
-static ulint buf_dbg_counter = 0; /* This is used to insert validation
+ulint buf_dbg_counter = 0; /* This is used to insert validation
operations in excution in the
debug version */
ibool buf_debug_prints = FALSE; /* If this is set TRUE,
the program prints info whenever
read-ahead or flush occurs */
-#endif /* UNIV_DEBUG */
/************************************************************************
Calculates a page checksum which is stored to the page when it is written
@@ -1729,12 +1727,10 @@ buf_page_create(
/* If we get here, the page was not in buf_pool: init it there */
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr, "Creating space %lu page %lu to buffer\n",
(ulong) space, (ulong) offset);
}
-#endif /* UNIV_DEBUG */
block = free_block;
@@ -1885,11 +1881,9 @@ buf_page_io_complete(
rw_lock_x_unlock_gen(&(block->lock), BUF_IO_READ);
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fputs("Has read ", stderr);
}
-#endif /* UNIV_DEBUG */
} else {
ut_ad(io_type == BUF_IO_WRITE);
@@ -1902,21 +1896,17 @@ buf_page_io_complete(
buf_pool->n_pages_written++;
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fputs("Has written ", stderr);
}
-#endif /* UNIV_DEBUG */
}
mutex_exit(&(buf_pool->mutex));
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr, "page space %lu page no %lu\n",
(ulong) block->space, (ulong) block->offset);
}
-#endif /* UNIV_DEBUG */
}
/*************************************************************************
@@ -1945,7 +1935,6 @@ buf_pool_invalidate(void)
mutex_exit(&(buf_pool->mutex));
}
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates the buffer buf_pool data structure. */
@@ -2145,7 +2134,6 @@ buf_print(void)
ut_a(buf_validate());
}
-#endif /* UNIV_DEBUG */
/*************************************************************************
Returns the number of pending buf pool ios. */
diff --git a/innobase/buf/buf0flu.c b/innobase/buf/buf0flu.c
index 885bcf06456..6cefdb60956 100644
--- a/innobase/buf/buf0flu.c
+++ b/innobase/buf/buf0flu.c
@@ -32,7 +32,6 @@ flushed along with the original page. */
#define BUF_FLUSH_AREA ut_min(BUF_READ_AHEAD_AREA,\
buf_pool->curr_size / 16)
-#ifdef UNIV_DEBUG
/**********************************************************************
Validates the flush list. */
static
@@ -40,7 +39,6 @@ ibool
buf_flush_validate_low(void);
/*========================*/
/* out: TRUE if ok */
-#endif /* UNIV_DEBUG */
/************************************************************************
Inserts a modified block into the flush list. */
@@ -513,13 +511,11 @@ buf_flush_try_page(
rw_lock_s_lock_gen(&(block->lock), BUF_IO_WRITE);
}
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr,
"Flushing page space %lu, page no %lu \n",
(ulong) block->space, (ulong) block->offset);
}
-#endif /* UNIV_DEBUG */
buf_flush_write_block_low(block);
@@ -603,14 +599,12 @@ buf_flush_try_page(
rw_lock_s_lock_gen(&(block->lock), BUF_IO_WRITE);
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr,
"Flushing single page space %lu, page no %lu \n",
(ulong) block->space,
(ulong) block->offset);
}
-#endif /* UNIV_DEBUG */
buf_flush_write_block_low(block);
@@ -837,7 +831,6 @@ buf_flush_batch(
buf_flush_buffered_writes();
-#ifdef UNIV_DEBUG
if (buf_debug_prints && page_count > 0) {
ut_a(flush_type == BUF_FLUSH_LRU
|| flush_type == BUF_FLUSH_LIST);
@@ -846,7 +839,6 @@ buf_flush_batch(
: "Flushed %lu pages in flush list flush\n",
(ulong) page_count);
}
-#endif /* UNIV_DEBUG */
return(page_count);
}
@@ -938,7 +930,6 @@ buf_flush_free_margin(void)
}
}
-#ifdef UNIV_DEBUG
/**********************************************************************
Validates the flush list. */
static
@@ -988,4 +979,3 @@ buf_flush_validate(void)
return(ret);
}
-#endif /* UNIV_DEBUG */
diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c
index 053161986e4..796311f0157 100644
--- a/innobase/buf/buf0lru.c
+++ b/innobase/buf/buf0lru.c
@@ -209,14 +209,12 @@ buf_LRU_search_and_free_block(
ut_a(block->in_LRU_list);
if (buf_flush_ready_for_replace(block)) {
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr,
"Putting space %lu page %lu to free list\n",
(ulong) block->space,
(ulong) block->offset);
}
-#endif /* UNIV_DEBUG */
buf_LRU_block_remove_hashed_page(block);
@@ -888,7 +886,6 @@ buf_LRU_block_free_hashed_page(
buf_LRU_block_free_non_file_page(block);
}
-#ifdef UNIV_DEBUG
/**************************************************************************
Validates the LRU list. */
@@ -1019,4 +1016,3 @@ buf_LRU_print(void)
mutex_exit(&(buf_pool->mutex));
}
-#endif /* UNIV_DEBUG */
diff --git a/innobase/buf/buf0rea.c b/innobase/buf/buf0rea.c
index 63e078f3f6e..71e885ff439 100644
--- a/innobase/buf/buf0rea.c
+++ b/innobase/buf/buf0rea.c
@@ -284,14 +284,12 @@ buf_read_ahead_random(
os_aio_simulated_wake_handler_threads();
-#ifdef UNIV_DEBUG
if (buf_debug_prints && (count > 0)) {
fprintf(stderr,
"Random read-ahead space %lu offset %lu pages %lu\n",
(ulong) space, (ulong) offset,
(ulong) count);
}
-#endif /* UNIV_DEBUG */
return(count);
}
@@ -571,13 +569,11 @@ buf_read_ahead_linear(
/* Flush pages from the end of the LRU list if necessary */
buf_flush_free_margin();
-#ifdef UNIV_DEBUG
if (buf_debug_prints && (count > 0)) {
fprintf(stderr,
"LINEAR read-ahead space %lu offset %lu pages %lu\n",
(ulong) space, (ulong) offset, (ulong) count);
}
-#endif /* UNIV_DEBUG */
return(count);
}
@@ -636,13 +632,11 @@ buf_read_ibuf_merge_pages(
/* Flush pages from the end of the LRU list if necessary */
buf_flush_free_margin();
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr,
"Ibuf merge read-ahead space %lu pages %lu\n",
(ulong) space_ids[0], (ulong) n_stored);
}
-#endif /* UNIV_DEBUG */
}
/************************************************************************
@@ -706,10 +700,8 @@ buf_read_recv_pages(
/* Flush pages from the end of the LRU list if necessary */
buf_flush_free_margin();
-#ifdef UNIV_DEBUG
if (buf_debug_prints) {
fprintf(stderr,
"Recovery applies read-ahead pages %lu\n", (ulong) n_stored);
}
-#endif /* UNIV_DEBUG */
}
diff --git a/innobase/data/data0type.c b/innobase/data/data0type.c
index 698b5361dfa..97d93b1b0ec 100644
--- a/innobase/data/data0type.c
+++ b/innobase/data/data0type.c
@@ -104,7 +104,6 @@ dtype_form_prtype(
return(old_prtype + (charset_coll << 16));
}
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates a data type structure. */
@@ -123,7 +122,6 @@ dtype_validate(
return(TRUE);
}
-#endif /* UNIV_DEBUG */
/*************************************************************************
Prints a data type structure. */
diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c
index aa5787ee30e..71cf908db4e 100644
--- a/innobase/dict/dict0dict.c
+++ b/innobase/dict/dict0dict.c
@@ -3488,9 +3488,9 @@ dict_tree_create(
tree->id = index->id;
UT_LIST_INIT(tree->tree_indexes);
-#ifdef UNIV_DEBUG
+
tree->magic_n = DICT_TREE_MAGIC_N;
-#endif /* UNIV_DEBUG */
+
rw_lock_create(&(tree->lock));
rw_lock_set_level(&(tree->lock), SYNC_INDEX_TREE);
@@ -3929,7 +3929,6 @@ dict_foreign_print_low(
fputs(" )\n", stderr);
}
-#ifdef UNIV_DEBUG
/**************************************************************************
Prints a table data. */
@@ -3962,7 +3961,6 @@ dict_table_print_by_name(
dict_table_print_low(table);
mutex_exit(&(dict_sys->mutex));
}
-#endif /* UNIV_DEBUG */
/**************************************************************************
Prints a table data. */
diff --git a/innobase/dict/dict0mem.c b/innobase/dict/dict0mem.c
index 936b06b1905..8f05475df47 100644
--- a/innobase/dict/dict0mem.c
+++ b/innobase/dict/dict0mem.c
@@ -87,9 +87,9 @@ dict_mem_table_create(
mutex_set_level(&(table->autoinc_mutex), SYNC_DICT_AUTOINC_MUTEX);
table->autoinc_inited = FALSE;
-#ifdef UNIV_DEBUG
+
table->magic_n = DICT_TABLE_MAGIC_N;
-#endif /* UNIV_DEBUG */
+
return(table);
}
@@ -205,9 +205,7 @@ dict_mem_index_create(
index->stat_n_diff_key_vals = NULL;
index->cached = FALSE;
-#ifdef UNIV_DEBUG
index->magic_n = DICT_INDEX_MAGIC_N;
-#endif /* UNIV_DEBUG */
return(index);
}
diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c
index e7b97e88f32..34b6de76ff4 100644
--- a/innobase/fsp/fsp0fsp.c
+++ b/innobase/fsp/fsp0fsp.c
@@ -3476,8 +3476,7 @@ fseg_validate_low(
return(TRUE);
}
-
-#ifdef UNIV_DEBUG
+
/***********************************************************************
Validates a segment. */
@@ -3502,7 +3501,6 @@ fseg_validate(
return(ret);
}
-#endif /* UNIV_DEBUG */
/***********************************************************************
Writes info of a segment. */
@@ -3554,7 +3552,6 @@ fseg_print_low(
(ulong) n_used);
}
-#ifdef UNIV_DEBUG
/***********************************************************************
Writes info of a segment. */
@@ -3575,7 +3572,6 @@ fseg_print(
fseg_print_low(inode, mtr);
}
-#endif /* UNIV_DEBUG */
/***********************************************************************
Validates the file space system and its segments. */
diff --git a/innobase/fut/fut0lst.c b/innobase/fut/fut0lst.c
index 3d92aaba1ef..8deaa8adb3f 100644
--- a/innobase/fut/fut0lst.c
+++ b/innobase/fut/fut0lst.c
@@ -490,7 +490,6 @@ flst_validate(
return(TRUE);
}
-#ifdef UNIV_DEBUG
/************************************************************************
Prints info of a file-based list. */
@@ -517,4 +516,3 @@ flst_print(
(ulong) buf_frame_get_page_no(frame),
(ulong) (base - frame), (ulong) len);
}
-#endif /* UNIV_DEBUG */
diff --git a/innobase/ha/hash0hash.c b/innobase/ha/hash0hash.c
index 372104e54b3..facdea66198 100644
--- a/innobase/ha/hash0hash.c
+++ b/innobase/ha/hash0hash.c
@@ -22,7 +22,6 @@ hash_mutex_enter(
hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
mutex_enter(hash_get_mutex(table, fold));
}
@@ -35,10 +34,41 @@ hash_mutex_exit(
hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
mutex_exit(hash_get_mutex(table, fold));
}
+/****************************************************************
+Reserves all the mutexes of a hash table, in an ascending order. */
+
+void
+hash_mutex_enter_all(
+/*=================*/
+ hash_table_t* table) /* in: hash table */
+{
+ ulint i;
+
+ for (i = 0; i < table->n_mutexes; i++) {
+
+ mutex_enter(table->mutexes + i);
+ }
+}
+
+/****************************************************************
+Releases all the mutexes of a hash table. */
+
+void
+hash_mutex_exit_all(
+/*================*/
+ hash_table_t* table) /* in: hash table */
+{
+ ulint i;
+
+ for (i = 0; i < table->n_mutexes; i++) {
+
+ mutex_exit(table->mutexes + i);
+ }
+}
+
/*****************************************************************
Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */
@@ -68,9 +98,7 @@ hash_create(
table->mutexes = NULL;
table->heaps = NULL;
table->heap = NULL;
-#ifdef UNIV_DEBUG
table->magic_n = HASH_TABLE_MAGIC_N;
-#endif /* UNIV_DEBUG */
/* Initialize the cell array */
@@ -91,7 +119,6 @@ hash_table_free(
/*============*/
hash_table_t* table) /* in, own: hash table */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
ut_a(table->mutexes == NULL);
ut_free(table->array);
@@ -113,7 +140,6 @@ hash_create_mutexes(
ulint i;
ut_a(n_mutexes == ut_2_power_up(n_mutexes));
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
table->mutexes = mem_alloc(n_mutexes * sizeof(mutex_t));
diff --git a/innobase/ibuf/ibuf0ibuf.c b/innobase/ibuf/ibuf0ibuf.c
index 931fb7f4168..f05e69863a3 100644
--- a/innobase/ibuf/ibuf0ibuf.c
+++ b/innobase/ibuf/ibuf0ibuf.c
@@ -201,15 +201,13 @@ because ibuf merge is done to a page when it is read in, and it is
still physically like the index page even if the index would have been
dropped! So, there seems to be no problem. */
-#ifdef UNIV_DEBUG
/**********************************************************************
Validates the ibuf data structures when the caller owns ibuf_mutex. */
-static
+
ibool
ibuf_validate_low(void);
/*===================*/
/* out: TRUE if ok */
-#endif /* UNIV_DEBUG */
/**********************************************************************
Sets the flag in the current OS thread local storage denoting that it is
@@ -3278,10 +3276,10 @@ leave_loop:
mem_heap_free(heap);
}
-#ifdef UNIV_DEBUG
+
/**********************************************************************
Validates the ibuf data structures when the caller owns ibuf_mutex. */
-static
+
ibool
ibuf_validate_low(void)
/*===================*/
@@ -3308,7 +3306,6 @@ ibuf_validate_low(void)
return(TRUE);
}
-#endif /* UNIV_DEBUG */
/**********************************************************************
Looks if the insert buffer is empty. */
diff --git a/innobase/include/Makefile.am b/innobase/include/Makefile.am
index 5ec70da97a2..102d25566da 100644
--- a/innobase/include/Makefile.am
+++ b/innobase/include/Makefile.am
@@ -43,7 +43,7 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \
row0purge.ic row0row.h row0row.ic row0sel.h row0sel.ic \
row0types.h row0uins.h row0uins.ic row0umod.h row0umod.ic \
row0undo.h row0undo.ic row0upd.h row0upd.ic row0vers.h \
- row0vers.ic srv0srv.h srv0srv.ic srv0start.h \
+ row0vers.ic srv0que.h srv0srv.h srv0srv.ic srv0start.h \
sync0arr.h sync0arr.ic sync0rw.h \
sync0rw.ic sync0sync.h sync0sync.ic sync0types.h \
thr0loc.h thr0loc.ic trx0purge.h trx0purge.ic trx0rec.h \
diff --git a/innobase/include/btr0btr.h b/innobase/include/btr0btr.h
index e904db3272f..8606fcd2a5c 100644
--- a/innobase/include/btr0btr.h
+++ b/innobase/include/btr0btr.h
@@ -392,7 +392,6 @@ btr_page_free_low(
page_t* page, /* in: page to be freed, x-latched */
ulint level, /* in: page level */
mtr_t* mtr); /* in: mtr */
-#ifdef UNIV_DEBUG
/*****************************************************************
Prints size info of a B-tree. */
@@ -409,7 +408,6 @@ btr_print_tree(
dict_tree_t* tree, /* in: tree */
ulint width); /* in: print this many entries from start
and end */
-#endif /* UNIV_DEBUG */
/****************************************************************
Checks the size and number of fields in a record based on the definition of
the index. */
diff --git a/innobase/include/buf0buf.h b/innobase/include/buf0buf.h
index 9590fea1276..53599d03c73 100644
--- a/innobase/include/buf0buf.h
+++ b/innobase/include/buf0buf.h
@@ -54,11 +54,9 @@ Created 11/5/1995 Heikki Tuuri
#define BUF_KEEP_OLD 52
extern buf_pool_t* buf_pool; /* The buffer pool of the database */
-#ifdef UNIV_DEBUG
extern ibool buf_debug_prints;/* If this is set TRUE, the program
prints info whenever read or flush
occurs */
-#endif /* UNIV_DEBUG */
/************************************************************************
Creates the buffer pool. */
@@ -478,14 +476,12 @@ buf_pool_is_block(
/*==============*/
/* out: TRUE if pointer to block */
void* ptr); /* in: pointer to memory */
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates the buffer pool data structure. */
ibool
buf_validate(void);
/*==============*/
-#endif /* UNIV_DEBUG */
/************************************************************************
Prints a page to stderr. */
@@ -897,7 +893,7 @@ struct buf_pool_struct{
ulint n_pend_reads; /* number of pending read operations */
- time_t last_printout_time; /* when buf_print_io was last time
+ time_t last_printout_time; /* when buf_print was last time
called */
ulint n_pages_read; /* number read operations */
ulint n_pages_written;/* number write operations */
@@ -912,10 +908,10 @@ struct buf_pool_struct{
ulint n_pages_awe_remapped; /* if AWE is enabled, the
number of remaps of blocks to
buffer frames */
- ulint n_page_gets_old;/* n_page_gets when buf_print_io was
+ ulint n_page_gets_old;/* n_page_gets when buf_print was
last time called: used to calculate
hit rate */
- ulint n_pages_read_old;/* n_pages_read when buf_print_io was
+ ulint n_pages_read_old;/* n_pages_read when buf_print was
last time called */
ulint n_pages_written_old;/* number write operations */
ulint n_pages_created_old;/* number of pages created in
diff --git a/innobase/include/buf0buf.ic b/innobase/include/buf0buf.ic
index fa8421b63ad..681a0ef000a 100644
--- a/innobase/include/buf0buf.ic
+++ b/innobase/include/buf0buf.ic
@@ -11,6 +11,10 @@ Created 11/5/1995 Heikki Tuuri
#include "buf0rea.h"
#include "mtr0mtr.h"
+extern ulint buf_dbg_counter; /* This is used to insert validation
+ operations in execution in the
+ debug version */
+
/************************************************************************
Recommends a move of a block to the start of the LRU list if there is danger
of dropping from the buffer pool. NOTE: does not reserve the buffer pool
diff --git a/innobase/include/buf0flu.h b/innobase/include/buf0flu.h
index 6f39eef7210..1b40acaa269 100644
--- a/innobase/include/buf0flu.h
+++ b/innobase/include/buf0flu.h
@@ -97,7 +97,6 @@ buf_flush_ready_for_replace(
/* out: TRUE if can replace immediately */
buf_block_t* block); /* in: buffer control block, must be in state
BUF_BLOCK_FILE_PAGE and in the LRU list */
-#ifdef UNIV_DEBUG
/**********************************************************************
Validates the flush list. */
@@ -105,7 +104,6 @@ ibool
buf_flush_validate(void);
/*====================*/
/* out: TRUE if ok */
-#endif /* UNIV_DEBUG */
/* When buf_flush_free_margin is called, it tries to make this many blocks
available to replacement in the free list and at the end of the LRU list (to
diff --git a/innobase/include/buf0lru.h b/innobase/include/buf0lru.h
index 98aa0252e12..69a376f8cab 100644
--- a/innobase/include/buf0lru.h
+++ b/innobase/include/buf0lru.h
@@ -112,7 +112,6 @@ void
buf_LRU_make_block_old(
/*===================*/
buf_block_t* block); /* in: control block */
-#ifdef UNIV_DEBUG
/**************************************************************************
Validates the LRU list. */
@@ -125,7 +124,6 @@ Prints the LRU list. */
void
buf_LRU_print(void);
/*===============*/
-#endif /* UNIV_DEBUG */
#ifndef UNIV_NONINL
#include "buf0lru.ic"
diff --git a/innobase/include/data0data.h b/innobase/include/data0data.h
index e2de13d0520..2136de0f9b3 100644
--- a/innobase/include/data0data.h
+++ b/innobase/include/data0data.h
@@ -395,11 +395,9 @@ struct dtuple_struct {
UT_LIST_NODE_T(dtuple_t) tuple_list;
/* data tuples can be linked into a
list using this field */
-#ifdef UNIV_DEBUG
- ulint magic_n;
-#define DATA_TUPLE_MAGIC_N 65478679
-#endif /* UNIV_DEBUG */
+ ulint magic_n;
};
+#define DATA_TUPLE_MAGIC_N 65478679
/* A slot for a field in a big rec vector */
diff --git a/innobase/include/data0type.h b/innobase/include/data0type.h
index 2138df97392..fe38a224a66 100644
--- a/innobase/include/data0type.h
+++ b/innobase/include/data0type.h
@@ -305,7 +305,7 @@ dtype_new_read_for_order_and_null_size(
/*===================================*/
dtype_t* type, /* in: type struct */
byte* buf); /* in: buffer for stored type order info */
-#ifdef UNIV_DEBUG
+
/*************************************************************************
Validates a data type structure. */
@@ -314,7 +314,6 @@ dtype_validate(
/*===========*/
/* out: TRUE if ok */
dtype_t* type); /* in: type struct to validate */
-#endif /* UNIV_DEBUG */
/*************************************************************************
Prints a data type structure. */
diff --git a/innobase/include/dict0dict.h b/innobase/include/dict0dict.h
index fe04359d6f1..ebb34f7dda0 100644
--- a/innobase/include/dict0dict.h
+++ b/innobase/include/dict0dict.h
@@ -325,19 +325,18 @@ dict_table_get_index_noninline(
dict_table_t* table, /* in: table */
const char* name); /* in: index name */
/**************************************************************************
-Prints a table data. */
+Prints a table definition. */
void
-dict_table_print_low(
-/*=================*/
+dict_table_print(
+/*=============*/
dict_table_t* table); /* in: table */
-#ifdef UNIV_DEBUG
/**************************************************************************
-Prints a table definition. */
+Prints a table data. */
void
-dict_table_print(
-/*=============*/
+dict_table_print_low(
+/*=================*/
dict_table_t* table); /* in: table */
/**************************************************************************
Prints a table data when we know the table name. */
@@ -346,7 +345,6 @@ void
dict_table_print_by_name(
/*=====================*/
const char* name);
-#endif /* UNIV_DEBUG */
/**************************************************************************
Outputs info on foreign keys of a table. */
diff --git a/innobase/include/dict0mem.h b/innobase/include/dict0mem.h
index f141ea9da09..3fc3e850987 100644
--- a/innobase/include/dict0mem.h
+++ b/innobase/include/dict0mem.h
@@ -188,12 +188,11 @@ struct dict_tree_struct{
the list; if the tree is of the mixed
type, the first index in the list is the
index of the cluster which owns the tree */
-#ifdef UNIV_DEBUG
ulint magic_n;/* magic number */
-#define DICT_TREE_MAGIC_N 7545676
-#endif /* UNIV_DEBUG */
};
+#define DICT_TREE_MAGIC_N 7545676
+
/* Data structure for an index */
struct dict_index_struct{
dulint id; /* id of the index */
@@ -238,10 +237,7 @@ struct dict_index_struct{
ulint stat_n_leaf_pages;
/* approximate number of leaf pages in the
index tree */
-#ifdef UNIV_DEBUG
ulint magic_n;/* magic number */
-#define DICT_INDEX_MAGIC_N 76789786
-#endif /* UNIV_DEBUG */
};
/* Data structure for a foreign key constraint; an example:
@@ -292,6 +288,9 @@ a foreign key constraint is enforced, therefore RESTRICT just means no flag */
#define DICT_FOREIGN_ON_DELETE_NO_ACTION 16
#define DICT_FOREIGN_ON_UPDATE_NO_ACTION 32
+
+#define DICT_INDEX_MAGIC_N 76789786
+
/* Data structure for a database table */
struct dict_table_struct{
dulint id; /* id of the table or cluster */
@@ -410,12 +409,10 @@ struct dict_table_struct{
inited; MySQL gets the init value by executing
SELECT MAX(auto inc column) */
ib_longlong autoinc;/* autoinc counter value to give to the
- next inserted row */
-#ifdef UNIV_DEBUG
+ next inserted row */
ulint magic_n;/* magic number */
-#define DICT_TABLE_MAGIC_N 76333786
-#endif /* UNIV_DEBUG */
};
+#define DICT_TABLE_MAGIC_N 76333786
#ifndef UNIV_NONINL
#include "dict0mem.ic"
diff --git a/innobase/include/fsp0fsp.h b/innobase/include/fsp0fsp.h
index 20f4f4c2abd..2fcde882df7 100644
--- a/innobase/include/fsp0fsp.h
+++ b/innobase/include/fsp0fsp.h
@@ -332,7 +332,6 @@ void
fsp_print(
/*======*/
ulint space); /* in: space id */
-#ifdef UNIV_DEBUG
/***********************************************************************
Validates a segment. */
@@ -350,7 +349,6 @@ fseg_print(
/*=======*/
fseg_header_t* header, /* in: segment header */
mtr_t* mtr); /* in: mtr */
-#endif /* UNIV_DEBUG */
/* Flags for fsp_reserve_free_extents */
#define FSP_NORMAL 1000000
diff --git a/innobase/include/fut0lst.h b/innobase/include/fut0lst.h
index 3f679d61ab5..5427e2248da 100644
--- a/innobase/include/fut0lst.h
+++ b/innobase/include/fut0lst.h
@@ -181,7 +181,6 @@ flst_validate(
/* out: TRUE if ok */
flst_base_node_t* base, /* in: pointer to base node of list */
mtr_t* mtr1); /* in: mtr */
-#ifdef UNIV_DEBUG
/************************************************************************
Prints info of a file-based list. */
@@ -190,7 +189,7 @@ flst_print(
/*=======*/
flst_base_node_t* base, /* in: pointer to base node of list */
mtr_t* mtr); /* in: mtr */
-#endif /* UNIV_DEBUG */
+
#ifndef UNIV_NONINL
#include "fut0lst.ic"
diff --git a/innobase/include/hash0hash.h b/innobase/include/hash0hash.h
index 79efe016324..51315e40875 100644
--- a/innobase/include/hash0hash.h
+++ b/innobase/include/hash0hash.h
@@ -283,6 +283,21 @@ hash_mutex_exit(
/*============*/
hash_table_t* table, /* in: hash table */
ulint fold); /* in: fold */
+/****************************************************************
+Reserves all the mutexes of a hash table, in an ascending order. */
+
+void
+hash_mutex_enter_all(
+/*=================*/
+ hash_table_t* table); /* in: hash table */
+/****************************************************************
+Releases all the mutexes of a hash table. */
+
+void
+hash_mutex_exit_all(
+/*================*/
+ hash_table_t* table); /* in: hash table */
+
struct hash_cell_struct{
void* node; /* hash chain node, NULL if none */
@@ -303,12 +318,11 @@ struct hash_table_struct {
memory heaps; there are then n_mutexes many of
these heaps */
mem_heap_t* heap;
-#ifdef UNIV_DEBUG
ulint magic_n;
-#define HASH_TABLE_MAGIC_N 76561114
-#endif /* UNIV_DEBUG */
};
+#define HASH_TABLE_MAGIC_N 76561114
+
#ifndef UNIV_NONINL
#include "hash0hash.ic"
#endif
diff --git a/innobase/include/hash0hash.ic b/innobase/include/hash0hash.ic
index 1b9acfa2f34..0d713140c13 100644
--- a/innobase/include/hash0hash.ic
+++ b/innobase/include/hash0hash.ic
@@ -18,7 +18,6 @@ hash_get_nth_cell(
hash_table_t* table, /* in: hash table */
ulint n) /* in: cell index */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
ut_ad(n < table->n_cells);
return(table->array + n);
@@ -33,7 +32,6 @@ hash_get_n_cells(
/* out: number of cells */
hash_table_t* table) /* in: table */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
return(table->n_cells);
}
@@ -47,7 +45,6 @@ hash_calc_hash(
ulint fold, /* in: folded value */
hash_table_t* table) /* in: hash table */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
return(ut_hash_ulint(fold, table->n_cells));
}
@@ -61,7 +58,6 @@ hash_get_mutex_no(
hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
return(ut_2pow_remainder(fold, table->n_mutexes));
}
@@ -75,7 +71,6 @@ hash_get_nth_heap(
hash_table_t* table, /* in: hash table */
ulint i) /* in: index of the heap */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
ut_ad(i < table->n_mutexes);
return(table->heaps[i]);
@@ -93,8 +88,6 @@ hash_get_heap(
{
ulint i;
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
-
if (table->heap) {
return(table->heap);
}
@@ -114,7 +107,6 @@ hash_get_nth_mutex(
hash_table_t* table, /* in: hash table */
ulint i) /* in: index of the mutex */
{
- ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
ut_ad(i < table->n_mutexes);
return(table->mutexes + i);
diff --git a/innobase/include/lock0lock.h b/innobase/include/lock0lock.h
index b1f9a10ee05..9c5f35c6674 100644
--- a/innobase/include/lock0lock.h
+++ b/innobase/include/lock0lock.h
@@ -19,9 +19,7 @@ Created 5/7/1996 Heikki Tuuri
#include "read0types.h"
#include "hash0hash.h"
-#ifdef UNIV_DEBUG
extern ibool lock_print_waits;
-#endif /* UNIV_DEBUG */
/* Buffer for storing information about the most recent deadlock error */
extern FILE* lock_latest_err_file;
@@ -475,7 +473,6 @@ lock_check_trx_id_sanity(
dict_index_t* index, /* in: clustered index */
ibool has_kernel_mutex);/* in: TRUE if the caller owns the
kernel mutex */
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates the lock queue on a single record. */
@@ -485,7 +482,6 @@ lock_rec_queue_validate(
/* out: TRUE if ok */
rec_t* rec, /* in: record to look at */
dict_index_t* index); /* in: index, or NULL if not known */
-#endif /* UNIV_DEBUG */
/*************************************************************************
Prints info of a table lock. */
@@ -509,7 +505,6 @@ void
lock_print_info(
/*============*/
FILE* file); /* in: file where to print */
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates the lock queue on a table. */
@@ -534,7 +529,6 @@ ibool
lock_validate(void);
/*===============*/
/* out: TRUE if ok */
-#endif /* UNIV_DEBUG */
/* The lock system */
extern lock_sys_t* lock_sys;
diff --git a/innobase/include/log0log.h b/innobase/include/log0log.h
index 25adc3b24b7..d14a116072d 100644
--- a/innobase/include/log0log.h
+++ b/innobase/include/log0log.h
@@ -18,9 +18,7 @@ typedef struct log_struct log_t;
typedef struct log_group_struct log_group_t;
extern ibool log_do_write;
-#ifdef UNIV_LOG_DEBUG
extern ibool log_debug_writes;
-#endif /* UNIV_LOG_DEBUG */
/* Wait modes for log_write_up_to */
#define LOG_NO_WAIT 91
@@ -691,13 +689,11 @@ struct log_struct{
ulint max_buf_free; /* recommended maximum value of
buf_free, after which the buffer is
flushed */
-#ifdef UNIV_LOG_DEBUG
ulint old_buf_free; /* value of buf free when log was
last time opened; only in the debug
version */
dulint old_lsn; /* value of lsn when log was last time
opened; only in the debug version */
-#endif /* UNIV_LOG_DEBUG */
ibool check_flush_or_checkpoint;
/* this is set to TRUE when there may
be need to flush the log buffer, or
diff --git a/innobase/include/log0log.ic b/innobase/include/log0log.ic
index 3a4a3c6a5e6..ca7531783a2 100644
--- a/innobase/include/log0log.ic
+++ b/innobase/include/log0log.ic
@@ -10,7 +10,6 @@ Created 12/9/1995 Heikki Tuuri
#include "mach0data.h"
#include "mtr0mtr.h"
-#ifdef UNIV_LOG_DEBUG
/**********************************************************
Checks by parsing that the catenated log segment for a single mtr is
consistent. */
@@ -22,7 +21,6 @@ log_check_log_recs(
in the log_sys->buf log buffer */
ulint len, /* in: segment length in bytes */
dulint buf_start_lsn); /* in: buffer start lsn */
-#endif /* UNIV_LOG_DEBUG */
/****************************************************************
Gets a log block flush bit. */
diff --git a/innobase/include/mem0dbg.h b/innobase/include/mem0dbg.h
index 61c66cc218c..96f30842df6 100644
--- a/innobase/include/mem0dbg.h
+++ b/innobase/include/mem0dbg.h
@@ -31,7 +31,6 @@ check fields at the both ends of the field. */
#define MEM_SPACE_NEEDED(N) ut_calc_align((N), UNIV_MEM_ALIGNMENT)
#endif
-#ifdef UNIV_DEBUG
/*******************************************************************
Checks a memory heap for consistency and prints the contents if requested.
Outputs the sum of sizes of buffers given to the user (only in
@@ -61,7 +60,6 @@ mem_heap_validate_or_print(
ulint* n_blocks); /* out: number of blocks in the heap,
if a NULL pointer is passed as this
argument, it is ignored */
-#endif /* UNIV_DEBUG */
#ifdef UNIV_MEM_DEBUG
/******************************************************************
Prints the contents of a memory heap. */
@@ -71,7 +69,6 @@ mem_heap_print(
/*===========*/
mem_heap_t* heap); /* in: memory heap */
#endif /* UNIV_MEM_DEBUG */
-#ifdef UNIV_DEBUG
/******************************************************************
Checks that an object is a memory heap (or a block of it) */
@@ -88,7 +85,6 @@ mem_heap_validate(
/*==============*/
/* out: TRUE if ok */
mem_heap_t* heap); /* in: memory heap */
-#endif /* UNIV_DEBUG */
#ifdef UNIV_MEM_DEBUG
/*********************************************************************
TRUE if no memory is currently allocated. */
@@ -120,4 +116,17 @@ void
mem_analyze_corruption(
/*===================*/
byte* ptr); /* in: pointer to place of possible corruption */
+/*********************************************************************
+Prints information of dynamic memory usage and currently allocated memory
+heaps or buffers. Can only be used in the debug version. */
+void
+mem_print_info(void);
+/*================*/
+/*********************************************************************
+Prints information of dynamic memory usage and currently allocated memory
+heaps or buffers since the last ..._print_info or..._print_new_info. */
+
+void
+mem_print_new_info(void);
+/*====================*/
diff --git a/innobase/include/mem0dbg.ic b/innobase/include/mem0dbg.ic
index 00db22eb518..7ce5f6f1ba5 100644
--- a/innobase/include/mem0dbg.ic
+++ b/innobase/include/mem0dbg.ic
@@ -56,7 +56,6 @@ mem_hash_insert(
mem_heap_t* heap, /* in: the created heap */
const char* file_name, /* in: file name of creation */
ulint line); /* in: line where created */
-#ifdef UNIV_MEM_DEBUG
/*******************************************************************
Removes a memory heap (which is going to be freed by the caller)
from the list of live memory heaps. Returns the size of the heap
@@ -72,7 +71,7 @@ mem_hash_remove(
mem_heap_t* heap, /* in: the heap to be freed */
const char* file_name, /* in: file name of freeing */
ulint line); /* in: line where freed */
-#endif /* UNIV_MEM_DEBUG */
+
void
mem_field_header_set_len(byte* field, ulint len);
diff --git a/innobase/include/mem0mem.h b/innobase/include/mem0mem.h
index 18bffe5732e..cd01ac77bf3 100644
--- a/innobase/include/mem0mem.h
+++ b/innobase/include/mem0mem.h
@@ -261,18 +261,6 @@ mem_free_func(
const char* file_name, /* in: file name where created */
ulint line /* in: line where created */
);
-/*******************************************************************
-Implements realloc. */
-UNIV_INLINE
-void*
-mem_realloc(
-/*========*/
- /* out, own: free storage,
- NULL if did not succeed */
- void* buf, /* in: pointer to an old buffer */
- ulint n, /* in: desired number of bytes */
- const char* file_name, /* in: file name where called */
- ulint line); /* in: line where called */
/**************************************************************************
Duplicates a NUL-terminated string. */
diff --git a/innobase/include/mem0mem.ic b/innobase/include/mem0mem.ic
index df3dbf9b576..d97b7d6c4dd 100644
--- a/innobase/include/mem0mem.ic
+++ b/innobase/include/mem0mem.ic
@@ -562,24 +562,6 @@ mem_heap_get_size(
return(size);
}
-/*******************************************************************
-Implements realloc. */
-UNIV_INLINE
-void*
-mem_realloc(
-/*========*/
- /* out, own: free storage,
- NULL if did not succeed */
- void* buf, /* in: pointer to an old buffer */
- ulint n, /* in: desired number of bytes */
- const char* file_name, /* in: file name where called */
- ulint line) /* in: line where called */
-{
- mem_free(buf);
-
- return(mem_alloc_func(n, file_name, line));
-}
-
/**************************************************************************
Duplicates a NUL-terminated string. */
UNIV_INLINE
diff --git a/innobase/include/mem0pool.h b/innobase/include/mem0pool.h
index 95cf19676fb..43707bd5f61 100644
--- a/innobase/include/mem0pool.h
+++ b/innobase/include/mem0pool.h
@@ -83,7 +83,6 @@ Releases the mem pool mutex. */
void
mem_pool_mutex_exit(void);
/*=====================*/
-#ifdef UNIV_DEBUG
/************************************************************************
Validates a memory pool. */
@@ -100,7 +99,7 @@ mem_pool_print_info(
/*================*/
FILE* outfile,/* in: output file to write to */
mem_pool_t* pool); /* in: memory pool */
-#endif /* UNIV_DEBUG */
+
#ifndef UNIV_NONINL
#include "mem0pool.ic"
diff --git a/innobase/include/mtr0mtr.h b/innobase/include/mtr0mtr.h
index 55fa3d80a42..e8c68a91dad 100644
--- a/innobase/include/mtr0mtr.h
+++ b/innobase/include/mtr0mtr.h
@@ -246,7 +246,6 @@ mtr_memo_contains(
mtr_t* mtr, /* in: mtr */
void* object, /* in: object to search */
ulint type); /* in: type of object */
-#ifdef UNIV_DEBUG
/*************************************************************
Prints info of an mtr handle. */
@@ -254,7 +253,6 @@ void
mtr_print(
/*======*/
mtr_t* mtr); /* in: mtr */
-#endif /* UNIV_DEBUG */
/*######################################################################*/
#define MTR_BUF_MEMO_SIZE 200 /* number of slots in memo */
@@ -287,12 +285,7 @@ struct mtr_memo_slot_struct{
/* Mini-transaction handle and buffer */
struct mtr_struct{
-#ifdef UNIV_DEBUG
ulint state; /* MTR_ACTIVE, MTR_COMMITTING, MTR_COMMITTED */
-#define MTR_ACTIVE 12231
-#define MTR_COMMITTING 56456
-#define MTR_COMMITTED 34676
-#endif /* UNIV_DEBUG */
dyn_array_t memo; /* memo stack for locks etc. */
dyn_array_t log; /* mini-transaction log */
ibool modifications;
@@ -307,12 +300,15 @@ struct mtr_struct{
this mtr */
dulint end_lsn;/* end lsn of the possible log entry for
this mtr */
-#ifdef UNIV_DEBUG
ulint magic_n;
-#define MTR_MAGIC_N 54551
-#endif /* UNIV_DEBUG */
};
+#define MTR_MAGIC_N 54551
+
+#define MTR_ACTIVE 12231
+#define MTR_COMMITTING 56456
+#define MTR_COMMITTED 34676
+
#ifndef UNIV_NONINL
#include "mtr0mtr.ic"
#endif
diff --git a/innobase/include/pars0opt.h b/innobase/include/pars0opt.h
index ac0e885d05a..d091c3ee2d0 100644
--- a/innobase/include/pars0opt.h
+++ b/innobase/include/pars0opt.h
@@ -43,7 +43,6 @@ opt_find_all_cols(
to add new found columns */
plan_t* plan, /* in: plan or NULL */
que_node_t* exp); /* in: expression or condition */
-#ifdef UNIV_SQL_DEBUG
/************************************************************************
Prints info of a query plan. */
@@ -51,7 +50,6 @@ void
opt_print_query_plan(
/*=================*/
sel_node_t* sel_node); /* in: select node */
-#endif /* UNIV_SQL_DEBUG */
#ifndef UNIV_NONINL
#include "pars0opt.ic"
diff --git a/innobase/include/que0que.h b/innobase/include/que0que.h
index a438116781f..e1874edcaf2 100644
--- a/innobase/include/que0que.h
+++ b/innobase/include/que0que.h
@@ -152,6 +152,17 @@ que_run_threads(
/*============*/
que_thr_t* thr); /* in: query thread which is run initially */
/**************************************************************************
+After signal handling is finished, returns control to a query graph error
+handling routine. (Currently, just returns the control to the root of the
+graph so that the graph can communicate an error message to the client.) */
+
+void
+que_fork_error_handle(
+/*==================*/
+ trx_t* trx, /* in: trx */
+ que_t* fork); /* in: query graph which was run before signal
+ handling started, NULL not allowed */
+/**************************************************************************
Handles an SQL error noticed during query thread execution. At the moment,
does nothing! */
@@ -170,15 +181,18 @@ a single worker thread to execute it. This function should be used to end
the wait state of a query thread waiting for a lock or a stored procedure
completion. */
-que_thr_t*
+void
que_thr_end_wait(
/*=============*/
- /* out: next query thread to run;
- NULL if none */
- que_thr_t* thr); /* in: query thread in the
+ que_thr_t* thr, /* in: query thread in the
QUE_THR_LOCK_WAIT,
or QUE_THR_PROCEDURE_WAIT, or
QUE_THR_SIG_REPLY_WAIT state */
+ que_thr_t** next_thr); /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
/**************************************************************************
Same as que_thr_end_wait, but no parameter next_thr available. */
@@ -293,6 +307,22 @@ que_thr_peek_stop(
mutex reserved is necessary before deciding
the actual stopping */
que_thr_t* thr); /* in: query thread */
+/***************************************************************************
+Returns TRUE if the query graph is for a SELECT statement. */
+UNIV_INLINE
+ibool
+que_graph_is_select(
+/*================*/
+ /* out: TRUE if a select */
+ que_t* graph); /* in: graph */
+/**************************************************************************
+Prints info of an SQL query graph node. */
+
+void
+que_node_print_info(
+/*================*/
+ que_node_t* node); /* in: query graph node */
+
/* Query graph query thread node: the fields are protected by the kernel
mutex with the exceptions named below */
diff --git a/innobase/include/que0que.ic b/innobase/include/que0que.ic
index a63922f8c80..ae4ed10560f 100644
--- a/innobase/include/que0que.ic
+++ b/innobase/include/que0que.ic
@@ -238,3 +238,21 @@ que_thr_peek_stop(
return(FALSE);
}
+
+/***************************************************************************
+Returns TRUE if the query graph is for a SELECT statement. */
+UNIV_INLINE
+ibool
+que_graph_is_select(
+/*================*/
+ /* out: TRUE if a select */
+ que_t* graph) /* in: graph */
+{
+ if (graph->fork_type == QUE_FORK_SELECT_SCROLL
+ || graph->fork_type == QUE_FORK_SELECT_NON_SCROLL) {
+
+ return(TRUE);
+ }
+
+ return(FALSE);
+}
diff --git a/innobase/include/row0ins.h b/innobase/include/row0ins.h
index f3f0b7e8eca..a5b4b74e7fc 100644
--- a/innobase/include/row0ins.h
+++ b/innobase/include/row0ins.h
@@ -145,12 +145,11 @@ struct ins_node_struct{
entry_list and sys fields are stored here;
if this is NULL, entry list should be created
and buffers for sys fields in row allocated */
-#ifdef UNIV_DEBUG
ulint magic_n;
-#define INS_NODE_MAGIC_N 15849075
-#endif /* UNIV_DEBUG */
};
+#define INS_NODE_MAGIC_N 15849075
+
/* Insert node types */
#define INS_SEARCHED 0 /* INSERT INTO ... SELECT ... */
#define INS_VALUES 1 /* INSERT INTO ... VALUES ... */
diff --git a/innobase/include/row0upd.h b/innobase/include/row0upd.h
index 687e90deee5..f5e0a88231f 100644
--- a/innobase/include/row0upd.h
+++ b/innobase/include/row0upd.h
@@ -384,12 +384,11 @@ struct upd_node_struct{
sym_node_t* table_sym;/* table node in symbol table */
que_node_t* col_assign_list;
/* column assignment list */
-#ifdef UNIV_DEBUG
ulint magic_n;
-#define UPD_NODE_MAGIC_N 1579975
-#endif /* UNIV_DEBUG */
};
+#define UPD_NODE_MAGIC_N 1579975
+
/* Node execution states */
#define UPD_NODE_SET_IX_LOCK 1 /* execution came to the node from
a node above and if the field
diff --git a/innobase/include/srv0que.h b/innobase/include/srv0que.h
new file mode 100644
index 00000000000..05c339cdd32
--- /dev/null
+++ b/innobase/include/srv0que.h
@@ -0,0 +1,53 @@
+/******************************************************
+Server query execution
+
+(c) 1996 Innobase Oy
+
+Created 6/5/1996 Heikki Tuuri
+*******************************************************/
+
+
+#ifndef srv0que_h
+#define srv0que_h
+
+#include "univ.i"
+#include "que0types.h"
+
+/**************************************************************************
+Checks if there is work to do in the server task queue. If there is, the
+thread starts processing a task. Before leaving, it again checks the task
+queue and picks a new task if any exists. This is called by a SRV_WORKER
+thread. */
+
+void
+srv_que_task_queue_check(void);
+/*==========================*/
+/**************************************************************************
+Performs round-robin on the server tasks. This is called by a SRV_WORKER
+thread every second or so. */
+
+que_thr_t*
+srv_que_round_robin(
+/*================*/
+ /* out: the new (may be == thr) query thread
+ to run */
+ que_thr_t* thr); /* in: query thread */
+/**************************************************************************
+Enqueues a task to server task queue and releases a worker thread, if
+there exists one suspended. */
+
+void
+srv_que_task_enqueue(
+/*=================*/
+ que_thr_t* thr); /* in: query thread */
+/**************************************************************************
+Enqueues a task to server task queue and releases a worker thread, if
+there exists one suspended. */
+
+void
+srv_que_task_enqueue_low(
+/*=====================*/
+ que_thr_t* thr); /* in: query thread */
+
+#endif
+
diff --git a/innobase/include/sync0rw.h b/innobase/include/sync0rw.h
index 63b01ffac80..9a988a03e92 100644
--- a/innobase/include/sync0rw.h
+++ b/innobase/include/sync0rw.h
@@ -85,7 +85,6 @@ void
rw_lock_free(
/*=========*/
rw_lock_t* lock); /* in: rw-lock */
-#ifdef UNIV_DEBUG
/**********************************************************************
Checks that the rw-lock has been initialized and that there are no
simultaneous shared and exclusive locks. */
@@ -94,7 +93,6 @@ ibool
rw_lock_validate(
/*=============*/
rw_lock_t* lock);
-#endif /* UNIV_DEBUG */
/******************************************************************
NOTE! The following macros should be used in rw s-locking, not the
corresponding function. */
diff --git a/innobase/include/sync0sync.h b/innobase/include/sync0sync.h
index 4307ca5ba0c..8e0ec715b12 100644
--- a/innobase/include/sync0sync.h
+++ b/innobase/include/sync0sync.h
@@ -143,7 +143,6 @@ void
sync_print(
/*=======*/
FILE* file); /* in: file where to print */
-#ifdef UNIV_DEBUG
/**********************************************************************
Checks that the mutex has been initialized. */
@@ -151,7 +150,6 @@ ibool
mutex_validate(
/*===========*/
mutex_t* mutex);
-#endif /* UNIV_DEBUG */
/**********************************************************************
Sets the mutex latching level field. */
diff --git a/innobase/include/trx0roll.h b/innobase/include/trx0roll.h
index aa88fc249fc..6004551f456 100644
--- a/innobase/include/trx0roll.h
+++ b/innobase/include/trx0roll.h
@@ -91,12 +91,16 @@ trx_undo_rec_release(
/*************************************************************************
Starts a rollback operation. */
-que_thr_t*
+void
trx_rollback(
/*=========*/
- /* out: next query thread to run */
trx_t* trx, /* in: transaction */
- trx_sig_t* sig); /* in: signal starting the rollback */
+ trx_sig_t* sig, /* in: signal starting the rollback */
+ que_thr_t** next_thr);/* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
/***********************************************************************
Rollback or clean up transactions which have no user session. If the
transaction already was committed, then we clean up a possible insert
@@ -108,12 +112,17 @@ trx_rollback_or_clean_all_without_sess(void);
/********************************************************************
Finishes a transaction rollback. */
-que_thr_t*
+void
trx_finish_rollback_off_kernel(
/*===========================*/
- /* out: next query thread to run */
que_t* graph, /* in: undo graph which can now be freed */
- trx_t* trx); /* in: transaction */
+ trx_t* trx, /* in: transaction */
+ que_thr_t** next_thr);/* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if this parameter is
+ NULL, it is ignored */
/********************************************************************
Builds an undo 'query' graph for a transaction. The actual rollback is
performed by executing this query graph like a query subprocedure call.
diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h
index 9b7ac22e617..a8c1df534da 100644
--- a/innobase/include/trx0trx.h
+++ b/innobase/include/trx0trx.h
@@ -194,10 +194,9 @@ trx_end_lock_wait(
/********************************************************************
Sends a signal to a trx object. */
-que_thr_t*
+ibool
trx_sig_send(
/*=========*/
- /* out: next query thread to run */
/* out: TRUE if the signal was
successfully delivered */
trx_t* trx, /* in: trx handle */
@@ -207,17 +206,27 @@ trx_sig_send(
que_thr_t* receiver_thr, /* in: query thread which wants the
reply, or NULL; if type is
TRX_SIG_END_WAIT, this must be NULL */
- trx_savept_t* savept); /* in: possible rollback savepoint, or
+ trx_savept_t* savept, /* in: possible rollback savepoint, or
NULL */
+ que_thr_t** next_thr); /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if the parameter
+ is NULL, it is ignored */
/********************************************************************
Send the reply message when a signal in the queue of the trx has
been handled. */
-que_thr_t*
+void
trx_sig_reply(
/*==========*/
- /* out: next query thread to run */
- trx_sig_t* sig); /* in: signal */
+ trx_sig_t* sig, /* in: signal */
+ que_thr_t** next_thr); /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
/********************************************************************
Removes the signal object from a trx signal queue. */
@@ -229,11 +238,15 @@ trx_sig_remove(
/********************************************************************
Starts handling of a trx signal. */
-que_thr_t*
+void
trx_sig_start_handle(
/*=================*/
- /* out: next query thread to run, or NULL */
- trx_t* trx); /* in: trx handle */
+ trx_t* trx, /* in: trx handle */
+ que_thr_t** next_thr); /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
/********************************************************************
Ends signal handling. If the session is in the error state, and
trx->graph_before_signal_handling != NULL, returns control to the error
diff --git a/innobase/include/usr0sess.h b/innobase/include/usr0sess.h
index aeff7191e68..c7bcfb20fed 100644
--- a/innobase/include/usr0sess.h
+++ b/innobase/include/usr0sess.h
@@ -38,6 +38,7 @@ sess_try_close(
/* The session handle. All fields are protected by the kernel mutex */
struct sess_struct{
+ ulint state; /* state of the session */
trx_t* trx; /* transaction object permanently
assigned for the session: the
transaction instance designated by the
@@ -48,6 +49,11 @@ struct sess_struct{
session */
};
+/* Session states */
+#define SESS_ACTIVE 1
+#define SESS_ERROR 2 /* session contains an error message
+ which has not yet been communicated
+ to the client */
#ifndef UNIV_NONINL
#include "usr0sess.ic"
#endif
diff --git a/innobase/include/ut0mem.h b/innobase/include/ut0mem.h
index 85b99efff68..2e02b3f0b6b 100644
--- a/innobase/include/ut0mem.h
+++ b/innobase/include/ut0mem.h
@@ -67,6 +67,37 @@ ut_free(
/*====*/
void* ptr); /* in, own: memory block */
/**************************************************************************
+Implements realloc. This is needed by /pars/lexyy.c. Otherwise, you should not
+use this function because the allocation functions in mem0mem.h are the
+recommended ones in InnoDB.
+
+man realloc in Linux, 2004:
+
+ realloc() changes the size of the memory block pointed to
+ by ptr to size bytes. The contents will be unchanged to
+ the minimum of the old and new sizes; newly allocated mem­
+ ory will be uninitialized. If ptr is NULL, the call is
+ equivalent to malloc(size); if size is equal to zero, the
+ call is equivalent to free(ptr). Unless ptr is NULL, it
+ must have been returned by an earlier call to malloc(),
+ calloc() or realloc().
+
+RETURN VALUE
+ realloc() returns a pointer to the newly allocated memory,
+ which is suitably aligned for any kind of variable and may
+ be different from ptr, or NULL if the request fails. If
+ size was equal to 0, either NULL or a pointer suitable to
+ be passed to free() is returned. If realloc() fails the
+ original block is left untouched - it is not freed or
+ moved. */
+
+void*
+ut_realloc(
+/*=======*/
+ /* out, own: pointer to new mem block or NULL */
+ void* ptr, /* in: pointer to old block or NULL */
+ ulint size); /* in: desired size */
+/**************************************************************************
Frees in shutdown all allocated memory not freed yet. */
void
diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c
index 58c88f67017..be0806590a9 100644
--- a/innobase/lock/lock0lock.c
+++ b/innobase/lock/lock0lock.c
@@ -292,9 +292,7 @@ waiting, in its lock queue. Solution: We can copy the locks as gap type
locks, so that also the waiting locks are transformed to granted gap type
locks on the inserted record. */
-#ifdef UNIV_DEBUG
ibool lock_print_waits = FALSE;
-#endif /* UNIV_DEBUG */
/* The lock system */
lock_sys_t* lock_sys = NULL;
@@ -1354,8 +1352,7 @@ lock_rec_has_expl(
return(NULL);
}
-
-#ifdef UNIV_DEBUG
+
/*************************************************************************
Checks if some other transaction has a lock request in the queue. */
static
@@ -1398,7 +1395,6 @@ lock_rec_other_has_expl_req(
return(NULL);
}
-#endif /* UNIV_DEBUG */
/*************************************************************************
Checks if some other transaction has a conflicting explicit lock request
@@ -1688,13 +1684,11 @@ lock_rec_enqueue_waiting(
ut_a(que_thr_stop(thr));
-#ifdef UNIV_DEBUG
if (lock_print_waits) {
fprintf(stderr, "Lock wait for trx %lu in index ",
(ulong) ut_dulint_get_low(trx->id));
ut_print_name(stderr, index->name);
}
-#endif /* UNIV_DEBUG */
return(DB_LOCK_WAIT);
}
@@ -2034,12 +2028,10 @@ lock_grant(
lock->trx->n_tables_locked++;
}
-#ifdef UNIV_DEBUG
if (lock_print_waits) {
fprintf(stderr, "Lock wait for trx %lu ends\n",
(ulong) ut_dulint_get_low(lock->trx->id));
}
-#endif /* UNIV_DEBUG */
/* If we are resolving a deadlock by choosing another transaction
as a victim, then our original transaction may not be in the
@@ -3110,11 +3102,9 @@ lock_deadlock_recursive(
lock_table_print(ef, start->wait_lock);
}
-#ifdef UNIV_DEBUG
if (lock_print_waits) {
fputs("Deadlock detected\n", stderr);
}
-#endif /* UNIV_DEBUG */
if (ut_dulint_cmp(wait_lock->trx->undo_no,
start->undo_no) >= 0) {
@@ -4177,7 +4167,6 @@ loop:
goto loop;
}
-#ifdef UNIV_DEBUG
/*************************************************************************
Validates the lock queue on a table. */
@@ -4488,7 +4477,6 @@ lock_validate(void)
return(TRUE);
}
-#endif /* UNIV_DEBUG */
/*============ RECORD LOCK CHECKS FOR ROW OPERATIONS ====================*/
diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c
index 7d7c7dcf998..923ab448e07 100644
--- a/innobase/log/log0log.c
+++ b/innobase/log/log0log.c
@@ -32,9 +32,9 @@ ulint log_fsp_current_free_limit = 0;
log_t* log_sys = NULL;
ibool log_do_write = TRUE;
-#ifdef UNIV_LOG_DEBUG
+
ibool log_debug_writes = FALSE;
-#endif /* UNIV_LOG_DEBUG */
+
/* These control how often we print warnings if the last checkpoint is too
old */
@@ -945,12 +945,10 @@ log_group_check_flush_completion(
#endif /* UNIV_SYNC_DEBUG */
if (!log_sys->one_flushed && group->n_pending_writes == 0) {
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Log flushed first to group %lu\n", (ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
log_sys->written_to_some_lsn = log_sys->write_lsn;
log_sys->one_flushed = TRUE;
@@ -958,12 +956,10 @@ log_group_check_flush_completion(
return(LOG_UNLOCK_NONE_FLUSHED_LOCK);
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes && (group->n_pending_writes == 0)) {
fprintf(stderr, "Log flushed to group %lu\n", (ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
return(0);
}
@@ -1041,13 +1037,11 @@ log_io_complete(
fil_flush(group->space_id);
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Checkpoint info written to group %lu\n",
group->id);
}
-#endif /* UNIV_LOG_DEBUG */
log_io_complete_checkpoint();
@@ -1110,13 +1104,11 @@ log_group_file_header_flush(
dest_offset = nth_file * group->file_size;
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Writing log file header to group %lu file %lu\n",
(ulong) group->id, (ulong) nth_file);
}
-#endif /* UNIV_LOG_DEBUG */
if (log_do_write) {
log_sys->n_log_ios++;
@@ -1200,7 +1192,6 @@ loop:
write_len = len;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
@@ -1224,7 +1215,6 @@ loop:
+ i * OS_FILE_LOG_BLOCK_SIZE));
}
}
-#endif /* UNIV_LOG_DEBUG */
/* Calculate the checksums for each log block and write them to
the trailer fields of the log blocks */
@@ -1352,7 +1342,6 @@ loop:
return;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Writing log from %lu %lu up to lsn %lu %lu\n",
@@ -1361,7 +1350,6 @@ loop:
(ulong) ut_dulint_get_high(log_sys->lsn),
(ulong) ut_dulint_get_low(log_sys->lsn));
}
-#endif /* UNIV_LOG_DEBUG */
log_sys->n_pending_writes++;
@@ -1931,14 +1919,12 @@ log_checkpoint(
log_sys->next_checkpoint_lsn = oldest_lsn;
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr, "Making checkpoint no %lu at lsn %lu %lu\n",
(ulong) ut_dulint_get_low(log_sys->next_checkpoint_no),
(ulong) ut_dulint_get_high(oldest_lsn),
(ulong) ut_dulint_get_low(oldest_lsn));
}
-#endif /* UNIV_LOG_DEBUG */
log_groups_write_checkpoint_info();
@@ -2319,11 +2305,9 @@ loop:
exit(1);
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr, "Created archive file %s\n", name);
}
-#endif /* UNIV_LOG_DEBUG */
ret = os_file_close(file_handle);
@@ -2350,7 +2334,6 @@ loop:
len = group->file_size - (next_offset % group->file_size);
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Archiving starting at lsn %lu %lu, len %lu to group %lu\n",
@@ -2358,7 +2341,6 @@ loop:
(ulong) ut_dulint_get_low(start_lsn),
(ulong) len, (ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
log_sys->n_pending_archive_ios++;
@@ -2449,13 +2431,11 @@ log_archive_write_complete_groups(void)
trunc_files = n_files - 1;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes && trunc_files) {
fprintf(stderr,
"Complete file(s) archived to group %lu\n",
(ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
/* Calculate the archive file space start lsn */
start_lsn = ut_dulint_subtract(log_sys->next_archived_lsn,
@@ -2478,11 +2458,9 @@ log_archive_write_complete_groups(void)
fil_space_truncate_start(group->archive_space_id,
trunc_files * group->file_size);
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fputs("Archiving writes completed\n", stderr);
}
-#endif /* UNIV_LOG_DEBUG */
}
/**********************************************************
@@ -2499,11 +2477,9 @@ log_archive_check_completion_low(void)
if (log_sys->n_pending_archive_ios == 0
&& log_sys->archiving_phase == LOG_ARCHIVE_READ) {
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fputs("Archiving read completed\n", stderr);
}
-#endif /* UNIV_LOG_DEBUG */
/* Archive buffer has now been read in: start archive writes */
@@ -2647,7 +2623,6 @@ loop:
log_sys->next_archived_lsn = limit_lsn;
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Archiving from lsn %lu %lu to lsn %lu %lu\n",
@@ -2656,7 +2631,6 @@ loop:
(ulong) ut_dulint_get_high(limit_lsn),
(ulong) ut_dulint_get_low(limit_lsn));
}
-#endif /* UNIV_LOG_DEBUG */
/* Read the log segment to the archive buffer */
@@ -2759,14 +2733,12 @@ log_archive_close_groups(
group->archived_file_no += 2;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"Incrementing arch file no to %lu in log group %lu\n",
(ulong) group->archived_file_no + 2,
(ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
}
}
@@ -3181,7 +3153,6 @@ loop:
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
}
-#ifdef UNIV_LOG_DEBUG
/**********************************************************
Checks by parsing that the catenated log segment for a single mtr is
consistent. */
@@ -3234,7 +3205,6 @@ log_check_log_recs(
return(TRUE);
}
-#endif /* UNIV_LOG_DEBUG */
/**********************************************************
Peeks the current lsn. */
diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c
index 49d537d23db..7e57efcf9e1 100644
--- a/innobase/log/log0recv.c
+++ b/innobase/log/log0recv.c
@@ -189,7 +189,6 @@ recv_sys_empty_hash(void)
recv_sys->addr_hash = hash_create(buf_pool_get_curr_size() / 256);
}
-#ifndef UNIV_LOG_DEBUG
/************************************************************
Frees the recovery system. */
static
@@ -209,7 +208,6 @@ recv_sys_free(void)
mutex_exit(&(recv_sys->mutex));
}
-#endif /* !UNIV_LOG_DEBUG */
/************************************************************
Truncates possible corrupted or extra records from a log group. */
@@ -491,7 +489,6 @@ recv_find_max_checkpoint(
log_group_read_checkpoint_info(group, field);
if (!recv_check_cp_is_consistent(buf)) {
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Checkpoint in group %lu at %lu invalid, %lu\n",
@@ -501,7 +498,6 @@ recv_find_max_checkpoint(
+ LOG_CHECKPOINT_CHECKSUM_1));
}
-#endif /* UNIV_LOG_DEBUG */
goto not_consistent;
}
@@ -515,14 +511,12 @@ recv_find_max_checkpoint(
checkpoint_no =
mach_read_from_8(buf + LOG_CHECKPOINT_NO);
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Checkpoint number %lu found in group %lu\n",
(ulong) ut_dulint_get_low(checkpoint_no),
(ulong) group->id);
}
-#endif /* UNIV_LOG_DEBUG */
if (ut_dulint_cmp(checkpoint_no, max_no) >= 0) {
*max_group = group;
@@ -1146,7 +1140,6 @@ recv_recover_page(
start_lsn = recv->start_lsn;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Applying log rec type %lu len %lu to space %lu page no %lu\n",
@@ -1154,7 +1147,6 @@ recv_recover_page(
(ulong) recv_addr->space,
(ulong) recv_addr->page_no);
}
-#endif /* UNIV_LOG_DEBUG */
recv_parse_or_apply_log_rec_body(recv->type, buf,
buf + recv->len, page, &mtr);
@@ -1397,7 +1389,6 @@ loop:
mutex_exit(&(recv_sys->mutex));
}
-#ifdef UNIV_HOTBACKUP
/* This page is allocated from the buffer pool and used in the function
below */
page_t* recv_backup_application_page = NULL;
@@ -1522,9 +1513,8 @@ skip_this_recv_addr:
recv_sys_empty_hash();
}
-#endif /* UNIV_HOTBACKUP */
-#ifdef UNIV_LOG_REPLICATE
+#ifdef notdefined
/***********************************************************************
In the debug version, updates the replica of a file page, based on a log
record. */
@@ -1820,11 +1810,10 @@ recv_calc_lsn_on_data_add(
return(ut_dulint_add(lsn, lsn_len));
}
-#ifdef UNIV_LOG_DEBUG
/***********************************************************
Checks that the parser recognizes incomplete initial segments of a log
record as incomplete. */
-static
+
void
recv_check_incomplete_log_recs(
/*===========================*/
@@ -1842,7 +1831,6 @@ recv_check_incomplete_log_recs(
&page_no, &body));
}
}
-#endif /* UNIV_LOG_DEBUG */
/***********************************************************
Prints diagnostic info of corrupt log. */
@@ -1979,14 +1967,12 @@ loop:
recv_sys->recovered_offset += len;
recv_sys->recovered_lsn = new_recovered_lsn;
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Parsed a single log rec type %lu len %lu space %lu page no %lu\n",
(ulong) type, (ulong) len, (ulong) space,
(ulong) page_no);
}
-#endif /* UNIV_LOG_DEBUG */
if (type == MLOG_DUMMY_RECORD) {
/* Do nothing */
@@ -2070,14 +2056,12 @@ loop:
#endif /* UNIV_LOG_REPLICATE */
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Parsed a multi log rec type %lu len %lu space %lu page no %lu\n",
(ulong) type, (ulong) len, (ulong) space,
(ulong) page_no);
}
-#endif /* UNIV_LOG_DEBUG */
total_len += len;
n_recs++;
@@ -2484,7 +2468,6 @@ recv_group_scan_log_recs(
start_lsn = end_lsn;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Scanned group %lu up to log sequence number %lu %lu\n",
@@ -2492,7 +2475,6 @@ recv_group_scan_log_recs(
(ulong) ut_dulint_get_high(*group_scanned_lsn),
(ulong) ut_dulint_get_low(*group_scanned_lsn));
}
-#endif /* UNIV_LOG_DEBUG */
}
/************************************************************
@@ -2879,12 +2861,10 @@ recv_recovery_from_checkpoint_finish(void)
recv_apply_hashed_log_recs(TRUE);
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Log records applied to the database\n");
}
-#endif /* UNIV_LOG_DEBUG */
if (recv_needed_recovery) {
trx_sys_print_mysql_master_log_pos();
@@ -3214,7 +3194,6 @@ ask_again:
break;
}
-#ifdef UNIV_LOG_DEBUG
if (log_debug_writes) {
fprintf(stderr,
"InnoDB: Archive read starting at lsn %lu %lu, len %lu from file %s\n",
@@ -3222,7 +3201,6 @@ ask_again:
(ulong) ut_dulint_get_low(start_lsn),
(ulong) len, name);
}
-#endif /* UNIV_LOG_DEBUG */
fil_io(OS_FILE_READ | OS_FILE_LOG, TRUE,
group->archive_space_id, read_offset / UNIV_PAGE_SIZE,
diff --git a/innobase/mem/mem0dbg.c b/innobase/mem/mem0dbg.c
index d86784cb048..f46984f6bb3 100644
--- a/innobase/mem/mem0dbg.c
+++ b/innobase/mem/mem0dbg.c
@@ -373,7 +373,6 @@ mem_hash_remove(
}
#endif /* UNIV_MEM_DEBUG */
-#ifdef UNIV_DEBUG
/*******************************************************************
Checks a memory heap for consistency and prints the contents if requested.
Outputs the sum of sizes of buffers given to the user (only in
@@ -603,7 +602,6 @@ mem_heap_validate(
return(TRUE);
}
-#endif /* UNIV_DEBUG */
#ifdef UNIV_MEM_DEBUG
/*********************************************************************
@@ -816,3 +814,128 @@ mem_analyze_corruption(
dist++;
}
}
+
+/*********************************************************************
+Prints information of dynamic memory usage and currently allocated
+memory heaps or buffers. Can only be used in the debug version. */
+static
+void
+mem_print_info_low(
+/*===============*/
+ ibool print_all) /* in: if TRUE, all heaps are printed,
+ else only the heaps allocated after the
+ previous call of this function */
+{
+#ifdef UNIV_MEM_DEBUG
+ mem_hash_node_t* node;
+ ulint n_heaps = 0;
+ ulint allocated_mem;
+ ulint ph_size;
+ ulint total_allocated_mem = 0;
+ ibool error;
+ ulint n_blocks;
+#endif
+ FILE* outfile;
+
+ /* outfile = fopen("ibdebug", "a"); */
+
+ outfile = stdout;
+
+ fprintf(outfile, "\n");
+ fprintf(outfile,
+ "________________________________________________________\n");
+ fprintf(outfile, "MEMORY ALLOCATION INFORMATION\n\n");
+
+#ifndef UNIV_MEM_DEBUG
+
+ UT_NOT_USED(print_all);
+
+ mem_pool_print_info(outfile, mem_comm_pool);
+
+ fprintf(outfile,
+ "Sorry, non-debug version cannot give more memory info\n");
+
+ /* fclose(outfile); */
+
+ return;
+#else
+ mutex_enter(&mem_hash_mutex);
+
+ fprintf(outfile, "LIST OF CREATED HEAPS AND ALLOCATED BUFFERS: \n\n");
+
+ if (!print_all) {
+ fprintf(outfile, "AFTER THE LAST PRINT INFO\n");
+ }
+
+ node = UT_LIST_GET_FIRST(mem_all_list_base);
+
+ while (node != NULL) {
+ n_heaps++;
+
+ if (!print_all && node->nth_heap < mem_last_print_info) {
+
+ goto next_heap;
+ }
+
+ mem_heap_validate_or_print(node->heap, NULL,
+ FALSE, &error, &allocated_mem,
+ &ph_size, &n_blocks);
+ total_allocated_mem += allocated_mem;
+
+ fprintf(outfile,
+ "%lu: file %s line %lu of size %lu phys.size %lu with %lu blocks, type %lu\n",
+ node->nth_heap, node->file_name, node->line,
+ allocated_mem, ph_size, n_blocks,
+ (node->heap)->type);
+ next_heap:
+ node = UT_LIST_GET_NEXT(all_list, node);
+ }
+
+ fprintf(outfile, "\n");
+
+ fprintf(outfile, "Current allocated memory : %lu\n",
+ mem_current_allocated_memory);
+ fprintf(outfile, "Current allocated heaps and buffers : %lu\n",
+ n_heaps);
+ fprintf(outfile, "Cumulative allocated memory : %lu\n",
+ mem_total_allocated_memory);
+ fprintf(outfile, "Maximum allocated memory : %lu\n",
+ mem_max_allocated_memory);
+ fprintf(outfile, "Cumulative created heaps and buffers : %lu\n",
+ mem_n_created_heaps);
+ fprintf(outfile, "Cumulative number of allocations : %lu\n",
+ mem_n_allocations);
+
+ mem_last_print_info = mem_n_created_heaps;
+
+ mutex_exit(&mem_hash_mutex);
+
+ mem_pool_print_info(outfile, mem_comm_pool);
+
+/* mem_validate(); */
+
+/* fclose(outfile); */
+#endif
+}
+
+/*********************************************************************
+Prints information of dynamic memory usage and currently allocated memory
+heaps or buffers. Can only be used in the debug version. */
+
+void
+mem_print_info(void)
+/*================*/
+{
+ mem_print_info_low(TRUE);
+}
+
+/*********************************************************************
+Prints information of dynamic memory usage and currently allocated memory
+heaps or buffers since the last ..._print_info or..._print_new_info. */
+
+void
+mem_print_new_info(void)
+/*====================*/
+{
+ mem_print_info_low(FALSE);
+}
diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c
index 0227c2d0969..023369e8ec5 100644
--- a/innobase/mem/mem0pool.c
+++ b/innobase/mem/mem0pool.c
@@ -559,7 +559,6 @@ mem_area_free(
ut_ad(mem_pool_validate(pool));
}
-#ifdef UNIV_DEBUG
/************************************************************************
Validates a memory pool. */
@@ -637,7 +636,6 @@ mem_pool_print_info(
(ulong) pool->reserved);
mutex_exit(&(pool->mutex));
}
-#endif /* UNIV_DEBUG */
/************************************************************************
Returns the amount of reserved memory. */
diff --git a/innobase/mtr/mtr0mtr.c b/innobase/mtr/mtr0mtr.c
index deb4dabde4b..6e918806eb1 100644
--- a/innobase/mtr/mtr0mtr.c
+++ b/innobase/mtr/mtr0mtr.c
@@ -319,7 +319,6 @@ mtr_read_dulint(
return(mach_read_from_8(ptr));
}
-#ifdef UNIV_DEBUG
/*************************************************************
Prints info of an mtr handle. */
@@ -333,4 +332,3 @@ mtr_print(
(ulong) dyn_array_get_data_size(&(mtr->memo)),
(ulong) dyn_array_get_data_size(&(mtr->log)));
}
-#endif /* UNIV_DEBUG */
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 469e7c025b6..d5ca8f927c6 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -368,7 +368,7 @@ os_file_handle_error(
#undef USE_FILE_LOCK
#define USE_FILE_LOCK
-#if defined(UNIV_HOTBACKUP) || defined(__WIN__) || defined(__FreeBSD__)
+#if defined(UNIV_HOTBACKUP) || defined(__WIN__) || defined(__FreeBSD__) || defined(__NETWARE__)
/* InnoDB Hot Backup does not lock the data files.
* On Windows, mandatory locking is used.
* On FreeBSD with LinuxThreads, advisory locking does not work properly.
diff --git a/innobase/pars/lexyy.c b/innobase/pars/lexyy.c
index 1b8c69ccc7a..d98d3c9b945 100644
--- a/innobase/pars/lexyy.c
+++ b/innobase/pars/lexyy.c
@@ -636,9 +636,9 @@ Linux.
#include "mem0mem.h"
#include "os0proc.h"
-#define malloc(A) mem_alloc(A)
-#define free(A) mem_free(A)
-#define realloc(P, A) mem_realloc(P, A, __FILE__, __LINE__)
+#define malloc(A) ut_malloc(A)
+#define free(A) ut_free(A)
+#define realloc(P, A) ut_realloc(P, A)
#define exit(A) ut_error
#define YY_INPUT(buf, result, max_size) pars_get_lex_chars(buf, &result, max_size)
@@ -655,16 +655,16 @@ string_append(
const char* str, /* in: string to be appended */
ulint len) /* in: length of the string */
{
+ if (stringbuf == NULL) {
+ stringbuf = malloc(1);
+ stringbuf_len_alloc = 1;
+ }
+
if (stringbuf_len + len > stringbuf_len_alloc) {
- if (stringbuf_len_alloc == 0) {
- stringbuf_len_alloc++;
- }
while (stringbuf_len + len > stringbuf_len_alloc) {
stringbuf_len_alloc <<= 1;
}
- stringbuf = stringbuf
- ? realloc(stringbuf, stringbuf_len_alloc)
- : malloc(stringbuf_len_alloc);
+ stringbuf = realloc(stringbuf, stringbuf_len_alloc);
}
memcpy(stringbuf + stringbuf_len, str, len);
diff --git a/innobase/pars/pars0lex.l b/innobase/pars/pars0lex.l
index 0b1af554bed..4e2399613cb 100644
--- a/innobase/pars/pars0lex.l
+++ b/innobase/pars/pars0lex.l
@@ -58,9 +58,9 @@ Linux.
#include "mem0mem.h"
#include "os0proc.h"
-#define malloc(A) mem_alloc(A)
-#define free(A) mem_free(A)
-#define realloc(P, A) mem_realloc(P, A, __FILE__, __LINE__)
+#define malloc(A) ut_malloc(A)
+#define free(A) ut_free(A)
+#define realloc(P, A) ut_realloc(P, A)
#define exit(A) ut_error
#define YY_INPUT(buf, result, max_size) pars_get_lex_chars(buf, &result, max_size)
@@ -77,16 +77,16 @@ string_append(
const char* str, /* in: string to be appended */
ulint len) /* in: length of the string */
{
+ if (stringbuf == NULL) {
+ stringbuf = malloc(1);
+ stringbuf_len_alloc = 1;
+ }
+
if (stringbuf_len + len > stringbuf_len_alloc) {
- if (stringbuf_len_alloc == 0) {
- stringbuf_len_alloc++;
- }
while (stringbuf_len + len > stringbuf_len_alloc) {
stringbuf_len_alloc <<= 1;
}
- stringbuf = stringbuf
- ? realloc(stringbuf, stringbuf_len_alloc)
- : malloc(stringbuf_len_alloc);
+ stringbuf = realloc(stringbuf, stringbuf_len_alloc);
}
memcpy(stringbuf + stringbuf_len, str, len);
diff --git a/innobase/pars/pars0opt.c b/innobase/pars/pars0opt.c
index 4fb0c937f1e..7ba4af15243 100644
--- a/innobase/pars/pars0opt.c
+++ b/innobase/pars/pars0opt.c
@@ -1190,7 +1190,6 @@ opt_search_plan(
#endif
}
-#ifdef UNIV_SQL_DEBUG
/************************************************************************
Prints info of a query plan. */
@@ -1237,4 +1236,3 @@ opt_print_query_plan(
(unsigned long) UT_LIST_GET_LEN(plan->end_conds));
}
}
-#endif /* UNIV_SQL_DEBUG */
diff --git a/innobase/que/que0que.c b/innobase/que/que0que.c
index 363376a72da..22878dec27f 100644
--- a/innobase/que/que0que.c
+++ b/innobase/que/que0que.c
@@ -12,6 +12,7 @@ Created 5/27/1996 Heikki Tuuri
#include "que0que.ic"
#endif
+#include "srv0que.h"
#include "usr0sess.h"
#include "trx0trx.h"
#include "trx0roll.h"
@@ -174,15 +175,19 @@ a single worker thread to execute it. This function should be used to end
the wait state of a query thread waiting for a lock or a stored procedure
completion. */
-que_thr_t*
+void
que_thr_end_wait(
/*=============*/
- /* out: next query thread to run;
- NULL if none */
- que_thr_t* thr) /* in: query thread in the
+ que_thr_t* thr, /* in: query thread in the
QUE_THR_LOCK_WAIT,
or QUE_THR_PROCEDURE_WAIT, or
QUE_THR_SIG_REPLY_WAIT state */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if NULL is passed
+ as the parameter, it is ignored */
{
ibool was_active;
@@ -201,8 +206,18 @@ que_thr_end_wait(
que_thr_move_to_run_state(thr);
- return(was_active ? NULL : thr);
-}
+ if (was_active) {
+
+ return;
+ }
+
+ if (next_thr && *next_thr == NULL) {
+ *next_thr = thr;
+ } else {
+ ut_a(0);
+ srv_que_task_enqueue_low(thr);
+ }
+}
/**************************************************************************
Same as que_thr_end_wait, but no parameter next_thr available. */
@@ -239,6 +254,8 @@ que_thr_end_wait_no_next_thr(
for the lock to be released: */
srv_release_mysql_thread_if_suspended(thr);
+
+ /* srv_que_task_enqueue_low(thr); */
}
/**************************************************************************
@@ -339,6 +356,49 @@ que_fork_start_command(
return(NULL);
}
+/**************************************************************************
+After signal handling is finished, returns control to a query graph error
+handling routine. (Currently, just returns the control to the root of the
+graph so that the graph can communicate an error message to the client.) */
+
+void
+que_fork_error_handle(
+/*==================*/
+ trx_t* trx __attribute__((unused)), /* in: trx */
+ que_t* fork) /* in: query graph which was run before signal
+ handling started, NULL not allowed */
+{
+ que_thr_t* thr;
+
+#ifdef UNIV_SYNC_DEBUG
+ ut_ad(mutex_own(&kernel_mutex));
+#endif /* UNIV_SYNC_DEBUG */
+ ut_ad(trx->sess->state == SESS_ERROR);
+ ut_ad(UT_LIST_GET_LEN(trx->reply_signals) == 0);
+ ut_ad(UT_LIST_GET_LEN(trx->wait_thrs) == 0);
+
+ thr = UT_LIST_GET_FIRST(fork->thrs);
+
+ while (thr != NULL) {
+ ut_ad(!thr->is_active);
+ ut_ad(thr->state != QUE_THR_SIG_REPLY_WAIT);
+ ut_ad(thr->state != QUE_THR_LOCK_WAIT);
+
+ thr->run_node = thr;
+ thr->prev_node = thr->child;
+ thr->state = QUE_THR_COMPLETED;
+
+ thr = UT_LIST_GET_NEXT(thrs, thr);
+ }
+
+ thr = UT_LIST_GET_FIRST(fork->thrs);
+
+ que_thr_move_to_run_state(thr);
+
+ ut_a(0);
+ srv_que_task_enqueue_low(thr);
+}
+
/********************************************************************
Tests if all the query threads in the same fork have a given state. */
UNIV_INLINE
@@ -707,18 +767,22 @@ this function may only be called from inside que_run_threads or
que_thr_check_if_switch! These restrictions exist to make the rollback code
easier to maintain. */
static
-que_thr_t*
+void
que_thr_dec_refer_count(
/*====================*/
- /* out: next query thread to run */
- que_thr_t* thr) /* in: query thread */
+ que_thr_t* thr, /* in: query thread */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
{
que_fork_t* fork;
trx_t* trx;
sess_t* sess;
ulint fork_type;
- que_thr_t* next_thr = NULL;
-
+ ibool stopped;
+
fork = thr->common.parent;
trx = thr->graph->trx;
sess = trx->sess;
@@ -729,7 +793,9 @@ que_thr_dec_refer_count(
if (thr->state == QUE_THR_RUNNING) {
- if (!que_thr_stop(thr)) {
+ stopped = que_thr_stop(thr);
+
+ if (!stopped) {
/* The reason for the thr suspension or wait was
already canceled before we came here: continue
running the thread */
@@ -737,9 +803,16 @@ que_thr_dec_refer_count(
/* fputs("!!!!!!!! Wait already ended: continue thr\n",
stderr); */
+ if (next_thr && *next_thr == NULL) {
+ *next_thr = thr;
+ } else {
+ ut_a(0);
+ srv_que_task_enqueue_low(thr);
+ }
+
mutex_exit(&kernel_mutex);
- return(thr);
+ return;
}
}
@@ -755,7 +828,7 @@ que_thr_dec_refer_count(
mutex_exit(&kernel_mutex);
- return(next_thr);
+ return;
}
fork_type = fork->fork_type;
@@ -771,7 +844,7 @@ que_thr_dec_refer_count(
ut_ad(UT_LIST_GET_LEN(trx->signals) > 0);
ut_ad(trx->handling_signals == TRUE);
- next_thr = trx_finish_rollback_off_kernel(fork, trx);
+ trx_finish_rollback_off_kernel(fork, trx, next_thr);
} else if (fork_type == QUE_FORK_PURGE) {
@@ -793,7 +866,7 @@ que_thr_dec_refer_count(
zero, then we start processing a signal; from it we may get
a new query thread to run */
- next_thr = trx_sig_start_handle(trx);
+ trx_sig_start_handle(trx, next_thr);
}
if (trx->handling_signals && UT_LIST_GET_LEN(trx->signals) == 0) {
@@ -802,8 +875,6 @@ que_thr_dec_refer_count(
}
mutex_exit(&kernel_mutex);
-
- return(next_thr);
}
/**************************************************************************
@@ -968,10 +1039,9 @@ que_thr_stop_for_mysql_no_error(
trx->n_active_thrs--;
}
-#ifdef UNIV_DEBUG
/**************************************************************************
Prints info of an SQL query graph node. */
-static
+
void
que_node_print_info(
/*================*/
@@ -1028,7 +1098,6 @@ que_node_print_info(
fprintf(stderr, "Node type %lu: %s, address %p\n", (ulong) type, str, node);
}
-#endif /* UNIV_DEBUG */
/**************************************************************************
Performs an execution step on a query thread. */
@@ -1177,7 +1246,6 @@ loop:
/*-------------------------*/
next_thr = que_thr_step(thr);
/*-------------------------*/
- ut_a(next_thr == thr || next_thr == NULL);
/* Test the effect on performance of adding extra mutex
reservations */
@@ -1190,7 +1258,8 @@ loop:
loop_count++;
if (next_thr != thr) {
- next_thr = que_thr_dec_refer_count(thr);
+ ut_a(next_thr == NULL);
+ que_thr_dec_refer_count(thr, &next_thr);
if (next_thr == NULL) {
diff --git a/innobase/rem/rem0cmp.c b/innobase/rem/rem0cmp.c
index 254ebeec8c9..6e8f3d82ef3 100644
--- a/innobase/rem/rem0cmp.c
+++ b/innobase/rem/rem0cmp.c
@@ -33,12 +33,13 @@ At the present, the comparison functions return 0 in the case,
where two records disagree only in the way that one
has more fields than the other. */
+#ifdef UNIV_DEBUG
/*****************************************************************
Used in debug checking of cmp_dtuple_... .
This function is used to compare a data tuple to a physical record. If
dtuple has n fields then rec must have either m >= n fields, or it must
differ from dtuple in some of the m fields rec has. */
-
+static
int
cmp_debug_dtuple_rec_with_match(
/*============================*/
@@ -54,6 +55,7 @@ cmp_debug_dtuple_rec_with_match(
completely matched fields; when function
returns, contains the value for current
comparison */
+#endif /* UNIV_DEBUG */
/*****************************************************************
This function is used to compare two data fields for which the data type
is such that we must use MySQL code to compare them. The prototype here
@@ -962,13 +964,14 @@ order_resolved:
return(ret);
}
+#ifdef UNIV_DEBUG
/*****************************************************************
Used in debug checking of cmp_dtuple_... .
This function is used to compare a data tuple to a physical record. If
dtuple has n fields then rec must have either m >= n fields, or it must
differ from dtuple in some of the m fields rec has. If encounters an
externally stored field, returns 0. */
-
+static
int
cmp_debug_dtuple_rec_with_match(
/*============================*/
@@ -1064,3 +1067,4 @@ order_resolved:
return(ret);
}
+#endif /* UNIV_DEBUG */
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index aa4b313d15d..7f1852c70f2 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -80,9 +80,9 @@ ins_node_create(
node->trx_id = ut_dulint_zero;
node->entry_sys_heap = mem_heap_create(128);
-#ifdef UNIV_DEBUG
- node->magic_n = INS_NODE_MAGIC_N;
-#endif /* UNIV_DEBUG */
+
+ node->magic_n = INS_NODE_MAGIC_N;
+
return(node);
}
@@ -194,7 +194,6 @@ ins_node_set_new_row(
ins_node_t* node, /* in: insert node */
dtuple_t* row) /* in: new row (or first row) for the node */
{
- ut_ad(node->magic_n == INS_NODE_MAGIC_N);
node->state = INS_NODE_SET_IX_LOCK;
node->index = NULL;
node->entry = NULL;
@@ -2014,7 +2013,6 @@ row_ins(
ulint err;
ut_ad(node && thr);
- ut_ad(node->magic_n == INS_NODE_MAGIC_N);
if (node->state == INS_NODE_ALLOC_ROW_ID) {
@@ -2079,7 +2077,7 @@ row_ins_step(
trx_start_if_not_started(trx);
node = thr->run_node;
- ut_ad(node->magic_n == INS_NODE_MAGIC_N);
+
ut_ad(que_node_get_type(node) == QUE_NODE_INSERT);
parent = que_node_get_parent(node);
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index 974dfa3e1c8..c4408de2a85 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -1414,7 +1414,8 @@ row_create_table_for_mysql(
tab_node_t* node;
mem_heap_t* heap;
que_thr_t* thr;
- ulint namelen;
+ const char* table_name;
+ ulint table_name_len;
ulint err;
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
@@ -1466,10 +1467,17 @@ row_create_table_for_mysql(
return(row_mysql_recover_tmp_table(table, trx));
}
- namelen = strlen(table->name) + 1;
+ /* The table name is prefixed with the database name and a '/'.
+ Certain table names starting with 'innodb_' have their special
+ meaning regardless of the database name. Thus, we need to
+ ignore the database name prefix in the comparisons. */
+ table_name = strchr(table->name, '/');
+ ut_a(table_name);
+ table_name++;
+ table_name_len = strlen(table_name) + 1;
- if (namelen == sizeof S_innodb_monitor
- && !memcmp(table->name, S_innodb_monitor,
+ if (table_name_len == sizeof S_innodb_monitor
+ && !memcmp(table_name, S_innodb_monitor,
sizeof S_innodb_monitor)) {
/* Table equals "innodb_monitor":
@@ -1481,27 +1489,27 @@ row_create_table_for_mysql(
of InnoDB monitor prints */
os_event_set(srv_lock_timeout_thread_event);
- } else if (namelen == sizeof S_innodb_lock_monitor
- && !memcmp(table->name, S_innodb_lock_monitor,
+ } else if (table_name_len == sizeof S_innodb_lock_monitor
+ && !memcmp(table_name, S_innodb_lock_monitor,
sizeof S_innodb_lock_monitor)) {
srv_print_innodb_monitor = TRUE;
srv_print_innodb_lock_monitor = TRUE;
os_event_set(srv_lock_timeout_thread_event);
- } else if (namelen == sizeof S_innodb_tablespace_monitor
- && !memcmp(table->name, S_innodb_tablespace_monitor,
+ } else if (table_name_len == sizeof S_innodb_tablespace_monitor
+ && !memcmp(table_name, S_innodb_tablespace_monitor,
sizeof S_innodb_tablespace_monitor)) {
srv_print_innodb_tablespace_monitor = TRUE;
os_event_set(srv_lock_timeout_thread_event);
- } else if (namelen == sizeof S_innodb_table_monitor
- && !memcmp(table->name, S_innodb_table_monitor,
+ } else if (table_name_len == sizeof S_innodb_table_monitor
+ && !memcmp(table_name, S_innodb_table_monitor,
sizeof S_innodb_table_monitor)) {
srv_print_innodb_table_monitor = TRUE;
os_event_set(srv_lock_timeout_thread_event);
- } else if (namelen == sizeof S_innodb_mem_validate
- && !memcmp(table->name, S_innodb_mem_validate,
+ } else if (table_name_len == sizeof S_innodb_mem_validate
+ && !memcmp(table_name, S_innodb_mem_validate,
sizeof S_innodb_mem_validate)) {
/* We define here a debugging feature intended for
developers */
@@ -2204,6 +2212,7 @@ row_drop_table_for_mysql(
que_thr_t* thr;
que_t* graph;
ulint err;
+ const char* table_name;
ulint namelen;
ibool success;
ibool locked_dictionary = FALSE;
@@ -2293,10 +2302,17 @@ row_drop_table_for_mysql(
trx_start_if_not_started(trx);
- namelen = strlen(name) + 1;
+ /* The table name is prefixed with the database name and a '/'.
+ Certain table names starting with 'innodb_' have their special
+ meaning regardless of the database name. Thus, we need to
+ ignore the database name prefix in the comparisons. */
+ table_name = strchr(name, '/');
+ ut_a(table_name);
+ table_name++;
+ namelen = strlen(table_name) + 1;
if (namelen == sizeof S_innodb_monitor
- && !memcmp(name, S_innodb_monitor,
+ && !memcmp(table_name, S_innodb_monitor,
sizeof S_innodb_monitor)) {
/* Table name equals "innodb_monitor":
@@ -2305,17 +2321,17 @@ row_drop_table_for_mysql(
srv_print_innodb_monitor = FALSE;
srv_print_innodb_lock_monitor = FALSE;
} else if (namelen == sizeof S_innodb_lock_monitor
- && !memcmp(name, S_innodb_lock_monitor,
+ && !memcmp(table_name, S_innodb_lock_monitor,
sizeof S_innodb_lock_monitor)) {
srv_print_innodb_monitor = FALSE;
srv_print_innodb_lock_monitor = FALSE;
} else if (namelen == sizeof S_innodb_tablespace_monitor
- && !memcmp(name, S_innodb_tablespace_monitor,
+ && !memcmp(table_name, S_innodb_tablespace_monitor,
sizeof S_innodb_tablespace_monitor)) {
srv_print_innodb_tablespace_monitor = FALSE;
} else if (namelen == sizeof S_innodb_table_monitor
- && !memcmp(name, S_innodb_table_monitor,
+ && !memcmp(table_name, S_innodb_table_monitor,
sizeof S_innodb_table_monitor)) {
srv_print_innodb_table_monitor = FALSE;
diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c
index 724e7bf91e7..d35ae0a3e38 100644
--- a/innobase/row/row0upd.c
+++ b/innobase/row/row0upd.c
@@ -287,9 +287,7 @@ upd_node_create(
node->select = NULL;
node->heap = mem_heap_create(128);
-#ifdef UNIV_DEBUG
- node->magic_n = UPD_NODE_MAGIC_N;
-#endif /* UNIV_DEBUG */
+ node->magic_n = UPD_NODE_MAGIC_N;
node->cmpl_info = 0;
@@ -1806,7 +1804,6 @@ row_upd_step(
trx_start_if_not_started(trx);
node = thr->run_node;
- ut_ad(node->magic_n == UPD_NODE_MAGIC_N);
sel_node = node->select;
@@ -1926,7 +1923,6 @@ row_upd_in_place_in_select(
node = que_node_get_parent(sel_node);
- ut_ad(node->magic_n == UPD_NODE_MAGIC_N);
ut_ad(que_node_get_type(node) == QUE_NODE_UPDATE);
pcur = node->pcur;
diff --git a/innobase/srv/Makefile.am b/innobase/srv/Makefile.am
index 37fd73a4bf0..752683b82b8 100644
--- a/innobase/srv/Makefile.am
+++ b/innobase/srv/Makefile.am
@@ -19,6 +19,6 @@ include ../include/Makefile.i
noinst_LIBRARIES = libsrv.a
-libsrv_a_SOURCES = srv0srv.c srv0start.c
+libsrv_a_SOURCES = srv0srv.c srv0que.c srv0start.c
EXTRA_PROGRAMS =
diff --git a/innobase/srv/srv0que.c b/innobase/srv/srv0que.c
new file mode 100644
index 00000000000..9dc9ae453d9
--- /dev/null
+++ b/innobase/srv/srv0que.c
@@ -0,0 +1,113 @@
+/******************************************************
+Server query execution
+
+(c) 1996 Innobase Oy
+
+Created 6/5/1996 Heikki Tuuri
+*******************************************************/
+
+#include "srv0que.h"
+
+#include "srv0srv.h"
+#include "sync0sync.h"
+#include "os0thread.h"
+#include "usr0sess.h"
+#include "que0que.h"
+
+/**************************************************************************
+Checks if there is work to do in the server task queue. If there is, the
+thread starts processing a task. Before leaving, it again checks the task
+queue and picks a new task if any exists. This is called by a SRV_WORKER
+thread. */
+
+void
+srv_que_task_queue_check(void)
+/*==========================*/
+{
+ que_thr_t* thr;
+
+ for (;;) {
+ mutex_enter(&kernel_mutex);
+
+ thr = UT_LIST_GET_FIRST(srv_sys->tasks);
+
+ if (thr == NULL) {
+ mutex_exit(&kernel_mutex);
+
+ return;
+ }
+
+ UT_LIST_REMOVE(queue, srv_sys->tasks, thr);
+
+ mutex_exit(&kernel_mutex);
+
+ que_run_threads(thr);
+ }
+}
+
+/**************************************************************************
+Performs round-robin on the server tasks. This is called by a SRV_WORKER
+thread every second or so. */
+
+que_thr_t*
+srv_que_round_robin(
+/*================*/
+ /* out: the new (may be == thr) query thread
+ to run */
+ que_thr_t* thr) /* in: query thread */
+{
+ que_thr_t* new_thr;
+
+ ut_ad(thr);
+ ut_ad(thr->state == QUE_THR_RUNNING);
+
+ mutex_enter(&kernel_mutex);
+
+ UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
+
+ new_thr = UT_LIST_GET_FIRST(srv_sys->tasks);
+
+ mutex_exit(&kernel_mutex);
+
+ return(new_thr);
+}
+
+/**************************************************************************
+Enqueues a task to server task queue and releases a worker thread, if there
+is a suspended one. */
+
+void
+srv_que_task_enqueue_low(
+/*=====================*/
+ que_thr_t* thr) /* in: query thread */
+{
+ ut_ad(thr);
+
+#ifdef UNIV_SYNC_DEBUG
+ ut_ad(mutex_own(&kernel_mutex));
+#endif /* UNIV_SYNC_DEBUG */
+
+ UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
+
+ srv_release_threads(SRV_WORKER, 1);
+}
+
+/**************************************************************************
+Enqueues a task to server task queue and releases a worker thread, if there
+is a suspended one. */
+
+void
+srv_que_task_enqueue(
+/*=================*/
+ que_thr_t* thr) /* in: query thread */
+{
+ ut_ad(thr);
+
+ ut_a(0); /* Under MySQL this is never called */
+
+ mutex_enter(&kernel_mutex);
+
+ srv_que_task_enqueue_low(thr);
+
+ mutex_exit(&kernel_mutex);
+}
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c
index 3817501ae70..fc46c95a8a6 100644
--- a/innobase/srv/srv0srv.c
+++ b/innobase/srv/srv0srv.c
@@ -34,6 +34,7 @@ Created 10/8/1995 Heikki Tuuri
#include "sync0sync.h"
#include "thr0loc.h"
#include "que0que.h"
+#include "srv0que.h"
#include "log0recv.h"
#include "pars0pars.h"
#include "usr0sess.h"
diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c
index 3bf39e6422b..dd38eddb20b 100644
--- a/innobase/srv/srv0start.c
+++ b/innobase/srv/srv0start.c
@@ -1478,9 +1478,7 @@ NetWare. */
os_thread_create(&srv_master_thread, NULL, thread_ids + 1 +
SRV_MAX_N_IO_THREADS);
-#ifdef UNIV_DEBUG
/* buf_debug_prints = TRUE; */
-#endif /* UNIV_DEBUG */
sum_of_data_file_sizes = 0;
diff --git a/innobase/sync/sync0rw.c b/innobase/sync/sync0rw.c
index 2d3b48b1d89..77757685208 100644
--- a/innobase/sync/sync0rw.c
+++ b/innobase/sync/sync0rw.c
@@ -171,7 +171,6 @@ rw_lock_free(
mutex_exit(&rw_lock_list_mutex);
}
-#ifdef UNIV_DEBUG
/**********************************************************************
Checks that the rw-lock has been initialized and that there are no
simultaneous shared and exclusive locks. */
@@ -199,7 +198,6 @@ rw_lock_validate(
return(TRUE);
}
-#endif /* UNIV_DEBUG */
/**********************************************************************
Lock an rw-lock in shared mode for the current thread. If the rw-lock is
diff --git a/innobase/sync/sync0sync.c b/innobase/sync/sync0sync.c
index 89bfb5dd02e..86306e49cac 100644
--- a/innobase/sync/sync0sync.c
+++ b/innobase/sync/sync0sync.c
@@ -314,7 +314,6 @@ mutex_enter_nowait(
return(1);
}
-#ifdef UNIV_DEBUG
/**********************************************************************
Checks that the mutex has been initialized. */
@@ -328,7 +327,6 @@ mutex_validate(
return(TRUE);
}
-#endif /* UNIV_DEBUG */
/**********************************************************************
Sets the waiters field in a mutex. */
@@ -1077,12 +1075,8 @@ sync_thread_add_level(
} else if (level == SYNC_DICT_HEADER) {
ut_a(sync_thread_levels_g(array, SYNC_DICT_HEADER));
} else if (level == SYNC_DICT) {
-#ifdef UNIV_DEBUG
- ut_a(buf_debug_prints ||
- sync_thread_levels_g(array, SYNC_DICT));
-#else /* UNIV_DEBUG */
- ut_a(sync_thread_levels_g(array, SYNC_DICT));
-#endif /* UNIV_DEBUG */
+ ut_a(buf_debug_prints
+ || sync_thread_levels_g(array, SYNC_DICT));
} else {
ut_error;
}
diff --git a/innobase/thr/thr0loc.c b/innobase/thr/thr0loc.c
index a17d09fcca6..033bb22807f 100644
--- a/innobase/thr/thr0loc.c
+++ b/innobase/thr/thr0loc.c
@@ -46,12 +46,11 @@ struct thr_local_struct{
ibool in_ibuf;/* TRUE if the the thread is doing an ibuf
operation */
hash_node_t hash; /* hash chain node */
-#ifdef UNIV_DEBUG
ulint magic_n;
-#define THR_LOCAL_MAGIC_N 1231234
-#endif /* UNIV_DEBUG */
};
+#define THR_LOCAL_MAGIC_N 1231234
+
/***********************************************************************
Returns the local storage struct for a thread. */
static
@@ -170,9 +169,8 @@ thr_local_create(void)
local->id = os_thread_get_curr_id();
local->handle = os_thread_get_curr();
-#ifdef UNIV_DEBUG
local->magic_n = THR_LOCAL_MAGIC_N;
-#endif /* UNIV_DEBUG */
+
local->in_ibuf = FALSE;
mutex_enter(&thr_local_mutex);
@@ -211,7 +209,7 @@ thr_local_free(
mutex_exit(&thr_local_mutex);
- ut_ad(local->magic_n == THR_LOCAL_MAGIC_N);
+ ut_a(local->magic_n == THR_LOCAL_MAGIC_N);
mem_free(local);
}
diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c
index 002775eaac1..3d5f0d3f03a 100644
--- a/innobase/trx/trx0purge.c
+++ b/innobase/trx/trx0purge.c
@@ -23,6 +23,7 @@ Created 3/26/1996 Heikki Tuuri
#include "row0purge.h"
#include "row0upd.h"
#include "trx0rec.h"
+#include "srv0que.h"
#include "os0thread.h"
/* The global data structure coordinating a purge */
@@ -1059,6 +1060,8 @@ trx_purge(void)
mutex_exit(&kernel_mutex);
+/* srv_que_task_enqueue(thr2); */
+
if (srv_print_thread_releases) {
fputs("Starting purge\n", stderr);
diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c
index 8b8a079bb7f..e65755a0f73 100644
--- a/innobase/trx/trx0roll.c
+++ b/innobase/trx/trx0roll.c
@@ -20,6 +20,7 @@ Created 3/26/1996 Heikki Tuuri
#include "trx0rec.h"
#include "que0que.h"
#include "usr0sess.h"
+#include "srv0que.h"
#include "srv0start.h"
#include "row0undo.h"
#include "row0mysql.h"
@@ -931,15 +932,21 @@ trx_undo_rec_release(
/*************************************************************************
Starts a rollback operation. */
-que_thr_t*
+void
trx_rollback(
/*=========*/
- /* out: next query thread to run */
trx_t* trx, /* in: transaction */
- trx_sig_t* sig) /* in: signal starting the rollback */
+ trx_sig_t* sig, /* in: signal starting the rollback */
+ que_thr_t** next_thr)/* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if the passed value is
+ NULL, the parameter is ignored */
{
que_t* roll_graph;
que_thr_t* thr;
+/* que_thr_t* thr2; */
#ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&kernel_mutex));
@@ -981,7 +988,18 @@ trx_rollback(
thr = que_fork_start_command(roll_graph);
ut_ad(thr);
- return(thr);
+
+/* thr2 = que_fork_start_command(roll_graph);
+
+ ut_ad(thr2); */
+
+ if (next_thr && (*next_thr == NULL)) {
+ *next_thr = thr;
+/* srv_que_task_enqueue_low(thr2); */
+ } else {
+ srv_que_task_enqueue_low(thr);
+/* srv_que_task_enqueue_low(thr2); */
+ }
}
/********************************************************************
@@ -1053,14 +1071,17 @@ trx_finish_error_processing(
/*************************************************************************
Finishes a partial rollback operation. */
static
-que_thr_t*
+void
trx_finish_partial_rollback_off_kernel(
/*===================================*/
- /* out: next query thread to run */
- trx_t* trx) /* in: transaction */
+ trx_t* trx, /* in: transaction */
+ que_thr_t** next_thr)/* in/out: next query thread to run;
+ if the value which is passed in is a pointer
+ to a NULL pointer, then the calling function
+ can start running a new query thread; if this
+ parameter is NULL, it is ignored */
{
trx_sig_t* sig;
- que_thr_t* next_thr;
#ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&kernel_mutex));
@@ -1071,26 +1092,29 @@ trx_finish_partial_rollback_off_kernel(
/* Remove the signal from the signal queue and send reply message
to it */
- next_thr = trx_sig_reply(sig);
+ trx_sig_reply(sig, next_thr);
trx_sig_remove(trx, sig);
trx->que_state = TRX_QUE_RUNNING;
- return(next_thr);
}
/********************************************************************
Finishes a transaction rollback. */
-que_thr_t*
+void
trx_finish_rollback_off_kernel(
/*===========================*/
- /* out: next query thread to run */
que_t* graph, /* in: undo graph which can now be freed */
- trx_t* trx) /* in: transaction */
+ trx_t* trx, /* in: transaction */
+ que_thr_t** next_thr)/* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if this parameter is
+ NULL, it is ignored */
{
trx_sig_t* sig;
trx_sig_t* next_sig;
- que_thr_t* next_thr;
#ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&kernel_mutex));
@@ -1105,21 +1129,21 @@ trx_finish_rollback_off_kernel(
if (sig->type == TRX_SIG_ROLLBACK_TO_SAVEPT) {
- return(trx_finish_partial_rollback_off_kernel(trx));
+ trx_finish_partial_rollback_off_kernel(trx, next_thr);
+
+ return;
} else if (sig->type == TRX_SIG_ERROR_OCCURRED) {
trx_finish_error_processing(trx);
- return(NULL);
+ return;
}
-#ifdef UNIV_DEBUG
if (lock_print_waits) {
fprintf(stderr, "Trx %lu rollback finished\n",
(ulong) ut_dulint_get_low(trx->id));
}
-#endif /* UNIV_DEBUG */
trx_commit_off_kernel(trx);
@@ -1127,23 +1151,19 @@ trx_finish_rollback_off_kernel(
send reply messages to them */
trx->que_state = TRX_QUE_RUNNING;
-
- next_thr = NULL;
+
while (sig != NULL) {
next_sig = UT_LIST_GET_NEXT(signals, sig);
if (sig->type == TRX_SIG_TOTAL_ROLLBACK) {
- ut_a(next_thr == NULL);
- next_thr = trx_sig_reply(sig);
+ trx_sig_reply(sig, next_thr);
trx_sig_remove(trx, sig);
}
sig = next_sig;
}
-
- return(next_thr);
}
/*************************************************************************
@@ -1176,6 +1196,7 @@ trx_rollback_step(
que_thr_t* thr) /* in: query thread */
{
roll_node_t* node;
+ ibool success;
ulint sig_no;
trx_savept_t* savept;
@@ -1202,13 +1223,19 @@ trx_rollback_step(
/* Send a rollback signal to the transaction */
- trx_sig_send(thr_get_trx(thr), sig_no, TRX_SIG_SELF,
- thr, savept);
+ success = trx_sig_send(thr_get_trx(thr),
+ sig_no, TRX_SIG_SELF,
+ thr, savept, NULL);
thr->state = QUE_THR_SIG_REPLY_WAIT;
mutex_exit(&kernel_mutex);
+ if (!success) {
+ /* Error in delivering the rollback signal */
+ que_thr_handle_error(thr, DB_ERROR, NULL, 0);
+ }
+
return(NULL);
}
diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c
index b377bdb9809..5c8ae0952ef 100644
--- a/innobase/trx/trx0sys.c
+++ b/innobase/trx/trx0sys.c
@@ -619,7 +619,6 @@ trx_sys_update_mysql_binlog_offset(
MLOG_4BYTES, mtr);
}
-#ifdef UNIV_HOTBACKUP
/*********************************************************************
Prints to stderr the MySQL binlog info in the system header if the
magic number shows it valid. */
@@ -647,7 +646,6 @@ trx_sys_print_mysql_binlog_offset_from_page(
sys_header + TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_NAME);
}
}
-#endif /* UNIV_HOTBACKUP */
/*********************************************************************
Prints to stderr the MySQL binlog offset info in the trx system header if
diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c
index afef08dc100..a9aae48dae6 100644
--- a/innobase/trx/trx0trx.c
+++ b/innobase/trx/trx0trx.c
@@ -897,15 +897,18 @@ trx_assign_read_view(
/********************************************************************
Commits a transaction. NOTE that the kernel mutex is temporarily released. */
static
-que_thr_t*
+void
trx_handle_commit_sig_off_kernel(
/*=============================*/
- /* out: next query thread to run */
- trx_t* trx) /* in: transaction */
+ trx_t* trx, /* in: transaction */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
{
trx_sig_t* sig;
trx_sig_t* next_sig;
- que_thr_t* next_thr = NULL;
#ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&kernel_mutex));
@@ -927,8 +930,7 @@ trx_handle_commit_sig_off_kernel(
if (sig->type == TRX_SIG_COMMIT) {
- ut_a(next_thr == NULL);
- next_thr = trx_sig_reply(sig);
+ trx_sig_reply(sig, next_thr);
trx_sig_remove(trx, sig);
}
@@ -936,8 +938,6 @@ trx_handle_commit_sig_off_kernel(
}
trx->que_state = TRX_QUE_RUNNING;
-
- return(next_thr);
}
/***************************************************************
@@ -999,6 +999,39 @@ trx_lock_wait_to_suspended(
trx->que_state = TRX_QUE_RUNNING;
}
+/***************************************************************
+Moves the query threads in the sig reply wait list of trx to the SUSPENDED
+state. */
+static
+void
+trx_sig_reply_wait_to_suspended(
+/*============================*/
+ trx_t* trx) /* in: transaction */
+{
+ trx_sig_t* sig;
+ que_thr_t* thr;
+
+#ifdef UNIV_SYNC_DEBUG
+ ut_ad(mutex_own(&kernel_mutex));
+#endif /* UNIV_SYNC_DEBUG */
+
+ sig = UT_LIST_GET_FIRST(trx->reply_signals);
+
+ while (sig != NULL) {
+ thr = sig->receiver;
+
+ ut_ad(thr->state == QUE_THR_SIG_REPLY_WAIT);
+
+ thr->state = QUE_THR_SUSPENDED;
+
+ sig->receiver = NULL;
+
+ UT_LIST_REMOVE(reply_signals, trx->reply_signals, sig);
+
+ sig = UT_LIST_GET_FIRST(trx->reply_signals);
+ }
+}
+
/*********************************************************************
Checks the compatibility of a new signal with the other signals in the
queue. */
@@ -1078,10 +1111,11 @@ trx_sig_is_compatible(
/********************************************************************
Sends a signal to a trx object. */
-que_thr_t*
+ibool
trx_sig_send(
/*=========*/
- /* out: next query thread to run */
+ /* out: TRUE if the signal was
+ successfully delivered */
trx_t* trx, /* in: trx handle */
ulint type, /* in: signal type */
ulint sender, /* in: TRX_SIG_SELF or
@@ -1089,8 +1123,14 @@ trx_sig_send(
que_thr_t* receiver_thr, /* in: query thread which wants the
reply, or NULL; if type is
TRX_SIG_END_WAIT, this must be NULL */
- trx_savept_t* savept) /* in: possible rollback savepoint, or
+ trx_savept_t* savept, /* in: possible rollback savepoint, or
NULL */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if the parameter
+ is NULL, it is ignored */
{
trx_sig_t* sig;
trx_t* receiver_trx;
@@ -1100,7 +1140,14 @@ trx_sig_send(
ut_ad(mutex_own(&kernel_mutex));
#endif /* UNIV_SYNC_DEBUG */
- ut_a(trx_sig_is_compatible(trx, type, sender));
+ if (!trx_sig_is_compatible(trx, type, sender)) {
+ /* The signal is not compatible with the other signals in
+ the queue: do nothing */
+
+ ut_error;
+
+ return(FALSE);
+ }
/* Queue the signal object */
@@ -1134,6 +1181,11 @@ trx_sig_send(
sig);
}
+ if (trx->sess->state == SESS_ERROR) {
+
+ trx_sig_reply_wait_to_suspended(trx);
+ }
+
if ((sender != TRX_SIG_SELF) || (type == TRX_SIG_BREAK_EXECUTION)) {
/* The following call will add a TRX_SIG_ERROR_OCCURRED
@@ -1148,10 +1200,10 @@ trx_sig_send(
if (UT_LIST_GET_FIRST(trx->signals) == sig) {
- return(trx_sig_start_handle(trx));
+ trx_sig_start_handle(trx, next_thr);
}
- return(NULL);
+ return(TRUE);
}
/********************************************************************
@@ -1173,18 +1225,27 @@ trx_end_signal_handling(
trx->handling_signals = FALSE;
trx->graph = trx->graph_before_signal_handling;
+
+ if (trx->graph && (trx->sess->state == SESS_ERROR)) {
+
+ que_fork_error_handle(trx, trx->graph);
+ }
}
/********************************************************************
Starts handling of a trx signal. */
-que_thr_t*
+void
trx_sig_start_handle(
/*=================*/
- /* out: next query thread to run, or NULL */
- trx_t* trx) /* in: trx handle */
+ trx_t* trx, /* in: trx handle */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread; if the parameter
+ is NULL, it is ignored */
{
- que_thr_t* next_thr = NULL;
trx_sig_t* sig;
ulint type;
loop:
@@ -1200,7 +1261,7 @@ loop:
trx_end_signal_handling(trx);
- return(next_thr);
+ return;
}
if (trx->conc_state == TRX_NOT_STARTED) {
@@ -1216,13 +1277,23 @@ loop:
trx_lock_wait_to_suspended(trx);
}
+ /* If the session is in the error state and this trx has threads
+ waiting for reply from signals, moves these threads to the suspended
+ state, canceling wait reservations; note that if the transaction has
+ sent a commit or rollback signal to itself, and its session is not in
+ the error state, then nothing is done here. */
+
+ if (trx->sess->state == SESS_ERROR) {
+ trx_sig_reply_wait_to_suspended(trx);
+ }
+
/* If there are no running query threads, we can start processing of a
signal, otherwise we have to wait until all query threads of this
transaction are aware of the arrival of the signal. */
if (trx->n_active_thrs > 0) {
- return(NULL);
+ return;
}
if (trx->handling_signals == FALSE) {
@@ -1236,19 +1307,30 @@ loop:
if (type == TRX_SIG_COMMIT) {
- next_thr = trx_handle_commit_sig_off_kernel(trx);
+ trx_handle_commit_sig_off_kernel(trx, next_thr);
} else if ((type == TRX_SIG_TOTAL_ROLLBACK)
- || (type == TRX_SIG_ROLLBACK_TO_SAVEPT)
- || (type == TRX_SIG_ERROR_OCCURRED)) {
+ || (type == TRX_SIG_ROLLBACK_TO_SAVEPT)) {
+
+ trx_rollback(trx, sig, next_thr);
+
+ /* No further signals can be handled until the rollback
+ completes, therefore we return */
+
+ return;
+
+ } else if (type == TRX_SIG_ERROR_OCCURRED) {
+
+ trx_rollback(trx, sig, next_thr);
+
/* No further signals can be handled until the rollback
completes, therefore we return */
- return(trx_rollback(trx, sig));
+ return;
} else if (type == TRX_SIG_BREAK_EXECUTION) {
- next_thr = trx_sig_reply(sig);
+ trx_sig_reply(sig, next_thr);
trx_sig_remove(trx, sig);
} else {
ut_error;
@@ -1261,14 +1343,17 @@ loop:
Send the reply message when a signal in the queue of the trx has been
handled. */
-que_thr_t*
+void
trx_sig_reply(
/*==========*/
- /* out: next query thread to run */
- trx_sig_t* sig) /* in: signal */
+ trx_sig_t* sig, /* in: signal */
+ que_thr_t** next_thr) /* in/out: next query thread to run;
+ if the value which is passed in is
+ a pointer to a NULL pointer, then the
+ calling function can start running
+ a new query thread */
{
- trx_t* receiver_trx;
- que_thr_t* next_thr = NULL;
+ trx_t* receiver_trx;
ut_ad(sig);
#ifdef UNIV_SYNC_DEBUG
@@ -1282,13 +1367,13 @@ trx_sig_reply(
UT_LIST_REMOVE(reply_signals, receiver_trx->reply_signals,
sig);
- next_thr = que_thr_end_wait(sig->receiver);
+ ut_ad(receiver_trx->sess->state != SESS_ERROR);
+
+ que_thr_end_wait(sig->receiver, next_thr);
sig->receiver = NULL;
}
-
- return(next_thr);
}
/********************************************************************
@@ -1344,6 +1429,7 @@ trx_commit_step(
{
commit_node_t* node;
que_thr_t* next_thr;
+ ibool success;
node = thr->run_node;
@@ -1358,15 +1444,22 @@ trx_commit_step(
node->state = COMMIT_NODE_WAIT;
+ next_thr = NULL;
+
thr->state = QUE_THR_SIG_REPLY_WAIT;
/* Send the commit signal to the transaction */
- next_thr = trx_sig_send(thr_get_trx(thr), TRX_SIG_COMMIT,
- TRX_SIG_SELF, thr, NULL);
-
+ success = trx_sig_send(thr_get_trx(thr), TRX_SIG_COMMIT,
+ TRX_SIG_SELF, thr, NULL, &next_thr);
+
mutex_exit(&kernel_mutex);
+ if (!success) {
+ /* Error in delivering the commit signal */
+ que_thr_handle_error(thr, DB_ERROR, NULL, 0);
+ }
+
return(next_thr);
}
diff --git a/innobase/usr/usr0sess.c b/innobase/usr/usr0sess.c
index cc016f2b823..359c1552421 100644
--- a/innobase/usr/usr0sess.c
+++ b/innobase/usr/usr0sess.c
@@ -37,6 +37,8 @@ sess_open(void)
#endif /* UNIV_SYNC_DEBUG */
sess = mem_alloc(sizeof(sess_t));
+ sess->state = SESS_ACTIVE;
+
sess->trx = trx_create(sess);
UT_LIST_INIT(sess->graphs);
diff --git a/innobase/ut/ut0mem.c b/innobase/ut/ut0mem.c
index 47b612d757e..9a591df9f77 100644
--- a/innobase/ut/ut0mem.c
+++ b/innobase/ut/ut0mem.c
@@ -203,6 +203,81 @@ ut_free(
}
/**************************************************************************
+Implements realloc. This is needed by /pars/lexyy.c. Otherwise, you should not
+use this function because the allocation functions in mem0mem.h are the
+recommended ones in InnoDB.
+
+man realloc in Linux, 2004:
+
+ realloc() changes the size of the memory block pointed to
+ by ptr to size bytes. The contents will be unchanged to
+ the minimum of the old and new sizes; newly allocated mem­
+ ory will be uninitialized. If ptr is NULL, the call is
+ equivalent to malloc(size); if size is equal to zero, the
+ call is equivalent to free(ptr). Unless ptr is NULL, it
+ must have been returned by an earlier call to malloc(),
+ calloc() or realloc().
+
+RETURN VALUE
+ realloc() returns a pointer to the newly allocated memory,
+ which is suitably aligned for any kind of variable and may
+ be different from ptr, or NULL if the request fails. If
+ size was equal to 0, either NULL or a pointer suitable to
+ be passed to free() is returned. If realloc() fails the
+ original block is left untouched - it is not freed or
+ moved. */
+
+void*
+ut_realloc(
+/*=======*/
+ /* out, own: pointer to new mem block or NULL */
+ void* ptr, /* in: pointer to old block or NULL */
+ ulint size) /* in: desired size */
+{
+ ut_mem_block_t* block;
+ ulint old_size;
+ ulint min_size;
+ void* new_ptr;
+
+ if (ptr == NULL) {
+
+ return(ut_malloc(size));
+ }
+
+ if (size == 0) {
+ ut_free(ptr);
+
+ return(NULL);
+ }
+
+ block = (ut_mem_block_t*)((byte*)ptr - sizeof(ut_mem_block_t));
+
+ ut_a(block->magic_n == UT_MEM_MAGIC_N);
+
+ old_size = block->size - sizeof(ut_mem_block_t);
+
+ if (size < old_size) {
+ min_size = size;
+ } else {
+ min_size = old_size;
+ }
+
+ new_ptr = ut_malloc(size);
+
+ if (new_ptr == NULL) {
+
+ return(NULL);
+ }
+
+ /* Copy the old data from ptr */
+ ut_memcpy(new_ptr, ptr, min_size);
+
+ ut_free(ptr);
+
+ return(new_ptr);
+}
+
+/**************************************************************************
Frees in shutdown all allocated memory not freed yet. */
void
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 0a830c695bb..d1e92f5d91f 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -3114,6 +3114,7 @@ static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
return length;
}
+
/* Convert Numeric to buffer types */
static void send_data_long(MYSQL_BIND *param, MYSQL_FIELD *field,
longlong value)
@@ -3128,26 +3129,26 @@ static void send_data_long(MYSQL_BIND *param, MYSQL_FIELD *field,
*param->buffer= (uchar) value;
break;
case MYSQL_TYPE_SHORT:
- int2store(buffer, value);
+ shortstore(buffer, value);
break;
case MYSQL_TYPE_LONG:
- int4store(buffer, value);
+ longstore(buffer, value);
break;
case MYSQL_TYPE_LONGLONG:
- int8store(buffer, value);
+ longlongstore(buffer, value);
break;
case MYSQL_TYPE_FLOAT:
{
float data= (field_is_unsigned ? (float) ulonglong2double(value) :
(float) value);
- float4store(buffer, data);
+ floatstore(buffer, data);
break;
}
case MYSQL_TYPE_DOUBLE:
{
double data= (field_is_unsigned ? ulonglong2double(value) :
(double) value);
- float8store(buffer, data);
+ doublestore(buffer, data);
break;
}
default:
@@ -3183,24 +3184,26 @@ static void send_data_double(MYSQL_BIND *param, double value)
*buffer= (uchar)value;
break;
case MYSQL_TYPE_SHORT:
- int2store(buffer, (short)value);
+ shortstore(buffer, (short)value);
break;
case MYSQL_TYPE_LONG:
- int4store(buffer, (long)value);
+ longstore(buffer, (long)value);
break;
case MYSQL_TYPE_LONGLONG:
- int8store(buffer, (longlong)value);
+ {
+ longlong val= (longlong) value;
+ longlongstore(buffer, val);
break;
+ }
case MYSQL_TYPE_FLOAT:
{
- float data= (float)value;
- float4store(buffer, data);
+ float data= (float) value;
+ floatstore(buffer, data);
break;
}
case MYSQL_TYPE_DOUBLE:
{
- double data= (double)value;
- float8store(buffer, data);
+ doublestore(buffer, value);
break;
}
default:
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index cac4d08f5d6..196cb5c21fb 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -53,10 +53,11 @@ static double _nwghts[11]=
-3.796875000000000};
static double *nwghts=_nwghts+5; /* nwghts[i] = -0.5*1.5**i */
-#define FTB_FLAG_TRUNC 1 /* */
-#define FTB_FLAG_YES 2 /* no two from these three */
-#define FTB_FLAG_NO 4 /* YES, NO, WONLY */
-#define FTB_FLAG_WONLY 8 /* should be _ever_ set both */
+#define FTB_FLAG_TRUNC 1
+/* At most one of the following flags can be set */
+#define FTB_FLAG_YES 2
+#define FTB_FLAG_NO 4
+#define FTB_FLAG_WONLY 8
typedef struct st_ftb_expr FTB_EXPR;
struct st_ftb_expr
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 96a26fd90f1..052fa55a559 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -376,8 +376,6 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
for (key= 0,keyinfo= &share->keyinfo[0]; key < share->base.keys ;
rec_per_key_part+=keyinfo->keysegs, key++, keyinfo++)
{
- if (*killed_ptr(param))
- DBUG_RETURN(-1);
param->key_crc[key]=0;
if (!(((ulonglong) 1 << key) & share->state.key_map))
{
diff --git a/myisam/mi_unique.c b/myisam/mi_unique.c
index 06d50e6905b..ad685f4cbdc 100644
--- a/myisam/mi_unique.c
+++ b/myisam/mi_unique.c
@@ -69,8 +69,8 @@ my_bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, byte *record,
ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record)
{
const byte *pos, *end;
- ulong crc= 0;
- ulong seed= 4;
+ ha_checksum crc= 0;
+ ulong seed1=0, seed2= 4;
HA_KEYSEG *keyseg;
for (keyseg=def->seg ; keyseg < def->end ; keyseg++)
@@ -110,7 +110,9 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record)
if (type == HA_KEYTYPE_TEXT || type == HA_KEYTYPE_VARTEXT)
{
keyseg->charset->coll->hash_sort(keyseg->charset,
- (const uchar*) pos, length, &crc, &seed);
+ (const uchar*) pos, length, &seed1,
+ &seed2);
+ crc^= seed1;
}
else
while (pos != end)
@@ -118,7 +120,7 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record)
(((uchar) *(uchar*) pos++))) +
(crc >> (8*sizeof(ha_checksum)-8));
}
- return (ha_checksum)crc;
+ return crc;
}
/*
diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c
index ef4b7a5ff87..c4b5acadc92 100644
--- a/myisam/myisamchk.c
+++ b/myisam/myisamchk.c
@@ -362,13 +362,13 @@ static void usage(void)
this option is deprecated; you can set variables\n\
directly with '--variable-name=value'.\n\
-t, --tmpdir=path Path for temporary files. Multiple paths can be\n\
- specified, separated by "
+ specified, separated by ");
#if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
- "semicolon (;)"
+ puts("semicolon (;)");
#else
- "colon (:)"
+ puts("colon (:)");
#endif
- ", they will be used\n\
+ puts(", they will be used\n\
in a round-robin fashion.\n\
-s, --silent Only print errors. One can use two -s to make\n\
myisamchk very silent.\n\
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index 32ed205f0db..d4c5bfb2209 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -16,7 +16,7 @@ USE_MANAGER=0
MY_TZ=GMT-3
TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work
LOCAL_SOCKET=@MYSQL_UNIX_ADDR@
-MYSQL_TCP_PORT=@MYSQL_TCP_PORT@; export MYSQL_TCP_PORT
+MYSQL_TCP_PORT=@MYSQL_TCP_PORT@
# For query_cache test
case `uname` in
@@ -434,7 +434,7 @@ SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/slave.err"
CURRENT_TEST="$MYSQL_TEST_DIR/var/log/current_test"
SMALL_SERVER="--key_buffer_size=1M --sort_buffer=256K --max_heap_table_size=1M"
-export MASTER_MYPORT SLAVE_MYPORT
+export MASTER_MYPORT SLAVE_MYPORT MYSQL_TCP_PORT
if [ x$SOURCE_DIST = x1 ] ; then
MY_BASEDIR=$MYSQL_TEST_DIR
diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result
index ce26a0bf30a..4c8a0561b0a 100644
--- a/mysql-test/r/func_if.result
+++ b/mysql-test/r/func_if.result
@@ -77,3 +77,9 @@ select min(if(y -x > 5,y,NULL)), max(if(y - x > 5,y,NULL)) from t1;
min(if(y -x > 5,y,NULL)) max(if(y - x > 5,y,NULL))
6 56
drop table t1;
+create table t1 (a int);
+insert t1 values (1),(2);
+select if(1>2,a,avg(a)) from t1;
+if(1>2,a,avg(a))
+1.5000
+drop table t1;
diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result
index 7c4edac1afd..fd3199add72 100644
--- a/mysql-test/r/func_time.result
+++ b/mysql-test/r/func_time.result
@@ -532,7 +532,7 @@ date_add(date,INTERVAL "1 1:1:1" DAY_SECOND)
2003-01-03 01:01:01
select date_add(time,INTERVAL 1 SECOND) from t1;
date_add(time,INTERVAL 1 SECOND)
-2006-07-08 00:00:01
+NULL
drop table t1;
select last_day('2000-02-05') as f1, last_day('2002-12-31') as f2,
last_day('2003-03-32') as f3, last_day('2003-04-01') as f4,
diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result
index 290e72d3b55..06a479c964c 100644
--- a/mysql-test/r/range.result
+++ b/mysql-test/r/range.result
@@ -299,6 +299,27 @@ a b
15 1
47 1
DROP TABLE t1;
+CREATE TABLE t1 (
+id int( 11 ) unsigned NOT NULL AUTO_INCREMENT ,
+line int( 5 ) unsigned NOT NULL default '0',
+columnid int( 3 ) unsigned NOT NULL default '0',
+owner int( 3 ) unsigned NOT NULL default '0',
+ordinal int( 3 ) unsigned NOT NULL default '0',
+showid smallint( 6 ) unsigned NOT NULL default '1',
+tableid int( 1 ) unsigned NOT NULL default '1',
+content int( 5 ) unsigned NOT NULL default '188',
+PRIMARY KEY ( owner, id ) ,
+KEY menu( owner, showid, columnid ) ,
+KEY `COLUMN` ( owner, columnid, line ) ,
+KEY `LINES` ( owner, tableid, content, id ) ,
+KEY recount( owner, line )
+) ENGINE = MYISAM;
+INSERT into t1 (owner,id,columnid,line) values (11,15,15,1),(11,13,13,5);
+SELECT id, columnid, tableid, content, showid, line, ordinal FROM t1 WHERE owner=11 AND ((columnid IN ( 15, 13, 14 ) AND line IN ( 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 31 )) OR (columnid IN ( 13, 14 ) AND line IN ( 15 ))) LIMIT 0 , 30;
+id columnid tableid content showid line ordinal
+13 13 1 188 1 5 0
+15 15 1 188 1 1 0
+drop table t1;
create table t1 (id int(10) primary key);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9);
select id from t1 where id in (2,5,9) ;
diff --git a/mysql-test/r/rpl_free_items.result b/mysql-test/r/rpl_free_items.result
new file mode 100644
index 00000000000..91c1e2aa6e5
--- /dev/null
+++ b/mysql-test/r/rpl_free_items.result
@@ -0,0 +1,10 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+create table t1 (a int);
+create table t2 (a int);
+drop table t1;
+drop table t2;
diff --git a/mysql-test/r/rpl_get_lock.result b/mysql-test/r/rpl_get_lock.result
index 2c57069e91a..26f33bfb42c 100644
--- a/mysql-test/r/rpl_get_lock.result
+++ b/mysql-test/r/rpl_get_lock.result
@@ -18,9 +18,9 @@ get_lock("lock",3)
select * from t1;
n
1
-select is_free_lock("lock"), is_used_lock("lock");
-is_free_lock("lock") is_used_lock("lock")
-0 6
+select is_free_lock("lock"), is_used_lock("lock") = connection_id();
+is_free_lock("lock") is_used_lock("lock") = connection_id()
+0 1
explain extended select is_free_lock("lock"), is_used_lock("lock");
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 890fd464c29..3286ddceb0b 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -1831,3 +1831,13 @@ Warnings:
Note 1276 Field or reference 'up.a' of SELECT #2 was resolved in SELECT #1
Note 1003 select test.up.a AS `a`,test.up.b AS `b` from test.t1 up where exists(select 1 AS `Not_used` from test.t1 where (test.t1.a = test.up.a))
drop table t1;
+CREATE TABLE t1 (id int(11) default NULL,name varchar(10) default NULL);
+INSERT INTO t1 VALUES (1,'Tim'),(2,'Rebecca'),(3,NULL);
+CREATE TABLE t2 (id int(11) default NULL, pet varchar(10) default NULL);
+INSERT INTO t2 VALUES (1,'Fido'),(2,'Spot'),(3,'Felix');
+SELECT a.*, b.* FROM (SELECT * FROM t1) AS a JOIN t2 as b on a.id=b.id;
+id name id pet
+1 Tim 1 Fido
+2 Rebecca 2 Spot
+3 NULL 3 Felix
+drop table t1,t2;
diff --git a/mysql-test/r/type_date.result b/mysql-test/r/type_date.result
index cebd005c2c8..e77ef9f975b 100644
--- a/mysql-test/r/type_date.result
+++ b/mysql-test/r/type_date.result
@@ -73,3 +73,9 @@ SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT))
Wed, 06 March 2002 10:11:12 GMT-0800 Wed, 06 March 2002 10:11:12 GMT-0800
drop table t1,t2;
+CREATE TABLE t1 (f1 time default NULL, f2 time default NULL);
+INSERT INTO t1 (f1, f2) VALUES ('09:00', '12:00');
+SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1;
+DATE_FORMAT(f1, "%l.%i %p") DATE_FORMAT(f2, "%l.%i %p")
+9.00 AM 12.00 PM
+DROP TABLE t1;
diff --git a/mysql-test/r/type_decimal.result b/mysql-test/r/type_decimal.result
index e39c4c2b132..a9dcabd121e 100644
--- a/mysql-test/r/type_decimal.result
+++ b/mysql-test/r/type_decimal.result
@@ -444,6 +444,13 @@ CREATE TABLE t1 (a_dec DECIMAL(-2,1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-2,1))' at line 1
CREATE TABLE t1 (a_dec DECIMAL(-1,1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1,1))' at line 1
+CREATE TABLE t1 (a_dec DECIMAL(0,11));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a_dec` decimal(12,11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE t1;
create table t1(a decimal(7,3));
insert into t1 values ('1'),('+1'),('-1'),('0000000001'),('+0000000001'),('-0000000001'),('10'),('+10'),('-10'),('0000000010'),('+0000000010'),('-0000000010'),('100'),('+100'),('-100'),('0000000100'),('+0000000100'),('-0000000100'),('1000'),('+1000'),('-1000'),('0000001000'),('+0000001000'),('-0000001000'),('10000'),('+10000'),('-10000'),('0000010000'),('+0000010000'),('-0000010000'),('100000'),('+100000'),('-100000'),('0000100000'),('+0000100000'),('-0000100000'),('1000000'),('+1000000'),('-1000000'),('0001000000'),('+0001000000'),('-0001000000'),('10000000'),('+10000000'),('-10000000'),('0010000000'),('+0010000000'),('-0010000000'),('100000000'),('+100000000'),('-100000000'),('0100000000'),('+0100000000'),('-0100000000'),('1000000000'),('+1000000000'),('-1000000000'),('1000000000'),('+1000000000'),('-1000000000');
select * from t1;
diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test
index 36c3a38d2fe..7048d188604 100644
--- a/mysql-test/t/func_if.test
+++ b/mysql-test/t/func_if.test
@@ -47,3 +47,12 @@ create table t1 (x int, y int);
insert into t1 values (0,6),(10,16),(20,26),(30,10),(40,46),(50,56);
select min(if(y -x > 5,y,NULL)), max(if(y - x > 5,y,NULL)) from t1;
drop table t1;
+
+#
+# BUG#3987
+#
+create table t1 (a int);
+insert t1 values (1),(2);
+select if(1>2,a,avg(a)) from t1;
+drop table t1;
+
diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test
index a85f9d563e9..67192c55ef9 100644
--- a/mysql-test/t/func_time.test
+++ b/mysql-test/t/func_time.test
@@ -255,8 +255,6 @@ select date_add(date,INTERVAL "1 1" YEAR_MONTH) from t1;
select date_add(date,INTERVAL "1:1:1" HOUR_SECOND) from t1;
select date_add(date,INTERVAL "1 1:1" DAY_MINUTE) from t1;
select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1;
-
-# The following is not as one would expect...
select date_add(time,INTERVAL 1 SECOND) from t1;
drop table t1;
diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test
index 4665cd02ed8..471af8e4a5b 100644
--- a/mysql-test/t/range.test
+++ b/mysql-test/t/range.test
@@ -255,7 +255,34 @@ WHERE
);
DROP TABLE t1;
+#
+# Test of problem with IN on many different keyparts. (Bug #4157)
+#
+
+CREATE TABLE t1 (
+id int( 11 ) unsigned NOT NULL AUTO_INCREMENT ,
+line int( 5 ) unsigned NOT NULL default '0',
+columnid int( 3 ) unsigned NOT NULL default '0',
+owner int( 3 ) unsigned NOT NULL default '0',
+ordinal int( 3 ) unsigned NOT NULL default '0',
+showid smallint( 6 ) unsigned NOT NULL default '1',
+tableid int( 1 ) unsigned NOT NULL default '1',
+content int( 5 ) unsigned NOT NULL default '188',
+PRIMARY KEY ( owner, id ) ,
+KEY menu( owner, showid, columnid ) ,
+KEY `COLUMN` ( owner, columnid, line ) ,
+KEY `LINES` ( owner, tableid, content, id ) ,
+KEY recount( owner, line )
+) ENGINE = MYISAM;
+
+INSERT into t1 (owner,id,columnid,line) values (11,15,15,1),(11,13,13,5);
+
+SELECT id, columnid, tableid, content, showid, line, ordinal FROM t1 WHERE owner=11 AND ((columnid IN ( 15, 13, 14 ) AND line IN ( 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 31 )) OR (columnid IN ( 13, 14 ) AND line IN ( 15 ))) LIMIT 0 , 30;
+drop table t1;
+
+#
# test for a bug with in() and unique key
+#
create table t1 (id int(10) primary key);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9);
diff --git a/mysql-test/t/rpl_free_items-slave.opt b/mysql-test/t/rpl_free_items-slave.opt
new file mode 100644
index 00000000000..b828d03fafb
--- /dev/null
+++ b/mysql-test/t/rpl_free_items-slave.opt
@@ -0,0 +1 @@
+--replicate-wild-ignore-table=test.%
diff --git a/mysql-test/t/rpl_free_items.test b/mysql-test/t/rpl_free_items.test
new file mode 100644
index 00000000000..3228ffd9cde
--- /dev/null
+++ b/mysql-test/t/rpl_free_items.test
@@ -0,0 +1,20 @@
+source include/master-slave.inc;
+create table t1 (a int);
+create table t2 (a int);
+disable_query_log;
+SET @query="INSERT INTO t2 SELECT * FROM t1 WHERE a REGEXP \"0\"";
+let $1 = 2000;
+while ($1)
+{
+ eval SET @query=concat(@query, " OR a REGEXP '$1'");
+ dec $1;
+}
+let $1=`select @query`;
+eval $1;
+enable_query_log;
+# I have seen the slave crash either now or at shutdown
+sync_slave_with_master;
+connection master;
+drop table t1;
+drop table t2;
+sync_slave_with_master;
diff --git a/mysql-test/t/rpl_get_lock.test b/mysql-test/t/rpl_get_lock.test
index c3b033fb03a..5e58753e59a 100644
--- a/mysql-test/t/rpl_get_lock.test
+++ b/mysql-test/t/rpl_get_lock.test
@@ -22,7 +22,7 @@ connection slave;
sync_with_master;
select get_lock("lock",3);
select * from t1;
-select is_free_lock("lock"), is_used_lock("lock");
+select is_free_lock("lock"), is_used_lock("lock") = connection_id();
explain extended select is_free_lock("lock"), is_used_lock("lock");
# Check lock functions
select is_free_lock("lock2");
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index 4b2fd33abfd..d68e519e460 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -1167,3 +1167,14 @@ insert into t1 values (1,2),(3,4);
select * from t1 up where exists (select * from t1 where t1.a=up.a);
explain extended select * from t1 up where exists (select * from t1 where t1.a=up.a);
drop table t1;
+
+#
+# Test problem with NULL and derived tables (Bug #4097)
+#
+
+CREATE TABLE t1 (id int(11) default NULL,name varchar(10) default NULL);
+INSERT INTO t1 VALUES (1,'Tim'),(2,'Rebecca'),(3,NULL);
+CREATE TABLE t2 (id int(11) default NULL, pet varchar(10) default NULL);
+INSERT INTO t2 VALUES (1,'Fido'),(2,'Spot'),(3,'Felix');
+SELECT a.*, b.* FROM (SELECT * FROM t1) AS a JOIN t2 as b on a.id=b.id;
+drop table t1,t2;
diff --git a/mysql-test/t/type_date.test b/mysql-test/t/type_date.test
index 5a53c635e6e..8d67802d42a 100644
--- a/mysql-test/t/type_date.test
+++ b/mysql-test/t/type_date.test
@@ -79,3 +79,12 @@ SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.
INSERT INTO t1 VALUES(1);
SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)), DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1,t2 GROUP BY t1.AFIELD;
drop table t1,t2;
+
+#
+# Multiple SELECT DATE_FORMAT gave incorrect results (Bug #4036)
+#
+
+CREATE TABLE t1 (f1 time default NULL, f2 time default NULL);
+INSERT INTO t1 (f1, f2) VALUES ('09:00', '12:00');
+SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1;
+DROP TABLE t1;
diff --git a/mysql-test/t/type_decimal.test b/mysql-test/t/type_decimal.test
index 3257002ae2c..414a06deaa9 100644
--- a/mysql-test/t/type_decimal.test
+++ b/mysql-test/t/type_decimal.test
@@ -244,6 +244,9 @@ CREATE TABLE t1 (a_dec DECIMAL(-1,0));
CREATE TABLE t1 (a_dec DECIMAL(-2,1));
--error 1064
CREATE TABLE t1 (a_dec DECIMAL(-1,1));
+CREATE TABLE t1 (a_dec DECIMAL(0,11));
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
#
# Zero prepend overflow bug
diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c
index e2ad71654dc..0b337a74c19 100644
--- a/mysys/mf_tempfile.c
+++ b/mysys/mf_tempfile.c
@@ -83,7 +83,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
(*free)(res);
file=my_create(to, 0, mode, MyFlags);
}
-#elif defined(HAVE_MKSTEMP)
+#elif defined(HAVE_MKSTEMP) && !defined(__NETWARE__)
{
char prefix_buff[30];
uint pfx_len;
diff --git a/netware/BUILD/mwenv b/netware/BUILD/mwenv
index 7eca2711a79..22de9a4ad87 100755
--- a/netware/BUILD/mwenv
+++ b/netware/BUILD/mwenv
@@ -1,10 +1,10 @@
#! /bin/sh
-# WINE_BUILD_DIR, BUILD_DIR, and VERSION must be correct before compiling
+# F:/mydev, /home/kp/mydev, and 4.0.21 must be correct before compiling
# This values are normally changed by the nwbootstrap script
# the default is "F:/mydev"
-export MYDEV="WINE_BUILD_DIR"
+export MYDEV="F:/mydev"
export MWCNWx86Includes="$MYDEV/libc/include;$MYDEV/fs64/headers;$MYDEV/zlib-1.1.4;$MYDEV"
export MWNWx86Libraries="$MYDEV/libc/imports;$MYDEV/mw/lib;$MYDEV/fs64/imports;$MYDEV/zlib-1.1.4;$MYDEV/openssl;$MYDEV/mysql-VERSION/netware/BUILD"
@@ -13,7 +13,7 @@ export MWNWx86LibraryFiles="libcpre.o;libc.imp;netware.imp;mwcrtl.lib;mwcpp.lib;
export WINEPATH="$MYDEV/mw/bin"
# the default added path is "$HOME/mydev/mysql-x.x-x/netware/BUILD"
-export PATH="$PATH:BUILD_DIR/mysql-VERSION/netware/BUILD"
+export PATH="$PATH:/home/kp/mydev/mysql-VERSION/netware/BUILD"
export AR='mwldnlm'
export AR_FLAGS='-type library -o'
diff --git a/netware/BUILD/nwbootstrap b/netware/BUILD/nwbootstrap
index 7737dd8898a..25e843c87e3 100755
--- a/netware/BUILD/nwbootstrap
+++ b/netware/BUILD/nwbootstrap
@@ -176,6 +176,11 @@ done
echo "generating llibmysql.imp file..."
awk 'BEGIN{x=0;} x==1 {print $1;next} /EXPORTS/{x=1}' libmysql/libmysql.def > netware/libmysql.imp
+# create the libmysql.imp file in netware folder from libmysql/libmysql.def file
+echo "generating llibmysql.imp file..."
+awk 'BEGIN{x=0;} x==1 {print $1;next} /EXPORTS/{x=1}' libmysql/libmysql.def > netware/libmysql.imp
+
+
# build linux tools
echo "compiling linux tools..."
./netware/BUILD/compile-linux-tools
diff --git a/netware/Makefile.am b/netware/Makefile.am
index 324c6fd13fa..2467270f27b 100644
--- a/netware/Makefile.am
+++ b/netware/Makefile.am
@@ -16,6 +16,8 @@
if HAVE_NETWARE
INCLUDES = -I$(srcdir)/../include -I../include -I..
+LDADD = @CLIENT_EXTRA_LDFLAGS@ ../mysys/libmysys.a \
+ ../dbug/libdbug.a ../strings/libmystrings.a
bin_PROGRAMS = mysqld_safe mysql_install_db mysql_test_run libmysql
mysqld_safe_SOURCES= mysqld_safe.c my_manage.c
mysql_install_db_SOURCES= mysql_install_db.c my_manage.c
diff --git a/netware/mysql_test_run.c b/netware/mysql_test_run.c
index 9c99e8a64b5..37985b9058e 100644
--- a/netware/mysql_test_run.c
+++ b/netware/mysql_test_run.c
@@ -16,20 +16,15 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
+#include <my_global.h>
+#include <m_string.h>
#include <dirent.h>
-#include <string.h>
#include <screen.h>
#include <nks/vm.h>
#include <ctype.h>
#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
#include <sys/mode.h>
-#include "my_config.h"
#include "my_manage.h"
/******************************************************************************
@@ -1286,7 +1281,6 @@ int main(int argc, char **argv)
return 0;
}
-
/*
Synopsis:
This function breaks the string into a sequence of tokens. The difference
diff --git a/netware/mysqld_safe.c b/netware/mysqld_safe.c
index 8d4a5c4a296..a307b52bb7e 100644
--- a/netware/mysqld_safe.c
+++ b/netware/mysqld_safe.c
@@ -1,20 +1,20 @@
/*
- Copyright (c) 2003 Novell, Inc. All Rights Reserved.
+ Copyright (c) 2003 Novell, Inc. All Rights Reserved.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
+*/
#include <stdlib.h>
#include <stdio.h>
@@ -32,7 +32,7 @@
/******************************************************************************
global variables
-
+
******************************************************************************/
char autoclose;
char basedir[PATH_MAX];
@@ -47,38 +47,38 @@ char mysqld[PATH_MAX];
char hostname[PATH_MAX];
char default_option[PATH_MAX];
-FILE *log_fd = NULL;
+FILE *log_fd= NULL;
/******************************************************************************
prototypes
-
+
******************************************************************************/
void usage(void);
void vlog(char *, va_list);
void log(char *, ...);
-void start_defaults(int, char*[]);
+void start_defaults(int, char *[]);
void finish_defaults();
void read_defaults(arg_list_t *);
-void parse_args(int, char*[]);
-void get_options(int, char*[]);
+void parse_args(int, char *[]);
+void get_options(int, char *[]);
void check_data_vol();
void check_setup();
void check_tables();
-void mysql_start(int, char*[]);
+void mysql_start(int, char *[]);
void parse_setvar(char *arg);
/******************************************************************************
functions
-
+
******************************************************************************/
/******************************************************************************
usage()
-
+
Show usage.
******************************************************************************/
@@ -86,7 +86,7 @@ void usage(void)
{
// keep the screen up
setscreenmode(SCR_NO_MODE);
-
+
puts("\
\n\
usage: mysqld_safe [options]\n\
@@ -107,14 +107,14 @@ options:\n\
--mysqld=<file> Use the <file> MySQL daemon.\n\
\n\
");
-
+
exit(-1);
}
/******************************************************************************
vlog()
-
+
Log the message.
******************************************************************************/
@@ -122,7 +122,7 @@ void vlog(char *format, va_list ap)
{
vfprintf(stdout, format, ap);
fflush(stdout);
-
+
if (log_fd)
{
vfprintf(log_fd, format, ap);
@@ -133,25 +133,25 @@ void vlog(char *format, va_list ap)
/******************************************************************************
log()
-
+
Log the message.
******************************************************************************/
void log(char *format, ...)
{
va_list ap;
-
+
va_start(ap, format);
vlog(format, ap);
-
+
va_end(ap);
}
/******************************************************************************
start_defaults()
-
+
Start setting the defaults.
******************************************************************************/
@@ -159,30 +159,30 @@ void start_defaults(int argc, char *argv[])
{
struct stat buf;
int i;
-
+
// default options
- static char *default_options[] =
+ static char *default_options[]=
{
- "--no-defaults",
- "--defaults-file=",
- "--defaults-extra-file=",
- NULL
+ "--no-defaults",
+ "--defaults-file=",
+ "--defaults-extra-file=",
+ NULL
};
-
+
// autoclose
- autoclose = FALSE;
-
+ autoclose= FALSE;
+
// basedir
get_basedir(argv[0], basedir);
-
+
// check-tables
- checktables = FALSE;
-
+ checktables= FALSE;
+
// hostname
- if (gethostname(hostname,PATH_MAX) < 0)
+ if (gethostname(hostname, PATH_MAX) < 0)
{
// default
- strcpy(hostname,"mysql");
+ strcpy(hostname, "mysql");
}
// address
@@ -190,30 +190,30 @@ void start_defaults(int argc, char *argv[])
// port
snprintf(port, PATH_MAX, "3306");
-
+
// default option
- default_option[0] = NULL;
- for (i=0; (argc > 1) && default_options[i]; i++)
- {
- if(!strnicmp(argv[1], default_options[i], strlen(default_options[i])))
- {
- strncpy(default_option, argv[1], PATH_MAX);
- break;
- }
- }
-
+ default_option[0]= NULL;
+ for (i= 0; (argc > 1) && default_options[i]; i++)
+ {
+ if (!strnicmp(argv[1], default_options[i], strlen(default_options[i])))
+ {
+ strncpy(default_option, argv[1], PATH_MAX);
+ break;
+ }
+ }
+
// set after basedir is established
- datadir[0] = NULL;
- pid_file[0] = NULL;
- err_log[0] = NULL;
- safe_log[0] = NULL;
- mysqld[0] = NULL;
+ datadir[0]= NULL;
+ pid_file[0]= NULL;
+ err_log[0]= NULL;
+ safe_log[0]= NULL;
+ mysqld[0]= NULL;
}
/******************************************************************************
finish_defaults()
-
+
Finish settig the defaults.
******************************************************************************/
@@ -221,22 +221,27 @@ void finish_defaults()
{
struct stat buf;
int i;
-
+
// datadir
- if (!datadir[0]) snprintf(datadir, PATH_MAX, "%s/data", basedir);
-
+ if (!datadir[0])
+ snprintf(datadir, PATH_MAX, "%s/data", basedir);
+
// pid-file
- if (!pid_file[0]) snprintf(pid_file, PATH_MAX, "%s/%s.pid", datadir, hostname);
-
+ if (!pid_file[0])
+ snprintf(pid_file, PATH_MAX, "%s/%s.pid", datadir, hostname);
+
// err-log
- if (!err_log[0]) snprintf(err_log, PATH_MAX, "%s/%s.err", datadir, hostname);
+ if (!err_log[0])
+ snprintf(err_log, PATH_MAX, "%s/%s.err", datadir, hostname);
// safe-log
- if (!safe_log[0]) snprintf(safe_log, PATH_MAX, "%s/%s.safe", datadir, hostname);
+ if (!safe_log[0])
+ snprintf(safe_log, PATH_MAX, "%s/%s.safe", datadir, hostname);
// mysqld
- if (!mysqld[0]) snprintf(mysqld, PATH_MAX, "%s/bin/mysqld-max", basedir);
-
+ if (!mysqld[0])
+ snprintf(mysqld, PATH_MAX, "%s/bin/mysqld-max", basedir);
+
if (stat(mysqld, &buf))
{
snprintf(mysqld, PATH_MAX, "%s/bin/mysqld", basedir);
@@ -246,7 +251,7 @@ void finish_defaults()
/******************************************************************************
read_defaults()
-
+
Read the defaults.
******************************************************************************/
@@ -257,64 +262,66 @@ void read_defaults(arg_list_t *pal)
char mydefaults[PATH_MAX];
char line[PATH_MAX];
FILE *fp;
-
- // defaults output file
- snprintf(defaults_file, PATH_MAX, "%s/bin/defaults.out", basedir);
- remove(defaults_file);
- // mysqladmin file
+ // defaults output file
+ snprintf(defaults_file, PATH_MAX, "%s/bin/defaults.out", basedir);
+ remove(defaults_file);
+
+ // mysqladmin file
snprintf(mydefaults, PATH_MAX, "%s/bin/my_print_defaults", basedir);
-
+
// args
init_args(&al);
add_arg(&al, mydefaults);
- if (default_option[0]) add_arg(&al, default_option);
+ if (default_option[0])
+ add_arg(&al, default_option);
add_arg(&al, "mysqld");
add_arg(&al, "server");
add_arg(&al, "mysqld_safe");
add_arg(&al, "safe_mysqld");
- spawn(mydefaults, &al, TRUE, NULL, defaults_file, NULL);
+ spawn(mydefaults, &al, TRUE, NULL, defaults_file, NULL);
free_args(&al);
- // gather defaults
- if((fp = fopen(defaults_file, "r")) != NULL)
- {
- while(fgets(line, PATH_MAX, fp))
- {
+ // gather defaults
+ if ((fp= fopen(defaults_file, "r")) != NULL)
+ {
+ while (fgets(line, PATH_MAX, fp))
+ {
char *p;
-
+
// remove end-of-line character
- if ((p = strrchr(line, '\n')) != NULL) *p = '\0';
-
+ if ((p= strrchr(line, '\n')) != NULL)
+ *p= '\0';
+
// add the option as an argument
- add_arg(pal, line);
- }
-
- fclose(fp);
- }
-
- // remove file
- remove(defaults_file);
+ add_arg(pal, line);
+ }
+
+ fclose(fp);
+ }
+
+ // remove file
+ remove(defaults_file);
}
/******************************************************************************
parse_args()
-
+
Get the options.
******************************************************************************/
void parse_args(int argc, char *argv[])
{
- int index = 0;
+ int index= 0;
int c;
-
+
// parse options
enum opts
{
- OPT_BASEDIR = 0xFF,
+ OPT_BASEDIR= 0xFF,
OPT_DATADIR,
OPT_PID_FILE,
OPT_BIND_ADDRESS,
@@ -325,65 +332,64 @@ void parse_args(int argc, char *argv[])
OPT_HELP,
OPT_SETVAR
};
-
- static struct option options[] =
+
+ static struct option options[]=
{
- {"autoclose", no_argument, &autoclose, TRUE},
- {"basedir", required_argument, 0, OPT_BASEDIR},
- {"check-tables", no_argument, &checktables, TRUE},
- {"datadir", required_argument, 0, OPT_DATADIR},
- {"pid-file", required_argument, 0, OPT_PID_FILE},
- {"bind-address", required_argument, 0, OPT_BIND_ADDRESS},
- {"port", required_argument, 0, OPT_PORT},
- {"err-log", required_argument, 0, OPT_ERR_LOG},
- {"safe-log", required_argument, 0, OPT_SAFE_LOG},
- {"mysqld", required_argument, 0, OPT_MYSQLD},
- {"help", no_argument, 0, OPT_HELP},
- {"set-variable", required_argument, 0, OPT_SETVAR},
- {0, 0, 0, 0}
+ {"autoclose", no_argument, &autoclose, TRUE},
+ {"basedir", required_argument, 0, OPT_BASEDIR},
+ {"check-tables", no_argument, &checktables, TRUE},
+ {"datadir", required_argument, 0, OPT_DATADIR},
+ {"pid-file", required_argument, 0, OPT_PID_FILE},
+ {"bind-address", required_argument, 0, OPT_BIND_ADDRESS},
+ {"port", required_argument, 0, OPT_PORT},
+ {"err-log", required_argument, 0, OPT_ERR_LOG},
+ {"safe-log", required_argument, 0, OPT_SAFE_LOG},
+ {"mysqld", required_argument, 0, OPT_MYSQLD},
+ {"help", no_argument, 0, OPT_HELP},
+ {"set-variable", required_argument, 0, OPT_SETVAR},
+ {0, 0, 0, 0}
};
-
+
// we have to reset getopt_long because we use it multiple times
- optind = 1;
-
+ optind= 1;
+
// turn off error reporting
- opterr = 0;
-
- while ((c = getopt_long(argc, argv, "b:h:P:", options, &index)) >= 0)
+ opterr= 0;
+
+ while ((c= getopt_long(argc, argv, "b:h:P:", options, &index)) >= 0)
{
- switch (c)
- {
+ switch (c) {
case OPT_BASEDIR:
case 'b':
strcpy(basedir, optarg);
break;
-
+
case OPT_DATADIR:
case 'h':
strcpy(datadir, optarg);
break;
-
+
case OPT_PID_FILE:
strcpy(pid_file, optarg);
break;
-
+
case OPT_BIND_ADDRESS:
strcpy(address, optarg);
break;
-
+
case OPT_PORT:
case 'P':
strcpy(port, optarg);
break;
-
+
case OPT_ERR_LOG:
strcpy(err_log, optarg);
break;
-
+
case OPT_SAFE_LOG:
strcpy(safe_log, optarg);
break;
-
+
case OPT_MYSQLD:
strcpy(mysqld, optarg);
break;
@@ -391,11 +397,11 @@ void parse_args(int argc, char *argv[])
case OPT_SETVAR:
parse_setvar(optarg);
break;
-
+
case OPT_HELP:
usage();
break;
-
+
default:
// ignore
break;
@@ -410,14 +416,15 @@ void parse_args(int argc, char *argv[])
void parse_setvar(char *arg)
{
char *pos;
-
+
if ((pos= strindex(arg, "port")))
{
- for (; *pos && *pos != '='; pos++) ;
+ for (; *pos && *pos != '='; pos++);
if (*pos)
strcpy(port, pos + 1);
}
}
+
/******************************************************************************
@@ -425,14 +432,14 @@ void parse_setvar(char *arg)
/******************************************************************************
get_options()
-
+
Get the options.
******************************************************************************/
void get_options(int argc, char *argv[])
{
arg_list_t al;
-
+
// start defaults
start_defaults(argc, argv);
@@ -442,10 +449,10 @@ void get_options(int argc, char *argv[])
read_defaults(&al);
parse_args(al.argc, al.argv);
free_args(&al);
-
+
// command-line arguments
parse_args(argc, argv);
-
+
// finish defaults
finish_defaults();
}
@@ -453,7 +460,7 @@ void get_options(int argc, char *argv[])
/******************************************************************************
check_data_vol()
-
+
Check the database volume.
******************************************************************************/
@@ -463,23 +470,23 @@ void check_data_vol()
struct volume_info vol;
char buff[PATH_MAX];
char *p;
-
+
// clear struct
memset(&vol, 0, sizeof(vol));
-
+
// find volume name
strcpy(buff, datadir);
- if (p = strchr(buff, ':'))
+ if (p= strchr(buff, ':'))
{
// terminate after volume name
- *p = 0;
+ *p= 0;
}
else
{
// assume SYS volume
strcpy(buff, "SYS");
}
-
+
// retrieve information
netware_vol_info_from_name(&vol, buff);
@@ -493,25 +500,25 @@ void check_data_vol()
/******************************************************************************
check_setup()
-
+
Check the current setup.
******************************************************************************/
void check_setup()
{
- struct stat info;
+ struct stat info;
char temp[PATH_MAX];
-
+
// remove any current pid_file
- if (!stat(pid_file, &info) && (remove(pid_file) < 0))
- {
+ if (!stat(pid_file, &info) && (remove(pid_file) < 0))
+ {
log("ERROR: Unable to remove current pid file!\n\n");
exit(-1);
- }
-
- // check the data volume
+ }
+
+ // check the data volume
check_data_vol();
-
+
// check for a database
snprintf(temp, PATH_MAX, "%s/mysql/host.frm", datadir);
if (stat(temp, &info))
@@ -524,7 +531,7 @@ void check_setup()
/******************************************************************************
check_tables()
-
+
Check the database tables.
******************************************************************************/
@@ -532,21 +539,21 @@ void check_tables()
{
arg_list_t al;
char mycheck[PATH_MAX];
- char table[PATH_MAX];
- char db[PATH_MAX];
- DIR *datadir_entry, *db_entry, *table_entry;
-
- // status
+ char table[PATH_MAX];
+ char db[PATH_MAX];
+ DIR *datadir_entry, *db_entry, *table_entry;
+
+ // status
log("checking tables...\n");
-
+
// list databases
- if ((datadir_entry = opendir(datadir)) == NULL)
- {
- return;
- }
+ if ((datadir_entry= opendir(datadir)) == NULL)
+ {
+ return;
+ }
- while((db_entry = readdir(datadir_entry)) != NULL)
- {
+ while ((db_entry= readdir(datadir_entry)) != NULL)
+ {
if (db_entry->d_name[0] == '.')
{
// Skip
@@ -555,71 +562,71 @@ void check_tables()
{
// create long db name
snprintf(db, PATH_MAX, "%s/%s", datadir, db_entry->d_name);
-
+
// list tables
- if ((db_entry = opendir(db)) == NULL)
+ if ((db_entry= opendir(db)) == NULL)
{
- continue;
+ continue;
}
-
- while((table_entry = readdir(db_entry)) != NULL)
+
+ while ((table_entry= readdir(db_entry)) != NULL)
{
- // create long table name
- snprintf(table, PATH_MAX, "%s/%s", db, strlwr(table_entry->d_name));
-
- if (strindex(table, ".myi"))
- {
- // ** myisamchk
-
- // mysqladmin file
- snprintf(mycheck, PATH_MAX, "%s/bin/myisamchk", basedir);
-
- // args
- init_args(&al);
- add_arg(&al, mycheck);
- add_arg(&al, "--silent");
- add_arg(&al, "--force");
- add_arg(&al, "--fast");
- add_arg(&al, "--medium-check");
- add_arg(&al, "-O");
- add_arg(&al, "key_buffer=64M");
- add_arg(&al, "-O");
- add_arg(&al, "sort_buffer=64M");
- add_arg(&al, table);
-
- spawn(mycheck, &al, TRUE, NULL, NULL, NULL);
-
- free_args(&al);
- }
- else if (strindex(table, ".ism"))
- {
- // ** isamchk
-
- // mysqladmin file
- snprintf(mycheck, PATH_MAX, "%s/bin/isamchk", basedir);
-
- // args
- init_args(&al);
- add_arg(&al, mycheck);
- add_arg(&al, "--silent");
- add_arg(&al, "--force");
- add_arg(&al, "-O");
- add_arg(&al, "sort_buffer=64M");
- add_arg(&al, table);
-
- spawn(mycheck, &al, TRUE, NULL, NULL, NULL);
-
- free_args(&al);
- }
+ // create long table name
+ snprintf(table, PATH_MAX, "%s/%s", db, strlwr(table_entry->d_name));
+
+ if (strindex(table, ".myi"))
+ {
+ // ** myisamchk
+
+ // mysqladmin file
+ snprintf(mycheck, PATH_MAX, "%s/bin/myisamchk", basedir);
+
+ // args
+ init_args(&al);
+ add_arg(&al, mycheck);
+ add_arg(&al, "--silent");
+ add_arg(&al, "--force");
+ add_arg(&al, "--fast");
+ add_arg(&al, "--medium-check");
+ add_arg(&al, "-O");
+ add_arg(&al, "key_buffer=64M");
+ add_arg(&al, "-O");
+ add_arg(&al, "sort_buffer=64M");
+ add_arg(&al, table);
+
+ spawn(mycheck, &al, TRUE, NULL, NULL, NULL);
+
+ free_args(&al);
+ }
+ else if (strindex(table, ".ism"))
+ {
+ // ** isamchk
+
+ // mysqladmin file
+ snprintf(mycheck, PATH_MAX, "%s/bin/isamchk", basedir);
+
+ // args
+ init_args(&al);
+ add_arg(&al, mycheck);
+ add_arg(&al, "--silent");
+ add_arg(&al, "--force");
+ add_arg(&al, "-O");
+ add_arg(&al, "sort_buffer=64M");
+ add_arg(&al, table);
+
+ spawn(mycheck, &al, TRUE, NULL, NULL, NULL);
+
+ free_args(&al);
+ }
}
}
- }
+ }
}
/******************************************************************************
mysql_start()
-
+
Start the mysql server.
******************************************************************************/
@@ -632,9 +639,9 @@ void mysql_start(int argc, char *argv[])
struct tm lt;
char stamp[PATH_MAX];
char skip;
-
+
// private options
- static char *private_options[] =
+ static char *private_options[]=
{
"--autoclose",
"--check-tables",
@@ -643,56 +650,57 @@ void mysql_start(int argc, char *argv[])
"--mysqld=",
NULL
};
-
+
// args
init_args(&al);
add_arg(&al, "%s", mysqld);
-
+
// parent args
- for(i = 1; i < argc; i++)
+ for (i= 1; i < argc; i++)
{
- skip = FALSE;
-
+ skip= FALSE;
+
// skip private arguments
- for (j=0; private_options[j]; j++)
+ for (j= 0; private_options[j]; j++)
{
- if(!strnicmp(argv[i], private_options[j], strlen(private_options[j])))
+ if (!strnicmp(argv[i], private_options[j], strlen(private_options[j])))
{
- skip = TRUE;
- consoleprintf("The argument skipped is %s\n",argv[i]);
- break;
+ skip= TRUE;
+ consoleprintf("The argument skipped is %s\n", argv[i]);
+ break;
}
}
-
+
if (!skip)
{
add_arg(&al, "%s", argv[i]);
- consoleprintf("The final argument is %s\n",argv[i]);
+ consoleprintf("The final argument is %s\n", argv[i]);
}
}
// spawn
do
{
// check the database tables
- if (checktables) check_tables();
-
+ if (checktables)
+ check_tables();
+
// status
time(&cal);
localtime_r(&cal, &lt);
strftime(stamp, PATH_MAX, "%d %b %Y %H:%M:%S", &lt);
log("mysql started : %s\n", stamp);
-
+
// spawn mysqld
spawn(mysqld, &al, TRUE, NULL, NULL, err_log);
}
while (!stat(pid_file, &info));
-
+
// status
time(&cal);
localtime_r(&cal, &lt);
strftime(stamp, PATH_MAX, "%d %b %Y %H:%M:%S", &lt);
log("mysql stopped : %s\n\n", stamp);
-
+
// free args
free_args(&al);
}
@@ -700,43 +708,45 @@ void mysql_start(int argc, char *argv[])
/******************************************************************************
main()
-
+
******************************************************************************/
int main(int argc, char **argv)
{
- char temp[PATH_MAX];
-
+ char temp[PATH_MAX];
+
// get the options
- get_options(argc, argv);
+ get_options(argc, argv);
// keep the screen up
- if (!autoclose) setscreenmode(SCR_NO_MODE);
-
+ if (!autoclose)
+ setscreenmode(SCR_NO_MODE);
+
// create log file
- log_fd = fopen(safe_log, "w+");
-
+ log_fd= fopen(safe_log, "w+");
+
// header
log("MySQL Server %s, for %s (%s)\n\n", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
-
- // status
- log("address : %s\n", address);
- log("port : %s\n", port);
+
+ // status
+ log("address : %s\n", address);
+ log("port : %s\n", port);
log("daemon : %s\n", mysqld);
- log("base directory : %s\n", basedir);
- log("data directory : %s\n", datadir);
- log("pid file : %s\n", pid_file);
- log("error file : %s\n", err_log);
- log("log file : %s\n", safe_log);
+ log("base directory : %s\n", basedir);
+ log("data directory : %s\n", datadir);
+ log("pid file : %s\n", pid_file);
+ log("error file : %s\n", err_log);
+ log("log file : %s\n", safe_log);
log("\n");
-
+
// check setup
check_setup();
-
+
// start the MySQL server
- mysql_start(argc, argv);
-
- // close log file
- if (log_fd) fclose(log_fd);
-
+ mysql_start(argc, argv);
+
+ // close log file
+ if (log_fd)
+ fclose(log_fd);
+
return 0;
}
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh
index 1fd67b1d0ee..558b0e2da0c 100644
--- a/scripts/mysql_install_db.sh
+++ b/scripts/mysql_install_db.sh
@@ -10,6 +10,7 @@
in_rpm=0
windows=0
defaults=""
+user=""
tmp_file=/tmp/mysql_install_db.$$
case "$1" in
@@ -34,7 +35,11 @@ parse_arguments() {
--force) force=1 ;;
--basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--ldata=*|--datadir=*) ldata=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
- --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
+ --user=*)
+ # Note that the user will be passed to mysqld so that it runs
+ # as 'user' (crucial e.g. if log-bin=/some_other_path/
+ # where a chown of datadir won't help)
+ user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--skip-name-resolve) ip_only=1 ;;
--verbose) verbose=1 ;;
--rpm) in_rpm=1 ;;
@@ -198,6 +203,10 @@ else
create_option="real"
fi
+if test -n "$user"; then
+ args="$args --user=$user"
+fi
+
if test "$in_rpm" -eq 0 -a "$windows" -eq 0
then
echo "Installing all prepared tables"
diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index 779438e75c3..7b77bf449cd 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -43,13 +43,7 @@ parse_arguments() {
--basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
--datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
--pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
- --user=*)
- if test $SET_USER -eq 0
- then
- user=`echo "$arg" | sed -e "s;--[^=]*=;;"`
- fi
- SET_USER=1
- ;;
+ --user=*) user=`echo "$arg" | sed -e "s;--[^=]*=;;"` ; SET_USER=1 ;;
# these two might have been set in a [mysqld_safe] section of my.cnf
# they are added to mysqld command line to override settings from my.cnf
diff --git a/sql-common/client.c b/sql-common/client.c
index 61ffd2b52e6..5c1a718c5bb 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -1732,7 +1732,8 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
sprintf(net->last_error, ER(CR_UNKNOWN_HOST), host, tmp_errno);
goto error;
}
- memcpy(&sock_addr.sin_addr,hp->h_addr, (size_t) hp->h_length);
+ memcpy(&sock_addr.sin_addr, hp->h_addr,
+ min(sizeof(sock_addr.sin_addr), (size_t) hp->h_length));
my_gethostbyname_r_free();
}
sock_addr.sin_port = (ushort) htons((ushort) port);
diff --git a/sql/field.cc b/sql/field.cc
index 21256b2bbcd..e8c6688545f 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -3369,6 +3369,36 @@ String *Field_time::val_str(String *val_buffer,
}
+/*
+ Normally we would not consider 'time' as a vaild date, but we allow
+ get_date() here to be able to do things like
+ DATE_FORMAT(time, "%l.%i %p")
+*/
+
+bool Field_time::get_date(TIME *ltime, uint fuzzydate)
+{
+ long tmp;
+ if (!fuzzydate)
+ {
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
+ return 1;
+ }
+ tmp=(long) sint3korr(ptr);
+ ltime->neg=0;
+ if (tmp < 0)
+ {
+ ltime->neg= 1;
+ tmp=-tmp;
+ }
+ ltime->hour=tmp/10000;
+ tmp-=ltime->hour*10000;
+ ltime->minute= tmp/100;
+ ltime->second= tmp % 100;
+ ltime->year= ltime->month= ltime->day= ltime->second_part= 0;
+ return 0;
+}
+
+
bool Field_time::get_time(TIME *ltime)
{
long tmp=(long) sint3korr(ptr);
diff --git a/sql/field.h b/sql/field.h
index f2a166d29c3..40d18693d2e 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -825,6 +825,7 @@ public:
double val_real(void);
longlong val_int(void);
String *val_str(String*,String *);
+ bool get_date(TIME *ltime, uint fuzzydate);
bool send_binary(Protocol *protocol);
bool get_time(TIME *ltime);
int cmp(const char *,const char*);
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 446d72ac143..be509c7ed11 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -922,8 +922,8 @@ Item_func_if::fix_length_and_dec()
decimals=max(args[1]->decimals,args[2]->decimals);
enum Item_result arg1_type=args[1]->result_type();
enum Item_result arg2_type=args[2]->result_type();
- bool null1=args[1]->null_value;
- bool null2=args[2]->null_value;
+ bool null1=args[1]->const_item() && args[1]->null_value;
+ bool null2=args[2]->const_item() && args[2]->null_value;
if (null1)
{
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 782f4021ea9..3c23ecd3c3d 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -47,10 +47,6 @@
#define ONE_THREAD
#endif
-#define SHUTDOWN_THD
-#define MAIN_THD
-#define SIGNAL_THD
-
#ifdef HAVE_purify
#define IF_PURIFY(A,B) (A)
#else
@@ -828,7 +824,6 @@ static void __cdecl kill_server(int sig_ptr)
#if defined(USE_ONE_SIGNAL_HAND) || (defined(__NETWARE__) && defined(SIGNALS_DONT_BREAK_READ))
extern "C" pthread_handler_decl(kill_server_thread,arg __attribute__((unused)))
{
- SHUTDOWN_THD;
my_thread_init(); // Initialize new thread
kill_server(0);
my_thread_end(); // Normally never reached
@@ -1718,7 +1713,6 @@ static void init_signals(void)
signal(SIGALRM, SIG_IGN);
signal(SIGBREAK,SIG_IGN);
signal_thread = pthread_self();
- SIGNAL_THD;
}
static void start_signal_handler(void)
@@ -2118,7 +2112,6 @@ int uname(struct utsname *a)
extern "C" pthread_handler_decl(handle_shutdown,arg)
{
MSG msg;
- SHUTDOWN_THD;
my_thread_init();
/* this call should create the message queue for this thread */
@@ -2147,7 +2140,6 @@ int STDCALL handle_kill(ulong ctrl_type)
#ifdef OS2
extern "C" pthread_handler_decl(handle_shutdown,arg)
{
- SHUTDOWN_THD;
my_thread_init();
// wait semaphore
@@ -5481,7 +5473,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
mysql_data_home= mysql_real_data_home;
break;
case 'u':
- if (!mysqld_user)
+ if (!mysqld_user || !strcmp(mysqld_user, argument))
mysqld_user= argument;
else
fprintf(stderr, "Warning: Ignoring user change to '%s' because the user was set to '%s' earlier on the command line\n", argument, mysqld_user);
diff --git a/sql/net_serv.cc b/sql/net_serv.cc
index a0f7a779894..c2da47b480e 100644
--- a/sql/net_serv.cc
+++ b/sql/net_serv.cc
@@ -284,7 +284,9 @@ my_net_write(NET *net,const char *packet,ulong len)
buff[3]= (uchar) net->pkt_nr++;
if (net_write_buff(net,(char*) buff,NET_HEADER_SIZE))
return 1;
+#ifndef DEBUG_DATA_PACKETS
DBUG_DUMP("packet_header",(char*) buff,NET_HEADER_SIZE);
+#endif
return test(net_write_buff(net,packet,len));
}
@@ -394,6 +396,9 @@ net_write_buff(NET *net,const char *packet,ulong len)
else
left_length= (ulong) (net->buff_end - net->write_pos);
+#ifdef DEBUG_DATA_PACKETS
+ DBUG_DUMP("data", packet, len);
+#endif
if (len > left_length)
{
if (net->write_pos != net->buff)
@@ -776,6 +781,8 @@ my_real_read(NET *net, ulong *complen)
if (i == 0)
{ /* First parts is packet length */
ulong helping;
+ DBUG_DUMP("packet_header",(char*) net->buff+net->where_b,
+ NET_HEADER_SIZE);
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
{
if (net->buff[net->where_b] != (uchar) 255)
@@ -784,7 +791,6 @@ my_real_read(NET *net, ulong *complen)
("Packets out of order (Found: %d, expected %u)",
(int) net->buff[net->where_b + 3],
net->pkt_nr));
- DBUG_DUMP("packet_header",(char*) net->buff+net->where_b, 4);
#ifdef EXTRA_DEBUG
fprintf(stderr,"Packets out of order (Found: %d, expected %d)\n",
(int) net->buff[net->where_b + 3],
@@ -841,6 +847,10 @@ end:
vio_blocking(net->vio, net_blocking, &old_mode);
}
net->reading_or_writing=0;
+#ifdef DEBUG_DATA_PACKETS
+ if (len != packet_error)
+ DBUG_DUMP("data",(char*) net->buff+net->where_b, len);
+#endif
return(len);
}
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index a5d2450e551..41ba09a3e70 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1561,7 +1561,7 @@ key_or(SEL_ARG *key1,SEL_ARG *key2)
{
swap_variables(SEL_ARG *,key1,key2);
}
- else if (!(key1=key1->clone_tree()))
+ if (key1->use_count > 0 || !(key1=key1->clone_tree()))
return 0; // OOM
}
@@ -1630,10 +1630,10 @@ key_or(SEL_ARG *key1,SEL_ARG *key2)
SEL_ARG *next=key2->next; // Keys are not overlapping
if (key2_shared)
{
- SEL_ARG *tmp= new SEL_ARG(*key2); // Must make copy
- if (!tmp)
+ SEL_ARG *cpy= new SEL_ARG(*key2); // Must make copy
+ if (!cpy)
return 0; // OOM
- key1=key1->insert(tmp);
+ key1=key1->insert(cpy);
key2->increment_use_count(key1->use_count+1);
}
else
@@ -1869,8 +1869,17 @@ SEL_ARG::find_range(SEL_ARG *key)
/*
-** Remove a element from the tree
-** This also frees all sub trees that is used by the element
+ Remove a element from the tree
+
+ SYNOPSIS
+ tree_delete()
+ key Key that is to be deleted from tree (this)
+
+ NOTE
+ This also frees all sub trees that is used by the element
+
+ RETURN
+ root of new tree (with key deleted)
*/
SEL_ARG *
@@ -1878,7 +1887,10 @@ SEL_ARG::tree_delete(SEL_ARG *key)
{
enum leaf_color remove_color;
SEL_ARG *root,*nod,**par,*fix_par;
- root=this; this->parent= 0;
+ DBUG_ENTER("tree_delete");
+
+ root=this;
+ this->parent= 0;
/* Unlink from list */
if (key->prev)
@@ -1925,7 +1937,7 @@ SEL_ARG::tree_delete(SEL_ARG *key)
}
if (root == &null_element)
- return 0; // Maybe root later
+ DBUG_RETURN(0); // Maybe root later
if (remove_color == BLACK)
root=rb_delete_fixup(root,nod,fix_par);
test_rb_tree(root,root->parent);
@@ -1933,7 +1945,7 @@ SEL_ARG::tree_delete(SEL_ARG *key)
root->use_count=this->use_count; // Fix root counters
root->elements=this->elements-1;
root->maybe_flag=this->maybe_flag;
- return root;
+ DBUG_RETURN(root);
}
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 9d1eb7bc54d..d552429af4b 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2830,7 +2830,7 @@ bool check_grant_all_columns(THD *thd, ulong want_access, TABLE *table)
if (table->grant.version != grant_version)
{
table->grant.grant_table=
- table_hash_search(thd->host,thd->ip,thd->db,
+ table_hash_search(thd->host, thd->ip, table->table_cache_key,
thd->priv_user,
table->real_name,0); /* purecov: inspected */
table->grant.version=grant_version; /* purecov: inspected */
@@ -2943,7 +2943,7 @@ ulong get_column_grant(THD *thd, TABLE_LIST *table, Field *field)
if (table->grant.version != grant_version)
{
table->grant.grant_table=
- table_hash_search(thd->host,thd->ip,thd->db,
+ table_hash_search(thd->host, thd->ip, table->db,
thd->priv_user,
table->real_name,0); /* purecov: inspected */
table->grant.version=grant_version; /* purecov: inspected */
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index a04823c6c43..7aa3bbbdd7b 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -162,7 +162,8 @@ THD::THD():user_time(0), current_statement(0), is_fatal_error(0),
{
host= user= priv_user= db= ip=0;
host_or_ip= "connecting host";
- locked=killed=some_tables_deleted=no_errors=password= 0;
+ locked=some_tables_deleted=no_errors=password= 0;
+ killed=0;
query_start_used= 0;
count_cuted_fields= CHECK_FIELD_IGNORE;
db_length= col_access= 0;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index cfa6d6bb079..77ce9be45fb 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1588,7 +1588,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break;
}
mysql_log.write(thd,command,db);
- mysql_rm_db(thd,alias,0,0);
+ mysql_rm_db(thd, (lower_case_table_names == 2 ? alias : db), 0, 0);
break;
}
#ifndef EMBEDDED_LIBRARY
@@ -3135,7 +3135,8 @@ purposes internal to the MySQL server", MYF(0));
send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION);
goto error;
}
- res=mysql_rm_db(thd,alias,lex->drop_if_exists,0);
+ res=mysql_rm_db(thd, (lower_case_table_names == 2 ? alias : lex->name),
+ lex->drop_if_exists, 0);
break;
}
case SQLCOM_ALTER_DB:
@@ -4207,7 +4208,12 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
break;
case FIELD_TYPE_DECIMAL:
if (!length)
- new_field->length= 10; // Default length for DECIMAL
+ {
+ if ((new_field->length= new_field->decimals))
+ new_field->length++;
+ else
+ new_field->length= 10; // Default length for DECIMAL
+ }
if (new_field->length < MAX_FIELD_WIDTH) // Skip wrong argument
{
new_field->length+=sign_len;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index b32cb228c72..196ed25e257 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -5138,6 +5138,10 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
recinfo->length=null_pack_length;
recinfo++;
bfill(null_flags,null_pack_length,255); // Set null fields
+
+ table->null_flags= (uchar*) table->record[0];
+ table->null_fields= null_count+ hidden_null_count;
+ table->null_bytes= null_pack_length;
}
null_count= (blob_count == 0) ? 1 : 0;
hidden_field_count=param->hidden_field_count;
@@ -5201,7 +5205,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
param->copy_field_end=copy;
param->recinfo=recinfo;
- store_record(table,default_values); // Make empty default record
+ store_record(table,default_values); // Make empty default record
if (thd->variables.tmp_table_size == ~(ulong) 0) // No limit
table->max_rows= ~(ha_rows) 0;
@@ -8327,10 +8331,11 @@ calc_group_buffer(JOIN *join,ORDER *group)
join->tmp_table_param.group_null_parts=null_parts;
}
+
/*
- alloc group fields or take prepared (chached)
+ allocate group fields or take prepared (cached)
- SYNOPSYS
+ SYNOPSIS
make_group_fields()
main_join - join of current select
curr_join - current join (join of current select or temporary copy of it)
@@ -8343,22 +8348,21 @@ calc_group_buffer(JOIN *join,ORDER *group)
static bool
make_group_fields(JOIN *main_join, JOIN *curr_join)
{
- if (main_join->group_fields_cache.elements)
- {
- curr_join->group_fields= main_join->group_fields_cache;
- curr_join->sort_and_group= 1;
- }
- else
- {
- if (alloc_group_fields(curr_join, curr_join->group_list))
- {
- return (1);
- }
- main_join->group_fields_cache= curr_join->group_fields;
- }
- return (0);
+ if (main_join->group_fields_cache.elements)
+ {
+ curr_join->group_fields= main_join->group_fields_cache;
+ curr_join->sort_and_group= 1;
+ }
+ else
+ {
+ if (alloc_group_fields(curr_join, curr_join->group_list))
+ return (1);
+ main_join->group_fields_cache= curr_join->group_fields;
+ }
+ return (0);
}
+
/*
Get a list of buffers for saveing last group
Groups are saved in reverse order for easyer check loop
@@ -8399,7 +8403,6 @@ test_if_group_changed(List<Item_buff> &list)
}
-
/*
Setup copy_fields to save fields at start of new group
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 89915852b9b..e1a4eb1c1a5 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -803,7 +803,7 @@ verb_clause:
;
deallocate:
- DEALLOCATE_SYM PREPARE_SYM ident
+ deallocate_or_drop PREPARE_SYM ident
{
THD *thd=YYTHD;
LEX *lex= thd->lex;
@@ -816,6 +816,12 @@ deallocate:
lex->prepared_stmt_name= $3;
};
+deallocate_or_drop:
+ DEALLOCATE_SYM |
+ DROP
+ ;
+
+
prepare:
PREPARE_SYM ident FROM prepare_src
{
diff --git a/sql/table.cc b/sql/table.cc
index 73f036aed87..e053eba7b6c 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1134,7 +1134,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo,
char fill[IO_SIZE];
#if SIZEOF_OFF_T > 4
- /* Fix this in MySQL 4.0; The current limit is 4G rows (QQ) */
+ /* Fix this when we have new .frm files; Current limit is 4G rows (QQ) */
if (create_info->max_rows > ~(ulong) 0)
create_info->max_rows= ~(ulong) 0;
if (create_info->min_rows > ~(ulong) 0)
diff --git a/support-files/my-huge.cnf.sh b/support-files/my-huge.cnf.sh
index 5fdde0d2963..d25686f1c21 100644
--- a/support-files/my-huge.cnf.sh
+++ b/support-files/my-huge.cnf.sh
@@ -1,6 +1,6 @@
-# Example mysql config file for very large systems.
+# Example MySQL config file for very large systems.
#
-# This is for large system with memory of 1G-2G where the system runs mainly
+# This is for a large system with memory of 1G-2G where the system runs mainly
# MySQL.
#
# You can copy this file to
@@ -9,9 +9,9 @@
# installation this directory is @localstatedir@) or
# ~/.my.cnf to set user-specific options.
#
-# One can in this file use all long options that the program supports.
+# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
-# with the --help option.
+# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
diff --git a/support-files/my-innodb-heavy-4G.cnf.sh b/support-files/my-innodb-heavy-4G.cnf.sh
index 54df6a8bfe6..6def311f474 100644
--- a/support-files/my-innodb-heavy-4G.cnf.sh
+++ b/support-files/my-innodb-heavy-4G.cnf.sh
@@ -13,8 +13,8 @@
# (@localstatedir@ for this installation) or to
# ~/.my.cnf to set user-specific options.
#
-# In this file, you can use all long options that the program supports.
-# If you want to know the options a program supports, run the program
+# In this file, you can use all long options that a program supports.
+# If you want to know which options a program supports, run the program
# with the "--help" option.
#
# More detailed information about the individual options can also be
diff --git a/support-files/my-large.cnf.sh b/support-files/my-large.cnf.sh
index a17ec7b5227..59aca4b32f2 100644
--- a/support-files/my-large.cnf.sh
+++ b/support-files/my-large.cnf.sh
@@ -1,6 +1,6 @@
-# Example mysql config file for large systems.
+# Example MySQL config file for large systems.
#
-# This is for large system with memory = 512M where the system runs mainly
+# This is for a large system with memory = 512M where the system runs mainly
# MySQL.
#
# You can copy this file to
@@ -9,9 +9,9 @@
# installation this directory is @localstatedir@) or
# ~/.my.cnf to set user-specific options.
#
-# One can in this file use all long options that the program supports.
+# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
-# with the --help option.
+# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
diff --git a/support-files/my-medium.cnf.sh b/support-files/my-medium.cnf.sh
index d50d0717c17..529740d59f0 100644
--- a/support-files/my-medium.cnf.sh
+++ b/support-files/my-medium.cnf.sh
@@ -1,4 +1,4 @@
-# Example mysql config file for medium systems.
+# Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
@@ -10,9 +10,9 @@
# installation this directory is @localstatedir@) or
# ~/.my.cnf to set user-specific options.
#
-# One can in this file use all long options that the program supports.
+# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
-# with the --help option.
+# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
diff --git a/support-files/my-small.cnf.sh b/support-files/my-small.cnf.sh
index 2ae62fb48f1..b2ecca6127e 100644
--- a/support-files/my-small.cnf.sh
+++ b/support-files/my-small.cnf.sh
@@ -1,4 +1,4 @@
-# Example mysql config file for small systems.
+# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
@@ -10,9 +10,9 @@
# installation this directory is @localstatedir@) or
# ~/.my.cnf to set user-specific options.
#
-# One can in this file use all long options that the program supports.
+# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
-# with the --help option.
+# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh
index 8583b623392..c3d74b147f3 100644
--- a/support-files/mysql.spec.sh
+++ b/support-files/mysql.spec.sh
@@ -397,7 +397,7 @@ useradd -M -r -d $mysql_datadir -s /bin/bash -c "MySQL server" mysql 2> /dev/nul
chown -R mysql $mysql_datadir
# Initiate databases
-mysql_install_db --rpm
+mysql_install_db -IN-RPM --user=mysql
# Change permissions again to fix any new files.
chown -R mysql $mysql_datadir