- 22 Aug, 2007 1 commit
-
-
unknown authored
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
-
- 06 Aug, 2007 2 commits
-
-
unknown authored
into bodhi.(none):/opt/local/work/mysql-5.0-runtime
-
unknown authored
VIEW". mysql_list_fields() C API function would incorrectly set MYSQL_FIELD::decimals member for some view columns. The problem was in an incomplete implementation of Item_ident_for_show::make_field(), which is responsible for view columns metadata. sql/item.cc: A fix for Bug#29306 -- properly initialize decimals in Item_ident_for_show::make_field tests/mysql_client_test.c: Add a test case forBug#29306. Fix warnings.
-
- 05 Aug, 2007 1 commit
-
-
unknown authored
statement being KILLed". When statement which was trying to obtain write lock on then table and which was blocked by existing read lock was killed, concurrent statements that were trying to obtain read locks on the same table and that were blocked by the presence of this pending write lock were not woken up and had to wait until this first read lock goes away. This problem was caused by the fact that we forgot to wake up threads which pending requests could have been satisfied after removing lock request for the killed thread. The patch solves the problem by waking up those threads in such situation. Test for this bug will be added to 5.1 only as it has much better facilities for its implementation. Particularly, by using I_S.PROCESSLIST and wait_condition.inc script we can wait until thread will be blocked on certain table lock without relying on unconditional sleep (which usage increases time needed for test runs and might cause spurious test failures on slower platforms). mysys/thr_lock.c: After removing lock request from the list of waiting lock requests (e.g. when we discover that current thread was killed) we should wake up other threads waiting for the same lock which pending requests now can be satisfied. To implement this behavior we move code responsible for waking up threads which pending requests can be satisfied from thr_unlock() to new wake_up_waiters() procedure and use it in wait_for_lock() and hr_abort_locks_for_thread().
-
- 01 Aug, 2007 2 commits
-
-
unknown authored
error 1159 ' ' (fixed by the patch for Bug 25679) mysql-test/r/federated.result: Update results (Bug#18287) mysql-test/t/federated.test: Add a test case for Bug#18287 create federated table always times out, error 1159 ' '
-
unknown authored
mysql-test/r/func_time.result: Update results (use fixed datetime values instead of NOW()). mysql-test/t/func_time.test: Use fixed datetime values instead of NOW(): the test would have a sporadic failure when current day changed between two consequtive calls to NOW(). The test actually tests FROM_DAYS/TO_DAYS functions, so use of NOW() is not necessary.
-
- 31 Jul, 2007 1 commit
-
-
unknown authored
into bodhi.(none):/opt/local/work/mysql-5.0-runtime client/mysqldump.c: Auto merged mysql-test/r/mysqldump.result: Auto merged sql/sql_base.cc: Auto merged sql/table.cc: Auto merged mysql-test/r/innodb_mysql.result: Manual merge. mysql-test/t/innodb_mysql.test: Manual merge. sql/sql_table.cc: Manual merge.
-
- 30 Jul, 2007 1 commit
-
-
unknown authored
sql/handler.h: Fix a warning.
-
- 29 Jul, 2007 1 commit
-
-
unknown authored
- Removed unused variable. sql/sql_lex.cc: - Removed unused variable
-
- 27 Jul, 2007 5 commits
-
-
unknown authored
into adventure.(none):/home/thek/Development/cpp/mysql-5.0-runtime
-
unknown authored
When a table was explicitly locked with LOCK TABLES no associated tables from any related trigger on the subject table were locked. As a result of this the user could experience unexpected locking behavior and statement failures similar to "failed: 1100: Table'xx' was not locked with LOCK TABLES". This patch fixes this problem by making sure triggers are pre-loaded on any statement if the subject table was explicitly locked with LOCK TABLES. mysql-test/r/sp-prelocking.result: Added test case mysql-test/t/sp-prelocking.test: Added test case sql/sql_lex.cc: - Moved some conditional logic out of the table iteration. - Added event map values for LOCK TABLE command. sql/table.cc: - Refactored set_trg_event_tpye into the two simpler functions set_trg_event_map and set_trg_event_map as methods for manipulating the table event map. The original function was only called from st_lex::set_trg_event_type_for_tables so it was possible to move the event map creation logic to this function as a loop optimization. sql/table.h: - Refactored set_trg_event_tpye into the two simpler functions set_trg_event_map and set_trg_event_map as methods for manipulating the table event map. The original function was only called from st_lex::set_trg_event_type_for_tables so it was possible to move the event map creation logic to this function as a loop optimization.
-
unknown authored
between perm and temp tables. Review fixes. The original bug report complains that if we locked a temporary table with LOCK TABLES statement, we would not leave LOCK TABLES mode when this temporary table is dropped. Additionally, the bug was escalated when it was discovered than when a temporary transactional table that was previously locked with LOCK TABLES statement was dropped, futher actions with this table, such as UNLOCK TABLES, would lead to a crash. The problem originates from incomplete support of transactional temporary tables. When we added calls to handler::store_lock()/handler::external_lock() to operations that work with such tables, we only covered the normal server code flow and did not cover LOCK TABLES mode. In LOCK TABLES mode, ::external_lock(LOCK) would sometimes be called without matching ::external_lock(UNLOCK), e.g. when a transactional temporary table was dropped. Additionally, this table would be left in the list of LOCKed TABLES. The patch aims to address this inadequacy. Now, whenever an instance of 'handler' is destroyed, we assert that it was priorly external_lock(UNLOCK)-ed. All the places that violate this assert were fixed. This patch introduces no changes in behavior -- the discrepancy in behavior will be fixed when we start calling ::store_lock()/::external_lock() for all tables, regardless whether they are transactional or not, temporary or not. mysql-test/r/innodb_mysql.result: Update test results (Bug#24918) mysql-test/t/innodb_mysql.test: Add a test case for Bug#24918 sql/handler.h: Make handler::external_lock() a protected method. Backport from 5.1 its public wrapper handler::ha_external_lock(). Assert that the handler is not closed if it is still locked. sql/lock.cc: In mysql_lock_tables only call lock_external() for the list of tables that we called store_lock() for. E.g. get_lock_data() does not add non-transactional temporary tables to the lock list, so lock_external() should not be called for them. Use handler::ha_external_lock() instead of handler::external_lock(). Add comments for mysql_lock_remove(), parameterize one strange side effect that it has. At least in one place where mysql_lock_remove is used, this side effect is not desired (DROP TABLE). The parameter will be dropped in 5.1, along with the side effect. sql/mysql_priv.h: Update declaration of mysql_lock_remove(). sql/opt_range.cc: Deploy handler::ha_external_lock() instead of handler::external_lock() sql/sql_base.cc: When closing a temporary table, remove the table from the list of LOCKed TABLES of this thread, in case it's there. It's there if it is a transactional temporary table. Use a new declaration of mysql_lock_remove(). sql/sql_class.h: Extend the comment for THD::temporary_tables. sql/sql_table.cc: Deploy handler::ha_external_lock() instead of handler::external_lock()
-
unknown authored
into mysql.com:/home/svoj/devel/mysql/BUG29957/mysql-5.0-engines
-
unknown authored
INSERT/DELETE/UPDATE followed by ALTER TABLE within LOCK TABLES may cause table corruption on Windows. That happens because ALTER TABLE writes outdated shared state info into index file. Fixed by removing obsolete workaround. Affects MyISAM tables on Windows only. myisam/mi_extra.c: On windows when mi_extra(HA_EXTRA_PREPARE_FOR_DELETE) is called, we release external lock and close index file. If we're in LOCK TABLES, MyISAM state info doesn't get updated until UNLOCK TABLES. That means when we release external lock and we're in LOCK TABLES, we may write outdated state info. As SQL layer closes all table instances, we do not need this workaround anymore. mysql-test/r/alter_table.result: A test case for BUG#29957. mysql-test/t/alter_table.test: A test case for BUG#29957.
-
- 26 Jul, 2007 2 commits
- 25 Jul, 2007 6 commits
-
-
unknown authored
into gleb.loc:/home/uchum/work/bk/5.0-opt mysql-test/t/create.test: Auto merged sql/field.cc: Auto merged sql/sql_base.cc: Auto merged sql/table.cc: Auto merged mysql-test/r/create.result: Merge with 5.0 (main).
-
unknown authored
"Federated Denial of Service" Federated storage engine used to attempt to open connections within the ::create() and ::open() methods which are invoked while LOCK_open mutex is being held by mysqld. As a result, no other client sessions can open tables while Federated is attempting to open a connection. Long DNS lookup times would stall mysqld's operation and a rogue connection string which connects to a remote server which simply stalls during handshake can stall mysqld for a much longer period of time. This patch moves the opening of the connection much later, when the federated actually issues queries, by which time the LOCK_open mutex is no longer being held. mysql-test/r/federated.result: change of test/results due to patch for bug25679 mysql-test/t/federated.test: change of test/results due to patch for bug25679 sql/ha_federated.cc: bug25679 remove function check_foreign_fata_source() ha_federated::open() no longer opens the federated connection. ha_federated::create() no longer opens and tests connection. ha_federated::real_connect() opens connection and tests presence of table. ha_federated::real_query() sends query, calling real_connect() if neccessary. sql/ha_federated.h: bug25679 new methods real_query() and real_connect()
-
unknown authored
into gleb.loc:/home/uchum/work/bk/5.0-opt
-
unknown authored
binary SHOW CREATE TABLE or SELECT FROM I_S. The problem is that mysqldump generates incorrect dump for a table with non-ASCII column name if the mysqldump's character set is ASCII. The fix is to: 1. Switch character_set_client for the mysqldump's connection to binary before issuing SHOW CREATE TABLE statement in order to avoid conversion. 2. Dump switch character_set_client statements to UTF8 and back for CREATE TABLE statement. client/mysqldump.c: 1. Switch character_set_client for the mysqldump's connection to binary before issuing SHOW CREATE TABLE statement in order to avoid conversion. 2. Dump switch character_set_client statements to UTF8 and back for CREATE TABLE statement. mysql-test/r/mysqldump-max.result: Update result file. mysql-test/r/mysqldump.result: Update result file. mysql-test/r/openssl_1.result: Update result file. mysql-test/r/show_check.result: Update result file. mysql-test/t/show_check.test: Test case: - create a table with non-ASCII column name; - dump the database by mysqldump using ASCII character set; - drop the database; - load the dump; - check that the table has been re-created properly.
-
unknown authored
This allows 5.0 to work with 5.1 databases.
-
unknown authored
into weblab.(none):/home/marcsql/TREE/mysql-5.0-29959
-
- 24 Jul, 2007 6 commits
-
-
unknown authored
into bodhi.(none):/opt/local/work/mysql-5.0-runtime
-
unknown authored
--- fix compile on Windows for bug25714.c tests/bug25714.c: fix compile on Windows
-
unknown authored
-
unknown authored
When the SQL_BIG_RESULT flag is specified SELECT should store items from the select list in the filesort data and use them when sending to a client. The get_addon_fields function is responsible for creating necessary structures for that. But this function was allowed to do so only for SELECT and INSERT .. SELECT queries. This makes the SQL_BIG_RESULT useless for the CREATE .. SELECT queries. Now the get_addon_fields allows storing select list items in the filesort data for the CREATE .. SELECT queries. mysql-test/t/create.test: Added a test case for the bug#15130: CREATE .. SELECT was denied to use advantages of the SQL_BIG_RESULT. mysql-test/r/create.result: Added a test case for the bug#15130: CREATE .. SELECT was denied to use advantages of the SQL_BIG_RESULT. sql/filesort.cc: Bug#15130: CREATE .. SELECT was denied to use advantages of the SQL_BIG_RESULT. Now the get_addon_fields allows storing select list items in the filesort data for the CREATE .. SELECT queries.
-
unknown authored
into xiphis.org:/anubis/antony/work/p2-bug25714.1.merge-5.0
-
unknown authored
"getGeneratedKeys() does not work with FEDERATED table" mysql_insert() expected the storage engine to update the row data during the write_row() operation with the value of the new auto- increment field. The field must be updated when only one row has been inserted as mysql_insert() would ignore the thd->last_insert. This patch implements HA_STATUS_AUTO support in ha_federated::info() and ensures that ha_federated::write_row() does update the row's auto-increment value. The test case was written in C as the protocol's 'id' value is accessible through libmysqlclient and not via SQL statements. mysql-test-run.pl was extended to enable running the test binary. mysql-test/mysql-test-run.pl: bug25714 implement support to run C test for bug25714 sql/ha_federated.cc: bug25714 The storage engine instance property auto_increment_value was not being set. mysql_insert() requires that the storage engine updates the row with the auto-increment value, especially when only inserting one row. Implement support for ha_federated::info(HA_STATUS_AUTO) tests/Makefile.am: bug25714 build C test for bug mysql-test/include/have_bug25714.inc: New BitKeeper file ``mysql-test/include/have_bug25714.inc'' mysql-test/r/federated_bug_25714.result: New BitKeeper file ``mysql-test/r/federated_bug_25714.result'' mysql-test/r/have_bug25714.require: New BitKeeper file ``mysql-test/r/have_bug25714.require'' mysql-test/t/federated_bug_25714.test: New BitKeeper file ``mysql-test/t/federated_bug_25714.test'' tests/bug25714.c: New BitKeeper file ``tests/bug25714.c''
-
- 23 Jul, 2007 5 commits
-
-
unknown authored
In sql/sql_yacc.yy, use the %prec construct at the end of rule join_table sql/sql_yacc.yy: In sql/sql_yacc.yy, use the %prec construct at the end of rule join_table
-
unknown authored
into magare.gmz:/home/kgeorge/mysql/autopush/B29644-5.0-opt sql/ha_innodb.cc: Auto merged sql/sql_base.cc: Auto merged mysql-test/r/innodb_mysql.result: 5.0-opt merge mysql-test/t/innodb_mysql.test: 5.0-opt merge
-
unknown authored
into olga.mysql.com:/home/igor/mysql-5.0-opt
-
unknown authored
Limit the fix for bug 28591 to InnoDB only sql/sql_select.cc: Limit the fix for bug 28591 to InnoDB only sql/table.cc: Limit the fix for bug 28591 to InnoDB only
-
unknown authored
If a primary key is defined over column c of enum type then the EXPLAIN command for a look-up query of the form SELECT * FROM t WHERE c=0 said that the query was with an impossible where condition though the query correctly returned non-empty result set when the table indeed contained rows with error empty strings for column c. This kind of misbehavior was due to a bug in the function Field_enum::store(longlong,bool) that erroneously returned 1 if the the value to be stored was equal to 0. Note that the method Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) correctly returned 0 if a value of the error empty string was stored. mysql-test/r/type_enum.result: Added a test case for bug #29661. mysql-test/t/type_enum.test: Added a test case for bug #29661. sql/field.cc: Fixed bug #29611. If a primary key was defined over column c of enum type then the EXPLAIN command for a look-up query of the form SELECT * FROM t WHERE c=0 said that the query was with an impossible where condition though the query correctly returned non-empty result set when the table indeed contained rows with error empty strings for column c. This kind of misbehavior was due to a bug in the function Field_enum::store(longlong,bool) that erroneously returned 1 if the the value to be stored was equal to 0. Note that the method Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) correctly returned 0 if a value of the error empty string was stored.
-
- 22 Jul, 2007 5 commits
-
-
unknown authored
into chilla.local:/home/mydev/mysql-5.0-axmrg sql/sql_table.cc: Auto merged
-
unknown authored
into magare.gmz:/home/kgeorge/mysql/autopush/B28951-5.0-opt mysql-test/t/innodb_mysql.test: Auto merged sql/sql_select.cc: Auto merged sql/table.cc: Auto merged mysql-test/r/innodb_mysql.result: merge of 5.0-opt
-
unknown authored
into mysql.com:/home/hf/work/29494/my41-29494
-
unknown authored
into mysql.com:/home/hf/work/29494/my50-29494
-
unknown authored
into mysql.com:/home/hf/work/29494/my50-29494 sql-common/client.c: Auto merged
-
- 21 Jul, 2007 2 commits