Commit 315d7b34 authored by unknown's avatar unknown

Add warning of TRANSACTIONAL=1 is used with handler that doesn't support it

Added hton_name() and handler->engine_name() and use these when appropriate


KNOWN_BUGS.txt:
  Added some of the known bugs
mysql-test/r/maria.result:
  Added test for TRANSACTIONAL=1
mysql-test/r/myisam.result:
  Added test for TRANSACTIONAL=1
mysql-test/t/maria.test:
  Added test for TRANSACTIONAL=1
mysql-test/t/myisam.test:
  Added test for TRANSACTIONAL=1
sql/handler.cc:
  ha_resolve_storage_engine_name() -> hton_name()
sql/handler.h:
  Added hton_name() and handler->engine_name()
sql/set_var.cc:
  Use hton_name()
sql/sql_table.cc:
  Add warning of TRANSACTIONAL=1 is used with handler that doesn't support it
  Indentation fixes
  ha_resolve_storage_engine_name() -> hton_name()
sql/sql_tablespace.cc:
  ha_resolve_storage_engine_name() -> hton_name()
  Indentation fixes
sql/sql_yacc.yy:
  ha_resolve_storage_engine_name() -> hton_name()
sql/unireg.cc:
  ha_resolve_storage_engine_name() -> hton_name()
  Indentation fixes
parent 5fa560e9
......@@ -20,8 +20,8 @@ http://bugs.mysql.com/ so that we can either fix it for next release
or in the worst case add it here for others to know!
Known bugs that are planned to be fixed before next minor release
=================================================================
Known bugs that we are working on and will be fixed shortly
===========================================================
- If the log files are damaged or inconsistent, Maria may fail to start.
We should fix that if this happens and mysqld is restarted (thanks to
......@@ -31,9 +31,15 @@ Known bugs that are planned to be fixed before next minor release
Temporary fix is to remove or maria_log.???????? files from the data
directory, restart mysqld and run CHECK TABLE / REPAIR TABLE or
mysqlcheck on your Maria tables
- We have some instabilities in log writing that is under investigatation
This causes mainly assert to triggers in the code and sometimes
the log handler doesn't start up after restart.
- LOAD INDEX commands are for the moment ignored for Maria tables
(The code needs to be rewritten to do all reads through page cache to
avoid half-block reads)
- Freeing maria tmp table after fetching rows using prepared statements causes
a crash.
Known bugs that are planned to be fixed before Beta
===================================================
......
......@@ -2245,3 +2245,36 @@ n c
301 c
302 d
drop table t1;
create table t1 (n int not null, c char(1)) engine=maria;
alter table t1 engine=myisam;
alter table t1 engine=maria;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=MARIA DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
drop table t1;
create table t1 (n int not null, c char(1)) engine=maria transactional=1;
alter table t1 engine=myisam;
Warnings:
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1'
alter table t1 engine=maria;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=MARIA DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
drop table t1;
create table t1 (n int not null, c char(1)) engine=myisam transactional=1;
Warnings:
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1'
alter table t1 engine=maria;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=MARIA DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
drop table t1;
......@@ -2023,4 +2023,14 @@ CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
create table t1 (n int not null, c char(1)) transactional=1;
Warnings:
Error 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1'
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 TRANSACTIONAL=1
drop table t1;
End of 5.1 tests
......@@ -1454,8 +1454,26 @@ insert into t1 values(null, "d");
select * from t1;
drop table t1;
#
# Test warnings with transactional=1 with MyISAM
#
create table t1 (n int not null, c char(1)) engine=maria;
alter table t1 engine=myisam;
alter table t1 engine=maria;
show create table t1;
drop table t1;
create table t1 (n int not null, c char(1)) engine=maria transactional=1;
alter table t1 engine=myisam;
alter table t1 engine=maria;
show create table t1;
drop table t1;
create table t1 (n int not null, c char(1)) engine=myisam transactional=1;
alter table t1 engine=maria;
show create table t1;
drop table t1;
# End of 5.2 tests
# End of 5.1 tests
--disable_result_log
--disable_query_log
......
......@@ -1278,5 +1278,12 @@ DELETE FROM t1 WHERE c1 >= 10;
CHECK TABLE t1;
DROP TABLE t1;
#
# Test warnings with transactional=1 with MyISAM
#
create table t1 (n int not null, c char(1)) transactional=1;
show create table t1;
drop table t1;
--echo End of 5.1 tests
......@@ -373,8 +373,7 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
handlerton *hton= (handlerton *)plugin->data;
DBUG_ENTER("ha_finalize_handlerton");
switch (hton->state)
{
switch (hton->state) {
case SHOW_OPTION_NO:
case SHOW_OPTION_DISABLED:
break;
......@@ -647,7 +646,7 @@ int ha_prepare(THD *thd)
{
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_ILLEGAL_HA, ER(ER_ILLEGAL_HA),
ha_resolve_storage_engine_name(*ht));
hton_name(*ht)->str);
}
}
}
......@@ -1041,7 +1040,7 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin,
while ((got= hton->recover(hton, info->list, info->len)) > 0 )
{
sql_print_information("Found %d prepared transaction(s) in %s",
got, ha_resolve_storage_engine_name(hton));
got, hton_name(hton)->str);
for (int i=0; i < got; i ++)
{
my_xid x=info->list[i].get_my_xid();
......@@ -3814,7 +3813,7 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat)
{
if (db_type->state != SHOW_OPTION_YES)
{
const LEX_STRING *name=&hton2plugin[db_type->slot]->name;
const LEX_STRING *name= hton_name(db_type);
result= stat_print(thd, name->str, name->length,
"", 0, "DISABLED", 8) ? 1 : 0;
}
......
......@@ -709,6 +709,12 @@ struct handlerton
};
inline LEX_STRING *hton_name(const handlerton *hton)
{
return &(hton2plugin[hton->slot]->name);
}
/* Possible flags of a handlerton (there can be 32 of them) */
#define HTON_NO_FLAGS 0
#define HTON_CLOSE_CURSORS_AT_COMMIT (1 << 0)
......@@ -1629,6 +1635,8 @@ class handler :public Sql_alloc
*/
virtual void use_hidden_primary_key();
LEX_STRING *engine_name() { return hton_name(ht); }
protected:
/* Service methods for use by storage engines. */
void ha_statistic_increment(ulong SSV::*offset) const;
......@@ -1644,6 +1652,7 @@ class handler :public Sql_alloc
*/
virtual int rename_table(const char *from, const char *to);
virtual int delete_table(const char *name);
private:
/*
Low-level primitives for storage engines. These should be
......@@ -1848,7 +1857,7 @@ static inline enum legacy_db_type ha_legacy_type(const handlerton *db_type)
static inline const char *ha_resolve_storage_engine_name(const handlerton *db_type)
{
return db_type == NULL ? "UNKNOWN" : hton2plugin[db_type->slot]->name.str;
return db_type == NULL ? "UNKNOWN" : hton_name(db_type)->str;
}
static inline bool ha_check_storage_engine_flag(const handlerton *db_type, uint32 flag)
......
......@@ -3529,7 +3529,7 @@ uchar *sys_var_thd_storage_engine::value_ptr(THD *thd, enum_var_type type,
if (type == OPT_GLOBAL)
plugin= my_plugin_lock(thd, &(global_system_variables.*offset));
hton= plugin_data(plugin, handlerton*);
engine_name= &hton2plugin[hton->slot]->name;
engine_name= hton_name(hton);
result= (uchar *) thd->strmake(engine_name->str, engine_name->length);
if (type == OPT_GLOBAL)
plugin_unlock(thd, plugin);
......
......@@ -3418,6 +3418,14 @@ bool mysql_create_table_no_lock(THD *thd,
goto err;
}
/* Give warnings for not supported table options */
if (create_info->transactional && !file->ht->commit)
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_ILLEGAL_HA_CREATE_OPTION,
ER(ER_ILLEGAL_HA_CREATE_OPTION),
file->engine_name()->str,
"TRANSACTIONAL=1");
VOID(pthread_mutex_lock(&LOCK_open));
if (!internal_tmp_table && !(create_info->options & HA_LEX_CREATE_TMP_TABLE))
{
......@@ -5414,6 +5422,7 @@ bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled,
Sets create_info->varchar if the table has a VARCHAR column.
Prepares alter_info->create_list and alter_info->key_list with
columns and keys of the new table.
@retval TRUE error, out of memory or a semantical error in ALTER
TABLE instructions
@retval FALSE success
......@@ -5440,7 +5449,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
uint used_fields= create_info->used_fields;
KEY *key_info=table->key_info;
bool rc= TRUE;
Create_field *def;
Field **f_ptr,*field;
DBUG_ENTER("mysql_prepare_alter_table");
create_info->varchar= FALSE;
......@@ -5476,18 +5486,16 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
create_info->tablespace= tablespace;
}
restore_record(table, s->default_values); // Empty record for DEFAULT
Create_field *def;
/*
First collect all fields from table which isn't in drop_list
*/
Field **f_ptr,*field;
for (f_ptr=table->field ; (field= *f_ptr) ; f_ptr++)
{
Alter_drop *drop;
if (field->type() == MYSQL_TYPE_STRING)
create_info->varchar= TRUE;
/* Check if field should be dropped */
Alter_drop *drop;
drop_it.rewind();
while ((drop=drop_it++))
{
......@@ -5561,7 +5569,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
{
if (def->change && ! def->field)
{
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change, table->s->table_name.str);
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change,
table->s->table_name.str);
goto err;
}
/*
......@@ -5596,7 +5605,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
}
if (!find)
{
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->after, table->s->table_name.str);
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->after,
table->s->table_name.str);
goto err;
}
find_it.after(def); // Put element after this
......@@ -5646,6 +5656,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
continue; // Wrong field (from UNIREG)
const char *key_part_name=key_part->field->field_name;
Create_field *cfield;
uint key_part_length;
field_it.rewind();
while ((cfield=field_it++))
{
......@@ -5661,7 +5673,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
}
if (!cfield)
continue; // Field is removed
uint key_part_length=key_part->length;
key_part_length= key_part->length;
if (cfield->field) // Not new field
{
/*
......@@ -7312,7 +7324,7 @@ static bool check_engine(THD *thd, const char *table_name,
if (create_info->used_fields & HA_CREATE_USED_ENGINE)
{
my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0),
ha_resolve_storage_engine_name(*new_engine), "TEMPORARY");
hton_name(*new_engine)->str, "TEMPORARY");
*new_engine= 0;
return TRUE;
}
......
......@@ -34,7 +34,7 @@ int mysql_alter_tablespace(THD *thd, st_alter_tablespace *ts_info)
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_WARN_USING_OTHER_HANDLER,
ER(ER_WARN_USING_OTHER_HANDLER),
ha_resolve_storage_engine_name(hton),
hton_name(hton)->str,
ts_info->tablespace_name ? ts_info->tablespace_name
: ts_info->logfile_group_name);
}
......@@ -43,13 +43,14 @@ int mysql_alter_tablespace(THD *thd, st_alter_tablespace *ts_info)
{
if ((error= hton->alter_tablespace(hton, thd, ts_info)))
{
if (error == HA_ADMIN_NOT_IMPLEMENTED)
if (error == 1)
{
my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "");
DBUG_RETURN(1);
}
else if (error == 1)
if (error == HA_ADMIN_NOT_IMPLEMENTED)
{
DBUG_RETURN(1);
my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "");
}
else
{
......@@ -63,7 +64,7 @@ int mysql_alter_tablespace(THD *thd, st_alter_tablespace *ts_info)
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_ILLEGAL_HA_CREATE_OPTION,
ER(ER_ILLEGAL_HA_CREATE_OPTION),
ha_resolve_storage_engine_name(hton),
hton_name(hton)->str,
"TABLESPACE or LOGFILE GROUP");
}
write_bin_log(thd, FALSE, thd->query, thd->query_length);
......
......@@ -1650,7 +1650,7 @@ create:
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_USING_OTHER_HANDLER,
ER(ER_WARN_USING_OTHER_HANDLER),
ha_resolve_storage_engine_name(lex->create_info.db_type),
hton_name(lex->create_info.db_type)->str,
$5->table.str);
}
}
......
......@@ -159,8 +159,7 @@ bool mysql_create_frm(THD *thd, const char *file_name,
reclength=uint2korr(forminfo+266);
/* Calculate extra data segment length */
str_db_type.str= (char *) ha_resolve_storage_engine_name(create_info->db_type);
str_db_type.length= strlen(str_db_type.str);
str_db_type= *hton_name(create_info->db_type);
/* str_db_type */
create_info->extra_size= (2 + str_db_type.length +
2 + create_info->connect_string.length);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment