Commit 04bee0af authored by Michael Widenius's avatar Michael Widenius

Fix for MDEV-5547: Bad error message when moving very old .frm files to MariaDB 5.5.

mysql_upgrade --help now also prints out --default options and variable values.
mysql_upgrade now prints permission errors.
mysql_upgrade doesn't print some non essential info if --silent is used.
Added handler error message about incompatible versions
Fixed that mysqlbug and mysql_install_db have the executable flag set.
Removed executable flag for some non executable files.
Changed in mysql_install_db askmonty.org to mariadb.com.
Ensured that all client executables prints --default options the same way.
Allow REPAIR ... USE_FRM for old .frm files if the are still compatible.
Extended shown error for storage engine messages.


client/mysql.cc:
  print_defaults() should be first (as in all other programs)
client/mysql_upgrade.c:
  --help now also prints out --default options and variable values
  Print out error if wrong permissions
  Don't print info if --silent
client/mysqladmin.cc:
  print_defaults() should be first (as in all other programs)
client/mysqlbinlog.cc:
  Added print_defaults() to --help
client/mysqlcheck.c:
  Added empty line in --help
client/mysqlimport.c:
  Added empty line in --help
client/mysqlshow.c:
  Made --help compatible
client/mysqlslap.c:
  Made --help compatible
client/mysqltest.cc:
  Added print_defaults() to --help
include/handler_ername.h:
  Added handler error message
include/my_base.h:
  Added handler error message
mysql-test/r/mysql_upgrade.result:
  Updated results
mysql-test/r/repair.result:
  Added test case for better error messages
mysql-test/std_data/host_old.MYD:
  Added test case for better error messages
mysql-test/std_data/host_old.MYI:
  Added test case for better error messages
mysql-test/std_data/host_old.frm:
  Added test case for better error messages
mysql-test/t/repair.test:
  Added test case for better error messages
mysys/my_handler_errors.h:
  Added handler error message
scripts/CMakeLists.txt:
  Fixed that mysqlbug and mysql_install_db have the executable flag set
scripts/mysql_install_db.sh:
  askmonty.org -> mariadb.com
sql/ha_partition.cc:
  Sometimes table_type() can be called for errors even if partition didn't manage to open any files
sql/handler.cc:
  Write clear text for not handled, but defined error messages.
sql/share/errmsg-utf8.txt:
  Extended shown error for storage engine messages
sql/sql_admin.cc:
  Allow REPAIR ... USE_FRM for old .frm files if the are still compatible
storage/myisam/ha_myisam.cc:
  Use new error message
parent 5e02635e
......@@ -1672,8 +1672,9 @@ static void usage(int version)
return;
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
printf("Usage: %s [OPTIONS] [database]\n", my_progname);
my_print_help(my_long_options);
print_defaults("my", load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
}
......
......@@ -22,7 +22,7 @@
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
#define VER "1.3"
#define VER "1.3a"
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
......@@ -164,6 +164,15 @@ static struct my_option my_long_options[]=
};
static const char *load_default_groups[]=
{
"client", /* Read settings how to connect to server */
"mysql_upgrade", /* Read special settings for mysql_upgrade */
"client-server", /* Reads settings common between client & server */
"client-mariadb", /* Read mariadb unique client settings */
0
};
static void free_used_memory(void)
{
/* Free memory allocated by 'load_defaults' */
......@@ -180,6 +189,7 @@ static void die(const char *fmt, ...)
DBUG_ENTER("die");
/* Print the error message */
fflush(stdout);
va_start(args, fmt);
if (fmt)
{
......@@ -259,8 +269,11 @@ get_one_option(int optid, const struct my_option *opt,
printf("%s Ver %s Distrib %s, for %s (%s)\n",
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("MariaDB utility for upgrading databases to new MariaDB versions.\n");
puts("MariaDB utility for upgrading databases to new MariaDB versions.");
print_defaults("my", load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
die(0);
break;
......@@ -736,6 +749,7 @@ static int run_mysqlcheck_upgrade(void)
!opt_silent || opt_verbose ? "--verbose": "",
opt_silent ? "--silent": "",
opt_write_binlog ? "--write-binlog" : "--skip-write-binlog",
"2>&1",
NULL);
}
......@@ -754,6 +768,7 @@ static int run_mysqlcheck_fixnames(void)
opt_verbose ? "--verbose": "",
opt_silent ? "--silent": "",
opt_write_binlog ? "--write-binlog" : "--skip-write-binlog",
"2>&1",
NULL);
}
......@@ -855,14 +870,11 @@ static int run_sql_fix_privilege_tables(void)
}
static const char *load_default_groups[]=
static void print_error(const char *error_msg, DYNAMIC_STRING *output)
{
"client", /* Read settings how to connect to server */
"mysql_upgrade", /* Read special settings for mysql_upgrade */
"client-server", /* Reads settings common between client & server */
"client-mariadb", /* Read mariadb unique client settings */
0
};
fprintf(stderr, "%s\n", error_msg);
fprintf(stderr, "%s", output->str);
}
/* Convert the specified version string into the numeric format. */
......@@ -895,6 +907,8 @@ static int check_version_match(void)
&ds_version, FALSE) ||
extract_variable_from_show(&ds_version, version_str))
{
print_error("Version check failed. Got the following error when calling "
"the 'mysql' command line client", &ds_version);
dynstr_free(&ds_version);
return 1; /* Query failed */
}
......@@ -963,7 +977,8 @@ int main(int argc, char **argv)
}
else
{
printf("The --upgrade-system-tables option was used, databases won't be touched.\n");
if (!opt_silent)
printf("The --upgrade-system-tables option was used, databases won't be touched.\n");
}
/*
......
......@@ -1179,9 +1179,10 @@ static void usage(void)
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("Administration program for the mysqld daemon.");
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
print_defaults("my",load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
print_defaults("my",load_default_groups);
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
create databasename Create a new database\n\
debug Instruct server to write debug information to log\n\
......
......@@ -1542,6 +1542,8 @@ static void usage()
Dumps a MySQL binary log in a format usable for viewing or for piping to\n\
the mysql command line client.\n\n");
printf("Usage: %s [options] log-files\n", my_progname);
print_defaults("my",load_groups);
puts("");
my_print_help(my_options);
my_print_variables(my_options);
}
......
......@@ -250,6 +250,7 @@ static void usage(void)
puts("http://kb.askmonty.org/v/mysqlcheck for latest information about");
puts("this program.");
print_defaults("my", load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
DBUG_VOID_RETURN;
......
......@@ -612,7 +612,8 @@ static void usage(void)
puts("Dumping structure and contents of MySQL databases and tables.");
short_usage_sub();
print_defaults("my",load_default_groups);
my_print_help(my_long_options);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
} /* usage */
......
......@@ -216,8 +216,9 @@ If one uses sockets to connect to the MySQL server, the server will open and\n\
read the text file directly. In other cases the client will open the text\n\
file. The SQL command 'LOAD DATA INFILE' is used to import the rows.\n");
printf("\nUsage: %s [OPTIONS] database textfile...",my_progname);
printf("\nUsage: %s [OPTIONS] database textfile...\n",my_progname);
print_defaults("my",load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
}
......
......@@ -279,6 +279,7 @@ If no table is given, then all matching tables in database are shown.\n\
If no column is given, then all matching columns and column types in table\n\
are shown.");
print_defaults("my",load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
}
......
......@@ -732,7 +732,9 @@ static void usage(void)
puts("Run a query multiple times against the server.\n");
printf("Usage: %s [OPTIONS]\n",my_progname);
print_defaults("my",load_default_groups);
puts("");
my_print_help(my_long_options);
my_print_variables(my_long_options);
}
......
......@@ -7003,8 +7003,9 @@ void usage()
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
printf("Runs a test against the mysql server and compares output with a results file.\n\n");
printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname);
print_defaults("my",load_default_groups);
puts("");
my_print_help(my_long_options);
printf(" --no-defaults Don't read default options from any options file.\n");
my_print_variables(my_long_options);
}
......
......@@ -78,3 +78,4 @@
{ "HA_ERR_ROW_NOT_VISIBLE", HA_ERR_ROW_NOT_VISIBLE, "" },
{ "HA_ERR_ABORTED_BY_USER", HA_ERR_ABORTED_BY_USER, "" },
{ "HA_ERR_DISK_FULL", HA_ERR_DISK_FULL, "" },
{ "HA_ERR_INCOMPATIBLE_DEFINITION", HA_ERR_INCOMPATIBLE_DEFINITION, "" },
......@@ -466,7 +466,8 @@ enum ha_base_keytype {
#define HA_ERR_ROW_NOT_VISIBLE 182
#define HA_ERR_ABORTED_BY_USER 183
#define HA_ERR_DISK_FULL 184
#define HA_ERR_LAST 184 /* Copy of last error nr */
#define HA_ERR_INCOMPATIBLE_DEFINITION 185
#define HA_ERR_LAST 185 /* Copy of last error nr */
/* Number of different errors */
#define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1)
......
......@@ -108,6 +108,9 @@ test
Phase 3/3: Running 'mysql_fix_privilege_tables'...
OK
DROP USER mysqltest1@'%';
Version check failed. Got the following error when calling the 'mysql' command line client
ERROR 1045 (28000): Access denied for user 'mysqltest1'@'localhost' (using password: YES)
FATAL ERROR: Upgrade failed
Run mysql_upgrade with a non existing server socket
mysqlcheck: Got error: 2005: Unknown MySQL server host 'not_existing_host' (errno) when trying to connect
FATAL ERROR: Upgrade failed
......
......@@ -130,26 +130,25 @@ test.t1 check error Table upgrade required. Please do "REPAIR TABLE `t1`" or dum
# REPAIR old table USE_FRM should fail
REPAIR TABLE t1 USE_FRM;
Table Op Msg_type Msg_text
t1 repair error Failed repairing incompatible .frm file
test.t1 repair warning Number of rows changed from 0 to 1
test.t1 repair status OK
# Run REPAIR TABLE to upgrade .frm file
REPAIR TABLE t1;
Table Op Msg_type Msg_text
test.t1 repair status OK
SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Fixed 2 7 14 1970324836974591 1024 0 NULL # # NULL latin1_swedish_ci NULL
t1 MyISAM 10 Fixed 1 7 7 1970324836974591 1024 0 NULL # # NULL latin1_swedish_ci NULL
SELECT * FROM t1;
id
1
2
REPAIR TABLE t1 USE_FRM;
Table Op Msg_type Msg_text
test.t1 repair warning Number of rows changed from 0 to 2
test.t1 repair warning Number of rows changed from 0 to 1
test.t1 repair status OK
SELECT * FROM t1;
id
1
2
DROP TABLE t1;
DROP TABLE IF EXISTS tt1;
CREATE TEMPORARY TABLE tt1 (c1 INT);
......@@ -183,3 +182,28 @@ test.t1 repair status OK
test.t2 repair status OK
set @@autocommit= default;
drop tables t1, t2;
#
# Check that we have decent error messages when using crashed
# .frm file from MySQL 3.23
#
# Test with a saved table from 3.23
select count(*) from t1;
ERROR HY000: Got error 185 'Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You have to dump and restore the table to fix this' from MyISAM
check table t1;
Table Op Msg_type Msg_text
test.t1 check Error Got error 185 'Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You have to dump and restore the table to fix this' from MyISAM
test.t1 check error Corrupt
repair table t1;
Table Op Msg_type Msg_text
test.t1 repair Error Got error 185 'Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You have to dump and restore the table to fix this' from MyISAM
test.t1 repair error Corrupt
repair table t1 use_frm;
Table Op Msg_type Msg_text
test.t1 repair status OK
select count(*) from t1;
count(*)
0
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
......@@ -40,6 +40,11 @@ GRANT ALL ON *.* TO mysqltest1@'%';
DROP USER mysqltest1@'%';
#
# check that we get proper error messages if wrong user
--error 1
--exec $MYSQL_UPGRADE --force --user=mysqltest1 --password=sakila 2>&1
#
# Bug #26639 mysql_upgrade exits successfully even if external command failed
......
......@@ -188,3 +188,23 @@ set @@autocommit= 0;
repair table t1, t2;
set @@autocommit= default;
drop tables t1, t2;
--echo #
--echo # Check that we have decent error messages when using crashed
--echo # .frm file from MySQL 3.23
--echo #
--echo # Test with a saved table from 3.23
let $MYSQLD_DATADIR= `select @@datadir`;
--copy_file std_data/host_old.frm $MYSQLD_DATADIR/test/t1.frm
--copy_file std_data/host_old.MYD $MYSQLD_DATADIR/test/t1.MYD
--copy_file std_data/host_old.MYI $MYSQLD_DATADIR/test/t1.MYI
--error ER_GET_ERRMSG
select count(*) from t1;
check table t1;
repair table t1;
repair table t1 use_frm;
select count(*) from t1;
check table t1;
drop table t1;
......@@ -86,7 +86,8 @@ static const char *handler_error_messages[]=
"Table is being used in foreign key check",
"Row is not visible by the current transaction",
"Operation was interrupted by end user (probably kill command?)",
"Disk full"
"Disk full",
"Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You have to dump and restore the table to fix this"
};
#endif /* MYSYS_MY_HANDLER_ERRORS_INCLUDED */
......@@ -172,6 +172,10 @@ ENDIF()
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mysqlbug.sh
${CMAKE_CURRENT_BINARY_DIR}/mysqlbug ESCAPE_QUOTES @ONLY)
EXECUTE_PROCESS(
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/mysqlbug
)
INSTALL_SCRIPT(${CMAKE_CURRENT_BINARY_DIR}/mysqlbug
DESTINATION ${INSTALL_BINDIR}
COMPONENT Server
......@@ -205,6 +209,10 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mysql_install_db.sh
${CMAKE_CURRENT_BINARY_DIR}/mysql_install_db ESCAPE_QUOTES @ONLY)
SET(DEST ${INSTALL_SCRIPTDIR})
SET(EXT)
EXECUTE_PROCESS(
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/mysql_install_db
)
INSTALL_SCRIPT(
"${CMAKE_CURRENT_BINARY_DIR}/mysql_install_db"
DESTINATION ${DEST}
......
......@@ -90,7 +90,7 @@ link_to_help()
{
echo
echo "The latest information about mysql_install_db is available at"
echo "http://kb.askmonty.org/v/installing-system-tables-mysql_install_db."
echo "https://mariadb.com/kb/en/installing-system-tables-mysql_install_db"
}
parse_arg()
......@@ -492,7 +492,7 @@ then
echo "databases and anonymous user created by default. This is"
echo "strongly recommended for production servers."
echo
echo "See the MariaDB Knowledgebase at http://kb.askmonty.org or the"
echo "See the MariaDB Knowledgebase at http://mariadb.com/kb or the"
echo "MySQL manual for more instructions."
if test "$in_rpm" -eq 0
......@@ -512,9 +512,9 @@ then
echo "You can find additional information about the MySQL part at:"
echo "http://dev.mysql.com"
echo "Support MariaDB development by buying support/new features from"
echo "Monty Program Ab. You can contact us about this at sales@montyprogram.com".
echo "SkySQL Ab. You can contact us about this at sales@skysql.com".
echo "Alternatively consider joining our community based development effort:"
echo "http://kb.askmonty.org/en/contributing-to-the-mariadb-project/"
echo "http://mariadb.com/kb/en/contributing-to-the-mariadb-project/"
echo
fi
......
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
......@@ -305,7 +305,7 @@ void ha_partition::init_handler_variables()
const char *ha_partition::table_type() const
{
// we can do this since we only support a single engine type
return m_file[0]->table_type();
return m_file && m_file[0] ? m_file[0]->table_type() : "Unknown";
}
......
......@@ -44,6 +44,7 @@
#include "probes_mysql.h"
#include "debug_sync.h" // DEBUG_SYNC
#include "sql_audit.h"
#include "../mysys/my_handler_errors.h"
#ifdef WITH_PARTITION_STORAGE_ENGINE
#include "ha_partition.h"
......@@ -3139,8 +3140,18 @@ void handler::print_error(int error, myf errflag)
my_error(ER_GET_ERRMSG, errflag, error, str.c_ptr(), engine);
}
}
else if (error >= HA_ERR_FIRST && error <= HA_ERR_LAST)
{
const char* engine= table_type();
const char *errmsg= handler_error_messages[error - HA_ERR_FIRST];
my_error(ER_GET_ERRMSG, errflag, error, errmsg, engine);
SET_FATAL_ERROR;
}
else
my_error(ER_GET_ERRNO,errflag,error);
{
my_error(ER_GET_ERRNO, errflag,error);
/* SET_FATAL_ERROR; */
}
DBUG_VOID_RETURN;
}
}
......
......@@ -5067,17 +5067,17 @@ ER_UNSUPPORTED_PS
eng "This command is not supported in the prepared statement protocol yet"
ger "Dieser Befehl wird im Protokoll für vorbereitete Anweisungen noch nicht unterstützt"
ER_GET_ERRMSG
dan "Modtog fejl %d '%-.100s' fra %s"
eng "Got error %d '%-.100s' from %s"
ger "Fehler %d '%-.100s' von %s"
nor "Mottok feil %d '%-.100s' fa %s"
norwegian-ny "Mottok feil %d '%-.100s' fra %s"
dan "Modtog fejl %d '%-.200s' fra %s"
eng "Got error %d '%-.200s' from %s"
ger "Fehler %d '%-.200s' von %s"
nor "Mottok feil %d '%-.200s' fa %s"
norwegian-ny "Mottok feil %d '%-.200s' fra %s"
ER_GET_TEMPORARY_ERRMSG
dan "Modtog temporary fejl %d '%-.100s' fra %s"
eng "Got temporary error %d '%-.100s' from %s"
ger "Temporärer Fehler %d '%-.100s' von %s"
nor "Mottok temporary feil %d '%-.100s' fra %s"
norwegian-ny "Mottok temporary feil %d '%-.100s' fra %s"
dan "Modtog temporary fejl %d '%-.200s' fra %s"
eng "Got temporary error %d '%-.200s' from %s"
ger "Temporärer Fehler %d '%-.200s' von %s"
nor "Mottok temporary feil %d '%-.200s' fra %s"
norwegian-ny "Mottok temporary feil %d '%-.200s' fra %s"
ER_UNKNOWN_TIME_ZONE
eng "Unknown or incorrect time zone: '%-.64s'"
ger "Unbekannte oder falsche Zeitzone: '%-.64s'"
......
......@@ -162,10 +162,11 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list,
- Run a normal repair using the new index file and the old data file
*/
if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
if (table->s->frm_version != FRM_VER_TRUE_VARCHAR &&
table->s->varchar_fields)
{
error= send_check_errmsg(thd, table_list, "repair",
"Failed repairing incompatible .frm file");
"Failed repairing a very old .frm file as the data file format has changed between versions. Please dump the table in your old system with mysqldump and read it into this system with mysql or mysqlimport");
goto end;
}
......
......@@ -762,7 +762,7 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked)
true, table))
{
/* purecov: begin inspected */
my_errno= HA_ERR_CRASHED;
my_errno= HA_ERR_INCOMPATIBLE_DEFINITION;
goto err;
/* purecov: end */
}
......
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