Bug#4968 "Stored procedure crash if cursor opened on altered table"
Bug#19733 "Repeated alter, or repeated create/drop, fails"
Bug#19182 "CREATE TABLE bar (m INT) SELECT n FROM foo; doesn't work from
stored procedure."
Bug#6895 "Prepared Statements: ALTER TABLE DROP COLUMN does nothing"
Bug#22060 "ALTER TABLE x AUTO_INCREMENT=y in SP crashes server"
Test cases for bugs 4968, 19733, 6895 will be added in 5.0.
Re-execution of CREATE DATABASE, CREATE TABLE and ALTER TABLE
statements in stored routines or as prepared statements caused
incorrect results (and crashes in versions prior to 5.0.25).
In 5.1 the problem occured only for CREATE DATABASE, CREATE TABLE
SELECT and CREATE TABLE with INDEX/DATA DIRECTOY options).
The problem of bugs 4968, 19733, 19282 and 6895 was that functions
mysql_prepare_table, mysql_create_table and mysql_alter_table were not
re-execution friendly: during their operation they used to modify contents
of LEX (members create_info, alter_info, key_list, create_list),
thus making the LEX unusable for the next execution.
In particular, these functions removed processed columns and keys from
create_list, key_list and drop_list. Search the code in sql_table.cc
for drop_it.remove() and similar patterns to find evidence.
The fix is to supply to these functions a usable copy of each of the
above structures at every re-execution of an SQL statement.
To simplify memory management, LEX::key_list and LEX::create_list
were added to LEX::alter_info, a fresh copy of which is created for
every execution.
The problem of crashing bug 22060 stemmed from the fact that the above
metnioned functions were not only modifying HA_CREATE_INFO structure in
LEX, but also were changing it to point to areas in volatile memory of
the execution memory root.
The patch solves this problem by creating and using an on-stack
copy of HA_CREATE_INFO (note that code in 5.1 already creates and
uses a copy of this structure in mysql_create_table()/alter_table(),
but this approach didn't work well for CREATE TABLE SELECT statement).
mysql-test/r/ps.result:
Update test results (Bug#19182, Bug#22060)
mysql-test/t/ps.test:
Add a test case for Bug#19182, Bug#22060 (4.1-only parts)
sql/mysql_priv.h:
LEX::key_list and LEX::create_list were moved to LEX::alter_info.
Update declarations to use LEX::alter_info instead of these two
members.
sql/sql_class.h:
Replace pair<columns, keys> with an instance of Alter_info in
select_create constructor. We create a new copy of Alter_info
each time we re-execute SELECT .. CREATE prepared statement.
sql/sql_insert.cc:
Adjust to a new signature of create_table_from_items.
sql/sql_lex.cc:
Implement Alter_info::Alter_info that would make a "deep" copy
of all definition lists (keys, columns).
sql/sql_lex.h:
Move key_list and create_list to class Alter_info. Implement
Alter_info::Alter_info that can be used with PS and SP.
sql/sql_list.h:
Implement a copy constructor of class List that makes a deep copy
of all list nodes.
sql/sql_parse.cc:
Adjust to new signatures of mysql_create_table, mysql_alter_table,
select_create. Functions mysql_create_index and mysql_drop_index has
become identical after initialization of alter_info was moved to the
parser, and were merged. Flag enable_slow_log was not updated for
SQLCOM_DROP_INDEX, which is a bug. Just like CREATE INDEX, DROP INDEX
is currently done via complete table rebuild and is rightfully a slow
administrative statement.
sql/sql_show.cc:
Adjust mysqld_show_create_db to a new signature.
sql/sql_table.cc:
Adjust mysql_alter_table, mysql_recreate_table, mysql_create_table,
mysql_prepare_table to new signatures.
sql/sql_yacc.yy:
LEX::key_list and LEX::create_list moved to class Alter_info
- if there are two character set definitions in the column declaration,
we replace the first one with the second one as we store both in the LEX->charset
slot. Add a separate slot to the LEX structure to store underscore charset.
- convert default values to the column charset of STRING, VARSTRING fields
if necessary as well.
mysql-test/r/ctype_recoding.result:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- test result.
mysql-test/t/ctype_recoding.test:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- test case.
sql/sql_lex.cc:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- LEX->underscore_charset introduced to store UNDERSCORE_CHARSET
sql/sql_lex.h:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- LEX->underscore_charset introduced to store UNDERSCORE_CHARSET
sql/sql_table.cc:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- convert default values to the column charset of VARSTRING, STRING, ENUM,
SET fields if necessary.
sql/sql_yacc.yy:
Fix for bug #20695: Charset introducer overrides charset definition for column.
- LEX->underscore_charset introduced to store UNDERSCORE_CHARSET
dropping/creating tables".
The bug could lead to a crash when multi-delete statements were
prepared and used with temporary tables.
The bug was caused by lack of clean-up of multi-delete tables before
re-execution of a prepared statement. In a statement like
DELETE t1 FROM t1, t2 WHERE ... the first table list (t1) is
moved to lex->auxilliary_table_list and excluded from lex->query_tables
or select_lex->tables. Thus it was unaccessible to reinit_stmt_before_use
and not cleaned up before re-execution of a prepared statement.
mysql-test/r/ps.result:
Updated test results (Bug#19399)
mysql-test/t/ps.test:
A test case for Bug#19399 "Stored Procedures 'Lost Connection' when
dropping/creating tables": test that multi-delete
tables are cleaned up properly before re-execution.
sql/sql_lex.cc:
Always initialize auxilliary_table_list when we initialize the lex:
this way we don't have to check that lex->sql_command equals to
SQLCOM_DELETE_MULTI whenever we need to access auxilliary_table_list.
In particular, in reinit_stmt_before_use we can simply check that
auxilliary_table_list is not NULL and clean it up if the check returns
a true value.
sql/sql_prepare.cc:
Move the one table clean-up functionality to a method of st_table_list.
Clean up auxiliary_table_list if it's not empty.
sql/table.cc:
Implement st_table_list::reinit_before_use().
sql/table.h:
Declare st_table_list::reinit_before_use().
revert the fix for bug#8303
correct the test for bug#8378
mysql-test/r/ctype_sjis.result:
updated
mysql-test/t/ctype_sjis.test:
updated
sql/sql_lex.cc:
revert the fix for bug#8303
tests/mysql_client_test.c:
correct the test for bug#8378
A query with a group by and having clauses could return a wrong
result set if the having condition contained a constant conjunct
evaluated to FALSE.
It happened because the pushdown condition for table with
grouping columns lost its constant conjuncts.
Pushdown conditions are always built by the function make_cond_for_table
that ignores constant conjuncts. This is apparently not correct when
constant false conjuncts are present.
mysql-test/r/having.result:
Added a test case for bug #14927.
mysql-test/t/having.test:
Added a test case for bug #14927.
sql/sql_lex.cc:
Fixed bug #14927.
Initialized fields for having conditions in st_select_lex::init_query().
sql/sql_lex.h:
Fixed bug #14927.
Added a field to restore having condititions for execution in SP and PS.
sql/sql_prepare.cc:
Fixed bug #14927.
Added code to restore havinf conditions for execution in SP and PS.
sql/sql_select.cc:
Fixed bug #14927.
Performed evaluation of constant expressions in having clauses.
If the having condition contains a constant conjunct that is always false
an empty result set is returned after the optimization phase.
In this case the corresponding EXPLAIN command now returns
"Impossible HAVING" in the last column.
When fixing Item_func_plus in ORDER BY clause field c is searched in all
opened tables, but because c is an alias it wasn't found there.
This patch adds a flag to select_lex which allows Item_field::fix_fields()
to look up in select's item_list to find aliased fields.
sql/item.cc:
Fix bug#7672 Unknown column error in order clause
When fixing fields in ORDER BY clause allow Item_field::fix_fields() to look up items in select's item list to find aliased fields.
sql/sql_lex.cc:
Fix bug#7672 Unknown column error in order clause
sql/sql_lex.h:
Fix bug#7672 Unknown column error in order clause
Added flag to select_lex allowing Item_field::fix_fields to look up items in select's item list.
sql/sql_select.cc:
Fix bug#7672 Unknown column error in order clause
mysql-test/t/select.test:
Test case for bug#7672 Unknown column error in order clause
mysql-test/r/select.result:
Test case for bug#7672 Unknown column error in order clause
client/mysql.cc:
Don't use c_ptr() for cgets() and ensure buffer is not overwritten
mysql-test/r/cast.result:
More test for CAST(0x.... as signed)
sql/opt_sum.cc:
Fix bugs found during review
- Changed code to be able to remove one if
- Ensure that count == 0 only if is_exact_count == TRUE
sql/sql_delete.cc:
Ensure 'allow_sum_func' is reset before call to setup_conds
sql/sql_lex.cc:
allow_sum_func doesn't have to be reset for each query
(It's to be reset in setup_fields() or before call to setup_conds()
sql/sql_load.cc:
Move set of auto_increment_field_not_null so that it's not set if field value is NULL
sql/sql_prepare.cc:
allow_sum_func doesn't have to be reset for each query
(It's to be reset in setup_fields() or before call to setup_conds()
sql/sql_update.cc:
Ensure 'allow_sum_func' is reset before call to setup_conds
thd->allow_sum_func was left 'true' after previous statement thus allowing
sum funcs to be present in conditions.
thd->allow_sum_func should be set to 0 for each query and each prepared
statement reinitialization. This is done in lex_start() and
reset_stmt_for_execute().
sql/sql_lex.cc:
Fix bug#13180 thd->allow_sum_func wasn't reset obefore query processing.
thd->allow_sum_func is set to 0 in lex_start().
sql/sql_prepare.cc:
Fix bug#13180 thd->allow_sum_func wasn't reset obefore query processing.
thd->allow_sum_func is set to 0 in reset_stmt_for_execute().
mysql-test/t/update.test:
Test case for bug#13180 thd->allow_sum_funcs wasn't reset before query
processing.
mysql-test/r/update.result:
Test case for bug#13180 thd->allow_sum_funcs wasn't reset before query
processing.
mysql-test/r/ps_grant.result:
Deallocate prepare statements
Moved test for 'show full processlist' to not_embedded_server.test becasue it's shouldn't be here and it could fail on a slow computer where previous connections has not yet disconnected
mysql-test/t/ps_grant.test:
Deallocate prepare statements
Moved test for 'show full processlist' to not_embedded_server.test becasue it's shouldn't be here and it could fail on a slow computer where previous connections has not yet disconnected
sql/sql_lex.cc:
Fixed typo
mysql-test/r/not_embedded_server.result:
New BitKeeper file ``mysql-test/r/not_embedded_server.result''
mysql-test/t/not_embedded_server.test:
New BitKeeper file ``mysql-test/t/not_embedded_server.test''
BitKeeper/etc/ignore:
added ndb/tools/ndb_config
syntax in binlog which stops replication":
disallow the use of parameter markers which can lead to generation
of malformed binlog queries.
mysql-test/r/ps.result:
Test results fixed: a test case for Bug#11299
mysql-test/t/ps.test:
A test case for Bug#11299
sql/sql_lex.cc:
Introduce a new parser token for a parameter marker. Make sure
that a parameter marker can not be used in a query which, when
transformed to a binlog query, becomes grammatically incorrect.
sql/sql_yacc.yy:
The check for COM_PREPARE has been moved into the lexer.
mysql-test/var:
New BitKeeper file ``mysql-test/var''
Faster detection of wrong table names (like PRN) on windows
include/my_sys.h:
Added check_if_legal_filename()
mysys/my_access.c:
Added check_if_legal_filename()
Set errno if my_access() fails
mysys/my_fopen.c:
USe check_if_legal_filename() instead of my_access() to detect wrong file names on windows
mysys/my_open.c:
USe check_if_legal_filename() instead of my_access() to detect wrong file names on windows
sql/sql_lex.cc:
Portability fix
sql/sql_parse.cc:
Simple cleanup
sql/sql_repl.cc:
Cleanup during code review
by a multi-byte character with a second byte of 0x5c (\). (Bug #8903)
sql/sql_lex.cc:
Fix lex error when multi-byte character containing 0x5c (\) follows a
backslash
mysql-test/t/ctype_sjis.test:
Add regression test for Bug #8303
mysql-test/r/ctype_sjis.result:
Add test results
into sanja.is.com.ua:/home/bell/mysql/bk/work-4.1
sql/item.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_select.cc:
Auto merged
into mysql.com:/home/dlenev/src/mysql-4.1-tzbug
sql/item_timefunc.cc:
Auto merged
sql/set_var.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/tztime.cc:
Auto merged
does not work well together". Now using simplier and more correct
implementation of st_lex::unlink_first_table()/link_first_table_back()
(It also nicely handles case when global table list is created because
of implictly used time zone tables). (2nd attempt)
Fix for bug #7705 "CONVERT_TZ() crashes with subquery/WHERE on index
column". Implemented new approach for caching objects for constant
time zone arguments. Now instead of determining whenever these arguments
are constants and performing time zone lookup at fix_fields() stage, we
do it on first get_date() invocation.
Cleanup of global @@time_zone variable handling.
mysql-test/r/timezone2.result:
Added test for bugs #7705 "CONVERT_TZ() crashes with subquery/WHERE on
index column" and #7899 "CREATE TABLE .. SELECT .. and CONVERT_TZ()
function does not work well together".
mysql-test/t/timezone2.test:
Added test for bugs #7705 "CONVERT_TZ() crashes with subquery/WHERE on
index column" and #7899 "CREATE TABLE .. SELECT .. and CONVERT_TZ()
function does not work well together".
sql/item_timefunc.cc:
Item_func_convert_tz():
New approach for caching objects for constant time zone arguments.
Now instead of determining whenever these arguments are constants
and performing time zone lookup at fix_fields() stage, we do it
on first get_date() invocation. This works better in cases when
const_item() for these arguments returns true only on get_date()
stage but not on fix_fields() stage (e.g. this happens in quries
with joins or derived tables).
sql/item_timefunc.h:
Item_func_convert_tz():
Added from_tz_cached/to_tz_cached members indicating whenever we
already have Time_zone object representing one of constant time zone
arguments.
sql/set_var.cc:
Cleaned up global @@time_zone variable handling. Now we use proper
locking when we are setting or reading its value.
sql/set_var.h:
Removed declaration of sys_var_thd_time_zone::get_tz_ptr() method, which
no longer used.
sql/sql_lex.cc:
st_lex::unlink_first_table(), st_lex::link_first_table_back():
Simplify implementation according to Monty's suggestion.
Instead doing something special if global and local table lists
are the same, we simply save/restore pointers to first elements
of both global and local lists (which works even when this lists
are the same!). This handles nicely the case when we have separate
global table list becuase time zone tables are implicitly used.
sql/tztime.cc:
Backport of Monty's fixes from 5.0, which give us nicer error messages
if we haven't found time zone with such name or its description.
sql_lex.cc:
Set query to not cacheable if we are using multistatements and there are multiple statements in this query
sql/sql_lex.cc:
Set query to not cacheable if we are using multistatements and there are multiple statements in this query
This allows use to use INSERT IGNORE ... ON DUPLICATE ...
mysql-test/r/drop.result:
safety fix
mysql-test/t/drop.test:
safety fix
mysql-test/t/multi_update.test:
ensure we cover all possible errors
sql/log_event.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/log_event.h:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/mysql_priv.h:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_class.h:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_delete.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_insert.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_lex.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_lex.h:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_load.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_parse.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_repl.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_repl.h:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_select.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_table.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_union.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_update.cc:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
sql/sql_yacc.yy:
Remove DUP_IGNORE from enum_duplicates and instead use a separate ignore flag
UPDATE clause conflicts with SELECT for use of item_list field.
Alter UPDATE clause to use new lex field update_list
Tests included
mysql-test/r/insert_update.result:
WL#2274
New tests for INSERT..SELECT..UPDATE
mysql-test/t/insert_update.test:
WL#2274
New tests for INSERT..SELECT..UPDATE
sql/mysql_priv.h:
Remove function - insert_select_precheck()
sql/sql_class.h:
WL#2274
New constructor for class select_insert
sql/sql_insert.cc:
WL#2274
Move code into mysql_prepare_insert
Add checks as param values may be NULL
sql/sql_lex.cc:
WL#2274
initialize lex->update_list
sql/sql_lex.h:
WL#2274
New field in LEX: update_list
sql/sql_parse.cc:
WL#2274
INSERT..UPDATE clause now populates lex->update_list
Remove redundant function: insert_select_precheck()
sql/sql_prepare.cc:
WL#2274
invoke insert_precheck() instead of insert_select_precheck()
sql/sql_yacc.yy:
WL#2274
Enable INSERT..SELECT..UPDATE syntax
New rule - insert_update_list, to populate lex->update_list
mysql-test/t/subselect_innodb.test:
possible early unlock
sql/sql_lex.cc:
subqueries presence flag
sql/sql_lex.h:
subqueries presence flag
sql/sql_parse.cc:
subqueries presence flag
sql/sql_select.cc:
removed some too optimistic optimisation, now we create temporary join for all queries with subqueries to make correct cleunup of tables and avoid too early unlock
mysql-test/r/subselect.result:
Subselect in non-select command just after connection
mysql-test/t/subselect.test:
Subselect in non-select command just after connection
sql/sql_lex.cc:
moved procedure initialization
sql/sql_parse.cc:
moved procedure initialization
into mishka.local:/home/my/mysql-4.1
sql/item_cmpfunc.h:
Auto merged
sql/item_strfunc.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_prepare.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
crashes server." The fix makes Item_func_rand prepared-statements
aware plus it fixes the case when RAND is used in prepared
statements and replication is on (as well as several similar issues).
Until now we did not reset THD before every execution of a prepared
statement, so if some execution had set thd->time_zone_used
or thd->rand_used they would not be reset until next mysql_parse.
Some of post-review fixes done.
mysql-test/r/ps.result:
A test case for Bug#5985: test results fixed.
mysql-test/t/ps.test:
A test case for Bug#5985 "prepare stmt from "select rand(?)" crashes
server."
sql/item_func.cc:
Actual fix for Bug#5985: Item_func_rand rewritten to be
prepared statements aware.
sql/item_func.h:
Actual fix for Bug#5985: Item_func_rand rewritten to be
prepared statements aware.
sql/mysql_priv.h:
We need a separate call to reset THD state before every execute of
a prepared statement. Otherwise things like THD->user_var_events
are never cleaned up and bloat binary log (as the list of events
grows from execution to execution).
sql/sql_class.cc:
Statement::end_statement -> THD::end_statement()
(a leftover from some design change which is not to pushed now, but the
leftover is to be pushed).
sql/sql_class.h:
Statement::end_statement -> THD::end_statement()
(a leftover from some design change which is not to pushed now, but the
leftover is to be pushed).
sql/sql_lex.cc:
Move the part responsible for initializing LEX from mysql_init_query
to lex_start.
sql/sql_lex.h:
All lex-related initialization is now in lex_start.
Move thd->select_number to lex->select_number to be able to use it
easily in lex_start.
sql/sql_parse.cc:
Split mysql_init_query into two functions: mysql_reset_thd_for_next_query,
which is used in PS and conventional execution, and lex_start, used only
when we want to parse something.
Fix init_connect to use initialized THD.
sql/sql_prepare.cc:
Deploy mysql_reset_thd_for_next_query to reset THD state before
execution of a prepared statement.
Normally this should have been added to just one place, but
we have to reset thd before assigning placeholders from variables,
thus we can't do that in execute_stmt (yuck).
Added a check to recover from IGNORE_SPACE in this situation:
<ident-character(s)><space><dot><ident-character(s)>
The ignored space led to the false identification of the dot
as an ident separator (like "db.table").
mysql-test/r/sql_mode.result:
BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
Added the test results.
mysql-test/t/sql_mode.test:
BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
Added new tests for the bug.
sql/sql_lex.cc:
BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
Added code to recover from skipped spaces in mode IGNORE_SPACES,
when testing for an ident separator (which happens to be a dot).
mysql-test/r/multi_update.result:
multi* unique updating table check
mysql-test/t/multi_update.test:
multi* unique updating table check
sql/sql_lex.cc:
new method to check table only in subqueries
sql/sql_lex.h:
new method to check table only in subqueries
sql/sql_parse.cc:
used new method to check table only in subqueries
sql/sql_update.cc:
check that table is unique added
sql/sql_class.h:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_prepare.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_class.cc:
Manual resolve of the merge
execute crashes server": we were deleting lex->result
after each execute, but prepared statements assumed that
it's left intact.
The fix adds cleanup() method to select_result hierarchy,
so that result objects can be reused.
Plus we now need to delete result objects more wisely.
mysql-test/r/ps.result:
Test results fixed: test case for bug#5034
mysql-test/t/ps.test:
A test case for bug#5034, few followups
sql/sql_class.cc:
- fix warning in THD::THD
- implementation of cleanup() for select_result hierarchy
- select_export::send_eof was identical to
select_dump::send_eof: moved to the base class select_to_file.
- Statement::end_statement() to end lex, free items, and
delete possible select_result
sql/sql_class.h:
- select_result::cleanup() declaration
-
sql/sql_insert.cc:
- implementation of select_insert::cleanup(): currently
we always create a new instance of select_insert/
select_create on each execute.
sql/sql_lex.cc:
- with more complicated logic of freeing lex->result it's
easier to have it non-zero only if it points to a valid
result.
sql/sql_lex.h:
Now st_lex::st_lex is not empty.
sql/sql_parse.cc:
mysql_execute_command():
- delete select_result *result only if it was created in
this function.
- use end_statement() to cleanup lex and thd in the end of
each statement.
- no need to save THD::lock if this is explain. This save
apparently left from times when derived tables were
materialized here, not in open_and_lock_tables.
sql/sql_prepare.cc:
- call result->cleanup() in reset_stmt_for_execute
- now Statement is responsible for freeing its lex->result.
sql/sql_select.cc:
handle_select():
- don't delete result, it might be needed
for next executions
- result is never null
sql/item_subselect.cc:
Auto merged
sql/item_subselect.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
a second time". The bug was caused by incompatibility of
negations elimination algorithm and PS: during first statement
execute a subtree with negation was replaced with equivalent
subtree without NOTs.
The problem was that although this transformation was permanent,
items of the new subtree were created in execute-local memory.
The patch adds means to check if it is the first execute of a
prepared statement, and if this is the case, to allocate items
in memory of the prepared statement.
The implementation:
- backports Item_arena from 5.0
- adds Item_arena::is_stmt_prepare(),
Item_arena::is_first_stmt_execute().
- deletes THD::allocate_temporary_pool_for_ps_preparing(),
THD::free_temporary_pool_for_ps_preparing(); they
were redundant.
and adds a few invariants:
- thd->free_list never contains junk (= freed items)
- thd->current_arena is never null. If there is no
prepared statement, it points at the thd.
The rest of the patch contains mainly mechanical changes and
cleanups.
mysql-test/r/ps.result:
Test results updated (test case for Bug#4912)
mysql-test/t/ps.test:
A test case for Bug#4912 "mysqld crashs in case a statement is
executed a second time"
sql/item_cmpfunc.cc:
current_statement -> current_arena
sql/item_subselect.cc:
Statement -> Item_arena, current_statement -> current_arena
sql/item_subselect.h:
Item_subselect does not need to save thd->current_statement.
sql/item_sum.cc:
Statement -> Item_arena
sql/item_sum.h:
Statement -> Item_arena
sql/mysql_priv.h:
Statement -> Item_arena
sql/sql_base.cc:
current_statement -> current_arena
sql/sql_class.cc:
- Item_arena
- convenient set_n_backup_statement, restore_backup_statement
(nice idea, Sanja)
sql/sql_class.h:
- Item_arena: backport from 5.0
- allocate_temporary_pool_for_ps_preparing,
free_temporary_pool_for_ps_preparing removed.
sql/sql_derived.cc:
current_statement -> current_arena
sql/sql_lex.cc:
current_statement -> current_arena
sql/sql_parse.cc:
Deploy invariant that thd->free_list never contains junk items
(backport from 5.0).
sql/sql_prepare.cc:
- backporting Item_arena
- no need to allocate_temporary_pool_for_ps_preparing().
sql/sql_select.cc:
Fix for bug#4912 "mysqld crashs in case a statement is
executed a second time": if this is the first execute of
a prepared statement, negation elimination is
done in memory of the prepared statement.
sql/sql_union.cc:
Backporting Item_arena from 5.0.
mysql-test/r/func_gconcat.result:
fix of test queries
mysql-test/r/subselect.result:
resolving fields of grouped outer SELECT
mysql-test/t/func_gconcat.test:
fix of test queries
mysql-test/t/subselect.test:
resolving fields of grouped outer SELECT
sql/item.cc:
skip resolving field in table list if table list is not accessable due to groupping
layout fixed
sql/item_subselect.cc:
detection of place of subquery
sql/item_subselect.h:
detection of place of subquery
sql/mysql_priv.h:
enum_parsing_place made global type
sql/sql_lex.cc:
enum_parsing_place made global type
sql/sql_lex.h:
enum_parsing_place made global type
sql/sql_yacc.yy:
enum_parsing_place made global type
Instead of trying to open time zone tables during calculation of CONVERT_TZ() function
or setting of @@time_zone variable we should open and lock them with the rest of
statement's table (so we should add them to global table list) and after that use such
pre-opened tables for loading info about time zones.
mysql-test/r/timezone2.result:
Added test for bug #4508
mysql-test/t/timezone2.test:
Added test for bug #4508
scripts/mysql_create_system_tables.sh:
Added one more test time zone to time zone tables which is needed for test for bug #4508.
sql/item_create.cc:
CONVERT_TZ() now is treated as special function.
sql/item_create.h:
CONVERT_TZ() now is treated as special function.
sql/item_timefunc.cc:
Item_func_convert_tz now uses list of pre-opened time zone tables instead of trying to
open them ad-hoc. Also it avoid calling of current_thd.
sql/item_timefunc.h:
Added comment describing special nature of CONVERT_TZ() function.
Optimization: Added own fix_fields() method and tz_tables member for caching pointer
to list of open time zone tables to Item_func_convert_tz class.
sql/lex.h:
CONVERT_TZ() now is treated as special function.
sql/mysql_priv.h:
Removed function which is no longer used.
sql/set_var.cc:
Now my_tz_find() accepts list of pre-opened time zone tables as last argument
and no longer needs pointer to current THD.
sql/set_var.h:
Exported sys_time_zone, which is now used in sql_yacc.yy for quick finding out if we are
setting @@time_zone variable.
sql/sql_base.cc:
Moved propagation of pointers to open tables from global list to local select lists to
open_and_lock_tables(), also added implicit usage of time zone tables as condition for
such propagation.
sql/sql_lex.cc:
Added fake_time_zone_tables_list which is used to indicate that time zone tables are
implicitly used in statement.
st_select_lex_unit::create_total_list(): if time zone tables are implicitly used in
statement add them to global tables list.
sql/sql_lex.h:
Added LEX::time_zone_tables_used member which is used to indicate that time zone tables
are implicitly used in this statement (by pointing to fake_time_zone_table_list) and
for holding pointer to those tables after they've been opened.
sql/sql_parse.cc:
We should also create global table list if statement uses time zone tables implicitly.
Added initialization of LEX::time_zone_tables_used to mysql_query_init().
sql/sql_prepare.cc:
We should also create global table list if statement uses time zone tables implicitly.
sql/sql_select.cc:
Removed functions which are no longer used.
sql/sql_yacc.yy:
CONVERT_TZ() and @@time_zone variable are handled in special way since they implicitly
use time zone tables.
sql/tztime.cc:
Fix for bug #4508 "CONVERT_TZ() function with new time zone as param crashes server".
If statement uses CONVERT_TZ() function or @@time_zone variable is set then it implicitly
uses time zone tables. We need to open and lock such tables with all other tables of
such statement.
All code responsible for opening table was removed from tz_load_from_db() and function was
renamed to tz_load_from_open_tables() (which uses list of pre-opened tables).
We also have new functions for construction and initialization of table list of time
zone tables.
my_tz_find() now always require list of pre-opened time zone tables and no longer needs
current THD. So we have to pre-open them in my_tz_init().
Also now we try to open time zone tables only if they were found during startup.
sql/tztime.h:
New function for construction of table list of time zone tables my_tz_get_table_list().
Now my_tz_find() requires list of pre-pened time zone tables instead of current thread.
into sanja.is.com.ua:/home/bell/mysql/bk/work-innodb-4.1
sql/item_subselect.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_select.cc:
Auto merged
mysql-test/r/subselect_innodb.result:
test of unlocking innodb tables and subquery in HAVING clause
mysql-test/t/subselect_innodb.test:
test of unlocking innodb tables and subquery in HAVING clause
sql/item_subselect.cc:
mark SELECT with subquery in HAVING clause
sql/sql_lex.cc:
mark SELECT with subquery in HAVING clause
sql/sql_lex.h:
mark SELECT with subquery in HAVING clause
sql/sql_select.cc:
do not unlock tables early if we have subquery in HAVING clause
The code in mysql_create_table() code assumes that if lower_case_names==2 then table alias
should contain unchanged table name, and this was not true for temporary tables which
had 'tmp-table' constant as alias. Now we are using table name as alias for such tables.
sql/sql_lex.cc:
Removed tmp_table_alias constant which is no longer used.
sql/sql_lex.h:
Removed tmp_table_alias constant which is no longer used.
sql/sql_yacc.yy:
Let us use table name instead of 'tmp-table' as alias for table being created by
CREATE TEMPORARY TABLE statement. This fixes failing temp_table.test on Darwin 7.3
since mysql_create_table() code assumes that if lower_case_names==2 then table alias
should contain unchanged table name (and now this assumtion is true but it were false
for temporary tables before...).
into sanja.is.com.ua:/home/bell/mysql/bk/work-explain-4.1
mysql-test/r/subselect.result:
Auto merged
mysql-test/t/subselect.test:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_union.cc:
Auto merged
mysql-test/r/subselect.result:
ALL/ANY test
mysql-test/t/subselect.test:
ALL/ANY test
sql/item_subselect.cc:
keep old engine & JOIN if we changed subquery Item, which allow avoid second all SELECT items fix_fields call with pervios clean up (because of second setup_tables which remove table->key_use and maybe something else)
keep list when we change Item in SELECT list
processing inserted max/min function (now JOIN::prepare will be called only once)
methods of changing item for subselect engines
sql/item_subselect.h:
change item & results procedure
sql/item_sum.cc:
Item_sum_hybrid::clear moved to .cc file (to keep .h clean and to make inserving/removing debug info easy)
sql/item_sum.h:
Item_sum_hybrid::clear moved to .cc file (to keep .h clean and to make inserving/removing debug info easy)
sql/sql_lex.cc:
note about new method
sql/sql_lex.h:
method for changing result of UNION JOINs
sql/sql_select.cc:
method for changing result in JOIN
sql/sql_select.h:
method for changing result in JOIN
sql/sql_union.cc:
method for changing result in JOIN
EXPLAIN of hidden SELECT of UNION
mysql-test/r/derived.result:
explain of hidden select
mysql-test/r/subselect.result:
explain of hidden select
mysql-test/r/union.result:
explain of hidden select
correct error messages on explain
mysql-test/t/subselect.test:
show eliminated costants in WHERE clause
mysql-test/t/union.test:
correct error messages on EXPLAIN with union
sql/item.cc:
fixed name constructing for global ORDER BY items
sql/sql_class.h:
select ID can be negative (for hidden SELECTs)
removed unused field
sql/sql_lex.cc:
new flag of UNION EXPLAIN
sql/sql_lex.h:
new flag of UNION EXPLAIN
select ID can be negative (for hidden SELECTs)
sql/sql_select.cc:
EXPLAIN UNION using same routing which used for execution
explain for hidden SELECT of UNION
sql/sql_union.cc:
EXPLAIN UNION using same routing which used for execution