- Move increment of "i" to "increment section" of for loop
- Protect against writing after end of "buff"(backport from 5.1)
sql/sql_show.cc:
- Move the increment of i to "increment" section of for loop. Since "i"
was initially 0 the for loop exited immediately
- Add protection for writing after end of "buff"
since this flag was explicitly removed in pushbuild for GCOV builds.
BUILD_CMD => ['sh', '-c', 'perl -i.bak -pe "s/ \\\\\$static_link//" ' .
'BUILD/compile-pentium-gcov; BUILD/compile-pentium-gcov'],
Moving $static_link to SETUP.sh broke this, and is now fixed.
Should this flag be needed on some platforms,
the proper location is compile-<platform>-gcov
Tested the amd64 and pentium64 build fine without it, and can run NDB tests.
BUILD/SETUP.sh:
Removed $static_link from GCOV builds.
1) We do not provide the "isam" table handler in 5.0 and up (different from "myisam" !),
so we do not need the ".def" files for the "isam"-specific tools.
2) Use "basename" to get the base name of a file, not a harder-to-read sed expression.
BitKeeper/deleted/.del-isamchk.def:
Delete: netware/isamchk.def
BitKeeper/deleted/.del-isamlog.def:
Delete: netware/isamlog.def
BitKeeper/deleted/.del-pack_isam.def:
Delete: netware/pack_isam.def
netware/Makefile.am:
Use a plain "basename" showing the purpose, not a sed command which is harder to read.
This is a performance bug, related to the parsing or 'OR' and 'AND' boolean
expressions.
Let N be the number of expressions involved in a OR (respectively AND).
When N=1
For example, "select 1" involve only 1 term: there is no OR operator.
In 4.0 and 4.1, parsing expressions not involving OR had no overhead.
In 5.0, parsing adds some overhead, with Select->expr_list.
With this patch, the overhead introduced in 5.0 has been removed,
so that performances for N=1 should be identical to the 4.0 performances,
which are optimal (there is no code executed at all)
The overhead in 5.0 was in fact affecting significantly some operations.
For example, loading 1 Million rows into a table with INSERTs,
for a table that has 100 columns, leads to parsing 100 Millions of
expressions, which means that the overhead related to Select->expr_list
is executed 100 Million times ...
Considering that N=1 is by far the most probable expression,
this case should be optimal.
When N=2
For example, "select a OR b" involves 2 terms in the OR operator.
In 4.0 and 4.1, parsing expressions involving 2 terms created 1 Item_cond_or
node, which is the expected result.
In 5.0, parsing these expression also produced 1 node, but with some extra
overhead related to Select->expr_list : creating 1 list in Select->expr_list
and another in Item_cond::list is inefficient.
With this patch, the overhead introduced in 5.0 has been removed
so that performances for N=2 should be identical to the 4.0 performances.
Note that the memory allocation uses the new (thd->mem_root) syntax
directly.
The cost of "is_cond_or" is estimated to be neglectable: the real problem
of the performance degradation comes from unneeded memory allocations.
When N>=3
For example, "select a OR b OR c ...", which involves 3 or more terms.
In 4.0 and 4.1, the parser had no significant cost overhead, but produced
an Item tree which is difficult to evaluate / optimize during runtime.
In 5.0, the parser produces a better Item tree, using the Item_cond
constructor that accepts a list of children directly, but at an extra cost
related to Select->expr_list.
With this patch, the code is implemented to take the best of the two
implementations:
- there is no overhead with Select->expr_list
- the Item tree generated is optimized and flattened.
This is achieved by adding children nodes into the Item tree directly,
with Item_cond::add(), which avoids the need for temporary lists and memory
allocation
Note that this patch also provide an extra optimization, that the previous
code in 5.0 did not provide: expressions are flattened in the Item tree,
based on what the expression already parsed is, and not based on the order
in which rules are reduced.
For example : "(a OR b) OR c", "a OR (b OR c)" would both be represented
with 2 Item_cond_or nodes before this patch, and with 1 node only with this
patch. The logic used is based on the mathematical properties of the OR
operator (it's associative), and produces a simpler tree.
sql/item_cmpfunc.h:
Improved performances for parsing boolean expressions
sql/sql_yacc.yy:
Improved performances for parsing boolean expressions
mysql-test/r/parser_precedence.result:
Added test cases to cover boolean operator precedence
mysql-test/t/parser_precedence.test:
Added test cases to cover boolean operator precedence
Killing a SELECT query with KILL QUERY or KILL CONNECTION
causes a server crash if the query cache is enabled.
Normal evaluation of a query may be interrupted by the
KILL QUERY/CONNECTION statement, in this case the mysql_execute_command
function returns TRUE, and the thd->killed flag has true value.
In this case the result of the query may
be cached incompletely (omitting call to query_cache_insert inside
the net_real_write function), and next call to query_cache_end_of_result
may lead to server crash.
Thus, the query_cache_end_of_result function has been modified to abort
query cache in the case of killed thread.
sql/sql_cache.cc:
Fixed bug #30201.
The query_cache_end_of_result function has been modified to abort query
cache in the case of query execution failure. Also this function has been
modified to remove incomplete query block.
into adventure.(none):/home/thek/Development/cpp/mysql-5.0-runtime
mysql-test/r/query_cache.result:
Auto merged
mysql-test/t/query_cache.test:
Auto merged
Although the query cache doesn't support retrieval of statements containing
column level access control, it was still possible to cache such statements
thus wasting memory.
This patch extends the access control check on the target tables to avoid
caching a statement with column level restrictions.
Views are excepted and can be cached but only retrieved by super user account.
mysql-test/t/query_cache_with_views.test:
Rename: mysql-test/t/view_query_cache.test -> mysql-test/t/query_cache_with_views.test
mysql-test/r/query_cache_with_views.result:
Rename: mysql-test/r/view_query_cache.result -> mysql-test/r/query_cache_with_views.result
mysql-test/r/query_cache.result:
Modified test case to allow caching of views
mysql-test/t/query_cache.test:
Modified test case to allow caching of views
sql/sql_cache.cc:
Allow caching of views
The server created temporary tables for filesort in the working directory
instead of the specified tmpdir directory.
sql/item.cc:
Fixed bug #30287.
The Item_field::set_field method has been modified to reset the any_privileges
flag to false in case of system temporary table. This modification prevents the
server from unnecessary checking of user privileges to access system temporary
tables.
sql/sql_select.cc:
Fixed bug #30287.
Bugfix for #29015 has been removed: TABLE_SHARE::table_name of system
temporary tables contains full path to table file basename again.
sql/sql_view.cc:
Fixed bug #30287.
Commentary has been added.
Use "SHOW TABLES FROM `db`" instead of $dbh->tables() in the
get_list_of_tables() routine.
The symptom is that, when used with recent versions of DBD::mysql,
mysqlhotcopy uses a double-qualified table name, for example:
Invalid db.table name 'test.test`.`x' at /usr/bin/mysqlhotcopy line 855.
This is caused by a change in DBD::mysql. See this diff:
http://svn.perl.org/viewcvs/modules/DBD-mysql/trunk/lib/DBD/mysql.pm?r1=9183&r2=9188
Basically, older DBD::mysql implemented a limited ->table_info method;
now the full method is implemented, and as a result DBI's ->tables()
method has access to the schema value, so it uses it.
scripts/mysqlhotcopy.sh:
Use "SHOW TABLES FROM `db`" instead of $dbh->tables() in
get_list_of_tables(). DBI's ->tables() method calls
"SHOW TABLES" under the hood, and then quotes the
names and (depending on DBD::mysql version) adds the schema
name, too. mysqlhotcopy doesn't want the schema name
or the quotes, so it's all around better to just call
"SHOW TABLES" itself.
added SUPER_ACL check for I_S.TRIGGERS
mysql-test/r/information_schema.result:
result fix
mysql-test/r/information_schema_db.result:
result fix
mysql-test/t/information_schema.test:
test case
sql/sql_show.cc:
added SUPER_ACL check for I_S.TRIGGERS
into adventure.(none):/home/thek/Development/cpp/mysql-5.0-runtime
mysql-test/r/query_cache.result:
Auto merged
mysql-test/t/query_cache.test:
Auto merged
Although the query cache doesn't support retrieval of statements containing
column level access control, it was still possible to cache such statements
thus wasting memory.
This patch extends the access control check on the target tables to avoid
caching a statement with column level restrictions.
mysql-test/r/query_cache.result:
Added test
mysql-test/t/query_cache.test:
Added test
sql/sql_cache.cc:
The function check_table_access leaves the artifact
grant.want_privileges= 1, if a statement refers to tables with column level
privileges. To avoid the statement from being stored into the query cache,
it is enough to check this flag and set 'safe_to_cache_query' to zero.
sql/sql_cache.h:
- Removed 'static' attribute or class methods
- Added THD parameter to process_and_count_tables
This is a follow up for the patch for Bug#26162 "Trigger DML ignores low_priority_updates setting", where the stored procedure ignores the session setting of low_priority_updates.
For every table open operation with default write (TL_WRITE_DEFAULT) lock_type, downgrade the lock type to the session setting of low_priority_updates.
sql/lock.cc:
Add late lock_type assertion.
sql/sql_base.cc:
Possibly downgrade lock type to the the session setting of low_priority_updates and also remove early assertion.
include/my_pthread.h:
Fix for Bug#27970 "Fix for bug 24507 makes mysql_install_db fail".
Removed macro NPTL_PTHREAD_EXIT_BUG, because it doesn't work in dynamic
environment. One can switch between NPTL and LT on the fly on Linux.
Added pthread_dummy(ESRCH) for those platforms that don't have pthread_kill.
This ensures that there won't be an error in mysqld.cc where the return value
is being checked from the function call.
mysys/my_thr_init.c:
Check for a Linux is enough. There is an additional test if
NPTL is in use before spwaning the extra thread.
This patch provides compile helper scripts only,
no server logic is affected.
Before this patch, GCOV and GPROF build scripts were only provided for
pentium platforms.
With this patch, pentium, pentium64 and amd64 platforms have associated
helper build scripts.
The GCOV and GPROF specific compilation flags are set once in SETUP.sh,
to avoid code duplication.
BUILD/SETUP.sh:
Moved GCOV and GPROF flags to compile-pentium-{gcov,gprof) to SETUP.sh
BUILD/compile-pentium-gcov:
Moved GCOV and GPROF flags to compile-pentium-{gcov,gprof) to SETUP.sh
BUILD/compile-pentium-gprof:
Moved GCOV and GPROF flags to compile-pentium-{gcov,gprof) to SETUP.sh
BUILD/compile-amd64-gcov:
Added helper scripts for GCOV and GPROF builds.
BUILD/compile-amd64-gprof:
Added helper scripts for GCOV and GPROF builds.
BUILD/compile-pentium64-gcov:
Added helper scripts for GCOV and GPROF builds.
BUILD/compile-pentium64-gprof:
Added helper scripts for GCOV and GPROF builds.
Apply innodb-5.0-ss1696 snapshot
Fixes:
- Bug#20090: InnoDB: Error: trying to declare trx to enter InnoDB
- Bug#23710: crash_commit_before fails if innodb_file_per_table=1
At InnoDB startup consider the case where log scan went beyond
checkpoint_lsn as a crash and initiate crash recovery code path.
- Bug#28781: InnoDB increments auto-increment value incorrectly with ON DUPLICATE KEY UPDATE
We need to do some special AUTOINC handling for the following case:
INSERT INTO t (c1,c2) VALUES(x,y) ON DUPLICATE KEY UPDATE ...
We need to use the AUTOINC counter that was actually used by
MySQL in the UPDATE statement, which can be different from the
value used in the INSERT statement.
- Bug#29097: fsp_get_available_space_in_free_extents() is capped at 4TB
Fix by typecasting the variables before multiplying them, so that the
result of the multiplication is of type "unsigned long long".
- Bug#29155: Innodb "Parallel recovery" is not prevented
Fix by enabling file locking on FreeBSD. It has been disabled because
InnoDB has refused to start on FreeBSD & LinuxThreads, but now it
starts just fine.
innobase/fsp/fsp0fsp.c:
Apply innodb-5.0-ss1696 snapshot
Revision r1614:
branches/5.0:
Merge r1605 from trunk:
Fix Bug#29097 "fsp_get_available_space_in_free_extents() is capped at 4TB"
by typecasting the variables before multiplying them, so that the result of
the multiplication is of type "unsigned long long".
I verified this fix by creating a sparse file of 6TB and forcing InnoDB to
use it without overwriting it with zeroes (by commenting the code that
overwrites :newraw files).
New type ullint is introduced with the sole purpose of shortening
"unsigned long long", please do not define it to something else than
"unsigned long long".
Approved by: Heikki
innobase/include/fsp0fsp.h:
Apply innodb-5.0-ss1696 snapshot
Revision r1614:
branches/5.0:
Merge r1605 from trunk:
Fix Bug#29097 "fsp_get_available_space_in_free_extents() is capped at 4TB"
by typecasting the variables before multiplying them, so that the result of
the multiplication is of type "unsigned long long".
I verified this fix by creating a sparse file of 6TB and forcing InnoDB to
use it without overwriting it with zeroes (by commenting the code that
overwrites :newraw files).
New type ullint is introduced with the sole purpose of shortening
"unsigned long long", please do not define it to something else than
"unsigned long long".
Approved by: Heikki
innobase/include/univ.i:
Apply innodb-5.0-ss1696 snapshot
Revision r1614:
branches/5.0:
Merge r1605 from trunk:
Fix Bug#29097 "fsp_get_available_space_in_free_extents() is capped at 4TB"
by typecasting the variables before multiplying them, so that the result of
the multiplication is of type "unsigned long long".
I verified this fix by creating a sparse file of 6TB and forcing InnoDB to
use it without overwriting it with zeroes (by commenting the code that
overwrites :newraw files).
New type ullint is introduced with the sole purpose of shortening
"unsigned long long", please do not define it to something else than
"unsigned long long".
Approved by: Heikki
innobase/log/log0recv.c:
Apply innodb-5.0-ss1696 snapshot
Revision r1608:
branches/5.0: Bug#23710
Back port of r1607 from trunk
At InnoDB startup consider the case where log scan went beyond checkpoint_lsn as a crash and initiate crash recovery code path.
reviewed by: Heikki
innobase/os/os0file.c:
Apply innodb-5.0-ss1696 snapshot
Revision r1615:
branches/5.0:
Merge r1613 from trunk:
Fix Bug#29155 by enabling file locking on FreeBSD.
It has been disabled because InnoDB has refused to start on
FreeBSD & LinuxThreads, but now it starts just fine.
Approved by: Heikki
innobase/srv/srv0srv.c:
Apply innodb-5.0-ss1696 snapshot
Revision r1552:
branches/5.0:
Fix Bug#20090 as suggested in the bug followup by Heikki.
Approved by: Heikki
innobase/trx/trx0trx.c:
Apply innodb-5.0-ss1696 snapshot
Revision r1596:
branches/5.0: Merge r1595 from trunk:
trx_commit_for_mysql(): Avoid acquiring and releasing kernel_mutex when
trx->sess or trx_dummy_sess is non-NULL.
sql/ha_innodb.cc:
Apply innodb-5.0-ss1696 snapshot
Revision r1614:
branches/5.0:
Merge r1605 from trunk:
Fix Bug#29097 "fsp_get_available_space_in_free_extents() is capped at 4TB"
by typecasting the variables before multiplying them, so that the result of
the multiplication is of type "unsigned long long".
I verified this fix by creating a sparse file of 6TB and forcing InnoDB to
use it without overwriting it with zeroes (by commenting the code that
overwrites :newraw files).
New type ullint is introduced with the sole purpose of shortening
"unsigned long long", please do not define it to something else than
"unsigned long long".
Approved by: Heikki
Revision r1695:
branches/5.0: Merge a change from MySQL AB:
ChangeSet@1.2463.166.1 2007-06-20 19:22:27+03:00 monty@mysql.fi
Allow multiple calls to mysql_server_end()
(Part of fix for Bug 25621 Error in my_thread_global_end(): 1 threads
didn't exit)
Give correct error message if InnoDB table is not found
(This allows us to drop a an innodb table that is not in the InnoDB registery)
ha_innodb.cc:
Give correct error message if InnoDB table is not found.
(This allows us to drop a an innodb table that is not in the InnoDB
registery)
Revision r1606:
branches/5.0: Formatting corrections.
spotted by: Vasil
Revision r1691:
branches/5.0: Merge a change from MySQL AB:
ChangeSet@1.2463.261.1 2007-07-20 14:17:15+03:00 gkodinov@magare.gmz
Bug 29644: alter table hangs if records locked in share mode
by long running transaction
On Windows opened files can't be deleted. There was a special
upgraded lock mode (TL_WRITE instead of TL_WRITE_ALLOW_READ)
in ALTER TABLE to make sure nobody has the table opened
when deleting the old table in ALTER TABLE. This special mode
was causing ALTER TABLE to hang waiting on a lock inside InnoDB.
This special lock is no longer necessary as the server is
closing the tables it needs to delete in ALTER TABLE.
Fixed by removing the special lock.
Note that this also reverses the fix for bug 17264 that deals with
another consequence of this special lock mode being used.
sql/ha_innodb.cc: Bug 29644: reverse the (now excessive) fix
for bug 17264 (but leave the test case).
Revision r1601:
branches/5.0: Fix for bug#28781
We need to do some special AUTOINC handling for the following case:
INSERT INTO t (c1,c2) VALUES(x,y) ON DUPLICATE KEY UPDATE ...
We need to use the AUTOINC counter that was actually used by
MySQL in the UPDATE statement, which can be different from the
value used in the INSERT statement.
approved by: Sunny
Revision r1692:
branches/5.0: Merge a change from MySQL AB:
ChangeSet@1.2463.267.1 2007-07-30 17:14:34+04:00 evgen@local
Bug 24989: The DEADLOCK error is improperly handled by InnoDB.
When innodb detects a deadlock it calls ha_rollback_trans() to rollback the
main transaction. But such action isn't allowed from inside of triggers and
functions. When it happen the 'Explicit or implicit commit' error is thrown
even if there is no commit/rollback statements in the trigger/function. This
leads to the user confusion.
Now the convert_error_code_to_mysql() function doesn't call the
ha_rollback_trans() function directly but rather calls the
mark_transaction_to_rollback function and returns an error.
The sp_rcontext::find_handler() now doesn't allow errors to be caught by the
trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag
is set. Procedures are still allowed to catch such errors.
The sp_rcontext::find_handler function now accepts a THD handle as a parameter.
The transaction_rollback_request and the is_fatal_sub_stmt_error flags are
added to the THD class. The are initialized by the THD class constructor.
Now the ha_autocommit_or_rollback function rolls back main transaction
when not in a sub statement and the thd->transaction_rollback_request
is set.
The THD::restore_sub_statement_state function now resets the
thd->is_fatal_sub_stmt_error flag on exit from a sub-statement.
innodb-big.test, innodb-big.result:
Added a test case for the bug 24989: The DEADLOCK error is improperly
handled by InnoDB.
sql/ha_innodb.cc:
Bug 24989: The DEADLOCK error is improperly handled by InnoDB.
Now the convert_error_code_to_mysql() function doesn't call the
ha_rollback_trans() function directly but rather calls the
mark_transaction_to_rollback function and returns an error.
Revision r1693:
branches/5.0: Merge a change from MySQL AB:
ChangeSet@1.2489.5.1 2007-07-31 17:42:48+04:00 evgen@local
ha_innodb.cc:
Warning fixed.