Commit graph

120 commits

Author SHA1 Message Date
marko
fe48c3662a branches/zip: Return a meaningful error message when refusing to create
a compressed table in the system tablespace.

db0err.h: Introduce the error code DB_TABLE_ZIP_NO_IBD.  Replace the
#define directives with an enum, to ease future code merges.  These
error codes are never written out to files or displayed to the user.
Thus they need not remain constant.

dict_build_table_def_step(): Return DB_TABLE_ZIP_NO_IBD instead of DB_ERROR.

create_table_def(): Report ER_ILLEGAL_HA_CREATE_OPTION "KEY_BLOCK_SIZE"
when the table creation fails with DB_TABLE_ZIP_NO_IBD.
2007-11-07 11:03:13 +00:00
marko
17fc32fb51 branches/zip: Allow the symbols in the dynamic InnoDB plugin to be
redefined so that the dynamic plugin can replace the builtin InnoDB
in MySQL 5.1.

ha_innodb.cc, handler0alter.cc: #include "univ.i" before any other InnoDB
header files or before defining any symbols

innodb_redefine.h: New file, to contain a mapping of symbols.  The idea
is that this file will be replaced in the build process; because this
is a large file that can be generated automatically, it does not make sense
to keep it under version control.

univ.i: #include "innodb_redefine.h" and #define ha_innobase ha_innodb

Makefile.am (ha_innodb_la_CXXFLAGS): Remove -Dha_innobase=ha_innodb

NOTE: there are still some issues in the source code.  One known issue is
the #undef mutex_free in sync0sync.h, which will cause the plugin to call the
function mutex_free in the builtin InnoDB.  The preprocessor symbols defined
in innodb_redefine.h must not be undefined or redefined anywhere in the code.
2007-11-01 15:00:44 +00:00
marko
3037cca095 branches/zip: Remove the parameter innodb_dynamic, and always call the
plugin "InnoDB", not "InnoDBzip".

We can disable the builtin InnoDB by mysqld --skip-innodb.  If the
builtin InnoDB is not disabled, installing the InnoDB plugin by the same
name will not work.

innodb_plugin_init(): Ignore differences in the PLUGIN_VAR_READONLY flag.
2007-11-01 13:25:48 +00:00
marko
2dbf0fdacb branches/zip: Remove warnings for BUILD/compile-... --warning-mode=pedantic.
ha_innobase::write_row(): The printf format %p expects const void*.

STRUCT_FLD: Do not use the GCC extension when __STRICT_ANSI__ is defined.

row_merge_read_clustered_index(): Compound initializers must not contain
variables.  Assign to struct fields instead.
2007-11-01 11:44:49 +00:00
marko
c661970d75 branches/zip: Merge 1937:2015 from trunk. 2007-10-24 10:59:54 +00:00
marko
8bed4c4c3f branches/zip: Do not access the fields of dfield_t directly.
dfield_dup(): New function for duplicating the data pointed to by dfield_t.

dfield_set_len(), dfield_set_data(): Add Valgrind instrumentation.
2007-10-23 06:46:12 +00:00
marko
7c68ba2e9d branches/zip: Allow a dynamically loaded InnoDB storage engine plugin
to replace a built-in instance of InnoDB in mysqld.  This is work in
progress, with several limitations:

* Other plugins defined in the builtin InnoDB are not disabled.
  However, InnoDB in MySQL 5.1 only defines the storage engine plugin,
  no INFORMATION_SCHEMA plugins.

* The global C symbols in ha_innodb.so except innodb_hton_ptr and
  builtin_innobase_plugin will have to be redefined, e.g., by objcopy.

* The storage engine cannot be called "InnoDB" to avoid a conflict with
  the builtin name.  Here we call it InnoDBzip.

innobase_hton_name[]: Rename to "InnoDBzip" when building a dynamic plugin.

innodb_plugin_init(): New function for the dynamic plugin, to copy
and redirect configuration parameters from the builtin InnoDB.

innodb_dynamic: New configuration parameter.  This has to be added
to the builtin InnoDB in MySQL 5.1.  Also, innodb_hton_ptr must be made
global there.

innobase_init(): Interpret the parameter innodb_dynamic.

Makefile.am: Redefine class ha_innobase to ha_innodb by a preprocessor
define.  Apparently, C++ classes cannot be easily renamed by objcopy.
2007-10-15 11:05:40 +00:00
marko
1b166ea268 branches/zip: Add DBUG_ASSERT(hton == innodb_hton_ptr) to various functions. 2007-10-04 08:33:25 +00:00
marko
a298d8ba0a branches/zip: Move the implementation of the INFORMATION_SCHEMA tables
INNODB_ZIP and INNODB_ZIP_RESET from ha_innodb.cc to i_s.cc.

plugin_author, END_OF_ST_FIELD_INFO, i_s_info: New common constants.

trx_i_s_common_deinit(): Renamed to i_s_common_deinit().
2007-10-03 14:00:54 +00:00
marko
354a9fc077 branches/zip: Initialize also the newly added field open_method
in ST_FIELD_INFO.
2007-10-03 13:48:17 +00:00
marko
3b99f0d17c branches/zip: Fix some link errors.
ha_innobase::update_thd(void): New function, to call the inline function
ha_innobase::update_thd(THD*).

check_trx_exists(): Make static.  handler0alter.cc does not need to call
this function.
2007-09-28 10:44:20 +00:00
marko
23f80a6f54 branches/zip: Merge 1862:1894 from trunk, except 1866. 2007-09-27 11:17:45 +00:00
marko
6b3579a87f branches/zip: Clean up some non-inlined functions.
dtuple_create_for_mysql(), dtuple_free_for_mysql(): Remove.

ha_innobase::records_in_range(): Use mem_heap_create(), mem_heap_free(),
and dtuple_create() instead of the removed functions above.  Since r1587,
InnoDB C++ functions can invoke inlined C functions.
2007-09-26 12:07:07 +00:00
vasil
b9982ac9ec Implement INFORMATION_SCHEMA tables innodb_trx, innodb_locks,
innodb_lock_waits. See
https://svn.innodb.com/innobase/InformationSchema/TransactionsAndLocks
for design notes.

Things that need to be resolved before this goes live:
* MySQL must add thd_get_thread_id() function to their code
  http://bugs.mysql.com/30930
* Allocate memory from mem_heap instead of using mem_alloc()
* Copy table name and index name into the cache because they may be
  freed later which will result in referencing freed memory

Approved by:	Marko
2007-09-20 11:23:44 +00:00
marko
f5e4a4c3ed branches/zip: Merge 1830:1862 from trunk. 2007-09-20 08:36:22 +00:00
marko
1fabfe9c99 branches/zip: Move the code related to fast index creation
(smart ALTER TABLE) from ha_innodb.cc to a separate module, handler0alter.cc.
2007-09-13 09:31:54 +00:00
marko
5cff259229 branches/zip: ha_innobase::add_index(): Fix a race condition that
existed before the fast-index-creation code was merged, in r1414.

Do not call row_prebuilt_table_obsolete(innodb_table) until after
the table has been renamed to a temporary name.  Otherwise, the
following could happen when creating a clustered index on table T:

(a1) copy T to T#1
(a2) mark T obsolete
(b1) add the name of T to the background drop list
(a3) rename T to T#2 and T#1 to T
(b2) drop the table on the background

These steps are executed by two threads, a and b.

If b1 is executed after a3, all is fine: the name T#2 will be added
to the background drop list.  If b1 is executed before a3, the name
T will be added, and T#2 will survive.
2007-09-11 06:20:19 +00:00
inaam
22d5997dbc branches/zip: Undo changes commited in r1832.
These should have gone to branches/fts.

Spotted by: Marko and Ken
2007-09-11 00:41:02 +00:00
inaam
24741ad8f7 branches/zip: Enabled group commit functionality with XA.
Reviewed by: Heikki
2007-09-10 17:06:44 +00:00
marko
7c680d2f3e branches/zip: Merge 1809:1830 from trunk. 2007-09-10 10:09:01 +00:00
marko
6b4c37d6e8 branches/zip: Decode table names when displaying error messages in
fast index creation.

innobase_convert_tablename(): New function, to remove the filename
encoding of a database and table name.

ha_innobase::add_index(): Invoke innobase_convert_tablename() before
calling my_error().

innodb-index.result: Update the error messages.
2007-09-07 09:05:52 +00:00
marko
0a2e8d97be branches/zip: ha_innobase::add_index(): Allocate a new transaction for
the dictionary operations.

TODO: ha_innobase::final_drop_index() should do the same, and set
trx->dict_operation as well.
2007-09-06 12:43:29 +00:00
marko
94e707cf3c branches/zip: Merge 1792:1809 from trunk. 2007-09-06 07:12:12 +00:00
marko
489d829617 branches/zip: ha_innobase:add_index(): Report HA_ERR_TABLE_EXIST when the
temporary table cannot be created or renamed.

innodb-index.test,result: Add test cases where a temporary table already
exists.
2007-09-05 11:27:41 +00:00
marko
52a8928693 branches/zip: Simplify crash recovery in fast index creation.
trx_t: Remove dict_undo_list and dict_redo_list.

innobase_create_temporary_tablename(): Replace TEMP_TABLE_PREFIX with
a table name suffix "#1" or "#2".  In this way, the user can restore
precious data, should anything go wrong.  It is possible to reach an
inconsistent state, because the creation, deletion and renaming of
single-table tablespaces are not transactional.

ut_print_namel(), fil_make_ibd_name(), innobase_rename_table(): Remove
the special treatment of TEMP_TABLE_PREFIX.

Introduce TEMP_INDEX_PREFIX == 0xff for temporary indexes.  This byte
cannot occur in index names since MySQL 4.1.  However, it might have
been possible to use this byte in MySQL 4.0.

recv_recovery_from_checkpoint_finish(): Call the new function
row_merge_drop_temp_indexes(), to drop all indexes whose name starts
with the byte 0xff.

row_merge_rename_indexes(): Renamed from row_merge_rename_index().
Remove the parameter "index".

row_drop_table_for_mysql(): Unconditionally call trx_commit_for_mysql().

row_drop_table_for_mysql_no_commit(): Correct the function commit,
based on the corrected comment of row_drop_table_for_mysql().  Rely on
table->to_be_dropped instead of TEMP_TABLE_PREFIX.

ha_innobase::add_index(): Simplify the control flow.
2007-09-05 10:18:03 +00:00
marko
97b8960beb branches/zip: Merge 1783:1792 from trunk. 2007-09-03 08:44:39 +00:00
marko
37e720811b branches/zip: Enclose the definition of dict_index_t::trx_id in
#ifdef ROW_MERGE_IS_INDEX_USABLE, to avoid growing the memory
footprint until MySQL implements and calls the virtual method
handler::is_index_available() or something equivalent.
2007-09-03 07:13:59 +00:00
marko
a4132905cd branches/zip: Introduce TEMP_INDEX_PREFIX == 0xff for indexes being populated
in fast index creation.  The prefix was previously TEMP_TABLE_PREFIX == '/',
which may occur in index names.

ut_print_namel(): Do not assume that all '/' are separators between
database and table names.
2007-08-31 09:58:22 +00:00
marko
faec4797c8 branches/zip: Merge 1664:1783 from trunk. 2007-08-30 09:21:25 +00:00
marko
a9c7b3c543 branches/zip: ha_innobase::add_index(): Remove a remark about row0mysql.c
in a comment about latching the data dictionary.  The data dictionary may
be latched elsewhere too.
2007-08-29 08:53:29 +00:00
marko
d1be7f720e branches/zip: Remove trx->sync_cb. Call dict_rename_indexes() directly
from ha_innobase::add_index().

dict_rename_indexes(): Remove the redundant parameter commit_flag.
2007-08-21 12:36:13 +00:00
marko
0d6bfcb547 branches/zip: Fix a memory leak in fast index creation.
ha_innobase::add_index(): Add assertions about !trx->sync_cb and
!trx->dict_redo_list.  Remove a bogus comment.  Replace
row_lock_table_for_merge() with row_merge_lock_table().

row_merge_lock_table(): Renamed from row_lock_table_for_merge()
and moved from row0mysql.c to row0merge.c.  Always lock the table in
the mode LOCK_X.  Call que_graph_free() in order not to leak memory.
2007-08-21 12:10:14 +00:00
marko
d71b5e6a5d branches/zip: ha_innobase::add_index(): Remove the mem_heap_empty() call.
The index[] array that is allocated from the heap is still live.
2007-08-21 09:42:20 +00:00
marko
bbe0043055 branches/zip: Preserve FOREIGN KEY constraints when creating a PRIMARY KEY.
innodb-index.test: Add some test cases for FOREIGN KEY constraints.

row_merge_rename_tables(): New function,
adapted from row_rename_table_for_mysql().

ha_innobase::add_index(): Use row_merge_rename_tables().
2007-08-20 11:40:00 +00:00
marko
9ab3abd6ef branches/zip: Refuse fast index creation if newraw or innodb_force_recovery
have been set.

ha_innobase::add_index(), ha_innobase::prepare_drop_index(),
ha_innobase::final_drop_index(): Return HA_ERR_WRONG_COMMAND if
newraw or innodb_force_recovery have been set.
2007-08-20 09:13:26 +00:00
marko
d723dbfab5 branches/zip: ha_innobase::write_row(): Remove an unreachable break statement. 2007-08-20 06:54:31 +00:00
marko
1bbbcbfef4 branches/zip: Fix bugs in the creation or dropping of the clustered index
(PRIMARY KEY or UNIQUE INDEX on NOT NULL columns).

innodb-index.test: Remove the --replace_regex directives.  Replace correct
values to the "Duplicate entry" messages.  This will cause the test to
fail until we somehow return the duplicate key values to MySQL.
Add test cases for creating or dropping UNIQUE INDEX or PRIMARY KEY.

innobase_copy_index_def(): Allow the function to copy a clustered index
definition to a secondary one (UNIQUE INDEX).

innobase_create_key_def(): Check the NOT NULL flag from the correct
place.  Copy the clustered index if it is a UNIQUE INDEX.

ha_innobase::prepare_drop_index(): Refuse to drop the clustered index.
2007-08-16 13:13:25 +00:00
marko
62295123ee branches/zip: Minor cleanup.
ha_innobase::add_index(), ha_innobase::prepare_drop_index():
Remove the redundant thd_test_options() calls.
The options are tested in check_trx_exists().

ha_innobase::prepare_drop_index(): key cannot be NULL; remove the tests.
Move the condition for checking foreign keys outside of the loop.
Remove the redundant error log printout about foreign key dependency.
2007-08-16 09:19:48 +00:00
marko
c67c3b90a4 branches/zip: Remove the error code DB_CANNOT_DROP_FOREIGN_INDEX.
It was only set by ha_innobase::prepare_drop_index(), which can return
the appropriate MySQL error code (HA_ERR_DROP_INDEX_FK) directly.

ha_innobase::add_index(): Correct the function comment.

ha_innobase::prepare_drop_index(): Correct the function comment.
Return MySQL error codes directly.

ha_innobase::final_drop_index(): Correct the function comment.
2007-08-15 15:49:58 +00:00
marko
9be35934d7 branches/zip: Minor cleanup.
trx_t: Change the type of error_info from void* to const dict_index_t*.

trx_get_error_info(): Add const qualifier to trx_t*.  Make this an
inline function.
2007-08-15 06:53:34 +00:00
marko
2c660584ba branches/zip: ha_innobase::add_index(): Do not merely check for a
key name "PRIMARY".  If the table has a generated clustered index,
also check for a UNIQUE INDEX containing no NULL columns.

innobase_create_index_def(): Add the parameter key_primary.

innobase_create_key_def(): Check if the first index is a UNIQUE index
consisting of NOT NULL columns.

Fixing this bug revealed another one: FOREIGN KEY constraints
will be lost when a PRIMARY KEY is created.  This is the reason why
innodb.test will fail.
2007-08-13 16:34:00 +00:00
marko
7279ef6b4d branches/zip: ha_innobase::change_active_index(): Write to the error log
when the index could not be found.
2007-08-13 16:05:23 +00:00
marko
3c680f7c44 branches/zip: Add some const qualifiers to dict_index_t* and dict_table_t*.
innobase_create_key_def(), row_table_got_default_clust_index(),
row_get_mysql_key_number_for_index(): Add a const qualifier.

dict_table_get_first_index(), dict_table_get_next_index(): Define
as a const-preserving macro.  Preserve the old function for UNIV_DEBUG,
but add a const qualifier to the parameter and cast away the constness.
2007-08-13 15:57:28 +00:00
marko
b4e60c0544 branches/zip: ha_innobase::add_index(): Remove the unused variable new_unique. 2007-08-13 12:23:21 +00:00
marko
06096043ce branches/zip: ha_innobase::add_index(): Fix an ut_ad() assertion that
was broken in r1685.
2007-08-13 07:37:53 +00:00
marko
99fbb51034 branches/zip: When creating a PRIMARY KEY, flag all its columns NOT NULL.
row_merge_create_temporary_table(): Add the parameter index_defs.

DB_PRIMARY_KEY_IS_NULL: New error code, mapped to ER_PRIMARY_CANT_HAVE_NULL.

row_merge_read_clustered_index(): Replace the parameter "table" with the
two parameters "old_table" and "new_table".  Detect NULL values of columns
that are supposed to be NOT NULL.

row_merge_col_prtype(): New auxiliary function, used by
row_merge_create_temporary_table() to flag NOT NULL any columns
contained in an added PRIMARY KEY.
2007-08-10 15:52:09 +00:00
marko
1d99fcc5c1 branches/zip: Minor cleanup.
innobase_copy_index_field_def(): Remove parameter heap.  The field->name
will not be deallocated before the copied index has been added to the
data dictionary cache.

innobase_copy_index_def(): Add const qualifier to dict_index_t*.
Add an assertion !dict_index_is_clust(index).

ha_innobase::add_index(): Add the missing user_thd parameter to the
convert_error_code_to_mysql() call that was forgotten from r1686.

merge_index_field_struct: Add const qualifier to field_name.

merge_index_def_struct: Add const qualifier to name.

row_merge_build_indexes(): Improve the function comment.

row_merge_drop_table(): Remove bogus assertion ut_a(table->to_be_dropped).
2007-08-10 15:22:47 +00:00
marko
47337b3e2e branches/zip: ha_innobase::add_index(): Convert the error code before
goto err_exit.  The error handling should be rewritten.  Many of the
error messages contain parameters, but this code is only returning
the error number to MySQL.
2007-08-08 14:23:14 +00:00
marko
748fa3d693 branches/zip: innobase_check_index_keys(): return 0 instead of DB_SUCCESS,
as documented.  Do not translate the error code.

This function is still broken; we should probably use my_error() for
reporting errors.
2007-08-08 13:57:04 +00:00
marko
35b5f6f129 branches/zip: convert_error_code_to_mysql(): replace if-else with switch-case 2007-08-08 13:43:44 +00:00