diff --git a/include/errmsg.h b/include/errmsg.h index 4018e3ee01d..dc7adb3b501 100644 --- a/include/errmsg.h +++ b/include/errmsg.h @@ -15,7 +15,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Error messages for MySQL clients */ -/* (Error messages for the daemon are in share/language/errmsg.sys) */ +/* (Error messages for the daemon are in sql/share/errmsg.txt) */ #ifdef __cplusplus extern "C" { diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index 739f7bc5fc6..417e949e83f 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -21,7 +21,7 @@ Plugin API. Common for all plugin types. */ -#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0001 +#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0002 /* The allowable types of plugins @@ -31,10 +31,6 @@ #define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ #define MYSQL_MAX_PLUGIN_TYPE_NUM 3 /* The number of plugin types */ -#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8) -#define __attribute__(A) -#endif - /* Macros for beginning and ending plugin declarations. Between mysql_declare_plugin and mysql_declare_plugin_end there should diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index e6d1c1acfca..08a8d68b2e5 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -44,7 +44,7 @@ libmysqlsources = errmsg.c get_password.c libmysql.c client.c pack.c \ noinst_HEADERS = embedded_priv.h emb_qcache.h sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \ - ha_innodb.cc ha_ndbcluster.cc \ + ha_ndbcluster.cc \ ha_ndbcluster_binlog.cc ha_partition.cc \ handler.cc sql_handler.cc \ hostname.cc init.cc password.c \ diff --git a/plugin/fulltext/plugin_example.c b/plugin/fulltext/plugin_example.c index 34350e317ba..7da6672190c 100644 --- a/plugin/fulltext/plugin_example.c +++ b/plugin/fulltext/plugin_example.c @@ -17,6 +17,10 @@ #include #include +#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8) +#define __attribute__(A) +#endif + static long number_of_calls= 0; /* for SHOW STATUS, see below */ /* diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 132362c43d1..a089278448c 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -28,7 +28,7 @@ ADD_DEFINITIONS(-DHAVE_ROW_BASED_REPLICATION -DMYSQL_SERVER ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc discover.cc ../libmysql/errmsg.c field.cc field_conv.cc filesort.cc gstream.cc - ha_innodb.cc ha_partition.cc + ha_partition.cc handler.cc hash_filo.cc hash_filo.h hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc item_create.cc item_func.cc item_geofunc.cc item_row.cc diff --git a/sql/Makefile.am b/sql/Makefile.am index dfb625d4747..d1ebea45d0c 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -50,7 +50,6 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ sql_map.h sql_string.h unireg.h \ sql_error.h field.h handler.h mysqld_suffix.h \ ha_partition.h \ - ha_innodb.h \ ha_ndbcluster.h ha_ndbcluster_binlog.h \ ha_ndbcluster_tables.h \ opt_range.h protocol.h rpl_tblmap.h \ @@ -87,7 +86,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ unireg.cc des_key_file.cc \ discover.cc time.cc opt_range.cc opt_sum.cc \ records.cc filesort.cc handler.cc \ - ha_partition.cc ha_innodb.cc \ + ha_partition.cc \ ha_ndbcluster.cc ha_ndbcluster_binlog.cc \ sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \ sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \ diff --git a/sql/authors.h b/sql/authors.h index 618c6305f6b..980ec7670de 100644 --- a/sql/authors.h +++ b/sql/authors.h @@ -85,6 +85,8 @@ struct show_table_authors_st show_table_authors[]= { { "Matthias Leich", "Berlin, Germany", "Testing - Server" }, { "Dmitri Lenev", "Moscow, Russia", "Time zones support (4.1), Triggers (5.0)" }, + { "Arjen Lentz", "Brisbane, Australia", + "Documentation (2001-2004), Dutch error messages, LOG2()" }, { "Marc Liyanage", "", "Created Mac OS X packages" }, { "Zarko Mocnik", "", "Sorting for Slovenian language" }, { "Per-Erik Martin", "Uppsala, Sweden", "Stored Procedures (5.0)" }, diff --git a/sql/handler.h b/sql/handler.h index b331c47a370..abc3e18d7a0 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -255,7 +255,12 @@ enum legacy_db_type DB_TYPE_BLACKHOLE_DB, DB_TYPE_PARTITION_DB, DB_TYPE_BINLOG, - DB_TYPE_FIRST_DYNAMIC=32, + DB_TYPE_SOLID, + DB_TYPE_PBXT, + DB_TYPE_TABLE_FUNCTION, + DB_TYPE_MEMCACHE, + DB_TYPE_FALCON, + DB_TYPE_FIRST_DYNAMIC=42, DB_TYPE_DEFAULT=127 // Must be last }; diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 2228ded870b..28d81447c66 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -4710,6 +4710,7 @@ ER_MASTER_FATAL_ERROR_READING_BINLOG ER_SLAVE_IGNORED_TABLE eng "Slave SQL thread ignored the query because of replicate-*-table rules" ger "Slave-SQL-Thread hat die Abfrage aufgrund von replicate-*-table-Regeln ignoriert" + nla "Slave SQL thread negeerde de query vanwege replicate-*-table opties" por "Slave SQL thread ignorado a consulta devido às normas de replicação-*-tabela" spa "Slave SQL thread ignorado el query debido a las reglas de replicación-*-tabla" swe "Slav SQL tråden ignorerade frågan pga en replicate-*-table regel" @@ -4717,29 +4718,34 @@ ER_INCORRECT_GLOBAL_LOCAL_VAR eng "Variable '%-.64s' is a %s variable" serbian "Incorrect foreign key definition for '%-.64s': %s" ger "Variable '%-.64s' ist eine %s-Variable" + nla "Variabele '%-.64s' is geen %s variabele" spa "Variable '%-.64s' es una %s variable" swe "Variabel '%-.64s' är av typ %s" ER_WRONG_FK_DEF 42000 eng "Incorrect foreign key definition for '%-.64s': %s" ger "Falsche Fremdschlüssel-Definition für '%-.64s': %s" + nla "Incorrecte foreign key definitie voor '%-.64s': %s" por "Definição errada da chave estrangeira para '%-.64s': %s" spa "Equivocada definición de llave extranjera para '%-.64s': %s" swe "Felaktig FOREIGN KEY-definition för '%-.64s': %s" ER_KEY_REF_DO_NOT_MATCH_TABLE_REF eng "Key reference and table reference don't match" ger "Schlüssel- und Tabellenverweis passen nicht zusammen" + nla "Sleutel- en tabelreferentie komen niet overeen" por "Referência da chave e referência da tabela não coincidem" spa "Referencia de llave y referencia de tabla no coinciden" swe "Nyckelreferensen och tabellreferensen stämmer inte överens" ER_OPERAND_COLUMNS 21000 eng "Operand should contain %d column(s)" ger "Operand sollte %d Spalte(n) enthalten" + nla "Operand behoort %d kolommen te bevatten" rus "ïÐÅÒÁÎÄ ÄÏÌÖÅÎ ÓÏÄÅÒÖÁÔØ %d ËÏÌÏÎÏË" spa "Operando debe tener %d columna(s)" ukr "ïÐÅÒÁÎÄ ÍÁ¤ ÓËÌÁÄÁÔÉÓÑ Ú %d ÓÔÏ×Âæ×" ER_SUBQUERY_NO_1_ROW 21000 eng "Subquery returns more than 1 row" ger "Unterabfrage lieferte mehr als einen Datensatz zurück" + nla "Subquery retourneert meer dan 1 rij" por "Subconsulta retorna mais que 1 registro" rus "ðÏÄÚÁÐÒÏÓ ×ÏÚ×ÒÁÝÁÅÔ ÂÏÌÅÅ ÏÄÎÏÊ ÚÁÐÉÓÉ" spa "Subconsulta retorna mas que 1 línea" @@ -4749,6 +4755,7 @@ ER_UNKNOWN_STMT_HANDLER dan "Unknown prepared statement handler (%.*s) given to %s" eng "Unknown prepared statement handler (%.*s) given to %s" ger "Unbekannter Prepared-Statement-Handler (%.*s) für %s angegeben" + nla "Onebekende prepared statement handler (%.*s) voor %s aangegeven" por "Desconhecido manipulador de declaração preparado (%.*s) determinado para %s" spa "Desconocido preparado comando handler (%.*s) dado para %s" swe "Okänd PREPARED STATEMENT id (%.*s) var given till %s" @@ -4756,12 +4763,14 @@ ER_UNKNOWN_STMT_HANDLER ER_CORRUPT_HELP_DB eng "Help database is corrupt or does not exist" ger "Die Hilfe-Datenbank ist beschädigt oder existiert nicht" + nla "Help database is beschadigd of bestaat niet" por "Banco de dado de ajuda corrupto ou não existente" spa "Base de datos Help está corrupto o no existe" swe "Hjälpdatabasen finns inte eller är skadad" ER_CYCLIC_REFERENCE eng "Cyclic reference on subqueries" ger "Zyklischer Verweis in Unterabfragen" + nla "Cyclische verwijzing in subqueries" por "Referência cíclica em subconsultas" rus "ãÉËÌÉÞÅÓËÁÑ ÓÓÙÌËÁ ÎÁ ÐÏÄÚÁÐÒÏÓ" spa "Cíclica referencia en subconsultas" @@ -4770,6 +4779,7 @@ ER_CYCLIC_REFERENCE ER_AUTO_CONVERT eng "Converting column '%s' from %s to %s" ger "Feld '%s' wird von %s nach %s umgewandelt" + nla "Veld '%s' wordt van %s naar %s geconverteerd" por "Convertendo coluna '%s' de %s para %s" rus "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÐÏÌÑ '%s' ÉÚ %s × %s" spa "Convirtiendo columna '%s' de %s para %s" @@ -4778,6 +4788,7 @@ ER_AUTO_CONVERT ER_ILLEGAL_REFERENCE 42S22 eng "Reference '%-.64s' not supported (%s)" ger "Verweis '%-.64s' wird nicht unterstützt (%s)" + nla "Verwijzing '%-.64s' niet ondersteund (%s)" por "Referência '%-.64s' não suportada (%s)" rus "óÓÙÌËÁ '%-.64s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ (%s)" spa "Referencia '%-.64s' no soportada (%s)" @@ -4786,12 +4797,14 @@ ER_ILLEGAL_REFERENCE 42S22 ER_DERIVED_MUST_HAVE_ALIAS 42000 eng "Every derived table must have its own alias" ger "Für jede abgeleitete Tabelle muss ein eigener Alias angegeben werden" + nla "Voor elke afgeleide tabel moet een unieke alias worden gebruikt" por "Cada tabela derivada deve ter seu próprio alias" spa "Cada tabla derivada debe tener su propio alias" swe "Varje 'derived table' måste ha sitt eget alias" ER_SELECT_REDUCED 01000 eng "Select %u was reduced during optimization" ger "Select %u wurde während der Optimierung reduziert" + nla "Select %u werd geredureerd tijdens optimtalisatie" por "Select %u foi reduzido durante otimização" rus "Select %u ÂÙÌ ÕÐÒÁÚÄÎÅÎ × ÐÒÏÃÅÓÓÅ ÏÐÔÉÍÉÚÁÃÉÉ" spa "Select %u fué reducido durante optimización" @@ -4800,62 +4813,73 @@ ER_SELECT_REDUCED 01000 ER_TABLENAME_NOT_ALLOWED_HERE 42000 eng "Table '%-.64s' from one of the SELECTs cannot be used in %-.32s" ger "Tabelle '%-.64s', die in einem der SELECT-Befehle verwendet wurde, kann nicht in %-.32s verwendet werden" + nla "Tabel '%-.64s' uit een van de SELECTS kan niet in %-.32s gebruikt worden" por "Tabela '%-.64s' de um dos SELECTs não pode ser usada em %-.32s" spa "Tabla '%-.64s' de uno de los SELECT no puede ser usada en %-.32s" swe "Tabell '%-.64s' från en SELECT kan inte användas i %-.32s" ER_NOT_SUPPORTED_AUTH_MODE 08004 eng "Client does not support authentication protocol requested by server; consider upgrading MySQL client" ger "Client unterstützt das vom Server erwartete Authentifizierungsprotokoll nicht. Bitte aktualisieren Sie Ihren MySQL-Client" + nla "Client ondersteunt het door de server verwachtte authenticatieprotocol niet. Overweeg een nieuwere MySQL client te gebruiken" por "Cliente não suporta o protocolo de autenticação exigido pelo servidor; considere a atualização do cliente MySQL" spa "Cliente no soporta protocolo de autenticación solicitado por el servidor; considere actualizar el cliente MySQL" swe "Klienten stöder inte autentiseringsprotokollet som begärts av servern; överväg uppgradering av klientprogrammet." ER_SPATIAL_CANT_HAVE_NULL 42000 eng "All parts of a SPATIAL index must be NOT NULL" ger "Alle Teile eines SPATIAL-Index müssen als NOT NULL deklariert sein" + nla "Alle delete van een SPATIAL index dienen als NOT NULL gedeclareerd te worden" por "Todas as partes de uma SPATIAL index devem ser NOT NULL" spa "Todas las partes de una SPATIAL index deben ser NOT NULL" swe "Alla delar av en SPATIAL index måste vara NOT NULL" ER_COLLATION_CHARSET_MISMATCH 42000 eng "COLLATION '%s' is not valid for CHARACTER SET '%s'" ger "COLLATION '%s' ist für CHARACTER SET '%s' ungültig" + nla "COLLATION '%s' is niet geldig voor CHARACTER SET '%s'" por "COLLATION '%s' não é válida para CHARACTER SET '%s'" spa "COLLATION '%s' no es válido para CHARACTER SET '%s'" swe "COLLATION '%s' är inte tillåtet för CHARACTER SET '%s'" ER_SLAVE_WAS_RUNNING eng "Slave is already running" ger "Slave läuft bereits" + nla "Slave is reeds actief" por "O slave já está rodando" spa "Slave ya está funcionando" swe "Slaven har redan startat" ER_SLAVE_WAS_NOT_RUNNING eng "Slave already has been stopped" ger "Slave wurde bereits angehalten" + nla "Slave is reeds gestopt" por "O slave já está parado" spa "Slave ya fué parado" swe "Slaven har redan stoppat" ER_TOO_BIG_FOR_UNCOMPRESS eng "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)" ger "Unkomprimierte Daten sind zu groß. Die maximale Größe beträgt %d (wahrscheinlich wurde die Länge der unkomprimierten Daten beschädigt)" + nla "Ongecomprimeerder data is te groot; de maximum lengte is %d (waarschijnlijk, de lengte van de gecomprimeerde data was beschadigd)" por "Tamanho muito grande dos dados des comprimidos. O máximo tamanho é %d. (provavelmente, o comprimento dos dados descomprimidos está corrupto)" spa "Tamaño demasiado grande para datos descomprimidos. El máximo tamaño es %d. (probablemente, extensión de datos descomprimidos fué corrompida)" ER_ZLIB_Z_MEM_ERROR eng "ZLIB: Not enough memory" ger "ZLIB: Nicht genug Speicher" + nla "ZLIB: Onvoldoende geheugen" por "ZLIB: Não suficiente memória disponível" spa "Z_MEM_ERROR: No suficiente memoria para zlib" ER_ZLIB_Z_BUF_ERROR eng "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)" ger "ZLIB: Im Ausgabepuffer ist nicht genug Platz vorhanden (wahrscheinlich wurde die Länge der unkomprimierten Daten beschädigt)" + nla "ZLIB: Onvoldoende ruimte in uitgaande buffer (waarschijnlijk, de lengte van de ongecomprimeerde data was beschadigd)" por "ZLIB: Não suficiente espaço no buffer emissor (provavelmente, o comprimento dos dados descomprimidos está corrupto)" spa "Z_BUF_ERROR: No suficiente espacio en el búfer de salida para zlib (probablemente, extensión de datos descomprimidos fué corrompida)" ER_ZLIB_Z_DATA_ERROR eng "ZLIB: Input data corrupted" ger "ZLIB: Eingabedaten beschädigt" + nla "ZLIB: Invoer data beschadigd" por "ZLIB: Dados de entrada está corrupto" spa "ZLIB: Dato de entrada fué corrompido para zlib" ER_CUT_VALUE_GROUP_CONCAT eng "%d line(s) were cut by GROUP_CONCAT()" ger "%d Zeile(n) durch GROUP_CONCAT() abgeschnitten" + nla "%d regel(s) door GROUP_CONCAT() ingekort" por "%d linha(s) foram cortada(s) por GROUP_CONCAT()" spa "%d línea(s) fue(fueron) cortadas por group_concat()" swe "%d rad(er) kapades av group_concat()" @@ -4863,11 +4887,13 @@ ER_CUT_VALUE_GROUP_CONCAT ER_WARN_TOO_FEW_RECORDS 01000 eng "Row %ld doesn't contain data for all columns" ger "Zeile %ld enthält nicht für alle Felder Daten" + nla "Rij %ld bevat niet de data voor alle kolommen" por "Conta de registro é menor que a conta de coluna na linha %ld" spa "Línea %ld no contiene datos para todas las columnas" ER_WARN_TOO_MANY_RECORDS 01000 eng "Row %ld was truncated; it contained more data than there were input columns" ger "Zeile %ld gekürzt, die Zeile enthielt mehr Daten, als es Eingabefelder gibt" + nla "Regel %ld ingekort, bevatte meer data dan invoer kolommen" por "Conta de registro é maior que a conta de coluna na linha %ld" spa "Línea %ld fué truncada; La misma contine mas datos que las que existen en las columnas de entrada" ER_WARN_NULL_TO_NOTNULL 22004 diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index b66d2d20925..84810fb3324 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -35,12 +35,17 @@ plugin_type_init plugin_type_initialize[MYSQL_MAX_PLUGIN_TYPE_NUM]= 0,ha_initialize_handlerton,0 }; +plugin_type_init plugin_type_deinitialize[MYSQL_MAX_PLUGIN_TYPE_NUM]= +{ + 0,ha_finalize_handlerton,0 +}; + static const char *plugin_interface_version_sym= "_mysql_plugin_interface_version_"; static const char *sizeof_st_plugin_sym= "_mysql_sizeof_struct_st_plugin_"; static const char *plugin_declarations_sym= "_mysql_plugin_declarations_"; -static int min_plugin_interface_version= 0x0000; +static int min_plugin_interface_version= MYSQL_PLUGIN_INTERFACE_VERSION & ~0xFF; /* Note that 'int version' must be the first field of every plugin sub-structure (plugin->info). */ @@ -469,49 +474,67 @@ err: } -void plugin_deinitializer(struct st_plugin_int *plugin) +void plugin_deinitialize(struct st_plugin_int *plugin) { - if (plugin->plugin->status_vars) - { - SHOW_VAR array[2]= { - {plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY}, - {0, 0, SHOW_UNDEF} - }; - remove_status_vars(array); - } - if (plugin->state == PLUGIN_IS_READY) + if (plugin_type_deinitialize[plugin->plugin->type] && + (*plugin_type_deinitialize[plugin->plugin->type])(plugin)) + { + sql_print_error("Plugin '%s' of type %s failed deinitialization", + plugin->name.str, plugin_type_names[plugin->plugin->type]); + } + + if (plugin->plugin->status_vars) + { +#ifdef FIX_LATER + /* + We have a problem right now where we can not prepend without + breaking backwards compatibility. We will fix this shortly so + that engines have "use names" and we wil use those for + CREATE TABLE, and use the plugin name then for adding automatic + variable names. + */ + SHOW_VAR array[2]= { + {plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY}, + {0, 0, SHOW_UNDEF} + }; + remove_status_vars(array); +#else + remove_status_vars(plugin->plugin->status_vars); +#endif /* FIX_LATER */ + } + + if (plugin->plugin->deinit) + { + DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str)); + if (plugin->plugin->deinit()) { - if (plugin->plugin->deinit) - { - DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str)); - if (plugin->plugin->deinit()) - { - DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", - plugin->name.str)); - } - } - plugin->state= PLUGIN_IS_UNINITIALIZED; + DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", + plugin->name.str)); } + } + plugin->state= PLUGIN_IS_UNINITIALIZED; } -static void plugin_del(const LEX_STRING *name) +static void plugin_del(struct st_plugin_int *plugin) { - uint i; - struct st_plugin_int *plugin; - DBUG_ENTER("plugin_del"); - if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN))) - { - plugin_deinitializer(plugin); - hash_delete(&plugin_hash[plugin->plugin->type], (byte*)plugin); - plugin_dl_del(&plugin->plugin_dl->dl); - plugin->state= PLUGIN_IS_FREED; - plugin_array_version++; - } + DBUG_ENTER("plugin_del(plugin)"); + hash_delete(&plugin_hash[plugin->plugin->type], (byte*)plugin); + plugin_dl_del(&plugin->plugin_dl->dl); + plugin->state= PLUGIN_IS_FREED; + plugin_array_version++; DBUG_VOID_RETURN; } +static void plugin_del(const LEX_STRING *name) +{ + struct st_plugin_int *plugin; + DBUG_ENTER("plugin_del(name)"); + if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN))) + plugin_del(plugin); + DBUG_VOID_RETURN; +} void plugin_unlock(struct st_plugin_int *plugin) { @@ -521,9 +544,8 @@ void plugin_unlock(struct st_plugin_int *plugin) plugin->ref_count--; if (plugin->state == PLUGIN_IS_DELETED && ! plugin->ref_count) { - if (plugin->plugin->deinit) - plugin->plugin->deinit(); - plugin_del(&plugin->name); + plugin_deinitialize(plugin); + plugin_del(plugin); } rw_unlock(&THR_LOCK_plugin); DBUG_VOID_RETURN; @@ -537,15 +559,15 @@ static int plugin_initialize(struct st_plugin_int *plugin) if (plugin->plugin->status_vars) { #ifdef FIX_LATER - /* + /* We have a problem right now where we can not prepend without - breaking backwards compatibility. We will fix this shortly so + breaking backwards compatibility. We will fix this shortly so that engines have "use names" and we wil use those for CREATE TABLE, and use the plugin name then for adding automatic variable names. */ SHOW_VAR array[2]= { - {plugin->name, (char*)plugin->status_vars, SHOW_ARRAY}, + {plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY}, {0, 0, SHOW_UNDEF} }; if (add_status_vars(array)) // add_status_vars makes a copy @@ -578,53 +600,6 @@ err: DBUG_RETURN(1); } -static int plugin_finalize(THD *thd, struct st_plugin_int *plugin) -{ - int rc; - DBUG_ENTER("plugin_finalize"); - - if (plugin->ref_count) - { - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, - "Plugin is busy and will be uninstalled on shutdown"); - goto err; - } - - switch (plugin->plugin->type) - { - case MYSQL_STORAGE_ENGINE_PLUGIN: - if (ha_finalize_handlerton(plugin)) - { - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, - "Storage engine shutdown failed. " - "It will be uninstalled on shutdown"); - sql_print_warning("Storage engine '%s' shutdown failed. " - "It will be uninstalled on shutdown", plugin->name.str); - goto err; - } - break; - default: - break; - } - - if (plugin->plugin->deinit) - { - if ((rc= plugin->plugin->deinit())) - { - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, - "Plugin deinit failed. " - "It will be uninstalled on shutdown"); - sql_print_warning("Plugin '%s' deinit failed. " - "It will be uninstalled on shutdown", plugin->name.str); - goto err; - } - } - - DBUG_RETURN(0); -err: - DBUG_RETURN(1); -} - static byte *get_hash_key(const byte *buff, uint *length, my_bool not_used __attribute__((unused))) { @@ -637,7 +612,7 @@ static byte *get_hash_key(const byte *buff, uint *length, /* The logic is that we first load and initialize all compiled in plugins. From there we load up the dynamic types (assuming we have not been told to - skip this part). + skip this part). Finally we inializie everything, aka the dynamic that have yet to initialize. */ @@ -666,7 +641,7 @@ int plugin_init(int skip_dynamic_loading) goto err; } - /* + /* First we register builtin plugins */ for (builtins= mysqld_builtins; *builtins; builtins++) @@ -702,7 +677,10 @@ int plugin_init(int skip_dynamic_loading) if (tmp->state == PLUGIN_IS_UNINITIALIZED) { if (plugin_initialize(tmp)) - plugin_del(&tmp->name); + { + plugin_deinitialize(tmp); + plugin_del(tmp); + } } } @@ -812,7 +790,7 @@ void plugin_shutdown(void) { struct st_plugin_int *tmp= dynamic_element(&plugin_array, i, struct st_plugin_int *); - plugin_deinitializer(tmp); + plugin_deinitialize(tmp); } @@ -862,7 +840,7 @@ my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING { my_error(ER_CANT_INITIALIZE_UDF, MYF(0), name->str, "Plugin initialization function failed."); - goto err; + goto deinit; } table->use_all_columns(); @@ -879,10 +857,9 @@ my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING rw_unlock(&THR_LOCK_plugin); DBUG_RETURN(FALSE); deinit: - if (tmp->plugin->deinit) - tmp->plugin->deinit(); + plugin_deinitialize(tmp); err: - plugin_del(name); + plugin_del(tmp); rw_unlock(&THR_LOCK_plugin); DBUG_RETURN(TRUE); } @@ -917,10 +894,17 @@ my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name) goto err; } - if (!plugin_finalize(thd, plugin)) - plugin_del(name); - else + if (plugin->ref_count) + { + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, + "Plugin is busy and will be uninstalled on shutdown"); plugin->state= PLUGIN_IS_DELETED; + } + else + { + plugin_deinitialize(plugin); + plugin_del(plugin); + } table->use_all_columns(); table->field[0]->store(name->str, name->length, system_charset_info); @@ -983,7 +967,6 @@ my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, for (idx= 0; idx < total; idx++) { - plugin= plugins[idx]; if (unlikely(version != plugin_array_version)) { rw_rdlock(&THR_LOCK_plugin); @@ -992,6 +975,7 @@ my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, plugins[i]=0; rw_unlock(&THR_LOCK_plugin); } + plugin= plugins[idx]; if (plugin && func(thd, plugin, arg)) goto err; } diff --git a/storage/archive/azio.c b/storage/archive/azio.c index 45bad474d95..7cbe6a2a17d 100644 --- a/storage/archive/azio.c +++ b/storage/archive/azio.c @@ -125,7 +125,7 @@ int az_open (azio_stream *s, const char *path, int Flags, File fd) buffer[8] = 0 /*xflags*/; buffer[9] = 0x03; s->start = 10L; - my_write(s->file, buffer, s->start, MYF(0)); + my_write(s->file, buffer, (uint)s->start, MYF(0)); /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not @@ -503,7 +503,7 @@ int azrewind (s) if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; - return my_seek(s->file, s->start, MY_SEEK_SET, MYF(0)); + return my_seek(s->file, (int)s->start, MY_SEEK_SET, MYF(0)); } /* =========================================================================== diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 456b6c73f3c..3e9759136bf 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -1263,7 +1263,6 @@ bool ha_federated::create_where_from_key(String *to, if (tmp.append(STRING_WITH_LEN(") "))) goto err; -next_loop: if (store_length >= length) break; DBUG_PRINT("info", ("remainder %d", remainder)); @@ -2016,8 +2015,8 @@ int ha_federated::delete_row(const byte *buf) { DBUG_RETURN(stash_remote_error()); } - stats.deleted+= mysql->affected_rows; - stats.records-= mysql->affected_rows; + stats.deleted+= (ha_rows)mysql->affected_rows; + stats.records-= (ha_rows)mysql->affected_rows; DBUG_PRINT("info", ("rows deleted %d rows deleted for all time %d", int(mysql->affected_rows), stats.deleted)); @@ -2373,7 +2372,6 @@ int ha_federated::rnd_next(byte *buf) int ha_federated::read_next(byte *buf, MYSQL_RES *result) { int retval; - my_ulonglong num_rows; MYSQL_ROW row; DBUG_ENTER("ha_federated::read_next"); @@ -2867,7 +2865,7 @@ int ha_federated::connection_autocommit(bool state) { const char *text; DBUG_ENTER("ha_federated::connection_autocommit"); - text= (state == true) ? "SET AUTOCOMMIT=1" : "SET AUTOCOMMIT=0"; + text= (state == TRUE) ? "SET AUTOCOMMIT=1" : "SET AUTOCOMMIT=0"; DBUG_RETURN(execute_simple_query(text, 16)); } diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 8b8c3af6582..8a6260ecc7b 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -2,7 +2,12 @@ #SET(CMAKE_C_FLAGS_DEBUG "-DSAFEMALLOC -DSAFE_MUTEX") ADD_DEFINITIONS(-DMYSQL_SERVER -D_WIN32 -DWIN32 -D_LIB) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include include) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib + include + handler + ${CMAKE_SOURCE_DIR}/sql + ${CMAKE_SOURCE_DIR}/regex + ${CMAKE_SOURCE_DIR}/extra/yassl/include) ADD_LIBRARY(innobase btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c buf/buf0buf.c buf/buf0flu.c buf/buf0lru.c buf/buf0rea.c data/data0data.c data/data0type.c @@ -23,6 +28,7 @@ ADD_LIBRARY(innobase btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c os/os0file.c os/os0proc.c os/os0sync.c os/os0thread.c page/page0cur.c page/page0page.c que/que0que.c + handler/ha_innodb.cc read/read0read.c rem/rem0cmp.c rem/rem0rec.c row/row0ins.c row/row0mysql.c row/row0purge.c row/row0row.c row/row0sel.c row/row0uins.c diff --git a/storage/innobase/Makefile.am b/storage/innobase/Makefile.am index a68dbbcc2e6..bdab35f1dc0 100644 --- a/storage/innobase/Makefile.am +++ b/storage/innobase/Makefile.am @@ -34,6 +34,7 @@ noinst_HEADERS = SUBDIRS = os ut btr buf data dict dyn eval fil fsp fut \ ha ibuf lock log mach mem mtr page \ + handler \ pars que read rem row srv sync thr trx usr EXTRA_DIST = include/btr0btr.h include/btr0btr.ic include/btr0cur.h include/btr0cur.ic \ @@ -86,6 +87,7 @@ EXTRA_DIST = include/btr0btr.h include/btr0btr.ic include/btr0cur.h include/btr include/univ.i include/usr0sess.h include/usr0sess.ic include/usr0types.h \ include/ut0byte.h include/ut0byte.ic include/ut0dbg.h include/ut0lst.h \ include/ut0mem.h include/ut0mem.ic include/ut0rnd.h include/ut0rnd.ic \ + handler/ha_innodb.h \ include/ut0sort.h include/ut0ut.h include/ut0ut.ic include/ut0vec.h include/ut0vec.ic include/ha_prototypes.h \ include/ut0list.h include/ut0list.ic \ include/ut0wqueue.h \ @@ -102,6 +104,7 @@ libinnobase_a_LIBADD = usr/libusr.a srv/libsrv.a dict/libdict.a \ page/libpage.a rem/librem.a thr/libthr.a \ sync/libsync.a data/libdata.a mach/libmach.a \ ha/libha.a dyn/libdyn.a mem/libmem.a \ + handler/libhandler.a \ ut/libut.a os/libos.a ut/libut.a libinnobase_a_SOURCES = diff --git a/storage/innobase/handler/Makefile.am b/storage/innobase/handler/Makefile.am new file mode 100644 index 00000000000..46909c8b7e1 --- /dev/null +++ b/storage/innobase/handler/Makefile.am @@ -0,0 +1,29 @@ +# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +# & Innobase Oy +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +include ../include/Makefile.i + +DEFS = -DMYSQL_SERVER @DEFS@ + +noinst_LIBRARIES = libhandler.a + +libhandler_a_SOURCES = ha_innodb.cc + +EXTRA_PROGRAMS = + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/sql/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc similarity index 99% rename from sql/ha_innodb.cc rename to storage/innobase/handler/ha_innodb.cc index 1665c7c011a..405b5f14bb8 100644 --- a/sql/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -31,8 +31,7 @@ have disables the InnoDB inlining in this file. */ #pragma implementation // gcc: Class implementation #endif -#include "mysql_priv.h" -#include "slave.h" +#include #include #include @@ -1600,21 +1599,6 @@ innobase_init(void) pthread_cond_init(&commit_cond, NULL); innodb_inited= 1; - /* If this is a replication slave and we needed to do a crash recovery, - set the master binlog position to what InnoDB internally knew about - how far we got transactions durable inside InnoDB. There is a - problem here: if the user used also MyISAM tables, InnoDB might not - know the right position for them. - - THIS DOES NOT WORK CURRENTLY because replication seems to initialize - glob_mi also after innobase_init. */ - -/* if (trx_sys_mysql_master_log_pos != -1) { - ut_memcpy(glob_mi.log_file_name, trx_sys_mysql_master_log_name, - 1 + ut_strlen(trx_sys_mysql_master_log_name)); - glob_mi.pos = trx_sys_mysql_master_log_pos; - } -*/ DBUG_RETURN(FALSE); error: have_innodb= SHOW_OPTION_DISABLED; // If we couldn't use handler @@ -1689,19 +1673,6 @@ innobase_commit_low( return; } -#ifdef HAVE_REPLICATION - THD *thd=current_thd; - - if (thd && thd->slave_thread) { - /* Update the replication position info inside InnoDB */ - - trx->mysql_master_log_file_name - = active_mi->rli.group_master_log_name; - trx->mysql_master_log_pos = ((ib_longlong) - active_mi->rli.future_group_master_log_pos); - } -#endif /* HAVE_REPLICATION */ - trx_commit_for_mysql(trx); } diff --git a/sql/ha_innodb.h b/storage/innobase/handler/ha_innodb.h similarity index 100% rename from sql/ha_innodb.h rename to storage/innobase/handler/ha_innodb.h diff --git a/storage/innobase/plug.in b/storage/innobase/plug.in index fc1d758fd87..028937882b2 100644 --- a/storage/innobase/plug.in +++ b/storage/innobase/plug.in @@ -65,6 +65,7 @@ MYSQL_PLUGIN_ACTIONS(innobase, [ storage/innobase/sync/Makefile storage/innobase/thr/Makefile storage/innobase/trx/Makefile + storage/innobase/handler/Makefile storage/innobase/usr/Makefile) ])